初始化提交

This commit is contained in:
王立帮
2024-07-19 10:16:00 +08:00
parent 4c7b571f20
commit 4a2d56dcc4
7084 changed files with 741212 additions and 63 deletions

View File

@@ -0,0 +1,3 @@
node_modules
build
origin

View File

@@ -0,0 +1,482 @@
import * as Blockly from 'blockly/core';
const ACTUATOR_HUE = 100;
//Servo
export const servo_move = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_SERVO)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendValueInput("DEGREE", Number)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_DEGREE_0_180);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SERVO_MOVE);
}
};
//LED
export const number = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([
["1", "1"],
["2", "2"]
]), 'op')
this.setOutput(true);
}
};
export const ledswitch = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_ESP32_ON, "1"],
[Blockly.Msg.MIXLY_ESP32_OFF, "0"],
[Blockly.Msg.MIXLY_ESP32_TOGGLE, "-1"]
]), "flag");
this.setOutput(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_HIGHLOW);
}
};
export const actuator_extern_led_bright = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SETTING)
.appendField(Blockly.Msg.MIXLY_EXTERN_LED)
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendValueInput('bright')
.appendField(Blockly.Msg.MIXLY_PULSEIN_STAT)
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_EXTERN_LED_SETONOFF);
}
};
export const actuator_extern_get_led_bright = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET)
.appendField(Blockly.Msg.MIXLY_EXTERN_LED)
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_PULSEIN_STAT)
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_EXTERN_LED_GETONOFF);
}
};
export const actuator_extern_led_brightness = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SETTING)
.appendField(Blockly.Msg.MIXLY_EXTERN_LED)
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendValueInput('bright')
.appendField(Blockly.Msg.MIXLY_BRIGHTNESS)
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_EXTERN_LED_SETBRIGHT);
}
};
export const actuator_led_bright = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SETTING);
this.appendValueInput('led')
.appendField(Blockly.Msg.MIXLY_BUILDIN_LED)
this.appendValueInput('bright')
.appendField(Blockly.Msg.MIXLY_PULSEIN_STAT)
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_LED_SETONOFF);
}
};
export const actuator_get_led_bright = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET);
this.appendValueInput('led')
.appendField(Blockly.Msg.MIXLY_BUILDIN_LED)
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_PULSEIN_STAT)
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_LED_GETONOFF);
}
};
export const actuator_led_brightness = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SETTING);
this.appendValueInput('led')
.appendField(Blockly.Msg.MIXLY_BUILDIN_LED)
this.appendValueInput('bright')
.appendField(Blockly.Msg.MIXLY_BRIGHTNESS)
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_LED_SETBRIGHT);
}
};
//music
export const esp32_music_pitch = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_TONE)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendValueInput('pitch')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_FREQUENCY);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_BLOCKGROUP_TONE);
}
};
export const esp32_music_pitch_with_time = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_TONE)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendValueInput('pitch')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_FREQUENCY);
this.appendValueInput('time')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_DURATION);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_BLOCKGROUP_TONE2);
}
};
export const esp32_music_stop = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_NOTONE)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const esp32_music_set_tempo = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput('TICKS')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_SET_TEMPO)
.appendField(Blockly.Msg.MICROBIT_ACTUATOR_ticks);
this.appendValueInput('BPM')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_SPEED);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_MUSIC_SET_TEMPO);
}
}
export const esp32_music_get_tempo = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_Get_current_tempo)
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_MUSIC_GET_TEMPO);
}
}
export const esp32_music_reset = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_Reset_music)
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_MUSIC_RESET);
}
}
export const esp32_onboard_music_pitch = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_TONE);
this.appendValueInput('pitch')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_FREQUENCY);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_BLOCKGROUP_TONE);
}
};
export const esp32_onboard_music_pitch_with_time = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_TONE);
this.appendValueInput('pitch')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_FREQUENCY);
this.appendValueInput('time')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_DURATION);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_BLOCKGROUP_TONE2);
}
};
export const esp32_onboard_music_stop = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_NOTONE);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const esp32_onboard_music_play_list = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput('LIST')
.appendField(Blockly.Msg.MIXLY_ESP32_MUSIC_PLAY_LISTS)
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_MUSIC_PLAY_LISTS);
}
}
export const esp32_music_play_list = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput('LIST')
.appendField(Blockly.Msg.MIXLY_ESP32_MUSIC_PLAY_LISTS)
this.appendValueInput('PIN')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_PIN);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_MUSIC_PLAY_LISTS);
}
}
export const esp32_mixgo_music_play_list_show = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput('LIST')
.appendField(Blockly.Msg.MIXLY_ESP32_MUSIC_PLAY_LISTS)
this.appendValueInput('PIN')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_PIN);
// this.appendValueInput('DISPLAY')
// .appendField(Blockly.Msg.MIXLY_ESP32_MIXGO_MUSIC_SHOW_IN);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_MIXGO_MUSIC_PLAY_TONE);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_MUSIC_PLAYSHOW)
}
}
//RGB
export const actuator_neopixel_init = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RGB)
this.appendValueInput('SUB')
.appendField(Blockly.Msg.MIXLY_SETUP)
.setCheck("var");
this.appendValueInput("PIN", Number)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_PIN);
this.appendValueInput("LEDCOUNT")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_COUNT);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_RGB_PIN_COUNT);
}
};
export const actuator_neopixel_rgb = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RGB)
this.appendValueInput('SUB')
.setCheck("var");
// .appendField(Blockly.Msg.MIXLY_SETUP)
this.appendValueInput("_LED_")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_NUM);
this.appendValueInput("RVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_R);
this.appendValueInput("GVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_G);
this.appendValueInput("BVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_B);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip('');
this.setTooltip(Blockly.Msg.MIXLY_RGB_NUM_R_G_B);
}
};
export const actuator_neopixel_write = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RGB)
// this.appendValueInput("PIN", Number)
// .setCheck(Number)
// .setAlign(Blockly.inputs.Align.RIGHT)
// .appendField(Blockly.Msg.MIXLY_PIN);
this.appendValueInput('SUB')
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_RGB_WRITE)
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip('');
this.setTooltip(Blockly.Msg.MIXLY_ESP32_MUSIC_WRI);
}
};
export const actuator_onboard_neopixel_rgb = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RGB)
this.appendValueInput("_LED_")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_NUM);
this.appendValueInput("RVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_R);
this.appendValueInput("GVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_G);
this.appendValueInput("BVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_B);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip('');
this.setTooltip(Blockly.Msg.MIXLY_RGB_NUM_R_G_B);
}
};
export const actuator_onboard_neopixel_rgb_all = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RGB)
this.appendValueInput("RVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_R);
this.appendValueInput("GVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_G);
this.appendValueInput("BVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_B);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip('');
this.setTooltip(Blockly.Msg.MIXLY_RGB_NUM_R_G_B);
}
};
export const actuator_onboard_neopixel_write = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RGB)
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_RGB_WRITE)
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip('');
this.setTooltip(Blockly.Msg.MIXLY_ESP32_MUSIC_WRI);
}
};
export const led_light = actuator_led_bright;
export const get_led_bright = actuator_get_led_bright;
export const led_brightness = actuator_led_brightness;

View File

@@ -0,0 +1,947 @@
import * as Blockly from 'blockly/core';
import { Profile } from 'mixly';
const ACTUATOR_EXTERN_HUE = '#74A55B';
//music
export const esp32_music_pitch_init = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MIDI)
this.appendValueInput('SUB')
.appendField(Blockly.Msg.MIXLY_SETUP)
.setCheck("var");
this.appendValueInput("PIN", Number)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_PIN);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_RGB_PIN_COUNT);
}
};
export const esp32_music_pitch = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput('SUB')
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_TONE)
this.appendValueInput('pitch')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_FREQUENCY);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_BLOCKGROUP_TONE);
}
};
export const esp32_music_pitch_with_time = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput('SUB')
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_TONE)
this.appendValueInput('pitch')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_FREQUENCY);
this.appendValueInput('time')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_DURATION);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_BLOCKGROUP_TONE2);
}
};
export const esp32_music_play_list = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput('SUB')
this.appendValueInput('LIST')
.appendField(Blockly.Msg.MIXLY_ESP32_MUSIC_PLAY_LISTS)
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_MUSIC_PLAY_LISTS);
}
}
export const esp32_music_set_tempo_extern = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput('SUB')
this.appendValueInput('TICKS')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_SET_TEMPO)
.appendField(Blockly.Msg.MICROBIT_ACTUATOR_ticks);
this.appendValueInput('BPM')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_SPEED);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_MUSIC_SET_TEMPO);
}
}
export const esp32_music_get_tempo_extern = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput('SUB')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_Get_current_tempo)
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_MUSIC_GET_TEMPO);
}
}
export const esp32_music_reset_extern = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput('SUB')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_Reset_music)
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_MUSIC_RESET);
}
}
export const esp32_music_stop = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput('SUB')
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_NOTONE)
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const actuator_extern_led_bright = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SETTING)
.appendField(Blockly.Msg.MIXLY_EXTERN_LED)
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendValueInput('bright')
.appendField(Blockly.Msg.MIXLY_PULSEIN_STAT)
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_EXTERN_LED_SETONOFF);
}
};
export const actuator_extern_get_led_bright = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET)
.appendField(Blockly.Msg.MIXLY_EXTERN_LED)
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_BRIGHTNESS)
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_EXTERN_LED_GETONOFF);
}
};
export const actuator_extern_get_led_state = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET)
.appendField(Blockly.Msg.MIXLY_EXTERN_LED)
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_PULSEIN_STAT)
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_EXTERN_LED_GETONOFF);
}
};
export const actuator_extern_led_brightness = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SETTING)
.appendField(Blockly.Msg.MIXLY_EXTERN_LED)
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendValueInput('bright')
.appendField(Blockly.Msg.MIXLY_BRIGHTNESS)
this.appendDummyInput()
.appendField('%')
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_EXTERN_LED_SETBRIGHT);
}
};
//Servo
export const servo_init = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput("VAR")
.appendField(Blockly.Msg.MIXLY_SETUP + Blockly.Msg.MIXLY_SERVO)
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_PIN)
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
};
export const servo_move = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_SERVO)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendValueInput("DEGREE", Number)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_DEGREE_0_180);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SERVO_MOVE);
}
};
export const servo_speed_360 = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput("VAR")
.appendField("360°" + Blockly.Msg.MIXLY_SERVO)
this.appendValueInput("SPEED", Number)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_SETTING + Blockly.Msg.blockpy_turtle_rotate + Blockly.Msg.MIXLY_SPEED + " (-10~10)");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SERVO_360_TOOLTIP);
}
};
//Servo
export const servo_set_angle = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput("PIN", Number)
.appendField('180°' + Blockly.Msg.MIXLY_SERVO)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendValueInput("NUM", Number)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SERVO_MOVE);
}
};
export const servo_set_speed = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput("PIN", Number)
.appendField('360°' + Blockly.Msg.MIXLY_SERVO)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendValueInput("NUM", Number)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_SPEED);
this.appendDummyInput()
.appendField('%');
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SERVO_SPEED_TOOLIPS);
}
};
export const servo_get_angle = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput("PIN", Number)
.appendField('180°' + Blockly.Msg.MIXLY_SERVO)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET + Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE);
this.setOutput(true, Number);
this.setInputsInline(true);
}
};
export const servo_get_speed = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput("PIN", Number)
.appendField('360°' + Blockly.Msg.MIXLY_SERVO)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET + Blockly.Msg.MIXLY_SPEED);
this.setOutput(true, Number);
this.setInputsInline(true);
}
};
export const actuator_ms32006_init = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput('SUB')
.appendField("初始化")
.setCheck("var");
this.appendDummyInput()
.appendField("电机驱动");
this.appendDummyInput()
.appendField("地址")
.appendField(new Blockly.FieldDropdown([['A', 'ms32006.ADDRESS_A'], ['B', 'ms32006.ADDRESS_B']]), 'mode');
this.appendValueInput('SUB1')
.setCheck("var")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("通信");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip("初始化MS32006电机驱动使用I2C通信");
}
};
export const actuator_ms32006_dcmotor = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput('SUB')
.appendField("直流电机")
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_Direction)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.CLOCKWISE, "ms32006.MOT_CW"],
[Blockly.Msg.ANTI_CLOCKWISE, "ms32006.MOT_CCW"],
[Blockly.Msg.MOTOR_N, "ms32006.MOT_N"],
[Blockly.Msg.MOTOR_P, "ms32006.MOT_P"]
]), "direction");
this.appendValueInput('speed')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_STEPPER_SET_SPEED);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip("设置直流电机的状态及转速(0-100)");
}
};
export const actuator_ms32006_stepper = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput('SUB')
.appendField("步进电机")
.setCheck("var");
this.appendDummyInput()
.appendField("选择")
.appendField(new Blockly.FieldDropdown([['A', 'ms32006.MOT_A'], ['B', 'ms32006.MOT_B']]), 'mode');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_Direction)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.CLOCKWISE, "ms32006.MOT_CW"],
[Blockly.Msg.ANTI_CLOCKWISE, "ms32006.MOT_CCW"]
]), "direction");
this.appendValueInput('speed')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("转速");
this.appendValueInput('steps')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("步数");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip("设置步进电机的状态、转速、步数(0-2047)");
}
};
//rgb
export const actuator_neopixel_init = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RGB)
this.appendValueInput('SUB')
.appendField(Blockly.Msg.MIXLY_SETUP)
.setCheck("var");
this.appendValueInput("PIN", Number)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_PIN);
this.appendValueInput("LEDCOUNT")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_COUNT);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_RGB_PIN_COUNT);
}
};
export const actuator_neopixel_rgb = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RGB)
this.appendValueInput('SUB')
.setCheck("var");
// .appendField(Blockly.Msg.MIXLY_SETUP)
this.appendValueInput("_LED_")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_NUM);
this.appendValueInput("RVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_R);
this.appendValueInput("GVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_G);
this.appendValueInput("BVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_B);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip('');
this.setTooltip(Blockly.Msg.MIXLY_RGB_NUM_R_G_B_MP);
}
};
export const actuator_neopixel_rgb_all = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RGB)
this.appendValueInput('SUB')
.setCheck("var");
this.appendValueInput("RVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_R);
this.appendValueInput("GVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_G);
this.appendValueInput("BVALUE")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RGB_B);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip('');
this.setTooltip(Blockly.Msg.MIXLY_RGB_ALL_R_G_B_MIXGOCC);
}
};
export const actuator_neopixel_write = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_RGB)
// this.appendValueInput("PIN", Number)
// .setCheck(Number)
// .setAlign(Blockly.inputs.Align.RIGHT)
// .appendField(Blockly.Msg.MIXLY_PIN);
this.appendValueInput('SUB')
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_RGB_WRITE)
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip('');
this.setTooltip(Blockly.Msg.MIXLY_ESP32_MUSIC_WRI);
}
};
export const actuator_use_uart_init = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.CONTROLS_FOR_INPUT_WITH + "uart")
.appendField(new Blockly.FieldDropdown([
["uart1", "uart1"],
["uart2", "uart2"]
]), "key");
this.appendValueInput('SUB')
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE)
.setCheck("var");
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_SETUP + Blockly.Msg.LISTS_SET_INDEX_INPUT_TO + 'SYN6288' + Blockly.Msg.MIXLY_AipSpeech_synthesis)
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setFieldValue("LTR308", "key");
}
};
export const syn6288_set_voice = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput('SUB')
.appendField('SYN6288')
this.appendValueInput('VOICE')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_SET_VOLUME);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_SET_VOLUME_TOOLTIP);
}
}
export const syn6288_get_voice = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput('SUB')
.appendField('SYN6288')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET_VOLUME)
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_SET_VOLUME_TOOLTIP);
}
}
export const syn6288_builtin_voice = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput('SUB')
.appendField('SYN6288')
this.appendValueInput('VOICE')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_PLAY_HINTS);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_PROGRAM_BLOCK)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_TRUE, 'True'], [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_FALSE, 'False']]), 'mode');
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_PLAY_HINTS_TOOLTIP);
}
}
export const syn6288_tts_play = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendValueInput('SUB')
.appendField('SYN6288')
this.appendValueInput('data')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_AipSpeech_synthesis);
this.appendValueInput('VOICE')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_BACKGROUND_MUSIC);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_PROGRAM_BLOCK)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_TRUE, 'True'], [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_FALSE, 'False']]), 'mode');
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_PLAY_TTS_TOOLTIP);
}
}
//mixbot extern
export const mixbot_addr_extern = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.extern_addr), 'PIN');
this.setOutput(true, Number);
}
};
export const robot_motor_extern = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.ME_GO_MOTOR_EXTERN + Blockly.Msg.MIXLY_MOTOR)
.appendField(Blockly.Msg.PIN_NUMBERING)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_LEFT, "0"], [Blockly.Msg.MIXLY_RIGHT, "1"]]), "mode");
this.appendValueInput('speed')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_SPEED);
this.appendDummyInput()
.appendField('%')
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MIXBOT_MOTOR_EXTERN_TOOLTIP);
}
}
export const robot_motor_extern_get_speed = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.ME_GO_MOTOR_EXTERN + Blockly.Msg.MIXLY_MOTOR)
.appendField(Blockly.Msg.PIN_NUMBERING)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_LEFT, "0"], [Blockly.Msg.MIXLY_RIGHT, "1"]]), "mode");
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_GET + Blockly.Msg.MIXLY_SPEED);
this.setOutput(true, Number);
this.setInputsInline(true);
}
}
export const robot_traffic_light_extern = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.ME_GO_MOTOR_EXTERN + Blockly.Msg.MIXLY_TRAFFIC_LIGHT)
.appendField(Blockly.Msg.PIN_NUMBERING)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_LEFT, "0"], [Blockly.Msg.MIXLY_RIGHT, "1"]]), "mode");
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.LISTS_SET_INDEX_SET)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_MICROBIT_Turn_off_display, '0'],
[Blockly.Msg.MIXLY_TRAFFIC_LIGHT_RED_ON, '1'],
[Blockly.Msg.MIXLY_TRAFFIC_LIGHT_RED_BLINK, '2'],
[Blockly.Msg.MIXLY_TRAFFIC_LIGHT_YELLOW_ON, '3'],
[Blockly.Msg.MIXLY_TRAFFIC_LIGHT_YELLOW_BLINK, '4'],
[Blockly.Msg.MIXLY_TRAFFIC_LIGHT_GREEN_ON, '5'],
[Blockly.Msg.MIXLY_TRAFFIC_LIGHT_GREEN_BLINK, '6']
]), "light");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
}
export const robot_led_extern = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.ME_GO_MOTOR_EXTERN)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.COLOUR_RGB_WHITE, 'W'],
[Blockly.Msg.COLOUR_RGB_RED, 'R'],
[Blockly.Msg.COLOUR_RGB_YELLOW, 'Y'],
[Blockly.Msg.COLOUR_RGB_GREEN, 'G'],
[Blockly.Msg.COLOUR_RGB_BLUE, 'B']
]), "color")
.appendField("LED")
.appendField(Blockly.Msg.PIN_NUMBERING)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_LEFT, "0"], [Blockly.Msg.MIXLY_RIGHT, "1"]]), "mode");
this.appendValueInput('value')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.BRIGHTNESS);
this.appendDummyInput()
.appendField('%')
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
}
export const robot_led_extern_get_value = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.ME_GO_MOTOR_EXTERN)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.COLOUR_RGB_WHITE, 'W'],
[Blockly.Msg.COLOUR_RGB_RED, 'R'],
[Blockly.Msg.COLOUR_RGB_YELLOW, 'Y'],
[Blockly.Msg.COLOUR_RGB_GREEN, 'G'],
[Blockly.Msg.COLOUR_RGB_BLUE, 'B']
]), "color")
.appendField("LED")
.appendField(Blockly.Msg.PIN_NUMBERING)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_LEFT, "0"], [Blockly.Msg.MIXLY_RIGHT, "1"]]), "mode");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET + Blockly.Msg.BRIGHTNESS)
this.setOutput(true, Number);
this.setInputsInline(true);
}
}
export const robot_servo_extern_get_status = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.ME_GO_MOTOR_EXTERN + Blockly.Msg.MIXLY_SERVO_MOTOR)
.appendField(Blockly.Msg.PIN_NUMBERING)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_LEFT, "0"], [Blockly.Msg.MIXLY_RIGHT, "1"]]), "mode");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_MICROBIT_JS_BLE_POWER, '[0]'],
[Blockly.Msg.MIXLY_SPEED, '[1]'],
[Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE + Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE, '[2]'],
[Blockly.Msg.MIXLY_RELATIVE + Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE, '[3]'],
[Blockly.Msg.MIXLY_MIXBOT_SERVO_BLOCK_OR_NOT, '[4]'],
[Blockly.Msg.MIXLY_MIXBOT_SERVO_FINISH_OR_NOT, '[5]'],
[Blockly.Msg.MIXLY_ALL, '']
]), "status");
this.setOutput(true, Number);
this.setInputsInline(true);
}
}
export const robot_servo_extern_stop_mode = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.ME_GO_MOTOR_EXTERN + Blockly.Msg.MIXLY_SERVO_MOTOR)
.appendField(Blockly.Msg.PIN_NUMBERING)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_LEFT, "0"], [Blockly.Msg.MIXLY_RIGHT, "1"]]), "mode");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MIXBOT_SERVO_SET_STOP_MODE)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_MIXBOT_SERVO_STOP_MODE_KEEP, '0'],
[Blockly.Msg.MIXLY_MIXBOT_SERVO_STOP_MODE_COAST, '1'],
[Blockly.Msg.MIXLY_MIXBOT_SERVO_STOP_MODE_BRAKE, '2']
]), "status");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
}
export const robot_servo_extern_stop = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.ME_GO_MOTOR_EXTERN + Blockly.Msg.MIXLY_SERVO_MOTOR)
.appendField(Blockly.Msg.PIN_NUMBERING)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_LEFT, "0"], [Blockly.Msg.MIXLY_RIGHT, "1"]]), "mode");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_STOP)
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
}
export const robot_servo_extern_absolute_run = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.ME_GO_MOTOR_EXTERN + Blockly.Msg.MIXLY_SERVO_MOTOR)
.appendField(Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE + Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE + Blockly.Msg.MSG.run)
.appendField(Blockly.Msg.PIN_NUMBERING)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_LEFT, "0"], [Blockly.Msg.MIXLY_RIGHT, "1"]]), "mode");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MODE)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_SPEED + Blockly.Msg.MIXLY_MODE, '0'],
[Blockly.Msg.MIXLY_MICROBIT_JS_BLE_POWER + Blockly.Msg.MIXLY_MODE, '1']
]), "status");
this.appendValueInput('speed')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_PARAMS);
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField('%')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MIXBOT_SERVO_TURN_DIRECTION)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.CLOCKWISE, '0'],
[Blockly.Msg.MIXLY_MIXBOT_SERVO_NEAREST_PATH, '1'],
[Blockly.Msg.ANTI_CLOCKWISE, '2']
]), "direction");
this.appendValueInput('angle')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_DISPLAY_MATRIX_ROTATE + Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MIXBOT_SERVO_ABSOLUTE_ANGLE_TOOLTIP);
}
}
export const robot_servo_extern_relative_origin = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.ME_GO_MOTOR_EXTERN + Blockly.Msg.MIXLY_SERVO_MOTOR)
.appendField(Blockly.Msg.MIXLY_RELATIVE + Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE + Blockly.Msg.MSG.run)
.appendField(Blockly.Msg.PIN_NUMBERING)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_LEFT, "0"], [Blockly.Msg.MIXLY_RIGHT, "1"]]), "mode");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MIXBOT_SERVO_RELATIVE_ORIGIN_PATH)
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
}
export const robot_servo_extern_relative_run = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.ME_GO_MOTOR_EXTERN + Blockly.Msg.MIXLY_SERVO_MOTOR)
.appendField(Blockly.Msg.MIXLY_RELATIVE + Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE + Blockly.Msg.MSG.run)
.appendField("(" + Blockly.Msg.MIXLY_MIXBOT_SERVO_LIKE_ENCODING_MOTOR + ")")
.appendField(Blockly.Msg.PIN_NUMBERING)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_LEFT, "0"], [Blockly.Msg.MIXLY_RIGHT, "1"]]), "mode");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MODE)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_SPEED + Blockly.Msg.MIXLY_MODE, '0'],
[Blockly.Msg.MIXLY_MICROBIT_JS_BLE_POWER + Blockly.Msg.MIXLY_MODE, '1']
]), "status");
this.appendValueInput('speed')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_PARAMS);
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField('%')
this.appendValueInput('angle')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_DISPLAY_MATRIX_ROTATE + Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MIXBOT_SERVO_RELATIVE_ANGLE_TOOLTIP);
}
}
export const robot_servo_extern_relative_continue = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.ME_GO_MOTOR_EXTERN + Blockly.Msg.MIXLY_SERVO_MOTOR)
.appendField(Blockly.Msg.MIXLY_RELATIVE + Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE + Blockly.Msg.MSG.run)
.appendField("(" + Blockly.Msg.MIXLY_MIXBOT_SERVO_LIKE_ORDINARY_MOTOR + ")")
.appendField(Blockly.Msg.PIN_NUMBERING)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_LEFT, "0"], [Blockly.Msg.MIXLY_RIGHT, "1"]]), "mode");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MODE)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_SPEED + Blockly.Msg.MIXLY_MODE, '0'],
[Blockly.Msg.MIXLY_MICROBIT_JS_BLE_POWER + Blockly.Msg.MIXLY_MODE, '1']
]), "status");
this.appendValueInput('speed')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_PARAMS);
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField('%')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MIXBOT_SERVO_TURN_DIRECTION)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.CLOCKWISE, '0'],
[Blockly.Msg.ANTI_CLOCKWISE, '2']
]), "direction");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
}
export const mixbot_actuator_extern_get_addr = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXBOT)
.appendField(Blockly.Msg.ME_GO_MOTOR_EXTERN)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_MOTOR, 'ext_motor'],
[Blockly.Msg.MIXLY_TRAFFIC_LIGHT, 'ext_traffic'],
[Blockly.Msg.COLOUR_RGB_WHITE + "LED", 'W_LED'],
[Blockly.Msg.COLOUR_RGB_RED + "LED", 'R_LED'],
[Blockly.Msg.COLOUR_RGB_YELLOW + "LED", 'Y_LED'],
[Blockly.Msg.COLOUR_RGB_GREEN + "LED", 'G_LED'],
[Blockly.Msg.COLOUR_RGB_BLUE + "LED", 'B_LED'],
[Blockly.Msg.MIXLY_SERVO_MOTOR, 'ext_servo']
]), "name")
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MIXBOT_EXTERN_GET_ADDR)
this.setOutput(true);
this.setInputsInline(true);
}
}
export const mixbot_actuator_extern_set_addr = {
init: function () {
this.setColour(ACTUATOR_EXTERN_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXBOT)
.appendField(Blockly.Msg.ME_GO_MOTOR_EXTERN)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_MOTOR, 'ext_motor'],
[Blockly.Msg.MIXLY_TRAFFIC_LIGHT, 'ext_traffic'],
[Blockly.Msg.COLOUR_RGB_WHITE + "LED", 'W_LED'],
[Blockly.Msg.COLOUR_RGB_RED + "LED", 'R_LED'],
[Blockly.Msg.COLOUR_RGB_YELLOW + "LED", 'Y_LED'],
[Blockly.Msg.COLOUR_RGB_GREEN + "LED", 'G_LED'],
[Blockly.Msg.COLOUR_RGB_BLUE + "LED", 'B_LED'],
[Blockly.Msg.MIXLY_SERVO_MOTOR, 'ext_servo']
]), "name")
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MIXBOT_EXTERN_SET_ADDR)
this.appendValueInput('old')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT_GESTURE);
this.appendValueInput('new')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_UPDATE);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,68 @@
import * as Blockly from 'blockly/core';
const AI_HUE = 205;
export const MICROPYTHON_AI_client = {
init: function () {
this.setColour(AI_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_SETUP)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_AipSpeech_asr, "ASR"],
[Blockly.Msg.MIXLY_AI_UNIT, "UNIT"]
]), 'CTYPE')
this.appendValueInput('SUB')
.appendField(Blockly.Msg.MIXLY_Client)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput('API_KEY')
.appendField('API_KEY')
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput('SECRET_KEY')
.appendField('SECRET_KEY')
.setAlign(Blockly.inputs.Align.RIGHT);
this.setInputsInline(false);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
}
};
export const MICROPYTHON_AI_Speech_unit = { // AI_TYPE_FUNC
init: function () {
this.setColour(AI_HUE);
this.appendValueInput('SUB')
.appendField(Blockly.Msg.MIXLY_AI_UNIT)
.appendField(Blockly.Msg.MIXLY_Client)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput('ID')
.appendField('ID')
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput('STR')
.appendField(Blockly.Msg.OLED_STRING)
.setAlign(Blockly.inputs.Align.RIGHT);
this.setInputsInline(true);
this.setOutput(true);
}
};
export const MICROPYTHON_AI_Speech_asr = { // AI_TYPE_FUNC
init: function () {
this.setColour(AI_HUE);
this.appendValueInput('SUB')
.appendField(Blockly.Msg.MIXLY_AipSpeech_asr)
.appendField(Blockly.Msg.MIXLY_Client)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput('FILE')
.appendField(Blockly.Msg.MIXPY_AI_AUDIO_TIME)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_LANGUAGE)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_AI_LANGUAGE_CHINESE, "1537"],
[Blockly.Msg.MIXLY_AI_LANGUAGE_ENGLISH, "1737"],
[Blockly.Msg.MIXLY_AI_LANGUAGE_CANTONESE, "1637"]
]), 'LANGUAGE')
this.setInputsInline(true);
this.setOutput(true);
}
};

View File

@@ -0,0 +1,746 @@
import * as Blockly from 'blockly/core';
const AI_SENSOR_HUE = '#90A244'; //'#9e77c9'//40;
export const ai_sensor_use_uart_init = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.CONTROLS_FOR_INPUT_WITH + "uart")
.appendField(new Blockly.FieldDropdown([
["uart1", "uart1"],
["uart2", "uart2"]
]), "key");
this.appendValueInput('SUB')
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE)
.setCheck("var");
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_SETUP + Blockly.Msg.LISTS_SET_INDEX_INPUT_TO + 'MixGo AI' + Blockly.Msg.MSG.catSensor)
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
}
};
export const ai_sensor_qrcode = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('VAR')
.appendField(Blockly.Msg.MIXLY_QR_CODE + Blockly.Msg.MIXPY_OBJECT)
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ALL_CODE_ANALYSIS);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.OLED_STRING, "info1"],
[Blockly.Msg.MIXLY_POSITION_XY + "-xywh", "rect"],
["x" + Blockly.Msg.MIXLY_POSITION_XY, "rect[0]"],
["y" + Blockly.Msg.MIXLY_POSITION_XY, "rect[1]"],
["w" + Blockly.Msg.MIXLY_POSITION_XY, "rect[2]"],
["h" + Blockly.Msg.MIXLY_POSITION_XY, "rect[3]"],
[Blockly.Msg.MICROPYTHON_HUSKYLENS_X_CENTERED + Blockly.Msg.MIXLY_POSITION_XY, "xc"],
[Blockly.Msg.MICROPYTHON_HUSKYLENS_Y_CENTERED + Blockly.Msg.MIXLY_POSITION_XY, "yc"]
]), "key");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_QR_CODE_TOOLTIP);
}
};
export const ai_sensor_qrcode_lite = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('VAR')
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_QR_CODE + Blockly.Msg.MIXPY_OBJECT, "qrcode"],
[Blockly.Msg.MIXLY_BAR_CODE + Blockly.Msg.MIXPY_OBJECT, "barcode"],
[Blockly.Msg.MIXLY_TAG + Blockly.Msg.MIXPY_OBJECT, "apriltag"]
]), "TYPE");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ANALYSIS_RESULT);
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip();
}
};
export const ai_sensor_find_qrcodes = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('SUB')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_QR_CODE_RECOGNTITION);
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + "[qrcode]");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_QR_CODE_RECOGNTITION_TOOLTIP);
}
};
export const ai_sensor_config = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('SUB')
this.appendValueInput("RX")
.appendField(Blockly.Msg.MIXLY_SETTING + Blockly.Msg.MIXLY_ETHERNET_CLINET_PORT)
.appendField("RX#")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("TX")
.appendField("TX#")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendDummyInput()
.appendField(Blockly.Msg.SOFT_RESET + Blockly.Msg.MIXLY_ESP32_RGB_WRITE)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_TRUE, 'True'], [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_FALSE, 'False']]), 'mode')
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_CONFIG_TOOLTIP);
}
};
export const ai_sensor_rgb = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('SUB')
this.appendValueInput("led1")
.appendField(Blockly.Msg.MIXLY_SETTING)
.appendField("RGB1")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("led2")
.appendField("RGB2")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_CONFIG_TOOLTIP);
}
};
export const ai_sensor_barcode = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('VAR')
.appendField(Blockly.Msg.MIXLY_BAR_CODE + Blockly.Msg.MIXPY_OBJECT)
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ALL_CODE_ANALYSIS);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.OLED_STRING, "info1"],
[Blockly.Msg.MIXLY_POSITION_XY + "-xywh", "rect"],
["x" + Blockly.Msg.MIXLY_POSITION_XY, "rect[0]"],
["y" + Blockly.Msg.MIXLY_POSITION_XY, "rect[1]"],
["w" + Blockly.Msg.MIXLY_POSITION_XY, "rect[2]"],
["h" + Blockly.Msg.MIXLY_POSITION_XY, "rect[3]"],
[Blockly.Msg.MICROPYTHON_HUSKYLENS_X_CENTERED + Blockly.Msg.MIXLY_POSITION_XY, "xc"],
[Blockly.Msg.MICROPYTHON_HUSKYLENS_Y_CENTERED + Blockly.Msg.MIXLY_POSITION_XY, "yc"]
]), "key");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_BAR_CODE_TOOLTIP);
}
};
export const ai_sensor_find_barcodes = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('SUB')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_BAR_CODE_RECOGNTITION);
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + "[barcode]");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_BAR_CODE_RECOGNTITION_TOOLTIP);
}
};
export const ai_sensor_tag = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('VAR')
.appendField(Blockly.Msg.MIXLY_TAG + Blockly.Msg.MIXPY_OBJECT)
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ALL_CODE_ANALYSIS);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.OLED_STRING, "info1"],
[Blockly.Msg.blockpy_turtle_rotate + Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE, "info2"],
[Blockly.Msg.MIXLY_POSITION_XY + "-xywh", "rect"],
["x" + Blockly.Msg.MIXLY_POSITION_XY, "rect[0]"],
["y" + Blockly.Msg.MIXLY_POSITION_XY, "rect[1]"],
["w" + Blockly.Msg.MIXLY_POSITION_XY, "rect[2]"],
["h" + Blockly.Msg.MIXLY_POSITION_XY, "rect[3]"],
[Blockly.Msg.MICROPYTHON_HUSKYLENS_X_CENTERED + Blockly.Msg.MIXLY_POSITION_XY, "xc"],
[Blockly.Msg.MICROPYTHON_HUSKYLENS_Y_CENTERED + Blockly.Msg.MIXLY_POSITION_XY, "yc"]
]), "key");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_TAG_TOOLTIP);
}
};
export const ai_sensor_find_tags = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('SUB')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_TAG_RECOGNTITION);
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + "[tag]");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_TAG_RECOGNTITION_TOOLTIP);
}
};
export const ai_sensor_line = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('VAR')
.appendField(Blockly.Msg.MIXLY_LINE + Blockly.Msg.MIXPY_OBJECT)
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ALL_CODE_ANALYSIS);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_LINE_ANGLE, "info1"],
[Blockly.Msg.MIXLY_POSITION_XY + "-x1x2y1y2", "rect"],
["x1" + Blockly.Msg.MIXLY_POSITION_XY, "rect[0]"],
["x2" + Blockly.Msg.MIXLY_POSITION_XY, "rect[1]"],
["y1" + Blockly.Msg.MIXLY_POSITION_XY, "rect[2]"],
["y2" + Blockly.Msg.MIXLY_POSITION_XY, "rect[3]"]
]), "key");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_LINE_TOOLTIP);
}
};
export const ai_sensor_find_lines = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('SUB')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_LINE_RECOGNTITION);
this.appendValueInput("VAR1")
.appendField(Blockly.Msg.MIXLY_ESP32_THRESHOLD)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("VAR2")
.appendField(Blockly.Msg.MIXLY_LINE_RECOGNTITION_ANGLE)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("VAR3")
.appendField(Blockly.Msg.MIXLY_LINE_RECOGNTITION_SLOPE)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + "[line]");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_LINE_RECOGNTITION_TOOLTIP);
}
};
export const ai_sensor_circle = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('VAR')
.appendField(Blockly.Msg.MIXLY_CIRCLE + Blockly.Msg.MIXPY_OBJECT)
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ALL_CODE_ANALYSIS);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_CIRCLE_AREA, "info1"],
[Blockly.Msg.MIXLY_POSITION_XY + "-xywh", "rect"],
["x" + Blockly.Msg.MIXLY_POSITION_XY, "rect[0]"],
["y" + Blockly.Msg.MIXLY_POSITION_XY, "rect[1]"],
["w" + Blockly.Msg.MIXLY_POSITION_XY, "rect[2]"],
["h" + Blockly.Msg.MIXLY_POSITION_XY, "rect[3]"],
[Blockly.Msg.MICROPYTHON_HUSKYLENS_X_CENTERED + Blockly.Msg.MIXLY_POSITION_XY, "xc"],
[Blockly.Msg.MICROPYTHON_HUSKYLENS_Y_CENTERED + Blockly.Msg.MIXLY_POSITION_XY, "yc"]
]), "key");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_CIRCLE_TOOLTIP);
}
};
export const ai_sensor_find_circles = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('SUB')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_CIRCLE_RECOGNTITION);
this.appendValueInput("VAR1")
.appendField(Blockly.Msg.MIXLY_ESP32_THRESHOLD)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("VAR2")
.appendField(Blockly.Msg.MIXLY_CIRCLE_RECOGNTITION_MIN)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("VAR3")
.appendField(Blockly.Msg.MIXLY_CIRCLE_RECOGNTITION_MAX)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + "[circle]");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_CIRCLE_RECOGNTITION_TOOLTIP);
}
};
export const ai_sensor_rect = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('VAR')
.appendField(Blockly.Msg.MIXLY_RECT + Blockly.Msg.MIXPY_OBJECT)
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ALL_CODE_ANALYSIS);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_CIRCLE_AREA, "info1"],
[Blockly.Msg.MIXLY_POSITION_XY + "-xywh", "rect"],
["x" + Blockly.Msg.MIXLY_POSITION_XY, "rect[0]"],
["y" + Blockly.Msg.MIXLY_POSITION_XY, "rect[1]"],
["w" + Blockly.Msg.MIXLY_POSITION_XY, "rect[2]"],
["h" + Blockly.Msg.MIXLY_POSITION_XY, "rect[3]"],
[Blockly.Msg.MICROPYTHON_HUSKYLENS_X_CENTERED + Blockly.Msg.MIXLY_POSITION_XY, "xc"],
[Blockly.Msg.MICROPYTHON_HUSKYLENS_Y_CENTERED + Blockly.Msg.MIXLY_POSITION_XY, "yc"]
]), "key");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_RECT_TOOLTIP);
}
};
export const ai_sensor_find_rects = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('SUB')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_RECT_RECOGNTITION);
this.appendValueInput("VAR1")
.appendField(Blockly.Msg.MIXLY_ESP32_THRESHOLD)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + "[rect]");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_COLOR_RECOGNTITION_TOOLTIP);
}
};
export const ai_sensor_color = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('VAR')
.appendField(Blockly.Msg.HTML_COLOUR + Blockly.Msg.MIXPY_OBJECT)
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_COLOR_ANALYSIS);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET)
.appendField(new Blockly.FieldDropdown([
['RGB' + Blockly.Msg.HTML_COLOUR, "[0]"],
['LAB' + Blockly.Msg.MIXLY_COLOR_LAB, "[1]"]
]), "key");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_COLOR_TOOLTIP);
}
};
export const ai_sensor_find_colors = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('SUB')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_COLOR_RECOGNTITION);
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + "color");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_COLOR_RECOGNTITION_TOOLTIP);
}
};
export const ai_sensor_color_chases_result = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('VAR')
.appendField(Blockly.Msg.MIXLY_COLOR_CHASE + Blockly.Msg.MIXPY_OBJECT)
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_COLOR_CHASE_ANALYSIS);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_CIRCLE_AREA, "info1"],
[Blockly.Msg.MIXLY_POSITION_XY + "-xywh", "rect"],
["x" + Blockly.Msg.MIXLY_POSITION_XY, "rect[0]"],
["y" + Blockly.Msg.MIXLY_POSITION_XY, "rect[1]"],
["w" + Blockly.Msg.MIXLY_POSITION_XY, "rect[2]"],
["h" + Blockly.Msg.MIXLY_POSITION_XY, "rect[3]"],
[Blockly.Msg.MICROPYTHON_HUSKYLENS_X_CENTERED + Blockly.Msg.MIXLY_POSITION_XY, "xc"],
[Blockly.Msg.MICROPYTHON_HUSKYLENS_Y_CENTERED + Blockly.Msg.MIXLY_POSITION_XY, "yc"]
]), "key");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_CIRCLE_TOOLTIP);
}
};
export const ai_sensor_color_chases = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('SUB')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_COLOR_CHASE);
this.appendValueInput("VAR1")
.appendField('LAB' + Blockly.Msg.MIXLY_COLOR_LAB)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("VAR2")
.appendField(Blockly.Msg.MIXLY_ESP32_THRESHOLD)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("VAR3")
.appendField(Blockly.Msg.MIXLY_COLOR_CHASE_MERGE)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + "[colors]");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_CIRCLE_RECOGNTITION_TOOLTIP);
}
};
export const ai_sensor_ailocal_train = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('SUB')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_LOCAL_TRAIN);
this.appendValueInput("VAR1")
.appendField(Blockly.Msg.MIXLY_OBJECT_LIST)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("VAR2")
.appendField(Blockly.Msg.MICROPYTHON_HUSKYLENS_SAVE_AS + Blockly.Msg.MIXLY_MODEL_NAME)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("VAR3")
.appendField(Blockly.Msg.MIXLY_TRAIN_TIME)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("VAR4")
.appendField(Blockly.Msg.MIXLY_AipNlp_Topic_Title)
.setAlign(Blockly.inputs.Align.RIGHT);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_LOCAL_TRAIN_TOOLTIP);
}
};
export const ai_sensor_ailocal_class = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('SUB')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_LOCAL_CLASS);
this.appendValueInput("VAR1")
.appendField(Blockly.Msg.MIXLY_OBJECT_LIST)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("VAR2")
.appendField(Blockly.Msg.MIXLY_MODEL_NAME)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("VAR4")
.appendField(Blockly.Msg.MIXLY_AipNlp_Topic_Title)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + "[objects]");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_MODEL_NAME_TOOLTIP);
}
};
export const ai_sensor_ailocal_class_result = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('VAR')
.appendField(Blockly.Msg.MIXLY_LOCAL_CLASS + Blockly.Msg.MIXPY_OBJECT)
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_COLOR_CHASE_ANALYSIS);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET)
.appendField(new Blockly.FieldDropdown([
['ID', "info1"],
[Blockly.Msg.MIXLY_CONFIDENCE_DEGREE, "info2"],
]), "key");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_LOCAL_CLASS_TOOLTIP);
}
};
export const ai_sensor_audio_record = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('SUB')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MUSIC_RECORD);
this.appendValueInput("VAR1")
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_THE_PATH)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("VAR2")
.appendField(Blockly.Msg.MIXPY_AI_AUDIO_TIME)
.setAlign(Blockly.inputs.Align.RIGHT);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_MUSIC_RECORD_TOOLTIP);
}
};
export const ai_sensor_audio_play = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('SUB')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MUSIC_PLAY);
this.appendValueInput("VAR1")
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_THE_PATH)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("VAR2")
.appendField(Blockly.Msg.MIXLY_MP3_VOL)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendDummyInput()
.appendField('%')
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
};
export const ai_sensor_yolo_recognize = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('SUB')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_YOLO_RECOGNIZE);
this.appendValueInput("VAR1")
.appendField(Blockly.Msg.MIXLY_ANCHOR)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("VAR2")
.appendField(Blockly.Msg.MIXLY_MODEL_PATH)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("VAR4")
.appendField(Blockly.Msg.MIXLY_AipNlp_Topic_Title)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + "[objects]");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_YOLO_RECOGNIZE_TOOLTIP);
}
};
export const ai_sensor_yolo_recognize_result = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('VAR')
.appendField(Blockly.Msg.MIXLY_YOLO_RECOGNIZE + Blockly.Msg.MIXPY_OBJECT)
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_COLOR_CHASE_ANALYSIS);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET)
.appendField(new Blockly.FieldDropdown([
['ID', "info1"],
[Blockly.Msg.MIXLY_CONFIDENCE_DEGREE, "info2"],
[Blockly.Msg.MIXLY_POSITION_XY + "-xywh", "rect"],
["x" + Blockly.Msg.MIXLY_POSITION_XY, "rect[0]"],
["y" + Blockly.Msg.MIXLY_POSITION_XY, "rect[1]"],
["w" + Blockly.Msg.MIXLY_POSITION_XY, "rect[2]"],
["h" + Blockly.Msg.MIXLY_POSITION_XY, "rect[3]"],
[Blockly.Msg.MICROPYTHON_HUSKYLENS_X_CENTERED + Blockly.Msg.MIXLY_POSITION_XY, "xc"],
[Blockly.Msg.MICROPYTHON_HUSKYLENS_Y_CENTERED + Blockly.Msg.MIXLY_POSITION_XY, "yc"]
]), "key");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_YOLO_RECOGNIZE_RESULT_TOOLTIP);
}
};
export const ai_sensor_asr_recognize = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('SUB')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_AipSpeech_asr);
this.appendValueInput("VAR1")
.appendField(Blockly.Msg.MIXLY_AI_SENSOR_ASR_RECOGNISE_CORPUS)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("VAR2")
.appendField(Blockly.Msg.MIXLY_ESP32_THRESHOLD)
.setAlign(Blockly.inputs.Align.RIGHT);
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_ASR_RECOGNISE_TOOLTIP);
}
};
export const ai_sensor_licenseplate = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('VAR')
.appendField(Blockly.Msg.MIXLY_LICENSEPLATE + Blockly.Msg.MIXPY_OBJECT)
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ALL_CODE_ANALYSIS);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET)
.appendField(new Blockly.FieldDropdown([
['ID', "info1"],
[Blockly.Msg.MIXLY_POSITION_XY + "-xywh", "rect"],
["x" + Blockly.Msg.MIXLY_POSITION_XY, "rect[0]"],
["y" + Blockly.Msg.MIXLY_POSITION_XY, "rect[1]"],
["w" + Blockly.Msg.MIXLY_POSITION_XY, "rect[2]"],
["h" + Blockly.Msg.MIXLY_POSITION_XY, "rect[3]"]
]), "key");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_LICENSEPLATE_TOOLTIP);
}
};
export const ai_sensor_find_licenseplates = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('SUB')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_AipOcr_licensePlate);
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + "[licensePlate]");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_LICENSEPLATE_RECOGNTITION_TOOLTIP);
}
};
export const ai_sensor_face = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('VAR')
.appendField(Blockly.Msg.MIXLY_FACE + Blockly.Msg.MIXPY_OBJECT)
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ALL_CODE_ANALYSIS);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET)
.appendField(new Blockly.FieldDropdown([
["ID", "info1"],
[Blockly.Msg.MIXLY_CONFIDENCE_DEGREE, "info2"],
[Blockly.Msg.MIXLY_POSITION_XY + "-xywh", "rect"],
["x" + Blockly.Msg.MIXLY_POSITION_XY, "rect[0]"],
["y" + Blockly.Msg.MIXLY_POSITION_XY, "rect[1]"],
["w" + Blockly.Msg.MIXLY_POSITION_XY, "rect[2]"],
["h" + Blockly.Msg.MIXLY_POSITION_XY, "rect[3]"]
]), "key");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_FACE_TOOLTIP);
}
};
export const ai_sensor_classifier_faces = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('SUB')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_AipFace);
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + "[face]");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_BAR_FACE_CLASSIFIER_TOOLTIP);
}
};
export const ai_sensor_20object = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('VAR')
.appendField(Blockly.Msg.MIXLY_20OBJECTS + Blockly.Msg.MIXPY_OBJECT)
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ALL_CODE_ANALYSIS);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET)
.appendField(new Blockly.FieldDropdown([
['ID', "info1"],
[Blockly.Msg.MIXLY_CONFIDENCE_DEGREE, "info2"],
[Blockly.Msg.MIXLY_POSITION_XY + "-xywh", "rect"],
["x" + Blockly.Msg.MIXLY_POSITION_XY, "rect[0]"],
["y" + Blockly.Msg.MIXLY_POSITION_XY, "rect[1]"],
["w" + Blockly.Msg.MIXLY_POSITION_XY, "rect[2]"],
["h" + Blockly.Msg.MIXLY_POSITION_XY, "rect[3]"]
]), "key");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_20OBJECTS_TOOLTIP);
}
};
export const ai_sensor_find_20objects = {
init: function () {
this.setColour(AI_SENSOR_HUE);
this.appendValueInput('SUB')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_FIND_20OBJECTS);
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + "[20objects]");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_AI_SENSOR_BAR_FIND_20OBJECTS_TOOLTIP);
}
};

View File

@@ -0,0 +1,368 @@
import * as Blockly from 'blockly/core';
/******************* Blynk *****************/
const BLYNK_HUE = '#2FAD7A';
// 自定义终端部件 Terminal Blynk
export const mpython_blynk_terminal_widget_vpin = {
init: function () {
this.jsonInit({
"inputsInline": true,
"nextStatement": null,
"previousStatement": null,
"colour": BLYNK_HUE,
"helpUrl": Blockly.Msg.MPYTHON_BLYNK_TERMINAL_WIDGET_VPIN_HELPURL,
"tooltip": Blockly.Msg.MPYTHON_BLYNK_TERMINAL_WIDGET_VPIN_TOOLTIP,
"message0": Blockly.Msg.MPYTHON_BLYNK_TERMINAL_WIDGET_VPIN_MESSAGE0,
"args0": [
{
"check": Number,
"type": "input_value",
"name": "virtual_pin"
}
]
});
}
};
// 同步虚拟管脚的状态 Blynk
export const mpython_blynk_sync_virtual = {
init: function () {
this.jsonInit({
"inputsInline": true,
"nextStatement": null,
"previousStatement": null,
"colour": BLYNK_HUE,
"helpUrl": Blockly.Msg.MPYTHON_BLYNK_SYNC_VIRTUAL_HELPURL,
"tooltip": Blockly.Msg.MPYTHON_BLYNK_SYNC_VIRTUAL_TOOLTIP,
"message0": Blockly.Msg.MPYTHON_BLYNK_SYNC_VIRTUAL_MESSAGE0,
"args0": [
{
"check": Number,
"type": "input_value",
"name": "virtual_pin"
}
]
});
}
};
// 斷開连接 Blynk
export const mpython_blynk_on_disconnected = {
init: function () {
this.jsonInit({
"inputsInline": true,
// "nextStatement": null,
// "previousStatement": null,
"colour": BLYNK_HUE,
"helpUrl": Blockly.Msg.MPYTHON_BLYNK_ON_DISCONNECTED_HELPURL,
"tooltip": Blockly.Msg.MPYTHON_BLYNK_ON_DISCONNECTED_TOOLTIP,
"message0": Blockly.Msg.MPYTHON_BLYNK_ON_DISCONNECTED_MESSAGE0
});
this.appendStatementInput('DO')
.appendField(Blockly.CONTROLS_REPEAT_INPUT_DO);
}
};
// 连接上 Blynk
export const mpython_blynk_on_connected = {
init: function () {
this.jsonInit({
"inputsInline": true,
// "nextStatement": null,
// "previousStatement": null,
"colour": BLYNK_HUE,
"helpUrl": Blockly.Msg.MPYTHON_BLYNK_ON_CONNECTED_HELPURL,
"tooltip": Blockly.Msg.MPYTHON_BLYNK_ON_CONNECTED_TOOLTIP,
"message0": Blockly.Msg.MPYTHON_BLYNK_ON_CONNECTED_MESSAGE0
});
this.appendStatementInput('DO')
.appendField(Blockly.CONTROLS_REPEAT_INPUT_DO);
}
};
// Blynk 定时器的进程生效并运行
export const mpython_blynktimer_run = {
init: function () {
this.jsonInit({
"inputsInline": true,
"nextStatement": null,
"previousStatement": null,
"colour": BLYNK_HUE,
"helpUrl": Blockly.Msg.MPYTHON_BLYNKTIMER_RUN_HELPURL,
"tooltip": Blockly.Msg.MPYTHON_BLYNKTIMER_RUN_TOOLTIP,
"message0": Blockly.Msg.MPYTHON_BLYNKTIMER_RUN_MESSAGE0
});
}
};
// Blynk 进程生效并运行
export const mpython_blynk_run = {
init: function () {
this.jsonInit({
"inputsInline": true,
"nextStatement": null,
"previousStatement": null,
"colour": BLYNK_HUE,
"helpUrl": Blockly.Msg.MPYTHON_BLYNK_RUN_HELPURL,
"tooltip": Blockly.Msg.MPYTHON_BLYNK_RUN_TOOLTIP,
"message0": Blockly.Msg.MPYTHON_BLYNK_RUN_MESSAGE0
});
}
};
// Blynk APP 显示通知
export const mpython_blynk_app_notify = {
init: function () {
this.jsonInit({
"inputsInline": true,
"nextStatement": null,
"previousStatement": null,
"colour": BLYNK_HUE,
"helpUrl": Blockly.Msg.MPYTHON_BLYNK_APP_NOTIFY_HELPURL,
"tooltip": Blockly.Msg.MPYTHON_BLYNK_APP_NOTIFY_TOOLTIP,
"message0": Blockly.Msg.MPYTHON_BLYNK_APP_NOTIFY_MESSAGE0,
"args0": [
{
"check": String,
"type": "input_value",
"name": "notification"
}
]
});
}
};
// 停止 Blynk 定时器 %1
export const mpython_blynk_stop_timers = {
init: function () {
this.jsonInit({
"inputsInline": true,
"nextStatement": null,
"previousStatement": null,
// "output": null,
"colour": BLYNK_HUE,
"helpUrl": Blockly.Msg.MPYTHON_BLYNK_STOP_TIMERS_HELPURL,
"tooltip": Blockly.Msg.MPYTHON_BLYNKTIMER_TOOLTIP,
"message0": Blockly.Msg.MPYTHON_BLYNK_STOP_TIMERS_MESSAGE0,
"args0": [
{
"check": Number,
"type": "input_value",
"name": "timer_num"
}
]
});
}
};
// 给虚拟管脚添加 属性 %1 值 %2
export const mpython_blynk_set_property = {
init: function () {
this.jsonInit({
"inputsInline": true,
"nextStatement": null,
"previousStatement": null,
// "output": null,
"colour": BLYNK_HUE,
"helpUrl": Blockly.Msg.MPYTHON_BLYNK_SET_PROPERTY_HELPURL,
"tooltip": Blockly.Msg.MPYTHON_BLYNK_SET_PROPERTY_TOOLTIP,
"message0": Blockly.Msg.MPYTHON_BLYNK_SET_PROPERTY_MESSAGE0,
"args0": [
{
"check": String,
"type": "input_value",
"name": "attribute_name"
}
,
{
// "check":String,
"type": "input_value",
"name": "attribute_value"
}
]
});
}
};
// 向 %1 发邮件 主题 %2 正文 %3
export const mpython_blynk_email = {
init: function () {
this.jsonInit({
"inputsInline": true,
"nextStatement": null,
"previousStatement": null,
// "output": null,
"colour": BLYNK_HUE,
"helpUrl": Blockly.Msg.MPYTHON_BLYNK_EMAIL_HELPURL,
"tooltip": Blockly.Msg.MPYTHON_BLYNK_EMAIL_TOOLTIP,
"message0": Blockly.Msg.MPYTHON_BLYNK_EMAIL_MESSAGE0,
"args0": [
{
"check": String,
"type": "input_value",
"name": "TargetEmail"
}
,
{
"check": String,
"type": "input_value",
"name": "subject"
}
,
{
"check": String,
"type": "input_value",
"name": "body"
}
]
});
}
};
// 可用的 Blynk 定时器
export const mpython_blynk_get_timers = {
init: function () {
this.jsonInit({
"inputsInline": true,
// "nextStatement": null,
// "previousStatement": null,
"output": null,
"colour": BLYNK_HUE,
"helpUrl": Blockly.Msg.MPYTHON_BLYNK_GET_TIMERS_HELPURL,
"tooltip": Blockly.Msg.MPYTHON_BLYNK_GET_TIMERS_TOOLTIP,
"message0": Blockly.Msg.MPYTHON_BLYNK_GET_TIMERS_MESSAGE0,
});
}
};
//blynk定时器
export const mpython_blynktimer = {
init: function () {
this.jsonInit({
"message0": Blockly.Msg.MPYTHON_BLYNKTIMER_MESSAGE0,
// "nextStatement": null,
// "previousStatement": null,
"colour": BLYNK_HUE,
"helpUrl": Blockly.Msg.MPYTHON_BLYNKTIMER_HELPURL,
"tooltip": Blockly.Msg.MPYTHON_BLYNKTIMER_TOOLTIP,
"args0": [
{
"check": Number,
"type": "input_value",
"name": "Num"
}
,
{
"options": [
[Blockly.Msg.MIXLY_PYTHON_PERIODIC, 'False'],
[Blockly.Msg.MIXLY_PYTHON_ONE_SHOT, 'True']
],
"type": "field_dropdown",
"name": "Timer_mode"
}
,
{
"check": Number,
"type": "input_value",
"name": "period"
}
]
});
this.appendStatementInput('DO')
.appendField(Blockly.CONTROLS_REPEAT_INPUT_DO);
}
};
// 发送数据 %1 到 Bylnk APP 的虚拟管脚 %2
export const mpython_blynk_sensor_data_to_app = {
init: function () {
this.jsonInit({
"inputsInline": true,
"nextStatement": null,
"previousStatement": null,
"colour": BLYNK_HUE,
"helpUrl": Blockly.Msg.MPYTHON_BLYNK_SENSOR_DATA_TO_APP_HELPURL,
"tooltip": Blockly.Msg.MPYTHON_BLYNK_SENSOR_DATA_TO_APP_TOOLTIP,
"message0": Blockly.Msg.MPYTHON_BLYNK_SENSOR_DATA_TO_APP_MESSAGE0,
"args0": [
{
"type": "input_value",
"name": "sensor_data"
}
,
{
"check": Number,
"type": "input_value",
"name": "virtual_pin"
}
]
});
}
};
// 从 Bylnk APP 获取虚拟管脚 %1 的值
export const mpython_blynk_app_data = {
init: function () {
this.jsonInit({
"inputsInline": true,
// "nextStatement": null,
// "previousStatement": null,
// "output":null,
"colour": BLYNK_HUE,
"helpUrl": Blockly.Msg.MPYTHON_BLYNK_APP_DATA_HELPURL,
"tooltip": Blockly.Msg.MPYTHON_BLYNK_SENSOR_DATA_TO_APP_TOOLTIP,
"message0": Blockly.Msg.MPYTHON_BLYNK_APP_DATA_MESSAGE0,
"args0": [
{
"check": Number,
"type": "input_value",
"name": "virtual_pin"
}
,
{
"type": "input_value",
"name": "virtual_pin_val"
}
]
});
this.appendStatementInput('DO')
.appendField(Blockly.CONTROLS_REPEAT_INPUT_DO);
}
};
// Bylnk设置
export const mpython_blynk_setup = {
init: function () {
this.jsonInit({
// "inputsInline": true,
"nextStatement": null,
"previousStatement": null,
"colour": BLYNK_HUE,
"helpUrl": Blockly.Msg.MPYTHON_BLYNK_SETUP_HELPURL,
"tooltip": Blockly.Msg.MPYTHON_BLYNK_SETUP_TOOLTIP,
"message0": Blockly.Msg.MPYTHON_BLYNK_SETUP_MESSAGE0,
"args0": [
{
"type": "input_dummy"
},
{
"check": String,
"type": "input_value",
"name": "server"
},
{
"check": Number,
"type": "input_value",
"name": "port"
},
{
"check": String,
"type": "input_value",
"name": "auth"
}
]
});
}
};

View File

@@ -0,0 +1,81 @@
import * as Blockly from 'blockly/core';
const CCG1_HUE = 40;
export const cc_g1_init = {
init: function () {
this.setColour(CCG1_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_SETUP + " CC_G1");
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('key');
var TOOLTIPS = {
"temperature": Blockly.Msg.MIXLY_MICROBIT_SENSOR_SHT_temperature_TOOLTIP,
"relative_humidity": Blockly.Msg.MIXLY_MICROBIT_SENSOR_SHT_HUM_TOOLTIP
};
return TOOLTIPS[mode]
});
}
};
export const cc_g1_read_bat = {
init: function () {
this.setColour(CCG1_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_GET_BATTERY);
this.setOutput(true, Number);
this.setInputsInline(true);
}
};
export const cc_g1_read_joystick = {
init: function () {
this.setColour(CCG1_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET_JOYSTICK)
.appendField(new Blockly.FieldDropdown([
["x", "[0]"],
["y", "[1]"],
["(x,y)", ""]
]), "VAR");
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_DATA);
this.setOutput(true, Number);
this.setInputsInline(true);
}
};
export const cc_g1_read_key = {
init: function () {
this.setColour(CCG1_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_BUTTON)
.appendField(new Blockly.FieldDropdown([
["A", "0"],
["B", "1"],
["C", "2"],
["D", "3"],
["POWER", "4"],
["SELECT", "5"]
]), "VAR");
this.appendDummyInput("")
.appendField(Blockly.Msg.WHETHER_IS_PRESSED);
this.setOutput(true, Number);
this.setInputsInline(true);
}
};
export const cc_g1_turnoff = {
init: function () {
this.setColour(CCG1_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_HANDLE_SHUTDOWN);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
};

View File

@@ -0,0 +1,318 @@
import * as Blockly from 'blockly/core';
const MEGO_HUE = 100;
//LED
export const ce_go_light_number = {
init: function () {
this.setColour(MEGO_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXGO_LEFT_FRONT + Blockly.Msg.COLOUR_RGB_GREEN + Blockly.Msg.MIXLY_EXTERN_LED, "GLED[0]"],
[Blockly.Msg.MIXGO_RIGHT_FRONT + Blockly.Msg.COLOUR_RGB_GREEN + Blockly.Msg.MIXLY_EXTERN_LED, "GLED[1]"],
[Blockly.Msg.MIXGO_LEFT_BACK + Blockly.Msg.COLOUR_RGB_GREEN + Blockly.Msg.MIXLY_EXTERN_LED, "GLED[3]"],
[Blockly.Msg.MIXGO_RIGHT_BACK + Blockly.Msg.COLOUR_RGB_GREEN + Blockly.Msg.MIXLY_EXTERN_LED, "GLED[2]"],
[Blockly.Msg.MIXGO_LEFT_FRONT + Blockly.Msg.COLOUR_RGB_RED + Blockly.Msg.MIXLY_EXTERN_LED, "RLED[0]"],
[Blockly.Msg.MIXGO_RIGHT_FRONT + Blockly.Msg.COLOUR_RGB_RED + Blockly.Msg.MIXLY_EXTERN_LED, "RLED[1]"],
[Blockly.Msg.MIXGO_LEFT_BACK + Blockly.Msg.COLOUR_RGB_RED + Blockly.Msg.MIXLY_EXTERN_LED, "RLED[3]"],
[Blockly.Msg.MIXGO_RIGHT_BACK + Blockly.Msg.COLOUR_RGB_RED + Blockly.Msg.MIXLY_EXTERN_LED, "RLED[2]"],
[Blockly.Msg.ME_GO_LIGHT_HEADLIGHT, "WLED"]
]), 'op')
this.setOutput(true);
}
};
export const ce_go_led_bright = {
init: function () {
this.setColour(MEGO_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SETTING);
this.appendValueInput('led')
.appendField('ME GO')
this.appendValueInput('bright')
.appendField(Blockly.Msg.MIXLY_PULSEIN_STAT)
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_LED_SETONOFF);
}
};
export const ce_go_get_led_bright = {
init: function () {
this.setColour(MEGO_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET);
this.appendValueInput('led')
.appendField('ME GO')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_BRIGHTNESS)
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_LED_GETONOFF);
}
};
export const ce_go_get_led_state = {
init: function () {
this.setColour(MEGO_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET);
this.appendValueInput('led')
.appendField('ME GO')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_PULSEIN_STAT)
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_LED_GETONOFF);
}
};
export const ce_go_led_brightness = {
init: function () {
this.setColour(MEGO_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SETTING);
this.appendValueInput('led')
.appendField('ME GO')
this.appendValueInput('bright')
.appendField(Blockly.Msg.MIXLY_BRIGHTNESS)
this.appendDummyInput("")
.appendField("%")
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_SETTING + Blockly.Msg.MIXLY_BUILDIN_LED + Blockly.Msg.MIXLY_BRIGHTNESS + '(0-10)');
}
};
export const ce_go_stepper_keep = {
init: function () {
this.setColour(MEGO_HUE);
this.appendDummyInput()
.appendField("ME GO")
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.blockpy_forward, "F"],
[Blockly.Msg.blockpy_backward, "B"],
[Blockly.Msg.blockpy_left, "L"],
[Blockly.Msg.blockpy_right, "R"]
]), "VAR");
this.appendValueInput('speed')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_STEPPER_SET_SPEED);
this.appendDummyInput("")
.appendField("%")
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
}
export const ce_go_stepper_stop = {
init: function () {
this.setColour(MEGO_HUE);
this.appendDummyInput()
.appendField("ME GO")
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MOTOR_P, "P"],
[Blockly.Msg.MOTOR_N, "N"]
]), "VAR");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
}
export const ce_go_dc_motor = {
init: function () {
this.setColour(MEGO_HUE);
this.appendDummyInput()
.appendField("ME GO")
.appendField(Blockly.Msg.MOTOR_DC)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLYCAR_WHEEL_LEFT, "0"],
[Blockly.Msg.MIXLYCAR_WHEEL_RIGHT, "1"],
[Blockly.Msg.ME_GO_MOTOR_EXTERN, "2"]
]), "wheel");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_Direction)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.ROTATION_FORWARD, "CW"],
[Blockly.Msg.ROTATION_BACKWARD, "CCW"],
[Blockly.Msg.MOTOR_P, "P"],
[Blockly.Msg.MOTOR_N, "N"]
]), "direction");
this.appendValueInput('speed')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_STEPPER_SET_SPEED);
this.appendDummyInput("")
.appendField("%")
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
}
export const ce_go_hall_attachInterrupt = {
init: function () {
this.setColour(MEGO_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_ESP32_INTERRUPT)
.appendField(Blockly.Msg.ME_GO_HALL_SENSOR)
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.TEXT_TRIM_LEFT, "A"], [Blockly.Msg.TEXT_TRIM_RIGHT, "B"]]), "mode");
this.appendValueInput('DO')
.appendField(Blockly.Msg.MIXLY_DO)
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
}
};
export const ce_go_hall_initialize = {
init: function () {
this.setColour(MEGO_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.ME_GO_HALL_SENSOR)
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.TEXT_TRIM_LEFT, "A"], [Blockly.Msg.TEXT_TRIM_RIGHT, "B"]]), "mode");
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_SETUP)
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([['turns', "turns"], ['distance', "distance"], ['turns,distance', 'all']]), "args");
this.appendValueInput('num')
.setCheck(Number)
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
}
};
export const ce_go_hall_data = {
init: function () {
this.setColour(MEGO_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.ME_GO_HALL_SENSOR)
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.TEXT_TRIM_LEFT, "A"], [Blockly.Msg.TEXT_TRIM_RIGHT, "B"]]), "mode");
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET)
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([['turns', "turns"], ['distance', "distance"], ['speed', 'speed']]), "args");
this.setOutput(true);
this.setInputsInline(true);
}
};
export const ce_go_pin_near_line = {
init: function () {
this.setColour(MEGO_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.TEXT_TRIM_LEFT, "[0]"],
[Blockly.Msg.MIXGO_LEFT_MID, "[1]"],
[Blockly.Msg.MIXGO_RIGHT_MID, "[2]"],
[Blockly.Msg.TEXT_TRIM_RIGHT, "[3]"],
[Blockly.Msg.MIXLY_ALL, ""]
]), "key")
.appendField(Blockly.Msg.MIXGO_LINE_SENSOR_VAL);
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(function () {
var mode0 = Blockly.Msg.MIXLY_ESP32_SENSOR_MIXGO_PIN_NEAR_TOOLTIP;
var mode1 = Blockly.Msg.MIXLY_ESP32_NEAR;
return mode0 + mode1
});
}
};
export const ce_go_pin_near = {
init: function () {
this.setColour(MEGO_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXGO_LEFT_FRONT, "[0]"],
[Blockly.Msg.MIXGO_RIGHT_FRONT, "[1]"],
[Blockly.Msg.MIXGO_LEFT_BACK, "[3]"],
[Blockly.Msg.MIXGO_RIGHT_BACK, "[2]"],
[Blockly.Msg.MIXLY_ALL, ""]
]), "key")
.appendField(Blockly.Msg.MIXGO_PROXIMITY_SENSOR);
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(function () {
var mode0 = Blockly.Msg.MIXLY_ESP32_SENSOR_MIXGO_PIN_NEAR_TOOLTIP;
var mode1 = Blockly.Msg.MIXLY_ESP32_NEAR;
return mode0 + mode1
});
}
};
export const ce_go_pin_near_state_change = {
init: function () {
this.setColour(MEGO_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MIXGO_CAR_SENSOR_ONBOARD_CHANGE)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_ME_GO_CAR_SENSOR_ONBOARD_AUTO_CHANGE, "AS"],
[Blockly.Msg.MIXLY_MIXGO_CAR_USE_LINE_ONLY, "LP"],
[Blockly.Msg.MIXLY_MIXGO_CAR_USE_PROXIMITY_ONLY, "OA"],
[Blockly.Msg.MIXLY_ME_GO_CAR_LIGHT_SEEKING_ONLY, "LS"],
[Blockly.Msg.ME_GO_SENSOR_MODE_OFF, "CL"]
]), "key");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
};
export const sensor_mixgome_eulerangles = {
init: function () {
this.setColour(MEGO_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_GET_GESTURE)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.ME_GO_PITCH, '[0]'],
[Blockly.Msg.ME_GO_ROLL, '[1]'],
[Blockly.Msg.ME_GO_PITCH + ', ' + Blockly.Msg.ME_GO_ROLL, '']
]), 'angle');
// this.appendDummyInput("")
// .appendField(Blockly.Msg.BOARD_DIRECTION)
// .appendField(new Blockly.FieldDropdown([
// [Blockly.Msg.OLED_VER,'True'],
// [Blockly.Msg.OLED_HOR,'False'],
// ]),'dir');
this.appendDummyInput("")
this.setOutput(true, Number);
this.setInputsInline(true);
}
};
export const ce_go_pin_light = {
init: function () {
this.setColour(MEGO_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.TEXT_TRIM_LEFT, "[0]"],
[Blockly.Msg.MIXGO_LEFT_MID, "[1]"],
[Blockly.Msg.MIXGO_RIGHT_MID, "[2]"],
[Blockly.Msg.TEXT_TRIM_RIGHT, "[3]"],
[Blockly.Msg.MIXLY_ALL, ""]
]), "key")
.appendField(Blockly.Msg.MIXLY_ME_GO_CAR_LIGHT_SEEKING_SENSOR);
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(function () {
var mode0 = Blockly.Msg.MIXLY_ESP32_SENSOR_MIXGO_PIN_NEAR_TOOLTIP;
var mode1 = Blockly.Msg.MIXLY_ME_GO_CAR_LIGHT_SEEKING_SENSOR;
return mode0 + mode1
});
}
};

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,621 @@
import * as Blockly from 'blockly/core';
const LOOPS_HUE = 120//'#EB8045';
export const base_setup = {
init: function () {
this.setColour(LOOPS_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SETUP);
this.appendStatementInput('DO')
.appendField('');
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_SETUP);
}
};
export const controls_delay = {
init: function () {
this.setColour(LOOPS_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_DELAY)
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_SECOND, "s"], [Blockly.Msg.MIXLY_mSecond, "ms"], [Blockly.Msg.MIXLY_uSecond, "us"]]), 'Time');
this.appendValueInput("DELAY_TIME", Number)
.setCheck(Number);
this.setFieldValue('ms', 'Time')
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_DELAY);
}
};
export const Panic_with_status_code = {
init: function () {
this.setColour(LOOPS_HUE);
this.appendValueInput("STATUS_CODE", Number)
.appendField(Blockly.Msg.MIXLY_MICROBIT_Panic_with_status_code)
.setCheck(Number);
this.setPreviousStatement(true, null);
// this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Panic_with_status_code);
}
};
export const reset = {
init: function () {
this.setColour(LOOPS_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_Reset_micro);
this.setPreviousStatement(true);
// this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Reset_micro);
}
};
export const controls_for = {
init: function () {
this.setColour(LOOPS_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.LANG_CONTROLS_FOR_INPUT_WITH)
.appendField(new Blockly.FieldTextInput('i'), 'VAR');
this.appendValueInput('FROM')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.LANG_CONTROLS_FOR_INPUT_FROM);
this.appendValueInput('TO')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.LANG_CONTROLS_FOR_INPUT_TO);
this.appendValueInput('STEP')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_STEP);
this.appendStatementInput('DO')
.appendField(Blockly.Msg.MIXLY_DO);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
var thisBlock = this;
this.setTooltip(function () {
return Blockly.Msg.CONTROLS_FOR_TOOLTIP.replace('%1',
thisBlock.getFieldValue('VAR'));
});
},
getVars: function () {
return [this.getFieldValue('VAR')];
},
renameVar: function (oldName, newName) {
if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {
this.setTitleValue(newName, 'VAR');
}
}
};
export const controls_whileUntil = {
init: function () {
this.setColour(LOOPS_HUE);
this.appendValueInput('BOOL')
.setCheck([Boolean, Number])
.appendField(Blockly.Msg.LANG_CONTROLS_WHILEUNTIL_TITLE_REPEAT)
.appendField(new Blockly.FieldDropdown(this.OPERATORS), 'MODE');
this.appendStatementInput('DO')
.appendField(Blockly.Msg.MIXLY_DO);
this.setPreviousStatement(true);
this.setNextStatement(true);
var thisBlock = this;
this.setTooltip(function () {
var op = thisBlock.getFieldValue('MODE');
var TOOLTIPS = {
'WHILE': Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE,
'UNTIL': Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL
};
return TOOLTIPS[op];
});
}
};
controls_whileUntil.OPERATORS = [
[Blockly.Msg.LANG_CONTROLS_WHILEUNTIL_OPERATOR_WHILE, 'WHILE'],
[Blockly.Msg.LANG_CONTROLS_WHILEUNTIL_OPERATOR_UNTIL, 'UNTIL']
];
export const controls_flow_statements = {
init: function () {
this.setColour(LOOPS_HUE);
var dropdown = new Blockly.FieldDropdown(this.OPERATORS);
this.appendDummyInput()
.appendField(dropdown, 'FLOW')
.appendField(Blockly.Msg.LANG_CONTROLS_FLOW_STATEMENTS_INPUT_OFLOOP);
this.setPreviousStatement(true);
var thisBlock = this;
this.setTooltip(function () {
var op = thisBlock.getFieldValue('FLOW');
var TOOLTIPS = {
'BREAK': Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK,
'CONTINUE': Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE
};
return TOOLTIPS[op];
});
},
onchange: function () {
if (!this.workspace) {
// Block has been deleted.
return;
}
var legal = false;
// Is the block nested in a control statement?
var block = this;
do {
if (block.type == 'controls_repeat' ||
block.type == 'controls_for' ||
block.type == 'controls_forEach' ||
block.type == 'controls_repeat_ext' ||
block.type == 'controls_whileUntil') {
legal = true;
break;
}
block = block.getSurroundParent();
} while (block);
if (legal) {
this.setWarningText(null);
} else {
this.setWarningText(Blockly.Msg.LANG_CONTROLS_FLOW_STATEMENTS_WARNING);
}
}
};
controls_flow_statements.OPERATORS = [
[Blockly.Msg.LANG_CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK, 'BREAK'],
[Blockly.Msg.LANG_CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE, 'CONTINUE']
];
export const controls_millis = {
init: function () {
this.setColour(LOOPS_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_RUNTIME);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_mSecond, "ms"], [Blockly.Msg.MIXLY_uSecond, "us"]]), 'Time');
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_RUNTIME);
}
};
export const controls_if = {
/**
* Block for if/elseif/else condition.
* @this Blockly.Block
*/
init: function () {
//this.setHelpUrl(Blockly.Msg.CONTROLS_IF_HELPURL);
this.setColour(LOOPS_HUE);
this.appendValueInput('IF0')
.setCheck([Boolean, Number])
.appendField(Blockly.Msg.CONTROLS_IF_MSG_IF);
this.appendStatementInput('DO0')
.appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setHelpUrl("https://mixly.readthedocs.io/zh_CN/latest/arduino/03.Control.html#if");
this.setMutator(new Blockly.icons.MutatorIcon(['controls_if_elseif',
'controls_if_else'], this));
// Assign 'this' to a variable for use in the tooltip closure below.
var thisBlock = this;
this.setTooltip(function () {
if (!thisBlock.elseifCount_ && !thisBlock.elseCount_) {
return Blockly.Msg.CONTROLS_IF_TOOLTIP_1;
} else if (!thisBlock.elseifCount_ && thisBlock.elseCount_) {
return Blockly.Msg.CONTROLS_IF_TOOLTIP_2;
} else if (thisBlock.elseifCount_ && !thisBlock.elseCount_) {
return Blockly.Msg.CONTROLS_IF_TOOLTIP_3;
} else if (thisBlock.elseifCount_ && thisBlock.elseCount_) {
return Blockly.Msg.CONTROLS_IF_TOOLTIP_4;
}
return '';
});
this.elseifCount_ = 0;
this.elseCount_ = 0;
},
/**
* Create XML to represent the number of else-if and else inputs.
* @return {Element} XML storage element.
* @this Blockly.Block
*/
mutationToDom: function () {
if (!this.elseifCount_ && !this.elseCount_) {
return null;
}
var container = document.createElement('mutation');
if (this.elseifCount_) {
container.setAttribute('elseif', this.elseifCount_);
}
if (this.elseCount_) {
container.setAttribute('else', 1);
}
return container;
},
/**
* Parse XML to restore the else-if and else inputs.
* @param {!Element} xmlElement XML storage element.
* @this Blockly.Block
*/
domToMutation: function (xmlElement) {
var containerBlock = this;
var valueConnections = [];
var statementConnections = [];
// var elseStatementConnection = null;
if (this.elseCount_) {
// if (containerBlock.getInputTargetBlock('ELSE') && containerBlock.getInputTargetBlock('ELSE').previousConnection)
// elseStatementConnection = containerBlock.getInputTargetBlock('ELSE').previousConnection;
this.removeInput('ELSE');
}
for (var i = this.elseifCount_; i > 0; i--) {
if (containerBlock.getInputTargetBlock('IF' + i) && containerBlock.getInputTargetBlock('IF' + i).previousConnection)
valueConnections[i] = (containerBlock.getInputTargetBlock('IF' + i).previousConnection);
else
valueConnections[i] = null;
this.removeInput('IF' + i);
if (containerBlock.getInputTargetBlock('DO' + i) && containerBlock.getInputTargetBlock('DO' + i).previousConnection)
statementConnections[i] = (containerBlock.getInputTargetBlock('DO' + i).previousConnection);
else
statementConnections[i] = null;
this.removeInput('DO' + i);
}
this.elseifCount_ = parseInt(xmlElement.getAttribute('elseif'), 10);
this.elseCount_ = parseInt(xmlElement.getAttribute('else'), 10);
//this.compose(containerBlock);
for (var i = 1; i <= this.elseifCount_; i++) {
this.appendValueInput('IF' + i)
.setCheck([Boolean, Number])
.appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSEIF);
this.appendStatementInput('DO' + i)
.appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN);
}
if (this.elseCount_) {
this.appendStatementInput('ELSE')
.appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSE);
}
for (var i = valueConnections.length - 2; i > 0; i--) {
if (valueConnections[i])
valueConnections[i].reconnect(this, 'IF' + i);
}
for (var i = statementConnections.length - 2; i > 0; i--) {
if (statementConnections[i])
statementConnections[i].reconnect(this, 'DO' + i);
}
},
/**
* Populate the mutator's dialog with this block's components.
* @param {!Blockly.Workspace} workspace Mutator's workspace.
* @return {!Blockly.Block} Root block in mutator.
* @this Blockly.Block
*/
decompose: function (workspace) {
var containerBlock = workspace.newBlock('controls_if_if');
containerBlock.initSvg();
var connection = containerBlock.getInput('STACK').connection;
for (var i = 1; i <= this.elseifCount_; i++) {
var elseifBlock = workspace.newBlock('controls_if_elseif');
elseifBlock.initSvg();
connection.connect(elseifBlock.previousConnection);
connection = elseifBlock.nextConnection;
}
if (this.elseCount_) {
var elseBlock = workspace.newBlock('controls_if_else');
elseBlock.initSvg();
connection.connect(elseBlock.previousConnection);
}
return containerBlock;
},
/**
* Reconfigure this block based on the mutator dialog's components.
* @param {!Blockly.Block} containerBlock Root block in mutator.
* @this Blockly.Block
*/
compose: function (containerBlock) {
// Disconnect the else input blocks and remove the inputs.
if (this.elseCount_) {
this.removeInput('ELSE');
}
this.elseCount_ = 0;
// Disconnect all the elseif input blocks and remove the inputs.
for (var i = this.elseifCount_; i > 0; i--) {
this.removeInput('IF' + i);
this.removeInput('DO' + i);
}
this.elseifCount_ = 0;
// Rebuild the block's optional inputs.
var clauseBlock = containerBlock.getInputTargetBlock('STACK');
var valueConnections = [null];
var statementConnections = [null];
var elseStatementConnection = null;
while (clauseBlock) {
switch (clauseBlock.type) {
case 'controls_if_elseif':
this.elseifCount_++;
valueConnections.push(clauseBlock.valueConnection_);
statementConnections.push(clauseBlock.statementConnection_);
break;
case 'controls_if_else':
this.elseCount_++;
elseStatementConnection = clauseBlock.statementConnection_;
break;
default:
throw Error('Unknown block type: ' + clauseBlock.type);
}
clauseBlock = clauseBlock.nextConnection &&
clauseBlock.nextConnection.targetBlock();
}
this.updateShape_();
// Reconnect any child blocks.
this.reconnectChildBlocks_(valueConnections, statementConnections, elseStatementConnection);
},
/**
* Store pointers to any connected child blocks.
* @param {!Blockly.Block} containerBlock Root block in mutator.
* @this Blockly.Block
*/
saveConnections: function (containerBlock) {
var clauseBlock = containerBlock.getInputTargetBlock('STACK');
var i = 1;
while (clauseBlock) {
switch (clauseBlock.type) {
case 'controls_if_elseif':
var inputIf = this.getInput('IF' + i);
var inputDo = this.getInput('DO' + i);
clauseBlock.valueConnection_ =
inputIf && inputIf.connection.targetConnection;
clauseBlock.statementConnection_ =
inputDo && inputDo.connection.targetConnection;
i++;
break;
case 'controls_if_else':
var inputDo = this.getInput('ELSE');
clauseBlock.statementConnection_ =
inputDo && inputDo.connection.targetConnection;
break;
default:
throw 'Unknown block type.';
}
clauseBlock = clauseBlock.nextConnection &&
clauseBlock.nextConnection.targetBlock();
}
},
/**
* Reconstructs the block with all child blocks attached.
*/
rebuildShape_: function () {
var valueConnections = [null];
var statementConnections = [null];
var elseStatementConnection = null;
if (this.getInput('ELSE')) {
elseStatementConnection = this.getInput('ELSE').connection.targetConnection;
}
var i = 1;
while (this.getInput('IF' + i)) {
var inputIf = this.getInput('IF' + i);
var inputDo = this.getInput('DO' + i);
console.log(inputIf.connection.targetConnection);
valueConnections.push(inputIf.connection.targetConnection);
statementConnections.push(inputDo.connection.targetConnection);
i++;
}
this.updateShape_();
this.reconnectChildBlocks_(valueConnections, statementConnections, elseStatementConnection);
},
/**
* Modify this block to have the correct number of inputs.
* @this Blockly.Block
* @private
*/
updateShape_: function () {
// Delete everything.
if (this.getInput('ELSE')) {
this.removeInput('ELSE');
}
var i = 1;
while (this.getInput('IF' + i)) {
this.removeInput('IF' + i);
this.removeInput('DO' + i);
i++;
}
// Rebuild block.
for (var i = 1; i <= this.elseifCount_; i++) {
this.appendValueInput('IF' + i)
.setCheck([Number, Boolean])
.appendField(Blockly.Msg['CONTROLS_IF_MSG_ELSEIF']);
this.appendStatementInput('DO' + i)
.appendField(Blockly.Msg['CONTROLS_IF_MSG_THEN']);
}
if (this.elseCount_) {
this.appendStatementInput('ELSE')
.appendField(Blockly.Msg['CONTROLS_IF_MSG_ELSE']);
}
},
/**
* Reconnects child blocks.
* @param {!Array<?Blockly.RenderedConnection>} valueConnections List of value
* connectsions for if input.
* @param {!Array<?Blockly.RenderedConnection>} statementConnections List of
* statement connections for do input.
* @param {?Blockly.RenderedConnection} elseStatementConnection Statement
* connection for else input.
*/
reconnectChildBlocks_: function (valueConnections, statementConnections,
elseStatementConnection) {
for (var i = 1; i <= this.elseifCount_; i++) {
valueConnections[i] && Blockly.Mutator.reconnect(this, 'IF' + i);
statementConnections[i] && statementConnections[i].reconnect(this, 'DO' + i);
}
elseStatementConnection && elseStatementConnection.reconnect(this, 'ELSE');
}
};
export const controls_if_if = {
/**
* Mutator block for if container.
* @this Blockly.Block
*/
init: function () {
this.setColour(LOOPS_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.CONTROLS_IF_IF_TITLE_IF);
this.appendStatementInput('STACK');
this.setTooltip(Blockly.Msg.CONTROLS_IF_IF_TOOLTIP);
this.contextMenu = false;
}
};
export const controls_if_elseif = {
/**
* Mutator bolck for else-if condition.
* @this Blockly.Block
*/
init: function () {
this.setColour(LOOPS_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP);
this.contextMenu = false;
}
};
export const controls_if_else = {
/**
* Mutator block for else condition.
* @this Blockly.Block
*/
init: function () {
this.setColour(LOOPS_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE);
this.setPreviousStatement(true);
this.setTooltip(Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP);
this.contextMenu = false;
}
};
export const controls_end_program = {
init: function () {
this.setColour(LOOPS_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_CONTROL_END_PROGRAM);
this.setPreviousStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_CONTROL_END_PROGRAM);
}
};
export const controls_forEach = {
init: function () {
this.setColour(LOOPS_HUE);
this.appendValueInput('LIST')
.setCheck(['List', String])
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.CONTROLS_FOREACH_INPUT);
this.appendDummyInput()
.appendField(Blockly.Msg.CONTROLS_FOREACH_INPUT_ITEM)
.appendField(new Blockly.FieldTextInput('i'), 'VAR');
this.appendStatementInput('DO')
.appendField(Blockly.Msg.MIXLY_DO);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
var thisBlock = this;
this.setTooltip(function () {
return Blockly.Msg.CONTROLS_FOR_TOOLTIP.replace('%1',
thisBlock.getFieldValue('VAR'));
});
},
getVars: function () {
return [this.getFieldValue('VAR')];
},
renameVar: function (oldName, newName) {
if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {
this.setTitleValue(newName, 'VAR');
}
}
};
export const raw_block = {
// Container.
init: function () {
this.setColour(LOOPS_HUE);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.appendDummyInput()
.appendField('Code Block:');
this.appendDummyInput()
.appendField(new Blockly.FieldMultilineInput('12345'), 'TEXT');
}
};
export const base_type = {
init: function () {
this.setColour(LOOPS_HUE);
this.appendValueInput("DATA")
.appendField(Blockly.Msg.MICROBIT_PYTHON_TYPE);
this.setInputsInline(true);
this.setOutput(true);
this.setTooltip(Blockly.Msg.MICROBIT_PYTHON_TYPE);
}
};
export const controls_TypeLists = {
init: function () {
this.setColour(LOOPS_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_CONTORL_GET_TYPE)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.LANG_MATH_INT, "int"],
[Blockly.Msg.MIXLY_MICROBIT_TYPE_FLOAT, "float"],
[Blockly.Msg.MIXLY_MICROBIT_TYPE_STRING, "str"],
[Blockly.Msg.MIXLY_MICROBIT_TYPE_LIST, "list"],
[Blockly.Msg.MIXLY_MICROBIT_TYPE_TUPLE, "tuple"],
[Blockly.Msg.MIXLY_MICROBIT_TYPE_DICT, "dict"],
[Blockly.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TITLE_ADD, "set"],
// [Blockly.Msg.MIXLY_MICROBIT_IMAGE,"image"],
[Blockly.Msg.LOGIC_NULL, "NoneType"]]), "type");
//整数、浮点数、字符串、列表、元组、字典、集合、图像不太对, unfinished
this.setInputsInline(true);
this.setOutput(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('type');
var mode0 = Blockly.Msg.MICROBIT_controls_TypeLists;
var TOOLTIPS = {
'int': Blockly.Msg.LANG_MATH_INT,
'float': Blockly.Msg.MIXLY_MICROBIT_TYPE_FLOAT,
'str': Blockly.Msg.MIXLY_MICROBIT_TYPE_STRING,
'list': Blockly.Msg.MIXLY_MICROBIT_TYPE_LIST,
'tuple': Blockly.Msg.MIXLY_MICROBIT_TYPE_TUPLE,
'dict': Blockly.Msg.MIXLY_MICROBIT_TYPE_DICT,
'set': Blockly.Msg.blockpy_SET_CREATE_WITH_CONTAINER_TITLE_ADD,
'image': Blockly.Msg.MIXLY_MICROBIT_IMAGE,
'NoneType': Blockly.Msg.LOGIC_NULL
};
return mode0 + TOOLTIPS[mode];
});
}
};
export const controls_uname = {
init: function () {
this.setColour(LOOPS_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_CONTORL_UNAME);
this.setInputsInline(true);
this.setOutput(true);
this.setTooltip(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + Blockly.Msg.MIXLY_MICROBIT_PY_CONTORL_UNAME);
}
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,286 @@
import * as Blockly from 'blockly/core';
const FACTORY_HUE = "#777777"//65;
export const factory_from_import = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField("from ")
.appendField(new Blockly.FieldTextInput('ESP32'), 'path')
.appendField(" import ")
.appendField(new Blockly.FieldTextInput('*'), 'module');
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const factory_import = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField("import ")
.appendField(new Blockly.FieldTextInput('module'), 'module');
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const factory_function_noreturn = {
init: function () {
//console.log('init');
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldTextInput('my_function'), 'NAME');
this.itemCount_ = 1;
this.arguments_ = ['x'];//add
this.updateShape_();
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setMutator(new Blockly.icons.MutatorIcon(['factory_create_with_item'], this));
},
mutationToDom: function () {
//console.log('mutationToDom');
var container = document.createElement('mutation');
container.setAttribute('items', this.itemCount_);
//add
for (var i = 0; i < this.arguments_.length; i++) {
var parameter = document.createElement('arg');
parameter.setAttribute('name', this.arguments_[i]);
container.appendChild(parameter);
}
return container;
},
domToMutation: function (xmlElement) {
//console.log('domToMutation');
this.arguments_ = [];//add
//add
for (var i = 0; xmlElement.childNodes[i]; i++) {
let childNode = xmlElement.childNodes[i];
if (childNode.nodeName.toLowerCase() == 'arg') {
this.arguments_.push(childNode.getAttribute('name'));
}
}
this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);
this.updateShape_();
},
decompose: function (workspace) {
//console.log('decompose');
var containerBlock =
workspace.newBlock('factory_create_with_container');
containerBlock.initSvg();
var connection = containerBlock.getInput('STACK')
.connection;
for (var i = 0; i < this.itemCount_; i++) {
var itemBlock = workspace.newBlock('factory_create_with_item');
itemBlock.initSvg();
itemBlock.setFieldValue(this.arguments_[i], 'NAME');//add
connection.connect(itemBlock.previousConnection);
connection = itemBlock.nextConnection;
}
return containerBlock;
},
compose: function (containerBlock) {
//console.log('compose');
this.arguments_ = [];//add
var itemBlock = containerBlock.getInputTargetBlock('STACK');
// Count number of inputs.
var connections = [];
var i = 0;
while (itemBlock) {
this.arguments_.push(itemBlock.getFieldValue('NAME'));//add
connections[i] = itemBlock.valueConnection_;
itemBlock = itemBlock.nextConnection &&
itemBlock.nextConnection.targetBlock();
i++;
}
this.itemCount_ = i;
this.updateShape_();
// Reconnect any child blocks.
for (var i = 0; i < this.itemCount_; i++) {
if (connections[i]) {
this.getInput('ADD' + i).connection.connect(connections[i]);
}
}
},
saveConnections: function (containerBlock) {
//console.log('saveConnections');
var itemBlock = containerBlock.getInputTargetBlock('STACK');
var i = 0;
while (itemBlock) {
var input = this.getInput('ADD' + i);
itemBlock.valueConnection_ = input && input.connection.targetConnection;
i++;
itemBlock = itemBlock.nextConnection &&
itemBlock.nextConnection.targetBlock();
}
},
updateShape_: function () {
//console.log('updateShape_');
// Delete everything.
if (this.getInput('EMPTY')) {
this.removeInput('EMPTY');
} else {
var i = 0;
while (this.getInput('ADD' + i)) {
this.removeInput('ADD' + i);
i++;
}
}
// Rebuild block.
for (var i = 0; i < this.itemCount_; i++) {
this.appendValueInput('ADD' + i)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(this.arguments_[i]);
}
}
};
export const factory_create_with_container = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_PARAMS);
this.appendStatementInput('STACK');
this.contextMenu = false;
}
};
export const factory_create_with_item = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE + ':')
.appendField(new Blockly.FieldTextInput('x'), 'NAME');
this.setPreviousStatement(true);
this.setNextStatement(true);
this.contextMenu = false;
}
};
export const factory_function_return = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldTextInput('my_function'), 'NAME');
this.itemCount_ = 1;
this.arguments_ = ['x'];//add
this.updateShape_();
this.setOutput(true);
this.setMutator(new Blockly.icons.MutatorIcon(['factory_create_with_item'], this));
},
mutationToDom: factory_function_noreturn.mutationToDom,
domToMutation: factory_function_noreturn.domToMutation,
decompose: factory_function_noreturn.decompose,
compose: factory_function_noreturn.compose,
saveConnections: factory_function_noreturn.saveConnections,
updateShape_: factory_function_noreturn.updateShape_
};
export const factory_declare = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldTextInput('test'), 'NAME')
.appendField("=")
.appendField(new Blockly.FieldTextInput('Test'), 'TYPE')
.appendField("()");
this.setPreviousStatement(true);
this.setNextStatement(true);
}
}
export const factory_callMethod_noreturn = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldTextInput('test'), 'NAME')
.appendField('.')
.appendField(new Blockly.FieldTextInput('callMethod'), 'METHOD');
this.itemCount_ = 1;
this.arguments_ = ['x'];//add
this.updateShape_();
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setMutator(new Blockly.icons.MutatorIcon(['factory_create_with_item'], this));
},
mutationToDom: factory_function_noreturn.mutationToDom,
domToMutation: factory_function_noreturn.domToMutation,
decompose: factory_function_noreturn.decompose,
compose: factory_function_noreturn.compose,
saveConnections: factory_function_noreturn.saveConnections,
updateShape_: factory_function_noreturn.updateShape_
};
export const factory_callMethod_return = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldTextInput('test'), 'NAME')
.appendField('.')
.appendField(new Blockly.FieldTextInput('callMethod'), 'METHOD');
this.itemCount_ = 1;
this.arguments_ = ['x'];//add
this.updateShape_();
this.setOutput(true);
this.setMutator(new Blockly.icons.MutatorIcon(['factory_create_with_item'], this));
},
mutationToDom: factory_function_noreturn.mutationToDom,
domToMutation: factory_function_noreturn.domToMutation,
decompose: factory_function_noreturn.decompose,
compose: factory_function_noreturn.compose,
saveConnections: factory_function_noreturn.saveConnections,
updateShape_: factory_function_noreturn.updateShape_
};
export const factory_block = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldTextInput('display.scroll("Hello World!")'), 'VALUE');
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const factory_block_return = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldTextInput('test'), 'VALUE');
this.setOutput(true);
}
};
export const factory_block_with_textarea = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldMultilineInput('display.scroll("Hello World!")\ndisplay.scroll("Hello Mixly!")'), 'VALUE');
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const factory_block_return_with_textarea = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldMultilineInput('Hello\nMixly'), 'VALUE');
this.setOutput(true);
}
};
export const folding_block = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput()
.appendField(new Blockly.FieldTextInput(Blockly.Msg.FOLDING_BLOCK), "peien");
this.appendStatementInput('DO')
.appendField('');
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.FOLDING_BLOCK_HELP);
}
};

View File

@@ -0,0 +1,359 @@
import * as Blockly from 'blockly/core';
const BASE_HUE = 20//'#ae3838';//40;
export const inout_highlow = {
init: function () {
this.setColour(BASE_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_HIGH, "HIGH"], [Blockly.Msg.MIXLY_LOW, "LOW"]]), 'BOOL')
this.setOutput(true, Boolean);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_HIGHLOW_TOOLTIP);
}
};
export const inout_digital_write = {
init: function () {
this.setColour(BASE_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_Digital_PINMODEOUT)
.setCheck(Number);
this.appendValueInput("STAT")
.appendField(Blockly.Msg.MIXLY_STAT)
.setCheck([Number, Boolean]);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_DIGITAL_WRITE_TOOLTIP);
}
};
export const inout_digital_read = {
init: function () {
this.setColour(BASE_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET)
.appendField(Blockly.Msg.MIXLY_Digital_PINMODEIN)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_MACHINE_VALUE)
this.setInputsInline(true);
this.setOutput(true, [Boolean, Number]);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_DIGITAL_READ_TOOLTIP);
}
};
export const inout_pwm_analog_write = {
init: function () {
this.setColour(BASE_HUE);
this.appendValueInput("PIN", Number)
.appendField("PWM" + Blockly.Msg.MIXLY_Analog_PINMODEOUT)
.setCheck(Number);
this.appendValueInput("NUM", Number)
.appendField(Blockly.Msg.MIXLY_VALUE2)
.setCheck(Number);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_PWM_ANALOG_WRITE_TOOLTIP);
}
};
export const inout_analog_write = {
init: function () {
this.setColour(BASE_HUE);
this.appendValueInput("PIN", Number)
.appendField("DAC" + Blockly.Msg.MIXLY_Analog_PINMODEOUT)
.setCheck(Number);
this.appendValueInput("NUM", Number)
.appendField(Blockly.Msg.MIXLY_VALUE2)
.setCheck(Number);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_ANALOG_WRITE_TOOLTIP);
}
};
export const inout_analog_write_set = {
init: function () {
this.setColour(BASE_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_Analog_PINMODEOUT)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_PERIOD_MIL)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_mSecond, "period"],
[Blockly.Msg.MIXLY_uSecond, "period_microseconds"]
]), "key");
this.appendValueInput("NUM", Number)
.appendField(Blockly.Msg.MIXLY_STAT)
.setCheck(Number);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_ANALOG_WRITE_SET_TOOLTIP);
}
};
export const inout_pwm_analog_write_set_freq = {
init: function () {
this.setColour(BASE_HUE);
this.appendValueInput("PIN", Number)
.appendField("PWM" + Blockly.Msg.MIXLY_Analog_PINMODEOUT)
.setCheck(Number);
this.appendValueInput("NUM", Number)
.appendField(Blockly.Msg.MIXLY_FREQUENCY + Blockly.Msg.MIXLY_STAT)
.setCheck(Number);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_PWM_ANALOG_WRITE_SET_FREQ_TOOLTIP);
}
};
export const inout_analog_read = {
init: function () {
this.setColour(BASE_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET)
.appendField(Blockly.Msg.MIXLY_Analog_PINMODEIN)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_MACHINE_VALUE)
this.setInputsInline(true);
this.setOutput(true, Number);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_ANALOG_READ_TOOLTIP);
}
};
export const inout_analog_atten = {
init: function () {
this.setColour(BASE_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_Analog_PINMODEIN)
.setCheck(Number);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_ESP32_REF_VOLTAGE + Blockly.Msg.MIXLY_STAT)
.appendField(new Blockly.FieldDropdown([
["3.3V", "machine.ADC.ATTN_11DB"],
["2.2V", "machine.ADC.ATTN_6DB"],
["1.5V", "machine.ADC.ATTN_2_5DB"],
["1.2V", "machine.ADC.ATTN_0DB"]
]), "atten");
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_ANALOG_ATTEN_TOOLTIP);
}
};
export const inout_pin_pressed = {
init: function () {
this.setColour(BASE_HUE);
this.appendValueInput('pin')
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET)
.appendField(Blockly.Msg.MIXLY_ESP32_TOUCH_SENSOR);
// this.appendDummyInput()
// .appendField(Blockly.Msg.MIXLY_IS_TOUCHED);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_MACHINE_VALUE)
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_PIN_PRESSED_TOOLTIP);
}
};
export const inout_pin_attachInterrupt = {
init: function () {
this.setColour(20);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_ATTACHINTERRUPT_PIN)
.setCheck(Number);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MODE)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_RISING, "machine.Pin.IRQ_RISING"], [Blockly.Msg.MIXLY_FALLING, "machine.Pin.IRQ_FALLING"], [Blockly.Msg.MIXLY_CHANGE, "(machine.Pin.IRQ_RISING | machine.Pin.IRQ_FALLING)"]]), "mode");
this.appendValueInput('DO')
.appendField(Blockly.Msg.MIXLY_DO)
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_PIN_ATTACHINTERRUPT_TOOLTIP);
}
};
export const inout_digital_init = {
init: function () {
this.setColour(20);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SETUP)
.appendField(new Blockly.FieldTextInput('pin#'), 'PIN_OBJ');
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_AS)
// .appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE+Blockly.Msg.LISTS_SET_INDEX_INPUT_TO)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_Digital_PINMODEOUT, "machine.Pin.OUT"],
[Blockly.Msg.MIXLY_Digital_PINMODEIN, "machine.Pin.IN"],
[Blockly.Msg.MIXLY_PINMODEPULLUP, "machine.Pin.IN, machine.Pin.PULL_UP"],
[Blockly.Msg.MIXLY_PINMODEPULLDOWN, "machine.Pin.IN, machine.Pin.PULL_DOWN"]
]), "MODE")
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_DIGITAL_INIT_TOOLTIP);
},
getVars: function () {
return [this.getFieldValue('PIN_OBJ') == 'pin#' ? null : this.getFieldValue('PIN_OBJ')];
},
renameVar: function (oldName, newName) {
if (Blockly.Names.equals(oldName, this.getFieldValue('PIN_OBJ'))) {
this.setTitleValue(newName, 'PIN_OBJ');
}
}
};
export const inout_pwm_analog_write_init = {
init: function () {
this.setColour(BASE_HUE);
// this.appendValueInput("PIN", Number)
// .appendField(Blockly.Msg.MIXLY_SETUP)
// .appendField("PWM"+Blockly.Msg.MIXLY_Analog_PINMODEOUT)
// .appendField('pwm')
// .setCheck(Number);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_SETUP)
.appendField(new Blockly.FieldTextInput('pwm#'), 'PIN_OBJ')
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_AS)
this.appendDummyInput("")
.appendField("PWM" + Blockly.Msg.MIXLY_Analog_PINMODEOUT)
// .appendField('pwm')
// .appendField(new Blockly.FieldDropdown(profile.default.pwm_pin),"PIN")
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_PWM_ANALOG_WRITE_INIT_TOOLTIP);
},
getVars: function () {
return [this.getFieldValue('PIN_OBJ') == 'pwm#' ? null : this.getFieldValue('PIN_OBJ')];
},
renameVar: function (oldName, newName) {
if (Blockly.Names.equals(oldName, this.getFieldValue('PIN_OBJ'))) {
this.setTitleValue(newName, 'PIN_OBJ');
}
}
};
export const inout_analog_write_init = {
init: function () {
this.setColour(BASE_HUE);
// this.appendValueInput("PIN", Number)
// .appendField(Blockly.Msg.MIXLY_SETUP)
// .appendField("PWM"+Blockly.Msg.MIXLY_Analog_PINMODEOUT)
// .appendField('pwm')
// .setCheck(Number);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_SETUP)
.appendField(new Blockly.FieldTextInput('dac#'), 'PIN_OBJ')
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_AS)
this.appendDummyInput("")
.appendField("DAC" + Blockly.Msg.MIXLY_Analog_PINMODEOUT)
// .appendField('dac')
// .appendField(new Blockly.FieldDropdown(profile.default.dac_pin),"PIN")
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_ANALOG_WRITE_INIT_TOOLTIP);
},
getVars: function () {
return [this.getFieldValue('PIN_OBJ') == 'dac#' ? null : this.getFieldValue('PIN_OBJ')];
},
renameVar: function (oldName, newName) {
if (Blockly.Names.equals(oldName, this.getFieldValue('PIN_OBJ'))) {
this.setTitleValue(newName, 'PIN_OBJ');
}
}
};
export const inout_analog_read_init = {
init: function () {
this.setColour(BASE_HUE);
// this.appendValueInput("PIN", Number)
// .appendField(Blockly.Msg.MIXLY_SETUP)
// .appendField("PWM"+Blockly.Msg.MIXLY_Analog_PINMODEOUT)
// .appendField('pwm')
// .setCheck(Number);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_SETUP)
.appendField(new Blockly.FieldTextInput('adc#'), 'PIN_OBJ')
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_AS)
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_Analog_PINMODEIN)
// .appendField('adc')
// .appendField(new Blockly.FieldDropdown(profile.default.adc_pin),"PIN")
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_ANALOG_READ_INIT_TOOLTIP);
},
getVars: function () {
return [this.getFieldValue('PIN_OBJ') == 'adc#' ? null : this.getFieldValue('PIN_OBJ')];
},
renameVar: function (oldName, newName) {
if (Blockly.Names.equals(oldName, this.getFieldValue('PIN_OBJ'))) {
this.setTitleValue(newName, 'PIN_OBJ');
}
}
};
export const inout_pin_pressed_init = {
init: function () {
this.setColour(BASE_HUE);
// this.appendValueInput("PIN", Number)
// .appendField(Blockly.Msg.MIXLY_SETUP)
// .appendField("PWM"+Blockly.Msg.MIXLY_Analog_PINMODEOUT)
// .appendField('pwm')
// .setCheck(Number);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_SETUP)
.appendField(new Blockly.FieldTextInput('tc#'), 'PIN_OBJ')
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_AS)
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_ESP32_TOUCH_SENSOR)
// .appendField('tc')
// .appendField(new Blockly.FieldDropdown(profile.default.tc_pin),"PIN")
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_PIN_PRESSED_INIT_TOOLTIP);
},
getVars: function () {
return [this.getFieldValue('PIN_OBJ') == 'tc#' ? null : this.getFieldValue('PIN_OBJ')];
},
renameVar: function (oldName, newName) {
if (Blockly.Names.equals(oldName, this.getFieldValue('PIN_OBJ'))) {
this.setTitleValue(newName, 'PIN_OBJ');
}
}
};
export const inout_pinMode = inout_digital_init;
export const inout_analog_write_set_freq = inout_pwm_analog_write_set_freq;
export const pin_pressed_init = inout_pin_pressed_init;
export const pin_pressed = inout_pin_pressed;
export const controls_pin_attachInterrupt = inout_pin_attachInterrupt;

View File

@@ -0,0 +1,624 @@
import * as Blockly from 'blockly/core';
import * as Mixly from 'mixly';
const IOT_HUE = '#526FC3';
//'#2FAD7A';
export const iot_wifi_connect = {
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_IOT_CONNECT_WIFI);
this.appendValueInput('WIFINAME')
.setCheck(String)
.appendField(Blockly.Msg.HTML_NAME);
this.appendValueInput('PASSWORD')
.setCheck(String)
.appendField(Blockly.Msg.HTML_PASSWORD);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_WIFI_CONNECT_TOOLTIP);
}
};
export const iot_onenet_connect = {
init: function () {
this.setColour(IOT_HUE);
this.appendValueInput('VAR')
.setCheck("var")
.appendField("OneNET" + Blockly.Msg.TUPLE_JOIN);
this.appendValueInput('CLIENT')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_ESP32_ONENET_CLIENT);
this.appendValueInput('SERVER')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_ESP32_ONENET_SERVER);
this.appendValueInput('USERNAME')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_ESP32_ONENET_USERNAME);
this.appendValueInput('PASSWORD')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_ESP32_ONENET_PASSWORD);
this.appendValueInput('TOPIC')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_ESP32_ONENET_TOPIC);
this.appendValueInput('SUB')
.appendField(Blockly.Msg.MIXLY_ESP32_ONENET_SUB);
//this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_CONNECT_TOOLTIP);
}
};
export const iot_onenet_disconnect = {
init: function () {
this.setColour(IOT_HUE);
this.appendValueInput('VAR')
.setCheck("var")
.appendField("OneNET")
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_DISCONNECT_ONENET);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_DISCONNECT_TOOLTIP);
}
};
export const iot_onenet_check = {
init: function () {
this.setColour(IOT_HUE);
this.appendValueInput('VAR')
.setCheck("var")
.appendField("OneNET")
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_CHECK_ONENET);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_CHECK_TOOLTIP);
}
};
export const iot_onenet_publish_dict = {
init: function () {
this.setColour(IOT_HUE);
this.appendValueInput('VAR')
.setCheck("var")
.appendField("OneNET")
this.appendValueInput('DICT')
.appendField(Blockly.Msg.MIXLY_ESP32_PUBLISH_ONENET);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_PRINT_DATA)
.appendField(new Blockly.FieldCheckbox('TRUE'), 'is_print');
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_PUBLISH_DICT_TOOLTIP);
}
};
export const iot_onenet_publish = {
/**
* Block for creating a list with any number of elements of any type.
* @this Blockly.Block
*/
init: function () {
this.setColour(IOT_HUE);
this.appendValueInput('VAR')
.setCheck("var")
.appendField("OneNET")
.setAlign(Blockly.inputs.Align.RIGHT)
this.appendDummyInput()
.appendField(new Blockly.FieldLabel(Blockly.Msg.MIXLY_ESP32_PUBLISH_ONENET), 'TIP')
.setAlign(Blockly.inputs.Align.RIGHT)
this.itemCount_ = 2;
this.updateShape_();
this.setInputsInline(false);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setMutator(new Blockly.icons.MutatorIcon(['iot_publish_item'], this));
this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_PUBLISH_TOOLTIP);
},
/**
* Create XML to represent list inputs.
* @return {Element} XML storage element.
* @this Blockly.Block
*/
mutationToDom: function () {
var container = document.createElement('mutation');
container.setAttribute('items', this.itemCount_);
return container;
},
/**
* Parse XML to restore the list inputs.
* @param {!Element} xmlElement XML storage element.
* @this Blockly.Block
*/
domToMutation: function (xmlElement) {
this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);
this.updateShape_();
},
/**
* Populate the mutator's dialog with this block's components.
* @param {!Blockly.Workspace} workspace Mutator's workspace.
* @return {!Blockly.Block} Root block in mutator.
* @this Blockly.Block
*/
decompose: function (workspace) {
var containerBlock =
workspace.newBlock('iot_publish_container');
containerBlock.initSvg();
var connection = containerBlock.getInput('STACK').connection;
for (var i = 0; i < this.itemCount_; i++) {
var itemBlock = workspace.newBlock('iot_create_with_item');
itemBlock.initSvg();
connection.connect(itemBlock.previousConnection);
connection = itemBlock.nextConnection;
}
return containerBlock;
},
/**
* Reconfigure this block based on the mutator dialog's components.
* @param {!Blockly.Block} containerBlock Root block in mutator.
* @this Blockly.Block
*/
compose: function (containerBlock) {
var itemBlock = containerBlock.getInputTargetBlock('STACK');
// Count number of inputs.
var connections = [];
let i = 0;
while (itemBlock) {
connections[i] = itemBlock.valueConnection_;
itemBlock = itemBlock.nextConnection &&
itemBlock.nextConnection.targetBlock();
i++;
}
this.itemCount_ = i;
this.updateShape_();
// Reconnect any child blocks.
for (let i = 0; i < this.itemCount_; i++) {
if (connections[i]) {
this.getInput('ADD' + i).connection.connect(connections[i]);
}
}
},
/**
* Store pointers to any connected child blocks.
* @param {!Blockly.Block} containerBlock Root block in mutator.
* @this Blockly.Block
*/
saveConnections: function (containerBlock) {
var itemBlock = containerBlock.getInputTargetBlock('STACK');
var i = 0;
while (itemBlock) {
var input = this.getInput('ADD' + i);
itemBlock.valueConnection_ = input && input.connection.targetConnection;
i++;
itemBlock = itemBlock.nextConnection &&
itemBlock.nextConnection.targetBlock();
}
},
/**
* Modify this block to have the correct number of inputs.
* @private
* @this Blockly.Block
*/
updateShape_: function () {
// Delete everything.
if (this.getInput('EMPTY')) {
this.removeInput('EMPTY');
}
var keyNames = [];
for (let i = 0; this.getInput('ADD' + i); i++) {
//this.getInput('VALUE' + i).removeField("KEY"+i);
keyNames.push(this.getFieldValue("KEY" + i))
this.removeInput('ADD' + i);
}
// Rebuild block.
if (this.itemCount_ == 0) {
//this.getField('TIP')
//.setText(Blockly.Msg.MIXLY_ESP32_PUBLISH_ONENET_EMPTY);
this.setFieldValue(Blockly.Msg.MIXLY_ESP32_PUBLISH_ONENET_EMPTY, 'TIP');
} else {
//this.getField('TIP')
//.setText(Blockly.Msg.MIXLY_ESP32_PUBLISH_ONENET);
this.setFieldValue(Blockly.Msg.MIXLY_ESP32_PUBLISH_ONENET, 'TIP');
for (let i = 0; i < this.itemCount_; i++) {
this.appendValueInput('ADD' + i)
.setCheck(null)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(
new Blockly.FieldTextInput(
keyNames.length > i
? keyNames[i]
: '"key' + (i + 1) + '"'),
'KEY' + i)
.appendField(":")
}
}
}, getVars: function () {
return [this.getFieldValue('VAR')];
},
renameVar: function (oldName, newName) {
if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {
this.setTitleValue(newName, 'VAR');
}
}
};
export const iot_publish_container = {
/**
* Mutator block for list container.
* @this Blockly.Block
*/
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_TYPE_DICT);
this.appendStatementInput('STACK');
this.setTooltip(Blockly.Msg.DICTS_CREATE_WITH_CONTAINER_TOOLTIP);
this.contextMenu = false;
}
};
export const iot_publish_item = {
/**
* Mutator bolck for adding items.
* @this Blockly.Block
*/
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.DICTS_CREATE_WITH_ITEM_TITLE);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.DICTS_CREATE_WITH_ITEM_TOOLTIP);
this.contextMenu = false;
}
};
export const iot_create_with_item = {
/**
* Mutator bolck for adding items.
* @this Blockly.Block
*/
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.DICTS_CREATE_WITH_ITEM_TITLE);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.DICTS_CREATE_WITH_ITEM_TOOLTIP);
this.contextMenu = false;
}
};
export const iot_mixio_connect = {
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_CREATE_MQTT_CLIENT_AND_CONNECT);
this.appendValueInput('SERVER')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_EMQX_SERVER)
.setAlign(Blockly.inputs.Align.RIGHT)
this.appendValueInput('USERNAME')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_WIFI_USERNAME)
.setAlign(Blockly.inputs.Align.RIGHT)
this.appendValueInput('PASSWORD')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_IOT_PASSWORD)
.setAlign(Blockly.inputs.Align.RIGHT)
this.appendValueInput('PROJECT')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_EMQX_PROJECT)
.setAlign(Blockly.inputs.Align.RIGHT)
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const IOT_MIXIO_PUBLISH = {
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField("MixIO")
this.appendValueInput('TOPIC')
.appendField(Blockly.Msg.MIXLY_EMQX_PUBLISH_NEW)
.appendField(Blockly.Msg.MIXLY_EMQX_PUBLISH_TOPIC);
this.appendValueInput('MSG')
.appendField(Blockly.Msg.HTML_BODY);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_EMQX_PUBLISH_TOOLTIP);
}
};
export const IOT_MIXIO_SUBSCRIBE = {
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField("MixIO")
this.appendValueInput('TOPIC')
.appendField(Blockly.Msg.MIXLY_EMQX_SUBSCRIBE + Blockly.Msg.MIXLY_MICROBIT_MSG)
.appendField(Blockly.Msg.MIXLY_EMQX_PUBLISH_TOPIC);
this.appendValueInput('METHOD')
.appendField(Blockly.Msg.MIXLY_EMQX_SET_METHOD);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_EMQX_SUBSCRIBE_TOOLTIP);
}
};
export const iot_mixio_disconnect = {
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField("MixIO")
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_DISCONNECT_ONENET);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
// this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_DISCONNECT_TOOLTIP);
}
};
export const iot_mixio_connect_only = {
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField("MixIO")
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_EMQX_CONNECT);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
// this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_DISCONNECT_TOOLTIP);
}
};
export const iot_mixio_check = {
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField("MixIO")
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_CHECK_ONENET);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
// this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_ONENET_CHECK_TOOLTIP);
}
};
export const iot_mixio_format_topic = {
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_FORMAT)
.appendField(Blockly.Msg.MQTT_Topic);
this.setInputsInline(true);
this.setOutput(true);
}
};
export const iot_mixio_format_msg = {
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_FORMAT)
.appendField(Blockly.Msg.MIXLY_EMQX_PUBLISH_MSG);
this.setInputsInline(true);
this.setOutput(true);
}
};
export const IOT_FORMATTING = {
init: function () {
this.setColour(IOT_HUE);
this.appendValueInput('VAR')
.appendField(Blockly.Msg.MIXLY_ESP32_IOT_MAP_FORMATING);
this.setOutput(true);
// this.setTooltip();
}
};
export const IOT_FORMAT_STRING = {
init: function () {
this.setColour(IOT_HUE);
this.appendValueInput('VAR')
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_FORMAT + '(Json)');
this.setOutput(true);
// this.setTooltip();
}
};
export const IOT_EMQX_PING = {
init: function () {
this.setColour(IOT_HUE);
// this.appendValueInput('VAR')
// .setCheck("var")
this.appendDummyInput()
.appendField("MixIO")
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_EMQX_PING);
this.setInputsInline(true);
this.setOutput(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_EMQX_PING_TOOLTIP);
}
};
export const IOT_MIXIO_NTP = {
init: function () {
this.setColour(IOT_HUE);
// this.appendValueInput('VAR')
// .setCheck("var")
this.appendDummyInput()
.appendField("MixIO")
.appendField(Blockly.Msg.MIXLY_GET_NTP)
this.appendValueInput('addr')
.appendField(Blockly.Msg.blynk_SERVER_ADD);
this.setInputsInline(true);
this.setOutput(true);
}
};
export const IOT_EMQX_INIT_AND_CONNECT_BY_SHARE_CODE = {
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_CREATE_MQTT_CLIENT_AND_CONNECT);
this.appendValueInput('SERVER')
.appendField(Blockly.Msg.MIXLY_EMQX_SERVER)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput('KEY')
.appendField(Blockly.Msg.CONTROLS_FOR_INPUT_WITH + Blockly.Msg.MIXLY_MIXIO_SHARE_KEY)
.setAlign(Blockly.inputs.Align.RIGHT);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const IOT_EMQX_INIT_AND_CONNECT_BY_MIXLY_CODE = {
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_CREATE_MQTT_CLIENT_AND_CONNECT);
this.appendValueInput('SERVER')
.appendField(Blockly.Msg.MIXLY_EMQX_SERVER)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput('KEY')
.appendField(Blockly.Msg.CONTROLS_FOR_INPUT_WITH + "Mixly Key")
.setAlign(Blockly.inputs.Align.RIGHT);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const iot_mixly_key = {
init: function () {
this.VISITOR_ID = Mixly.Config.BOARD.visitorId.str32.substring(0, 8).toUpperCase();
this.setColour(IOT_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldTextInput(this.visitorId), 'VISITOR_ID');
this.setOutput(true, null);
},
onchange: function () {
const nowVisitorId = this.getFieldValue('VISITOR_ID');
if (this.VISITOR_ID !== nowVisitorId)
this.setFieldValue(this.VISITOR_ID, 'VISITOR_ID');
}
};
export const iot_client_onboard = {
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField('MixIO')
.appendField(Blockly.Msg.MSG.catEthernet_clinet);
this.setOutput(true);
this.setInputsInline(true);
}
};
export const iot_http_client = {
init: function () {
this.setColour(IOT_HUE);
// this.appendValueInput('VAR')
// .setCheck("var")
this.appendDummyInput()
.appendField("HTTP" + Blockly.Msg.MIXLY_Client)
this.appendValueInput('addr')
.appendField(Blockly.Msg.DISPLAY_IMAGE_LET2);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_REQUESTS_GET)
.appendField(Blockly.Msg.MIXLY_GET_CURRENT_TIME)
.appendField(Blockly.Msg.MIXLY_OPEN_DEBUG)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_TRUE, "True"],
[Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_FALSE, "False"]
]), "key");
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const iot_http_data = {
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField("HTTP" + Blockly.Msg.MIXLY_Client)
.appendField(Blockly.Msg.MIXLY_GET)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_REQUESTS_LEN, "client_len"],
[Blockly.Msg.MIXLY_REQUESTS_GET_LEN, "server_len"],
[Blockly.Msg.MIXLY_REQUESTS_MESSAGE, "text"]
]), "key");
this.setOutput(true);
this.setInputsInline(true);
}
};
export const iot_mqtt_client = {
init: function () {
this.setColour(IOT_HUE);
// this.appendValueInput('VAR')
// .setCheck("var")
this.appendDummyInput()
.appendField("MQTT" + Blockly.Msg.MIXLY_Client)
this.appendValueInput('addr')
.appendField(Blockly.Msg.MIXLY_CONNECTTO);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_INIT_SUBSCRIBE)
.appendField(Blockly.Msg.MQTT_Topic)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_GET_CURRENT_TIME, ""],
]), "key")
.appendField(Blockly.Msg.MIXLY_OPEN_DEBUG)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_TRUE, "True"],
[Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_FALSE, "False"]
]), "key2");
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const iot_mqtt_data = {
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField("MQTT" + Blockly.Msg.MIXLY_Client)
.appendField(Blockly.Msg.MIXLY_GET)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_REQUESTS_LEN, "client_len"],
[Blockly.Msg.MIXLY_REQUESTS_GET_LEN, "server_len"],
[Blockly.Msg.MIXLY_REQUESTS_MESSAGE, "time_msg()"]
]), "key");
this.setOutput(true);
this.setInputsInline(true);
}
};
export const iot_wificonnect = iot_wifi_connect;
export const iot_onenetconnect = iot_onenet_connect;
export const iot_onenetdisconnect = iot_onenet_disconnect;
export const iot_checkonenet = iot_onenet_check;
export const iot_publish = iot_onenet_publish;

View File

@@ -0,0 +1,516 @@
import * as Blockly from 'blockly/core';
const NETWORK_HUE = 225;
export const network_init = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.setCheck("var");
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_NETWORK_INIT)
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_NETWORK_MODE)
.appendField(new Blockly.FieldDropdown([
['STA', "STA"],
['AP', "AP"]
]), "mode");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_NETWORK_INIT_TOOLTIP);
}
};
export const network_open = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.setCheck("var")
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_NETWORK_WIFI_OPEN, "True"],
[Blockly.Msg.MIXLY_NETWORK_WIFI_CLOSE, "False"]
]), "op");
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_NETWORK_WIFI_FLAG)
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('op');
var mode0 = Blockly.Msg.MIXLY_ESP32_NETWORK_OPEN_TOOLTIP;
var TOOLTIPS = {
'True': Blockly.Msg.MIXLY_NETWORK_WIFI_OPEN,
'False': Blockly.Msg.MIXLY_NETWORK_WIFI_CLOSE,
};
return TOOLTIPS[mode] + mode0
});
}
};
export const network_is_active = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.setCheck("var")
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_NETWORK_WIFI_IS_ACTIVE)
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_NETWORK_WIFI_IS_ACTIVE);
}
};
export const network_scan = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.setCheck("var")
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_NETWORK_WIFI_SCAN)
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(function () {
var mode = 'all';
var mode0 = Blockly.Msg.MIXLY_ESP32_NETWORK_SCAN_TOOLTIP
var TOOLTIPS = {
'0': "ssid",
'1': 'bssid',
'2': "channel",
'3': "RSSI",
'4': "authmode",
'5': "hidden",
'all': Blockly.Msg.MIXLY_NETWORK_WIFI_SCAN_ATTRIBUTE,
};
return mode0 + TOOLTIPS[mode]
});
}
};
export const network_connect = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.setCheck("var")
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_ESP32_NETWORK_CONNECT);
this.appendValueInput('id')
.setCheck(String)
.appendField(Blockly.Msg.HTML_NAME);
this.appendValueInput('password')
.setCheck(String)
.appendField(Blockly.Msg.HTML_PASSWORD);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_NETWORK_CONNECT_TOOLTIP);
}
};
export const network_wifi_connect = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.setCheck("var")
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_NETWORK_WIFI_CONNECT);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_SYMBOL_QUESTION);
this.setOutput(true, Boolean);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_NETWORK_WIFI_CONNECT_TOOLTIP);
}
};
export const network_get_connect = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.setCheck("var")
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_ESP32_NETWORK_GET_WIFI);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_ESP32_NETWORK_IP, "0"],
[Blockly.Msg.MIXLY_ESP32_NETWORK_MASK, "1"],
[Blockly.Msg.MIXLY_ESP32_NETWORK_GATEWAY, "2"],
["DNS", "3"]
]), "mode");
this.setOutput(true);
this.setInputsInline(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('mode');
var mode0 = Blockly.Msg.MIXLY_ESP32_NETWORK_GET_WIFI_TOOLTIP
var TOOLTIPS = {
'0': Blockly.Msg.MIXLY_ESP32_NETWORK_IP,
'1': Blockly.Msg.MIXLY_ESP32_NETWORK_MASK,
'2': Blockly.Msg.MIXLY_ESP32_NETWORK_GATEWAY,
'3': "DNS",
};
return mode0 + TOOLTIPS[mode]
});
}
};
export const network_stop = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.setCheck("var")
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_ESP32_NETWORK_STOP_CONNECT);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_NETWORK_STOP_TOOLTIP);
}
};
export const network_get_wifi = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.setCheck("var")
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_ESP32_NETWORK_GET_WIFI);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_NETWORK_WIFI_ESSID, "essid"],
[Blockly.Msg.MIXLY_NETWORK_WIFI_CHANNEL, "channel"]
]), "op");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_NETWORK_GET_WIFI_TOOLTIP);
}
};
export const network_ap_connect = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.setCheck("var")
this.appendDummyInput("")
.appendField(Blockly.Msg.LISTS_SET_INDEX_SET);
this.appendValueInput('essid')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_NETWORK_WIFI_ESSID);
this.appendValueInput('channel')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_NETWORK_WIFI_CHANNEL);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_NETWORK_AP_CONNECT_TOOLTIP);
}
};
export const network_server = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.setCheck("var")
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_ESP32_NETWORK_SERVER1);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_ESP32_NETWORK_SERVER2);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_NETWORK_SOCKET_CLOSE_TOOLTIP);
}
};
export const network_socket_init = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_INIT)
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_TYPE)
.appendField(new Blockly.FieldDropdown([
['TCP', "TCP"],
['UDP', "UDP"]
]), "mode");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('mode');
var mode0 = Blockly.Msg.MIXLY_ESP32_NETWORK_SOCKET_INIT_TOOLTIP
var TOOLTIPS = {
'TCP': 'TCP',
'UDP': 'UDP',
};
return mode0 + TOOLTIPS[mode]
});
}
};
export const network_socket_bind = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.setCheck("var")
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_LET_SOCKET)
this.appendValueInput('address')
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_BIND_TO_ADDRESS);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_NETWORK_SOCKET_BIND_TOOLTIP);
}
};
export const network_socket_connect = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.setCheck("var")
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_LET_SOCKET)
this.appendValueInput('address')
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_CONNECT_TO_ADDRESS);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_NETWORK_SOCKET_CONNECT_TOOLTIP);
}
};
export const network_socket_listen = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.setCheck("var")
this.appendValueInput('queue')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_LISTEN)
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_QUEUE);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_NETWORK_SOCKET_LISTEN_TOOLTIP);
}
};
export const network_socket_accept = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.setCheck("var")
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_ACCEPT);
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_NETWORK_SOCKET_ACCEPT_TOOLTIP);
}
};
export const network_socket_receive = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.setCheck("var")
.appendField("TCP")
this.appendValueInput('size')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_RECEIVE)
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_NETWORK_SOCKET_RECEIVE_TOOLTIP);
}
};
export const network_socket_send = {
init: function () {
this.setColour(NETWORK_HUE);
// .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE)
this.appendValueInput('VAR')
.setCheck("var")
.appendField("TCP")
this.appendValueInput('content')
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_SEND)
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_NETWORK_SOCKET_SEND_TOOLTIP);
}
};
export const network_socket_receive_from = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.setCheck("var")
.appendField("UDP")
this.appendValueInput('size')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_RECEIVE)
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_NETWORK_SOCKET_RECEIVE_FROM_TOOLTIP);
}
};
export const network_socket_send_to = {
init: function () {
this.setColour(NETWORK_HUE);
// .appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE)
this.appendValueInput('VAR')
.setCheck("var")
.appendField("UDP")
this.appendValueInput('content')
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_SEND)
this.appendValueInput('address')
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_TO);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_NETWORK_SOCKET_SEND_TO_TOOLTIP);
}
};
export const network_socket_close = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.setCheck("var")
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_CLOSE);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_NETWORK_SOCKET_CLOSE_TOOLTIP);
}
};
export const requests_get = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput("DOMAIN")
.appendField(Blockly.Msg.DISPLAY_IMAGE_LET2)
.setCheck(String);
this.appendDummyInput("")
.appendField(Blockly.Msg.blockpy_REQUESTS_GET)
.appendField(new Blockly.FieldTextInput('response'), 'VAR')
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.blockpy_REQUESTS_GET_TOOLTIP);
},
getVars: function () {
return [this.getFieldValue('VAR')];
},
renameVar: function (oldName, newName) {
if (Blockly.Names.equals(oldName, this.getFieldValue('VAR'))) {
this.setTitleValue(newName, 'VAR');
}
}
}
export const requests_attribute = {
init: function () {
this.appendValueInput('VAL')
var attr =
[[Blockly.Msg.blockpy_REQUESTS_GET_ATTR_STATUS_CODE, 'status_code'], [Blockly.Msg.blockpy_REQUESTS_GET_ATTR_TEXT, 'text']
, [Blockly.Msg.blockpy_REQUESTS_GET_ATTR_COOKIES, 'cookies'], [Blockly.Msg.blockpy_REQUESTS_GET_ATTR_CONTENT, 'content']];
this.setColour(NETWORK_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_GET)
.appendField(new Blockly.FieldDropdown(attr), 'ATTR')
this.setInputsInline(true);
this.setOutput(true, String);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('DIR');
var TOOLTIPS = {
'clear': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_CLEAR,
'reset': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_RESET,
'home': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_HOME
};
return TOOLTIPS[mode];
});
}
};
export const requests_method = {
init: function () {
this.appendValueInput("VAR")
.appendField(Blockly.Msg.DISPLAY_IMAGE_LET2)
.setCheck(String);
var method = [
['post', 'post'], ['put', 'put'],
['delete', 'delete'], ['head', 'head'],
['option', 'option']
];
this.setColour(NETWORK_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.blockpy_CONDUCT)
.appendField(new Blockly.FieldDropdown(method), 'DIR')
this.appendDummyInput("")
.appendField(Blockly.Msg.blockpy_REQUESTS)
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('DIR');
var TOOLTIPS = {
'forward': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_FORWARD,
'backward': Blockly.Msg.MIXLY_TOOLTIP_TURTEL_BACKWARD
};
return TOOLTIPS[mode];
});
}
};
export const ntptime_time = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_GET_NTP + '(NTP)')
this.appendValueInput("data")
.appendField(Blockly.Msg.blynk_SERVER_ADD)
this.setOutput(true, 'Tuple');
this.setInputsInline(true);
}
};
export const ntptime_address = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([
['ntp.aliyun.com', "ntp.aliyun.com"],
['ntp1.aliyun.com', "ntp1.aliyun.com"],
['ntp2.aliyun.com', "ntp2.aliyun.com"],
['ntp3.aliyun.com', "ntp3.aliyun.com"],
['ntp4.aliyun.com', "ntp4.aliyun.com"],
['ntp5.aliyun.com', "ntp5.aliyun.com"],
['ntp6.aliyun.com', "ntp6.aliyun.com"],
['ntp7.aliyun.com', "ntp7.aliyun.com"],
['time1.cloud.tencent.com', "time1.cloud.tencent.com"],
['time2.cloud.tencent.com', "time2.cloud.tencent.com"],
['time3.cloud.tencent.com', "time3.cloud.tencent.com"],
['time4.cloud.tencent.com', "time4.cloud.tencent.com"],
['time5.cloud.tencent.com', "time5.cloud.tencent.com"]
]), 'op')
this.setOutput(true);
}
};

View File

@@ -0,0 +1,84 @@
import * as Blockly from 'blockly/core';
import * as Mixly from 'mixly';
const NOVAG1_HUE = 100;
export const get_potential_num = {
init: function () {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_nova") { var name = 'Nova G1' }
this.setColour(NOVAG1_HUE);
this.appendDummyInput()
.appendField(name)
.appendField(Blockly.Msg.MIXLY_MIXGO_NOVA_POTENTIAL_NUM);
this.setOutput(true, Number);
this.setInputsInline(true);
}
}
export const nova_g1_motor = {
init: function () {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_nova") { var name = 'Nova G1' }
this.setColour(NOVAG1_HUE);
this.appendValueInput('PIN')
.appendField(name)
.appendField(Blockly.Msg.MOTOR_DC)
.appendField(Blockly.Msg.LCD_NUMBERING)
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_Direction)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.CLOCKWISE, "CW"],
[Blockly.Msg.ANTI_CLOCKWISE, "CCW"],
[Blockly.Msg.MOTOR_P, "P"],
[Blockly.Msg.MOTOR_N, "N"]
]), "direction");
this.appendValueInput('speed')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_STEPPER_SET_SPEED);
this.appendDummyInput("")
.appendField("%")
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
}
export const nova_g1_usb = {
init: function () {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_nova") { var name = 'Nova G1' }
this.setColour(NOVAG1_HUE);
this.appendValueInput('PIN')
.appendField(name)
.appendField(Blockly.Msg.SET_USB);
this.appendValueInput('percent')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_POWER_SUPPLY);
this.appendDummyInput("")
.appendField("%")
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
}
export const nova_g1_spk_en = {
init: function () {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_nova") { var name = 'Nova G1' }
this.setColour(NOVAG1_HUE);
this.appendDummyInput()
.appendField(name)
.appendField(Blockly.Msg.MIXLY_SPK_STATE)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_ON, "True"],
[Blockly.Msg.MIXLY_OFF, "False"]
]), "state");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
}

View File

@@ -0,0 +1,182 @@
import * as Blockly from 'blockly/core';
import * as Mixly from 'mixly';
const PEG1_HUE = 100;
export const pe_g1_use_i2c_init = {
init: function () {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_ce") { var name = 'CE G6' }
else if (version == "mixgo_pe") { var name = 'PE G1' }
this.setColour(PEG1_HUE);
this.appendValueInput('I2CSUB')
.appendField(Blockly.Msg.CONTROLS_FOR_INPUT_WITH + "I2C")
.setCheck("var");
this.appendValueInput('SUB')
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE)
.setCheck("var");
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_SETUP + Blockly.Msg.LISTS_SET_INDEX_INPUT_TO)
.appendField(name);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
}
};
export const pe_g1_battery_left = {
init: function () {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_ce") { var name = 'CE G6' }
else if (version == "mixgo_pe") { var name = 'PE G1' }
this.setColour(PEG1_HUE);
this.appendValueInput('SUB')
.appendField(name)
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MIXGO_CAR_BATTERY_LEFT);
this.setOutput(true, Number);
this.setInputsInline(true);
}
};
export const pe_g1_dc_motor = {
init: function () {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_ce") { var name = 'CE G6' }
else if (version == "mixgo_pe") { var name = 'PE G1' }
this.setColour(PEG1_HUE);
this.appendValueInput('SUB')
.appendField(name)
.setCheck("var");
this.appendValueInput('PIN')
.appendField(Blockly.Msg.MOTOR_DC)
.appendField(Blockly.Msg.LCD_NUMBERING)
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_Direction)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.CLOCKWISE, "CW"],
[Blockly.Msg.ANTI_CLOCKWISE, "CCW"],
[Blockly.Msg.MOTOR_P, "P"],
[Blockly.Msg.MOTOR_N, "N"]
]), "direction");
this.appendValueInput('speed')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_STEPPER_SET_SPEED);
this.appendDummyInput("")
.appendField("%")
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
}
export const pe_g1_dc_motor_speed = {
init: function () {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_ce") { var name = 'CE G6' }
else if (version == "mixgo_pe") { var name = 'PE G1' }
this.setColour(PEG1_HUE);
this.appendValueInput('SUB')
.appendField(name)
.setCheck("var");
this.appendValueInput('PIN')
.appendField(Blockly.Msg.MOTOR_DC)
.appendField(Blockly.Msg.LCD_NUMBERING)
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_STEPPER_GET_SPEED);
this.setOutput(true, Number);
this.setInputsInline(true);
}
}
export const pe_g1_servo_set_angle = {
init: function () {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_ce") { var name = 'CE G6' }
else if (version == "mixgo_pe") { var name = 'PE G1' }
this.setColour(PEG1_HUE);
this.appendValueInput('SUB')
.appendField(name)
.setCheck("var");
this.appendValueInput('PIN')
.appendField('180°' + Blockly.Msg.MIXLY_SERVO)
.appendField(Blockly.Msg.LCD_NUMBERING)
this.appendValueInput("NUM", Number)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SERVO_MOVE);
}
};
export const pe_g1_servo_set_speed = {
init: function () {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_ce") { var name = 'CE G6' }
else if (version == "mixgo_pe") { var name = 'PE G1' }
this.setColour(PEG1_HUE);
this.appendValueInput('SUB')
.appendField(name)
.setCheck("var");
this.appendValueInput('PIN')
.appendField('360°' + Blockly.Msg.MIXLY_SERVO)
.appendField(Blockly.Msg.LCD_NUMBERING)
this.appendValueInput("NUM", Number)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_SPEED);
this.appendDummyInput()
.appendField('%');
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SERVO_SPEED_TOOLIPS);
}
};
export const pe_g1_servo_get_angle = {
init: function () {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_ce") { var name = 'CE G6' }
else if (version == "mixgo_pe") { var name = 'PE G1' }
this.setColour(PEG1_HUE);
this.appendValueInput('SUB')
.appendField(name)
.setCheck("var");
this.appendValueInput('PIN')
.appendField('180°' + Blockly.Msg.MIXLY_SERVO)
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET + Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE);
this.setOutput(true, Number);
this.setInputsInline(true);
}
};
export const pe_g1_servo_get_speed = {
init: function () {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_ce") { var name = 'CE G6' }
else if (version == "mixgo_pe") { var name = 'PE G1' }
this.setColour(PEG1_HUE);
this.appendValueInput('SUB')
.appendField(name)
.setCheck("var");
this.appendValueInput('PIN')
.appendField('360°' + Blockly.Msg.MIXLY_SERVO)
.appendField(Blockly.Msg.LCD_NUMBERING)
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET + Blockly.Msg.MIXLY_SPEED);
this.setOutput(true, Number);
this.setInputsInline(true);
}
};

View File

@@ -0,0 +1,338 @@
import * as Blockly from 'blockly/core';
import { Profile } from 'mixly';
const PINS_HUE = 230;
export const pins_digital = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.digital), 'PIN');
this.setOutput(true);
}
};
export const pins_digital_pin = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.digital_pin), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_input_pin = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.input_pin), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_output_pin = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.output_pin), 'PIN');
this.setOutput(true, Number);
}
};
export const pwm_input = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.pwm_input), 'PIN');
this.setOutput(true);
}
};
export const analog_input = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.analog_input), 'PIN');
this.setOutput(true);
}
};
export const pwm_output = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.pwm_output), 'PIN');
this.setOutput(true);
}
};
export const analog_output = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.analog_output), 'PIN');
this.setOutput(true);
}
};
export const espnow_channel = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.espnow_channel), 'PIN');
this.setOutput(true, Number);
}
};
export const i2c_A_pin = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.i2c_A_pin), 'PIN');
this.setOutput(true, Number);
}
};
export const i2c_B_pin = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.i2c_B_pin), 'PIN');
this.setOutput(true, Number);
}
};
export const spi_A_pin = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.spi_A_pin), 'PIN');
this.setOutput(true, Number);
}
};
export const spi_B_pin = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.spi_B_pin), 'PIN');
this.setOutput(true, Number);
}
};
export const spi_C_pin = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.spi_C_pin), 'PIN');
this.setOutput(true, Number);
}
};
export const spi_D_pin = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.spi_D_pin), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_analog = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.analog), 'PIN');
this.setOutput(true);
}
};
export const pins_analog_pin = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.analog_pin), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_dac = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.dac), 'PIN');
this.setOutput(true);
}
};
export const pins_dac_pin = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.dac_pin), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_button = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.button), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_pwm = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.pwm), 'PIN');
this.setOutput(true);
}
};
export const pins_pwm_pin = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.pwm_pin), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_touch_pin = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.touch_pin), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_touch = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.touch), 'PIN');
this.setOutput(true);
}
};
export const pins_serial = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.serial_pin), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_builtinimg = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.builtinimg), 'PIN');
this.setOutput(true, "esp32_image");
}
};
export const pins_imglist = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.imglist), 'PIN');
this.setOutput(true);
}
};
export const pins_playlist = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.playlist), 'PIN');
this.setOutput(true);
}
};
export const pins_exlcdh = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.exlcdh), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_exlcdv = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.exlcdv), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_axis = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.axis), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_brightness = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.brightness), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_tone_notes = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.tone_notes), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_radio_power = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.radio_power), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_radio_datarate = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.radio_datarate), 'PIN');
this.setOutput(true, Number);
}
};
export const pins_one_more = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.one_more), 'PIN');
this.setOutput(true);
}
};
export const pins_digital_dot = {
init: function () {
this.setColour(PINS_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(Profile.default.digital_dot), 'PIN');
this.setOutput(true, Number);
}
};

View File

@@ -0,0 +1,870 @@
import * as Blockly from 'blockly/core';
import { sensor_LTR308 } from './sensor_onboard';
const SENSOR_HUE = 40; //'#9e77c9'//40;
export const sensor_mixgo_button_is_pressed = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('btn')
.appendField(Blockly.Msg.MIXLY_BUTTON)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_IS_PRESSED);
this.setOutput(true, Boolean);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_SENOR_IS_PRESSED);
}
};
export const sensor_mixgo_button_was_pressed = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('btn')
.appendField(Blockly.Msg.MIXLY_BUTTON)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_WAS_PRESSED);
this.setOutput(true, Boolean);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_SENOR_WAS_PRESSED);
}
};
export const sensor_mixgo_button_get_presses = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('btn')
.appendField(Blockly.Msg.MIXLY_BUTTON)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET_PRESSES);
this.appendValueInput('VAR')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_GET_PRESSES_TIME);
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + Blockly.Msg.MIXLY_BUTTON + Blockly.Msg.MIXLY_GET_PRESSES);
}
};
export const sensor_mixgo_button_attachInterrupt = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput("btn")
.appendField(Blockly.Msg.MIXLY_ESP32_INTERRUPT)
.appendField(Blockly.Msg.MIXLY_BUTTON)
.setCheck(Number);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MODE)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_RISING, "machine.Pin.IRQ_RISING"], [Blockly.Msg.MIXLY_FALLING, "machine.Pin.IRQ_FALLING"], [Blockly.Msg.MIXLY_CHANGE, "(machine.Pin.IRQ_RISING or machine.Pin.IRQ_FALLING)"]]), "mode");
this.appendValueInput('DO')
.appendField(Blockly.Msg.MIXLY_DO)
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_ATTACHINTERRUPT);
}
};
export const sensor_mixgo_extern_button_is_pressed = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_BUTTON)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_IS_PRESSED);
this.appendValueInput("STAT")
.appendField(Blockly.Msg.MIXLY_ELECLEVEL);
this.setOutput(true, Boolean);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_SENOR_IS_PRESSED);
}
};
export const sensor_mixgo_extern_button_was_pressed = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_BUTTON)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_WAS_PRESSED);
this.appendValueInput("STAT")
.appendField(Blockly.Msg.MIXLY_ELECLEVEL);
this.setOutput(true, Boolean);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_SENOR_WAS_PRESSED);
}
};
export const sensor_mixgo_extern_button_get_presses = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_BUTTON)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GET_PRESSES);
this.appendValueInput('VAR')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_GET_PRESSES_TIME);
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + Blockly.Msg.MIXLY_BUTTON + Blockly.Msg.MIXLY_GET_PRESSES);
}
};
export const sensor_mixgo_extern_button_attachInterrupt = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_BUTTON)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MODE)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_RISING, "machine.Pin.IRQ_RISING"], [Blockly.Msg.MIXLY_FALLING, "machine.Pin.IRQ_FALLING"], [Blockly.Msg.MIXLY_CHANGE, "(machine.Pin.IRQ_RISING or machine.Pin.IRQ_FALLING)"]]), "mode");
this.appendValueInput('DO')
.appendField(Blockly.Msg.MIXLY_DO)
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_ATTACHINTERRUPT);
}
};
export const sensor_mpu9250_attachGestureInterrupt = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('SUB')
.appendField("MPU9250")
.setCheck("var");
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT_GESTURE)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_MICROBIT_shake, "shake"], [Blockly.Msg.MIXLY_UP, "up"], [Blockly.Msg.MIXLY_DOWN, "down"], [Blockly.Msg.MIXLY_LEFT, "left"], [Blockly.Msg.MIXLY_RIGHT, "right"], [Blockly.Msg.MIXLY_MICROBIT_face_up, "face up"], [Blockly.Msg.MIXLY_MICROBIT_face_down, "face down"], [Blockly.Msg.MIXLY_MICROBIT_freefall, "freefall"], ["3g", "3g"], ["6g", "6g"], ["8g", "8g"]]), "gesture");
this.appendStatementInput('DO')
.appendField(Blockly.Msg.MIXLY_DO);
this.setPreviousStatement(true);
this.setNextStatement(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('gesture');
var mode0 = Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT;
var mode1 = Blockly.Msg.MSG.catSensor;
var mode2 = Blockly.Msg.MIXLY_MICROBIT_JS_STATE;
var mode3 = Blockly.Msg.MIXLY_MICROBIT_PERFORMANCE
var TOOLTIPS = {
'shake': Blockly.Msg.MIXLY_MICROBIT_shake,
'up': Blockly.Msg.MIXLY_UP,
'down': Blockly.Msg.MIXLY_DOWN,
'left': Blockly.Msg.MIXLY_LEFT,
'right': Blockly.Msg.MIXLY_RIGHT,
'face up': Blockly.Msg.MIXLY_MICROBIT_face_up,
'face down': Blockly.Msg.MIXLY_MICROBIT_face_down,
'freefall': Blockly.Msg.MIXLY_MICROBIT_freefall,
'3g': '3g',
'6g': '6g',
'8g': '8g'
};
return mode0 + mode1 + mode2 + TOOLTIPS[mode] + mode3;
});
}
};
export const sensor_mpu9250_gesture = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('SUB')
.appendField("MPU9250")
.setCheck("var");
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT_GESTURE)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_MICROBIT_shake, "shake"], [Blockly.Msg.MIXLY_UP, "up"], [Blockly.Msg.MIXLY_DOWN, "down"], [Blockly.Msg.MIXLY_LEFT, "left"], [Blockly.Msg.MIXLY_RIGHT, "right"], [Blockly.Msg.MIXLY_MICROBIT_face_up, "face up"], [Blockly.Msg.MIXLY_MICROBIT_face_down, "face down"]]), "gesture");
this.setOutput(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('gesture');
var mode0 = Blockly.Msg.MIXLY_MICROBIT_JS_CURRENT;
var mode1 = Blockly.Msg.MSG.catSensor;
var mode2 = Blockly.Msg.MIXLY_MICROBIT_JS_STATE;
var mode3 = Blockly.Msg.MIXLY_MICROBIT_PERFORMANCE
var TOOLTIPS = {
'shake': Blockly.Msg.MIXLY_MICROBIT_shake,
'up': Blockly.Msg.MIXLY_UP,
'down': Blockly.Msg.MIXLY_DOWN,
'left': Blockly.Msg.MIXLY_LEFT,
'right': Blockly.Msg.MIXLY_RIGHT,
'face up': Blockly.Msg.MIXLY_MICROBIT_face_up,
'face down': Blockly.Msg.MIXLY_MICROBIT_face_down,
// 'freefall':Blockly.Msg.MIXLY_MICROBIT_freefall,
// '3g': '3g',
// '6g': '6g',
// '8g': '8g'
};
return mode0 + mode1 + mode2 + TOOLTIPS[mode] + mode3;
});
}
};
export const sensor_mpu9250_get_acceleration = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('SUB')
.appendField("MPU9250")
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_ACCELERATION)
.appendField(new Blockly.FieldDropdown([
["x", "x"],
["y", "y"],
["z", "z"],
["(x,y,z)", "values"]
]), "key");
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_ACCELERATION);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('key');
var mode0 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET;
var mode1 = Blockly.Msg.MIXLY_MICROBIT_Direction;
var mode2 = Blockly.Msg.MIXLY_MICROBIT_JS_ACCELERATION1;
var TOOLTIPS = {
'x': 'x',
'y': 'y',
'z': 'z',
'(x,y,z)': Blockly.Msg.MIXLY_MICROBIT_Shiliang_Direction,
};
return mode0 + TOOLTIPS[mode] + mode1 + mode2;
});
}
};
export const sensor_adxl345_get_acceleration = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('SUB')
.appendField(Blockly.Msg.MIXLY_ADXL345)
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_ACCELERATION)
.appendField(new Blockly.FieldDropdown([
["x", "x"],
["y", "y"],
["z", "z"],
["(x,y,z)", "values"]
]), "key");
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_ACCELERATION);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('key');
var mode0 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET;
var mode1 = Blockly.Msg.MIXLY_MICROBIT_Direction;
var mode2 = Blockly.Msg.MIXLY_MICROBIT_JS_ACCELERATION1;
var TOOLTIPS = {
'x': 'x',
'y': 'y',
'z': 'z',
'(x,y,z)': Blockly.Msg.MIXLY_MICROBIT_Shiliang_Direction,
};
return mode0 + TOOLTIPS[mode] + mode1 + mode2;
});
}
};
export const sensor_light_level = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_LIGHT_LEVEL)
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SENSOR_LIGHT_LEVEL_TOOLTIP);
}
};
export const sensor_mpu9250_calibrate_compass = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('SUB')
.appendField("MPU9250")
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_CALIBRATE_COMPASS)
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_CALIBRATE_COMPASS);
}
};
// export const sensor_mpu9250_is_compass_calibrated = {
// init: function(){
// this.setColour(SENSOR_HUE);
// this.appendValueInput('SUB')
// .setCheck("var");
// this.appendDummyInput()
// .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_IS_COMPASS_CALIBRATED)
// this.setOutput(true, Number);
// this.setInputsInline(true);
// this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_IS_COMPASS_CALIBRATED1);
// }
// };
// export const sensor_mpu9250_compass_heading = {
// init: function(){
// this.setColour(SENSOR_HUE);
// this.appendValueInput('SUB')
// .setCheck("var");
// this.appendDummyInput()
// .appendField(Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE)
// this.setOutput(true, Number);
// this.setInputsInline(true);
// }
// };
export const sensor_mpu9250_temperature = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('SUB')
.appendField("MPU9250")
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_GETTEMPERATUE)
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_GETTEMPERATUE);
}
};
export const sensor_mpu9250_field_strength = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('SUB')
.appendField("MPU9250")
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_GET_COMPASS)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_MICROBIT_JS_FIELD_STRENGTH, 'strength'], [Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE, 'heading']]), 'compass');
this.setOutput(true, Number);
this.setInputsInline(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('compass');
var mode0 = Blockly.Msg.MIXLY_MICROBIT_JS_GET_COMPASS;
var TOOLTIPS = {
'strength': Blockly.Msg.MIXLY_MICROBIT_JS_FIELD_STRENGTH,
'heading': Blockly.Msg.MIXLY_MICROBIT_JS_BY_ANGLE
};
return mode0 + TOOLTIPS[mode];
});
}
};
export const sensor_distance_hrsc04 = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_CHAOSHENGBO)
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_CHAOSHENGBO);
}
};
//传感器-实时时钟块_获取时间
export const RTC_get_time = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('SUB')
.appendField("RTC")
.setCheck("var");
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RTCGETTIME);
// this.appendDummyInput("").setAlign(Blockly.inputs.Align.RIGHT).appendField('myRTC');
// this.appendDummyInput("").setAlign(Blockly.inputs.Align.RIGHT).appendField(new Blockly.FieldDropdown(RTC_TIME_TYPE), "TIME_TYPE");
this.setInputsInline(true);
this.setOutput(true, Number);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_RTC_GET_TIME_TOOLTIP);
// var thisBlock = this;
// this.setTooltip(function() {
// var mode = thisBlock.getFieldValue('TIME_TYPE');
// var mode0 = Blockly.Msg.MIXLY_RTCGETTIME;
// var TOOLTIPS = {
// 'Year':Blockly.Msg.MIXLY_YEAR,
// 'Month':Blockly.Msg.MIXLY_MONTH,
// 'Day':Blockly.Msg.MIXLY_DAY,
// 'Hour':Blockly.Msg.MIXLY_HOUR,
// 'Minute':Blockly.Msg.MIXLY_MINUTE,
// 'Second':Blockly.Msg.MIXLY_SECOND,
// 'Week':Blockly.Msg.MIXLY_WEEK,
// 'Mix1':Blockly.Msg.MIXLY_MIX1,
// 'Mix2':Blockly.Msg.MIXLY_MIX2
// };
// return mode0 +TOOLTIPS[mode];
// });
}
};
export const RTC_set_time = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput("")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RTCSETTIME)
.appendField('myRTC');
this.appendValueInput("hour")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(" " + Blockly.Msg.MIXLY_HOUR);
this.appendValueInput("minute")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(" " + Blockly.Msg.MIXLY_MINUTE);
this.appendValueInput("second")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(" " + Blockly.Msg.MIXLY_SECOND);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(false);
this.setTooltip(Blockly.Msg.MIXLY_RTCSETTIME + Blockly.Msg.MIXLY_MIX2);
}
};
export const RTC_set_date = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput("")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RTCSETDATE)
.appendField('myRTC');
this.appendValueInput("year")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(" " + Blockly.Msg.MIXLY_YEAR);
this.appendValueInput("month")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(" " + Blockly.Msg.MIXLY_MONTH);
this.appendValueInput("day")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(" " + Blockly.Msg.MIXLY_DAY);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_RTCSETDATE + Blockly.Msg.MIXLY_MIX1);
}
};
export const sensor_compass_reset = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('SUB')
.appendField("MPU9250")
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_Reset_COMPASS)
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Reset_COMPASS);
}
};
export const HCSR04 = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_CHAOSHENGBO);
this.appendValueInput("PIN1", Number)
.appendField('Trig #')
.setCheck(Number);
this.appendValueInput("PIN2", Number)
.appendField('Echo #')
.setCheck(Number);
this.setInputsInline(true);
this.setOutput(true, Number);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_BLOCKGROUP_CHAOSHENGBO);
}
};
export const sensor_dht11 = {
init: function () {
var WHAT = [[Blockly.Msg.MIXLY_GETTEMPERATUE, 'temperature'], [Blockly.Msg.MIXLY_GETHUMIDITY, 'relative_humidity'], [Blockly.Msg.MIXLY_DHT11_T_H, 'tempandhum']];
this.setColour(SENSOR_HUE);
this.appendValueInput("PIN", Number)
.appendField(new Blockly.FieldDropdown([['DHT11', 'dht11']
, ['DHT22', 'dht22']//, ['DHT21', '21'], ['DHT33', '33'], ['DHT44', '44']
]), 'TYPE')
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown(WHAT), "WHAT");
this.setOutput(true, Number);
var thisBlock = this;
this.setTooltip(function () {
var op = thisBlock.getFieldValue('WHAT');
var TOOLTIPS = {
'temperature': Blockly.Msg.MIXLY_TOOLTIP_BLOCKGROUP_GET_TEM,
'relative_humidity': Blockly.Msg.MIXLY_TOOLTIP_BLOCKGROUP_GET_HUM,
'tempandhum': Blockly.Msg.MIXLY_TOOLTIP_BLOCKGROUP_GET_TEM_HUM
};
return TOOLTIPS[op];
});
}
};
export const sensor_mixgo_extern_light = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_EXTERN_LIGHT);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_EXTERN_VALUE);
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.ESP32_SENSOR_NIXGO_LIGHT_TOOLTIP);
}
};
export const sensor_mixgo_extern_sound = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_EXTERN_SOUND);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_EXTERN_VALUE);
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.ESP32_SENSOR_NIXGO_SOUND_TOOLTIP);
}
};
export const number1 = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([["1", "touch1"], ["2", "touch2"]]), 'op')
this.setOutput(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_INOUT_HIGHLOW);
}
};
export const sensor_mixgo_pin_pressed = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput("button")
.appendField(Blockly.Msg.MIXLY_ESP32_TOUCH_SENSOR)
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_IS_TOUCHED);
this.setOutput(true, Boolean);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_sensor_pin_pressed);
}
};
export const sensor_mixgo_extern_pin_near = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_EXTERN_NEAR);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_EXTERN_VALUE);
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SENSOR_MIXGO_PIN_NEAR_TOOLTIP + Blockly.Msg.MIXLY_ESP32_NEAR);
}
};
export const sensor_mixgo_pin_near = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.TEXT_TRIM_LEFT, "left"], [Blockly.Msg.TEXT_TRIM_RIGHT, "right"]]), "direction")
.appendField(Blockly.Msg.MIXLY_ESP32_NEAR);
this.setOutput(true, Number);
this.setInputsInline(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('direction');
var mode0 = Blockly.Msg.MIXLY_ESP32_SENSOR_MIXGO_PIN_NEAR_TOOLTIP;
var mode1 = Blockly.Msg.MIXLY_ESP32_NEAR;
var TOOLTIPS = {
'left': Blockly.Msg.TEXT_TRIM_LEFT,
'right': Blockly.Msg.TEXT_TRIM_RIGHT,
};
return mode0 + TOOLTIPS[mode] + mode1
});
}
};
export const RTC_set_datetime = {
init: function () {
this.setColour(SENSOR_HUE);
// this.appendDummyInput()
this.appendValueInput('SUB')
.appendField("RTC")
.appendField(Blockly.Msg.MIXLY_RTC_TIME)
.setCheck("var");
this.appendValueInput('year')
.setCheck(Number)
.appendField(" " + Blockly.Msg.MIXLY_YEAR);
this.appendValueInput('month')
.setCheck(Number)
.appendField(" " + Blockly.Msg.MIXLY_MONTH);
this.appendValueInput('day')
.setCheck(Number)
.appendField(" " + Blockly.Msg.MIXLY_DAY);
this.appendValueInput('weekday')
.setCheck(Number)
.appendField(" " +
Blockly.Msg.MIXLY_WEEK2);
this.appendValueInput('hour')
.setCheck(Number)
.appendField(" " + Blockly.Msg.MIXLY_HOUR);
this.appendValueInput('minute')
.setCheck(Number)
.appendField(" " + Blockly.Msg.MIXLY_MINUTE);
this.appendValueInput('second')
.setCheck(Number)
.appendField(" " + Blockly.Msg.MIXLY_SECOND);
this.appendValueInput('millisecond')
.setCheck(Number)
.appendField(" " + Blockly.Msg.MIXLY_MILLISECOND);
this.setInputsInline(false);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_RTC_SET_DATATIME_TOOLTIP);
}
};
export const sensor_rtc_init = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput("")
.appendField("RTC")
this.appendValueInput('SUB')
.appendField(Blockly.Msg.MIXLY_SETUP)
.setCheck("var");
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SENSOR_RTC_INT_TOOLTIP);
}
};
export const sensor_use_i2c_init = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('I2CSUB')
.appendField(Blockly.Msg.CONTROLS_FOR_INPUT_WITH + "I2C")
.setCheck("var");
this.appendValueInput('SUB')
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE)
.setCheck("var");
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_SETUP + Blockly.Msg.LISTS_SET_INDEX_INPUT_TO)
.appendField(new Blockly.FieldDropdown([
["MPU9250", "MPU9250"],
["BMP280", "BMP280"],
["SHT20", "SHT20"],
["ADXL345", "ADXL345"]
]), "key");
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setFieldValue("MPU9250", "key");
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('key');
var mode0 = Blockly.Msg.MIXLY_ESP32_SENSOR_USE_I2C_TOOLTIP;
var TOOLTIPS = {
"MPU9250": "MPU9250",
"SHT20": "SHT20",
"BMP280": "BMP280",
"ADXL345": "ADXL345"
};
return mode0 + TOOLTIPS[mode]
});
}
};
export const sensor_bmp = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('SUB')
.appendField("BMP280")
.setCheck("var");
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_GETTEMPERATUE, "get_BMP_temperature()"],
[Blockly.Msg.MIXLY_GETPRESSURE, "get_BMP_pressure()"]
]), "key");
this.setOutput(true, Number);
this.setInputsInline(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('key');
var TOOLTIPS = {
"get_BMP_temperature()": Blockly.Msg.MIXLY_MICROBIT_SENSOR_BMP_temperature_TOOLTIP,
"get_BMP_pressure()": Blockly.Msg.MIXLY_MICROBIT_SENSOR_BMP_press_TOOLTIP,
};
return TOOLTIPS[mode]
});
}
};
export const sensor_sht = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('SUB')
.appendField("SHT20")
.setCheck("var");
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_GETTEMPERATUE, "get_SHT_temperature()"],
[Blockly.Msg.MIXLY_GETHUMIDITY, "get_SHT_relative_humidity()"]
]), "key");
this.setOutput(true, Number);
this.setInputsInline(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('key');
var TOOLTIPS = {
"get_SHT_temperature()": Blockly.Msg.MIXLY_MICROBIT_SENSOR_SHT_temperature_TOOLTIP,
"get_SHT_relative_humidity()": Blockly.Msg.MIXLY_MICROBIT_SENSOR_SHT_HUM_TOOLTIP,
};
return TOOLTIPS[mode]
});
}
};
export const sensor_ds18x20 = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput("PIN", Number)
.appendField("DS18x20 " + Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_GETTEMPERATUE);
this.setInputsInline(true);
this.setOutput(true, Number);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_SENSOR_DS18X20_TOOLTIP);
}
};
export const sensor_mpu9250_get_magnetic = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('SUB')
.appendField("MPU9250")
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_GET + Blockly.Msg.MIXLY_MICROBIT_JS_FIELD_STRENGTH)
.appendField(new Blockly.FieldDropdown([
["x", "x"],
["y", "y"],
["z", "z"],
["(x,y,z)", "values"]
]), "key");
this.setOutput(true, Number);
this.setInputsInline(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('key');
var mode0 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET;
var mode1 = Blockly.Msg.MIXLY_MICROBIT_Direction;
var mode2 = Blockly.Msg.MIXLY_MICROBIT_JS_FIELD_STRENGTH;
var TOOLTIPS = {
'x': 'x',
'y': 'y',
'z': 'z',
'(x,y,z)': Blockly.Msg.MIXLY_MICROBIT_Shiliang_Direction,
};
return mode0 + TOOLTIPS[mode] + mode1 + mode2;
});
}
};
export const sensor_mpu9250_get_gyro = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('SUB')
.appendField("MPU9250")
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET + Blockly.Msg.MIXLY_ESP32_SENOR_GYRO)
.appendField(new Blockly.FieldDropdown([
["x", "x"],
["y", "y"],
["z", "z"],
["(x,y,z)", "values"]
]), "key");
this.setOutput(true, Number);
this.setInputsInline(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('key');
var mode0 = Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET;
var mode1 = Blockly.Msg.MIXLY_MICROBIT_Direction;
var mode2 = Blockly.Msg.MIXLY_ESP32_SENOR_GYRO;
var TOOLTIPS = {
'x': 'x',
'y': 'y',
'z': 'z',
'(x,y,z)': Blockly.Msg.MIXLY_MICROBIT_Shiliang_Direction,
};
return mode0 + TOOLTIPS[mode] + mode1 + mode2;
});
}
};
export const sensor_lm35 = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput("")
.appendField("LM35" + Blockly.Msg.MIXLY_TEMP);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_GETTEMPERATUE);
this.setInputsInline(true);
this.setOutput(true, Number);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_LM35);
}
};
export const sensor_button_is_pressed = sensor_mixgo_button_is_pressed;
export const sensor_button_was_pressed = sensor_mixgo_button_was_pressed;
export const sensor_button_get_presses = sensor_mixgo_button_get_presses;
export const sensor_pin_pressed = sensor_mixgo_pin_pressed;
export const sensor_pin_near = sensor_mixgo_pin_near;
export const sensor_mixgo_light = sensor_LTR308;
export const sensor_light = sensor_mixgo_light;
export const sensor_get_acceleration = sensor_mpu9250_get_acceleration;
export const dht11 = sensor_dht11;
export const sensor_field_strength = sensor_mpu9250_field_strength;
export const sensor_temperature = sensor_mpu9250_temperature

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,383 @@
import * as Blockly from 'blockly/core';
const SERIAL_HUE = 65; //'#58a8de'//65;
export const serial_print_byte = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput("CONTENT", String)
.appendField("Serial")
.appendField(new Blockly.FieldDropdown([['uart1', '1'], ['uart2', '2']]), 'mode')
.appendField(Blockly.Msg.MIXLY_SERIAL_WRITE + '(' + Blockly.Msg.LANG_MATH_BYTE + ')');
//this.setFieldValue('1','mode')
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.TEXT_PRINT_TOOLTIP);
}
};
export const serial_print = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput("CONTENT", String)
.appendField("Serial")
.appendField(new Blockly.FieldDropdown([['uart1', '1'], ['uart2', '2']]), 'mode')
.appendField(Blockly.Msg.MIXLY_SERIAL_PRINT);
//this.setFieldValue('1','mode')
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.TEXT_PRINT_TOOLTIP);
}
};
export const serial_println = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput("CONTENT", String)
.appendField("Serial")
.appendField(new Blockly.FieldDropdown([['uart1', '1'], ['uart2', '2']]), 'mode')
.appendField(Blockly.Msg.MIXLY_SERIAL_PRINTLN);
//this.setFieldValue('1','mode')
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.TEXT_PRINT_Huanhang_TOOLTIP + Blockly.Msg.TEXT_PRINT_TOOLTIP);
}
};
//打印16进制数
export const serial_print_hex = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendDummyInput()
.appendField("Serial")
.appendField(new Blockly.FieldDropdown([['uart1', '1'], ['uart2', '2']]), 'mode')
.appendField(Blockly.Msg.MIXLY_SERIAL_PRINTLN);
this.appendValueInput("CONTENT", Number)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MATH_BIN, "bin"], [Blockly.Msg.MATH_OCT, "oct"], [Blockly.Msg.MATH_DEC, "int"], [Blockly.Msg.MATH_HEX, "hex"]]), "STAT")
.setCheck(Number);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setFieldValue('hex', 'STAT')
this.setTooltip(Blockly.Msg.TEXT_PRINT_HEX_TOOLTIP);
}
};
export const serial_receive_data_event = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput('char_marker')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_SERIAL_WHEN_CONTAIN_DATA)
this.appendStatementInput('DO')
.appendField(Blockly.Msg.MIXLY_DO);
}
};
export const serial_readstr = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendDummyInput()
.appendField("Serial")
.appendField(new Blockly.FieldDropdown([['uart1', '1'], ['uart2', '2']]), 'mode')
.appendField(Blockly.Msg.MIXLY_SERIAL_READSTR);
//this.setFieldValue('1','mode')
this.setOutput(true, String);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_BLOCKGROUP_SERIAL_READ_STR);
}
};
export const serial_any = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendDummyInput()
.appendField("Serial")
.appendField(new Blockly.FieldDropdown([['uart1', '1'], ['uart2', '2']]), 'mode')
.appendField(Blockly.Msg.MIXLY_SERIAL_AVAILABLE);
//this.setFieldValue('1','mode')
this.setOutput(true, Boolean);
this.setTooltip(Blockly.Msg.MIXLY_SERIAL_AVAILABLE1);
}
};
export const serial_readline = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendDummyInput()
.appendField("Serial")
.appendField(new Blockly.FieldDropdown([['uart1', '1'], ['uart2', '2']]), 'mode')
.appendField(Blockly.Msg.MIXLY_ESP32_READ_LINE);
//this.setFieldValue('1','mode')
this.setOutput(true, String);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_SERIAL_READ_LINE1);
}
};
export const serial_readstr_until = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendDummyInput()
.appendField("Serial " + Blockly.Msg.MIXLY_SERIAL_READSTR_UNTIL)
.appendField(new Blockly.FieldDropdown([
["new line", "serial.delimiters(Delimiters.NewLine)"],
[",", "serial.delimiters(Delimiters.Comma)"],
["$", "serial.delimiters(Delimiters.Dollar)"],
[":", "serial.delimiters(Delimiters.Colon)"],
[".", "serial.delimiters(Delimiters.Fullstop)"],
["#", "serial.delimiters(Delimiters.Hash)"]
]), "char_marker");
this.setInputsInline(true);
this.setOutput(true, String);
}
};
export const serial_softserial_new = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput("RX")
.appendField(Blockly.Msg.MIXLY_SETUP)
.appendField(new Blockly.FieldDropdown([['uart1', '1'], ['uart2', '2']]), 'mode')
.appendField("RX#")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("TX")
.appendField("TX#")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SERIAL_BEGIN)
.appendField(new Blockly.FieldDropdown([['115200', '115200'], ['57600', '57600'], ['37400', '38400'], ['31250', '31250'], ['28800', '28800'], ['19200', '19200'], ['14400', '14400'], ['9600', '9600'], ['4800', '4800'], ['2400', '2400'], ['1200', '1200'], ['300', '300']]), 'baudrate');
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_SERIAL_softserial);
}
};
export const serial_softserial = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SETUP)
.appendField(new Blockly.FieldDropdown([['uart1 (RX=23,TX=19)', '1'], ['uart2 (RX=5,TX=18)', '2']]), 'mode');
//this.setFieldValue('1','mode')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SERIAL_BEGIN)
.appendField(new Blockly.FieldDropdown([['115200', '115200'], ['57600', '57600'], ['37400', '38400'], ['31250', '31250'], ['28800', '28800'], ['19200', '19200'], ['14400', '14400'], ['9600', '9600'], ['4800', '4800'], ['2400', '2400'], ['1200', '1200'], ['300', '300']]), 'baudrate');
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_SERIAL_softserial);
}
};
export const serial_begin = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendDummyInput()
.appendField("Serial " + Blockly.Msg.MIXLY_SERIAL_BEGIN)
.appendField(new Blockly.FieldDropdown([['115200', '115200'], ['57600', '57600'], ['37400', '38400'], ['31250', '31250'], ['28800', '28800'], ['19200', '19200'], ['14400', '14400'], ['9600', '9600'], ['4800', '4800'], ['2400', '2400'], ['1200', '1200'], ['300', '300']]), 'baudrate');
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.LISTS_SET_INDEX_SET + Blockly.Msg.MIXLY_SERIAL_BEGIN);
}
};
export const system_input = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput("VAR")
.appendField(Blockly.Msg.blockpy_inout_raw_input)
.setCheck(String);
this.setOutput(true);
this.setTooltip(Blockly.Msg.INOUT_input_TOOLTIP);
}
}
export const system_print = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput("VAR")
.appendField(Blockly.Msg.MIXLY_SERIAL_PRINTLN);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.BLOCKPY_PRINT_TOOLTIP);
}
};
export const system_print_inline = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput("VAR")
.appendField(Blockly.Msg.MIXLY_SERIAL_PRINT);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.TEXT_PRINT_TOOLTIP);
}
};
export const system_print_end = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput("VAR")
.appendField(Blockly.Msg.MIXLY_SERIAL_PRINT);
this.appendValueInput("END")
.appendField(Blockly.Msg.MIXLY_ENDSWITH);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_PYTHON_INOUT_PRINT_END_TOOLTIP);
}
};
export const system_print_many = {
init: function () {
this.setColour(SERIAL_HUE);
this.itemCount_ = 2;
this.updateShape_();
this.setPreviousStatement(false);
this.setNextStatement(false);
this.setInputsInline(true);
this.setMutator(new Blockly.icons.MutatorIcon(['system_print_item'], this));
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_MIXPY_INOUT_PRINT_MANY_TOOLTIP);
},
mutationToDom: function () {
var container = document.createElement('mutation');
container.setAttribute('items', this.itemCount_);
return container;
},
domToMutation: function (xmlElement) {
this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10);
this.updateShape_();
},
decompose: function (workspace) {
var containerBlock =
workspace.newBlock('system_print_container');
containerBlock.initSvg();
var connection = containerBlock.getInput('STACK').connection;
for (var i = 0; i < this.itemCount_; i++) {
var itemBlock = workspace.newBlock('system_print_item');
itemBlock.initSvg();
connection.connect(itemBlock.previousConnection);
connection = itemBlock.nextConnection;
}
return containerBlock;
},
compose: function (containerBlock) {
var itemBlock = containerBlock.getInputTargetBlock('STACK');
// Count number of inputs.
var connections = [];
var i = 0;
while (itemBlock) {
connections[i] = itemBlock.valueConnection_;
itemBlock = itemBlock.nextConnection &&
itemBlock.nextConnection.targetBlock();
i++;
}
this.itemCount_ = i;
this.updateShape_();
// Reconnect any child blocks.
for (var i = 0; i < this.itemCount_; i++) {
if (connections[i]) {
this.getInput('ADD' + i)
.connection.connect(connections[i]);
}
}
},
saveConnections: function (containerBlock) {
var itemBlock = containerBlock.getInputTargetBlock('STACK');
var i = 0;
while (itemBlock) {
var input = this.getInput('ADD' + i);
itemBlock.valueConnection_ = input && input.connection.targetConnection;
i++;
itemBlock = itemBlock.nextConnection &&
itemBlock.nextConnection.targetBlock();
}
},
updateShape_: function () {
// Delete everything.
if (this.getInput('EMPTY')) {
this.removeInput('EMPTY');
} else {
var i = 0;
while (this.getInput('ADD' + i)) {
this.removeInput('ADD' + i);
i++;
}
}
// Rebuild block.
if (this.itemCount_ == 0) {
this.appendDummyInput('EMPTY')
.appendField(Blockly.Msg.MIXLY_MIXPY_INOUT_PRINT_EMPTY);
} else {
for (var i = 0; i < this.itemCount_; i++) {
var input = this.appendValueInput('ADD' + i);
if (i == 0) {
input.appendField(Blockly.Msg.MIXLY_SERIAL_PRINTLN);
}
}
}
}
};
export const system_print_container = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SERIAL_PRINTLN);
this.appendStatementInput('STACK');
this.setTooltip(Blockly.Msg.MIXLY_MIXPY_INOUT_PRINT_MANY_CONTAINER_TOOLTIP);
this.contextMenu = false;
}
};
export const system_print_item = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_MIXPY_INOUT_PRINT_MANY_ITEM_TOOLTIP);
this.contextMenu = false;
}
};
export const serial_send_to_ai = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput("CONTENT")
.appendField("Serial")
.appendField(new Blockly.FieldDropdown([['uart1', '1'], ['uart2', '2']]), 'mode')
.appendField(Blockly.Msg.MIXLY_EMQX_PUBLISH);
this.appendDummyInput()
.appendField(Blockly.Msg.LANG_CONTROLS_FOR_INPUT_TO + Blockly.Msg.MIXLY_OTHER + 'MP' + Blockly.Msg.MIXLY_DEVICE)
.appendField(Blockly.Msg.LANG_CONTROLS_WHILEUNTIL_TITLE_REPEAT)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_TRUE, 'True'], [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_FALSE, 'False']]), 'STAT')
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
}
};
export const serial_read_from_ai = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendDummyInput()
.appendField("Serial")
.appendField(new Blockly.FieldDropdown([['uart1', '1'], ['uart2', '2']]), 'mode')
.appendField(Blockly.Msg.MIXLY_ESP32_READ + Blockly.Msg.MIXLY_OTHER + 'MP' + Blockly.Msg.MIXLY_DEVICE + Blockly.Msg.MIXLY_SD_DATA);
this.setOutput(true, Boolean);
}
};

View File

@@ -0,0 +1,242 @@
import * as Blockly from 'blockly/core';
const SYSTEM_HUE = 120; //'#EB8045';
export const controls_delay_new = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_DELAY)
this.appendValueInput("DELAY_TIME", Number)
.setCheck(Number);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_SECOND, "s"], [Blockly.Msg.MIXLY_mSecond, "ms"], [Blockly.Msg.MIXLY_uSecond, "us"]]), 'Time');
this.setFieldValue('s', 'Time')
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_DELAY);
}
};
export const controls_delay = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_DELAY)
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_SECOND, "s"], [Blockly.Msg.MIXLY_mSecond, "ms"], [Blockly.Msg.MIXLY_uSecond, "us"]]), 'Time');
this.appendValueInput("DELAY_TIME", Number)
.setCheck(Number);
this.setFieldValue('ms', 'Time')
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_CONTROL_DELAY);
}
};
export const Panic_with_status_code = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendValueInput("STATUS_CODE", Number)
.appendField(Blockly.Msg.MIXLY_MICROBIT_Panic_with_status_code)
.setCheck(Number);
this.setPreviousStatement(true, null);
// this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Panic_with_status_code);
}
};
export const reset = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_Reset_micro);
this.setPreviousStatement(true);
// this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_Reset_micro);
}
};
export const controls_millis = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_RUNTIME);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_mSecond, "ms"], [Blockly.Msg.MIXLY_uSecond, "us"]]), 'Time');
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_CONTROLS_MILLIS_TOOLTIP);
}
};
export const raw_block = {
// Container.
init: function () {
this.setColour(SYSTEM_HUE);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.appendDummyInput()
.appendField('Code Block:');
this.appendDummyInput()
.appendField(new Blockly.FieldMultilineInput('12345'), 'TEXT');
}
};
export const controls_uname = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_CONTORL_UNAME);
this.setInputsInline(true);
this.setOutput(true);
this.setTooltip(Blockly.Msg.PROCEDURES_DEFRETURN_RETURN + Blockly.Msg.MIXLY_MICROBIT_PY_CONTORL_UNAME);
}
};
export const timer = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendValueInput('VAR')
.appendField("Timer")
.setCheck("var");
this.appendValueInput('period')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
// .appendField("Timer")
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_PERIOD_MIL);
this.appendValueInput('mode')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_MODE);
this.appendValueInput('callback')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.CONTROLS_REPEAT_INPUT_DO);
// this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_TIMER_TOOLTIP);
}
};
export const system_timer = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendValueInput('VAR')
.appendField("Timer")
.setCheck("var");
// .appendField("I2C " + Blockly.Msg.MIXLY_SETUP)
this.appendValueInput("period")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_PERIOD_MIL)
.setCheck(Number);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_mSecond)
.appendField(Blockly.Msg.MIXLY_MODE)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_PYTHON_ONE_SHOT, "ONE_SHOT"], [Blockly.Msg.MIXLY_PYTHON_PERIODIC, "PERIODIC"]]), "mode");
this.appendValueInput('callback')
.appendField(Blockly.Msg.MIXLY_DO)
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SYSTEM_TIMER_TOOLTIP);
}
};
export const system_ticks_diff = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendValueInput('END')
// .setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_ESP32_TIME_TICKS_DIFF);
this.appendValueInput('START')
// .setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_ESP32_TIME_MINUS);
this.setInputsInline(true);
this.setOutput(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SYSTEM_TICKS_DIFF_TOOLTIP);
}
};
export const system_timer_init = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendDummyInput("")
.appendField("Timer")
this.appendValueInput('SUB')
.appendField(Blockly.Msg.MIXLY_SETUP)
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SYSTEM_TIMER_INIT_TOOLTIP);
}
};
export const system_wdt_init = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MACHINE_WDT)
.appendField(Blockly.Msg.MIXLY_SETUP)
this.appendValueInput('period')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_MACHINE_WDT_TIMEOUT)
.setCheck(Number);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_mSecond)
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_MACHINE_WDT_INIT_TOOLTIP);
}
};
export const system_wdt_feed = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MACHINE_WDT)
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MACHINE_FEED)
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_MACHINE_WDT_FEED_TOOLTIP);
}
};
export const system_machine_reset = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MACHINE_RESET)
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_MACHINE_RESET_TOOLTIP);
}
};
export const system_bitbot_shutdown = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.BITBOT)
this.appendDummyInput("")
.appendField(Blockly.Msg.SHUTDOWN)
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MICROPYTHON_BITBOT_SHUTDOWN_TOOLTIP);
}
};
export const Timer_init = system_timer_init;
export const timer2 = system_timer;
export const time_ticks_diff = system_ticks_diff;
export const base_delay = controls_delay;

View File

@@ -0,0 +1,64 @@
import * as Blockly from 'blockly/core';
const WEATHER_HUE = '#27b6ac';
export const WEATHER_NOW = {
init: function () {
this.setColour(WEATHER_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MSG.catweather)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_WEATHER_NOW, "weather_now"],
[Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_WEATHER_ALARM, "weather_alarm"],
[Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_AIR_NOW, "air_now"],
[Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_TIDE_DAILY, "tide_daily"],
[Blockly.Msg.MIXLY_WEB_PLACE + Blockly.Msg.HTML_SEARCH, "location_search"]
]), "mode");
this.appendValueInput('key')
.appendField(Blockly.Msg.MIXLY_API_PRIVATE_KEY);
this.appendValueInput('addr')
.appendField(Blockly.Msg.MIXLY_GEOGRAPHIC_LOCATION);
this.setInputsInline(true);
this.setOutput(true);
}
};
export const WEATHER_DAILY = {
init: function () {
this.setColour(WEATHER_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MSG.catweather)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_WEATHER_DAILY, "weather_daily"],
[Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_LIFE_SUGGESTION, "life_suggestion"],
[Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_AIR_DAILY, "air_daily"],
[Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_GEO_SUN, "geo_sun"],
[Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_GEO_MOON, "geo_moon"]
]), "mode");
this.appendValueInput('key')
.appendField(Blockly.Msg.MIXLY_API_PRIVATE_KEY);
this.appendValueInput('addr')
.appendField(Blockly.Msg.MIXLY_GEOGRAPHIC_LOCATION);
this.appendValueInput('day')
.appendField(Blockly.Msg.MIXLY_WEB_DAILY);
this.setInputsInline(true);
this.setOutput(true);
}
};
export const WEATHER_HOUR = {
init: function () {
this.setColour(WEATHER_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MSG.catweather)
.appendField(Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_WEATHER_HOURS);
this.appendValueInput('key')
.appendField(Blockly.Msg.MIXLY_API_PRIVATE_KEY);
this.appendValueInput('addr')
.appendField(Blockly.Msg.MIXLY_GEOGRAPHIC_LOCATION);
this.appendValueInput('hour')
.appendField(Blockly.Msg.MIXLY_WEB_HOURS);
this.setInputsInline(true);
this.setOutput(true);
}
};

View File

@@ -0,0 +1,478 @@
'use strict';
pbc.moduleFunctionD.get('servo')['servo_write_angle'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 2) {
throw new Error("Incorrect number of arguments");
}
var pwmAstName = args[0]._astname;
pbc.pinType="pins_pwm_pin";
var pinblock;
if (pwmAstName === "Num") {
pinblock=py2block.convert(args[0])
}
pbc.pinType=null;
var angleblock=py2block.convert(args[1]);
return [block("servo_move", func.lineno, {}, {
"PIN":pinblock,
"DEGREE": angleblock,
}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('mixgo.led1')['setonoff'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType="number";
var ledblock = {
_astname: "Num",
n: {
'v': "1"
}
}
var mode = py2block.convert(ledblock);
pbc.pinType=null;
pbc.inScope="ledswitch";
var argblock = py2block.convert(args[0]);
pbc.inScope=null;
return [block("actuator_led_bright", func.lineno, {
}, {
'led': mode,
'bright':argblock,
}, {
"inline": "true"
}),
];
}
pbc.moduleFunctionD.get('mixgo.led2')['setonoff'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType="number";
var ledblock = {
_astname: "Num",
n: {
'v': "2"
}
}
var mode = py2block.convert(ledblock);
pbc.pinType=null;
pbc.inScope="ledswitch";
var argblock = py2block.convert(args[0]);
pbc.inScope=null;
return [block("actuator_led_bright", func.lineno, {
}, {
'led': mode,
'bright':argblock,
}, {
"inline": "true"
}),
];
}
pbc.moduleFunctionD.get('mixgo.led1')['getonoff'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType="number";
var ledblock = {
_astname: "Num",
n: {
'v': "1"
}
}
var mode = py2block.convert(ledblock);
pbc.pinType=null;
return block("actuator_get_led_bright", func.lineno, {
}, {
'led': mode,
}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('mixgo.led2')['getonoff'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType="number";
var ledblock = {
_astname: "Num",
n: {
'v': "2"
}
}
var mode = py2block.convert(ledblock);
pbc.pinType=null;
return block("actuator_get_led_bright", func.lineno, {
}, {
'led': mode,
}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('mixgo.led1')['setbrightness'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType="number";
var ledblock = {
_astname: "Num",
n: {
'v': "1"
}
}
var mode = py2block.convert(ledblock);
pbc.pinType=null;
var brightblock = py2block.convert(args[0]);
return [block("actuator_led_brightness", func.lineno, {}, {
'led': mode,
'bright':brightblock,
}, {
"inline": "true"
}),
];
}
pbc.moduleFunctionD.get('mixgo.led2')['setbrightness'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType="number";
var ledblock = {
_astname: "Num",
n: {
'v': "2"
}
}
var mode = py2block.convert(ledblock);
pbc.pinType=null;
var brightblock = py2block.convert(args[0]);
return [block("actuator_led_brightness", func.lineno, {}, {
'led': mode,
'bright':brightblock,
}, {
"inline": "true"
}),
];
}
pbc.moduleFunctionD.get('music')['pitch'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if(args.length!==1 && args.length!==2){
throw new Error("Incorrect number of arguments");
}
if (args.length === 2) {
pbc.pinType = "pins_pwm_pin";
var pinblock = py2block.convert(args[0]);
pbc.pinType=null;
pbc.pinType = "pins_tone_notes";
var pitchblock = py2block.convert(args[1]);
pbc.pinType=null;
return [block("esp32_music_pitch", func.lineno, {}, {
'pitch': pitchblock,
'PIN': pinblock,
}, {
"inline": "true"
})];
}
else if (args.length=== 1){
pbc.pinType = "pins_tone_notes";
var pitchblock = py2block.convert(args[0]);
pbc.pinType=null;
return [block("esp32_onboard_music_pitch", func.lineno, {}, {
'pitch': pitchblock,
}, {
"inline": "true"
})];
}
}
pbc.moduleFunctionD.get('music')['pitch_time'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if(args.length!==2 && args.length!==3){
throw new Error("Incorrect number of arguments");
}
if (args.length === 2) {
pbc.pinType = "pins_tone_notes";
var pitchblock = py2block.convert(args[0]);
pbc.pinType=null;
var timeblock=py2block.convert(args[1]);
return [block("esp32_onboard_music_pitch_with_time", func.lineno, {}, {
'pitch': pitchblock,
"time":timeblock
}, {
"inline": "true"
})];
}
else if (args.length=== 3){
pbc.pinType = "pins_pwm_pin";
var pinblock = py2block.convert(args[0]);
pbc.pinType=null;
pbc.pinType = "pins_tone_notes";
var pitchblock = py2block.convert(args[1]);
pbc.pinType=null;
var timeblock=py2block.convert(args[2]);
return [block("esp32_music_pitch_with_time", func.lineno, {}, {
'pitch': pitchblock,
'PIN': pinblock,
"time":timeblock
}, {
"inline": "true"
})];
}
}
pbc.moduleFunctionD.get('music')['stop'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1 && args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
if (args.length == 1){
pbc.pinType = "pins_pwm_pin";
var argblock = py2block.convert(args[0]);
pbc.pinType = null;
return [block("esp32_music_stop", func.lineno, {}, {
'PIN': argblock
}, {
"inline": "true"
})];
}
if (args.length == 0){
return [block("esp32_onboard_music_stop", func.lineno, {}, {}, {
"inline": "true"
})];
}
}
pbc.moduleFunctionD.get('music')['play'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 2 && args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
if(args.length == 2){
pbc.pinType = "pins_playlist_pin";
var nameblock= py2block.convert(args[0]);
pbc.pinType = "pins_pwm_pin";
var argblock = py2block.convert(args[1]);
pbc.pinType = null;
return [block("esp32_music_play_list", func.lineno, {}, {
"LIST":nameblock,
'PIN': argblock
}, {
"inline": "true"
})];
}
if(args.length == 1){
pbc.pinType = "pins_playlist_pin";
var nameblock= py2block.convert(args[0]);
pbc.pinType = null;
return [block("esp32_onboard_music_play_list", func.lineno, {}, {
"LIST":nameblock,
}, {
"inline": "true"
})];
}
}
pbc.moduleFunctionD.get('music')['play_show'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 2) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType = "pins_playlist_pin";
var nameblock= py2block.convert(args[0]);
pbc.pinType = "pins_pwm_pin";
var argblock = py2block.convert(args[1]);
pbc.pinType = null;
return [block("esp32_mixgo_music_play_list_show", func.lineno, {}, {
"LIST":nameblock,
'PIN': argblock
}, {
"inline": "true"
})];
}
pbc.assignD.get('Rgb')['check_assign'] = function(py2block, node, targets, value) {
var funcName = py2block.identifier(value.func.attr);
var moduleName=py2block.identifier(value.func.value.id);
if(value._astname === "Call" && moduleName === "neopixel"
&& funcName === "NeoPixel" && value.args.length === 2&&value.keywords.length===1)
return true;
return false;
}
pbc.assignD.get('Rgb')['create_block'] = function(py2block, node, targets, value){
var rgbblock=py2block.convert(targets[0]);
pbc.inScope = "rgb_create_block";
pbc.pinType = "pins_digital_pin";
// value.args[0].args[0].n.v='pin'+value.args[0].args[0].n.v
var pinblock = py2block.convert(value.args[0].args[0]);
pbc.inScope = null;
pbc.pinType = null;
var countblock = py2block.convert(value.args[1]);
return block("actuator_neopixel_init", node.lineno, {}, {
"SUB":rgbblock,
"PIN":pinblock,
"LEDCOUNT":countblock
});
}
pbc.moduleFunctionD.get('rgb')['write'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if(args.length!=0){
throw new Error("Incorrect number of arguments");
}
var rgbblock=py2block.convert(func.value);
return [block("actuator_neopixel_write", func.lineno, {}, { 'SUB':rgbblock,
}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('music')['get_tempo'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if(args.length!=0){
throw new Error("Incorrect number of arguments");
}
return block("esp32_music_get_tempo", func.lineno, {}, {
}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('music')['set_tempo'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if(args.length!=2){
throw new Error("Incorrect number of arguments");
}
var resoblock=py2block.convert(args[0]);
var speedblock=py2block.convert(args[1]);
return [block("esp32_music_set_tempo", func.lineno, {}, {
'TICKS':resoblock,
"BPM":speedblock,
}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('music')['reset'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if(args.length!=0){
throw new Error("Incorrect number of arguments");
}
return [block("esp32_music_reset", func.lineno, {}, {
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('setonoff')['led'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var pin=py2block.identifier(func.value.func.attr);
var mac=py2block.identifier(func.value.func.value.id);
if(pin==="led" && mac==="mixgo"){
pbc.pinType = "pins_pwm_pin";
var pinblock = py2block.convert(func.value.args[0]);
pbc.pinType = null;
pbc.inScope="ledswitch";
var mode = py2block.convert(args[0]);
pbc.inScope=null;
return [block("actuator_extern_led_bright", func.lineno, {}, {
"PIN": pinblock,
'bright':mode
}, {
"inline": "true"
})];
}
}
pbc.objectFunctionD.get('getonoff')['led'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var pin=py2block.identifier(func.value.func.attr);
var mac=py2block.identifier(func.value.func.value.id);
if(pin==="led" && mac==="mixgo"){
pbc.pinType = "pins_pwm_pin";
var pinblock = py2block.convert(func.value.args[0]);
pbc.pinType = null;
return block("actuator_extern_get_led_bright", func.lineno, {}, {
"PIN": pinblock,
}, {
"inline": "true"
});
}
}
pbc.objectFunctionD.get('setbrightness')['led'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var pin=py2block.identifier(func.value.func.attr);
var mac=py2block.identifier(func.value.func.value.id);
if(pin==="led" && mac==="mixgo"){
pbc.pinType = "pins_pwm_pin";
var pinblock = py2block.convert(func.value.args[0]);
pbc.pinType = null;
var mode = py2block.convert(args[0]);
return [block("actuator_extern_led_brightness", func.lineno, {}, {
"PIN": pinblock,
'bright':mode
}, {
"inline": "true"
})];
}
}
pbc.moduleFunctionD.get('mixgo.rgb')['write'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if(args.length!=0){
throw new Error("Incorrect number of arguments");
}
return [block("actuator_onboard_neopixel_write", func.lineno, {}, {
}, {
"inline": "true"
})];
}

View File

@@ -0,0 +1,441 @@
var spiClass = 'machine.SPI';
var i2cClass = 'machine.I2C';
var owClass = 'onewire.OneWire';
pbc.assignD.get('I2C')['check_assign'] = function(py2block, node, targets, value) {
var funcName = py2block.identifier(value.func.attr);
var moduleName = py2block.Name_str(value.func.value);
if(value._astname === "Call" && moduleName === "machine"
&& funcName === "I2C" && value.keywords.length === 3)
return true;
return false;
}
pbc.assignD.get('I2C')['create_block'] = function(py2block, node, targets, value){
var astname = value.keywords[0]._astname;
if(astname === "keyword" && value.keywords[0].arg.v == "scl"
&& value.keywords[0].value.func.attr.v === "Pin"){
var sdablock = null;
var sclblock = null;
var freqblock = null;
var param = value.keywords[0];
var key = py2block.identifier(param.arg);
var i2cblock=py2block.convert(targets[0])
for (var i = 0; i < value.keywords.length; i++) {
var param = value.keywords[i];
var key = py2block.identifier(param.arg);
if (key === "sda") {
pbc.inScope = "communicate_i2c_init";
pbc.pinType = "pins_digital_pin";
sdablock = py2block.convert(param.value.args[0]);
pbc.pinType = null;
pbc.inScope = null;
} else if (key === "scl") {
pbc.inScope = "communicate_i2c_init";
pbc.pinType = "pins_digital_pin";
sclblock = py2block.convert(param.value.args[0]);
pbc.pinType = null;
pbc.inScope = null;
} else if (key === "freq") {
freqblock = py2block.convert(param.value);
}
}
}
if (sdablock != null && sclblock != null && freqblock != null) {
return block("communicate_i2c_init", node.lineno, {}, {
"SUB":i2cblock,
'RX': sdablock,
'TX': sclblock,
"freq": freqblock
}, {
"inline": "true"
});
}
}
pbc.objectFunctionD.get('readfrom')['I2C'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 2) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var adblock = py2block.convert(args[0]);
var datablock = py2block.convert(args[1]);
return block("communicate_i2c_read", func.lineno, {}, {
"address": adblock,
"data": datablock,
"VAR": objblock
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('writeto')['I2C'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 2) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var adblock = py2block.convert(args[0]);
var datablock = py2block.convert(args[1]);
return [block("communicate_i2c_write", func.lineno, {}, {
"address": adblock,
"data": datablock,
"VAR": objblock
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('scan')['I2C'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
return block("communicate_i2c_scan", func.lineno, {}, {
"VAR": objblock,
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('read')[i2cClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
return block("communicate_i2c_master_read", func.lineno, {}, {
"VAR": objblock,
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('available')['I2C'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
return block("communicate_i2c_available", func.lineno, {}, {
"VAR": objblock,
}, {
"inline": "true"
});
}
pbc.assignD.get('SPI')['check_assign'] = function(py2block, node, targets, value) {
var funcName = py2block.identifier(value.func.attr);
var moduleName = py2block.Name_str(value.func.value);
if(value._astname === "Call" && moduleName === "machine"
&& funcName === "SPI" && value.keywords.length === 6)
return true;
return false;
}
pbc.assignD.get('SPI')['create_block'] = function(py2block, node, targets, value){
var astname = value.keywords[0]._astname;
if(value.keywords[0].arg.v == "baudrate" && value.keywords[3].arg.v == "sck" && value.keywords[3].value.func.attr.v == "Pin"){
var polarityblock = null;
var phaseblock = null;
var sckblock = null;
var mosiblock = null;
var misoblock = null;
var freqblock = null;
var param = value.keywords[0];
var key = py2block.identifier(param.arg);
var spiblock=py2block.convert(targets[0]);
for (var i = 0; i < value.keywords.length; i++) {
var param = value.keywords[i];
var key = py2block.identifier(param.arg);
if (key === "baudrate") {
freqblock = py2block.convert(param.value);
} else if (key === "polarity") {
polarityblock = py2block.convert(param.value);
} else if (key === "phase") {
phaseblock = py2block.convert(param.value);
} else if (key === "sck") {
pbc.inScope = "communicate_spi_init";
pbc.pinType = "pins_digital_pin";
sckblock = py2block.convert(param.value.args[0]);
pbc.pinType = null;
pbc.inScope = null;
} else if (key === "mosi") {
pbc.inScope = "communicate_spi_init";
pbc.pinType = "pins_digital_pin";
mosiblock = py2block.convert(param.value.args[0]);
pbc.pinType = null;
pbc.inScope = null;
} else if (key === "miso") {
pbc.inScope = "communicate_spi_init";
pbc.pinType = "pins_digital_pin";
misoblock = py2block.convert(param.value.args[0]);
pbc.pinType = null;
pbc.inScope = null;
}
}
}
if (polarityblock != null && phaseblock != null && freqblock != null && sckblock != null && mosiblock != null && misoblock != null) {
return block("communicate_spi_init", node.lineno, {}, {
"VAR":spiblock,
"freq": freqblock,
"polarity": polarityblock,
"phase": phaseblock,
"sck": sckblock,
"mosi": mosiblock,
"miso": misoblock,
}, {
"inline": "true"
});
}
}
// 跟control的system_timer重了
// pbc.objectFunctionD.get('init')['SPI'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
// if (args.length == 0 & keywords.length == 1){
// var objblock = py2block.convert(func.value);
// var btlblock = null;
// var param = keywords[0];
// var key = py2block.identifier(param.arg);
// if (key === "baudrate") {
// bltblock = py2block.convert(param.value);
// }
// if (bltblock != null ) {
// return [block("communicate_spi_set", func.lineno, {}, {
// "VAR":objblock,
// "data": bltblock,
// }, {
// "inline": "true"
// })];
// }
// }else{
// throw new Error("Incorrect number of arguments");
// }
// }
pbc.assignD.get('spi')['check_assign'] = function(py2block, node, targets, value) {
if(value._astname != "Call" || value.func._astname != "Name"){
return false;
}
var funcName = py2block.Name_str(value.func);
if(funcName === "bytearray" && value.args.length === 1)
return true;
return false;
}
pbc.assignD.get('spi')['create_block'] = function(py2block, node, targets, value){
return block("communicate_spi_buffer", node.lineno, {
}, {
"data":py2block.convert(value.args[0]),
"VAR":py2block.convert(targets[0])
});
}
pbc.objectFunctionD.get('read')[spiClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1 & args.length !== 2) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var byteblock = py2block.convert(args[0]);
if (args.length == 1){
return block("communicate_spi_read", func.lineno, {}, {
"data": byteblock,
"VAR": objblock
}, {
"inline": "true"
});
}
if (args.length == 2){
var outputblock = py2block.convert(args[1]);
return block("communicate_spi_read_output", func.lineno, {}, {
"data": byteblock,
"val": outputblock,
"VAR": objblock
}, {
"inline": "true"
});
}
}
pbc.objectFunctionD.get('readinto')['SPI'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1 & args.length !== 2) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var byteblock = py2block.convert(args[0]);
if (args.length == 1){
return block("communicate_spi_readinto", func.lineno, {}, {
"data": byteblock,
"VAR": objblock
}, {
"inline": "true"
});
}
if (args.length == 2){
var outputblock = py2block.convert(args[1]);
return block("communicate_spi_readinto_output", func.lineno, {}, {
"data": byteblock,
"val": outputblock,
"VAR": objblock
}, {
"inline": "true"
});
}
}
pbc.objectFunctionD.get('write')[spiClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var byteblock = py2block.convert(args[0].func.value);
return block("communicate_spi_write", func.lineno, {}, {
"VAR": objblock,
"data": byteblock
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('write_readinto')['SPI'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 2) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var byteblock = py2block.convert(args[0].func.value);
var bufblock = py2block.convert(args[1]);
return block("communicate_spi_write_readinto", func.lineno, {}, {
"VAR": objblock,
"data": byteblock,
"val": bufblock
}, {
"inline": "true"
});
}
pbc.assignD.get('OW')['check_assign'] = function(py2block, node, targets, value) {
if(value._astname != "Call" || value.func._astname != "Attribute" || value.func.value._astname != "Name"){
return false;
}
var moduleName = py2block.Name_str(value.func.value);
var funcName = py2block.identifier(value.func.attr);
if(value._astname === "Call" && moduleName === "onewire"
&& funcName === "OneWire" && value.args.length === 1)
return true;
return false;
}
pbc.assignD.get('OW')['create_block'] = function(py2block, node, targets, value){
var pwmAstName = value.args[0]._astname;
pbc.pinType="pins_digital_pin";
var pinblock;
if (pwmAstName === "Call"&& value.args[0].func._astname == "Attribute" && value.args[0].func.attr.v==="Pin") {
pinblock=py2block.convert(value.args[0].args[0])
}
pbc.pinType=null;
return block("communicate_ow_init", node.lineno, {
}, {
"BUS":pinblock,
"VAR":py2block.convert(targets[0]),
});
}
pbc.objectFunctionD.get('scan')[owClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
return block("communicate_ow_scan", func.lineno, {}, {
"VAR": objblock,
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('readbyte')['OW'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
return block("communicate_ow_read", func.lineno, {}, {
"VAR": objblock,
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('reset')['OW'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
return [block("communicate_ow_reset", func.lineno, {}, {
"VAR": objblock,
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('select_rom')['OW'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var byteblock = py2block.convert(args[0].func.value);
return [block("communicate_ow_select", func.lineno, {}, {
"VAR": objblock,
"byte": byteblock
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('write')[owClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var byteblock = py2block.convert(args[0]);
return [block("communicate_ow_write", func.lineno, {
'op':'write'
}, {
"VAR": objblock,
"byte": byteblock
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('writebyte')[owClass] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var byteblock = py2block.convert(args[0]);
return [block("communicate_ow_write", func.lineno, {
'op':'writebyte'
}, {
"VAR": objblock,
"byte": byteblock
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('resume')['irremote'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 2) {
throw new Error("Incorrect number of arguments");
}
//var objblock = py2block.convert(func.value);
pbc.pinType = "pins_pwm_pin";
var adblock = py2block.convert(args[0]);
pbc.pinType = "pins_callback";
var datablock = py2block.convert(args[1]);
pbc.pinType=null;
return [block("communicate_ir_recv", func.lineno, {}, {
"PIN": adblock,
"SUB": datablock,
//"VAR": objblock
}, {
"inline": "true"
})];
}

View File

@@ -0,0 +1,139 @@
'use strict';
pbc.moduleFunctionD.get('time')['sleep_ms'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var time=py2block.convert(args[0]);
return [block("controls_delay", func.lineno, {'Time':'ms'}, {
"DELAY_TIME":time
}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('time')['sleep'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var time=py2block.convert(args[0]);
return [block("controls_delay", func.lineno, {'Time':'s'}, {
"DELAY_TIME":time
}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('time')['sleep_us'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var time=py2block.convert(args[0]);
return [block("controls_delay", func.lineno, {'Time':'us'}, {
"DELAY_TIME":time
}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('time')['ticks_ms'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return block("controls_millis", func.lineno, {"Time":"ms"}, {}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('time')['ticks_us'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return block("controls_millis", func.lineno, {"Time":"us"}, {}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('time')['ticks_diff'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 2) {
throw new Error("Incorrect number of arguments");
}
var endblock=py2block.convert(args[0]);
var startblock=py2block.convert(args[1]);
return block("system_ticks_diff", func.lineno, {}, {
"END":endblock,
"START":startblock
}, {
"inline": "true"
});
}
pbc.assignD.get('Timer')['check_assign'] = function(py2block, node, targets, value) {
var moduleName = py2block.Name_str(value.func.value);
var funcName = py2block.identifier(value.func.attr);
if(value._astname === "Call"
&& funcName === "Timer" && moduleName === "machine" && value.args.length === 1)
return true;
return false;
}
pbc.assignD.get('Timer')['create_block'] = function(py2block, node, targets, value){
pbc.pinType = "variables_get";
var timblock = py2block.convert(targets[0]);
pbc.pinType = null;
return block("system_timer_init", node.lineno, {}, {
"SUB":timblock,
});
}
//跟通信的SPT init重了
pbc.objectFunctionD.get('init')['control'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if(args.length === 0 && keywords.length ===3){
pbc.pinType = "variables_get";
var tim = py2block.convert(func.value);
pbc.pinType = null;
pbc.pinType = "math_number";
var numblock = py2block.convert(keywords[0].value);
pbc.pinType = null;
var mode = py2block.identifier(keywords[1].value.attr);
pbc.pinType = "pins_callback";
var callback = py2block.convert(keywords[2].value);
pbc.pinType = null;
return [block("system_timer", func.lineno, {"mode":mode}, {
"VAR": tim,
"period":numblock,
"callback": callback
}, {
"inline": "true"
})];
}
else if (args.length == 0 && keywords.length == 1){
var objblock = py2block.convert(func.value);
var bltblock = null;
var param = keywords[0];
var key = py2block.identifier(param.arg);
if (key === "baudrate") {
bltblock = py2block.convert(param.value);
}
if (bltblock != null ) {
return [block("communicate_spi_set", func.lineno, {}, {
"VAR":objblock,
"data": bltblock,
}, {
"inline": "true"
})];
}
}
else{
throw new Error("Incorrect number of arguments");
}
}

View File

@@ -0,0 +1,746 @@
'use strict';
pbc.moduleFunctionD.get('matrix.display')['show'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 1 && args.length !== 2 ){
throw new Error("Incorrect number of arguments");
}
if (args.length == 1 ){
var strblock=py2block.convert(args[0]);
return [block("display_show_image_or_string", func.lineno, {}, {
'data':strblock,
}, {
"inline": "true"
})];
}
if (args.length == 2 ){
var strblock=py2block.convert(args[0]);
var numblock=py2block.convert(args[1]);
return [block("display_show_image_or_string_delay", func.lineno, {}, {
'data':strblock,
'time':numblock
}, {
"inline": "true"
})];
}
}
pbc.moduleFunctionD.get('matrix.display')['scroll'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 1 && args.length !== 2 ){
throw new Error("Incorrect number of arguments");
}
if (args.length == 1 ){
var strblock=py2block.convert(args[0]);
return [block("display_scroll_string", func.lineno, {}, {
'data':strblock,
}, {
"inline": "true"
})];
}
if (args.length == 2 ){
var strblock=py2block.convert(args[0]);
var numblock=py2block.convert(args[1]);
return [block("display_scroll_string_delay", func.lineno, {}, {
'data':strblock,
'time':numblock
}, {
"inline": "true"
})];
}
}
pbc.moduleFunctionD.get('matrix.display')['showstatic'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 1 && args.length !== 2 ){
throw new Error("Incorrect number of arguments");
}
if (args.length == 1 ){
var strblock=py2block.convert(args[0]);
return [block("display_show_static", func.lineno, {}, {
'data':strblock,
}, {
"inline": "true"
})];
}
}
pbc.moduleFunctionD.get('matrix.display')['get_screenimage'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
if (args.length == 0 ) {
return block("display_get_screen_image", func.lineno, {}, {
}, {
"inline": "true"
});
}
}
pbc.moduleFunctionD.get('matrix')['Image'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 1 || args[0]._astname != "Str") {
throw new Error("Incorrect number of arguments");
}
var colours = [
"#000000",
"#ff0000",
];
var flag = 0;
var tempblock = py2block.Str_value(args[0]);
var temptext = new Array();
temptext = tempblock.split(':');
if (temptext.length == 8) {
for (var i = 0; i < 8; i++) {
if (temptext[i].length == 16) {
flag++;
}
}
}
if (flag == 8) {
return block('display_image_create', func.lineno, {
"00": colours[temptext[0].charAt(0)],
"01": colours[temptext[0].charAt(1)],
"02": colours[temptext[0].charAt(2)],
"03": colours[temptext[0].charAt(3)],
"04": colours[temptext[0].charAt(4)],
"05": colours[temptext[0].charAt(5)],
"06": colours[temptext[0].charAt(6)],
"07": colours[temptext[0].charAt(7)],
"08": colours[temptext[0].charAt(8)],
"09": colours[temptext[0].charAt(9)],
"0a": colours[temptext[0].charAt(10)],
"0b": colours[temptext[0].charAt(11)],
"0c": colours[temptext[0].charAt(12)],
"0d": colours[temptext[0].charAt(13)],
"0e": colours[temptext[0].charAt(14)],
"0f": colours[temptext[0].charAt(15)],
"10": colours[temptext[1].charAt(0)],
"11": colours[temptext[1].charAt(1)],
"12": colours[temptext[1].charAt(2)],
"13": colours[temptext[1].charAt(3)],
"14": colours[temptext[1].charAt(4)],
"15": colours[temptext[1].charAt(5)],
"16": colours[temptext[1].charAt(6)],
"17": colours[temptext[1].charAt(7)],
"18": colours[temptext[1].charAt(8)],
"19": colours[temptext[1].charAt(9)],
"1a": colours[temptext[1].charAt(10)],
"1b": colours[temptext[1].charAt(11)],
"1c": colours[temptext[1].charAt(12)],
"1d": colours[temptext[1].charAt(13)],
"1e": colours[temptext[1].charAt(14)],
"1f": colours[temptext[1].charAt(15)],
"20": colours[temptext[2].charAt(0)],
"21": colours[temptext[2].charAt(1)],
"22": colours[temptext[2].charAt(2)],
"23": colours[temptext[2].charAt(3)],
"24": colours[temptext[2].charAt(4)],
"25": colours[temptext[2].charAt(5)],
"26": colours[temptext[2].charAt(6)],
"27": colours[temptext[2].charAt(7)],
"28": colours[temptext[2].charAt(8)],
"29": colours[temptext[2].charAt(9)],
"2a": colours[temptext[2].charAt(10)],
"2b": colours[temptext[2].charAt(11)],
"2c": colours[temptext[2].charAt(12)],
"2d": colours[temptext[2].charAt(13)],
"2e": colours[temptext[2].charAt(14)],
"2f": colours[temptext[2].charAt(15)],
"30": colours[temptext[3].charAt(0)],
"31": colours[temptext[3].charAt(1)],
"32": colours[temptext[3].charAt(2)],
"33": colours[temptext[3].charAt(3)],
"34": colours[temptext[3].charAt(4)],
"35": colours[temptext[3].charAt(5)],
"36": colours[temptext[3].charAt(6)],
"37": colours[temptext[3].charAt(7)],
"38": colours[temptext[3].charAt(8)],
"39": colours[temptext[3].charAt(9)],
"3a": colours[temptext[3].charAt(10)],
"3b": colours[temptext[3].charAt(11)],
"3c": colours[temptext[3].charAt(12)],
"3d": colours[temptext[3].charAt(13)],
"3e": colours[temptext[3].charAt(14)],
"3f": colours[temptext[3].charAt(15)],
"40": colours[temptext[4].charAt(0)],
"41": colours[temptext[4].charAt(1)],
"42": colours[temptext[4].charAt(2)],
"43": colours[temptext[4].charAt(3)],
"44": colours[temptext[4].charAt(4)],
"45": colours[temptext[4].charAt(5)],
"46": colours[temptext[4].charAt(6)],
"47": colours[temptext[4].charAt(7)],
"48": colours[temptext[4].charAt(8)],
"49": colours[temptext[4].charAt(9)],
"4a": colours[temptext[4].charAt(10)],
"4b": colours[temptext[4].charAt(11)],
"4c": colours[temptext[4].charAt(12)],
"4d": colours[temptext[4].charAt(13)],
"4e": colours[temptext[4].charAt(14)],
"4f": colours[temptext[4].charAt(15)],
"50": colours[temptext[5].charAt(0)],
"51": colours[temptext[5].charAt(1)],
"52": colours[temptext[5].charAt(2)],
"53": colours[temptext[5].charAt(3)],
"54": colours[temptext[5].charAt(4)],
"55": colours[temptext[5].charAt(5)],
"56": colours[temptext[5].charAt(6)],
"57": colours[temptext[5].charAt(7)],
"58": colours[temptext[5].charAt(8)],
"59": colours[temptext[5].charAt(9)],
"5a": colours[temptext[5].charAt(10)],
"5b": colours[temptext[5].charAt(11)],
"5c": colours[temptext[5].charAt(12)],
"5d": colours[temptext[5].charAt(13)],
"5e": colours[temptext[5].charAt(14)],
"5f": colours[temptext[5].charAt(15)],
"60": colours[temptext[6].charAt(0)],
"61": colours[temptext[6].charAt(1)],
"62": colours[temptext[6].charAt(2)],
"63": colours[temptext[6].charAt(3)],
"64": colours[temptext[6].charAt(4)],
"65": colours[temptext[6].charAt(5)],
"66": colours[temptext[6].charAt(6)],
"67": colours[temptext[6].charAt(7)],
"68": colours[temptext[6].charAt(8)],
"69": colours[temptext[6].charAt(9)],
"6a": colours[temptext[6].charAt(10)],
"6b": colours[temptext[6].charAt(11)],
"6c": colours[temptext[6].charAt(12)],
"6d": colours[temptext[6].charAt(13)],
"6e": colours[temptext[6].charAt(14)],
"6f": colours[temptext[6].charAt(15)],
"70": colours[temptext[7].charAt(0)],
"71": colours[temptext[7].charAt(1)],
"72": colours[temptext[7].charAt(2)],
"73": colours[temptext[7].charAt(3)],
"74": colours[temptext[7].charAt(4)],
"75": colours[temptext[7].charAt(5)],
"76": colours[temptext[7].charAt(6)],
"77": colours[temptext[7].charAt(7)],
"78": colours[temptext[7].charAt(8)],
"79": colours[temptext[7].charAt(9)],
"7a": colours[temptext[7].charAt(10)],
"7b": colours[temptext[7].charAt(11)],
"7c": colours[temptext[7].charAt(12)],
"7d": colours[temptext[7].charAt(13)],
"7e": colours[temptext[7].charAt(14)],
"7f": colours[temptext[7].charAt(15)],
}, {}, {
"inline": "false"
});
}
}
function shift(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if(args.length!=1){
throw new Error("Incorrect number of arguments");
}
var str1block=py2block.convert(args[0]);
var imgblock=py2block.convert(func.value);
return block("image_shift", func.lineno, {
'OP':mode
}, {
'img':imgblock,
'val':str1block
}, {
"inline": "true"
});
}
return converter;
}
pbc.objectFunctionD.get('shift_up')['matrix'] = shift('up');
pbc.objectFunctionD.get('shift_down')['matrix'] = shift('down');
pbc.objectFunctionD.get('shift_left')['matrix'] = shift('left');
pbc.objectFunctionD.get('shift_right')['matrix'] = shift('right');
pbc.moduleFunctionD.get('matrix.display')['get_pixel'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 2){
throw new Error("Incorrect number of arguments");
}
var astname = args[0]._astname;
var astname1 = args[1]._astname;
var xblock;
var yblock;
pbc.pinType = "pins_axis";
if(astname === "Call" && args[0].func._astname == "Name" && py2block.Name_str(args[0].func) === "int"){ //display.get_pixel(int(0), int(0))
xblock = py2block.convert(args[0].args[0]);
}else{
xblock = py2block.convert(args[0]);
}
if(astname1 === "Call" && args[1].func._astname == "Name" && py2block.Name_str(args[1].func) === "int"){ //display.get_pixel(int(0), int(0))
yblock = py2block.convert(args[1].args[0]);
}else{
yblock = py2block.convert(args[1]);
}
pbc.pinType = null;
return block("display_get_pixel", func.lineno, {}, {
'x':xblock,
'y':yblock
}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('matrix.display')['set_pixel'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 3){
throw new Error("Incorrect number of arguments");
}
var astname = args[0]._astname;
var astname1 = args[1]._astname;
pbc.pinType = null;
pbc.inScope="switch";
var brightblock = py2block.convert(args[2]);
pbc.inScope=null;
pbc.pinType = null;
var xblock;
var yblock;
pbc.pinType = "pins_axis";
if(astname === "Call" && args[0].func._astname == "Name" && py2block.Name_str(args[0].func) === "int"){ //display.set_pixel(int(0), int(0))
xblock = py2block.convert(args[0].args[0]);
}else{
xblock = py2block.convert(args[0]);
}
if(astname1 === "Call" && args[1].func._astname == "Name" && py2block.Name_str(args[1].func) === "int"){ //display.set_pixel(int(0), int(0))
yblock = py2block.convert(args[1].args[0]);
}else{
yblock = py2block.convert(args[1]);
}
pbc.pinType = null;
return [block("display_bright_point", func.lineno, {}, {
'x':xblock,
'y':yblock,
'STAT':brightblock
}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('matrix.display')['set_brightness'] = function(py2block, func, args, keywords, starargs, kwargs, node) {
if(args.length!=1){
throw new Error("Incorrect number of arguments");
}
pbc.pinType="pins_exlcdh";
var brightblock=py2block.convert(args[0]);
pbc.pinType=null;
return [block("display_bright_screen", func.lineno, {}, {
'x':brightblock,
}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('matrix.display')['get_brightness'] = function(py2block, func, args, keywords, starargs, kwargs, node) {
if(args.length!=0){
throw new Error("Incorrect number of arguments");
}
return block("display_get_screen_pixel", func.lineno, {}, {
}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('matrix.display')['blink_rate'] = function(py2block, func, args, keywords, starargs, kwargs, node) {
if(args.length!=1){
throw new Error("Incorrect number of arguments");
}
var blinkblock=py2block.convert(args[0]);
return [block("display_blink_rate", func.lineno, {}, { 'x':blinkblock,
}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('matrix.display')['clear'] = function(py2block, func, args, keywords, starargs, kwargs, node) {
if(args.length!=0){
throw new Error("Incorrect number of arguments");
}
return [block("display_clear", func.lineno, {}, {
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('show_pixel')['monitor'] = function(py2block, func, args, keywords, starargs, kwargs, node) {
if(args.length!=2){
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var x1block=py2block.convert(args[0]);
var y1block=py2block.convert(args[1]);
return [block("display_oled_drawPixel", func.lineno, {}, { "VAR":objblock,'POS_X':x1block,'POS_Y':y1block,
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('show_bitmap')['monitor'] = function(py2block, func, args, keywords, starargs, kwargs, node) {
if(args.length!=5){
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var x=py2block.convert(args[0]);
var y=py2block.convert(args[1]);
var b=py2block.convert(args[2]);
var w=py2block.convert(args[3]);
var h=py2block.convert(args[4]);
return [block("display_oled_showBitmap", func.lineno, {}, { "VAR":objblock,'START_X':x,'START_Y':y,'bitmap_name':b,'WIDTH':w,'HEIGHT':h,
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('show_str')['monitor'] = function(py2block, func, args, keywords, starargs, kwargs, node) {
if(args.length!=4){
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var str1block=py2block.convert(args[0]);
var str2block=py2block.convert(args[1]);
var str3block=py2block.convert(args[2]);
var str4block=py2block.convert(args[3]);
return [block("display_draw_4strings", func.lineno, {}, { "VAR":objblock,'Text_line1':str1block,'Text_line2':str2block,'Text_line3':str3block,'Text_line4':str4block,
}, {
"inline": "false"
})];
}
pbc.objectFunctionD.get('show_line')['monitor'] = function(py2block, func, args, keywords, starargs, kwargs, node) {
if(args.length!=5){
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var x1block=py2block.convert(args[0]);
var y1block=py2block.convert(args[1]);
var x2block=py2block.convert(args[2]);
var y2block=py2block.convert(args[3]);
return [block("display_line_arbitrarily", func.lineno, {}, { "VAR":objblock,'x1':x1block,'y1':y1block,'x2':x2block,'y2':y2block,
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('show_hline')['monitor'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 4) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var xblock = py2block.convert(args[0]);
var yblock = py2block.convert(args[1]);
var lenblock = py2block.convert(args[2]);
return [block("display_line", func.lineno, {
'direction': 'hline',
}, {
"VAR":objblock,
"x": xblock,
"y": yblock,
"length": lenblock,
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('show_vline')['monitor'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 4) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var xblock = py2block.convert(args[0]);
var yblock = py2block.convert(args[1]);
var lenblock = py2block.convert(args[2]);
return [block("display_line", func.lineno, {
'direction': 'vline',
}, {
"VAR":objblock,
"x": xblock,
"y": yblock,
"length": lenblock,
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('show_rect')['monitor'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 5) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var xblock = py2block.convert(args[0]);
var yblock = py2block.convert(args[1]);
var widthblock = py2block.convert(args[2]);
var heightblock = py2block.convert(args[3]);
var lightblock = py2block.identifier(args[4].n);
return [block("display_rect", func.lineno, {
"fill": false,
"OP": lightblock,
}, {
"VAR":objblock,
"x": xblock,
"y": yblock,
"width": widthblock,
"height": heightblock,
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('show_fill_rect')['monitor'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 5) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var xblock = py2block.convert(args[0]);
var yblock = py2block.convert(args[1]);
var widthblock = py2block.convert(args[2]);
var heightblock = py2block.convert(args[3]);
var lightblock = py2block.identifier(args[4].n);
return [block("display_rect", func.lineno, {
"fill": true,
"OP": lightblock,
}, {
"VAR":objblock,
"x": xblock,
"y": yblock,
"width": widthblock,
"height": heightblock,
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('show_triangle')['monitor'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 7) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var x0 = py2block.convert(args[0]);
var y0 = py2block.convert(args[1]);
var x1 = py2block.convert(args[2]);
var y1 = py2block.convert(args[3]);
var x2 = py2block.convert(args[4]);
var y2 = py2block.convert(args[5]);
var lightblock = py2block.identifier(args[6].n);
return [block("display_triangle", func.lineno, {
"fill": false,
"OP": lightblock,
}, {
"VAR":objblock,
"x0": x0,
"y0": y0,
"x1": x1,
"y1": y1,
"x2": x2,
"y2": y2,
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('show_fill_triangle')['monitor'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 7) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var x0 = py2block.convert(args[0]);
var y0 = py2block.convert(args[1]);
var x1 = py2block.convert(args[2]);
var y1 = py2block.convert(args[3]);
var x2 = py2block.convert(args[4]);
var y2 = py2block.convert(args[5]);
var lightblock = py2block.identifier(args[6].n);
return [block("display_triangle", func.lineno, {
"fill": true,
"OP": lightblock,
}, {
"VAR":objblock,
"x0": x0,
"y0": y0,
"x1": x1,
"y1": y1,
"x2": x2,
"y2": y2,
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('show_circle')['monitor'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 4) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var xblock = py2block.convert(args[0]);
var yblock = py2block.convert(args[1]);
var rblock = py2block.convert(args[2]);
var lightblock = py2block.identifier(args[3].n);
return [block("display_circle", func.lineno, {
"fill": false,
"OP": lightblock,
}, {
"VAR":objblock,
"x": xblock,
"y": yblock,
"r": rblock,
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('show_fill_circle')['monitor'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 4) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var xblock = py2block.convert(args[0]);
var yblock = py2block.convert(args[1]);
var rblock = py2block.convert(args[2]);
var lightblock = py2block.identifier(args[3].n);
return [block("display_circle", func.lineno, {
"fill": true,
"OP": lightblock,
}, {
"VAR":objblock,
"x": xblock,
"y": yblock,
"r": rblock,
}, {
"inline": "true"
})];
}
pbc.assignD.get('oled')['check_assign'] = function(py2block, node, targets, value) {
if(value._astname != "Call" || value.func._astname != "Attribute" || value.func.value._astname != "Name"){
return false;
}
var moduleName = py2block.Name_str(value.func.value);
var funcName = py2block.identifier(value.func.attr);
if(value._astname === "Call" && moduleName === "ssd1306"
&& funcName === "SSD1306_I2C" && value.args.length === 3)
return true;
else if(value._astname === "Call" && moduleName === "tm1650"
&& funcName === "TM1650" && value.args.length === 1)
return true;
else
return false;
}
pbc.assignD.get('oled')['create_block'] = function(py2block, node, targets, value){
if(value.args.length === 3){
var rowblock = py2block.convert(value.args[0]);
var columnblock = py2block.convert(value.args[1]);
var i2cblock = py2block.convert(value.args[2]);
return block("display_use_i2c_init", node.lineno, {
}, {
"row":rowblock,
"column":columnblock,
"I2CSUB":i2cblock,
"SUB":py2block.convert(targets[0]),
});
}
else if(value.args.length === 1){
var i2cblock = py2block.convert(value.args[0]);
return block("display_tm_use_i2c_init", node.lineno, {
}, {
"I2CSUB":i2cblock,
"SUB":py2block.convert(targets[0]),
});
}
}
pbc.objectFunctionD.get('show_fill')['monitor'] = function(py2block, func, args, keywords, starargs, kwargs, node) {
if(args.length!=1){
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
var flagblock = py2block.identifier(args[0].n.v);
return [block("display_fill", func.lineno, {'key':flagblock}, { "SUB":objblock,
}, {
"inline": "true"
})];
}
function display_tm_stat(mode, type){
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var varblock = py2block.convert(func.value)
return [block('display_tm1650_power', func.lineno, {
"TYPE": type,
"STAT": mode,
}, {
"VAR": varblock,
}, {
"inline": "true"
})];
}
return converter;
}
pbc.objectFunctionD.get('tm1650_on')['disp'] = display_tm_stat('_on','tm1650');
pbc.objectFunctionD.get('tm1650_off')['disp'] = display_tm_stat('_off','tm1650');
pbc.objectFunctionD.get('tm1650_clear')['disp'] = display_tm_stat('_clear','tm1650');
pbc.objectFunctionD.get('tm1650_show_num')['disp'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var valblock=py2block.convert(args[0]);
var varblock=py2block.convert(func.value)
return [block("display_tm1650_show_num", func.lineno, {
"TYPE":'tm1650'
}, {
'VALUE':valblock,
'VAR': varblock
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('tm1650_show_dot')['disp'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 2) {
throw new Error("Incorrect number of arguments");
}
var valblock=py2block.convert(args[0]);
pbc.inScope="switch";
var statblock=py2block.convert(args[1]);
pbc.inScope=null;
var varblock=py2block.convert(func.value)
return [block("display_tm1650_show_dot", func.lineno, {
"TYPE":'tm1650'
}, {
'NO':valblock,
'STAT':statblock,
'VAR': varblock
}, {
"inline": "true"
})];
}

View File

@@ -0,0 +1,295 @@
pbc.objectFunctionD.get('value')['Pin'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1 && args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
if(args.length == 1){
pbc.pinType = "pins_digital";
var pinblock = py2block.convert(func.value);
var argblock = py2block.convert(args[0]);
pbc.pinType = null;
return [block("inout_digital_write", func.lineno, {}, {
"PIN": pinblock,
"STAT": argblock
}, {
"inline": "true"
})];}
else if(args.length == 0){
pbc.pinType = "pins_digital";
var pinblock = py2block.convert(func.value);
pbc.pinType = null;
return block("inout_digital_read", func.lineno, {}, {
"PIN": pinblock
}, {
"inline": "true"
});
}
}
pbc.assignD.get('Pin')['check_assign'] = function(py2block, node, targets, value) {
var moduleName = py2block.Name_str(value.func.value);
var funcName = py2block.identifier(value.func.attr);
if(value._astname === "Call"
&& funcName === "Pin" && (value.args.length === 2 || value.args.length === 3) )
return true;
return false;
}
pbc.assignD.get('Pin')['create_block'] = function(py2block, node, targets, value){
pbc.pinType = "pins_digital_pin";
var pinblock = py2block.convert(value.args[0]);
pbc.pinType = null;
if(value.args.length === 2){
var digitalblock = "machine."+py2block.identifier(value.args[1].value.attr) +"."+ py2block.identifier(value.args[1].attr);
}
else if(value.args.length === 3){
var digitalblock = "machine."+py2block.identifier(value.args[1].value.attr) +"."+ py2block.identifier(value.args[1].attr)+", "+"machine."+py2block.identifier(value.args[2].value.attr) +"."+ py2block.identifier(value.args[2].attr);
}
pinobj = py2block.identifier(targets[0].id);
return block("inout_digital_init", node.lineno, {"PIN_OBJ":pinobj,"MODE":digitalblock}, {
"PIN":pinblock,
});
}
//ok
pbc.assignD.get('DAC')['check_assign'] = function(py2block, node, targets, value) {
var moduleName = py2block.Name_str(value.func.value);
var funcName = py2block.identifier(value.func.attr);
if(value._astname === "Call"
&& funcName === "DAC" && moduleName === "machine"&& value.args.length === 1)
return true;
return false;
}
pbc.assignD.get('DAC')['create_block'] = function(py2block, node, targets, value){
var astname = value.args[0]._astname;
var funcName = py2block.identifier(value.args[0].func.attr);
if(astname === "Call" && funcName === "Pin"){ //
pbc.pinType = "pins_dac_pin";
pinblock = py2block.convert(value.args[0].args[0]);
pbc.pinType = null;
}else{
pbc.pinType = "pins_dac_pin";
pinblock = py2block.convert(args[0]);
pbc.pinType = null;
}
pinobj = py2block.identifier(targets[0].id);
return block("inout_analog_write_init", node.lineno, {"PIN_OBJ":pinobj}, {
"PIN":pinblock,
});
}
pbc.objectFunctionD.get('write')['Pin'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType = "pins_dac";
var pinblock = py2block.convert(func.value);
pbc.pinType = null;
var argblock = py2block.convert(args[0]);
return [block("inout_analog_write", func.lineno, {}, {
"PIN": pinblock,
"NUM": argblock
}, {
"inline": "true"
})];
}
//ok
pbc.assignD.get('PWM')['check_assign'] = function(py2block, node, targets, value) {
var moduleName = py2block.Name_str(value.func.value);
var funcName = py2block.identifier(value.func.attr);
if(value._astname === "Call"
&& funcName === "PWM" && moduleName === "machine" && value.args.length === 1)
return true;
return false;
}
pbc.assignD.get('PWM')['create_block'] = function(py2block, node, targets, value){
var astname = value.args[0]._astname;
var funcName = py2block.identifier(value.args[0].func.attr);
if(astname === "Call" && funcName === "Pin"){ //
pbc.pinType = "pins_pwm_pin";
pinblock = py2block.convert(value.args[0].args[0]);
pbc.pinType = null;
}else{
pbc.pinType = "pins_pwm_pin";
pinblock = py2block.convert(args[0]);
pbc.pinType = null;
}
pinobj = py2block.identifier(targets[0].id);
return block("inout_pwm_analog_write_init", node.lineno, {"PIN_OBJ":pinobj}, {
"PIN":pinblock,
});
}
pbc.objectFunctionD.get('duty')['Pin'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType = "pins_pwm";
var pinblock = py2block.convert(func.value);
pbc.pinType = null;
var argblock = py2block.convert(args[0]);
return [block("inout_pwm_analog_write", func.lineno, {}, {
"PIN": pinblock,
"NUM": argblock
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('freq')['Pin'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType = "pins_pwm";
var pinblock = py2block.convert(func.value);
pbc.pinType = null;
var argblock = py2block.convert(args[0]);
return [block("inout_pwm_analog_write_set_freq", func.lineno, {}, {
"PIN": pinblock,
"NUM": argblock
}, {
"inline": "true"
})];
}
//ok
pbc.assignD.get('ADC')['check_assign'] = function(py2block, node, targets, value) {
var moduleName = py2block.Name_str(value.func.value);
var funcName = py2block.identifier(value.func.attr);
if(value._astname === "Call"
&& funcName === "ADC" && moduleName === "machine" && value.args.length === 1)
return true;
return false;
}
pbc.assignD.get('ADC')['create_block'] = function(py2block, node, targets, value){
var astname = value.args[0]._astname;
var funcName = py2block.identifier(value.args[0].func.attr);
if(astname === "Call" && funcName === "Pin"){ //
pbc.pinType = "pins_analog_pin";
pinblock = py2block.convert(value.args[0].args[0]);
pbc.pinType = null;
}else{
pbc.pinType = "pins_analog_pin";
pinblock = py2block.convert(args[0]);
pbc.pinType = null;
}
pinobj = py2block.identifier(targets[0].id);
return block("inout_analog_read_init", node.lineno, {"PIN_OBJ":pinobj}, {
"PIN":pinblock,
});
}
pbc.objectFunctionD.get('read')['Pin'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
value = func.value.id.v
value = value.slice(0,2)
if( value=="ad"){
pbc.pinType = "pins_analog";
var pinblock = py2block.convert(func.value);
pbc.pinType = null;
return block("inout_analog_read", func.lineno, {}, {
"PIN": pinblock,
}, {
"inline": "true"
});}
else if(value =="tc"){
pbc.pinType = "pins_touch";
var pinblock = py2block.convert(func.value);
pbc.pinType = null;
return block("inout_pin_pressed", func.lineno, {}, {
"pin": pinblock,
}, {
"inline": "true"
});
}
}
//ok
pbc.assignD.get('TOUCHPAD')['check_assign'] = function(py2block, node, targets, value) {
var moduleName = py2block.Name_str(value.func.value);
var funcName = py2block.identifier(value.func.attr);
if(value._astname === "Call"
&& funcName === "TouchPad" && moduleName === "machine" && value.args.length === 1)
return true;
return false;
}
pbc.assignD.get('TOUCHPAD')['create_block'] = function(py2block, node, targets, value){
var astname = value.args[0]._astname;
var funcName = py2block.identifier(value.args[0].func.attr);
if(astname === "Call" && funcName === "Pin"){ //
pbc.pinType = "pins_touch_pin";
pinblock = py2block.convert(value.args[0].args[0]);
pbc.pinType = null;
}else{
pbc.pinType = "pins_touch_pin";
pinblock = py2block.convert(args[0]);
pbc.pinType = null;
}
pinobj = py2block.identifier(targets[0].id);
return block("inout_pin_pressed_init", node.lineno, {"PIN_OBJ":pinobj}, {
"PIN":pinblock,
});
}
pbc.objectFunctionD.get('irq')['Pin'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0 || keywords.length!==2) {
throw new Error("Incorrect number of arguments");
}
var pin=py2block.identifier(func.value.func.attr);
var mac=py2block.identifier(func.value.func.value.id);
if(pin==="Pin" && mac==="machine"){
pbc.pinType = "pins_digital_pin";
var pinblock = py2block.convert(func.value.args[0]);
pbc.pinType = null;
var mode = mac+"."+pin+"."+py2block.identifier(keywords[1].value.attr);
pbc.pinType = "pins_callback";
var callback = py2block.convert(keywords[0].value);
pbc.pinType = null;
return [block("inout_pin_attachInterrupt", func.lineno, {"mode":mode}, {
"PIN": pinblock,
"DO": callback
}, {
"inline": "true"
})];
}
}
pbc.objectFunctionD.get('atten')['Pin'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType = "pins_analog";
var pinblock = py2block.convert(func.value);
pbc.pinType = null;
var atten = py2block.identifier(args[0].value.value.id)+"."+py2block.identifier(args[0].value.attr)+"."+py2block.identifier(args[0].attr)
return [block("inout_analog_atten", func.lineno, {"atten":atten}, {
"PIN": pinblock,
}, {
"inline": "true"
})];
}

View File

@@ -0,0 +1,113 @@
'use strict';
// console.log("hhh")
pbc.assignD.get('iot')['check_assign'] = function(py2block, node, targets, value) {
if(value._astname != "Call" || value.func._astname != "Attribute" || value.func.value._astname != "Name"){
return false;
}
var funcName = py2block.identifier(value.func.attr);
var moduleName = py2block.Name_str(value.func.value);
if(moduleName === "miot" && funcName === "init_MQTT_client" && value.args.length === 6)
return true;
return false;
}
pbc.assignD.get('iot')['create_block'] = function(py2block, node, targets, value){
pbc.pinType = "pins_callback";
var subblock = py2block.convert(value.args[5]);
pbc.pinType = null;
return block("iot_onenet_connect", node.lineno, {}, {
"CLIENT":py2block.convert(value.args[0]),
"SERVER":py2block.convert(value.args[1]),
"USERNAME":py2block.convert(value.args[2]),
"PASSWORD":py2block.convert(value.args[3]),
"TOPIC":py2block.convert(value.args[4]),
"SUB":subblock,
"VAR":py2block.convert(targets[0])
});
}
// pbc.globalFunctionD['do_connect'] = function(py2block, func, args, keywords, starargs, kwargs, node){
// if (args.length !== 2) {
// throw new Error("Incorrect number of arguments");
// }
// var nameblock = py2block.convert(args[0]);
// var keyblock = py2block.convert(args[1]);
// return [block("iot_wifi_connect", func.lineno, {}, {
// 'WIFINAME': nameblock,
// 'PASSWORD': keyblock
// }, {
// "inline": "true"
// })];
// }
pbc.objectFunctionD.get('do_connect')['miot'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 2) {
throw new Error("Incorrect number of arguments");
}
var nameblock = py2block.convert(args[0]);
var keyblock = py2block.convert(args[1]);
return [block("iot_wifi_connect", func.lineno, {}, {
'WIFINAME': nameblock,
'PASSWORD': keyblock
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('publish')['miot'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length == 1 && keywords.length == 1) {
var objblock = py2block.convert(func.value);
var nameblock = py2block.convert(args[0]);
var checkblock = py2block.Name_str(keywords[0].value);
return [block("iot_onenet_publish_dict", func.lineno, {
"is_print":checkblock
}, {
"VAR":objblock,
"DICT":nameblock
}, {
"inline": "true"
})];
}
else if(args.length == 2) {
var objblock = py2block.convert(func.value);
var nameblock = py2block.convert(args[0]);
var checkblock = py2block.Name_str(args[1]);
return [block("iot_onenet_publish_dict", func.lineno, {
"is_print":checkblock
}, {
"VAR":objblock,
"DICT":nameblock
}, {
"inline": "true"
})];
}
else
throw new Error("Incorrect number of arguments");
}
pbc.objectFunctionD.get('do_disconnect')['miot'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 0) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
return [block("iot_onenet_disconnect", func.lineno, {}, {
"VAR":objblock,
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('check_msg')['iot'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 0) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
return [block("iot_onenet_check", func.lineno, {}, {
"VAR":objblock,
}, {
"inline": "true"
})];
}

View File

@@ -0,0 +1,308 @@
'use strict';
// console.log("hhh")
pbc.assignD.get('network')['check_assign'] = function(py2block, node, targets, value) {
if(value._astname != "Call" || value.func._astname != "Attribute" || value.func.value._astname != "Name"){
return false;
}
var moduleName = py2block.Name_str(value.func.value);
var funcName = py2block.identifier(value.func.attr);
if(value._astname === "Call" && moduleName === "network"
&& funcName === "WLAN" && value.args.length === 1)
return true;
return false;
}
pbc.assignD.get('network')['create_block'] = function(py2block, node, targets, value){
var mode = py2block.identifier(value.args[0].attr);
if (mode=="STA_IF"){
mode="STA"
}
else if (mode=="AP_IF"){
mode="AP"
}
return block("network_init", node.lineno, {
"mode":mode,
}, {
"VAR":py2block.convert(targets[0]),
});
}
pbc.objectFunctionD.get('active')['network'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length === 1){
var objblock = py2block.convert(func.value);
// var lightblock = py2block.identifier(args[0].n);
var reverse = py2block.Name_str(args[0]);
return [block("network_open", func.lineno, {
"op": reverse,
}, {
"VAR":objblock,
}, {
"inline": "true"
})];
}
else if (args.length === 0) {
var objblock = py2block.convert(func.value);
// var lightblock = py2block.identifier(args[0].n);
return [block("network_is_active", func.lineno, {
}, {
"VAR":objblock,
}, {
"inline": "true"
})];
}
else
{
throw new Error("Incorrect number of arguments");
}
}
pbc.objectFunctionD.get('isconnected')['network'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 0) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
return block("network_wifi_connect", func.lineno, {}, {
"VAR":objblock,
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('disconnect')['network'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 0) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
return [block("network_stop", func.lineno, {}, {
"VAR":objblock,
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('config')['network'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length == 0 & keywords.length == 2){
var objblock = py2block.convert(func.value);
var essidblock = null;
var channelblock = null;
for (var i = 0; i < keywords.length; i++) {
var param = keywords[i];
var key = py2block.identifier(param.arg);
if (key === "essid") {
essidblock = py2block.convert(param.value);
} else if (key === "channel") {
channelblock = py2block.convert(param.value);
}
}
if (essidblock != null && channelblock != null ) {
return [block("network_ap_connect", func.lineno, {}, {
"VAR":objblock,
"essid": essidblock,
"channel": channelblock,
}, {
"inline": "true"
})];
}
}else if(args.length == 1) {
var objblock = py2block.convert(func.value);
var argblock = py2block.Str_value(args[0]);
return block("network_get_wifi", func.lineno, {
"op":argblock,
}, {
"VAR":objblock,
}, {
"inline": "true"
});
}else{
throw new Error("Incorrect number of arguments");
}
}
pbc.objectFunctionD.get('connect')['network'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length === 2) {
var objblock = py2block.convert(func.value);
var idblock = py2block.convert(args[0]);
var passwordblock = py2block.convert(args[1]);
return [block("network_connect", func.lineno, {}, {
"VAR":objblock,
"id":idblock,
"password":passwordblock,
}, {
"inline": "true"
})];
}
else if (args.length === 1) {
var objblock = py2block.convert(func.value);
var reverse = py2block.convert(args[0]);
return [block("network_socket_connect", func.lineno, {
}, {
"address": reverse,
"VAR":objblock,
}, {
"inline": "true"
})];
}
else {
throw new Error("Incorrect number of arguments");
}
}
pbc.assignD.get('socket')['check_assign'] = function(py2block, node, targets, value) {
if(value._astname != "Call" || value.func._astname != "Attribute" || value.func.value._astname != "Name"){
return false;
}
var moduleName = py2block.Name_str(value.func.value);
var funcName = py2block.identifier(value.func.attr);
if(value._astname === "Call" && moduleName === "socket"
&& funcName === "socket" && value.args.length <= 1)
return true;
return false;
}
pbc.assignD.get('socket')['create_block'] = function(py2block, node, targets, value){
value.args = value.args || [];
if (!value.args.length){
var mode="TCP"
}
else {
var mode = py2block.identifier(value.args[0].attr);
if (mode == "SOCK_DGRAM"){
mode = "UDP"
}
else if (mode == "SOCK_STREAM"){
mode = "TCP"
}
}
return block("network_socket_init", node.lineno, {
"mode":mode,
}, {
"VAR":py2block.convert(targets[0]),
});
}
pbc.objectFunctionD.get('bind')['socket'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 1) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
// var lightblock = py2block.identifier(args[0].n);
var reverse = py2block.convert(args[0]);
return [block("network_socket_bind", func.lineno, {
}, {
"address": reverse,
"VAR":objblock,
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('listen')['socket'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 1) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
// var lightblock = py2block.identifier(args[0].n);
var reverse = py2block.convert(args[0]);
return [block("network_socket_listen", func.lineno, {
}, {
"queue": reverse,
"VAR":objblock,
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('accept')['socket'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 0) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
return block("network_socket_accept", func.lineno, {}, {
"VAR":objblock,
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('recv')['socket'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 1) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
// var lightblock = py2block.identifier(args[0].n);
var reverse = py2block.convert(args[0]);
return block("network_socket_receive", func.lineno, {
}, {
"size": reverse,
"VAR":objblock,
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('send')['socket'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 1) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
// var lightblock = py2block.identifier(args[0].n);
var reverse = py2block.convert(args[0]);
return [block("network_socket_send", func.lineno, {
}, {
"content": reverse,
"VAR":objblock,
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('recvfrom')['socket'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 1) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
// var lightblock = py2block.identifier(args[0].n);
var reverse = py2block.convert(args[0]);
return block("network_socket_receive_from", func.lineno, {
}, {
"size": reverse,
"VAR":objblock,
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('sendto')['socket'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 2) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
// var lightblock = py2block.identifier(args[0].n);
var reverse = py2block.convert(args[0]);
var address = py2block.convert(args[1]);
return [block("network_socket_send_to", func.lineno, {
}, {
"content": reverse,
"VAR":objblock,
"address":address,
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('close')['socket'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length != 0) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
return [block("network_socket_close", func.lineno, {}, {
"VAR":objblock,
}, {
"inline": "true"
})];
}

View File

@@ -0,0 +1,113 @@
function defDict(type) {
var dict = {};
return {
get: function (key) {
if (!dict[key]) {
dict[key] = type.constructor();
}
return dict[key];
},
dict: dict
};
}
function Py2blockConfig (){
this.initIgnoreS();
this.initModuleAttrD();
this.initKnownModuleS();
this.initObjectTypeD();
this.formatModuleKeyL = [
['Pin', 'ADC', 'TouchPad', 'PWM', 'DAC', 'I2C'],
['button_a', 'button_b', 'touch1', 'touch2', 'touch3', 'touch4', 'Infrared_left', 'Infrared_right',
'mixgo_get_brightness', 'mixgo_get_soundlevel', 'Sonar', 'led', 'led1','led2','Infrared'],
['NeoPixel'],
['display', 'Image']
];
this.formatModuleL = ['machine', 'mixgo', 'neopixel', 'matrix'];
}
var pbc = Py2blockConfig.prototype;
pbc.ESP32 = "MicroPython[ESP32]";
pbc.board = pbc.ESP32;
pbc.objectFunctionD = defDict({});
pbc.moduleFunctionD = defDict({});
pbc.moduleAttrD = defDict({});
pbc.objectAttrD = defDict({});
pbc.globalFunctionD = {};
pbc.assignD = defDict({});
pbc.ifStatementD= defDict({});
pbc.whileStatementD= defDict({});
pbc.forStatementD= defDict({});
pbc.reservedNameD= {};
pbc.knownModuleS = new Set();
pbc.objectTypeD = {}; //key变量名value变量类型如{'a':'List'}
pbc.ignoreS = new Set();
pbc.pinType = null;
pbc.inScope = null;
pbc.formatModuleKeyL = [];
pbc.formatModuleL = [];
//忽略某些方法、类、赋值
pbc.initIgnoreS = function(){
var pythonIgnoreL = [
];
var boardIgnoreL = [
];
var ignoreL = pythonIgnoreL.concat(boardIgnoreL);
for (var i = 0; i < ignoreL.length; i++) {
this.ignoreS.add(ignoreL[i]);
}
}
pbc.initModuleAttrD = function(){
for (var i = 0; i < profile.default.builtinimg.length; i++) {
pbc.moduleAttrD.get('matrix.Image')[profile.default.builtinimg[i][0]] = function (node, module, attr) {
return block("pins_builtinimg", node.lineno, {
"PIN": module + "." + attr
});
}
}
for (var i = 0; i < profile.default.imglist.length; i++) {
pbc.moduleAttrD.get('Image')[profile.default.imglist[i][0]] = function (node, module, attr) {
return block("pins_imglist", node.lineno, {
"PIN": module + "." + attr
});
}
}
for (var i = 0; i < profile.default.playlist.length; i++) {
pbc.moduleAttrD.get('music')[profile.default.playlist[i][0]] = function (node, module, attr) {
return block("pins_playlist", node.lineno, {
"PIN": module + "." + attr
});
}
}
}
pbc.initKnownModuleS = function(){
var pythonModuleL = [
'math', 'random'
];
var boardModuleL = [];
var moduleL = pythonModuleL.concat(boardModuleL);
for (var i = 0; i < moduleL.length; i++) {
this.knownModuleS.add(moduleL[i]);
}
}
pbc.initObjectTypeD = function () {
this.objectTypeD = {
'f': 'open',
'spi': 'machine.SPI',
'i2c': 'machine.I2C',
'ow': 'onewire.OneWire',
}
}
pbc.reset = function(){
this.initObjectTypeD();
}
var py2block_config = new Py2blockConfig();

View File

@@ -0,0 +1,734 @@
'use strict';
function pressed_converter (mode) {
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var btn = {
'_astname': 'Name',
'id': {
'_astname': 'Str',
'v': py2block.identifier(func.value.attr)
}
};
pbc.pinType = "pins_button";
var objblock = py2block.convert(btn);
pbc.pinType = null;
return block(mode, func.lineno, {}, {
"btn": objblock
}, {
"inline": "true"
});
}
return converter;
}
pbc.moduleFunctionD.get('mixgo.button_a')['is_pressed'] = pressed_converter('sensor_mixgo_button_is_pressed');
pbc.moduleFunctionD.get('mixgo.button_b')['is_pressed'] = pressed_converter('sensor_mixgo_button_is_pressed');
pbc.moduleFunctionD.get('mixgo.button_a')['was_pressed'] = pressed_converter('sensor_mixgo_button_was_pressed');
pbc.moduleFunctionD.get('mixgo.button_b')['was_pressed'] = pressed_converter('sensor_mixgo_button_was_pressed');
function getpresses_converter (mode) {
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var btn = {
'_astname': 'Name',
'id': {
'_astname': 'Str',
'v': py2block.identifier(func.value.attr)
}
};
pbc.pinType = "pins_button";
var objblock = py2block.convert(btn);
pbc.pinType = null;
var argblock = py2block.convert(args[0]);
return block(mode, func.lineno, {}, {
"btn": objblock,
'VAR': argblock
}, {
"inline": "true"
});
}
return converter;
}
pbc.moduleFunctionD.get('mixgo.button_a')['get_presses'] = getpresses_converter('sensor_mixgo_button_get_presses');
pbc.moduleFunctionD.get('mixgo.button_b')['get_presses'] = getpresses_converter('sensor_mixgo_button_get_presses');
pbc.moduleFunctionD.get('mixgo.touch1')['is_touched'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var btn = {
'_astname': 'Name',
'id': {
'_astname': 'Str',
'v': py2block.identifier(func.value.attr)
}
};
pbc.pin
pbc.pinType = "number1";
var objblock = py2block.convert(btn);
pbc.pinType = null;
return block("sensor_mixgo_pin_pressed", func.lineno, {}, {
"button":objblock
}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('mixgo.touch2')['is_touched'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var btn = {
'_astname': 'Name',
'id': {
'_astname': 'Str',
'v': py2block.identifier(func.value.attr)
}
};
pbc.pin
pbc.pinType = "number1";
var objblock = py2block.convert(btn);
pbc.pinType = null;
return block("sensor_mixgo_pin_pressed", func.lineno, {}, {
"button":objblock
}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('mixgo.touch3')['is_touched'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var btn = {
'_astname': 'Name',
'id': {
'_astname': 'Str',
'v': py2block.identifier(func.value.attr)
}
};
pbc.pin
pbc.pinType = "number1";
var objblock = py2block.convert(btn);
pbc.pinType = null;
return block("sensor_mixgo_pin_pressed", func.lineno, {}, {
"button":objblock
}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('mixgo.touch4')['is_touched'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var btn = {
'_astname': 'Name',
'id': {
'_astname': 'Str',
'v': py2block.identifier(func.value.attr)
}
};
pbc.pin
pbc.pinType = "number1";
var objblock = py2block.convert(btn);
pbc.pinType = null;
return block("sensor_mixgo_pin_pressed", func.lineno, {}, {
"button":objblock
}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('mixgo.infrared_left')['near'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return block("sensor_mixgo_pin_near", func.lineno, {"direction":'left'}, {}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('mixgo.infrared_right')['near'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
return block("sensor_mixgo_pin_near", func.lineno, {"direction":'right'}, {}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('near')['Infrared'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var pin=py2block.identifier(func.value.func.attr);
var mac=py2block.identifier(func.value.func.value.id);
if(pin==="Infrared" && mac==="mixgo"){
pbc.pinType = "pins_analog_pin";
var pinblock = py2block.convert(func.value.args[0]);
pbc.pinType = null;
return block("sensor_mixgo_extern_pin_near", func.lineno, {}, {
"PIN": pinblock,
}, {
"inline": "true"
});
}
}
pbc.moduleFunctionD.get('mixgo')['get_brightness'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0 && args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
if (args.length == 0){
return block("sensor_mixgo_light", func.lineno, {}, {}, {
"inline": "true"
});
}
if (args.length == 1){
pbc.pinType = "pins_analog_pin";
var pinblock = py2block.convert(args[0]);
pbc.pinType = null;
return block("sensor_mixgo_extern_light", func.lineno, {}, {
'PIN':pinblock
}, {
"inline": "true"
});
}
}
pbc.moduleFunctionD.get('mixgo')['get_soundlevel'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0 && args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
if (args.length == 0){
return block("sensor_sound", func.lineno, {}, {}, {
"inline": "true"
});
}
if (args.length == 1){
pbc.pinType = "pins_analog_pin";
var pinblock = py2block.convert(args[0]);
pbc.pinType = null;
return block("sensor_mixgo_extern_sound", func.lineno, {}, {
'PIN':pinblock
}, {
"inline": "true"
});
}
}
pbc.assignD.get('RTC')['check_assign'] = function(py2block, node, targets, value) {
var moduleName = py2block.Name_str(value.func.value);
var funcName = py2block.identifier(value.func.attr);
value.args = value.args || [];
if(value._astname === "Call" && moduleName === "machine" && funcName === "RTC" && !value.args.length)
return true;
return false;
}
pbc.assignD.get('RTC')['create_block'] = function(py2block, node, targets, value){
var objblock=py2block.convert(targets[0]);
return [block("sensor_rtc_init", node.lineno, {}, {
'SUB':objblock
},
{
"inline":"true"
}
)];
}
pbc.objectFunctionD.get('datetime')['RTC'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
/*if (keywords.length !== 0) {
throw new Error("Incorrect number of arguments");
}*/
if(args.length==0){
var objblock=py2block.convert(func.value);
return block("RTC_get_time", func.lineno, {}, {
'SUB':objblock
}, {
"inline": "true"
});
}
else if(args.length==1&&args[0]._astname=="Tuple"){
var objblock=py2block.convert(func.value);
var yearblock=py2block.convert(args[0].elts[0])
var monthblock=py2block.convert(args[0].elts[1])
var dayblock=py2block.convert(args[0].elts[2])
var weekdayblock=py2block.convert(args[0].elts[3])
var hourblock=py2block.convert(args[0].elts[4])
var minuteblock=py2block.convert(args[0].elts[5])
var secondblock=py2block.convert(args[0].elts[6])
var millisecondblock=py2block.convert(args[0].elts[7])
return [block("RTC_set_datetime", func.lineno, {}, {
'SUB':objblock,
'year':yearblock,
'month':monthblock,
'day':dayblock,
'weekday':weekdayblock,
'hour':hourblock,
'minute':minuteblock,
'second':secondblock,
'millisecond':millisecondblock,
}, {
"inline": "false"
})];
}
}
/*I2C出现了一些问题待解决*/
pbc.assignD.get('i2c')['check_assign'] = function (py2block, node, targets, value) {
var funcName = py2block.identifier(value.func.attr);
var moduleName = py2block.identifier(value.func.value.id);
if (value._astname === "Call" && ['MPU9250', 'SHT20', 'BMP280', 'ADXL345'].indexOf(funcName) != -1
&& ['mpu9250', 'sht20', 'bmp280', 'adxl345'].indexOf(moduleName) != -1 && value.args.length === 1)
return true;
return false;
}
pbc.assignD.get('i2c')['create_block'] = function (py2block, node, targets, value) {
var funcblock = py2block.identifier(value.func.attr);
var mpublock = py2block.convert(targets[0]);
var i2cblock = py2block.convert(value.args[0]);
return block("sensor_use_i2c_init", node.lineno, { "key": funcblock }, {
'I2CSUB': i2cblock,
'SUB': mpublock,
}, {
"inline": "true"
});
}
function getAcceleration(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var mpublock=py2block.convert(func.value)
return block('sensor_mpu9250_get_acceleration', func.lineno, {
"key": mode
}, {
'SUB': mpublock
}, {
"inline": "true"
});
}
return converter;
}
pbc.objectFunctionD.get('mpu9250_get_x')['mpu'] = getAcceleration('x');
pbc.objectFunctionD.get('mpu9250_get_y')['mpu'] = getAcceleration('y');
pbc.objectFunctionD.get('mpu9250_get_z')['mpu'] = getAcceleration('z');
pbc.objectFunctionD.get('mpu9250_get_values')['mpu'] = getAcceleration('values');
function getADXLAcceleration(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var mpublock=py2block.convert(func.value)
return block('sensor_adxl345_get_acceleration', func.lineno, {
"key": mode
}, {
'SUB': mpublock
}, {
"inline": "true"
});
}
return converter;
}
pbc.objectFunctionD.get('readX')['snsr'] = getADXLAcceleration('x');
pbc.objectFunctionD.get('readY')['snsr'] = getADXLAcceleration('y');
pbc.objectFunctionD.get('readZ')['snsr'] = getADXLAcceleration('z');
pbc.objectFunctionD.get('readXYZ')['snsr'] = getADXLAcceleration('values');
function getMagnetic(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var mpublock=py2block.convert(func.value)
return block('sensor_mpu9250_get_magnetic', func.lineno, {
"key": mode
}, {
'SUB': mpublock
}, {
"inline": "true"
});
}
return converter;
}
pbc.objectFunctionD.get('mpu9250_magnetic_x')['mpu'] = getMagnetic('x');
pbc.objectFunctionD.get('mpu9250_magnetic_y')['mpu'] = getMagnetic('y');
pbc.objectFunctionD.get('mpu9250_magnetic_z')['mpu'] = getMagnetic('z');
pbc.objectFunctionD.get('mpu9250_magnetic_values')['mpu'] = getMagnetic('values');
function getGyro(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var mpublock=py2block.convert(func.value)
return block('sensor_mpu9250_get_gyro', func.lineno, {
"key": mode
}, {
'SUB': mpublock
}, {
"inline": "true"
});
}
return converter;
}
pbc.objectFunctionD.get('mpu9250_gyro_x')['mpu'] = getGyro('x');
pbc.objectFunctionD.get('mpu9250_gyro_y')['mpu'] = getGyro('y');
pbc.objectFunctionD.get('mpu9250_gyro_z')['mpu'] = getGyro('z');
pbc.objectFunctionD.get('mpu9250_gyro_values')['mpu'] = getGyro('values');
function sensorcompass(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var mpublock=py2block.convert(func.value)
return block('sensor_mpu9250_field_strength', func.lineno, {
"compass": mode
}, {
'SUB': mpublock
}, {
"inline": "true"
});
}
return converter;
}
pbc.objectFunctionD.get('mpu9250_get_field_strength')['mpu'] = sensorcompass('strength');
pbc.objectFunctionD.get('heading')['mpu'] = sensorcompass('heading');
pbc.objectFunctionD.get('mpu9250_get_temperature')['mpu'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var mpublock=py2block.convert(func.value)
return block("sensor_mpu9250_temperature", func.lineno, {}, {
'SUB': mpublock
}, {
"inline": "true"
});
}
function sensorBmp(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var mpublock=py2block.convert(func.value)
return block('sensor_bmp', func.lineno, {
"key": mode
}, {
'SUB': mpublock
}, {
"inline": "true"
});
}
return converter;
}
pbc.objectFunctionD.get('get_BMP_temperature')['mpu'] = sensorBmp('get_BMP_temperature()');
pbc.objectFunctionD.get('get_BMP_pressure')['mpu'] = sensorBmp('get_BMP_pressure()');
function sensorSht(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var mpublock=py2block.convert(func.value)
return block('sensor_sht', func.lineno, {
"key": mode
}, {
'SUB': mpublock
}, {
"inline": "true"
});
}
return converter;
}
pbc.objectFunctionD.get('get_SHT_temperature')['mpu'] = sensorSht('get_SHT_temperature()');
pbc.objectFunctionD.get('get_SHT_relative_humidity')['mpu'] = sensorSht('get_SHT_relative_humidity()');
function dht(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 2) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType="pins_digital_pin";
var pinblock=py2block.convert(args[1]);
pbc.pinType=null;
var dhtblock=py2block.identifier(args[0].s);
return block('sensor_dht11', func.lineno, {
'TYPE':dhtblock,
'WHAT':mode
}, {
"PIN":pinblock,
}, {
"inline": "true"
});
}
return converter;
}
pbc.moduleFunctionD.get('dhtx')['get_dht_temperature'] = dht('temperature');
pbc.moduleFunctionD.get('dhtx')['get_dht_relative_humidity'] = dht('relative_humidity');
pbc.moduleFunctionD.get('dhtx')['get_dht_tempandhum'] = dht('tempandhum');
pbc.objectFunctionD.get('checkdist')['sonar'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (func.value.args.length !== 2) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType="pins_digital_pin";
var trigblock=py2block.convert(func.value.args[0]);
var echoblock=py2block.convert(func.value.args[1]);
pbc.pinType=null;
return block("HCSR04", func.lineno, {}, {
"PIN1":trigblock,
"PIN2":echoblock
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('mpu9250_is_gesture')['mpu'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var gesblock=py2block.identifier(args[0].s);
var mpublock=py2block.convert(func.value)
return block("sensor_mpu9250_gesture", func.lineno, {
'gesture':gesblock
}, {
'SUB': mpublock
}, {
"inline": "true"
});
}
pbc.moduleFunctionD.get('mixgo.button_a')['irq'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0 || keywords.length!==2) {
throw new Error("Incorrect number of arguments");
}
var btn = {
'_astname': 'Name',
'id': {
'_astname': 'Str',
'v': py2block.identifier(func.value.attr)
}
};
pbc.pinType="pins_button";
var objblock=py2block.convert(btn);
pbc.pinType=null;
var irq=py2block.identifier(keywords[1].value.attr);
var pin=py2block.identifier(keywords[1].value.value.attr);
var mac=py2block.identifier(keywords[1].value.value.value.id)
var mode = mac+"."+pin+"."+py2block.identifier(keywords[1].value.attr);
pbc.pinType = "pins_callback";
var callback = py2block.convert(keywords[0].value);
pbc.pinType = null;
return [block("sensor_mixgo_button_attachInterrupt", func.lineno, {"mode":mode}, {
"btn": objblock,
"DO": callback
}, {
"inline": "true"
})];
}
pbc.moduleFunctionD.get('mixgo.button_b')['irq'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 0 || keywords.length!==2) {
throw new Error("Incorrect number of arguments");
}
var btn = {
'_astname': 'Name',
'id': {
'_astname': 'Str',
'v': py2block.identifier(func.value.attr)
}
};
pbc.pinType="pins_button";
var objblock=py2block.convert(btn);
pbc.pinType=null;
var irq=py2block.identifier(keywords[1].value.attr);
var pin=py2block.identifier(keywords[1].value.value.attr);
var mac=py2block.identifier(keywords[1].value.value.value.id)
var mode = mac+"."+pin+"."+py2block.identifier(keywords[1].value.attr);
pbc.pinType = "pins_callback";
var callback = py2block.convert(keywords[0].value);
pbc.pinType = null;
return [block("sensor_mixgo_button_attachInterrupt", func.lineno, {"mode":mode}, {
"btn": objblock,
"DO": callback
}, {
"inline": "true"
})];
}
pbc.objectFunctionD.get('was_pressed')['Button'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var pin=py2block.identifier(func.value.func.attr);
var mac=py2block.identifier(func.value.func.value.id);
if(pin==="Button" && mac==="mixgo"){
pbc.pinType = "pins_digital_pin";
var pinblock = py2block.convert(func.value.args[0]);
pbc.pinType = null;
pbc.pinType = "pins_digital";
var argblock = py2block.convert(args[0]);
pbc.pinType = null;
return block('sensor_mixgo_extern_button_was_pressed', func.lineno, {}, {
"PIN": pinblock,
"STAT": argblock
}, {
"inline": "true"
});
}
}
pbc.objectFunctionD.get('get_presses')['Button'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var pin=py2block.identifier(func.value.func.attr);
var mac=py2block.identifier(func.value.func.value.id);
if(pin==="Button" && mac==="mixgo"){
pbc.pinType = "pins_digital_pin";
var pinblock = py2block.convert(func.value.args[0]);
pbc.pinType = null;
var argblock = py2block.convert(args[0]);
return block('sensor_mixgo_extern_button_get_presses', func.lineno, {}, {
"PIN": pinblock,
'VAR':argblock
}, {
"inline": "true"
});
}
}
pbc.objectFunctionD.get('is_pressed')['Button'] = function (py2block, func, args, keywords, starargs, kwargs, node) {
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var pin=py2block.identifier(func.value.func.attr);
var mac=py2block.identifier(func.value.func.value.id);
if(pin==="Button" && mac==="mixgo"){
pbc.pinType = "pins_digital_pin";
var pinblock = py2block.convert(func.value.args[0]);
pbc.pinType = null;
pbc.pinType = "pins_digital";
var argblock = py2block.convert(args[0]);
pbc.pinType = null;
return block('sensor_mixgo_extern_button_is_pressed', func.lineno, {}, {
"PIN": pinblock,
"STAT": argblock
}, {
"inline": "true"
});
}
}
pbc.moduleFunctionD.get('ds18x20x')['get_ds18x20_temperature'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType="pins_digital_pin";
var argblock = py2block.convert(args[0]);
pbc.pinType = null;
return block("sensor_ds18x20", func.lineno, {}, {
"PIN":argblock,
}, {
"inline": "true"
});
}
pbc.objectFunctionD.get('calibrate')['mpu'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
return [block("sensor_mpu9250_calibrate_compass", func.lineno, {}, {
"SUB": objblock,
}, {
"inline": "true"
})];
};
pbc.objectFunctionD.get('reset_calibrate')['mpu'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 0) {
throw new Error("Incorrect number of arguments");
}
var objblock = py2block.convert(func.value);
return [block("sensor_compass_reset", func.lineno, {}, {
"SUB": objblock,
}, {
"inline": "true"
})];
};
pbc.moduleFunctionD.get('lm35')['get_LM35_temperature'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
pbc.pinType="pins_analog_pin";
var argblock = py2block.convert(args[0]);
pbc.pinType = null;
return block("sensor_lm35", func.lineno, {}, {
"PIN":argblock,
}, {
"inline": "true"
});
}

View File

@@ -0,0 +1,198 @@
pbc.globalFunctionD['print'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length === 1 && keywords.length === 1
&& py2block.identifier(keywords[0].arg) === "end"
&& keywords[0].value._astname === "Str"
//&& py2block.Str_value(keywords[0].value) === ""
){ if(py2block.Str_value(keywords[0].value) === ""){
var argblock = py2block.convert(args[0]);
return [block("system_print_inline", func.lineno, {}, {
'VAR':argblock
}, {
"inline": "false"
})];
}
else{
var argblock = py2block.convert(args[0]);
return [block("system_print_end", func.lineno, {
}, {
'VAR':argblock,
'END':py2block.convert(keywords[0].value)
}, {
"inline": "true"
})];
}
}else if (args.length === 1 && keywords.length === 0) {
var argblock = py2block.convert(args[0]);
return [block("system_print", func.lineno, {}, {
'VAR':argblock
}, {
"inline": "false"
})];
}else if (args.length != 1 && keywords.length === 0) { //print()
var d = py2block.convertElements("ADD", args);
return [block("system_print_many", node.lineno, {
}, d, {
"inline": "true",
}, {
"@items":args.length
})];
}else{
throw new Error("Incorrect number of arguments");
}
}
pbc.globalFunctionD['input'] = function(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var argblock = py2block.convert(args[0]);
return block("system_input", func.lineno, {}, {
'VAR':argblock
}, {
"inline": "false"
});
}
pbc.assignD.get('UART')['check_assign'] = function(py2block, node, targets, value) {
if(value._astname != "Call" || value.func._astname != "Attribute" || value.func.value._astname != "Name"){
return false;
}
var moduleName = py2block.Name_str(value.func.value);
var funcName = py2block.identifier(value.func.attr);
if(value._astname === "Call" && moduleName === "machine"
&& funcName === "UART" && value.args.length === 2)
return true;
return false;
}
pbc.assignD.get('UART')['create_block'] = function(py2block, node, targets, value){
pbc.pinType = "serial_print";
var pinblock = py2block.identifier(value.args[0].n);
var countblock = py2block.identifier(value.args[1].n);
pbc.pinType = null;
return block("serial_softserial", node.lineno, {
"mode":pinblock,
'baudrate':countblock
}, { },
{
"inline":"true"
}
);
}
function serial_write(mode){
function converter(py2block, func, args, keywords, starargs, kwargs, node){
if (args.length !== 1) {
throw new Error("Incorrect number of arguments");
}
var astname = args[0]._astname;
if(astname === "Call"){
if(args[0].func._astname == "Name" && py2block.Name_str(args[0].func) === "str"){ //serial.write(str("XXX"))
return [block("serial_print", func.lineno, {
"mode":mode
}, {
"CONTENT":py2block.convert(args[0].args[0]),
}, {
"inline": "false"
})];
}
}else if(astname === "BinOp"){
if(args[0].op.name === "Add" && args[0].right._astname === "Str"
&& py2block.Str_value(args[0].right) === "\r\n"
&& args[0].left._astname === "Call" && args[0].left.func._astname == "Name"
&& py2block.Name_str(args[0].left.func) === "str"
){
if(args[0].left.args[0]._astname === "Call"
&& args[0].left.args[0].func._astname === "Name"
&& py2block.Name_str(args[0].left.args[0].func) in {"hex":16,"bin":2,"oct":8}){
//serial.write(str(hex(XX)) + "\r\n")
pbc.inScope = "lcd_init";
var numblock=py2block.convert(args[0].left.args[0].args[0]);
pbc.inScope=null;
return [block("serial_print_hex", func.lineno, {
"mode":mode,
"STAT":py2block.Name_str(args[0].left.args[0].func),
}, {
"CONTENT":numblock,
}, {
"inline": "true"
})];
}else{
return [block("serial_println", func.lineno, {
"mode":mode
}, { //serial.write(str("XX") + "\r\n")
"CONTENT": py2block.convert(args[0].left.args[0]),
}, {
"inline": "false"
})];
}
}
}
return [block("serial_print", func.lineno, {}, {
"CONTENT":py2block.convert(args[0]),
}, {
"inline": "true"
})];
}
return converter
}
pbc.moduleFunctionD.get('uart0')['write'] = serial_write('0')
pbc.moduleFunctionD.get('uart1')['write'] = serial_write('1')
pbc.moduleFunctionD.get('uart2')['write'] = serial_write('2')
pbc.assignD.get('uart0')['check_assign'] = function (py2block, node, targets, value) {
var funcName = py2block.identifier(value.func.id);
if (value._astname === "Call"&& funcName === "UART" && value.args.length === 2)
return true;
return false;
}
pbc.assignD.get('uart0')['create_block'] = function (py2block, node, targets, value) {
pbc.pinType = 'serial_print';
var argblock1 = py2block.convert(value.args[1])
mode=targets[0].id.v
if (mode=="uart0"){
mode='0'
}
else if(mode=="uart1"){
mode='1'
}
else if(mode=="uart2"){
mode='2'
}
return block("serial_softserial", node.lineno, {
"mode":mode
}, {
"CONTENT":py2block.convert(value.args[0]),
"TEXT":argblock1,
}, {
"inline": "true"
});
}
function getSerial(mode,fun_type){
function converter(py2block, func, args, keywords, starargs, kwargs, node){
if(args.length !==0){
throw new Error("Incorrect number of arguments");
}
return block(fun_type, func.lineno, {
"mode":mode
}, {
}, {
"inline": "true"
});
}
return converter;
}
pbc.moduleFunctionD.get('uart0')['any'] = getSerial('0','serial_any')
pbc.moduleFunctionD.get('uart1')['any'] = getSerial('1','serial_any')
pbc.moduleFunctionD.get('uart2')['any'] = getSerial('2','serial_any')
pbc.moduleFunctionD.get('uart0')['read'] = getSerial('0','serial_readstr')
pbc.moduleFunctionD.get('uart1')['read'] = getSerial('1','serial_readstr')
pbc.moduleFunctionD.get('uart2')['read'] = getSerial('2','serial_readstr')
pbc.moduleFunctionD.get('uart0')['readline'] = getSerial('0','serial_readline')
pbc.moduleFunctionD.get('uart1')['readline'] = getSerial('1','serial_readline')
pbc.moduleFunctionD.get('uart2')['readline'] = getSerial('2','serial_readline')

View File

@@ -0,0 +1,108 @@
import * as MicroPythonActuatorExternBlocks from './blocks/actuator_extern';
import * as MicroPythonActuatorOnBoardBlocks from './blocks/actuator_onboard';
import * as MicroPythonActuatorBlocks from './blocks/actuator';
import * as MicroPythonAISensorBlocks from './blocks/ai_sensor';
import * as MicroPythonAIBlocks from './blocks/ai';
import * as MicroPythonBlynkBlocks from './blocks/blynk';
import * as MicroPythonCCG1Blocks from './blocks/cc_g1';
import * as MicroPythonCEGOBlocks from './blocks/ce_go';
import * as MicroPythonCommunicateBlocks from './blocks/communicate';
import * as MicroPythonControlBlocks from './blocks/control';
import * as MicroPythonDisplayExternBlocks from './blocks/display_extern';
import * as MicroPythonDisplayOnBoardBlocks from './blocks/display_onboard';
import * as MicroPythonDisplayBlocks from './blocks/display';
import * as MicroPythonFactoryBlocks from './blocks/factory';
import * as MicroPythonInputBlocks from './blocks/inout';
import * as MicroPythonIotBlocks from './blocks/iot';
import * as MicroPythonNetworkBlocks from './blocks/network';
import * as MicroPythonNovaG1Blocks from './blocks/nova_g1';
import * as MicroPythonPeG1Blocks from './blocks/pe_g1';
import * as MicroPythonPinsBlocks from './blocks/pins';
import * as MicroPythonSensorExternBlocks from './blocks/sensor_extern';
import * as MicroPythonSensorOnBoardBlocks from './blocks/sensor_onboard';
import * as MicroPythonSensorBlocks from './blocks/sensor';
import * as MicroPythonSerialBlocks from './blocks/serial';
import * as MicroPythonSystemBlocks from './blocks/system';
import * as MicroPythonWeatherBlocks from './blocks/weather';
import * as MicroPythonActuatorExternGenerators from './generators/actuator_extern';
import * as MicroPythonActuatorOnBoardGenerators from './generators/actuator_onboard';
import * as MicroPythonActuatorGenerators from './generators/actuator';
import * as MicroPythonAISensorGenerators from './generators/ai_sensor';
import * as MicroPythonAIGenerators from './generators/ai';
import * as MicroPythonBlynkGenerators from './generators/blynk';
import * as MicroPythonCCG1Generators from './generators/cc_g1';
import * as MicroPythonCEGOGenerators from './generators/ce_go';
import * as MicroPythonCommunicateGenerators from './generators/communicate';
import * as MicroPythonControlGenerators from './generators/control';
import * as MicroPythonDisplayExternGenerators from './generators/display_extern';
import * as MicroPythonDisplayOnBoardGenerators from './generators/display_onboard';
import * as MicroPythonDisplayGenerators from './generators/display';
import * as MicroPythonFactoryGenerators from './generators/factory';
import * as MicroPythonInputGenerators from './generators/inout';
import * as MicroPythonIotGenerators from './generators/iot';
import * as MicroPythonNetworkGenerators from './generators/network';
import * as MicroPythonNovaG1Generators from './generators/nova_g1';
import * as MicroPythonPeG1Generators from './generators/pe_g1';
import * as MicroPythonPinsGenerators from './generators/pins';
import * as MicroPythonSensorExternGenerators from './generators/sensor_extern';
import * as MicroPythonSensorOnBoardGenerators from './generators/sensor_onboard';
import * as MicroPythonSensorGenerators from './generators/sensor';
import * as MicroPythonSerialGenerators from './generators/serial';
import * as MicroPythonSystemGenerators from './generators/system';
import * as MicroPythonWeatherGenerators from './generators/weather';
export {
MicroPythonActuatorExternBlocks,
MicroPythonActuatorOnBoardBlocks,
MicroPythonActuatorBlocks,
MicroPythonAISensorBlocks,
MicroPythonAIBlocks,
MicroPythonBlynkBlocks,
MicroPythonCCG1Blocks,
MicroPythonCEGOBlocks,
MicroPythonCommunicateBlocks,
MicroPythonControlBlocks,
MicroPythonDisplayExternBlocks,
MicroPythonDisplayOnBoardBlocks,
MicroPythonDisplayBlocks,
MicroPythonFactoryBlocks,
MicroPythonInputBlocks,
MicroPythonIotBlocks,
MicroPythonNetworkBlocks,
MicroPythonNovaG1Blocks,
MicroPythonPeG1Blocks,
MicroPythonPinsBlocks,
MicroPythonSensorExternBlocks,
MicroPythonSensorOnBoardBlocks,
MicroPythonSensorBlocks,
MicroPythonSerialBlocks,
MicroPythonSystemBlocks,
MicroPythonWeatherBlocks,
MicroPythonActuatorExternGenerators,
MicroPythonActuatorOnBoardGenerators,
MicroPythonActuatorGenerators,
MicroPythonAISensorGenerators,
MicroPythonAIGenerators,
MicroPythonBlynkGenerators,
MicroPythonCCG1Generators,
MicroPythonCEGOGenerators,
MicroPythonCommunicateGenerators,
MicroPythonControlGenerators,
MicroPythonDisplayExternGenerators,
MicroPythonDisplayOnBoardGenerators,
MicroPythonDisplayGenerators,
MicroPythonFactoryGenerators,
MicroPythonInputGenerators,
MicroPythonIotGenerators,
MicroPythonNetworkGenerators,
MicroPythonNovaG1Generators,
MicroPythonPeG1Generators,
MicroPythonPinsGenerators,
MicroPythonSensorExternGenerators,
MicroPythonSensorOnBoardGenerators,
MicroPythonSensorGenerators,
MicroPythonSerialGenerators,
MicroPythonSystemGenerators,
MicroPythonWeatherGenerators
};

View File

@@ -0,0 +1,214 @@
export const esp32_music_pitch = function (_, generator) {
generator.definitions_['import_music'] = 'import music';
var number_pitch = generator.valueToCode(this, 'pitch', generator.ORDER_ATOMIC);
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'music.pitch(' + pin + ', ' + number_pitch + ')\n';
return code;
}
export const esp32_music_pitch_with_time = function (_, generator) {
generator.definitions_['import_music'] = 'import music';
var number_pitch = generator.valueToCode(this, 'pitch', generator.ORDER_ATOMIC);
var number_time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'music.pitch_time(' + pin + ', ' + number_pitch + ', ' + number_time + ')\n';
return code;
}
export const esp32_music_stop = function (_, generator) {
generator.definitions_['import_music'] = 'import music';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'music.stop(' + pin + ')\n';
return code;
}
export const esp32_music_set_tempo = function (_, generator) {
generator.definitions_['import_music'] = 'import music';
var bpm = generator.valueToCode(this, 'BPM', generator.ORDER_ASSIGNMENT);
var ticks = generator.valueToCode(this, 'TICKS', generator.ORDER_ASSIGNMENT);
var code = "music.set_tempo(" + ticks + ", " + bpm + ")\n";
return code;
}
export const esp32_music_get_tempo = function (_, generator) {
generator.definitions_['import_music'] = 'import music';
var code = "music.get_tempo()";
return [code, generator.ORDER_ATOMIC];
}
export const esp32_onboard_music_pitch = function (_, generator) {
generator.definitions_['import_music'] = 'import music';
var number_pitch = generator.valueToCode(this, 'pitch', generator.ORDER_ATOMIC);
var code = 'music.pitch(' + number_pitch + ')\n';
return code;
}
export const esp32_onboard_music_pitch_with_time = function (_, generator) {
generator.definitions_['import_music'] = 'import music';
var number_pitch = generator.valueToCode(this, 'pitch', generator.ORDER_ATOMIC);
var number_time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
var code = 'music.pitch_time(' + number_pitch + ', ' + number_time + ')\n';
return code;
}
export const esp32_onboard_music_stop = function (_, generator) {
generator.definitions_['import_music'] = 'import music';
var code = 'music.stop(' + ')\n';
return code;
}
export const esp32_onboard_music_play_list = function (_, generator) {
generator.definitions_['import_music'] = 'import music';
var lst = generator.valueToCode(this, 'LIST', generator.ORDER_ASSIGNMENT);
var code = "music.play(" + lst + ")\n";
return code;
}
export const esp32_music_play_list = function (_, generator) {
generator.definitions_['import_music'] = 'import music';
var lst = generator.valueToCode(this, 'LIST', generator.ORDER_ASSIGNMENT);
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ASSIGNMENT);
var code = "music.play(" + lst + ", " + pin + ")\n";
return code;
}
export const esp32_mixgo_music_play_list_show = function (_, generator) {
generator.definitions_['import_music'] = 'import music';
generator.definitions_['import_matrix'] = 'import matrix';
var lst = generator.valueToCode(this, 'LIST', generator.ORDER_ASSIGNMENT);
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ASSIGNMENT);
// var display = generator.valueToCode(this, 'DISPLAY', generator.ORDER_ASSIGNMENT);
var code = "music.play_show(" + lst + ", " + pin + ")\n";
return code;
}
export const esp32_music_reset = function (_, generator) {
generator.definitions_['import_music'] = 'import music';
return "music.reset()\n";
}
export const servo_move = function (_, generator) {
generator.definitions_['import_servo'] = 'import servo';
generator.definitions_['import_machine'] = 'import machine';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var value_degree = generator.valueToCode(this, 'DEGREE', generator.ORDER_ATOMIC);
var code = 'servo.servo_write_angle(' + dropdown_pin + ',' + value_degree + ')\n';
return code;
}
export const number = function (_, generator) {
var code = this.getFieldValue('op');
return [code, generator.ORDER_ATOMIC];
}
export const ledswitch = function (_, generator) {
var code = this.getFieldValue('flag');
return [code, generator.ORDER_ATOMIC];
}
export const actuator_extern_led_bright = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var bright = generator.valueToCode(this, 'bright', generator.ORDER_ATOMIC);
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
// var bright = this.getFieldValue('bright');
var code = "mixgo.led(" + pin + ").setonoff(" + bright + ")\n";
return code;
}
export const actuator_extern_get_led_bright = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = "mixgo.led(" + pin + ").getonoff(" + ")";
return [code, generator.ORDER_ATOMIC];
}
export const actuator_extern_led_brightness = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var flag = generator.valueToCode(this, 'bright', generator.ORDER_ATOMIC);
var code = 'mixgo.led(' + pin + ').setbrightness(' + flag + ')\n';
return code;
}
export const actuator_led_bright = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var op = generator.valueToCode(this, 'led', generator.ORDER_ATOMIC);
var bright = generator.valueToCode(this, 'bright', generator.ORDER_ATOMIC);
// var bright = this.getFieldValue('bright');
var code = "mixgo.led" + op + ".setonoff(" + bright + ")\n";
return code;
}
export const actuator_get_led_bright = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var op = generator.valueToCode(this, 'led', generator.ORDER_ATOMIC);
var code = "mixgo.led" + op + ".getonoff(" + ")";
return [code, generator.ORDER_ATOMIC];
}
export const actuator_led_brightness = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var op = generator.valueToCode(this, 'led', generator.ORDER_ATOMIC);
var flag = generator.valueToCode(this, 'bright', generator.ORDER_ATOMIC);
var code = 'mixgo.led' + op + '.setbrightness(' + flag + ')\n';
return code;
}
export const actuator_neopixel_init = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var dropdown_rgbpin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var value_ledcount = generator.valueToCode(this, 'LEDCOUNT', generator.ORDER_ATOMIC);
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_neopixel'] = 'import neopixel';
var code = v + ' = neopixel.NeoPixel(machine.Pin(' + dropdown_rgbpin + '), ' + value_ledcount + ', timing = True)\n';
return code;
}
export const actuator_neopixel_write = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_neopixel'] = 'import neopixel';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = v + '.write()\n';
return code;
}
export const actuator_neopixel_rgb = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_neopixel'] = 'import neopixel';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var value_led = generator.valueToCode(this, '_LED_', generator.ORDER_ATOMIC);
var value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
var value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
var value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
var code = v + '[' + value_led + '] = (' + value_rvalue + ', ' + value_gvalue + ', ' + value_bvalue + ')\n';
return code;
}
export const actuator_onboard_neopixel_write = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var code = 'mixgo.rgb.write()\n';
return code;
}
export const actuator_onboard_neopixel_rgb = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var value_led = generator.valueToCode(this, '_LED_', generator.ORDER_ATOMIC);
var value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
var value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
var value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
var code = 'mixgo.rgb[' + value_led + '] = (' + value_rvalue + ', ' + value_gvalue + ', ' + value_bvalue + ')\n';
return code;
}
export const actuator_onboard_neopixel_rgb_all = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
var value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
var value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
var code = 'mixgo.rgb.fill((' + value_rvalue + ', ' + value_gvalue + ', ' + value_bvalue + '))\n';
return code;
}
export const led_light = actuator_led_bright;
export const get_led_bright = actuator_get_led_bright;
export const led_brightness = actuator_led_brightness;

View File

@@ -0,0 +1,589 @@
import { Boards } from 'mixly';
export const servo_init = function (_, generator) {
generator.definitions_['import_servo'] = 'import servo';
generator.definitions_['import_board'] = 'import board';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = v + ' = servo.Servo(board.' + dropdown_pin + ')\n';
return code;
}
export const servo_speed_360 = function (_, generator) {
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var speed = generator.valueToCode(this, 'SPEED', generator.ORDER_ATOMIC);
var code = v + '.set_speed(' + speed + ')\n';
return code;
}
export const servo_set_angle = function (_, generator) {
generator.definitions_['import_servo'] = 'import servo';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
var code = 'servo.servo180_angle(' + dropdown_pin + ',' + num + ')\n';
return code;
}
export const servo_set_speed = function (_, generator) {
generator.definitions_['import_servo'] = 'import servo';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
var code = 'servo.servo360_speed(' + dropdown_pin + ',' + num + ')\n';
return code;
}
export const servo_get_angle = function (_, generator) {
generator.definitions_['import_servo'] = 'import servo';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'servo.servo180_angle(' + dropdown_pin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const servo_get_speed = function (_, generator) {
generator.definitions_['import_servo'] = 'import servo';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'servo.servo360_speed(' + dropdown_pin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const actuator_ms32006_init = function (_, generator) {
generator.definitions_['import ms32006'] = 'import ms32006';
var address = this.getFieldValue('mode')
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var sub1 = generator.valueToCode(this, 'SUB1', generator.ORDER_ATOMIC);
var code = sub + '=ms32006.MS32006(' + sub1 + ',addr=' + address + ')\n';
return code;
}
export const actuator_ms32006_dcmotor = function (_, generator) {
generator.definitions_['import ms32006'] = 'import ms32006';
var direction = this.getFieldValue('direction')
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
var code = sub + '.dc_motor(' + direction + ',' + speed + ')\n';
return code;
}
export const actuator_ms32006_stepper = function (_, generator) {
generator.definitions_['import ms32006'] = 'import ms32006';
var mode = this.getFieldValue('mode')
var direction = this.getFieldValue('direction')
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
var steps = generator.valueToCode(this, 'steps', generator.ORDER_ATOMIC);
var code = sub + '.move(' + mode + ',' + direction + ',' + speed + ',' + steps + ')\n';
return code;
}
export const esp32_music_pitch_init = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var dropdown_rgbpin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
generator.definitions_['import_music'] = 'import music';
var code = v + ' = music.MIDI(' + dropdown_rgbpin + ')\n';
return code;
}
export const esp32_music_pitch = function (block, generator) {
generator.definitions_['import_music'] = 'import music';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var number_pitch = generator.valueToCode(block, 'pitch', generator.ORDER_ATOMIC);
var code = v + '.pitch(' + number_pitch + ')\n';
return code;
}
export const esp32_music_pitch_with_time = function (block, generator) {
generator.definitions_['import_music'] = 'import music';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var number_pitch = generator.valueToCode(block, 'pitch', generator.ORDER_ATOMIC);
var number_time = generator.valueToCode(block, 'time', generator.ORDER_ATOMIC);
var code = v + '.pitch_time(' + number_pitch + ', ' + number_time + ')\n';
return code;
}
export const esp32_music_stop = function (block, generator) {
generator.definitions_['import_music'] = 'import music';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = v + '.stop(' + ')\n';
return code;
}
export const esp32_music_set_tempo_extern = function (_, generator) {
generator.definitions_['import_music'] = 'import music';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var bpm = generator.valueToCode(this, 'BPM', generator.ORDER_ASSIGNMENT);
var ticks = generator.valueToCode(this, 'TICKS', generator.ORDER_ASSIGNMENT);
var code = v + ".set_tempo(" + ticks + ", " + bpm + ")\n";
return code;
}
export const esp32_music_get_tempo_extern = function (_, generator) {
generator.definitions_['import_music'] = 'import music';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = v + ".get_tempo()";
return [code, generator.ORDER_ATOMIC];
}
export const esp32_music_play_list = function (_, generator) {
generator.definitions_['import_music'] = 'import music';
var lst = generator.valueToCode(this, 'LIST', generator.ORDER_ASSIGNMENT);
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = v + ".play(" + v + '.' + lst + ")\n";
return code;
}
export const esp32_music_reset_extern = function (_, generator) {
generator.definitions_['import_music'] = 'import music';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
return v + ".reset()\n";
}
export const servo_move = function (_, generator) {
generator.definitions_['import_servo'] = 'import servo';
generator.definitions_['import_machine'] = 'import machine';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var value_degree = generator.valueToCode(this, 'DEGREE', generator.ORDER_ATOMIC);
var code = 'servo.servo_write_angle(' + dropdown_pin + ',' + value_degree + ')\n';
return code;
}
export const actuator_extern_led_bright = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var bright = generator.valueToCode(this, 'bright', generator.ORDER_ATOMIC);
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
// var bright = this.getFieldValue('bright');
var code = "mixgo.LED(" + pin + ").setonoff(" + bright + ")\n";
return code;
}
export const actuator_extern_get_led_bright = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = "mixgo.LED(" + pin + ").getbrightness(" + ")";
return [code, generator.ORDER_ATOMIC];
}
export const actuator_extern_get_led_state = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = "mixgo.LED(" + pin + ").getonoff(" + ")";
return [code, generator.ORDER_ATOMIC];
}
export const actuator_extern_led_brightness = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var flag = generator.valueToCode(this, 'bright', generator.ORDER_ATOMIC);
var code = 'mixgo.LED(' + pin + ').setbrightness(' + flag + ')\n';
return code;
}
export const actuator_neopixel_init = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var dropdown_rgbpin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var value_ledcount = generator.valueToCode(this, 'LEDCOUNT', generator.ORDER_ATOMIC);
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_neopixel'] = 'import neopixel';
var code = v + ' = neopixel.NeoPixel(machine.Pin(' + dropdown_rgbpin + '), ' + value_ledcount + ')\n';
return code;
}
export const actuator_neopixel_rgb_all = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
var value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
var value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
var code = v + '.fill((' + value_rvalue + ', ' + value_gvalue + ', ' + value_bvalue + '))\n';
return code;
}
export const actuator_neopixel_write = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_neopixel'] = 'import neopixel';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = v + '.write()\n';
return code;
}
export const actuator_neopixel_rgb = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_neopixel'] = 'import neopixel';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var value_led = generator.valueToCode(this, '_LED_', generator.ORDER_ATOMIC);
var value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
var value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
var value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
var code = v + '[' + value_led + '] = (' + value_rvalue + ', ' + value_gvalue + ', ' + value_bvalue + ')\n';
return code;
}
export const actuator_use_uart_init = function (_, generator) {
generator.definitions_['import_syn6288'] = 'import syn6288';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = v + '=syn6288.SYN6288(' + key + ')\n';
return code;
}
export const syn6288_set_voice = function (_, generator) {
generator.definitions_['import_music'] = 'import music';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var voice = generator.valueToCode(this, 'VOICE', generator.ORDER_ASSIGNMENT);
var code = v + ".volume(" + voice + ")\n";
return code;
}
export const syn6288_get_voice = function (_, generator) {
generator.definitions_['import_music'] = 'import music';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = v + ".volume()";
return [code, generator.ORDER_ATOMIC];
}
export const syn6288_builtin_voice = function (_, generator) {
generator.definitions_['import_music'] = 'import music';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var mode = this.getFieldValue('mode');
var voice = generator.valueToCode(this, 'VOICE', generator.ORDER_ASSIGNMENT);
var code = v + ".hint_tones(" + voice + ',blocking=' + mode + ")\n";
return code;
}
export const syn6288_tts_play = function (_, generator) {
generator.definitions_['import_music'] = 'import music';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var mode = this.getFieldValue('mode');
var voice = generator.valueToCode(this, 'VOICE', generator.ORDER_ASSIGNMENT);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = v + ".synthesis(" + data + ',music=' + voice + ',blocking=' + mode + ")\n";
return code;
}
//mixbot extern below:
export const mixbot_addr_extern = function (_, generator) {
var code = this.getFieldValue('PIN');
return [code, generator.ORDER_ATOMIC];
}
export const robot_motor_extern = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var mode = this.getFieldValue('mode');
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
if (version == 'mixbot') {
generator.definitions_['import_mixbot_ext_ext_motor'] = 'from mixbot_ext import ext_motor';
var code = 'ext_motor.run(' + mode + ',' + speed + ")\n";
return code;
} else if (version == 'feiyi') {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_i2cdevice'] = 'import i2cdevice';
if (mode == "0") {
generator.definitions_['import_left_ext_i2c'] = 'ext_i2c_left = i2cdevice.I2C_device(scl = machine.Pin(0), sda = machine.Pin(1), freq = 10000)';
generator.definitions_['import_left_motor'] = 'ext_motor_left = i2cdevice.Motor(ext_i2c_left)';
var code = 'ext_motor_left.run(0,' + speed + ')\n';
} else if (mode == "1") {
generator.definitions_['import_right_ext_i2c'] = 'ext_i2c_right = i2cdevice.I2C_device(scl = machine.Pin(2), sda = machine.Pin(3), freq = 10000)';
generator.definitions_['import_right_motor'] = 'ext_motor_right = i2cdevice.Motor(ext_i2c_right)';
var code = 'ext_motor_right.run(0,' + speed + ')\n';
}
return code;
}
}
export const robot_motor_extern_get_speed = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var mode = this.getFieldValue('mode');
if (version == 'mixbot') {
var code = 'ext_motor.run(' + mode + ")";
return [code, generator.ORDER_ATOMIC];
} else if (version == 'feiyi') {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_i2cdevice'] = 'import i2cdevice';
if (mode == "0") {
generator.definitions_['import_left_ext_i2c'] = 'ext_i2c_left = i2cdevice.I2C_device(scl = machine.Pin(0), sda = machine.Pin(1), freq = 10000)';
generator.definitions_['import_left_motor'] = 'ext_motor_left = i2cdevice.Motor(ext_i2c_left)';
var code = 'ext_motor_left.run()';
} else if (mode == "1") {
generator.definitions_['import_right_ext_i2c'] = 'ext_i2c_right = i2cdevice.I2C_device(scl = machine.Pin(2), sda = machine.Pin(3), freq = 10000)';
generator.definitions_['import_right_motor'] = 'ext_motor_right = i2cdevice.Motor(ext_i2c_right)';
var code = 'ext_motor_right.run()';
}
return [code, generator.ORDER_ATOMIC];
}
}
export const robot_traffic_light_extern = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var mode = this.getFieldValue('mode');
var light = this.getFieldValue('light');
if (version == 'mixbot') {
generator.definitions_['import_mixbot_ext_ext_traffic'] = 'from mixbot_ext import ext_traffic';
var mode = this.getFieldValue('mode');
var light = this.getFieldValue('light');
var code = 'ext_traffic.led(' + mode + ',';
if (light == '0' || light == '1' || light == '2') { code += '0' + ',' }
else if (light == '3' || light == '4') { code += '1' + ',' }
else if (light == '5' || light == '6') { code += '2' + ',' }
if (light == '0') { code += '0' }
else if (light == '1' || light == '3' || light == '5') { code += '1' }
else if (light == '2' || light == '4' || light == '6') { code += '-1' }
code += ")\n";
return code;
} else if (version == 'feiyi') {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_i2cdevice'] = 'import i2cdevice';
if (mode == "0") {
generator.definitions_['import_left_ext_i2c'] = 'ext_i2c_left = i2cdevice.I2C_device(scl = machine.Pin(0), sda = machine.Pin(1), freq = 10000)';
generator.definitions_['import_left_traffic'] = 'ext_traffic_left = i2cdevice.Traffic_LED(ext_i2c_left)';
var code = 'ext_traffic_left.led(0,';
} else if (mode == "1") {
generator.definitions_['import_right_ext_i2c'] = 'ext_i2c_right = i2cdevice.I2C_device(scl = machine.Pin(2), sda = machine.Pin(3), freq = 10000)';
generator.definitions_['import_right_traffic'] = 'ext_traffic_right = i2cdevice.Traffic_LED(ext_i2c_right)';
var code = 'ext_traffic_right.led(0,';
}
if (light == '0' || light == '1' || light == '2') { code += '0' + ',' }
else if (light == '3' || light == '4') { code += '1' + ',' }
else if (light == '5' || light == '6') { code += '2' + ',' }
if (light == '0') { code += '0' }
else if (light == '1' || light == '3' || light == '5') { code += '1' }
else if (light == '2' || light == '4' || light == '6') { code += '-1' }
code += ")\n";
return code;
}
}
export const robot_led_extern = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var mode = this.getFieldValue('mode');
var color = this.getFieldValue('color');
var value = generator.valueToCode(this, 'value', generator.ORDER_ATOMIC);
if (version == 'mixbot') {
generator.definitions_['import_mixbot_ext_' + color + '_LED'] = 'from mixbot_ext import ' + color + '_LED';
var code = color + '_LED.brightness(' + mode + ',' + value + ")\n";
return code;
} else if (version == 'feiyi') {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_i2cdevice'] = 'import i2cdevice';
if (mode == "0") {
generator.definitions_['import_left_ext_i2c'] = 'ext_i2c_left = i2cdevice.I2C_device(scl = machine.Pin(0), sda = machine.Pin(1), freq = 10000)';
generator.definitions_['import_left_' + color + '_LED'] = 'ext_' + color + '_LED_left = i2cdevice.' + color + '_LED(ext_i2c_left)';
var code = 'ext_' + color + '_LED_left.brightness(' + '0,' + value + ")\n";
} else if (mode == "1") {
generator.definitions_['import_right_ext_i2c'] = 'ext_i2c_right = i2cdevice.I2C_device(scl = machine.Pin(2), sda = machine.Pin(3), freq = 10000)';
generator.definitions_['import_right_' + color + '_LED'] = 'ext_' + color + '_LED_right = i2cdevice.' + color + '_LED(ext_i2c_right)';
var code = 'ext_' + color + '_LED_right.brightness(' + '0,' + value + ")\n";
}
return code;
}
}
export const robot_led_extern_get_value = function (_, generator) {
var mode = this.getFieldValue('mode');
var color = this.getFieldValue('color');
var version = Boards.getSelectedBoardKey().split(':')[2]
if (version == 'mixbot') {
generator.definitions_['import_mixbot_ext_' + color + '_LED'] = 'from mixbot_ext import ' + color + '_LED';
var code = color + '_LED.brightness(' + mode + ")";
return [code, generator.ORDER_ATOMIC];
} else if (version == 'feiyi') {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_i2cdevice'] = 'import i2cdevice';
if (mode == "0") {
generator.definitions_['import_left_ext_i2c'] = 'ext_i2c_left = i2cdevice.I2C_device(scl = machine.Pin(0), sda = machine.Pin(1), freq = 10000)';
generator.definitions_['import_left_' + color + '_LED'] = 'ext_' + color + '_LED_left = i2cdevice.' + color + '_LED(ext_i2c_left)';
var code = 'ext_' + color + '_LED_left.brightness(0)';
} else if (mode == "1") {
generator.definitions_['import_right_ext_i2c'] = 'ext_i2c_right = i2cdevice.I2C_device(scl = machine.Pin(2), sda = machine.Pin(3), freq = 10000)';
generator.definitions_['import_right_' + color + '_LED'] = 'ext_' + color + '_LED_right = i2cdevice.' + color + '_LED(ext_i2c_right)';
var code = 'ext_' + color + '_LED_right.brightness(0)';
}
return [code, generator.ORDER_ATOMIC];
}
}
export const robot_servo_extern_get_status = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var mode = this.getFieldValue('mode');
var status = this.getFieldValue('status');
if (version == 'mixbot') {
generator.definitions_['import_mixbot_ext_ext_servo'] = 'from mixbot_ext import ext_servo';
var code = 'ext_servo.state(' + mode + ")" + status;
return [code, generator.ORDER_ATOMIC];
} else if (version == 'feiyi') {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_i2cdevice'] = 'import i2cdevice';
if (mode == "0") {
generator.definitions_['import_left_ext_i2c'] = 'ext_i2c_left = i2cdevice.I2C_device(scl = machine.Pin(0), sda = machine.Pin(1), freq = 10000)';
generator.definitions_['import_left_servo'] = 'ext_servo_left = i2cdevice.Motor_servo(ext_i2c_left)';
var code = 'ext_servo_left.state(0)' + status;
} else if (mode == "1") {
generator.definitions_['import_right_ext_i2c'] = 'ext_i2c_right = i2cdevice.I2C_device(scl = machine.Pin(2), sda = machine.Pin(3), freq = 10000)';
generator.definitions_['import_right_servo'] = 'ext_servo_right = i2cdevice.Motor_servo(ext_i2c_right)';
var code = 'ext_servo_right.state(0)' + status;
}
return [code, generator.ORDER_ATOMIC];
}
}
export const robot_servo_extern_stop_mode = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var mode = this.getFieldValue('mode');
var status = this.getFieldValue('status');
if (version == 'mixbot') {
generator.definitions_['import_mixbot_ext_ext_servo'] = 'from mixbot_ext import ext_servo';
var code = 'ext_servo.stop_mode(' + mode + "," + status + ")\n";
return code;
} else if (version == 'feiyi') {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_i2cdevice'] = 'import i2cdevice';
if (mode == "0") {
generator.definitions_['import_left_ext_i2c'] = 'ext_i2c_left = i2cdevice.I2C_device(scl = machine.Pin(0), sda = machine.Pin(1), freq = 10000)';
generator.definitions_['import_left_servo'] = 'ext_servo_left = i2cdevice.Motor_servo(ext_i2c_left)';
var code = 'ext_servo_left.stop_mode(' + "0," + status + ")\n";
} else if (mode == "1") {
generator.definitions_['import_right_ext_i2c'] = 'ext_i2c_right = i2cdevice.I2C_device(scl = machine.Pin(2), sda = machine.Pin(3), freq = 10000)';
generator.definitions_['import_right_servo'] = 'ext_servo_right = i2cdevice.Motor_servo(ext_i2c_right)';
var code = 'ext_servo_right.stop_mode(' + "0," + status + ")\n";
}
return code;
}
}
export const robot_servo_extern_stop = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var mode = this.getFieldValue('mode');
if (version == 'mixbot') {
generator.definitions_['import_mixbot_ext_ext_servo'] = 'from mixbot_ext import ext_servo';
var code = 'ext_servo.stop(' + mode + ")\n";
return code;
} else if (version == 'feiyi') {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_i2cdevice'] = 'import i2cdevice';
if (mode == "0") {
generator.definitions_['import_left_ext_i2c'] = 'ext_i2c_left = i2cdevice.I2C_device(scl = machine.Pin(0), sda = machine.Pin(1), freq = 10000)';
generator.definitions_['import_left_servo'] = 'ext_servo_left = i2cdevice.Motor_servo(ext_i2c_left)';
var code = 'ext_servo_left.stop(0)\n';
} else if (mode == "1") {
generator.definitions_['import_right_ext_i2c'] = 'ext_i2c_right = i2cdevice.I2C_device(scl = machine.Pin(2), sda = machine.Pin(3), freq = 10000)';
generator.definitions_['import_right_servo'] = 'ext_servo_right = i2cdevice.Motor_servo(ext_i2c_right)';
var code = 'ext_servo_right.stop(0)\n';
}
return code;
}
}
export const robot_servo_extern_absolute_run = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var mode = this.getFieldValue('mode');
var status = this.getFieldValue('status');
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
var direction = this.getFieldValue('direction');
var angle = generator.valueToCode(this, 'angle', generator.ORDER_ATOMIC);
if (version == 'mixbot') {
generator.definitions_['import_mixbot_ext_ext_servo'] = 'from mixbot_ext import ext_servo';
var code = 'ext_servo.absolute_run(' + mode + "," + status + "," + speed + "," + direction + "," + angle + ")\n";
return code;
} else if (version == 'feiyi') {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_i2cdevice'] = 'import i2cdevice';
if (mode == "0") {
generator.definitions_['import_left_ext_i2c'] = 'ext_i2c_left = i2cdevice.I2C_device(scl = machine.Pin(0), sda = machine.Pin(1), freq = 10000)';
generator.definitions_['import_left_servo'] = 'ext_servo_left = i2cdevice.Motor_servo(ext_i2c_left)';
var code = 'ext_servo_left.absolute_run(' + "0," + status + "," + speed + "," + direction + "," + angle + ")\n";
} else if (mode == "1") {
generator.definitions_['import_right_ext_i2c'] = 'ext_i2c_right = i2cdevice.I2C_device(scl = machine.Pin(2), sda = machine.Pin(3), freq = 10000)';
generator.definitions_['import_right_servo'] = 'ext_servo_right = i2cdevice.Motor_servo(ext_i2c_right)';
var code = 'ext_servo_right.absolute_run(' + "0," + status + "," + speed + "," + direction + "," + angle + ")\n";
}
return code;
}
}
export const robot_servo_extern_relative_origin = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var mode = this.getFieldValue('mode');
if (version == 'mixbot') {
generator.definitions_['import_mixbot_ext_ext_servo'] = 'from mixbot_ext import ext_servo';
var code = 'ext_servo.relative_origin(' + mode + ")\n";
return code;
} else if (version == 'feiyi') {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_i2cdevice'] = 'import i2cdevice';
if (mode == "0") {
generator.definitions_['import_left_ext_i2c'] = 'ext_i2c_left = i2cdevice.I2C_device(scl = machine.Pin(0), sda = machine.Pin(1), freq = 10000)';
generator.definitions_['import_left_servo'] = 'ext_servo_left = i2cdevice.Motor_servo(ext_i2c_left)';
var code = 'ext_servo_left.relative_origin(0)\n';
} else if (mode == "1") {
generator.definitions_['import_right_ext_i2c'] = 'ext_i2c_right = i2cdevice.I2C_device(scl = machine.Pin(2), sda = machine.Pin(3), freq = 10000)';
generator.definitions_['import_right_servo'] = 'ext_servo_right = i2cdevice.Motor_servo(ext_i2c_right)';
var code = 'ext_servo_right.relative_origin(0)\n';
}
return code;
}
}
export const robot_servo_extern_relative_run = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var mode = this.getFieldValue('mode');
var status = this.getFieldValue('status');
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
var angle = generator.valueToCode(this, 'angle', generator.ORDER_ATOMIC);
if (version == 'mixbot') {
generator.definitions_['import_mixbot_ext_ext_servo'] = 'from mixbot_ext import ext_servo';
var code = 'ext_servo.relative_run(' + mode + "," + status + "," + speed + "," + angle + ")\n";
return code;
} else if (version == 'feiyi') {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_i2cdevice'] = 'import i2cdevice';
if (mode == "0") {
generator.definitions_['import_left_ext_i2c'] = 'ext_i2c_left = i2cdevice.I2C_device(scl = machine.Pin(0), sda = machine.Pin(1), freq = 10000)';
generator.definitions_['import_left_servo'] = 'ext_servo_left = i2cdevice.Motor_servo(ext_i2c_left)';
var code = 'ext_servo_left.relative_run(' + "0," + status + "," + speed + "," + angle + ")\n";
} else if (mode == "1") {
generator.definitions_['import_right_ext_i2c'] = 'ext_i2c_right = i2cdevice.I2C_device(scl = machine.Pin(2), sda = machine.Pin(3), freq = 10000)';
generator.definitions_['import_right_servo'] = 'ext_servo_right = i2cdevice.Motor_servo(ext_i2c_right)';
var code = 'ext_servo_right.relative_run(' + "0," + status + "," + speed + "," + angle + ")\n";
}
return code;
}
}
export const robot_servo_extern_relative_continue = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var mode = this.getFieldValue('mode');
var status = this.getFieldValue('status');
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
var direction = this.getFieldValue('direction');
if (version == 'mixbot') {
generator.definitions_['import_mixbot_ext_ext_servo'] = 'from mixbot_ext import ext_servo';
var code = 'ext_servo.relative_continue(' + mode + "," + status + "," + speed + "," + direction + ")\n";
return code;
} else if (version == 'feiyi') {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_i2cdevice'] = 'import i2cdevice';
if (mode == "0") {
generator.definitions_['import_left_ext_i2c'] = 'ext_i2c_left = i2cdevice.I2C_device(scl = machine.Pin(0), sda = machine.Pin(1), freq = 10000)';
generator.definitions_['import_left_servo'] = 'ext_servo_left = i2cdevice.Motor_servo(ext_i2c_left)';
var code = 'ext_servo_left.relative_continue(' + "0," + status + "," + speed + "," + direction + ")\n";
} else if (mode == "1") {
generator.definitions_['import_right_ext_i2c'] = 'ext_i2c_right = i2cdevice.I2C_device(scl = machine.Pin(2), sda = machine.Pin(3), freq = 10000)';
generator.definitions_['import_right_servo'] = 'ext_servo_right = i2cdevice.Motor_servo(ext_i2c_right)';
var code = 'ext_servo_right.relative_continue(' + "0," + status + "," + speed + "," + direction + ")\n";
}
return code;
}
}
export const mixbot_actuator_extern_get_addr = function (_, generator) {
var name = this.getFieldValue('name');
generator.definitions_['import_mixbot_ext_' + name] = 'from mixbot_ext import ' + name;
var code = name + '.addr_get()';
return [code, generator.ORDER_ATOMIC];
}
export const mixbot_actuator_extern_set_addr = function (_, generator) {
var name = this.getFieldValue('name');
generator.definitions_['import_mixbot_ext_' + name] = 'from mixbot_ext import ' + name;
var oldaddr = generator.valueToCode(this, 'old', generator.ORDER_ATOMIC);
var newaddr = generator.valueToCode(this, 'new', generator.ORDER_ATOMIC);
var code = name + '.addr_set(' + oldaddr + ',' + newaddr + ')\n';
return code;
}

View File

@@ -0,0 +1,445 @@
import { Boards } from 'mixly';
export const esp32_music_set_tempo = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_music'] = 'from ' + version + ' import onboard_music';
var bpm = generator.valueToCode(this, 'BPM', generator.ORDER_ASSIGNMENT);
var ticks = generator.valueToCode(this, 'TICKS', generator.ORDER_ASSIGNMENT);
var code = "onboard_music.set_tempo(" + ticks + ", " + bpm + ")\n";
return code;
}
export const esp32_music_get_tempo = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_music'] = 'from ' + version + ' import onboard_music';
var code = "onboard_music.get_tempo()";
return [code, generator.ORDER_ATOMIC];
}
export const esp32_onboard_music_pitch = function (block, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_music'] = 'from ' + version + ' import onboard_music';
var number_pitch = generator.valueToCode(block, 'pitch', generator.ORDER_ATOMIC);
var code = 'onboard_music.pitch(' + number_pitch + ')\n';
return code;
}
export const esp32_onboard_music_pitch_with_time = function (block, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var number_pitch = generator.valueToCode(block, 'pitch', generator.ORDER_ATOMIC);
var number_time = generator.valueToCode(block, 'time', generator.ORDER_ATOMIC);
if (version == 'mixgo_zero') {
generator.definitions_['import_mixgo_zero_voice_spk_midi'] = "from mixgo_zero_voice import spk_midi";
var code = 'spk_midi.pitch_time(' + number_pitch + ', ' + number_time + ')\n';
} else if (version == 'mixgo_nova') {
generator.definitions_['import_mixgo_nova_voice_spk_midi'] = "from mixgo_nova_voice import spk_midi";
var code = 'spk_midi.pitch_time(' + number_pitch + ', ' + number_time + ')\n';
} else {
generator.definitions_['import_' + version + '_onboard_music'] = 'from ' + version + ' import onboard_music';
var code = 'onboard_music.pitch_time(' + number_pitch + ', ' + number_time + ')\n';
}
return code;
}
export const esp32_onboard_music_stop = function (block, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_music'] = 'from ' + version + ' import onboard_music';
var code = 'onboard_music.stop(' + ')\n';
return code;
}
export const esp32_onboard_music_play_list = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var lst = generator.valueToCode(this, 'LIST', generator.ORDER_ASSIGNMENT);
if (version == 'mixgo_zero') {
generator.definitions_['import_mixgo_zero_voice_spk_midi'] = "from mixgo_zero_voice import spk_midi";
var code = "spk_midi.play(" + lst + ")\n";
} else if (version == 'mixgo_nova') {
generator.definitions_['import_mixgo_nova_voice_spk_midi'] = "from mixgo_nova_voice import spk_midi";
var code = "spk_midi.play(" + lst + ")\n";
} else {
generator.definitions_['import_' + version + '_onboard_music'] = 'from ' + version + ' import onboard_music';
var code = "onboard_music.play(" + lst + ")\n";
}
return code;
}
export const esp32_music_reset = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_music'] = 'from ' + version + ' import onboard_music';
return "onboard_music.reset()\n";
}
export const number = function (_, generator) {
var code = this.getFieldValue('op');
return [code, generator.ORDER_ATOMIC];
}
export const ledswitch = function (_, generator) {
var code = this.getFieldValue('flag');
return [code, generator.ORDER_ATOMIC];
}
export const actuator_led_bright = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var op = generator.valueToCode(this, 'led', generator.ORDER_ATOMIC);
generator.definitions_['import_' + version + '_onboard_led'] = 'from ' + version + ' import onboard_led';
var bright = generator.valueToCode(this, 'bright', generator.ORDER_ATOMIC);
var code = "onboard_led.setonoff(" + op + "," + bright + ")\n";
return code;
}
export const actuator_get_led_bright = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var op = generator.valueToCode(this, 'led', generator.ORDER_ATOMIC);
generator.definitions_['import_' + version + '_onboard_led'] = 'from ' + version + ' import onboard_led';
var code = "onboard_led.getbrightness(" + op + ")";
return [code, generator.ORDER_ATOMIC];
}
export const actuator_get_led_state = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var op = generator.valueToCode(this, 'led', generator.ORDER_ATOMIC);
generator.definitions_['import_' + version + '_onboard_led'] = 'from ' + version + ' import onboard_led';
var code = "onboard_led.getonoff(" + op + ")";
return [code, generator.ORDER_ATOMIC];
}
export const actuator_led_brightness = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var op = generator.valueToCode(this, 'led', generator.ORDER_ATOMIC);
generator.definitions_['import_' + version + '_onboard_led'] = 'from ' + version + ' import onboard_led';
var flag = generator.valueToCode(this, 'bright', generator.ORDER_ATOMIC);
var code = "onboard_led.setbrightness(" + op + "," + flag + ")\n";
return code;
}
export const actuator_mixgo_zero_led_color = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var op = generator.valueToCode(this, 'led', generator.ORDER_ATOMIC);
generator.definitions_['import_' + version + '_onboard_led'] = 'from ' + version + ' import onboard_led';
var color = this.getFieldValue('colorvalue');
var code = "onboard_led.setcolor(" + op + "," + color + ")\n";
return code;
}
export const cc_number = function (_, generator) {
var code = this.getFieldValue('op');
return [code, generator.ORDER_ATOMIC];
}
export const rm_actuator_led_bright = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var op = this.getFieldValue('color');
generator.definitions_['import_' + version + '_' + op + 'led'] = 'from ' + version + ' import ' + op + 'led';
var bright = generator.valueToCode(this, 'bright', generator.ORDER_ATOMIC);
var code = op + "led.setonoff(" + bright + ")\n";
return code;
}
export const rm_actuator_get_led_bright = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var op = this.getFieldValue('color');
generator.definitions_['import_' + version + '_' + op + 'led'] = 'from ' + version + ' import ' + op + 'led';
var code = op + "led.getbrightness()";
return [code, generator.ORDER_ATOMIC];
}
export const rm_actuator_get_led_state = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var op = this.getFieldValue('color');
generator.definitions_['import_' + version + '_' + op + 'led'] = 'from ' + version + ' import ' + op + 'led';
var code = op + "led.getonoff()";
return [code, generator.ORDER_ATOMIC];
}
export const rm_actuator_led_brightness = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var op = this.getFieldValue('color');
generator.definitions_['import_' + version + '_' + op + 'led'] = 'from ' + version + ' import ' + op + 'led';
var flag = generator.valueToCode(this, 'bright', generator.ORDER_ATOMIC);
var code = op + "led.setbrightness(" + flag + ")\n";
return code;
}
export const actuator_onboard_neopixel_write = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_rgb'] = 'from ' + version + ' import onboard_rgb';
var code = 'onboard_rgb.write()\n';
return code;
}
export const actuator_onboard_neopixel_rgb = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_rgb'] = 'from ' + version + ' import onboard_rgb';
var value_led = generator.valueToCode(this, '_LED_', generator.ORDER_ATOMIC);
var value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
var value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
var value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
var code = 'onboard_rgb[' + value_led + '] = (' + value_rvalue + ', ' + value_gvalue + ', ' + value_bvalue + ')\n';
return code;
}
export const actuator_onboard_neopixel_rgb_all = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_rgb'] = 'from ' + version + ' import onboard_rgb';
var value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
var value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
var value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
var code = 'onboard_rgb.fill((' + value_rvalue + ', ' + value_gvalue + ', ' + value_bvalue + '))\n';
return code;
}
export const actuator_onboard_neopixel_rgb_show_all_chase = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_rgb'] = 'from ' + version + ' import onboard_rgb';
var value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
var value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
var value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
var number_time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
var code = 'onboard_rgb.color_chase(' + value_rvalue + ', ' + value_gvalue + ', ' + value_bvalue + ', ' + number_time + ')\n';
return code;
}
export const actuator_onboard_neopixel_rgb_show_all_rainbow = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_rgb'] = 'from ' + version + ' import onboard_rgb';
var number_time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
var code = 'onboard_rgb.rainbow_cycle(' + number_time + ')\n';
return code;
}
export const rm_motor = function (_, generator) {
var wheel = this.getFieldValue('wheel');
generator.definitions_['import_rm_e1_motor' + wheel] = 'from rm_e1 import motor' + wheel;
var v = this.getFieldValue('direction');
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
var code = "motor" + wheel + '.motion("' + v + '",' + speed + ")\n";
return code;
}
//c3 motor onboard
export const actuator_stepper_keep = function (_, generator) {
var v = this.getFieldValue('VAR');
generator.definitions_['import_mixgocar_c3_car'] = 'from mixgocar_c3 import car';
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ASSIGNMENT);
var code = 'car.motor_move("' + v + '",' + speed + ")\n";
return code;
}
export const actuator_stepper_stop = function (_, generator) {
var v = this.getFieldValue('VAR');
generator.definitions_['import_mixgocar_c3_car'] = 'from mixgocar_c3 import car';
var code = 'car.motor_move("' + v + '"' + ")\n";
return code;
}
export const actuator_dc_motor = function (_, generator) {
var wheel = this.getFieldValue('wheel');
generator.definitions_['import_mixgocar_c3_car'] = 'from mixgocar_c3 import car';
var v = this.getFieldValue('direction');
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
var code = "car.motor(car.MOTO_" + wheel + ',"' + v + '",' + speed + ")\n";
return code;
}
export const actuator_dc_motor_stop = function (_, generator) {
var wheel = this.getFieldValue('wheel');
generator.definitions_['import_mixgocar_c3_car'] = 'from mixgocar_c3 import car';
var v = this.getFieldValue('direction');
var code = "car.motor(car.MOTO_" + wheel + ',"' + v + '"' + ")\n";
return code;
}
//mixbot onboard_motor below:
export const mixbot_motor_status = function (_, generator) {
generator.definitions_['import_mixbot_motor'] = 'from mixbot import motor';
var code = 'motor.status()';
return [code, generator.ORDER_ATOMIC];
}
export const mixbot_move = function (_, generator) {
var v = this.getFieldValue('VAR');
var mode = this.getFieldValue('mode');
generator.definitions_['import_mixbot_motor'] = 'from mixbot import motor';
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ASSIGNMENT);
var code = 'motor.move("' + v + '",motor.' + mode + '_MODE,' + speed + ")\n";
return code;
}
export const mixbot_stop = function (_, generator) {
var v = this.getFieldValue('VAR');
generator.definitions_['import_mixbot_motor'] = 'from mixbot import motor';
if (v == 'N') {
var code = 'motor.move("N",motor.STOP_MODE)\n'
} else if (v == 'P') {
var code = 'motor.move("P",motor.BRAKE_MODE)\n'
}
return code;
}
export const mixbot_motor = function (_, generator) {
var wheel = this.getFieldValue('wheel');
generator.definitions_['import_mixbot_motor'] = 'from mixbot import motor';
var mode = this.getFieldValue('mode');
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
var code = 'motor.run(' + wheel + ',motor.' + mode + '_MODE,' + speed + ")\n";
return code;
}
export const actuator_mixbot_buzzer_on_off = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_spk_en'] = 'from ' + version + ' import spk_en';
var op = this.getFieldValue('on_off');
var code = "spk_en.value(" + op + ")\n";
return code;
}
//bitbot onboard_motor below:
export const bitbot_move = function (_, generator) {
var v = this.getFieldValue('VAR');
generator.definitions_['import_feiyi_onboard_bot51'] = 'from feiyi import onboard_bot51';
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ASSIGNMENT);
var code = 'onboard_bot51.move("' + v + '",' + speed + ")\n";
return code;
}
export const bitbot_stop = function (_, generator) {
var v = this.getFieldValue('VAR');
generator.definitions_['import_feiyi_onboard_bot51'] = 'from feiyi import onboard_bot51';
var code = 'onboard_bot51.move("' + v + '"' + ")\n";
return code;
}
export const bitbot_motor = function (_, generator) {
var wheel = this.getFieldValue('wheel');
var direction = this.getFieldValue('direction');
generator.definitions_['import_feiyi_onboard_bot51'] = 'from feiyi import onboard_bot51';
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
var code = 'onboard_bot51.motor(' + wheel + ',"' + direction + '",' + speed + ")\n";
return code;
}
export const actuator_mixgo_nova_mic_set = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
if (version == 'mixgo_zero') {
generator.definitions_['import_mixgo_zero_voice_ob_code'] = "from mixgo_zero_voice import ob_code";
} else {
generator.definitions_['import_mixgo_nova_voice_ob_code'] = "from mixgo_nova_voice import ob_code";
}
var bright = generator.valueToCode(this, 'bright', generator.ORDER_ATOMIC);
var code = "ob_code.mic_volume(" + bright + ")\n";
return code;
}
export const actuator_mixgo_nova_mic_get = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
if (version == 'mixgo_zero') {
generator.definitions_['import_mixgo_zero_voice_ob_code'] = "from mixgo_zero_voice import ob_code";
} else {
generator.definitions_['import_mixgo_nova_voice_ob_code'] = "from mixgo_nova_voice import ob_code";
}
var code = "ob_code.mic_volume()";
return [code, generator.ORDER_ATOMIC];
}
export const actuator_mixgo_nova_voice_set = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var version = Boards.getSelectedBoardKey().split(':')[2]
if (version == 'mixgo_zero') {
generator.definitions_['import_mixgo_zero_voice_ob_code'] = "from mixgo_zero_voice import ob_code";
} else {
generator.definitions_['import_mixgo_nova_voice_ob_code'] = "from mixgo_nova_voice import ob_code";
}
var bright = generator.valueToCode(this, 'bright', generator.ORDER_ATOMIC);
var code = "ob_code.voice_volume(" + bright + ")\n";
return code;
}
export const actuator_mixgo_nova_voice_get = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
if (version == 'mixgo_zero') {
generator.definitions_['import_mixgo_zero_voice_ob_code'] = "from mixgo_zero_voice import ob_code";
} else {
generator.definitions_['import_mixgo_nova_voice_ob_code'] = "from mixgo_nova_voice import ob_code";
}
var code = "ob_code.voice_volume()";
return [code, generator.ORDER_ATOMIC];
}
export const actuator_mixgo_nova_record_audio = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
if (version == 'mixgo_zero') {
generator.definitions_['import_mixgo_zero_voice_record_audio'] = "from mixgo_zero_voice import record_audio";
} else {
generator.definitions_['import_mixgo_nova_voice_record_audio'] = "from mixgo_nova_voice import record_audio";
}
var path = generator.valueToCode(this, 'PATH', generator.ORDER_ASSIGNMENT);
var time = generator.valueToCode(this, 'TIME', generator.ORDER_ASSIGNMENT);
var code = "record_audio(" + path + ", " + time + ")\n";
return code;
}
export const actuator_mixgo_nova_play_audio = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
if (version == 'mixgo_zero') {
generator.definitions_['import_mixgo_zero_voice_play_audio'] = "from mixgo_zero_voice import play_audio";
} else {
generator.definitions_['import_mixgo_nova_voice_play_audio'] = "from mixgo_nova_voice import play_audio";
}
var path = generator.valueToCode(this, 'PATH', generator.ORDER_ASSIGNMENT);
var code = "play_audio(" + path + ")\n";
return code;
}
export const actuator_mixgo_nova_play_online_audio = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
if (version == 'mixgo_zero') {
generator.definitions_['import_mixgo_zero_voice_play_audio_url'] = "from mixgo_zero_voice import play_audio_url";
} else {
generator.definitions_['import_mixgo_nova_voice_play_audio_url'] = "from mixgo_nova_voice import play_audio_url";
}
var path = generator.valueToCode(this, 'PATH', generator.ORDER_ASSIGNMENT);
var code = "play_audio_url(" + path + ")\n";
return code;
}
export const actuator_mixgo_nova_onboard_music_pitch = function (block, generator) {
generator.definitions_['import_mixgo_nova_voice_spk_midi'] = "from mixgo_nova_voice import spk_midi";
var number_pitch = generator.valueToCode(block, 'pitch', generator.ORDER_ATOMIC);
var code = 'spk_midi.pitch(' + number_pitch + ')\n';
return code;
}
export const actuator_mixgo_nova_onboard_music_stop = function (block, generator) {
generator.definitions_['import_mixgo_nova_voice_spk_midi'] = "from mixgo_nova_voice import spk_midi";
var code = 'spk_midi.stop(' + ')\n';
return code;
}
export const set_power_output = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
var index = this.getFieldValue('index');
var duty = generator.valueToCode(this, 'duty', generator.ORDER_ATOMIC);
generator.definitions_['import_' + version + '_onboard_bot'] = 'from ' + version + ' import onboard_bot';
var code = 'onboard_bot.usben(' + index + ',' + duty + ')\n';
return code;
}
export const get_power_output = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
var index = this.getFieldValue('index');
generator.definitions_['import_' + version + '_onboard_bot'] = 'from ' + version + ' import onboard_bot';
var code = 'onboard_bot.usben(' + index + ')';
return [code, generator.ORDER_ATOMIC];
}
export const set_all_power_output = function (_, generator) {
var version = generator.getSelectedBoardKey().split(':')[2];
var duty = generator.valueToCode(this, 'duty', generator.ORDER_ATOMIC);
generator.definitions_['import_' + version + '_onboard_bot'] = 'from ' + version + ' import onboard_bot';
var code = 'onboard_bot.usben(freq = ' + duty + ')\n';
return code;
}

View File

@@ -0,0 +1,36 @@
import * as Mixly from 'mixly';
export const MICROPYTHON_AI_client = function (_, generator) {
var ctype = this.getFieldValue('CTYPE');
generator.definitions_['import_baidu_speech'] = 'import baidu_speech';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var api_key = generator.valueToCode(this, 'API_KEY', generator.ORDER_ATOMIC);
var sound = '';
if (ctype == "ASR") {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_sound'] = "from " + version + " import onboard_sound";
sound += 'onboard_sound.adc' + ',';
}
var secret_key = generator.valueToCode(this, 'SECRET_KEY', generator.ORDER_ATOMIC);
var code = v + ' = ' + 'baidu_speech.' + ctype + '(' + sound + api_key + ', ' + secret_key + ')\n';
return code;
}
export const MICROPYTHON_AI_Speech_unit = function (_, generator) {
generator.definitions_['import_baidu_speech'] = 'import baidu_speech';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var id = generator.valueToCode(this, 'ID', generator.ORDER_ATOMIC);
var s = generator.valueToCode(this, 'STR', generator.ORDER_ATOMIC);
var code = v + '.chatbot(' + id + ',' + s + ')';
return [code, generator.ORDER_ATOMIC];
}
export const MICROPYTHON_AI_Speech_asr = function (_, generator) {
var language = this.getFieldValue('LANGUAGE');
generator.definitions_['import_baidu_speech'] = 'import baidu_speech';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var fn = generator.valueToCode(this, 'FILE', generator.ORDER_ATOMIC) || '""';
var code = v + '.recognize(record_time=' + fn + ',dev_pid=' + language + ')';
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,283 @@
export const ai_sensor_use_uart_init = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = v + '=mixgo_ai.AI(' + key + ',quick=1)\n';
return code;
}
export const ai_sensor_qrcode_lite = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var type = this.getFieldValue('TYPE');
var code = sub + '.find_' + type + '()';
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_config = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var rx = generator.valueToCode(this, 'RX', generator.ORDER_ATOMIC);
var tx = generator.valueToCode(this, 'TX', generator.ORDER_ATOMIC);
var dropdown_uart = this.getFieldValue('mode');
var code = v + '.configure(' + tx + ',' + rx + ',restart=' + dropdown_uart + ')\n';
return code;
}
export const ai_sensor_rgb = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var led1 = generator.valueToCode(this, 'led1', generator.ORDER_ATOMIC);
var led2 = generator.valueToCode(this, 'led2', generator.ORDER_ATOMIC);
var code = v + '.led_rgb(' + led1 + ',' + led2 + ')\n';
return code;
}
export const ai_sensor_qrcode = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + '.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_find_qrcodes = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = v + '.find_qrcodes()';
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_barcode = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + '.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_find_barcodes = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = v + '.find_barcodes()';
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_tag = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + '.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_find_tags = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = v + '.find_apriltags()';
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_line = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + '.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_find_lines = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var v1 = generator.valueToCode(this, 'VAR1', generator.ORDER_ATOMIC);
var v2 = generator.valueToCode(this, 'VAR2', generator.ORDER_ATOMIC);
var v3 = generator.valueToCode(this, 'VAR3', generator.ORDER_ATOMIC);
var code = v + '.find_lines(' + v1 + ',' + v2 + ',' + v3 + ')';
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_circle = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + '.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_find_circles = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var v1 = generator.valueToCode(this, 'VAR1', generator.ORDER_ATOMIC);
var v2 = generator.valueToCode(this, 'VAR2', generator.ORDER_ATOMIC);
var v3 = generator.valueToCode(this, 'VAR3', generator.ORDER_ATOMIC);
var code = v + '.find_circles(' + v1 + ',' + v2 + ',' + v3 + ')';
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_rect = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + '.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_find_rects = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var v1 = generator.valueToCode(this, 'VAR1', generator.ORDER_ATOMIC);
var code = v + '.find_rects(' + v1 + ')';
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_color = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + key;
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_find_colors = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = v + '.find_colors()';
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_color_chases_result = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + '.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_color_chases = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var v1 = generator.valueToCode(this, 'VAR1', generator.ORDER_ATOMIC);
var v2 = generator.valueToCode(this, 'VAR2', generator.ORDER_ATOMIC);
var v3 = generator.valueToCode(this, 'VAR3', generator.ORDER_ATOMIC);
var code = v + '.color_track(' + v1 + ',' + v2 + ',' + v3 + ')';
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_ailocal_train = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var v1 = generator.valueToCode(this, 'VAR1', generator.ORDER_ATOMIC);
var v2 = generator.valueToCode(this, 'VAR2', generator.ORDER_ATOMIC);
var v3 = generator.valueToCode(this, 'VAR3', generator.ORDER_ATOMIC);
var v4 = generator.valueToCode(this, 'VAR4', generator.ORDER_ATOMIC);
var code = v + '.ailocal_train(' + v1 + ',' + v2 + ',' + v3 + ',' + v4 + ')\n';
return code;
}
export const ai_sensor_ailocal_class = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var v1 = generator.valueToCode(this, 'VAR1', generator.ORDER_ATOMIC);
var v2 = generator.valueToCode(this, 'VAR2', generator.ORDER_ATOMIC);
var v4 = generator.valueToCode(this, 'VAR4', generator.ORDER_ATOMIC);
var code = v + '.ailocal_class(' + v1 + ',' + v2 + ',' + v4 + ')';
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_ailocal_class_result = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + '.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_audio_record = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var v1 = generator.valueToCode(this, 'VAR1', generator.ORDER_ATOMIC);
var v2 = generator.valueToCode(this, 'VAR2', generator.ORDER_ATOMIC);
var code = v + '.audio_record(path=' + v1 + ',times=' + v2 + ')\n';
return code;
}
export const ai_sensor_audio_play = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var v1 = generator.valueToCode(this, 'VAR1', generator.ORDER_ATOMIC);
var v2 = generator.valueToCode(this, 'VAR2', generator.ORDER_ATOMIC);
var code = v + '.audio_play(path=' + v1 + ',volume=' + v2 + ')\n';
return code;
}
export const ai_sensor_yolo_recognize = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var v1 = generator.valueToCode(this, 'VAR1', generator.ORDER_ATOMIC);
var v2 = generator.valueToCode(this, 'VAR2', generator.ORDER_ATOMIC);
var v4 = generator.valueToCode(this, 'VAR4', generator.ORDER_ATOMIC);
var code = v + '.yolo_recognize(' + v1 + ',' + v2 + ',' + v4 + ')';
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_yolo_recognize_result = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + '.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_asr_recognize = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var v1 = generator.valueToCode(this, 'VAR1', generator.ORDER_ATOMIC);
var v2 = generator.valueToCode(this, 'VAR2', generator.ORDER_ATOMIC);
var code = v + '.asr_recognize(' + v1 + ',threshold=' + v2 + ')';
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_licenseplate = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + '.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_find_licenseplates = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = v + '.find_licenseplate()';
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_face = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + '.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_classifier_faces = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = v + '.face_detect()';
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_20object = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + '.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const ai_sensor_find_20objects = function (_, generator) {
generator.definitions_['import_mixgo_ai'] = 'import mixgo_ai';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = v + '.find_20object()';
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,225 @@
// Blynk 第二版
// Blynk 自定义终端部件 Terminal
export const mpython_blynk_terminal_widget_vpin = function (_, generator) {
// generator.definitions_['import_BlynkLib'] = 'import blynklib';
var virtual_pin = generator.valueToCode(this, 'virtual_pin', generator.ORDER_ATOMIC);
generator.functions_['terminal_widget_vpin_' + virtual_pin] =
`
ALLOWED_COMMANDS_LIST = ['ls', 'lsusb', 'ip a', 'ip abc']
@blynk.handle_event('write V${virtual_pin}')
def write_handler(pin, _values):
header = ''
result = ''
delimiter = '{}\\n'.format('=' * 30)
if _values and _values[0] in ALLOWED_COMMANDS_LIST:
cmd_params = _values[0].split(' ')
try:
result = subprocess.check_output(cmd_params).decode('utf-8')
header = '[output]\\n'
except subprocess.CalledProcessError as exe_err:
header = '[error]\\n'
result = 'Return Code: {}\\n'.format(exe_err.returncode)
except Exception as g_err:
print("Command caused '{}'".format(g_err))
elif _values and _values[0] == 'help':
header = '[help -> allowed commands]\\n'
result = '{}\\n'.format('\\n'.join(ALLOWED_COMMANDS_LIST))
# communicate with terminal if help or some allowed command
if result:
output = '{}{}{}{}'.format(header, delimiter, result, delimiter)
print(output)
blynk.virtual_write(pin, output)
blynk.virtual_write(pin, '\\n')
`
var code = '';
return code;
}
// Blynk 同步虚拟管脚的状态
export const mpython_blynk_sync_virtual = function (_, generator) {
// generator.definitions_['import_BlynkLib'] = 'import blynklib';
var virtual_pin = generator.valueToCode(this, 'virtual_pin', generator.ORDER_ATOMIC);
var code = 'blynk.virtual_sync(' + virtual_pin + ')\n';
return code;
}
// 斷開连接 Blynk
export const mpython_blynk_on_disconnected = function (_, generator) {
// generator.definitions_['import_BlynkLib'] = 'import blynklib';
var branch = generator.statementToCode(this, 'DO');
branch = generator.addLoopTrap(branch, this.id) || generator.PASS;
generator.definitions_['blynk_on_disconnected'] =
'@blynk.handle_event("disconnect")\n' +
'def connect_handler():\n' +
" print('Blynk disconnected')\n" + branch;
return '';
}
// 连接上 Blynk
export const mpython_blynk_on_connected = function (_, generator) {
// generator.definitions_['import_BlynkLib'] = 'import blynklib';
var branch = generator.statementToCode(this, 'DO');
branch = generator.addLoopTrap(branch, this.id) || generator.PASS;
generator.definitions_['blynk_on_connected'] =
'@blynk.handle_event("connect")\n' +
'def connect_handler():\n' +
" print('Blynk connected')\n" + branch;
return '';
}
// Blynk 定时器的进程生效并运行
export const mpython_blynktimer_run = function () {
// generator.definitions_['import_BlynkLib'] = 'import blynklib';
// generator.definitions_['import_blynktimer'] = 'import blynktimer';
var code = 'blynk_timer.run()\n';
return code;
}
// Blynk 进程生效并运行
export const mpython_blynk_run = function () {
// generator.definitions_['import_BlynkLib'] = 'import blynklib';
var code = 'blynk.run()\n';
return code;
}
// Blynk APP 显示通知
export const mpython_blynk_app_notify = function (_, generator) {
// generator.definitions_['import_BlynkLib'] = 'import blynklib';
var notification = generator.valueToCode(this, 'notification', generator.ORDER_ATOMIC);
var code = 'blynk.notify(' + notification + ')\n';
return code;
}
// 停止 Blynk 定时器 %1
export const mpython_blynk_stop_timers = function (_, generator) {
generator.definitions_['import_blynktimer'] = 'import blynktimer';
generator.definitions_['def_blynktimer'] = 'blynk_timer = blynktimer.Timer(no_timers_err=False)';
var timer_num = generator.valueToCode(this, 'timer_num', generator.ORDER_ATOMIC);
var code = `blynk_timer.stop('${timer_num}_blynk_timer${timer_num}')` + '\n';
return code;
}
// 可用的 Blynk 定时器
export const mpython_blynk_get_timers = function (_, generator) {
generator.definitions_['import_blynktimer'] = 'import blynktimer';
generator.definitions_['def_blynktimer'] = 'blynk_timer = blynktimer.Timer(no_timers_err=False)';
var code = `blynk_timer.get_timers()`;
return [code, generator.ORDER_ATOMIC];
}
//blynk定时器
export const mpython_blynktimer = function (_, generator) {
generator.definitions_['import_blynktimer'] = 'import blynktimer';
var Num = generator.valueToCode(this, 'Num', generator.ORDER_ATOMIC);
var period = generator.valueToCode(this, 'period', generator.ORDER_ATOMIC);
var Timer_mode = this.getFieldValue('Timer_mode');
var branch = generator.statementToCode(this, 'DO');
branch = generator.addLoopTrap(branch, this.id) || generator.PASS;
generator.definitions_['def_blynktimer'] = 'blynk_timer = blynktimer.Timer(no_timers_err=False)';
generator.definitions_['blynktimer_event' + Num] =
`
@blynk_timer.register(interval=${period}, run_once=${Timer_mode})
def blynk_timer${Num}():
`
+ branch;
return '';
}
// 发送数据 %1 到 Bylnk APP 的虚拟管脚 %2
export const mpython_blynk_sensor_data_to_app = function (_, generator) {
// generator.definitions_['import_BlynkLib'] = 'import blynklib';
var sensor_data = generator.valueToCode(this, 'sensor_data', generator.ORDER_ATOMIC);
var virtual_pin = generator.valueToCode(this, 'virtual_pin', generator.ORDER_ATOMIC);
var code = 'blynk.virtual_write(' + virtual_pin + ', ' + sensor_data + ')\n';
return code;
}
// 从 Bylnk APP 获取虚拟管脚 %1 的值
export const mpython_blynk_app_data = function (_, generator) {
// generator.definitions_['import_BlynkLib'] = 'import blynklib';
var virtual_pin = generator.valueToCode(this, 'virtual_pin', generator.ORDER_ATOMIC);
var branch = generator.statementToCode(this, 'DO');
branch = generator.addLoopTrap(branch, this.id) || generator.PASS;
generator.definitions_['blynk_VIRTUAL_WRITE_' + virtual_pin] =
"@blynk.handle_event('write V" + virtual_pin + "')\n" +
'def write_virtual_pin_handler(pin, _value):\n' +
' for i in range(0, len(_value)):\n' +
' try: _value[i] = eval(_value[i])\n' +
' except: pass\n' +
' if len(_value) == 1: _value = _value[0]\n' + branch;
//' print('+'"v' + virtual_pin + '_value: {}".format(_value))\n'
// var code = 'blynk.run()\n';
return '';
}
// 向 %1 发邮件 主题 %2 正文 %3
export const mpython_blynk_email = function (_, generator) {
var body = generator.valueToCode(this, 'body', generator.ORDER_ATOMIC);
var subject = generator.valueToCode(this, 'subject', generator.ORDER_ATOMIC);
var TargetEmail = generator.valueToCode(this, 'TargetEmail', generator.ORDER_ATOMIC);
var code = `blynk.email(${TargetEmail}, ${subject}, ${body})` + '\n';
return code;
}
// 给虚拟管脚添加 属性 %1 值 %2
export const mpython_blynk_set_property = function (_, generator) {
var attribute_value = generator.valueToCode(this, 'attribute_value', generator.ORDER_ATOMIC);
var attribute_name = generator.valueToCode(this, 'attribute_name', generator.ORDER_ATOMIC);
var code = `blynk.set_property(pin, ${attribute_name}, ${attribute_value})` + '\n';
return code;
}
// Bylnk设置
export const mpython_blynk_setup = function (_, generator) {
generator.definitions_['import_BlynkLib'] = 'import blynklib';
var server = generator.valueToCode(this, 'server', generator.ORDER_ATOMIC);
var auth = generator.valueToCode(this, 'auth', generator.ORDER_ATOMIC);
var port = generator.valueToCode(this, 'port', generator.ORDER_ATOMIC);
generator.definitions_['mpython_blynk_setup'] =
"blynk = blynklib.Blynk(" + auth + ", server=" + server + ", port=" + port + ")";
generator.definitions_['blynk_on_connected'] =
`
@blynk.handle_event("connect")
def connect_handler():
print('Blynk connected')
`
generator.definitions_['blynk_on_disconnected'] =
`
@blynk.handle_event("disconnect")
def connect_handler():
print('Blynk disconnected')
`
return '';
}

View File

@@ -0,0 +1,25 @@
export const cc_g1_read_bat = function (_, generator) {
generator.definitions_['import_cc_g1'] = 'from cc_g1 import handle';
var code = 'handle.read_bat()';
return [code, generator.ORDER_ATOMIC];
}
export const cc_g1_read_joystick = function (_, generator) {
var v = this.getFieldValue('VAR');
generator.definitions_['import_cc_g1'] = 'from cc_g1 import handle';
var code = 'handle.read_joystick()' + v + '';
return [code, generator.ORDER_ATOMIC];
}
export const cc_g1_read_key = function (_, generator) {
var v = this.getFieldValue('VAR');
generator.definitions_['import_cc_g1'] = 'from cc_g1 import handle';
var code = 'handle.read_key(' + v + ')';
return [code, generator.ORDER_ATOMIC];
}
export const cc_g1_turnoff = function (_, generator) {
generator.definitions_['import_cc_g1'] = 'from cc_g1 import handle';
var code = 'handle.shutdown()';
return code;
}

View File

@@ -0,0 +1,225 @@
import * as Mixly from 'mixly';
export const ce_go_light_number = function (_, generator) {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_me" || version == "mixgo_cc") {
generator.definitions_['import_me_go_car'] = 'from me_go import car';
}
else if (version == "mixgo_ce") {
generator.definitions_['import_ce_go_car'] = 'from ce_go import car';
}
var code = 'car.' + this.getFieldValue('op');
return [code, generator.ORDER_ATOMIC];
}
export const ce_go_led_bright = function (_, generator) {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_me" || version == "mixgo_cc") {
generator.definitions_['import_me_go_car'] = 'from me_go import car';
}
else if (version == "mixgo_ce") {
generator.definitions_['import_ce_go_car'] = 'from ce_go import car';
}
var op = generator.valueToCode(this, 'led', generator.ORDER_ATOMIC);
var bright = generator.valueToCode(this, 'bright', generator.ORDER_ATOMIC);
var code = "car.setonoff(" + op + "," + bright + ")\n";
return code;
}
export const ce_go_get_led_bright = function (_, generator) {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_me" || version == "mixgo_cc") {
generator.definitions_['import_me_go_car'] = 'from me_go import car';
}
else if (version == "mixgo_ce") {
generator.definitions_['import_ce_go_car'] = 'from ce_go import car';
}
var op = generator.valueToCode(this, 'led', generator.ORDER_ATOMIC);
var code = "car.getrightness(" + op + ")";
return [code, generator.ORDER_ATOMIC];
}
export const ce_go_get_led_state = function (_, generator) {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_me" || version == "mixgo_cc") {
generator.definitions_['import_me_go_car'] = 'from me_go import car';
}
else if (version == "mixgo_ce") {
generator.definitions_['import_ce_go_car'] = 'from ce_go import car';
}
var op = generator.valueToCode(this, 'led', generator.ORDER_ATOMIC);
var code = "car.getonoff(" + op + ")";
return [code, generator.ORDER_ATOMIC];
}
export const ce_go_led_brightness = function (_, generator) {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_me" || version == "mixgo_cc") {
generator.definitions_['import_me_go_car'] = 'from me_go import car';
}
else if (version == "mixgo_ce") {
generator.definitions_['import_ce_go_car'] = 'from ce_go import car';
}
var op = generator.valueToCode(this, 'led', generator.ORDER_ATOMIC);
var flag = generator.valueToCode(this, 'bright', generator.ORDER_ATOMIC);
var code = "car.setbrightness(" + op + "," + flag + ")\n";
return code;
}
export const ce_go_stepper_keep = function (_, generator) {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_me" || version == "mixgo_cc") {
generator.definitions_['import_me_go_car'] = 'from me_go import car';
}
else if (version == "mixgo_ce") {
generator.definitions_['import_ce_go_car'] = 'from ce_go import car';
}
var v = this.getFieldValue('VAR');
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ASSIGNMENT);
var code = 'car.move("' + v + '",' + speed + ")\n";
return code;
}
export const ce_go_stepper_stop = function (_, generator) {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_me" || version == "mixgo_cc") {
generator.definitions_['import_me_go_car'] = 'from me_go import car';
}
else if (version == "mixgo_ce") {
generator.definitions_['import_ce_go_car'] = 'from ce_go import car';
}
var v = this.getFieldValue('VAR');
var code = 'car.move("' + v + '")\n';
return code;
}
export const ce_go_dc_motor = function (_, generator) {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_me" || version == "mixgo_cc") {
generator.definitions_['import_me_go_car'] = 'from me_go import car';
}
else if (version == "mixgo_ce") {
generator.definitions_['import_ce_go_car'] = 'from ce_go import car';
}
var wheel = this.getFieldValue('wheel');
var v = this.getFieldValue('direction');
if (wheel == 0) {
if (v == 'CW') { v = 'CCW' }
else if (v == 'CCW') { v = 'CW' }
}
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
var code = "car.motor(car.MOTO[" + wheel + '],"' + v + '",' + speed + ")\n";
return code;
}
export const ce_go_hall_attachInterrupt = function (_, generator) {
var dropdown_mode = this.getFieldValue('mode');
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_me" || version == "mixgo_cc") {
generator.definitions_['import_me_go_hall_' + dropdown_mode] = 'from me_go import hall_' + dropdown_mode;
}
else if (version == "mixgo_ce") {
generator.definitions_['import_ce_go_hall_' + dropdown_mode] = 'from ce_go import hall_' + dropdown_mode;
}
var atta = generator.valueToCode(this, 'DO', generator.ORDER_ATOMIC);
var code = 'hall_' + dropdown_mode + '.irq_cb(' + atta + ')\n'
return code;
}
export const ce_go_hall_initialize = function (_, generator) {
var dropdown_mode = this.getFieldValue('mode');
var args = this.getFieldValue('args');
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_me" || version == "mixgo_cc") {
generator.definitions_['import_me_go_hall_' + dropdown_mode] = 'from me_go import hall_' + dropdown_mode;
}
else if (version == "mixgo_ce") {
generator.definitions_['import_ce_go_hall_' + dropdown_mode] = 'from ce_go import hall_' + dropdown_mode;
}
var num = generator.valueToCode(this, 'num', generator.ORDER_ATOMIC);
if (args == 'all') {
var code = 'hall_' + dropdown_mode + '.initial(' + 'turns' + '=' + num + ',distance=' + num + ')\n'
return code;
}
var code = 'hall_' + dropdown_mode + '.initial(' + args + '=' + num + ')\n'
return code;
}
export const ce_go_hall_data = function (_, generator) {
var dropdown_mode = this.getFieldValue('mode');
var args = this.getFieldValue('args');
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_me" || version == "mixgo_cc") {
generator.definitions_['import_me_go_hall_' + dropdown_mode] = 'from me_go import hall_' + dropdown_mode;
}
else if (version == "mixgo_ce") {
generator.definitions_['import_ce_go_hall_' + dropdown_mode] = 'from ce_go import hall_' + dropdown_mode;
}
var code = 'hall_' + dropdown_mode + '.' + args + '';
return [code, generator.ORDER_ATOMIC];
}
export const ce_go_pin_near_line = function (_, generator) {
var key = this.getFieldValue('key');
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_me" || version == "mixgo_cc") {
generator.definitions_['import_me_go_hall'] = 'from me_go import car';
}
else if (version == "mixgo_ce") {
generator.definitions_['import_ce_go_hall'] = 'from ce_go import car';
}
var code = 'car.patrol()' + key + '';
return [code, generator.ORDER_ATOMIC];
}
export const ce_go_pin_near = function (_, generator) {
var key = this.getFieldValue('key');
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_me" || version == "mixgo_cc") {
generator.definitions_['import_me_go_hall'] = 'from me_go import car';
}
else if (version == "mixgo_ce") {
generator.definitions_['import_ce_go_hall'] = 'from ce_go import car';
}
var code = 'car.obstacle()' + key + '';
return [code, generator.ORDER_ATOMIC];
}
export const ce_go_pin_near_state_change = function (_, generator) {
var key = this.getFieldValue('key');
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_me" || version == "mixgo_cc") {
generator.definitions_['import_me_go_hall'] = 'from me_go import car';
}
else if (version == "mixgo_ce") {
generator.definitions_['import_ce_go_hall'] = 'from ce_go import car';
}
var code = 'car.ir_mode(car.' + key + ')\n';
return code;
}
export const sensor_mixgome_eulerangles = function (_, generator) {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_me" || version == "mixgo_cc") {
generator.definitions_['import_mixgo_me_onboard_mxc6655xa'] = "from mixgo_me import onboard_mxc6655xa";
}
else if (version == "mixgo_ce") {
generator.definitions_['import_mixgo_ce_onboard_mxc6655xa'] = "from mixgo_ce import onboard_mxc6655xa";
}
var angle = this.getFieldValue('angle');
var code = 'onboard_mxc6655xa.eulerangles(upright=True)' + angle;
return [code, generator.ORDER_ATOMIC];
}
export const ce_go_pin_light = function (_, generator) {
var key = this.getFieldValue('key');
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo_me" || version == "mixgo_cc") {
generator.definitions_['import_me_go_hall'] = 'from me_go import car';
}
else if (version == "mixgo_ce") {
generator.definitions_['import_ce_go_hall'] = 'from ce_go import car';
}
var code = 'car.light()' + key + '';
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,602 @@
import * as Blockly from 'blockly/core';
import * as Mixly from 'mixly';
export const communicate_i2c_onboard = function (block, generator) {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_i2c'] = 'from ' + version + ' import onboard_i2c';
var code = 'onboard_i2c';
return [code, generator.ORDER_ATOMIC];
}
export const communicate_spi_onboard = function (block, generator) {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_i2c'] = 'from ' + version + ' import onboard_spi';
var code = 'onboard_spi';
return [code, generator.ORDER_ATOMIC];
}
export const communicate_i2c_init = function (block, generator) {
generator.definitions_['import_machine'] = 'import machine';
var dropdown_pin1 = generator.valueToCode(this, 'RX', generator.ORDER_ATOMIC);
var dropdown_pin2 = generator.valueToCode(this, 'TX', generator.ORDER_ATOMIC);
var freq = generator.valueToCode(this, 'freq', generator.ORDER_ATOMIC);
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
return "" + sub + " = machine.SoftI2C(scl = machine.Pin(" + dropdown_pin2 + "), sda = machine.Pin(" + dropdown_pin1 + "), freq = " + freq + ")\n";
}
export const communicate_i2c_read = function (block, generator) {
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var address = generator.valueToCode(this, 'address', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
return ["" + name + ".readfrom(" + address + ", " + data + ")", generator.ORDER_ATOMIC];
}
export const communicate_i2c_write = function (block, generator) {
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var address = generator.valueToCode(this, 'address', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
return "" + name + ".writeto(" + address + ", " + data + ")\n";
}
export const communicate_i2c_scan = function (block, generator) {
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
return ["" + name + ".scan()", generator.ORDER_ATOMIC];
}
export const communicate_i2c_master_read = function (block, generator) {
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = "" + name + ".read()";
return [code, generator.ORDER_ATOMIC];
}
export const communicate_i2c_available = function (block, generator) {
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = "" + name + ".available()";
return [code, generator.ORDER_ATOMIC];
}
export const i2c_slave_onreceive = function (block, generator) {
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
generator.setups_['setup_i2c_' + pin] = 'Wire.begin(' + pin + ');';
generator.setups_['setup_i2c_onReceive_' + pin] = 'Wire.onReceive(i2cReceiveEvent_' + pin + ');';
var funcName = 'i2cReceiveEvent_' + pin;
var branch = generator.statementToCode(this, 'DO');
var code2 = 'void' + ' ' + funcName + '(int howMany) {\n' + branch + '}\n';
generator.definitions_[funcName] = code2;
return '';
}
export const communicate_spi_init = function (block, generator) {
generator.definitions_['import_machine'] = 'import machine';
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var freq = generator.valueToCode(this, 'freq', generator.ORDER_ATOMIC);
var mosi = generator.valueToCode(this, 'mosi', generator.ORDER_ATOMIC);
var miso = generator.valueToCode(this, 'miso', generator.ORDER_ATOMIC);
var sck = generator.valueToCode(this, 'sck', generator.ORDER_ATOMIC);
return "" + name + " = machine.SoftSPI(baudrate=" + freq + ", sck=machine.Pin(" + sck + "), mosi=machine.Pin(" + mosi + "), miso=machine.Pin(" + miso + "))\n";
}
export const communicate_spi_set = function (block, generator) {
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
return "spi.init(baudrate=" + data + ")\n";
}
export const communicate_spi_buffer = function (block, generator) {
var varname = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
return "" + varname + "=bytearray(" + data + ")\n";
}
export const communicate_spi_read = function (block, generator) {
var varname = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
return ["" + varname + ".read(" + data + ")", generator.ORDER_ATOMIC];
}
export const communicate_spi_read_output = function (block, generator) {
var varname = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
var val = generator.valueToCode(this, 'val', generator.ORDER_ATOMIC);
return ["" + varname + ".read(" + data + "," + val + ")", generator.ORDER_ATOMIC];
}
export const communicate_spi_readinto = function (block, generator) {
var varname = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
return ["" + varname + ".readinto(" + data + ")", generator.ORDER_ATOMIC];
}
export const communicate_spi_readinto_output = function (block, generator) {
var varname = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
var val = generator.valueToCode(this, 'val', generator.ORDER_ATOMIC);
return ["" + varname + ".readinto(" + data + "," + val + ")", generator.ORDER_ATOMIC];
}
export const communicate_spi_write = function (block, generator) {
var varname = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
return ["" + varname + ".write(" + data + ".encode('utf-8'))", generator.ORDER_ATOMIC];
}
export const communicate_spi_write_readinto = function (block, generator) {
var varname = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
var val = generator.valueToCode(this, 'val', generator.ORDER_ATOMIC);
// var op=this.getFieldValue('op');
// if(op=="byte"){
return ["" + varname + ".write_readinto(" + data + ".encode('utf-8')," + val + ")", generator.ORDER_ATOMIC];
// }else{
// return [""+varname+".write_readinto(" + data + ","+val+")", generator.ORDER_ATOMIC];
// }
}
export const communicate_ow_init = function (block, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_onewire'] = "import onewire";
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var varName = generator.valueToCode(this, 'BUS', generator.ORDER_ATOMIC);
var code = "" + name + "=onewire.OneWire(machine.Pin(" + varName + "))\n";
return code;
}
export const communicate_ow_scan = function (block, generator) {
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = "" + name + ".scan()";
return [code, generator.ORDER_ATOMIC];
}
export const communicate_ow_reset = function (block, generator) {
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = "" + name + ".reset()\n";
return code;
}
export const communicate_ow_read = function (block, generator) {
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = "" + name + ".readbyte()";
return [code, generator.ORDER_ATOMIC];
}
export const communicate_ow_write = function (block, generator) {
var varName = generator.valueToCode(this, 'byte', generator.ORDER_ATOMIC);
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var op = this.getFieldValue('op');
var code = "" + name + "." + op + "(" + varName + ")\n";
return code;
}
export const communicate_ow_select = function (block, generator) {
var varName = generator.valueToCode(this, 'byte', generator.ORDER_ATOMIC);
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = "" + name + ".select_rom(" + varName + ".encode('utf-8'))\n";
return code;
}
export const communicate_ir_recv_init = function (block, generator) {
generator.definitions_['import_irremote'] = 'import irremote';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var bit = this.getFieldValue('type');
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
if (sub == "" && bit == "RC5") {
var code = "ir_rx = irremote.RC5_RX(" + pin + ")\n";
}
else if (sub == "") {
var code = "ir_rx = irremote.NEC_RX(" + pin + "," + bit + ")\n";
}
else {
var code = "ir_rx = irremote.NEC_RX(" + pin + "," + bit + "," + sub + ")\n";
}
return code;
}
export const internal_variable = function (block, generator) {
generator.definitions_['import_irremote'] = 'import irremote';
var index = this.getFieldValue('index');
var code = "ir_rx.code[" + index + "]";
return [code, generator.ORDER_ATOMIC];
}
export const recv_fun = function (block, generator) {
generator.definitions_['import_irremote'] = 'import irremote';
var en = this.getFieldValue('en');
var code = "ir_rx.enable(" + en + ")\n";
return code;
}
export const ir_whether_recv = function (block, generator) {
generator.definitions_['import_irremote'] = 'import irremote';
var code = "ir_rx.any()";
return [code, generator.ORDER_ATOMIC];
}
export const ir_recv_timeout = function (block, generator) {
generator.definitions_['import_irremote'] = 'import irremote';
var time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
var code = "ir_rx.timeout(" + time + ")\n";
return code;
}
export const communicate_ir_send_init = function (block, generator) {
generator.definitions_['import_irremote'] = 'import irremote';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var sam = this.getFieldValue('type');
var power = generator.valueToCode(this, 'power', generator.ORDER_ATOMIC);
if (sam == "RC5") {
var code = "ir_tx = irremote.RC5_TX(" + pin + "," + power + ")\n";
}
else {
var code = "ir_tx = irremote.NEC_TX(" + pin + "," + sam + "," + power + ")\n";
}
return code;
}
export const ir_transmit_conventional_data = function (block, generator) {
generator.definitions_['import_irremote'] = 'import irremote';
var cmd = generator.valueToCode(this, 'cmd', generator.ORDER_ATOMIC);
var addr = generator.valueToCode(this, 'addr', generator.ORDER_ATOMIC);
var toggle = generator.valueToCode(this, 'toggle', generator.ORDER_ATOMIC);
var code = "ir_tx.transmit(" + cmd + "," + addr + "," + toggle + ")\n";
return code;
}
export const ir_transmit_study_code = function (block, generator) {
generator.definitions_['import_irremote'] = 'import irremote';
var s_code = generator.valueToCode(this, 'LIST', generator.ORDER_ATOMIC);
var code = "ir_tx.transmit(pulses=" + s_code + ")\n";
return code;
}
export const ir_transmit_raw_code = function (block, generator) {
generator.definitions_['import_irremote'] = 'import irremote';
var raw = generator.valueToCode(this, 'raw', generator.ORDER_ATOMIC);
var code = "ir_tx.transmit(raw=" + raw + ")\n";
return code;
}
export const ir_transmit_busy = function (block, generator) {
generator.definitions_['import_irremote'] = 'import irremote';
var code = "ir_tx.busy()";
return [code, generator.ORDER_ATOMIC];
}
export const communicate_bluetooth_central_init = function (block, generator) {
generator.definitions_['import_ble_central'] = 'import ble_central';
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = name + " = ble_central.BLESimpleCentral()\n";
return code;
}
export const communicate_bluetooth_peripheral_init = function (block, generator) {
generator.definitions_['import_ble_peripheral'] = 'import ble_peripheral';
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = name + " = ble_peripheral.BLESimplePeripheral(" + data + ")\n";
return code;
}
export const communicate_bluetooth_scan = function (block, generator) {
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = name + ".scan()";
return [code, generator.ORDER_ATOMIC];
}
export const communicate_bluetooth_connect = function (block, generator) {
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var mode = this.getFieldValue('mode');
var code = name + ".connect(" + mode + '=' + data + ")\n";
return code;
}
export const communicate_bluetooth_disconnect = function (block, generator) {
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = name + '.disconnect()\n';
return code;
}
export const communicate_bluetooth_mac = function (block, generator) {
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
return [name + ".mac", generator.ORDER_ATOMIC];
}
export const communicate_bluetooth_is_connected = function (block, generator) {
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = name + ".is_connected()";
return [code, generator.ORDER_ATOMIC];
}
export const communicate_bluetooth_send = function (block, generator) {
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = name + ".send(" + data + ")\n";
return code;
}
export const communicate_bluetooth_recv_only = function (block, generator) {
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = v + '.recv()';
return [code, generator.ORDER_ATOMIC];
}
export const communicate_bluetooth_recv = function (block, generator) {
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var method = generator.valueToCode(this, 'METHOD', generator.ORDER_ATOMIC);
var code = v + '.recv(' + method + ')\n';
return code;
}
export const communicate_bluetooth_handle = function (block, generator) {
generator.definitions_['import_ble_handle'] = 'import ble_handle';
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var method = generator.valueToCode(this, 'METHOD', generator.ORDER_ATOMIC);
var code = v + '=ble_handle.Handle()\n' + v + '.recv(' + method + ')\n';
return code;
}
//espnow
export const communicate_espnow_init = function (block, generator) {
generator.definitions_['import_radio'] = "import radio";
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var varName = generator.valueToCode(this, 'CHNL', generator.ORDER_ATOMIC);
var power = this.getFieldValue('op');
var code = "" + name + "=radio.ESPNow(channel=" + varName + ",txpower=" + power + ")\n";
return code;
}
export const communicate_espnow_init_new = function (block, generator) {
generator.definitions_['import_radio'] = "import radio";
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var varName = generator.valueToCode(this, 'CHNL', generator.ORDER_ATOMIC);
var varName2 = generator.valueToCode(this, 'DB', generator.ORDER_ATOMIC);
var code = "" + name + "=radio.ESPNow(channel=" + varName + ',txpower=' + varName2 + ")\n";
return code;
}
export const network_espnow_mac = function (block, generator) {
generator.definitions_['import_radio'] = "import radio";
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
return [name + ".mac", generator.ORDER_ATOMIC];
}
export const network_espnow_info = function (block, generator) {
generator.definitions_['import_radio'] = "import radio";
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
return [name + ".info()", generator.ORDER_ATOMIC];
}
export const network_espnow_recv = function (block, generator) {
generator.definitions_['import_radio'] = "import radio";
var mode = this.getFieldValue('mode');
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = name + ".recv()" + mode;
return [code, generator.ORDER_ATOMIC];
}
export const network_espnow_send = function (block, generator) {
generator.definitions_['import_radio'] = "import radio";
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var mac = generator.valueToCode(this, 'mac', generator.ORDER_ATOMIC);
var content = generator.valueToCode(this, 'content', generator.ORDER_ATOMIC);
var code = name + ".send(" + mac + "," + content + ")\n";
return code;
}
export const network_espnow_recv_handle = function (block, generator) {
generator.definitions_['import_radio'] = "import radio";
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var method = generator.valueToCode(this, 'METHOD', generator.ORDER_ATOMIC);
var code = name + ".recv_cb(" + method + ")\n";
return code;
}
//radio
export const espnow_radio_channel = function (block, generator) {
generator.definitions_['import_radio'] = "import radio";
generator.definitions_['ESPNow_radio_initialize'] = "ESPNow_radio=radio.ESPNow()";
var varName = generator.valueToCode(this, 'CHNL', generator.ORDER_ATOMIC);
var code = "ESPNow_radio.set_channel(channel=" + varName + ")\n";
return code;
}
export const espnow_radio_txpower = function (block, generator) {
generator.definitions_['import_radio'] = "import radio";
generator.definitions_['ESPNow_radio_initialize'] = "ESPNow_radio=radio.ESPNow()";
var power = this.getFieldValue('op');
var code = "ESPNow_radio.set_channel(txpower=" + power + ")\n";
return code;
}
export const espnow_radio_channel_new = function (block, generator) {
generator.definitions_['import_radio'] = "import radio";
var varName2 = generator.valueToCode(this, 'DB', generator.ORDER_ATOMIC);
generator.definitions_['ESPNow_radio_initialize'] = "ESPNow_radio=radio.ESPNow(channel=1,txpower=" + varName2 + ")";
var varName = generator.valueToCode(this, 'CHNL', generator.ORDER_ATOMIC);
var code = "ESPNow_radio.set_channel(" + varName + ")\n";
return code;
}
export const espnow_radio_on_off = function (block, generator) {
generator.definitions_['import_radio'] = "import radio";
generator.definitions_['ESPNow_radio_initialize'] = "ESPNow_radio=radio.ESPNow()";
var op = this.getFieldValue('on_off');
var code = "ESPNow_radio.active(" + op + ")\n";
return code;
}
export const espnow_radio_send = function (block, generator) {
generator.definitions_['import_radio'] = "import radio";
generator.definitions_['ESPNow_radio_initialize'] = "ESPNow_radio=radio.ESPNow()";
var varName = generator.valueToCode(this, 'send', generator.ORDER_ATOMIC);
var code = 'ESPNow_radio.send("ffffffffffff",' + varName + ")\n";
return code;
}
export const espnow_radio_rec = function (block, generator) {
generator.definitions_['import_radio'] = "import radio";
generator.definitions_['ESPNow_radio_initialize'] = "ESPNow_radio=radio.ESPNow()";
var code = "ESPNow_radio.recv()";
return [code, generator.ORDER_ATOMIC];
}
export const espnow_radio_recv_msg = function (block, generator) {
var code = "ESPNow_radio_msg";
return [code, generator.ORDER_ATOMIC];
}
export const espnow_radio_recv = function (block, generator) {
generator.definitions_['import_radio'] = "import radio";
generator.definitions_['import_ubinascii'] = 'import ubinascii';
generator.definitions_['ESPNow_radio_initialize'] = "ESPNow_radio=radio.ESPNow()";
var doCode = generator.statementToCode(block, 'DO') || generator.PASS;
generator.definitions_['def_ESPNow_radio_recv'] = 'def ESPNow_radio_recv(mac,ESPNow_radio_msg):\n' + doCode;
generator.definitions_['def_ESPNow_radio_recv_all'] = '_radio_msg_list = []\n' + 'def ESPNow_radio_recv_callback(mac,ESPNow_radio_msg):\n' + ' global _radio_msg_list\n' + ' try: ESPNow_radio_recv(mac,ESPNow_radio_msg)\n' + ' except: pass\n' + ' if str(ESPNow_radio_msg) in _radio_msg_list:\n' + " eval('radio_recv_' + bytes.decode(ubinascii.hexlify(ESPNow_radio_msg)) + '()')\n";
generator.definitions_['ESPNow_radio_recv_callback'] = "ESPNow_radio.recv_cb(ESPNow_radio_recv_callback)\n";
return '';
}
var writeUTF = function (str, isGetBytes) {
var back = [];
var byteSize = 0;
for (var i = 0; i < str.length; i++) {
var code = str.charCodeAt(i);
if (0x00 <= code && code <= 0x7f) {
byteSize += 1;
back.push(code);
} else if (0x80 <= code && code <= 0x7ff) {
byteSize += 2;
back.push((192 | (31 & (code >> 6))));
back.push((128 | (63 & code)))
} else if ((0x800 <= code && code <= 0xd7ff) || (0xe000 <= code && code <= 0xffff)) {
byteSize += 3;
back.push((224 | (15 & (code >> 12))));
back.push((128 | (63 & (code >> 6))));
back.push((128 | (63 & code)))
}
}
for (i = 0; i < back.length; i++) {
back[i] &= 0xff;
}
if (isGetBytes) {
return back;
}
if (byteSize <= 0xff) {
return [0, byteSize].concat(back);
}
return [byteSize >> 8, byteSize & 0xff].concat(back);
}
var toUTF8Hex = function (str) {
var charBuf = writeUTF(str, true);
var re = '';
for (var i = 0; i < charBuf.length; i++) {
var x = (charBuf[i] & 0xFF).toString(16);
if (x.length === 1) {
x = '0' + x;
}
re += x;
}
return re;
}
export const espnow_radio_recv_certain_msg = function (block, generator) {
generator.definitions_['import_radio'] = "import radio";
generator.definitions_['import_ubinascii'] = 'import ubinascii';
generator.definitions_['ESPNow_radio_initialize'] = "ESPNow_radio=radio.ESPNow()";
var doCode = generator.statementToCode(block, 'DO') || generator.PASS;
generator.definitions_['def_ESPNow_radio_recv_all'] = '_radio_msg_list = []\n' + 'def ESPNow_radio_recv_callback(mac,ESPNow_radio_msg):\n' + ' global _radio_msg_list\n' + ' try: ESPNow_radio_recv(mac,ESPNow_radio_msg)\n' + ' except: pass\n' + ' if str(ESPNow_radio_msg) in _radio_msg_list:\n' + " eval('radio_recv_' + bytes.decode(ubinascii.hexlify(ESPNow_radio_msg)) + '()')\n";
generator.definitions_['ESPNow_radio_recv_callback'] = "ESPNow_radio.recv_cb(ESPNow_radio_recv_callback)\n";
var message = block.getFieldValue('msg');
var message_utf8 = toUTF8Hex(message);
generator.definitions_['def_radio_recv_' + message_utf8] =
'_radio_msg_list.append(\'' + message + '\')\n' +
'def radio_recv_' + message_utf8 + '():\n' + doCode;
return '';
}
export const espnow_radio_recv_new = function (block, generator) {
generator.definitions_['import_radio'] = "import radio";
generator.definitions_['ESPNow_radio_initialize'] = "ESPNow_radio=radio.ESPNow()";
generator.definitions_['ESPNow_radio_handlelist'] = "handle_list=[]";
var doCode = generator.statementToCode(block, 'DO') || generator.PASS;
generator.definitions_['def_ESPNow_radio_recv'] = 'def ESPNow_radio_recv(mac,ESPNow_radio_msg):\n' + doCode;
generator.definitions_['ESPNow_radio_handlelist_append'] = 'if not ESPNow_radio_recv in handle_list:\n handle_list.append(ESPNow_radio_recv)';
generator.definitions_['ESPNow_radio_recv_callback'] = "ESPNow_radio.recv_cb(handle_list)\n";
return '';
}
export const espnow_radio_recv_certain_msg_new = function (block, generator) {
generator.definitions_['import_radio'] = "import radio";
generator.definitions_['ESPNow_radio_initialize'] = "ESPNow_radio=radio.ESPNow()";
generator.definitions_['ESPNow_radio_handlelist'] = "handle_list=[]";
var doCode = generator.statementToCode(block, 'DO') || generator.PASS;
var message = block.getFieldValue('msg');
generator.definitions_['def_ESPNow_radio_recv__' + message] = 'def ESPNow_radio_recv__' + message + '(mac,ESPNow_radio_msg):\n' + doCode;
generator.definitions_['ESPNow_radio_handlelist_append__' + message] = 'if not ESPNow_radio_recv__' + message + ' in handle_list:\n handle_list.append(ESPNow_radio_recv__' + message + ')';
generator.definitions_['ESPNow_radio_recv_callback__' + message] = "ESPNow_radio.recv_cb(handle_list)\n";
return '';
}
export const lora_init = function (block, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var sv = generator.valueToCode(this, 'SPISUB', generator.ORDER_ATOMIC);
var pv = generator.valueToCode(this, 'PINSUB', generator.ORDER_ATOMIC);
var fr = generator.valueToCode(this, 'frequency', generator.ORDER_ATOMIC);
var r = generator.valueToCode(this, 'rate', generator.ORDER_ATOMIC);
var f = generator.valueToCode(this, 'factor', generator.ORDER_ATOMIC);
var p = generator.valueToCode(this, 'power', generator.ORDER_ATOMIC);
var bandwidth = this.getFieldValue('bandwidth');
var code;
generator.definitions_['import_rfm98'] = 'import rfm98';
var code = v + ' = rfm98.RFM98(' + sv + ',cs_pin=' + pv + ',frequency_mhz=' + fr + ',signal_bandwidth=' + bandwidth + ',coding_rate=' + r + ',spreading_factor=' + f + ',tx_power=' + p + ')\n';
return code;
}
export const lora_packet = function (block, generator) {
generator.definitions_['import_rfm98'] = 'import rfm98';
var key = this.getFieldValue('key');
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
return [name + "." + key + '()', generator.ORDER_ATOMIC];
}
export const lora_send = function (block, generator) {
generator.definitions_['import_rfm98'] = 'import rfm98';
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = name + ".send(" + data + ")\n";
return code;
}
export const lora_recv = function (block, generator) {
generator.definitions_['import_rfm98'] = 'import rfm98';
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
return [name + '.recv()', generator.ORDER_ATOMIC];
}
export const urequests_get = function (block, generator) {
generator.definitions_.import_requests = "import urequests";
var varName = generator.variableDB_.getName(this.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE);
var str = generator.valueToCode(this, 'DOMAIN', generator.ORDER_ATOMIC);
var code = varName + '= ' + 'urequests.get(' + str + ')\n';
return code;
}
export const urequests_attribute = function (block, generator) {
generator.definitions_.import_requests = "import urequests";
var varName = generator.valueToCode(this, 'VAL', generator.ORDER_ASSIGNMENT) || '0';
var attr = this.getFieldValue('ATTR');
var code = varName + "." + attr;
return [code, generator.ORDER_ATOMIC];
}
export const urequests_method = function (block, generator) {
generator.definitions_.import_requests = "import urequests";
var method = this.getFieldValue('DIR');
var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = "urequests." + method + "(" + str + ')';
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,121 @@
import * as Blockly from 'blockly/core';
import { controls_repeat_ext } from '@mixly/python/generators/control';
export const base_setup = function (_, generator) {
var branch = generator.statementToCode(this, 'DO');
branch = branch.replace(/(^\s*)|(\s*$)/g, "").replace(/\n {4}/g, '\n');//去除两端空格
if (branch) {
if (branch.endsWith('\n')) {
generator.setups_['setup_setup'] = branch;
}
else {
generator.setups_['setup_setup'] = branch + '\n';
}
}
return '';
}
// ok
export const controls_if = function (a, generator) {
var b = 0,
c = "",
d,
e;
do
e = generator.valueToCode(a, "IF" + b, generator.ORDER_NONE) || "False", d = generator.statementToCode(a, "DO" + b) || generator.PASS, c += (0 == b ? "if " : "elif ") + e + ":\n" + d, ++b;
while (a.getInput("IF" + b));
a.getInput("ELSE") && (d = generator.statementToCode(a, "ELSE") || generator.PASS, c += "else:\n" + d);
return c
}
// ok
export const controls_for = function (a, generator) {
var b = generator.variableDB_.getName(a.getFieldValue("VAR"), Blockly.Variables.NAME_TYPE),
//var b = generator.valueToCode(a, "VAR", generator.ORDER_MEMBER) || "''",
c = generator.valueToCode(a, "FROM", generator.ORDER_NONE) || "0",
d = generator.valueToCode(a, "TO", generator.ORDER_NONE) || "0",
e = generator.valueToCode(a, "STEP", generator.ORDER_NONE) || "1",
f = generator.addLoopTrap(generator.statementToCode(a, "DO"), a.id) || generator.PASS,
g = "",
h = function (_, generator) {
return generator.provideFunction_("upRange",
["def " + generator.FUNCTION_NAME_PLACEHOLDER_ + "(start, stop, step):", " while start <= stop:", " yield start", " start += abs(step)"])
},
k = function (_, generator) {
return generator.provideFunction_("downRange", ["def " + generator.FUNCTION_NAME_PLACEHOLDER_ + "(start, stop, step):", " while start >= stop:", " yield start", " start -= abs(step)"])
}
a = function (a, b, c) {
return "(" + a + " <= " + b + ") and " + h() + "(" + a + ", " + b + ", " + c + ") or " + k() + "(" + a + ", " + b + ", " + c + ")"
}
if (Blockly.isNumber(c) && Blockly.isNumber(d) &&
Blockly.isNumber(e))
c = parseFloat(c), d = parseFloat(d), e = Math.abs(parseFloat(e)), 0 === c % 1 && 0 === d % 1 && 0 === e % 1 ? (c <= d ? (d++, a = 0 == c && 1 == e ? d : c + ", " + d, 1 != e && (a += ", " + e)) : (d--, a = c + ", " + d + ", -" + e), a = "range(" + a + ")") : (a = c < d ? h() : k(), a += "(" + c + ", " + d + ", " + e + ")");
else {
var l = function (a, c) {
if (Blockly.isNumber(a))
a = parseFloat(a);
else {
var d = generator.variableDB_.getDistinctName(b + c, Blockly.Variables.NAME_TYPE);
g += d + " = " + a + "\n";
a = d
}
return a
}
c = l(c, "_start");
d = l(d, "_end");
l(e, "_inc");
a = "number" == typeof c && "number" == typeof d ? c < d ? h(c, d, e) : k(c, d, e) : a(c, d, e)
}
return g += "for " + b + " in " + a + ":\n" + f
}
// ok
export const controls_repeat = controls_repeat_ext;
export const controls_whileUntil = function (a, generator) {
var b = "UNTIL" == a.getFieldValue("MODE"),
c = generator.valueToCode(a, "BOOL", b ? generator.ORDER_LOGICAL_NOT : generator.ORDER_NONE) || "False",
d = generator.addLoopTrap(generator.statementToCode(a, "DO"), a.id) || generator.PASS;
b && (c = "not " + c);
return "while " + c + ":\n" + d
}
// ok
export const controls_flow_statements = function (a) {
switch (a.getFieldValue("FLOW")) {
case "BREAK":
return "break\n";
case "CONTINUE":
return "continue\n"
}
throw "Unknown flow statement.";
}
//ok
export const controls_forEach = function (block, generator) {
// For each loop.
var variable0 = generator.variableDB_.getName(
block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE);
var argument0 = generator.valueToCode(block, 'LIST',
generator.ORDER_RELATIONAL) || '[]';
var branch = generator.statementToCode(block, 'DO');
branch = generator.addLoopTrap(branch, block.id) ||
generator.PASS;
var code = 'for ' + variable0 + ' in ' + argument0 + ':\n' + branch;
return code;
}
// ok
export const controls_type = function (_, generator) {
var data = generator.valueToCode(this, 'DATA', generator.ORDER_ATOMIC) || '1000'
var code = 'type(' + data + ')';
return [code, generator.ORDER_ATOMIC];
}
export const controls_typeLists = function (_, generator) {
generator.definitions_['import_microbit_*'] = 'from microbit import *';
var type = this.getFieldValue('type');
// generator.definitions_['func_type' + type] = code;
return [type, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,497 @@
export const display_show_image_or_string = function (_, generator) {
generator.definitions_['import_matrix'] = 'import matrix';
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = "matrix.show(" + data + ")\n";
return code;
}
export const display_scroll_string = function (_, generator) {
generator.definitions_['import_matrix'] = 'import matrix';
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = "matrix.scroll(" + data + ")\n";
return code;
}
export const display_show_static = function (_, generator) {
generator.definitions_['import_matrix'] = 'import matrix';
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = "matrix.showstatic(" + data + ")\n";
return code;
}
export const display_show_image_or_string_delay = function (_, generator) {
generator.definitions_['import_matrix'] = 'import matrix';
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var time = generator.valueToCode(this, 'time', generator.ORDER_ASSIGNMENT);
var code = "matrix.show(" + data + ',' + time + ")\n";
return code;
}
export const display_scroll_string_delay = function (_, generator) {
generator.definitions_['import_matrix'] = 'import matrix';
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var time = generator.valueToCode(this, 'time', generator.ORDER_ASSIGNMENT);
var code = "matrix.scroll(" + data + ',' + time + ")\n";
return code;
}
export const display_image_create = function (block, generator) {
generator.definitions_['import_matrix'] = 'import matrix';
var colours = {
"#000000": "0",
//"#440000": "1",
//"#660000": "2",
//"#880000": "3",
//"#aa0000": "4",
//"#bb0000": "5",
//"#cc0000": "6",
//"#dd0000": "7",
//"#ee0000": "8",
"#ff0000": "1"
}
var colour_00 = colours[block.getFieldValue("00")];
var colour_01 = colours[block.getFieldValue("01")];
var colour_02 = colours[block.getFieldValue("02")];
var colour_03 = colours[block.getFieldValue("03")];
var colour_04 = colours[block.getFieldValue("04")];
var colour_05 = colours[block.getFieldValue("05")];
var colour_06 = colours[block.getFieldValue("06")];
var colour_07 = colours[block.getFieldValue("07")];
var colour_08 = colours[block.getFieldValue("08")];
var colour_09 = colours[block.getFieldValue("09")];
var colour_0a = colours[block.getFieldValue("0a")];
var colour_0b = colours[block.getFieldValue("0b")];
var colour_0c = colours[block.getFieldValue("0c")];
var colour_0d = colours[block.getFieldValue("0d")];
var colour_0e = colours[block.getFieldValue("0e")];
var colour_0f = colours[block.getFieldValue("0f")];
var colour_10 = colours[block.getFieldValue("10")];
var colour_11 = colours[block.getFieldValue("11")];
var colour_12 = colours[block.getFieldValue("12")];
var colour_13 = colours[block.getFieldValue("13")];
var colour_14 = colours[block.getFieldValue("14")];
var colour_15 = colours[block.getFieldValue("15")];
var colour_16 = colours[block.getFieldValue("16")];
var colour_17 = colours[block.getFieldValue("17")];
var colour_18 = colours[block.getFieldValue("18")];
var colour_19 = colours[block.getFieldValue("19")];
var colour_1a = colours[block.getFieldValue("1a")];
var colour_1b = colours[block.getFieldValue("1b")];
var colour_1c = colours[block.getFieldValue("1c")];
var colour_1d = colours[block.getFieldValue("1d")];
var colour_1e = colours[block.getFieldValue("1e")];
var colour_1f = colours[block.getFieldValue("1f")];
var colour_20 = colours[block.getFieldValue("20")];
var colour_21 = colours[block.getFieldValue("21")];
var colour_22 = colours[block.getFieldValue("22")];
var colour_23 = colours[block.getFieldValue("23")];
var colour_24 = colours[block.getFieldValue("24")];
var colour_25 = colours[block.getFieldValue("25")];
var colour_26 = colours[block.getFieldValue("26")];
var colour_27 = colours[block.getFieldValue("27")];
var colour_28 = colours[block.getFieldValue("28")];
var colour_29 = colours[block.getFieldValue("29")];
var colour_2a = colours[block.getFieldValue("2a")];
var colour_2b = colours[block.getFieldValue("2b")];
var colour_2c = colours[block.getFieldValue("2c")];
var colour_2d = colours[block.getFieldValue("2d")];
var colour_2e = colours[block.getFieldValue("2e")];
var colour_2f = colours[block.getFieldValue("2f")];
var colour_30 = colours[block.getFieldValue("30")];
var colour_31 = colours[block.getFieldValue("31")];
var colour_32 = colours[block.getFieldValue("32")];
var colour_33 = colours[block.getFieldValue("33")];
var colour_34 = colours[block.getFieldValue("34")];
var colour_35 = colours[block.getFieldValue("35")];
var colour_36 = colours[block.getFieldValue("36")];
var colour_37 = colours[block.getFieldValue("37")];
var colour_38 = colours[block.getFieldValue("38")];
var colour_39 = colours[block.getFieldValue("39")];
var colour_3a = colours[block.getFieldValue("3a")];
var colour_3b = colours[block.getFieldValue("3b")];
var colour_3c = colours[block.getFieldValue("3c")];
var colour_3d = colours[block.getFieldValue("3d")];
var colour_3e = colours[block.getFieldValue("3e")];
var colour_3f = colours[block.getFieldValue("3f")];
var colour_40 = colours[block.getFieldValue("40")];
var colour_41 = colours[block.getFieldValue("41")];
var colour_42 = colours[block.getFieldValue("42")];
var colour_43 = colours[block.getFieldValue("43")];
var colour_44 = colours[block.getFieldValue("44")];
var colour_45 = colours[block.getFieldValue("45")];
var colour_46 = colours[block.getFieldValue("46")];
var colour_47 = colours[block.getFieldValue("47")];
var colour_48 = colours[block.getFieldValue("48")];
var colour_49 = colours[block.getFieldValue("49")];
var colour_4a = colours[block.getFieldValue("4a")];
var colour_4b = colours[block.getFieldValue("4b")];
var colour_4c = colours[block.getFieldValue("4c")];
var colour_4d = colours[block.getFieldValue("4d")];
var colour_4e = colours[block.getFieldValue("4e")];
var colour_4f = colours[block.getFieldValue("4f")];
var colour_50 = colours[block.getFieldValue("50")];
var colour_51 = colours[block.getFieldValue("51")];
var colour_52 = colours[block.getFieldValue("52")];
var colour_53 = colours[block.getFieldValue("53")];
var colour_54 = colours[block.getFieldValue("54")];
var colour_55 = colours[block.getFieldValue("55")];
var colour_56 = colours[block.getFieldValue("56")];
var colour_57 = colours[block.getFieldValue("57")];
var colour_58 = colours[block.getFieldValue("58")];
var colour_59 = colours[block.getFieldValue("59")];
var colour_5a = colours[block.getFieldValue("5a")];
var colour_5b = colours[block.getFieldValue("5b")];
var colour_5c = colours[block.getFieldValue("5c")];
var colour_5d = colours[block.getFieldValue("5d")];
var colour_5e = colours[block.getFieldValue("5e")];
var colour_5f = colours[block.getFieldValue("5f")];
var colour_60 = colours[block.getFieldValue("60")];
var colour_61 = colours[block.getFieldValue("61")];
var colour_62 = colours[block.getFieldValue("62")];
var colour_63 = colours[block.getFieldValue("63")];
var colour_64 = colours[block.getFieldValue("64")];
var colour_65 = colours[block.getFieldValue("65")];
var colour_66 = colours[block.getFieldValue("66")];
var colour_67 = colours[block.getFieldValue("67")];
var colour_68 = colours[block.getFieldValue("68")];
var colour_69 = colours[block.getFieldValue("69")];
var colour_6a = colours[block.getFieldValue("6a")];
var colour_6b = colours[block.getFieldValue("6b")];
var colour_6c = colours[block.getFieldValue("6c")];
var colour_6d = colours[block.getFieldValue("6d")];
var colour_6e = colours[block.getFieldValue("6e")];
var colour_6f = colours[block.getFieldValue("6f")];
var colour_70 = colours[block.getFieldValue("70")];
var colour_71 = colours[block.getFieldValue("71")];
var colour_72 = colours[block.getFieldValue("72")];
var colour_73 = colours[block.getFieldValue("73")];
var colour_74 = colours[block.getFieldValue("74")];
var colour_75 = colours[block.getFieldValue("75")];
var colour_76 = colours[block.getFieldValue("76")];
var colour_77 = colours[block.getFieldValue("77")];
var colour_78 = colours[block.getFieldValue("78")];
var colour_79 = colours[block.getFieldValue("79")];
var colour_7a = colours[block.getFieldValue("7a")];
var colour_7b = colours[block.getFieldValue("7b")];
var colour_7c = colours[block.getFieldValue("7c")];
var colour_7d = colours[block.getFieldValue("7d")];
var colour_7e = colours[block.getFieldValue("7e")];
var colour_7f = colours[block.getFieldValue("7f")];
var code = 'matrix.Image("' + colour_00 + colour_01 + colour_02 + colour_03 + colour_04 + colour_05 + colour_06 + colour_07 + colour_08 + colour_09 + colour_0a + colour_0b + colour_0c + colour_0d + colour_0e + colour_0f + ':' + colour_10 + colour_11 + colour_12 + colour_13 + colour_14 + colour_15 + colour_16 + colour_17 + colour_18 + colour_19 + colour_1a + colour_1b + colour_1c + colour_1d + colour_1e + colour_1f + ':' + colour_20 + colour_21 + colour_22 + colour_23 + colour_24 + colour_25 + colour_26 + colour_27 + colour_28 + colour_29 + colour_2a + colour_2b + colour_2c + colour_2d + colour_2e + colour_2f + ':' + colour_30 + colour_31 + colour_32 + colour_33 + colour_34 + colour_35 + colour_36 + colour_37 + colour_38 + colour_39 + colour_3a + colour_3b + colour_3c + colour_3d + colour_3e + colour_3f + ':' + colour_40 + colour_41 + colour_42 + colour_43 + colour_44 + colour_45 + colour_46 + colour_47 + colour_48 + colour_49 + colour_4a + colour_4b + colour_4c + colour_4d + colour_4e + colour_4f + ':' + colour_50 + colour_51 + colour_52 + colour_53 + colour_54 + colour_55 + colour_56 + colour_57 + colour_58 + colour_59 + colour_5a + colour_5b + colour_5c + colour_5d + colour_5e + colour_5f + ':' + colour_60 + colour_61 + colour_62 + colour_63 + colour_64 + colour_65 + colour_66 + colour_67 + colour_68 + colour_69 + colour_6a + colour_6b + colour_6c + colour_6d + colour_6e + colour_6f + ':' + colour_70 + colour_71 + colour_72 + colour_73 + colour_74 + colour_75 + colour_76 + colour_77 + colour_78 + colour_79 + colour_7a + colour_7b + colour_7c + colour_7d + colour_7e + colour_7f + '")';
return [code, generator.ORDER_ATOMIC];
}
export const display_image_builtins = function (block, generator) {
generator.definitions_['import_matrix'] = 'import matrix';
var dropdown_image = block.getFieldValue('image');
var code = 'matrix.Image.' + dropdown_image;
return [code, generator.ORDER_ATOMIC];
}
export const display_get_pixel = function (block, generator) {
generator.definitions_['import_matrix'] = 'import matrix';
var value_x = generator.valueToCode(block, 'x', generator.ORDER_ATOMIC);
var value_y = generator.valueToCode(block, 'y', generator.ORDER_ATOMIC);
var code = 'matrix.get_pixel(int(' + value_x + '), int(' + value_y + '))';
return [code, generator.ORDER_ATOMIC];
}
export const display_bright_point = function (_, generator) {
generator.definitions_['import_matrix'] = 'import matrix';
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var dropdown_stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC);
var code = 'matrix.set_pixel(int(' + x + '), int(' + y + '), ' + dropdown_stat + ")\n";
return code;
}
export const display_get_screen_pixel = function (_, generator) {
generator.definitions_['import_matrix'] = 'import matrix';
var code = 'matrix.get_brightness()';
return [code, generator.ORDER_ATOMIC];
}
export const display_get_screen_image = function (_, generator) {
generator.definitions_['import_matrix'] = 'import matrix';
var code = 'matrix.get_screenimage()';
return [code, generator.ORDER_ATOMIC];
}
export const display_bright_screen = function (_, generator) {
generator.definitions_['import_matrix'] = 'import matrix';
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var code = 'matrix.set_brightness(' + x + ')\n';
return code;
}
export const display_blink_rate = function (_, generator) {
generator.definitions_['import_matrix'] = 'import matrix';
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var code = 'matrix.blink_rate(' + x + ')\n';
return code;
}
export const display_clear = function (_, generator) {
generator.definitions_['import_matrix'] = 'import matrix';
var code = 'matrix.clear()\n';
return code;
}
export const display_use_i2c_init = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ssd1306'] = 'import ssd1306';
var i2csub = generator.valueToCode(this, 'I2CSUB', generator.ORDER_ATOMIC);
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var row = generator.valueToCode(this, 'row', generator.ORDER_ATOMIC);
var column = generator.valueToCode(this, 'column', generator.ORDER_ATOMIC);
var code = sub + " = ssd1306.SSD1306_I2C(" + row + "," + column + "," + i2csub + ")\n";
return code;
}
export const display_draw_4strings = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ssd1306'] = 'import ssd1306';
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var value_text_line1 = generator.valueToCode(this, 'Text_line1', generator.ORDER_ASSIGNMENT) || '\'\'';
var value_text_line2 = generator.valueToCode(this, 'Text_line2', generator.ORDER_ASSIGNMENT) || '\'\'';
var value_text_line3 = generator.valueToCode(this, 'Text_line3', generator.ORDER_ASSIGNMENT) || '\'\'';
var value_text_line4 = generator.valueToCode(this, 'Text_line4', generator.ORDER_ASSIGNMENT) || '\'\'';
var code = varName + '.show_str(' + value_text_line1 + ',' + value_text_line2 + ',' + value_text_line3 + ',' + value_text_line4 + ')\n'
return code;
}
export const display_line_arbitrarily = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ssd1306'] = 'import ssd1306';
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var location_x1 = generator.valueToCode(this, 'x1', generator.ORDER_ATOMIC);
var location_y1 = generator.valueToCode(this, 'y1', generator.ORDER_ATOMIC);
var location_x2 = generator.valueToCode(this, 'x2', generator.ORDER_ATOMIC);
var location_y2 = generator.valueToCode(this, 'y2', generator.ORDER_ATOMIC);
var code = varName + '.show_line(' + location_x1 + ', ' + location_y1 + ', ' + location_x2 + ', ' + location_y2 + ', 1)\n';
return code;
}
export const display_rect = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ssd1306'] = 'import ssd1306';
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var location_x = generator.valueToCode(this, 'x', generator.ORDER_ATOMIC);
var location_y = generator.valueToCode(this, 'y', generator.ORDER_ATOMIC);
var value_width = generator.valueToCode(this, 'width', generator.ORDER_ATOMIC);
var value_height = generator.valueToCode(this, 'height', generator.ORDER_ATOMIC);
var checkbox_fill = this.getFieldValue("fill") == 'TRUE' ? 'True' : 'False';
var size = this.getFieldValue('OP');
var code = '';
switch (checkbox_fill) {
case "True":
code = varName + '.show_fill_rect(' + location_x + ', ' + location_y + ', ' + value_width + ', ' + value_height + ',' + size + ')\n';
break;
case "False":
code = varName + '.show_rect(' + location_x + ', ' + location_y + ', ' + value_width + ', ' + value_height + ',' + size + ')\n';
break;
}
return code;
}
export const image_arithmetic = function (block, generator) {
generator.definitions_['import_matrix'] = 'import matrix';
var op = block.getFieldValue("OP");
var imga = generator.valueToCode(block, 'A', generator.ORDER_ATOMIC);
var imgb = generator.valueToCode(block, 'B', generator.ORDER_ATOMIC);
var code = '';
if (op == 'INTERSECTION') {
code = imga + '-(' + imga + '-' + imgb + ')';
}
else {
code = imga + op + imgb;
}
return [code, generator.ORDER_ATOMIC];
}
export const display_line = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ssd1306'] = 'import ssd1306';
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var location_x = generator.valueToCode(this, 'x', generator.ORDER_ATOMIC);
var location_y = generator.valueToCode(this, 'y', generator.ORDER_ATOMIC);
var value_length = generator.valueToCode(this, 'length', generator.ORDER_ATOMIC);
var value_direction = this.getFieldValue("direction");
var code = varName + '.show_' + value_direction + '(' + location_x + ', ' + location_y + ', ' + value_length + ', 1)\n';
return code;
}
export const display_onoff = function (_, generator) {
var code = (this.getFieldValue('ONOFF') == 'ON') ? '1' : '0';
return [code, generator.ORDER_ATOMIC];
}
export const image_shift = function (block, generator) {
generator.definitions_['import_matrix'] = 'import matrix';
var op = block.getFieldValue("OP");
var image = generator.valueToCode(block, 'img', generator.ORDER_ATOMIC);
var value = generator.valueToCode(block, 'val', generator.ORDER_ATOMIC);
var code = image + '.shift_' + op + '(' + value + ')';
return [code, generator.ORDER_ATOMIC];
}
export const display_fill = function (_, generator) {
var varName = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
generator.definitions_['import_ssd1306'] = 'import ssd1306';
generator.definitions_['import_machine'] = 'import machine';
var key = this.getFieldValue('key');
var code = varName + '.show_fill(' + key + ')\n';
return code;
}
// export const switch = function (_, generator) {
// var code = this.getFieldValue('flag');
// return [code, generator.ORDER_ATOMIC];
// }
export const display_tm_use_i2c_init = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var iv = generator.valueToCode(this, 'I2CSUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue("key");
var code;
if (key == 'TM1650') {
generator.definitions_['import_tm1650'] = 'import tm1650';
code = v + ' = tm1650.' + key + "(" + iv + ')\n';
} else if (key == 'TM1637') {
generator.definitions_['import_tm1637'] = 'import tm1637';
code = v + ' = tm1637.' + key + "(" + iv + ')\n';
}
return code;
}
export const display_tm1650_power = function (_, generator) {
var type = this.getFieldValue("TYPE");
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var stat = this.getFieldValue("STAT");
var code = v + '.' + type + stat + "()\n";
return code;
}
export const display_tm1650_show_num = function (_, generator) {
var type = this.getFieldValue("TYPE");
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var val = generator.valueToCode(this, 'VALUE', generator.ORDER_ATOMIC);
var code = v + '.' + type + "_show_num(" + val + ")\n";
return code;
}
export const display_tm1650_show_dot = function (_, generator) {
var type = this.getFieldValue("TYPE");
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var n = generator.valueToCode(this, 'NO', generator.ORDER_ATOMIC);
var stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC);
var code = v + '.' + type + "_show_dot(" + n + ", " + stat + ")\n";
return code;
}
export const display_animate = function (_, generator) {
// Boolean values true and false.
var name = this.getFieldValue("ANIMATION");
var code = 'matrix.Image.' + name;
return [code, generator.ORDER_ATOMIC];
}
export const display_circle = function (_, generator) {
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ssd1306'] = 'import ssd1306';
var location_x = generator.valueToCode(this, 'x', generator.ORDER_ATOMIC);
var location_y = generator.valueToCode(this, 'y', generator.ORDER_ATOMIC);
var value_r = generator.valueToCode(this, 'r', generator.ORDER_ATOMIC);
var checkbox_fill = this.getFieldValue("fill") == 'TRUE' ? 'True' : 'False';
var size = this.getFieldValue('OP');
var code = '';
switch (checkbox_fill) {
case "True":
code = varName + '.show_fill_circle(' + location_x + ', ' + location_y + ', ' + value_r + ', ' + size + ')\n';
break;
case "False":
code = varName + '.show_circle(' + location_x + ', ' + location_y + ', ' + value_r + ', ' + size + ')\n';
break;
}
return code;
}
export const display_triangle = function (_, generator) {
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ssd1306'] = 'import ssd1306';
var location_x0 = generator.valueToCode(this, 'x0', generator.ORDER_ATOMIC);
var location_y0 = generator.valueToCode(this, 'y0', generator.ORDER_ATOMIC);
var location_x1 = generator.valueToCode(this, 'x1', generator.ORDER_ATOMIC);
var location_y1 = generator.valueToCode(this, 'y1', generator.ORDER_ATOMIC);
var location_x2 = generator.valueToCode(this, 'x2', generator.ORDER_ATOMIC);
var location_y2 = generator.valueToCode(this, 'y2', generator.ORDER_ATOMIC);
var checkbox_fill = this.getFieldValue("fill") == 'TRUE' ? 'True' : 'False';
var size = this.getFieldValue('OP');
var code = '';
switch (checkbox_fill) {
case "True":
code = varName + '.show_fill_triangle(' + location_x0 + ', ' + location_y0 + ', ' + location_x1 + ', ' + location_y1 + ', ' + location_x2 + ', ' + location_y2 + ', ' + size + ')\n';
break;
case "False":
code = varName + '.show_triangle(' + location_x0 + ', ' + location_y0 + ', ' + location_x1 + ', ' + location_y1 + ', ' + location_x2 + ', ' + location_y2 + ', ' + size + ')\n';
break;
}
return code;
}
export const display_oled_showBitmap = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ssd1306'] = 'import ssd1306';
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var location_x = generator.valueToCode(this, 'START_X', generator.ORDER_ATOMIC);
var location_y = generator.valueToCode(this, 'START_Y', generator.ORDER_ATOMIC);
var bmp = generator.valueToCode(this, 'bitmap_name', generator.ORDER_ATOMIC);
var w = generator.valueToCode(this, 'WIDTH', generator.ORDER_ATOMIC);
var h = generator.valueToCode(this, 'HEIGHT', generator.ORDER_ATOMIC);
var code = varName + '.show_bitmap(' + location_x + ', ' + location_y + ', ' + bmp + ',' + w + ',' + h + ')\n';
return code;
}
export const display_oled_drawPixel = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ssd1306'] = 'import ssd1306';
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var location_x = generator.valueToCode(this, 'POS_X', generator.ORDER_ATOMIC);
var location_y = generator.valueToCode(this, 'POS_Y', generator.ORDER_ATOMIC);
var code = varName + '.show_pixel(' + location_x + ', ' + location_y + ')\n';
return code;
}
// pe:
export const display_matrix_use_i2c_init = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var iv = generator.valueToCode(this, 'I2CSUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue("key");
var code;
if (key == '32x12 Matrix') {
generator.definitions_['import_matrix32x12'] = 'import matrix32x12';
code = v + ' = matrix32x12.Matrix(' + iv + ')\n';
} else if (key == 'TM1637') {
generator.definitions_['import_tm1637'] = 'import tm1637';
code = v + ' = tm1637.' + key + "(" + iv + ')\n';
}
return code;
}
export const display_show_image = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
generator.definitions_['import_matrix32x12'] = 'import matrix32x12';
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = v + ".set_buffer(" + data + ")\n";
return code;
}
export const display_scroll_string_extern = function (_, generator) {
generator.definitions_['import_matrix32x12'] = 'import matrix32x12';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = v + ".scroll(" + data + ")\n";
return code;
}

View File

@@ -0,0 +1,723 @@
import { Boards } from 'mixly';
export const display_matrix_use_i2c_init = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var iv = generator.valueToCode(this, 'I2CSUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue("key");
var font = '';
if (['mpython', 'mixgo_pe', 'mixgo_nova'].indexOf(version) >= 0) {
font = '0x700000'
} else if (['mixgo_zero'].indexOf(version) >= 0) {
font = '0xE00000'
} else {
font = '0x3A0000'
}
var code;
if (key == '32x12 Matrix') {
generator.definitions_['import_matrix32x12'] = 'import matrix32x12';
code = v + ' = matrix32x12.Matrix(' + iv + ',font_address=' + font + ')\n';
} else if (key == '16x8 Matrix') {
generator.definitions_['import_matrix16x8'] = 'import matrix16x8';
code = v + ' = matrix16x8.Matrix(' + iv + ')\n';
}
return code;
}
export const display_matrix_extern_show_image = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = v + ".shows(" + data + ")\n";
return code;
}
export const display_matrix_extern_show_image_or_string_delay = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var space = generator.valueToCode(this, 'space', generator.ORDER_ASSIGNMENT);
var op = this.getFieldValue('center');
var code = v + ".shows(" + data + ',space = ' + space + ',center = ' + op + ")\n";
return code;
}
export const display_matrix_extern_show_frame_string = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = v + ".frame(" + data + ")\n";
return code;
}
export const display_matrix_extern_show_frame_string_delay = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var time = generator.valueToCode(this, 'time', generator.ORDER_ASSIGNMENT);
var code = v + ".frame(" + data + ',delay = ' + time + ")\n";
return code;
}
export const display_matrix_extern_scroll_string = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = v + ".scroll(" + data + ")\n";
return code;
}
export const display_matrix_extern_scroll_string_delay = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var time = generator.valueToCode(this, 'time', generator.ORDER_ASSIGNMENT);
var space = generator.valueToCode(this, 'space', generator.ORDER_ASSIGNMENT);
var code = v + ".scroll(" + data + ',speed =' + time + ',space = ' + space + ")\n";
return code;
}
export const display_matrix_extern_clear = function (block, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = v + '.fill(0)\n' + v + '.show()\n';
return code;
}
export const display_matrix_extern_shift = function (a, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var op = a.getFieldValue("OP");
var value = generator.valueToCode(a, 'val', generator.ORDER_ATOMIC);
var code = v + '.' + op + '(' + value + ')\n';
return code;
}
export const display_matrix_extern_get_pixel = function (block, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var value_x = generator.valueToCode(block, 'x', generator.ORDER_ATOMIC);
var value_y = generator.valueToCode(block, 'y', generator.ORDER_ATOMIC);
var code = v + '.pixel(int(' + value_x + '), int(' + value_y + '))';
return [code, generator.ORDER_ATOMIC];
}
export const display_matrix_extern_bright_point = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var dropdown_stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC);
var code = v + '.pixel(int(' + x + '), int(' + y + '), ' + dropdown_stat + ")\n" + v + '.show()\n';
return code;
}
export const display_matrix_extern_get_screen_pixel = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = v + '.get_brightness()';
return [code, generator.ORDER_ATOMIC];
}
export const display_matrix_extern_bright_screen = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var code = v + '.set_brightness(' + x + ')\n';
return code;
}
export const display_matrix_extern_image_builtins = function (block, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var dropdown_image = block.getFieldValue('image');
var code = v + '.' + dropdown_image;
return [code, generator.ORDER_ATOMIC];
}
export const matrix_extern_image_arithmetic = function (a, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var op = a.getFieldValue("OP");
var imga = generator.valueToCode(a, 'A', generator.ORDER_ATOMIC);
var imgb = generator.valueToCode(a, 'B', generator.ORDER_ATOMIC);
var code = v + '.map_' + op + '(' + imga + ',' + imgb + ')';
return [code, generator.ORDER_ATOMIC];
}
export const matrix_extern_image_invert = function (a, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var imga = generator.valueToCode(a, 'A', generator.ORDER_ATOMIC);
var code = v + '.map_invert(' + imga + ')';
return [code, generator.ORDER_ATOMIC];
}
//oled
export const display_use_i2c_init = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ssd1306'] = 'import ssd1306';
var i2csub = generator.valueToCode(this, 'I2CSUB', generator.ORDER_ATOMIC);
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var row = generator.valueToCode(this, 'row', generator.ORDER_ATOMIC);
var column = generator.valueToCode(this, 'column', generator.ORDER_ATOMIC);
var code = sub + " = ssd1306.SSD1306_I2C(" + row + "," + column + "," + i2csub + ")\n";
return code;
}
export const display_draw_4strings = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ssd1306'] = 'import ssd1306';
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var value_text_line1 = generator.valueToCode(this, 'Text_line1', generator.ORDER_ASSIGNMENT) || '\'\'';
var value_text_line2 = generator.valueToCode(this, 'Text_line2', generator.ORDER_ASSIGNMENT) || '\'\'';
var value_text_line3 = generator.valueToCode(this, 'Text_line3', generator.ORDER_ASSIGNMENT) || '\'\'';
var value_text_line4 = generator.valueToCode(this, 'Text_line4', generator.ORDER_ASSIGNMENT) || '\'\'';
var code = varName + '.show_str(' + value_text_line1 + ',' + value_text_line2 + ',' + value_text_line3 + ',' + value_text_line4 + ')\n'
return code;
}
export const display_line_arbitrarily = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ssd1306'] = 'import ssd1306';
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var location_x1 = generator.valueToCode(this, 'x1', generator.ORDER_ATOMIC);
var location_y1 = generator.valueToCode(this, 'y1', generator.ORDER_ATOMIC);
var location_x2 = generator.valueToCode(this, 'x2', generator.ORDER_ATOMIC);
var location_y2 = generator.valueToCode(this, 'y2', generator.ORDER_ATOMIC);
var code = varName + '.show_line(' + location_x1 + ', ' + location_y1 + ', ' + location_x2 + ', ' + location_y2 + ', 1)\n';
return code;
}
export const display_rect = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ssd1306'] = 'import ssd1306';
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var location_x = generator.valueToCode(this, 'x', generator.ORDER_ATOMIC);
var location_y = generator.valueToCode(this, 'y', generator.ORDER_ATOMIC);
var value_width = generator.valueToCode(this, 'width', generator.ORDER_ATOMIC);
var value_height = generator.valueToCode(this, 'height', generator.ORDER_ATOMIC);
var checkbox_fill = this.getFieldValue("fill") == 'TRUE' ? 'True' : 'False';
var size = this.getFieldValue('OP');
switch (checkbox_fill) {
case "True":
var code = varName + '.show_fill_rect(' + location_x + ', ' + location_y + ', ' + value_width + ', ' + value_height + ',' + size + ')\n';
return code;
case "False":
var code = varName + '.show_rect(' + location_x + ', ' + location_y + ', ' + value_width + ', ' + value_height + ',' + size + ')\n';
return code;
}
}
export const display_line = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ssd1306'] = 'import ssd1306';
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var location_x = generator.valueToCode(this, 'x', generator.ORDER_ATOMIC);
var location_y = generator.valueToCode(this, 'y', generator.ORDER_ATOMIC);
var value_length = generator.valueToCode(this, 'length', generator.ORDER_ATOMIC);
var value_direction = this.getFieldValue("direction");
var code = varName + '.show_' + value_direction + '(' + location_x + ', ' + location_y + ', ' + value_length + ', 1)\n';
return code;
}
export const display_onoff = function (_, generator) {
var code = (this.getFieldValue('ONOFF') == 'ON') ? '1' : '0';
return [code, generator.ORDER_ATOMIC];
}
export const image_shift = function (a, generator) {
generator.definitions_['import_matrix'] = 'import matrix';
var op = a.getFieldValue("OP");
var image = generator.valueToCode(a, 'img', generator.ORDER_ATOMIC);
var value = generator.valueToCode(a, 'val', generator.ORDER_ATOMIC);
var code = image + '.shift_' + op + '(' + value + ')';
return [code, generator.ORDER_ATOMIC];
}
export const display_fill = function (_, generator) {
var varName = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
generator.definitions_['import_ssd1306'] = 'import ssd1306';
generator.definitions_['import_machine'] = 'import machine';
var key = this.getFieldValue('key');
var code = varName + '.show_fill(' + key + ')\n';
return code;
}
// export const switch = function (_, generator) {
// var code = this.getFieldValue('flag');
// return [code, generator.ORDER_ATOMIC];
// };
export const display_animate = function (_, generator) {
// Boolean values true and false.
var name = this.getFieldValue("ANIMATION");
var code = 'matrix.Image.' + name;
return [code, generator.ORDER_ATOMIC];
}
export const display_circle = function (_, generator) {
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ssd1306'] = 'import ssd1306';
var location_x = generator.valueToCode(this, 'x', generator.ORDER_ATOMIC);
var location_y = generator.valueToCode(this, 'y', generator.ORDER_ATOMIC);
var value_r = generator.valueToCode(this, 'r', generator.ORDER_ATOMIC);
var checkbox_fill = this.getFieldValue("fill") == 'TRUE' ? 'True' : 'False';
var size = this.getFieldValue('OP');
switch (checkbox_fill) {
case "True":
var code = varName + '.show_fill_circle(' + location_x + ', ' + location_y + ', ' + value_r + ', ' + size + ')\n';
return code;
case "False":
var code = varName + '.show_circle(' + location_x + ', ' + location_y + ', ' + value_r + ', ' + size + ')\n';
return code;
}
}
export const display_triangle = function (_, generator) {
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ssd1306'] = 'import ssd1306';
var location_x0 = generator.valueToCode(this, 'x0', generator.ORDER_ATOMIC);
var location_y0 = generator.valueToCode(this, 'y0', generator.ORDER_ATOMIC);
var location_x1 = generator.valueToCode(this, 'x1', generator.ORDER_ATOMIC);
var location_y1 = generator.valueToCode(this, 'y1', generator.ORDER_ATOMIC);
var location_x2 = generator.valueToCode(this, 'x2', generator.ORDER_ATOMIC);
var location_y2 = generator.valueToCode(this, 'y2', generator.ORDER_ATOMIC);
var checkbox_fill = this.getFieldValue("fill") == 'TRUE' ? 'True' : 'False';
var size = this.getFieldValue('OP');
switch (checkbox_fill) {
case "True":
var code = varName + '.show_fill_triangle(' + location_x0 + ', ' + location_y0 + ', ' + location_x1 + ', ' + location_y1 + ', ' + location_x2 + ', ' + location_y2 + ', ' + size + ')\n';
return code;
case "False":
var code = varName + '.show_triangle(' + location_x0 + ', ' + location_y0 + ', ' + location_x1 + ', ' + location_y1 + ', ' + location_x2 + ', ' + location_y2 + ', ' + size + ')\n';
return code;
}
}
export const display_oled_showBitmap = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ssd1306'] = 'import ssd1306';
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var location_x = generator.valueToCode(this, 'START_X', generator.ORDER_ATOMIC);
var location_y = generator.valueToCode(this, 'START_Y', generator.ORDER_ATOMIC);
var bmp = generator.valueToCode(this, 'bitmap_name', generator.ORDER_ATOMIC);
var w = generator.valueToCode(this, 'WIDTH', generator.ORDER_ATOMIC);
var h = generator.valueToCode(this, 'HEIGHT', generator.ORDER_ATOMIC);
var code = varName + '.show_bitmap(' + location_x + ', ' + location_y + ', ' + bmp + ',' + w + ',' + h + ')\n';
return code;
}
export const display_oled_drawPixel = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ssd1306'] = 'import ssd1306';
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var location_x = generator.valueToCode(this, 'POS_X', generator.ORDER_ATOMIC);
var location_y = generator.valueToCode(this, 'POS_Y', generator.ORDER_ATOMIC);
var code = varName + '.show_pixel(' + location_x + ', ' + location_y + ')\n';
return code;
}
//tm1650
export const display_tm_use_i2c_init = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var iv = generator.valueToCode(this, 'I2CSUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue("key");
var code;
if (key == 'TM1650') {
generator.definitions_['import_tm1650'] = 'import tm1650';
code = v + ' = tm1650.' + key + "(" + iv + ')\n';
} else if (key == 'TM1637') {
generator.definitions_['import_tm1637'] = 'import tm1637';
code = v + ' = tm1637.' + key + "(" + iv + ')\n';
}
return code;
}
export const display_tm1650_power = function (_, generator) {
// var type = this.getFieldValue("TYPE");
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var stat = this.getFieldValue("STAT");
var code = v + '.' + stat + "()\n";
return code;
}
export const display_tm1650_show_num = function (_, generator) {
// var type = this.getFieldValue("TYPE");
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var val = generator.valueToCode(this, 'VALUE', generator.ORDER_ATOMIC);
var code = v + ".shownum(" + val + ")\n";
return code;
}
export const display_tm1650_show_dot = function (_, generator) {
// var type = this.getFieldValue("TYPE");
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var n = generator.valueToCode(this, 'NO', generator.ORDER_ATOMIC);
var stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC);
var code = v + '.showDP(' + n + ", " + stat + ")\n";
return code;
}
export const display_tm1650_set_brightness = function (_, generator) {
// var type = this.getFieldValue("TYPE");
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var val = generator.valueToCode(this, 'VALUE', generator.ORDER_ATOMIC);
var code = v + ".intensity(" + val + ")\n";
return code;
}
export const tft_use_spi_init = function (_, generator) {
generator.definitions_['import_st7789'] = 'import st7789';
var version = Boards.getSelectedBoardKey().split(':')[2]
var font = '';
if (['mpython', 'mixgo_pe', 'mixgo_nova'].indexOf(version) >= 0) {
font = '0x700000'
} else if (['mixgo_zero'].indexOf(version) >= 0) {
font = '0xE00000'
} else {
font = '0x3A0000'
}
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var sv = generator.valueToCode(this, 'SPISUB', generator.ORDER_ATOMIC);
var pv = generator.valueToCode(this, 'PINCS', generator.ORDER_ATOMIC);
var dv = generator.valueToCode(this, 'PINDC', generator.ORDER_ATOMIC);
var w = generator.valueToCode(this, 'WIDTH', generator.ORDER_ATOMIC);
var h = generator.valueToCode(this, 'HEIGHT', generator.ORDER_ATOMIC);
var op = this.getFieldValue('rotate');
var code = v + ' = st7789.ST7789(' + sv + ',' + w + ',' + h + ',dc_pin=' + dv + ',cs_pin=' + pv + ',rotation=' + op + ',font_address=' + font + ')\n';
return code;
}
export const tft_show_image_xy = function (_, generator) {
generator.definitions_['import_st7789'] = 'import st7789';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var size = generator.valueToCode(this, 'size', generator.ORDER_ASSIGNMENT);
var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
if (color.slice(0, 2) == "0x") {
var code = v + ".image(" + data + ',x = ' + x + ',y = ' + y + ',size = ' + size + ',color=' + color + ")\n";
} else {
const rgbValues = color.match(/\d+/g);
const r = parseInt(rgbValues[0]);
const g = parseInt(rgbValues[1]);
const b = parseInt(rgbValues[2]);
var rgb = "0x" + ((r << 16) + (g << 8) + b).toString(16).padStart(4, "0");
var rgb565 = (rgb & 0xf80000) >> 8 | (rgb & 0xfc00) >> 5 | (rgb & 0xff) >> 3;
var code = v + ".image(" + data + ',x = ' + x + ',y = ' + y + ',size = ' + size + ',color=0x' + rgb565.toString(16) + ")\n";
}
return code;
}
export const display_color_seclet = function (_, generator) {
var colour = this.getFieldValue('COLOR');
var code = '0x' + colour.slice(1) + ''
var rgb565 = (code & 0xf80000) >> 8 | (code & 0xfc00) >> 5 | (code & 0xff) >> 3
return ['0x' + rgb565.toString(16), generator.ORDER_ATOMIC];
}
export const tft_show_image_or_string_delay = function (_, generator) {
generator.definitions_['import_st7789'] = 'import st7789';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var size = generator.valueToCode(this, 'size', generator.ORDER_ASSIGNMENT);
var space = generator.valueToCode(this, 'space', generator.ORDER_ASSIGNMENT);
var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var op = this.getFieldValue('center');
if (color.slice(0, 2) == "0x") {
var code = v + ".shows(" + data + ',x = ' + x + ',y = ' + y + ',size = ' + size + ',space = ' + space + ',center = ' + op + ',color=' + color + ")\n";
} else {
const rgbValues = color.match(/\d+/g);
const r = parseInt(rgbValues[0]);
const g = parseInt(rgbValues[1]);
const b = parseInt(rgbValues[2]);
var rgb = "0x" + ((r << 16) + (g << 8) + b).toString(16).padStart(4, "0");
var rgb565 = (rgb & 0xf80000) >> 8 | (rgb & 0xfc00) >> 5 | (rgb & 0xff) >> 3;
var code = v + ".shows(" + data + ',x = ' + x + ',y = ' + y + ',size = ' + size + ',space = ' + space + ',center = ' + op + ',color=0x' + rgb565.toString(16) + ")\n";
}
return code;
}
export const tft_show_frame_string_delay = function (_, generator) {
generator.definitions_['import_st7789'] = 'import st7789';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var size = generator.valueToCode(this, 'size', generator.ORDER_ASSIGNMENT);
var time = generator.valueToCode(this, 'time', generator.ORDER_ASSIGNMENT);
var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
if (color.slice(0, 2) == "0x") {
var code = v + ".frame(" + data + ',size = ' + size + ',delay = ' + time + ',color=' + color + ")\n";
} else {
const rgbValues = color.match(/\d+/g);
const r = parseInt(rgbValues[0]);
const g = parseInt(rgbValues[1]);
const b = parseInt(rgbValues[2]);
var rgb = "0x" + ((r << 16) + (g << 8) + b).toString(16).padStart(4, "0");
var rgb565 = (rgb & 0xf80000) >> 8 | (rgb & 0xfc00) >> 5 | (rgb & 0xff) >> 3;
var code = v + ".frame(" + data + ',size = ' + size + ',delay = ' + time + ',color=0x' + rgb565.toString(16) + ")\n";
}
return code;
}
export const tft_scroll_string_delay = function (_, generator) {
generator.definitions_['import_st7789'] = 'import st7789';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var size = generator.valueToCode(this, 'size', generator.ORDER_ASSIGNMENT);
var time = generator.valueToCode(this, 'time', generator.ORDER_ASSIGNMENT);
var space = generator.valueToCode(this, 'space', generator.ORDER_ASSIGNMENT);
var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
if (color.slice(0, 2) == "0x") {
var code = v + ".scroll(" + data + ',y = ' + y + ',size = ' + size + ',speed =' + time + ',space = ' + space + ',color=' + color + ")\n";
} else {
const rgbValues = color.match(/\d+/g);
const r = parseInt(rgbValues[0]);
const g = parseInt(rgbValues[1]);
const b = parseInt(rgbValues[2]);
var rgb = "0x" + ((r << 16) + (g << 8) + b).toString(16).padStart(4, "0");
var rgb565 = (rgb & 0xf80000) >> 8 | (rgb & 0xfc00) >> 5 | (rgb & 0xff) >> 3;
var code = v + ".scroll(" + data + ',y = ' + y + ',size = ' + size + ',speed =' + time + ',space = ' + space + ',color=0x' + rgb565.toString(16) + ")\n";
}
return code;
}
export const tft_fill = function (_, generator) {
generator.definitions_['import_st7789'] = 'import st7789';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = v + '.fill(st7789.' + key + ')\n';
return code;
}
export const tft_line_arbitrarily = function (_, generator) {
generator.definitions_['import_st7789'] = 'import st7789';
var varName = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var location_x1 = generator.valueToCode(this, 'x1', generator.ORDER_ATOMIC);
var location_y1 = generator.valueToCode(this, 'y1', generator.ORDER_ATOMIC);
var location_x2 = generator.valueToCode(this, 'x2', generator.ORDER_ATOMIC);
var location_y2 = generator.valueToCode(this, 'y2', generator.ORDER_ATOMIC);
var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
if (color.slice(0, 2) == "0x") {
var code = varName + '.line(' + location_x1 + ', ' + location_y1 + ', ' + location_x2 + ', ' + location_y2 + ', color=' + color + ')\n';
} else {
const rgbValues = color.match(/\d+/g);
const r = parseInt(rgbValues[0]);
const g = parseInt(rgbValues[1]);
const b = parseInt(rgbValues[2]);
var rgb = "0x" + ((r << 16) + (g << 8) + b).toString(16).padStart(4, "0");
var rgb565 = (rgb & 0xf80000) >> 8 | (rgb & 0xfc00) >> 5 | (rgb & 0xff) >> 3;
var code = varName + '.line(' + location_x1 + ', ' + location_y1 + ', ' + location_x2 + ', ' + location_y2 + ', color=0x' + rgb565.toString(16) + ')\n';
}
return code;
}
export const display_lcd_use_i2c_init = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var iv = generator.valueToCode(this, 'I2CSUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue("key");
var addr = generator.valueToCode(this, 'ADDR', generator.ORDER_ATOMIC);
var code;
generator.definitions_['import_i2clcd'] = 'import i2clcd';
code = v + ' = i2clcd.LCD' + "(" + iv + ',lcd_width=' + key + ',i2c_addr=' + addr + ')\n';
return code;
}
export const lcd_show_image_or_string_delay = function (_, generator) {
generator.definitions_['import_i2clcd'] = 'import i2clcd';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var op = this.getFieldValue('center');
var code = v + ".shows(" + data + ',column = ' + x + ',line = ' + y + ',center = ' + op + ")\n";
return code;
}
export const lcd_print_string = function (_, generator) {
generator.definitions_['import_i2clcd'] = 'import i2clcd';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var delay = generator.valueToCode(this, 'time', generator.ORDER_ASSIGNMENT);
var code = v + ".print(" + data + ',column = ' + x + ',line = ' + y + ',delay=' + delay + ")\n";
return code;
}
export const lcd_backlight = function (_, generator) {
generator.definitions_['import_i2clcd'] = 'import i2clcd';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = v + '.backlight(' + key + ')\n';
return code;
}
export const lcd_clear = function (block, generator) {
generator.definitions_['import_i2clcd'] = 'import i2clcd';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = v + '.clear()\n';
return code;
}
export const display_oled_use_i2c_init = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var iv = generator.valueToCode(this, 'I2CSUB', generator.ORDER_ATOMIC);
var addr = generator.valueToCode(this, 'ADDR', generator.ORDER_ATOMIC);
var version = Boards.getSelectedBoardKey().split(':')[2]
var font = '';
if (['mpython', 'mixgo_pe', 'mixgo_nova'].indexOf(version) >= 0) {
font = '0x700000'
} else if (['mixgo_zero'].indexOf(version) >= 0) {
font = '0xE00000'
} else {
font = '0x3A0000'
}
var code;
generator.definitions_['import_oled128x64'] = 'import oled128x64';
code = v + ' = oled128x64.OLED' + "(" + iv + ',address=' + addr + ',font_address=' + font + ')\n';
return code;
}
export const extern_oled_show_image = function (_, generator) {
generator.definitions_['import_oled128x64'] = 'import oled128x64';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = v + ".image(" + data + ")\n";
return code;
}
export const extern_oled_show_image_xy = function (_, generator) {
generator.definitions_['import_oled128x64'] = 'import oled128x64';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var size = generator.valueToCode(this, 'size', generator.ORDER_ASSIGNMENT);
var code = v + ".image(" + data + ',x = ' + x + ',y = ' + y + ',size = ' + size + ")\n";
return code;
}
export const extern_oled_show_string = function (_, generator) {
generator.definitions_['import_oled128x64'] = 'import oled128x64';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = v + ".shows(" + data + ")\n";
return code;
}
export const extern_oled_show_image_or_string_delay = function (_, generator) {
generator.definitions_['import_oled128x64'] = 'import oled128x64';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var size = generator.valueToCode(this, 'size', generator.ORDER_ASSIGNMENT);
var space = generator.valueToCode(this, 'space', generator.ORDER_ASSIGNMENT);
var op = this.getFieldValue('center');
var code = v + ".shows(" + data + ',x = ' + x + ',y = ' + y + ',size = ' + size + ',space = ' + space + ',center = ' + op + ")\n";
return code;
}
export const extern_oled_show_frame_string = function (_, generator) {
generator.definitions_['import_oled128x64'] = 'import oled128x64';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = v + ".frame(" + data + ")\n";
return code;
}
export const extern_oled_show_frame_string_delay = function (_, generator) {
generator.definitions_['import_oled128x64'] = 'import oled128x64';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var size = generator.valueToCode(this, 'size', generator.ORDER_ASSIGNMENT);
var time = generator.valueToCode(this, 'time', generator.ORDER_ASSIGNMENT);
var code = v + ".frame(" + data + ',size = ' + size + ',delay = ' + time + ")\n";
return code;
}
export const extern_oled_scroll_string = function (_, generator) {
generator.definitions_['import_oled128x64'] = 'import oled128x64';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = v + ".scroll(" + data + ")\n";
return code;
}
export const extern_oled_scroll_string_delay = function (_, generator) {
generator.definitions_['import_oled128x64'] = 'import oled128x64';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var size = generator.valueToCode(this, 'size', generator.ORDER_ASSIGNMENT);
var time = generator.valueToCode(this, 'time', generator.ORDER_ASSIGNMENT);
var space = generator.valueToCode(this, 'space', generator.ORDER_ASSIGNMENT);
var code = v + ".scroll(" + data + ',y = ' + y + ',size = ' + size + ',speed =' + time + ',space = ' + space + ")\n";
return code;
}
export const extern_oled_clear = function (block, generator) {
generator.definitions_['import_oled128x64'] = 'import oled128x64';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = v + '.fill(0)\n' + v + '.show()\n';
return code;
}
export const extern_oled_shift = function (a, generator) {
generator.definitions_['import_oled128x64'] = 'import oled128x64';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var op = a.getFieldValue("OP");
var value = generator.valueToCode(a, 'val', generator.ORDER_ATOMIC);
var code = v + '.' + op + '(' + value + ')\n';
return code;
}
export const extern_oled_get_pixel = function (block, generator) {
generator.definitions_['import_oled128x64'] = 'import oled128x64';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var value_x = generator.valueToCode(block, 'x', generator.ORDER_ATOMIC);
var value_y = generator.valueToCode(block, 'y', generator.ORDER_ATOMIC);
var code = v + '.pixel(int(' + value_x + '), int(' + value_y + '))';
return [code, generator.ORDER_ATOMIC];
}
export const extern_oled_bright_point = function (_, generator) {
generator.definitions_['import_oled128x64'] = 'import oled128x64';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var dropdown_stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC);
var code = v + '.pixel(int(' + x + '), int(' + y + '), ' + dropdown_stat + ")\n" + v + '.show()\n';
return code;
}
export const extern_oled_shape_rect = function (block, generator) {
generator.definitions_['import_oled128x64'] = 'import oled128x64';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var x = generator.valueToCode(block, 'x', generator.ORDER_ATOMIC);
var y = generator.valueToCode(block, 'y', generator.ORDER_ATOMIC);
var w = generator.valueToCode(block, 'w', generator.ORDER_ATOMIC);
var h = generator.valueToCode(block, 'h', generator.ORDER_ATOMIC);
var state = block.getFieldValue('state');
var shape = block.getFieldValue('shape');
var code = v + '.' + shape + '(' + x + ', ' + y + ', ' + w + ', ' + h + ', ' + state + ')\n' + v + '.show()\n';
return code;
}
export const extern_oled_hvline = function (block, generator) { //水平线
generator.definitions_['import_oled128x64'] = 'import oled128x64';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var x = generator.valueToCode(block, 'x', generator.ORDER_ATOMIC);
var y = generator.valueToCode(block, 'y', generator.ORDER_ATOMIC);
var var_length = generator.valueToCode(block, 'length', generator.ORDER_ATOMIC);
var state = block.getFieldValue('state');
var hv = block.getFieldValue('dir_h_v');
var code = v + '.' + (('0' == hv) ? 'v' : 'h') + 'line(' + x + ', ' + y + ', ' + var_length + ', ' + state + ')\n' + v + '.show()\n';
return code;
}
export const extern_oled_line = function (block, generator) {
generator.definitions_['import_oled128x64'] = 'import oled128x64';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var x1 = generator.valueToCode(block, 'x1', generator.ORDER_ATOMIC);
var y1 = generator.valueToCode(block, 'y1', generator.ORDER_ATOMIC);
var x2 = generator.valueToCode(block, 'x2', generator.ORDER_ATOMIC);
var y2 = generator.valueToCode(block, 'y2', generator.ORDER_ATOMIC);
var state = block.getFieldValue('state');
var code = v + '.line(' + x1 + ', ' + y1 + ', ' + x2 + ', ' + y2 + ', ' + state + ')\n' + v + '.show()\n';
return code;
}

View File

@@ -0,0 +1,916 @@
import { Boards } from 'mixly';
export const display_show_image = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = "onboard_matrix.shows(" + data + ")\n";
return code;
}
export const display_show_image_or_string_delay = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var space = generator.valueToCode(this, 'space', generator.ORDER_ASSIGNMENT);
var op = this.getFieldValue('center');
if (version == "mixgo_zero" || version == "mixgo_nova") {
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var code = "onboard_tft.shows(" + data + ",space = " + space + ',center = ' + op + ")\n";
return code;
}
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var code = "onboard_matrix.shows(" + data + ',space = ' + space + ',center = ' + op + ")\n";
return code;
}
export const display_show_frame_string = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
if (version == 'mpython') {
generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_oled";
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = "onboard_oled.frame(" + data + ")\n";
} else {
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = "onboard_matrix.frame(" + data + ")\n";
}
return code;
}
export const display_show_frame_string_delay = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var time = generator.valueToCode(this, 'time', generator.ORDER_ASSIGNMENT);
var code = "onboard_matrix.frame(" + data + ',delay = ' + time + ")\n";
return code;
}
export const display_scroll_string = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
if (version == 'mpython') {
generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_oled";
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = "onboard_oled.scroll(" + data + ")\n";
} else {
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = "onboard_matrix.scroll(" + data + ")\n";
}
return code;
}
export const display_scroll_string_delay = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var time = generator.valueToCode(this, 'time', generator.ORDER_ASSIGNMENT);
var space = generator.valueToCode(this, 'space', generator.ORDER_ASSIGNMENT);
var code = "onboard_matrix.scroll(" + data + ',speed =' + time + ',space = ' + space + ")\n";
return code;
}
export const display_image_builtins = function (block, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var dropdown_image = block.getFieldValue('image');
var code = 'onboard_matrix.' + dropdown_image;
return [code, generator.ORDER_ATOMIC];
}
export const display_image_builtins_all = function (block, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var dropdown_image = block.getFieldValue('image');
var code = 'onboard_matrix.' + dropdown_image;
return [code, generator.ORDER_ATOMIC];
}
export const display_image_create = function (block, generator) {
var colours = {
"#000000": "0",
//"#440000": "1",
//"#660000": "2",
//"#880000": "3",
//"#aa0000": "4",
//"#bb0000": "5",
//"#cc0000": "6",
//"#dd0000": "7",
//"#ee0000": "8",
"#ff0000": "1"
}
function pad(num) {
let newNum = '';
if (num.length % 2 === 1) {
num = '0' + num;
}
if (num.length < 8) {
let k = 8 - num.length
for (let i = 1; i <= k; i++) {
num = '0' + num;
}
}
for (let i = 1; i <= num.length; i++)
if (i % 2 === 0 && i !== num.length)
newNum = newNum + num[i - 1] + ',0x';
else
newNum += num[i - 1];
return '0x' + newNum;
}
let colorList = [];
for (let i = 0; i < 12; i++) {
let colorRow = '';
let colorNum = 0;
let correct = 0;
for (let j = 0; j < 32; j++) {
if (j < 8) {
correct = 7 - j
}
else if (j < 16) {
correct = 23 - j
}
else if (j < 24) {
correct = 39 - j
}
else if (j < 32) {
correct = 55 - j
}
colorNum += Number(colours[block.getFieldValue(i + '-' + j)]) * Math.pow(2, 31 - correct);
}
colorRow += pad(colorNum.toString(16));
colorList.unshift(colorRow);
}
let codelist = [];
for (let i = 0; i < colorList.length; i++) {
codelist[i] = colorList[colorList.length - 1 - i];
}
//var code = "bytearray(b'" + colorList.join('') + "')";
var code = '[' + codelist + ']';
return [code, generator.ORDER_ATOMIC];
}
export const display_clear = function (block, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
if (version == 'mpython') {
generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_oled";
var code = 'onboard_oled.fill(0)\n' + 'onboard_oled.show()\n';
}
else {
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var code = 'onboard_matrix.fill(0)\n' + 'onboard_matrix.show()\n';
}
return code;
}
export const image_arithmetic = function (a, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var op = a.getFieldValue("OP");
var imga = generator.valueToCode(a, 'A', generator.ORDER_ATOMIC);
var imgb = generator.valueToCode(a, 'B', generator.ORDER_ATOMIC);
var code = 'onboard_matrix.map_' + op + '(' + imga + ',' + imgb + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_invert = function (a, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var imga = generator.valueToCode(a, 'A', generator.ORDER_ATOMIC);
var code = 'onboard_matrix.map_invert(' + imga + ')';
return [code, generator.ORDER_ATOMIC];
}
export const display_shift = function (a, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
if (version == 'mpython') {
generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_oled";
var op = a.getFieldValue("OP");
var value = generator.valueToCode(a, 'val', generator.ORDER_ATOMIC);
var code = 'onboard_oled.' + op + '(' + value + ')\n';
} else {
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var op = a.getFieldValue("OP");
var value = generator.valueToCode(a, 'val', generator.ORDER_ATOMIC);
var code = 'onboard_matrix.' + op + '(' + value + ')\n';
}
return code;
}
// export const onboard_oled_shift = function (a) {
// var version = Boards.getSelectedBoardKey().split(':')[2]
// return code;
// };
export const display_get_pixel = function (block, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
if (version == 'mpython') {
generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_oled";
var value_x = generator.valueToCode(block, 'x', generator.ORDER_ATOMIC);
var value_y = generator.valueToCode(block, 'y', generator.ORDER_ATOMIC);
var code = 'onboard_oled.pixel(int(' + value_x + '), int(' + value_y + '))';
} else {
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var value_x = generator.valueToCode(block, 'x', generator.ORDER_ATOMIC);
var value_y = generator.valueToCode(block, 'y', generator.ORDER_ATOMIC);
var code = 'onboard_matrix.pixel(int(' + value_x + '), int(' + value_y + '))';
}
return [code, generator.ORDER_ATOMIC];
}
export const display_bright_point = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var dropdown_stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC);
var code = 'onboard_matrix.pixel(int(' + x + '), int(' + y + '), ' + dropdown_stat + ")\n" + 'onboard_matrix.show()\n';
return code;
}
export const display_get_screen_pixel = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var code = 'onboard_matrix.get_brightness()';
return [code, generator.ORDER_ATOMIC];
}
export const display_bright_screen = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var code = 'onboard_matrix.set_brightness(' + x + ')\n';
return code;
}
//mixgo_me onboard_matrix below:
export const mixgome_display_image_create = function (block, generator) {
var colours = {
"#000000": "0",
"#ff0000": "1"
}
function pad(num) {
let newNum = '';
if (num.length % 2 === 1) {
num = '0' + num;
}
for (let i = 1; i <= num.length; i++)
if (i % 2 === 0 && i !== num.length)
newNum = newNum + num[i - 1] + '\\x';
else
newNum += num[i - 1];
return '\\x' + newNum;
}
let colorList = [];
for (let i = 0; i < 5; i++) {
let colorRow = '';
let colorNum = 0;
for (let j = 0; j < 8; j++) {
colorNum += Number(colours[block.getFieldValue((4 - i) + '-' + j)]) * Math.pow(2, j);
}
colorRow += pad(colorNum.toString(16));
colorList.unshift(colorRow);
}
var code = "bytearray(b'" + colorList.join('') + "')";
return [code, generator.ORDER_ATOMIC];
}
export const mixgomini_display_image_create = function (block, generator) {
var blinkColor = '#ff0000';
var code = '';
for (let i = 0; i < 12; i++) {
let value = 0;
for (let j = 0; j < 8; j++) {
if (block.getFieldValue(`${j}-${i}`) !== blinkColor) {
continue;
}
value += 1 << j;
}
let temp = value.toString(16);
code += '\\x' + Array(2 - temp.length).fill(0).join('') + temp;
}
code = `bytearray(b'${code}')`;
return [code, generator.ORDER_ATOMIC];
}
export const mixgome_display_font = function (a, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var op = a.getFieldValue("OP");
var code = 'onboard_matrix.font(' + op + ')\n';
return code;
}
export const mixgo_display_image_create_new = function (block, generator) {
var colours = {
"#000000": "0",
"#ff0000": "1"
}
function pad(num) {
let newNum = '';
if (num.length % 2 === 1) {
num = '0' + num;
}
while (num.length < 4) {
num = '0' + num;
}
for (let i = 1; i <= num.length; i++)
if (i % 2 === 0 && i !== num.length)
newNum = newNum + num[i - 1] + '\\x';
else
newNum += num[i - 1];
return '\\x' + newNum;
}
let colorList = [];
for (let i = 0; i < 8; i++) {
let colorRow = '';
let colorNum = 0;
for (let j = 0; j < 16; j++) {
var c = (j + 8) % 16
colorNum += Number(colours[block.getFieldValue((7 - i) + '-' + c)]) * Math.pow(2, j);
}
colorRow += pad(colorNum.toString(16));
colorList.unshift(colorRow);
}
var code = "bytearray(b'" + colorList.join('') + "')";
return [code, generator.ORDER_ATOMIC];
}
//mpython
export const mpython_pbm_image = function (block, generator) {
var code = block.getFieldValue('path');
var sort = ['expression_picture', 'eye_picture', 'informatio_picture', 'object_picture', 'progres_picture']
var img = [["Angry", "Bored", "Confused", "Happy", "Heart", "Paper", "Rock", "Sad", "Scissors", "Silly", "Sleep", "Small_heart", "Small_paper", "Small_rock", "Small_scissors", "Smile", "Surprise", "Wonderful"], ["Eyes_Angry", "Awake", "Black_eye", "Bottom_left", "Bottom_right", "Crazy_1", "Crazy_2", "Disappointed", "Dizzy", "Down", "Hurt", "Evil", "Knocked_out", "Love", "Middle_left", "Middle_right", "Neutral", "Nuclear", "Pinch_left", "Pinch_middle", "Pinch_right", "Tear", "Tired_middle", "Tired_left", "Tired_right", "Toxic", "Up", "Winking"], ["Accept", "Backward", "Decline", "Forward", "Left", "No_go", "Question_mark", "Right", "Stop_1", "Stop_2", "Thumbs_down", "Thumbs_up", "Warning"], ["Bomb", "Boom", "Fire", "Flowers", "Forest", "Lightning", "Light_off", "Light_on", "Night", "Pirate", "Snow", "Target"], ["Bar_0", "Bar_1", "Bar_2", "Bar_3", "Bar_4", "Dial_0", "Dial_1", "Dial_2", "Dial_3", "Dial_4", "Dots_0", "Dots_1", "Dots_2", "Dots_3", "Hourglass_0", "Hourglass_1", "Hourglass_2", "Timer_0", "Timer_1", "Timer_2", "Timer_3", "Timer_4", "Water_level_0", "Water_level_1", "Water_level_2", "Water_level_3"]]
for (var i = 0; i < 5; i++) {
if (img[i].indexOf(code) != -1) {
var tag = i;
break;
}
}
generator.definitions_['import_' + sort[tag] + '_' + code] = "from " + sort[tag] + " import " + code;
return [code, generator.ORDER_ATOMIC];
}
export const onboard_oled_show_image = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_oled";
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = "onboard_oled.image(" + data + ")\n";
return code;
}
export const onboard_oled_show_image_xy = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_oled";
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var size = generator.valueToCode(this, 'size', generator.ORDER_ASSIGNMENT);
var code = "onboard_oled.image(" + data + ',x = ' + x + ',y = ' + y + ',size = ' + size + ")\n";
return code;
}
export const onboard_oled_show_string = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_oled";
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = "onboard_oled.shows(" + data + ")\n";
return code;
}
export const onboard_oled_show_image_or_string_delay = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_oled";
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var size = generator.valueToCode(this, 'size', generator.ORDER_ASSIGNMENT);
var space = generator.valueToCode(this, 'space', generator.ORDER_ASSIGNMENT);
var op = this.getFieldValue('center');
var code = "onboard_oled.shows(" + data + ',x = ' + x + ',y = ' + y + ',size = ' + size + ',space = ' + space + ',center = ' + op + ")\n";
return code;
}
export const onboard_oled_show_frame_string_delay = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_oled";
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var size = generator.valueToCode(this, 'size', generator.ORDER_ASSIGNMENT);
var time = generator.valueToCode(this, 'time', generator.ORDER_ASSIGNMENT);
var code = "onboard_oled.frame(" + data + ',size = ' + size + ',delay = ' + time + ")\n";
return code;
}
export const onboard_oled_scroll_string_delay = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_oled";
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var size = generator.valueToCode(this, 'size', generator.ORDER_ASSIGNMENT);
var time = generator.valueToCode(this, 'time', generator.ORDER_ASSIGNMENT);
var space = generator.valueToCode(this, 'space', generator.ORDER_ASSIGNMENT);
var code = "onboard_oled.scroll(" + data + ',y = ' + y + ',size = ' + size + ',speed =' + time + ',space = ' + space + ")\n";
return code;
}
export const onboard_oled_bright_point = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_oled";
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var dropdown_stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC);
var code = 'onboard_oled.pixel(int(' + x + '), int(' + y + '), ' + dropdown_stat + ")\n" + 'onboard_oled.show()\n';
return code;
}
export const mpython_display_shape_rect = function (block, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_oled";
var x = generator.valueToCode(block, 'x', generator.ORDER_ATOMIC);
var y = generator.valueToCode(block, 'y', generator.ORDER_ATOMIC);
var w = generator.valueToCode(block, 'w', generator.ORDER_ATOMIC);
var h = generator.valueToCode(block, 'h', generator.ORDER_ATOMIC);
var state = block.getFieldValue('state');
var shape = block.getFieldValue('shape');
var code = 'onboard_oled.' + shape + '(' + x + ', ' + y + ', ' + w + ', ' + h + ', ' + state + ')\n' + 'onboard_oled.show()\n';
return code;
}
export const mpython_display_hvline = function (block, generator) { //水平线
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_oled";
var x = generator.valueToCode(block, 'x', generator.ORDER_ATOMIC);
var y = generator.valueToCode(block, 'y', generator.ORDER_ATOMIC);
var var_length = generator.valueToCode(block, 'length', generator.ORDER_ATOMIC);
var state = block.getFieldValue('state');
var hv = block.getFieldValue('dir_h_v');
var code = 'onboard_oled.' + (('0' == hv) ? 'v' : 'h') + 'line(' + x + ', ' + y + ', ' + var_length + ', ' + state + ')\n' + 'onboard_oled.show()\n';
return code;
}
export const mpython_display_line = function (block, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_oled";
var x1 = generator.valueToCode(block, 'x1', generator.ORDER_ATOMIC);
var y1 = generator.valueToCode(block, 'y1', generator.ORDER_ATOMIC);
var x2 = generator.valueToCode(block, 'x2', generator.ORDER_ATOMIC);
var y2 = generator.valueToCode(block, 'y2', generator.ORDER_ATOMIC);
var state = block.getFieldValue('state');
var code = 'onboard_oled.line(' + x1 + ', ' + y1 + ', ' + x2 + ', ' + y2 + ', ' + state + ')\n' + 'onboard_oled.show()\n';
return code;
}
//mixbot onboard_matrix below:
export const mixbot_display_image_create = function (block, generator) {
var colours = {
"#000000": "0",
"#ff0000": "1"
}
function pad(num) {
let newNum = '';
if (num.length % 2 === 1) {
num = '0' + num;
}
for (let i = 1; i <= num.length; i++)
if (i % 2 === 0 && i !== num.length)
newNum = newNum + num[i - 1] + '\\x';
else
newNum += num[i - 1];
return '\\x' + newNum;
}
let colorList = [];
for (let i = 0; i < 5; i++) {
let colorRow = '';
let colorNum = 0;
for (let j = 0; j < 5; j++) {
colorNum += Number(colours[block.getFieldValue((4 - i) + '-' + j)]) * Math.pow(2, j);
}
colorRow += pad(colorNum.toString(16));
colorList.unshift(colorRow);
}
var code = "b'" + colorList.join('') + "'";
return [code, generator.ORDER_ATOMIC];
}
export const mixbot_display_get_screen_pixel = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var code = 'onboard_matrix.screenbright()';
return [code, generator.ORDER_ATOMIC];
}
export const mixbot_display_get_ambientbright = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var code = 'onboard_matrix.ambientbright()';
return [code, generator.ORDER_ATOMIC];
}
export const mixbot_display_bright_screen = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var code = 'onboard_matrix.screenbright(' + x + ')\n';
return code;
}
export const mixbot_display_rotate = function (a, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_matrix'] = "from " + version + " import onboard_matrix";
var op = a.getFieldValue("OP");
var code = 'onboard_matrix.direction(' + op + ')\n';
return code;
}
export const bitbot_display_image_create = function (block, generator) {
var colours = {
"#000000": "0",
"#ff0000": "1"
}
function pad(num) {
if (num.length == 1) {
return '\\x0' + num + '\\x00';
}
if (num.length == 2) {
return '\\x' + num + '\\x00';
}
if (num.length == 3) {
return '\\x' + num[1] + num[2] + '\\x0' + num[0];
}
}
let colorList = [];
for (let i = 0; i < 12; i++) {
let colorRow = '';
let colorNum = 0;
for (let j = 0; j < 12; j++) {
colorNum += Number(colours[block.getFieldValue((11 - i) + '-' + j)]) * Math.pow(2, j);
}
colorRow += pad(colorNum.toString(16));
colorList.unshift(colorRow);
}
var code = "b'" + colorList.join('') + "'";
return [code, generator.ORDER_ATOMIC];
}
//mixgo_nova onboard tft below:
export const onboard_tft_show_image = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = "onboard_tft.image(" + data + ", color=0xffff)\n";
return code;
}
export const onboard_tft_show_image_xy = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var size = generator.valueToCode(this, 'size', generator.ORDER_ASSIGNMENT);
var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
if (color.slice(0, 2) == "0x") {
var code = "onboard_tft.image(" + data + ',x = ' + x + ',y = ' + y + ',size = ' + size + ',color=' + color + ")\n";
} else {
const rgbValues = color.match(/\d+/g);
const r = parseInt(rgbValues[0]);
const g = parseInt(rgbValues[1]);
const b = parseInt(rgbValues[2]);
var rgb = "0x" + ((r << 16) + (g << 8) + b).toString(16).padStart(4, "0");
var rgb565 = (rgb & 0xf80000) >> 8 | (rgb & 0xfc00) >> 5 | (rgb & 0xff) >> 3;
var code = "onboard_tft.image(" + data + ',x = ' + x + ',y = ' + y + ',size = ' + size + ',color=0x' + rgb565.toString(16) + ")\n";
}
return code;
}
export const onboard_tft_show_image_or_string_delay = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var size = generator.valueToCode(this, 'size', generator.ORDER_ASSIGNMENT);
var space = generator.valueToCode(this, 'space', generator.ORDER_ASSIGNMENT);
var op = this.getFieldValue('center');
var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
if (color.slice(0, 2) == "0x") {
var code = "onboard_tft.shows(" + data + ',x = ' + x + ',y = ' + y + ',size = ' + size + ',space = ' + space + ',center = ' + op + ',color=' + color + ")\n";
} else {
const rgbValues = color.match(/\d+/g);
const r = parseInt(rgbValues[0]);
const g = parseInt(rgbValues[1]);
const b = parseInt(rgbValues[2]);
var rgb = "0x" + ((r << 16) + (g << 8) + b).toString(16).padStart(4, "0");
var rgb565 = (rgb & 0xf80000) >> 8 | (rgb & 0xfc00) >> 5 | (rgb & 0xff) >> 3;
var code = "onboard_tft.shows(" + data + ',x = ' + x + ',y = ' + y + ',size = ' + size + ',space = ' + space + ',center = ' + op + ',color=0x' + rgb565.toString(16) + ")\n";
}
return code;
}
export const onboard_tft_show_frame_string = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_tft";
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = "onboard_tft.frame(" + data + ",color=0xffff)\n";
return code;
}
export const onboard_tft_show_frame_string_delay = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var size = generator.valueToCode(this, 'size', generator.ORDER_ASSIGNMENT);
var time = generator.valueToCode(this, 'time', generator.ORDER_ASSIGNMENT);
var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
if (color.slice(0, 2) == "0x") {
var code = "onboard_tft.frame(" + data + ',size = ' + size + ',delay = ' + time + ',color=' + color + ")\n";
} else {
const rgbValues = color.match(/\d+/g);
const r = parseInt(rgbValues[0]);
const g = parseInt(rgbValues[1]);
const b = parseInt(rgbValues[2]);
var rgb = "0x" + ((r << 16) + (g << 8) + b).toString(16).padStart(4, "0");
var rgb565 = (rgb & 0xf80000) >> 8 | (rgb & 0xfc00) >> 5 | (rgb & 0xff) >> 3;
var code = "onboard_tft.frame(" + data + ',size = ' + size + ',delay = ' + time + ',color=0x' + rgb565.toString(16) + ")\n";
}
return code;
}
export const onboard_tft_scroll_string = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_tft";
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var code = "onboard_tft.scroll(" + data + ",color=0xffff)\n";
return code;
}
export const onboard_tft_scroll_string_delay = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var size = generator.valueToCode(this, 'size', generator.ORDER_ASSIGNMENT);
var time = generator.valueToCode(this, 'time', generator.ORDER_ASSIGNMENT);
var space = generator.valueToCode(this, 'space', generator.ORDER_ASSIGNMENT);
var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
if (color.slice(0, 2) == "0x") {
var code = "onboard_tft.scroll(" + data + ',y = ' + y + ',size = ' + size + ',speed =' + time + ',space = ' + space + ',color=' + color + ")\n";
} else {
const rgbValues = color.match(/\d+/g);
const r = parseInt(rgbValues[0]);
const g = parseInt(rgbValues[1]);
const b = parseInt(rgbValues[2]);
var rgb = "0x" + ((r << 16) + (g << 8) + b).toString(16).padStart(4, "0");
var rgb565 = (rgb & 0xf80000) >> 8 | (rgb & 0xfc00) >> 5 | (rgb & 0xff) >> 3;
var code = "onboard_tft.scroll(" + data + ',y = ' + y + ',size = ' + size + ',speed =' + time + ',space = ' + space + ',color=0x' + rgb565.toString(16) + ")\n";
}
return code;
}
export const onboard_tft_display_shape_rect = function (block, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var x = generator.valueToCode(block, 'x', generator.ORDER_ATOMIC);
var y = generator.valueToCode(block, 'y', generator.ORDER_ATOMIC);
var w = generator.valueToCode(block, 'w', generator.ORDER_ATOMIC);
var h = generator.valueToCode(block, 'h', generator.ORDER_ATOMIC);
var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var shape = block.getFieldValue('shape');
if (color.slice(0, 2) == "0x") {
var code = 'onboard_tft.' + shape + '(' + x + ', ' + y + ', ' + w + ', ' + h + ', ' + color + ')\n' + 'onboard_tft.show()\n';
} else {
const rgbValues = color.match(/\d+/g);
const r = parseInt(rgbValues[0]);
const g = parseInt(rgbValues[1]);
const b = parseInt(rgbValues[2]);
var rgb = "0x" + ((r << 16) + (g << 8) + b).toString(16).padStart(4, "0");
var rgb565 = (rgb & 0xf80000) >> 8 | (rgb & 0xfc00) >> 5 | (rgb & 0xff) >> 3;
var code = 'onboard_tft.' + shape + '(' + x + ', ' + y + ', ' + w + ', ' + h + ', 0x' + rgb565.toString(16) + ')\n' + 'onboard_tft.show()\n';
}
return code;
}
export const onboard_tft_display_hvline = function (block, generator) { //水平线
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var x = generator.valueToCode(block, 'x', generator.ORDER_ATOMIC);
var y = generator.valueToCode(block, 'y', generator.ORDER_ATOMIC);
var var_length = generator.valueToCode(block, 'length', generator.ORDER_ATOMIC);
var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var hv = block.getFieldValue('dir_h_v');
if (color.slice(0, 2) == "0x") {
var code = 'onboard_tft.' + (('0' == hv) ? 'v' : 'h') + 'line(' + x + ', ' + y + ', ' + var_length + ', ' + color + ')\n' + 'onboard_tft.show()\n';
} else {
const rgbValues = color.match(/\d+/g);
const r = parseInt(rgbValues[0]);
const g = parseInt(rgbValues[1]);
const b = parseInt(rgbValues[2]);
var rgb = "0x" + ((r << 16) + (g << 8) + b).toString(16).padStart(4, "0");
var rgb565 = (rgb & 0xf80000) >> 8 | (rgb & 0xfc00) >> 5 | (rgb & 0xff) >> 3;
var code = 'onboard_tft.' + (('0' == hv) ? 'v' : 'h') + 'line(' + x + ', ' + y + ', ' + var_length + ', 0x' + rgb565.toString(16) + ')\n' + 'onboard_tft.show()\n';
}
return code;
}
export const onboard_tft_display_line = function (block, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var x1 = generator.valueToCode(block, 'x1', generator.ORDER_ATOMIC);
var y1 = generator.valueToCode(block, 'y1', generator.ORDER_ATOMIC);
var x2 = generator.valueToCode(block, 'x2', generator.ORDER_ATOMIC);
var y2 = generator.valueToCode(block, 'y2', generator.ORDER_ATOMIC);
var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
if (color.slice(0, 2) == "0x") {
var code = 'onboard_tft.line(' + x1 + ', ' + y1 + ', ' + x2 + ', ' + y2 + ', ' + color + ')\n' + 'onboard_tft.show()\n';
} else {
const rgbValues = color.match(/\d+/g);
const r = parseInt(rgbValues[0]);
const g = parseInt(rgbValues[1]);
const b = parseInt(rgbValues[2]);
var rgb = "0x" + ((r << 16) + (g << 8) + b).toString(16).padStart(4, "0");
var rgb565 = (rgb & 0xf80000) >> 8 | (rgb & 0xfc00) >> 5 | (rgb & 0xff) >> 3;
var code = 'onboard_tft.line(' + x1 + ', ' + y1 + ', ' + x2 + ', ' + y2 + ', 0x' + rgb565.toString(16) + ')\n' + 'onboard_tft.show()\n';
}
return code;
}
export const onboard_tft_clear = function (block, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var code = 'onboard_tft.fill(0)\n' + 'onboard_tft.show()\n';
return code;
}
export const onboard_tft_shift = function (a, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var op = a.getFieldValue("OP");
var value = generator.valueToCode(a, 'val', generator.ORDER_ATOMIC);
var code = 'onboard_tft.' + op + '(' + value + ')\n';
return code;
}
export const onboard_tft_get_pixel = function (block, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var value_x = generator.valueToCode(block, 'x', generator.ORDER_ATOMIC);
var value_y = generator.valueToCode(block, 'y', generator.ORDER_ATOMIC);
var code = 'hex(onboard_tft.pixel(int(' + value_x + '), int(' + value_y + ')))';
return [code, generator.ORDER_ATOMIC];
}
export const onboard_tft_bright_point = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
if (color.slice(0, 2) == "0x") {
var code = 'onboard_tft.pixel(int(' + x + '), int(' + y + '), ' + color + ")\n" + 'onboard_tft.show()\n';
} else {
const rgbValues = color.match(/\d+/g);
const r = parseInt(rgbValues[0]);
const g = parseInt(rgbValues[1]);
const b = parseInt(rgbValues[2]);
var rgb = "0x" + ((r << 16) + (g << 8) + b).toString(16).padStart(4, "0");
var rgb565 = (rgb & 0xf80000) >> 8 | (rgb & 0xfc00) >> 5 | (rgb & 0xff) >> 3;
var code = 'onboard_tft.pixel(int(' + x + '), int(' + y + '), 0x' + rgb565.toString(16) + ")\n" + 'onboard_tft.show()\n';
}
return code;
}
export const onboard_tft_get_screen_pixel = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var code = 'onboard_tft.get_brightness()';
return [code, generator.ORDER_ATOMIC];
}
export const onboard_tft_bright_screen = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var code = 'onboard_tft.set_brightness(' + x + ')\n';
return code;
}
export const onboard_tft_fill = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var color = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT);
if (color.slice(0, 2) == "0x") {
var code = 'onboard_tft.fill(' + color + ')\nonboard_tft.show()\n';
} else {
const rgbValues = color.match(/\d+/g);
const r = parseInt(rgbValues[0]);
const g = parseInt(rgbValues[1]);
const b = parseInt(rgbValues[2]);
var rgb = "0x" + ((r << 16) + (g << 8) + b).toString(16).padStart(4, "0");
var rgb565 = (rgb & 0xf80000) >> 8 | (rgb & 0xfc00) >> 5 | (rgb & 0xff) >> 3;
var code = 'onboard_tft.fill(0x' + rgb565.toString(16) + ')\nonboard_tft.show()\n';
}
return code;
}
export const onboard_tft_clock_init = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_Clock'] = "from " + version + " import Clock";
var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT);
var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT);
var size = generator.valueToCode(this, 'size', generator.ORDER_ASSIGNMENT);
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ASSIGNMENT);
var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
if (color.slice(0, 2) == "0x") {
var code = sub + "=Clock(" + x + ',' + y + ',' + size + ',' + color + ")\n";
} else {
const rgbValues = color.match(/\d+/g);
const r = parseInt(rgbValues[0]);
const g = parseInt(rgbValues[1]);
const b = parseInt(rgbValues[2]);
var rgb = "0x" + ((r << 16) + (g << 8) + b).toString(16).padStart(4, "0");
var rgb565 = (rgb & 0xf80000) >> 8 | (rgb & 0xfc00) >> 5 | (rgb & 0xff) >> 3;
var code = sub + "=Clock(" + x + ',' + y + ',' + size + ',0x' + rgb565.toString(16) + ")\n";
}
return code;
}
export const onboard_tft_clock_get_rtctime = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_Clock'] = "from " + version + " import Clock";
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ASSIGNMENT);
var code = sub + ".set_rtctime()\n";
return code;
}
export const onboard_tft_clock_set_time = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_Clock'] = "from " + version + " import Clock";
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ASSIGNMENT);
var h = generator.valueToCode(this, 'h', generator.ORDER_ASSIGNMENT);
var m = generator.valueToCode(this, 'm', generator.ORDER_ASSIGNMENT);
var s = generator.valueToCode(this, 's', generator.ORDER_ASSIGNMENT);
var code = sub + ".set_time(" + h + ',' + m + ',' + s + ")\n";
return code;
}
export const onboard_tft_clock_draw = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_Clock'] = "from " + version + " import Clock";
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ASSIGNMENT);
var code = sub + ".draw_clock()\n";
return code;
}
export const onboard_tft_clock_clear = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_Clock'] = "from " + version + " import Clock";
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ASSIGNMENT);
var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
if (color.slice(0, 2) == "0x") {
var code = sub + ".clear(" + color + ")\n";
} else {
const rgbValues = color.match(/\d+/g);
const r = parseInt(rgbValues[0]);
const g = parseInt(rgbValues[1]);
const b = parseInt(rgbValues[2]);
var rgb = "0x" + ((r << 16) + (g << 8) + b).toString(16).padStart(4, "0");
var rgb565 = (rgb & 0xf80000) >> 8 | (rgb & 0xfc00) >> 5 | (rgb & 0xff) >> 3;
var code = sub + ".clear(0x" + rgb565.toString(16) + ")\n";
}
return code;
}
export const onboard_tft_display_shape_circle = function (block, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var x = generator.valueToCode(block, 'x', generator.ORDER_ATOMIC);
var y = generator.valueToCode(block, 'y', generator.ORDER_ATOMIC);
var R = generator.valueToCode(block, 'r', generator.ORDER_ATOMIC);
var color = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var shape = block.getFieldValue('shape');
if (color.slice(0, 2) == "0x") {
var code = 'onboard_tft.ellipse(' + x + ', ' + y + ', ' + R + ', ' + R + ', ' + color + ',' + shape + ')\n' + 'onboard_tft.show()\n';
} else {
const rgbValues = color.match(/\d+/g);
const r = parseInt(rgbValues[0]);
const g = parseInt(rgbValues[1]);
const b = parseInt(rgbValues[2]);
var rgb = "0x" + ((r << 16) + (g << 8) + b).toString(16).padStart(4, "0");
var rgb565 = (rgb & 0xf80000) >> 8 | (rgb & 0xfc00) >> 5 | (rgb & 0xff) >> 3;
var code = 'onboard_tft.ellipse(' + x + ', ' + y + ', ' + R + ', ' + R + ', 0x' + rgb565.toString(16) + ',' + shape + ')\n' + 'onboard_tft.show()\n';
}
return code;
}

View File

@@ -0,0 +1,95 @@
export const factory_from_import = function (_, generator) {
var path = this.getFieldValue('path');
var module = this.getFieldValue('module');
generator.definitions_['import_' + path + '_' + module] = 'from ' + path + ' import ' + module;
return '';
}
export const factory_import = function (_, generator) {
var module = this.getFieldValue('module');
generator.definitions_['import_' + module] = 'import ' + module;
return '';
}
export const factory_function_noreturn = function (_, generator) {
var NAME = this.getFieldValue('NAME');
var code = new Array(this.itemCount_);
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || '';
}
return NAME + '(' + code.join(', ') + ')\n';
}
export const factory_function_return = function (_, generator) {
var NAME = this.getFieldValue('NAME');
var code = new Array(this.itemCount_);
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || '';
}
return [NAME + '(' + code.join(', ') + ')', generator.ORDER_ATOMIC];
}
export const factory_declare = function () {
var TYPE = this.getFieldValue('TYPE');
var NAME = this.getFieldValue('NAME');
return NAME + ' = ' + TYPE + '()\n';
}
export const factory_callMethod_noreturn = function (_, generator) {
var NAME = this.getFieldValue('NAME');
var METHOD = this.getFieldValue('METHOD');
var code = new Array(this.itemCount_);
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || '';
}
return NAME + '.' + METHOD + '(' + code.join(', ') + ')\n';
}
export const factory_callMethod_return = function (_, generator) {
var NAME = this.getFieldValue('NAME');
var METHOD = this.getFieldValue('METHOD');
var code = new Array(this.itemCount_);
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || '';
}
return [NAME + '.' + METHOD + '(' + code.join(', ') + ')', generator.ORDER_ATOMIC];
}
export const factory_block = function () {
var VALUE = this.getFieldValue('VALUE');
//if(!(VALUE.charAt(VALUE.length-1)==";")){
//VALUE=VALUE+';';
//}
return VALUE + '\n';
}
export const factory_block_return = function (_, generator) {
var VALUE = this.getFieldValue('VALUE');
return [VALUE, generator.ORDER_ATOMIC];
}
export const factory_block_with_textarea = function () {
var VALUE = this.getFieldValue('VALUE');
//if(!(VALUE.charAt(VALUE.length-1)==";")){
//VALUE=VALUE+';';
//}
return VALUE + '\n';
}
export const factory_block_return_with_textarea = function (_, generator) {
var VALUE = this.getFieldValue('VALUE');
return [VALUE, generator.ORDER_ATOMIC];
}
export const folding_block = function (_, generator) {
var comment = this.getFieldValue('peien');
comment = "#" + comment;
var branch = generator.statementToCode(this, 'DO');
branch = branch.replace(/(^\s*)|(\s*$)/g, "");//去除两端空格
branch = branch.replace(/(\n\s\s\s\s)/g, "\n");//去除换行时空格
return comment + '\n' + branch + '\n';
}

View File

@@ -0,0 +1,158 @@
import * as Blockly from 'blockly/core';
// ok
export const inout_highlow = function (_, generator) {
// Boolean values HIGH and LOW.
var code = (this.getFieldValue('BOOL') == 'HIGH') ? '1' : '0';
return [code, generator.ORDER_ATOMIC];
}
// ok
export const inout_digital_write = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC);
var code = "";
code += dropdown_pin + '.value(' + dropdown_stat + ')\n'
return code;
}
// ok
export const inout_digital_read = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = "";
code = dropdown_pin + '.value()';
return [code, generator.ORDER_ATOMIC];
}
// ok
export const inout_pwm_analog_write = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
//var dropdown_stat = this.getFieldValue('STAT');
var value_num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
//generator.setups_['setup_output'+dropdown_pin] = 'pinMode('+dropdown_pin+', OUTPUT);';
var code = dropdown_pin + '.duty_u16(' + value_num + ')\n';
return code;
}
// ok
export const inout_analog_write = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
//var dropdown_stat = this.getFieldValue('STAT');
var value_num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
//generator.setups_['setup_output'+dropdown_pin] = 'pinMode('+dropdown_pin+', OUTPUT);';
var code = dropdown_pin + '.write(' + value_num + ')\n';
return code;
}
// ok
export const inout_analog_write_set = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var value_num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = dropdown_pin + '.set_analog_' + key + '(' + value_num + ')\n';
//var code = 'pin' + dropdown_pin + '.set_analog_period(' + value_num + ')\n';
return code;
}
export const inout_pwm_analog_write_set_freq = function (_, generator) {
//generator.definitions_['import_machine_Pin'] = "from machine import Pin";
// generator.definitions_['import_machine_PWM'] = "from machine import PWM";
generator.definitions_['import_machine'] = 'import machine';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var value_num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
var code = dropdown_pin + '.freq(' + value_num + ')\n';
//var code = 'pin' + dropdown_pin + '.set_analog_period(' + value_num + ')\n';
return code;
}
// ok
export const inout_analog_read = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
//generator.setups_['setup_input_'+dropdown_pin] = 'pinMode('+dropdown_pin+', INPUT);';
var code = dropdown_pin + '.read_u16()';
return [code, generator.ORDER_ATOMIC];
}
// ok
export const inout_pin_pressed = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var pin = generator.valueToCode(this, 'pin', generator.ORDER_ATOMIC);
var code = pin + '.read()';
return [code, generator.ORDER_ATOMIC];
}
export const inout_pin_attachInterrupt = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_mode = this.getFieldValue('mode');
var atta = generator.valueToCode(this, 'DO', generator.ORDER_ATOMIC);
var code = 'machine.Pin(' + dropdown_pin + ').irq' + '(handler = ' + atta + ', trigger = ' + dropdown_mode + ')\n'
//var funcName = 'attachInterrupt_func_' + dropdown_pin;
//var branch = generator.statementToCode(this, 'DO') || generator.PASS;
//var code2 = 'def' + ' ' + funcName + '(p):\n' + branch + '\n';
//generator.setups_[funcName] = code2;
return code;
}
export const inout_digital_init = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var pin_obj = this.getFieldValue('PIN_OBJ') || 'pin#';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_mode = this.getFieldValue('MODE');
var varName = (pin_obj == 'pin#') ? 'pin' + dropdown_pin : generator.variableDB_.getName(pin_obj, Blockly.Variables.NAME_TYPE);
var code = varName + ' = machine.Pin(' + dropdown_pin + ', ' + dropdown_mode + ')\n';
return code;
}
export const inout_pwm_analog_write_init = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var pin_obj = this.getFieldValue('PIN_OBJ') || 'pwm#';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var varName = (pin_obj == 'pwm#') ? 'pwm' + dropdown_pin : generator.variableDB_.getName(pin_obj, Blockly.Variables.NAME_TYPE);
var code = varName + ' = machine.PWM(machine.Pin(' + dropdown_pin + '))\n';
return code;
}
// ok
export const inout_analog_write_init = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var pin_obj = this.getFieldValue('PIN_OBJ') || 'dac#';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var varName = (pin_obj == 'dac#') ? 'dac' + dropdown_pin : generator.variableDB_.getName(pin_obj, Blockly.Variables.NAME_TYPE);
var code = varName + ' = machine.DAC(machine.Pin(' + dropdown_pin + '))\n';
return code;
}
export const inout_analog_read_init = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var pin_obj = this.getFieldValue('PIN_OBJ') || 'adc#';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var varName = (pin_obj == 'adc#') ? 'adc' + dropdown_pin : generator.variableDB_.getName(pin_obj, Blockly.Variables.NAME_TYPE);
var code = varName + ' = machine.ADC(machine.Pin(' + dropdown_pin + '))\n';
return code;
}
export const inout_analog_atten = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
//var dropdown_stat = this.getFieldValue('STAT');
var value_atten = this.getFieldValue('atten')
var code = dropdown_pin + '.atten(' + value_atten + ')\n';
return code;
}
// ok
export const inout_pin_pressed_init = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var pin_obj = this.getFieldValue('PIN_OBJ') || 'tc#';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var varName = (pin_obj == 'tc#') ? 'tc' + dropdown_pin : generator.variableDB_.getName(pin_obj, Blockly.Variables.NAME_TYPE);
var code = varName + ' = machine.TouchPad(machine.Pin(' + dropdown_pin + '))\n';
return code;
}

View File

@@ -0,0 +1,236 @@
export const iot_wifi_connect = function (_, generator) {
generator.definitions_['import_mixiot'] = "import mixiot";
var username = generator.valueToCode(this, 'WIFINAME', generator.ORDER_ATOMIC);
var password = generator.valueToCode(this, 'PASSWORD', generator.ORDER_ATOMIC);
var code = 'mixiot.wlan_connect(' + username + ',' + password + ')\n';
return code;
}
export const iot_onenet_connect = function (_, generator) {
generator.definitions_['import_onenet'] = "import onenet";
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var client = generator.valueToCode(this, 'CLIENT', generator.ORDER_ATOMIC);
var server = generator.valueToCode(this, 'SERVER', generator.ORDER_ATOMIC);
var username = generator.valueToCode(this, 'USERNAME', generator.ORDER_ATOMIC);
var password = generator.valueToCode(this, 'PASSWORD', generator.ORDER_ATOMIC);
var topic = generator.valueToCode(this, 'TOPIC', generator.ORDER_ATOMIC);
var subscribe = generator.valueToCode(this, 'SUB', generator.ORDER_ASSIGNMENT) || 'None';
var code = v + ' = onenet.init_MQTT_client(' + client + ', ' + server + ', ' + username + ', ' + password + ', ' + topic + ', ' + subscribe + ')\n';
return code;
}
export const iot_onenet_disconnect = function (_, generator) {
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
generator.definitions_['import_onenet'] = "import onenet";
var code = v + '.do_disconnect()\n';
return code;
}
export const iot_onenet_publish_dict = function (_, generator) {
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var d = generator.valueToCode(this, 'DICT', generator.ORDER_ATOMIC);
var check = this.getFieldValue("is_print") == 'TRUE' ? 'True' : 'False';
generator.definitions_['import_onenet'] = "import onenet";
var code = v + '.publish(' + d + ', is_print = ' + check + ')\n';
return code;
}
export const iot_onenet_check = function (_, generator) {
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
generator.definitions_['import_onenet'] = "import onenet";
var code = v + '.check_msg()\n';
return code;
}
export const iot_onenet_publish = function (_, generator) {
// Create a list with any number of elements of any type.
//var size=window.parseFloat(this.getFieldValue('SIZE'));
generator.definitions_['import_onenet'] = "import onenet";
var ck = new Array(this.itemCount_);
var cv = new Array(this.itemCount_);
var ct = new Array(this.itemCount_);
var default_value = '0';
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
for (let n = 0; n < this.itemCount_; n++) {
var keyName = this.getFieldValue('KEY' + n);
ck[n] = keyName;
}
for (let n = 0; n < this.itemCount_; n++) {
cv[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || default_value;
}
var code = v + ".publish({";
for (let n = 0; n < this.itemCount_; n++) {
ct[n] = ck[n] + ': ' + cv[n];
}
//var code = "c.publish('$dp', pubData("+ '{' + code.join(', ') + '})\n';
//var code =''+varName+'['+size+"]"+'='+ '{' + code.join(', ') + '}\n';
//generator.setups_['setup_lists'+varName] = code;
code = code + ct.join(', ') + "})\n";
return code;
}
export const iot_mixio_connect = function (_, generator) {
generator.definitions_['import_mixiot'] = "import mixiot";
generator.definitions_['import_machine'] = "import machine";
generator.definitions_['import_ubinascii_hexlify'] = "from ubinascii import hexlify";
var server = generator.valueToCode(this, 'SERVER', generator.ORDER_ATOMIC);
var username = generator.valueToCode(this, 'USERNAME', generator.ORDER_ATOMIC);
var password = generator.valueToCode(this, 'PASSWORD', generator.ORDER_ATOMIC);
var project = generator.valueToCode(this, 'PROJECT', generator.ORDER_ATOMIC);
//var subscribe = generator.valueToCode(this, 'SUB', generator.ORDER_ASSIGNMENT) || '0';
var a = "'" + username.replace("'", "").replace("'", "") + "/" + project.replace("'", "").replace("'", "") + "/'"
var code = 'MQTT_USR_PRJ = ' + a + '\n' + 'mqtt_client = mixiot.init_MQTT_client(' + server + ', ' + username + ', ' + password + ', MQTT_USR_PRJ)\n';
return code;
}
export const IOT_MIXIO_PUBLISH = function (_, generator) {
var topic = generator.valueToCode(this, 'TOPIC', generator.ORDER_ATOMIC);
var msg = generator.valueToCode(this, 'MSG', generator.ORDER_ATOMIC);
generator.definitions_['import_mixiot'] = "import mixiot";
var code = 'mqtt_client.publish(MQTT_USR_PRJ + ' + topic + ', ' + msg + ')\n';
return code;
}
export const IOT_MIXIO_SUBSCRIBE = function (_, generator) {
var topic = generator.valueToCode(this, 'TOPIC', generator.ORDER_ATOMIC);
var method = generator.valueToCode(this, 'METHOD', generator.ORDER_ATOMIC);
generator.definitions_['import_mixiot'] = "import mixiot";
var code = 'mqtt_client.set_callback(' + topic + ',' + method + ', MQTT_USR_PRJ)\n';
code += 'mqtt_client.subscribe(MQTT_USR_PRJ + ' + topic + ')\n';
return code;
}
export const iot_mixio_disconnect = function (_, generator) {
generator.definitions_['import_mixiot'] = "import mixiot";
var code = 'mqtt_client.disconnect(MQTT_USR_PRJ)\n';
return code;
}
export const iot_mixio_connect_only = function (_, generator) {
generator.definitions_['import_mixiot'] = "import mixiot";
var code = 'mqtt_client.connect()\n';
return code;
}
export const iot_mixio_check = function (_, generator) {
generator.definitions_['import_mixiot'] = "import mixiot";
var code = 'mqtt_client.check_msg()\n';
return code;
}
export const iot_mixio_format_topic = function (_, generator) {
var code = 'mqtt_client.decode("utf-8").split("/")[-1]';
return [code, generator.ORDER_ATOMIC];
}
export const iot_mixio_format_msg = function (_, generator) {
var code = 'mqtt_client.decode("utf-8")';
return [code, generator.ORDER_ATOMIC];
}
export const IOT_FORMATTING = function (_, generator) {
generator.definitions_['import_mixpy'] = "import mixpy";
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = 'mixpy.format_content(' + v + ', mqtt_client.client_id)';
return [code, generator.ORDER_ATOMIC];
}
export const IOT_FORMAT_STRING = function (_, generator) {
generator.definitions_['import_mixpy'] = "import mixpy";
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = 'mixpy.format_str(' + v + ')';
return [code, generator.ORDER_ATOMIC];
}
export const IOT_EMQX_INIT_AND_CONNECT_BY_SHARE_CODE = function (_, generator) {
var server = generator.valueToCode(this, 'SERVER', generator.ORDER_ATOMIC);
// var port = '1883';
var share_code = generator.valueToCode(this, 'KEY', generator.ORDER_ATOMIC);
generator.definitions_['import_mixiot'] = "import mixiot";
generator.definitions_['import_machine'] = "import machine";
generator.definitions_['import_urequests'] = "import urequests";
generator.definitions_['import_ubinascii_hexlify'] = "from ubinascii import hexlify";
generator.definitions_['import_mixpy_analyse_sharekey'] = "from mixpy import analyse_sharekey";
// var mac_address = 'str(binascii.hexlify(wifi.radio.mac_address))[2:14]'
// var socket_pool = 'socketpool.SocketPool(wifi.radio)'
// var ssl_context = 'ssl.create_default_context()'
var code = 'sk = analyse_sharekey(\'http://'+server.substring(1, server.length-1)+'/mixio-php/sharekey.php?sk=' + share_code + '\')\n'+
'MQTT_USR_PRJ = sk[0]+\'/\'+sk[1]+\'/\'\n' +
'mqtt_client = mixiot.init_MQTT_client(' + server + ', sk[0], sk[2]' + ', MQTT_USR_PRJ)\n';
return code;
}
export const iot_mixly_key = function (_, generator) {
var code = this.getFieldValue('VISITOR_ID');
return [code, generator.ORDER_ATOMIC];
}
export const IOT_EMQX_INIT_AND_CONNECT_BY_MIXLY_CODE = function (_, generator) {
generator.definitions_['import_mixiot'] = "import mixiot";
generator.definitions_['import_machine'] = "import machine";
generator.definitions_['import_ubinascii_hexlify'] = "from ubinascii import hexlify";
var server = generator.valueToCode(this, 'SERVER', generator.ORDER_ATOMIC);
// var port = '1883';
var username = '"MixIO_public"';
var password = '"MixIO_public"';
var mixly_code = generator.valueToCode(this, 'KEY', generator.ORDER_ATOMIC);
var a = '"MixIO/' + mixly_code + '/default/"'
// var mac_address = 'str(binascii.hexlify(wifi.radio.mac_address))[2:14]'
// var socket_pool = 'socketpool.SocketPool(wifi.radio)'
// var ssl_context = 'ssl.create_default_context()'
var code = 'MQTT_USR_PRJ = ' + a + '\n' + 'mqtt_client = mixiot.init_MQTT_client(' + server + ', ' + username + ', ' + password + ', MQTT_USR_PRJ)\n';
return code;
}
export const IOT_EMQX_PING = function (_, generator) {
generator.definitions_['import_mixiot'] = "import mixiot";
var code = 'mqtt_client.pingSync()';
return [code, generator.ORDER_ATOMIC];
}
export const IOT_MIXIO_NTP = function (_, generator) {
generator.definitions_['import_mixiot'] = "import mixiot";
var addr = generator.valueToCode(this, 'addr', generator.ORDER_ATOMIC);
var code = 'mixiot.ntp(' + addr + ')';
return [code, generator.ORDER_ATOMIC];
}
export const iot_client_onboard = function (_, generator) {
var code = 'mqtt_client';
return [code, generator.ORDER_ATOMIC];
}
export const iot_http_client = function (_, generator) {
generator.definitions_['import_debugnet'] = "import debugnet";
var addr = generator.valueToCode(this, 'addr', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = 'HTTP_client = debugnet.request("GET",' + addr + ',debug=' + key + ')\n';
return code;
}
export const iot_http_data = function (_, generator) {
generator.definitions_['import_debugnet'] = "import debugnet";
var key = this.getFieldValue('key');
var code = 'HTTP_client.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const iot_mqtt_client = function (_, generator) {
generator.definitions_['import_debugnet'] = "import debugnet";
var addr = generator.valueToCode(this, 'addr', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key2');
var code = 'mqtt_client = debugnet.init_MQTT_client(' + addr + ', "MixIO_public", "MixIO_public", "MixIO/3QBAGKRL/default/",debug=' + key + ')\n';
code += 'mqtt_client.subscribe("$SYS/hello")\n';
return code;
}
export const iot_mqtt_data = function (_, generator) {
generator.definitions_['import_mixiot'] = "import mixiot";
var key = this.getFieldValue('key');
var code = 'mqtt_client.' + key;
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,230 @@
import * as Blockly from 'blockly/core';
export const network_init = function (_, generator) {
generator.definitions_['import_network'] = "import network";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var mode = this.getFieldValue('mode');
return "" + varName + " = network.WLAN(network." + mode + "_IF);\n";
}
// export const network_connect = function() {
// generator.definitions_['import_network'] = "import network";
// // generator.setups_['class_wlan'] ='wlan.active(True)\n';
// var varName =generator.valueToCode(this, 'VAR',generator.ORDER_ATOMIC);
// var id = generator.valueToCode(this, 'id', generator.ORDER_ATOMIC);
// var password = generator.valueToCode(this, 'password', generator.ORDER_ATOMIC);
// return "if not "+varName+".isconnected():\n"+
// " "+varName+".connect("+id+","+password+")\n"+
// " while not "+varName+".isconnected():\n"+
// " pass\n";
// }
export const network_connect = function (_, generator) {
generator.definitions_['import_network'] = "import network";
// generator.setups_['class_wlan'] ='wlan.active(True)\n';
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var id = generator.valueToCode(this, 'id', generator.ORDER_ATOMIC);
var password = generator.valueToCode(this, 'password', generator.ORDER_ATOMIC);
return "" + varName + ".connect(" + id + "," + password + ")\n"
}
export const network_wifi_connect = function (_, generator) {
generator.definitions_['import_network'] = "import network";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
return "" + varName + ".isconnected()\n";
}
export const network_get_connect = function (_, generator) {
generator.definitions_['import_network'] = "import network";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var mode = this.getFieldValue('mode');
var code = "" + varName + ".ifconfig()[" + mode + "]";
return [code, generator.ORDER_ATOMIC]
}
export const network_stop = function (_, generator) {
generator.definitions_['import_network'] = "import network";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
return "" + varName + ".disconnect()\n";
}
export const network_open = function (_, generator) {
generator.definitions_['import_network'] = "import network";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var op = this.getFieldValue('op');
var code = "" + varName + ".active(" + op + ")\n";
return code;
}
export const network_is_active = function (_, generator) {
generator.definitions_['import_network'] = "import network";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = "" + varName + ".active()";
return [code, generator.ORDER_ATOMIC];
}
export const network_get_wifi = function (_, generator) {
generator.definitions_['import_network'] = "import network";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var op = this.getFieldValue('op');
var code = "" + varName + ".config('" + op + "')";
return [code, generator.ORDER_ATOMIC]
}
export const network_ap_connect = function (_, generator) {
generator.definitions_['import_network'] = "import network";
// generator.setups_['class_wlan'] ='ap = network.WLAN(network.AP_IF)\n'+'ap.active(True)\n';
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var essid = generator.valueToCode(this, 'essid', generator.ORDER_ATOMIC);
var channel = generator.valueToCode(this, 'channel', generator.ORDER_ATOMIC);
return "" + varName + ".config(essid = " + essid + ", channel = " + channel + ")\n";
}
export const network_scan = function (_, generator) {
generator.definitions_['import_network'] = "import network";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = "" + varName + ".scan()";
return [code, generator.ORDER_ATOMIC];
}
export const network_server = function (_, generator) {
generator.definitions_['import_server_*'] = 'from server import *';
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
// generator.setups_['class_wlan'] ='SSID="ying"\n'+'PASSWORD="201411132040"\n';
return 'if not ' + varName + '.isconnected():\n'
+ ' connectWifi(SSID, PASSWORD)\n'
+ 'ip=' + varName + '.ifconfig()[0]\n'
+ 'print(ip)\n'
+ 'time.sleep(1)\n'
+ 'DATA=listenData()\n'
}
export const network_socket_init = function (_, generator) {
generator.definitions_['import_network'] = "import network";
generator.definitions_['import_socket'] = "import socket";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var mode = this.getFieldValue('mode');
if (mode == 'UDP') {
mode = 'socket.SOCK_DGRAM'
}
else if (mode == 'TCP') {
mode = 'socket.SOCK_STREAM'
}
return "" + varName + " = socket.socket(socket.AF_INET," + mode + ")\n";
}
export const network_socket_bind = function (_, generator) {
generator.definitions_['import_network'] = "import network";
generator.definitions_['import_socket'] = "import socket";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var address = generator.valueToCode(this, 'address', generator.ORDER_ATOMIC);
return "" + varName + ".bind(" + address + ")\n";
}
export const network_socket_connect = function (_, generator) {
generator.definitions_['import_network'] = "import network";
generator.definitions_['import_socket'] = "import socket";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var address = generator.valueToCode(this, 'address', generator.ORDER_ATOMIC);
return "" + varName + ".connect(socket.getaddrinfo" + address + "[0][-1])\n";
}
export const network_socket_listen = function (_, generator) {
generator.definitions_['import_network'] = "import network";
generator.definitions_['import_socket'] = "import socket";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var queue = generator.valueToCode(this, 'queue', generator.ORDER_ATOMIC);
return "" + varName + ".listen(" + queue + ")\n";
}
export const network_socket_accept = function (_, generator) {
generator.definitions_['import_network'] = "import network";
generator.definitions_['import_socket'] = "import socket";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = "" + varName + ".accept()";
return [code, generator.ORDER_ASSIGNMENT];
}
export const network_socket_receive = function (_, generator) {
generator.definitions_['import_network'] = "import network";
generator.definitions_['import_socket'] = "import socket";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var size = generator.valueToCode(this, 'size', generator.ORDER_ATOMIC);
var code = "" + varName + ".recv(" + size + ")";
return [code, generator.ORDER_ASSIGNMENT];
}
export const network_socket_send = function (_, generator) {
generator.definitions_['import_network'] = "import network";
generator.definitions_['import_socket'] = "import socket";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var content = generator.valueToCode(this, 'content', generator.ORDER_ATOMIC);
var code = "" + varName + ".send(" + content + ")\n";
return code;
}
export const network_socket_receive_from = function (_, generator) {
generator.definitions_['import_network'] = "import network";
generator.definitions_['import_socket'] = "import socket";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var size = generator.valueToCode(this, 'size', generator.ORDER_ATOMIC);
var code = "" + varName + ".recvfrom(" + size + ")";
return [code, generator.ORDER_ASSIGNMENT];
}
export const network_socket_send_to = function (_, generator) {
generator.definitions_['import_network'] = "import network";
generator.definitions_['import_socket'] = "import socket";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var content = generator.valueToCode(this, 'content', generator.ORDER_ATOMIC);
var address = generator.valueToCode(this, 'address', generator.ORDER_ATOMIC);
var code = "" + varName + ".sendto(" + content + "," + address + ")\n";
return code;
}
export const network_socket_close = function (_, generator) {
generator.definitions_['import_network'] = "import network";
generator.definitions_['import_socket'] = "import socket";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = "" + varName + ".close()\n";
return code;
}
export const requests_get = function (_, generator) {
generator.definitions_.import_requests = "import requests";
var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),
Blockly.Variables.NAME_TYPE);
var str = generator.valueToCode(this, 'DOMAIN', generator.ORDER_ATOMIC);
var code = varName + '= ' + 'requests.get(' + str + ')\n';
return code;
}
export const requests_attribute = function (_, generator) {
generator.definitions_.import_requests = "import requests";
var varName = generator.valueToCode(this, 'VAL', generator.ORDER_ASSIGNMENT) || '0';
var attr = this.getFieldValue('ATTR');
var code = varName + "." + attr;
return [code, generator.ORDER_ATOMIC];
}
export const requests_method = function (_, generator) {
generator.definitions_.import_requests = "import requests";
var method = this.getFieldValue('DIR');
var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = "requests." + method + "(" + str + ')\n';
return code;
}
export const ntptime_time = function (_, generator) {
generator.definitions_['import_ntptime'] = "import ntptime";
var str = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
var code = "ntptime.time(host=" + str + ")";
return [code, generator.ORDER_ATOMIC];
}
export const ntptime_address = function (_, generator) {
var code = "'" + this.getFieldValue('op') + "'";
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,29 @@
export const get_potential_num = function (_, generator) {
generator.definitions_['from_nova_g1_import_ext_g1'] = 'from nova_g1 import ext_g1';
var code = 'ext_g1.varistor()';
return [code, generator.ORDER_ATOMIC];
}
export const nova_g1_motor = function (_, generator) {
generator.definitions_['from_nova_g1_import_ext_g1'] = 'from nova_g1 import ext_g1';
var wheel = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var v = this.getFieldValue('direction');
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
var code = "ext_g1.motor(" + wheel + ',"' + v + '",' + speed + ")\n";
return code;
}
export const nova_g1_usb = function (_, generator) {
generator.definitions_['from_nova_g1_import_ext_g1'] = 'from nova_g1 import ext_g1';
var p = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var percent = generator.valueToCode(this, 'percent', generator.ORDER_ATOMIC);
var code = "ext_g1.usb_pwm(" + p + ',' + percent + ")\n";
return code;
}
export const nova_g1_spk_en = function (_, generator) {
generator.definitions_['from_nova_g1_import_ext_g1'] = 'from nova_g1 import ext_g1';
var state = this.getFieldValue('state');
var code = "ext_g1.spk_en(" + state + ")\n";
return code;
}

View File

@@ -0,0 +1,67 @@
export const pe_g1_use_i2c_init = function (_, generator) {
generator.definitions_['import_pe_g1'] = 'import pe_g1';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var iv = generator.valueToCode(this, 'I2CSUB', generator.ORDER_ATOMIC);
var code = v + ' = pe_g1.PE_G1(' + iv + ')\n';
return code;
}
export const pe_g1_battery_left = function (_, generator) {
generator.definitions_['import_pe_g1'] = 'import pe_g1';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = v + '.read_bat()';
return [code, generator.ORDER_ATOMIC];
}
export const pe_g1_dc_motor = function (_, generator) {
generator.definitions_['import_pe_g1'] = 'import pe_g1';
var s = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var wheel = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var v = this.getFieldValue('direction');
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
var code = s + ".motor(" + wheel + ',"' + v + '",' + speed + ")\n";
return code;
}
export const pe_g1_dc_motor_speed = function (_, generator) {
generator.definitions_['import_pe_g1'] = 'import pe_g1';
var s = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var wheel = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var v = 'NC';
var code = s + ".motor(" + wheel + ',"' + v + '"' + ")\n";
return [code, generator.ORDER_ATOMIC];
}
export const pe_g1_servo_set_angle = function (_, generator) {
generator.definitions_['import_pe_g1'] = 'import pe_g1';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
var code = v + '.servo180(' + dropdown_pin + ',' + num + ')\n';
return code;
}
export const pe_g1_servo_set_speed = function (_, generator) {
generator.definitions_['import_pe_g1'] = 'import pe_g1';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
var code = v + '.servo360(' + dropdown_pin + ',' + num + ')\n';
return code;
}
export const pe_g1_servo_get_angle = function (_, generator) {
generator.definitions_['import_pe_g1'] = 'import pe_g1';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = v + '.servo180(' + dropdown_pin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const pe_g1_servo_get_speed = function (_, generator) {
generator.definitions_['import_pe_g1'] = 'import pe_g1';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = v + '.servo360(' + dropdown_pin + ')';
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,30 @@
export const pins_digital = function (_, generator) {
var code = this.getFieldValue('PIN');
return [code, generator.ORDER_ATOMIC];
}
export const pins_button = pins_digital;
export const pins_digital_pin = pins_digital;
export const pins_analog_pin = pins_digital;
export const pins_analog = pins_digital;
export const pins_pwm_pin = pins_digital;
export const pins_pwm = pins_digital;
export const pins_dac_pin = pins_digital;
export const pins_dac = pins_digital;
export const pins_touch_pin = pins_digital;
export const pins_touch = pins_digital;
export const espnow_channel = pins_digital;
export const pins_interrupt = pins_digital;
export const pins_serial = pins_digital;
export const pins_builtinimg = pins_digital;
export const pins_imglist = pins_digital;
export const pins_playlist = pins_digital;
export const pins_axis = pins_digital;
export const pins_exlcdh = pins_digital;
export const pins_exlcdv = pins_digital;
export const pins_brightness = pins_digital;
export const pins_tone_notes = pins_digital;
export const pins_radio_power = pins_digital;
export const pins_radio_datarate = pins_digital;
export const pins_one_more = pins_digital;
export const pins_digital_dot = pins_digital;

View File

@@ -0,0 +1,405 @@
import { sensor_LTR308 } from './sensor_onboard';
export const sensor_mixgo_button_is_pressed = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var btn = generator.valueToCode(this, 'btn', generator.ORDER_ATOMIC);
var code = 'mixgo.' + btn + '.is_pressed()';
return [code, generator.ORDER_ATOMIC];
}
//ok
export const sensor_mixgo_button_was_pressed = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var btn = generator.valueToCode(this, 'btn', generator.ORDER_ATOMIC);
var code = 'mixgo.' + btn + '.was_pressed()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_button_get_presses = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var btn = generator.valueToCode(this, 'btn', generator.ORDER_ATOMIC);
var argument = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0';
var code = 'mixgo.' + btn + '.get_presses(' + argument + ')';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_button_attachInterrupt = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_mixgo'] = 'import mixgo';
var dropdown_btn = generator.valueToCode(this, 'btn', generator.ORDER_ATOMIC);
var dropdown_mode = this.getFieldValue('mode');
var atta = generator.valueToCode(this, 'DO', generator.ORDER_ATOMIC);
var code = 'mixgo.' + dropdown_btn + '.irq' + '(handler = ' + atta + ', trigger = ' + dropdown_mode + ')\n'
return code;
}
//ok
export const sensor_mixgo_extern_button_is_pressed = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC);
var code = 'mixgo.Button(' + pin + ').is_pressed(' + dropdown_stat + ')';
return [code, generator.ORDER_ATOMIC];
}
//ok
export const sensor_mixgo_extern_button_was_pressed = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC);
var code = 'mixgo.Button(' + pin + ').was_pressed(' + dropdown_stat + ')';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_extern_button_get_presses = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var argument = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0';
var code = 'mixgo.Button(' + pin + ').get_presses(' + argument + ')';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_extern_button_attachInterrupt = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_mixgo'] = 'import mixgo';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_mode = this.getFieldValue('mode');
var atta = generator.valueToCode(this, 'DO', generator.ORDER_ATOMIC);
var code = 'mixgo.Button(' + pin + ').irq' + '(handler = ' + atta + ', trigger = ' + dropdown_mode + ')\n'
return code;
}
//ok
export const sensor_mpu9250_attachGestureInterrupt = function (_, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
generator.definitions_['import_machine'] = 'import machine';
var gesture = this.getFieldValue('gesture');
var branch = generator.statementToCode(this, 'DO');
var d = branch || generator.PASS;
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
if (v == "mpu")
generator.definitions_['import_mixgo_mpu'] = 'from mixgo import mpu';
var code = 'if ' + v + '.mpu9250_is_gesture("' + gesture + '"):\n' + d;
return code;
}
export const sensor_mpu9250_gesture = function (_, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
generator.definitions_['import_machine'] = 'import machine';
var gesture = this.getFieldValue('gesture');
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
if (v == "mpu")
generator.definitions_['import_mixgo_mpu'] = 'from mixgo import mpu';
var code = v + '.mpu9250_is_gesture("' + gesture + '")';
return [code, generator.ORDER_ATOMIC];
}
//ok
export const sensor_mpu9250_get_acceleration = function (_, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
generator.definitions_['import_machine'] = 'import machine';
var key = this.getFieldValue('key');
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
if (v == "mpu")
generator.definitions_['import_mixgo_mpu'] = 'from mixgo import mpu';
var code = v + '.mpu9250_get_' + key + '()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_adxl345_get_acceleration = function (_, generator) {
generator.definitions_['import_adxl345'] = 'import adxl345';
// generator.definitions_['import_machine'] = 'import machine';
var key = this.getFieldValue('key');
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code;
if (key == 'x') {
code = v + '.readX()';
} else if (key == 'y') {
code = v + '.readY()';
} else if (key == 'z') {
code = v + '.readZ()';
} else if (key == 'values') {
code = v + '.readXYZ()';
}
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mpu9250_get_magnetic = function (_, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
generator.definitions_['import_machine'] = 'import machine';
var key = this.getFieldValue('key');
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
if (v == "mpu")
generator.definitions_['import_mixgo_mpu'] = 'from mixgo import mpu';
var code = v + '.mpu9250_magnetic_' + key + '()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mpu9250_get_gyro = function (_, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
generator.definitions_['import_machine'] = 'import machine';
var key = this.getFieldValue('key');
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
if (v == "mpu")
generator.definitions_['import_mixgo_mpu'] = 'from mixgo import mpu';
var code = v + '.mpu9250_gyro_' + key + '()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mpu9250_calibrate_compass = function (_, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_mixgo_compass'] = 'from mixgo import compass';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
return '' + v + '.calibrate()\n';
}
export const sensor_mpu9250_temperature = function (_, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
generator.definitions_['import_machine'] = 'import machine';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
if (v == "mpu")
generator.definitions_['import_mixgo_mpu'] = 'from mixgo import mpu';
return [v + '.mpu9250_get_temperature()', generator.ORDER_ATOMIC];
}
export const sensor_mpu9250_field_strength = function (_, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
generator.definitions_['import_machine'] = 'import machine';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
if (v == "compass")
generator.definitions_['import_mixgo_compass'] = 'from mixgo import compass';
var compass = this.getFieldValue('compass');
var a;
if (compass == 'strength') {
a = v + '.get_field_strength()';
}
else if (compass == 'heading') {
a = v + '.heading()';
}
return [a, generator.ORDER_ATOMIC];
}
export const sensor_distance_hrsc04 = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
generator.setups_['class_hrsc04'] =
'class HCSR04:\n' +
' def __init__(self, tpin=pin15, epin=pin14, spin=pin13):\n' +
' self.trigger_pin = tpin\n' +
' self.echo_pin = epin\n' +
' self.sclk_pin = spin\n' +
'\n' +
' def distance_mm(self):\n' +
' spi.init(baudrate=125000, sclk=self.sclk_pin,\n' +
' mosi=self.trigger_pin, miso=self.echo_pin)\n' +
' pre = 0\n' +
' post = 0\n' +
' k = -1\n' +
' length = 500\n' +
' resp = bytearray(length)\n' +
' resp[0] = 0xFF\n' +
' spi.write_readinto(resp, resp)\n' +
' # find first non zero value\n' +
' try:\n' +
' i, value = next((ind, v) for ind, v in enumerate(resp) if v)\n' +
' except StopIteration:\n' +
' i = -1\n' +
' if i > 0:\n' +
' pre = bin(value).count("1")\n' +
' # find first non full high value afterwards\n' +
' try:\n' +
' k, value = next((ind, v)\n' +
' for ind, v in enumerate(resp[i:length - 2]) if resp[i + ind + 1] == 0)\n' +
' post = bin(value).count("1") if k else 0\n' +
' k = k + i\n' +
' except StopIteration:\n' +
' i = -1\n' +
' dist= -1 if i < 0 else round((pre + (k - i) * 8. + post) * 8 * 0.172)\n' +
' return dist\n' +
'\n' +
'sonar=HCSR04()\n'
return ['sonar.distance_mm()/10.0', generator.ORDER_ATOMIC];
}
export const RTC_get_time = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
if (v == "rtc")
generator.definitions_['import_mixgo_rtc'] = 'from mixgo import rtc';
var code = v + '.datetime()';
return [code, generator.ORDER_ATOMIC];
}
export const RTC_set_time = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var hour = generator.valueToCode(this, "hour", generator.ORDER_ASSIGNMENT);
var minute = generator.valueToCode(this, "minute", generator.ORDER_ASSIGNMENT);
var second = generator.valueToCode(this, "second", generator.ORDER_ASSIGNMENT);
generator.setups_['class_DS1307'] = generator.CLASS_DS1307_INIT;
var code = 'str(ds.Hour(' + hour + '))+ str(ds.Minute(' + minute + ')) +str(ds.Second(' + second + '))\n';
return code;
}
export const RTC_set_date = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var year = generator.valueToCode(this, "year", generator.ORDER_ASSIGNMENT);
var month = generator.valueToCode(this, "month", generator.ORDER_ASSIGNMENT);
var day = generator.valueToCode(this, "day", generator.ORDER_ASSIGNMENT);
generator.setups_['class_DS1307'] = generator.CLASS_DS1307_INIT;
var code = 'str(ds.Year(' + year + '))+ str(ds.Month(' + month + ')) +str(ds.Day(' + day + '))\n';
return code;
}
export const sensor_compass_reset = function (block, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_mixgo_compass'] = 'from mixgo import compass';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
return '' + v + '.reset_calibrate()\n';
}
export const HCSR04 = function (_, generator) {
generator.definitions_['import_sonar'] = 'import sonar';
var dropdown_pin1 = generator.valueToCode(this, "PIN1", generator.ORDER_ASSIGNMENT);
var dropdown_pin2 = generator.valueToCode(this, "PIN2", generator.ORDER_ASSIGNMENT);
var code = 'sonar.Sonar(' + dropdown_pin1 + ', ' + dropdown_pin2 + ').checkdist()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_dht11 = function (_, generator) {
generator.definitions_['import_dhtx'] = 'import dhtx';
var sensor_type = this.getFieldValue('TYPE');
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var what = this.getFieldValue('WHAT');
var code = 'dhtx.get_dht_' + what + "('" + sensor_type + "', " + dropdown_pin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_extern_light = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'mixgo.get_brightness(' + pin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_extern_sound = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'mixgo.get_soundlevel(' + pin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const number1 = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var code = this.getFieldValue('op');
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_pin_pressed = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var pin = generator.valueToCode(this, 'button', generator.ORDER_ATOMIC);
var code = 'mixgo.' + pin + '.is_touched()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_extern_pin_near = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'mixgo.' + 'Infrared(' + pin + ')()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_pin_near = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var direction = this.getFieldValue('direction');
var code = 'mixgo.' + 'infrared_' + direction + '()';
return [code, generator.ORDER_ATOMIC];
}
export const RTC_set_datetime = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var year = generator.valueToCode(this, "year", generator.ORDER_ASSIGNMENT);
var month = generator.valueToCode(this, "month", generator.ORDER_ASSIGNMENT);
var day = generator.valueToCode(this, "day", generator.ORDER_ASSIGNMENT);
var hour = generator.valueToCode(this, "hour", generator.ORDER_ASSIGNMENT);
var minute = generator.valueToCode(this, "minute", generator.ORDER_ASSIGNMENT);
var second = generator.valueToCode(this, "second", generator.ORDER_ASSIGNMENT);
var week = generator.valueToCode(this, "weekday", generator.ORDER_ASSIGNMENT);
var millisecond = generator.valueToCode(this, "millisecond", generator.ORDER_ASSIGNMENT);
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
if (v == "rtc")
generator.definitions_['import_mixgo_rtc'] = 'from mixgo import rtc';
var code = v + '.datetime((' + year + ',' + month + ',' + day + ',' + week + ',' + hour + ',' + minute + ',' + second + ',' + millisecond + '))\n';
return code;
}
export const sensor_rtc_init = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
generator.definitions_['import_machine'] = 'import machine';
var code = v + ' = machine.RTC()\n';
return code;
}
export const sensor_use_i2c_init = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var iv = generator.valueToCode(this, 'I2CSUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
generator.definitions_['import_machine'] = 'import machine';
var code;
if (key == 'MPU9250') {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
code = v + ' = mpu9250.' + key + "(" + iv + ')\n';
} else if (key == 'BMP280') {
generator.definitions_['import_bmp280'] = 'import bmp280';
code = v + ' = bmp280.' + key + "(" + iv + ')\n';
} else if (key == 'SHT20') {
generator.definitions_['import_sht20'] = 'import sht20';
code = v + ' = sht20.' + key + "(" + iv + ')\n';
} else if (key == 'ADXL345') {
generator.definitions_['import_adxl345'] = 'import adxl345';
code = v + ' = adxl345.' + key + "(" + iv + ')\n';
}
return code;
}
export const sensor_bmp = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_bmp280'] = 'import bmp280';
var code = v + '.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const sensor_sht = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_sht20'] = 'import sht20';
var code = v + '.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const sensor_ds18x20 = function (_, generator) {
generator.definitions_['import_ds18x20x'] = 'import ds18x20x';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'ds18x20x.get_ds18x20_temperature(' + dropdown_pin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_lm35 = function (_, generator) {
generator.definitions_['import_lm35'] = 'import lm35';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'lm35.get_LM35_temperature(' + dropdown_pin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_button_is_pressed = sensor_mixgo_button_is_pressed;
export const sensor_button_was_pressed = sensor_mixgo_button_was_pressed;
export const sensor_button_get_presses = sensor_mixgo_button_get_presses;
export const sensor_pin_pressed = sensor_mixgo_pin_pressed;
export const sensor_pin_near = sensor_mixgo_pin_near;
export const sensor_mixgo_light = sensor_LTR308;
export const sensor_light = sensor_mixgo_light;
// export const sensor_get_acceleration = sensor_mixgo_get_acceleration;
export const dht11 = sensor_dht11;

View File

@@ -0,0 +1,845 @@
import { Boards } from 'mixly';
export const sensor_mixgo_extern_button_is_pressed = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC);
var code = 'mixgo.Button(' + pin + ').is_pressed(' + dropdown_stat + ')';
return [code, generator.ORDER_ATOMIC];
}
//ok
export const sensor_mixgo_extern_button_was_pressed = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC);
var code = 'mixgo.Button(' + pin + ').was_pressed(' + dropdown_stat + ')';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_extern_button_get_presses = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var argument = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0';
var code = 'mixgo.Button(' + pin + ').get_presses(' + argument + ')';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_extern_button_attachInterrupt = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_mixgo'] = 'import mixgo';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_mode = this.getFieldValue('mode');
var atta = generator.valueToCode(this, 'DO', generator.ORDER_ATOMIC);
var code = 'mixgo.Button(' + pin + ').irq' + '(handler = ' + atta + ', trigger = ' + dropdown_mode + ')\n'
return code;
}
export const sensor_mpu9250_attachGestureInterrupt = function (_, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
generator.definitions_['import_machine'] = 'import machine';
var gesture = this.getFieldValue('gesture');
var branch = generator.statementToCode(this, 'DO');
var d = branch || generator.PASS;
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
if (v == "mpu")
generator.definitions_['import_mixgo_mpu'] = 'from mixgo import mpu';
var code = 'if ' + v + '.mpu9250_is_gesture("' + gesture + '"):\n' + d;
return code;
}
export const sensor_distance_hrsc04 = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
generator.setups_['class_hrsc04'] =
'class HCSR04:\n' +
' def __init__(self, tpin=pin15, epin=pin14, spin=pin13):\n' +
' self.trigger_pin = tpin\n' +
' self.echo_pin = epin\n' +
' self.sclk_pin = spin\n' +
'\n' +
' def distance_mm(self):\n' +
' spi.init(baudrate=125000, sclk=self.sclk_pin,\n' +
' mosi=self.trigger_pin, miso=self.echo_pin)\n' +
' pre = 0\n' +
' post = 0\n' +
' k = -1\n' +
' length = 500\n' +
' resp = bytearray(length)\n' +
' resp[0] = 0xFF\n' +
' spi.write_readinto(resp, resp)\n' +
' # find first non zero value\n' +
' try:\n' +
' i, value = next((ind, v) for ind, v in enumerate(resp) if v)\n' +
' except StopIteration:\n' +
' i = -1\n' +
' if i > 0:\n' +
' pre = bin(value).count("1")\n' +
' # find first non full high value afterwards\n' +
' try:\n' +
' k, value = next((ind, v)\n' +
' for ind, v in enumerate(resp[i:length - 2]) if resp[i + ind + 1] == 0)\n' +
' post = bin(value).count("1") if k else 0\n' +
' k = k + i\n' +
' except StopIteration:\n' +
' i = -1\n' +
' dist= -1 if i < 0 else round((pre + (k - i) * 8. + post) * 8 * 0.172)\n' +
' return dist\n' +
'\n' +
'sonar=HCSR04()\n'
return ['sonar.distance_mm()/10.0', generator.ORDER_ATOMIC];
}
export const RTC_set_time = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var hour = generator.valueToCode(this, "hour", generator.ORDER_ASSIGNMENT);
var minute = generator.valueToCode(this, "minute", generator.ORDER_ASSIGNMENT);
var second = generator.valueToCode(this, "second", generator.ORDER_ASSIGNMENT);
generator.setups_['class_DS1307'] = generator.CLASS_DS1307_INIT;
var code = 'str(ds.Hour(' + hour + '))+ str(ds.Minute(' + minute + ')) +str(ds.Second(' + second + '))\n';
return code;
}
export const RTC_set_date = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var year = generator.valueToCode(this, "year", generator.ORDER_ASSIGNMENT);
var month = generator.valueToCode(this, "month", generator.ORDER_ASSIGNMENT);
var day = generator.valueToCode(this, "day", generator.ORDER_ASSIGNMENT);
generator.setups_['class_DS1307'] = generator.CLASS_DS1307_INIT;
var code = 'str(ds.Year(' + year + '))+ str(ds.Month(' + month + ')) +str(ds.Day(' + day + '))\n';
return code;
}
export const sensor_mixgo_extern_light = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'mixgo.get_brightness(' + pin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_extern_sound = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'mixgo.get_soundlevel(' + pin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_extern_pin_near = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var direction = this.getFieldValue('direction');
var code = 'mixgo.' + 'infrared_' + direction + '.near()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_rtc_init = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
generator.definitions_['import_machine'] = 'import machine';
var code = v + ' = machine.RTC()\n';
return code;
}
export const sensor_bmp = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_bmp280'] = 'import bmp280';
var code = v + '.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const sensor_sht = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_sht20'] = 'import sht20';
var code = v + '.' + key;
return [code, generator.ORDER_ATOMIC];
}
//pe
export const sensor_use_i2c_init = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var iv = generator.valueToCode(this, 'I2CSUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code;
if (key == 'MPU9250') {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
code = v + ' = mpu9250.' + key + "(" + iv + ')\n';
} else if (key == 'BMP280') {
generator.definitions_['import_bmp280'] = 'import bmp280';
code = v + ' = bmp280.' + key + "(" + iv + ')\n';
} else if (key == 'SHT20') {
generator.definitions_['import_sht20'] = 'import sht20';
code = v + ' = sht20.' + key + "(" + iv + ')\n';
} else if (key == 'ADXL345') {
generator.definitions_['import_adxl345'] = 'import adxl345';
code = v + ' = adxl345.' + key + "(" + iv + ')\n';
} else if (key == 'LTR308') {
generator.definitions_['import_ltr308al'] = 'import ltr308al';
code = v + ' = ltr308al.LTR_308ALS(' + iv + ')\n';
} else if (key == 'LTR381RGB') {
generator.definitions_['import_ltr381rgb'] = 'import ltr381rgb';
code = v + ' = ltr381rgb.LTR_381RGB(' + iv + ')\n';
} else if (key == 'HP203X') {
generator.definitions_['import_hp203x'] = 'import hp203x';
code = v + ' = hp203x.HP203X(' + iv + ')\n';
} else if (key == 'SHTC3') {
generator.definitions_['import_shtc3'] = 'import shtc3';
code = v + ' = shtc3.' + key + "(" + iv + ')\n';
} else if (key == 'AHT21') {
generator.definitions_['import_ahtx0'] = 'import ahtx0';
code = v + ' = ahtx0.AHTx0(' + iv + ')\n';
} else if (key == 'VL53L0X') {
generator.definitions_['import_vl53l0x'] = 'import vl53l0x';
code = v + ' = vl53l0x.' + key + "(" + iv + ')\n';
} else if (key == 'QMC5883L') {
generator.definitions_['import_qmc5883l'] = 'import qmc5883l';
code = v + ' = qmc5883l.Compass(' + iv + ')\n';
} else if (key == 'MAX30102') {
generator.definitions_['import_max30102'] = 'import max30102';
code = v + ' = max30102.MAX30102(' + iv + ')\n';
} else if (key == 'APDS9960') {
generator.definitions_['import_apds9960'] = 'import apds9960';
code = v + ' = apds9960.APDS9960(' + iv + ')\n';
} else if (key == 'RFID') {
generator.definitions_['import_rc522'] = 'import rc522';
code = v + ' = rc522.RC522(' + iv + ')\n';
}
return code;
}
export const sensor_MAX30102_extern = function (_, generator) {
generator.definitions_['import_max30102'] = 'import max30102';
var key = this.getFieldValue('key');
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = sub + '.heartrate()' + key;
return [code, generator.ORDER_ATOMIC];
}
export const sensor_APDS9960_extern = function (_, generator) {
generator.definitions_['import_apds9960'] = 'import apds9960';
var key = this.getFieldValue('key');
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = sub + '.' + key + '()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_LTR308_extern = function (_, generator) {
generator.definitions_['import_ltr308al'] = 'import ltr308al';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = sub + '.getdata()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_hp203_extern = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
generator.definitions_['import_hp203x'] = 'import hp203x';
var code = sub + '.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const sensor_ltr381_extern = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
generator.definitions_['import_ltr381rgb'] = 'import ltr381rgb';
var code = sub + '.getdata()' + key;
return [code, generator.ORDER_ATOMIC];
}
export const sensor_LTR390UV_extern = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_time'] = 'import time';
generator.definitions_['import_ltr390uv'] = 'import ltr390uv';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
if (key == 'E') {
var code = sub + '.ambient_light()';
} else {
var code = sub + '.ultraviolet()';
}
return [code, generator.ORDER_ATOMIC];
}
export const sensor_QMC5883L_extern = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
generator.definitions_['import_qmc5883l'] = 'import qmc5883l';
var code = sub + '.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const sensor_shtc3_extern = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
generator.definitions_['import_shtc3'] = 'import shtc3';
var code = sub + '.' + key + '()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_aht11_extern = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
generator.definitions_['import_ahtx0'] = 'import ahtx0';
var code = sub + '.' + key + '()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_VL530LX_extern = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
generator.definitions_['import_vl53l0x'] = 'import vl53l0x';
var code = sub + '.read()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_use_spi_init = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var sv = generator.valueToCode(this, 'SPISUB', generator.ORDER_ATOMIC);
var pv = generator.valueToCode(this, 'PINSUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code;
if (key == 'RFID') {
generator.definitions_['import_rc522'] = 'import rc522';
var code = v + ' = rc522.RC522(' + sv + ',' + pv + ')\n';
} else if (key == 'Weather') {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version] = 'import ' + version;
generator.definitions_['import_ws_lora'] = 'import ws_lora';
if (version == 'mixgo_pe') {
var code = v + ' = ws_lora.Weather(' + sv + ',' + pv + ')\n';
} else if (version == 'mixgo_nova') {
var code = v + ' = ws_lora.Weather(' + sv + ',' + pv + ',' + version + '.onboard_i2c_soft' + ')\n';
} else {
var code = v + ' = ws_lora.Weather(' + sv + ',' + pv + ',' + version + '.onboard_i2c' + ')\n';
}
}
return code;
}
export const extern_rfid_read = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var sector = generator.valueToCode(this, 'SECTOR', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
generator.definitions_['import_rc522'] = 'import rc522';
var code = sub + '.read_card(' + sector + ',"' + key + '")';
return [code, generator.ORDER_ATOMIC];
}
export const extern_rfid_readid = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
generator.definitions_['import_rc522'] = 'import rc522';
var code = sub + '.read_card(0, x="id")';
return [code, generator.ORDER_ATOMIC];
}
export const extern_rfid_readcontent = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var sector = generator.valueToCode(this, 'SECTOR', generator.ORDER_ATOMIC);
generator.definitions_['import_rc522'] = 'import rc522';
var code = sub + '.read_card(' + sector + ')';
return [code, generator.ORDER_ATOMIC];
}
export const extern_rfid_write = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var sector = generator.valueToCode(this, 'SECTOR', generator.ORDER_ATOMIC);
var cnt = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC);
generator.definitions_['import_rc522'] = 'import rc522';
var code = sub + '.write_card(' + cnt + ',' + sector + ')\n';
return code;
}
export const extern_rfid_write_return = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var sector = generator.valueToCode(this, 'SECTOR', generator.ORDER_ATOMIC);
var cnt = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC);
generator.definitions_['import_rc522'] = 'import rc522';
var code = sub + '.write_card(' + cnt + ',' + sector + ')';
return [code, generator.ORDER_ATOMIC];
}
export const extern_rfid_status = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
generator.definitions_['import_rc522'] = 'import rc522';
var code = sub + '.scan_card()==' + key;
return [code, generator.ORDER_ATOMIC];
}
export const weather_data = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
generator.definitions_['import_ws_lora'] = 'import ws_lora';
var code = sub + '.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const weather_have_data = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
generator.definitions_['import_ws_lora'] = 'import ws_lora';
var code = sub + '.any()';
return [code, generator.ORDER_ATOMIC];
}
export const weather_uart_mixio = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var base = generator.valueToCode(this, 'BASE', generator.ORDER_ATOMIC);
generator.definitions_['import_ws_lora'] = 'import ws_lora';
var code = sub + '.uart_mixio(topic=' + base + ')\n';
return code;
}
export const weather_set_label = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
generator.definitions_['import_ws_lora'] = 'import ws_lora';
var code = new Array(this.itemCount_);
var default_value = '0';
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || default_value;
}
var code = sub + '.label(' + code.join(', ') + ')\n';
return code;
}
export const sensor_mixgoce_hot_wheel_is_touched = function (_, generator) {
var key = this.getFieldValue('key');
var stat = this.getFieldValue('stat');
generator.definitions_['import_tpwheel'] = 'import tpwheel';
var code = 'tpwheel.TouchPadWheels(' + key + ').' + stat;
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgoce_hot_wheel_degrees = function (_, generator) {
generator.definitions_['import_tpwheel'] = 'import tpwheel';
var code = 'tpwheel.hot_wheels_degree()';
return [code, generator.ORDER_ATOMIC];
}
export const esp32_s2_weather_init = function (_, generator) {
generator.definitions_['import_weather'] = 'import weather';
generator.definitions_['import_board_*'] = 'from board import *';
var wd = generator.valueToCode(this, 'wd', generator.ORDER_ATOMIC);
var ws = generator.valueToCode(this, 'ws', generator.ORDER_ATOMIC);
var rain = generator.valueToCode(this, 'rain', generator.ORDER_ATOMIC);
var code = "wd = weather.Weather_wd(" + wd + ")\n"
code += "ws = weather.Weather_ws(" + ws + ")\n"
code += "rain = weather.Weather_rain(" + rain + ")\n"
return code;
}
export const esp32_s2_weather_wd = function (_, generator) {
generator.definitions_['import_weather'] = 'import weather';
var code = 'wd.wind_direction()';
return [code, generator.ORDER_ATOMIC];
}
export const esp32_s2_weather_rain = function (_, generator) {
generator.definitions_['import_weather'] = 'import weather';
var rain = generator.valueToCode(this, 'rain', generator.ORDER_ATOMIC);
var code = 'rain.rain_count(time_Hour=' + rain + ')';
return [code, generator.ORDER_ATOMIC];
}
export const esp32_s2_weather_ws = function (_, generator) {
generator.definitions_['import_weather'] = 'import weather';
var key = this.getFieldValue('key');
if (key == 'ALL') {
var code = 'ws.wind_speed()';
} else {
var code = 'ws.wind_speed()[' + key + ']';
}
return [code, generator.ORDER_ATOMIC];
}
export const HCSR04 = function (_, generator) {
generator.definitions_['import_sonar'] = 'import sonar';
var dropdown_pin1 = generator.valueToCode(this, "PIN1", generator.ORDER_ASSIGNMENT);
var dropdown_pin2 = generator.valueToCode(this, "PIN2", generator.ORDER_ASSIGNMENT);
var code = 'sonar.Sonar(' + dropdown_pin1 + ',' + dropdown_pin2 + ').checkdist()';
return [code, generator.ORDER_ATOMIC];
}
export const PS2_init = function (_, generator) {
generator.definitions_['import_ps2'] = 'import ps2';
//generator.definitions_['import_board'] = 'import board';
var PS2_CLK = this.getFieldValue('PS2_CLK');
var PS2_DOU = this.getFieldValue('PS2_DOU');
var PS2_DIN = this.getFieldValue('PS2_DIN');
var PS2_CS = this.getFieldValue('PS2_CS');
var code = 'mixgope_ps = ps2.PS2Controller(' + PS2_CLK + ',' + PS2_DOU + ',' + PS2_DIN + ',' + PS2_CS + ')\n';
return code;
}
export const PS2_vibration = function (_, generator) {
generator.definitions_['import_ps2'] = 'import ps2';
var ss = this.getFieldValue('smotorstate');
var amp = generator.valueToCode(this, 'AMP', generator.ORDER_ATOMIC);
var code = "mixgope_ps.PS2_vibration(" + ss + ',' + amp + ")\n";
return code;
}
export const PS2_Button = function (_, generator) {
generator.definitions_['import_ps2'] = 'import ps2';
var bt = this.getFieldValue('psbt');
var code = "mixgope_ps.PS2_keydata()[0] & (ps2." + bt + ")";
return [code, generator.ORDER_ATOMIC];
}
export const PS2_Buttons = function (_, generator) {
generator.definitions_['import_ps2'] = 'import ps2';
var bt = this.getFieldValue('psbt');
var code = "ps2." + bt;
return [code, generator.ORDER_ATOMIC];
}
export const PS2_State = function (_, generator) {
generator.definitions_['import_ps2'] = 'import ps2';
var bt = this.getFieldValue('btstate');
var code = "mixgope_ps.PS2_keydata()[" + bt + "]";
return [code, generator.ORDER_ATOMIC];
}
export const PS2_stk = function (_, generator) {
generator.definitions_['import_ps2'] = 'import ps2';
var stk = this.getFieldValue('psstk');
var code = "mixgope_ps.PS2_keydata()[1][" + stk + "]";
return [code, generator.ORDER_ATOMIC];
}
export const RTC_set_datetime = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var year = generator.valueToCode(this, "year", generator.ORDER_ASSIGNMENT);
var month = generator.valueToCode(this, "month", generator.ORDER_ASSIGNMENT);
var day = generator.valueToCode(this, "day", generator.ORDER_ASSIGNMENT);
var hour = generator.valueToCode(this, "hour", generator.ORDER_ASSIGNMENT);
var minute = generator.valueToCode(this, "minute", generator.ORDER_ASSIGNMENT);
var second = generator.valueToCode(this, "second", generator.ORDER_ASSIGNMENT);
var week = generator.valueToCode(this, "weekday", generator.ORDER_ASSIGNMENT);
var millisecond = generator.valueToCode(this, "millisecond", generator.ORDER_ASSIGNMENT);
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
if (v == "rtc")
generator.definitions_['import_mixgo_rtc'] = 'from mixgo import rtc';
var code = v + '.datetime((' + year + ',' + month + ',' + day + ',' + week + ',' + hour + ',' + minute + ',' + second + ',' + millisecond + '))\n';
return code;
}
export const RTC_get_time = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
if (v == "rtc")
generator.definitions_['import_mixgo_rtc'] = 'from mixgo import rtc';
var code = v + '.datetime()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_dht11 = function (_, generator) {
generator.definitions_['import_dhtx'] = 'import dhtx';
var sensor_type = this.getFieldValue('TYPE');
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var what = this.getFieldValue('WHAT');
var code = 'dhtx.' + sensor_type + "(" + dropdown_pin + ').' + what + '()';
return [code, generator.ORDER_ATOMIC];
}
export const PS2_init_new = function (_, generator) {
generator.definitions_['import_ps2'] = 'import ps2';
//generator.definitions_['import_board'] = 'import board';
var PS2_CLK = generator.valueToCode(this, 'CLK', generator.ORDER_ATOMIC);
var PS2_DOU = generator.valueToCode(this, 'DOU', generator.ORDER_ATOMIC);
var PS2_DIN = generator.valueToCode(this, 'DIN', generator.ORDER_ATOMIC);
var PS2_CS = generator.valueToCode(this, 'CS', generator.ORDER_ATOMIC);
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = sub + ' = ps2.PS2Controller(' + PS2_CLK + ',' + PS2_DOU + ',' + PS2_DIN + ',' + PS2_CS + ')\n';
return code;
}
export const PS2_vibration_new = function (_, generator) {
generator.definitions_['import_ps2'] = 'import ps2';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var ss = this.getFieldValue('smotorstate');
var amp = generator.valueToCode(this, 'AMP', generator.ORDER_ATOMIC);
var code = sub + ".vibration(" + ss + ',' + amp + ")\n";
return code;
}
export const PS2_Buttons_new = function (_, generator) {
generator.definitions_['import_ps2'] = 'import ps2';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var bt = this.getFieldValue('psbt');
var code = sub + '.button(ps2.' + bt + ')';
return [code, generator.ORDER_ATOMIC];
}
export const PS2_stk_new = function (_, generator) {
generator.definitions_['import_ps2'] = 'import ps2';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var stk = this.getFieldValue('psstk');
var code = sub + ".analog(ps2.PSS_" + stk + ")";
return [code, generator.ORDER_ATOMIC];
}
export const sensor_use_uart_init = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var s = this.getFieldValue('sensor');
var code = ''
if (s == 'PM') {
generator.definitions_['import_pm2_5'] = 'import pm2_5';
code = v + '=pm2_5.PM2_5(' + key + ')\n';
} else if (s == 'GNSS') {
generator.definitions_['import_gnss'] = 'import gnss';
code = v + '=gnss.NMEA0183(' + key + ')\n';
}
return code;
}
export const pm25_get_data = function (_, generator) {
generator.definitions_['import_pm2_5'] = 'import pm2_5';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var pm = this.getFieldValue('pm');
var code = v + ".concentration()" + pm;
return [code, generator.ORDER_ATOMIC];
}
export const gnss_get_data = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
generator.definitions_['import_gnss'] = 'import gnss';
var code = sub + '.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const gnss_have_data = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
generator.definitions_['import_gnss'] = 'import gnss';
var code = sub + '.any()';
return [code, generator.ORDER_ATOMIC];
}
//mixbot/feiyi extern below:
export const robot_button_extern_get_value = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var mode = this.getFieldValue('mode');
var num = this.getFieldValue('num');
if (version == 'mixbot') {
generator.definitions_['import_mixbot_ext_ext_button'] = 'from mixbot_ext import ext_button';
var code = 'ext_button.value(' + mode + ")" + num;
return [code, generator.ORDER_ATOMIC];
} else if (version == 'feiyi') {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_i2cdevice'] = 'import i2cdevice';
if (mode == "0") {
generator.definitions_['import_left_ext_i2c'] = 'ext_i2c_left = i2cdevice.I2C_device(scl = machine.Pin(0), sda = machine.Pin(1), freq = 10000)';
generator.definitions_['import_left_button'] = 'ext_button_left = i2cdevice.Buttonx5(ext_i2c_left)';
var code = 'ext_button_left.value()' + num;
} else if (mode == "1") {
generator.definitions_['import_right_ext_i2c'] = 'ext_i2c_right = i2cdevice.I2C_device(scl = machine.Pin(2), sda = machine.Pin(3), freq = 10000)';
generator.definitions_['import_right_button'] = 'ext_button_right = i2cdevice.Buttonx5(ext_i2c_right)';
var code = 'ext_button_right.value()' + num;
}
return [code, generator.ORDER_ATOMIC];
}
}
export const robot_touch_extern_get_value = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var mode = this.getFieldValue('mode');
if (version == 'mixbot') {
generator.definitions_['import_mixbot_ext_ext_collision'] = 'from mixbot_ext import ext_collision';
var code = 'ext_collision.value(' + mode + ")";
return [code, generator.ORDER_ATOMIC];
} else if (version == 'feiyi') {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_i2cdevice'] = 'import i2cdevice';
if (mode == "0") {
generator.definitions_['import_left_ext_i2c'] = 'ext_i2c_left = i2cdevice.I2C_device(scl = machine.Pin(0), sda = machine.Pin(1), freq = 10000)';
generator.definitions_['import_left_collision'] = 'ext_collision_left = i2cdevice.Button(ext_i2c_left)';
var code = 'ext_collision_left.value()';
} else if (mode == "1") {
generator.definitions_['import_right_ext_i2c'] = 'ext_i2c_right = i2cdevice.I2C_device(scl = machine.Pin(2), sda = machine.Pin(3), freq = 10000)';
generator.definitions_['import_right_collision'] = 'ext_collision_right = i2cdevice.Button(ext_i2c_right)';
var code = 'ext_collision_right.value()';
}
return [code, generator.ORDER_ATOMIC];
}
}
export const robot_infrared_extern_get_value = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
if (version == 'mixbot') {
var mode = this.getFieldValue('mode');
generator.definitions_['import_mixbot_ext_ext_infrared'] = 'from mixbot_ext import ext_infrared';
var code = 'ext_infrared.value(' + mode + ")";
return [code, generator.ORDER_ATOMIC];
} else if (version == 'feiyi') {
var mode = this.getFieldValue('mode');
generator.definitions_['import_feiyi_onboard_bot51'] = 'from feiyi import onboard_bot51';
var code = 'onboard_bot51.read_ps(' + mode + ")";
return [code, generator.ORDER_ATOMIC];
}
}
export const robot_infrared_extern_grey_get_value = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var mode = this.getFieldValue('mode');
if (version == 'feiyi') {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_i2cdevice'] = 'import i2cdevice';
if (mode == "0") {
generator.definitions_['import_left_ext_i2c'] = 'ext_i2c_left = i2cdevice.I2C_device(scl = machine.Pin(0), sda = machine.Pin(1), freq = 10000)';
generator.definitions_['import_left_grey_near'] = 'ext_grey_near_left = i2cdevice.Infrared(ext_i2c_left)';
var code = 'ext_grey_near_left.value()';
} else if (mode == "1") {
generator.definitions_['import_right_ext_i2c'] = 'ext_i2c_right = i2cdevice.I2C_device(scl = machine.Pin(2), sda = machine.Pin(3), freq = 10000)';
generator.definitions_['import_right_grey_near'] = 'ext_grey_near_right = i2cdevice.Infrared(ext_i2c_right)';
var code = 'ext_grey_near_right.value()';
}
return [code, generator.ORDER_ATOMIC];
}
}
export const robot_potentiometer_extern_get_value = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var mode = this.getFieldValue('mode');
if (version == 'mixbot') {
generator.definitions_['import_mixbot_ext_ext_potentiometer'] = 'from mixbot_ext import ext_potentiometer';
var code = 'ext_potentiometer.value(' + mode + ")";
return [code, generator.ORDER_ATOMIC];
} else if (version == 'feiyi') {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_i2cdevice'] = 'import i2cdevice';
if (mode == "0") {
generator.definitions_['import_left_ext_i2c'] = 'ext_i2c_left = i2cdevice.I2C_device(scl = machine.Pin(0), sda = machine.Pin(1), freq = 10000)';
generator.definitions_['import_left_potentiometer'] = 'ext_potentiometer_left = i2cdevice.Dimmer(ext_i2c_left)';
var code = 'ext_potentiometer_left.value()';
} else if (mode == "1") {
generator.definitions_['import_right_ext_i2c'] = 'ext_i2c_right = i2cdevice.I2C_device(scl = machine.Pin(2), sda = machine.Pin(3), freq = 10000)';
generator.definitions_['import_right_potentiometer'] = 'ext_potentiometer_right = i2cdevice.Dimmer(ext_i2c_right)';
var code = 'ext_potentiometer_right.value()';
}
return [code, generator.ORDER_ATOMIC];
}
}
export const robot_color_extern_get_value = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var mode = this.getFieldValue('mode');
var color = this.getFieldValue('color');
if (version == 'mixbot') {
generator.definitions_['import_mixbot_ext_ext_color'] = 'from mixbot_ext import ext_color';
var code = 'ext_color.recognition(' + mode + ")" + color;
return [code, generator.ORDER_ATOMIC];
} else if (version == 'feiyi') {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_i2cdevice'] = 'import i2cdevice';
if (mode == "0") {
generator.definitions_['import_left_ext_i2c'] = 'ext_i2c_left = i2cdevice.I2C_device(scl = machine.Pin(0), sda = machine.Pin(1), freq = 10000)';
generator.definitions_['import_left_color'] = 'ext_color_left = i2cdevice.Color_ID(ext_i2c_left)';
var code = 'ext_color_left.recognition()' + color;
} else if (mode == "1") {
generator.definitions_['import_right_ext_i2c'] = 'ext_i2c_right = i2cdevice.I2C_device(scl = machine.Pin(2), sda = machine.Pin(3), freq = 10000)';
generator.definitions_['import_right_color'] = 'ext_color_right = i2cdevice.Color_ID(ext_i2c_right)';
var code = 'ext_color_right.recognition()' + color;
}
return [code, generator.ORDER_ATOMIC];
}
}
export const robot_sonar_extern_get_value = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var mode = this.getFieldValue('mode');
if (version == 'mixbot') {
generator.definitions_['import_mixbot_ext_ext_sonar'] = 'from mixbot_ext import ext_sonar';
var code = 'ext_sonar.value(' + mode + ")";
return [code, generator.ORDER_ATOMIC];
} else if (version == 'feiyi') {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_i2cdevice'] = 'import i2cdevice';
if (mode == "0") {
generator.definitions_['import_left_ext_i2c'] = 'ext_i2c_left = i2cdevice.I2C_device(scl = machine.Pin(0), sda = machine.Pin(1), freq = 10000)';
generator.definitions_['import_left_sonar'] = 'ext_sonar_left = i2cdevice.Sonar(ext_i2c_left)';
var code = 'ext_sonar_left.value()';
} else if (mode == "1") {
generator.definitions_['import_right_ext_i2c'] = 'ext_i2c_right = i2cdevice.I2C_device(scl = machine.Pin(2), sda = machine.Pin(3), freq = 10000)';
generator.definitions_['import_right_sonar'] = 'ext_sonar_right = i2cdevice.Sonar(ext_i2c_right)';
var code = 'ext_sonar_right.value()';
}
return [code, generator.ORDER_ATOMIC];
}
}
export const robot_sonar_extern_led = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var mode = this.getFieldValue('mode');
var light = generator.valueToCode(this, 'light', generator.ORDER_ATOMIC);
var op = generator.valueToCode(this, 'bright', generator.ORDER_ATOMIC);
if (version == 'mixbot') {
generator.definitions_['import_mixbot_ext_ext_sonar'] = 'from mixbot_ext import ext_sonar';
var code = 'ext_sonar.led(' + mode + ',' + light + ',' + op + ")\n";
return code;
} else if (version == 'feiyi') {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_i2cdevice'] = 'import i2cdevice';
if (mode == "0") {
generator.definitions_['import_left_ext_i2c'] = 'ext_i2c_left = i2cdevice.I2C_device(scl = machine.Pin(0), sda = machine.Pin(1), freq = 10000)';
generator.definitions_['import_left_sonar'] = 'ext_sonar_left = i2cdevice.Sonar(ext_i2c_left)';
var code = 'ext_sonar_left.led(0,' + light + ',' + op + ')\n';
} else if (mode == "1") {
generator.definitions_['import_right_ext_i2c'] = 'ext_i2c_right = i2cdevice.I2C_device(scl = machine.Pin(2), sda = machine.Pin(3), freq = 10000)';
generator.definitions_['import_right_sonar'] = 'ext_sonar_right = i2cdevice.Sonar(ext_i2c_right)';
var code = 'ext_sonar_right.led(0,' + light + ',' + op + ')\n';
}
return code;
}
}
export const mixbot_sensor_extern_get_addr = function (_, generator) {
var name = this.getFieldValue('name');
generator.definitions_['import_mixbot_ext_' + name] = 'from mixbot_ext import ' + name;
var code = name + '.addr_get()';
return [code, generator.ORDER_ATOMIC];
}
export const mixbot_sensor_extern_set_addr = function (_, generator) {
var name = this.getFieldValue('name');
generator.definitions_['import_mixbot_ext_' + name] = 'from mixbot_ext import ' + name;
var oldaddr = generator.valueToCode(this, 'old', generator.ORDER_ATOMIC);
var newaddr = generator.valueToCode(this, 'new', generator.ORDER_ATOMIC);
var code = name + '.addr_set(' + oldaddr + ',' + newaddr + ')\n';
return code;
}
export const sensor_weather_solo_init = function (_, generator) {
generator.definitions_['import_ws_solo'] = 'import ws_solo';
var wd = generator.valueToCode(this, 'wd', generator.ORDER_ATOMIC);
var ws = generator.valueToCode(this, 'ws', generator.ORDER_ATOMIC);
var rain = generator.valueToCode(this, 'rain', generator.ORDER_ATOMIC);
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = sub + ' = ws_solo.Weather_Solo(' + wd + ', ' + ws + ', ' + rain + ')\n';
return code;
}
export const sensor_weather_solo_wd = function (_, generator) {
generator.definitions_['import_ws_solo'] = 'import ws_solo';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + '.wind_direction()' + key + '';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_weather_solo_ws = function (_, generator) {
generator.definitions_['import_ws_solo'] = 'import ws_solo';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + '.wind_speed()' + key + '';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_weather_solo_rain = function (_, generator) {
generator.definitions_['import_ws_solo'] = 'import ws_solo';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + '.rain_count(' + time + ')' + key + '';
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,735 @@
import { Boards } from 'mixly';
import { sensor_dht11 } from './sensor_extern.js';
export const sensor_mixgo_button_is_pressed = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version] = 'import ' + version;
var btn = generator.valueToCode(this, 'btn', generator.ORDER_ATOMIC);
var code = version + '.' + btn + '.is_pressed()';
return [code, generator.ORDER_ATOMIC];
}
//ok
export const sensor_mixgo_button_was_pressed = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version] = 'import ' + version;
var btn = generator.valueToCode(this, 'btn', generator.ORDER_ATOMIC);
var code = version + '.' + btn + '.was_pressed()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_button_get_presses = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version] = 'import ' + version;
var btn = generator.valueToCode(this, 'btn', generator.ORDER_ATOMIC);
var argument = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0';
var code = version + '.' + btn + '.get_presses(' + argument + ')';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_button_attachInterrupt = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version] = 'import ' + version;
var dropdown_btn = generator.valueToCode(this, 'btn', generator.ORDER_ATOMIC);
var dropdown_mode = this.getFieldValue('mode');
var atta = generator.valueToCode(this, 'DO', generator.ORDER_ATOMIC);
var code = version + '.' + dropdown_btn + '.irq' + '(handler = ' + atta + ', trigger = ' + dropdown_mode + ')\n'
return code;
}
//ok
export const sensor_mixgocar42_button_is_pressed = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version] = 'import ' + version;
var code = version + '.' + 'button.is_pressed()';
return [code, generator.ORDER_ATOMIC];
}
//ok
export const sensor_mixgocar42_button_was_pressed = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version] = 'import ' + version;
var code = version + '.' + 'button.was_pressed()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgocar42_button_get_presses = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version] = 'import ' + version;
var argument = generator.valueToCode(this, 'VAR', generator.ORDER_ASSIGNMENT) || '0';
var code = version + '.' + 'button.get_presses(' + argument + ')';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgocar42_button_attachInterrupt = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version] = 'import ' + version;
var dropdown_mode = this.getFieldValue('mode');
var atta = generator.valueToCode(this, 'DO', generator.ORDER_ATOMIC);
var code = version + '.' + 'button.irq' + '(handler = ' + atta + ', trigger = ' + dropdown_mode + ')\n'
return code;
}
export const HCSR04 = function (_, generator) {
generator.definitions_['import_sonar'] = 'import sonar';
var dropdown_pin1 = generator.valueToCode(this, "PIN1", generator.ORDER_ASSIGNMENT);
var dropdown_pin2 = generator.valueToCode(this, "PIN2", generator.ORDER_ASSIGNMENT);
var code = 'sonar.Sonar(' + dropdown_pin1 + ', ' + dropdown_pin2 + ').checkdist()';
return [code, generator.ORDER_ATOMIC];
}
export const number1 = function (_, generator) {
var code = this.getFieldValue('op');
return [code, generator.ORDER_ATOMIC];
}
export const number2 = function (_, generator) {
var code = this.getFieldValue('op');
return [code, generator.ORDER_ATOMIC];
}
export const number3 = function (_, generator) {
var code = this.getFieldValue('op');
return [code, generator.ORDER_ATOMIC];
}
export const number4 = function (_, generator) {
var code = this.getFieldValue('op');
return [code, generator.ORDER_ATOMIC];
}
export const number5 = function (_, generator) {
var code = this.getFieldValue('op');
return [code, generator.ORDER_ATOMIC];
}
export const number6 = function (_, generator) {
var code = this.getFieldValue('op');
return [code, generator.ORDER_ATOMIC];
}
export const number7 = function (_, generator) {
var code = this.getFieldValue('op');
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_pin_near_single = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_als'] = "from " + version + " import onboard_als";
var code = 'onboard_als.ps_nl()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_pin_near_double = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version] = 'import ' + version;
var direction = this.getFieldValue('direction');
var code = version + '.' + 'infrared_' + direction + '()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_pin_near = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var direction = this.getFieldValue('direction');
generator.definitions_['import_' + version + '_' + direction] = 'from ' + version + ' import onboard_als_' + direction;
var code = 'onboard_als_' + direction + '.ps_nl()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_nova_pin_near = sensor_mixgo_pin_near;
export const sensor_mixgo_LTR308 = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var direction = this.getFieldValue('direction');
generator.definitions_['import_' + version + '_' + direction] = 'from ' + version + ' import onboard_als_' + direction;
var code = 'onboard_als_' + direction + '.als_vis()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_nova_LTR308 = sensor_mixgo_LTR308;
export const sensor_ds18x20 = function (_, generator) {
generator.definitions_['import_ds18x20x'] = 'import ds18x20x';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'ds18x20x.get_ds18x20_temperature(' + dropdown_pin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_lm35 = function (_, generator) {
generator.definitions_['import_lm35'] = 'import lm35';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'lm35.get_LM35_temperature(' + dropdown_pin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_LTR308 = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
if (version == "mixgo") {
generator.definitions_['import_mixgo'] = 'import mixgo';
return ['mixgo.get_brightness()', generator.ORDER_ATOMIC];
} else if (version == "mixgo_ce") {
generator.definitions_['import_mixgo_ce'] = 'import mixgo_ce';
return ['mixgo_ce.get_brightness()', generator.ORDER_ATOMIC];
} else if (version == "mpython") {
generator.definitions_['import_mpython_onboard_light'] = 'from mpython import onboard_light';
return ['onboard_light.brightness()', generator.ORDER_ATOMIC];
}
generator.definitions_['import_' + version + '_onboard_als'] = "from " + version + " import onboard_als";
var code = 'onboard_als.als_vis()';
return [code, generator.ORDER_ATOMIC];
// else{return ['', generator.ORDER_ATOMIC];}
}
export const sensor_sound = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
if (version == 'mixbot') {
generator.definitions_['import_' + version + '_sound'] = 'from ' + version + ' import sound';
var code = 'sound.loudness()';
} else if (version == 'mixgo_zero') {
generator.definitions_['import_mixgo_zero_voice_sound_level'] = "from mixgo_zero_voice import sound_level";
var code = 'sound_level()';
} else if (version == 'mixgo_nova') {
generator.definitions_['import_mixgo_nova_voice_sound_level'] = "from mixgo_nova_voice import sound_level";
var code = 'sound_level()';
} else if (version == "mixgo") {
generator.definitions_['import_mixgo'] = 'import mixgo';
return ['mixgo.get_soundlevel()', generator.ORDER_ATOMIC];
} else if (version == "mpython") {
generator.definitions_['import_mpython_onboard_sound'] = 'from mpython import onboard_sound';
return ['onboard_sound.soundlevel()', generator.ORDER_ATOMIC];
} else if (version == "mixgo_mini") {
generator.definitions_['import_' + version + '_onboard_bot'] = 'from ' + version + ' import onboard_bot';
var code = 'onboard_bot.soundlevel()';
} else {
generator.definitions_['import_' + version + '_onboard_sound'] = 'from ' + version + ' import onboard_sound';
var code = 'onboard_sound.read()';
}
return [code, generator.ORDER_ATOMIC];
}
// export const sensor_mixgo_nova_sound = function (_, generator) {
// var version = Boards.getSelectedBoardKey().split(':')[2]
// return [code, generator.ORDER_ATOMIC];
// }
export const sensor_hp203 = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var key = this.getFieldValue('key');
generator.definitions_['import_' + version + '_onboard_bps'] = "from " + version + " import onboard_bps";
var code = 'onboard_bps.' + key;
return [code, generator.ORDER_ATOMIC];
}
export const sensor_aht11 = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var key = this.getFieldValue('key');
if (version == 'mixgo_nova' || version == 'mixgo_zero') {
generator.definitions_['import_' + version + '_onboard_ths'] = "from " + version + " import onboard_ths";
var code = 'onboard_ths.' + key + '()';
} else {
generator.definitions_['import_' + version + '_onboard_ths'] = "from " + version + " import onboard_ths";
var code = 'onboard_ths.' + key + '()';
}
return [code, generator.ORDER_ATOMIC];
}
export const sensor_get_temperature = function (_, generator) {
generator.definitions_['import_feiyi_onboard_acc'] = 'from feiyi import onboard_acc';
return ['onboard_acc.temperature()', generator.ORDER_ATOMIC];
}
export const rfid_readid = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_rfid'] = "from " + version + " import onboard_rfid";
var code = 'onboard_rfid.read_card(0, x="id")';
return [code, generator.ORDER_ATOMIC];
}
export const rfid_readcontent = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var sector = generator.valueToCode(this, 'SECTOR', generator.ORDER_ATOMIC);
generator.definitions_['import_' + version + '_onboard_rfid'] = "from " + version + " import onboard_rfid";
var code = 'onboard_rfid.read_card(' + sector + ', x="content")';
return [code, generator.ORDER_ATOMIC];
}
export const rfid_write = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var sector = generator.valueToCode(this, 'SECTOR', generator.ORDER_ATOMIC);
var cnt = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC);
generator.definitions_['import_' + version + '_onboard_rfid'] = "from " + version + " import onboard_rfid";
var code = 'onboard_rfid.write_card(' + cnt + ',' + sector + ')\n';
return code;
}
export const rfid_write_return = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var sector = generator.valueToCode(this, 'SECTOR', generator.ORDER_ATOMIC);
var cnt = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC);
generator.definitions_['import_' + version + '_onboard_rfid'] = "from " + version + " import onboard_rfid";
var code = 'onboard_rfid.write_card(' + cnt + ',' + sector + ')';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_get_acceleration = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var key = this.getFieldValue('key');
if (key == 'strength') {
if (version == 'mixbot') {
generator.definitions_['import_' + version + '_acc_gyr'] = 'from ' + version + ' import acc_gyr';
var code = 'acc_gyr.strength()';
} else {
generator.definitions_['import_' + version + '_onboard_acc'] = "from " + version + " import onboard_acc";
var code = 'onboard_acc.strength()';
}
return [code, generator.ORDER_ATOMIC];
}
if (version == 'mixbot') {
generator.definitions_['import_' + version + '_acc_gyr'] = 'from ' + version + ' import acc_gyr';
var code = 'acc_gyr.accelerometer()' + key;
} else if (version == 'mpython') {
generator.definitions_['import_mpython_motion'] = 'from mpython import motion';
var code = 'motion.accelerometer()' + key;
} else {
generator.definitions_['import_' + version + '_onboard_acc'] = "from " + version + " import onboard_acc";
var code = 'onboard_acc.acceleration()' + key;
}
return [code, generator.ORDER_ATOMIC];
}
export const sensor_eulerangles = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_acc'] = "from " + version + " import onboard_acc";
var angle = this.getFieldValue('angle');
var code = 'onboard_acc.eulerangles()' + angle;
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mpu9250_gesture = function (_, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
generator.definitions_['import_machine'] = 'import machine';
var gesture = this.getFieldValue('gesture');
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
if (v == "mpu")
generator.definitions_['import_mixgo_mpu'] = 'from mixgo import mpu';
var code = v + '.mpu9250_is_gesture("' + gesture + '")';
return [code, generator.ORDER_ATOMIC];
}
//ok
export const sensor_mpu9250_get_acceleration = function (_, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
generator.definitions_['import_machine'] = 'import machine';
var key = this.getFieldValue('key');
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
if (v == "mpu")
generator.definitions_['import_mixgo_mpu'] = 'from mixgo import mpu';
var code = v + '.mpu9250_get_' + key + '()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgoce_pin_pressed = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var pin = generator.valueToCode(this, 'button', generator.ORDER_ATOMIC);
if (version == 'mixgo_mini') {
generator.definitions_['import_' + version + '_onboard_bot'] = 'from ' + version + ' import onboard_bot';
var code = 'onboard_bot.touched(' + pin + ')';
} else {
generator.definitions_['import_' + version] = 'import ' + version;
var code = version + '.touched(' + pin + ')';
}
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_touch_slide = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
if (version == 'mixgo_mini') {
generator.definitions_['import_' + version + '_onboard_bot'] = 'from ' + version + ' import onboard_bot';
var code = 'onboard_bot.touch_slide()';
} else {
generator.definitions_['import_' + version] = 'import ' + version;
var code = version + '.touch_slide(3,4)';
}
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_pin_pressed = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version] = 'import ' + version;
var pin = generator.valueToCode(this, 'button', generator.ORDER_ATOMIC);
var code = version + '.' + pin + '.is_touched()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mpython_pin_pressed = function (_, generator) {
generator.definitions_['import_mpython'] = 'import mpython';
var pin = generator.valueToCode(this, 'button', generator.ORDER_ATOMIC);
var code = 'mpython.touch_' + pin + '.is_touched()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_adxl345_get_acceleration = function (_, generator) {
generator.definitions_['import_adxl345'] = 'import adxl345';
// generator.definitions_['import_machine'] = 'import machine';
var key = this.getFieldValue('key');
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code;
if (key == 'x') {
code = v + '.readX()';
} else if (key == 'y') {
code = v + '.readY()';
} else if (key == 'z') {
code = v + '.readZ()';
} else if (key == 'values') {
code = v + '.readXYZ()';
}
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mpu9250_get_magnetic = function (_, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
generator.definitions_['import_machine'] = 'import machine';
var key = this.getFieldValue('key');
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
if (v == "mpu")
generator.definitions_['import_mixgo_mpu'] = 'from mixgo import mpu';
var code = v + '.mpu9250_magnetic_' + key + '()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mpu9250_get_gyro = function (_, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
generator.definitions_['import_machine'] = 'import machine';
var key = this.getFieldValue('key');
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
if (v == "mpu")
generator.definitions_['import_mixgo_mpu'] = 'from mixgo import mpu';
var code = v + '.mpu9250_gyro_' + key + '()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mpu9250_calibrate_compass = function (_, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_mixgo_compass'] = 'from mixgo import compass';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
return '' + v + '.calibrate()\n';
}
export const sensor_mpu9250_temperature = function (_, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
generator.definitions_['import_machine'] = 'import machine';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
if (v == "mpu")
generator.definitions_['import_mixgo_mpu'] = 'from mixgo import mpu';
return [v + '.mpu9250_get_temperature()', generator.ORDER_ATOMIC];
}
export const sensor_mpu9250_field_strength = function (_, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
generator.definitions_['import_machine'] = 'import machine';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
if (v == "compass")
generator.definitions_['import_mixgo_compass'] = 'from mixgo import compass';
var compass = this.getFieldValue('compass');
var a;
if (compass == 'strength') {
a = v + '.get_field_strength()';
} else if (compass == 'heading') {
a = v + '.heading()';
}
return [a, generator.ORDER_ATOMIC];
}
export const sensor_compass_reset = function (block, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_mixgo_compass'] = 'from mixgo import compass';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
return '' + v + '.reset_calibrate()\n';
}
export const sensor_onboard_mpu9250_gesture = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var gesture = this.getFieldValue('gesture');
generator.definitions_['import_mixgo_onboard_mpu'] = 'from mixgo import onboard_mpu';
var code = 'onboard_mpu.mpu9250_is_gesture("' + gesture + '")';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_onboard_mpu9250_get_acceleration = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var key = this.getFieldValue('key');
generator.definitions_['import_mixgo_onboard_mpu'] = 'from mixgo import onboard_mpu';
var code = 'onboard_mpu.mpu9250_get_' + key + '()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_onboard_mpu9250_get_magnetic = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var key = this.getFieldValue('key');
generator.definitions_['import_mixgo_onboard_mpu'] = 'from mixgo import onboard_mpu';
var code = 'onboard_mpu.mpu9250_magnetic_' + key + '()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_onboard_mpu9250_get_gyro = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var key = this.getFieldValue('key');
generator.definitions_['import_mixgo_onboard_mpu'] = 'from mixgo import onboard_mpu';
var code = 'onboard_mpu.mpu9250_gyro_' + key + '()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_onboard_mpu9250_calibrate_compass = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_mixgo_onboard_compass'] = 'from mixgo import onboard_compass';
return '' + 'onboard_compass.calibrate()\n';
}
export const sensor_onboard_mpu9250_temperature = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_mixgo_onboard_mpu'] = 'from mixgo import onboard_mpu';
return ['onboard_mpu.mpu9250_get_temperature()', generator.ORDER_ATOMIC];
}
export const sensor_onboard_mpu9250_field_strength = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_mixgo_onboard_compass'] = 'from mixgo import onboard_compass';
var compass = this.getFieldValue('compass');
var a;
if (compass == 'strength') {
a = 'onboard_compass.get_field_strength()';
} else if (compass == 'heading') {
a = 'onboard_compass.heading()';
}
return [a, generator.ORDER_ATOMIC];
}
export const sensor_onboard_compass_reset = function (block, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_mixgo_onboard_compass'] = 'from mixgo import onboard_compass';
return '' + 'onboard_compass.reset_calibrate()\n';
}
export const onboard_RTC_set_datetime = function (_, generator) {
generator.definitions_['import_ntptime'] = "import ntptime";
var year = generator.valueToCode(this, "year", generator.ORDER_ASSIGNMENT);
var month = generator.valueToCode(this, "month", generator.ORDER_ASSIGNMENT);
var day = generator.valueToCode(this, "day", generator.ORDER_ASSIGNMENT);
var hour = generator.valueToCode(this, "hour", generator.ORDER_ASSIGNMENT);
var minute = generator.valueToCode(this, "minute", generator.ORDER_ASSIGNMENT);
var second = generator.valueToCode(this, "second", generator.ORDER_ASSIGNMENT);
var code = 'ntptime.settime((' + year + ',' + month + ',' + day + ',' + hour + ',' + minute + ',' + second + ',0,0))\n';
return code;
}
export const onboard_RTC_settime_string = function (_, generator) {
var cnt = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC);
generator.definitions_['import_ntptime'] = "import ntptime";
var code = 'ntptime.settime(' + cnt + ')\n';
return code;
}
export const onboard_RTC_get_time = function (_, generator) {
generator.definitions_['import_time'] = 'import time';
var code = 'time.localtime()';
return [code, generator.ORDER_ATOMIC];
}
export const onboard_RTC_get_timestamp = function (_, generator) {
generator.definitions_['import_time'] = 'import time';
var time = generator.valueToCode(this, 'LIST', generator.ORDER_ATOMIC);
var code = 'time.mktime(' + time + ')';
return [code, generator.ORDER_ATOMIC];
}
export const onboard_RTC_timestamp_totuple = function (_, generator) {
generator.definitions_['import_time'] = 'import time';
var ts = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = 'time.localtime(' + ts + ')';
return [code, generator.ORDER_ATOMIC];
}
//mixgo_cc onboard_sensor generators:
export const sensor_mixgo_cc_mmc5603_get_magnetic = function (_, generator) {
var key = this.getFieldValue('key');
var version = Boards.getSelectedBoardKey().split(':')[2]
if (key == 'all') {
generator.definitions_['import_' + version + 'onboard_mgs'] = "from " + version + " import onboard_mgs";
var code = 'onboard_mgs.getstrength()';
return [code, generator.ORDER_ATOMIC];
}
if (version == 'mpython') {
generator.definitions_['import_mpython_magnetic'] = 'from mpython import magnetic';
var code = 'magnetic.getdata()' + key;
} else {
generator.definitions_['import_' + version + '_onboard_mgs'] = "from " + version + " import onboard_mgs";
var code = 'onboard_mgs.getdata()' + key;
}
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_cc_mmc5603_get_angle = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
if (version == 'mpython') {
generator.definitions_['import_mpython_magnetic'] = 'from mpython import magnetic';
var code = 'magnetic.getangle()';
} else {
generator.definitions_['import_' + version + '_onboard_mgs'] = "from " + version + " import onboard_mgs";
var code = 'onboard_mgs.getangle()';
}
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_cc_mmc5603_calibrate_compass = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_mgs'] = "from " + version + " import onboard_mgs";
var code = 'onboard_mgs.calibrate()\n';
return code;
}
//mixgo_me onboard_sensor generators:
export const sensor_mixgome_temperature = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
if (version == 'mixgo_mini') {
generator.definitions_['import_mixgo_mini_onboard_temperature'] = 'from mixgo_mini import onboard_temperature';
var code = 'onboard_temperature()';
} else {
generator.definitions_['import_mixgo_me_onboard_acc'] = "from mixgo_me import onboard_acc";
var code = 'onboard_acc.temperature()';
}
return [code, generator.ORDER_ATOMIC];
}
//mixgo_ce onboard_sensor generators:
export const sensor_mixgoce_temperature = function (_, generator) {
generator.definitions_['import_mixgo_ce'] = "import mixgo_ce";
var code = 'mixgo_ce.get_temperature()';
return [code, generator.ORDER_ATOMIC];
}
//mpython onboard_sensor:
export const sensor_mpython_qmi8658_get_gyro = function (_, generator) {
var key = this.getFieldValue('key');
generator.definitions_['import_mpython_motion'] = 'from mpython import motion';
var code = 'motion.gyroscope()' + key;
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mpython_qmi8658_temperature = function (_, generator) {
generator.definitions_['import_mpython_motion'] = 'from mpython import motion';
return ['motion.temperature()', generator.ORDER_ATOMIC];
}
export const sensor_rm_pin_near_double = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var direction = this.getFieldValue('direction');
generator.definitions_['import_' + version + '_adc' + direction] = 'from ' + version + ' import adc' + direction;
var code = 'adc' + direction + '.read()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_rm_battery_left = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
if (version == 'feiyi') {
generator.definitions_['import_feiyi_onboard_bot51'] = 'from feiyi import onboard_bot51';
var code = 'onboard_bot51.read_bat()';
return [code, generator.ORDER_ATOMIC];
}
generator.definitions_['import_' + version + '_battery'] = 'from ' + version + ' import battery';
var code = 'battery.voltage()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_rm_acc = function (_, generator) {
var key = this.getFieldValue('key');
generator.definitions_['import_rm_e1_gyro'] = 'from rm_e1 import gyro';
var code = 'gyro.acceleration()' + key;
return [code, generator.ORDER_ATOMIC];
}
//car4.2
export const sensor_mixgocar_pin_near_line = function (_, generator) {
var key = this.getFieldValue('key');
generator.definitions_['import_mixgocar_c3_onboard_info'] = 'from mixgocar_c3 import onboard_info';
var code = 'onboard_info.patrol()' + key;
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgocar_pin_near = function (_, generator) {
var key = this.getFieldValue('key');
generator.definitions_['import_mixgocar_c3_onboard_info'] = 'from mixgocar_c3 import onboard_info';
var code = 'onboard_info.obstacle()' + key;
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgocar_pin_near_state_change = function (_, generator) {
var key = this.getFieldValue('key');
generator.definitions_['import_mixgocar_c3_onboard_info'] = 'from mixgocar_c3 import onboard_info';
var code = 'onboard_info.ir_mode(onboard_info.' + key + ')\n';
return code;
}
export const sensor_mixgocar_battery_left = function (_, generator) {
generator.definitions_['import_mixgocar_c3_onboard_info'] = 'from mixgocar_c3 import onboard_info';
var code = 'onboard_info.read_bat()';
return [code, generator.ORDER_ATOMIC];
}
//mixbot onboard_sensor below:
export const sensor_mixbot_patrol_calibrate = function (_, generator) {
var key = this.getFieldValue('key');
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_patrol'] = 'from ' + version + ' import patrol';
var code = 'patrol.correct(patrol.CORRECTING_' + key + ')\n';
return code;
}
export const sensor_mixbot_patrol_value = function (_, generator) {
var key = this.getFieldValue('key');
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_patrol'] = 'from ' + version + ' import patrol';
var code = 'patrol.getdata()' + key + '';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixbot_temperature = function (_, generator) {
generator.definitions_['import_mixbot_acc_gyr'] = "from mixbot import acc_gyr";
var code = 'acc_gyr.temperature()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixbot_get_gyro = function (_, generator) {
var key = this.getFieldValue('key');
generator.definitions_['import_mixbot_acc_gyr'] = "from mixbot import acc_gyr";
var code = 'acc_gyr.gyroscope()' + key;
return [code, generator.ORDER_ATOMIC];
}
export const sensor_bitbot_ALS = function (_, generator) {
generator.definitions_['import_feiyi_onboard_bot51'] = 'from feiyi import onboard_bot51';
var mode = generator.valueToCode(this, 'mode', generator.ORDER_ATOMIC);
var code = 'onboard_bot51.' + 'read_als(' + mode + ')';
return [code, generator.ORDER_ATOMIC];
}
export const bitbot_als_num = function (_, generator) {
var code = this.getFieldValue('PIN');
return [code, generator.ORDER_ATOMIC];
}
export const sensor_button_is_pressed = sensor_mixgo_button_is_pressed;
export const sensor_button_was_pressed = sensor_mixgo_button_was_pressed;
export const sensor_button_get_presses = sensor_mixgo_button_get_presses;
export const sensor_pin_pressed = sensor_mixgo_pin_pressed;
export const sensor_pin_near = sensor_mixgo_pin_near;
export const sensor_mixgo_light = sensor_LTR308;
export const sensor_light = sensor_mixgo_light;
export const dht11 = sensor_dht11;

View File

@@ -0,0 +1,126 @@
export const serial_print = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var dropdown_uart = this.getFieldValue('mode');
var content = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC) || '""'
var code = "uart" + dropdown_uart + ".write(str(" + content + "))\n";
return code;
}
export const serial_print_byte = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var dropdown_uart = this.getFieldValue('mode');
var content = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC) || '""'
var code = "uart" + dropdown_uart + ".write(" + content + ")\n";
return code;
}
export const serial_println = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var dropdown_uart = this.getFieldValue('mode');
var content = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC) || '""'
var code = "uart" + dropdown_uart + ".write(str(" + content + ")+'\\r\\n')\n";
return code;
}
export const serial_print_hex = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var dropdown_uart = this.getFieldValue('mode');
var dropdown_stat = this.getFieldValue('STAT');
var content = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC) || '0';
var code = "uart" + dropdown_uart + ".write(str(" + dropdown_stat + "(" + content + "))+'\\r\\n')\n";
return code;
}
export const serial_any = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var dropdown_uart = this.getFieldValue('mode');
var code = "uart" + dropdown_uart + ".any()";
return [code, generator.ORDER_ATOMIC];
}
export const serial_readstr = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var dropdown_uart = this.getFieldValue('mode');
var code = "uart" + dropdown_uart + ".read()";
return [code, generator.ORDER_ATOMIC];
}
export const serial_readline = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var dropdown_uart = this.getFieldValue('mode');
var code = "uart" + dropdown_uart + ".readline()";
return [code, generator.ORDER_ATOMIC];
}
export const serial_softserial = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var dropdown_uart = this.getFieldValue('mode')
var baudrate = this.getFieldValue('baudrate');
return "uart" + dropdown_uart + "=machine.UART(" + dropdown_uart + ", " + baudrate + ")\n";
}
export const serial_softserial_new = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var rx = generator.valueToCode(this, 'RX', generator.ORDER_ATOMIC);
var tx = generator.valueToCode(this, 'TX', generator.ORDER_ATOMIC);
var dropdown_uart = this.getFieldValue('mode')
var baudrate = this.getFieldValue('baudrate');
return "uart" + dropdown_uart + "=machine.UART(" + dropdown_uart + ", tx=" + tx + ", rx=" + rx + ", baudrate=" + baudrate + ")\n";
}
export const system_input = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""';
return ['input(' + str + ')', generator.ORDER_ATOMIC];
}
export const system_print = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""';
var code = "print(" + str + ")\n";
return code;
}
export const system_print_inline = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""';
var code = "print(" + str + ',end ="")\n';
return code;
}
export const system_print_end = function (_, generator) {
var str = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC) || '""';
var end = generator.valueToCode(this, 'END', generator.ORDER_ATOMIC) || '""';
var code = "print(" + str + ',end =' + end + ')\n';
return code;
}
export const system_print_many = function (_, generator) {
var code = new Array(this.itemCount_);
var default_value = '0';
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || default_value;
}
var code = 'print(' + code.join(', ') + ')\n';
return code;
}
export const serial_send_to_ai = function (_, generator) {
generator.definitions_['import_uart_com'] = 'import uart_com';
var dropdown_uart = this.getFieldValue('mode');
var dropdown_stat = this.getFieldValue('STAT');
var content = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC) || '0';
var code = "uart_com.send(uart" + dropdown_uart + ", " + content + ", repeat=" + dropdown_stat + ")\n";
return code;
}
export const serial_read_from_ai = function (_, generator) {
generator.definitions_['import_uart_com'] = 'import uart_com';
var dropdown_uart = this.getFieldValue('mode');
var code = "uart_com.recv(uart" + dropdown_uart + ")";
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,194 @@
import { Profile } from 'mixly';
export const system_run_in_background = function (_, generator) {
var branch = generator.statementToCode(this, 'do');
return 'control.inBackground(() => {\n' + branch + '})\n';
}
export const system_reset = function () {
return 'control.reset()\n';
}
export const system_wait = function (_, generator) {
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC) || Profile.default.serial;
return 'control.waitMicros(' + data + ')\n';
}
export const system_raise_event = function (_, generator) {
var source = generator.valueToCode(this, 'system_event_bus_source', generator.ORDER_ATOMIC) || Profile.default.serial;
var value = generator.valueToCode(this, 'system_event_bus_value', generator.ORDER_ATOMIC) || Profile.default.serial;
return 'control.raiseEvent(' + source + ', ' + value + ')\n';
}
export const system_on_event = function (_, generator) {
var source = generator.valueToCode(this, 'system_event_bus_source', generator.ORDER_ATOMIC) || Profile.default.serial;
var value = generator.valueToCode(this, 'system_event_bus_value', generator.ORDER_ATOMIC) || Profile.default.serial;
var branch = generator.statementToCode(this, 'do');
return 'control.onEvent(' + source + ', ' + value + ', () => {\n' + branch + ')\n';
}
export const system_timestamp = function (_, generator) {
return ['control.eventTimestamp()', generator.ORDER_ATOMIC];
}
export const system_value = function (_, generator) {
return ['control.eventValue()', generator.ORDER_ATOMIC];
}
export const system_event_bus_source = function (_, generator) {
return [this.getFieldValue('key'), generator.ORDER_ATOMIC];
}
export const system_event_bus_value = function (_, generator) {
return [this.getFieldValue('key'), generator.ORDER_ATOMIC];
}
export const system_device_name = function (_, generator) {
return ['control.deviceName()', generator.ORDER_ATOMIC];
}
export const system_device_serial_number = function (_, generator) {
return ['control.deviceSerialNumber()', generator.ORDER_ATOMIC];
}
//ok
export const Panic_with_status_code = function (_, generator) {
var status_code = generator.valueToCode(this, 'STATUS_CODE', generator.ORDER_ATOMIC) || '1000'
var code = 'panic(' + status_code + ')\n';
return code;
}
//ok
export const controls_millis = function (_, generator) {
generator.definitions_['import_time'] = 'import time';
var dropdown_time = this.getFieldValue('Time');
switch (dropdown_time) {
case "ms":
var code = 'time.ticks_ms()';
return [code, generator.ORDER_ATOMIC];
case "us":
var code = 'time.ticks_us()';
return [code, generator.ORDER_ATOMIC];
}
}
//ok
export const controls_end_program = function () {
return 'while True:\n pass\n';
}
//ok
export const reset = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
return 'reset()\n';
}
export const controls_uname = function (_, generator) {
generator.definitions_['import_os'] = 'import os';
return 'os.uname()';
}
export const controls_delay = function (_, generator) {
// generator.definitions_.import_time = "import time";
generator.definitions_['import_time'] = 'import time';
var delay_time = generator.valueToCode(this, 'DELAY_TIME', generator.ORDER_ATOMIC) || '1000'
var dropdown_time = this.getFieldValue('Time');
switch (dropdown_time) {
case "s":
var code = 'time.sleep(' + delay_time + ')\n';
return code;
case "ms":
var code = 'time.sleep_ms(' + delay_time + ')\n';
return code;
case "us":
var code = 'time.sleep_us(' + delay_time + ')\n';
return code;
}
}
export const controls_delay_new = function (_, generator) {
// generator.definitions_.import_time = "import time";
generator.definitions_['import_time'] = 'import time';
var delay_time = generator.valueToCode(this, 'DELAY_TIME', generator.ORDER_ATOMIC) || '1000'
var dropdown_time = this.getFieldValue('Time');
switch (dropdown_time) {
case "s":
var code = 'time.sleep(' + delay_time + ')\n';
return code;
case "ms":
var code = 'time.sleep_ms(' + delay_time + ')\n';
return code;
case "us":
var code = 'time.sleep_us(' + delay_time + ')\n';
return code;
}
}
export const timer = function (_, generator) {
generator.definitions_['import_mixgo'] = 'import mixgo';
var v = generator.valueToCode(this, "VAR", generator.ORDER_NONE) || "None";
var period = generator.valueToCode(this, "period", generator.ORDER_NONE) || "0";
var mode = generator.valueToCode(this, "mode", generator.ORDER_NONE) || "None";
var callback = generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None";
// var callback = generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None";
var code = v + ".init(period = " + period + ", mode = Timer." + mode + ", callback = " + callback + ")\n";
return code;
}
export const system_timer = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var v = generator.valueToCode(this, "VAR", generator.ORDER_NONE) || "None";
var period = generator.valueToCode(this, "period", generator.ORDER_NONE) || "0";
var mode = this.getFieldValue('mode');
//var branch = generator.statementToCode(this, 'callback') || generator.PASS;
var callback = generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None";
//var code = v + ".init(period = " + period + ", mode = machine.Timer." + mode + ", callback = " + v + "_callback_func)\n";
//generator.setups_['timer_callback_func'] = 'def ' + v + '_callback_func(t):\n' + branch + '\n';
var code = v + ".init(period = " + period + ", mode = machine.Timer." + mode + ", callback = " + callback + ")\n";
return code;
}
export const system_ticks_diff = function (_, generator) {
generator.definitions_['import_time'] = 'import time';
var end = generator.valueToCode(this, "END", generator.ORDER_NONE) || "0";
var start = generator.valueToCode(this, "START", generator.ORDER_NONE) || "0";
var code = "time.ticks_diff(" + end + ", " + start + ")";
return [code, generator.ORDER_ATOMIC];
}
export const system_timer_init = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
generator.definitions_['import_machine'] = 'import machine';
var code = v + ' = machine.Timer(0)\n';
return code;
}
export const system_wdt_init = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var period = generator.valueToCode(this, "period", generator.ORDER_NONE) || "0";
var code = 'wdt = machine.WDT(timeout= ' + period + ')\n';
return code;
}
export const system_wdt_feed = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var code = 'wdt.feed()\n';
return code;
}
export const system_machine_reset = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var code = 'machine.reset()\n';
return code;
}
export const system_bitbot_shutdown = function (_, generator) {
generator.definitions_['import_bitbot_onboard_bot51'] = 'from bitbot import onboard_bot51';
var code = 'onboard_bot51.shutdown()\n';
return code;
}
export const Timer_init = system_timer_init;
export const timer2 = system_timer;
export const time_ticks_diff = system_ticks_diff;
export const base_delay = controls_delay;

View File

@@ -0,0 +1,27 @@
export const WEATHER_NOW = function (_, generator) {
generator.definitions_['import_seniverse_api'] = "import seniverse_api";
var dropdown_mode = this.getFieldValue('mode');
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var addr = generator.valueToCode(this, 'addr', generator.ORDER_ATOMIC);
var code = 'seniverse_api.' + dropdown_mode + '(' + key + ',' + addr + ')';
return [code, generator.ORDER_ATOMIC];
}
export const WEATHER_DAILY = function (_, generator) {
generator.definitions_['import_seniverse_api'] = "import seniverse_api";
var dropdown_mode = this.getFieldValue('mode');
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var addr = generator.valueToCode(this, 'addr', generator.ORDER_ATOMIC);
var day = generator.valueToCode(this, 'day', generator.ORDER_ATOMIC);
var code = 'seniverse_api.' + dropdown_mode + '(' + key + ',' + addr + ',' + day + ')';
return [code, generator.ORDER_ATOMIC];
}
export const WEATHER_HOUR = function (_, generator) {
generator.definitions_['import_seniverse_api'] = "import seniverse_api";
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var addr = generator.valueToCode(this, 'addr', generator.ORDER_ATOMIC);
var hour = generator.valueToCode(this, 'hour', generator.ORDER_ATOMIC);
var code = 'seniverse_api.weather_hourly(' + key + ',' + addr + ',' + hour + ')';
return [code, generator.ORDER_ATOMIC];
}

View File

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,56 @@
#ADXL345
import time
import ustruct
from micropython import const
DATA_FORMAT = const(0x31)
BW_RATE = const(0x2c)
POWER_CTL = const(0x2d)
INT_ENABLE = const(0x2E)
OFSX = const(0x1e)
OFSY = const(0x1f)
OFSZ = const(0x20)
class ADXL345:
def __init__(self, i2c, address=0X53):
self._device = i2c
self._address = address
for addr in self._device.scan():
if self._device.readfrom_mem(addr, 0, 1)[0] == 0xe5:
self._address = addr
break
else:
raise AttributeError("Cannot find a ADXL345")
self._wreg(DATA_FORMAT,0x2B) #16g量程
self._wreg(BW_RATE,0x0A) #数据输出速度为100Hz
self._wreg(INT_ENABLE,0x00) #不使用中断
self._wreg(OFSX,0x00)
self._wreg(OFSY,0x00)
self._wreg(OFSZ,0x00)
self._wreg(POWER_CTL,0x08) #链接使能,测量模式
time.sleep(0.5)
def readXYZ(self):
x, = ustruct.unpack('<h', self._rreg(0x32,2))
y, = ustruct.unpack('<h', self._rreg(0x34,2))
z, = ustruct.unpack('<h', self._rreg(0x36,2))
return (x/256,y/256,z/256)
def readX(self):
return self.readXYZ()[0]
def readY(self):
return self.readXYZ()[1]
def readZ(self):
return self.readXYZ()[2]
def _wreg(self, reg, val):
'''Write memory address'''
self._device.writeto_mem(self._address,reg,val.to_bytes(1, 'little'))
def _rreg(self, reg,nbytes=1):
'''Read memory address'''
return self._device.readfrom_mem(self._address, reg, nbytes)[0] if nbytes<=1 else self._device.readfrom_mem(self._address, reg, nbytes)[0:nbytes]

View File

@@ -0,0 +1,88 @@
"""
AHT21
Micropython library for the AHT21(temperature,humidity)
=======================================================
#Changed from circuitpython to micropython 20220211
#Format unified 20220623
dahanzimin From the Mixly Team
"""
import utime
from micropython import const
AHTX0_I2CADDR_DEFAULT = const(0x38) # Default I2C address
AHTX0_CMD_INITIALIZE = const(0xE1) # Initialization command
AHTX0_CMD_TRIGGER = const(0xAC) # Trigger reading command
AHTX0_CMD_SOFTRESET = const(0xBA) # Soft reset command
AHTX0_STATUS_BUSY = const(0x80) # Status bit for busy
AHTX0_STATUS_CALIBRATED = const(0x08) # Status bit for calibrated
class AHTx0:
"""Interface library for AHT10/AHT20 temperature+humidity sensors"""
def __init__(self, i2c, address=AHTX0_I2CADDR_DEFAULT):
utime.sleep_ms(20) # 20ms delay to wake up
self._i2c = i2c
self._address = address
self._buf = bytearray(6)
self.reset()
if not self.initialize():
raise AttributeError("Cannot find a AHTx0")
self._temp = None
self._humidity = None
def reset(self):
"""Perform a soft-reset of the AHT"""
self._buf[0] = AHTX0_CMD_SOFTRESET
self._i2c.writeto(self._address, self._buf[0:1])
utime.sleep_ms(20) # 20ms delay to wake up
def initialize(self):
"""Ask the sensor to self-initialize. Returns True on success, False otherwise"""
self._buf[0] = AHTX0_CMD_INITIALIZE
self._buf[1] = 0x08
self._buf[2] = 0x00
self._i2c.writeto(self._address, self._buf[0:3])
self._wait_for_idle()
if not self.status() & AHTX0_STATUS_CALIBRATED:
return False
return True
def status(self):
"""The status byte initially returned from the sensor, see datasheet for details"""
self._read_to_buffer()
return self._buf[0]
def _read_to_buffer(self):
self._i2c.readfrom_into(self._address, self._buf)
def _trigger_measurement(self):
"""Internal function for triggering the AHT to read temp/humidity"""
self._buf[0] = AHTX0_CMD_TRIGGER
self._buf[1] = 0x33
self._buf[2] = 0x00
self._i2c.writeto(self._address, self._buf[0:3])
def _wait_for_idle(self):
while self.status() & AHTX0_STATUS_BUSY:
utime.sleep_ms(5)
def _perform_measurement(self):
self._trigger_measurement()
self._wait_for_idle()
self._read_to_buffer()
def humidity(self):
"""The measured relative humidity in percent."""
self._perform_measurement()
self._humidity = (self._buf[1] << 12) | (self._buf[2] << 4) | (self._buf[3] >> 4)
self._humidity = (self._humidity * 100) / 0x100000
return self._humidity
def temperature(self):
"""The measured temperature in degrees Celcius."""
self._perform_measurement()
self._temp = ((self._buf[3] & 0xF) << 16) | (self._buf[4] << 8) | self._buf[5]
self._temp = ((self._temp * 200.0) / 0x100000) - 50
return self._temp

View File

@@ -0,0 +1,59 @@
"""
AP3216C
MicroPython library for the AP3216C(ALS,PS,IRS)
=======================================================
#Preliminary composition 20240630
@dahanzimin From the Mixly Team
"""
import time
from micropython import const
AP3216_ADD = const(0x1E)
AP_SYS_CMD = const(0x00)
AP_DAT = const(0x0A)
AP_ALS_CMD = const(0x10)
AP_PS_CMD = const(0x20)
AP_PS_LED = const(0x21)
Resolution = 0.35
class AP3216C:
def __init__(self, i2c_bus, addr=AP3216_ADD):
self._device = i2c_bus
self._address = addr
self._wreg(AP_SYS_CMD, 0x04) # SW reset
time.sleep_ms(100)
self._wreg(AP_SYS_CMD, 0x03) # 011: ALS and PS+IR functions active
self._wreg(AP_ALS_CMD, 0x00) # Range 1: 0 ~ 20661 Lux. Resolution = 0.35 lux/count.
self._wreg(AP_PS_CMD, 0x09) # PS gain:10
self._wreg(AP_PS_LED, 0x23) # PS LED pulse:10
def _wreg(self, reg, val):
'''Write memory address'''
self._device.writeto_mem(self._address,reg,val.to_bytes(1, 'little'))
def _rreg(self, reg, nbytes=1):
'''Read memory address'''
return self._device.readfrom_mem(self._address, reg, nbytes)[0] if nbytes<=1 else self._device.readfrom_mem(self._address, reg, nbytes)[0:nbytes]
@property
def getdata(self):
'''处理获取数据'''
#buf = self._rreg(AP_DAT, 6)
ir = (self._rreg(AP_DAT + 0) & 0x03) | self._rreg(AP_DAT + 1) << 2
als= (self._rreg(AP_DAT + 2) | self._rreg(AP_DAT + 3) << 8) * Resolution
ps = (self._rreg(AP_DAT + 4) & 0x0F) | (self._rreg(AP_DAT + 5) & 0x3F) << 4
return round(als, 2), ir, ps
def als_vis(self):
'''可见光Lux'''
return self.getdata[0]
def als_ir(self):
'''红外Lux'''
return self.getdata[1]
def ps_nl(self):
'''接近距离'''
return self.getdata[2]

View File

@@ -0,0 +1,294 @@
"""
APDS9960`
MicroPython library for the APDS9960(Supports gesture, proximity, and color detection)
=======================================================
#Preliminary composition 20220224
#base on https://github.com/adafruit/Adafruit_CircuitPython_BusDevice 20220623
dahanzimin From the Mixly Team
"""
import time
from micropython import const
_DEVICE_ID = const(0xAB)
_APDS9960_ENABLE = const(0x80)
_APDS9960_ATIME = const(0x81)
_APDS9960_PILT = const(0x89)
_APDS9960_PIHT = const(0x8B)
_APDS9960_PERS = const(0x8C)
_APDS9960_CONTROL = const(0x8F)
_APDS9960_ID = const(0x92)
_APDS9960_STATUS = const(0x93)
_APDS9960_CDATAL = const(0x94)
_APDS9960_PDATA = const(0x9C)
_APDS9960_GPENTH = const(0xA0)
_APDS9960_GEXTH = const(0xA1)
_APDS9960_GCONF1 = const(0xA2)
_APDS9960_GCONF2 = const(0xA3)
_APDS9960_GPULSE = const(0xA6)
_APDS9960_GCONF4 = const(0xAB)
_APDS9960_GFLVL = const(0xAE)
_APDS9960_GSTATUS = const(0xAF)
_APDS9960_AICLEAR = const(0xE7)
_APDS9960_GFIFO_U = const(0xFC)
_BIT_MASK_ENABLE_EN = const(0x01)
_BIT_MASK_ENABLE_COLOR = const(0x02)
_BIT_MASK_ENABLE_PROX = const(0x04)
_BIT_MASK_ENABLE_PROX_INT = const(0x20)
_BIT_MASK_ENABLE_GESTURE = const(0x40)
_BIT_MASK_STATUS_AVALID = const(0x01)
_BIT_MASK_STATUS_GINT = const(0x04)
_BIT_MASK_GSTATUS_GFOV = const(0x02)
_BIT_MASK_GCONF4_GFIFO_CLR = const(0x04)
_BIT_POS_PERS_PPERS = const(4)
_BIT_MASK_PERS_PPERS = const(0xF0)
_BIT_POS_CONTROL_AGAIN = const(0)
_BIT_MASK_CONTROL_AGAIN = const(3)
_BIT_POS_CONTROL_PGAIN = const(2)
_BIT_MASK_CONTROL_PGAIN = const(0x0C)
_BIT_POS_GCONF2_GGAIN = const(5)
_BIT_MASK_GCONF2_GGAIN = const(0x60)
class APDS9960:
def __init__(self, i2c, address=0x39):
self._device = i2c
self._address = address
self._select = [True,True,True]
if self._rreg(_APDS9960_ID) != _DEVICE_ID:
raise AttributeError("Cannot find a APDS9960")
self.enable(True) # Re-enable sensor and wait 10ms for the power on delay to finish
time.sleep(0.010)
self._wreg(_APDS9960_GPENTH, 0x05) # Enter gesture engine at >= 5 proximity counts
self._wreg(_APDS9960_GEXTH, 0x1E) # Exit gesture engine if all counts drop below 30
self._wreg(_APDS9960_GCONF1, 0x82) # GEXPERS: 2 (4 cycles), GEXMSK: 0 (default) GFIFOTH: 2 (8 datasets)
self._wreg(_APDS9960_GCONF2, 0x41) # GGAIN: 2 (4x), GLDRIVE: 100 mA (default), GWTIME: 1 (2.8ms)
self._wreg(_APDS9960_GPULSE, 0x85) # GPULSE: 5 (6 pulses), GPLEN: 2 (16 us)
self.color_integration_time(256) # ATIME: 256 (712ms color integration time, max count of 65535)
# method for reading and writing to I2C
def _wreg(self, reg, val):
'''Write memory address'''
self._device.writeto_mem(self._address,reg,val.to_bytes(1, 'little'))
def _writecmdonly(self, val):
"""Writes a command and 0 bytes of data to the I2C device"""
self._device.writeto(self._address,val.to_bytes(1, 'little'))
def _rreg(self, reg,nbytes=1):
'''Read memory address'''
return self._device.readfrom_mem(self._address, reg, nbytes)[0] if nbytes<=1 else self._device.readfrom_mem(self._address, reg, nbytes)[0:nbytes]
def _get_bit(self, reg, mask):
"""Gets a single bit value from the I2C device's register"""
return bool(self._rreg(reg) & mask)
def _set_bit(self, reg, mask, value):
"""Sets a single bit value in the I2C device's register"""
buf=self._rreg(reg)
buf= buf | mask if value else buf & ~mask
self._wreg(reg,buf)
def _set_bits(self, reg, pos, mask, value):
"""Sets a multi-bit value in the I2C device's register"""
buf=self._rreg(reg)
buf = (buf & ~mask) | (value << pos)
self._wreg(reg,buf)
def _color_data16(self, reg):
"""Sends a command and reads 2 bytes of data from the I2C device"""
buf = self._rreg(reg,2)
return buf[1] << 8 | buf[0]
def enable(self, value):
"""sensor is enabled"""
self._set_bit(_APDS9960_ENABLE, _BIT_MASK_ENABLE_EN, value)
def enable_proximity(self, value):
"""sensor's proximity engine is enabled."""
self._set_bit(_APDS9960_ENABLE, _BIT_MASK_ENABLE_PROX, value)
def proximity_gain(self, value):
"""""Proximity sensor gain value"""
# proximity_gain" "Gain Multiplier" "Note"
# 0, "1x", "Power-on Default"
# 1, "2x", ""
# 2, "4x", ""
# 3, "8x", ""
self._set_bits(_APDS9960_CONTROL, _BIT_POS_CONTROL_PGAIN, _BIT_MASK_CONTROL_PGAIN, value)
def enable_gesture(self, value):
"""sensor's gesture engine is enabled"""
self._set_bit(_APDS9960_ENABLE, _BIT_MASK_ENABLE_GESTURE, value)
def gesture_gain(self, value):
"""Gesture mode gain value"""
# "gesture_gain" "Gain Multiplier" "Note"
# 0, "1x", "Power-on Default"
# 1, "2x", ""
# 2, "4x", "Driver Default"
# 3, "8x", ""
self._set_bits(_APDS9960_GCONF2, _BIT_POS_GCONF2_GGAIN, _BIT_MASK_GCONF2_GGAIN, value)
def enable_color(self, value):
"""sensor's color/light engine is enabled"""
self._set_bit(_APDS9960_ENABLE, _BIT_MASK_ENABLE_COLOR, value)
def color_gain(self, value):
"""Color/light sensor gain value"""
# "color_gain" "Gain Multiplier" "Note"
# 0, "1x", "Power-on Default"
# 1, "4x", "Driver Default"
# 2, "16x", ""
# 3, "64x", ""
self._set_bits(_APDS9960_CONTROL, _BIT_POS_CONTROL_AGAIN, _BIT_MASK_CONTROL_AGAIN, value)
def color_integration_time(self, value):
"""Color/light sensor gain"""
# "color_integration_time" "Time" "Max Count" "Note"
# 1, "2.78 ms", 1025, "Power-on Default"
# 10, "27.8 ms", 10241, ""
# 37, "103 ms", 37889, ""
# 72, "200 ms", 65535, ""
# 256, "712 ms", 65535, "Driver Default"
self._wreg(_APDS9960_ATIME, 256 - value)
## PROXIMITY
def proximity(self,gain=2):
"""Proximity sensor data"""
if self._select[0]:
self._select=[False,True,True]
self.enable_proximity(True)
self.enable_gesture(False)
self.enable_color(False)
self.proximity_gain(gain)
return self._rreg(_APDS9960_PDATA)
## GESTURE
def gesture(self,gain=3):
"""Gesture sensor data"""
# If FIFOs have overflowed we're already way too late, so clear those FIFOs and wait
if self._select[1]:
self._select=[True,False,True]
self.enable_proximity(True)
self.enable_gesture(True)
self.enable_color(False)
self.gesture_gain(gain)
if self._get_bit(_APDS9960_GSTATUS, _BIT_MASK_GSTATUS_GFOV):
self._set_bit(_APDS9960_GCONF4, _BIT_MASK_GCONF4_GFIFO_CLR, True)
wait_cycles = 0
while ( not self._get_bit(_APDS9960_STATUS, _BIT_MASK_STATUS_GINT) and wait_cycles <= 30 ):
time.sleep(0.003)
wait_cycles += 1
frame = []
datasets_available = self._rreg(_APDS9960_GFLVL)
if (self._get_bit(_APDS9960_STATUS, _BIT_MASK_STATUS_GINT) and datasets_available > 0 ):
buffer = bytearray(128)
buffer_dataset = bytearray(4)
while True:
dataset_count = self._rreg(_APDS9960_GFLVL)
if dataset_count == 0:
break
buffer=self._rreg(_APDS9960_GFIFO_U,min(128, 1 + (dataset_count * 4)))
# Unpack data stream into more usable U/D/L/R datasets for analysis
idx = 0
for i in range(dataset_count):
idx = i * 4
buffer_dataset[0] = buffer[idx]
buffer_dataset[1] = buffer[idx + 1]
buffer_dataset[2] = buffer[idx + 2]
buffer_dataset[3] = buffer[idx + 3]
if ((not all(val == 255 for val in buffer_dataset))
and (not all(val == 0 for val in buffer_dataset))
and (all(val >= 30 for val in buffer_dataset))
):
if len(frame) < 2:
frame.append(tuple(buffer_dataset))
else:
frame[1] = tuple(buffer_dataset)
time.sleep(0.03)
if len(frame) < 2:
return None
# Determine our up/down and left/right ratios along with our first/last deltas
f_r_ud = ((frame[0][0] - frame[0][1]) * 100) // (frame[0][0] + frame[0][1])
f_r_lr = ((frame[0][2] - frame[0][3]) * 100) // (frame[0][2] + frame[0][3])
l_r_ud = ((frame[1][0] - frame[1][1]) * 100) // (frame[1][0] + frame[1][1])
l_r_lr = ((frame[1][2] - frame[1][3]) * 100) // (frame[1][2] + frame[1][3])
delta_ud = l_r_ud - f_r_ud
delta_lr = l_r_lr - f_r_lr
# Make our first guess at what gesture we saw, if any
state_ud = 0
state_lr = 0
if delta_ud >= 30:
state_ud = 1
elif delta_ud <= -30:
state_ud = -1
if delta_lr >= 30:
state_lr = 1
elif delta_lr <= -30:
state_lr = -1
# Make our final decision based on our first guess and, if required, the delta data
gesture_found = 0
# Easy cases
if state_ud == -1 and state_lr == 0:
gesture_found = 1
elif state_ud == 1 and state_lr == 0:
gesture_found = 2
elif state_ud == 0 and state_lr == -1:
gesture_found = 3
elif state_ud == 0 and state_lr == 1:
gesture_found = 4
# Not so easy cases
if gesture_found == 0:
if state_ud == -1 and state_lr == 1:
if abs(delta_ud) > abs(delta_lr):
gesture_found = 1
else:
gesture_found = 4
elif state_ud == 1 and state_lr == -1:
if abs(delta_ud) > abs(delta_lr):
gesture_found = 2
else:
gesture_found = 3
elif state_ud == -1 and state_lr == -1:
if abs(delta_ud) > abs(delta_lr):
gesture_found = 1
else:
gesture_found = 3
elif state_ud == 1 and state_lr == 1:
if abs(delta_ud) > abs(delta_lr):
gesture_found = 2
else:
gesture_found = 3
dir_lookup = [None,"left", "right", "down", "up"]
return dir_lookup[gesture_found]
## COLOR
def color(self,gain=1):
"""Tuple containing red, green, blue, and clear light intensity values"""
if self._select[2]:
self._select=[True,True,False]
self.enable_proximity(False)
self.enable_gesture(False)
self.enable_color(True)
self.color_gain(gain)
while not self._get_bit(_APDS9960_STATUS, _BIT_MASK_STATUS_AVALID):
time.sleep(0.005) #"""Color data ready flag"""
return (
self._color_data16(_APDS9960_CDATAL + 2),
self._color_data16(_APDS9960_CDATAL + 4),
self._color_data16(_APDS9960_CDATAL + 6),
self._color_data16(_APDS9960_CDATAL),
)

View File

@@ -0,0 +1,114 @@
"""
Baidu ASR API
MicroPython library for Baidu ASR API
=======================================================
#Preliminary composition 20230223
#https://ai.baidu.com/ai-doc/SPEECH/Ek39uxgre
#https://ai.baidu.com/unit/home#/home
@dahanzimin From the Mixly Team
"""
import json,gc
import urequests,array
from ubinascii import hexlify
from machine import Timer,unique_id
'''Set constant'''
_framerate=8000
_unique_id=hexlify(unique_id()).decode()
def urequests_api(method, url, **kw):
'''Request data'''
try:
return json.loads(urequests.request(method, url, **kw).text)
except Exception as e:
raise RuntimeError("API request failed or WiFi is not connected",e)
def fetch_token(API_Key,Secret_Key):
"""Get access_token"""
url='http://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={}&client_secret={}'.format(API_Key,Secret_Key)
results=urequests_api("GET",url)
if "error_description" in results.keys():
raise ValueError(results["error_description"])
if "access_token" in results.keys():
return results["access_token"]
class Recorder:
def __init__(self, adc,timer=2):
self._timer=Timer(timer)
self._mic=adc
def _timer_callback(self,timer):
'''Timer callback read microphone'''
try:
_mic=self._mic.read_u16()-32768
self._pcm_buffer.append(_mic &0xFF)
self._pcm_buffer.append(_mic >>8)
self._record_time-=1
except:
print("Warning: MemoryError!")
self._pcm_buffer=bytearray()
gc.collect()
self._record_time=0
def record(self,record_time=1):
"""Call timer to record audio"""
self._pcm_buffer=bytearray()
gc.collect()
self._record_time=record_time*_framerate
self._timer.init(freq =_framerate, mode = Timer.PERIODIC, callback = self._timer_callback)
while True:
if self._record_time <= 0:
self._timer.deinit()
gc.collect()
return self._pcm_buffer
class ASR(Recorder):
def __init__(self, adc, API_Key, Secret_Key, timer=2):
self._token=fetch_token(API_Key,Secret_Key)
super().__init__(adc,timer)
def recognize(self,record_time=1,dev_pid=1537):
"""Access API to get voice results"""
pcm_buffer=self.record(record_time)
if max(pcm_buffer)>=250:
url='http://vop.baidu.com/server_api?dev_pid={}&cuid={}&token={}'.format(dev_pid,_unique_id,self._token)
headers = {'Content-Type': 'audio/pcm; rate={}'.format(_framerate)}
results=urequests_api("POST",url,data=pcm_buffer,headers=headers)
if results["err_no"] != 0:
raise ValueError(results["err_msg"],results["err_no"])
elif results["err_msg"] == "success.":
gc.collect()
return results["result"][0]
else:
return ''
class UNIT:
def __init__(self, API_Key, Secret_Key):
self._token=fetch_token(API_Key,Secret_Key)
self._session_id=""
def chatbot(self,chatbot_id,query):
"""Access API to intelligent dialog"""
if len(query) > 0:
url='https://aip.baidubce.com/rpc/2.0/unit/service/v3/chat?access_token={}'.format(self._token)
data={"log_id":"log"+_unique_id,
"version":"3.0",
"service_id":chatbot_id,
"session_id":self._session_id,
"request":{"query":query,"terminal_id":_unique_id}}
headers = {"content-type": "application/json"}
results=urequests_api("POST",url,data=json.dumps(data).encode(),headers=headers)
if results["error_code"] != 0:
raise ValueError(results["error_msg"],results["error_code"])
elif results["error_msg"] == "success":
self._session_id=results["result"]['session_id']
gc.collect()
return results["result"]['responses'][0]['actions'][0]['say']
else:
return ''
gc.collect()

View File

@@ -0,0 +1,79 @@
# Helpers for generating BLE advertising payloads.
from micropython import const
import struct
import bluetooth
# Advertising payloads are repeated packets of the following form:
# 1 byte data length (N + 1)
# 1 byte type (see constants below)
# N bytes type-specific data
_ADV_TYPE_FLAGS = const(0x01)
_ADV_TYPE_NAME = const(0x09)
_ADV_TYPE_UUID16_COMPLETE = const(0x3)
_ADV_TYPE_UUID32_COMPLETE = const(0x5)
_ADV_TYPE_UUID128_COMPLETE = const(0x7)
_ADV_TYPE_UUID16_MORE = const(0x2)
_ADV_TYPE_UUID32_MORE = const(0x4)
_ADV_TYPE_UUID128_MORE = const(0x6)
_ADV_TYPE_APPEARANCE = const(0x19)
# Generate a payload to be passed to gap_advertise(adv_data=...).
def advertising_payload(limited_disc=False, br_edr=False, name=None, services=None, appearance=0):
payload = bytearray()
def _append(adv_type, value):
nonlocal payload
payload += struct.pack("BB", len(value) + 1, adv_type) + value
_append(
_ADV_TYPE_FLAGS,
struct.pack("B", (0x01 if limited_disc else 0x02) + (0x18 if br_edr else 0x04)),
)
if name:
_append(_ADV_TYPE_NAME, name.encode())
if services:
for uuid in services:
b = bytes(uuid)
if len(b) == 2:
_append(_ADV_TYPE_UUID16_COMPLETE, b)
elif len(b) == 4:
_append(_ADV_TYPE_UUID32_COMPLETE, b)
elif len(b) == 16:
_append(_ADV_TYPE_UUID128_COMPLETE, b)
# See org.bluetooth.characteristic.gap.appearance.xml
if appearance:
_append(_ADV_TYPE_APPEARANCE, struct.pack("<h", appearance))
return payload
def decode_field(payload, adv_type):
i = 0
result = []
while i + 1 < len(payload):
if payload[i + 1] == adv_type:
result.append(payload[i + 2 : i + payload[i] + 1])
i += 1 + payload[i]
return result
def decode_name(payload):
n = decode_field(payload, _ADV_TYPE_NAME)
return str(n[0], "utf-8") if n else ""
def decode_services(payload):
services = []
for u in decode_field(payload, _ADV_TYPE_UUID16_COMPLETE):
services.append(bluetooth.UUID(struct.unpack("<h", u)[0]))
for u in decode_field(payload, _ADV_TYPE_UUID32_COMPLETE):
services.append(bluetooth.UUID(struct.unpack("<d", u)[0]))
for u in decode_field(payload, _ADV_TYPE_UUID128_COMPLETE):
services.append(bluetooth.UUID(u))
return services

View File

@@ -0,0 +1,217 @@
"""
Bluetooth-Central
Micropython library for the Bluetooth-Central
=======================================================
#Preliminary composition 20221018
#https://github.com/micropython/micropython/tree/master/examples/bluetooth
dahanzimin From the Mixly Team
"""
import time,gc
import bluetooth
from micropython import const
from ubinascii import hexlify,unhexlify
from ble_advertising import decode_services, decode_name
_IRQ_CENTRAL_CONNECT = const(1)
_IRQ_CENTRAL_DISCONNECT = const(2)
_IRQ_GATTS_WRITE = const(3)
_IRQ_GATTS_READ_REQUEST = const(4)
_IRQ_SCAN_RESULT = const(5)
_IRQ_SCAN_DONE = const(6)
_IRQ_PERIPHERAL_CONNECT = const(7)
_IRQ_PERIPHERAL_DISCONNECT = const(8)
_IRQ_GATTC_SERVICE_RESULT = const(9)
_IRQ_GATTC_SERVICE_DONE = const(10)
_IRQ_GATTC_CHARACTERISTIC_RESULT = const(11)
_IRQ_GATTC_CHARACTERISTIC_DONE = const(12)
_IRQ_GATTC_DESCRIPTOR_RESULT = const(13)
_IRQ_GATTC_DESCRIPTOR_DONE = const(14)
_IRQ_GATTC_READ_RESULT = const(15)
_IRQ_GATTC_READ_DONE = const(16)
_IRQ_GATTC_WRITE_DONE = const(17)
_IRQ_GATTC_NOTIFY = const(18)
_IRQ_GATTC_INDICATE = const(19)
_ADV_IND = const(0x00)
_ADV_DIRECT_IND = const(0x01)
_ADV_SCAN_IND = const(0x02)
_ADV_NONCONN_IND = const(0x03)
_UART_SERVICE_UUID = bluetooth.UUID(0x1101)
_UART_RX_CHAR_UUID = bluetooth.UUID("6E400002-B5A3-F393-E0A9-E50E24DCCA9E")
_UART_TX_CHAR_UUID = bluetooth.UUID("6E400003-B5A3-F393-E0A9-E50E24DCCA9E")
class BLESimpleCentral:
def __init__(self):
self._ble = bluetooth.BLE()
self._scan_flg = True
self._ble.active(True)
self._ble.irq(self._irq)
self._reset()
self.scan()
def _reset(self):
# Cached name and address from a successful scan.
self._name = None
self._addr_type = None
self._addr = None
# Callbacks for completion of various operations.
# These reset back to None after being invoked.
self._conn_callback = None
self._read_callback = None
# Persistent callback for when new data is notified from the device.
self._notify_callback = None
self._write_data=None
# Connected device.
self._conn_handle = None
self._start_handle = None
self._end_handle = None
self._tx_handle = None
self._rx_handle = None
def _irq(self, event, data):
if event == _IRQ_SCAN_RESULT:
addr_type, addr, adv_type, rssi, adv_data = data
if adv_type in (_ADV_IND, _ADV_DIRECT_IND) and _UART_SERVICE_UUID in decode_services(adv_data):
# Found a potential device, remember it and stop scanning.
self._addr_type = addr_type
self._addr = bytes(addr) # Note: addr buffer is owned by caller so need to copy it.
self._name = decode_name(adv_data) or "?"
if self._addr in self._info[2]:
self._ble.gap_scan(None)
else:
self._info[0].append(self._name)
self._info[1].append(self._addr_type)
self._info[2].append(self._addr)
self._info[3].append(rssi)
elif event == _IRQ_SCAN_DONE:
self._scan_flg = False
elif event == _IRQ_PERIPHERAL_CONNECT:
# Connect successful.
conn_handle, addr_type, addr = data
if addr_type == self._addr_type and addr == self._addr:
self._conn_handle = conn_handle
self._ble.gattc_discover_services(self._conn_handle)
elif event == _IRQ_PERIPHERAL_DISCONNECT:
# Disconnect (either initiated by us or the remote end).
conn_handle, _, _ = data
if conn_handle == self._conn_handle:
# If it was initiated by us, it'll already be reset.
self._reset()
elif event == _IRQ_GATTC_SERVICE_RESULT:
# Connected device returned a service.
conn_handle, start_handle, end_handle, uuid = data
print("service", data)
if conn_handle == self._conn_handle and uuid == _UART_SERVICE_UUID:
self._start_handle, self._end_handle = start_handle, end_handle
elif event == _IRQ_GATTC_SERVICE_DONE:
# Service query complete.
if self._start_handle and self._end_handle:
self._ble.gattc_discover_characteristics(
self._conn_handle, self._start_handle, self._end_handle
)
else:
print("Failed to find uart service.")
elif event == _IRQ_GATTC_CHARACTERISTIC_RESULT:
# Connected device returned a characteristic.
conn_handle, def_handle, value_handle, properties, uuid = data
if conn_handle == self._conn_handle and uuid == _UART_RX_CHAR_UUID:
self._rx_handle = value_handle
if conn_handle == self._conn_handle and uuid == _UART_TX_CHAR_UUID:
self._tx_handle = value_handle
elif event == _IRQ_GATTC_CHARACTERISTIC_DONE:
# Characteristic query complete.
if self._tx_handle is not None and self._rx_handle is not None:
# We've finished connecting and discovering device, fire the connect callback.
if self._conn_callback:
self._conn_callback()
else:
print("Failed to find uart rx characteristic.")
elif event == _IRQ_GATTC_WRITE_DONE:
conn_handle, value_handle, status = data
print("TX complete")
elif event == _IRQ_GATTC_NOTIFY:
conn_handle, value_handle, notify_data = data
if conn_handle == self._conn_handle and value_handle == self._tx_handle:
try:
self._write_data=bytes(notify_data).decode().strip()
except:
self._write_data=bytes(notify_data)
if self._notify_callback:
self._notify_callback(self._write_data)
# Returns true if we've successfully connected and discovered characteristics.
def is_connected(self):
return (self._conn_handle is not None and self._tx_handle is not None and self._rx_handle is not None)
# Find a device advertising the environmental sensor service.
def scan(self):
self._info = [[],[],[],[]]
self._ble.gap_scan(10000, 30000, 30000)
while self._scan_flg:
time.sleep_ms(10)
self._scan_flg = True
info=[]
for i in range(len(self._info[0])):
info.append([self._info[0][i],self._info[1][i],hexlify(self._info[2][i]).decode(),self._info[3][i]])
return info
# Connect to the specified device (otherwise use cached address from a scan).
def connect(self, name=None,mac=None, callback=None):
if mac and unhexlify(mac) in self._info[2]:
index=self._info[2].index(unhexlify(mac))
self._addr_type=self._info[1][index]
self._addr=unhexlify(mac)
elif name and name in self._info[0]:
index=self._info[0].index(name)
self._addr_type=self._info[1][index]
self._addr=self._info[2][index]
else:
raise ValueError("Bluetooth was not found")
self._conn_callback = callback
self._ble.gap_connect(self._addr_type, self._addr)
return True
# Disconnect from current device.
def disconnect(self):
if not self._conn_handle:
return
self._ble.gap_disconnect(self._conn_handle)
self._reset()
gc.collect()
# Send data over the UART
def send(self, v, response=False):
if not self.is_connected():
return
self._ble.gattc_write(self._conn_handle, self._rx_handle, v, 1 if response else 0)
# Set handler for when data is received over the UART.
def recv(self, callback= None):
if callback:
self._notify_callback = callback
else:
write_data=self._write_data
self._write_data=None
return write_data
@property
def mac(self):
'''Get mac address'''
return hexlify(self._ble.config('mac')[1]).decode()

View File

@@ -0,0 +1,37 @@
"""
Bluetooth remote control handle
Micropython library for the Bluetooth remote control handle
=======================================================
#Preliminary composition 202200704
dahanzimin From the Mixly Team
"""
from ble_peripheral import BLESimplePeripheral
class Handle(BLESimplePeripheral):
def __init__(self):
super().__init__(name="TUDAO_MASTER")
self._buffer=bytearray(14)
def _receive_cb(self, data):
if self._on_receive:
if data !=self._buffer:
self._buffer=data
key=self._deal(self._buffer)
self._on_receive(key[0],key[1],key[2],key[3])
def recv(self,callback):
self._on_receive = callback
if callback:
super().recv(self._receive_cb)
def _u2s(self,n):
return n if n < (1 << 7) else n - (1 << 8)
def _deal(self,data):
if data[0]== 0xff and data[1]== 0xfe and data[12]== 0xfd and data[13]== 0xfc:
return self._u2s(data[5]),self._u2s(data[6]),self._u2s(data[7]),self._u2s(data[8])
else:
return None,None,None,None

View File

@@ -0,0 +1,91 @@
"""
Bluetooth-Peripheral
Micropython library for the Bluetooth-Peripheral
=======================================================
#Preliminary composition 20221018
#https://github.com/micropython/micropython/tree/master/examples/bluetooth
dahanzimin From the Mixly Team
"""
import bluetooth
from micropython import const
from ubinascii import hexlify
from ble_advertising import advertising_payload
_IRQ_CENTRAL_CONNECT = const(1)
_IRQ_CENTRAL_DISCONNECT = const(2)
_IRQ_GATTS_WRITE = const(3)
_FLAG_READ = const(0x0002)
_FLAG_WRITE_NO_RESPONSE = const(0x0004)
_FLAG_WRITE = const(0x0008)
_FLAG_NOTIFY = const(0x0010)
_UART_UUID = bluetooth.UUID(0x1101)
_UART_TX = (bluetooth.UUID("6E400003-B5A3-F393-E0A9-E50E24DCCA9E"),_FLAG_READ | _FLAG_NOTIFY,)
_UART_RX = (bluetooth.UUID("6E400002-B5A3-F393-E0A9-E50E24DCCA9E"),_FLAG_WRITE | _FLAG_WRITE_NO_RESPONSE,)
_UART_SERVICE = (_UART_UUID,(_UART_TX, _UART_RX),)
class BLESimplePeripheral:
def __init__(self, name=None):
self._ble = bluetooth.BLE()
self._ble.active(True)
self._ble.irq(self._irq)
((self._handle_tx, self._handle_rx),) = self._ble.gatts_register_services((_UART_SERVICE,))
self._connections = set()
self._write_callback = None
self._write_data = None
if (name is '') or (name is None):
name = "Mixgo_" + self.mac[-6:].upper()
print("Bluetooth name:", name)
self._payload = advertising_payload(name=name, services=[_UART_UUID])
self._advertise()
def _irq(self, event, data):
# Track connections so we can send notifications.
if event == _IRQ_CENTRAL_CONNECT:
conn_handle, _, _ = data
print("New connection", conn_handle)
self._connections.add(conn_handle)
elif event == _IRQ_CENTRAL_DISCONNECT:
conn_handle, _, _ = data
print("Disconnected", conn_handle)
self._connections.remove(conn_handle)
# Start advertising again to allow a new connection.
self._advertise()
elif event == _IRQ_GATTS_WRITE:
conn_handle, value_handle = data
value = self._ble.gatts_read(value_handle)
if value_handle == self._handle_rx:
try:
self._write_data=value.decode().strip()
except:
self._write_data=value
if self._write_callback:
self._write_callback(self._write_data)
def send(self, data):
for conn_handle in self._connections:
self._ble.gatts_notify(conn_handle, self._handle_tx, data)
def is_connected(self):
return len(self._connections) > 0
def _advertise(self, interval_us=500000):
print("Starting advertising")
self._ble.gap_advertise(interval_us, adv_data=self._payload)
def recv(self, callback= None):
if callback:
self._write_callback = callback
else:
write_data=self._write_data
self._write_data=None
return write_data
@property
def mac(self):
'''Get mac address'''
return hexlify(self._ble.config('mac')[1]).decode()

View File

@@ -0,0 +1,86 @@
"""
Bluetooth-uart-Peripheral
Micropython library for the Bluetooth-uart-Peripheral
=======================================================
#Preliminary composition 202200628
#https://github.com/micropython/micropython/tree/master/examples/bluetooth
dahanzimin From the Mixly Team
"""
import bluetooth
from ble_advertising import advertising_payload
from micropython import const
_IRQ_CENTRAL_CONNECT = const(1)
_IRQ_CENTRAL_DISCONNECT = const(2)
_IRQ_GATTS_WRITE = const(3)
_FLAG_READ = const(0x0002)
_FLAG_WRITE_NO_RESPONSE = const(0x0004)
_FLAG_WRITE = const(0x0008)
_FLAG_NOTIFY = const(0x0010)
_UART_UUID = bluetooth.UUID("0000fff0-0000-1000-8000-00805f9b34fb")
_UART_TX = (bluetooth.UUID("0000fff1-0000-1000-8000-00805f9b34fb"),_FLAG_READ | _FLAG_NOTIFY,)
_UART_RX = (bluetooth.UUID("0000fff2-0000-1000-8000-00805f9b34fb"),_FLAG_WRITE | _FLAG_WRITE_NO_RESPONSE,)
_UART_SERVICE = (_UART_UUID,(_UART_TX, _UART_RX),)
class BLEUART:
def __init__(self, name="mpy-uart", rxbuf=100):
self._ble = bluetooth.BLE()
self._ble.active(True)
self._ble.irq(self._irq)
((self._tx_handle, self._rx_handle),) = self._ble.gatts_register_services((_UART_SERVICE,))
self._ble.gatts_set_buffer(self._rx_handle, rxbuf, True)
self._connections = set()
self._rx_buffer = bytearray()
self._handler = None
self._payload = advertising_payload(name=name, services=[_UART_UUID])
self._advertise()
def irq(self, handler):
self._handler = handler
def _irq(self, event, data):
# Track connections so we can send notifications.
if event == _IRQ_CENTRAL_CONNECT:
conn_handle, _, _ = data
print("Bluetooth connected")
self._connections.add(conn_handle)
elif event == _IRQ_CENTRAL_DISCONNECT:
conn_handle, _, _ = data
print("Bluetooth disconnected")
if conn_handle in self._connections:
self._connections.remove(conn_handle)
# Start advertising again to allow a new connection.
self._advertise()
elif event == _IRQ_GATTS_WRITE:
conn_handle, value_handle = data
if conn_handle in self._connections and value_handle == self._rx_handle:
self._rx_buffer += self._ble.gatts_read(self._rx_handle)
if self._handler:
self._handler()
def any(self):
return len(self._rx_buffer)
def read(self, sz=None):
if not sz:
sz = len(self._rx_buffer)
result = self._rx_buffer[0:sz]
self._rx_buffer = self._rx_buffer[sz:]
return result
def write(self, data):
for conn_handle in self._connections:
self._ble.gatts_notify(conn_handle, self._tx_handle, data)
def close(self):
for conn_handle in self._connections:
self._ble.gap_disconnect(conn_handle)
self._connections.clear()
def _advertise(self, interval_us=500000):
self._ble.gap_advertise(interval_us, adv_data=self._payload)

View File

@@ -0,0 +1,67 @@
# Proof-of-concept of a REPL over BLE UART.
# Set the EoL characters to \r\n.
import io
import os
from machine import Timer
from micropython import schedule
from ble_uart_peripheral import BLEUART
_MP_STREAM_POLL = const(3)
_MP_STREAM_POLL_RD = const(0x0001)
# Batch writes into 50ms intervals.
Define_timer = Timer(2)
def schedule_in(handler, delay_ms):
def _wrap(_arg):
handler()
if Define_timer:
Define_timer.init(mode=Timer.ONE_SHOT, period=delay_ms, callback=_wrap)
else:
schedule(_wrap, None)
# Simple buffering stream to support the dupterm requirements.
class BLEUARTStream(io.IOBase):
def __init__(self, name="mpy-repl"):
self._uart = BLEUART(name)
self._tx_buf = bytearray()
self._uart.irq(self._on_rx)
def _on_rx(self):
if hasattr(os, "dupterm_notify"):
os.dupterm_notify(None)
def read(self, sz=None):
return self._uart.read(sz)
def readinto(self, buf):
avail = self._uart.read(len(buf))
if not avail:
return None
for i in range(len(avail)):
buf[i] = avail[i]
return len(avail)
def ioctl(self, op, arg):
if op == _MP_STREAM_POLL:
if self._uart.any():
return _MP_STREAM_POLL_RD
return 0
def _flush(self):
data = self._tx_buf[0:100]
self._tx_buf = self._tx_buf[100:]
self._uart.write(data)
if self._tx_buf:
schedule_in(self._flush, 50)
def write(self, buf):
empty = not self._tx_buf
self._tx_buf += buf
if empty:
schedule_in(self._flush, 50)
def start(ble_name="mpy-repl"):
stream = BLEUARTStream(name=ble_name)
os.dupterm(stream)

View File

@@ -0,0 +1,377 @@
# Copyright (c) 2019-2020 Anton Morozenko
# Copyright (c) 2015-2019 Volodymyr Shymanskyy.
# See the file LICENSE for copying permission.
__version__ = '0.2.6'
import usocket as socket
import utime as time
import ustruct as struct
import uselect as select
from micropython import const
ticks_ms = time.ticks_ms
sleep_ms = time.sleep_ms
IOError = OSError
LOGO = """
___ __ __
/ _ )/ /_ _____ / /__
/ _ / / // / _ \\/ '_/
/____/_/\\_, /_//_/_/\\_\\
/___/ for Python v{}\n""".format(__version__)
def stub_log(*args):
pass
class BlynkError(Exception):
pass
class RedirectError(Exception):
def __init__(self, server, port):
self.server = server
self.port = port
class Protocol(object):
MSG_RSP = const(0)
MSG_LOGIN = const(2)
MSG_PING = const(6)
MSG_TWEET = const(12)
MSG_EMAIL = const(13)
MSG_NOTIFY = const(14)
MSG_BRIDGE = const(15)
MSG_HW_SYNC = const(16)
MSG_INTERNAL = const(17)
MSG_PROPERTY = const(19)
MSG_HW = const(20)
MSG_REDIRECT = const(41)
MSG_HEAD_LEN = const(5)
STATUS_INVALID_TOKEN = const(9)
STATUS_OK = const(200)
VPIN_MAX_NUM = const(32)
_msg_id = 1
def _get_msg_id(self, **kwargs):
if 'msg_id' in kwargs:
return kwargs['msg_id']
self._msg_id += const(1)
return self._msg_id if self._msg_id <= const(0xFFFF) else const(1)
def _pack_msg(self, msg_type, *args, **kwargs):
data = ('\0'.join([str(curr_arg) for curr_arg in args])).encode('utf-8')
return struct.pack('!BHH', msg_type, self._get_msg_id(**kwargs), len(data)) + data
def parse_response(self, rsp_data, msg_buffer):
msg_args = []
msg_len = 0
try:
msg_type, msg_id, h_data = struct.unpack('!BHH', rsp_data[:self.MSG_HEAD_LEN])
msg_len = self.MSG_HEAD_LEN + h_data
except Exception as p_err:
raise BlynkError('Message parse error: {}'.format(p_err))
if msg_id == 0:
raise BlynkError('invalid msg_id == 0')
elif h_data >= msg_buffer:
raise BlynkError('Command too long. Length = {}'.format(h_data))
elif msg_type in (self.MSG_RSP, self.MSG_PING):
pass
elif msg_type in (self.MSG_HW, self.MSG_BRIDGE, self.MSG_INTERNAL, self.MSG_REDIRECT):
msg_body = rsp_data[self.MSG_HEAD_LEN: msg_len]
msg_args = [itm.decode('utf-8') for itm in msg_body.split(b'\0')]
else:
raise BlynkError("Unknown message type: '{}'".format(msg_type))
return msg_type, msg_id, h_data, msg_args, msg_len
def heartbeat_msg(self, heartbeat, rcv_buffer):
return self._pack_msg(self.MSG_INTERNAL, 'ver', __version__, 'buff-in', rcv_buffer, 'h-beat', heartbeat,
'dev', 'mpython')
def login_msg(self, token):
return self._pack_msg(self.MSG_LOGIN, token)
def ping_msg(self):
return self._pack_msg(self.MSG_PING)
def response_msg(self, *args, **kwargs):
return self._pack_msg(self.MSG_RSP, *args, **kwargs)
def virtual_write_msg(self, v_pin, *val):
return self._pack_msg(self.MSG_HW, 'vw', v_pin, *val)
def virtual_sync_msg(self, *pins):
return self._pack_msg(self.MSG_HW_SYNC, 'vr', *pins)
def email_msg(self, to, subject, body):
return self._pack_msg(self.MSG_EMAIL, to, subject, body)
def tweet_msg(self, msg):
return self._pack_msg(self.MSG_TWEET, msg)
def notify_msg(self, msg):
return self._pack_msg(self.MSG_NOTIFY, msg)
def set_property_msg(self, pin, prop, *val):
return self._pack_msg(self.MSG_PROPERTY, pin, prop, *val)
def internal_msg(self, *args):
return self._pack_msg(self.MSG_INTERNAL, *args)
class Connection(Protocol):
SOCK_MAX_TIMEOUT = const(5)
SOCK_TIMEOUT = 0.05
EAGAIN = const(11)
ETIMEDOUT = const(60)
RETRIES_TX_DELAY = const(2)
RETRIES_TX_MAX_NUM = const(3)
RECONNECT_SLEEP = const(1)
TASK_PERIOD_RES = const(50)
DISCONNECTED = const(0)
CONNECTING = const(1)
AUTHENTICATING = const(2)
AUTHENTICATED = const(3)
_state = None
_socket = None
_last_rcv_time = 0
_last_ping_time = 0
_last_send_time = 0
def __init__(self, token, server='blynk-cloud.com', port=80, heartbeat=10, rcv_buffer=1024, log=stub_log):
self.token = token
self.server = server
self.port = port
self.heartbeat = heartbeat
self.rcv_buffer = rcv_buffer
self.log = log
def _set_socket_timeout(self, timeout):
if getattr(self._socket, 'settimeout', None):
self._socket.settimeout(timeout)
else:
p = select.poll()
p.register(self._socket)
p.poll(int(timeout * const(1000)))
def send(self, data):
retries = self.RETRIES_TX_MAX_NUM
while retries > 0:
try:
retries -= 1
self._last_send_time = ticks_ms()
return self._socket.send(data)
except (IOError, OSError):
sleep_ms(self.RETRIES_TX_DELAY)
def receive(self, length, timeout):
d_buff = b''
try:
self._set_socket_timeout(timeout)
d_buff += self._socket.recv(length)
if len(d_buff) >= length:
d_buff = d_buff[:length]
return d_buff
except (IOError, OSError) as err:
if str(err) == 'timed out':
return b''
if str(self.EAGAIN) in str(err) or str(self.ETIMEDOUT) in str(err):
return b''
raise
def is_server_alive(self):
now = ticks_ms()
h_beat_ms = self.heartbeat * const(1000)
rcv_delta = time.ticks_diff(now, self._last_rcv_time)
ping_delta = time.ticks_diff(now, self._last_ping_time)
send_delta = time.ticks_diff(now, self._last_send_time)
if rcv_delta > h_beat_ms + (h_beat_ms // const(2)):
return False
if (ping_delta > h_beat_ms // const(10)) and (send_delta > h_beat_ms or rcv_delta > h_beat_ms):
self.send(self.ping_msg())
self.log('Heartbeat time: {}'.format(now))
self._last_ping_time = now
return True
def _get_socket(self):
try:
self._state = self.CONNECTING
self._socket = socket.socket()
self._socket.connect(socket.getaddrinfo(self.server, self.port)[0][-1])
self._set_socket_timeout(self.SOCK_TIMEOUT)
self.log('Connected to server')
except Exception as g_exc:
raise BlynkError('Server connection failed: {}'.format(g_exc))
def _authenticate(self):
self.log('Authenticating device...')
self._state = self.AUTHENTICATING
self.send(self.login_msg(self.token))
rsp_data = self.receive(self.rcv_buffer, self.SOCK_MAX_TIMEOUT)
if not rsp_data:
raise BlynkError('Auth stage timeout')
msg_type, _, status, args, _ = self.parse_response(rsp_data, self.rcv_buffer)
if status != self.STATUS_OK:
if status == self.STATUS_INVALID_TOKEN:
raise BlynkError('Invalid Auth Token')
if msg_type == self.MSG_REDIRECT:
raise RedirectError(*args)
raise BlynkError('Auth stage failed. Status={}'.format(status))
self._state = self.AUTHENTICATED
self.log('Access granted')
def _set_heartbeat(self):
self.send(self.heartbeat_msg(self.heartbeat, self.rcv_buffer))
rcv_data = self.receive(self.rcv_buffer, self.SOCK_MAX_TIMEOUT)
if not rcv_data:
raise BlynkError('Heartbeat stage timeout')
_, _, status, _, _ = self.parse_response(rcv_data, self.rcv_buffer)
if status != self.STATUS_OK:
raise BlynkError('Set heartbeat returned code={}'.format(status))
self.log('Heartbeat = {} sec. MaxCmdBuffer = {} bytes'.format(self.heartbeat, self.rcv_buffer))
def connected(self):
return True if self._state == self.AUTHENTICATED else False
class Blynk(Connection):
_CONNECT_TIMEOUT = const(30) # 30sec
_VPIN_WILDCARD = '*'
_VPIN_READ = 'read v'
_VPIN_WRITE = 'write v'
_INTERNAL = 'internal_'
_CONNECT = 'connect'
_DISCONNECT = 'disconnect'
_VPIN_READ_ALL = '{}{}'.format(_VPIN_READ, _VPIN_WILDCARD)
_VPIN_WRITE_ALL = '{}{}'.format(_VPIN_WRITE, _VPIN_WILDCARD)
_events = {}
def __init__(self, token, **kwargs):
Connection.__init__(self, token, **kwargs)
self._start_time = ticks_ms()
self._last_rcv_time = ticks_ms()
self._last_send_time = ticks_ms()
self._last_ping_time = ticks_ms()
self._state = self.DISCONNECTED
print(LOGO)
def connect(self, timeout=_CONNECT_TIMEOUT):
end_time = time.time() + timeout
while not self.connected():
if self._state == self.DISCONNECTED:
try:
self._get_socket()
self._authenticate()
self._set_heartbeat()
self._last_rcv_time = ticks_ms()
self.log('Registered events: {}\n'.format(list(self._events.keys())))
self.call_handler(self._CONNECT)
return True
except BlynkError as b_err:
self.disconnect(b_err)
sleep_ms(self.TASK_PERIOD_RES)
except RedirectError as r_err:
self.disconnect()
self.server = r_err.server
self.port = r_err.port
sleep_ms(self.TASK_PERIOD_RES)
if time.time() >= end_time:
return False
def disconnect(self, err_msg=None):
self.call_handler(self._DISCONNECT)
if self._socket:
self._socket.close()
self._state = self.DISCONNECTED
if err_msg:
self.log('[ERROR]: {}\nConnection closed'.format(err_msg))
time.sleep(self.RECONNECT_SLEEP)
def virtual_write(self, v_pin, *val):
return self.send(self.virtual_write_msg(v_pin, *val))
def virtual_sync(self, *v_pin):
return self.send(self.virtual_sync_msg(*v_pin))
def email(self, to, subject, body):
return self.send(self.email_msg(to, subject, body))
def tweet(self, msg):
return self.send(self.tweet_msg(msg))
def notify(self, msg):
return self.send(self.notify_msg(msg))
def set_property(self, v_pin, property_name, *val):
return self.send(self.set_property_msg(v_pin, property_name, *val))
def internal(self, *args):
return self.send(self.internal_msg(*args))
def handle_event(blynk, event_name):
class Deco(object):
def __init__(self, func):
self.func = func
# wildcard 'read V*' and 'write V*' events handling
if str(event_name).lower() in (blynk._VPIN_READ_ALL, blynk._VPIN_WRITE_ALL):
event_base_name = str(event_name).split(blynk._VPIN_WILDCARD)[0]
for i in range(blynk.VPIN_MAX_NUM + 1):
blynk._events['{}{}'.format(event_base_name.lower(), i)] = func
else:
blynk._events[str(event_name).lower()] = func
def __call__(self):
return self.func()
return Deco
def call_handler(self, event, *args, **kwargs):
if event in self._events.keys():
self.log("Event: ['{}'] -> {}".format(event, args))
self._events[event](*args, **kwargs)
def process(self, msg_type, msg_id, msg_len, msg_args):
if msg_type == self.MSG_RSP:
self.log('Response status: {}'.format(msg_len))
elif msg_type == self.MSG_PING:
self.send(self.response_msg(self.STATUS_OK, msg_id=msg_id))
elif msg_type in (self.MSG_HW, self.MSG_BRIDGE, self.MSG_INTERNAL):
if msg_type == self.MSG_INTERNAL:
self.call_handler("{}{}".format(self._INTERNAL, msg_args[0]), msg_args[1:])
elif len(msg_args) >= const(3) and msg_args[0] == 'vw':
self.call_handler("{}{}".format(self._VPIN_WRITE, msg_args[1]), int(msg_args[1]), msg_args[2:])
elif len(msg_args) == const(2) and msg_args[0] == 'vr':
self.call_handler("{}{}".format(self._VPIN_READ, msg_args[1]), int(msg_args[1]))
def read_response(self, timeout=0.5):
end_time = time.ticks_ms() + int(timeout * const(1000))
while time.ticks_diff(end_time, time.ticks_ms()) > 0:
rsp_data = self.receive(self.rcv_buffer, self.SOCK_TIMEOUT)
if rsp_data:
self._last_rcv_time = ticks_ms()
while rsp_data:
msg_type, msg_id, h_data, msg_args, msg_len = self.parse_response(rsp_data, self.rcv_buffer)
self.process(msg_type, msg_id, h_data, msg_args)
rsp_data = rsp_data[msg_len:]
def run(self):
if not self.connected():
self.connect()
else:
try:
self.read_response(timeout=self.SOCK_TIMEOUT)
if not self.is_server_alive():
self.disconnect('Server is offline')
except KeyboardInterrupt:
raise
except BlynkError as b_err:
self.log(b_err)
self.disconnect()
except Exception as g_exc:
self.log(g_exc)

View File

@@ -0,0 +1,133 @@
# Copyright (c) 2019-2020 Anton Morozenko
"""
Polling timers for functions.
Registers timers and performs run once or periodical function execution after defined time intervals.
"""
# select.select call used as polling waiter where it is possible
# cause time.sleep sometimes may load CPU up to 100% with small polling wait interval
try:
# cpython
import time
import select
polling_wait = lambda x: select.select([], [], [], x)
polling_wait(0.01)
except OSError:
# windows case where select.select call fails
polling_wait = lambda x: time.sleep(x)
except ImportError:
# micropython
import utime as time
try:
from uselect import select as s_select
polling_wait = lambda x: s_select([], [], [], x)
except ImportError:
# case when micropython port does not support select.select
polling_wait = lambda x: time.sleep(x)
WAIT_SEC = 0.05
MAX_TIMERS = 16
DEFAULT_INTERVAL = 10
class TimerError(Exception):
pass
class Timer(object):
timers = {}
def __init__(self, no_timers_err=True):
self.no_timers_err = no_timers_err
def _get_func_name(self, obj):
"""retrieves a suitable name for a function"""
if hasattr(obj, 'func'):
# handles nested decorators
return self._get_func_name(obj.func)
# simply returns 'timer' if on port without function attrs
return getattr(obj, '__name__', 'timer')
def register(blynk, *args, **kwargs):
# kwargs with defaults are used cause PEP 3102 no supported by Python2
interval = kwargs.pop('interval', DEFAULT_INTERVAL)
run_once = kwargs.pop('run_once', False)
stopped = kwargs.pop('stopped', False)
class Deco(object):
def __init__(self, func):
self.func = func
if len(list(Timer.timers.keys())) >= MAX_TIMERS:
raise TimerError('Max allowed timers num={}'.format(MAX_TIMERS))
_timer = _Timer(interval, func, run_once, stopped, *args, **kwargs)
Timer.timers['{}_{}'.format(len(list(Timer.timers.keys())), blynk._get_func_name(func))] = _timer
def __call__(self, *f_args, **f_kwargs):
return self.func(*f_args, **f_kwargs)
return Deco
@staticmethod
def stop(t_id):
timer = Timer.timers.get(t_id, None)
if timer is None:
raise TimerError('Timer id={} not found'.format(t_id))
Timer.timers[t_id].stopped = True
@staticmethod
def start(t_id):
timer = Timer.timers.get(t_id, None)
if timer is None:
raise TimerError('Timer id={} not found'.format(t_id))
Timer.timers[t_id].stopped = False
Timer.timers[t_id].fire_time = None
Timer.timers[t_id].fire_time_prev = None
@staticmethod
def is_stopped(t_id):
timer = Timer.timers.get(t_id, None)
if timer is None:
raise TimerError('Timer id={} not found'.format(t_id))
return timer.stopped
def get_timers(self):
states = {True: 'Stopped', False: 'Running'}
return {k: states[v.stopped] for k, v in self.timers.items()}
def run(self):
polling_wait(WAIT_SEC)
timers_intervals = [curr_timer.run() for curr_timer in Timer.timers.values() if not curr_timer.stopped]
if not timers_intervals and self.no_timers_err:
raise TimerError('Running timers not found')
return timers_intervals
class _Timer(object):
def __init__(self, interval, deco, run_once, stopped, *args, **kwargs):
self.interval = interval
self.deco = deco
self.args = args
self.run_once = run_once
self.kwargs = kwargs
self.fire_time = None
self.fire_time_prev = None
self.stopped = stopped
def run(self):
timer_real_interval = 0
if self.fire_time is None:
self.fire_time = time.time() + self.interval
if self.fire_time_prev is None:
self.fire_time_prev = time.time()
curr_time = time.time()
if curr_time >= self.fire_time:
self.deco(*self.args, **self.kwargs)
if self.run_once:
self.stopped = True
timer_real_interval = curr_time - self.fire_time_prev
self.fire_time_prev = self.fire_time
self.fire_time = curr_time + self.interval
return timer_real_interval

View File

@@ -0,0 +1,162 @@
from ustruct import unpack as unp
import utime
# Power Modes
NORMAL = 0
BMP280_TEMP_OS_SKIP = 0
BMP280_TEMP_OS_1 = 1
BMP280_TEMP_OS_2 = 2
BMP280_TEMP_OS_4 = 3
BMP280_TEMP_OS_8 = 4
BMP280_TEMP_OS_16 = 5
BMP280_PRES_OS_SKIP = 0
BMP280_PRES_OS_1 = 1
BMP280_PRES_OS_2 = 2
BMP280_PRES_OS_4 = 3
BMP280_PRES_OS_8 = 4
BMP280_PRES_OS_16 = 5
# BMP280 Temperature Registers
BMP280_REGISTER_DIG_T1 = 0x88
BMP280_REGISTER_DIG_T2 = 0x8A
BMP280_REGISTER_DIG_T3 = 0x8C
# BMP280 Pressure Registers
BMP280_REGISTER_DIG_P1 = 0x8E
BMP280_REGISTER_DIG_P2 = 0x90
BMP280_REGISTER_DIG_P3 = 0x92
BMP280_REGISTER_DIG_P4 = 0x94
BMP280_REGISTER_DIG_P5 = 0x96
BMP280_REGISTER_DIG_P6 = 0x98
BMP280_REGISTER_DIG_P7 = 0x9A
BMP280_REGISTER_DIG_P8 = 0x9C
BMP280_REGISTER_DIG_P9 = 0x9E
BMP280_REGISTER_ID = 0xD0
BMP280_REGISTER_RESET = 0xE0
BMP280_REGISTER_STATUS = 0xF3
BMP280_REGISTER_CONTROL = 0xF4
BMP280_REGISTER_CONFIG = 0xF5 # IIR filter config
BMP280_REGISTER_DATA = 0xF7
class BMP280:
def __init__(self, i2c_bus, addr=0x77):
self._bmp_i2c = i2c_bus
self._i2c_addr = addr
self.chip_id = self._read(BMP280_REGISTER_ID, 2)
self._T1 = unp('<H', self._read(BMP280_REGISTER_DIG_T1, 2))[0]
self._T2 = unp('<h', self._read(BMP280_REGISTER_DIG_T2, 2))[0]
self._T3 = unp('<h', self._read(BMP280_REGISTER_DIG_T3, 2))[0]
self._P1 = unp('<H', self._read(BMP280_REGISTER_DIG_P1, 2))[0]
self._P2 = unp('<h', self._read(BMP280_REGISTER_DIG_P2, 2))[0]
self._P3 = unp('<h', self._read(BMP280_REGISTER_DIG_P3, 2))[0]
self._P4 = unp('<h', self._read(BMP280_REGISTER_DIG_P4, 2))[0]
self._P5 = unp('<h', self._read(BMP280_REGISTER_DIG_P5, 2))[0]
self._P6 = unp('<h', self._read(BMP280_REGISTER_DIG_P6, 2))[0]
self._P7 = unp('<h', self._read(BMP280_REGISTER_DIG_P7, 2))[0]
self._P8 = unp('<h', self._read(BMP280_REGISTER_DIG_P8, 2))[0]
self._P9 = unp('<h', self._read(BMP280_REGISTER_DIG_P9, 2))[0]
self._t_os = BMP280_TEMP_OS_2 # temperature oversampling
self._p_os = BMP280_PRES_OS_16 # pressure oversampling
# output raw
self._t_raw = 0
self._t_fine = 0
self._t = 0
self._p_raw = 0
self._p = 0
self._read_wait_ms = 100 # interval between forced measure and readout
self._new_read_ms = 200 # interval between
self._last_read_ts = 0
def _read(self, addr, size=1):
return self._bmp_i2c.readfrom_mem(self._i2c_addr, addr, size)
def _write(self, addr, b_arr):
if not type(b_arr) is bytearray:
b_arr = bytearray([b_arr])
return self._bmp_i2c.writeto_mem(self._i2c_addr, addr, b_arr)
def _gauge(self):
# TODO limit new reads
now = utime.ticks_ms()
if utime.ticks_diff(now, self._last_read_ts) > self._new_read_ms:
self._last_read_ts = now
r = self._t_os + (self._p_os << 3) + (1 << 6)
self._write(BMP280_REGISTER_CONTROL, r)
utime.sleep_ms(100) # TODO calc sleep
d = self._read(BMP280_REGISTER_DATA, 6) # read all data at once (as by spec)
self._p_raw = (d[0] << 12) + (d[1] << 4) + (d[2] >> 4)
self._t_raw = (d[3] << 12) + (d[4] << 4) + (d[5] >> 4)
self._t_fine = 0
self._t = 0
self._p = 0
def load_test_calibration(self):
self._T1 = 27504
self._T2 = 26435
self._T3 = -1000
self._P1 = 36477
self._P2 = -10685
self._P3 = 3024
self._P4 = 2855
self._P5 = 140
self._P6 = -7
self._P7 = 15500
self._P8 = -14600
self._P9 = 6000
def load_test_data(self):
self._t_raw = 519888
self._p_raw = 415148
def print_calibration(self):
print("T1: {} {}".format(self._T1, type(self._T1)))
print("T2: {} {}".format(self._T2, type(self._T2)))
print("T3: {} {}".format(self._T3, type(self._T3)))
print("P1: {} {}".format(self._P1, type(self._P1)))
print("P2: {} {}".format(self._P2, type(self._P2)))
print("P3: {} {}".format(self._P3, type(self._P3)))
print("P4: {} {}".format(self._P4, type(self._P4)))
print("P5: {} {}".format(self._P5, type(self._P5)))
print("P6: {} {}".format(self._P6, type(self._P6)))
print("P7: {} {}".format(self._P7, type(self._P7)))
print("P8: {} {}".format(self._P8, type(self._P8)))
print("P9: {} {}".format(self._P9, type(self._P9)))
def _calc_t_fine(self):
# From datasheet page 22
self._gauge()
if self._t_fine == 0:
var1 = (((self._t_raw >> 3) - (self._T1 << 1)) * self._T2) >> 11
var2 = (((((self._t_raw >> 4) - self._T1) * ((self._t_raw >> 4) - self._T1)) >> 12) * self._T3) >> 14
self._t_fine = var1 + var2
# @property
def get_BMP_temperature(self):
self._calc_t_fine()
if self._t == 0:
self._t = ((self._t_fine * 5 + 128) >> 8) / 100.
return self._t
# @property
def get_BMP_pressure(self):
# From datasheet page 22
self._calc_t_fine()
if self._p == 0:
var1 = self._t_fine - 128000
var2 = var1 * var1 * self._P6
var2 = var2 + ((var1 * self._P5) << 17)
var2 = var2 + (self._P4 << 35)
var1 = ((var1 * var1 * self._P3) >> 8) + ((var1 * self._P2) << 12)
var1 = (((1 << 47) + var1) * self._P1) >> 33
if var1 == 0:
return 0
p = 1048576 - self._p_raw
p = int((((p << 31) - var2) * 3125) / var1)
var1 = (self._P9 * (p >> 13) * (p >> 13)) >> 25
var2 = (self._P8 * p) >> 19
p = ((p + var1 + var2) >> 8) + (self._P7 << 4)
self._p = p / 256.0
return self._p

View File

@@ -0,0 +1,85 @@
"""
CC_G1
Micropython library for the CC_G1(Remote control handle)
=======================================================
#Preliminary composition 20231222
@dahanzimin From the Mixly Team
"""
from micropython import const
from machine import Pin,SoftI2C
_CC_G1_ADDRESS = const(0x27)
_CC_G1_ID = const(0x00)
_CC_G1_VBAT = const(0x01)
_CC_G1_ADC = const(0x03)
_CC_G1_KEY = const(0x07)
class Handle:
def __init__(self, i2c_bus, addr=_CC_G1_ADDRESS):
self._i2c=i2c_bus
self._addr = addr
if self._rreg(_CC_G1_ID)!= 0x27:
raise AttributeError("Cannot find a CC_G1")
def _wreg(self, reg, val):
'''Write memory address'''
try:
self._i2c.writeto_mem(self._addr, reg, val.to_bytes(1, 'little'))
except:
return 0
def _rreg(self, reg, nbytes=1):
'''Read memory address'''
try:
self._i2c.writeto(self._addr, reg.to_bytes(1, 'little'))
return self._i2c.readfrom(self._addr, nbytes)[0] if nbytes<=1 else self._i2c.readfrom(self._addr, nbytes)[0:nbytes]
except:
return 0
def read_bat(self, ratio=5/1023):
'''Read battery power'''
vbat = self._rreg(_CC_G1_VBAT)<<2 | self._rreg(_CC_G1_VBAT+1)>>6
return round(vbat*ratio, 2)
def read_joystick(self, ratio=100/1023):
'''Read joystick'''
y_axis = 1023 - (self._rreg(_CC_G1_ADC) << 2 | self._rreg(_CC_G1_ADC + 1) >> 6)
x_axis = self._rreg(_CC_G1_ADC + 2 ) << 2 | self._rreg(_CC_G1_ADC + 3) >> 6
return round(x_axis*ratio), round(y_axis*ratio)
def read_key(self, index):
'''Read key1~6'''
if not 0 <= index <= 5:
raise ValueError("The key number must be a number in the range: 0~5")
if index<=4:
return bool(self._rreg(_CC_G1_KEY) >> index & 0x01)
else:
return bool(self._rreg(_CC_G1_KEY) >> 7 & 0x01)
def shutdown(self, flag=True):
"""This function is only available on battery power"""
if flag:
self._wreg(_CC_G1_KEY, (self._rreg(_CC_G1_KEY)) & 0XBF)
else:
self._wreg(_CC_G1_KEY, (self._rreg(_CC_G1_KEY)) | 0X40)
'''Select instantiation objects'''
try:
#MixGo CC/ME
ext_i2c = SoftI2C(scl=Pin(0), sda=Pin(1), freq=100000)
handle = Handle(ext_i2c)
except:
try:
#MixGo CE
ext_i2c = SoftI2C(scl=Pin(17), sda=Pin(18), freq=100000)
handle = Handle(ext_i2c)
except:
try:
#MixGo Mini
ext_i2c = SoftI2C(scl=Pin(8), sda=Pin(7), freq=100000)
handle = Handle(ext_i2c)
except:
print("MixGo board cannot find a CC_G1")

View File

@@ -0,0 +1,147 @@
"""
Bluetooth AT
Micropython library for the Bluetooth AT(WCH)
=======================================================
#Preliminary composition 20230106
dahanzimin From the Mixly Team
"""
from machine import Pin
from time import sleep_ms
class AT:
def __init__(self, pin,times=5):
self.at_pin = Pin(pin, Pin.OUT)
self.at_pin.value(1)
self._times = times
self._flag = [0,0,0,0,0,0,0,0] #mac0,1 name2,3 power4,5 power6,7
self._power = [0,1,2,3,-3,-8,-14,-20]
sleep_ms(100)
def _str_reverse(self,data):
data=data.split(':')
data.reverse()
data=":".join(data)
return data
def ble_mac(self, mac=None):
sleep_ms(200)
if mac is None:
if not (self._flag[0] >= self._times and self._times != 0):
self._flag[0]+=1
self.at_pin.value(0)
sleep_ms(10)
data=input('AT+MAC?\r\n')
input()
self.at_pin.value(1)
print('BLE_MAC:',self._str_reverse(data))
sleep_ms(100)
return self._str_reverse(data)
else:
print('Please delete this command and upload other programs again')
else:
if not (self._flag[1] >= self._times and self._times != 0):
self._flag[1]+=1
self.at_pin.value(0)
sleep_ms(10)
data=input('AT+MAC={}\r\n'.format(self._str_reverse(mac)))
print('\r\n')
self.at_pin.value(1)
print('BLE_MAC:',mac,data)
sleep_ms(100)
return True if data is "OK" else False
else:
print('Please delete this command and upload other programs again')
def ble_name(self, name=None):
sleep_ms(200)
if name is None:
if not (self._flag[2] >= self._times and self._times != 0):
self._flag[2]+=1
self.at_pin.value(0)
sleep_ms(10)
data=input('AT+NAME?\r\n')
input()
input()
self.at_pin.value(1)
print('BLE_NAME:',data)
sleep_ms(100)
return data
else:
print('Please delete this command and upload other programs again')
else:
if not (self._flag[3] >= self._times and self._times != 0):
self._flag[3]+=1
self.at_pin.value(0)
sleep_ms(10)
data=input('AT+NAME='+name+'\r\n')
print('\r\n')
self.at_pin.value(1)
print('BLE_NAME:',name,data)
sleep_ms(100)
return True if data is "OK" else False
else:
print('Please delete this command and upload other programs again')
def ble_power(self, power=None):
sleep_ms(200)
if power is None:
if not (self._flag[4] >= self._times and self._times != 0):
self._flag[4]+=1
self.at_pin.value(0)
sleep_ms(10)
data=input('AT+TPL?\r\n')
input()
print(' \r\n')
self.at_pin.value(1)
data=self._power[int(data[4:])]
print('BLE_Power: {}DB'.format(data))
sleep_ms(100)
return data
else:
print('Please delete this command and upload other programs again')
else:
if not (self._flag[5] >= self._times and self._times != 0):
self._flag[5]+=1
self.at_pin.value(0)
sleep_ms(10)
data=input('AT+TPL={}\r\n'.format(self._power.index(power)))
print('\r\n')
self.at_pin.value(1)
print('BLE_Power:',str(power)+'DB',data)
sleep_ms(100)
return True if data is "OK" else False
else:
print('Please delete this command and upload other programs again')
def ble_pname(self, name=None):
sleep_ms(200)
if name is None:
if not (self._flag[6] >= self._times and self._times != 0):
self._flag[6]+=1
self.at_pin.value(0)
sleep_ms(10)
data=input('AT+PNAME?\r\n')
input()
input()
self.at_pin.value(1)
print('BLE_PNAME:',data)
sleep_ms(100)
return data
else:
print('Please delete this command and upload other programs again')
else:
if not (self._flag[7] >= self._times and self._times != 0):
self._flag[7]+=1
self.at_pin.value(0)
sleep_ms(10)
data=input('AT+PNAME='+name+'\r\n')
print('\r\n')
self.at_pin.value(1)
print('BLE_PNAME:',name,data)
sleep_ms(100)
return True if data is "OK" else False
else:
print('Please delete this command and upload other programs again')

View File

@@ -0,0 +1,166 @@
"""
Debugnet(HTTP,MQTT)
MicroPython library for network request debugging
=======================================================
#Preliminary composition 20230225
@dahanzimin From the Mixly Team
"""
import time
from umqtt import MQTTClient
from ubinascii import hexlify
from machine import unique_id
from urequests import Response
from usocket import socket,getaddrinfo,SOCK_STREAM
from mixiot import WILL_TOPIC,ADDITIONAL_TOPIC
class socket_d(socket):
def __init__(self,*args,debug=False,**kw):
super().__init__(*args,**kw)
self._debug=debug
self.client_len=0
self.server_len=0
def write(self,*args):
super().write(*args)
self.client_len=min(self.client_len+len(args[0]),65535)
if self._debug:
print('client:',args[0])
def readline(self,*args):
buf=super().readline(*args)
self.server_len=min(self.server_len+len(buf),65535) if buf else self.server_len
if self._debug:
print('server:',buf)
return buf
def read(self,*args):
buf=super().read(*args)
self.server_len=min(self.server_len+len(buf),65535) if buf else self.server_len
if self._debug:
print('server:',buf)
return buf
#HTTP
def request(method, url, data=None, json=None, headers={}, stream=None, parse_headers=True, debug=False):
redir_cnt = 1
while True:
try:
proto, dummy, host, path = url.split("/", 3)
except ValueError:
proto, dummy, host = url.split("/", 2)
path = ""
if proto == "http:":
port = 80
elif proto == "https:":
import ussl
port = 443
else:
raise ValueError("Unsupported protocol: " + proto)
if ":" in host:
host, port = host.split(":", 1)
port = int(port)
ai = getaddrinfo(host, port, 0, SOCK_STREAM)
ai = ai[0]
resp_d = None
if parse_headers is not False:
resp_d = {}
s = socket_d(ai[0], ai[1], ai[2], debug=debug)
try:
s.connect(ai[-1])
if proto == "https:":
s = ussl.wrap_socket(s, server_hostname=host)
s.write(b"%s /%s HTTP/1.0\r\n" % (method, path))
if not "Host" in headers:
s.write(b"Host: %s\r\n" % host)
for k in headers:
s.write(k)
s.write(b": ")
s.write(headers[k])
s.write(b"\r\n")
if json is not None:
assert data is None
import ujson
data = ujson.dumps(json)
s.write(b"Content-Type: application/json\r\n")
if data:
s.write(b"Content-Length: %d\r\n" % len(data))
s.write(b"Connection: close\r\n\r\n")
if data:
s.write(data)
l = s.readline()
l = l.split(None, 2)
status = int(l[1])
reason = ""
if len(l) > 2:
reason = l[2].rstrip()
while True:
l = s.readline()
if not l or l == b"\r\n":
break
if l.startswith(b"Transfer-Encoding:"):
if b"chunked" in l:
raise ValueError("Unsupported " + l)
elif l.startswith(b"Location:") and 300 <= status <= 399:
if not redir_cnt:
raise ValueError("Too many redirects")
redir_cnt -= 1
url = l[9:].decode().strip()
status = 300
break
if parse_headers is False:
pass
elif parse_headers is True:
l = l.decode()
k, v = l.split(":", 1)
resp_d[k] = v.strip()
else:
parse_headers(l, resp_d)
except OSError:
s.close()
raise
if status != 300:
break
resp = Response(s)
resp.status_code = status
resp.reason = reason
resp.client_len=s.client_len
resp.server_len=s.server_len
if resp_d is not None:
resp.headers = resp_d
return resp
class MQTT_Client(MQTTClient):
def __init__(self,*args,debug=False,**kw):
super().__init__(*args,**kw)
self.sock = socket_d(debug=debug)
@property
def client_len(self): #The length of client data obtained
_len=self.sock.client_len
self.sock.client_len=0
return _len
@property
def server_len(self): #The length of server data obtained
_len=self.sock.server_len
self.sock.server_len=0
return _len
def time_msg(self,utc=28800): #Get server time information
msg=self.wait_msg()
if isinstance(msg, dict):
if msg['topic'] =='$SYS/hello':
val=time.gmtime(int(msg['msg'])//1000-946684800+utc)[0:7]
return str(val).replace(' ','')[1:-1]
#MQTT
def init_MQTT_client(address, username, password, MQTT_USR_PRJ, debug=False):
client = MQTT_Client(hexlify(unique_id()), address, 1883, username, password, debug=debug)
client.set_last_will(topic=MQTT_USR_PRJ+WILL_TOPIC, msg=client.client_id, qos=2)
if client.connect()==0:
client.publish(MQTT_USR_PRJ+ADDITIONAL_TOPIC, client.client_id, qos=0)
time.sleep_ms(200)
return client

View File

@@ -0,0 +1,60 @@
# DHT11/DHT22 driver for MicroPython
# MIT license; Copyright (c) 2016 Damien P. George
from time import sleep
try:
from esp import dht_readinto
except:
from machine import dht_readinto
from machine import Pin
class DHTBase:
__species = {}
__first_init = True
def __new__(cls, pin, *args, **kwargs):
if pin not in cls.__species.keys():
cls.__first_init = True
cls.__species[pin] = object.__new__(cls)
return cls.__species[pin]
def __init__(self, pin):
if self.__first_init:
self.__first_init = False
self.pin = Pin(pin)
self.buf = bytearray(5)
self.err = 0
def measure(self):
buf = bytearray(5)
try:
dht_readinto(self.pin, buf)
if (buf[0] + buf[1] + buf[2] + buf[3]) & 0xFF == buf[4]:
self.buf = buf
self.err = 0
except:
if self.err > 10:
raise AttributeError("DHTx operation error")
self.err += 1
sleep(0.5)
return
class DHT11(DHTBase):
def humidity(self):
self.measure()
return self.buf[0]
def temperature(self):
self.measure()
return self.buf[2]
class DHT22(DHTBase):
def humidity(self):
self.measure()
return (self.buf[0] << 8 | self.buf[1]) * 0.1
def temperature(self):
self.measure()
t = ((self.buf[2] & 0x7F) << 8 | self.buf[3]) * 0.1
if self.buf[2] & 0x80:
t = -t
return t

View File

@@ -0,0 +1,21 @@
#Take the picture bytes in expression_picture.py
#--dahanzimin From the Mixly Team
Angry=b'P4\n64\n64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xfc\x00\x00\x00\x00\x00\x03\xff\xff\xc0\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\x7f\xff\xff\xfc\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x03\xff\xfd\x7f\xff\xc0\x00\x00\x07\xff\x80\x01\xff\xe0\x00\x00\x0f\xfc\x00\x00\x7f\xf0\x00\x00\x1f\xf8\x00\x00\x1f\xf8\x00\x00?\xe0\x00\x01\x87\xfc\x00\x00\x7f\x80\x00\x01\xd9\xfe\x00\x00\xff\x00\x00\x07\xfc\xff\x00\x01\xfe\x00\x00\x07\xfe\x7f\x80\x01\xfc\x00\x00\x03\x1c?\x80\x03\xf8\x00\x00\x0f\x18\x1f\xc0\x03\xf0\x00\x00\x0e\xdc\x0f\xc0\x07\xf0\x00\x00\x07\xfc\x0f\xe0\x07\xe0\x00\x00\x07\xf8\x07\xe0\x0f\xc0\x00\x00\x02`\x03\xf0\x0f\xc0\x00\x00\x00 \x03\xf0\x1f\xc0\x00\x00\x00\x00\x03\xf8\x1f\x83\x00\x00\x00\x00\xc1\xf8\x1f\x83\xc0\x00\x00\x03\xc1\xf8\x1f\x03\xf0\x00\x00\x1f\xc1\xf8?\x07\xfe\x00\x00?\xe0\xfc?\x03\xff\x80\x01\xff\xc0\xfc?\x03\xff\xe0\x07\xff\xc0\xfc?\x03\xff\xe0\x03\xff\x80\xfc?\x01\xff\xc0\x03\xff\x80|?\x00\xff\x80\x01\xff\x00\xfc>\x00>\x00\x00|\x00|?\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00\xfc\x1f\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x01\xf8\x1f\x80\x00\x00\x00\x00\x01\xf8\x1f\x80\x00\x00\x00\x00\x01\xf8\x0f\xc0\x00\x00\x00\x00\x01\xf8\x1f\xc0\x00\x00\x00\x00\x03\xf0\x0f\xc0\x00\x00\x00\x00\x07\xf0\x07\xe0\x00\x03\x80\x00\x07\xe0\x07\xf0\x00\x07\xc0\x00\x0f\xe0\x03\xf0\x00\x0f\xf0\x00\x0f\xc0\x03\xf8\x00\x1e\xf8\x00\x1f\xc0\x01\xfc\x00\x1c~\x00?\x80\x01\xfe\x00\x00\x1c\x00\x7f\x80\x00\xff\x00\x00\x04\x00\xff\x00\x00\x7f\xc0\x00\x00\x01\xfe\x00\x00?\xe0\x00\x00\x07\xfc\x00\x00\x1f\xf8\x00\x00\x1f\xf8\x00\x00\x0f\xfe\x00\x00\x7f\xf0\x00\x00\x07\xff\xc0\x05\xff\xe0\x00\x00\x01\xff\xff\xff\xff\x80\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00?\xff\xff\xfc\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\x03\xff\xff\xc0\x00\x00\x00\x00\x00?\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Bored=b'P4\n64\n64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xfc\x00\x00\x00\x00\x00\x03\xff\xff\xc0\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\x7f\xff\xff\xfc\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x03\xff\xfd\x7f\xff\xc0\x00\x00\x07\xff\x80\x01\xff\xe0\x00\x00\x0f\xfc\x00\x00\x7f\xf0\x00\x00\x1f\xf8\x00\x00\x1f\xf8\x00\x00?\xc0\x00\x00\x07\xfc\x00\x00\x7f\xc0\x00\x00\x01\xfe\x00\x00\xff\x00\x00\x00\x00\xff\x00\x01\xfe\x00\x00\x00\x00\x7f\x00\x01\xfc\x00\x00\x00\x00?\x80\x03\xf8\x00\x00\x00\x00\x1f\xc0\x03\xf0\x00\x00\x00\x00\x0f\xc0\x07\xf0\x00\x00\x00\x00\x0f\xe0\x07\xe0\x00\x00\x00\x00\x07\xf0\x0f\xe0\x00\x00\x00\x00\x07\xf0\x0f\xc0\x00\x00\x00\x00\x03\xf0\x1f\x80\x00\x00\x00\x00\x03\xf8\x1f\x80\x00\x00\x00\x00\x01\xf8\x1f\x83[\x00\x00\xdfA\xf8\x1f\x87\xff\x80\x01\xff\xe0\xf8?\x07\xff\x00\x01\xff\xe0\xfc?\x01}\x00\x00\x8e\x00\xfc?\x000\x00\x00\x0e\x00\xfc?\x00p\x00\x00\x1c\x00\xfc>\x05~\x80\x00_\xc0|?\x07\xff\x80\x01\xff\xe0\xfc?\x07\xff\x80\x01\xff\xe0\xfc>\x02D\x00\x00\xa4\x80|?\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00\xfc\x1f\x00\x00\x00\x00\x00\x00\xfc?\x80\x00\x00\x00\x00\x01\xf8\x1f\x80\x00\x00\x00\x00\x01\xf8\x1f\x80\x00\x00\x00\x00\x01\xf8\x0f\xc0\x00\x00\x00\x00\x01\xf8\x0f\xc0\x00\x07\xf0\x00\x03\xf0\x0f\xe0\x00\x1f\xfc\x00\x07\xf0\x07\xe0\x00?\xfe\x00\x07\xe0\x07\xf0\x00|\x1f\x00\x07\xe0\x03\xf8\x00p\x07\x00\x1f\xc0\x03\xf8\x00\xe0\x07\x80\x1f\xc0\x01\xfc\x00s\xe3\x80?\x80\x00\xfe\x00c\xf3\x00\x7f\x00\x00\xff\x00\x03\xe0\x00\xff\x00\x00\x7f\xc0\x00\x00\x01\xfe\x00\x00?\xe0\x00\x00\x07\xfc\x00\x00\x1f\xf0\x00\x00\x1f\xf8\x00\x00\x0f\xfe\x00\x00\x7f\xf0\x00\x00\x07\xff\xc0\x01\xff\xe0\x00\x00\x03\xff\xfa\xbf\xff\x80\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00?\xff\xff\xfe\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\x01\xff\xff\xc0\x00\x00\x00\x00\x00_\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Confused=b'P4\n64\n64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xfc\x00\x00\x00\x00\x00\x03\xff\xff\xc0\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\x7f\xff\xff\xfc\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x03\xff\xfd\x7f\xff\xc0\x00\x00\x07\xff\x80\x01\xff\xe0\x00\x00\x0f\xfc\x00\x00\x7f\xf0\x00\x00\x1f\xf8\x00\x00\x1f\xf8\x00\x00?\xc0\x00\x00\x07\xfc\x00\x00\x7f\xc0\x00\x00\x01\xfe\x00\x00\xff\x00\x00\x00\x00\xff\x00\x01\xfe\x00\x00\x00\x00\x7f\x00\x01\xfc\x00\x00\x00\x00?\x80\x03\xf8\x06\x00\x00\x00\x1f\xc0\x03\xf0\x0f\x00\x01\xfc\x1f\xc0\x07\xf0\x1f\x00\x01\xff\x0f\xe0\x07\xe0?\x00\x01\xff\x87\xe0\x0f\xc0~\x00\x00\xff\xc7\xf0\x0f\xdf\xfc\x00\x00\x07\xe3\xf0\x1f\xdf\xf8\x00\x00\x01\xf3\xf8\x1f\x9f\xe0\x00\x00\x00\xf1\xf8\x1f\x8f(\x00\x00\x18\xe1\xf8\x1f\x00~\x00\x00~!\xf8?\x00\xff\x00\x00\xfe\x00\xfc?\x00\xff\x80\x00\xff\x00\xfc?\x00\xff\x80\x01\xff\x00\xfc?\x00\xff\x00\x01\xff\x00\xfc?\x00\xff\x80\x00\xff\x00\xfc?\x00~\x00\x00\xfe\x00\xfc>\x00>\x00\x00|\x00|?\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00\xfc\x1f\x00\x00\x00\x00\x00\x00\xf8?\x80\x00\x00\x00\x00\x01\xfc\x1f\x80\x00\x00\x00\x00\x01\xf8\x1f\x80\x00\x00\x00\x00\x01\xf8\x0f\xc0\x00\x00\x00\x00\x01\xf8\x0f\xc0\x00\x00\x00\x00\x03\xf0\x0f\xe0\x00\x00\x00\x00\x03\xf0\x07\xe0\x00\x00\x00\x00\x07\xe0\x07\xf0\x00\x1f\x80\x00\x0f\xe0\x03\xf0\x00?\xc0\x00\x0f\xc0\x03\xf8\x00?\xc7\x00\x1f\xc0\x01\xfc\x009\xe7\x00?\x80\x00\xfe\x001\xe7\x00\x7f\x80\x00\xff\x000\xfe\x00\xff\x00\x00\x7f\xc0\x00~\x03\xfe\x00\x00?\xe0\x00<\x07\xfc\x00\x00\x1f\xf8\x00\x00\x1f\xf8\x00\x00\x0f\xfe\x00\x00\x7f\xf0\x00\x00\x07\xff\xc0\x01\xff\xe0\x00\x00\x03\xff\xff\xff\xff\x80\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00?\xfe\xff\xfc\x00\x00\x00\x00\x0f\xff\xff\xf8\x00\x00\x00\x00\x01\xff\xff\x80\x00\x00\x00\x00\x00?\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Happy=b'P4\n64\n64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xfc\x00\x00\x00\x00\x00\x03\xff\xff\xc0\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00?\xff\xff\xfc\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x03\xff\xff\x7f\xff\xc0\x00\x00\x07\xff\x80\x03\xff\xe0\x00\x00\x0f\xfc\x00\x00?\xf0\x00\x00\x1f\xf0\x00\x00\x1f\xf8\x00\x00?\xe0\x00\x00\x07\xfc\x00\x00\x7f\x80\x00\x00\x01\xfe\x00\x00\xff\x00\x00\x00\x00\xff\x00\x00\xfe\x00\x00\x00\x00\x7f\x00\x03\xfc\x00\x00\x00\x00?\x80\x03\xf8\x00\x00\x00\x00\x1f\xc0\x03\xf8\x00\x00\x00\x00\x0f\xc0\x07\xe0\x00\x00\x00\x00\x0f\xe0\x07\xe0\x00\x00\x00\x00\x07\xf0\x0f\xe0\x00\x00\x00\x00\x07\xf0\x0f\xc0\x00\x00\x00\x00\x03\xf0\x1f\xc0\x00\x00\x00\x00\x03\xf8\x1f\x80\x00\x00\x00\x00\x01\xf8\x1f\x80\x14\x00\x008\x01\xf8\x1f\x00~\x00\x00~\x00\xf8?\x00\xff\x00\x00\xff\x00\xfc?\x00\xff\x80\x01\xff\x00\xfc?\x00\xff\x00\x01\xff\x00\xfc?\x00\xff\x80\x00\xff\x00\xfc?\x00\xff\x00\x00\xff\x00\xfc?\x00\x7f\x00\x00\xfe\x00|>\x00<\x00\x00|\x00\xfc?\x00\x00\x00\x00\x00\x00|?\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00\xfc\x1f\x00\x00\x00\x00\x00\x00\xf8?\x80\x00\x00\x00\x00\x01\xfc\x1f\x80\x00\x00\x00\x00\x01\xf8\x1f\x80\x00\x00\x00\x00\x01\xf8\x1f\xc0\x00\x00\x00\x00\x01\xf8\x0f\xc0\x00\x00\x00\x00\x03\xf0\x0f\xe0\x02\xfa\xd5\x80\x07\xf0\x07\xe0\x03\xff\xff\xc0\x07\xe0\x07\xf0\x07\xff\xff\xe0\x0f\xe0\x03\xf8\x03\xff\xff\xc0\x0f\xc0\x03\xf8\x03\xff\xff\xc0\x1f\xc0\x01\xfc\x01\xff\xff\x80?\x80\x01\xfe\x01\xff\xff\x80\x7f\x80\x00\xff\x00\xff\xff\x00\xff\x00\x00\x7f\x80\x7f\xfe\x03\xfe\x00\x00?\xe0?\xfc\x07\xfc\x00\x00\x1f\xf0\x07\xf0\x1f\xf8\x00\x00\x0f\xfe\x00\x00\x7f\xf0\x00\x00\x07\xff\xc0\x01\xff\xe0\x00\x00\x03\xff\xfe\xbf\xff\x80\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00?\xff\xff\xfc\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\x01\xff\xff\xc0\x00\x00\x00\x00\x00?\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Heart=b'P4\n64\n64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfe\x00\x00\x7f\xc0\x00\x00\x1f\xff\xc0\x03\xff\xf8\x00\x00\x7f\xff\xf0\x0f\xff\xfe\x00\x00\xff\xff\xf8\x1f\xff\xff\x00\x01\xff\xff\xfe\x7f\xff\xff\x80\x03\xff\xff\xff\x7f\xff\xff\xc0\x07\xff\xff\xff\xff\xff\xff\xe0\x0f\xff\xff\xff\xff\xff\xff\xf0\x0f\xff\xff\xff\xff\xff\xff\xf0\x1f\xff\xff\xff\xff\xff\xff\xf8\x1f\xff\xff\xff\xff\xff\xff\xf8\x1f\xff\xff\xff\xff\xff\xff\xf8?\xff\xff\xff\xff\xff\xff\xfc?\xff\xff\xff\xff\xff\xff\xfc?\xff\xff\xff\xff\xff\xff\xfc?\xff\xff\xff\xff\xff\xff\xfc?\xff\xff\xff\xff\xff\xff\xfc?\xff\xff\xff\xff\xff\xff\xfc?\xff\xff\xff\xff\xff\xff\xfc?\xff\xff\xff\xff\xff\xff\xfc?\xff\xff\xff\xff\xff\xff\xf8\x1f\xff\xff\xff\xff\xff\xff\xfc\x1f\xff\xff\xff\xff\xff\xff\xf8\x1f\xff\xff\xff\xff\xff\xff\xf8\x0f\xff\xff\xff\xff\xff\xff\xf0\x0f\xff\xff\xff\xff\xff\xff\xf0\x07\xff\xff\xff\xff\xff\xff\xe0\x07\xff\xff\xff\xff\xff\xff\xc0\x03\xff\xff\xff\xff\xff\xff\xc0\x01\xff\xff\xff\xff\xff\xff\x80\x00\xff\xff\xff\xff\xff\xff\x80\x00\xff\xff\xff\xff\xff\xff\x00\x00\x7f\xff\xff\xff\xff\xfe\x00\x00?\xff\xff\xff\xff\xfc\x00\x00\x1f\xff\xff\xff\xff\xf8\x00\x00\x0f\xff\xff\xff\xff\xf0\x00\x00\x07\xff\xff\xff\xff\xe0\x00\x00\x03\xff\xff\xff\xff\xc0\x00\x00\x01\xff\xff\xff\xff\xc0\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x7f\xff\xff\xfe\x00\x00\x00\x00?\xff\xff\xfc\x00\x00\x00\x00\x1f\xff\xff\xf8\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\x07\xff\xff\xe0\x00\x00\x00\x00\x03\xff\xff\xc0\x00\x00\x00\x00\x01\xff\xff\x80\x00\x00\x00\x00\x00\xff\xfe\x00\x00\x00\x00\x00\x00?\xfe\x00\x00\x00\x00\x00\x00\x1f\xf8\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x07\xe0\x00\x00\x00\x00\x00\x00\x03\xc0\x00\x00\x00\x00\x00\x00\x01\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Paper=b'P4\n64\n64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|\x00\x00\x00\x00\x00\x00\x01\xff\x00`\x00\x00\x00\x00\x01\xff\x83\xfc\x00\x00\x00\x00\x07\xff\xc7\xff\x00\x00\x00\x00\x07\xe7\xcf\xff\x80\x00\x00\x00\x0f\x83\xff\xff\x80\x00\x00\x00\x0f\x03\xff\x07\x80\x00\x00\x00\x0f\x03\xfe\x07\xc0\x00\x00\x00\x1f\x01\xfc\x03\xc0\x00\x00\x00\x1e\x01\xf8\x03\xc0\x00\x00\x00\x1e\x01\xf8\x07\xcc\x00\x00\x00\x1e\x03\xf0\x07\xff\x00\x00\x00\x1e\x03\xe0\x0f\xff\x80\x00\xbc\x1e\x03\xe0\x0f\xff\xc0\x01\xff\x1e\x03\xc0\x1f\xff\xc0\x03\xff\xfe\x03\xc0?\xc3\xe0\x07\xff\xfe\x01\xc0?\x81\xe0\x07\xc7\xfe\x00\x00~\x01\xe0\x07\x81\xfe\x00\x00\xfc\x01\xe0\x0f\x80\xfe\x00\x01\xf8\x03\xe0\x0f\x80~\x00\x01\xf0\x07\xc0\x07\x80>\x00\x00\xe0\x0f\xc0\x07\x80\x1e\x00\x00@\x1f\x80\x07\xc0\x0e\x00\x00\x00?\x00\x03\xe0\x06\x00\x00\x00~\x00\x03\xe0\x06\x00\x00\x00\xfc\x00\x01\xf0\x02\x00\x00\x03\xff\x00\x00\xf8\x00\x00\x00\x07\xff\xc0\x00\xfc\x00\x00\x00\x07\xff\xe0\x00|\x00\x00\x00\x07\xff\xe0\x00>\x00\x00\x00\x03\x81\xf0\x00\x1e\x00\x00\x00\x00\x00\xf0\x00\x1e\x00\x00\x00\x00\x00\xf0\x00\x1e\x00\x00\x00\x00\x01\xf0\x00\x1e\x00\x00\x00\x00\x03\xf0\x00\x1e\x00\x00\x00\x00\x07\xe0\x00>\x00\x00\x00\x00\x7f\xc0\x00<\x00\x00\x00\xff\xff\x80\x00|\x00\x00\x01\xff\xff\x00\x00|\x00\x00\x03\xff\xfc\x00\x00<\x00\x00\x03\xff\xe0\x00\x00<\x00\x00\x07\xe0\x00\x00\x00>\x00\x00\x0f\x80\x00\x00\x00>\x00\x00\x1f\x80\x00\x00\x00\x1f\x00\x00?\x00\x00\x00\x00\x0f\x80\x00~\x00\x00\x00\x00\x0f\xc0\x00\xfc\x00\x00\x00\x00\x07\xf0\x03\xf8\x00\x00\x00\x00\x03\xf8\x07\xf0\x00\x00\x00\x00\x01\xff?\xc0\x00\x00\x00\x00\x00\x7f\xff\x80\x00\x00\x00\x00\x00?\xff\x00\x00\x00\x00\x00\x00\x0f\xfc\x00\x00\x00\x00\x00\x00\x03\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Rock=b'P4\n64\n64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00~\x00\x00\x00\x00\x00\x00\xc1\xff\xc0\x00\x00\x00\x00\x07\xff\xff\xe0\x00\x00\x00\x00\x1f\xff\xff\xf0\x00\x00\x00\x00?\xff\xc3\xf8\x00\x00\x00\x00?\xff\x00\xff\xf0\x00\x00\x00|\x0f\x00\x7f\xfc\x00\x00\x00x\x0e\x00\xff\xfe\x00\x00\x07\xf8\x1e\x03\xff\xff\x00\x00\x1f\xf8\x1c\x0f\xf0\x1f\x80\x00?\xf0\x1c\x1f\x80\x0f\xc0\x00\x7f\xf0\x1c\x1e\x00\x07\xe0\x00\xfe\xf0\x1e<\x00\x03\xe0\x00\xf8p\x1e8\x00\x01\xe0\x00\xf0p\x0e8\x00\x01\xf0\x01\xf0x\x0e8\x00\x00\xf0\x01\xe0x\x0f8\x00\x00\xf0\x01\xe0<\x078\x00\x00\xf0\x01\xe0<\x07\xfc\x0f\x00\xf0\x03\xe0\x1e\x03\xbf\xff\x00\xf0\x0f\xf0\x1f\x03\xff\xff\x00\xf8\x1f\xf0\x0f\x81\xef\xfc\x00\xf8\x1f\xf0\x07\xc0\xff\xe0\x00x>x\x03\xe0\xff\x80\x00\xf8><\x01\xf1\xfc\x00\x00\xf8<>\x00\xff\xf0\x00\x00\xf8<\x1f\x00\x7f\xc0\x00\x00\xf0<\x0f\x80?\x00\x00\x00\xf0>\x07\xc0~\x00\x00\x00\xf0\x1e\x03\xe1\xf8\x00\x00\x00\xf0\x1f\x01\xf3\xf0\x00\x00\x01\xf0\x1f\x00\xff\xc0\x00\x00\x01\xe0\x0f\x80\x7f\x80\x00\x00\x01\xe0\x0f\x80\x1f\x00\x00\x00\x03\xe0\x07\xc0\x1e\x00\x00\x00\x03\xe0\x03\xe0<\x00\x00\x00\x07\xc0\x03\xf8x\x00\x00\x00\x0f\xc0\x01\xfcx\x00\x00\x00\x1f\x80\x00\xff\xf0\x00\x00\x00\x7f\x00\x00?\xf0\x00\x00\x01\xfe\x00\x00\x1f\xf0\x00\x00\x07\xfc\x00\x00\x07\xf0\x00\x00\x1f\xf0\x00\x00\x00\xf8\x00\x00?\xc0\x00\x00\x00|\x00\x00\xff\x80\x00\x00\x00~\x00\x03\xfe\x00\x00\x00\x00?\x00\x0f\xf8\x00\x00\x00\x00\x1f\x80?\xe0\x00\x00\x00\x00\x1f\xe0\xff\x80\x00\x00\x00\x00\x07\xff\xfe\x00\x00\x00\x00\x00\x03\xff\xf8\x00\x00\x00\x00\x00\x01\xff\xe0\x00\x00\x00\x00\x00\x00\x7f\xc0\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Sad=b'P4\n64\n64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xfc\x00\x00\x00\x00\x00\x03\xff\xff\xc0\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00?\xff\xff\xfc\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x03\xff\xfe\xff\xff\xc0\x00\x00\x07\xff\x80\x03\xff\xe0\x00\x00\x0f\xfe\x00\x00\x7f\xf0\x00\x00\x1f\xf0\x00\x00\x1f\xf8\x00\x00?\xe0\x00\x00\x07\xfc\x00\x00\x7f\x80\x00\x00\x01\xfe\x00\x00\xff\x00\x00\x00\x00\xff\x00\x01\xfe\x00\x00\x00\x00\x7f\x00\x01\xfc\x00\x00\x00\x00?\x80\x03\xf8\x00\x00\x00\x00\x1f\xc0\x03\xf0\x00\x00\x00\x00\x1f\xc0\x07\xf0\x00\x00\x00\x00\x0f\xe0\x0f\xe0\x00\x00\x00\x00\x07\xe0\x07\xe0\x00\x00\x00\x00\x07\xf0\x0f\xc0\x00\x00\x00\x00\x03\xf0\x1f\xc0\x00\x00\x00\x00\x01\xf8\x1f\x80\x00\x00\x00\x00\x01\xf8\x1f\x80\x00\x00\x00\x00\x01\xf8?\x00\x00\x00\x00\x00\x01\xfc\x1f\x07\xff\xe0\x0f\xff\xc0\xf8?\x07\xff\xe0\x0f\xff\xe0\xfc?\x07\xff\xf0\x0f\xff\xc0\xfc?\x07\xff\xe0\x0f\xff\xc0\xfc?\x00\x7f\x00\x00\xfe\x00\xfc?\x00?\x00\x00\xfc\x00\xfc>\x00\x7f\x00\x00\xfe\x00|?\x00?\x00\x00~\x00\xfc?\x00~\x00\x00\xfe\x00\xfc?\x00?\x00\x00\xfe\x00\xfc?\x00\x7f\x00\x00\xfc\x00\xfc\x1f\x00\x7f\x00\x00\xfe\x00\xf8\x1f\x00?\x00\x00\xfe\x01\xfc\x1f\x80\x7f\x00\x00\xfe\x01\xf8\x1f\x80\x7f\x00\x00\xfe\x01\xf8\x1f\xc0?\x00\x00|\x01\xf8\x0f\xc0\x7f\x00\x00\xfe\x03\xf0\x0f\xe0\x7f\x0f\xe0\xfe\x03\xf0\x07\xe0?\x1f\xf8\xfe\x07\xe0\x07\xf0\x7f\x7f\xfe\xfc\x0f\xe0\x03\xf0\x7f|?~\x0f\xc0\x03\xf8?\xf0\x0f\xfe\x1f\xc0\x01\xfc\x7f\xe0\x07\xfe?\x80\x00\xfe\x7f\xc0\x03\xfe\x7f\x00\x00\xff?@\x02\xfe\xff\x00\x00\x7f\xff\x00\x00\xff\xfe\x00\x00?\xff\x00\x00\xff\xfc\x00\x00\x1f\xff\x00\x00\xff\xf8\x00\x00\x0f\xff\x00\x00\xff\xf0\x00\x00\x07\xff\xc0\x00\xff\xe0\x00\x00\x01\xff\xff\x7f\xff\x80\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00?\xff\xff\xfc\x00\x00\x00\x00\x0f\xff\xff\xf8\x00\x00\x00\x00\x03\xff\xff\x80\x00\x00\x00\x00\x00?\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Scissors=b'P4\n64\n64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x80\x00\x00\x00\x00\x00\x00?\xf0\x00\x00\x00\x00\x00\x00\xff\xfc\x00\x00\x00\x00\x00\x01\xff\xff\x00\x00\x00\x00\x00\x01\xf8\xff\x80\x00\x00\x00\x00\x03\xe0\x1f\xc0\x00\x00\x00\x00\x07\xc0\x07\xf0\x00\x00\x00\x00\x07\xc0\x03\xf8\x00\x00\x00\x00\x07\x80\x01\xfc\x00\x00\x00\x00\x07\x80\x00~\x00\x00\x00\x00\x07\x80\x00?\x00\x00\x00\x00\x07\x80\x00\x1f\xfc\x00\x00\x00\x07\xc0\x00\x0f\xff\x80\x00\x00\x03\xe0\x00\x07\xff\xe0\x00\x00\x03\xf0\x00\x03\xff\xf8\x00\x00\x01\xf8\x00\x00\xe7\xfc\x00\x00\x00\xfc\x00\x01\xe0\xfe\x00\x00\x00\x7f\x00\x01\xe0?\x00\x00\x03\xff\x80\x01\xc0\x1f\x80\x00\x7f\xff\xe0\x03\xc0\x1f\x80\x01\xff\xff\xf8\x03\x80\x1f\xc0\x03\xff\xff\xff\x03\x80\x1f\xe0\x07\xff\xff\xff\x07\x80\x1f\xe0\x0f\xc0\x01\xff\x07\x00\x1f\xe0\x0f\x80\x00\x1e\x07\x00=\xf0\x1f\x00\x00\x00\x07\x00<\xf0\x1e\x00\x00\x00\x07\x008\xf0\x1e\x00\x00\x00\x0f\x00x\xf0\x1e\x00\x00\x00\x7f\x00\xf0\xf0\x1f\x00\x00\x01\xff\x00\xf0\xf8\x0f\x00\x00\x07\xff\x01\xe0\xf8\x0f\x80\x00\x0f\xef\x03\xc0x\x0f\xe0\x00?\x07\x87\xc0\xf8\x07\xff\x7f\xfe\x03\xff\x80\xf8\x03\xff\xff\xfc\x03\xff\x00\xf8\x01\xff\xff\xf8\x01\xfe\x00\xf0\x00\x7f\xff\xf8\x07\xff\x00\xf0\x00\x01\xd0|\x7f\xff\xc0\xf0\x00\x00\x00\x7f\xff\xff\xe0\xf0\x00\x00\x00?\xfc\x01\xf1\xf0\x00\x00\x00\x1f\xe0\x00\xf1\xe0\x00\x00\x00\x0f\x00\x00s\xe0\x00\x00\x00\x0f\x00\x00s\xe0\x00\x00\x00\x0f\x00\x00\xff\xc0\x00\x00\x00\x0f\x00\x00\xff\x80\x00\x00\x00\x0f\x80\x03\xff\x00\x00\x00\x00\x07\xf0\xff\xfe\x00\x00\x00\x00\x07\xff\xff\xfc\x00\x00\x00\x00\x03\xff\xff\xc0\x00\x00\x00\x00\x01\xff\xfe\x00\x00\x00\x00\x00\x007@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Silly=b'P4\n64\n64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xfc\x00\x00\x00\x00\x00\x03\xff\xff\xc0\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00?\xff\xff\xfc\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x03\xff\xf4\x1f\xff\xc0\x00\x00\x07\xff\x00\x01\xff\xe0\x00\x00\x0f\xfc\x00\x00?\xf0\x00\x00\x1f\xf0\x00\x00\x0f\xf8\x00\x00?\xc0\x00\x00\x03\xfc\x00\x00\x7f\x80\x00\x00\x01\xfe\x00\x00\xff\x00\x00\x00\x00\xff\x00\x00\xfc\x00\x00\x00\x00?\x00\x01\xfc\x00\x00\x00\x00?\x80\x03\xf8\x00\x00\x00\x00\x1f\xc0\x07\xf0\x01\x00\x00\x00\x0f\xc0\x07\xe0\x03\x80\x01\xe0\x07\xe0\x07\xe0\x07\x80\x01\xe0\x07\xe0\x0f\xc0\x0f\x80\x01\xf0\x03\xf0\x0f\xc0?\x00\x00\xfc\x03\xf0\x1f\x87\xfe\x00\x00\x7f\xe1\xf8\x1f\x87\xfc\x00\x00?\xe1\xf8\x1f\x07\xf8\x00\x00\x0f\xf0\xf8\x1f\x07\xcc\x00\x00s\xe1\xf8?\x00\x1f\x00\x00\xf8\x00\xfc?\x00?\x80\x01\xfc\x00\xfc?\x00\x7f\xc0\x03\xfc\x00|>\x00\x7f\xc0\x01\xfe\x00\xfc>\x00?\x80\x03\xfe\x00|>\x00?\x80\x01\xfc\x00|?\x00?\x80\x00\xf8\x00|>\x00\x0e\x00\x00p\x00\xfc>\x00\x00\x00\x00\x00\x00|?\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00\xfc\x1f\x00\x00\x03\xc0\x00\x00\xf8?\x00\x00\x07\xe0\x00\x00\xfc\x1f\x00\x00\x0f\xe0\x00\x00\xf8\x1f\x80\x00\x07\xe0\x00\x01\xf8\x1f\x80\x00\x07\xf0\x00\x01\xf8\x0f\xc0\x00\x0f\xe0\x00\x03\xf0\x0f\xc0\x00\x0f\xe0\x00\x03\xf0\x07\xe0\x00\x07\xe0\x00\x07\xe0\x07\xe0\x00\x07\xf0\x00\x07\xe0\x07\xf0\x00\x0f\xe0\x00\x0f\xc0\x03\xf8\x00\x07\xe0\x00\x1f\xc0\x01\xfc\x00\x0f\xf0\x00?\x80\x00\xfc\x00\x07\xe0\x00?\x00\x00\xff\x00\x07\xe0\x00\xff\x00\x00\x7f\x80\x07\xc0\x01\xfe\x00\x00?\xc0\x00\x80\x03\xfc\x00\x00\x1f\xf0\x00\x00\x0f\xf8\x00\x00\x0f\xfc\x00\x00?\xf0\x00\x00\x07\xff\x00\x01\xff\xe0\x00\x00\x01\xff\xfa7\xff\x80\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00?\xff\xff\xfc\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\x03\xff\xff\xc0\x00\x00\x00\x00\x00?\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Sleep=b'P4\n64\n64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xfc\x00\x00\x00\x00\x00\x03\xff\xff\xc0\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\x7f\xff\xff\xfc\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x03\xff\xfd\x7f\xff\xc0\x00\x00\x07\xff\x80\x01\xff\xe0\x00\x00\x0f\xfc\x00\x00\x7f\xf0\x00\x00\x1f\xf8\x00\x00\x1f\xf8\x00\x00?\xc0\x00\x00\x07\xfc\x00\x00\x7f\xc0\x00\x00\x01\xfe\x00\x00\xff\x00\x00\x00\x00\xff\x00\x01\xfe\x00\x00\x00\x00\x7f\x00\x01\xfc\x00\x00\x00\x00?\x80\x03\xf8\x00\x00\x00\x03\xff\xc0\x03\xf0\x00\x00\x00\x07\xef\xc0\x07\xf0\x00\x00\x00\x00\xef\xe0\x07\xe0\x00\x00\x00\x01\xc7\xe0\x0f\xe0\x00\x00\x00\x07\xa7\xf0\x0f\xc0\x00\x00\x00\x07\xe3\xf0\x1f\x80\x00\x00\x00\xf3C\xf8\x1f\x80\x00\x00\x01\xf8\x01\xf8\x1f\x80\x00\x00\x00p\x01\xf8\x1f\x80\x00\x00\x00\xe0\x00\xf8?\x00\x00\x00\x01\xf8\x00\xfc?\x00\x00\x00\x00\xf0\x00\xfc?\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00\xfc>\x03\xff\xe0\x07\xaf\xc0\xfc?\x03\xff\xe0\x07\xff\xc0\xfc?\x03\xff\xe0\x07\xff\xc0|?\x01\xff\x80\x03\xff\x80\xfc>\x00\x00\x00\x00\x10\x00\xfc?\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00\xfc\x1f\x00\x00\x00\x00\x00\x00\xfc?\x80\x00\x00\x00\x00\x00\xf8\x1f\x80\x00\x00\x00\x00\x01\xf8\x1f\x80\x00\x01@\x00\x01\xf8\x1f\xc0\x00\x1f\xf8\x00\x03\xf8\x0f\xc0\x00\x7f\xfe\x00\x03\xf0\x0f\xe0\x00\xff\xff\x00\x03\xf0\x07\xe0\x01\xff\xff\x80\x07\xe0\x07\xf0\x01\xff\xff\x80\x0f\xe0\x03\xf0\x03\xff\xff\xc0\x0f\xc0\x03\xf8\x03\xff\xff\xc0?\xc0\x01\xfc\x01\xff\xff\x80?\x80\x00\xfe\x01\xff\xff\x80\x7f\x80\x00\xff\x00|\x00\x00\xff\x00\x00\x7f\x80x\x00\x01\xfe\x00\x00?\xe0<\x00\x07\xfc\x00\x00\x1f\xf88\x00\x1f\xf8\x00\x00\x0f\xfe\x00\x00\x7f\xf0\x00\x00\x07\xff\x80\x03\xff\xe0\x00\x00\x03\xff\xfd\xff\xff\x80\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00?\xff\xff\xfc\x00\x00\x00\x00\x0f\xff\xff\xf8\x00\x00\x00\x00\x03\xff\xff\x80\x00\x00\x00\x00\x00?\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Small_heart=b'P4\n64\n64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xe0\x07\xf8\x00\x00\x00\x00\x7f\xf8\x1f\xfe\x00\x00\x00\x00\xff\xfe?\xff\x00\x00\x00\x01\xff\xff\x7f\xff\x80\x00\x00\x03\xff\xff\xff\xff\xc0\x00\x00\x07\xff\xff\xff\xff\xe0\x00\x00\x07\xff\xff\xff\xff\xe0\x00\x00\x0f\xff\xff\xff\xff\xf0\x00\x00\x0f\xff\xff\xff\xff\xf0\x00\x00\x0f\xff\xff\xff\xff\xf0\x00\x00\x0f\xff\xff\xff\xff\xf0\x00\x00\x0f\xff\xff\xff\xff\xf0\x00\x00\x0f\xff\xff\xff\xff\xf0\x00\x00\x0f\xff\xff\xff\xff\xf0\x00\x00\x0f\xff\xff\xff\xff\xe0\x00\x00\x07\xff\xff\xff\xff\xe0\x00\x00\x07\xff\xff\xff\xff\xe0\x00\x00\x03\xff\xff\xff\xff\xc0\x00\x00\x03\xff\xff\xff\xff\xc0\x00\x00\x01\xff\xff\xff\xff\x80\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x7f\xff\xff\xff\x00\x00\x00\x00\x7f\xff\xff\xfc\x00\x00\x00\x00?\xff\xff\xfc\x00\x00\x00\x00\x1f\xff\xff\xf8\x00\x00\x00\x00\x0f\xff\xff\xe0\x00\x00\x00\x00\x07\xff\xff\xe0\x00\x00\x00\x00\x01\xff\xff\xc0\x00\x00\x00\x00\x01\xff\xff\x00\x00\x00\x00\x00\x00\x7f\xff\x00\x00\x00\x00\x00\x00\x7f\xfc\x00\x00\x00\x00\x00\x00\x1f\xf8\x00\x00\x00\x00\x00\x00\x0f\xf8\x00\x00\x00\x00\x00\x00\x07\xe0\x00\x00\x00\x00\x00\x00\x03\xc0\x00\x00\x00\x00\x00\x00\x01\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Small_paper=b'P4\n32\n32\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x1f\x1e\x00\x00;\xbf\x00\x001\xf3\x00\x00q\xe1\x80\x00a\xc3\xa0\x00a\x83\xf0\x1fa\x87\xf8?\xe1\x87\x181\xe0\x0e\x180\xe0\x1c80`\x08p\x18 \x00\xe0\x1c\x00\x01\xf0\x0e\x00\x03\xf8\x06\x00\x01\x1c\x06\x00\x00\x0c\x06\x00\x00\x1c\x06\x00\x00\xf8\x0e\x00\x1f\xf0\x06\x00\x1f\x80\x06\x000\x00\x07\x00p\x00\x03\x80\xe0\x00\x01\xc3\xc0\x00\x00\xff\x00\x00\x00>\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Small_rock=b'P4\n32\n32\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00?\xf8\x00\x00\x7f\x9c\x00\x00\xe3\x0f\xe0\x03\xc6\x1f\xf0\x07\xc6p8\x0e\xc6`\x18\x0c\xc2@\x1c\x18\xc3@\x0c\x18c\xe3\x0c<q\xff\x0c|8\xf8\x0cf\x1d\xe0\x0cg\x0f\x80\x0cc\x8e\x00\x0cq\xdc\x00\x1c0\xf0\x00\x188`\x00\x18\x1c\xc0\x008\x0f\xc0\x00\xf0\x07\xc0\x03\xe0\x00\xc0\x07\x80\x00\xe0\x1e\x00\x00px\x00\x00?\xe0\x00\x00\x1f\x80\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Small_scissors=b'P4\n32\n32\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|\x00\x00\x01\xff\x00\x00\x01\x87\x80\x00\x03\x81\xc0\x00\x03\x00\xe0\x00\x03\x00~\x00\x01\x80?\x80\x01\xc0\x0b\xe0\x00\xf0\x18p\x0f\xf8\x18p\x1f\xff\x10x8\x1f0xp\x000l`\x000\xccp\x01\xf0\xcc0\x03\xb1\x8c?\xfe\x1f\x0c\x1f\xfc\x1e\x0c\x01\xce\xff\x8c\x00\x07\xe1\xdc\x00\x03\x00\xd8\x00\x03\x00\xf8\x00\x03\x01\xf0\x00\x03\xff\xe0\x00\x01\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Smile=b'P4\n64\n64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xfc\x00\x00\x00\x00\x00\x03\xff\xff\xc0\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00?\xff\xff\xfc\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x03\xff\xff\x7f\xff\xc0\x00\x00\x07\xff\x80\x03\xff\xe0\x00\x00\x0f\xfc\x00\x00?\xf0\x00\x00\x1f\xf0\x00\x00\x1f\xf8\x00\x00?\xe0\x00\x00\x07\xfc\x00\x00\x7f\x80\x00\x00\x01\xfe\x00\x00\xff\x00\x00\x00\x00\xff\x00\x00\xfe\x00\x00\x00\x00\x7f\x00\x03\xfc\x00\x00\x00\x00?\x80\x03\xf8\x00\x00\x00\x00\x1f\xc0\x03\xf8\x00\x00\x00\x00\x0f\xc0\x07\xe0\x00\x00\x00\x00\x0f\xe0\x07\xe0\x00\x00\x00\x00\x07\xe0\x0f\xe0\x00\x00\x00\x00\x07\xf0\x0f\xc0\x00\x00\x00\x00\x03\xf0\x1f\xc0?\x00\x01\xfc\x03\xf8\x1f\x80\x7f\xc0\x03\xfe\x01\xf8\x1f\x80\xff\xe0\x07\xff\x01\xf8\x1f\x01\xff\xf0\x0f\xff\x81\xf8?\x03\xfb\xf0\x1f\xef\xc0\xfc?\x03\xe0\xf8\x1f\x07\xc0\xfc?\x03\xc0\xf8\x1f\x07\xc0\xfc?\x07\xc0\xf8\x1e\x03\xc0\xfc?\x03\xc0x\x1e\x03\xe0|?\x03\xc0x\x1e\x03\xc0\xfc?\x01\x80 \x0c\x00\x80\xfc>\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00|?\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00\xf8\x1f\x80\x00\x00\x00\x00\x01\xfc\x1f\x80\x00\x00\x00\x00\x01\xf8\x1f\x80\x00\x00\x00\x00\x01\xf8\x0f\xc0\x00\x00\x00\x00\x01\xf0\x0f\xc0\x0e\x00\x000\x03\xf8\x0f\xe0\x0f\x00\x00x\x07\xe0\x07\xe0\x1f\x00\x00\xf0\x07\xf0\x07\xf0\x0f\x00\x00\xf0\x0f\xe0\x03\xf0\x07\x80\x01\xf0\x0f\xc0\x03\xf8\x07\xc0\x03\xe0\x1f\xc0\x01\xfc\x07\xe0\x07\xe0?\x80\x01\xfe\x03\xfc\x1f\xc0\x7f\x80\x00\xff\x01\xff\xff\x80\xff\x00\x00\x7f\xc0\xff\xfe\x03\xfe\x00\x00?\xe0?\xfc\x07\xfc\x00\x00\x1f\xf0\x0f\xf0\x1f\xf8\x00\x00\x0f\xfe\x00\x00?\xf0\x00\x00\x07\xff\xc0\x03\xff\xe0\x00\x00\x03\xff\xff\x7f\xff\x80\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00?\xff\xff\xfc\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\x03\xff\xff\x80\x00\x00\x00\x00\x00?\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Surprise=b'P4\n64\n64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xfc\x00\x00\x00\x00\x00\x03\xff\xff\xc0\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\x7f\xff\xff\xfc\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x03\xff\xfd\x7f\xff\xc0\x00\x00\x07\xff\x80\x01\xff\xe0\x00\x00\x0f\xfc\x00\x00\x7f\xf0\x00\x00\x1f\xf8\x00\x00\x1f\xf8\x00\x00?\xc0\x00\x00\x07\xfc\x00\x00\x7f\xc0\x00\x00\x01\xfe\x00\x00\xff\x00\x00\x00\x00\xff\x00\x01\xfe\x00\x00\x00\x00\x7f\x00\x01\xfc\x00\x00\x00\x00?\x80\x03\xf8\x00\x00\x00\x00\x1f\xc0\x03\xf0\x00\x00\x00\x00\x1f\xc0\x07\xf0\x00\x00\x00\x00\x0f\xe0\x07\xe0\x00\x00\x00\x00\x07\xf0\x0f\xc0\x00\x00\x00\x00\x07\xf0\x0f\xc0\x10\x00\x00\x10\x03\xf0\x1f\xc0>\x00\x00|\x01\xf8\x1f\x80\x7f\x00\x00~\x01\xf8\x1f\x80\xff\x00\x00\xff\x01\xf8\x1f\x80\xff\x80\x01\xff\x00\xf8?\x00\xff\x00\x01\xff\x00\xfc?\x00\xff\x80\x01\xff\x00\xfc?\x00\xff\x00\x00\xff\x00\xfc?\x00\xff\x80\x01\xff\x00\xfc>\x00\x7f\x00\x00\xff\x00\xfc?\x00~\x00\x00~\x00|?\x00>\x00\x008\x00\xfc>\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00|?\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00\xfc\x1f\x80\x00\x00\x00\x00\x01\xf8\x1f\x80\x00\x03\xc0\x00\x01\xf8\x1f\x80\x00\x07\xe0\x00\x01\xf8\x1f\xc0\x00\x0f\xf0\x00\x01\xf8\x0f\xc0\x00\x0f\xf0\x00\x03\xf0\x0f\xe0\x00\x0f\xf0\x00\x07\xf0\x07\xe0\x00\x0f\xf8\x00\x07\xe0\x07\xf0\x00\x1f\xf0\x00\x0f\xe0\x03\xf8\x00\x0f\xf8\x00\x0f\xc0\x03\xf8\x00\x0f\xf0\x00\x1f\xc0\x01\xfc\x00\x0f\xf0\x00?\x80\x00\xfe\x00\x0f\xe0\x00\x7f\x80\x00\xff\x00\x07\xe0\x00\xff\x00\x00\x7f\xc0\x03\xc0\x03\xfe\x00\x00?\xe0\x00\x00\x07\xfc\x00\x00\x1f\xf8\x00\x00\x1f\xf8\x00\x00\x0f\xfe\x00\x00\x7f\xf0\x00\x00\x07\xff\x80\x03\xff\xe0\x00\x00\x01\xff\xff\xff\xff\x80\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00?\xff\xff\xfc\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\x03\xff\xff\x80\x00\x00\x00\x00\x00/\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Wonderful=b'P4\n64\n64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xfc\x00\x00\x00\x00\x00\x03\xff\xff\xc0\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00?\xff\xff\xfc\x00\x00\x02\x00\xff\xff\xff\xff\x00\x00\x07\x03\xff\xff\x7f\xff\xc0\x00\x07\x87\xff\x80\x03\xff\xe0\x00\x1f\xcf\xfc\x00\x00\x7f\xf0\x00\x1f\xdf\xf8\x00\x00\x1f\xf8\x00\x07?\xe0\x00\x00\x07\xfc\x00\x02\x7f\x80\x00\x00\x19\xfe\x00\x02\xff\x00\x00\x00\x1c\xff\x00\x00\xfe\x00\x00\x00>\x7f\x00\x01\xfc\x00\x00\x00\x7f?\x80\x03\xf8\x00\x00\x00\x1c\x1f\xc0\x03\xf0\x00\x00\x00\x18\x1f\xe0\x07\xf0\x00\x00\x00\x08\x0f\xe0\x07\xe0\x00\x00\x00\x00\x07\xe0\x0f\xe0\x00\x00\x00\x00\x07\xf0\x0f\xc0<\x00\x008\x03\xf0\x1f\x80\xff\x00\x00\xff\x01\xf8\x1f\x80\xff\x80\x01\xff\x01\xf8\x1f\x81\xff\x80\x01\xff\x81\xf8?\x83\xff\xc0\x01\xff\xc0\xfc\x1f\x01\xff\xc0\x03\xff\x80\xf8?\x03\xff\xc0\x03\xff\xc0\xfc?\x01\xff\xc0\x03\xff\x80\xfc?\x01\xff\x80\x01\xff\x80\xfc>\x00\xff\x80\x01\xff\x80|?\x00~\x00\x00\xfe\x00\xfc?\x00\x1c\x00\x008\x00\xfc>\x00\x00\x00\x00\x00\x00|?\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00\xfc?\x00\x00\x00\x00\x00\x00\xf8\x1f\x80\x00\x00\x00\x00\x01\xfc\x1f\x80\x00\x00\x00\x00\x01\xf8\x1f\x80\x00\x00\x00\x00\x01\xf8\x1f\xc0\x00\x00\x00\x01\x03\xf0\x0f\xc0\x00\x00\x00\x01\x83\xf8\x0f\xe0\x00\xff\xff\x03\xc3\xf0\x07\xe0\x00\xff\xff\x0f\xe7\xe0\x07\xf0\x00\xff\xff\x07\xcf\xe0\x03\xf0\x00\x7f\xff\x01\x9f\xc0\x03\xf8\x00\x7f\xfe\x01\x9f\xc0\x01\xfc\x00?\xfc\x00?\x80\x00\xfe\x00\x1f\xf8\x00\x7f\x80\x00\xff\x00\x07\xe0\x00\xff\x00\x00\x7f\x80\x00\x00\x01\xfe\x00\x00?\xe0\x00\x00\x07\xfc\x00\x00\x1f\xf8\x00\x00\x1f\xf8\x00\x00\x0f\xfe\x00\x00\x7f\xf0\x00\x00\x07\xff\xc0\x01\xff\xe0\x00\x00\x03\xff\xff\xff\xff\x80\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00?\xff\xff\xfc\x00\x00\x00\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\x03\xff\xff\x80\x00\x00\x00\x00\x00?\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

View File

@@ -0,0 +1,31 @@
#Take the picture bytes in eye_picture.py
#--dahanzimin From the Mixly Team
Eyes_Angry=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1e\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1f\x80\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1f\xe0\x00\x00\x07\x000\x00\x00\x00\x1c\x7f\x1d\xf8\x00\x00\x07\x000\x00\x00\x00|\x7f\x1c\xfe\x00\x00\x07\x000\x00\x00\x01\xfc\x7f\x1c?\x80\x00\x07\x000\x00\x00\x07\xfc\x7f\x1c\x0f\xe0\x00\x07\x000\x00\x00\x1f\x8c\x7f\x1c\x03\xf8\x00\x07\x000\x00\x00~\x0c\x7f\x1c\x00\xfe\x00\x07\x000\x00\x01\xf8\x0c\x7f\x1c\x00?\x80\x07\x000\x00\x07\xe0\x0c\x7f\x1c\x00\x0f\xe0\x07\x000\x00\x1f\x80\x0c\x7f\x1c\x00\x07\xf8\x07\x000\x00\x7f\x00\x0c\x7f\x1c\x00\x0f\xfe\x07\x000\x01\xfc\x00\x0c\x7f\x1c\x00\x1f\xff\x87\x000\x07\xf6\x80\x0c\x7f\x1c\x00?\x9f\xe7\x000\x1f\xf2\x00\x0c\x7f\x1c\x00\xbf\xbb\xff\x000\x7f\xef\x00\x0c\x7f\x1c\x00\x7f\xfc\xff\x001\xff\xff@\x0c\x7f\x1c\x00\x7f\xfc?\x00?\xff\xff\x00\x0c\x7f\x1c\x00\x7f\xfc\x0f\x00?\xaf\xff@\x0c\x7f\x1c\x00?\xf8\x07\x00>\x0f\xff\x00\x0c\x7f\x1c\x00\xbf\xfa\x07\x008\x07\xfe\x00\x1c\x7f\x0e\x00\x1f\xf0\x0e\x008\x17\xfe\x80\x1c\x7f\x0e\x00\x0f\xe0\x0e\x00<\x03\xfc\x00<\x7f\x0f\x00\x03\x80\x1e\x00\x1c\x04\xf2\x008\x7f\x07\x80\x04 <\x00\x1e\x01\x08\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Awake=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1f\x00\x00\x00\x07\x000\x00\x00\x00|\x7f\x1f\xf8\x00\x00\x07\x000\x00\x00\x07\xfc\x7f\x1f\xff\xc0\x00\x07\x000\x00\x01\xff\xfc\x7f\x1c\x1f\xff\x00\x07\x000\x00?\xfe\x0c\x7f\x1c\x00\xff\xf0\x07\x000\x07\xff\xc0\x0c\x7f\x1c\x00?\xff\x87\x000\x7f\xfe\x00\x0c\x7f\x1c\x01\x7f\xff\xff\x00?\xff\xff\x00\x0c\x7f\x1c\x00~i\xff\x00?\xe1\xfd\xa0\x0c\x7f\x1c\x02\xfeh\x0f\x00<\x03\xf9\xc0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x03\xff\xc0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x0b\xff\xd0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x03\xff\xc0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x0b\xff\xd0\x0c\x7f\x1c\x02\xff\xe8\x07\x000\x03\xff\xc0\x0c\x7f\x1c\x00\xff\xc0\x07\x000\x05\xff\xa0\x0c\x7f\x1c\x01\x7f\xd0\x07\x000\x00\xff\x00\x0c\x7f\x1c\x00\x1f\x00\x07\x000\x00~\x00\x0c\x7f\x1c\x00@@\x07\x000\x00\x81\x00\x0c\x7f\x1c\x00\n\x00\x07\x000\x00(\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Black_eye=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00?\xff\xfc\x00\x7f\x00\x00\x00\x00\x00\x00\x01\xff\xff\xff\x80\x7f\x00\x00\x00\x00\x00\x00\x03\xff\xff\xff\xc0\x7f\x00\x1f\xff\xfe\x00\x00\x07\xc0\x00\x03\xe0\x7f\x00\x7f\xff\xff\xc0\x00\x0f\x00\x00\x00\xf0\x7f\x01\xff\xff\xff\xf0\x00\x1e\x00\x00\x00x\x7f\x03\xfa\xaa\xab\xf8\x00\x1c\x00\x00\x008\x7f\x07\xd2U%|\x008\x00\x00\x00\x1c\x7f\x07\xad\xaa\xda\xbc\x008\x00\x00\x00\x1c\x7f\x0fRU%^\x008\x00\x00\x00\x1c\x7f\x0fm\xaa\xda\xae\x000\x00\x00\x00\x0c\x7f\x1e\x92U$\xaf\x000\x00\x00\x00\x0c\x7f\x1dm\xaa\xdbW\x000\x00\x00\x00\x0c\x7f\x1e\x92U$\xaf\x000\x00\x00\x00\x0c\x7f\x1dm\xaa\xdbW\x000\x00\x00\x00\x0c\x7f\x1c\x92U$\xaf\x000\x00\x00\x00\x0c\x7f\x1fm\xaa\xdbW\x000\x00\x00\x00\x0c\x7f\x1c\x92U$\x97\x000\x00\x00\x00\x0c\x7f\x1f\xff\xff\xff\xff\x000\x00B\x00\x0c\x7f\x1f\xff\xff\xff\xff\x000\x018\x80\x0c\x7f\x1f\xff\xff\xff\xff\x000\x00\x7f\x00\x0c\x7f\x1c\x00\x7f\xc0\x07\x000\x05\xfd\xa0\x0c\x7f\x1c\x00\xfe`\x07\x000\x01\xfc\x80\x0c\x7f\x1c\x02\xfe\xe8\x07\x000\x03\xfb\xc0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x0b\xff\xd0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x03\xff\xc0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x0b\xff\xd0\x0c\x7f\x1c\x02\xff\xe8\x07\x000\x03\xff\xc0\x0c\x7f\x1c\x00\xff\xe0\x07\x000\x01\xff\x80\x0c\x7f\x1f\xff\xff\xff\xff\x000\x05\xff\xa0\x0c\x7f\x1f\xff\xff\xff\xff\x000\x00\xff\x00\x0c\x7f\x1f\xff\xff\xff\xff\x000\x01<\x80\x0c\x7f\x1dUUUW\x000\x00B\x00\x0c\x7f\x1dT\x92UW\x000\x00\x00\x00\x0c\x7f\x1e\xabm\xaa\xaf\x000\x00\x00\x00\x0c\x7f\x1dT\x92UW\x000\x00\x00\x00\x0c\x7f\x1fKm\xaa\xaf\x000\x00\x00\x00\x0c\x7f\x0e\xb4\x92U\xae\x000\x00\x00\x00\x0c\x7f\x0fKm\xaa^\x008\x00\x00\x00\x1c\x7f\x07\xb4\x92U\xbc\x008\x00\x00\x00\x1c\x7f\x07\xcbm\xaa|\x00<\x00\x00\x00<\x7f\x03\xf4\x92K\xf8\x00\x1c\x00\x00\x008\x7f\x01\xff\xff\xff\xf0\x00\x1e\x00\x00\x00x\x7f\x00\x7f\xff\xff\xc0\x00\x0f\x80\x00\x01\xf0\x7f\x00\x1f\xff\xff\x00\x00\x07\xe0\x00\x07\xe0\x7f\x00\x00\x00\x00\x00\x00\x03\xff\xff\xff\xc0\x7f\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Bottom_left=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x02\x80\x00\x07\x000\x05\x00\x00\x0c\x7f\x1c\x10\x10\x00\x07\x000 @\x00\x0c\x7f\x1c\x07\xc8\x00\x07\x000\x1f\x80\x00\x0c\x7f\x1c_\xf0\x00\x07\x000?\xc0\x00\x0c\x7f\x1c\x1f\x98\x00\x07\x001\x7fh\x00\x0c\x7f\x1c\xbf\x9a\x00\x07\x000\xfep\x00\x0c\x7f\x1c\x7f\xfc\x00\x07\x000\xff\xf0\x00\x0c\x7f\x1c\x7f\xfc\x00\x07\x002\xff\xf4\x00\x0c\x7f\x1c\x7f\xfc\x00\x07\x000\xff\xf0\x00\x0c\x7f\x1c\x7f\xfc\x00\x07\x002\xff\xf4\x00\x0c\x7f\x1c\xbf\xfa\x00\x07\x000\xff\xf0\x00\x0c\x7f\x1c?\xf0\x00\x07\x001\x7f\xe8\x00\x0c\x7f\x1c_\xf4\x00\x07\x000?\xc0\x00\x0c\x7f\x1c\x07\xc0\x00\x07\x000\x1f\x80\x00\x0c\x7f\x1c\x10\x10\x00\x07\x008 @\x00\x1c\x7f\x0e\x02\x80\x00\x0e\x008\n\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Bottom_right=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00(\x07\x000\x00\x00P\x0c\x7f\x1c\x00\x01\x01\x07\x000\x00\x02\x04\x0c\x7f\x1c\x00\x00|\x87\x000\x00\x01\xf8\x0c\x7f\x1c\x00\x05\xff\x07\x000\x00\x03\xfc\x0c\x7f\x1c\x00\x01\xf9\x87\x000\x00\x17\xf6\x8c\x7f\x1c\x00\x0b\xf9\xa7\x000\x00\x0f\xe7\x0c\x7f\x1c\x00\x07\xff\xc7\x000\x00\x0f\xff\x0c\x7f\x1c\x00\x07\xff\xc7\x000\x00/\xffL\x7f\x1c\x00\x07\xff\xc7\x000\x00\x0f\xff\x0c\x7f\x1c\x00\x07\xff\xc7\x000\x00/\xffL\x7f\x1c\x00\x0b\xff\xa7\x000\x00\x0f\xff\x0c\x7f\x1c\x00\x03\xff\x07\x000\x00\x17\xfe\x8c\x7f\x1c\x00\x05\xffG\x000\x00\x03\xfc\x0c\x7f\x1c\x00\x00|\x07\x000\x00\x01\xf8\x0c\x7f\x1c\x00\x01\x01\x07\x008\x00\x02\x04\x1c\x7f\x0e\x00\x00(\x0e\x008\x00\x00\xa0\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Crazy_1=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x01\x08\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\xe0\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x03\xf8\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x07\xfc\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x0f\xe6\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c/\xee\x80\x07\x000\x00\x00\x00\x0c\x7f\x1c\x1f\xff\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x1f\xff\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x1f\xff\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x0f\xfe\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c/\xfe\x80\x07\x000\x00\x00\x00\x0c\x7f\x1c\x07\xfc\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x03\xf8\x00\x07\x000\x00\x01@\x0c\x7f\x1c\x00\xe0\x00\x07\x000\x00\x08\x10\x0c\x7f\x1c\x01\x08\x00\x07\x000\x00\x07\xe0\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x0f\xf0\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00_\xda\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00?\x9c\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00?\xfc\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\xbf\xfd\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00?\xfc\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\xbf\xfd\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00?\xfc\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00_\xfa\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x0f\xf0\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x07\xe0\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x08\x10\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x02\x80\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Crazy_2=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x04 \x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x13\x88\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x07\xf0\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00_\xda\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x1f\xc8\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00?\xbc\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\xbf\xfd\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00?\xfc\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\xbf\xfd\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00?\xfc\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x1f\xf8\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00_\xfa\x0c\x7f\x1c\x00\xa0\x00\x07\x000\x00\x0f\xf0\x0c\x7f\x1c\x04\x04\x00\x07\x000\x00\x13\xc8\x0c\x7f\x1c\x01\xf2\x00\x07\x000\x00\x04 \x0c\x7f\x1c\x17\xfc\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x07\xe6\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c/\xe6\x80\x07\x000\x00\x00\x00\x0c\x7f\x1c\x1f\xff\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x1f\xff\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x1f\xff\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x1f\xff\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c/\xfe\x80\x07\x000\x00\x00\x00\x0c\x7f\x1c\x0f\xfc\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x17\xfd\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x01\xf0\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x04\x04\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\xa0\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Disappointed=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x1f\xf8\x00\x07\xfc\x00\x03\xe0\x7f\x07\x80\x00><\x00\x0f\x1e\x00\x00\xf0\x7f\x07\x00\x00|\x1c\x00\x1e\x0f\x00\x00x\x7f\x0e\x00\x00\xf8\x0e\x00\x1c\x07\x80\x008\x7f\x0e\x00\x01\xf0\x0e\x008\x03\xc0\x00\x1c\x7f\x1c\x00\x03\xe0\x07\x008\x01\xe0\x00\x1c\x7f\x1c\x00\x07\xc0\x07\x008\x00\xf0\x00\x1c\x7f\x1c\x00\x0f\x80\x07\x000\x00x\x00\x0c\x7f\x1c\x00\x1f\x00\x07\x000\x00<\x00\x0c\x7f\x1c\x00>\x00\x07\x000\x00\x1e\x00\x0c\x7f\x1c\x00|@\x07\x000\x00\x9f\x00\x0c\x7f\x1c\x00\xff \x07\x000\x00\x7f\x80\x0c\x7f\x1c\x01\xff\xc0\x07\x000\x00\xff\xc0\x0c\x7f\x1c\x03\xfe`\x07\x000\x05\xfd\xe0\x0c\x7f\x1c\x07\xfeh\x07\x000\x03\xf9\xf0\x0c\x7f\x1c\x0f\xff\xf0\x07\x000\x03\xff\xf8\x0c\x7f\x1c\x1f\xff\xf0\x07\x000\x0b\xff\xfc\x0c\x7f\x1c?\xff\xf0\x07\x000\x03\xff\xde\x0c\x7f\x1c}\xff\xf0\x07\x000\x0b\xff\xdf\x0c\x7f\x1c\xfa\xff\xe8\x07\x000\x03\xff\xc7\x8c\x7f\x1d\xf0\xff\xc0\x07\x000\x05\xff\xa3\xcc\x7f\x1f\xe1\x7f\xd0\x07\x000\x00\xff\x01\xfc\x7f\x1f\xc0\x1f\x00\x07\x000\x00~\x00\xfc\x7f\x1f\x80@@\x07\x000\x00\x81\x00|\x7f\x1f\x00\n\x00\x07\x000\x00(\x00<\x7f\x1e\x00\x00\x00\x07\x000\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Dizzy=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x000\x00\x07\x000\x00\xc0\x00\x0c\x7f\x1c\x00\xf0\x00\x07\x000\x03\xc0\x00\x0c\x7f\x1c\x01\xc0\x00\x07\x000\x07\x00\x00\x0c\x7f\x1c\x03\x9f\xe0\x07\x000\x0e\x7f\x80\x0c\x7f\x1c\x07<\xf8\x07\x000\x1c\xf3\xe0\x0c\x7f\x1c\x06`\x1c\x07\x000\x19\x80p\x0c\x7f\x1c\x0c\xc7\xcc\x07\x0003\x1f0\x0c\x7f\x1c\x0c\xcf\xe6\x07\x0003?\x98\x0c\x7f\x1c\r\x98v\x07\x0006a\xd8\x0c\x7f\x1c\r\x9b3\x07\x0006l\xcc\x0c\x7f\x1c\r\x9b\xb3\x07\x0006n\xcc\x0c\x7f\x1c\r\x9f\xb3\x07\x0006~\xcc\x0c\x7f\x1c\x0c\xcf6\x07\x0003<\xd8\x0c\x7f\x1c\x0e\xe0f\x07\x000;\x81\x98\x0c\x7f\x1c\x06y\xee\x07\x000\x19\xe7\xb8\x0c\x7f\x1c\x03\x1f\x8c\x07\x000\x0c~0\x0c\x7f\x1c\x03\x80\x18\x07\x000\x0e\x00`\x0c\x7f\x1c\x00\xf0p\x07\x000\x03\xc1\xc0\x0c\x7f\x1c\x00\x7f\xe0\x07\x000\x01\xff\x80\x0c\x7f\x1c\x00\x0f\x00\x07\x000\x00<\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Down=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\n\x00\x07\x000\x00(\x00\x0c\x7f\x1c\x00@@\x07\x000\x00\x81\x00\x0c\x7f\x1c\x00\x9f\x00\x07\x000\x00~\x00\x0c\x7f\x1c\x00\x7f\xd0\x07\x000\x00\xff\x00\x0c\x7f\x1c\x00\xfe`\x07\x000\x05\xfd\xa0\x0c\x7f\x1c\x02\xfeh\x07\x000\x03\xf9\xc0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x03\xff\xc0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x0b\xff\xd0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x03\xff\xc0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x0b\xff\xd0\x0c\x7f\x1c\x02\xff\xe8\x07\x000\x03\xff\xc0\x0c\x7f\x1c\x00\x7f\xe0\x07\x008\x05\xff\xa0\x1c\x7f\x0e\x01\x7f\xd0\x0e\x008\x00\xff\x00\x1c\x7f\x0e\x00\x1f\x00\x0e\x00<\x00~\x00<\x7f\x0f\x00@@\x1e\x00\x1c\x00\x81\x008\x7f\x07\x80\x15\x00<\x00\x1e\x00\x14\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Evil=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x0f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\xf0\x00\x00<\x00\x0f\x00\x00\x03\xf0\x7f\x07\xf8\x00\x00\x1c\x00\x1e\x00\x00\x07\xf8\x7f\x0e<\x00\x00\x0e\x00\x1c\x00\x00\x0e8\x7f\x0e\x1e\x00\x00\x0e\x008\x00\x00<\x1c\x7f\x1c\x0f\x00\x00\x07\x008\x00\x00x\x1c\x7f\x1c\x07\x80\x00\x07\x008\x00\x00\xf0\x1c\x7f\x1c\x01\xe0\x00\x07\x000\x00\x01\xe0\x0c\x7f\x1c\x00\xf0\x00\x07\x000\x00\x03\xc0\x0c\x7f\x1c\x00x\x00\x07\x000\x00\x07\x80\x0c\x7f\x1c\x00<\x00\x07\x000\x00\x0e\x00\x0c\x7f\x1c\x00\x1e\x00\x07\x000\x00>\x00\x0c\x7f\x1c\x00O\x00\x07\x000\x00|\x80\x0c\x7f\x1c\x00?\x80\x07\x000\x00\xff\x00\x0c\x7f\x1c\x00\x7f\xe0\x07\x000\x01\xfd\xa0\x0c\x7f\x1c\x00\xfe\xf0\x07\x000\x03\xfc\x80\x0c\x7f\x1c\x02\xfe\xf8\x07\x000\x07\xfb\xc0\x0c\x7f\x1c\x01\xff\xfc\x07\x000\x1f\xff\xd0\x0c\x7f\x1c\x01\xff\xfe\x07\x000?\xff\xc0\x0c\x7f\x1c\x01\xff\xff\x07\x000\x7f\xff\xd0\x0c\x7f\x1c\x00\xff\xe3\xc7\x000\xf3\xff\xc0\x0c\x7f\x1c\x02\xff\xe9\xe7\x001\xe1\xff\x80\x0c\x7f\x1c\x00\x7f\xc0\xf7\x003\xc5\xff\xa0\x0c\x7f\x1c\x00?\x80\x7f\x00?\x00\xff\x00\x0c\x7f\x1c\x00\x0e\x00?\x00>\x01<\x80\x0c\x7f\x1c\x00\x10\x80\x1f\x00<\x00B\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Hurt=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x0f\x008\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00?\x00>\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\xff\x00?\x80\x00\x00\x0c\x7f\x1c\x00\x00\x03\xff\x00?\xe0\x00\x00\x0c\x7f\x1c\x00\x00\x0f\xe7\x001\xf8\x00\x00\x0c\x7f\x1c\x00\x00?\x87\x000~\x00\x00\x0c\x7f\x1c\x00\x00\xfe\x07\x000\x1f\x80\x00\x0c\x7f\x1c\x00\x03\xf8\x07\x000\x07\xe0\x00\x0c\x7f\x1c\x00\x0f\xf0\x07\x000\x03\xf8\x00\x0c\x7f\x1c\x00?\x80\x07\x000\x04\xfe\x00\x0c\x7f\x1c\x00\xff\xe0\x07\x000\x03\xff\x80\x0c\x7f\x1c\x03\xff\xf0\x07\x000\x17\xff\xe0\x0c\x7f\x1c\x0f\xff\x98\x07\x000\x07\xf3\xf8\x0c\x7f\x1c?\xbf\xba\x07\x000\x0f\xef~\x0c\x7f\x1c\xff\x7f\xfc\x07\x000/\xff_\x8c\x7f\x1d\xf8\x7f\xfc\x07\x000\x0f\xff\x07\xec\x7f\x1f\xe0\x7f\xfc\x07\x000/\xffA\xfc\x7f\x1f\x80?\xf8\x07\x000\x0f\xff\x00|\x7f\x1e\x00\xbf\xfa\x07\x008\x07\xfe\x00\x1c\x7f\x0e\x00\x1f\xf0\x0e\x008\x17\xfe\x80\x1c\x7f\x0e\x00\x0f\xe0\x0e\x00<\x03\xfc\x00<\x7f\x0f\x00\x03\x80\x1e\x00\x1c\x04\xf2\x008\x7f\x07\x80\x04 <\x00\x1e\x01\x08\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Knocked_out=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00\x18\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00\x18\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00\x18\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00\x18\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00\x18\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00\x18\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00\x18\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00\x18\x00\x0c\x7f\x1c\x0f\xff\xfe\x07\x000\x1f\xff\xf8\x0c\x7f\x1c\x0f\xff\xfe\x07\x000?\xff\xfc\x0c\x7f\x1c\x0f\xff\xfe\x07\x000?\xff\xf8\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00\x18\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00\x18\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00\x18\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00\x18\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00\x18\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00\x18\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00\x18\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00\x18\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Love=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x07\xe0\xfc\x07\x000\x0f\x81\xf0\x0c\x7f\x1c\x0f\xd1\xfa\x07\x000\x1fC\xf8\x0c\x7f\x1c\x1f\xeb\xfd\x07\x000?\xa7\xf4\x0c\x7f\x1c\x1f\xff\xfd\x07\x000\x7f\xff\xfa\x0c\x7f\x1c?\xff\xfe\x07\x000\x7f\xff\xfa\x0c\x7f\x1c?\xff\xff\x87\x000\x7f\xff\xfe\x0c\x7f\x1c?\xff\xff\x87\x000\x7f\xff\xfe\x0c\x7f\x1c?\xff\xff\x87\x000\x7f\xff\xfe\x0c\x7f\x1c\x1f\xff\xff\x07\x000\x7f\xff\xfe\x0c\x7f\x1c\x1f\xff\xff\x07\x000\x7f\xff\xfe\x0c\x7f\x1c\x1f\xff\xff\x07\x000?\xff\xfc\x0c\x7f\x1c\x0f\xff\xfe\x07\x000\x1f\xff\xf8\x0c\x7f\x1c\x03\xff\xf8\x07\x000\x0f\xff\xf0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x07\xff\xe0\x0c\x7f\x1c\x00\xff\xe0\x07\x000\x03\xff\xc0\x0c\x7f\x1c\x00\x7f\xc0\x07\x000\x01\xff\x80\x0c\x7f\x1c\x00?\x80\x07\x000\x00~\x00\x0c\x7f\x1c\x00\x1f\x00\x07\x000\x00<\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00\x18\x00\x0c\x7f\x1c\x00\x04\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Middle_left=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x08@\x00\x07\x000 \x80\x00\x0c\x7f\x1c\x03\x80\x00\x07\x000\x07 \x00\x0c\x7f\x1c\x0f\xe0\x00\x07\x000?\x80\x00\x0c\x7f\x1c\x1f\xf0\x00\x07\x001\x7f\xe8\x00\x0c\x7f\x1c?\x98\x00\x07\x000\x7f \x00\x0c\x7f\x1c\xbf\xba\x00\x07\x002\xfe\xf0\x00\x0c\x7f\x1c\x7f\xfc\x00\x07\x000\xff\xf4\x00\x0c\x7f\x1c\x7f\xfc\x00\x07\x002\xff\xf0\x00\x0c\x7f\x1c\x7f\xfc\x00\x07\x000\xff\xf4\x00\x0c\x7f\x1c?\xf8\x00\x07\x002\xff\xf0\x00\x0c\x7f\x1c\xbf\xfa\x00\x07\x000\x7f\xe0\x00\x0c\x7f\x1c\x1f\xf0\x00\x07\x001\x7f\xe8\x00\x0c\x7f\x1c\x0f\xe0\x00\x07\x000?\xc0\x00\x0c\x7f\x1c\x03\x80\x00\x07\x000O \x00\x0c\x7f\x1c\x08@\x00\x07\x000\x10\x80\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Middle_right=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x84\x07\x000\x00\x02\x08\x0c\x7f\x1c\x00\x008\x07\x000\x00\x00r\x0c\x7f\x1c\x00\x00\xfe\x07\x000\x00\x03\xf8\x0c\x7f\x1c\x00\x01\xff\x07\x000\x00\x17\xfe\x8c\x7f\x1c\x00\x03\xf9\x87\x000\x00\x07\xf2\x0c\x7f\x1c\x00\x0b\xfb\xa7\x000\x00\x0f\xef\x0c\x7f\x1c\x00\x07\xff\xc7\x000\x00/\xffL\x7f\x1c\x00\x07\xff\xc7\x000\x00\x0f\xffL\x7f\x1c\x00\x07\xff\xc7\x000\x00/\xff\x0c\x7f\x1c\x00\x03\xff\x87\x000\x00\x0f\xffL\x7f\x1c\x00\x0b\xff\xa7\x000\x00\x07\xfe\x0c\x7f\x1c\x00\x01\xff\x07\x000\x00\x17\xfe\x8c\x7f\x1c\x00\x00\xfe\x07\x000\x00\x03\xfc\x0c\x7f\x1c\x00\x008\x07\x000\x00\x04\xf2\x0c\x7f\x1c\x00\x00\x84\x07\x000\x00\x01\x08\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Neutral=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00!\x00\x07\x000\x00\x82\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00\x1c\x80\x0c\x7f\x1c\x00?\x80\x07\x000\x00\xfe\x00\x0c\x7f\x1c\x00\x7f\xc0\x07\x000\x05\xff\xa0\x0c\x7f\x1c\x00\xfe`\x07\x000\x01\xfc\x80\x0c\x7f\x1c\x02\xfe\xe8\x07\x000\x03\xfb\xc0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x0b\xff\xd0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x03\xff\xc0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x0b\xff\xd0\x0c\x7f\x1c\x00\xff\xe0\x07\x000\x03\xff\xc0\x0c\x7f\x1c\x02\xff\xe8\x07\x000\x01\xff\x80\x0c\x7f\x1c\x00\x7f\xc0\x07\x000\x05\xff\xa0\x0c\x7f\x1c\x00?\x80\x07\x000\x00\xff\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x01<\x80\x0c\x7f\x1c\x00!\x00\x07\x000\x00B\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Nuclear=b"P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x1e\x00\x07\x000\x00<\x00\x0c\x7f\x1c\x00\xf3\xc0\x07\x000\x01\xe7\x80\x0c\x7f\x1c\x03\x800\x07\x000\x07\x00`\x0c\x7f\x1c\x06\x00\x08\x07\x000\x0c\x00\x10\x0c\x7f\x1c\r\x80$\x07\x000\x1b\x00H\x0c\x7f\x1c\x1b\x80r\x07\x0007\x00\xe4\x0c\x7f\x1c\x13\xc0\xfb\x07\x000'\x81\xf6\x0c\x7f\x1c7\xe0\xfd\x07\x000o\xc1\xfa\x0c\x7f\x1c/\xe1\xfd\x87\x000_\xc3\xfb\x0c\x7f\x1c/\xe1\xfc\x87\x000_\xc3\xf9\x0c\x7f\x1co\xe4\xfe\x87\x000\xdf\xc9\xfd\x0c\x7f\x1cO\xce\xfe\x87\x000\x9f\x9d\xfd\x0c\x7f\x1c@\x1e\x00\x87\x000\x80<\x01\x0c\x7f\x1c@\x0c\x00\x87\x000\x80\x18\x01\x0c\x7f\x1c \x00\x00\x87\x000@\x00\x01\x0c\x7f\x1c \x0e\x00\x87\x000@\x1c\x01\x0c\x7f\x1c \x1f\x01\x87\x000@>\x03\x0c\x7f\x1c\x10?\x01\x07\x000 ~\x02\x0c\x7f\x1c\x18?\x82\x07\x0000\x7f\x04\x0c\x7f\x1c\x08\x7f\x86\x07\x000\x10\xff\x0c\x0c\x7f\x1c\x04\x7f\xcc\x07\x000\x08\xff\x98\x0c\x7f\x1c\x03\x1e\x18\x07\x000\x06<0\x0c\x7f\x1c\x01\xc0`\x07\x000\x03\x80\xc0\x0c\x7f\x1c\x00\x7f\x80\x07\x000\x00\xff\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f"
Pinch_left=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x0c\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1d\x7f\xbd\x00\x07\x00:\xfe\xfc\x00\x1c\x7f\x1c\x7f\xfc\x00\x07\x002\xff\xf0\x00\x0c\x7f\x1c\x7f\xfc\x00\x07\x000\xff\xf4\x00\x0c\x7f\x1c?\xf8\x00\x07\x002\xff\xf0\x00\x0c\x7f\x1c\xbf\xfa\x00\x07\x000\x7f\xe0\x00\x0c\x7f\x1c\x1f\xf0\x00\x07\x000\x7f\xe8\x00\x0c\x7f\x1c\x0f\xe0\x00\x07\x000\xbf\xd0\x00\x0c\x7f\x1c\x03\x80\x00\x07\x000\x0f\x00\x00\x0c\x7f\x1c\x18`\x00\x07\x0000\xc0\x00\x1c\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Pinch_middle=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x0c\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1c\x05\xfe\xf4\x07\x008\x0b\xfb\xf0\x1c\x7f\x1c\x01\xff\xf0\x07\x000\x03\xff\xc0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x0b\xff\xd0\x0c\x7f\x1c\x00\xff\xe0\x07\x000\x03\xff\xc0\x0c\x7f\x1c\x02\xff\xe8\x07\x000\x01\xff\x80\x0c\x7f\x1c\x00\x7f\xc0\x07\x000\x01\xff\xa0\x0c\x7f\x1c\x00?\x80\x07\x000\x02\xff@\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00<\x00\x0c\x7f\x1c\x00a\x80\x07\x000\x00\xc3\x00\x1c\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Pinch_right=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x0c\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1c\x00\x17\xfb\xd7\x008\x00/\xef\\\x7f\x1c\x00\x07\xff\xc7\x000\x00\x0f\xffL\x7f\x1c\x00\x07\xff\xc7\x000\x00/\xff\x0c\x7f\x1c\x00\x03\xff\x87\x000\x00\x0f\xffL\x7f\x1c\x00\x0b\xff\xa7\x000\x00\x07\xfe\x0c\x7f\x1c\x00\x01\xff\x07\x000\x00\x07\xfe\x8c\x7f\x1c\x00\x00\xfe\x07\x000\x00\x0b\xfd\x0c\x7f\x1c\x00\x008\x07\x000\x00\x00\xf0\x0c\x7f\x1c\x00\x01C\x07\x000\x00\x03\x0c\x1c\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Tear=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1e\x00\x00\x00\x0f\x008\x00\x00\x00\x1c\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1c\x00\xbf\xa0\x07\x008\x02\xfe@\x1c\x7f\x1c\x00\x7f\xc0\x07\x000\x00\xff\x00\x0c\x7f\x1c\x00\xfe`\x07\x000\x05\xfd\xa0\x0c\x7f\x1c\x02\xfeh\x07\x000\x03\xf9\xc0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x0b\xff\xd0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x03\xff\xc0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x0b\xff\xd0\x0c\x7f\x1c\x00\xff\xe0\x07\x000\x03\xff\xc0\x0c\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00 \x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00 \x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00 \x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x000\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00p\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00p\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\xf8\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x01\xfc\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x01\xf6\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x03\xfa\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x03\xfe\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x03\xfe\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x01\xfe\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\xfc\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00p\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Tired_left=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x1c\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1c\xbf\xba\x00\x07\x00:\xfet\x00\x1c\x7f\x1c\x7f\xf8\x00\x07\x000\xff\xf0\x00\x0c\x7f\x1c\x7f\xfc\x00\x07\x002\xff\xf4\x00\x0c\x7f\x1c\x7f\xfc\x00\x07\x000\xff\xf0\x00\x0c\x7f\x1c\x7f\xfc\x00\x07\x002\xff\xf4\x00\x0c\x7f\x1c\xbf\xfa\x00\x07\x000\xff\xf0\x00\x0c\x7f\x1c\x1f\xf8\x00\x07\x009\x7f\xe8\x00\x1c\x7f\x0e_\xf4\x00\x0e\x008?\xc0\x00\x1c\x7f\x0e\x07\xc0\x00\x0e\x00<\x1f\x80\x00<\x7f\x0f\x10\x10\x00\x1e\x00\x1c @\x008\x7f\x07\x85@\x00<\x00\x1e\x05\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Tired_middle=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x1c\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1c\x02\xff\xe8\x07\x008\x0b\xfb\xd0\x1c\x7f\x1c\x01\xff\xf0\x07\x000\x03\xff\xd0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x0b\xff\xc0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x0b\xff\xd0\x0c\x7f\x1c\x00\xff\xe0\x07\x000\x03\xff\xc0\x0c\x7f\x1c\x02\xff\xe8\x07\x000\x01\xff\x80\x0c\x7f\x1c\x00\x7f\xc0\x07\x008\x05\xff\xa0\x1c\x7f\x0e\x00?\x80\x0e\x008\x00\xff\x00\x1c\x7f\x0e\x00\x0e\x00\x0e\x00<\x01<\x80<\x7f\x0f\x00!\x00\x1e\x00\x1c\x00B\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Tired_right=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x1c\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1f\xff\xff\xff\xff\x00?\xff\xff\xff\xfc\x7f\x1c\x00\x0b\xfb\xa7\x008\x00/\xe7\\\x7f\x1c\x00\x07\xff\x87\x000\x00\x0f\xff\x0c\x7f\x1c\x00\x07\xff\xc7\x000\x00/\xffL\x7f\x1c\x00\x07\xff\xc7\x000\x00\x0f\xff\x0c\x7f\x1c\x00\x07\xff\xc7\x000\x00/\xffL\x7f\x1c\x00\x0b\xff\xa7\x000\x00\x0f\xff\x0c\x7f\x1c\x00\x01\xff\x87\x008\x00\x17\xfe\x9c\x7f\x0e\x00\x05\xffN\x008\x00\x03\xfc\x1c\x7f\x0e\x00\x00|\x0e\x00<\x00\x01\xf8<\x7f\x0f\x00\x01\x01\x1e\x00\x1c\x00\x02\x048\x7f\x07\x80\x00(<\x00\x1e\x00\x00Px\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Toxic=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x008\x00\x0c\x7f\x1c\x00\x7f@\x07\x000\x00\xff\x00\x0c\x7f\x1c\x00\x7f\xc0\x07\x000\x01\xff\x00\x0c\x7f\x1c\x00\xff\xe0\x07\x000\x03\xff\x80\x0c\x7f\x1c\x00\xff\xe0\x07\x000\x03\xff\xc0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x03\xff\xc0\x0c\x7f\x1c\x01\xc4p\x07\x000\x03\x18\xc0\x0c\x7f\x1c\x01\xc4p\x07\x000\x03\x08\xc0\x0c\x7f\x1c\x00\xce`\x07\x000\x03\x99\xc0\x0c\x7f\x1c\x00\xf9\xe0\x07\x000\x01\xe7\x80\x0c\x7f\x1c\x00y\xc0\x07\x000\x00\xe7\x00\x0c\x7f\x1c\x04\x1f\x02\x07\x000\x18>\x0c\x0c\x7f\x1c\x0f\x8a\x1e\x07\x000?\x10<\x0c\x7f\x1c\x0c\xf0\xf3\x07\x0003\xe1\xec\x0c\x7f\x1c\x00>@\x07\x000\x00|\x00\x0c\x7f\x1c\r\xe3\xe6\x07\x000\x1b\xcf\xc8\x0c\x7f\x1c\x0f\xc0\xfe\x07\x000\x1f\x81\xfc\x0c\x7f\x1c\x06\x00\x0e\x07\x000\x0c\x008\x0c\x7f\x1c\x06\x00\x0c\x07\x000\x08\x00\x18\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Up=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00!\x00\x1c\x00\x1e\x00\x82\x00x\x7f\x0e\x00\x0e\x00\x0e\x00\x1c\x00\x1c\x808\x7f\x0e\x00?\x80\x0e\x008\x00\xfe\x00\x1c\x7f\x1c\x00\x7f\xc0\x07\x008\x05\xff\xa0\x1c\x7f\x1c\x00\xfe`\x07\x008\x01\xfc\x80\x1c\x7f\x1c\x02\xfe\xe8\x07\x000\x03\xfb\xc0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x0b\xff\xd0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x03\xff\xc0\x0c\x7f\x1c\x01\xff\xf0\x07\x000\x0b\xff\xd0\x0c\x7f\x1c\x00\xff\xe0\x07\x000\x03\xff\xc0\x0c\x7f\x1c\x02\xff\xe8\x07\x000\x01\xff\x80\x0c\x7f\x1c\x00\x7f\xc0\x07\x000\x05\xff\xa0\x0c\x7f\x1c\x00?\x80\x07\x000\x00\xff\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x01<\x80\x0c\x7f\x1c\x00!\x00\x07\x000\x00B\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Winking=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x1f\xff\xff\x00\x00\x00?\xff\xfc\x00\x7f\x00\x7f\xff\xff\xc0\x00\x01\xff\xff\xff\x80\x7f\x01\xff\xff\xff\xf0\x00\x03\xff\xff\xff\xc0\x7f\x03\xe0\x00\x00\xf8\x00\x07\xc0\x00\x03\xe0\x7f\x07\x80\x00\x00<\x00\x0f\x00\x00\x00\xf0\x7f\x07\x00\x00\x00\x1c\x00\x1e\x00\x00\x00x\x7f\x0e\x00\x00\x00\x0e\x00\x1c\x00\x00\x008\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00!\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00?\x80\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x7f\xc0\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\xfe`\x07\x000\x00\x00\x00\x0c\x7f\x1c\x02\xfe\xe8\x07\x000\x00\x00\x00\x0c\x7f\x1c\x01\xff\xf0\x07\x00?\xff\xff\xff\xfc\x7f\x1c\x01\xff\xf0\x07\x00?\xff\xff\xff\xfc\x7f\x1c\x01\xff\xf0\x07\x00?\xff\xff\xff\xfc\x7f\x1c\x00\xff\xe0\x07\x000\x00\x00\x00\x0c\x7f\x1c\x02\xff\xe8\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x7f\xc0\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00?\x80\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x0e\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00!\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x000\x00\x00\x00\x0c\x7f\x1c\x00\x00\x00\x07\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x008\x00\x00\x00\x1c\x7f\x0e\x00\x00\x00\x0e\x00<\x00\x00\x00<\x7f\x0f\x00\x00\x00\x1e\x00\x1c\x00\x00\x008\x7f\x07\x80\x00\x00<\x00\x1e\x00\x00\x00x\x7f\x03\xc0\x00\x00x\x00\x0f\x80\x00\x01\xf0\x7f\x01\xf8\x00\x03\xf0\x00\x07\xe0\x00\x07\xe0\x7f\x00\xff\xff\xff\xe0\x00\x03\xff\xff\xff\xc0\x7f\x00?\xff\xff\x80\x00\x00\xff\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'

View File

@@ -0,0 +1,74 @@
"""
GNSS
Micropython library for the GNSS(NMEA0183/GPS,DBS)
=======================================================
#Preliminary composition 20230314
@dahanzimin From the Mixly Team
"""
from ubinascii import unhexlify
class NMEA0183:
def __init__(self, uart, baudrate=9600, timeout=200):
self._uart=uart
self._uart.init(baudrate=baudrate, timeout=timeout, rxbuf=1024)
self.time=[None, None, None, None, None, None, None, 0]
self.locate=['', None, '', None, None, None, None] #0'1经度,2'3纬度,4海拔m,5速度m/s,6航向°
self.status=[False, ' ', 0] #有效标注,定位模式,卫星量
def _crc8(self, buffer):
'''对数据进行CRC校验'''
crc = 0x00
for byte in buffer:
crc ^= byte
return crc & 0xff
def _judge(self, buffer, dlen):
try:
data=buffer.strip().decode().split(',')
if len(data) == dlen:
if unhexlify(data[-1][-2:])[0] == self._crc8(buffer[1:-5]):
return True,data
return False,None
except :
return False,None
def any(self):
flag_rmc,flag_gga=False,False
while self._uart.any():
_data=self._uart.readline()
if b'$GNGGA' in _data:
flag_gga,data=self._judge(_data, 15)
#print("GGA----",flag_gga)
if flag_gga:
self.time[4]= int(data[1][0:2]) if data[1] else None
self.time[5]= int(data[1][2:4]) if data[1] else None
self.time[6]= int(data[1][4:6]) if data[1] else None
self.locate[0]= data[5]
self.locate[1]= int(data[4][:3])+int(data[4][3:].replace('.',''))/6000000 if data[4] else None
self.locate[2]= data[3]
self.locate[3]= int(data[2][:2])+int(data[2][2:].replace('.',''))/6000000 if data[2] else None
self.locate[4]= float(data[9]) if data[3] else None
self.status[0]= False if '0' in data[6] else True
self.status[2]= int(data[7])
if b'$GNRMC' in _data:
flag_rmc,data=self._judge(_data, 14)
#print("RMC----",flag_rmc)
if flag_rmc:
self.time[0]= int(data[9][4:6])+2000 if data[9] else None
self.time[1]= int(data[9][2:4]) if data[9] else None
self.time[2]= int(data[9][0:2]) if data[9] else None
self.time[4]= int(data[1][0:2])+8 if data[1] else None
self.time[5]= int(data[1][2:4]) if data[1] else None
self.time[6]= int(data[1][4:6]) if data[1] else None
self.locate[0]= data[6]
self.locate[1]= int(data[5][:3])+int(data[5][3:].replace('.',''))/6000000 if data[5] else None
self.locate[2]= data[4]
self.locate[3]= int(data[3][:2])+int(data[3][2:].replace('.',''))/6000000 if data[3] else None
self.locate[5]= round(float(data[7])*0.514, 2) if data[7] else None
self.locate[6]= float(data[8]) if data[8] else None
self.status[0]= False if 'V' in data[2] else True
self.status[1]= data[12]
return flag_rmc | flag_gga

View File

@@ -0,0 +1,88 @@
"""
HP203X
MicroPython library for the HP203X(Air pressure sensor)
=======================================================
#Changed from circuitpython to micropython 20220211
#Format unified 20220623
dahanzimin From the Mixly Team
"""
import time
from micropython import const
HP203X_ADDRESS = const(0x76)
HP203X_REG_RST = const(0x06)
HP203X_REG_RDY = const(0x0D)
HP20X_READ_P = const(0x30)
HP20X_READ_H = const(0x31)
HP20X_READ_T = const(0x32)
HP20X_READ_CAL = const(0x28)
HP20X_WR_CONVERT_CMD = const(0x40)
#转换时间 越大时间越久
#HP20X_CONVERT_OSR4096 =0<<2
HP20X_CONVERT_OSR2048 =1<<2
#HP20X_CONVERT_OSR1024 =2<<2
#HP20X_CONVERT_OSR512 =3<<2
#HP20X_CONVERT_OSR256 =4<<2
#HP20X_CONVERT_OSR128 =5<<2
class HP203X:
def __init__(self, i2c_bus,cal=False):
self._device = i2c_bus
self._address = HP203X_ADDRESS
self.data_reg = bytearray(3)
self._buffer = bytearray(1)
self.osr = HP20X_CONVERT_OSR2048 #SET time
if self._read_rdy()&0x40 ==0:
raise AttributeError("Cannot find a HP203X")
self._rst() #Reset
time.sleep(0.1)
if cal: #Calibration
self._write_cmd(HP20X_WR_CONVERT_CMD|self.osr)
time.sleep(0.1)
self._calibration()
print("calibration")
def _read_data(self, address):
self._buffer[0] = address & 0xFF
self._device.writeto(self._address,self._buffer)
self._device.readfrom_into(self._address,self.data_reg)
return self.data_reg
def _write_cmd(self,command):
self._buffer[0] = command & 0xFF
self._device.writeto(self._address,self._buffer)
def _read_rdy(self):
return self._read_data(HP203X_REG_RDY)[0]
def _calibration(self):
self._write_cmd(HP20X_READ_CAL)
def _rst(self):
self._write_cmd(HP203X_REG_RST)
def u2s(self,n):
return n if n < (1 << 23) else n - (1 << 24)
def get_data(self,flag):
self._write_cmd(HP20X_WR_CONVERT_CMD|self.osr)
time.sleep(0.1)
self._read_data(flag)
hp_data=(self.data_reg[0]<<16)|(self.data_reg[1]<<8)|self.data_reg[2]
return self.u2s(hp_data)/100
def pressure(self):
return self.get_data(HP20X_READ_P)
def altitude(self):
return self.get_data(HP20X_READ_H)
def temperature(self):
return self.get_data(HP20X_READ_T)

View File

@@ -0,0 +1,59 @@
"""
HT16K33-framebuf
Micropython library for the HT16K33 Matrix16x8
=======================================================
#Preliminary composition 20230411
@dahanzimin From the Mixly Team
"""
import uframebuf
from micropython import const
_HT16K33_BLINK_CMD = const(0x80)
_HT16K33_BLINK_DISPLAYON = const(0x01)
_HT16K33_CMD_BRIGHTNESS = const(0xE0)
_HT16K33_OSCILATOR_ON = const(0x21)
class HT16K33(uframebuf.FrameBuffer_Ascall):
def __init__(self, i2c, address=0x70, brightness=0.3, width=16, height=8):
self._i2c = i2c
self._address = address
self._blink_rate=0
self._brightness=brightness
self._buffer = bytearray((width + 7) // 8 * height)
super().__init__(self._buffer, width, height, uframebuf.MONO_HMSB)
self._write_cmd(_HT16K33_OSCILATOR_ON)
self.blink_rate(0)
self.set_brightness(brightness)
self.fill(0)
self.show()
def _write_cmd(self, val):
'''I2C write command'''
self._i2c.writeto(self._address,val.to_bytes(1, 'little'))
def blink_rate(self, rate=None):
if rate is None:
return self._blink_rate
if not 0 <= rate <= 3:
raise ValueError("Blink rate must be an integer in the range: 0-3")
rate = rate & 0x03
self._blink_rate = rate
self._write_cmd(_HT16K33_BLINK_CMD | _HT16K33_BLINK_DISPLAYON | rate << 1)
def get_brightness(self):
return self._brightness
def set_brightness(self, brightness):
if not 0.0 <= brightness <= 1.0:
raise ValueError("Brightness must be a decimal number in the range: 0.0-1.0")
self._brightness = brightness
xbright = round(15 * brightness)
xbright = xbright & 0x0F
self._write_cmd(_HT16K33_CMD_BRIGHTNESS | xbright)
def show(self):
"""Refresh the display and show the changes."""
self._i2c.writeto_mem(self._address, 0x00, self._buffer)

View File

@@ -0,0 +1,305 @@
"""
HuskyLens
MicroPython library for the HuskyLens-I2C(DF)
=======================================================
#Preliminary composition 20220224
#base on https://github.com/HuskyLens/HUSKYLENSPython 20220623
dahanzimin From the Mixly Team
"""
import time
from ubinascii import unhexlify,hexlify
commandHeaderAndAddress = "55AA11"
algorthimsByteID = {
"ALGORITHM_OBJECT_TRACKING": "0100", #物体追踪
"ALGORITHM_FACE_RECOGNITION": "0000", #人脸识别
"ALGORITHM_OBJECT_RECOGNITION": "0200", #物体识别
"ALGORITHM_LINE_TRACKING": "0300", #巡线
"ALGORITHM_COLOR_RECOGNITION": "0400", #颜色识别
"ALGORITHM_TAG_RECOGNITION": "0500", #标签识别
"ALGORITHM_OBJECT_CLASSIFICATION": "0600", #物体分类
"ALGORITHM_QR_CODE_RECOGNTITION" : "0700", #二维码识别(教育版独有)
"ALGORITHM_BARCODE_RECOGNTITION":"0800", #条形码识别(教育版独有)
}
class Arrow:
def __init__(self, xTail, yTail , xHead , yHead, ID):
self.xTarget=xTail
self.yTarget=yTail
self.xOrigin=xHead
self.yOrigin=yHead
self.id=ID
self.learned= True if ID > 0 else False
self.type="arrows"
class Block:
def __init__(self, x, y , width , height, ID):
self.xCenter = x
self.yCenter=y
self.width=width
self.height=height
self.id=ID
self.learned= True if ID > 0 else False
self.type="blocks"
class HuskyLens:
def __init__(self, i2c,address=0x32):
self._address = address
self.checkOnceAgain=True
self._device = i2c
self._buffer=[]
self._learned_number=0
if not self.knock():
raise AttributeError("Cannot find a HuskyLens")
def _write_cmd(self, cmd):
'''Write memory address'''
self._device.writeto(self._address, unhexlify(cmd))
def _read_cmd(self, nbytes):
'''Read memory address'''
return self._device.readfrom(self._address, nbytes)
def _checksum(self, hexStr):
'''data checksums'''
total = 0
for i in range(0, len(hexStr), 2):
total += int(hexStr[i:i+2], 16)
hexStr = hex(total)[-2:]
return hexStr
def _read_data(self):
'''Read data'''
while True:
time.sleep(0.01)
buffer = self._read_cmd(5)
if buffer[0] == 0x55:
break
buffer += self._read_cmd(int(buffer[3])+1)
strs=hexlify(buffer).decode()
headers = strs[0:4]
address = strs[4:6]
data_length = int(strs[6:8], 16)
command = strs[8:10]
if(data_length > 0):
data = strs[10:10+data_length*2]
else:
data = ''
checkSum = strs[2*(6+data_length-1):2*(6+data_length-1)+2]
return [headers, address, data_length, command, data, checkSum]
def getBlockOrArrowCommand(self):
commandSplit = self._read_data()
isBlock = True if commandSplit[3] == "2a" else False
return (commandSplit[4],isBlock)
def processReturnData(self):
inProduction = True
byteString=""
if inProduction :
commandSplit = self._read_data()
if commandSplit[3] == "2e":
return "Knock Recieved"
else:
returnData = []
numberOfBlocksOrArrow = int(commandSplit[4][2:4]+commandSplit[4][0:2], 16)
self._learned_number = int(commandSplit[4][6:8]+commandSplit[4][4:6], 16)
for i in range(numberOfBlocksOrArrow):
tmpObj=self.getBlockOrArrowCommand()
isBlock=tmpObj[1]
returnData.append(tmpObj[0])
if returnData :
finalData = []
tmp = []
for i in returnData:
tmp = []
for q in range(0, len(i), 4):
low=int(i[q:q+2], 16)
high=int(i[q+2:q+4], 16)
if(high>0):
val=low+255+high
else:
val=low
tmp.append(val)
finalData.append(tmp)
tmp = []
self.checkOnceAgain=True
self._buffer=self.convert_to_class_object(finalData,isBlock)
return "Data processing completed"
else:
self._buffer=[]
def convert_to_class_object(self,data,isBlock):
tmp=[]
for i in data:
if(isBlock):
obj = Block(i[0],i[1],i[2],i[3],i[4])
else:
obj = Arrow(i[0],i[1],i[2],i[3],i[4])
tmp.append(obj)
return tmp
def knock(self):
'''Send a simple knock to the HuskyLens to ensure that you are connected and can communicate.'''
self._write_cmd(commandHeaderAndAddress+"002c3c")
return self._read_data()[3] == "2e"
def command_request_algorthim(self, alg):
'''切换xx算法'''
if alg in algorthimsByteID:
cmd = commandHeaderAndAddress+"022d"+algorthimsByteID[alg]
cmd += self._checksum(cmd)
self._write_cmd(cmd)
return self.processReturnData()
else:
print("INCORRECT ALGORITHIM NAME")
def command_request(self):
'''请求一次数据 存入结果'''
self._write_cmd(commandHeaderAndAddress+"002030")
self.processReturnData()
def read_learned_id_count(self):
'''从结果中获取 已学习ID总数'''
return self._learned_number
def is_appear_direct(self,shape):
'''从结果中获取 方块或箭头 是否在画面中'''
if len(self._buffer) > 0:
return self._buffer[0].type == shape
def read_block_center_parameter_direct(self,shape):
'''从结果中获取靠近中心 方块或箭头 的信息'''
if len(self._buffer) > 0:
if self._buffer[0].type == shape :
return self._buffer[0]
else :
return False
def is_learned(self,get_id):
'''从结果中获取获取IDx是否已学习'''
if 0 < get_id < self._learned_number:
return True
else:
return False
def is_appear(self,get_id,shape):
'''从结果中获取获取IDx 方块或箭头 是否在画面中'''
if len(self._buffer) > 0:
for i in self._buffer :
if i.id == get_id :
return i.type == shape
def read_blocks_arrows_parameter(self,get_id,number,shape):
'''从结果中获取获取IDx 第number个方块或箭头 的信息'''
if len(self._buffer) > 0:
id_list=[]
for i in self._buffer :
if i.id == get_id and i.type == shape:
id_list.append(i)
if number is None:
return id_list[0]
else:
return id_list[number-1]
def read_count(self,get_id,shape):
'''从结果中获取获取IDx 方块或箭头 的总数'''
num=0
if len(self._buffer) > 0:
for i in self._buffer :
if get_id is None and i.type == shape:
num+=1
if i.id == get_id and i.type == shape:
num+=1
return num
def read_blocks_arrows_parameter_direct(self,number,shape):
'''从结果中获取获取第x个 方块或箭头 的信息'''
if len(self._buffer) >= number :
print(len(self._buffer))
if self._buffer[number-1].type == shape :
return self._buffer[number-1]
def command_request_learn_once(self,get_id):
'''自动学习一次 IDx'''
data = "{:04x}".format(get_id)
part1=data[2:]
part2=data[0:2]
#reverse to correct endiness
data=part1+part2
dataLen = "{:02x}".format(len(data)//2)
cmd = commandHeaderAndAddress+dataLen+"36"+data
print("-----",cmd)
cmd += self._checksum(cmd)
self._write_cmd(cmd)
def command_request_forget(self):
'''遗忘当前算法的所有学习数据'''
self._write_cmd(commandHeaderAndAddress+"003747")
def command_request_customnames(self,name,get_id):
'''设置当前算法 IDx 名字为 name'''
nameDataSize = "{:02x}".format(len(name)+1)
name = hexlify(name).decode()+"00"
localId = "{:02x}".format(get_id)
data = localId+nameDataSize+name
dataLen = "{:02x}".format(len(data)//2)
cmd = commandHeaderAndAddress+dataLen+"2f"+data
cmd += self._checksum(cmd)
self._write_cmd(cmd)
def command_request_custom_text(self,name,x,y):
'''屏幕叠加显示文字name 在 xy'''
name=hexlify(name).decode()
nameDataSize = "{:02x}".format(len(name)//2)
if x>255:
x="ff"+"{:02x}".format(x%255)
else:
x="00"+"{:02x}".format(x)
y="{:02x}".format(y)
data = nameDataSize+x+y+name
dataLen = "{:02x}".format(len(data)//2)
cmd = commandHeaderAndAddress+dataLen+"34"+data
cmd += self._checksum(cmd)
self._write_cmd(cmd)
def command_request_clear_text(self):
'''清除屏幕显示的文字'''
self._write_cmd(commandHeaderAndAddress+"003545")
def command_request_photo(self):
'''触发拍照保存到SD卡'''
self._write_cmd(commandHeaderAndAddress+"003040")
time.sleep(0.5)
def command_request_screenshot(self):
'''触发截屏保存到SD卡'''
self._write_cmd(commandHeaderAndAddress+"003949")
time.sleep(0.5)
def command_request_save_model_to_SD_card(self,idVal):
'''保存当前算法数据位SD卡 (0~4) 号模型'''
idVal = "{:04x}".format(idVal)
idVal = idVal[2:]+idVal[0:2]
cmd = commandHeaderAndAddress+"0232"+idVal
cmd += self._checksum(cmd)
self._write_cmd(cmd)
time.sleep(0.5)
def command_request_load_model_from_SD_card(self,idVal):
'''加载当前算法数据位SD卡 (0~4) 号模型'''
idVal = "{:04x}".format(idVal)
idVal = idVal[2:]+idVal[0:2]
cmd = commandHeaderAndAddress+"0233"+idVal
cmd += self._checksum(cmd)
self._write_cmd(cmd)
time.sleep(0.5)

View File

@@ -0,0 +1,280 @@
"""
I2C_Device
Micropython library for the I2C communication Device(TD)
=======================================================
@dahanzimin From the Mixly Team
"""
import random
from machine import SoftI2C
def _u2s(value, n=8):
return value if value < (1 << (n-1)) else value - (1 << n)
'''i2c-Inheritance'''
class I2C_device(SoftI2C):
CRC8_Table =b'\x00^\xbc\xe2a?\xdd\x83\xc2\x9c~ \xa3\xfd\x1fA\x9d\xc3!\x7f\xfc\xa2@\x1e_\x01\xe3\xbd>`\x82\xdc#}\x9f\xc1B\x1c\xfe\xa0\xe1\xbf]\x03\x80\xde<b\xbe\xe0\x02\\\xdf\x81c=|"\xc0\x9e\x1dC\xa1\xffF\x18\xfa\xa4\'y\x9b\xc5\x84\xda8f\xe5\xbbY\x07\xdb\x85g9\xba\xe4\x06X\x19G\xa5\xfbx&\xc4\x9ae;\xd9\x87\x04Z\xb8\xe6\xa7\xf9\x1bE\xc6\x98z$\xf8\xa6D\x1a\x99\xc7%{:d\x86\xd8[\x05\xe7\xb9\x8c\xd20n\xed\xb3Q\x0fN\x10\xf2\xac/q\x93\xcd\x11O\xad\xf3p.\xcc\x92\xd3\x8do1\xb2\xec\x0eP\xaf\xf1\x13M\xce\x90r,m3\xd1\x8f\x0cR\xb0\xee2l\x8e\xd0S\r\xef\xb1\xf0\xaeL\x12\x91\xcf-s\xca\x94v(\xab\xf5\x17I\x08V\xb4\xeai7\xd5\x8bW\t\xeb\xb56h\x8a\xd4\x95\xcb)w\xf4\xaaH\x16\xe9\xb7U\x0b\x88\xd64j+u\x97\xc9J\x14\xf6\xa8t*\xc8\x96\x15K\xa9\xf7\xb6\xe8\nT\xd7\x89k5'
def _crc8(self, buf):
_sum = 0
for i in range(0, len(buf)):
_sum = self.CRC8_Table[_sum ^ buf[i]]
return _sum
def read_device(self, addr, cmd, nbytes=1):
buf = self.readfrom_mem(addr, cmd, nbytes+2)
if self._crc8(buf[:-1]) == buf[-1]:
return buf[1] if nbytes<=1 else buf[1:-1]
def write_device(self, addr, cmd, buf=0):
buf = buf.to_bytes(1, 'little') if type(buf) is int else buf
buf = bytearray([cmd, random.randint(0, 255)]) + buf
crc8 = self._crc8(buf).to_bytes(1, 'little')
self.writeto(addr, buf + crc8)
if crc8 == self.readfrom(addr, 1):
return True
'''Fundamentals of Sensors'''
class Base:
def __init__(self, i2c_bus):
self._i2c = i2c_bus
def addr_set(self, old=0, new=0):
try:
self._i2c.write_device(self._addrs[old], 0x04, bytearray([self._addrs[old], self._addrs[new]]))
except Exception as e:
print("Warning: No serial number can be changed or", e)
def addr_get(self):
_addred = []
for add in self._i2c.scan():
if add in self._addrs:
_addred.append(self._addrs.index(add))
return tuple(_addred)
'''Motor'''
class Motor(Base):
_addrs = [0x30, 0x31, 0x32, 0x33]
def run(self, naddr=0, speed=None):
'''普票电机参数 speed: 速度-100~100%, None返回速度值'''
try:
if speed is None:
return _u2s(self._i2c.read_device(self._addrs[naddr], 0x10))
else:
speed = max(min(speed, 100), -100)
self._i2c.write_device(self._addrs[naddr], 0xA0, speed)
except Exception as e:
raise RuntimeError("Cannot find a Motor device", e)
'''Traffic light'''
class Traffic_LED(Base):
_addrs = [0x48, 0x49, 0x4A, 0x4B]
def led(self, naddr=0, num=0, value=0):
'''交通灯参数 value: 0,全灭 1,长亮 -1,闪烁(1hz)'''
try:
if value == 0:
self._i2c.write_device(self._addrs[naddr], 0xA0, 0x00)
elif value == 1:
self._i2c.write_device(self._addrs[naddr], 0xA0, 0x04 >> num)
elif value == -1:
self._i2c.write_device(self._addrs[naddr], 0xA0, 0x40 >> num)
except Exception as e:
raise RuntimeError("Cannot find a Traffic lights", e)
'''LED'''
class LED(Base):
def brightness(self, naddr=0, value=None):
'''LED灯参数 value: 亮度0~100%, None返回亮度值'''
try:
if value is None:
return self._i2c.read_device(self._addrs[naddr], 0x10)
else:
value = max(min(value, 100), 0)
self._i2c.write_device(self._addrs[naddr], 0xA0, value)
except Exception as e:
raise RuntimeError("Cannot find a LED device", e)
class W_LED(LED):
_addrs = [0x38, 0x39, 0x3A, 0x3B]
class R_LED(LED):
_addrs = [0x3C, 0x3D, 0x3E, 0x3F]
class Y_LED(LED):
_addrs = [0x40, 0x41, 0x42, 0x43]
class G_LED(LED):
_addrs = [0x44, 0x45, 0x46, 0x47]
class B_LED(LED):
_addrs = [0x78, 0x79, 0x7A, 0x7B]
'''button*5'''
class Buttonx5(Base):
_addrs = [0x68, 0x69, 0x6A, 0x6B]
def value(self, naddr=0):
'''十字按键返回 (上,下,左,右,中)/bool'''
try:
flag = self._i2c.read_device(self._addrs[naddr], 0x10)
return bool(flag >> 4 & 1), bool(flag >> 3 & 1), bool(flag >> 2 & 1), bool(flag >> 1 & 1), bool(flag & 1)
except Exception as e:
raise RuntimeError("Cannot find a Button sensor", e)
'''button*1'''
class Button(Base):
_addrs = [0x54, 0x55, 0x56, 0x57]
def value(self, naddr=0):
'''触碰传感器返回 数值/bool'''
try:
return bool(self._i2c.read_device(self._addrs[naddr], 0x10))
except Exception as e:
raise RuntimeError("Cannot find a Touch sensor", e)
'''Infrared sensor'''
class Infrared(Base):
_addrs = [0x6C, 0x6D, 0x6E, 0x6F]
def value(self, naddr=0):
'''红外接近返回 数值0~100%'''
try:
return self._i2c.read_device(self._addrs[naddr], 0x10)
except Exception as e:
raise RuntimeError("Cannot find a Infrared sensor", e)
'''ultrasonic sensor'''
class Sonar(Base):
_addrs = [0x24, 0x25, 0x26, 0x27]
_state = 0x00
def value(self, naddr=0):
'''超声波测距返回 距离数值cm'''
try:
value = self._i2c.read_device(self._addrs[naddr], 0x10, 2)
return value[0] << 8 | value[1]
except Exception as e:
raise RuntimeError("Cannot find a Ultrasonic sensor", e)
def led(self, naddr=0, num=0, value=0):
'''超声波指示灯参数 num:序号0~3,value:0灭,1亮,-1反转 '''
try:
if value > 0:
self._state |= 1 << num
elif value < 0:
self._state ^= 1 << num
else:
self._state &= ~ (1 << num)
self._i2c.write_device(self._addrs[naddr], 0xA0, bytearray([self._state & 0xff, 0x00]))
except Exception as e:
raise RuntimeError("Cannot find a Ultrasonic sensor", e)
'''Potentiometer'''
class Dimmer(Base):
_addrs = [0x2C, 0x2D, 0x2E, 0x2F]
def value(self, naddr=0):
'''旋钮传感器返回 数值0~100%'''
try:
return self._i2c.read_device(self._addrs[naddr], 0x10)
except Exception as e:
raise RuntimeError("Cannot find a Potentiometer", e)
'''Color sensor'''
class Color_ID(Base):
_id = ('Black', 'Violet', 'Unknown', 'Blue', 'Cyan', 'Green', 'Unknown', 'Yellow', 'Unknown', 'Red', 'White', 'Unknown')
_addrs = [0x20, 0x21, 0x22, 0x23]
def recognition(self, naddr=0):
'''颜色识别返回 (颜色名,(R,G,B),环境亮度0~100,反射亮度0~100)'''
try:
color = self._i2c.read_device(self._addrs[naddr], 0x10, 6)
return self._id[min(color[0],11)], (color[1],color[2],color[3]), color[4], color[5]
except Exception as e:
raise RuntimeError("Cannot find a Color sensor", e)
'''Laser Sensor'''
class TOF(Base):
_addrs = [0x5C, 0x5D, 0x5E, 0x5F]
def value(self, naddr=0):
'''激光测距传感器返回 数值cm'''
try:
flag = self._i2c.read_device(self._addrs[naddr], 0x10, 2)
return (flag[0] << 8 | flag[1]) / 100
except Exception as e:
raise RuntimeError("Cannot find a Laser Sensor", e)
def enable(self, naddr=0, en=True):
'''激光测距传感器 en:0关闭,1打开'''
try:
self._i2c.write_device(self._addrs[naddr], 0xA0, int(en) & 0x01)
except Exception as e:
raise RuntimeError("Cannot find a Laser Sensor", e)
'''Servo Motor'''
class Motor_servo(Base):
_addrs = [0x60, 0x61, 0x62, 0x63]
_mstop = [0, 0, 0, 0]
def stop_mode(self, naddr=0, mode=0):
'''电机停止模式 mode:0,保持位置 1,惯性滑行 2,阻力制动'''
self._mstop[naddr] = mode
def _write(self, naddr=0, mode=0, value=0, direction=0, angle=0, origin=0, keep=0, select=0):
'''寄存器参数设置'''
try:
_bytes1 = direction<<6 | mode<<5 | select<<4 | origin<<3 | keep<<2 | self._mstop[naddr]
_bytes2 = max(min(value, 100), 0)
_bytes3 = angle & 0xFF
_bytes4 = angle>>8 & 0xFF
_bytes5 = angle>>16 & 0xFF
self._i2c.write_device(self._addrs[naddr], 0xA0, bytearray([_bytes1, _bytes2, _bytes3, _bytes4, _bytes5]))
except Exception as e:
raise RuntimeError("Cannot find a Servo Motor", e)
def absolute_run(self, naddr=0, mode=0, value=50, direction=0, angle=0):
''' 绝对角度运行模式(类舵机)
运行模式mode 0:速度模式1:功率模式
模式数值value 0~100%
转向设置direction 0:顺时针1:最短路径2:逆时针
旋转角度angle 0~360°
'''
self._write(naddr=naddr, mode=mode, value=value, direction=direction, angle=angle, select=0)
def relative_run(self, naddr=0, mode=0, value=50, angle=0):
''' 相对角度运行模式(类编码电机)
运行模式mode 0:速度模式1:功率模式
模式数值value 0~100%
旋转角度angle -8388607~8388607°
'''
self._write(naddr=naddr, mode=mode, value=value, angle=angle, select=1)
def relative_origin(self, naddr=0):
'''当前位置设置为原点'''
self._write(naddr=naddr, origin=1, select=1)
def relative_continue(self, naddr=0, mode=0, value=50, direction=0):
''' 相对角度运行模式(类普通电机)
运行模式mode 0:速度模式1:功率模式
模式数值value 0~100%
转向设置direction 0:顺时针2:逆时针
'''
self._write(naddr=naddr, mode=mode, value=value, direction=direction, keep=1, select=1)
def stop(self, naddr=0):
'''电机停止'''
self._write(naddr=naddr, keep=1)
def state(self,naddr=0):
'''运行状态返回 (功率, 速度, 绝对角度, 相对角度, 是否堵住, 是否转完) '''
try:
_buf = self._i2c.read_device(self._addrs[naddr], 0x10, 7)
return _u2s(_buf[0]), _u2s(_buf[1]), (_buf[2] & 0x01)<<8 | _buf[3], _u2s((_buf[4]<<16 | _buf[5]<<8 | _buf[6]),24), bool(_buf[2] & 0x40), bool(_buf[2] & 0x80)
except Exception as e:
raise RuntimeError("Cannot find a Servo Motor", e)

View File

@@ -0,0 +1,79 @@
"""
LCD1602、LCD2004_I2C
Micropython library for the I2C(LCD1602、LCD2004)
=======================================================
#Preliminary composition 20221117
dahanzimin From the Mixly Team
"""
from time import sleep_ms
from micropython import const
LCD_DAT = const(0x01) # Mode - Sending data
LCD_CMD = const(0x00) # Mode - Sending command
LCD_LINES = (0x80, 0xC0, 0x94, 0xD4)
class LCD():
def __init__(self, i2c_bus, i2c_addr=0x27, lcd_width=16):
self._device = i2c_bus
self._address = i2c_addr
self._lcd_width = lcd_width
self._backlight = True
self._last_data = 0x00
for i in [0x30, 0x30, 0x30,0x20]:
self._i2c_write(i)
sleep_ms(1)
for i in [0x28, 0x0C, 0x06]:
self.write_byte(i , LCD_CMD)
self.clear()
def _i2c_write(self, data , pulse_en=True):
"""write one byte to I2C bus"""
self._last_data = data
self._device.writeto(self._address,data.to_bytes(1, 'little'))
sleep_ms(0)
if pulse_en :
self._device.writeto(self._address,(data | 0b00000100).to_bytes(1, 'little'))
sleep_ms(0)
self._device.writeto(self._address,(data & ~0b00000100).to_bytes(1, 'little'))
sleep_ms(0)
def write_byte(self, data, mode):
"""write one byte to LCD"""
data_H = (data & 0xF0) | self._backlight * 0x08 | mode
data_L = ((data << 4) & 0xF0) | self._backlight * 0x08 | mode
self._i2c_write(data_H)
self._i2c_write(data_L)
def clear(self):
"""Clear the display and reset the cursor position"""
self.write_byte(0x01, LCD_CMD)
sleep_ms(1)
def backlight(self, on_off):
""" Set whether the LCD backlight is on or off"""
self._backlight = on_off & 0x01
i2c_data = (self._last_data & 0xF7) + self._backlight * 0x08
self._i2c_write(i2c_data,pulse_en=False)
def shows(self, text, line=0, column=0, center=False):
'''Character display'''
text = str(text).encode('ascii')
column=(self._lcd_width-len(text))//2 if center else column
self.write_byte(LCD_LINES[line] + column, LCD_CMD)
for b in text:
self.write_byte(0x0C+0*0x02+0*0x01, LCD_CMD)
self.write_byte(b, LCD_DAT)
def print(self, text, line=0, column=0, delay=500):
'''Print Effect Character Display'''
text = str(text).encode('ascii')
self.write_byte(LCD_LINES[line] + column, LCD_CMD)
for b in text:
self.write_byte(0x0C+1*0x02+1*0x01, LCD_CMD)
sleep_ms(delay)
self.write_byte(b, LCD_DAT)
sleep_ms(delay)

View File

@@ -0,0 +1,94 @@
"""
ICM42670P
Micropython library for the ICM42670P(Accelerometer+Gyroscope)
=======================================================
#Preliminary composition 20220716
dahanzimin From the Mixly Team
"""
import time
from micropython import const
ICM42670_REG_DEVICE_ID = const(0x00)
ICM42670_REG_RESET = const(0x02)
ICM42670_REG_DATA = const(0x09)
ICM42670_REG_PWR_MGMT0 = const(0x1F)
ICM42670_REG_GYRO_CONFIG0 = const(0x20)
ICM42670_REG_ACCEL_CONFIG0 = const(0x21)
ICM42670_REG_APEX_DATA0 = const(0x31)
ICM42670_REG_WHO_AM_I = const(0x75)
AccRange_16g = 0
AccRange_8g = 1
AccRange_4g = 2
AccRange_2g = 3
GyrRange_2000dps = 0
GyrRange_1000dps = 1
GyrRange_500dps = 2
GyrRange_250dps = 3
Acc_Gyr_Odr_1600Hz = 0x05
Acc_Gyr_Odr_800Hz = 0x06
Acc_Gyr_Odr_400Hz = 0x07
Acc_Gyr_Odr_200Hz = 0x08
Acc_Gyr_Odr_100Hz = 0x09
Acc_Gyr_Odr_50Hz = 0x0A
Acc_Gyr_Odr_25Hz = 0x0B
Acc_Gyr_Odr_12_5Hz = 0x0C
class ICM42670:
def __init__(self, i2c_bus, addr=0x68, AccRange=AccRange_16g, GyrRange=GyrRange_2000dps, Acc_Gyr_Odr=Acc_Gyr_Odr_100Hz):
self._device = i2c_bus
self._address = addr
if self._chip_id() != 0x67:
raise AttributeError("Cannot find a ICM42670")
self._wreg(ICM42670_REG_RESET,0x10) #Software reset enabled
time.sleep(0.1)
self._wreg(ICM42670_REG_GYRO_CONFIG0,(GyrRange << 4) | Acc_Gyr_Odr) #Gyr-500HZ/2000dps
self._wreg(ICM42670_REG_ACCEL_CONFIG0,(AccRange << 4) | Acc_Gyr_Odr) #ACC-100HZ/16G
self._wreg(ICM42670_REG_PWR_MGMT0,0x1E)
time.sleep(0.1)
self.acc_lsb_div= 2 ** (11 + AccRange)
self.gyr_lsb_div= 2 ** (14 + GyrRange)
def _wreg(self, reg, val):
'''Write memory address'''
self._device.writeto_mem(self._address,reg,val.to_bytes(1, 'little'))
def _rreg(self, reg,nbytes=1):
'''Read memory address'''
return self._device.readfrom_mem(self._address, reg, nbytes)[0] if nbytes<=1 else self._device.readfrom_mem(self._address, reg, nbytes)[0:nbytes]
def _chip_id(self):
return self._rreg(ICM42670_REG_WHO_AM_I)
def u2s(self,n):
return n if n < (1 << 15) else n - (1 << 16)
def getdata(self):
_buffer=self._rreg(ICM42670_REG_DATA,14)
tmp= float(self.u2s(_buffer[0]<<8|_buffer[1]))/128+25
acc_x=float(self.u2s(_buffer[2]<<8|_buffer[3]))/self.acc_lsb_div
acc_y=float(self.u2s(_buffer[4]<<8|_buffer[5]))/self.acc_lsb_div
acc_z=float(self.u2s(_buffer[6]<<8|_buffer[7]))/self.acc_lsb_div
gyr_x=float(self.u2s(_buffer[8]<<8|_buffer[9]))/self.gyr_lsb_div
gyr_y=float(self.u2s(_buffer[10]<<8|_buffer[11]))/self.gyr_lsb_div
gyr_z=float(self.u2s(_buffer[12]<<8|_buffer[13]))/self.gyr_lsb_div
return (acc_x,acc_y,acc_z),(gyr_x,gyr_y,gyr_z),round(tmp,2)
def accelerometer(self):
return self.getdata()[0]
def strength(self):
from math import sqrt
return sqrt(self.accelerometer()[0]**2+self.accelerometer()[1]**2+self.accelerometer()[2]**2)
def gyroscope(self):
return self.getdata()[1]
def temperature(self):
return self.getdata()[2]

View File

@@ -0,0 +1,16 @@
#Take the picture bytes in informatio_picture.py
#--dahanzimin From the Mixly Team
Accept=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00p\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x01\xa7\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x03y\x80\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x02~`\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x04\xff0\x00\x7f\x00\x00\x00\x00\x00\x00\x00\t\xff\xec\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x1b\xff\xf6\x00\x7f\x00\x00\x00\x00\x00\x00\x007\xff\xfd\x80\x7f\x00\x00\x00\x00\x00\x00\x00o\xff\xff\x80\x7f\x00\x00\x00\x00\x00\x00\x00_\xff\xff\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x9f\xff\xfe\x00\x7f\x00\x00\x00\x00\x00\x00\x01\xbf\xff\xfc\x00\x7f\x00\x00\x00\x00\x00\x00\x03\x7f\xff\xf8\x00\x7f\x00\x00\x00\x00\x00\x00\x06\xff\xff\xf0\x00\x7f\x00\x00\x00\x00\x00\x00\x05\xff\xff\xe0\x00\x7f\x00\x00\x00\x00\x00\x00\x0b\xff\xff\xc0\x00\x7f\x00\x00\x00\x00\x00\x00\x17\xff\xff\x80\x00\x7f\x00\x00\x00\x00\x00\x007\xff\xfe\x00\x00\x7f\x00\x00\x00\x00\x00\x00o\xff\xfc\x00\x00\x7f\x00\x00\x00\x00\x00\x00_\xff\xf8\x00\x00\x7f\x00\x00\x00\x00\x00\x00\xbf\xff\xf0\x00\x00\x7f\x00\x00\x00\x00\x00\x01\x7f\xff\xe0\x00\x00\x7f\x00\x00\x00\x00\x00\x03\x7f\xff\xc0\x00\x00\x7f\x00\x00\x00\x00\x00\x07\xff\xff\x80\x00\x00\x7f\x00\x00\x00\x00\x00\r\xff\xff\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x0b\xff\xfe\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x1f\xff\xfc\x00\x00\x00\x7f\x00\x00\x00\x00\x00/\xff\xf8\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x7f\xff\xf0\x00\x00\x00\x7f\x00\x00\x01\xc0\x00\xff\xff\xe0\x00\x00\x00\x7f\x00\x00\x1e@\x00\xff\xff\xc0\x00\x00\x00\x7f\x00\x01\xeb \x01\xff\xff\x80\x00\x00\x00\x7f\x00\x1e\xff\xa0\x03\xff\xff\x00\x00\x00\x00\x7f\x00w\xff\xb0\x07\xff\xfe\x00\x00\x00\x00\x7f\x00?\xff\x90\x0f\xff\xfc\x00\x00\x00\x00\x7f\x00\x1f\xff\xd0\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x1f\xff\xf8\x1f\xff\xf0\x00\x00\x00\x00\x7f\x00\x0f\xff\xe8?\xff\xe0\x00\x00\x00\x00\x7f\x00\x07\xff\xf8\x7f\xff\xc0\x00\x00\x00\x00\x7f\x00\x03\xff\xf4\xff\xff\x80\x00\x00\x00\x00\x7f\x00\x03\xff\xfd\xff\xff\x00\x00\x00\x00\x00\x7f\x00\x01\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x7f\x00\x00\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x7f\x00\x00\x7f\xff\xff\xf8\x00\x00\x00\x00\x00\x7f\x00\x00\x7f\xff\xff\xf0\x00\x00\x00\x00\x00\x7f\x00\x00?\xff\xff\xe0\x00\x00\x00\x00\x00\x7f\x00\x00\x1f\xff\xff\xc0\x00\x00\x00\x00\x00\x7f\x00\x00\x0f\xff\xff\x80\x00\x00\x00\x00\x00\x7f\x00\x00\x07\xff\xff\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x07\xff\xfe\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x03\xff\xf8\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x01\xff\xf0\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\xff\xe0\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\xff\xc0\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x7f\x80\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00?\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Backward=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0b\xff\xf4\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf4\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf4\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf4\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf4\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf4\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf4\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf4\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf4\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf4\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf4\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf4\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf4\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf4\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf4\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf4\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xfc\x00\x00\x00\x00\x7f\x00\x00\x00?\xff\xff\xf7\xfe\x00\x00\x00\x7f\x00\x00\x00?\xff\xff\xfdW\x00\x00\x00\x7f\x00\x00\x00\x1f\xff\xff\xff\xf2\x00\x00\x00\x7f\x00\x00\x00\x1f\xff\xff\xff\xe4\x00\x00\x00\x7f\x00\x00\x00\x0f\xff\xff\xff\xe8\x00\x00\x00\x7f\x00\x00\x00\x07\xff\xff\xff\xd8\x00\x00\x00\x7f\x00\x00\x00\x03\xff\xff\xff\xb0\x00\x00\x00\x7f\x00\x00\x00\x03\xff\xff\xff\xa0\x00\x00\x00\x7f\x00\x00\x00\x01\xff\xff\xff@\x00\x00\x00\x7f\x00\x00\x00\x00\xff\xff\xff\xc0\x00\x00\x00\x7f\x00\x00\x00\x00\x7f\xff\xfe\x80\x00\x00\x00\x7f\x00\x00\x00\x00\x7f\xff\xfd\x00\x00\x00\x00\x7f\x00\x00\x00\x00?\xff\xfe\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x1f\xff\xfe\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x07\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x03\xff\xf0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x01\xff\xe0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x01\xff\xc0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\xff\xc0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x7f\x80\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00?\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00>\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Decline=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x000\x00\x00\x00\x02\x00\x00\x00\x7f\x00\x00\x00x\x00\x00\x00\x05\x00\x00\x00\x7f\x00\x00\x00\xfc\x00\x00\x00\x0f\x80\x00\x00\x7f\x00\x00\x01\xfe\x00\x00\x00\x17\xc0\x00\x00\x7f\x00\x00\x03\xff\x00\x00\x00?\xa0\x00\x00\x7f\x00\x00\x07\xff\x80\x00\x00_\xf0\x00\x00\x7f\x00\x00\x0f\xff\xc0\x00\x00\xff\xe8\x00\x00\x7f\x00\x00\x1f\xff\xe0\x00\x01\x7f\xfc\x00\x00\x7f\x00\x00?\xff\xf0\x00\x03\xff\xfa\x00\x00\x7f\x00\x00\x7f\xff\xf8\x00\x05\xff\xff\x00\x00\x7f\x00\x00\xff\xff\xfc\x00\x0f\xff\xfe\x80\x00\x7f\x00\x01\xff\xff\xfe\x00\x17\xff\xff\xc0\x00\x7f\x00\x01\xff\xff\xff\x00?\xff\xff\xc0\x00\x7f\x00\x00\xff\xff\xff\x80_\xff\xff\x80\x00\x7f\x00\x00\x7f\xff\xff\xc0\xff\xff\xff\x00\x00\x7f\x00\x00?\xff\xff\xe1\x7f\xff\xfe\x00\x00\x7f\x00\x00\x1f\xff\xff\xf3\xff\xff\xfc\x00\x00\x7f\x00\x00\x0f\xff\xff\xfd\xff\xff\xf8\x00\x00\x7f\x00\x00\x07\xff\xff\xff\xff\xff\xf0\x00\x00\x7f\x00\x00\x03\xff\xff\xff\xff\xff\xe0\x00\x00\x7f\x00\x00\x01\xff\xff\xff\xff\xff\xc0\x00\x00\x7f\x00\x00\x00\xff\xff\xff\xff\xff\x80\x00\x00\x7f\x00\x00\x00\x7f\xff\xff\xff\xff\x00\x00\x00\x7f\x00\x00\x00?\xff\xff\xff\xfe\x00\x00\x00\x7f\x00\x00\x00\x1f\xff\xff\xff\xfc\x00\x00\x00\x7f\x00\x00\x00\x0f\xff\xff\xff\xf8\x00\x00\x00\x7f\x00\x00\x00\x07\xff\xff\xff\xf0\x00\x00\x00\x7f\x00\x00\x00\x03\xff\xff\xff\xe0\x00\x00\x00\x7f\x00\x00\x00\x01\xff\xff\xff\xc0\x00\x00\x00\x7f\x00\x00\x00\x00\xff\xff\xff\x80\x00\x00\x00\x7f\x00\x00\x00\x00\xff\xff\xff\xc0\x00\x00\x00\x7f\x00\x00\x00\x01\xff\xff\xff\xe0\x00\x00\x00\x7f\x00\x00\x00\x03\xff\xff\xff\xf0\x00\x00\x00\x7f\x00\x00\x00\x07\xff\xff\xff\xf8\x00\x00\x00\x7f\x00\x00\x00\x0b\xff\xff\xff\xfc\x00\x00\x00\x7f\x00\x00\x00\x1f\xff\xff\xff\xfe\x00\x00\x00\x7f\x00\x00\x00/\xff\xff\xff\xff\x00\x00\x00\x7f\x00\x00\x00\x7f\xff\xff\xff\xff\x80\x00\x00\x7f\x00\x00\x00\xbf\xff\xff\xff\xff\xc0\x00\x00\x7f\x00\x00\x01\xff\xff\xff\xff\xff\xe0\x00\x00\x7f\x00\x00\x02\xff\xff\xff\xff\xff\xf0\x00\x00\x7f\x00\x00\x07\xff\xff\xff\xff\xff\xf8\x00\x00\x7f\x00\x00\x0b\xff\xff\xf7\xff\xff\xfc\x00\x00\x7f\x00\x00\x1f\xff\xff\xe3\xff\xff\xfe\x00\x00\x7f\x00\x00/\xff\xff\xc1\xff\xff\xff\x00\x00\x7f\x00\x00\x7f\xff\xff\x80\xff\xff\xff\x80\x00\x7f\x00\x00\xbf\xff\xff\x00\x7f\xff\xff\xc0\x00\x7f\x00\x01\xff\xff\xfe\x00?\xff\xff\xc0\x00\x7f\x00\x00\xff\xff\xfc\x00\x1f\xff\xff\xc0\x00\x7f\x00\x00\x7f\xff\xf8\x00\x0f\xff\xff\x80\x00\x7f\x00\x00?\xff\xf0\x00\x07\xff\xff\x00\x00\x7f\x00\x00\x1f\xff\xe0\x00\x03\xff\xfe\x00\x00\x7f\x00\x00\x0f\xff\xc0\x00\x01\xff\xfc\x00\x00\x7f\x00\x00\x07\xff\x80\x00\x00\xff\xf8\x00\x00\x7f\x00\x00\x03\xff\x00\x00\x00\x7f\xf0\x00\x00\x7f\x00\x00\x01\xfe\x00\x00\x00?\xe0\x00\x00\x7f\x00\x00\x00\xfc\x00\x00\x00\x1f\xc0\x00\x00\x7f\x00\x00\x00x\x00\x00\x00\x0f\x80\x00\x00\x7f\x00\x00\x000\x00\x00\x00\x07\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Forward=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x006\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00+\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00]\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\xdc\x80\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x01\xbe\xc0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x01\x7f`\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x02\xff\xa0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x07\xff\x90\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x05\xff\xd8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xec\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x17\xff\xf4\x00\x00\x00\x00\x7f\x00\x00\x00\x00?\xff\xf2\x00\x00\x00\x00\x7f\x00\x00\x00\x00?\xff\xfb\x00\x00\x00\x00\x7f\x00\x00\x00\x00_\xff\xfd\x80\x00\x00\x00\x7f\x00\x00\x00\x00\xff\xff\xfe\x80\x00\x00\x00\x7f\x00\x00\x00\x01\xff\xff\xfe@\x00\x00\x00\x7f\x00\x00\x00\x01\xff\xff\xff`\x00\x00\x00\x7f\x00\x00\x00\x03\xff\xff\xff\xb0\x00\x00\x00\x7f\x00\x00\x00\x07\xff\xff\xff\xd0\x00\x00\x00\x7f\x00\x00\x00\x07\xff\xff\xff\xc8\x00\x00\x00\x7f\x00\x00\x00\x0f\xff\xff\xff\xec\x00\x00\x00\x7f\x00\x00\x00\x1f\xff\xff\xff\xf4\x00\x00\x00\x7f\x00\x00\x00?\xff\xff\xff\xf2\x00\x00\x00\x7f\x00\x00\x00?\xff\xff\xff\xff\x00\x00\x00\x7f\x00\x00\x00\x00\x1f\xff\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Left=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00b\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x01>\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x06~\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\r\xfe\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x13\xfe\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00g\xfe\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\xdf\xff\xff\xff\xff\xff\xf0\x00\x7f\x00\x00\x01?\xffUUUUX\x00\x7f\x00\x00\x06\xff\xff\xff\xff\xff\xff\xf8\x00\x7f\x00\x00\r\xff\xff\xff\xff\xff\xff\xe8\x00\x7f\x00\x00\x17\xff\xff\xff\xff\xff\xff\xf8\x00\x7f\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xf8\x00\x7f\x00\x00\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x7f\x00\x01\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x7f\x00\x07\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x7f\x00\x07\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x7f\x00\x01\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x7f\x00\x00\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x7f\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xf8\x00\x7f\x00\x00\x1f\xff\xff\xff\xff\xff\xff\xf8\x00\x7f\x00\x00\x0f\xff\xff\xff\xff\xff\xff\xf8\x00\x7f\x00\x00\x03\xff\xff\xff\xff\xff\xff\xf8\x00\x7f\x00\x00\x01\xff\xff\xff\xff\xff\xff\xf8\x00\x7f\x00\x00\x00\xff\xff\xff\xff\xff\xff\xf0\x00\x7f\x00\x00\x00?\xfe\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x1f\xfe\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x0f\xfe\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x03\xfe\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x01\xfe\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00~\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00>\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
No_go=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x01\xff\xe0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x1f\xfc>\x00\x00\x00\x00\x7f\x00\x00\x00\x00\xff\xff\xc3\x80\x00\x00\x00\x7f\x00\x00\x00\x03\xff\xff\xf8`\x00\x00\x00\x7f\x00\x00\x00\x07\xff\xff\xff\x18\x00\x00\x00\x7f\x00\x00\x00\x1f\xff\xff\xff\xcc\x00\x00\x00\x7f\x00\x00\x00?\xff\xff\xff\xf3\x00\x00\x00\x7f\x00\x00\x00\x7f\xff\xc1\xff\xfd\x80\x00\x00\x7f\x00\x00\x00\xff\xfc\x00\x1f\xfc\xc0\x00\x00\x7f\x00\x00\x01\xff\xf0\x00\x03\xff`\x00\x00\x7f\x00\x00\x03\xff\xc0\x00\x00\xf7\xb0\x00\x00\x7f\x00\x00\x07\xff\x00\x00\x00\x7f\xd0\x00\x00\x7f\x00\x00\x0f\xfe\x00\x00\x00_\xe8\x00\x00\x7f\x00\x00\x0f\xf8\x00\x00\x00\xff\xf4\x00\x00\x7f\x00\x00\x1f\xf0\x00\x00\x01\x7f\xf4\x00\x00\x7f\x00\x00?\xf0\x00\x00\x03\xff\xfa\x00\x00\x7f\x00\x00?\xe0\x00\x00\x05\xff\xfb\x00\x00\x7f\x00\x00\x7f\xc0\x00\x00\x0f\xfd\xfd\x00\x00\x7f\x00\x00\x7f\xc0\x00\x00\x17\xf8\xfd\x00\x00\x7f\x00\x00\x7f\x80\x00\x00?\xf0\xff\x80\x00\x7f\x00\x00\xff\x80\x00\x00_\xe0~\x80\x00\x7f\x00\x00\xff\x00\x00\x00\xff\xc0\x7f\x80\x00\x7f\x00\x00\xff\x00\x00\x01\x7f\x80?@\x00\x7f\x00\x00\xfe\x00\x00\x03\xff\x00?@\x00\x7f\x00\x01\xfe\x00\x00\x05\xfe\x00?@\x00\x7f\x00\x01\xfe\x00\x00\x0f\xfc\x00\x1f\xc0\x00\x7f\x00\x01\xfe\x00\x00\x17\xf8\x00\x1f\xc0\x00\x7f\x00\x01\xfc\x00\x00?\xf0\x00\x1f\xe0\x00\x7f\x00\x01\xfc\x00\x00_\xe0\x00\x1f\xa0\x00\x7f\x00\x01\xfc\x00\x00\xff\xc0\x00\x1f\xe0\x00\x7f\x00\x01\xfc\x00\x01\x7f\x80\x00\x1f\xa0\x00\x7f\x00\x01\xfc\x00\x03\xff\x00\x00\x1f\xe0\x00\x7f\x00\x01\xfe\x00\x05\xfe\x00\x00\x1f\xe0\x00\x7f\x00\x01\xfe\x00\x0f\xfc\x00\x00\x1f\xc0\x00\x7f\x00\x01\xfe\x00\x17\xf8\x00\x00?\xc0\x00\x7f\x00\x01\xfe\x00?\xf0\x00\x00?\xc0\x00\x7f\x00\x00\xff\x00_\xe0\x00\x00?\xc0\x00\x7f\x00\x00\xff\x00\xff\xc0\x00\x00\x7f\xc0\x00\x7f\x00\x00\xff\x01\xff\x80\x00\x00\x7f\x80\x00\x7f\x00\x00\xff\x83\xff\x00\x00\x00\x7f\x80\x00\x7f\x00\x00\x7f\x87\xfe\x00\x00\x00\xff\x80\x00\x7f\x00\x00\x7f\xcf\xfc\x00\x00\x01\xff\x00\x00\x7f\x00\x00?\xff\xf8\x00\x00\x01\xff\x00\x00\x7f\x00\x00?\xff\xf0\x00\x00\x03\xfe\x00\x00\x7f\x00\x00\x1f\xff\xe0\x00\x00\x07\xfe\x00\x00\x7f\x00\x00\x1f\xff\xc0\x00\x00\x07\xfc\x00\x00\x7f\x00\x00\x0f\xff\x80\x00\x00\x1f\xfc\x00\x00\x7f\x00\x00\x07\xff\x00\x00\x00?\xf8\x00\x00\x7f\x00\x00\x07\xff\x80\x00\x00\xff\xf0\x00\x00\x7f\x00\x00\x03\xff\xe0\x00\x01\xff\xe0\x00\x00\x7f\x00\x00\x01\xff\xf8\x00\x0f\xff\xc0\x00\x00\x7f\x00\x00\x00\xff\xff\x00\x7f\xff\x80\x00\x00\x7f\x00\x00\x00\x7f\xff\xff\xff\xff\x00\x00\x00\x7f\x00\x00\x00\x1f\xff\xff\xff\xfe\x00\x00\x00\x7f\x00\x00\x00\x0f\xff\xff\xff\xfc\x00\x00\x00\x7f\x00\x00\x00\x03\xff\xff\xff\xf0\x00\x00\x00\x7f\x00\x00\x00\x01\xff\xff\xff\xc0\x00\x00\x00\x7f\x00\x00\x00\x00?\xff\xff\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x07\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00?\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Question_mark=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x03\xff\xf0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x1f\xff\x1e\x00\x00\x00\x00\x7f\x00\x00\x00\x00?\xff\xe3\x80\x00\x00\x00\x7f\x00\x00\x00\x00\xff\xff\xfc\xc0\x00\x00\x00\x7f\x00\x00\x00\x01\xff\xff\xff \x00\x00\x00\x7f\x00\x00\x00\x03\xff\xff\xff\x90\x00\x00\x00\x7f\x00\x00\x00\x07\xff\xff\xff\xc8\x00\x00\x00\x7f\x00\x00\x00\x0f\xff\xff\xff\xe4\x00\x00\x00\x7f\x00\x00\x00\x1f\xff\xf1\xff\xf2\x00\x00\x00\x7f\x00\x00\x00\x1f\xff\x80\x7f\xf9\x00\x00\x00\x7f\x00\x00\x00?\xfe\x00\x1f\xfd\x00\x00\x00\x7f\x00\x00\x00?\xfc\x00\x07\xfd\x80\x00\x00\x7f\x00\x00\x00?\xf8\x00\x07\xfe\x80\x00\x00\x7f\x00\x00\x00\x7f\xf8\x00\x03\xfe\x80\x00\x00\x7f\x00\x00\x00\x7f\xf0\x00\x03\xfe\x80\x00\x00\x7f\x00\x00\x00\x7f\xf0\x00\x01\xfe\x80\x00\x00\x7f\x00\x00\x00\x7f\xf0\x00\x01\xff\x80\x00\x00\x7f\x00\x00\x00\x7f\xe0\x00\x01\xff\x80\x00\x00\x7f\x00\x00\x00\x7f\xe0\x00\x01\xff\x80\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x01\xff\x80\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x03\xff\x80\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x07\xff\x80\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x0f\xff\x80\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x1f\xff\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00?\xfe\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x7f\xfe\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\xff\xfc\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x01\xff\xf8\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x03\xff\xf0\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x07\xff\xe0\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x0f\xff\xc0\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x1f\xff\x80\x00\x00\x00\x7f\x00\x00\x00\x00\x00?\xff\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x7f\xfe\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x7f\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\xff\xf8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\xff\xf0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\xff\xe0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\xff\xc0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x01\xff\xc0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x01\xff\x80\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x01\xff\x80\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\xff\x80\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\xfd\x80\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x01\xfe\xc0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x03\xff@\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x03\xff\xa0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x03\xff\xe0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x03\xff\xe0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x03\xff\xe0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x03\xff\xc0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x01\xff\xc0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x01\xff\x80\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\xff\x80\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00>\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Right=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x000\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00&\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00;\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00,\xc0\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00?`\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00/\xb0\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00?\xcc\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00/\xf6\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00?\xfb\x00\x00\x00\x7f\x00\x07\xff\xff\xff\xff\xef\xfc\xc0\x00\x00\x7f\x00\x05UUUU_\xff`\x00\x00\x7f\x00\x07\xff\xff\xff\xff\xff\xff\xb0\x00\x00\x7f\x00\x07\xff\xff\xff\xff\xff\xff\xcc\x00\x00\x7f\x00\x07\xff\xff\xff\xff\xff\xff\xf6\x00\x00\x7f\x00\x07\xff\xff\xff\xff\xff\xff\xfb\x00\x00\x7f\x00\x07\xff\xff\xff\xff\xff\xff\xfc\xc0\x00\x7f\x00\x07\xff\xff\xff\xff\xff\xff\xff`\x00\x7f\x00\x07\xff\xff\xff\xff\xff\xff\xff\xb0\x00\x7f\x00\x07\xff\xff\xff\xff\xff\xff\xff\xb0\x00\x7f\x00\x07\xff\xff\xff\xff\xff\xff\xfe`\x00\x7f\x00\x07\xff\xff\xff\xff\xff\xff\xfc\x80\x00\x7f\x00\x07\xff\xff\xff\xff\xff\xff\xfb\x00\x00\x7f\x00\x07\xff\xff\xff\xff\xff\xff\xf6\x00\x00\x7f\x00\x07\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x7f\x00\x07\xff\xff\xff\xff\xff\xff\xb0\x00\x00\x7f\x00\x07\xff\xff\xff\xff\xff\xff`\x00\x00\x7f\x00\x07\xff\xff\xff\xff\xff\xff\x80\x00\x00\x7f\x00\x00\x00\x00\x00\x00?\xff\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00?\xfc\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00?\xf8\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00?\xf0\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00?\xc0\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00?\x80\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00<\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x008\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Stop_1=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\xff\xff\xff\x80\x00\x00\x00\x7f\x00\x00\x00\x01\xfc\x00\x00@\x00\x00\x00\x7f\x00\x00\x00\x03\xff\xff\xff \x00\x00\x00\x7f\x00\x00\x00\x07\x80\x00\x00\xd0\x00\x00\x00\x7f\x00\x00\x00\x0f\x00\x00\x00h\x00\x00\x00\x7f\x00\x00\x00\x1e\x7f\xff\xff4\x00\x00\x00\x7f\x00\x00\x00<\xff\xff\xff\x9a\x00\x00\x00\x7f\x00\x00\x00y\xff\xff\xff\xcd\x00\x00\x00\x7f\x00\x00\x00\xf3\xff\xff\xff\xe6\x80\x00\x00\x7f\x00\x00\x01\xe7\xff\xff\xff\xf3@\x00\x00\x7f\x00\x00\x03\xcf\xff\xff\xff\xf9\xa0\x00\x00\x7f\x00\x00\x07\x9f\xff\xff\xff\xfc\xd0\x00\x00\x7f\x00\x00\x0f?\xff\xff\xff\xfeh\x00\x00\x7f\x00\x00\x1e\x7f\xff\xff\xff\xff4\x00\x00\x7f\x00\x00<\xff\xff\xff\xff\xff\x9a\x00\x00\x7f\x00\x00y\xff\xff\xff\xff\xff\xcd\x00\x00\x7f\x00\x00\xf3\xff\xff\xff\xff\xff\xe6\x80\x00\x7f\x00\x01\xe7\xff\xff\xff\xff\xff\xf3@\x00\x7f\x00\x03\xcf\xff\xff\xff\xff\xff\xf9\xa0\x00\x7f\x00\x03\x9f\xff\xff\xff\xff\xff\xfc\xa0\x00\x7f\x00\x03\x9f\xff\xff\xff\xff\xff\xfc\xa0\x00\x7f\x00\x03\x9e\x0f\x00<\x0f\xc0<\xa0\x00\x7f\x00\x03\x9c\x02\x00\x18\x07\x80\x0c\xa0\x00\x7f\x00\x03\x98\x02\x00\x10\x03\x80\x04\xa0\x00\x7f\x00\x03\x90\xe1\xe0\xf1\xe3\x8f\xc4\xa0\x00\x7f\x00\x03\x91\xf7\xf1\xe3\xf1\x8f\xe4\xa0\x00\x7f\x00\x03\x91\xff\xf1\xe3\xf1\x8f\xe0\xa0\x00\x7f\x00\x03\x98\xff\xf1\xc7\xf9\x8f\xe4\xa0\x00\x7f\x00\x03\x98?\xf1\xc7\xf8\x8f\xc4\xa0\x00\x7f\x00\x03\x9c\x0f\xf1\xc7\xf8\x87\x84\xa0\x00\x7f\x00\x03\x9e\x03\xf1\xc7\xf8\x80\x0c\xa0\x00\x7f\x00\x03\x9f\x81\xf1\xc7\xf8\x80\x1c\xa0\x00\x7f\x00\x03\x9f\xe1\xf1\xc7\xf8\x87\xfc\xa0\x00\x7f\x00\x03\x9f\xf1\xf1\xc7\xf8\x87\xfc\xa0\x00\x7f\x00\x03\x9f\xf8\xf1\xe3\xf1\x87\xfc\xa0\x00\x7f\x00\x03\x9f\xf8\xf1\xe3\xf1\x87\xfc\xa0\x00\x7f\x00\x03\x91\xf1\xf1\xe1\xe1\x87\xfc\xa0\x00\x7f\x00\x03\x90\x01\xf1\xf0\xc3\x87\xfc\xa0\x00\x7f\x00\x03\x98\x01\xf1\xf8\x07\x87\xfc\xa0\x00\x7f\x00\x03\x9c\x07\xf1\xfc\x0f\x87\xfc\xa0\x00\x7f\x00\x03\x9f\x1f\xff\xff?\xff\xfc\xa0\x00\x7f\x00\x03\x9f\xff\xff\xff\xff\xff\xfc\xa0\x00\x7f\x00\x03\xcf\xff\xff\xff\xff\xff\xf9\xa0\x00\x7f\x00\x01\xe7\xff\xff\xff\xff\xff\xf3@\x00\x7f\x00\x00\xf3\xff\xff\xff\xff\xff\xe6\x80\x00\x7f\x00\x00y\xff\xff\xff\xff\xff\xcd\x00\x00\x7f\x00\x00<\xff\xff\xff\xff\xff\x9a\x00\x00\x7f\x00\x00\x1e\x7f\xff\xff\xff\xff4\x00\x00\x7f\x00\x00\x0f?\xff\xff\xff\xfeh\x00\x00\x7f\x00\x00\x07\x9f\xff\xff\xff\xfc\xf0\x00\x00\x7f\x00\x00\x03\xcf\xff\xff\xff\xf9\xe0\x00\x00\x7f\x00\x00\x01\xe7\xff\xff\xff\xf3\xc0\x00\x00\x7f\x00\x00\x00\xf3\xff\xff\xff\xe7\x80\x00\x00\x7f\x00\x00\x00y\xff\xff\xff\xcf\x00\x00\x00\x7f\x00\x00\x00<\xff\xff\xff\x9e\x00\x00\x00\x7f\x00\x00\x00\x1e\x7f\xff\xff<\x00\x00\x00\x7f\x00\x00\x00\x0f\x00\x00\x00x\x00\x00\x00\x7f\x00\x00\x00\x07\x80\x00\x00\xf0\x00\x00\x00\x7f\x00\x00\x00\x03\xff\xff\xff\xe0\x00\x00\x00\x7f\x00\x00\x00\x01\xff\xff\xff\xc0\x00\x00\x00\x7f\x00\x00\x00\x00\xff\xff\xff\x80\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Stop_2=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\xff\xff\xff\x80\x00\x00\x00\x7f\x00\x00\x00\x01\xfc\x00\x00@\x00\x00\x00\x7f\x00\x00\x00\x03\xff\xff\xff \x00\x00\x00\x7f\x00\x00\x00\x07\xc0\x00\x00\xd0\x00\x00\x00\x7f\x00\x00\x00\x0f\x00\x00\x00h\x00\x00\x00\x7f\x00\x00\x00\x1e\x00\x00\x004\x00\x00\x00\x7f\x00\x00\x00<\x00\x00\x00\x1a\x00\x00\x00\x7f\x00\x00\x00x\x00\x00\x00\r\x00\x00\x00\x7f\x00\x00\x00\xf0\x00\x00\x00\x06\x80\x00\x00\x7f\x00\x00\x01\xe0\x00\x00\x00\x03@\x00\x00\x7f\x00\x00\x03\xc0\x00\x00\x00\x01\xa0\x00\x00\x7f\x00\x00\x07\x80\x00\x00\x00\x00\xd0\x00\x00\x7f\x00\x00\x0f\x00\x00\x00\x00\x00h\x00\x00\x7f\x00\x00\x1e\x00\x00\x00\x00\x004\x00\x00\x7f\x00\x00<\x00\x00\x00\x00\x00\x1a\x00\x00\x7f\x00\x00x\x00\x00\x00\x00\x00\r\x00\x00\x7f\x00\x00\xf0\x00\x00\x00\x00\x00\x06\x80\x00\x7f\x00\x01\xe0\x00\x00\x00\x00\x00\x03@\x00\x7f\x00\x03\xc0\x00\x00\x00\x00\x00\x01\xa0\x00\x7f\x00\x03\x80\x00\x00\x00\x00\x00\x00\xa0\x00\x7f\x00\x03\x80\x00\x00\x00\x00\x00\x00\xa0\x00\x7f\x00\x03\x81\xf0\xff\xc3\xf0?\xc0\xa0\x00\x7f\x00\x03\x83\xfd\xff\xe7\xf8\x7f\xf0\xa0\x00\x7f\x00\x03\x87\xff\xff\xef\xfc\x7f\xf8\xa0\x00\x7f\x00\x03\x8f\x1e\x1f\x0e\x1cp8\xa0\x00\x7f\x00\x03\x8e\x08\x0e\x1c\x0ep\x1c\xa0\x00\x7f\x00\x03\x8e\x00\x0e\x1c\x0ep\x1c\xa0\x00\x7f\x00\x03\x87\x00\x0e8\x06p\x1c\xa0\x00\x7f\x00\x03\x87\xc0\x0e8\x07p8\xa0\x00\x7f\x00\x03\x83\xf0\x0e8\x07xx\xa0\x00\x7f\x00\x03\x81\xfc\x0e8\x07\x7f\xf0\xa0\x00\x7f\x00\x03\x80~\x0e8\x07\x7f\xe0\xa0\x00\x7f\x00\x03\x80\x1e\x0e8\x07x\x00\xa0\x00\x7f\x00\x03\x80\x0e\x0e8\x07x\x00\xa0\x00\x7f\x00\x03\x80\x07\x0e\x1c\x0ex\x00\xa0\x00\x7f\x00\x03\x80\x07\x0e\x1c\x0ex\x00\xa0\x00\x7f\x00\x03\x8e\x0e\x0e\x1e\x1ex\x00\xa0\x00\x7f\x00\x03\x8f\xfe\x0e\x0f<x\x00\xa0\x00\x7f\x00\x03\x87\xfe\x0e\x07\xf8x\x00\xa0\x00\x7f\x00\x03\x83\xf8\x0e\x03\xf0x\x00\xa0\x00\x7f\x00\x03\x80\xe0\x00\x00\xc0\x00\x00\xa0\x00\x7f\x00\x03\x80\x00\x00\x00\x00\x00\x00\xa0\x00\x7f\x00\x03\xc0\x00\x00\x00\x00\x00\x01\xa0\x00\x7f\x00\x01\xe0\x00\x00\x00\x00\x00\x03@\x00\x7f\x00\x00\xf0\x00\x00\x00\x00\x00\x06\x80\x00\x7f\x00\x00x\x00\x00\x00\x00\x00\r\x00\x00\x7f\x00\x00<\x00\x00\x00\x00\x00\x1a\x00\x00\x7f\x00\x00\x1e\x00\x00\x00\x00\x004\x00\x00\x7f\x00\x00\x0f\x00\x00\x00\x00\x00h\x00\x00\x7f\x00\x00\x07\x80\x00\x00\x00\x00\xf0\x00\x00\x7f\x00\x00\x03\xc0\x00\x00\x00\x01\xe0\x00\x00\x7f\x00\x00\x01\xe0\x00\x00\x00\x03\xc0\x00\x00\x7f\x00\x00\x00\xf0\x00\x00\x00\x07\x80\x00\x00\x7f\x00\x00\x00x\x00\x00\x00\x0f\x00\x00\x00\x7f\x00\x00\x00<\x00\x00\x00\x1e\x00\x00\x00\x7f\x00\x00\x00\x1e\x00\x00\x00<\x00\x00\x00\x7f\x00\x00\x00\x0f\x00\x00\x00x\x00\x00\x00\x7f\x00\x00\x00\x07\x80\x00\x00\xf0\x00\x00\x00\x7f\x00\x00\x00\x03\xff\xff\xff\xe0\x00\x00\x00\x7f\x00\x00\x00\x01\xff\xff\xff\xc0\x00\x00\x00\x7f\x00\x00\x00\x00\xff\xff\xff\x80\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Thumbs_down=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x07\xff\xc0\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x0f\xff\xc0\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x0c\x00\xc7\xff\xff\xff\x00\x00\x00\x7f\x00\x00\x0e\xaa\xff\xff\xff\xff\xc0\x00\x00\x7f\x00\x00\rT\xff\xff\xff\xff\xc0\x00\x00\x7f\x00\x00\x0c\xaa\xff\xff\xff\xff\xc0\x00\x00\x7f\x00\x00\r\xfe\xff\xff\xff\xff\xc0\x00\x00\x7f\x00\x00\x0f\xff\xff\xff\xff\xff\xe0\x00\x00\x7f\x00\x00\r\xff\xff\xff\xff\xff\xf0\x00\x00\x7f\x00\x00\x0f\xff\xff\xff\xff\xff\xf8\x00\x00\x7f\x00\x00\r\xff\xff\xff\xff\xff\xf8\x00\x00\x7f\x00\x00\x0f\xff\xff\xff\xff\xff\xf8\x00\x00\x7f\x00\x00\r\xff\xff\xff\xff\xff\xf0\x00\x00\x7f\x00\x00\x0f\xff\xff\xff\xff\xea\xa0\x00\x00\x7f\x00\x00\r\xff\xff\xff\xff\xff\xf8\x00\x00\x7f\x00\x00\x0f\xff\xff\xff\xff\xff\xf8\x00\x00\x7f\x00\x00\r\xff\xff\xff\xff\xff\xf8\x00\x00\x7f\x00\x00\x0f\xff\xff\xff\xff\xff\xf8\x00\x00\x7f\x00\x00\r\xff\xff\xff\xff\xff\xf8\x00\x00\x7f\x00\x00\x0f\xff\xff\xff\xff\xff\xf0\x00\x00\x7f\x00\x00\r\xff\xff\xff\xff\xd5@\x00\x00\x7f\x00\x00\x0f\xff\xff\xff\xff\xff\xf0\x00\x00\x7f\x00\x00\r\xff\xff\xff\xff\xff\xf0\x00\x00\x7f\x00\x00\x0f\xff\xff\xff\xff\xff\xf0\x00\x00\x7f\x00\x00\r\xff\xc1\xff\xff\xff\xf0\x00\x00\x7f\x00\x00\x0e\xaa\xc0\x7f\xff\xff\xe0\x00\x00\x7f\x00\x00\x0f\xff\xc0?\xff\xff\xe0\x00\x00\x7f\x00\x00\x07\xff\x80?\xff\xff\x80\x00\x00\x7f\x00\x00\x00\x00\x00\x1f\xff\xc0\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x0f\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x07\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x03\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x01\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x01\xfe\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00?\x80\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x1f\x80\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x1f\x80\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x1f\x80\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x1f\x80\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x0f\x80\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x0f\x80\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Thumbs_up=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x0f\x80\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x0f\x80\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x1f\x80\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x1f\x80\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x1f\x80\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x1f\x80\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00?\x80\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00?\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x01\xfe\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x01\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x03\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x07\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x0f\xfc\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x1f\xff\xc0\x00\x00\x00\x7f\x00\x00\x00\x00\x00?\xff\xff\x80\x00\x00\x7f\x00\x00\x07\xff\xc0?\xff\xff\xe0\x00\x00\x7f\x00\x00\x0f\xff\xc0\x7f\xff\xff\xe0\x00\x00\x7f\x00\x00\x0c\x00\xc1\xff\xff\xff\xf0\x00\x00\x7f\x00\x00\rT\xff\xff\xff\xff\xf0\x00\x00\x7f\x00\x00\x0c\xaa\xff\xff\xff\xff\xf0\x00\x00\x7f\x00\x00\rT\xff\xff\xff\xff\xf0\x00\x00\x7f\x00\x00\r\xfe\xff\xff\xff\xea\xa0\x00\x00\x7f\x00\x00\x0f\xff\xff\xff\xff\xff\xf0\x00\x00\x7f\x00\x00\r\xff\xff\xff\xff\xff\xf8\x00\x00\x7f\x00\x00\x0f\xff\xff\xff\xff\xff\xf8\x00\x00\x7f\x00\x00\r\xff\xff\xff\xff\xff\xf8\x00\x00\x7f\x00\x00\x0f\xff\xff\xff\xff\xff\xf8\x00\x00\x7f\x00\x00\r\xff\xff\xff\xff\xff\xf8\x00\x00\x7f\x00\x00\x0f\xff\xff\xff\xff\xea\xa0\x00\x00\x7f\x00\x00\r\xff\xff\xff\xff\xff\xf0\x00\x00\x7f\x00\x00\x0f\xff\xff\xff\xff\xff\xf8\x00\x00\x7f\x00\x00\r\xff\xff\xff\xff\xff\xf8\x00\x00\x7f\x00\x00\x0f\xff\xff\xff\xff\xff\xf8\x00\x00\x7f\x00\x00\r\xff\xff\xff\xff\xff\xf0\x00\x00\x7f\x00\x00\x0f\xff\xff\xff\xff\xff\xe0\x00\x00\x7f\x00\x00\r\xff\xff\xff\xff\xff\xc0\x00\x00\x7f\x00\x00\x0f\xff\xff\xff\xff\xff\xc0\x00\x00\x7f\x00\x00\r\xff\xff\xff\xff\xff\xc0\x00\x00\x7f\x00\x00\x0f\xff\xff\xff\xff\xff\xc0\x00\x00\x7f\x00\x00\r\xff\xc7\xff\xff\xff\x00\x00\x00\x7f\x00\x00\rT\xc0\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x0f\xff\xc0\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x07\xff\x80\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'
Warning=b'P4\n89 64\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00=\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00?\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x7f\x80\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\xff@\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\xf3\xc0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x01\xf3\xa0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x01\xe1\xf0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x03\xe1\xd0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x03\xc0\xf0\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x07\xc0\xe8\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\x80|\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x0f\x80|\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x1f\x00:\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x1f\x00>\x00\x00\x00\x00\x7f\x00\x00\x00\x00>>\x1d\x00\x00\x00\x00\x7f\x00\x00\x00\x00<{\x0f\x00\x00\x00\x00\x7f\x00\x00\x00\x00|y\x0e\x80\x00\x00\x00\x7f\x00\x00\x00\x00\xf8\xfe\x87\xc0\x00\x00\x00\x7f\x00\x00\x00\x00\xf8\xfe\x87\xc0\x00\x00\x00\x7f\x00\x00\x00\x01\xf0\xff\x83\xa0\x00\x00\x00\x7f\x00\x00\x00\x01\xf0\xfe\x83\xe0\x00\x00\x00\x7f\x00\x00\x00\x03\xe0\xff\x81\xd0\x00\x00\x00\x7f\x00\x00\x00\x03\xc0\xff\x80\xf0\x00\x00\x00\x7f\x00\x00\x00\x07\xc0\x7f\x00\xe8\x00\x00\x00\x7f\x00\x00\x00\x0f\x80\x7f\x00|\x00\x00\x00\x7f\x00\x00\x00\x0f\x80\x7f\x00t\x00\x00\x00\x7f\x00\x00\x00\x1f\x00\x7f\x00>\x00\x00\x00\x7f\x00\x00\x00\x1f\x00\x7f\x00>\x00\x00\x00\x7f\x00\x00\x00>\x00\x7f\x00\x1d\x00\x00\x00\x7f\x00\x00\x00>\x00\x7f\x00\x1f\x00\x00\x00\x7f\x00\x00\x00|\x00\x7f\x00\x0e\x80\x00\x00\x7f\x00\x00\x00\xf8\x00\x7f\x00\x07\xc0\x00\x00\x7f\x00\x00\x00\xf8\x00\x7f\x00\x07@\x00\x00\x7f\x00\x00\x01\xf0\x00\x7f\x00\x03\xe0\x00\x00\x7f\x00\x00\x01\xf0\x00\x7f\x00\x03\xe0\x00\x00\x7f\x00\x00\x03\xe0\x00>\x00\x01\xd0\x00\x00\x7f\x00\x00\x03\xe0\x00>\x00\x01\xf0\x00\x00\x7f\x00\x00\x07\xc0\x00>\x00\x00\xe8\x00\x00\x7f\x00\x00\x0f\xc0\x00>\x00\x00\xfc\x00\x00\x7f\x00\x00\x0f\x80\x00\x1c\x00\x00t\x00\x00\x7f\x00\x00\x1f\x00\x00\x00\x00\x00>\x00\x00\x7f\x00\x00\x1f\x00\x00\x00\x00\x00:\x00\x00\x7f\x00\x00>\x00\x00\x00\x00\x00\x1f\x00\x00\x7f\x00\x00>\x00\x00>\x00\x00\x1f\x00\x00\x7f\x00\x00|\x00\x00}\x00\x00\x0e\x80\x00\x7f\x00\x00\xfc\x00\x00~\x80\x00\x0f\xc0\x00\x7f\x00\x00\xf8\x00\x00\x7f\x80\x00\x07@\x00\x7f\x00\x01\xf8\x00\x00\x7f\x80\x00\x07\xe0\x00\x7f\x00\x01\xf0\x00\x00\x7f\x00\x00\x03\xa0\x00\x7f\x00\x03\xe0\x00\x00?\x00\x00\x01\xf0\x00\x7f\x00\x03\xe0\x00\x00\x1e\x00\x00\x01\xf0\x00\x7f\x00\x07\xc0\x00\x00\x00\x00\x00\x00\xe8\x00\x7f\x00\x0f\xc0\x00\x00\x00\x00\x00\x00\xfc\x00\x7f\x00\x0f\x80\x00\x00\x00\x00\x00\x00\xf4\x00\x7f\x00\x1f\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x7f\x00\x1f\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x7f\x00\x1f\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x7f\x00\x07\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f'

View File

@@ -0,0 +1,229 @@
"""
IR-Remote
Micropython library for the IR-Remote/Timer(IR_RX&TX)
===============================================
#Preliminary composition 20240302
@dahanzimin From the Mixly Team
"""
import array, time, gc
from esp32 import RMT
from machine import Pin, Timer
'''接收部分'''
class IR_RX:
BADSTART = 'Invalid start pulse'
BADDATA = 'Invalid data'
def __init__(self, pin, callback=None, timeout=15000, timer_id=1):
self._start = 0
self._ready = False
self._enable = False
self._timeout = timeout
self._callback = callback
self._pulses = array.array('H')
self.code = [None, None, None, memoryview(self._pulses)] #存放[cmd, addr, data, pulses]
Pin(pin, Pin.IN).irq(handler=self._irq_cb, trigger=(Pin.IRQ_FALLING | Pin.IRQ_RISING))
Timer(timer_id).init(period=5, mode=Timer.PERIODIC, callback=self._timer_cb)
def _irq_cb(self, pin):
if not self._enable:
_intime = time.ticks_us()
if self._start == 0:
self._start = _intime
return
self._pulses.append(time.ticks_diff(_intime, self._start))
self._start = _intime
else:
self._start = 0
self._pulses = array.array('H')
def _timer_cb(self, tim):
if len(self._pulses) >= 3 and time.ticks_diff(time.ticks_us(), self._start) > self._timeout:
#接收完成,开始解码
self.code[3] = memoryview(self._pulses)
if self.decode() is None and self._callback:
self._callback(self.code[0], self.code[1], self.code[2], self.code[3])
self._ready = True
self._start = 0
self._pulses = array.array('H')
gc.collect()
def recv_cb(self, callback):
self._callback = callback
def timeout(self, timeout=15000):
self._timeout = timeout
def any(self):
ready = self._ready
self._ready = False
return ready
def enable(self, onoff):
self._enable = onoff
class NEC_RX(IR_RX):
def __init__(self, pin, bits=None, callback=None):
super().__init__(pin, callback, timeout=15000)
self._bits = bits
def decode(self):
pulse_len = len(self._pulses)
if pulse_len < 3:
print("Warning:", self.BADSTART)
return False
else:
start_i = 0
value = 0
#跳过帧头(各厂家定义不一)
for i in range(pulse_len):
if self._pulses[i] <= 2250:
start_i = i
break
val = 1 << ((pulse_len - start_i - 1) // 2) - 1 if (pulse_len - start_i) >= 3 else 0
#根据高低脉冲定义转码
for edge in range(start_i, pulse_len - 1, 2):
value >>= 1
if self._pulses[edge + 1] > 1120:
value |= val
#判读是8、16位解码
if self._bits == 8 or self._bits == 16:
cmd = value >> 16 & 0xff
if cmd != (value >> 24 ^ 0xff) and value != 0x0:
print("Warning:", self.BADDATA)
return False
addr = value & 0xff if self._bits == 8 else value & 0xffff
self.code[0:3] = cmd, addr, value
#其他未定义直接输出转码
else:
self.code[0:3] = None, None, value
class RC5_RX(IR_RX):
def __init__(self, pin, callback=None):
super().__init__(pin, callback, timeout=15000)
def decode(self):
pulse_len = len(self._pulses)
if pulse_len < 3:
print("Warning:", self.BADSTART)
return False
else:
bit = 1
value = 0
num = 0
while True:
short = self._pulses[num] < 1334
if not short:
bit ^= 1
value <<= 1
value |= bit
num += 1 + int(short)
if num >= pulse_len:
value >>= 1
break
#判读解码
cmd = (value & 0x3f) | (0 if ((value >> 12) & 1) else 0x40)
addr = (value >> 6) & 0x1f
self.code[0:3] = cmd, addr, value
'''发射部分'''
class IR_TX:
def __init__(self, pin, cfreq=38000, power=60):
self._rmt = RMT(0, pin=Pin(pin), clock_div=80, tx_carrier = (cfreq, round(power * 0.75), 1))
self._pulses = array.array('H')
self.carrier = False
def transmit(self, cmd=None, addr=None, toggle=None, pulses=None, raw=None):
if pulses is None:
self.carrier = False
if raw is None:
self.tx(cmd, addr, toggle)
else:
self.tx_raw(raw)
self._rmt.write_pulses(tuple(self._pulses))
self._pulses = array.array('H')
else:
self._rmt.write_pulses(tuple(pulses))
def busy(self):
return not self._rmt.wait_done()
def _append(self, *times):
for t in times:
self._pulses.append(t)
self.carrier = not self.carrier
def _add(self, t):
assert t > 0
self._pulses[len(self._pulses)-1] +=t
class NEC_TX(IR_TX):
_TBURST = const(563)
_T_ONE = const(1687)
def __init__(self, pin, samsung=False, power=60):
super().__init__(pin, 38000, power)
self._samsung = samsung
def _bit(self, b):
self._append(_TBURST, _T_ONE if b else _TBURST)
def tx(self, cmd, addr, toggle=0): #cmd:0~0xff, addr:0~0xffff, toggle:0,1
if self._samsung:
self._append(4500, 4500)
else:
self._append(9000, 4500)
if addr < 256: # Short address: append complement
if self._samsung:
addr |= addr << 8
else:
addr |= ((addr ^ 0xff) << 8)
for _ in range(16):
self._bit(addr & 1)
addr >>= 1
cmd |= ((cmd ^ 0xff) << 8)
for _ in range(16):
self._bit(cmd & 1)
cmd >>= 1
self._append(_TBURST)
if toggle == 1:
self._append(30000, 9000, 2250, _TBURST)
def tx_raw(self, raw):
self._append(9000, 4500)
while raw:
self._bit(raw & 1)
raw >>= 1
self._append(_TBURST)
class RC5_TX(IR_TX):
_T_RC5 = const(889)
def __init__(self, pin, power=60):
super().__init__(pin, 36000, power)
def tx(self, cmd, addr, toggle): #cmd:0~0x3f, addr:0~0x1f, toggle:0,1
d = (cmd & 0x3f) | ((addr & 0x1f) << 6) | (((cmd & 0x40) ^ 0x40) << 6) | ((toggle & 1) << 11)
mask = 0x2000
while mask:
if mask == 0x2000:
self._append(_T_RC5)
else:
bit = bool(d & mask)
if bit ^ self.carrier:
self._add(_T_RC5)
self._append(_T_RC5)
else:
self._append(_T_RC5, _T_RC5)
mask >>= 1
def tx_raw(self, raw):
self._append(_T_RC5)
mask = 1 << len(bin(raw)) - 3
while mask:
if bool(raw & mask) ^ self.carrier:
self._add(_T_RC5)
self._append(_T_RC5)
else:
self._append(_T_RC5, _T_RC5)
mask >>= 1
self._append(_T_RC5)

View File

@@ -0,0 +1,76 @@
"""
LTR-308ALS
Micropython library for the LTR-308ALS
=======================================================
#Changed from circuitpython to micropython 20220211
dahanzimin From the Mixly Team
"""
import time
from micropython import const
LTR_308ALS_ADDRESS = const(0x53)
LTR_308ALS_REG_CTRL = const(0x00)
LTR_308ALS_REG_GAIN = const(0x05) #设置增益
LTR_308ALS_REG_DEVICE_ID = const(0x06)
LTR_308ALS_REG_DATA = const(0x0D)
#设置增益范围
LTR_308ALS_CMD_ALS_Enable = const(0x02)
LTR_308ALS_CMD_X1GAIN =const(0x00)
LTR_308ALS_CMD_X3GAIN =const(0x01)
LTR_308ALS_CMD_X6GAIN =const(0x02)
LTR_308ALS_CMD_X9GAIN =const(0x03)
LTR_308ALS_CMD_X18GAIN =const(0x04)
_GAINS = (
LTR_308ALS_CMD_X1GAIN, # 1x
LTR_308ALS_CMD_X3GAIN, # 3x
LTR_308ALS_CMD_X6GAIN, # 6x
LTR_308ALS_CMD_X9GAIN, # 9x
LTR_308ALS_CMD_X18GAIN # 18x
)
_GAINS_X = (
1, # 1x
3, # 3x
6, # 6x
9, # 9x
18 # 18x
)
class LTR_308ALS:
def __init__(self, i2c_bus,gain=1):
self._device = i2c_bus
self._address = LTR_308ALS_ADDRESS
self._gain = gain
if self._chip_id() != 0xB1:
raise AttributeError("Cannot find a LTR_308ALS")
self._Enable() #star
time.sleep(0.2)
self._wreg(LTR_308ALS_REG_GAIN,_GAINS[self._gain])
#Write memory address
def _wreg(self, reg, val):
self._device.writeto_mem(self._address,reg,val.to_bytes(1, 'little'))
#Read memory address
def _rreg(self, reg,nbytes=1):
return self._device.readfrom_mem(self._address, reg, nbytes)[0] if nbytes<=1 else self._device.readfrom_mem(self._address, reg, nbytes)[0:nbytes]
def _chip_id(self):
return self._rreg(LTR_308ALS_REG_DEVICE_ID)
def _Enable(self):
self._wreg(LTR_308ALS_REG_CTRL,LTR_308ALS_CMD_ALS_Enable)
def getdata(self):
buffer=self._rreg(LTR_308ALS_REG_DATA,3)
als_data= buffer[2]<<16 | buffer[1]<<8| buffer[0]
als_lux=float(0.6*als_data/_GAINS_X[self._gain])
return als_lux

View File

@@ -0,0 +1,78 @@
"""
LTR-381RGB-XX
MicroPython library for the LTR-381RGB-XX (Color sensor)
=======================================================
#Preliminary composition 20230417
@dahanzimin From the Mixly Team
"""
import time
from micropython import const
LTR_MAIN_CTRL = const(0x00)
LTR_ALS_CS_MEAS_RATE = const(0x04)
LTR_ALS_CS_GAIN = const(0x05)
LTR_PART_ID = const(0x06)
LTR_MAIN_STATUS = const(0x07)
LTR_CS_DATA = const(0x0A)
#1x 3x 6x 9x 18x
_GAINS_X = (1, 3, 6, 9, 18)
class LTR_381RGB:
def __init__(self, i2c_bus, addr=0x53, gain=1):
self._device = i2c_bus
self._address = addr
self._gain = gain
self._color = [0, 0, 0]
self._ir = 0
self._als = 0
if (self._chip_id() & 0xF0) != 0xC0:
raise AttributeError("Cannot find a LTR-381RGB")
self._configure()
time.sleep(0.1)
def _wreg(self, reg, val):
'''Write memory address'''
self._device.writeto_mem(self._address,reg,val.to_bytes(1, 'little'))
def _rreg(self, reg, nbytes=1):
'''Read memory address'''
return self._device.readfrom_mem(self._address, reg, nbytes)[0] if nbytes<=1 else self._device.readfrom_mem(self._address, reg, nbytes)[0:nbytes]
def _chip_id(self):
'''Proofreading device ID'''
return self._rreg(LTR_PART_ID)
def _configure(self):
'''Configuration Register'''
self._wreg(LTR_MAIN_CTRL, 0x06) #CS mode & ALS/CS Enable
self._wreg(LTR_ALS_CS_MEAS_RATE, 0x22) #Resolution = 18 bit, Meas Rate =100ms
self._wreg(LTR_ALS_CS_GAIN, self._gain & 0x07) #CS measurement Gain Range
def status(self):
'''Data conversion status'''
return self._rreg(LTR_MAIN_STATUS) & 0x08
def getdata(self):
'''Processing data acquisition'''
if self.status():
_buf=self._rreg(LTR_CS_DATA, 12)
self._ir = _buf[2] << 16 | _buf[1] << 8 | _buf[0]
self._color [1] = _buf[5] << 16 | _buf[4] << 8 | _buf[3]
self._color [0] = _buf[8] << 16 | _buf[7] << 8 | _buf[6]
self._color [2] = _buf[11] << 16 | _buf[10] << 8 | _buf[9]
self._als = 0.8 * self._color [1] * (1 - 0.033 * self._ir / self._color [1]) / _GAINS_X[self._gain]
return round(self._als, 2), self._ir, self._color
def color(self):
return self.getdata[2]
def ir(self):
return self.getdata[1]
def als(self):
return self.getdata[0]

View File

@@ -0,0 +1,75 @@
"""
LTR-390UV
Micropython library for the LTR-390UV(ALS+UV)
=======================================================
#Preliminary composition 20240120
@dahanzimin From the Mixly Team
"""
import time
from micropython import const
_LTR390_ADDRESS = const(0x53)
_LTR390_REG_CTRL = const(0x00)
_LTR390_REG_MEAS = const(0x04)
_LTR390_REG_GAIN = const(0x05)
_LTR390_REG_ID = const(0x06)
_LTR390_REG_ALS = const(0x0D)
_LTR390_REG_UVS = const(0x10)
_RATE_DEFAULT = const(0x02) #100ms
_RESOLUTION_20BIT = (0<<4, 4)
_RESOLUTION_19BIT = (1<<4, 2)
_RESOLUTION_18BIT = (2<<4, 1)
_RESOLUTION_17BIT = (3<<4, 0.5)
_RESOLUTION_16BIT = (4<<4, 0.25)
_RESOLUTION_13BIT = (5<<4, 0.125)
_GAIN_X1 = (0, 1)
_GAIN_X3 = (1, 3)
_GAIN_X6 = (2, 6)
_GAIN_X9 = (3, 9)
_GAIN_X18 = (4, 18)
class ALS_UVS:
def __init__(self, i2c_bus, addr=_LTR390_ADDRESS, gain=_GAIN_X1, resolution=_RESOLUTION_17BIT):
self._device = i2c_bus
self._address = addr
self._gain = gain
self._reso = resolution
self._flaga = False
self._flagu = False
if self._rreg(_LTR390_REG_ID) != 0xB2:
raise AttributeError("Cannot find a LTR-390UV")
self._wreg(_LTR390_REG_MEAS, self._reso[0] | _RATE_DEFAULT)
self._wreg(_LTR390_REG_GAIN, self._gain[0])
def _wreg(self, reg, val):
'''Write memory address'''
self._device.writeto_mem(self._address,reg,val.to_bytes(1, 'little'))
def _rreg(self, reg, nbytes=1):
'''Read memory address'''
return self._device.readfrom_mem(self._address, reg, nbytes)[0] if nbytes<=1 else self._device.readfrom_mem(self._address, reg, nbytes)[0:nbytes]
def ultraviolet(self):
if not self._flagu:
self._wreg(_LTR390_REG_CTRL, 0x0A) #UVS in Active Mode
time.sleep_ms(int(self._reso[1] * 100))
self._flagu = True
self._flaga = False
buf = self._rreg(_LTR390_REG_UVS, 3)
return buf[2] << 16 | buf[1] << 8 | buf[0]
def ambient_light(self):
if not self._flaga:
self._wreg(_LTR390_REG_CTRL, 0x02) #ALS in Active Mode
time.sleep_ms(int(self._reso[1] * 100))
self._flaga = True
self._flagu = False
buf = self._rreg(_LTR390_REG_ALS, 3)
return 0.6 * (buf[2] << 16 | buf[1] << 8 | buf[0]) / (self._gain[1] * self._reso[1])

View File

@@ -0,0 +1,106 @@
"""
LTR-553ALS-XX
MicroPython library for the LTR-553ALS-XX(ALS,PS)
=======================================================
#Preliminary composition 20220224
#Format unified 20220623
dahanzimin From the Mixly Team
"""
import time
from micropython import const
LTR_553ALS_ADDRESS = const(0x23)
LTR_ALS_REG_CONTR = const(0x80)
LTR_PS_REG_CONTR = const(0x81)
LTR_PS_REG_LED = const(0x82)
LTR_PS_REG_PULSES = const(0x83)
LTR_PS_REG_RATE = const(0x84)
LTR_ALS_REG_RATE = const(0x85)
LTR_553ALS_REG_ID = const(0x87)
LTR_ALS_REG_DATA1 = const(0x88)
LTR_553ALS_REG_ATATUS = const(0x8C)
LTR_PS_REG_DATA1 = const(0x8D)
_ALS_GAIN={
"X1":(1,0x01), # For Gain X1
"X2":(2,0x05), # For Gain X2
"X4":(4,0x09), # For Gain X4
"X8":(8,0x0D), # For Gain X8
"X48":(48,0x19), # For Gain X48
"X96":(96,0x1D), # For Gain X96
}
class LTR_553ALS:
def __init__(self, i2c_bus,addr=LTR_553ALS_ADDRESS,ALS_Gain="X1"):
self._device = i2c_bus
self._address = addr
self.ALS_IR = 0
self.ALS_VIS = 0
self.PS = 0
self.ALS_gain = ALS_Gain
if self._chip_id() != 0x05:
raise AttributeError("Cannot find a LTR_553ALS")
self._configure()
#time.sleep(0.1)
def _wreg(self, reg, val):
'''Write memory address'''
self._device.writeto_mem(self._address,reg,val.to_bytes(1, 'little'))
def _rreg(self, reg,nbytes=1):
'''Read memory address'''
return self._device.readfrom_mem(self._address, reg, nbytes)[0] if nbytes<=1 else self._device.readfrom_mem(self._address, reg, nbytes)[0:nbytes]
def _chip_id(self):
'''校对设备ID'''
return self._rreg(LTR_553ALS_REG_ID)
def _configure(self):
'''配置寄存器'''
self._wreg(LTR_ALS_REG_CONTR,_ALS_GAIN[self.ALS_gain][1]) # ALS_CONTR: Active mode
self._wreg(LTR_PS_REG_CONTR,0x03) # PS_CONTR: Active mode
self._wreg(LTR_PS_REG_LED,0x5B) #PS_LED: LED_pulse_period=50khz,DUTY = 100%,LED_pulsed_current_level = 50mA
self._wreg(LTR_PS_REG_PULSES,0x0A) #PS_N_Pulses: Number_of_pulses = 10
self._wreg(LTR_PS_REG_RATE,0x08) #PS_Measurement_Rate=10ms
self._wreg(LTR_ALS_REG_RATE,0x12) #ALS_Measurement_Rate=200ms,ALS_integration_time=200ms
def _status(self):
'''数据转换状态'''
status=self._rreg(LTR_553ALS_REG_ATATUS)
return status&0x84, status&0x01 #ALS,PS status
@property
def getdata(self):
'''处理获取数据'''
if self._status()[0]:
data_als=self._rreg(LTR_ALS_REG_DATA1,4)
als_ch1=data_als[0] | data_als[1]<<8
als_ch0=data_als[2] | data_als[3]<<8
ratio=als_ch1/(als_ch1+als_ch0) if (als_ch1+als_ch0)>0 else 0
self.ALS_IR =als_ch1*ratio/_ALS_GAIN[self.ALS_gain][0]
self.ALS_VIS=als_ch0*ratio/_ALS_GAIN[self.ALS_gain][0]
if self._status()[1]:
data_ps=self._rreg(LTR_PS_REG_DATA1,2)
self.PS =data_ps[0] | data_ps[1]<<8
return round(self.ALS_VIS,2),round(self.ALS_IR,2),self.PS
def als_vis(self):
'''可见光Lux'''
return self.getdata[0]
def als_ir(self):
'''红外Lux'''
return self.getdata[1]
def ps_nl(self):
'''接近距离'''
return self.getdata[2]

Some files were not shown because too many files have changed in this diff Show More