using System; using System.Collections.Generic; using System.Linq; using Bridge.Text.RegularExpressions; namespace WebMrbc { public class CallBlock : Block { public const string type_name = "call"; public CallBlock() : base(type_name) { } public void init() { this.appendValueInput("RET") .setCheck(null) .appendField("呼び出し"); this.setInputsInline(false); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class PinModeBlock : Block { public const string type_name = "pin_mode"; public PinModeBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("PINのモード設定") .appendField(GrPeach.Pins(), "PIN_NO"); this.appendDummyInput() .appendField("モード") .appendField(new FieldDropdown(new[] { new[] { "INPUTモード", "INPUT" }, new[] { "OUTPUTモード", "OUTPUT" } }), "PIN_MODE"); this.setInputsInline(true); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class DigitalWriteBlock : Block { public const string type_name = "digital_write"; public DigitalWriteBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("デジタルライト") .appendField(GrPeach.Pins(), "PIN_NO"); this.appendDummyInput() .appendField("値") .appendField(new FieldDropdown(new[] { new[] { "LOW", "LOW" }, new[] { "HIGH", "HIGH" } }), "PIN_VALUE"); this.setInputsInline(true); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class DigitalReadBlock : Block { public const string type_name = "digital_read"; public DigitalReadBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("デジタルリード") .appendField(GrPeach.Pins(), "PIN_NO"); this.setInputsInline(true); this.setOutput(true, "Boolean"); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class AnalogReadBlock : Block { public const string type_name = "analog_read"; public AnalogReadBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("アナログリード") .appendField(GrPeach.AnalogPins(), "PIN_NO"); this.setInputsInline(true); this.setOutput(true, "Number"); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class PwmBlock : Block { public const string type_name = "pwm"; public PwmBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("PWM出力") .appendField(GrPeach.PwmPins(), "PIN_NO"); this.appendValueInput("PWM_OUT") .setCheck("Number") .appendField("出力PWM比率"); this.setInputsInline(true); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class PwmValueBlock : Block { public const string type_name = "pwm_value"; public PwmValueBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField(new FieldNumber("0", 0, 255, 1), "PWM_VALUE"); this.setOutput(true, "Number"); this.setColour(160); this.setTooltip("PWM 0~255"); this.setHelpUrl("http://www.example.com/"); } } public class AnalogReferenceBlock : Block { public const string type_name = "analog_reference"; public AnalogReferenceBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("アナログ入力基準電圧") .appendField(new FieldDropdown(new[] { new[] { "5.0V Arduino互換", "DEFAULT" }, new[] { "1.1V 内蔵電圧", "INTERNAL" }, new[] { "AVREFピン供給電圧", "EXTERNAL" }, new[] { "3.3V 12ビットA/D変換を行う", "RAW12BIT" } }), "ANALOG_REFERENCE_MODE"); this.setInputsInline(true); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class InitDacBlock : Block { public const string type_name = "init_dac"; public InitDacBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("アナログDACピン初期化"); this.setInputsInline(true); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class AnalogDacBlock : Block { public const string type_name = "analog_dac"; public AnalogDacBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("アナログDAC出力"); this.appendValueInput("VALUE") .setCheck("Number"); this.setInputsInline(true); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class DacValueBlock : Block { public const string type_name = "dac_value"; public DacValueBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField(new FieldNumber("0", 0, 4095, 1), "DAC_VALUE"); this.setOutput(true, "Number"); this.setColour(160); this.setTooltip("DAC 0~4095"); this.setHelpUrl("http://www.example.com/"); } } public class DelayBlock : Block { public const string type_name = "delay"; public DelayBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("ディレイ"); this.appendValueInput("VALUE") .setCheck("Number"); this.setInputsInline(true); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class MillisBlock : Block { public const string type_name = "millis"; public MillisBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("起動してからのミリ秒数"); this.setInputsInline(true); this.setOutput(true, "Number"); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class MicrosBlock : Block { public const string type_name = "micros"; public MicrosBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("起動してからのマイクロ秒数"); this.setInputsInline(true); this.setOutput(true, "Number"); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class LedBlock : Block { public const string type_name = "led"; public LedBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("LED"); this.appendValueInput("SW") .setCheck("Number"); this.setInputsInline(true); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class BitBlock : Block { public const string type_name = "bit"; public BitBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("Bit 7") .appendField(new FieldCheckbox("FALSE"), "BIT7") .appendField(new FieldCheckbox("FALSE"), "BIT6") .appendField(new FieldCheckbox("FALSE"), "BIT5") .appendField(new FieldCheckbox("FALSE"), "BIT4") .appendField(new FieldCheckbox("FALSE"), "BIT3") .appendField(new FieldCheckbox("FALSE"), "BIT2") .appendField(new FieldCheckbox("FALSE"), "BIT1") .appendField(new FieldCheckbox("FALSE"), "BIT0") .appendField("0"); this.setOutput(true, "Number"); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class HexadecimalBlock : Block { public const string type_name = "hexadecimal"; public HexadecimalBlock() : base(type_name) { } public void init() { var input = new FieldTextInput("00000000"); input.setValidator(validator); this.appendDummyInput() .appendField("HEX") .appendField(input, "VALUE"); this.setOutput(true, "Number"); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } public string validator(string text) { text = text.Replace(new Regex("[^0-9a-fA-F]+", "g"), ""); return text; } } public class ToneBlock : Block { public const string type_name = "tone"; public ToneBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("トーン出力") .appendField(GrPeach.PwmPins(), "PIN_NO"); this.appendValueInput("FREQUENCY") .setCheck("Number") .appendField("周波数"); this.appendValueInput("DURATION") .setCheck("Number") .appendField("出力を維持する時間[ms]"); this.setInputsInline(true); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class ToneValueBlock : Block { public const string type_name = "tone_value"; public ToneValueBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField(new FieldNumber("1000", 2, 62500, 1), "TONE_VALUE"); this.setOutput(true, "Number"); this.setColour(160); this.setTooltip("Tone 2~62500"); this.setHelpUrl("http://www.example.com/"); } } public class NoToneBlock : Block { public const string type_name = "no_tone"; public NoToneBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("トーン出力停止") .appendField(GrPeach.PwmPins(), "PIN_NO"); this.setInputsInline(true); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class RandomSeedBlock : Block { public const string type_name = "random_seed"; public RandomSeedBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("乱数を得るための種を与えます"); this.appendValueInput("VALUE") .setCheck("Number"); this.setInputsInline(true); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class RandomBlock : Block { public const string type_name = "random"; public RandomBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("乱数を取得"); this.appendValueInput("MIN") .setCheck("Number") .appendField("最小値"); this.appendValueInput("MAX") .setCheck("Number") .appendField("最大値"); this.setInputsInline(true); this.setOutput(true, "Number"); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } partial class Ruby { public node call(CallBlock block) { var value_ret = valueToCode(block, "RET"); return value_ret; } public node pin_mode(PinModeBlock block) { var dropdown_pin_no = block.getFieldValue("PIN_NO"); var dropdown_pin_mode = block.getFieldValue("PIN_MODE"); var p = new node[] { new int_node(this, GrPeach.PinNameToNum(dropdown_pin_no)), new int_node(this, GrPeach.PinModeNameToNum(dropdown_pin_mode)) }; return new fcall_node(this, intern("pinMode"), p, null); } public node digital_write(DigitalWriteBlock block) { var dropdown_pin_no = block.getFieldValue("PIN_NO"); var dropdown_pin_value = block.getFieldValue("PIN_VALUE"); var p = new node[] { new int_node(this, GrPeach.PinNameToNum(dropdown_pin_no)), new int_node(this, GrPeach.PinValueNameToNum(dropdown_pin_value )) }; return new fcall_node(this, intern("digitalWrite"), p, null); } public node digital_read(DigitalReadBlock block) { var dropdown_pin_no = block.getFieldValue("PIN_NO"); var p = new node[] { new int_node(this, GrPeach.PinNameToNum(dropdown_pin_no)), }; return new fcall_node(this, intern("digitalRead"), p, null); } public node analog_read(AnalogReadBlock block) { var dropdown_pin_no = block.getFieldValue("PIN_NO"); var p = new node[] { new int_node(this, GrPeach.PinNameToNum(dropdown_pin_no)), }; return new fcall_node(this, intern("analogRead"), p, null); } public node pwm(PwmBlock block) { var dropdown_pin_no = block.getFieldValue("PIN_NO"); var value_pwm_out = valueToCode(block, "PWM_OUT"); var p = new node[] { new int_node(this, GrPeach.PinNameToNum(dropdown_pin_no)), value_pwm_out }; return new fcall_node(this, intern("pwm"), p, null); } public node pwm_value(PwmValueBlock block) { var number_pwm_value = block.getFieldValue("PWM_VALUE"); return new int_node(this, number_pwm_value == null ? 0 : Bridge.Script.ParseInt(number_pwm_value, 10)); } public node analog_reference(AnalogReferenceBlock block) { var dropdown_analog_reference_mode = block.getFieldValue("ANALOG_REFERENCE_MODE"); var p = new node[] { new int_node(this, GrPeach.AnalogRefModeNameToNum(dropdown_analog_reference_mode)) }; return new fcall_node(this, intern("analogReference"), p, null); } public node init_dac(InitDacBlock block) { var p = new node[0]; return new fcall_node(this, intern("initDac"), p, null); } public node analog_dac(AnalogDacBlock block) { var value_value = valueToCode(block, "VALUE"); var p = new node[] { value_value }; return new fcall_node(this, intern("analogDac"), p, null); } public node dac_value(DacValueBlock block) { var number_dac_value = block.getFieldValue("ADC_VALUE"); return new int_node(this, number_dac_value == null ? 0 : Bridge.Script.ParseInt(number_dac_value, 10)); } public node delay(DelayBlock block) { var value_value = valueToCode(block, "VALUE"); var p = new node[] { value_value }; return new fcall_node(this, intern("delay"), p, null); } public node millis(MillisBlock block) { var p = new node[0]; return new fcall_node(this, intern("millis"), p, null); } public node micros(MicrosBlock block) { var p = new node[0]; return new fcall_node(this, intern("micros"), p, null); } public node led(LedBlock block) { var value_sw = valueToCode(block, "SW"); var p = new node[] { value_sw }; return new fcall_node(this, intern("led"), p, null); } public node bit(BitBlock block) { var value = 0; value += (block.getFieldValue("BIT7") == "TRUE") ? 0x80 : 0; value += (block.getFieldValue("BIT6") == "TRUE") ? 0x40 : 0; value += (block.getFieldValue("BIT5") == "TRUE") ? 0x20 : 0; value += (block.getFieldValue("BIT4") == "TRUE") ? 0x10 : 0; value += (block.getFieldValue("BIT3") == "TRUE") ? 0x08 : 0; value += (block.getFieldValue("BIT2") == "TRUE") ? 0x04 : 0; value += (block.getFieldValue("BIT1") == "TRUE") ? 0x02 : 0; value += (block.getFieldValue("BIT0") == "TRUE") ? 0x01 : 0; return new int_node(this, value); } public node hexadecimal(HexadecimalBlock block) { var value = block.getFieldValue("VALUE"); return new int_node(this, value == null ? 0 : Bridge.Script.ParseInt(value, 16)); } public node tone(ToneBlock block) { var dropdown_pin_no = block.getFieldValue("PIN_NO"); var value_frequency = valueToCode(block, "FREQUENCY"); var value_duration = valueToCode(block, "DURATION"); var p = new node[] { new int_node(this, GrPeach.PinNameToNum(dropdown_pin_no)), value_frequency, value_duration }; return new fcall_node(this, intern("tone"), p, null); } public node tone_value(ToneValueBlock block) { var number_tone_value = block.getFieldValue("TONE_VALUE"); return new int_node(this, number_tone_value == null ? 0 : Bridge.Script.ParseInt(number_tone_value, 10)); } public node no_tone(NoToneBlock block) { var dropdown_pin_no = block.getFieldValue("PIN_NO"); var p = new node[] { new int_node(this, GrPeach.PinNameToNum(dropdown_pin_no)), }; return new fcall_node(this, intern("noTone"), p, null); } public node random_seed(RandomSeedBlock block) { var value_name = valueToCode(block, "VALUE"); var p = new node[] { value_name, }; return new fcall_node(this, intern("randomSeed"), p, null); } public node random(RandomBlock block) { var value_min = valueToCode(block, "MIN"); var value_max = valueToCode(block, "MAX"); var p = new node[0]; if (value_min == null) p.Push(value_max); else { p.Push(value_min); p.Push(value_max); } return new fcall_node(this, intern("random"), p, null); } } }