using System; using System.Collections.Generic; using System.Linq; using Bridge; namespace WebMrbc { public class ServoAttachBlock : Block { public const string type_name = "servo_attach"; public ServoAttachBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("サーボ出力を任意のピンに割り当てます") .appendField(new FieldNumber("0", 0, 11, 1), "CH"); this.appendDummyInput() .appendField("割り当てるピン番号") .appendField(GrPeach.PwmPins(), "PIN_NO") .appendField("Min") .appendField(new FieldTextInput("default"), "MIN") .appendField("Max") .appendField(new FieldTextInput("default"), "MAX"); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class ServoAngleBlock : Block { public const string type_name = "servo_angle"; public ServoAngleBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField(new FieldAngle("180", validator), "VALUE"); this.setInputsInline(true); this.setOutput(true, "Number"); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } public string validator(string text) { if (text == null) return null; var a = Script.ParseFloat(text); if (Script.IsNaN(a)) return null; a %= 180; if (a < 0) a += 180; return a.ToString(); } } public class ServoWriteBlock : Block { public const string type_name = "servo_write"; public ServoWriteBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("サーボの角度をセットします") .appendField(new FieldNumber("0", 0, 11, 1), "CH"); this.appendValueInput("ANGLE") .setCheck("Number") .appendField("角度"); this.setInputsInline(true); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class ServoUsValueBlock : Block { public const string type_name = "servo_us_value"; public ServoUsValueBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField(new FieldNumber("0", 0, 19999, 1), "VALUE"); this.setOutput(true, "Number"); this.setColour(160); this.setTooltip("パルスの幅 1~19999, 0で出力 OFF"); this.setHelpUrl("http://www.example.com/"); } } public class ServoUsBlock : Block { public const string type_name = "servo_us"; public ServoUsBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("サーボモータにus単位で角度を指定する") .appendField(new FieldNumber("0", 0, 11, 1), "CH"); this.appendValueInput("US") .setCheck("Number") .appendField("出力したいパルスの幅"); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class ServoReadBlock : Block { public const string type_name = "servo_read"; public ServoReadBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("最後に設定された角度を読み出す") .appendField(new FieldNumber("0", 0, 11, 1), "CH"); this.setOutput(true, "Number"); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class ServoAttachedBlock : Block { public const string type_name = "servo_attached"; public ServoAttachedBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("ピンにサーボが割り当てられているかを確認する") .appendField(new FieldNumber("0", 0, 11, 1), "CH"); this.setOutput(true, "Boolean"); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } public class ServoDetachBlock : Block { public const string type_name = "servo_detach"; public ServoDetachBlock() : base(type_name) { } public void init() { this.appendDummyInput() .appendField("サーボの動作を止め、割り込みを禁止する") .appendField(new FieldNumber("0", 0, 11, 1), "CH"); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(160); this.setTooltip(""); this.setHelpUrl("http://www.example.com/"); } } partial class Ruby { public node servo_angle(ServoAngleBlock block) { var value = block.getFieldValue("VALUE"); return new int_node(this, value == null ? 0 : Script.ParseInt(value, 10)); } public node servo_us_value(ServoUsValueBlock block) { var value = block.getFieldValue("VALUE"); return new int_node(this, value == null ? 0 : Script.ParseInt(value, 10)); } public node servo_attach(ServoAttachBlock block) { var number_ch = block.getFieldValue("CH"); var dropdown_pin_no = block.getFieldValue("PIN_NO"); var text_min = block.getFieldValue("MIN"); var text_max = block.getFieldValue("MAX"); var c = new const_node(this, intern("Servo")); var p = new node[] { new int_node(this, number_ch == null ? 0 : Script.ParseInt(number_ch, 10)), new int_node(this, GrPeach.PinNameToNum(dropdown_pin_no)), new int_node(this, text_min == null ? 0 : Script.ParseInt(text_min, 10)), new int_node(this, text_max == null ? 0 : Script.ParseInt(text_max, 10)), }; return new call_node(this, c, intern("attach"), p, null); } public node servo_write(ServoWriteBlock block) { var number_ch = block.getFieldValue("CH"); var value_angle = valueToCode(block, "ANGLE"); var c = new const_node(this, intern("Servo")); var p = new node[] { new int_node(this, number_ch == null ? 0 : Script.ParseInt(number_ch, 10)), value_angle, }; return new call_node(this, c, intern("write"), p, null); } public node servo_us(ServoUsBlock block) { var number_ch = block.getFieldValue("CH"); var value_us = valueToCode(block, "US"); var c = new const_node(this, intern("Servo")); var p = new node[] { new int_node(this, number_ch == null ? 0 : Script.ParseInt(number_ch, 10)), value_us, }; return new call_node(this, c, intern("us"), p, null); } public node servo_read(ServoReadBlock block) { var number_ch = block.getFieldValue("CH"); var c = new const_node(this, intern("Servo")); var p = new node[] { new int_node(this, number_ch == null ? 0 : Script.ParseInt(number_ch, 10)), }; return new call_node(this, c, intern("read"), p, null); } public node servo_attached(ServoAttachedBlock block) { var number_ch = block.getFieldValue("CH"); var c = new const_node(this, intern("Servo")); var p = new node[] { new int_node(this, number_ch == null ? 0 : Script.ParseInt(number_ch, 10)), }; return new call_node(this, c, intern("attached"), p, null); } public node servo_detach(ServoDetachBlock block) { var number_ch = block.getFieldValue("CH"); var c = new const_node(this, intern("Servo")); var p = new node[] { new int_node(this, number_ch == null ? 0 : Script.ParseInt(number_ch, 10)), }; return new call_node(this, c, intern("detach"), p, null); } } }