docs: 同步日常维护指南并补齐遗漏的板卡配置

This commit is contained in:
yczpf2019
2026-01-24 16:42:42 +08:00
parent a6cdad4b21
commit f166758ec5
373 changed files with 86311 additions and 1 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;

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,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,252 @@
import * as Blockly from 'blockly/core';
import { Variables } from '../../python/export';
const AI_CLOUD_VOICE_HUE = '#88ada6';
export const init_xunfei_vi = {
init: function () {
this.setColour(AI_CLOUD_VOICE_HUE);
this.appendValueInput('VAR')
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SETUP + Blockly.Msg.MIXLY_AS + Blockly.Msg.MIXLY_XUFEI + Blockly.Msg.MIXLY_AipSpeech_asr );
this.appendValueInput('APPID')
.setCheck(String)
.appendField('APPID');
this.appendValueInput('APISecret')
.setCheck(String)
.appendField('APISecret');
this.appendValueInput('APIKey')
.setCheck(String)
.appendField('APIKey');
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const init_xunfei_Spark_Ultra = {
init: function () {
this.setColour(AI_CLOUD_VOICE_HUE);
this.appendValueInput('VAR')
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SETUP + Blockly.Msg.MIXLY_AS + Blockly.Msg.MIXLY_XUFEI +Blockly.Msg.MIXLY_LARGE_LANGUAGE_MODEL );
this.appendValueInput('APPID')
.setCheck(String)
.appendField('APPID');
this.appendValueInput('APISecret')
.setCheck(String)
.appendField('APISecret');
this.appendValueInput('APIKey')
.setCheck(String)
.appendField('APIKey');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SELECT_MODEL)
.appendField(new Blockly.FieldDropdown([
["Spark-X1-32K","Spark X1-32K"],
["Spark-Lite","Spark Lite"],
["Spark-Pro","Spark Pro"],
["Spark-Pro-128K","Spark Pro-128K"],
["Spark-Max, " + Blockly.Msg.MIXLY_SUPPORT + Blockly.Msg.MIXLY_DIALOGUE_BACKGROUND + "、" + Blockly.Msg.MIXLY_ESP32_ONENET_SUB, "Spark Max"],
["Spark-Max-32K, "+ Blockly.Msg.MIXLY_SUPPORT + Blockly.Msg.MIXLY_DIALOGUE_BACKGROUND + "、" + Blockly.Msg.MIXLY_ESP32_ONENET_SUB, "Spark Max-32K"],
["Spark-Ultra-32K, "+ Blockly.Msg.MIXLY_SUPPORT + Blockly.Msg.MIXLY_DIALOGUE_BACKGROUND + "、" + Blockly.Msg.MIXLY_ESP32_ONENET_SUB, "Spark Ultra-32K"],
[Blockly.Msg.MIXLY_KJWX, "Spark kjwx"],
[Blockly.Msg.MIXLY_CUSTOMIZE_MODEL + "," + Blockly.Msg.MIXLY_SUPPORT + Blockly.Msg.MIXLY_ESP32_ONENET_SUB, "Spark Customize"]
]),"model");
this.appendValueInput('DBG')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_DIALOGUE_BACKGROUND);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const init_xunfei_Chinese_Model = {
init: function () {
this.setColour(AI_CLOUD_VOICE_HUE);
this.appendValueInput('VAR')
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_MAKE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SETUP + Blockly.Msg.MIXLY_AS + Blockly.Msg.MIXLY_XUFEI+Blockly.Msg.MIXLY_CHINESE_RECOGNIZION+Blockly.Msg.MIXLY_LARGE_LANGUAGE_MODEL );
this.appendValueInput('APPID')
.setCheck(String)
.appendField('APPID');
this.appendValueInput('APISecret')
.setCheck(String)
.appendField('APISecret');
this.appendValueInput('APIKey')
.setCheck(String)
.appendField('APIKey');
this.appendValueInput('HW')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_HOT_WORD + 'ID');
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const xunfei_vi_run = {
init: function () {
this.setColour(AI_CLOUD_VOICE_HUE);
this.appendValueInput('VAR')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_RUN + Blockly.Msg.MIXLY_AipSpeech_asr);
this.appendValueInput('time')
.setCheck(Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXPY_AI_AUDIO_TIME);
this.setInputsInline(true);
this.setOutput(true);
this.setTooltip(Blockly.Msg.init_xunfei_vi_op_tooltip);
}
};
export const xunfei_Spark_Ultra_run = {
init: function () {
this.setColour(AI_CLOUD_VOICE_HUE);
this.appendValueInput('VAR')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_RUN + Blockly.Msg.MIXLY_LARGE_LANGUAGE_MODEL);
this.appendValueInput('qus')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_SEND);
this.setInputsInline(true);
this.setOutput(true);
this.setTooltip(Blockly.Msg.init_xunfei_vi_run_tooltip);
}
};
export const init_xunfei_Spark_Ultra_clr_his = {
init: function () {
this.setColour(AI_CLOUD_VOICE_HUE);
this.appendValueInput('VAR')
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_RUN + Blockly.Msg.MIXLY_LARGE_LANGUAGE_MODEL + Blockly.Msg.MIXLY_EMPTY_HISTORY);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const llm_set_callback = {
init: function () {
this.setColour(AI_CLOUD_VOICE_HUE);
this.appendValueInput('VAR1')
this.appendValueInput('callback')
.appendField(Blockly.Msg.MIXLY_PYTHON_CONTROLS_THREAD_USE)
this.appendValueInput('VAR2')
.appendField(Blockly.Msg.MIXLY_FUNCTION_NAME);
this.appendValueInput('VAR3')
.appendField(Blockly.Msg.MIXLY_FUNCTION_DESCRIPTION)
this.itemCount_ = 2;
this.updateShape_();
this.setMutator(new Blockly.icons.MutatorIcon(['llm_set_callback_item'], this));
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.llm_set_callback_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('llm_set_callback_container');
containerBlock.initSvg();
var connection = containerBlock.getInput('STACK').connection;
for (var i = 0; i < this.itemCount_; i++) {
var itemBlock = workspace.newBlock('llm_set_callback_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');
}
if (this.getInput('PARAMS_LABEL')) {
this.removeInput('PARAMS_LABEL');
}
var i = 0;
while (this.getInput('ADD' + i)) {
this.removeInput('ADD' + i);
i++;
}
// Rebuild block.
if (this.itemCount_ == 0) {
} else {
this.appendDummyInput('PARAMS_LABEL')
.appendField(Blockly.Msg.MIXLY_PARAMS + Blockly.Msg.OLED_STRING);
for (var i = 0; i < this.itemCount_; i++) {
var input = this.appendValueInput('ADD' + i);
}
}
}
};
export const llm_set_callback_container = {
init: function () {
this.setColour(AI_CLOUD_VOICE_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_SETTING + Blockly.Msg.MIXLY_PARAMS);
this.appendStatementInput('STACK');
this.contextMenu = false;
}
};
export const llm_set_callback_item = {
init: function () {
this.setColour(AI_CLOUD_VOICE_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.contextMenu = false;
}
};

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,749 @@
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)
.setAlign(Blockly.inputs.Align.RIGHT);
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(false);
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)
.setAlign(Blockly.inputs.Align.RIGHT);
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(false);
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)
.setAlign(Blockly.inputs.Align.RIGHT);
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(false);
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,395 @@
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
});
}
};
//educore car
export const educore_car = {
init: function () {
this.setColour(MEGO_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_CAR);
this.setOutput(true);
this.setInputsInline(true);
}
}
export const educore_car_stepper_keep = {
init: function () {
this.setColour(MEGO_HUE);
this.appendValueInput('car');
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.blockpy_forward, "forward"],
// [Blockly.Msg.blockpy_backward, "B"],
[Blockly.Msg.blockpy_left, "turn_left"],
[Blockly.Msg.blockpy_right, "turn_right"]
]), "VAR");
this.appendValueInput('speed')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_SETTING + Blockly.Msg.MIXLY_SPEED);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
}
export const educore_car_stepper_stop = {
init: function () {
this.setColour(MEGO_HUE);
this.appendValueInput('car');
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MOTOR_P, "stop"]
// [Blockly.Msg.MOTOR_N, "N"]
]), "VAR");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
}
}
export const educore_car_pin_near_line = {
init: function () {
this.setColour(MEGO_HUE);
this.appendValueInput('car');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.TEXT_TRIM_LEFT, "1"],
// [Blockly.Msg.MIXGO_LEFT_MID, "[1]"],
// [Blockly.Msg.MIXGO_RIGHT_MID, "[2]"],
[Blockly.Msg.TEXT_TRIM_RIGHT, "2"]
// [Blockly.Msg.MIXLY_ALL, ""]
]), "key")
.appendField(Blockly.Msg.MIXGO_LINE_SENSOR_VAL);
this.setOutput(true, Number);
this.setInputsInline(true);
}
};
export const educore_car_pin_near = {
init: function () {
this.setColour(MEGO_HUE);
this.appendValueInput('car');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_PY_STORAGE_GET + Blockly.Msg.MIXGO_PROXIMITY_SENSOR);
this.setOutput(true, Number);
this.setInputsInline(true);
}
};

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,623 @@
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(controls_whileUntil.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];
});
},
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(controls_flow_statements.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);
}
},
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,285 @@
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,362 @@
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,900 @@
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_PUBLISHEX = {
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.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_Service_quality_display)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_AT_MOST_ONCE,"0"],
[Blockly.Msg.MIXLY_AT_LEAST_ONCE,"1"]
]),"quality")
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;
export const iot_connect_ollama = {
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_CONNECT_OLLAMA);
this.appendValueInput('SERVER')
.appendField(Blockly.Msg.MIXLY_EMQX_SERVER)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput('NAME')
.appendField(Blockly.Msg.MODEL_NAME)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput('NUMBER')
.appendField(Blockly.Msg.MIXLY_SET_MAXIMUM_HISTORICAL_SESSIONS_NUM);
this.setInputsInline(false);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const IOT_CONNECT_OLLAMA = iot_connect_ollama;
export const iot_connect_openai = {
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_CONNECT_OPENAI);
this.appendValueInput('SERVER')
.appendField(Blockly.Msg.MIXLY_EMQX_SERVER)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput('KEY')
.appendField(Blockly.Msg.MIXLY_API_PRIVATE_KEY)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput('NAME')
.appendField(Blockly.Msg.MODEL_NAME)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput('NUMBER')
.appendField(Blockly.Msg.MIXLY_SET_MAXIMUM_HISTORICAL_SESSIONS_NUM);
this.setInputsInline(false);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const use_ollama_llm_to_chat = {
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_LLM_CHAT);
this.appendValueInput('TOPIC')
.appendField(Blockly.Msg.MIXLY_MIXGO_ESPNOW_SEND);
this.appendValueInput('METHOD')
.appendField(Blockly.Msg.MIXLY_LLM_CONTENT_CALLBACK);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const use_ollama_llm_to_chat_return = {
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_LLM_CHAT);
this.appendValueInput('TOPIC')
.appendField(Blockly.Msg.MIXLY_MIXGO_ESPNOW_SEND);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXPY_REQUESTS_GET_RESULT)
this.setInputsInline(true);
this.setOutput(true);
}
};
// export const ollama_set_timeout = {
// init: function () {
// this.setColour(IOT_HUE);
// this.appendValueInput("VAR")
// .appendField('Ollama ' + Blockly.Msg.MIXLY_OLLAMA_SET_TIMEOUT);
// this.setInputsInline(true);
// this.setPreviousStatement(true);
// this.setNextStatement(true);
// }
// }
// export const ollama_set_max_retries = {
// init: function () {
// this.setColour(IOT_HUE);
// this.appendValueInput("VAR")
// .appendField('Ollama ' + Blockly.Msg.MIXLY_OLLAMA_SET_MAX_RETRIES);
// this.setInputsInline(true);
// this.setPreviousStatement(true);
// this.setNextStatement(true);
// }
// }
// export const ollama_set_custom_url = {
// init: function () {
// this.setColour(IOT_HUE);
// this.appendValueInput("TEXT")
// .appendField('Ollama ' + Blockly.Msg.MIXLY_OLLAMA_SET_CUSTOM_URL);
// this.setInputsInline(true);
// this.setPreviousStatement(true);
// this.setNextStatement(true);
// }
// }
// export const ollama_select_model = {
// init: function () {
// this.setColour(IOT_HUE);
// this.appendValueInput("TEXT")
// .appendField('Ollama ' + Blockly.Msg.MIXLY_SELECT_MODEL);
// this.setInputsInline(true);
// this.setPreviousStatement(true);
// this.setNextStatement(true);
// }
// }
// export const ollama_clear_user_history = {
// init: function () {
// this.setColour(IOT_HUE);
// this.appendDummyInput()
// .appendField('Ollama ' + Blockly.Msg.MIXLY_CLEAR_USER_HISTORY);
// this.setInputsInline(true);
// this.setPreviousStatement(true);
// this.setNextStatement(true);
// }
// }
export const ollama_empty_history = {
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField('Ollama ' + Blockly.Msg.MIXLY_EMPTY_HISTORY);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
const TINY_WEB_DB = 0;
export const iot_tiny_web_db_init = {
init: function () {
this.setColour(TINY_WEB_DB);
this.appendDummyInput()
.appendField(`${Blockly.Msg.MIXLY_SETUP} TinyWebDB`);
this.appendValueInput('ADDR')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_EMQX_SERVER);
this.appendValueInput('USERNAME')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_EMQX_USERNAME);
this.appendValueInput('PASSWORD')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_IOT_PASSWORD);
this.setInputsInline(false);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const iot_tiny_web_db_init_with_mqtt = {
init: function () {
this.setColour(TINY_WEB_DB);
this.appendDummyInput()
.appendField(`${Blockly.Msg.MIXLY_SETUP} TinyWebDB`);
this.appendValueInput('MQTT')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(`MixIO ${Blockly.Msg.MIXLY_Client}`);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const iot_tiny_web_db_update = {
init: function () {
this.setColour(TINY_WEB_DB);
this.appendDummyInput()
.appendField('TinyWebDB');
this.appendValueInput('TAG')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_TINY_WEB_DB_UPDATE_VARIABLE);
this.appendValueInput('VALUE')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.DICTS_ADD_VALUE);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const iot_tiny_web_db_get = {
init: function () {
this.setColour(TINY_WEB_DB);
this.appendDummyInput()
.appendField('TinyWebDB');
this.appendValueInput('TAG')
.appendField(Blockly.Msg.MIXLY_TINY_WEB_DB_GET_VARIABLE);
this.appendDummyInput()
.appendField(Blockly.Msg.DICTS_ADD_VALUE);
this.setInputsInline(true);
this.setOutput(true);
}
};
export const iot_tiny_web_db_count = {
init: function () {
this.setColour(TINY_WEB_DB);
this.appendDummyInput()
.appendField('TinyWebDB');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_TINY_WEB_DB_GET_VARIABLES_NUM);
this.setInputsInline(true);
this.setOutput(true);
}
};
export const iot_tiny_web_db_search = {
init: function () {
this.setColour(TINY_WEB_DB);
this.appendDummyInput()
.appendField('TinyWebDB')
.appendField(Blockly.Msg.MIXLY_TINY_WEB_DB_SEARCH_VARIABLES);
this.appendValueInput('NO')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_TINY_WEB_DB_START_NUMBER);
this.appendValueInput('COUNT')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_TINY_WEB_DB_VARIABLE_NUMBER);
this.appendValueInput('TAG')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_TINY_WEB_DB_SEARCH_VARS);
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_TINY_WEB_DB_GET_VARIABLES_ALL, 'both'],
[Blockly.Msg.MIXLY_TINY_WEB_DB_GET_VARIABLES_TAG, 'tag'],
[Blockly.Msg.MIXLY_TINY_WEB_DB_GET_VARIABLES_VALUE, 'value']
]), 'DTYPE');
this.setInputsInline(false);
this.setOutput(true);
}
};
export const iot_tiny_web_db_delete = {
init: function () {
this.setColour(TINY_WEB_DB);
this.appendDummyInput()
.appendField('TinyWebDB');
this.appendValueInput('TAG')
.appendField(Blockly.Msg.MIXLY_TINY_WEB_DB_DELETE_VARIABLE);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};

View File

@@ -0,0 +1,696 @@
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 + 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 + Blockly.Msg.MIXLY_HOTSPOT);
this.appendValueInput('essid')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_NAME);
this.appendValueInput('password')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_EMQX_PASSWORD);
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_readline = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.setCheck('var');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_READLINE);
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROPYTHON_SOCKET_READLINE_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')
this.setColour(NETWORK_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_GET)
.appendField(new Blockly.FieldDropdown(requests_attribute.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];
});
},
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']
]
};
export const requests_method = {
init: function () {
this.appendValueInput("VAR")
.appendField(Blockly.Msg.DISPLAY_IMAGE_LET2)
.setCheck(String);
this.setColour(NETWORK_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.blockpy_CONDUCT)
.appendField(new Blockly.FieldDropdown(requests_method.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];
});
},
METHOD: [
['post', 'post'], ['put', 'put'],
['delete', 'delete'], ['head', 'head'],
['option', 'option']
]
};
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);
}
};
const COMMUNICATE_HUE = '#3288dd';
export const requests_get2 = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput("URL")
.appendField(Blockly.Msg.DISPLAY_IMAGE_LET2)
.setCheck(String);
this.appendDummyInput("")
.appendField(Blockly.Msg.blockpy_CONDUCT)
.appendField(new Blockly.FieldDropdown([
["get", "get"],
["head", "head"],
["delete", "delete"]
]), 'TYPE')
.appendField(Blockly.Msg.blockpy_REQUESTS)
.appendField(Blockly.Msg.MIXPY_REQUESTS_GET_RESULT)
this.setInputsInline(true);
this.setOutput(true);
this.setTooltip("");
},
};
export const requests_post = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput("URL")
.appendField(Blockly.Msg.DISPLAY_IMAGE_LET2)
.setCheck(String);
this.appendDummyInput("")
.appendField(Blockly.Msg.blockpy_CONDUCT)
.appendField(new Blockly.FieldDropdown([
["post", "post"],
["put", "put"],
["patch", "patch"]
]), 'TYPE')
.appendField(Blockly.Msg.blockpy_REQUESTS)
this.appendValueInput("data")
.appendField(Blockly.Msg.blockpy_REQUESTS + Blockly.Msg.OLED_STRING)
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXPY_REQUESTS_GET_RESULT)
this.setInputsInline(true);
this.setOutput(true);
this.setTooltip("");
},
};
export const requests_attribute2 = {
init: function () {
this.appendValueInput('VAL')
this.setColour(COMMUNICATE_HUE);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_GET)
.appendField(new Blockly.FieldDropdown(requests_attribute2.ATTR), 'ATTR')
this.setInputsInline(true);
this.setOutput(true, String);
},
ATTR: [
[Blockly.Msg.blockpy_REQUESTS_GET_ATTR_TEXT, 'text'],
[Blockly.Msg.blockpy_REQUESTS_GET_ATTR_JSON, 'json()'],
[Blockly.Msg.blockpy_REQUESTS_GET_ATTR_STATUS_CODE, 'status_code'],
[Blockly.Msg.blockpy_REQUESTS_GET_ATTR_CONTENT, 'content'],
[Blockly.Msg.MIXPY_TEXT_ENCODE, 'encoding']
]
};
//educore_networke
export const educore_wifi_connect = {
init: function () {
this.setColour(COMMUNICATE_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.appendValueInput('TIMEOUT')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_IR_TIMEOUT);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MILLIS)
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_IOT_WIFI_CONNECT_TOOLTIP);
}
};
export const educore_mqtt_connect = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_IOT_EMQX_CONNECT_TOOLTIP);
this.appendValueInput('SERVER')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_EMQX_SERVER)
.setAlign(Blockly.inputs.Align.RIGHT)
this.appendValueInput('PORT')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_EMQX_PORT)
.setAlign(Blockly.inputs.Align.RIGHT)
this.appendValueInput('CLIENT_ID')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_EMQX_CLIENT_ID)
.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.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const educore_mqtt_subscribe_message = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('TOPIC')
.appendField(Blockly.Msg.MIXLY_EMQX_SUBSCRIBE + Blockly.Msg.MIXLY_MICROBIT_MSG)
.appendField(Blockly.Msg.MIXLY_EMQX_PUBLISH_TOPIC);
this.appendValueInput('MESSAGE')
.appendField(Blockly.Msg.blockpy_set_of);
this.setInputsInline(true);
this.setOutput(true);
}
};
export const educore_mqtt_topic_subscribe = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendDummyInput()
.appendField("mqtt")
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);
}
};
export const educore_mqtt_topic_publish = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendDummyInput()
.appendField("mqtt")
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);
}
};
export const educore_mqtt_connect_success = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendDummyInput()
.appendField("mqtt" + Blockly.Msg.MIXLY_EMQX_IS_CONNECT)
this.setInputsInline(true);
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,156 @@
import * as Blockly from 'blockly/core';
const PEG1_HUE = 100;
export const pe_g1_use_i2c_init = {
init: function () {
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('PE GX');
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
}
};
export const pe_g1_battery_left = {
init: function () {
this.setColour(PEG1_HUE);
this.appendValueInput('SUB')
.appendField('PE GX')
.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 () {
this.setColour(PEG1_HUE);
this.appendValueInput('SUB')
.appendField('PE GX')
.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 () {
this.setColour(PEG1_HUE);
this.appendValueInput('SUB')
.appendField('PE GX')
.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 () {
this.setColour(PEG1_HUE);
this.appendValueInput('SUB')
.appendField('PE GX')
.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 () {
this.setColour(PEG1_HUE);
this.appendValueInput('SUB')
.appendField('PE GX')
.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 () {
this.setColour(PEG1_HUE);
this.appendValueInput('SUB')
.appendField('PE GX')
.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 () {
this.setColour(PEG1_HUE);
this.appendValueInput('SUB')
.appendField('PE GX')
.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,337 @@
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,910 @@
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 () {
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(sensor_dht11.METHOD), "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];
});
},
METHOD: [
[Blockly.Msg.MIXLY_GETTEMPERATUE, 'temperature'],
[Blockly.Msg.MIXLY_GETHUMIDITY, 'relative_humidity'],
[Blockly.Msg.MIXLY_DHT11_T_H, 'tempandhum']
]
};
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,426 @@
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']]), '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']]), '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']]), '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']]), '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']]), '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']]), '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']]), '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']]), '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']]), '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']]), '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,289 @@
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_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 set_system_timer = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendValueInput('VAR')
.appendField("Timer")
.setCheck("var")
.appendField(Blockly.Msg.MIXLY_SETUP);
this.appendValueInput("PIN")
.appendField("ID")
.setCheck(Number);
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_timer_init = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendValueInput('VAR')
.appendField("Timer")
.setCheck("var");
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_RESTART);
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')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_DO)
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SYSTEM_TIMER_TOOLTIP);
}
};
export const system_timer_deinit = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendValueInput('VAR')
.appendField("Timer")
.setCheck("var");
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_STOP);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip('');
}
};
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 system_timer = system_timer_init;
export const timer2 = system_timer_init;
export const time_ticks_diff = system_ticks_diff;
export const base_delay = controls_delay;

View File

@@ -0,0 +1,368 @@
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);
}
};
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"],
[Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_LIFE_SUGGESTION, "Life_suggestion"]
]), "mode");
this.appendValueInput('key')
.appendField(Blockly.Msg.MIXLY_API_PRIVATE_KEY);
this.appendValueInput('addr')
.appendField(Blockly.Msg.MIXLY_GEOGRAPHIC_LOCATION);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const Weather_now_content = {
init: function () {
this.setColour(WEATHER_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_WEATHER_NOW + Blockly.Msg.MIXLY_BELONG);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_PARAMETER_FREE, "none"],
[Blockly.Msg.MIXLY_WEATHER_PHENOMENON, "text"],
[Blockly.Msg.MIXLY_WEATHER_PHENOMENON_CODE, "code"],
[Blockly.Msg.MIXLY_TEMPERATURE + Blockly.Msg.MIXLY_TEMPERATURE_UNIT_, "temperature"],
[Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_WEATHER_NOW_FEEL, "feels_like"],
[Blockly.Msg.MIXLY_Altitude + Blockly.Msg.MIXLY_PRESSURE_UNIT, "pressure"],
[Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_WEATHER_NOW_HUMIDITY, "humidity"],
[Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_WEATHER_NOW_VISIBILITY, "visibility"],
[Blockly.Msg.ForecastFx, "wind_direction"],
[Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_WEATHER_NOW_WIND_DIRECT_DEGREE, "wind_direction_degree"],
[Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_WEATHER_NOW_WIND_SPEED, "wind_speed"],
[Blockly.Msg.MIXLY_WIND_RATING, "wind_scale"],
[Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_WEATHER_NOW_CLOUDS, "clouds"]
]), "content");
this.setInputsInline(true);
this.setOutput(true);
}
};
export const Air_now_content = {
init: function () {
this.setColour(WEATHER_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_AIR_NOW + Blockly.Msg.MIXLY_BELONG);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_PARAMETER_FREE, "none"],
[Blockly.Msg.MIXLY_AIR_NOW_AIRQUAILTY, "api"],
[Blockly.Msg.MIXLY_AIR_NOW_PM25, "pm25"],
[Blockly.Msg.MIXLY_AIR_NOW_PM10, "pm10"],
[Blockly.Msg.MIXLY_AIR_NOW_so2, "so2"],
[Blockly.Msg.MIXLY_AIR_NOW_no2, "no2"],
[Blockly.Msg.MIXLY_AIR_NOW_co, "co"],
[Blockly.Msg.MIXLY_AIR_NOW_o3, "o3"],
[Blockly.Msg.MIXLY_AIR_NOW_pp, "primary_pollutant"],
[Blockly.Msg.MIXLY_AIR_NOW_quailty, "quality"],
[Blockly.Msg.MIXLY_AIR_NOW_last_update, "last_update"]
]), "content");
this.setInputsInline(true);
this.setOutput(true);
}
};
export const Weather_alarm_content = {
init: function () {
this.setColour(WEATHER_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_WEATHER_ALARM + Blockly.Msg.MIXLY_BELONG);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_PARAMETER_FREE, "none"],
[Blockly.Msg.MIXLY_WEATHER_ALARM_TITLE, "title"],
[Blockly.Msg.MIXLY_WEATHER_ALARM_TYPE, "type"],
[Blockly.Msg.MIXLY_WEATHER_ALARM_LEVEL, "level"],
[Blockly.Msg.MIXLY_WEATHER_ALARM_DESCRIPTION, "description"],
[Blockly.Msg.MIXLY_WEATHER_ALARM_PUB_DATE, "pub_date"]
]), "content");
this.setInputsInline(true);
this.setOutput(true);
}
};
export const Life_suggestion_content = {
init: function () {
this.setColour(WEATHER_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_LIFE_SUGGESTION + Blockly.Msg.MIXLY_BELONG);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_PARAMETER_FREE, "none"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_AC, "ac"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_AP, "air_pollution"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_AIRING, "airing"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_ALLERGY, "allergy"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_BEER, "beer"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_BOATING, "boating"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_CAR_WS, "car_washing"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_CHILL, "chill"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_COMFORT, "comfort"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_DATING, "dating"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_DRESSING, "dressing"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_FISHING, "fishing"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_FLU, "flu"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_HAIR_DRESS, "hair_dressing"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_KITEFLYING, "kiteflying"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_MAKEUP, "makeup"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_MOOD, "mood"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_MORNINIG_SPORT, "morning_sport"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_NIGHT_LIFE, "night_life"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_ROAD_CONDI, "road_condition"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_SHOPPING, "shopping"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_SPORT, "sport"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_SUNSCREEN, "sunscreen"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_TRAFFIC, "traffic"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_TRAVEL, "travel"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_UMBRELLA, "umbrella"],
[Blockly.Msg.MIXLY_LIFE_SUGGESTION_UV, "uv"]
]), "content");
this.setInputsInline(true);
this.setOutput(true);
}
};
export const Tide_daily_content = {
init: function () {
this.setColour(WEATHER_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_TIDE_DAILY + Blockly.Msg.MIXLY_BELONG);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_PARAMETER_FREE, "none"],
[Blockly.Msg.MIXLY_GPS_DATE, "date"],
[Blockly.Msg.MIXLY_TIDE_DAILY_HEIGHT, "tide"],
[Blockly.Msg.MIXLY_TIDE_DAILY_0_TIME, "0,time"],
[Blockly.Msg.MIXLY_TIDE_DAILY_0_HEIGHT, "0,height"],
[Blockly.Msg.MIXLY_TIDE_DAILY_1_TIME, "1,time"],
[Blockly.Msg.MIXLY_TIDE_DAILY_1_HEIGHT, "1,height"],
[Blockly.Msg.MIXLY_TIDE_DAILY_2_TIME, "2,time"],
[Blockly.Msg.MIXLY_TIDE_DAILY_2_HEIGHT, "2,height"],
[Blockly.Msg.MIXLY_TIDE_DAILY_3_TIME, "3,time"],
[Blockly.Msg.MIXLY_TIDE_DAILY_3_HEIGHT, "3,height"]
]), "content");
this.setInputsInline(true);
this.setOutput(true);
}
};
export const Location_search_content = {
init: function () {
this.setColour(WEATHER_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_WEB_PLACE + Blockly.Msg.HTML_SEARCH + Blockly.Msg.MIXLY_BELONG);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_PARAMETER_FREE, "none"],
[Blockly.Msg.MIXLY_LOCATION_SEARCH_ID, "id"],
[Blockly.Msg.MIXLY_LOCATION_SEARCH_NAME, "name"],
[Blockly.Msg.MIXLY_LOCATION_SEARCH_COUNTRY, "country"],
[Blockly.Msg.MIXLY_LOCATION_SEARCH_PATH, "path"],
[Blockly.Msg.MIXLY_LOCATION_SEARCH_TIMEZONE, "timezone"],
[Blockly.Msg.MIXLY_LOCATION_SEARCH_TIMEZONE_O, "timezone_offset"]
]), "content");
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_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.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const Weather_daily_content = {
init: function () {
this.setColour(WEATHER_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_WEATHER_DAILY);
this.appendValueInput('day')
.appendField(Blockly.Msg.LISTS_GET_INDEX_FROM_START);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_WEATHER_DAILY_DAY + Blockly.Msg.MIXLY_BELONG);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_PARAMETER_FREE, "none"],
[Blockly.Msg.MIXLY_GPS_DATE, "date"],
[Blockly.Msg.MIXLY_DAYTIME_WEATHER_PHENOMENON, "text_day"],
[Blockly.Msg.MIXLY_DAYTIME_WEATHER_PHENOMENON_CODE, "code_day"],
[Blockly.Msg.MIXLY_EVENING_WEATHER_PHENOMENON, "text_night"],
[Blockly.Msg.MIXLY_EVENING_WEATHER_PHENOMENON_CODE, "code_night"],
[Blockly.Msg.ForecastHigh + Blockly.Msg.MIXLY_TEMPERATURE_UNIT_, "high"],
[Blockly.Msg.ForecastLow + Blockly.Msg.MIXLY_TEMPERATURE_UNIT_, "low"],
[Blockly.Msg.MIXLY_PROBABILITY_OF_PRECIPITATION, "precip"],
[Blockly.Msg.ForecastFx, "wind_direction"],
[Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_WEATHER_NOW_WIND_DIRECT_DEGREE, "wind_direction_degree"],
[Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_WEATHER_NOW_WIND_SPEED, "wind_speed"],
[Blockly.Msg.MIXLY_WIND_RATING, "wind_scale"],
[Blockly.Msg.MIXLY_RAINFALL, "rainfall"],
[Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_WEATHER_NOW_HUMIDITY, "humidity"]
]), "content");
this.setInputsInline(true);
this.setOutput(true);
}
};
export const Air_daily_content = {
init: function () {
this.setColour(WEATHER_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_AIR_DAILY);
this.appendValueInput('day')
.appendField(Blockly.Msg.LISTS_GET_INDEX_FROM_START);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_WEATHER_DAILY_DAY + Blockly.Msg.MIXLY_BELONG);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_PARAMETER_FREE, "none"],
[Blockly.Msg.MIXLY_AIR_NOW_AIRQUAILTY, "api"],
[Blockly.Msg.MIXLY_AIR_NOW_PM25, "pm25"],
[Blockly.Msg.MIXLY_AIR_NOW_PM10, "pm10"],
[Blockly.Msg.MIXLY_AIR_NOW_so2, "so2"],
[Blockly.Msg.MIXLY_AIR_NOW_no2, "no2"],
[Blockly.Msg.MIXLY_AIR_NOW_co, "co"],
[Blockly.Msg.MIXLY_AIR_NOW_o3, "o3"],
[Blockly.Msg.MIXLY_AIR_NOW_quailty, "quality"],
[Blockly.Msg.MIXLY_GPS_DATE, "date"]
]), "content");
this.setInputsInline(true);
this.setOutput(true);
}
};
export const Geo_sun_content = {
init: function () {
this.setColour(WEATHER_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_GEO_SUN);
this.appendValueInput('day')
.appendField(Blockly.Msg.LISTS_GET_INDEX_FROM_START);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_WEATHER_DAILY_DAY + Blockly.Msg.MIXLY_BELONG);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_PARAMETER_FREE, "none"],
[Blockly.Msg.MIXLY_GPS_DATE, "date"],
[Blockly.Msg.MIXLY_SUNRISE_T, "sunrise"],
[Blockly.Msg.MIXLY_SUNSET_T, "sunset"]
]), "content");
this.setInputsInline(true);
this.setOutput(true);
}
};
export const Geo_moon_content = {
init: function () {
this.setColour(WEATHER_HUE);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_GEO_MOON);
this.appendValueInput('day')
.appendField(Blockly.Msg.LISTS_GET_INDEX_FROM_START);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_WEB_DATA_SENIVERSE_GET_WEATHER_DAILY_DAY + Blockly.Msg.MIXLY_BELONG);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.MIXLY_PARAMETER_FREE, "none"],
[Blockly.Msg.MIXLY_GPS_DATE, "date"],
[Blockly.Msg.MIXLT_MOONRISE_T, "rise"],
[Blockly.Msg.MIXLY_MOONSET_T, "set"],
[Blockly.Msg.MIXLY_MOON_FRACTION, "fraction"],
[Blockly.Msg.MIXLY_MOON_PHASE, "phase"],
[Blockly.Msg.MIXLY_MOON_PHASE_NAME, "phase_name"]
]), "content");
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,126 @@
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 MicroPythonAILocalBlocks from './blocks/ai_local';
import * as MicroPythonAICloudBlocks from './blocks/ai_cloud';
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 MicroPythonAILocalGenerators from './generators/ai_local';
import * as MicroPythonAIGenerators from './generators/ai';
import * as MicroPythonAICloudGenerators from './generators/ai_cloud';
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';
import * as MicroPythonZhHans from './language/zh-hans';
import * as MicroPythonZhHant from './language/zh-hant';
import * as MicroPythonEn from './language/en';
import { Python } from './python_generator';
export {
MicroPythonActuatorExternBlocks,
MicroPythonActuatorOnBoardBlocks,
MicroPythonActuatorBlocks,
MicroPythonAISensorBlocks,
MicroPythonAIBlocks,
MicroPythonAILocalBlocks,
MicroPythonAICloudBlocks,
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,
MicroPythonAILocalGenerators,
MicroPythonAICloudGenerators,
MicroPythonBlynkGenerators,
MicroPythonCCG1Generators,
MicroPythonCEGOGenerators,
MicroPythonCommunicateGenerators,
MicroPythonControlGenerators,
MicroPythonDisplayExternGenerators,
MicroPythonDisplayOnBoardGenerators,
MicroPythonDisplayGenerators,
MicroPythonFactoryGenerators,
MicroPythonInputGenerators,
MicroPythonIotGenerators,
MicroPythonNetworkGenerators,
MicroPythonNovaG1Generators,
MicroPythonPeG1Generators,
MicroPythonPinsGenerators,
MicroPythonSensorExternGenerators,
MicroPythonSensorOnBoardGenerators,
MicroPythonSensorGenerators,
MicroPythonSerialGenerators,
MicroPythonSystemGenerators,
MicroPythonWeatherGenerators,
MicroPythonZhHans,
MicroPythonZhHant,
MicroPythonEn,
Python
};

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,713 @@
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_set_music_volume = function (_,generator){
generator.definitions_['import_music'] = 'import music';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var p = generator.valueToCode(this, 'percent', generator.ORDER_ATOMIC);
var code = v+'.set_volume('+p+')\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 backstage_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_thread(" + 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) {
const v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
const dropdown_rgbpin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
const value_ledcount = generator.valueToCode(this, 'LEDCOUNT', generator.ORDER_ATOMIC);
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ws2812_Neopixel'] = 'from ws2812 import NeoPixel';
const code = `${v} = NeoPixel(machine.Pin(${dropdown_rgbpin}), ${value_ledcount})\n`;
return code;
}
export const actuator_neopixel_rgb_all = function (_, generator) {
const v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
const value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
const value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
const value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
const code = `${v}.fill((${value_rvalue}, ${value_gvalue}, ${value_bvalue}))\n`;
return code;
}
export const actuator_neopixel_write = function (_, generator) {
const v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
const code = `${v}.write()\n`;
return code;
}
export const actuator_neopixel_rgb = function (_, generator) {
const v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
const value_led = generator.valueToCode(this, '_LED_', generator.ORDER_ATOMIC);
const value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
const value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
const value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
const code = `${v}[${value_led}] = (${value_rvalue}, ${value_gvalue}, ${value_bvalue})\n`;
return code;
}
export const actuator_neopixel_rgb_show_all_chase = function (_, generator) {
const v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
const value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
const value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
const value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
const number_time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
const code = `${v}.color_chase(${value_rvalue}, ${value_gvalue}, ${value_bvalue}, ${number_time})\n`;
return code;
}
export const actuator_neopixel_rgb_show_all_rainbow = function (_, generator) {
const v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
const number_time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
const code = `${v}.rainbow_cycle(${number_time})\n`;
return code;
}
export const actuator_use_uart_init = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var key2 = this.getFieldValue('key2');
if (key2 == 'SYN6288') {
generator.definitions_['import_syn6288'] = 'import syn6288';
var code = v + '=syn6288.SYN6288(' + key + ')\n';
return code;
} else if (key2 == 'NS9300') {
generator.definitions_['import_ns9300'] = 'import ns9300';
var code = v + '=ns9300.NS9300(' + key + ')\n';
return code;
}
}
export const player_whether_stop = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = v + '.status(' + key + ')';
return [code, generator.ORDER_ATOMIC];
}
export const player_set_play = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = v + '.control(' + key + ')\n';
return code;
}
export const player_set_volume = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var vol = generator.valueToCode(this, 'volume', generator.ORDER_ATOMIC);
var code = v + '.volume(' + vol + ')\n';
return code;
}
export const player_set_mode = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = v + '.mode(' + key + ')\n';
return code;
}
export const player_play_music = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var s = generator.valueToCode(this, 'song', generator.ORDER_ATOMIC);
var code = v + '.' + key + '(' + s + ')\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;
}
//educore
export const PIN_init = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + 'pin'] = 'from ' + version + ' import pin';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'pin(' + dropdown_pin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const pin_led_bright = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var pin = generator.valueToCode(this, 'pin', generator.ORDER_ATOMIC);
generator.definitions_['import_' + version + 'pin'] = 'from ' + version + ' import pin';
var bright = generator.valueToCode(this, 'bright', generator.ORDER_ATOMIC);
var code = pin + ".write_digital(value=" + bright + ")\n";
return code;
}
export const servo_PIN_init = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + 'servo'] = 'from ' + version + ' import servo';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'servo(' + dropdown_pin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const servo_move_angle = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + 'servo'] = 'from ' + version + ' import servo';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var a = generator.valueToCode(this, 'angle', generator.ORDER_ATOMIC);
var code = sub + '.angle(' + a + ')\n';
return code;
}
export const parrot_PIN_init = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + 'parrot'] = 'from ' + version + ' import parrot';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'parrot(' + dropdown_pin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const parrot_move_speed = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + 'parrot'] = 'from ' + version + ' import parrot';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ATOMIC);
var code = sub + '.speed(' + speed + ')\n';
return code;
}

View File

@@ -0,0 +1,837 @@
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 if (version == 'mixgo_soar') {
generator.definitions_['import_mixgo_soar_voice_spk_midi'] = "from mixgo_soar_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_sant') {
generator.definitions_['import_mixgo_sant_onboard_music'] = "from mixgo_sant import onboard_music";
var code = "onboard_music.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 if (version == 'mixgo_soar') {
generator.definitions_['import_mixgo_soar_voice_spk_midi'] = "from mixgo_soar_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 backstage_onboard_music_play_list = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var lst = generator.valueToCode(this, 'LIST', generator.ORDER_ASSIGNMENT);
generator.definitions_['import_' + version + '_onboard_music'] = 'from ' + version + ' import onboard_music';
var code = "onboard_music.play_thread(" + 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);
var bright = generator.valueToCode(this, 'bright', generator.ORDER_ATOMIC);
if (version == 'mixgo'){
if(op == 1){
generator.definitions_['import_' + version + 'led1'] = 'from ' + version + ' import led1';
var code = "led1.setonoff(" + bright + ")\n";
}else if (op == 2){
generator.definitions_['import_' + version + 'led2'] = 'from ' + version + ' import led2';
var code = "led2.setonoff("+ bright + ")\n";
}
}else{
generator.definitions_['import_' + version + '_onboard_led'] = 'from ' + version + ' import onboard_led';
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);
if (version == 'mixgo'){
if(op == 1){
generator.definitions_['import_' + version + 'led1'] = 'from ' + version + ' import led1';
var code = "led1.getbrightness()";
}else if (op == 2){
generator.definitions_['import_' + version + 'led2'] = 'from ' + version + ' import led2';
var code = "led2.getbrightness()";
}
}else{
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);
if (version == 'mixgo'){
if(op == 1){
generator.definitions_['import_' + version + 'led1'] = 'from ' + version + ' import led1';
var code = "led1.getonoff()";
}else if (op == 2){
generator.definitions_['import_' + version + 'led2'] = 'from ' + version + ' import led2';
var code = "led2.getonoff()";
}
}else{
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);
var flag = generator.valueToCode(this, 'bright', generator.ORDER_ATOMIC);
if (version == 'mixgo'){
if(op == 1){
generator.definitions_['import_' + version + 'led1'] = 'from ' + version + ' import led1';
var code = "led1.setbrightness("+ flag + ")\n";
}else if (op == 2){
generator.definitions_['import_' + version + 'led2'] = 'from ' + version + ' import led2';
var code = "led2.setbrightness("+ flag + ")\n";
}
}else{
generator.definitions_['import_' + version + '_onboard_led'] = 'from ' + version + ' import onboard_led';
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) {
const version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_[`import_${version}_onboard_rgb`] = `from ${version} import onboard_rgb`;
const code = 'onboard_rgb.write()\n';
return code;
}
export const actuator_onboard_neopixel_rgb = function (_, generator) {
const version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_[`import_${version}_onboard_rgb`] = `from ${version} import onboard_rgb`;
const value_led = generator.valueToCode(this, '_LED_', generator.ORDER_ATOMIC);
const value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
const value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
const value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
const code = `onboard_rgb[${value_led}] = (${value_rvalue}, ${value_gvalue}, ${value_bvalue})\n`;
return code;
}
export const actuator_onboard_neopixel_rgb_all = function (_, generator) {
const version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_[`import_${version}_onboard_rgb`] = `from ${version} import onboard_rgb`;
const value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
const value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
const value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
const code = `onboard_rgb.fill((${value_rvalue}, ${value_gvalue}, ${value_bvalue}))\n`;
return code;
}
export const actuator_onboard_neopixel_rgb_show_all_chase = function (_, generator) {
const version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_[`import_${version}_onboard_rgb`] = `from ${version} import onboard_rgb`;
const value_rvalue = generator.valueToCode(this, 'RVALUE', generator.ORDER_ATOMIC);
const value_gvalue = generator.valueToCode(this, 'GVALUE', generator.ORDER_ATOMIC);
const value_bvalue = generator.valueToCode(this, 'BVALUE', generator.ORDER_ATOMIC);
const number_time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
const 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) {
const version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_[`import_${version}_onboard_rgb`] = `from ${version} import onboard_rgb`;
const number_time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
const 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 if (version == 'mixgo_soar') {
generator.definitions_['import_mixgo_soar_voice_ob_code'] = "from mixgo_soar_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 if (version == 'mixgo_soar') {
generator.definitions_['import_mixgo_soar_voice_ob_code'] = "from mixgo_soar_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 if (version == 'mixgo_soar') {
generator.definitions_['import_mixgo_soar_voice_ob_code'] = "from mixgo_soar_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 if (version == 'mixgo_soar') {
generator.definitions_['import_mixgo_soar_voice_ob_code'] = "from mixgo_soar_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 if (version == 'mixgo_soar') {
generator.definitions_['import_mixgo_soar_voice_record_audio'] = "from mixgo_soar_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 if (version == 'mixgo_soar') {
generator.definitions_['import_mixgo_soar_voice_play_audio'] = "from mixgo_soar_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 if (version == 'mixgo_soar') {
generator.definitions_['import_mixgo_soar_voice_play_audio_url'] = "from mixgo_soar_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 = Boards.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;
}
export const set_part_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 + ', freq=' + duty + ')\n';
return code;
}
export const analog_keyboard_input = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var sp = generator.valueToCode(this, 'special', generator.ORDER_ATOMIC);
var ge = generator.valueToCode(this, 'general', generator.ORDER_ATOMIC);
var re = this.getFieldValue('release');
generator.definitions_['import_' + version + '_onboard_bot'] = 'from ' + version + ' import onboard_bot';
var code = "onboard_bot.hid_keyboard(" + sp + ", " + ge + ", " + re + ")\n";
return code;
}
export const special_key = function (_, generator) {
var code = this.getFieldValue('op');
return [code, generator.ORDER_ATOMIC];
}
export const general_key = function (_, generator) {
var code = this.getFieldValue('op');
return [code, generator.ORDER_ATOMIC];
}
export const analog_mouse_input = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var x = generator.valueToCode(this, 'x', generator.ORDER_ATOMIC);
var y = generator.valueToCode(this, 'y', generator.ORDER_ATOMIC);
var wheel = generator.valueToCode(this, 'wheel', generator.ORDER_ATOMIC);
var re = this.getFieldValue('release');
generator.definitions_['import_' + version + '_onboard_bot'] = 'from ' + version + ' import onboard_bot';
var code = "onboard_bot.hid_mouse(keys=" + key + ", move=(" + x + ", " + y + "), wheel=" + wheel + ", release=" + re + ")\n";
return code;
}
export const mouse_key = function (_, generator) {
var code = this.getFieldValue('op');
return [code, generator.ORDER_ATOMIC];
}
export const analog_keyboard_str = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
var str = generator.valueToCode(this, 'str', generator.ORDER_ATOMIC);
var t = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
generator.definitions_['import_' + version + '_onboard_bot'] = 'from ' + version + ' import onboard_bot';
var code = "onboard_bot.hid_keyboard_str(" + str + ", delay=" + t + ")\n";
return code;
}
export const general_key_tuple = function (_, generator) {
// Create a list with any number of elements of any type.
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;
}
if (this.itemCount_ != 1) {
var code = '(' + code.join(', ') + ')';
} else {
var code = '(' + code.join(', ') + ',)';
}
return [code, generator.ORDER_ATOMIC];
};
export const analog_ble_keyboard_init = function (_, generator) {
generator.definitions_['import_ble_keyboard'] = 'from ble_hid_keyboard import Keyboard';
var kname = generator.valueToCode(this, 'kname', generator.ORDER_ATOMIC)
var code = 'ble_keyboard=Keyboard(' + kname + ')\n';
return code;
}
export const ble_keyboard_get_mac = function (_, generator) {
generator.definitions_['import_ble_keyboard'] = 'from ble_hid_keyboard import Keyboard';
var code = 'ble_keyboard.mac';
return [code, generator.ORDER_ATOMIC];
}
export const ble_keyboard_connect = function (_, generator) {
generator.definitions_['import_ble_keyboard'] = 'from ble_hid_keyboard import Keyboard';
var code = 'ble_keyboard.is_connected()';
return [code, generator.ORDER_ATOMIC];
}
export const analog_ble_keyboard_input = function (_, generator) {
var sp = generator.valueToCode(this, 'special', generator.ORDER_ATOMIC);
var ge = generator.valueToCode(this, 'general', generator.ORDER_ATOMIC);
var re = this.getFieldValue('release');
generator.definitions_['import_ble_keyboard'] = 'from ble_hid_keyboard import Keyboard';
var code = "ble_keyboard.notify_hid(" + sp + ", " + ge + ", " + re + ")\n";
return code;
}
export const analog_ble_keyboard_str = function (_, generator) {
var str = generator.valueToCode(this, 'str', generator.ORDER_ATOMIC);
var t = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
generator.definitions_['import_ble_keyboard'] = 'from ble_hid_keyboard import Keyboard';
var code = "ble_keyboard.notify_str(" + str + ", delay=" + t + ")\n";
return code;
}
export const analog_ble_keyboard_send_battery = function (_, generator) {
var b = generator.valueToCode(this, 'battery', generator.ORDER_ATOMIC);
generator.definitions_['import_ble_keyboard'] = 'from ble_hid_keyboard import Keyboard';
var code = "ble_keyboard.notify_battery(" + b + ")\n";
return code;
}
export const analog_ble_mouse_init = function (_, generator) {
generator.definitions_['import_ble_mouse'] = 'from ble_hid_mouse import Mouse';
var name = generator.valueToCode(this, 'name', generator.ORDER_ATOMIC)
var code = 'ble_mouse=Mouse(' + name + ')\n';
return code;
}
export const ble_mouse_get_mac = function (_, generator) {
generator.definitions_['import_ble_mouse'] = 'from ble_hid_mouse import Mouse';
var code = 'ble_mouse.mac';
return [code, generator.ORDER_ATOMIC];
}
export const ble_mouse_connect = function (_, generator) {
generator.definitions_['import_ble_mouse'] = 'from ble_hid_mouse import Mouse';
var code = 'ble_mouse.is_connected()';
return [code, generator.ORDER_ATOMIC];
}
export const analog_ble_mouse_input = function (_, generator) {
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var x = generator.valueToCode(this, 'x', generator.ORDER_ATOMIC);
var y = generator.valueToCode(this, 'y', generator.ORDER_ATOMIC);
var wheel = generator.valueToCode(this, 'wheel', generator.ORDER_ATOMIC);
var re = this.getFieldValue('release');
generator.definitions_['import_ble_mouse'] = 'from ble_hid_mouse import Mouse';
var code = "ble_mouse.notify_hid(" + key + ", (" + x + ", " + y + "), " + wheel + ", " + re + ")\n";
return code;
}
export const analog_ble_mouse_send_battery = function (_, generator) {
var b = generator.valueToCode(this, 'battery', generator.ORDER_ATOMIC);
generator.definitions_['import_ble_mouse'] = 'from ble_hid_mouse import Mouse';
var code = "ble_mouse.notify_battery(" + b + ")\n";
return code;
}
export const analog_ble_keyboard_mouse_init = function (_, generator) {
generator.definitions_['import_HID_ble_hid'] = 'from ble_hid import HID';
var kname = generator.valueToCode(this, 'kname', generator.ORDER_ATOMIC)
var code = 'ble_hid = HID(' + kname + ')\n';
return code;
}
export const ble_keyboard_mouse_get_mac = function (_, generator) {
generator.definitions_['import_HID_ble_hid'] = 'from ble_hid import HID';
var code = 'ble_hid.mac';
return [code, generator.ORDER_ATOMIC];
}
export const ble_keyboard_mouse_connect = function (_, generator) {
generator.definitions_['import_HID_ble_hid'] = 'from ble_hid import HID';
var code = 'ble_hid.is_connected()';
return [code, generator.ORDER_ATOMIC];
}
export const analog_ble_keyboard_mouse_send_battery = function (_, generator) {
var b = generator.valueToCode(this, 'battery', generator.ORDER_ATOMIC);
generator.definitions_['import_HID_ble_hid'] = 'from ble_hid import HID';
var code = "ble_hid.battery_notify(" + b + ")\n";
return code;
}
export const analog_ble_keyboard_mouse_input = function (_, generator) {
var sp = generator.valueToCode(this, 'special', generator.ORDER_ATOMIC);
var ge = generator.valueToCode(this, 'general', generator.ORDER_ATOMIC);
var re = this.getFieldValue('release');
generator.definitions_['import_HID_ble_hid'] = 'from ble_hid import HID';
var code = "ble_hid.keyboard_notify(" + sp + ", " + ge + ", " + re + ")\n";
return code;
}
export const analog_ble_keyboard_mouse_str = function (_, generator) {
var str = generator.valueToCode(this, 'str', generator.ORDER_ATOMIC);
var t = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
generator.definitions_['import_HID_ble_hid'] = 'from ble_hid import HID';
var code = "ble_hid.keyboard_str(" + str + ", delay=" + t + ")\n";
return code;
}
export const analog_ble_mouse_keyboard_input = function (_, generator) {
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var x = generator.valueToCode(this, 'x', generator.ORDER_ATOMIC);
var y = generator.valueToCode(this, 'y', generator.ORDER_ATOMIC);
var wheel = generator.valueToCode(this, 'wheel', generator.ORDER_ATOMIC);
var re = this.getFieldValue('release');
generator.definitions_['import_HID_ble_hid'] = 'from ble_hid import HID';
var code = "ble_hid.mouse_notify(" + key + ", (" + x + ", " + y + ") ," + wheel + ", " + re + ")\n";
return code;
}
//educore actuator
export const educore_buzzer = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_speaker'] = 'from ' + version + ' import spesker';
var code = "speaker()";
return [code, generator.ORDER_ATOMIC];
}
export const educore_buzzer_play_tone = function (block, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_speaker'] = 'from ' + version + ' import spesker';
var bu = generator.valueToCode(this, 'buzzer', generator.ORDER_ATOMIC);
var number_pitch = generator.valueToCode(block, 'pitch', generator.ORDER_ATOMIC);
var code = bu+'.tone(freq=[' + number_pitch + '])\n';
return code;
}
export const educore_buzzer_play_tone_time = function (block, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_speaker'] = 'from ' + version + ' import spesker';
var bu = generator.valueToCode(this, 'buzzer', 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 = bu+'.tone(freq=' + number_pitch + ', dur=' + number_time + ')\n';
return code;
}
export const educore_buzzer_stop = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_speaker'] = 'from ' + version + ' import spesker';
var bu = generator.valueToCode(this, 'buzzer', generator.ORDER_ATOMIC);
var code = bu+'.stop()\n';
return code;
}
export const educore_rgb_light = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + 'rgb'] = 'from ' + version + ' import rgb';
var code = "rgb()";
return [code, generator.ORDER_ATOMIC];
}
export const educore_neopixel_rgb = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + 'rgb'] = 'from ' + version + ' import rgb';
var rgb = generator.valueToCode(this, 'rgb', 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 = rgb+'.write(index[' + value_led + '], r=int(' + value_rvalue + '), g=int(' + value_gvalue + '), b=int(' + value_bvalue + '))\n';
return code;
}
export const educore_neopixel_clear = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + 'rgb'] = 'from ' + version + ' import rgb';
var rgb = generator.valueToCode(this, 'rgb', generator.ORDER_ATOMIC);
var code = rgb+'.clear()\n';
return code;
}
export const educore_ble_sensor_init = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_hid'] = 'from ' + version + ' import hid';
var n = generator.valueToCode(this, 'name', generator.ORDER_ATOMIC);
var code = 'hid.(name='+ n +')';
return [code, generator.ORDER_ATOMIC];
}
export const educore_ble_sensor_connected = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_hid'] = 'from ' + version + ' import hid';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = sub+'.isconnected()';
return [code, generator.ORDER_ATOMIC];
}
export const educore_ble_keyboard_input = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_keycode'] = 'from ' + version + ' import keycode';
var ge = generator.valueToCode(this, 'general', generator.ORDER_ATOMIC);
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = sub+".keyboard_send("+ ge + ")\n";
return code;
}
export const get_keyboard_light = function (_,generator){
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_bot'] = 'from ' + version + ' import onboard_bot';
var key = this.getFieldValue('key');
var code = "onboard_bot.hid_keyboard_state()["+ key +']';
return [code,generator.ORDER_ATOMIC]
}
export const set_microphone_amplification = function (_,generator){
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_bot'] = 'from ' + version + ' import onboard_bot';
var t = this.getFieldValue('times');
var code = "onboard_bot.mic_pga("+ t +')\n';
return code;
}
export const record_audio = function (_,generator){
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_bot'] = 'from ' + version + ' import onboard_bot';
var str = generator.valueToCode(this, 'str', generator.ORDER_ATOMIC);
var t = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
var code = 'onboard_bot.pcm_record('+str+','+ t +')\n';
return code;
}
export const set_music_volume = function (_,generator){
var version = Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_onboard_music'] = 'from ' + version + ' import onboard_music';
var p = generator.valueToCode(this, 'percent', generator.ORDER_ATOMIC);
var code = 'onboard_music.set_volume('+p+')\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,79 @@
import { Boards } from 'mixly';
export const init_xunfei_vi = function (_, generator) {
generator.definitions_['import_mini_xunfei'] = "import mini_xunfei";
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var id = generator.valueToCode(this, 'APPID', generator.ORDER_ATOMIC);
var s = generator.valueToCode(this, 'APISecret', generator.ORDER_ATOMIC);
var key = generator.valueToCode(this, 'APIKey', generator.ORDER_ATOMIC);
var code = v + ' = mini_xunfei.ASR_WebSocket(' + id + ',' + key + ',' + s +')\n';
return code;
}
export const init_xunfei_Spark_Ultra = function (_, generator) {
generator.definitions_['import_mini_xunfei'] = "import mini_xunfei";
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var id = generator.valueToCode(this, 'APPID', generator.ORDER_ATOMIC);
var s = generator.valueToCode(this, 'APISecret', generator.ORDER_ATOMIC);
var key = generator.valueToCode(this, 'APIKey', generator.ORDER_ATOMIC);
var m = this.getFieldValue('model');
var code = v + ' = mini_xunfei.LLM_WebSocket(' + id + ',' + key + ',' + s + ',"' + m + '")\n';
return code;
}
export const init_xunfei_Chinese_Model = function (_, generator) {
generator.definitions_['import_mini_xunfei'] = "import mini_xunfei";
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var id = generator.valueToCode(this, 'APPID', generator.ORDER_ATOMIC);
var s = generator.valueToCode(this, 'APISecret', generator.ORDER_ATOMIC);
var key = generator.valueToCode(this, 'APIKey', generator.ORDER_ATOMIC);
var hw = generator.valueToCode(this, 'HW', generator.ORDER_ATOMIC);
var code = v + ' = mini_xunfei.IAT_WebSocket('+id+','+key +','+s+',res_id='+hw+')\n';
return code;
}
export const xunfei_vi_run = function (_, generator) {
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var t = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
var code = v + '.run(' + t +')';
return [code,generator.ORDER_ATOMIC];
}
export const xunfei_Spark_Ultra_run = function (_, generator) {
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var q = generator.valueToCode(this, 'qus', generator.ORDER_ATOMIC);
var code = v + '.run(' + q +')';
return [code,generator.ORDER_ATOMIC];
}
export const init_xunfei_Spark_Ultra_clr_his = function (_, generator) {
var v = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = v + '.empty_history()\n';
return code;
}
export const llm_set_callback = function (_, generator) {
var v1 = generator.valueToCode(this, "VAR1", generator.ORDER_NONE) || "None";
var v2 = generator.valueToCode(this, "VAR2", generator.ORDER_NONE) || "None";
var v3 = generator.valueToCode(this, "VAR3", generator.ORDER_NONE) || "None";
// var a0 = generator.valueToCode(this, "ADD0", generator.ORDER_NONE) || "None";
var callback = generator.variableDB_.getName(
generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None",
Blockly.Procedures.NAME_TYPE
);
var code = new Array(this.itemCount_);
var default_value = "()";
for (var n = 0; n < this.itemCount_; n++) {
code[n] = generator.valueToCode(this, 'ADD' + n, generator.ORDER_NONE) || default_value;
}
if (this.itemCount_ > 1){
var code = v1 +'.function_call(' + callback + ', ' + v2 + ', ' + v3 + ', (' + code.join(', ') +'))\n';
}else if(this.itemCount_ == 1){
var code = v1 +'.function_call(' + callback + ', ' + v2 + ', ' + v3 + ', ' + code.join(', ') +')\n';
}else{
var code = v1 +'.function_call(' + callback + ', ' + v2 + ', ' + v3 +')\n';
}
return code;
}

View File

@@ -0,0 +1,642 @@
import { Boards } from 'mixly';
export const yesorno = function (_, generator) {
var code = this.getFieldValue('state');
return [code, generator.ORDER_ATOMIC];
}
//voice part
export const VOICE_RECOGNITION_CONTROL = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_bot'] = 'from ' + version + ' import onboard_bot';
var control = this.getFieldValue('control');
var code = 'onboard_bot.asr_en(' + control + ')\n';
return code;
}
export const CI130X_OPEN_AND_CLOSE = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
var status = this.getFieldValue('status');
if (version == 'mixgo_mini') {
generator.definitions_['import_mini_gx_ext_asr'] = 'from mini_gx import ext_asr';
var code = 'ext_asr.asr_en(' + status + ')\n';
} else {
generator.definitions_['import_' + version + '_onboard_asr'] = 'from ' + version + ' import onboard_asr';
var code = 'onboard_asr.asr_en(' + status + ')\n';
}
return code;
}
export const CI130X_IDENTIFY_AND_SAVE_SANT = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
if (version == 'mixgo_mini') {
generator.definitions_['import_mini_gx_ext_asr'] = 'from mini_gx import ext_asr';
var code = 'ext_asr.cmd_id()\n';
} else {
generator.definitions_['import_' + version + '_onboard_asr'] = 'from ' + version + ' import onboard_asr';
var code = 'onboard_asr.cmd_id()\n';
}
return code;
}
export const CI130X_GET_WHETHER_IDENTIFY_SANT = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
if (version == 'mixgo_mini') {
generator.definitions_['import_mini_gx_ext_asr'] = 'from mini_gx import ext_asr';
var cmd = this.getFieldValue('cmd');
var code = 'ext_asr.result(' + cmd + ')';
} else {
generator.definitions_['import_' + version + '_onboard_asr'] = 'from ' + version + ' import onboard_asr';
var cmd = this.getFieldValue('cmd');
var code = 'onboard_asr.result(' + cmd + ')';
}
return [code, generator.ORDER_ATOMIC];
}
export const CI130X_GET_THE_RECOGNIZED_CMD_SANT = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
if (version == 'mixgo_mini') {
generator.definitions_['import_mini_gx_ext_asr'] = 'from mini_gx import ext_asr';
var key = this.getFieldValue('key');
if (key == 'status1') {
var code = 'ext_asr.status()[0]';
} else if (key == 'status2') {
var code = 'ext_asr.status()[1]';
} else if (key == 'status3') {
var code = 'ext_asr.asr_en()';
} else {
var code = 'ext_asr.' + key + '()';
}
} else {
generator.definitions_['import_' + version + '_onboard_asr'] = 'from ' + version + ' import onboard_asr';
var key = this.getFieldValue('key');
if (key == 'status1') {
var code = 'onboard_asr.status()[0]';
} else if (key == 'status2') {
var code = 'onboard_asr.status()[1]';
} else if (key == 'status3') {
var code = 'ext_asr.asr_en()';
} else {
var code = 'onboard_asr.' + key + '()';
}
}
return [code, generator.ORDER_ATOMIC];
}
export const CI130X_BROADCAST_SANT = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
if (version == 'mixgo_mini') {
generator.definitions_['import_mini_gx_ext_asr'] = 'from mini_gx import ext_asr';
var num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
var star = this.getFieldValue('star');
var end = this.getFieldValue('end');
var code = 'ext_asr.play(' + star + ', ' + num + ', ' + end + ')\n';
} else {
generator.definitions_['import_' + version + '_onboard_asr'] = 'from ' + version + ' import onboard_asr';
var num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC);
var star = this.getFieldValue('star');
var end = this.getFieldValue('end');
var code = 'onboard_asr.play(' + star + ', ' + num + ', ' + end + ')\n';
}
return code;
}
export const CI130X_SET_SYSTEM_CMD_SANT = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
if (version == 'mixgo_mini') {
generator.definitions_['import_mini_gx_ext_asr'] = 'from mini_gx import ext_asr';
var cmd = this.getFieldValue('cmd');
var code = 'ext_asr.sys_cmd(' + cmd + ')\n';
} else {
generator.definitions_['import_' + version + '_onboard_asr'] = 'from ' + version + ' import onboard_asr';
var cmd = this.getFieldValue('cmd');
var code = 'onboard_asr.sys_cmd(' + cmd + ')\n';
}
return code;
}
export const CI130X_BROADCAST_SYSTEM_TIME = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_asr'] = 'from ' + version + ' import onboard_asr';
var bool = generator.valueToCode(this, 'boolean', generator.ORDER_ATOMIC);
var code = 'onboard_asr.play_time(detail=' + bool + ')\n';
return code;
}
export const CI130X_PLAY_SYSTEM_CMD_SANT = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
if (version == 'mixgo_sant') {
generator.definitions_['import_sant_tts'] = 'import sant_tts';
var text = generator.valueToCode(this, 'text', generator.ORDER_ATOMIC) || '"你们,米思齐"';
var speed = this.getFieldValue('speed') || '3';
var code = 'sant_tts.play(' + text + ', speed=' + speed + ')\n';
} else if (version == 'mixgo_sowl') {
generator.definitions_['import_sant_tts'] = 'import sowl_tts';
var text = generator.valueToCode(this, 'text', generator.ORDER_ATOMIC) || '"你们,米思齐"';
var speed = this.getFieldValue('speed') || '3';
var code = 'sowl_tts.play(' + text + ', speed=' + speed + ')\n';
} else {
generator.definitions_['import_tts'] = 'import tts';
var text = generator.valueToCode(this, 'text', generator.ORDER_ATOMIC) || '"你们,米思齐"';
var speed = this.getFieldValue('speed') || '3';
var code = 'tts.play(' + text + ', speed=' + speed + ')\n';
}
return code;
}
//graph part
export const CREATE_CAMERA = function (_, generator) {
// var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_Camera_FrameSize'] = 'from camera import Camera,FrameSize';
var cmd = this.getFieldValue('cmd');
var hm = generator.valueToCode(this, 'HM', generator.ORDER_ATOMIC);
var vf = generator.valueToCode(this, 'VF', generator.ORDER_ATOMIC);
var code = 'camera = Camera(FrameSize.' + cmd + ',hmirror=' + hm + ',vflip=' + vf + ')\n';
return code;
}
export const SHOOT_AND_SAVE_PICTURE = function (_, generator) {
var direct = generator.valueToCode(this, 'direct', generator.ORDER_ATOMIC);
var code = 'camera.snapshot(' + direct + ')\n';
return code;
}
export const GET_IMAGE_AND_SAVE = function (_, generator) {
generator.definitions_['camera_import_Image'] = 'from camera import Image';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var direct = generator.valueToCode(this, 'direct', generator.ORDER_ATOMIC);
var q = generator.valueToCode(this, 'quality', generator.ORDER_ATOMIC);
var a = this.getFieldValue('angle');
var code = 'Image.save(' + sub + ',path=' + direct + ',quality=' + q + ',rotation=' + a + ')\n';
return code;
}
export const OPEN_IMAGE = function (_, generator) {
generator.definitions_['camera_import_Image'] = 'from camera import Image';
var direct = generator.valueToCode(this, 'direct', generator.ORDER_ATOMIC);
var a = this.getFieldValue('angle');
var w = generator.valueToCode(this, 'w', generator.ORDER_ATOMIC);
var h = generator.valueToCode(this, 'h', generator.ORDER_ATOMIC);
var code = 'Image.open(path=' + direct + ',rotation=' + a + ',scale_width=' + w + ',scale_height=' + h + ')';
return [code, generator.ORDER_ATOMIC];
}
export const GET_IMAGE_FROM_NET = function (_, generator) {
generator.definitions_['camera_import_Image'] = 'from camera import Image';
var direct = generator.valueToCode(this, 'direct', generator.ORDER_ATOMIC);
var a = this.getFieldValue('angle');
var w = generator.valueToCode(this, 'w', generator.ORDER_ATOMIC);
var h = generator.valueToCode(this, 'h', generator.ORDER_ATOMIC);
var code = 'Image.download(url=' + direct + ', rotation=' + a + ', scale_width=' + w + ', scale_height=' + h + ')';
return [code, generator.ORDER_ATOMIC];
}
export const CAMERA_LOOGOUT = function () {
var code = 'camera.deinit()\n';
return code;
}
export const GET_PICTURE_DATA_EXACT = function (_, generator) {
// var kind = this.getFieldValue('kind');
var code = 'camera.capture()';
return [code, generator.ORDER_ATOMIC];
}
export const GET_PICTURE_WIDTH_HEIGHT_DEVICE = function (_, generator) {
var kind = this.getFieldValue('kind');
var code = 'camera.' + kind + '()';
return [code, generator.ORDER_ATOMIC];
}
export const CONVERT_IMAGE_TO_JPG = function (_, generator) {
generator.definitions_['camera_import_Image'] = 'from camera import Image';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var kind = this.getFieldValue('kind');
var q = generator.valueToCode(this, 'quality', generator.ORDER_ATOMIC);
var code = 'Image.convert(' + sub + ', formats=' + kind + ', quality=' + q + ')';
return [code, generator.ORDER_ATOMIC];
}
export const GET_PICTURE_DATA_WHS = function (_, generator) {
generator.definitions_['camera_import_Image'] = 'from camera import Image';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var kind = this.getFieldValue('kind');
var code = sub + '.' + kind;
return [code, generator.ORDER_ATOMIC];
}
export const SCREEN_SHOW_CAM_GRAPH_SHOOT = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var bool = generator.valueToCode(this, 'boolean', generator.ORDER_ATOMIC);
var code = 'onboard_tft.display(' + sub + ', sync=' + bool + ')\n';
return code;
}
export const SCREEN_SHOW_CAM_GRAPH_SHOOT_LOCATION = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var x = generator.valueToCode(this, 'x', generator.ORDER_ATOMIC);
var y = generator.valueToCode(this, 'y', generator.ORDER_ATOMIC);
var bool = generator.valueToCode(this, 'boolean', generator.ORDER_ATOMIC);
var code = 'onboard_tft.display(' + sub + ',x=' + x + ',y=' + y + ', sync=' + bool + ')\n';
return code;
}
export const SCREEN_DISPLAY_IMAGE = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var direct = generator.valueToCode(this, 'direct', generator.ORDER_ATOMIC);
var a = this.getFieldValue('angle');
var bool = generator.valueToCode(this, 'boolean', generator.ORDER_ATOMIC);
var code = 'onboard_tft.display(' + direct + ',rotation=' + a + ',sync=' + bool + ')\n';
return code;
}
export const SCREEN_DISPLAY_IMAGE_LOCATION = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var direct = generator.valueToCode(this, 'direct', generator.ORDER_ATOMIC);
var x = generator.valueToCode(this, 'x', generator.ORDER_ATOMIC);
var y = generator.valueToCode(this, 'y', generator.ORDER_ATOMIC);
var a = this.getFieldValue('angle');
var bool = generator.valueToCode(this, 'boolean', generator.ORDER_ATOMIC);
var code = 'onboard_tft.display(' + direct + ',x=' + x + ',y=' + y + ',rotation=' + a + ',sync=' + bool + ')\n';
return code;
}
export const GET_SCREEN_IMAGE = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft";
var code = 'onboard_tft.screenshot()';
return [code, generator.ORDER_ATOMIC];
}
export const GET_SCREEN_IMAGE_SIZE = 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_ATOMIC);
var y = generator.valueToCode(this, 'y', generator.ORDER_ATOMIC);
var w = generator.valueToCode(this, 'w', generator.ORDER_ATOMIC);
var h = generator.valueToCode(this, 'h', generator.ORDER_ATOMIC);
var code = 'onboard_tft.screenshot(x=' + x + ',y=' + y + ',w=' + w + ',h=' + h + ')';
return [code, generator.ORDER_ATOMIC];
}
export const AI_CAMERA_INIT = function (_, generator) {
generator.definitions_['import_esp_dl'] = 'import esp_dl';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var cmd = this.getFieldValue('kind');
var width = generator.valueToCode(this, 'WIDTH', generator.ORDER_ATOMIC);
var height = generator.valueToCode(this, 'HEIGHT', generator.ORDER_ATOMIC);
var code = sub + ' = esp_dl.' + cmd + '(width=' + width + ', height=' + height + ')\n';
return code;
}
export const MODEL_INIT_WIDTH = function (_, generator) {
var width = this.getFieldValue('width');
var code = width;
return [code, generator.ORDER_ATOMIC];
}
export const MODEL_INIT_HEIGHT = function (_, generator) {
var height = this.getFieldValue('height');
var code = height;
return [code, generator.ORDER_ATOMIC];
}
export const AI_CAMERA_INIT_FACERECOGNIZE = function (_, generator) {
generator.definitions_['import_esp_dl'] = 'import esp_dl';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var path = generator.valueToCode(this, 'PATH', generator.ORDER_ATOMIC);
var width = generator.valueToCode(this, 'WIDTH', generator.ORDER_ATOMIC);
var height = generator.valueToCode(this, 'HEIGHT', generator.ORDER_ATOMIC);
var code = sub + ' = esp_dl.FaceRecognizer(width=' + width + ', height=' + height + ', db_path=' + path + ')\n';
return code;
}
export const MODEL_LOGOUT = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = 'del ' + sub + '\n';
return code;
}
export const MODEL_RUN = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var frame = generator.valueToCode(this, 'FRAME', generator.ORDER_ATOMIC);
var code = sub + '.run(' + frame + '.image)';
return [code, generator.ORDER_ATOMIC];
}
export const MODEL_WHETHER_RUN_SUCCEED = function (_, generator) {
generator.definitions_['import_esp_dl'] = 'import esp_dl'
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = 'esp_dl.analyze(' + sub + ')';
return [code, generator.ORDER_ATOMIC];
}
export const GET_HOW_MUCH_RECOGNITION = function (_, generator) {
generator.definitions_['import_esp_dl'] = 'import esp_dl'
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = 'esp_dl.analyze(' + sub + ',"len")';
return [code, generator.ORDER_ATOMIC];
}
export const GET_NO_RECOGNITION = function (_, generator) {
generator.definitions_['import_esp_dl'] = 'import esp_dl'
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var no = generator.valueToCode(this, 'NO', generator.ORDER_ATOMIC);
var code = 'esp_dl.analyze(' + sub + ',"data",' + no + ')';
return [code, generator.ORDER_ATOMIC];
}
export const GET_NO_XY_RECOGNITION = function (_, generator) {
generator.definitions_['import_esp_dl'] = 'import esp_dl'
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var no = generator.valueToCode(this, 'NO', generator.ORDER_ATOMIC);
var coord = this.getFieldValue('coord');
if (coord == "all") {
var code = 'esp_dl.analyze(' + sub + ',"box",' + no + ')';
} else {
var code = 'esp_dl.analyze(' + sub + ',"box",' + no + ')[' + coord + ']';
}
return [code, generator.ORDER_ATOMIC];
}
export const GET_NO_XY_RECOGNITION_FACE = function (_, generator) {
generator.definitions_['import_esp_dl'] = 'import esp_dl'
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var no = generator.valueToCode(this, 'NO', generator.ORDER_ATOMIC);
var part = this.getFieldValue('part');
if (part == "all") {
var code = 'esp_dl.analyze(' + sub + ',"features",' + no + ')';
} else {
var code = 'esp_dl.analyze(' + sub + ',"features",' + no + ')' + part;
}
return [code, generator.ORDER_ATOMIC];
}
export const GET_NO_CAT_OR_FACE_RECOGNITION = function (_, generator) {
generator.definitions_['import_esp_dl'] = 'import esp_dl'
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var no = generator.valueToCode(this, 'NO', generator.ORDER_ATOMIC);
var code = 'esp_dl.analyze(' + sub + ',"score",' + no + ')';
return [code, generator.ORDER_ATOMIC];
}
export const Register_color_recognition_fixed = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var color = this.getFieldValue('color');
var area = generator.valueToCode(this, 'AREA', generator.ORDER_ATOMIC);
if (color == "red") {
var code = sub + '.register_color((170, 100, 100), (10, 255, 255),"' + color + '", ' + area + ')\n';
} else if (color == "green") {
var code = sub + '.register_color((35, 100, 100), (85, 255, 255),"' + color + '",' + area + ')\n';
} else if (color == "blue") {
var code = sub + '.register_color((100, 100, 100), (130, 255, 255),"' + color + '", ' + area + ')\n';
} else if (color == "yellow") {
var code = sub + '.register_color((20, 100, 100), (35, 255, 255),"' + color + '", ' + area + ')\n';
} else if (color == "cyan") {
var code = sub + '.register_color((85, 100, 100), (100, 255, 255),"' + color + '", ' + area + ')\n';
} else if (color == "purple") {
var code = sub + '.register_color((130, 100, 100), (150, 255, 255),"' + color + '", ' + area + ')\n';
} else if (color == "black") {
var code = sub + '.register_color((0, 0, 0), (180, 255, 50),"' + color + '", ' + area + ')\n';
} else if (color == "white") {
var code = sub + '.register_color((0, 0, 200), (180, 50, 255),"' + color + '", ' + area + ')\n';
}
return code;
}
export const Register_color_recognition = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var min = generator.valueToCode(this, 'MIN', generator.ORDER_ATOMIC);
var max = generator.valueToCode(this, 'MAX', generator.ORDER_ATOMIC);
var color = generator.valueToCode(this, 'COLOR', generator.ORDER_ATOMIC);
var area = generator.valueToCode(this, 'AREA', generator.ORDER_ATOMIC);
var code = sub + '.register_color(' + min + ', ' + max + ', ' + color + ', ' + area + ')\n';
return code;
}
export const REGISTER_NEW_FACE = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var image = generator.valueToCode(this, 'IMAGE', generator.ORDER_ATOMIC);
var name = generator.valueToCode(this, 'NAME', generator.ORDER_ATOMIC);
var code = sub + '.enroll(' + image + '.image, name=' + name + ', validate = 1)';
return [code, generator.ORDER_ATOMIC];
}
export const DELETE_FACE_FROM_DATABASE = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var id = generator.valueToCode(this, 'ID', generator.ORDER_ATOMIC);
var code = sub + '.delete_face(' + id + ')\n';
return code;
}
export const DELETE_FACE_ALL = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = sub + '.clear_face()\n';
return code;
}
export const PRINT_FACE_DATABASE = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = sub + '.print_database()\n';
return code;
}
export const GET_QR_CODE_RECOGNITION_DATA = function (_, generator) {
generator.definitions_['import_esp_dl'] = 'import esp_dl'
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var bool = generator.valueToCode(this, 'boolean', generator.ORDER_ATOMIC);
var code = 'esp_dl.simple_run(' + sub + ', camera, "data", color=0xF800, sync=' + bool + ')';
return [code, generator.ORDER_ATOMIC];
}
export const GET_PICTURE_RECOGNITION_DATA = function (_, generator) {
generator.definitions_['import_esp_dl'] = 'import esp_dl'
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var bool = generator.valueToCode(this, 'boolean', generator.ORDER_ATOMIC);
var code = 'esp_dl.simple_run(' + sub + ', camera, "data", color=0xF800, sync=' + bool + ')';
return [code, generator.ORDER_ATOMIC];
}
export const GET_COLOR_DETECTION_NUM = function (_, generator) {
generator.definitions_['import_esp_dl'] = 'import esp_dl'
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var bool = generator.valueToCode(this, 'boolean', generator.ORDER_ATOMIC);
var code = 'esp_dl.simple_run(' + sub + ', camera, "len", color=0xF800, sync=' + bool + ')';
return [code, generator.ORDER_ATOMIC];
}
// export const GET_COLOR_DETECTION_LOCATION = function (_, generator) {
// var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
// var num = generator.valueToCode(this, 'NO', generator.ORDER_ATOMIC);
// var color = this.getFieldValue('color');
// var code = sub + '.color_detection('+ color +",'pos',"+ num +')';
// return [code, generator.ORDER_ATOMIC];
// }
export const GET_CAT_FACE_DETECTION_NUM = function (_, generator) {
generator.definitions_['import_esp_dl'] = 'import esp_dl'
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var bool = generator.valueToCode(this, 'boolean', generator.ORDER_ATOMIC);
var code = 'esp_dl.simple_run(' + sub + ', camera, "len", color=0xF800, sync=' + bool + ')';
return [code, generator.ORDER_ATOMIC];
}
// export const GET_CAT_FACE_DETECTION_LOCATION = function (_, generator) {
// var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
// var num = generator.valueToCode(this, 'NO', generator.ORDER_ATOMIC);
// var code = sub + ".cat_detection('pos',"+ num +')';
// return [code, generator.ORDER_ATOMIC];
// }
export const GET_HUMAN_DETECTION_NUM = function (_, generator) {
generator.definitions_['import_esp_dl'] = 'import esp_dl'
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var bool = generator.valueToCode(this, 'boolean', generator.ORDER_ATOMIC);
var code = 'esp_dl.simple_run(' + sub + ', camera, "len", color=0xF800, sync=' + bool + ')';
return [code, generator.ORDER_ATOMIC];
}
export const GET_FACE_DETECTION_NUM = function (_, generator) {
generator.definitions_['import_esp_dl'] = 'import esp_dl'
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var bool = generator.valueToCode(this, 'boolean', generator.ORDER_ATOMIC);
var code = 'esp_dl.simple_run(' + sub + ', camera, "len", color=0xF800, sync=' + bool + ')';
return [code, generator.ORDER_ATOMIC];
}
export const GET_FACE_DETECTION_NAME = function (_, generator) {
generator.definitions_['import_esp_dl'] = 'import esp_dl'
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var bool = generator.valueToCode(this, 'boolean', generator.ORDER_ATOMIC);
var code = 'esp_dl.simple_run(' + sub + ', camera, "person", "name", color=0xF800, sync=' + bool + ')';
return [code, generator.ORDER_ATOMIC];
}
// export const GET_FACE_DETECTION_LOCATION = function (_, generator) {
// var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
// var num = generator.valueToCode(this, 'NO', generator.ORDER_ATOMIC);
// var code = sub + ".face_detection('pos',"+ num +')';
// return [code, generator.ORDER_ATOMIC];
// }
// export const GET_FACE_DETECTION_KEYPOINT_LOCATION = function (_, generator) {
// var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
// var num = generator.valueToCode(this, 'NO', generator.ORDER_ATOMIC);
// var kp = this.getFieldValue('kp');
// var code = sub + ".face_detection('keypoint',"+ num +','+ kp +')';
// return [code, generator.ORDER_ATOMIC];
// }
// export const GET_FACE_RECOGNITION_ID = function (_, generator) {
// var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
// var code = sub + ".face_recognition('len')";
// return [code, generator.ORDER_ATOMIC];
// }
// export const GET_FACE_RECOGNITION_ID_LOCATION = function (_, generator) {
// var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
// var num = generator.valueToCode(this, 'NO', generator.ORDER_ATOMIC);
// var code = sub + ".face_recognition('pos',"+ num +')';
// return [code, generator.ORDER_ATOMIC];
// }
// export const GET_FACE_RECOGNITION_ID_KEYPOINT_LOCATION = function (_, generator) {
// var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
// var num = generator.valueToCode(this, 'NO', generator.ORDER_ATOMIC);
// var kp = this.getFieldValue('kp');
// var code = sub + ".face_recognition('keypoint',"+ num +','+ kp +')';
// return [code, generator.ORDER_ATOMIC];
// }
export const GET_NO_FACE_RECOGNITION_INFO = function (_, generator) {
generator.definitions_['import_esp_dl'] = 'import esp_dl';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var num = generator.valueToCode(this, 'NO', generator.ORDER_ATOMIC);
var kind = this.getFieldValue('kind');
var code = "esp_dl.analyze(" + sub + ', "person",' + num + ')["' + kind + '"]';
return [code, generator.ORDER_ATOMIC];
}
// export const PEOPLE_FACE_ENROLL = function (_, generator) {
// var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
// var code = sub + '.face_enroll()';
// return [code, generator.ORDER_ATOMIC];
// }
// export const DELETE_PEOPLE_FACE_ID = function (_, generator) {
// var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
// var id = generator.valueToCode(this, 'ID', generator.ORDER_ATOMIC);
// var code = sub + '.face_delete('+ id +')\n';
// return code;
// }
export const AI_STOP_ACQUISITION = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = sub + '.stop()';
return [code, generator.ORDER_ATOMIC];
}
export const MIXIO_REPORT_IMAGE_DATA = function (_, generator) {
generator.definitions_['import_base64'] = 'import base64';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = 'mixiot.image_base64(' + sub + ')';
return [code, generator.ORDER_ATOMIC];
}
//simplified part
export const CREATE_CAMERA_SIMPLE = function (_, generator) {
generator.definitions_['import_Camera_FrameSize'] = 'from camera import Camera,FrameSize';
var cmd = this.getFieldValue('cmd');
var code = 'camera = Camera(FrameSize.' + cmd + ', hmirror=False,vflip=False)\n';
return code;
}
export const AI_CAMERA_INIT_SIMPLE = function (_, generator) {
generator.definitions_['import_esp_dl'] = 'import esp_dl';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var cmd = this.getFieldValue('kind');
if (cmd == "FaceRecognizer") {
var code = sub + ' = esp_dl.' + cmd + '(width=camera.get_pixel_width(), height=camera.get_pixel_height() , db_path="face.db")\n';
} else {
var code = sub + ' = esp_dl.' + cmd + '(width=camera.get_pixel_width(), height=camera.get_pixel_height())\n';
}
return code;
}
export const Register_color_recognition_fixed_SIMPLE = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var color = this.getFieldValue('color');
if (color == "red") {
var code = sub + '.register_color((170, 100, 100), (10, 255, 255),"' + color + '")\n';
} else if (color == "green") {
var code = sub + '.register_color((35, 100, 100), (85, 255, 255),"' + color + '")\n';
} else if (color == "blue") {
var code = sub + '.register_color((100, 100, 100), (130, 255, 255),"' + color + '")\n';
} else if (color == "yellow") {
var code = sub + '.register_color((20, 100, 100), (35, 255, 255),"' + color + '")\n';
} else if (color == "cyan") {
var code = sub + '.register_color((85, 100, 100), (100, 255, 255),"' + color + '")\n';
} else if (color == "purple") {
var code = sub + '.register_color((130, 100, 100), (150, 255, 255),"' + color + '")\n';
} else if (color == "black") {
var code = sub + '.register_color((0, 0, 0), (180, 255, 50),"' + color + '")\n';
} else if (color == "white") {
var code = sub + '.register_color((0, 0, 200), (180, 50, 255),"' + color + '")\n';
}
return code;
}
export const REGISTER_NEW_FACE_SIMPLE = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var name = generator.valueToCode(this, 'NAME', generator.ORDER_ATOMIC);
var code = sub + '.enroll(camera.capture().image, name=' + name + ', validate = 1)';
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,222 @@
// 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,286 @@
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';
} else if (version == "mixgo_mini") {
generator.definitions_['import_mini_go_car'] = 'from mini_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_mini") {
generator.definitions_['import_mini_go_car'] = 'from mini_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';
} else if (version == "mixgo_mini") {
generator.definitions_['import_mini_go_car'] = 'from mini_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';
} else if (version == "mixgo_mini") {
generator.definitions_['import_mini_go_car'] = 'from mini_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';
} else if (version == "mixgo_mini") {
generator.definitions_['import_mini_go_car'] = 'from mini_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';
} else if (version == "mixgo_mini") {
generator.definitions_['import_mini_go_car'] = 'from mini_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';
} else if (version == "mixgo_mini") {
generator.definitions_['import_mini_go_car'] = 'from mini_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';
} else if (version == "mixgo_mini") {
generator.definitions_['import_mini_go_car'] = 'from mini_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;
} else if (version == "mixgo_mini") {
generator.definitions_['import_mini_go_hall' + dropdown_mode] = 'from mini_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;
} else if (version == "mixgo_mini") {
generator.definitions_['import_mini_go_hall' + dropdown_mode] = 'from mini_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;
} else if (version == "mixgo_mini") {
generator.definitions_['import_mini_go_hall' + dropdown_mode] = 'from mini_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';
} else if (version == "mixgo_mini") {
generator.definitions_['import_mini_go_hall'] = 'from mini_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';
} else if (version == "mixgo_mini") {
generator.definitions_['import_mini_go_hall'] = 'from mini_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';
} else if (version == "mixgo_mini") {
generator.definitions_['import_mini_go_hall'] = 'from mini_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";
} else if (version == "mixgo_mini") {
generator.definitions_['import_mini_onboard_mxc6655xa'] = 'from mini_go 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';
} else if (version == "mixgo_mini") {
generator.definitions_['import_mini_go_hall'] = 'from mini_go import car';
}
var code = 'car.light()' + key + '';
return [code, generator.ORDER_ATOMIC];
}
//educore car
export const educore_car = function (_, generator) {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_car'] = 'from ' + version + ' import car';
var code = 'car()';
return [code, generator.ORDER_ATOMIC];
}
export const educore_car_stepper_keep = function (_, generator) {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_car'] = 'from ' + version + ' import car';
var car = generator.valueToCode(this, 'car', generator.ORDER_ASSIGNMENT);
var v = this.getFieldValue('VAR');
var speed = generator.valueToCode(this, 'speed', generator.ORDER_ASSIGNMENT);
var code = car + '.' + v + '(' + speed + ")\n";
return code;
}
export const educore_car_stepper_stop = function (_, generator) {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_car'] = 'from ' + version + ' import car';
var car = generator.valueToCode(this, 'car', generator.ORDER_ASSIGNMENT);
var v = this.getFieldValue('VAR');
var code = car + '.' + v + "()\n";
return code;
}
export const educore_car_pin_near_line = function (_, generator) {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_car'] = 'from ' + version + ' import car';
var car = generator.valueToCode(this, 'car', generator.ORDER_ASSIGNMENT);
var key = this.getFieldValue('key');
var code = car + '.get_itr_dnum(' + key + ')';
return [code, generator.ORDER_ATOMIC];
}
export const educore_car_pin_near = function (_, generator) {
var version = Mixly.Boards.getSelectedBoardKey().split(':')[2]
generator.definitions_['import_' + version + '_car'] = 'from ' + version + ' import car';
var car = generator.valueToCode(this, 'car', generator.ORDER_ASSIGNMENT);
var code = car + '.get_distance()';
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,613 @@
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 (bit == "RC5"){
var code = "ir_rx = irremote.RC5_RX(" + pin + ", " + sub + ")\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_['var_declare_ESPNow_radio'] = "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_['var_declare_ESPNow_radio'] = "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_['var_declare_ESPNow_radio'] = "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_['var_declare_ESPNow_radio'] = '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_['var_declare_ESPNow_radio'] = '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_['var_declare_ESPNow_radio'] = '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_['var_declare_ESPNow_radio'] = '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:\n'
+ ' ESPNow_radio_recv(mac,ESPNow_radio_msg)\n'
+ ' except:\n'
+ ' 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_['var_declare_ESPNow_radio'] = '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:\n'
+ ' ESPNow_radio_recv(mac,ESPNow_radio_msg)\n'
+ ' except:\n'
+ ' 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_['var_declare_ESPNow_radio'] = '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}\nESPNow_radio.recv_cb("__all__", ESPNow_radio_recv)\n`;
return '';
}
export const espnow_radio_recv_certain_msg_new = function (block, generator) {
generator.definitions_['import_radio'] = 'import radio';
generator.definitions_['var_declare_ESPNow_radio'] = 'ESPNow_radio = radio.ESPNow()';
var doCode = generator.statementToCode(block, 'DO') || generator.PASS;
var message = block.getFieldValue('msg');
generator.definitions_['def_ESPNow_radio_recv_' + message] = 'def ESPNow_radio_recv(mac, ESPNow_radio_msg):\n'
+ `${doCode}\nESPNow_radio.recv_cb("${message}", ESPNow_radio_recv)\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,119 @@
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,496 @@
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,726 @@
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_sant'].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 clk = generator.valueToCode(this, 'CLK', generator.ORDER_ATOMIC);
var dio = generator.valueToCode(this, 'DIO', 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 + '(clk='+ clk +',dio='+ dio +')\n';
} else if (key == 'TM1637') {
generator.definitions_['import_tm1637'] = 'import tm1637';
code = v + ' = tm1637.' + key + '(clk='+ clk +',dio='+ dio +')\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_sant'].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 m = this.getFieldValue("driver");
var version = Boards.getSelectedBoardKey().split(':')[2]
var font = '';
if (['mpython', 'mixgo_pe', 'mixgo_nova'].indexOf(version) >= 0) {
font = '0x700000'
} else if (['mixgo_sant'].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 + ', types=' + m + ')\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;
}

File diff suppressed because it is too large Load Diff

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,366 @@
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_PUBLISHEX = function (_, generator) {
var topic = generator.valueToCode(this, 'TOPIC', generator.ORDER_ATOMIC);
var msg = generator.valueToCode(this, 'MSG', generator.ORDER_ATOMIC);
var q = this.getFieldValue('quality');
generator.definitions_['import_mixiot'] = "import mixiot";
var code = 'mqtt_client.publish(MQTT_USR_PRJ + ' + topic + ', ' + msg + ', qos='+ q +')\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_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(\'https://' + server.substring(1, server.length - 1) + '/mixio-php/sharekey.php?sk=' + share_code + '\')\n' +
'MQTT_USR_PRJ = sk[0]+\'/\'+sk[1]+\'/\'\n';
// 根据server是否包含":"来生成不同的mqtt_client代码
if (server.indexOf(':') !== -1) {
// 包含":"使用server.substring(1, server.indexOf(':'))
code += 'mqtt_client = mixiot.init_MQTT_client(' + server.substring(0, server.indexOf(':')) + server.substring(server.length - 1) + ', sk[0], sk[2]' + ', MQTT_USR_PRJ)\n';
} else {
// 不包含":"使用完整的server去掉首尾的引号
code += 'mqtt_client = mixiot.init_MQTT_client(' + server.substring(0, server.length - 1)+ server.substring(server.length - 1) + ', 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";
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];
}
export const iot_connect_ollama = function (_, generator) {
generator.definitions_['import_ollama'] = "from ollama import Ollama";
var ser = generator.valueToCode(this, 'SERVER', generator.ORDER_ATOMIC);
var name = generator.valueToCode(this, 'NAME', generator.ORDER_ATOMIC);
var num = generator.valueToCode(this, 'NUMBER', generator.ORDER_ATOMIC);
var code = 'llm = Ollama(' + ser + ', ' + name + ', ' + num + ')\n';
return code;
}
export const IOT_CONNECT_OLLAMA = iot_connect_ollama;
export const iot_connect_openai = function (_, generator) {
generator.definitions_['import_openai'] = "from openai import OpenAI";
var ser = generator.valueToCode(this, 'SERVER', generator.ORDER_ATOMIC);
var key = generator.valueToCode(this, 'KEY', generator.ORDER_ATOMIC);
var name = generator.valueToCode(this, 'NAME', generator.ORDER_ATOMIC);
var num = generator.valueToCode(this, 'NUMBER', generator.ORDER_ATOMIC);
var code = `llm = OpenAI(${ser}, ${key}, ${name}, ${num})\n`;
return code;
}
export const use_ollama_llm_to_chat = function (_, generator) {
var topic = generator.valueToCode(this, 'TOPIC', generator.ORDER_ATOMIC);
var method = generator.valueToCode(this, 'METHOD', generator.ORDER_ATOMIC);
var code = 'llm.chat(' + topic + ', ' + method + ')\n';
return code;
}
export const use_ollama_llm_to_chat_return = function (_, generator) {
var topic = generator.valueToCode(this, 'TOPIC', generator.ORDER_ATOMIC);
var code = 'llm.chat(' + topic + ')';
return [code, generator.ORDER_ATOMIC];
}
// export const ollama_set_timeout = function (_,generator) {
// var t = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
// var code = 'llm.set_timeout(' + t + ')\n';
// return code;
// }
// export const ollama_set_max_retries = function (_,generator) {
// var t = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
// var code = 'llm.set_max_retries(' + t + ')\n';
// return code;
// }
// export const ollama_set_custom_url = function (_,generator) {
// var t = generator.valueToCode(this, 'TEXT', generator.ORDER_ATOMIC);
// var code = 'llm.set_custom_url(' + t + ')\n';
// return code;
// }
// export const ollama_select_model = function (_,generator) {
// var t = generator.valueToCode(this, 'TEXT', generator.ORDER_ATOMIC);
// var code = 'llm.select_model(' + t + ')\n';
// return code;
// }
// export const ollama_clear_user_history = function (_,generator) {
// var code = 'llm.clear_user_history()\n';
// return code;
// }
export const ollama_empty_history = function () {
var code = 'llm.empty_history()\n';
return code;
}
export const iot_tiny_web_db_init = function (_,generator) {
generator.definitions_['import_tiny_webdb'] = 'import tiny_webdb';
const addr = generator.valueToCode(this, 'ADDR', generator.ORDER_ATOMIC);
const username = generator.valueToCode(this, 'USERNAME', generator.ORDER_ATOMIC);
const password = generator.valueToCode(this, 'PASSWORD', generator.ORDER_ATOMIC);
const code = `webdb = tiny_webdb.TinyWebDB(${addr}, ${username}, ${password})\n`;
return code;
}
export const iot_tiny_web_db_init_with_mqtt = function (_,generator) {
generator.definitions_['import_tiny_webdb'] = 'import tiny_webdb';
const mqtt = generator.valueToCode(this, 'MQTT', generator.ORDER_ATOMIC);
const code = `webdb = tiny_webdb.TinyWebDB(${mqtt})\n`;
return code;
}
export const iot_tiny_web_db_update = function (_,generator) {
const tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC);
const value = generator.valueToCode(this, 'VALUE', generator.ORDER_ATOMIC);
const code = `webdb.update(${tag}, ${value})\n`;
return code;
}
export const iot_tiny_web_db_get = function (_,generator) {
const tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC);
const code = `webdb.get(${tag})`;
return [code, generator.ORDER_ATOMIC];
}
export const iot_tiny_web_db_count = function (_,generator) {
const code = 'webdb.count()';
return [code, generator.ORDER_ATOMIC];
}
export const iot_tiny_web_db_search = function (_,generator) {
const no = generator.valueToCode(this, 'NO', generator.ORDER_ATOMIC);
const count = generator.valueToCode(this, 'COUNT', generator.ORDER_ATOMIC);
const tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC);
const dtype = this.getFieldValue('DTYPE');
const code = `webdb.search(${no}, ${count}, ${tag}, '${dtype}')`;
return [code, generator.ORDER_ATOMIC];
}
export const iot_tiny_web_db_delete = function (_,generator) {
const tag = generator.valueToCode(this, 'TAG', generator.ORDER_ATOMIC);
const code = `webdb.delete(${tag})\n`;
return code;
}

View File

@@ -0,0 +1,319 @@
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);
var code = varName + '.isconnected()';
return [code, generator.ORDER_ATOMIC];
}
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 pw = generator.valueToCode(this, 'password', generator.ORDER_ATOMIC);
var channel = generator.valueToCode(this, 'channel', generator.ORDER_ATOMIC);
return "" + varName + ".config(essid = " + essid + ", channel=" + channel + ",password="+ pw +")\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_ATOMIC];
}
export const network_socket_readline = 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 + '.readline()';
return [code, generator.ORDER_ATOMIC];
}
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_ATOMIC];
}
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_ATOMIC];
}
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];
}
export const requests_get2 = function (_, generator) {
generator.definitions_['import_urequests'] = "import urequests";
var dropdown_type = this.getFieldValue('TYPE');
var str = generator.valueToCode(this, 'URL', generator.ORDER_ATOMIC);
var code = 'urequests.' + dropdown_type + '(' + str + ')';
return [code, generator.ORDER_ATOMIC];
};
export const requests_attribute2 = function (_, generator) {
generator.definitions_['import_urequests'] = "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 requests_post = function (_, generator) {
generator.definitions_['import_urequests'] = "import urequests";
var dropdown_type = this.getFieldValue('TYPE');
var str = generator.valueToCode(this, 'URL', generator.ORDER_ATOMIC);
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
var code = 'urequests.' + dropdown_type + '(' + str + ', data=' + data + ')';
return [code, generator.ORDER_ATOMIC];
};
export const educore_wifi_connect = function (_, generator) {
generator.definitions_['import_educore_wifi'] = "from educore import wifi";
var username = generator.valueToCode(this, 'WIFINAME', generator.ORDER_ATOMIC);
var password = generator.valueToCode(this, 'PASSWORD', generator.ORDER_ATOMIC);
var timeout = generator.valueToCode(this, 'TIMEOUT', generator.ORDER_ATOMIC);
var code = 'wifi.connect(ssid='+username+', psd='+password+', timeout='+timeout+')\n';
return code;
}
export const educore_mqtt_connect = function (_, generator) {
generator.definitions_['import_educore_mqttclient'] = "from educore import mqttclient";
var server = generator.valueToCode(this, 'SERVER', generator.ORDER_ATOMIC);
var port = generator.valueToCode(this, 'PORT', generator.ORDER_ATOMIC);
var client_id = generator.valueToCode(this, 'CLIENT_ID', generator.ORDER_ATOMIC);
var username = generator.valueToCode(this, 'USERNAME', generator.ORDER_ATOMIC);
var password = generator.valueToCode(this, 'PASSWORD', generator.ORDER_ATOMIC);
// 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';
var code = 'mqttclient.connect(server='+server+', port='+port+', client_id='+client_id+', user='+username+', psd='+password+')\n'
return code;
}
export const educore_mqtt_subscribe_message = function (_, generator) {
generator.definitions_['import_educore_mqttclient'] = "from educore import mqttclient";
var topic = generator.valueToCode(this, 'TOPIC', generator.ORDER_ATOMIC);
var message = generator.valueToCode(this, 'MESSAGE', generator.ORDER_ATOMIC);
var code = 'mqttclient.'+message+'(' + topic + ')';
return [code, generator.ORDER_ATOMIC];
}
export const educore_mqtt_topic_subscribe = function (_, generator) {
var topic = generator.valueToCode(this, 'TOPIC', generator.ORDER_ATOMIC);
var method = generator.valueToCode(this, 'METHOD', generator.ORDER_ATOMIC);
generator.definitions_['import_educore_mqttclient'] = "from educore import mqttclient";
// var code = 'mqtt_client.set_callback(' + topic + ',' + method + ', MQTT_USR_PRJ)\n';
// code += 'mqtt_client.subscribe(MQTT_USR_PRJ + ' + topic + ')\n';
var code = 'mqttclient.received(topic='+topic+', callback='+method+')\n';
return code;
}
export const educore_mqtt_topic_publish = function (_, generator) {
generator.definitions_['import_educore_mqttclient'] = "from educore import mqttclient";
var topic = generator.valueToCode(this, 'TOPIC', generator.ORDER_ATOMIC);
var msg = generator.valueToCode(this, 'MSG', generator.ORDER_ATOMIC);
var code = 'mqtt_client.publish(topic=' + topic + ', content=' + msg + ')\n';
return code;
}
export const educore_mqtt_connect_success = function (_, generator) {
generator.definitions_['import_educore_mqttclient'] = "from educore import mqttclient";
var code = 'mqtt_client.connescted()';
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;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,978 @@
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];
generator.definitions_['import_' + version + '_onboard_als'] = 'from ' + version + ' import onboard_als';
var code = 'onboard_als.ps()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_nova_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_LTR308 = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_als'] = 'from ' + version + ' import onboard_als';
var code = 'onboard_als.als()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_sant_color = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_als'] = 'from ' + version + ' import onboard_als';
var code = 'onboard_als.color()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mixgo_nova_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_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_soar') {
generator.definitions_['import_mixgo_soar_voice_sound_level'] = "from mixgo_soar_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');
if (version == "mixgo_mini") {
generator.definitions_['import_mixgo_mini_onboard_i2c'] = 'from mixgo_mini import onboard_i2c';
generator.definitions_['import_spl06_001'] = 'import spl06_001';
generator.definitions_['import_onboard_bps'] = 'onboard_bps = spl06_001.SPL06(onboard_i2c)';
} else {
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";
} else if (version == 'mixgo_mini') {
generator.definitions_['import_mixgo_mini_onboard_i2c'] = 'from mixgo_mini import onboard_i2c';
generator.definitions_['import_shtc3'] = 'import shtc3';
generator.definitions_['import_onboard_ths'] = 'onboard_ths = shtc3.SHTC3(onboard_i2c)';
} 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];
var moduleName = version;
var objName = 'onboard_rfid';
if (version === 'mixgo_mini') {
moduleName = 'mini_gx';
objName = 'ext_rfid';
} else if (version === 'mixgo_me') {
moduleName = 'me_g1';
objName = 'ext_rc522';
}else if (version === 'mixgo_sant'){
moduleName = 'sant_gx';
objName = 'ext_rfid';
}
generator.definitions_[`import_${moduleName}_${objName}`] = `from ${moduleName} import ${objName}`;
var code = `${objName}.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);
var moduleName = version;
var objName = 'onboard_rfid';
if (version === 'mixgo_mini') {
moduleName = 'mini_gx';
objName = 'ext_rfid';
} else if (version === 'mixgo_me') {
moduleName = 'me_g1';
objName = 'ext_rc522';
}else if (version === 'mixgo_sant'){
moduleName = 'sant_gx';
objName = 'ext_rfid';
}
generator.definitions_[`import_${moduleName}_${objName}`] = `from ${moduleName} import ${objName}`;
var code = `${objName}.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);
var moduleName = version;
var objName = 'onboard_rfid';
if (version === 'mixgo_mini') {
moduleName = 'mini_gx';
objName = 'ext_rfid';
} else if (version === 'mixgo_me') {
moduleName = 'me_g1';
objName = 'ext_rc522';
}else if (version === 'mixgo_sant'){
moduleName = 'sant_gx';
objName = 'ext_rfid';
}
generator.definitions_[`import_${moduleName}_${objName}`] = `from ${moduleName} import ${objName}`;
var code = `${objName}.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);
var moduleName = version;
var objName = 'onboard_rfid';
if (version === 'mixgo_mini') {
moduleName = 'mini_gx';
objName = 'ext_rfid';
} else if (version === 'mixgo_me') {
moduleName = 'me_g1';
objName = 'ext_rc522';
}else if (version === 'mixgo_sant'){
moduleName = 'sant_gx';
objName = 'ext_rfid';
}
generator.definitions_[`import_${moduleName}_${objName}`] = `from ${moduleName} import ${objName}`;
var code = `${objName}.write_card(${cnt}, ${sector})`;
return [code, generator.ORDER_ATOMIC];
}
export const rfid_status = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
var key = this.getFieldValue('key');
var moduleName = version;
var objName = 'onboard_rfid';
if (version === 'mixgo_mini') {
moduleName = 'mini_gx';
objName = 'ext_rfid';
} else if (version === 'mixgo_me') {
moduleName = 'me_g1';
objName = 'ext_rc522';
} else if (version === 'mixgo_sant'){
moduleName = 'sant_gx';
objName = 'ext_rfid';
}
generator.definitions_[`import_${moduleName}_${objName}`] = `from ${moduleName} import ${objName}`;
var code = `${objName}.scan_card() == ${key}`;
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 if(version == 'mixgo_soar'){
generator.definitions_['import_' + version + '_onboard_imu'] = "from " + version + " import onboard_imu";
var code = 'onboard_imu.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 if (version == 'mixgo_soar') {
generator.definitions_['import_' + version + '_onboard_imu'] = "from " + version + " import onboard_imu";
var code = 'onboard_imu.acceleration()'+ 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' || version === 'mixgo_sant' || version === 'mixgo_soar') {
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' || version === 'mixgo_sant' || version === 'mixgo_soar' || version === 'mixgo_sowl') {
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_rtctime'] = "import rtctime";
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 = 'rtctime.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_rtctime'] = "import rtctime";
var code = 'rtctime.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];
}
export const onboard_RTC_get_time_str = function (_, generator) {
generator.definitions_['import_rtctime'] = 'import rtctime';
var code = 'rtctime.strtime()';
return [code, generator.ORDER_ATOMIC];
}
export const onboard_RTC_get_timetuple_to_str = function (_, generator) {
generator.definitions_['import_rtctime'] = 'import rtctime';
var ct = generator.valueToCode(this, 'CONTENT', generator.ORDER_ATOMIC);
var code = 'rtctime.strtime(' + ct + ')';
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 (version == 'mpython') {
generator.definitions_['import_mpython_magnetic'] = 'from mpython import magnetic';
if (key == 'all') {
var code = 'magnetic.getstrength()';
} else {
var code = 'magnetic.getdata()' + key;
}
} else if (version == 'mixgo_mini') {
generator.definitions_['import_mixgo_mini_onboard_i2c'] = 'from mixgo_mini import onboard_i2c';
generator.definitions_['import_mmc5603'] = 'import mmc5603';
generator.definitions_['import_onboard_mgs'] = 'onboard_mgs = mmc5603.MMC5603(onboard_i2c)';
if (key == 'all') {
var code = 'onboard_mgs.getstrength()';
} else {
var code = 'onboard_mgs.getdata()' + key;
}
} else {
generator.definitions_['import_' + version + '_onboard_mgs'] = "from " + version + " import onboard_mgs";
if (key == 'all') {
var code = 'onboard_mgs.getstrength()';
} else {
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 if (version == 'mixgo_mini') {
generator.definitions_['import_mixgo_mini_onboard_i2c'] = 'from mixgo_mini import onboard_i2c';
generator.definitions_['import_mmc5603'] = 'import mmc5603';
generator.definitions_['import_onboard_mgs'] = 'onboard_mgs = mmc5603.MMC5603(onboard_i2c)';
} 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];
if (version == 'mixgo_mini') {
generator.definitions_['import_mixgo_mini_onboard_i2c'] = 'from mixgo_mini import onboard_i2c';
generator.definitions_['import_mmc5603'] = 'import mmc5603';
generator.definitions_['import_onboard_mgs'] = 'onboard_mgs = mmc5603.MMC5603(onboard_i2c)';
} else {
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 version = Boards.getSelectedBoardKey().split(':')[2];
var key = this.getFieldValue('key');
if(version == 'mixgo_soar'){
generator.definitions_['import_' + version + '_onboard_imu'] = "from " + version + " import onboard_imu";
var code = 'onboard_imu.gyroscope()' +key ;
}else{
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;
//educore onboard_sensor
export const educore_voice_sensor = function (_, generator) {
generator.definitions_['import_educore_sound'] = 'from educore import sound';
var code = "sound()";
return [code, generator.ORDER_ATOMIC];
}
export const sensor_read = function (_, generator) {
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = sub + ".read()";
return [code, generator.ORDER_ATOMIC];
}
export const educore_light_sensor = function (_, generator) {
generator.definitions_['import_educore_light'] = 'from educore import light';
var code = "light()";
return [code, generator.ORDER_ATOMIC];
}
export const educore_gyroscope_sensor = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_accelerometer'] = 'from ' + version + ' import accelerometer';
var code = "accelerometer()";
return [code, generator.ORDER_ATOMIC];
}
export const educore_gyroscope_sensor_read = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_accelerometer'] = 'from ' + version + ' import accelerometer';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + "." + key + "()";
return [code, generator.ORDER_ATOMIC];
}
export const educore_gyroscope_sensor_shake = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_accelerometer'] = 'from ' + version + ' import accelerometer';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = sub + ".shake()";
return [code, generator.ORDER_ATOMIC];
}
export const educore_button_sensor = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_button'] = 'from ' + version + ' import button';
var btn = this.getFieldValue('btn');
var code = 'button(button.' + btn + ')';
return [code, generator.ORDER_ATOMIC];
}
export const educore_button_was_pressed = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_button'] = 'from ' + version + ' import button';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = sub + '.status()';
return [code, generator.ORDER_ATOMIC];
}
export const educore_rfid_sensor = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_rfid'] = 'from ' + version + ' import rfid';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'rfid(' + pin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const educore_rfid_sensor_scan = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_rfid'] = 'from ' + version + ' import rfid';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = sub + '.scanning()';
return [code, generator.ORDER_ATOMIC];
}
export const educore_rfid_sensor_scan_data = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_rfid'] = 'from ' + version + ' import rfid';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + '.' + key + '()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_get_the_coprocessor_version = function (_, generator) {
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_bot'] = 'from ' + version + ' import onboard_bot';
var code = 'onboard_bot.version()';
return [code, generator.ORDER_ATOMIC];
}
export const simulated_light_sensor = function (_, generator){
var version = Boards.getSelectedBoardKey().split(':')[2];
generator.definitions_['import_' + version + '_onboard_bot'] = 'from ' + version + ' import onboard_bot';
var key = this.getFieldValue('key');
var code = 'onboard_bot.brightness('+ key + ')';
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,123 @@
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,204 @@
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 set_system_timer = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var v = generator.valueToCode(this, "VAR", generator.ORDER_NONE) || "None";
var i = generator.valueToCode(this, "PIN", generator.ORDER_NONE) || "None";
var period = generator.valueToCode(this, "period", generator.ORDER_NONE) || "0";
var mode = this.getFieldValue('mode');
var callback = generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None";
var code = v + " = machine.Timer("+ i +", 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) {
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 callback = generator.valueToCode(this, 'callback', generator.ORDER_NONE) || 'None';
var code = `${v}.init(period=${period}, mode=machine.Timer.${mode}, callback=${callback})\n`;
return code;
}
export const system_timer_deinit = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
var v = generator.valueToCode(this, 'VAR', generator.ORDER_NONE) || 'None';
var code = `${v}.deinit()\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 system_timer = system_timer_init;
export const timer2 = system_timer_init;
export const time_ticks_diff = system_ticks_diff;
export const base_delay = controls_delay;

View File

@@ -0,0 +1,160 @@
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];
}
export const Weather_now = function (_, generator) {
generator.definitions_['import_seniverse_api*'] = "from seniverse_api import *";
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 = dropdown_mode + '.request(' + key + ', ' + addr + ')\n';
return code;
};
export const Weather_now_content = function (_, generator) {
generator.definitions_['import_seniverse_api*'] = "from seniverse_api import *";
var content = this.getFieldValue('content');
if (content == 'none') {
var code = 'Weather_now.analysis()';
} else {
var code = 'Weather_now.analysis("' + content + '")';
}
return [code, generator.ORDER_ATOMIC];
};
export const Air_now_content = function (_, generator) {
generator.definitions_['import_seniverse_api*'] = "from seniverse_api import *";
var content = this.getFieldValue('content');
if (content == 'none') {
var code = 'Air_now.analysis()';
} else {
var code = 'Air_now.analysis("' + content + '")';
}
return [code, generator.ORDER_ATOMIC];
};
export const Weather_alarm_content = function (_, generator) {
generator.definitions_['import_seniverse_api*'] = "from seniverse_api import *";
var content = this.getFieldValue('content');
if (content == 'none') {
var code = 'Weather_alarm.analysis()';
} else {
var code = 'Weather_alarm.analysis("' + content + '")';
}
return [code, generator.ORDER_ATOMIC];
};
export const Life_suggestion_content = function (_, generator) {
generator.definitions_['import_seniverse_api*'] = "from seniverse_api import *";
var content = this.getFieldValue('content');
if (content == 'none') {
var code = 'Life_suggestion.analysis()';
} else {
var code = 'Life_suggestion.analysis("' + content + '")';
}
return [code, generator.ORDER_ATOMIC];
};
export const Tide_daily_content = function (_, generator) {
generator.definitions_['import_seniverse_api*'] = "from seniverse_api import *";
var content = this.getFieldValue('content');
if (content == 'none') {
var code = 'Tide_daily.analysis()';
} else {
var code = 'Tide_daily.analysis("' + content + '")';
}
return [code, generator.ORDER_ATOMIC];
};
export const Location_search_content = function (_, generator) {
generator.definitions_['import_seniverse_api*'] = "from seniverse_api import *";
var content = this.getFieldValue('content');
if (content == 'none') {
var code = 'Location_search.analysis()';
} else {
var code = 'Location_search.analysis("' + content + '")';
}
return [code, generator.ORDER_ATOMIC];
};
export const Weather_daily = function (_, generator) {
generator.definitions_['import_seniverse_api*'] = "from seniverse_api import *";
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 = dropdown_mode + '.request(' + key + ', ' + addr + ', ' + day + ')\n';
return code;
};
export const Weather_daily_content = function (_, generator) {
generator.definitions_['import_seniverse_api*'] = "from seniverse_api import *";
var content = this.getFieldValue('content');
var day = generator.valueToCode(this, 'day', generator.ORDER_ATOMIC);
if (content == 'none') {
var code = 'Weather_daily.analysis(' + day + ')';
} else {
var code = 'Weather_daily.analysis(' + day + ', "' + content + '")';
}
return [code, generator.ORDER_ATOMIC];
};
export const Air_daily_content = function (_, generator) {
generator.definitions_['import_seniverse_api*'] = "from seniverse_api import *";
var content = this.getFieldValue('content');
var day = generator.valueToCode(this, 'day', generator.ORDER_ATOMIC);
if (content == 'none') {
var code = 'Air_daily.analysis(' + day + ')';
} else {
var code = 'Air_daily.analysis(' + day + ', "' + content + '")';
}
return [code, generator.ORDER_ATOMIC];
};
export const Geo_sun_content = function (_, generator) {
generator.definitions_['import_seniverse_api*'] = "from seniverse_api import *";
var content = this.getFieldValue('content');
var day = generator.valueToCode(this, 'day', generator.ORDER_ATOMIC);
if (content == 'none') {
var code = 'Geo_sun.analysis(' + day + ')';
} else {
var code = 'Geo_sun.analysis(' + day + ', "' + content + '")';
}
return [code, generator.ORDER_ATOMIC];
};
export const Geo_moon_content = function (_, generator) {
generator.definitions_['import_seniverse_api*'] = "from seniverse_api import *";
var content = this.getFieldValue('content');
var day = generator.valueToCode(this, 'day', generator.ORDER_ATOMIC);
if (content == 'none') {
var code = 'Geo_moon.analysis(' + day + ')';
} else {
var code = 'Geo_moon.analysis(' + day + ', "' + content + '")';
}
return [code, generator.ORDER_ATOMIC];
};

View File

@@ -0,0 +1,9 @@
import * as Mixly from 'mixly';
import TEMPLATE from '../template/board-config-message.html';
const { XML } = Mixly;
export const MICROPYTHON_CONFIG_MESSAGE_BURN_SPEED = XML.render(TEMPLATE, {
title: 'Burn Speed',
message: 'To select the flashing speed, change the Burn Speed. This value will be used for flashing the code to the device. If you have issues while flashing the device at high speed, try to decrease this value. This could be due to the external serial-to-USB chip limitations.'
});

View File

@@ -0,0 +1,9 @@
import * as Mixly from 'mixly';
import TEMPLATE from '../template/board-config-message.html';
const { XML } = Mixly;
export const MICROPYTHON_CONFIG_MESSAGE_BURN_SPEED = XML.render(TEMPLATE, {
title: '烧录速度',
message: '要选择烧录速度请更改“Burn Speed”此值将用于向设备烧录代码。如果在用较高的烧录速度时出现问题请尝试减小此值这可能是由于外部串行到USB芯片的限制。'
});

View File

@@ -0,0 +1,9 @@
import * as Mixly from 'mixly';
import TEMPLATE from '../template/board-config-message.html';
const { XML } = Mixly;
export const MICROPYTHON_CONFIG_MESSAGE_BURN_SPEED = XML.render(TEMPLATE, {
title: '燒錄速度',
message: '要選擇燒錄速度請更改“Burn Speed”此值將用於向設備燒錄程式碼。如果在用較高的燒錄速度時出現問題請嘗試减小此值這可能是由於外部串列到USB晶片的限制。'
});

View File

@@ -0,0 +1,602 @@
# SPDX-FileCopyrightText: 2009 Kazuhiko Arase
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
#
# SPDX-License-Identifier: MIT
# Ported from the Javascript library by Sam Curren
# QRCode for Javascript
# http://d-project.googlecode.com/svn/trunk/misc/qrcode/js/qrcode.js
#
# Minimized for CircuitPython by ladyada for adafruit industries
#
# The word "QR Code" is registered trademark of
# DENSO WAVE INCORPORATED
# http://www.denso-wave.com/qrcode/faqpatent-e.html
"""
`adafruit_miniqr`
====================================================
A non-hardware dependant miniature QR generator library. All native Python!
* Author(s): ladyada
Implementation Notes
--------------------
**Hardware:**
* Any!
**Software and Dependencies:**
* Python 3
"""
# imports
import math
try:
from typing import Dict, List, Optional, Tuple
except ImportError:
pass
__version__ = "0.0.0+auto.0"
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_miniQR.git"
# Consts!
M = 0
L = 1
H = 2
Q = 3
_MODE_8BIT_BYTE = 1 << 2
_PAD0 = 0xEC
_PAD1 = 0x11
# Optimized polynomial helpers
def _glog(n: int) -> int:
"""Lookup log(n) from pre-calculated byte table"""
if n < 1:
raise ValueError("glog(" + n + ")")
return LOG_TABLE[n]
def _gexp(n: int) -> int:
"""Lookup exp(n) from pre-calculated byte table"""
while n < 0:
n += 255
while n >= 256:
n -= 255
return EXP_TABLE[n]
EXP_TABLE = b"\x01\x02\x04\x08\x10 @\x80\x1d:t\xe8\xcd\x87\x13&L\x98-Z\xb4u\xea\xc9\x8f\x03\x06\x0c\x180`\xc0\x9d'N\x9c%J\x945j\xd4\xb5w\xee\xc1\x9f#F\x8c\x05\n\x14(P\xa0]\xbai\xd2\xb9o\xde\xa1_\xbea\xc2\x99/^\xbce\xca\x89\x0f\x1e<x\xf0\xfd\xe7\xd3\xbbk\xd6\xb1\x7f\xfe\xe1\xdf\xa3[\xb6q\xe2\xd9\xafC\x86\x11\"D\x88\r\x1a4h\xd0\xbdg\xce\x81\x1f>|\xf8\xed\xc7\x93;v\xec\xc5\x973f\xcc\x85\x17.\\\xb8m\xda\xa9O\x9e!B\x84\x15*T\xa8M\x9a)R\xa4U\xaaI\x929r\xe4\xd5\xb7s\xe6\xd1\xbfc\xc6\x91?~\xfc\xe5\xd7\xb3{\xf6\xf1\xff\xe3\xdb\xabK\x961b\xc4\x957n\xdc\xa5W\xaeA\x82\x192d\xc8\x8d\x07\x0e\x1c8p\xe0\xdd\xa7S\xa6Q\xa2Y\xb2y\xf2\xf9\xef\xc3\x9b+V\xacE\x8a\t\x12$H\x90=z\xf4\xf5\xf7\xf3\xfb\xeb\xcb\x8b\x0b\x16,X\xb0}\xfa\xe9\xcf\x83\x1b6l\xd8\xadG\x8e\x01" # noqa: E501
LOG_TABLE = b"\x00\x00\x01\x19\x022\x1a\xc6\x03\xdf3\xee\x1bh\xc7K\x04d\xe0\x0e4\x8d\xef\x81\x1c\xc1i\xf8\xc8\x08Lq\x05\x8ae/\xe1$\x0f!5\x93\x8e\xda\xf0\x12\x82E\x1d\xb5\xc2}j'\xf9\xb9\xc9\x9a\txM\xe4r\xa6\x06\xbf\x8bbf\xdd0\xfd\xe2\x98%\xb3\x10\x91\"\x886\xd0\x94\xce\x8f\x96\xdb\xbd\xf1\xd2\x13\\\x838F@\x1eB\xb6\xa3\xc3H~nk:(T\xfa\x85\xba=\xca^\x9b\x9f\n\x15y+N\xd4\xe5\xacs\xf3\xa7W\x07p\xc0\xf7\x8c\x80c\rgJ\xde\xed1\xc5\xfe\x18\xe3\xa5\x99w&\xb8\xb4|\x11D\x92\xd9# \x89.7?\xd1[\x95\xbc\xcf\xcd\x90\x87\x97\xb2\xdc\xfc\xbea\xf2V\xd3\xab\x14*]\x9e\x84<9SGmA\xa2\x1f-C\xd8\xb7{\xa4v\xc4\x17I\xec\x7f\x0co\xf6l\xa1;R)\x9dU\xaa\xfb`\x86\xb1\xbb\xcc>Z\xcbY_\xb0\x9c\xa9\xa0Q\x0b\xf5\x16\xebzu,\xd7O\xae\xd5\xe9\xe6\xe7\xad\xe8t\xd6\xf4\xea\xa8PX\xaf" # noqa: E501
class QRCode:
"""The generator class for QR code matrices"""
def __init__(self, *, qr_type: Optional[int] = None, error_correct: int = L):
"""Initialize an empty QR code. You can define the `qr_type` (size)
of the code matrix, or have the libary auto-select the smallest
match. Default `error_correct` is type L (7%), but you can select M,
Q or H."""
self.type = qr_type
self.ECC = error_correct
self.matrix = None
self.module_count = 0
self.data_cache = None
self.data_list = []
def add_data(self, data: bytes) -> None:
"""Add more data to the QR code, must be bytestring stype"""
self.data_list.append(data)
datalen = sum(len(x) for x in self.data_list)
if not self.type:
for qr_type in range(1, 10):
rs_blocks = _get_rs_blocks(qr_type, self.ECC)
total_data_count = 0
for block in rs_blocks:
total_data_count += block["data"]
if total_data_count > datalen:
self.type = qr_type
break
self.data_cache = None
def make(self, *, test: bool = False, mask_pattern: int = 0) -> None:
"""Perform the actual generation of the QR matrix. To keep things
small and speedy we don't generate all 8 mask patterns and pick
the best. Instead, please pass in a desired mask_pattern, the
default mask is 0."""
self.module_count = self.type * 4 + 17
self.matrix = QRBitMatrix(self.module_count, self.module_count)
self._setup_position_probe_pattern(0, 0)
self._setup_position_probe_pattern(self.module_count - 7, 0)
self._setup_position_probe_pattern(0, self.module_count - 7)
self._setup_position_adjust_pattern()
self._setup_timing_pattern()
self._setup_type_info(test, mask_pattern)
if self.type >= 7:
self._setup_type_number(test)
if self.data_cache is None:
self.data_cache = QRCode._create_data(self.type, self.ECC, self.data_list)
self._map_data(self.data_cache, mask_pattern)
def _setup_position_probe_pattern(self, row: int, col: int) -> None:
"""Add the positition probe data pixels to the matrix"""
for r in range(-1, 8):
if row + r <= -1 or self.module_count <= row + r:
continue
for c in range(-1, 8):
if col + c <= -1 or self.module_count <= col + c:
continue
test = (
(0 <= r <= 6 and (c in (0, 6)))
or (0 <= c <= 6 and (r in (0, 6)))
or (2 <= r <= 4 and 2 <= c <= 4)
)
self.matrix[row + r, col + c] = test
def _setup_timing_pattern(self) -> None:
"""Add the timing data pixels to the matrix"""
for r in range(8, self.module_count - 8):
if self.matrix[r, 6] is not None:
continue
self.matrix[r, 6] = r % 2 == 0
for c in range(8, self.module_count - 8):
if self.matrix[6, c] is not None:
continue
self.matrix[6, c] = c % 2 == 0
def _setup_position_adjust_pattern(self) -> None:
"""Add the position adjust data pixels to the matrix"""
pos = QRUtil.get_pattern_position(self.type)
for row in pos:
for col in pos:
if self.matrix[row, col] is not None:
continue
for r in range(-2, 3):
for c in range(-2, 3):
test = abs(r) == 2 or abs(c) == 2 or (r == 0 and c == 0)
self.matrix[row + r, col + c] = test
def _setup_type_number(self, test: bool) -> None:
"""Add the type number pixels to the matrix"""
bits = QRUtil.get_BCH_type_number(self.type)
for i in range(18):
mod = not test and ((bits >> i) & 1) == 1
self.matrix[i // 3, i % 3 + self.module_count - 8 - 3] = mod
for i in range(18):
mod = not test and ((bits >> i) & 1) == 1
self.matrix[i % 3 + self.module_count - 8 - 3, i // 3] = mod
def _setup_type_info(self, test: bool, mask_pattern: int) -> None:
"""Add the type info pixels to the matrix"""
data = (self.ECC << 3) | mask_pattern
bits = QRUtil.get_BCH_type_info(data)
# // vertical
for i in range(15):
mod = not test and ((bits >> i) & 1) == 1
if i < 6:
self.matrix[i, 8] = mod
elif i < 8:
self.matrix[i + 1, 8] = mod
else:
self.matrix[self.module_count - 15 + i, 8] = mod
# // horizontal
for i in range(15):
mod = not test and ((bits >> i) & 1) == 1
if i < 8:
self.matrix[8, self.module_count - i - 1] = mod
elif i < 9:
self.matrix[8, 15 - i - 1 + 1] = mod
else:
self.matrix[8, 15 - i - 1] = mod
# // fixed module
self.matrix[self.module_count - 8, 8] = not test
def _map_data(self, data: bytes, mask_pattern: int) -> None:
"""Map the data onto the QR code"""
inc = -1
row = self.module_count - 1
bit_idx = 7
byte_idx = 0
for col in range(self.module_count - 1, 0, -2):
if col == 6:
col -= 1 # noqa: PLW2901 loop variable overwritten
while True:
for c in range(2):
if self.matrix[row, col - c] is None:
dark = False
if byte_idx < len(data):
dark = ((data[byte_idx] >> bit_idx) & 1) == 1
mask = QRUtil.get_mask(mask_pattern, row, col - c)
if mask:
dark = not dark
self.matrix[row, col - c] = dark
bit_idx -= 1
if bit_idx == -1:
byte_idx += 1
bit_idx = 7
row += inc
if row < 0 or self.module_count <= row:
row -= inc
inc = -inc
break
@staticmethod
def _create_data(qr_type: int, ecc: int, data_list: list) -> bytes:
"""Check and format data into bit buffer"""
rs_blocks = _get_rs_blocks(qr_type, ecc)
buffer = QRBitBuffer()
for data in data_list:
if isinstance(data, str):
data = str.encode(data) # noqa: PLW2901 loop variable overwritten
buffer.put(_MODE_8BIT_BYTE, 4)
buffer.put(len(data), 8)
for byte in data:
buffer.put(byte, 8)
# // calc num max data.
total_data_count = 0
for block in rs_blocks:
total_data_count += block["data"]
if buffer.get_length_bits() > total_data_count * 8:
raise RuntimeError(
"Code length overflow: %d > %d" % (buffer.get_length_bits(), total_data_count * 8)
)
# // end code
if buffer.get_length_bits() + 4 <= total_data_count * 8:
buffer.put(0, 4)
# // padding
while buffer.get_length_bits() % 8 != 0:
buffer.put_bit(False)
# // padding
while True:
if buffer.get_length_bits() >= total_data_count * 8:
break
buffer.put(_PAD0, 8)
if buffer.get_length_bits() >= total_data_count * 8:
break
buffer.put(_PAD1, 8)
return QRCode._create_bytes(buffer, rs_blocks)
@staticmethod
def _create_bytes(buffer: bytes, rs_blocks: List[Dict]) -> bytes: # noqa: PLR0912 Too many branches
"""Perform error calculation math on bit buffer"""
offset = 0
max_dc_count = 0
max_ec_count = 0
dcdata = [0] * len(rs_blocks)
ecdata = [0] * len(rs_blocks)
for r, block in enumerate(rs_blocks):
dc_count = block["data"]
ec_count = block["total"] - dc_count
max_dc_count = max(max_dc_count, dc_count)
max_ec_count = max(max_ec_count, ec_count)
dcdata[r] = [0] * dc_count
for i in range(len(dcdata[r])):
dcdata[r][i] = 0xFF & buffer.buffer[i + offset]
offset += dc_count
rs_poly = QRUtil.get_error_correct_polynomial(ec_count)
mod_poly = QRPolynomial(dcdata[r], rs_poly.get_length() - 1)
while True:
if mod_poly.get_length() - rs_poly.get_length() < 0:
break
ratio = _glog(mod_poly.get(0)) - _glog(rs_poly.get(0))
num = [0 for x in range(mod_poly.get_length())]
for i in range(mod_poly.get_length()):
num[i] = mod_poly.get(i)
for i in range(rs_poly.get_length()):
num[i] ^= _gexp(_glog(rs_poly.get(i)) + ratio)
mod_poly = QRPolynomial(num, 0)
ecdata[r] = [0 for x in range(rs_poly.get_length() - 1)]
for i in range(len(ecdata[r])):
mod_index = i + mod_poly.get_length() - len(ecdata[r])
if mod_index >= 0:
ecdata[r][i] = mod_poly.get(mod_index)
else:
ecdata[r][i] = 0
total_code_count = 0
for block in rs_blocks:
total_code_count += block["total"]
data = [None] * total_code_count
index = 0
for i in range(max_dc_count):
for r in range(len(rs_blocks)):
if i < len(dcdata[r]):
data[index] = dcdata[r][i]
index += 1
for i in range(max_ec_count):
for r in range(len(rs_blocks)):
if i < len(ecdata[r]):
data[index] = ecdata[r][i]
index += 1
return data
class QRUtil:
"""A selection of bit manipulation tools for QR generation and BCH encoding"""
PATTERN_POSITION_TABLE = [
b"",
b"\x06\x12",
b"\x06\x16",
b"\x06\x1a",
b"\x06\x1e",
b'\x06"',
b"\x06\x16&",
b"\x06\x18*",
b"\x06\x1a.",
b"\x06\x1c2",
]
G15 = 0b10100110111
G18 = 0b1111100100101
G15_MASK = 0b101010000010010
@staticmethod
def get_BCH_type_info(data: int) -> int:
"""Encode with G15 BCH mask"""
d = data << 10
while QRUtil.get_BCH_digit(d) - QRUtil.get_BCH_digit(QRUtil.G15) >= 0:
d ^= QRUtil.G15 << (QRUtil.get_BCH_digit(d) - QRUtil.get_BCH_digit(QRUtil.G15))
return ((data << 10) | d) ^ QRUtil.G15_MASK
@staticmethod
def get_BCH_type_number(data: int) -> int:
"""Encode with G18 BCH mask"""
d = data << 12
while QRUtil.get_BCH_digit(d) - QRUtil.get_BCH_digit(QRUtil.G18) >= 0:
d ^= QRUtil.G18 << (QRUtil.get_BCH_digit(d) - QRUtil.get_BCH_digit(QRUtil.G18))
return (data << 12) | d
@staticmethod
def get_BCH_digit(data: int) -> int:
"""Count digits in data"""
digit = 0
while data != 0:
digit += 1
data >>= 1
return digit
@staticmethod
def get_pattern_position(qr_type: int) -> bytes:
"""The mask pattern position array for this QR type"""
return QRUtil.PATTERN_POSITION_TABLE[qr_type - 1]
@staticmethod
def get_mask(mask: int, i: int, j: int) -> int: # noqa: PLR0911 Too many return statements
"""Perform matching calculation on two vals for given pattern mask"""
if mask == 0:
return (i + j) % 2 == 0
if mask == 1:
return i % 2 == 0
if mask == 2:
return j % 3 == 0
if mask == 3:
return (i + j) % 3 == 0
if mask == 4:
return (math.floor(i / 2) + math.floor(j / 3)) % 2 == 0
if mask == 5:
return (i * j) % 2 + (i * j) % 3 == 0
if mask == 6:
return ((i * j) % 2 + (i * j) % 3) % 2 == 0
if mask == 7:
return ((i * j) % 3 + (i + j) % 2) % 2 == 0
raise ValueError("Bad mask pattern:" + mask)
@staticmethod
def get_error_correct_polynomial(ecc_length: int) -> "QRPolynomial":
"""Generate a ecc polynomial"""
poly = QRPolynomial([1], 0)
for i in range(ecc_length):
poly = poly.multiply(QRPolynomial([1, _gexp(i)], 0))
return poly
class QRPolynomial:
"""Structure for creating and manipulating error code polynomials"""
def __init__(self, num: int, shift: int):
"""Create a QR polynomial"""
if not num:
raise ValueError(num.length + "/" + shift)
offset = 0
while offset < len(num) and num[offset] == 0:
offset += 1
self.num = [0 for x in range(len(num) - offset + shift)]
for i in range(len(num) - offset):
self.num[i] = num[i + offset]
def get(self, index: int) -> int:
"""The exponent at the index location"""
return self.num[index]
def get_length(self) -> int:
"""Length of the poly"""
return len(self.num)
def multiply(self, other_polynomial: "QRPolynomial") -> "QRPolynomial":
"""Multiply two polynomials, returns a new one"""
num = [0 for x in range(self.get_length() + other_polynomial.get_length() - 1)]
for i in range(self.get_length()):
for j in range(other_polynomial.get_length()):
num[i + j] ^= _gexp(_glog(self.get(i)) + _glog(other_polynomial.get(j)))
return QRPolynomial(num, 0)
_QRRS_BLOCK_TABLE = (
b"\x01\x1a\x10",
b"\x01\x1a\x13",
b"\x01\x1a\t",
b"\x01\x1a\r",
b"\x01,\x1c",
b'\x01,"',
b"\x01,\x10",
b"\x01,\x16",
b"\x01F,",
b"\x01F7",
b"\x02#\r",
b"\x02#\x11",
b"\x022 ",
b"\x01dP",
b"\x04\x19\t",
b"\x022\x18",
b"\x02C+",
b"\x01\x86l",
b'\x02!\x0b\x02"\x0c',
b'\x02!\x0f\x02"\x10',
b"\x04+\x1b",
b"\x02VD",
b"\x04+\x0f",
b"\x04+\x13",
b"\x041\x1f",
b"\x02bN",
b"\x04'\r\x01(\x0e",
b"\x02 \x0e\x04!\x0f",
b"\x02<&\x02='",
b"\x02ya",
b"\x04(\x0e\x02)\x0f",
b"\x04(\x12\x02)\x13",
b"\x03:$\x02;%",
b"\x02\x92t",
b"\x04$\x0c\x04%\r",
b"\x04$\x10\x04%\x11",
)
def _get_rs_blocks(qr_type: int, ecc: int) -> List[Dict]:
rs_block = _QRRS_BLOCK_TABLE[(qr_type - 1) * 4 + ecc]
length = len(rs_block) // 3
blocks = []
for i in range(length):
count = rs_block[i * 3 + 0]
total = rs_block[i * 3 + 1]
data = rs_block[i * 3 + 2]
block = {"total": total, "data": data}
for _ in range(count):
blocks.append(block)
return blocks
class QRBitMatrix:
"""A bit-packed storage class for matrices"""
def __init__(self, width: int, height: int):
self.width = width
self.height = height
if width > 60:
raise ValueError("Max 60 bits wide:", width)
self.buffer = [0] * self.height * 2
self.used = [0] * self.height * 2
def __repr__(self) -> str:
b = ""
for y in range(self.height):
for x in range(self.width):
if self[x, y]:
b += "X"
else:
b += "."
b += "\n"
return b
def __getitem__(self, key: Tuple[int, int]) -> int:
x, y = key
if y > self.width:
raise ValueError()
i = 2 * x + (y // 30)
j = y % 30
if not self.used[i] & (1 << j):
return None
return self.buffer[i] & (1 << j)
def __setitem__(self, key: Tuple[int, int], value: int) -> None:
x, y = key
if y > self.width:
raise ValueError()
i = 2 * x + (y // 30)
j = y % 30
if value:
self.buffer[i] |= 1 << j
else:
self.buffer[i] &= ~(1 << j)
self.used[i] |= 1 << j # buffer item was set
class QRBitBuffer:
"""Storage class for a length of individual bits"""
def __init__(self):
self.buffer = []
self.length = 0
def __repr__(self) -> str:
return ".".join([str(n) for n in self.buffer])
def get(self, index: int) -> int:
"""The bit value at a location"""
i = index // 8
return self.buffer[i] & (1 << (7 - index % 8))
def put(self, num: int, length: int) -> None:
"""Add a number of bits from a single integer value"""
for i in range(length):
self.put_bit(num & (1 << (length - i - 1)))
def get_length_bits(self) -> int:
"""Size of bit buffer"""
return self.length
def put_bit(self, bit: int) -> None:
"""Insert one bit at the end of the bit buffer"""
i = self.length // 8
if len(self.buffer) <= i:
self.buffer.append(0)
if bit:
self.buffer[i] |= 0x80 >> (self.length % 8)
self.length += 1

View File

@@ -0,0 +1,52 @@
#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
if self._rreg(0x0) != 0xe5:
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,97 @@
"""
AGS10
Micropython library for the AGS10(TVOC)
=======================================================
@dahanzimin From the Mixly Team
"""
import time
from micropython import const
_AGS10_ADC = const(0x00)
_AGS10_CAL = const(0x01)
_AGS10_RES = const(0x20)
_AGS10_ADD = const(0x21)
class AGS10:
def __init__(self, i2c_bus, address=0x1A, delay=1000):
self._i2c = i2c_bus
self._addr = address
self._voc = 0
self._delay = delay
self._star = 0
self.ready = 0
def _crc8(self, buf, is_byte=False):
'''Perform CRC check on the data'''
crc = 0xff
for byte in buf:
crc ^= byte
for _ in range(8):
if crc & 0x80:
crc = (crc << 1) ^ 0x31
else:
crc = crc << 1
return crc.to_bytes(1, 'little') if is_byte else crc & 0xff
def _wreg(self, reg, buf):
'''Write memory address'''
self._i2c.writeto_mem(self._addr, reg, buf)
time.sleep_ms(20)
def _rreg(self, reg, nbytes=5):
'''Read memory address'''
_buf = self._i2c.readfrom_mem(self._addr, reg, nbytes)
time.sleep_ms(20)
return _buf[:4] if self._crc8(_buf[:4]) == _buf[4] else None
def address(self, addr=None):
_scan = self._i2c.scan()
if addr is None:
if self._addr in _scan:
return self._addr
elif len(_scan) == 1:
self._addr = _scan[0]
return self._addr
else:
return None
else:
if self.address():
if 8<= addr <=119:
_buf = bytes([addr, (~ addr) & 0xff] * 2)
self._wreg(_AGS10_ADD, _buf + self._crc8(_buf, True))
if addr in self._i2c.scan():
self._addr = addr
return True
else:
raise ValueError("Not within the valid range of 8-119")
def calibration(self, zero=1):
'''0: Factory restoration 1:Sensor resistance'''
_buf = b'\x00\x0c'
_buf += b'\x00\x00' if zero else b'\xff\xff'
self._wreg(_AGS10_ADD, _buf + self._crc8(_buf, True))
@property
def getdata(self):
if time.ticks_diff(time.ticks_ms(), self._star) >= self._delay:
self._star = time.ticks_ms()
_buf = self._rreg(_AGS10_ADC)
self._voc = int.from_bytes(_buf[1:4], 'big')
self.ready = not (_buf[0] & 0x01)
return self._voc / 1000
def read(self, hcho_mw=30.033 , co2_mv=0.853, co2_base=400):
'''unit ppm'''
self.getdata
_voc = self._voc / 1000 #ppm
return round( _voc, 2), round( _voc / hcho_mw, 2), co2_base + round( _voc / co2_mv, 2)
def tvoc(self):
return self.read()[0]
def hcho(self, tvoc_mw=30.053):
return self.read(hcho_mw=hcho_mw)[1]
def eco2(self, co2_mv=0.853):
return self.read(co2_mv=co2_mv)[2]

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,480 @@
#! /usr/bin/env python3
"""RFC 3548: Base16, Base32, Base64 Data Encodings"""
# Modified 04-Oct-1995 by Jack Jansen to use binascii module
# Modified 30-Dec-2003 by Barry Warsaw to add full RFC 3548 support
# Modified 22-May-2007 by Guido van Rossum to use bytes everywhere
import re
import struct
import binascii
__all__ = [
# Legacy interface exports traditional RFC 1521 Base64 encodings
"encode",
"decode",
"encodebytes",
"decodebytes",
# Generalized interface for other encodings
"b64encode",
"b64decode",
"b32encode",
"b32decode",
"b16encode",
"b16decode",
# Standard Base64 encoding
"standard_b64encode",
"standard_b64decode",
# Some common Base64 alternatives. As referenced by RFC 3458, see thread
# starting at:
#
# http://zgp.org/pipermail/p2p-hackers/2001-September/000316.html
"urlsafe_b64encode",
"urlsafe_b64decode",
]
bytes_types = (bytes, bytearray) # Types acceptable as binary data
def _bytes_from_decode_data(s):
if isinstance(s, str):
try:
return s.encode("ascii")
# except UnicodeEncodeError:
except:
raise ValueError("string argument should contain only ASCII characters")
elif isinstance(s, bytes_types):
return s
else:
raise TypeError("argument should be bytes or ASCII string, not %s" % s.__class__.__name__)
def _maketrans(f, t):
"""Re-implement bytes.maketrans() as there is no such function in micropython"""
if len(f) != len(t):
raise ValueError("maketrans arguments must have same length")
translation_table = dict(zip(f, t))
return translation_table
def _translate(input_bytes, trans_table):
"""Re-implement bytes.translate() as there is no such function in micropython"""
result = bytearray()
for byte in input_bytes:
translated_byte = trans_table.get(byte, byte)
result.append(translated_byte)
return bytes(result)
# Base64 encoding/decoding uses binascii
def b64encode(s, altchars=None):
"""Encode a byte string using Base64.
s is the byte string to encode. Optional altchars must be a byte
string of length 2 which specifies an alternative alphabet for the
'+' and '/' characters. This allows an application to
e.g. generate url or filesystem safe Base64 strings.
The encoded byte string is returned.
"""
if not isinstance(s, bytes_types):
raise TypeError("expected bytes, not %s" % s.__class__.__name__)
# Strip off the trailing newline
encoded = binascii.b2a_base64(s)[:-1]
if altchars is not None:
if not isinstance(altchars, bytes_types):
raise TypeError("expected bytes, not %s" % altchars.__class__.__name__)
assert len(altchars) == 2, repr(altchars)
encoded = _translate(encoded, _maketrans(b"+/", altchars))
return encoded
def b64decode(s, altchars=None, validate=False):
"""Decode a Base64 encoded byte string.
s is the byte string to decode. Optional altchars must be a
string of length 2 which specifies the alternative alphabet used
instead of the '+' and '/' characters.
The decoded string is returned. A binascii.Error is raised if s is
incorrectly padded.
If validate is False (the default), non-base64-alphabet characters are
discarded prior to the padding check. If validate is True,
non-base64-alphabet characters in the input result in a binascii.Error.
"""
s = _bytes_from_decode_data(s)
if altchars is not None:
altchars = _bytes_from_decode_data(altchars)
assert len(altchars) == 2, repr(altchars)
s = _translate(s, _maketrans(altchars, b"+/"))
if validate and not re.match(b"^[A-Za-z0-9+/]*=*$", s):
raise binascii.Error("Non-base64 digit found")
return binascii.a2b_base64(s)
def standard_b64encode(s):
"""Encode a byte string using the standard Base64 alphabet.
s is the byte string to encode. The encoded byte string is returned.
"""
return b64encode(s)
def standard_b64decode(s):
"""Decode a byte string encoded with the standard Base64 alphabet.
s is the byte string to decode. The decoded byte string is
returned. binascii.Error is raised if the input is incorrectly
padded or if there are non-alphabet characters present in the
input.
"""
return b64decode(s)
# _urlsafe_encode_translation = _maketrans(b'+/', b'-_')
# _urlsafe_decode_translation = _maketrans(b'-_', b'+/')
def urlsafe_b64encode(s):
"""Encode a byte string using a url-safe Base64 alphabet.
s is the byte string to encode. The encoded byte string is
returned. The alphabet uses '-' instead of '+' and '_' instead of
'/'.
"""
# return b64encode(s).translate(_urlsafe_encode_translation)
return b64encode(s, b"-_").rstrip(b"\n")
def urlsafe_b64decode(s):
"""Decode a byte string encoded with the standard Base64 alphabet.
s is the byte string to decode. The decoded byte string is
returned. binascii.Error is raised if the input is incorrectly
padded or if there are non-alphabet characters present in the
input.
The alphabet uses '-' instead of '+' and '_' instead of '/'.
"""
# s = _bytes_from_decode_data(s)
# s = s.translate(_urlsafe_decode_translation)
# return b64decode(s)
raise NotImplementedError()
# Base32 encoding/decoding must be done in Python
_b32alphabet = {
0: b"A",
9: b"J",
18: b"S",
27: b"3",
1: b"B",
10: b"K",
19: b"T",
28: b"4",
2: b"C",
11: b"L",
20: b"U",
29: b"5",
3: b"D",
12: b"M",
21: b"V",
30: b"6",
4: b"E",
13: b"N",
22: b"W",
31: b"7",
5: b"F",
14: b"O",
23: b"X",
6: b"G",
15: b"P",
24: b"Y",
7: b"H",
16: b"Q",
25: b"Z",
8: b"I",
17: b"R",
26: b"2",
}
_b32tab = [v[0] for k, v in sorted(_b32alphabet.items())]
_b32rev = dict([(v[0], k) for k, v in _b32alphabet.items()])
def b32encode(s):
"""Encode a byte string using Base32.
s is the byte string to encode. The encoded byte string is returned.
"""
if not isinstance(s, bytes_types):
raise TypeError("expected bytes, not %s" % s.__class__.__name__)
quanta, leftover = divmod(len(s), 5)
# Pad the last quantum with zero bits if necessary
if leftover:
s = s + bytes(5 - leftover) # Don't use += !
quanta += 1
encoded = bytearray()
for i in range(quanta):
# c1 and c2 are 16 bits wide, c3 is 8 bits wide. The intent of this
# code is to process the 40 bits in units of 5 bits. So we take the 1
# leftover bit of c1 and tack it onto c2. Then we take the 2 leftover
# bits of c2 and tack them onto c3. The shifts and masks are intended
# to give us values of exactly 5 bits in width.
c1, c2, c3 = struct.unpack("!HHB", s[i * 5 : (i + 1) * 5])
c2 += (c1 & 1) << 16 # 17 bits wide
c3 += (c2 & 3) << 8 # 10 bits wide
encoded += bytes(
[
_b32tab[c1 >> 11], # bits 1 - 5
_b32tab[(c1 >> 6) & 0x1F], # bits 6 - 10
_b32tab[(c1 >> 1) & 0x1F], # bits 11 - 15
_b32tab[c2 >> 12], # bits 16 - 20 (1 - 5)
_b32tab[(c2 >> 7) & 0x1F], # bits 21 - 25 (6 - 10)
_b32tab[(c2 >> 2) & 0x1F], # bits 26 - 30 (11 - 15)
_b32tab[c3 >> 5], # bits 31 - 35 (1 - 5)
_b32tab[c3 & 0x1F], # bits 36 - 40 (1 - 5)
]
)
# Adjust for any leftover partial quanta
if leftover == 1:
encoded = encoded[:-6] + b"======"
elif leftover == 2:
encoded = encoded[:-4] + b"===="
elif leftover == 3:
encoded = encoded[:-3] + b"==="
elif leftover == 4:
encoded = encoded[:-1] + b"="
return bytes(encoded)
def b32decode(s, casefold=False, map01=None):
"""Decode a Base32 encoded byte string.
s is the byte string to decode. Optional casefold is a flag
specifying whether a lowercase alphabet is acceptable as input.
For security purposes, the default is False.
RFC 3548 allows for optional mapping of the digit 0 (zero) to the
letter O (oh), and for optional mapping of the digit 1 (one) to
either the letter I (eye) or letter L (el). The optional argument
map01 when not None, specifies which letter the digit 1 should be
mapped to (when map01 is not None, the digit 0 is always mapped to
the letter O). For security purposes the default is None, so that
0 and 1 are not allowed in the input.
The decoded byte string is returned. binascii.Error is raised if
the input is incorrectly padded or if there are non-alphabet
characters present in the input.
"""
s = _bytes_from_decode_data(s)
quanta, leftover = divmod(len(s), 8)
if leftover:
raise binascii.Error("Incorrect padding")
# Handle section 2.4 zero and one mapping. The flag map01 will be either
# False, or the character to map the digit 1 (one) to. It should be
# either L (el) or I (eye).
if map01 is not None:
map01 = _bytes_from_decode_data(map01)
assert len(map01) == 1, repr(map01)
s = _translate(s, _maketrans(b"01", b"O" + map01))
if casefold:
s = s.upper()
# Strip off pad characters from the right. We need to count the pad
# characters because this will tell us how many null bytes to remove from
# the end of the decoded string.
padchars = s.find(b"=")
if padchars > 0:
padchars = len(s) - padchars
s = s[:-padchars]
else:
padchars = 0
# Now decode the full quanta
parts = []
acc = 0
shift = 35
for c in s:
val = _b32rev.get(c)
if val is None:
raise binascii.Error("Non-base32 digit found")
acc += _b32rev[c] << shift
shift -= 5
if shift < 0:
parts.append(binascii.unhexlify(bytes("%010x" % acc, "ascii")))
acc = 0
shift = 35
# Process the last, partial quanta
last = binascii.unhexlify(bytes("%010x" % acc, "ascii"))
if padchars == 0:
last = b"" # No characters
elif padchars == 1:
last = last[:-1]
elif padchars == 3:
last = last[:-2]
elif padchars == 4:
last = last[:-3]
elif padchars == 6:
last = last[:-4]
else:
raise binascii.Error("Incorrect padding")
parts.append(last)
return b"".join(parts)
# RFC 3548, Base 16 Alphabet specifies uppercase, but hexlify() returns
# lowercase. The RFC also recommends against accepting input case
# insensitively.
def b16encode(s):
"""Encode a byte string using Base16.
s is the byte string to encode. The encoded byte string is returned.
"""
if not isinstance(s, bytes_types):
raise TypeError("expected bytes, not %s" % s.__class__.__name__)
return binascii.hexlify(s).upper()
def b16decode(s, casefold=False):
"""Decode a Base16 encoded byte string.
s is the byte string to decode. Optional casefold is a flag
specifying whether a lowercase alphabet is acceptable as input.
For security purposes, the default is False.
The decoded byte string is returned. binascii.Error is raised if
s were incorrectly padded or if there are non-alphabet characters
present in the string.
"""
s = _bytes_from_decode_data(s)
if casefold:
s = s.upper()
if re.search(b"[^0-9A-F]", s):
raise binascii.Error("Non-base16 digit found")
return binascii.unhexlify(s)
# Legacy interface. This code could be cleaned up since I don't believe
# binascii has any line length limitations. It just doesn't seem worth it
# though. The files should be opened in binary mode.
MAXLINESIZE = 76 # Excluding the CRLF
MAXBINSIZE = (MAXLINESIZE // 4) * 3
def encode(input, output):
"""Encode a file; input and output are binary files."""
while True:
s = input.read(MAXBINSIZE)
if not s:
break
while len(s) < MAXBINSIZE:
ns = input.read(MAXBINSIZE - len(s))
if not ns:
break
s += ns
line = binascii.b2a_base64(s)
output.write(line)
def decode(input, output):
"""Decode a file; input and output are binary files."""
while True:
line = input.readline()
if not line:
break
s = binascii.a2b_base64(line)
output.write(s)
def encodebytes(s):
"""Encode a bytestring into a bytestring containing multiple lines
of base-64 data."""
if not isinstance(s, bytes_types):
raise TypeError("expected bytes, not %s" % s.__class__.__name__)
pieces = []
for i in range(0, len(s), MAXBINSIZE):
chunk = s[i : i + MAXBINSIZE]
pieces.append(binascii.b2a_base64(chunk))
return b"".join(pieces)
def encodestring(s):
"""Legacy alias of encodebytes()."""
import warnings
warnings.warn("encodestring() is a deprecated alias, use encodebytes()", DeprecationWarning, 2)
return encodebytes(s)
def decodebytes(s):
"""Decode a bytestring of base-64 data into a bytestring."""
if not isinstance(s, bytes_types):
raise TypeError("expected bytes, not %s" % s.__class__.__name__)
return binascii.a2b_base64(s)
def decodestring(s):
"""Legacy alias of decodebytes()."""
import warnings
warnings.warn("decodestring() is a deprecated alias, use decodebytes()", DeprecationWarning, 2)
return decodebytes(s)
# Usable as a script...
def main():
"""Small main program"""
import sys, getopt
try:
opts, args = getopt.getopt(sys.argv[1:], "deut")
except getopt.error as msg:
sys.stdout = sys.stderr
print(msg)
print(
"""usage: %s [-d|-e|-u|-t] [file|-]
-d, -u: decode
-e: encode (default)
-t: encode and decode string 'Aladdin:open sesame'"""
% sys.argv[0]
)
sys.exit(2)
func = encode
for o, a in opts:
if o == "-e":
func = encode
if o == "-d":
func = decode
if o == "-u":
func = decode
if o == "-t":
test()
return
if args and args[0] != "-":
with open(args[0], "rb") as f:
func(f, sys.stdout.buffer)
else:
func(sys.stdin.buffer, sys.stdout.buffer)
def test():
s0 = b"Aladdin:open sesame"
print(repr(s0))
s1 = encodebytes(s0)
print(repr(s1))
s2 = decodebytes(s1)
print(repr(s2))
assert s0 == s2
if __name__ == "__main__":
main()

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("The '{}' Bluetooth was not found, Please check device is working".format(mac if name is None else name))
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,235 @@
"""
Bluetooth-HID
Micropython library for the Bluetooth-HID(Compliant with equipment)
=======================================================
@dahanzimin From the Mixly Team
"""
import bluetooth
import struct, time
from micropython import const
from ubinascii import hexlify
from ble_advertising import advertising_payload
from bluetooth import UUID, FLAG_READ, FLAG_WRITE ,FLAG_NOTIFY, FLAG_WRITE_NO_RESPONSE
_IRQ_CENTRAL_CONNECT = const(1)
_IRQ_CENTRAL_DISCONNECT = const(2)
_IRQ_GATTS_WRITE = const(3)
_IRQ_MTU_EXCHANGED = const(21)
_IRQ_CONNECTION_UPDATE = const(27)
_IRQ_GET_SECRET = const(29)
_IRQ_SET_SECRET = const(30)
_IRQ_PASSKEY_ACTION = const(31)
_PASSKEY_ACTION_INPUT = const(2)
_PASSKEY_ACTION_DISP = const(3)
_PASSKEY_ACTION_NUMCMP = const(4)
#HID 鼠标、键盘、手柄设备报告描述符
_HID_INPUT_REPORT = const(b'\x05\x01\t\x02\xa1\x01\x85\x01\t\x01\xa1\x00\x05\t\x19\x01)\x03\x15\x00%\x01\x95\x03u\x01\x81\x02\x95\x01u\x05\x81\x03\x05\x01\t0\t1\t8\x15\x81%\x7fu\x08\x95\x03\x81\x06\xc0\xc0\x05\x01\t\x06\xa1\x01\x85\x02u\x01\x95\x08\x05\x07\x19\xe0)\xe7\x15\x00%\x01\x81\x02\x95\x01u\x08\x81\x01\x95\x05u\x01\x05\x08\x19\x01)\x05\x91\x02\x95\x01u\x03\x91\x01\x95\x06u\x08\x15\x00%e\x05\x07\x19\x00)e\x81\x00\xc0\x05\x01\t\x04\xa1\x01\x85\x03\xa1\x00\t0\t1\x15\x81%\x7fu\x08\x95\x02\x81\x02\x05\t)\x08\x19\x01\x95\x08u\x01%\x01\x15\x00\x81\x02\xc0\xc0')
_KEYCODE = const(b'\x00\x00\x00\x00\x00\x00\x00\x00*+(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00\x00,\x9e\xb4\xa0\xa1\xa2\xa44\xa6\xa7\xa5\xae6-78\'\x1e\x1f !"#$%&\xb33\xb6.\xb7\xb8\x9f\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d/10\xa3\xad5\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\xaf\xb1\xb0\xb5L')
_DIS = (UUID(0x180A), ( (UUID(0x2A24), FLAG_READ),
(UUID(0x2A25), FLAG_READ),
(UUID(0x2A26), FLAG_READ),
(UUID(0x2A27), FLAG_READ),
(UUID(0x2A28), FLAG_READ),
(UUID(0x2A29), FLAG_READ),
(UUID(0x2A50), FLAG_READ), ), )
_BAS = (UUID(0x180F), ( (UUID(0x2A19), FLAG_READ | FLAG_NOTIFY, ((UUID(0x2902), 0x03), (UUID(0x2904), 0x01),)), ), )
_HIDS = (UUID(0x1812), ((UUID(0x2A4A), FLAG_READ),
(UUID(0x2A4B), FLAG_READ),
(UUID(0x2A4C), FLAG_READ | FLAG_WRITE | FLAG_WRITE_NO_RESPONSE),
(UUID(0x2A4D), FLAG_READ | FLAG_NOTIFY, ((UUID(0x2902), 0x03), (UUID(0x2908), 0x03),)), #鼠标
(UUID(0x2A4D), FLAG_READ | FLAG_NOTIFY, ((UUID(0x2902), 0x03), (UUID(0x2908), 0x03),)), #键盘发送
(UUID(0x2A4D), FLAG_READ | FLAG_WRITE, ((UUID(0x2902), 0x03), (UUID(0x2908), 0x03),)), #键盘状态
(UUID(0x2A4D), FLAG_READ | FLAG_NOTIFY, ((UUID(0x2902), 0x03), (UUID(0x2908), 0x03),)), #游戏手柄
(UUID(0x2A4E), FLAG_READ | FLAG_WRITE | FLAG_WRITE_NO_RESPONSE), ), )
class HID:
def __init__(self, name=None, passkey=1234, battery_level=100):
if (name is '') or (name is None):
name = "Mixgo_" + self.mac[-6:].upper()
print("HID Name:", name)
self._ble = bluetooth.BLE()
self._ble.active(True)
self._ble.irq(self._irq)
self._ble.config(gap_name=name)
self._ble.config(mtu=23)
self.device_state = False
self.conn_handle = None
self.passkey = passkey
self.battery_level = battery_level
self.report = b'\x00'
try:
import ble_hid_key
self.keys = ble_hid_key.keys
except:
self.keys = {}
handles = self._ble.gatts_register_services((_DIS, _BAS, _HIDS))
self._service_characteristics(handles)
self._payload = advertising_payload(name=name, services=[UUID(0x1812)], appearance=const(960))
self.advertise()
def _irq(self, event, data):
# Interrupt request callback function
if event == _IRQ_CENTRAL_CONNECT:
self.conn_handle, _, _ = data
print("HID connected:", self.conn_handle)
self.device_state = True
elif event == _IRQ_CENTRAL_DISCONNECT:
self.conn_handle = None
conn_handle, addr_type, addr = data
print("HID disconnected:", conn_handle)
self.advertise()
self.device_state = False
elif event == _IRQ_MTU_EXCHANGED:
conn_handle, mtu = data
self._ble.config(mtu=mtu)
print("MTU exchanged:", mtu)
elif event == _IRQ_CONNECTION_UPDATE:
self.conn_handle, _, _, _, _ = data
print("Connection update")
elif event == _IRQ_PASSKEY_ACTION:
conn_handle, action, passkey = data
print("Passkey action", conn_handle, action, passkey)
if action == _PASSKEY_ACTION_NUMCMP:
self._ble.gap_passkey(conn_handle, action, False)
elif action == _PASSKEY_ACTION_DISP:
print("Displaying passkey")
self._ble.gap_passkey(conn_handle, action, self.passkey)
elif action == _PASSKEY_ACTION_INPUT:
print("Prompting for passkey")
self._ble.gap_passkey(conn_handle, action, None)
else:
print("Unknown action")
elif event == _IRQ_GATTS_WRITE:
conn_handle, attr_handle = data
self.report = self._ble.gatts_read(attr_handle)
elif event == _IRQ_SET_SECRET:
sec_type, key, value = data
key = sec_type, bytes(key)
value = bytes(value) if value else None
#print("Set secret: ", key, value)
if value is None:
if key in self.keys:
del self.keys[key]
self._key_secrets(self.keys)
return True
else:
return False
else:
self.keys[key] = value
self._key_secrets(self.keys)
return True
elif event == _IRQ_GET_SECRET:
sec_type, index, key = data
#print("Get secret: ", sec_type, index, bytes(key) if key else None)
if key is None:
i = 0
for (t, _key), value in self.keys.items():
if t == sec_type:
if i == index:
return value
i += 1
return None
else:
key = sec_type, bytes(key)
return self.keys.get(key, None)
# else:
# print("Unhandled IRQ event: ", event, data)
def _key_secrets(self, keys={}):
"""Save pairing key"""
with open("ble_hid_key.py", "w+") as s_f:
s_f.write("keys=" + str(keys) + "\n")
def _service_characteristics(self, handles):
"""Write BAS&service characteristics."""
(h_mod, h_ser, h_fwr, h_hwr, h_swr, h_man, h_pnp) = handles[0]
(self.h_bat, h_ccc, h_bfmt) = handles[1]
(h_info, h_hid, _, self.m_rep, _, h_d1, self.k_rep, _, h_d2, _, _, h_d3, self.j_rep, _, h_d4, h_proto) = handles[2]
# Write DIS characteristics.
self._ble.gatts_write(h_mod, b'1')
self._ble.gatts_write(h_ser, b'1')
self._ble.gatts_write(h_fwr, b'1')
self._ble.gatts_write(h_hwr, b'1')
self._ble.gatts_write(h_swr, b'1')
self._ble.gatts_write(h_man, b'Homebrew')
self._ble.gatts_write(h_pnp, b'\x01a\xfe\x01\x00#\x01')
# Write BAS characteristics.
self._ble.gatts_write(self.h_bat, struct.pack("<B", self.battery_level))
self._ble.gatts_write(h_bfmt, b'\x04\x00\xad\x27\x01\x00\x00')
self._ble.gatts_write(h_ccc, b'\x00\x00')
# Write service characteristics
self._ble.gatts_write(h_info, b"\x01\x01\x00\x02")
self._ble.gatts_write(h_hid, _HID_INPUT_REPORT)
self._ble.gatts_write(h_d1, b'\x01\x01')
self._ble.gatts_write(h_d2, b'\x02\x01')
self._ble.gatts_write(h_d3, b'\x02\x02')
self._ble.gatts_write(h_d4, b'\x03\x01')
self._ble.gatts_write(h_proto, b"\x01")
def is_connected(self):
'''蓝牙是否连接成功'''
return self.device_state
def advertise(self, interval_us=100000):
'''蓝牙广播'''
print("Starting advertising")
self._ble.gap_advertise(interval_us, adv_data=self._payload)
def battery_notify(self, level):
'''电池电量%'''
if self.is_connected():
self.battery_level = max(min(level, 100), 0)
self._ble.gatts_notify(self.conn_handle, self.h_bat, struct.pack("<B", self.battery_level))
def keyboard_state(self):
'''获取键盘 指示灯状态'''
return int.from_bytes(self.report, 'big')
def keyboard_notify(self, special=0, general=0, release=True):
'''键盘 特殊按键 + 常规组合按键*6'''
if self.is_connected():
_keys = bytearray(6)
if type(general) in (tuple, list):
for i in range(len(general)):
if i > 5: break
_keys[i] = general[i]
else:
_keys[0] = general
self._ble.gatts_notify(self.conn_handle, self.k_rep, bytes([special & 0xFF, 0]) + _keys)
if release:
time.sleep_ms(10)
self._ble.gatts_notify(self.conn_handle, self.k_rep, b'\x00\x00\x00\x00\x00\x00\x00\x00')
def keyboard_str(self, string, delay=0):
'''键盘发送ASCLL码'''
for char in str(string):
char = max(min(ord(char), 127), 0)
self.keyboard_notify( 0x02 if _KEYCODE[char] >> 7 else 0x00, _KEYCODE[char] & 0x7F)
time.sleep_ms(20 + delay)
def mouse_notify(self, keys=0, move=(0, 0), wheel=0, release=True):
'''鼠标 按键*3 + 位移 + 滚轮'''
if self.is_connected():
self._ble.gatts_notify(self.conn_handle, self.m_rep, bytes([keys & 0x0F, move[0] & 0xFF, move[1] & 0xFF, wheel & 0xFF]))
if release:
time.sleep_ms(10)
self._ble.gatts_notify(self.conn_handle, self.m_rep, b'\x00\x00\x00\x00')
def Joystick_notify(self, keys=0, axes=(0, 0), release=False):
'''手柄 按键*8 + 摇杆'''
if self.is_connected():
self._ble.gatts_notify(self.conn_handle, self.j_rep, bytes([axes[0] & 0xFF, axes[1] & 0xFF, keys & 0xFF]))
if release:
time.sleep_ms(10)
self._ble.gatts_notify(self.conn_handle, self.j_rep, b'\x00\x00\x00')
@property
def mac(self):
'''Get mac address'''
return hexlify(self._ble.config('mac')[1]).decode()

View File

@@ -0,0 +1,218 @@
"""
Bluetooth-HID-Keyboard
Micropython library for the Bluetooth-HID-Keyboard
=======================================================
#https://github.com/Heerkog/MicroPythonBLEHID
@dahanzimin From the Mixly Team
"""
import bluetooth
import struct, time
from micropython import const
from ubinascii import hexlify
from ble_advertising import advertising_payload
from bluetooth import UUID, FLAG_READ, FLAG_WRITE ,FLAG_NOTIFY, FLAG_WRITE_NO_RESPONSE
_IRQ_CENTRAL_CONNECT = const(1)
_IRQ_CENTRAL_DISCONNECT = const(2)
_IRQ_GATTS_WRITE = const(3)
_IRQ_MTU_EXCHANGED = const(21)
_IRQ_CONNECTION_UPDATE = const(27)
_IRQ_GET_SECRET = const(29)
_IRQ_SET_SECRET = const(30)
_IRQ_PASSKEY_ACTION = const(31)
_PASSKEY_ACTION_INPUT = const(2)
_PASSKEY_ACTION_DISP = const(3)
_PASSKEY_ACTION_NUMCMP = const(4)
_HID_INPUT_REPORT = const(b'\x05\x01\t\x06\xa1\x01\x85\x01u\x01\x95\x08\x05\x07\x19\xe0)\xe7\x15\x00%\x01\x81\x02\x95\x01u\x08\x81\x01\x95\x05u\x01\x05\x08\x19\x01)\x05\x91\x02\x95\x01u\x03\x91\x01\x95\x06u\x08\x15\x00%e\x05\x07\x19\x00)e\x81\x00\xc0')
_KEYCODE = const(b'\x00\x00\x00\x00\x00\x00\x00\x00*+(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00\x00,\x9e\xb4\xa0\xa1\xa2\xa44\xa6\xa7\xa5\xae6-78\'\x1e\x1f !"#$%&\xb33\xb6.\xb7\xb8\x9f\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d/10\xa3\xad5\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\xaf\xb1\xb0\xb5L')
_DIS = (UUID(0x180A), ( (UUID(0x2A24), FLAG_READ),
(UUID(0x2A25), FLAG_READ),
(UUID(0x2A26), FLAG_READ),
(UUID(0x2A27), FLAG_READ),
(UUID(0x2A28), FLAG_READ),
(UUID(0x2A29), FLAG_READ),
(UUID(0x2A50), FLAG_READ), ), )
_BAS = (UUID(0x180F), ( (UUID(0x2A19), FLAG_READ | FLAG_NOTIFY, (
(UUID(0x2902), 0x01 | 0x02),
(UUID(0x2904), 0x01),)), ), )
_HIDS = (UUID(0x1812), ((UUID(0x2A4A), FLAG_READ),
(UUID(0x2A4B), FLAG_READ),
(UUID(0x2A4C), FLAG_READ | FLAG_WRITE | FLAG_WRITE_NO_RESPONSE),
(UUID(0x2A4D), FLAG_READ | FLAG_NOTIFY, (
(UUID(0x2902), 0x01 | 0x02),
(UUID(0x2908), 0x01 | 0x02),)),
(UUID(0x2A4D), FLAG_READ | FLAG_WRITE, (
(UUID(0x2902), 0x01 | 0x02),
(UUID(0x2908), 0x01 | 0x02),)),
(UUID(0x2A4E), FLAG_READ | FLAG_WRITE | FLAG_WRITE_NO_RESPONSE), ), )
class Keyboard:
def __init__(self, name=None, passkey=1234, battery_level=100):
if (name is '') or (name is None):
name = "Mixgo_" + self.mac[-6:].upper()
print("Keyboard name:", name)
self._ble = bluetooth.BLE()
self._ble.active(True)
self._ble.irq(self._irq)
self._ble.config(gap_name=name)
self._ble.config(mtu=23)
self.device_state = False
self.conn_handle = None
self.passkey = passkey
self.battery_level = battery_level
self.report = b'\x00'
try:
import ble_hid_key
self.keys = ble_hid_key.keys
except:
self.keys = {}
handles = self._ble.gatts_register_services((_DIS, _BAS, _HIDS))
self._service_characteristics(handles)
self._payload = advertising_payload(name=name, services=[UUID(0x1812)], appearance=const(961))
self.advertise()
def _irq(self, event, data):
# Interrupt request callback function
if event == _IRQ_CENTRAL_CONNECT:
self.conn_handle, _, _ = data
print("Keyboard connected: ", self.conn_handle)
self.device_state = True
elif event == _IRQ_CENTRAL_DISCONNECT:
self.conn_handle = None
conn_handle, addr_type, addr = data
print("Keyboard disconnected: ", conn_handle)
self.advertise()
self.device_state = False
elif event == _IRQ_MTU_EXCHANGED:
conn_handle, mtu = data
self._ble.config(mtu=mtu)
print("MTU exchanged: ", mtu)
elif event == _IRQ_CONNECTION_UPDATE:
self.conn_handle, _, _, _, _ = data
print("Connection update")
elif event == _IRQ_PASSKEY_ACTION:
conn_handle, action, passkey = data
print("Passkey action", conn_handle, action, passkey)
if action == _PASSKEY_ACTION_NUMCMP:
self._ble.gap_passkey(conn_handle, action, False)
elif action == _PASSKEY_ACTION_DISP:
print("Displaying passkey")
self._ble.gap_passkey(conn_handle, action, self.passkey)
elif action == _PASSKEY_ACTION_INPUT:
print(" Prompting for passkey")
self._ble.gap_passkey(conn_handle, action, None)
else:
print("unknown action")
elif event == _IRQ_GATTS_WRITE:
conn_handle, attr_handle = data
self.report = self._ble.gatts_read(attr_handle)
elif event == _IRQ_SET_SECRET:
sec_type, key, value = data
key = sec_type, bytes(key)
value = bytes(value) if value else None
#print("Set secret: ", key, value)
if value is None:
if key in self.keys:
del self.keys[key]
self.key_secrets(self.keys)
return True
else:
return False
else:
self.keys[key] = value
self.key_secrets(self.keys)
return True
elif event == _IRQ_GET_SECRET:
sec_type, index, key = data
#print("Get secret: ", sec_type, index, bytes(key) if key else None)
if key is None:
i = 0
for (t, _key), value in self.keys.items():
if t == sec_type:
if i == index:
return value
i += 1
return None
else:
key = sec_type, bytes(key)
return self.keys.get(key, None)
#else:
#print("Unhandled IRQ event: ", event, data)
def key_secrets(self, keys={}):
with open("ble_hid_key.py", "w+") as s_f:
s_f.write("keys=" + str(keys) + "\n")
def _service_characteristics(self, handles):
(h_mod, h_ser, h_fwr, h_hwr, h_swr, h_man, h_pnp) = handles[0]
(self.h_bat, h_ccc, h_bfmt,) = handles[1]
(h_info, h_hid, _, self.h_rep, _, h_d1, _, _, h_d2, h_proto) = handles[2]
# Write DIS characteristics.
self._ble.gatts_write(h_mod, b'1')
self._ble.gatts_write(h_ser, b'1')
self._ble.gatts_write(h_fwr, b'1')
self._ble.gatts_write(h_hwr, b'1')
self._ble.gatts_write(h_swr, b'1')
self._ble.gatts_write(h_man, b'Homebrew')
self._ble.gatts_write(h_pnp, struct.pack("<BHHH", 0x01, 0xFE61, 0x01, 0x0123))
# Write BAS characteristics.
self._ble.gatts_write(self.h_bat, struct.pack("<B", self.battery_level))
self._ble.gatts_write(h_bfmt, b'\x04\x00\xad\x27\x01\x00\x00')
self._ble.gatts_write(h_ccc, b'\x00\x00')
# Write service characteristics
self._ble.gatts_write(h_info, b"\x01\x01\x00\x02")
self._ble.gatts_write(h_hid, _HID_INPUT_REPORT)
self._ble.gatts_write(h_d1, b'\x01\x01')
self._ble.gatts_write(h_d2, b'\x01\x02')
self._ble.gatts_write(h_proto, b"\x01")
def state(self):
return int.from_bytes(self.report, 'big')
def is_connected(self):
return self.device_state
def advertise(self, interval_us=100000):
print("Starting advertising")
self._ble.gap_advertise(interval_us, adv_data=self._payload)
def notify_hid(self, special=0, general=0, release=True):
if self.is_connected():
_keys = bytearray(6)
if type(general) in (tuple, list):
for i in range(len(general)):
if i > 5: break
_keys[i] = general[i]
else:
_keys[0] = general
# Pack the mouse state as described by the input report
self._ble.gatts_notify(self.conn_handle, self.h_rep, bytes([special & 0xFF, 0]) + _keys)
if release:
time.sleep_ms(10)
self._ble.gatts_notify(self.conn_handle, self.h_rep, b'\x00\x00\x00\x00\x00\x00\x00\x00')
def notify_battery(self, level):
if self.is_connected():
self.battery_level = max(min(level, 100), 0)
# Notifies the client by writing to the battery level handle.
self._ble.gatts_notify(self.conn_handle, self.h_bat, struct.pack("<B", self.battery_level))
def notify_str(self, string, delay=0):
for char in str(string):
char = max(min(ord(char), 127), 0)
self.notify_hid( 0x02 if _KEYCODE[char] >> 7 else 0x00, _KEYCODE[char] & 0x7F)
time.sleep_ms(20 + delay)
@property
def mac(self):
'''Get mac address'''
return hexlify(self._ble.config('mac')[1]).decode()

View File

@@ -0,0 +1,193 @@
"""
Bluetooth-HID-Mouse
Micropython library for the Bluetooth-HID-Mouse
=======================================================
#https://github.com/Heerkog/MicroPythonBLEHID
@dahanzimin From the Mixly Team
"""
import bluetooth
import struct, time
from micropython import const
from ubinascii import hexlify
from ble_advertising import advertising_payload
from bluetooth import UUID, FLAG_READ, FLAG_WRITE ,FLAG_NOTIFY, FLAG_WRITE_NO_RESPONSE
_IRQ_CENTRAL_CONNECT = const(1)
_IRQ_CENTRAL_DISCONNECT = const(2)
_IRQ_MTU_EXCHANGED = const(21)
_IRQ_CONNECTION_UPDATE = const(27)
_IRQ_GET_SECRET = const(29)
_IRQ_SET_SECRET = const(30)
_IRQ_PASSKEY_ACTION = const(31)
_PASSKEY_ACTION_INPUT = const(2)
_PASSKEY_ACTION_DISP = const(3)
_PASSKEY_ACTION_NUMCMP = const(4)
_HID_INPUT_REPORT = const(b'\x05\x01\t\x02\xa1\x01\x85\x01\t\x01\xa1\x00\x05\t\x19\x01)\x03\x15\x00%\x01\x95\x03u\x01\x81\x02\x95\x01u\x05\x81\x03\x05\x01\t0\t1\t8\x15\x81%\x7fu\x08\x95\x03\x81\x06\xc0\xc0')
_DIS = (UUID(0x180A), ( (UUID(0x2A24), FLAG_READ),
(UUID(0x2A25), FLAG_READ),
(UUID(0x2A26), FLAG_READ),
(UUID(0x2A27), FLAG_READ),
(UUID(0x2A28), FLAG_READ),
(UUID(0x2A29), FLAG_READ),
(UUID(0x2A50), FLAG_READ), ), )
_BAS = (UUID(0x180F), ( (UUID(0x2A19), FLAG_READ | FLAG_NOTIFY, (
(UUID(0x2902), 0x01 | 0x02),
(UUID(0x2904), 0x01),)), ), )
_HIDS = (UUID(0x1812), ((UUID(0x2A4A), FLAG_READ),
(UUID(0x2A4B), FLAG_READ),
(UUID(0x2A4C), FLAG_READ | FLAG_WRITE | FLAG_WRITE_NO_RESPONSE),
(UUID(0x2A4D), FLAG_READ | FLAG_NOTIFY, (
(UUID(0x2902), 0x01 | 0x02),
(UUID(0x2908), 0x01 | 0x02), )),
(UUID(0x2A4E), FLAG_READ | FLAG_WRITE | FLAG_WRITE_NO_RESPONSE), ), )
class Mouse:
def __init__(self, name=None, passkey=1234, battery_level=100):
if (name is '') or (name is None):
name = "Mixgo_" + self.mac[-6:].upper()
print("Mouse name:", name)
self._ble = bluetooth.BLE()
self._ble.active(True)
self._ble.irq(self._irq)
self._ble.config(gap_name=name)
self._ble.config(mtu=23)
self.device_state = False
self.conn_handle = None
self.passkey = passkey
self.battery_level = battery_level
try:
import ble_hid_key
self.keys = ble_hid_key.keys
except:
self.keys = {}
handles = self._ble.gatts_register_services((_DIS, _BAS, _HIDS))
self._service_characteristics(handles)
self._payload = advertising_payload(name=name, services=[UUID(0x1812)], appearance=const(962))
self.advertise()
def _irq(self, event, data):
# Interrupt request callback function
if event == _IRQ_CENTRAL_CONNECT:
self.conn_handle, _, _ = data
print("Mouse connected: ", self.conn_handle)
self.device_state = True
elif event == _IRQ_CENTRAL_DISCONNECT:
self.conn_handle = None
conn_handle, addr_type, addr = data
print("Mouse disconnected: ", conn_handle)
self.advertise()
self.device_state = False
elif event == _IRQ_MTU_EXCHANGED:
conn_handle, mtu = data
self._ble.config(mtu=mtu)
print("MTU exchanged: ", mtu)
elif event == _IRQ_CONNECTION_UPDATE:
self.conn_handle, _, _, _, _ = data
print("Connection update")
elif event == _IRQ_PASSKEY_ACTION:
conn_handle, action, passkey = data
print("Passkey action", conn_handle, action, passkey)
if action == _PASSKEY_ACTION_NUMCMP:
self._ble.gap_passkey(conn_handle, action, False)
elif action == _PASSKEY_ACTION_DISP:
print("Displaying passkey")
self._ble.gap_passkey(conn_handle, action, self.passkey)
elif action == _PASSKEY_ACTION_INPUT:
print(" Prompting for passkey")
self._ble.gap_passkey(conn_handle, action, None)
else:
print("unknown action")
elif event == _IRQ_SET_SECRET:
sec_type, key, value = data
key = sec_type, bytes(key)
value = bytes(value) if value else None
#print("Set secret: ", key, value)
if value is None:
if key in self.keys:
del self.keys[key]
self.key_secrets(self.keys)
return True
else:
return False
else:
self.keys[key] = value
self.key_secrets(self.keys)
return True
elif event == _IRQ_GET_SECRET:
sec_type, index, key = data
#print("Get secret: ", sec_type, index, bytes(key) if key else None)
if key is None:
i = 0
for (t, _key), value in self.keys.items():
if t == sec_type:
if i == index:
return value
i += 1
return None
else:
key = sec_type, bytes(key)
return self.keys.get(key, None)
#else:
#print("Unhandled IRQ event: ", event, data)
def key_secrets(self, keys={}):
with open("ble_hid_key.py", "w+") as s_f:
s_f.write("keys=" + str(keys) + "\n")
def _service_characteristics(self, handles):
(h_mod, h_ser, h_fwr, h_hwr, h_swr, h_man, h_pnp) = handles[0]
(self.h_bat, h_ccc, h_bfmt,) = handles[1]
(h_info, h_hid, h_ctrl, self.h_rep, _, h_d1, h_proto) = handles[2]
# Write DIS characteristics.
self._ble.gatts_write(h_mod, b'1')
self._ble.gatts_write(h_ser, b'1')
self._ble.gatts_write(h_fwr, b'1')
self._ble.gatts_write(h_hwr, b'1')
self._ble.gatts_write(h_swr, b'1')
self._ble.gatts_write(h_man, b'Homebrew')
self._ble.gatts_write(h_pnp, struct.pack("<BHHH", 0x01, 0xFE61, 0x01, 0x0123))
# Write BAS characteristics.
self._ble.gatts_write(self.h_bat, struct.pack("<B", self.battery_level))
self._ble.gatts_write(h_bfmt, b'\x04\x00\xad\x27\x01\x00\x00')
self._ble.gatts_write(h_ccc, b'\x00\x00')
# Write service characteristics
self._ble.gatts_write(h_info, b"\x01\x01\x00\x02")
self._ble.gatts_write(h_hid, _HID_INPUT_REPORT)
self._ble.gatts_write(self.h_rep, b'\x00\x00\x00\x00')
self._ble.gatts_write(h_d1, b'\x01\x01')
self._ble.gatts_write(h_proto, b"\x01")
def is_connected(self):
return self.device_state
def advertise(self, interval_us=100000):
print("Starting advertising")
self._ble.gap_advertise(interval_us, adv_data=self._payload)
def notify_hid(self, keys=0, move=(0, 0), wheel=0, release=True):
if self.is_connected():
# Pack the mouse state as described by the input report
self._ble.gatts_notify(self.conn_handle, self.h_rep, bytes([keys & 0x0F, move[0] & 0xFF, move[1] & 0xFF, wheel & 0xFF]))
if release:
time.sleep_ms(10)
self._ble.gatts_notify(self.conn_handle, self.h_rep, b'\x00\x00\x00\x00')
def notify_battery(self, level):
if self.is_connected():
self.battery_level = max(min(level, 100), 0)
# Notifies the client by writing to the battery level handle.
self._ble.gatts_notify(self.conn_handle, self.h_bat, struct.pack("<B", self.battery_level))
@property
def mac(self):
'''Get mac address'''
return hexlify(self._ble.config('mac')[1]).decode()

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,117 @@
"""
CBR817
MicroPython library for the CBR817 (Microwave radar sensor)
=======================================================
@dahanzimin From the Mixly Team
"""
import time
from machine import Pin
from micropython import const
CBR_ADDRESS = const(0x71)
CBR_OP_SET = const(0x02)
CBR_TX_RF = const(0x03)
CBR_POWER = const(0x04)
CBR_LIGHT = const(0x0B)
CBR_REG_CTR1 = const(0X13)
CBR_SENSOR_THR = const(0X18)
CBR_NOISE_THR = const(0X1A)
CBR_TRIGER = const(0x1C)
CBR_DELAY_TIM = const(0X1D)
CBR_LOCK_TIM = const(0X20)
CBR_SEL_REG = const(0x23)
CBR_REG_CTR2 = const(0X24)
CBR_FILTER = const(0x2A)
CBR_RESULT = const(0x81)
class CBR817:
def __init__(self, i2c_bus, addr=CBR_ADDRESS, tx_power=3, threshold=5000, noise=256, delay=500, lock=500):
self._device = i2c_bus
self._address = addr
self._configure()
self.tx_power(tx_power)
self.threshold(threshold)
self.noise(noise)
self.delay_ms(delay)
self.lock_ms(lock)
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 _wake(self):
'''Wake up from low power consumption'''
try:
self._wreg(CBR_SEL_REG, 0xC0)
except :
pass
def threshold(self, value=None):
self._wake()
if value is None:
return self._rreg(CBR_SENSOR_THR) | self._rreg(CBR_SENSOR_THR + 1) << 8
else:
self._wreg(CBR_SENSOR_THR, value & 0xFF)
self._wreg(CBR_SENSOR_THR + 1, (value >> 8) & 0xFF)
def noise(self, value=None):
self._wake()
if value is None:
return self._rreg(CBR_NOISE_THR) | self._rreg(CBR_NOISE_THR + 1) << 8
else:
self._wreg(CBR_NOISE_THR, value & 0xFF)
self._wreg(CBR_NOISE_THR + 1, (value >> 8) & 0xFF)
def delay_ms(self, value=None):
self._wake()
if value is None:
return round((self._rreg(CBR_DELAY_TIM) | self._rreg(CBR_DELAY_TIM + 1) << 8 | self._rreg(CBR_DELAY_TIM + 2) << 16) / 32)
else:
value = value * 32
self._wreg(CBR_DELAY_TIM, value & 0xFF)
self._wreg(CBR_DELAY_TIM + 1, (value >> 8) & 0xFF)
self._wreg(CBR_DELAY_TIM + 2, (value >> 16) & 0xFF)
def lock_ms(self, value=None):
self._wake()
if value is None:
return round((self._rreg(CBR_LOCK_TIM) | self._rreg(CBR_LOCK_TIM + 1) << 8 | self._rreg(CBR_LOCK_TIM + 2) << 16) // 32)
else:
value = value * 32
self._wreg(CBR_LOCK_TIM, value & 0xFF)
self._wreg(CBR_LOCK_TIM + 1, (value >> 8) & 0xFF)
self._wreg(CBR_LOCK_TIM + 2, (value >> 16) & 0xFF)
def tx_power(self, value=None):
self._wake()
if value is None:
return self._rreg(CBR_TX_RF) & 0x07
else:
self._wreg(CBR_TX_RF, (value & 0x07) | 0x30)
def _configure(self):
self._wake()
self._wreg(CBR_SEL_REG, 0xC0) #唤醒射频芯片
_star = time.ticks_ms()
while self._rreg(CBR_SEL_REG) != 0xC0:
self._wreg(CBR_SEL_REG, 0xC0)
time.sleep_us(10)
if time.ticks_diff(time.ticks_ms(), _star) >= 200:
raise AttributeError("Cannot find a CBR817")
self._wreg(CBR_TRIGER, 0x55) #连续检测
self._wreg(CBR_LIGHT, 0x12) #关闭光敏
self._wreg(CBR_POWER, 0xA0) #功耗全供电
self._wreg(CBR_FILTER, 0x0F) #打开滤波器
self._wreg(CBR_OP_SET, 0x5C) #单运放0.5uA电流
self._wreg(CBR_REG_CTR1, 0X61) #感应门限和噪声门限改寄存器控制
self._wreg(CBR_REG_CTR2, 0X60) #延时时间和闭锁时间改寄存器控制
def result(self):
self._wake()
return bool(self._rreg(CBR_RESULT) & 0x20)

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')

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