初始化提交

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

View File

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

View File

@@ -0,0 +1,276 @@
import * as Blockly from 'blockly/core';
const ACTUATOR_HUE = 100;
export const actuator_Servo_init = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput()
.appendField("初始化");
this.appendDummyInput()
.appendField("舵机");
this.appendValueInput("PIN", Number)
.appendField("管脚")
.setCheck(Number);
this.appendValueInput('time')
.appendField("定时器")
.setCheck(Number);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip();
}
};
export const actuator_Servo = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput()
.appendField("设置");
this.appendDummyInput()
.appendField("舵机");
this.appendValueInput("PIN", Number)
.appendField("管脚")
.setCheck(Number);
this.appendValueInput('range')
.appendField("角度")
.setCheck(Number);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip();
}
};
export const actuator_PAC9685_init = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput()
.appendField("初始化");
this.appendDummyInput()
.appendField("16路舵机");
this.appendValueInput('address')
.appendField("地址")
.setCheck(Number);
this.appendValueInput('SUB')
.setCheck("var")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("通信");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip("使用PCA9685驱动16路舵机并备注IIC端口");
}
};
export const actuator_PAC9685_Servo = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendDummyInput()
.appendField("设置");
this.appendDummyInput()
.appendField("16路舵机");
this.appendValueInput("index")
.appendField("编号")
.setCheck(Number);
this.appendValueInput('range')
.appendField("角度")
.setCheck(Number);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip("使用PCA9685驱动16路舵机输入编号机角度");
}
};
export const actuator_rgb_init = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput('SUB')
.appendField("初始化")
.setCheck("var");
this.appendValueInput("PIN", Number)
.appendField("管脚")
.setCheck(Number);
this.appendValueInput('num')
.appendField("灯数")
.setCheck(Number);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip();
}
};
export const actuator_rgb_set = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput('SUB')
.appendField("")
.setCheck("var");
this.appendValueInput('num')
.appendField("灯号")
.setCheck(Number);
this.appendValueInput('R')
.appendField("R值")
.setCheck(Number);
this.appendValueInput('G')
.appendField("G值")
.setCheck(Number);
this.appendValueInput('B')
.appendField("B值")
.setCheck(Number);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip();
}
};
export const actuator_rgb_display = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput('SUB')
.appendField("")
.setCheck("var");
this.appendDummyInput()
.appendField("生效");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip();
}
};
export const actuator_ms32006_init = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput('SUB')
.appendField("初始化")
.setCheck("var");
this.appendDummyInput()
.appendField("电机驱动");
this.appendDummyInput()
.appendField("地址")
.appendField(new Blockly.FieldDropdown([['A', 'ms32006.ADDRESS_A'], ['B', 'ms32006.ADDRESS_B']]), 'mode');
this.appendValueInput('SUB1')
.setCheck("var")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("通信");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip("初始化MS32006电机驱动使用I2C通信");
}
};
export const actuator_ms32006_dcmotor = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput('SUB')
.appendField("直流电机")
.setCheck("var");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_Direction)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.CLOCKWISE, "ms32006.MOT_CW"],
[Blockly.Msg.ANTI_CLOCKWISE, "ms32006.MOT_CCW"],
[Blockly.Msg.MOTOR_N, "ms32006.MOT_N"],
[Blockly.Msg.MOTOR_P, "ms32006.MOT_P"]
]), "direction");
this.appendValueInput('speed')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_STEPPER_SET_SPEED);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip("设置直流电机的状态及转速(0-100)");
}
};
export const actuator_ms32006_stepper = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput('SUB')
.appendField("步进电机")
.setCheck("var");
this.appendDummyInput()
.appendField("选择")
.appendField(new Blockly.FieldDropdown([['A', 'ms32006.MOT_A'], ['B', 'ms32006.MOT_B']]), 'mode');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_Direction)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.CLOCKWISE, "ms32006.MOT_CW"],
[Blockly.Msg.ANTI_CLOCKWISE, "ms32006.MOT_CCW"]
]), "direction");
this.appendValueInput('speed')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("转速");
this.appendValueInput('steps')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("步数");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip("设置步进电机的状态、转速、步数(0-2047)");
}
};
//-新20211221------PID算法暂时放此处------------------------------------------//
export const PID_init = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput('SUB')
.setCheck("var")
.appendField("初始化");
this.appendValueInput("P", Number)
.appendField("P值")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("I", Number)
.appendField("I值")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("D", Number)
.appendField("D值")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip("初始化PID算法");
}
};
//-新20211221------PID算法暂时放此处------------------------------------------//
export const PID_get_pid = {
init: function () {
this.setColour(ACTUATOR_HUE);
this.appendValueInput('SUB')
.setCheck("var")
.appendField("");
this.appendDummyInput()
.appendField("运算");
this.appendValueInput("error")
.appendField("偏移量")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("scaler")
.appendField("定标量")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip("根据参数返回运算结果");
}
};

View File

@@ -0,0 +1,360 @@
import * as Blockly from 'blockly/core';
const AI_HUE = "#55839A";
export const tuple_anchor = {
init: function () {
this.setColour(AI_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldTextInput('anchor'), 'VAR')
.appendField('锚点参数= (')
.appendField(new Blockly.FieldTextInput('1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025'), 'TEXT')
.appendField(')');
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("锚点参数");
}
};
export const tuple_calss = {
init: function () {
this.setColour(AI_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldTextInput('calss'), 'VAR')
.appendField('物品名称= [')
.appendField(new Blockly.FieldTextInput("'name1', 'name2', 'name3', 'name4'"), 'TEXT')
.appendField(']');
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("将要识别的物品名称");
}
};
export const KPU_load = {
init: function () {
this.setColour(AI_HUE);
this.appendValueInput('SUB')
.appendField("")
.setCheck("var");
this.appendValueInput('path')
.appendField("模型加载")
.setCheck(Number);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("从flash系统中加载模型");
}
};
export const KPU_load1 = {
init: function () {
this.setColour(AI_HUE);
this.appendValueInput('SUB')
.appendField("")
.setCheck("var");
this.appendValueInput('path')
.appendField("模型路径")
.setCheck(String);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("从文件系统中加载模型");
}
};
export const KPU_init_yolo2 = {
init: function () {
this.setColour(AI_HUE);
this.appendDummyInput("")
.appendField("yolo2")
.appendField("初始化");
this.appendValueInput('SUB')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("网络模型")
.setCheck("var");
this.appendValueInput('threshold')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("概率阈值")
.setCheck(Number);
this.appendValueInput('nms_value')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("box_iou门限")
.setCheck(Number);
this.appendValueInput('anchor_num')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("锚点数")
.setCheck(Number);
this.appendValueInput('anchor')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("锚点参数");
//this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("初始化yolo2网络");
}
};
export const KPU_run_yolo2 = {
init: function () {
this.setColour(AI_HUE);
this.appendDummyInput("")
.appendField("yolo2")
.appendField("运行网络");
this.appendValueInput('SUB')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("模型")
.setCheck("var");
this.appendValueInput('VAR')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("图像");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip("运行yolo2网络");
}
};
export const KPU_forward = {
init: function () {
this.setColour(AI_HUE);
this.appendDummyInput("")
.appendField("yolo2")
.appendField("前向运算");
this.appendValueInput('SUB')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("模型")
.setCheck("var");
this.appendValueInput('VAR')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("图像");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip("运行网络前向运算");
}
};
export const KPU_analysis = {
init: function () {
this.setColour(AI_HUE);
this.appendDummyInput()
.appendField("yolo2")
.appendField("模型解析");
this.appendValueInput('VAR')
.appendField("对象")
.setCheck("var");
this.appendDummyInput()
.appendField("获取")
.appendField(new Blockly.FieldDropdown([
["坐标-x", "x"],
["坐标-y", "y"],
["标识号", "classid"],
["置信度", "value"]
]), "key");
this.setOutput(true);
//this.setInputsInline(true);
this.setTooltip("对于模型解析,获取模型识别结果的目标坐标、标识好、置信度");
}
};
export const aionenet_nic_init = {
init: function () {
this.setColour(AI_HUE);
this.appendDummyInput("")
.appendField("AI_OneNET")
.appendField("连接WiFi");
this.appendValueInput('account')
.appendField("名称")
.setCheck(String);
this.appendValueInput('password')
.appendField("密码")
.setCheck(String);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("AI-Onenet平台 连接WiFi");
}
};
export const aionenet_token = {
init: function () {
this.setColour(AI_HUE);
this.appendDummyInput("")
.appendField("AI_OneNET")
.appendField("获鉴权码");
this.appendValueInput('account')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("账号")
.setCheck(String);
this.appendValueInput('password')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("密码")
.setCheck(String);
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip("AI-Onenet平台 需要注册平台才能使用账号获取用户鉴权码鉴权码一般24小时有效");
}
};
export const aionenet_API = {
init: function () {
this.setColour(AI_HUE);
this.appendDummyInput("")
.appendField("AI_OneNET")
.appendField("调取API");
this.appendValueInput('VAR')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("图像");
this.appendDummyInput()
.appendField("识别")
.appendField(new Blockly.FieldDropdown([
["人脸检测", "FACE_RECO"],
["人脸分析", "FACE_ATTRIBUTE"],
["人体检测", "BODY_RECO"],
["图像抄表", "AMMETER_READ"],
["内容测评", "IDENTIFY_PORN"],
["车牌信息", "NUMBER_PLATE_RECOGNITION"],
["宠物种类", "CAT_DOG_DETECTION"],
["火灾检测", "FIRE_DETECTION"]
]), "api");
this.appendValueInput('token')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("鉴权码")
.setCheck(String);
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip("AI-Onenet平台 调用平台API返回列表识别结果参数");
}
};
export const ailocal_training = {
init: function () {
this.setColour(AI_HUE);
this.appendDummyInput("")
.appendField("AI_Local")
.appendField("模型训练");
this.appendValueInput('calss')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("物品");
this.appendValueInput('sample')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("训练量")
.setCheck(Number);
this.appendValueInput('save')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("保存")
.setCheck(String);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("AI-Local本地模型训练 需要识别的物品名称、每个物品训练数量、保存的名称");
}
};
export const ailocal_loading = {
init: function () {
this.setColour(AI_HUE);
this.appendDummyInput("")
.appendField("AI_Local")
.appendField("模型加载");
this.appendValueInput('path')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("路径")
.setCheck(String);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("AI-Local 加载已经训练好的本地模型");
}
};
export const ailocal_predict = {
init: function () {
this.setColour(AI_HUE);
this.appendDummyInput("")
.appendField("AI_Local")
.appendField("运行模型");
this.appendValueInput('calss')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("物品");
this.appendValueInput('VAR')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("图像");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip("AI-Local 采集图像运行模型将返回识别的物品名、置信度");
}
};
//---开始------------新增---20210302---------------------------------------------------
export const ai_face_init = {
init: function () {
this.setColour(AI_HUE);
this.appendDummyInput("")
.appendField("AI_Face")
.appendField("初始化 加载");
this.appendValueInput('FD')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("模型FD:")
.setCheck(String);
this.appendValueInput('LD')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("模型LD:")
.setCheck(String);
this.appendValueInput('FE')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("模型FE:")
.setCheck(String);
//this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("人脸分辨,初始化");
}
};
export const ai_face_train = {
init: function () {
this.setColour(AI_HUE);
this.appendDummyInput("")
.appendField("AI_Face")
.appendField("运行识别");
this.appendValueInput('names')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("人名");
this.appendValueInput('VAR')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("图象");
this.appendValueInput('threshold')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("阈值")
.setCheck(Number);
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip("人脸分辨识别到人脸返回True无人脸返回False");
}
};
export const ai_face_info = {
init: function () {
this.setColour(AI_HUE);
this.appendDummyInput()
.appendField("AI_Face")
.appendField("识别解析");
this.appendDummyInput()
.appendField("获取")
.appendField(new Blockly.FieldDropdown([
["识别人名", "info_name"],
["置信度 %", "info_score"],
["脸部坐标", "info_face"],
["三官坐标", "info_organs"]
]), "key");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip("人脸分辨,识别到人物名称,置信度,脸部坐标,三官(眼睛x2、鼻子、嘴巴*2)坐标");
}
};
//---开始------------新增---20210302---------------------------------------------------

View File

@@ -0,0 +1,161 @@
import * as Blockly from 'blockly/core';
const AV_HUE = "#2CAAD2";
export const spk_init = {
init: function () {
this.setColour(AV_HUE);
this.appendValueInput('SUB')
.setCheck("var")
.appendField("初始化");
this.appendValueInput("BCK", Number)
.appendField("BCK#")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("WS", Number)
.appendField("WS#")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("DAT", Number)
.appendField("DAT#")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip("初始化配置扬声器,用于语音播放");
}
};
export const mic_init = {
init: function () {
this.setColour(AV_HUE);
this.appendValueInput('SUB')
.setCheck("var")
.appendField("初始化");
// this.appendValueInput("BCK", Number)
// .appendField("BCK#")
// .setCheck(Number)
// .setAlign(Blockly.inputs.Align.RIGHT)
// this.appendValueInput("WS", Number)
// .appendField("WS#")
// .setCheck(Number)
// .setAlign(Blockly.inputs.Align.RIGHT);
// this.appendValueInput("DAT", Number)
// .appendField("DAT#")
// .setCheck(Number)
// .setAlign(Blockly.inputs.Align.RIGHT);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip("初始化配置扬声器,用于语音播放");
}
};
//-新20210329------音频播放-------------------------------------------//
export const audio_play = {
init: function () {
this.setColour(AV_HUE);
this.appendDummyInput()
.appendField("Audio 音频播放");
this.appendValueInput('path')
.appendField("路径")
.setAlign(Blockly.inputs.Align.RIGHT)
.setCheck(String);
this.appendValueInput('SUB')
.setCheck("var")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("设备");
this.appendValueInput('volume')
.appendField("音量(%)")
.setAlign(Blockly.inputs.Align.RIGHT)
.setCheck(Number);
this.setInputsInline(false);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("音频播放");
}
};
//-新20210329------音频录制-------------------------------------------//
export const audio_record = {
init: function () {
this.setColour(AV_HUE);
this.appendDummyInput()
.appendField("Audio 音频录制");
this.appendValueInput('path')
.appendField("路径")
.setAlign(Blockly.inputs.Align.RIGHT)
.setCheck(String);
this.appendValueInput('SUB')
.setCheck("var")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("设备");
this.appendValueInput('time')
.appendField("时长(s)")
.setAlign(Blockly.inputs.Align.RIGHT)
.setCheck(Number);
this.setInputsInline(false);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("音频录制");
}
};
//-新20210329------视频播放-------------------------------------------//
export const video_play = {
init: function () {
this.setColour(AV_HUE);
this.appendDummyInput()
.appendField("Video 视频播放");
this.appendValueInput('path')
.appendField("路径")
.setAlign(Blockly.inputs.Align.RIGHT)
.setCheck(String);
this.appendValueInput('SUB')
.setCheck("var")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("设备");
this.appendValueInput('volume')
.appendField("音量(%)")
.setAlign(Blockly.inputs.Align.RIGHT)
.setCheck(Number);
this.setInputsInline(false);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("视频播放");
}
};
//-新20210329------视频录制-------------------------------------------//
export const video_record = {
init: function () {
this.setColour(AV_HUE);
this.appendDummyInput()
.appendField("Video 视频录制");
this.appendValueInput('path')
.appendField("路径")
.setAlign(Blockly.inputs.Align.RIGHT)
.setCheck(String);
this.appendValueInput('SUB')
.setCheck("var")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("设备");
this.appendValueInput('time')
.appendField("时长(s)")
.setAlign(Blockly.inputs.Align.RIGHT)
.setCheck(Number);
this.setInputsInline(false);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("视频录制");
}
};

View File

@@ -0,0 +1,265 @@
import * as Blockly from 'blockly/core';
const CAMERA_HUE = "#bc9705"; //'#9e77c9'//40;
export const mode = {
init: function () {
this.setColour(CAMERA_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([
["彩色图(YUV422)", "sensor.YUV422"],
["彩色图(RGB565)", "sensor.RGB565"],
["灰度图", "sensor.GRAYSCALE"]
]), "flag");
this.setOutput(true);
this.setTooltip();
}
};
export const size = {
init: function () {
this.setColour(CAMERA_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([
["320x240", "sensor.QVGA"],
["240x240", "sensor.B240X240"],
["128x128", "sensor.B128X128"],
["64x64", "sensor.B64X64"]
]), "flag");
this.setOutput(true);
this.setTooltip();
}
};
export const camera_init = {
init: function () {
this.setColour(CAMERA_HUE);
this.appendDummyInput()
.appendField("Camera")
.appendField("初始化");
this.appendValueInput('key1')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("帧格式");
this.appendValueInput('key2')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("帧大小");
this.appendValueInput('key3')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("图捕捉");
this.appendValueInput('key4')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("跳帧数"); //this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip("初始化摄像头,会自动扫描并获取摄像头型号");
}
};
export const camera_reset = {
init: function () {
this.setColour(CAMERA_HUE);
this.appendDummyInput()
.appendField("Camera");
this.appendDummyInput()
.appendField("初始化");
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip("初始化摄像头,会自动扫描并获取摄像头型号");
}
};
export const camera_set_pixformat = {
init: function () {
this.setColour(CAMERA_HUE);
this.appendDummyInput()
.appendField("Camera");
this.appendValueInput('key')
.appendField("帧格式")
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip("设置摄像头输出格式");
}
};
export const camera_set_framesize = {
init: function () {
this.setColour(CAMERA_HUE);
this.appendDummyInput()
.appendField("Camera");
this.appendValueInput('key')
.appendField("帧大小")
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip("设置摄像头输出帧大小");
}
};
export const camera_run = {
init: function () {
this.setColour(CAMERA_HUE);
this.appendDummyInput()
.appendField("Camera");
this.appendValueInput('key')
.appendField("图捕捉")
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip("开启图像捕捉功能");
}
};
export const camera_skip_frames = {
init: function () {
this.setColour(CAMERA_HUE);
this.appendDummyInput()
.appendField("Camera");
this.appendValueInput('frame')
.appendField("跳帧数")
.setCheck(Number);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip("摄像头跳过指定帧数");
}
};
export const camera_snapshot = {
init: function () {
this.setColour(CAMERA_HUE);
this.appendDummyInput()
.appendField("Camera");
this.appendDummyInput()
.appendField("获取图像");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip("控制摄像头捕捉图像");
}
};
export const camera_shutdown = {
init: function () {
this.setColour(CAMERA_HUE);
this.appendDummyInput()
.appendField("Camera");
this.appendValueInput('key')
.appendField("设为")
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip("启动/关闭摄像头");
}
};
export const camera_set_hmirror = {
init: function () {
this.setColour(CAMERA_HUE);
this.appendDummyInput()
.appendField("Camera");
this.appendValueInput('key')
.appendField("水平镜像")
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip("设置摄像头水平镜像");
}
};
export const camera_set_vflip = {
init: function () {
this.setColour(CAMERA_HUE);
this.appendDummyInput()
.appendField("Camera");
this.appendValueInput('key')
.appendField("垂直镜像")
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip("设置摄像头垂直镜像");
}
};
export const camera_set_colorbar = {
init: function () {
this.setColour(CAMERA_HUE);
this.appendDummyInput()
.appendField("Camera");
this.appendValueInput('key')
.appendField("彩条模式")
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip("将摄像头设置为彩条模式");
}
};
export const camera_getinfo = {
init: function () {
this.setColour(CAMERA_HUE);
this.appendDummyInput()
.appendField("Camera");
this.appendDummyInput()
.appendField("获取")
.appendField(new Blockly.FieldDropdown([
["分辨率宽度", "width"],
["分辨率高度", "height"],
["当前增益值", "get_gain_db"],
["帧缓冲图像", "get_fb"],
["类型型号ID", "get_id"]
]), "key");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip("获取当前摄像头信息");
}
};
export const camera_setmun = {
init: function () {
this.setColour(CAMERA_HUE);
this.appendDummyInput()
.appendField("Camera");
this.appendDummyInput()
.appendField("设置")
.appendField(new Blockly.FieldDropdown([
["对比度", "set_contrast"],
["亮度值", "set_brightness"],
["增益值", "set_auto_gain"],
["饱和度", "set_saturation"]
]), "key");
this.appendValueInput('num')
.appendField("值为")
.setCheck(Number);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip("设置摄像头对比度、亮度、增益、饱和度");
}
};
export const camera_set_windowing = {
init: function () {
this.setColour(CAMERA_HUE);
this.appendDummyInput()
.appendField("Camera");
this.appendDummyInput()
.appendField("设置窗口");
this.appendValueInput('numa')
.appendField("宽为")
.setCheck(Number);
this.appendValueInput('numb')
.appendField("高为")
.setCheck(Number);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip("设置摄像头窗口大小");
}
};

View File

@@ -0,0 +1,453 @@
import * as Blockly from 'blockly/core';
const COMMUNICATE_HUE = 140;
export const communicate_ir_recv = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('PIN')
.appendField(Blockly.Msg.MIXLY_IR_RECEIVE);
this.appendDummyInput()
.appendField("获取编码");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_I2C_SCAN);
}
};
export const communicate_i2c_init = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('SUB')
.appendField("I2C " + Blockly.Msg.MIXLY_SETUP)
.setCheck("var");
this.appendValueInput("TX", Number)
.appendField("SCL#")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("RX", Number)
.appendField("SDA#")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendDummyInput()
.appendField("通道")
.appendField(new Blockly.FieldDropdown([['0', 'I2C0'], ['1', 'I2C1'], ['2', 'I2C2']]), 'mode');
this.appendValueInput('freq')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_FREQUENCY)
.setAlign(Blockly.inputs.Align.RIGHT);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_I2C_INIT);
}
};
//--------新增-------------------------------------------------------
export const communicate_i2s_init = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('SUB')
.setCheck("var")
.appendField("I2S 初始化");
this.appendDummyInput()
.appendField("设备")
.appendField(new Blockly.FieldDropdown([['麦克风', 'mic'], ['扬声器', 'spk']]), 'mode');
this.appendValueInput("BCK", Number)
.appendField("BCK#")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("WS", Number)
.appendField("WS#")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("DAT", Number)
.appendField("DAT#")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput('sample')
.appendField("采样率")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_I2C_INIT);
}
};
// 以下被禁用
export const communicate_i2c_read = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('VAR')
.appendField("I2C")
.setCheck("var");
this.appendValueInput('address')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_ESP32_RNUMBER);
this.appendValueInput('data')
.setCheck(Number)
.appendField(Blockly.Msg.LANG_MATH_BYTE);
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_READ);
}
}
export const communicate_i2c_write = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('VAR')
.appendField("I2C")
.setCheck("var");
this.appendValueInput('address')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_ESP32_WNUMBER);
this.appendValueInput('data')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_VALUE);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_MICROBIT_JS_I2C_WRITE);
}
}
export const communicate_i2c_scan = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('VAR')
.setCheck("var")
.appendField(Blockly.Msg.MIXLY_ESP32_I2C_SCAN1);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_I2C_SCAN2);
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_I2C_SCAN);
}
}
export const communicate_spi_init = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('VAR')
.setCheck('var')
.appendField(Blockly.Msg.MIXLY_ESP32_SPI_INIT);
this.appendValueInput('freq')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_SERIAL_BEGIN);
this.appendValueInput('polarity')
.setCheck(Number)
.appendField('polarity');
this.appendValueInput('phase')
.setCheck(Number)
.appendField('phase');
this.appendValueInput('sck')
.setCheck(Number)
.appendField('SCK');
this.appendValueInput('mosi')
.setCheck(Number)
.appendField('MOSI');
this.appendValueInput('miso')
.setCheck(Number)
.appendField('MISO');
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SPI_INIT_TOOLTIP);
}
};
export const communicate_spi_set = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('VAR')
.setCheck('var')
.appendField(Blockly.Msg.MIXLY_SETTING + " SPI")
this.appendValueInput('data')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_SERIAL_BEGIN);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SPI_SET);
}
};
export const communicate_spi_buffer = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('VAR')
.setCheck('var')
.appendField(Blockly.Msg.MIXLY_ESP32_SET + 'SPI');
this.appendValueInput('data')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_ESP32_SPI_BUFFER);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SPI_BUFFER_SET);
}
};
export const communicate_spi_read = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('VAR')
.setCheck('var')
.appendField('SPI');
this.appendValueInput('data')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_SERIAL_READ);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_4DIGITDISPLAY_NOMBER2 + Blockly.Msg.LANG_MATH_BYTE)
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SPI_READ);
}
}
export const communicate_spi_read_output = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('VAR')
.setCheck('var')
.appendField('SPI');
this.appendValueInput('data')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_SERIAL_READ);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_4DIGITDISPLAY_NOMBER2 + Blockly.Msg.LANG_MATH_BYTE + ',' + Blockly.Msg.MIXLY_ESP32_SPI_OUTPUT);
this.appendValueInput('val')
.setCheck(Number);
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SPI_READ_OUTPUT);
}
}
export const communicate_spi_readinto = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('VAR')
.setCheck('var')
.appendField('SPI');
this.appendValueInput('data')
.setCheck('var')
.appendField(Blockly.Msg.MIXLY_SERIAL_READ + Blockly.Msg.MIXLY_ESP32_SPI_BUFFER);
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SPI_READINTO);
}
}
export const communicate_spi_readinto_output = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('VAR')
.setCheck('var')
.appendField('SPI');
this.appendValueInput('data')
.setCheck('var')
.appendField(Blockly.Msg.MIXLY_SERIAL_READ + Blockly.Msg.MIXLY_ESP32_SPI_BUFFER);
this.appendValueInput('val')
.setCheck(Number)
.appendField(',' + Blockly.Msg.MIXLY_ESP32_SPI_OUTPUT);
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SPI_READINTO_OUTPUT);
}
}
export const communicate_spi_write = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('VAR')
.setCheck('var')
.appendField('SPI');
this.appendValueInput('data')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_ESP32_WRITE);
this.setOutput(true, Number);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SPI_WRITE);
}
};
export const communicate_spi_write_readinto = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('VAR')
.setCheck('var')
.appendField('SPI');
this.appendValueInput('data')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_ESP32_WRITE)
// .appendField(new Blockly.FieldDropdown([
// [Blockly.Msg.LANG_MATH_BYTE, "byte"],
// [Blockly.Msg.MIXLY_ESP32_SPI_BUFFER, "buffer"]
// ]), "op");
this.appendValueInput('val')
.setCheck('var')
.appendField(',' + Blockly.Msg.MIXLY_ESP32_BUFFER_READ);
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SPI_WRITE_READINTO);
}
};
export const communicate_i2c_master_read = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('VAR')
.setCheck("var")
.appendField("I2C");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_READ);
this.setOutput(true, Number);
}
};
export const communicate_i2c_available = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('VAR')
.setCheck("var")
.appendField(Blockly.Msg.MIXLY_ESP32_READ + "I2C");
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_SUCCESS);
this.setOutput(true, Boolean);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_I2C_AVAILABLE);
}
};
export const i2c_slave_onreceive = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_I2C_SLAVE_ONRECEIVE)
.setCheck(Number);
this.appendStatementInput('DO')
.appendField(Blockly.Msg.MIXLY_DO);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};
export const communicate_ow_init = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('VAR')
.setCheck('var')
.appendField('OneWire');
this.appendValueInput('BUS')
.setCheck(Number)
.appendField(Blockly.Msg.MIXLY_SETUP + ' ' + Blockly.Msg.MIXLY_PIN);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_OW_INIT);
}
};
export const communicate_ow_scan = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('VAR')
.setCheck('var')
.appendField('OneWire');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_ONEWIRE_SCAN);
this.setOutput(true, 'List');
this.setTooltip(Blockly.Msg.MIXLY_ESP32_OW_SCAN);
}
};
export const communicate_ow_read = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('VAR')
.setCheck('var')
.appendField('OneWire');
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_ESP32_ONEWIRE_READ);
this.setOutput(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_OW_READ);
}
};
export const communicate_ow_write = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('VAR')
.setCheck('var')
.appendField('OneWire');
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_ESP32_WRITE)
.appendField(new Blockly.FieldDropdown([
[Blockly.Msg.LANG_MATH_STRING, "write"],
[Blockly.Msg.LANG_MATH_BYTE, "writebyte"]
]), "op");
this.appendValueInput('byte')
.setCheck([Number, String]);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_OW_WRITE);
}
};
export const communicate_ow_select = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('VAR')
.setCheck('var')
.appendField(Blockly.Msg.MIXLY_ESP32_ONEWIRE_SELECT)
this.appendValueInput('byte')
.setCheck(String)
.appendField("ROM");
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_OW_SELECT);
}
};
export const communicate_ow_reset = {
init: function () {
this.setColour(COMMUNICATE_HUE);
this.appendValueInput('VAR')
.setCheck('var')
.appendField(Blockly.Msg.MIXLY_ESP32_ONEWIRE_RESET);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setOutput(false);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_OW_RESET);
}
};
export const i2c_init = communicate_i2c_init;
export const i2c_read = communicate_i2c_read;
export const i2c_write = communicate_i2c_write;
export const i2c_scan = communicate_i2c_scan;
export const spi_init = communicate_spi_init;
export const spi_set = communicate_spi_set;
export const spi_buffer = communicate_spi_buffer;
export const spi_read = communicate_spi_read;
export const spi_read_output = communicate_spi_read_output;
export const spi_readinto = communicate_spi_readinto;
export const spi_readinto_output = communicate_spi_readinto_output;
export const spi_write = communicate_spi_write;
export const spi_write_readinto = communicate_spi_write_readinto;
export const i2c_master_reader2 = communicate_i2c_master_read;
export const i2c_available = communicate_i2c_available;

View File

@@ -0,0 +1,273 @@
import * as Blockly from 'blockly/core';
const DISPLAY_HUE = 180; //'#cc6688' //180;
const SENSOR_HUE = 40;
export const angle = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([
["0°", "0"],
["90°", "1"],
["180°", "2"],
["270°", "3"]
]), "flag");
this.setOutput(true);
this.setTooltip();
}
};
export const lcd_color = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([
["黑色", "lcd.BLACK"],
["深蓝色", "lcd.NAVY"],
["蓝色", "lcd.BLUE"],
["深绿色", "lcd.DARKGREEN"],
["深青色", "lcd.DARKCYAN"],
["绿色", "lcd.GREEN"],
["青色", "lcd.CYAN"],
["褐红色", "lcd.MAROON"],
["紫色", "lcd.PURPLE"],
["橄榄色", "lcd.OLIVE"],
["深灰色", "lcd.DARKGREY"],
["绿黄色", "lcd.GREENYELLOW"],
["浅灰色", "lcd.LIGHTGREY"],
["红色", "lcd.RED"],
["洋红色", "lcd.MAGENTA"],
["粉红色", "lcd.PINK"],
["橙色", "lcd.ORANGE"],
["黄色", "lcd.YELLOW"],
["白色", "lcd.WHITE"]
]), "flag");
this.setOutput(true);
this.setTooltip();
}
};
export const on_off = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([
["开启", "1"],
["关闭", "0"]
]), "flag");
this.setOutput(true);
this.setTooltip();
}
};
export const lcd_init = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendDummyInput()
.appendField("LCD 初始化");
this.appendValueInput('freq')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("通信频率")
.setCheck(Number);
this.appendValueInput('color')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("背景颜色")
.setCheck(Number);
//this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("初始化LCD屏幕显示");
}
};
export const lcd_width = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendDummyInput()
.appendField("LCD 获取 ");
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
["宽度", "width"],
["高度", "height"]
]), "key");
this.appendDummyInput()
.appendField("分辨率");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip("获取LCD的宽度/高度(水平分辨率)");
}
};
export const lcd_colour = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendDummyInput()
.appendField("LCD");
this.appendValueInput('key')
.appendField("系统颜色")
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip("获取LCD的宽度/高度(水平分辨率)");
}
};
export const lcd_display = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendDummyInput()
.appendField("LCD 显示图像");
this.appendValueInput('img')
.appendField("");
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("在液晶屏上显示一张imageGRAYSCALE或RGB565");
}
};
export const lcd_clear = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendDummyInput()
.appendField("LCD 清屏颜色");
this.appendValueInput('color')
.appendField("")
.setCheck(Number);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("将液晶屏清空为指定的颜色");
}
};
export const lcd_rotation = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendDummyInput()
.appendField("LCD 屏幕旋转");
this.appendValueInput('key')
.appendField("")
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("设置LCD屏幕方向");
}
};
export const lcd_mirror = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendDummyInput()
.appendField("LCD 镜像显示");
this.appendValueInput('key')
.appendField("")
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip("设置LCD是否镜面显示");
}
};
export const lcd_draw_string = {
init: function () {
this.setColour(DISPLAY_HUE);
this.appendDummyInput()
.appendField("LCD 绘制文本");
this.appendValueInput('x')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("坐标X")
.setCheck(Number);
this.appendValueInput('y')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("坐标Y")
.setCheck(Number);
this.appendValueInput('text')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("文本内容")
.setCheck(String);
this.appendValueInput('color_T')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("文本颜色")
.setCheck(Number);
this.appendValueInput('color_S')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("背景颜色")
.setCheck(Number);
//this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip("在液晶屏上显示文本字符(不支持中文)");
}
};
export const touch_init = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField("Touch 初始化");
this.appendValueInput('I2C')
.appendField("通信")
.setCheck("var");
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("初始化触摸屏");
}
};
export const touch_calibrate = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField("Touch 校准");
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("校准屏幕,使屏幕显示和触摸屏像素能够对应");
}
};
export const touch_read = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField("Touch 获取 ");
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
["状态", "[0]"],
["坐标x", "[1]"],
["坐标y", "[2]"]
]), "key");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip("读取当前屏幕的状态以及按下的点的坐标值");
}
};
//ts.STATUS_IDLE==0
//ts.STATUS_RELEASE==1
//ts.STATUS_PRESS==2
//ts.STATUS_MOVE==3
export const touch_info = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField("Touch 状态");
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
["空闲", "ts.STATUS_IDLE"],
["不按", "ts.STATUS_RELEASE"],
["按下", "ts.STATUS_PRESS"],
["移动", "ts.STATUS_MOVE"]
]), "key");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip("读取当前屏幕的状态以及按下的点的坐标值");
}
};

View File

@@ -0,0 +1,286 @@
import * as Blockly from 'blockly/core';
const FACTORY_HUE = "#777777"; //65;
export const factory_from_import = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput("")
.appendField("from ")
.appendField(new Blockly.FieldTextInput('mixno'), '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 factory_block_notes = {
init: function () {
this.setColour(FACTORY_HUE);
this.appendDummyInput()
.appendField("注解 #");
this.appendDummyInput("")
.appendField(new Blockly.FieldTextInput('Welcome to MixGo'), 'VALUE')
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
}
};

View File

@@ -0,0 +1,200 @@
import * as Blockly from 'blockly/core';
const HEAR_HUE = "#47B670";
export const asrloca_init = {
init: function () {
this.setColour(HEAR_HUE);
this.appendValueInput('SUB')
.appendField("")
.setCheck("var");
this.appendDummyInput()
.appendField("初始化");
this.appendDummyInput("")
.appendField("硅麦")
.appendField(new Blockly.FieldDropdown([
["左声道", "0"],
["右声道", "1"]
]), "KEY");
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("初始化语音识别,及需要麦克风输入通信设备");
}
};
export const asrloca_config = {
/**
* Block for creating a list with any number of elements of any type.
* @this Blockly.Block
*/
init: function () {
this.setColour(HEAR_HUE);
this.appendValueInput('SUB')
.appendField("添加词条")
.setCheck("var");
this.appendDummyInput()
.appendField(new Blockly.FieldLabel("拼音:阈值"), 'TIP')
.setAlign(Blockly.inputs.Align.RIGHT)
this.itemCount_ = 1;
this.updateShape_();
this.setInputsInline(false);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setMutator(new Blockly.icons.MutatorIcon(['iot_publish_item'], this));
this.setTooltip("初始化语音识别,添加语音识别词条,需拼音中间-隔开,阈值");
},
/**
* 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 = [];
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]);
}
}
},
/**
* 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 (var 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')
.setValue("拼音:阈值");
} else {
this.getField('TIP')
.setValue("拼音:阈值");
for (var i = 0; i < this.itemCount_; i++) {
this.appendValueInput('ADD' + i)
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField('“')
.appendField(new Blockly.FieldTextInput(keyNames.length > i ? keyNames[i] : 'ni-hao'), '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 asrloca_recognize = {
init: function () {
this.setColour(HEAR_HUE);
this.appendValueInput('SUB')
.appendField("")
.setCheck("var");
this.appendDummyInput()
.appendField("启动识别 返回结果");
this.setInputsInline(true);
this.setOutput(true, Number);
this.setTooltip("语音识别,获取识别结果");
}
};
export const asrloca_del = {
init: function () {
this.setColour(HEAR_HUE);
this.appendValueInput('SUB')
.appendField("")
.setCheck("var");
this.appendDummyInput()
.appendField("注销识别 内存释放");
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("语音识别,注销语音识别,释放内存");
}
};

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,154 @@
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_init = {
init: function () {
this.setColour(BASE_HUE);
this.appendDummyInput()
.appendField("初始化 ");
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, "GPIO.OUT"],
[Blockly.Msg.MIXLY_Digital_PINMODEIN, "GPIO.IN"],
[Blockly.Msg.MIXLY_PINMODEPULLUP, "GPIO.IN, board.GPIO.PULL_UP"],
[Blockly.Msg.MIXLY_PINMODEPULLDOWN, "GPIO.IN, board.GPIO.PULL_DOWN"]
]), "MODE")
this.appendValueInput("PIN", Number)
.appendField("管脚")
.setCheck(Number);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_DIGITAL_INIT_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("值");
this.setInputsInline(true);
this.setOutput(true, [Boolean, Number]);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_INOUT_DIGITAL_READ_TOOLTIP);
}
};
export const inout_pwm_init = {
init: function () {
this.setColour(BASE_HUE);
this.appendDummyInput()
.appendField("初始化 PWM输出");
this.appendValueInput("PIN", Number)
.appendField("管脚")
.setCheck(Number);
this.appendValueInput('freq')
.appendField("频率")
.setCheck(Number);
this.appendValueInput('VAR')
.appendField("定时器")
.setCheck("var");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip("初始化PWM输出设置需要调用定时器");
}
};
export const inout_pwm_write = {
init: function () {
this.setColour(BASE_HUE);
this.appendValueInput("PIN", Number)
.appendField("PWM输出")
.setCheck(Number);
this.appendValueInput('pwm')
.appendField("占空比")
.setCheck(Number);
this.appendDummyInput()
.appendField("%");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip("PWM输出,值范围为0-100%,可以为小数");
}
};
export const inout_pin_attachInterrupt = {
init: function () {
this.setColour(BASE_HUE);
this.appendDummyInput()
.appendField("硬件中断");
this.appendValueInput("PIN", Number)
.appendField("管键")
.setCheck(Number);
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_MODE)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_RISING, "GPIO.IRQ_RISING"], [Blockly.Msg.MIXLY_FALLING, "GPIO.IRQ_FALLING"], [Blockly.Msg.MIXLY_CHANGE, "GPIO.IRQ_BOTH"]]), "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_pin_disirq = {
init: function () {
this.setColour(BASE_HUE);
this.appendDummyInput()
.appendField("取消中断");
this.appendValueInput("PIN", Number)
.appendField("管键")
.setCheck(Number);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip("取消中断");
}
};

View File

@@ -0,0 +1,306 @@
import * as Blockly from 'blockly/core';
const IOT_HUE = '#637AAC';
export const iot_wifi_connect = {
init: function () {
this.setColour(IOT_HUE);
this.appendDummyInput()
.appendField("OneNET 连接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')
.setAlign(Blockly.inputs.Align.RIGHT)
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_ESP32_ONENET_CLIENT);
this.appendValueInput('SERVER')
.setAlign(Blockly.inputs.Align.RIGHT)
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_ESP32_ONENET_SERVER);
this.appendValueInput('USERNAME')
.setAlign(Blockly.inputs.Align.RIGHT)
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_ESP32_ONENET_USERNAME);
this.appendValueInput('PASSWORD')
.setAlign(Blockly.inputs.Align.RIGHT)
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_ESP32_ONENET_PASSWORD);
this.appendValueInput('TOPIC')
.setAlign(Blockly.inputs.Align.RIGHT)
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_ESP32_ONENET_TOPIC);
this.appendValueInput('SUB')
.setAlign(Blockly.inputs.Align.RIGHT)
.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 = [];
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]);
}
}
},
/**
* 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 (var 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')
.setValue(Blockly.Msg.MIXLY_ESP32_PUBLISH_ONENET_EMPTY);
} else {
this.getField('TIP')
.setValue(Blockly.Msg.MIXLY_ESP32_PUBLISH_ONENET);
for (var 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_wificonnect = iot_wifi_connect;
export const iot_onenetconnect = iot_onenet_connect;
export const iot_onenetdisconnect = iot_onenet_disconnect;
export const iot_checkonenet = iot_onenet_check;
export const iot_publish = iot_onenet_publish;

View File

@@ -0,0 +1,19 @@
const pins = {};
pins['k210'] = {
description: "MicroPython[K210_MixGo AI]",
digital_pin: [["P0", "0"], ["P1", "1"], ["P2", "2"], ["P3", "3"], ["P6", "6"], ["P7", "7"], ["P8", "8"], ["P9", "9"], ["P10", "10"], ["P11", "11"], ["P12", "12"], ["P13", "13"], ["P14", "14"], ["P15", "15"], ["P16", "16"], ["P17", "17"], ["P18", "18"], ["P19", "19"], ["P20", "20"], ["P21", "21"], ["P22", "22"], ["P23", "23"], ["P24", "24"], ["P25", "25"]],
digital: [["P0", "0"], ["P1", "1"], ["P2", "2"], ["P3", "3"], ["P6", "6"], ["P7", "7"], ["P8", "8"], ["P9", "9"], ["P10", "10"], ["P11", "11"], ["P12", "12"], ["P13", "13"], ["P14", "14"], ["P15", "15"], ["P16", "16"], ["P17", "17"], ["P18", "18"], ["P19", "19"], ["P20", "20"], ["P21", "21"], ["P22", "22"], ["P23", "23"], ["P24", "24"], ["P25", "25"], ["P30", "30"], ["P31", "31"], ["P32", "32"], ["P33", "33"], ["P34", "34"], ["P35", "35"]],
button: [["A", "button_a"], ["B", "button_b"]],
axis: [["0", "0"], ["1", "1"], ["2", "2"], ["3", "3"], ["4", "4"]],
exlcdh: [["0", "0"], ["1", "1"], ["2", "2"], ["3", "3"], ["4", "4"], ["5", "5"], ["6", "6"], ["7", "7"], ["8", "8"], ["9", "9"], ["10", "10"], ["11", "11"], ["12", "12"], ["13", "13"], ["14", "14"], ["15", "15"]],
exlcdv: [["0", "0"], ["1", "1"], ["2", "2"], ["3", "3"], ["4", "4"], ["5", "5"], ["6", "6"], ["7", "7"]],
serial_pin: [["pin0", "0"], ["pin1", "1"], ["pin2", "2"], ["pin8", "8"], ["pin12", "12"], ["pin13", "13"], ["pin14", "14"], ["pin15", "15"], ["pin16", "16"]],
radio_power: [['0', '0'], ['1', '1'], ['2', '2'], ['3', '3'], ['4', '4'], ['5', '5'], ['6', '6'], ['7', '7']],
radio_datarate: [["1Mbit", "RATE_1MBIT"], ["250Kbit", "RATE_250KBIT"], ["2Mbit", "RATE_2MBIT"]],
one_more: [["ONE_SHOT", "ONE_SHOT"], ["PERIODIC", "PERIODIC"]],
};
pins["MixGo AI"] = pins["k210"];
export default pins;

View File

@@ -0,0 +1,444 @@
import * as Blockly from 'blockly/core';
const MATH_HUE = 230; //'#e49f16';
Blockly.FieldTextInput.math_number_validator = function (text) {
//return window.isNaN(text) ? null : String(text);
var pattern = /^-?(0X|0x|0O|0o|0B|0b)?[a-fA-F0-9]{1,}(\.[a-fA-F0-9]+)?$/;
return pattern.test(text) ? String(text) : null;//校验,二 八 十 十六进制匹配
// return String(text);//不再校验
};
Blockly.FieldTextInput.math_number_validator_include_blank = function (text) {
if (text === "") {
return "";
}
var pattern = /^-?(0X|0x|0O|0o|0B|0b)?[a-fA-F0-9]{1,}(\.[a-fA-F0-9]+)?$/;
return pattern.test(text) ? String(text) : null;//校验,二 八 十 十六进制匹配
};
export const math_number = {
/**
* Block for numeric value.
* @this Blockly.Block
*/
init: function () {
this.setColour(MATH_HUE);
this.appendDummyInput()
.appendField(new Blockly.FieldTextInput('0',
Blockly.FieldTextInput.math_number_validator), 'NUM');
this.setOutput(true, Number);
this.setTooltip(Blockly.Msg.MATH_NUMBER_TOOLTIP);
}
};
export const math_constant = {
init: function () {
this.setColour(MATH_HUE);
var constant =
[['π', 'pi'], ['e', 'e']];
this.appendDummyInput("")
.appendField(Blockly.Msg.MIXLY_PYTHON_MATH_CONSTANT)
.appendField(new Blockly.FieldDropdown(constant), 'CONSTANT')
this.setOutput(true, Number);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('CONSTANT');
var TOOLTIPS = {
'pi': Blockly.Msg.MIXLY_PYTHON_MATH_CONSTANT_PI_TOOLTIP,
'e': Blockly.Msg.MIXLY_PYTHON_MATH_CONSTANT_E_TOOLTIP
};
return TOOLTIPS[mode];
});
}
};
export const math_arithmetic = {
/**
* Block for basic arithmetic operator.
* @this Blockly.Block
*/
init: function () {
var OPERATORS = [
['+', 'ADD'],
['-', 'MINUS'],
['×', 'MULTIPLY'],
['÷', 'DIVIDE'],
['%', 'QUYU'],
['//', 'ZHENGCHU'],
['**', 'POWER']
];
//this.setHelpUrl(Blockly.Msg.MATH_ARITHMETIC_HELPURL);
this.setColour(MATH_HUE);
this.setOutput(true);
this.appendValueInput('A')
this.appendValueInput('B')
.appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');
this.setInputsInline(true);
// Assign 'this' to a variable for use in the tooltip closure below.
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('OP');
var TOOLTIPS = {
'ADD': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD,
'MINUS': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS,
'MULTIPLY': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY,
'DIVIDE': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE,
'QUYU': Blockly.Msg.MATH_MODULO_TOOLTIP,
'ZHENGCHU': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE,
'POWER': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER
};
return TOOLTIPS[mode];
});
}
};
export const math_selfcalcu = {
/**
* Block for basic arithmetic operator.
* @this Blockly.Block
*/
init: function () {
var OPERATORS = [
['+=', 'ADD'],
['-=', 'MINUS'],
['×=', 'MULTIPLY'],
['÷=', 'DIVIDE'],
['%=', 'QUYU'],
['//=', 'ZHENGCHU'],
['**=', 'POWER']
];
this.setColour(MATH_HUE);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.appendValueInput('A')
this.appendValueInput('B')
.appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');
this.setInputsInline(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('OP');
var TOOLTIPS = {
'ADD': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD,
'MINUS': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS,
'MULTIPLY': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY,
'DIVIDE': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE,
'QUYU': Blockly.Msg.MATH_MODULO_TOOLTIP,
'ZHENGCHU': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE,
'POWER': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER
};
return TOOLTIPS[mode];
});
}
};
export const math_bit = {
init: function () {
var OPERATORS = [
['&', '&'],
['|', '|'],
['>>', '>>'],
['<<', '<<']
];
this.setColour(MATH_HUE);
this.setOutput(true, Number);
this.appendValueInput('A')
.setCheck(Number);
this.appendValueInput('B')
.setCheck(Number)
.appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');
this.setInputsInline(true);
this.setTooltip("位运算");
}
};
export const math_trig = {
/**
* Block for trigonometry operators.
* @this Blockly.Block
*/
init: function () {
var OPERATORS = [
['sin', 'SIN'],
['cos', 'COS'],
['tan', 'TAN'],
['asin', 'ASIN'],
['acos', 'ACOS'],
['atan', 'ATAN'],
['-', '-'],
['ln', 'LN'],
['log10', 'LOG10'],
['e^', 'EXP'],
['10^', 'POW10']
];
//this.setHelpUrl(Blockly.Msg.MATH_TRIG_HELPURL);
this.setColour(MATH_HUE);
this.setOutput(true, Number);
this.appendValueInput('NUM')
.setCheck(Number)
.appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');
// Assign 'this' to a variable for use in the tooltip closure below.
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('OP');
var TOOLTIPS = {
'SIN': Blockly.Msg.MATH_TRIG_TOOLTIP_SIN,
'COS': Blockly.Msg.MATH_TRIG_TOOLTIP_COS,
'TAN': Blockly.Msg.MATH_TRIG_TOOLTIP_TAN,
'ASIN': Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN,
'ACOS': Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS,
'ATAN': Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN,
'LN': Blockly.Msg.MATH_SINGLE_TOOLTIP_LN
};
return TOOLTIPS[mode];
});
}
};
//取整等
export const math_to_int = {
init: function () {
var OPERATORS = [
[Blockly.Msg.LANG_MATH_TO_ROUND, 'round'],
[Blockly.Msg.LANG_MATH_TO_CEIL, 'ceil'],
[Blockly.Msg.LANG_MATH_TO_FLOOR, 'floor'],
[Blockly.Msg.MATH_ABS, 'fabs'],
// [Blockly.Msg.MATH_SQ, 'pow'],
[Blockly.Msg.MATH_SQRT, 'sqrt']
];
this.setColour(MATH_HUE);
this.appendValueInput('A')
.setCheck(Number)
.appendField(new Blockly.FieldDropdown(OPERATORS), 'OP');
this.setOutput(true, Number);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('OP');
var TOOLTIPS = {
'sqrt': Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT,
'fabs': Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS,
'sq': Blockly.Msg.MATH_SINGLE_TOOLTIP_SQ,
'round': Blockly.Msg.MATH_SINGLE_TOOLTIP_ROUND,
'ceil': Blockly.Msg.MATH_SINGLE_TOOLTIP_CEIL,
'floor': Blockly.Msg.MATH_SINGLE_TOOLTIP_FLOOR
};
return TOOLTIPS[mode];
});
}
};
//最大最小值
export const math_max_min = {
init: function () {
var OPERATORS = [
[Blockly.Msg.MIXLY_MAX, 'max'],
[Blockly.Msg.MIXLY_MIN, 'min'],
];
this.setColour(MATH_HUE);
this.appendValueInput('A')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(new Blockly.FieldDropdown(OPERATORS), 'OP')
.appendField('(');
this.appendValueInput('B')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(',');
this.appendDummyInput('')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(')');
this.setInputsInline(true);
this.setOutput(true, Number);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('OP');
var TOOLTIPS = {
'max': Blockly.Msg.MIXLY_TOOLTIP_MATH_MAX,
'min': Blockly.Msg.MIXLY_TOOLTIP_MATH_MIN
};
return TOOLTIPS[mode];
});
}
};
//最大最小值
export const math_max_min1 = {
init: function () {
var OPERATORS = [
[Blockly.Msg.MIXLY_MAX, 'max'],
[Blockly.Msg.MIXLY_MIN, 'min'],
];
this.setColour(MATH_HUE);
this.appendValueInput('LIST')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(new Blockly.FieldDropdown(OPERATORS), 'OP')
this.setOutput(true, Number);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('OP');
var TOOLTIPS = {
'max': Blockly.Msg.MIXLY_TOOLTIP_MATH_MAX,
'min': Blockly.Msg.MIXLY_TOOLTIP_MATH_MIN
};
return TOOLTIPS[mode];
});
}
};
export const math_number_base_conversion = {
init: function () {
var OPERATORS = [
[Blockly.Msg.MATH_TWO, 'two'],
[Blockly.Msg.MATH_EIGHT, 'eight'],
[Blockly.Msg.MATH_TEN, 'ten'],
[Blockly.Msg.MATH_SIXTEEN, 'sixteen']
];
this.setColour(MATH_HUE);
this.appendDummyInput('')
.appendField(Blockly.Msg.MATH_BA)
this.appendValueInput("NUM")
.appendField(new Blockly.FieldDropdown(OPERATORS), 'OP')
.appendField(Blockly.Msg.MATH_JinZhi)
.setCheck(Number);
this.appendDummyInput("")
.appendField(Blockly.Msg.MATH_ZHW)
.appendField(new Blockly.FieldDropdown(OPERATORS), 'OP2')
.appendField(Blockly.Msg.MATH_JinZhi);
this.setFieldValue('ten', 'OP2')
// this.setPreviousStatement(true, null);
// this.setNextStatement(true, null);
this.setOutput(true)
this.setInputsInline(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('OP');
var TOOLTIPS = {
'two': Blockly.Msg.MATH_Before_two,
'eight': Blockly.Msg.MATH_Before_eight,
'ten': Blockly.Msg.MATH_Before_ten,
'sixteen': Blockly.Msg.MATH_Before_sixteen,
};
var mode2 = thisBlock.getFieldValue('OP2');
var TOOLTIPS2 = {
'two': Blockly.Msg.MATH_Behind_two,
'eight': Blockly.Msg.MATH_Behind_eight,
'ten': Blockly.Msg.MATH_Behind_ten,
'sixteen': Blockly.Msg.MATH_Behind_sixteen,
};
return TOOLTIPS[mode] + TOOLTIPS2[mode2];
});
}
};
export const math_random = {
init: function () {
var INT_FLOAT = [[Blockly.Msg.LANG_MATH_INT, 'int'], [Blockly.Msg.LANG_MATH_FLOAT, 'float']];
this.setColour(MATH_HUE);
this.setOutput(true, Number);
this.appendDummyInput()
.appendField(Blockly.Msg.MIXLY_MICROBIT_RANDOM)
.appendField(new Blockly.FieldDropdown(INT_FLOAT), 'TYPE');
this.appendValueInput('FROM')
.setCheck(Number)
.appendField(Blockly.Msg.LANG_CONTROLS_FOR_INPUT_FROM);
this.appendValueInput('TO')
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.LANG_MATH_RANDOM_INT_INPUT_TO);
this.setInputsInline(true);
var thisBlock = this;
this.setTooltip(function () {
var mode = thisBlock.getFieldValue('TYPE');
var TOOLTIPS = {
'int': Blockly.Msg.LANG_MATH_INT,
'float': Blockly.Msg.LANG_MATH_FLOAT_RANDOM
};
return Blockly.Msg.MATH_RANDOM_INT_TOOLTIP + TOOLTIPS[mode];
});
}
};
export const math_constrain = {
/**
* Block for constraining a number between two limits.
* @this Blockly.Block
*/
init: function () {
this.setColour(MATH_HUE);
this.setOutput(true, Number);
this.appendValueInput('VALUE')
.setCheck(Number)
.appendField(Blockly.Msg.LANG_MATH_CONSTRAIN_INPUT_CONSTRAIN);
this.appendValueInput('LOW')
.setCheck(Number)
.appendField(Blockly.Msg.LANG_MATH_CONSTRAIN_INPUT_LOW);
this.appendValueInput('HIGH')
.setCheck(Number)
.appendField(Blockly.Msg.LANG_MATH_CONSTRAIN_INPUT_HIGH);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MATH_CONSTRAIN_TOOLTIP);
}
};
export const math_map = {
init: function () {
this.setColour(MATH_HUE);
this.appendValueInput("NUM", Number)
.appendField(Blockly.Msg.MIXLY_MAP)
.setCheck(Number);
this.appendValueInput("fromLow", Number)
.appendField(Blockly.Msg.MIXLY_MAP_FROM)
.setCheck(Number);
this.appendValueInput("fromHigh", Number)
.appendField(",")
.setCheck(Number);
this.appendValueInput("toLow", Number)
.appendField(Blockly.Msg.MIXLY_MAP_TO)
.setCheck(Number);
this.appendValueInput("toHigh", Number)
.appendField(",")
.setCheck(Number);
this.appendDummyInput("")
.appendField("]");
this.setInputsInline(true);
this.setOutput(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_MATH_MAP);
}
};
export const math_indexer_number = {
/**
* Block for numeric value.
* @this Blockly.Block
*/
init: function () {
this.setColour(MATH_HUE);
this.appendDummyInput()
.appendField(new Blockly.FieldTextInput('0', Blockly.FieldTextInput.math_number_validator_include_blank), 'NUM');
this.setOutput(true);
this.setTooltip(Blockly.Msg.MATH_NUMBER_TOOLTIP);
}
};
export const math_random_seed = {
init: function () {
this.setColour(MATH_HUE);
this.appendValueInput('NUM')
.setCheck(Number)
.appendField(Blockly.Msg.LANG_MATH_RANDOM_SEED);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_MATH_RANDOM_SEED);
}
};
export const base_map = math_map

View File

@@ -0,0 +1,72 @@
import * as Blockly from 'blockly/core';
const GAME_HUE = '#2E9883';
export const nes_joystick_init = {
init: function () {
this.setColour(GAME_HUE);
this.appendDummyInput()
.appendField("NES 初始化");
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("PS2手柄");
this.appendValueInput("miso_pin", Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("DAT#")
.setCheck(Number);
this.appendValueInput("mosi_pin", Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("CMD#")
.setCheck(Number);
this.appendValueInput("cs_pin", Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("SEL#")
.setCheck(Number);
this.appendValueInput("clk_pin", Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("CLK#")
.setCheck(Number);
this.appendValueInput('vol')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("音量")
.setCheck(Number);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("初始化NES,使用PS2手柄控制");
}
};
export const nes_keyboard_init = {
init: function () {
this.setColour(GAME_HUE);
this.appendDummyInput()
.appendField("NES 初始化");
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("UART键盘");
this.appendValueInput('vol')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("音量")
.setCheck(Number);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("初始化NES,使用串口键盘控制");
}
};
export const nes_run = {
init: function () {
this.setColour(GAME_HUE);
this.appendDummyInput()
.appendField("NES 运行游戏");
this.appendValueInput('path')
.appendField("路径")
.setCheck(String);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("运行NES游戏ROM");
}
};

View File

@@ -0,0 +1,249 @@
import * as Blockly from 'blockly/core';
const NETWORK_HUE = '#5B6DA5';
export const network_init = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendDummyInput()
.appendField("ESP-AT 初始化");
this.appendValueInput("RX", Number)
.appendField("RX#")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("TX", Number)
.appendField("TX#")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("使用串口连接ESP-AT设备并初始化配置");
}
};
export const network_scan = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendDummyInput()
.appendField("WiFi扫描");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip("扫描附近可用的WiFi信息-返回多信息列表");
}
};
export const network_connect = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendDummyInput("")
.appendField("WiFi连接");
this.appendValueInput('account')
.appendField("名称")
.setCheck(String);
this.appendValueInput('password')
.appendField("密码")
.setCheck(String);
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("配置WiFi名称及密码连接WiFi上网");
}
};
export const network_ifconfig = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendDummyInput()
.appendField("WiFi")
.appendField(new Blockly.FieldDropdown([
['连接信息', "1"],
['连接状态', "2"]
]), "mode");
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip("查看wifi连接信息或者连接状态");
}
};
export const network_disconnect = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendDummyInput()
.appendField("WiFi断开连接");
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("断开wifi连接");
}
};
export const network_enable_ap = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendDummyInput("")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("打开热点");
this.appendValueInput('account')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("名称")
.setCheck(String);
this.appendValueInput('password')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("密码")
.setCheck(String);
this.appendValueInput('chl')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("通道")
.setCheck(Number);
this.appendDummyInput()
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("加密")
.appendField(new Blockly.FieldDropdown([
['WPA2_PSK', "WPA2_PSK"],
['OPEN', "OPEN"],
['WPA_PSK', "WPA_PSK"],
['WPA_WPA2_PSK', "WPA_WPA2_PSK"]
]), "mode");
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("打开WiFi热点并配置");
}
};
export const network_disable_ap = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendDummyInput()
.appendField("关闭热点");
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("关闭热点");
}
};
//ok
export const network_socket_init = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.appendField('')
.setCheck("var");
this.appendDummyInput()
.appendField("套接字 初始化");
this.setInputsInline(true);
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setTooltip("套接字初始化");
}
};
//ok
export const network_socket_getaddrinfo = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.appendField("")
.setCheck("var");
this.appendDummyInput()
.appendField("获取地址");
this.appendValueInput('addr')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("域名")
.setCheck(String);
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip("套接字根据域名解析地址IP信息");
}
};
//ok
export const network_socket_connect = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.appendField("")
.setCheck("var");
this.appendDummyInput()
.appendField("创建连接");
this.appendValueInput('address')
.appendField("地址");
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip("套接字创建目标IP地址连接");
}
};
//ok
export const network_socket_settimeout = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.appendField("")
.setCheck("var");
this.appendDummyInput()
.appendField("超时时间");
this.appendValueInput('time')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("")
.setCheck(Number);
this.appendDummyInput()
.appendField("s");
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip("设置阻塞套接字超时时间");
}
};
//ok
export const network_socket_send = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.appendField("")
.setCheck("var");
this.appendValueInput('content')
.appendField("发送数据")
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setInputsInline(true);
this.setTooltip("套接发送数据");
}
};
//ok
export const network_socket_receive = {
init: function () {
this.setColour(NETWORK_HUE);
this.appendValueInput('VAR')
.appendField("")
.setCheck("var");
this.appendDummyInput()
.appendField("接收数据");
this.appendValueInput('size')
.appendField("字节")
.setCheck(Number);
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip("套接接收数据,返回接收到的数据对象");
}
};
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);
}
};

View File

@@ -0,0 +1,220 @@
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_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,322 @@
import * as Blockly from 'blockly/core';
const SENSOR_HUE = 40; //'#9e77c9'//40;
export const KEY_SELET = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([
["A", "17"],
["B", "16"]
]), "KEY");
this.setOutput(true);
this.setTooltip();
}
};
export const sensor_button_init = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField("初始化");
this.appendValueInput('key')
.appendField("按键");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setTooltip("初始化按键");
}
};
export const sensor_button_read = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('key')
.appendField("按键");
this.appendDummyInput()
.appendField("被按下?")
this.setInputsInline(true);
this.setOutput(true, [Boolean, Number]);
this.setTooltip("获取按键值");
}
};
export const sensor_dht11 = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendDummyInput()
.appendField("DHT11");
this.appendValueInput("PIN", Number)
.appendField(Blockly.Msg.MIXLY_PIN)
.setCheck(Number);
this.appendDummyInput("")
.appendField("获取")
.appendField(new Blockly.FieldDropdown([
["温度-℃", "0"],
["湿度-%", "1"],
["温湿度", "2"]
]), "TYPE")
this.setInputsInline(true);
this.setOutput(true, Number);
this.setTooltip("dht11,获取温湿度");
}
};
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_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_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_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_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_adxl345_get_acceleration = {
init: function () {
this.setColour(SENSOR_HUE);
this.appendValueInput('SUB')
.appendField("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;
});
}
};

View File

@@ -0,0 +1,341 @@
import * as Blockly from 'blockly/core';
const SERIAL_HUE = 65; //'#58a8de'//65;
export const serial_print = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput("CONTENT", String)
.appendField("Serial")
.appendField(new Blockly.FieldDropdown([['uart1', '1'], ['uart2', '2'], ['uart3', '3']]), 'mode')
.appendField(Blockly.Msg.MIXLY_SERIAL_PRINT);
//this.setFieldValue('1','mode')
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.TEXT_PRINT_TOOLTIP);
}
};
export const serial_println = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput("CONTENT", String)
.appendField("Serial")
.appendField(new Blockly.FieldDropdown([['uart1', '1'], ['uart2', '2'], ['uart3', '3']]), 'mode')
.appendField(Blockly.Msg.MIXLY_SERIAL_PRINTLN);
//this.setFieldValue('1','mode')
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.TEXT_PRINT_Huanhang_TOOLTIP + Blockly.Msg.TEXT_PRINT_TOOLTIP);
}
};
//打印16进制数
export const serial_print_hex = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendDummyInput()
.appendField("Serial")
.appendField(new Blockly.FieldDropdown([['uart1', '1'], ['uart2', '2'], ['uart3', '3']]), 'mode')
.appendField(Blockly.Msg.MIXLY_SERIAL_PRINTLN);
this.appendValueInput("CONTENT", Number)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MATH_BIN, "bin"], [Blockly.Msg.MATH_OCT, "oct"], [Blockly.Msg.MATH_DEC, "int"], [Blockly.Msg.MATH_HEX, "hex"]]), "STAT")
.setCheck(Number);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setInputsInline(true);
this.setFieldValue('hex', 'STAT')
this.setTooltip(Blockly.Msg.TEXT_PRINT_HEX_TOOLTIP);
}
};
export const serial_receive_data_event = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput('char_marker')
.setCheck(String)
.appendField(Blockly.Msg.MIXLY_MICROBIT_JS_SERIAL_WHEN_CONTAIN_DATA)
this.appendStatementInput('DO')
.appendField(Blockly.Msg.MIXLY_DO);
}
};
export const serial_readstr = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendDummyInput()
.appendField("Serial")
.appendField(new Blockly.FieldDropdown([['uart1', '1'], ['uart2', '2'], ['uart3', '3']]), 'mode')
.appendField(Blockly.Msg.MIXLY_SERIAL_READSTR);
//this.setFieldValue('1','mode')
this.setOutput(true, String);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_BLOCKGROUP_SERIAL_READ_STR);
}
};
export const serial_any = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendDummyInput()
.appendField("Serial")
.appendField(new Blockly.FieldDropdown([['uart1', '1'], ['uart2', '2'], ['uart3', '3']]), 'mode')
.appendField(Blockly.Msg.MIXLY_SERIAL_AVAILABLE);
//this.setFieldValue('1','mode')
this.setOutput(true, Boolean);
this.setTooltip(Blockly.Msg.MIXLY_SERIAL_AVAILABLE1);
}
};
export const serial_readline = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendDummyInput()
.appendField("Serial")
.appendField(new Blockly.FieldDropdown([['uart1', '1'], ['uart2', '2'], ['uart3', '3']]), '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_softserial1 = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput("RX", Number)
.appendField(Blockly.Msg.MIXLY_SETUP)
.appendField(new Blockly.FieldDropdown([['uart1', '1'], ['uart2', '2'], ['uart3', '3']]), 'mode')
.appendField("RX#")
.setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT);
this.appendValueInput("TX", Number)
.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 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_mixgoce = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendValueInput("CONTENT")
.appendField("Serial")
.appendField(new Blockly.FieldDropdown([['uart1', '1'], ['uart2', '2'], ['uart3', '3']]), 'mode')
.appendField(Blockly.Msg.MIXLY_EMQX_PUBLISH);
this.appendDummyInput()
.appendField(Blockly.Msg.LANG_CONTROLS_FOR_INPUT_TO + 'MixGo CE')
.appendField(Blockly.Msg.LANG_CONTROLS_WHILEUNTIL_TITLE_REPEAT)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_TRUE, '1'], [Blockly.Msg.MIXLY_TURTLE_WRITE_MOVE_FALSE, '0']]), 'STAT')
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
}
};
export const serial_read_from_mixgoce = {
init: function () {
this.setColour(SERIAL_HUE);
this.appendDummyInput()
.appendField("Serial")
.appendField(new Blockly.FieldDropdown([['uart1', '1'], ['uart2', '2'], ['uart3', '3']]), 'mode')
.appendField(Blockly.Msg.MIXLY_ESP32_READ + 'MixGo CE' + Blockly.Msg.MIXLY_SD_DATA);
this.setOutput(true, Boolean);
}
};

View File

@@ -0,0 +1,199 @@
import * as Blockly from 'blockly/core';
const SYSTEM_HUE = 120//'#EB8045';
export const TIM_SELET = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendDummyInput("")
.appendField(new Blockly.FieldDropdown([
["tim0", "0"],
["tim1", "1"],
["tim2", "2"],
["tim3", "3"],
["tim4", "4"],
["tim5", "5"],
["tim6", "6"],
["tim7", "7"],
["tim8", "8"],
["tim9", "9"],
["tim10", "10"],
["tim11", "11"]
]), "TIM");
this.setOutput(true);
this.setTooltip();
}
};
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 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 system_timer = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendDummyInput("")
.appendField("Timer")
this.appendValueInput('SUB')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("初始化");
this.appendDummyInput("")
.setAlign(Blockly.inputs.Align.RIGHT)
.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("period")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField("周期ms")
.setCheck(Number);
this.appendValueInput('callback')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_DO);
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SYSTEM_TIMER_TOOLTIP);
}
};
export const system_reset = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendDummyInput("")
.appendField("机器复位");
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip("硬件复位");
}
};
export const system_gc_collect = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown([
["自动", "gc.enable()"],
["运行", "gc.collect()"]
]), "gc");
this.appendDummyInput("")
.appendField("垃圾回收");
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip("启用自动垃圾回收");
}
};
export const system_ticks_diff = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendValueInput('END')
// .setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_ESP32_TIME_TICKS_DIFF);
this.appendValueInput('START')
// .setCheck(Number)
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(Blockly.Msg.MIXLY_ESP32_TIME_MINUS);
this.setInputsInline(true);
this.setOutput(true);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SYSTEM_TICKS_DIFF_TOOLTIP);
}
};
export const system_timer_init = {
init: function () {
this.setColour(SYSTEM_HUE);
this.appendDummyInput("")
.appendField("Timer")
this.appendValueInput('SUB')
.appendField("初始化");
this.appendDummyInput()
.appendField("模式")
.appendField(new Blockly.FieldTextInput('PWM触发'), 'PIN_OBJ');
this.setInputsInline(true);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setTooltip(Blockly.Msg.MIXLY_ESP32_SYSTEM_TIMER_INIT_TOOLTIP);
}
};
export const Timer_init = system_timer_init;
export const timer2 = system_timer;
export const time_ticks_diff = system_ticks_diff;
export const base_delay = controls_delay;

View File

@@ -0,0 +1,59 @@
import * as Blockly from 'blockly/core';
const LISTS_HUE = 260; //'#70b234'//260;
const TUPLE_HUE = 195; //'#5ec73d'//195;
const MATH_HUE = 230; //'#e49f16';
const FIELD_COLOUR_CONFIG = {
colourOptions: [
'#ffffff', '#cccccc', '#c0c0c0', '#999999', '#666666', '#333333', '#000000',
'#ffcccc', '#ff6666', '#ff0000', '#cc0000', '#990000', '#660000', '#330000',
'#ffcc99', '#ff9966', '#ff9900', '#ff6600', '#cc6600', '#993300', '#663300',
'#ffff99', '#ffff66', '#ffcc66', '#ffcc33', '#cc9933', '#996633', '#663333',
'#ffffcc', '#ffff33', '#ffff00', '#ffcc00', '#999900', '#666600', '#333300',
'#99ff99', '#66ff99', '#33ff33', '#00ff00', '#33cc00', '#009900', '#006600',
'#99ffff', '#33ffff', '#66cccc', '#00cccc', '#339999', '#336666', '#003333',
'#ccffff', '#66ffff', '#33ccff', '#3366ff', '#0000ff', '#000099', '#000066',
'#ccccff', '#9999ff', '#6666cc', '#6633ff', '#6600cc', '#333399', '#330099',
'#ffccff', '#ff99ff', '#cc66cc', '#cc33cc', '#993399', '#663366', '#330033'
],
columns: 7
};
export const lists_create_with_text1 = {
init: function () {
this.setColour(LISTS_HUE);
this.appendDummyInput("")
.appendField('[')
.appendField(new Blockly.FieldTextInput('0,0,0'), 'TEXT')
.appendField(']');
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXLY_TOOLTIP_LISTS_CREATE_WITH_TEXT2);
}
};
export const tuple_create_with_text3 = {
init: function () {
this.setColour(TUPLE_HUE);
this.appendDummyInput("")
.appendField('(')
.appendField(new Blockly.FieldTextInput('0,0,0'), 'TEXT')
.appendField(')');
this.setOutput(true);
this.setInputsInline(true);
this.setTooltip(Blockly.Msg.MIXPY_TOOLTIP_TUPLE_CREATE_WITH_TEXT);
}
};
export const LCD_color_seclet = {
init: function () {
this.setColour(MATH_HUE);
this.appendDummyInput("")
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField(new Blockly.FieldColour("33ccff", null, FIELD_COLOUR_CONFIG), "COLOR");
this.setInputsInline(true);
this.setOutput(true);
this.setTooltip("颜色");
}
};

View File

@@ -0,0 +1,290 @@
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(1) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/inout.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(1) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/inout2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(2) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/ctrl.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(2) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/ctrl2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(3) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/math.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(3) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/math2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(4) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/logic.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(4) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/logic2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(5) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/text.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(5) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/text2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(6) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/list3.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(6) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/list4.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(7) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/tuple.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(7) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/tuple2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(8) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/dict.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(8) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/dict2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(9) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/set.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(9) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/set2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(10) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/var.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(10) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/var2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(11) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/func.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(11) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/func2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(12) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/store.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(12) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/store2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(13) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/port.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(13) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/port2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(14) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/comuni.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(14) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/comuni2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(15) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/WIFI.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(15) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/WIFi2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(16) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/sensor.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(16) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/sensor2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(17) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/act.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(17) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/act2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(18) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/av.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(18) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/av2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(19) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/camera.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(19) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/camera2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(20) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/monitor.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(20) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/monitor2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(21) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/iot.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(21) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/iot2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(21) > div:nth-child(2) > div:nth-child(1) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/iot3.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(21) > div:nth-child(2) > div:nth-child(1) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/iot2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(22) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/ai.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(22) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/ai2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(23) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/hear.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(23) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/hear2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(24) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/image.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(24) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/image2.png') no-repeat;
background-size: 100% auto;
}
/*子模块的第一个图标(未选中时)*/
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(24) > div:nth-child(2) > div:nth-child(1) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/image.png') no-repeat;
background-size: 100% auto;
}
/*子模块的第一个图标(选中时)*/
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(24) > div:nth-child(2) > div:nth-child(1) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/image2.png') no-repeat;
background-size: 100% auto;
}
/*子模块的第二个图标(未选中时)*/
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(24) > div:nth-child(2) > div:nth-child(2) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/image.png') no-repeat;
background-size: 100% auto;
}
/*子模块的第二个图标(选中时)*/
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(24) > div:nth-child(2) > div:nth-child(2) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/image2.png') no-repeat;
background-size: 100% auto;
}
/*子模块的第三个图标(未选中时)*/
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(24) > div:nth-child(2) > div:nth-child(3) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/image.png') no-repeat;
background-size: 100% auto;
}
/*子模块的第三个图标(选中时)*/
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(24) > div:nth-child(2) > div:nth-child(3) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/image2.png') no-repeat;
background-size: 100% auto;
}
/*子模块的第四个图标(未选中时)*/
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(24) > div:nth-child(2) > div:nth-child(4) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/image.png') no-repeat;
background-size: 100% auto;
}
/*子模块的第四个图标(选中时)*/
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(24) > div:nth-child(2) > div:nth-child(4) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/image2.png') no-repeat;
background-size: 100% auto;
}
/*子模块的第五个图标(未选中时)*/
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(24) > div:nth-child(2) > div:nth-child(5) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/image.png') no-repeat;
background-size: 100% auto;
}
/*子模块的第五个图标(选中时)*/
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(24) > div:nth-child(2) > div:nth-child(5) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/image2.png') no-repeat;
background-size: 100% auto;
}
/*子模块的第六个图标(未选中时)*/
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(24) > div:nth-child(2) > div:nth-child(6) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/image.png') no-repeat;
background-size: 100% auto;
}
/*子模块的第六个图标(选中时)*/
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(24) > div:nth-child(2) > div:nth-child(6) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/image2.png') no-repeat;
background-size: 100% auto;
}
/*子模块的第七个图标(未选中时)*/
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(24) > div:nth-child(2) > div:nth-child(7) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/image.png') no-repeat;
background-size: 100% auto;
}
/*子模块的第七个图标(选中时)*/
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(24) > div:nth-child(2) > div:nth-child(7) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/image2.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(26) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/factory3.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(26) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/factory4.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(27) > div.blocklyTreeRow > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/tool.png') no-repeat;
background-size: 100% auto;
}
div.blocklyToolboxDiv > div.blocklyToolboxContents > div:nth-child(27) > div.blocklyTreeRow.blocklyTreeSelected > div.blocklyTreeRowContentContainer > span.blocklyTreeIcon{
background:url('../../../../common/media/mark/tool2.png') no-repeat;
background-size: 100% auto;
}

View File

@@ -0,0 +1,83 @@
import MicropythonK210MixgoAIPins from './blocks/k210_profile';
import * as MicropythonK210MixgoAIActuatorBlocks from './blocks/actuator';
import * as MicropythonK210MixgoAIAIBlocks from './blocks/ai';
import * as MicropythonK210MixgoAIAVBlocks from './blocks/av';
import * as MicropythonK210MixgoAICameraBlocks from './blocks/camera';
import * as MicropythonK210MixgoAICommunicateBlocks from './blocks/communicate';
import * as MicropythonK210MixgoAIDisplayBlocks from './blocks/display';
import * as MicropythonK210MixgoAIFactoryBlocks from './blocks/factory';
import * as MicropythonK210MixgoAIHearBlocks from './blocks/hear';
import * as MicropythonK210MixgoAIImageBlocks from './blocks/image';
import * as MicropythonK210MixgoAIInoutBlocks from './blocks/inout';
import * as MicropythonK210MixgoAIIotBlocks from './blocks/iot';
import * as MicropythonK210MixgoAIMathBlocks from './blocks/math';
import * as MicropythonK210MixgoAINesBlocks from './blocks/nes';
import * as MicropythonK210MixgoAINetworkBlocks from './blocks/network';
import * as MicropythonK210MixgoAIPinsBlocks from './blocks/pins';
import * as MicropythonK210MixgoAISensorBlocks from './blocks/sensor';
import * as MicropythonK210MixgoAISerialBlocks from './blocks/serial';
import * as MicropythonK210MixgoAISystemBlocks from './blocks/system';
import * as MicropythonK210MixgoAIUpdataBlocks from './blocks/updata';
import * as MicropythonK210MixgoAIActuatorGenerators from './generators/actuator';
import * as MicropythonK210MixgoAIAIGenerators from './generators/ai';
import * as MicropythonK210MixgoAIAVGenerators from './generators/av';
import * as MicropythonK210MixgoAICameraGenerators from './generators/camera';
import * as MicropythonK210MixgoAICommunicateGenerators from './generators/communicate';
import * as MicropythonK210MixgoAIDisplayGenerators from './generators/display';
import * as MicropythonK210MixgoAIFactoryGenerators from './generators/factory';
import * as MicropythonK210MixgoAIHearGenerators from './generators/hear';
import * as MicropythonK210MixgoAIImageGenerators from './generators/image';
import * as MicropythonK210MixgoAIInoutGenerators from './generators/inout';
import * as MicropythonK210MixgoAIIotGenerators from './generators/iot';
import * as MicropythonK210MixgoAIMathGenerators from './generators/math';
import * as MicropythonK210MixgoAINesGenerators from './generators/nes';
import * as MicropythonK210MixgoAINetworkGenerators from './generators/network';
import * as MicropythonK210MixgoAIPinsGenerators from './generators/pins';
import * as MicropythonK210MixgoAISensorGenerators from './generators/sensor';
import * as MicropythonK210MixgoAISerialGenerators from './generators/serial';
import * as MicropythonK210MixgoAISystemGenerators from './generators/system';
import * as MicropythonK210MixgoAIUpdataGenerators from './generators/updata';
export {
MicropythonK210MixgoAIPins,
MicropythonK210MixgoAIActuatorBlocks,
MicropythonK210MixgoAIAIBlocks,
MicropythonK210MixgoAIAVBlocks,
MicropythonK210MixgoAICameraBlocks,
MicropythonK210MixgoAICommunicateBlocks,
MicropythonK210MixgoAIDisplayBlocks,
MicropythonK210MixgoAIFactoryBlocks,
MicropythonK210MixgoAIHearBlocks,
MicropythonK210MixgoAIImageBlocks,
MicropythonK210MixgoAIInoutBlocks,
MicropythonK210MixgoAIIotBlocks,
MicropythonK210MixgoAIMathBlocks,
MicropythonK210MixgoAINesBlocks,
MicropythonK210MixgoAINetworkBlocks,
MicropythonK210MixgoAIPinsBlocks,
MicropythonK210MixgoAISensorBlocks,
MicropythonK210MixgoAISerialBlocks,
MicropythonK210MixgoAISystemBlocks,
MicropythonK210MixgoAIUpdataBlocks,
MicropythonK210MixgoAIActuatorGenerators,
MicropythonK210MixgoAIAIGenerators,
MicropythonK210MixgoAIAVGenerators,
MicropythonK210MixgoAICameraGenerators,
MicropythonK210MixgoAICommunicateGenerators,
MicropythonK210MixgoAIDisplayGenerators,
MicropythonK210MixgoAIFactoryGenerators,
MicropythonK210MixgoAIHearGenerators,
MicropythonK210MixgoAIImageGenerators,
MicropythonK210MixgoAIInoutGenerators,
MicropythonK210MixgoAIIotGenerators,
MicropythonK210MixgoAIMathGenerators,
MicropythonK210MixgoAINesGenerators,
MicropythonK210MixgoAINetworkGenerators,
MicropythonK210MixgoAIPinsGenerators,
MicropythonK210MixgoAISensorGenerators,
MicropythonK210MixgoAISerialGenerators,
MicropythonK210MixgoAISystemGenerators,
MicropythonK210MixgoAIUpdataGenerators
};

View File

@@ -0,0 +1,112 @@
export const actuator_Servo_init = function (_, generator) {
generator.definitions_['import board'] = 'import board';
generator.definitions_['from machine import PWM'] = 'from machine import PWM';
generator.definitions_['from machine import Timer'] = 'from machine import Timer';
var key = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
var Timer = time % 3
var CHANNEL = parseInt(time / 3)
var code1 = 'tim' + time + ' = Timer(Timer.TIMER' + Timer + ',Timer.CHANNEL' + CHANNEL + ', mode=Timer.MODE_PWM)\n';
var code2 = 'pse' + key + '=PWM(tim' + time + ', freq=50, duty=2.5, pin=' + key + ')\n';
return code1 + code2;
}
export const actuator_Servo = function (_, generator) {
generator.definitions_['from machine import PWM'] = 'from machine import PWM';
var key = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var range = generator.valueToCode(this, 'range', generator.ORDER_ATOMIC);
var code = "pse" + key + ".duty(" + range + "/18.0+2.5)\n";
return code;
}
export const actuator_PAC9685_init = function (_, generator) {
generator.definitions_['from servo import Servos'] = 'from servo import Servos';
var address = generator.valueToCode(this, 'address', generator.ORDER_ATOMIC);
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = 'servos=Servos(' + sub + ',address=' + address + ')\n';
return code;
}
export const actuator_PAC9685_Servo = function (_, generator) {
generator.definitions_['from servo import Servos'] = 'from servo import Servos';
var index = generator.valueToCode(this, 'index', generator.ORDER_ATOMIC);
var range = generator.valueToCode(this, 'range', generator.ORDER_ATOMIC);
// var index=index-1;
var code = "servos.position((" + index + "-1)," + range + ")\n";
return code;
}
export const actuator_rgb_init = function (_, generator) {
generator.definitions_['import board'] = 'import board';
generator.definitions_['from modules import ws2812'] = 'from modules import ws2812';
var SUB = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var key = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var num = generator.valueToCode(this, 'num', generator.ORDER_ATOMIC);
var code = '' + SUB + '=ws2812(' + key + ',' + num + ')\n';
return code;
}
export const actuator_rgb_set = function (_, generator) {
var SUB = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var R = generator.valueToCode(this, 'R', generator.ORDER_ATOMIC);
var G = generator.valueToCode(this, 'G', generator.ORDER_ATOMIC);
var B = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC);
var num = generator.valueToCode(this, 'num', generator.ORDER_ATOMIC);
var code = '' + SUB + '.set_led(' + num + ',(' + G + ',' + R + ',' + B + '))\n';
return code;
}
export const actuator_rgb_display = function (_, generator) {
var SUB = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = '' + SUB + '.display()\n';
return code;
}
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;
}
//-新20211221------PID算法暂时放此处------------------------------------------//
export const PID_init = function (_, generator) {
generator.definitions_['import pid'] = 'import pid';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var P = generator.valueToCode(this, 'P', generator.ORDER_ATOMIC);
var I = generator.valueToCode(this, 'I', generator.ORDER_ATOMIC);
var D = generator.valueToCode(this, 'D', generator.ORDER_ATOMIC);
var code = "" + sub + "=pid.PID(" + P + "," + I + "," + D + ")\n";
return code;
}
//-新20211221------PID算法暂时放此处------------------------------------------//
export const PID_get_pid = function (_, generator) {
generator.definitions_['import pid'] = 'import pid';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var error = generator.valueToCode(this, 'error', generator.ORDER_ATOMIC);
var scaler = generator.valueToCode(this, 'scaler', generator.ORDER_ATOMIC);
var code = "" + sub + ".get_pid(" + error + "," + scaler + ")";
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,149 @@
import * as Blockly from 'blockly/core';
export const tuple_anchor = function (_, generator) {
var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),
Blockly.Variables.NAME_TYPE);
var text = this.getFieldValue('TEXT');
var code = varName + '= ' + '(' + text + ')\n';
return code;
}
export const tuple_calss = function (_, generator) {
var varName = generator.variableDB_.getName(this.getFieldValue('VAR'),
Blockly.Variables.NAME_TYPE);
var text = this.getFieldValue('TEXT');
var code = varName + '= ' + '[' + text + ']\n';
return code;
}
export const KPU_load = function (_, generator) {
generator.definitions_['import board'] = 'import board';
generator.definitions_['import_KPU'] = 'import KPU as kpu';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var path = generator.valueToCode(this, 'path', generator.ORDER_ATOMIC);
var code = sub + " = kpu.load(" + path + ")\n";
return code;
}
export const KPU_load1 = function (_, generator) {
generator.definitions_['import board'] = 'import board';
generator.definitions_['import_KPU'] = 'import KPU as kpu';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var path = generator.valueToCode(this, 'path', generator.ORDER_ATOMIC);
var code = sub + " = kpu.load(" + path + ")\n";
return code;
}
export const KPU_init_yolo2 = function (_, generator) {
generator.definitions_['import_KPU'] = 'import KPU as kpu';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var th = generator.valueToCode(this, 'threshold', generator.ORDER_ATOMIC);
var nm = generator.valueToCode(this, 'nms_value', generator.ORDER_ATOMIC);
var an = generator.valueToCode(this, 'anchor_num', generator.ORDER_ATOMIC);
var anchor = generator.valueToCode(this, 'anchor', generator.ORDER_ATOMIC);
var code = "kpu.init_yolo2(" + sub + "," + th + "," + nm + "," + an + "," + anchor + ")\n";
return code;
}
export const KPU_run_yolo2 = function (_, generator) {
generator.definitions_['import_KPU'] = 'import KPU as kpu';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var img = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = "kpu.run_yolo2(" + sub + "," + img + ")";
return [code, generator.ORDER_ATOMIC];
}
export const KPU_forward = function (_, generator) {
generator.definitions_['import_KPU'] = 'import KPU as kpu';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var img = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = "kpu.forward(" + sub + "," + img + ")[:]";
return [code, generator.ORDER_ATOMIC];
}
export const KPU_analysis = function (_, generator) {
generator.definitions_['import_KPU'] = 'import KPU as kpu';
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 aionenet_nic_init = function (_, generator) {
generator.definitions_['import aionenet'] = 'import aionenet';
var account = generator.valueToCode(this, 'account', generator.ORDER_ATOMIC);
var passwor = generator.valueToCode(this, 'password', generator.ORDER_ATOMIC);
var code = "aionenet.nic_init(" + account + "," + passwor + ")\n";
return code;
}
export const aionenet_token = function (_, generator) {
generator.definitions_['import aionenet'] = 'import aionenet';
var account = generator.valueToCode(this, 'account', generator.ORDER_ATOMIC);
var passwor = generator.valueToCode(this, 'password', generator.ORDER_ATOMIC);
var code = "aionenet.token(" + account + "," + passwor + ")";
return [code, generator.ORDER_ATOMIC];
}
export const aionenet_API = function (_, generator) {
generator.definitions_['import aionenet'] = 'import aionenet';
var img = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var token = generator.valueToCode(this, 'token', generator.ORDER_ATOMIC);
var api = this.getFieldValue('api');
var code = 'aionenet.post_ai(' + img + ',"' + api + '",' + token + ')';
return [code, generator.ORDER_ATOMIC];
}
///---------------------------------------------------------------
export const ailocal_training = function (_, generator) {
generator.definitions_['import ailocal'] = 'import ailocal';
var calss = generator.valueToCode(this, 'calss', generator.ORDER_ATOMIC);
var sample = generator.valueToCode(this, 'sample', generator.ORDER_ATOMIC);
var save = generator.valueToCode(this, 'save', generator.ORDER_ATOMIC);
var code = "ailocal.training(" + calss + "," + sample + "," + save + ")\n";
return code;
}
export const ailocal_loading = function (_, generator) {
generator.definitions_['import ailocal'] = 'import ailocal';
var path = generator.valueToCode(this, 'path', generator.ORDER_ATOMIC);
var code = "ailocal.loading(" + path + ")\n";
return code;
}
export const ailocal_predict = function (_, generator) {
generator.definitions_['import ailocal'] = 'import ailocal';
var calss = generator.valueToCode(this, 'calss', generator.ORDER_ATOMIC);
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = "ailocal.predict(" + sub + "," + calss + ")";
return [code, generator.ORDER_ATOMIC];
}
//---开始------------新增---20210302---------------------------------------------------
export const ai_face_init = function (_, generator) {
generator.definitions_['import ai_face'] = 'import ai_face';
var FD = generator.valueToCode(this, 'FD', generator.ORDER_ATOMIC);
var LD = generator.valueToCode(this, 'LD', generator.ORDER_ATOMIC);
var FE = generator.valueToCode(this, 'FE', generator.ORDER_ATOMIC);
var code = "ai_face.init(" + FD + "," + LD + "," + FE + ")\n";
return code;
}
export const ai_face_train = function (_, generator) {
generator.definitions_['import ai_face'] = 'import ai_face';
var img = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var names = generator.valueToCode(this, 'names', generator.ORDER_ATOMIC);
var threshold = generator.valueToCode(this, 'threshold', generator.ORDER_ATOMIC);
var code = 'ai_face.train(' + img + ',' + names + ',' + threshold + ')';
return [code, generator.ORDER_ATOMIC];
}
export const ai_face_info = function (_, generator) {
generator.definitions_['import ai_face'] = 'import ai_face';
var key = this.getFieldValue('key');
var code = 'ai_face.' + key + '()';
return [code, generator.ORDER_ATOMIC];
}
//---开始------------新增---20210302---------------------------------------------------

View File

@@ -0,0 +1,55 @@
export const spk_init = function (_, generator) {
generator.definitions_['import player'] = 'import player';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var BCK = generator.valueToCode(this, 'BCK', generator.ORDER_ATOMIC);
var WS = generator.valueToCode(this, 'WS', generator.ORDER_ATOMIC);
var DAT = generator.valueToCode(this, 'DAT', generator.ORDER_ATOMIC);
var code = "" + sub + "=player.spk_init(" + BCK + "," + WS + "," + DAT + ")\n";
return code;
}
export const mic_init = function (_, generator) {
generator.definitions_['import player'] = 'import player';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
// var BCK = generator.valueToCode(this, 'BCK',generator.ORDER_ATOMIC);
// var WS = generator.valueToCode(this, 'WS',generator.ORDER_ATOMIC);
// var DAT = generator.valueToCode(this, 'DAT',generator.ORDER_ATOMIC);
var code = "" + sub + "=player.mic_init()\n";
return code;
}
export const audio_play = function (_, generator) {
generator.definitions_['import player'] = 'import player';
var path = generator.valueToCode(this, 'path', generator.ORDER_ATOMIC);
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var volume = generator.valueToCode(this, 'volume', generator.ORDER_ATOMIC);
var code = "player.audio_play(" + sub + "," + path + "," + volume + ")\n";
return code;
}
export const audio_record = function (_, generator) {
generator.definitions_['import player'] = 'import player';
var path = generator.valueToCode(this, 'path', generator.ORDER_ATOMIC);
var time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = "player.audio_record(" + sub + "," + path + "," + time + ")\n";
return code;
}
export const video_play = function (_, generator) {
generator.definitions_['import player'] = 'import player';
var path = generator.valueToCode(this, 'path', generator.ORDER_ATOMIC);
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var volume = generator.valueToCode(this, 'volume', generator.ORDER_ATOMIC);
var code = "player.video_play(" + sub + "," + path + "," + volume + ")\n";
return code;
}
export const video_record = function (_, generator) {
generator.definitions_['import player'] = 'import player';
var path = generator.valueToCode(this, 'path', generator.ORDER_ATOMIC);
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
var code = "player.video_record(" + sub + "," + path + "," + time + ")\n";
return code;
}

View File

@@ -0,0 +1,115 @@
export const mode = function (_, generator) {
var code = this.getFieldValue('flag');
return [code, generator.ORDER_ATOMIC];
}
export const size = function (_, generator) {
var code = this.getFieldValue('flag');
return [code, generator.ORDER_ATOMIC];
}
export const camera_init = function (_, generator) {
generator.definitions_['import_sensor'] = 'import sensor';
var key1 = generator.valueToCode(this, 'key1', generator.ORDER_ATOMIC);
var key2 = generator.valueToCode(this, 'key2', generator.ORDER_ATOMIC);
var key3 = generator.valueToCode(this, 'key3', generator.ORDER_ATOMIC);
var key4 = generator.valueToCode(this, 'key4', generator.ORDER_ATOMIC);
var code1 = "sensor.reset()\n";
var code2 = "sensor.set_pixformat(" + key1 + ")\n";
var code3 = "sensor.set_framesize(" + key2 + ")\n";
var code4 = "sensor.run(" + key3 + ")\n";
var code5 = "sensor.skip_frames(" + key4 + ")\n";
var code = code1 + code2 + code3 + code4 + code5;
return code;
}
export const camera_reset = function (_, generator) {
generator.definitions_['import_sensor'] = 'import sensor';
var code = "sensor.reset()\n";
return code;
}
export const camera_set_pixformat = function (_, generator) {
generator.definitions_['import_sensor'] = 'import sensor';
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var code = "sensor.set_pixformat(" + key + ")\n";
return code;
}
export const camera_set_framesize = function (_, generator) {
generator.definitions_['import_sensor'] = 'import sensor';
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var code = "sensor.set_framesize(" + key + ")\n";
return code;
}
export const camera_run = function (_, generator) {
generator.definitions_['import_sensor'] = 'import sensor';
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var code = "sensor.run(" + key + ")\n";
return code;
}
export const camera_skip_frames = function (_, generator) {
generator.definitions_['import_sensor'] = 'import sensor';
var frame = generator.valueToCode(this, 'frame', generator.ORDER_ATOMIC);
var code = "sensor.skip_frames(n=" + frame + ")\n";
return code;
}
export const camera_snapshot = function (_, generator) {
generator.definitions_['import_sensor'] = 'import sensor';
var code = 'sensor.snapshot()';
return [code, generator.ORDER_ATOMIC];
}
export const camera_shutdown = function (_, generator) {
generator.definitions_['import_sensor'] = 'import sensor';
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var code = "sensor.shutdown(" + key + ")\n";
return code;
}
export const camera_set_hmirror = function (_, generator) {
generator.definitions_['import_sensor'] = 'import sensor';
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var code = "sensor.set_hmirror(" + key + ")\n";
return code;
}
export const camera_set_vflip = function (_, generator) {
generator.definitions_['import_sensor'] = 'import sensor';
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var code = "sensor.set_vflip(" + key + ")\n";
return code;
}
export const camera_set_colorbar = function (_, generator) {
generator.definitions_['import_sensor'] = 'import sensor';
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var code = "sensor.set_colorbar(" + key + ")\n";
return code;
}
export const camera_getinfo = function (_, generator) {
generator.definitions_['import_sensor'] = 'import sensor';
var key = this.getFieldValue('key');
var code = "sensor." + key + "()";
return [code, generator.ORDER_ATOMIC];
}
export const camera_setmun = function (_, generator) {
generator.definitions_['import_sensor'] = 'import sensor';
var key = this.getFieldValue('key');
var num = generator.valueToCode(this, 'num', generator.ORDER_ATOMIC);
var code = "sensor." + key + "(" + num + ")\n";
return code;
}
export const camera_set_windowing = function (_, generator) {
generator.definitions_['import_sensor'] = 'import sensor';
var numa = generator.valueToCode(this, 'numa', generator.ORDER_ATOMIC);
var numb = generator.valueToCode(this, 'numb', generator.ORDER_ATOMIC);
var code = "sensor.set_windowing((" + numa + "," + numb + "))\n";
return code;
}

View File

@@ -0,0 +1,177 @@
export const communicate_ir_recv = function (_, generator) {
generator.definitions_['import irremote'] = 'import irremote';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
return ["irremote.read_id(" + pin + ")", generator.ORDER_ATOMIC];
}
export const communicate_i2c_init = function (_, generator) {
generator.definitions_['from machine import I2C'] = 'from machine import I2C';
var mode = this.getFieldValue('mode');
var freq = generator.valueToCode(this, 'freq', generator.ORDER_ATOMIC);
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var sda = generator.valueToCode(this, 'RX', generator.ORDER_ATOMIC);
var scl = generator.valueToCode(this, 'TX', generator.ORDER_ATOMIC);
return "" + sub + " = I2C(I2C." + mode + ", freq=" + freq + ", scl=" + scl + ", sda=" + sda + ")\n";
}
export const communicate_i2s_init = function (_, generator) {
generator.definitions_['import player'] = 'import player';
var mode = this.getFieldValue('mode');
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var BCK = generator.valueToCode(this, 'BCK', generator.ORDER_ATOMIC);
var WS = generator.valueToCode(this, 'WS', generator.ORDER_ATOMIC);
var DAT = generator.valueToCode(this, 'DAT', generator.ORDER_ATOMIC);
var sample = generator.valueToCode(this, 'sample', generator.ORDER_ATOMIC);
var code = "" + sub + "=player." + mode + "_init(" + BCK + "," + WS + "," + DAT + "," + sample + ")\n";
return code;
}
//--------新增-------------------------------------------------------
export const communicate_i2c_read = function (_, 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 (_, 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 (_, generator) {
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
return ["" + name + ".scan()", generator.ORDER_ATOMIC];
}
export const communicate_i2c_master_read = function (_, 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 (_, 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 (_, 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 (_, 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 polarity = generator.valueToCode(this, 'polarity', generator.ORDER_ATOMIC);
var phase = generator.valueToCode(this, 'phase', 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.SPI(baudrate=" + freq + ", polarity=" + polarity + ", phase=" + phase + ", sck=machine.Pin(" + sck + "), mosi=machine.Pin(" + mosi + "), miso=machine.Pin(" + miso + "));\n";
}
export const communicate_spi_set = function (_, generator) {
var data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC);
return "spi.init(baudrate=" + data + ")\n";
}
export const communicate_spi_buffer = function (_, 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 (_, 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 (_, 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 (_, 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 (_, 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 (_, 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 (_, 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 (_, 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 (_, 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 (_, generator) {
var name = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = "" + name + ".reset()\n";
return code;
}
export const communicate_ow_read = function (_, 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 (_, 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 (_, 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;
}

View File

@@ -0,0 +1,105 @@
export const angle = function (_, generator) {
var code = this.getFieldValue('flag');
return [code, generator.ORDER_ATOMIC];
}
export const lcd_color = function (_, generator) {
var code = this.getFieldValue('flag');
return [code, generator.ORDER_ATOMIC];
}
export const on_off = function (_, generator) {
var code = this.getFieldValue('flag');
return [code, generator.ORDER_ATOMIC];
}
export const lcd_init = function (_, generator) {
generator.definitions_['import board'] = 'import board';
generator.definitions_['import_lcd'] = 'import lcd';
var freq = generator.valueToCode(this, 'freq', generator.ORDER_ATOMIC);
var color = generator.valueToCode(this, 'color', generator.ORDER_ATOMIC);
var code = "lcd.init(freq=" + freq + ",color=" + color + ")\n";
return code;
}
export const lcd_colour = function (_, generator) {
generator.definitions_['import_lcd'] = 'import lcd';
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var code = "" + key + "";
return [code, generator.ORDER_ATOMIC];
}
export const lcd_width = function (_, generator) {
generator.definitions_['import_lcd'] = 'import lcd';
var key = this.getFieldValue('key');
var code = 'lcd.' + key + '()';
return [code, generator.ORDER_ATOMIC];
}
export const lcd_display = function (_, generator) {
generator.definitions_['import_lcd'] = 'import lcd';
var img = generator.valueToCode(this, 'img', generator.ORDER_ATOMIC);
var code = "lcd.display(" + img + ")\n";
return code;
}
export const lcd_clear = function (_, generator) {
generator.definitions_['import_lcd'] = 'import lcd';
var color = generator.valueToCode(this, 'color', generator.ORDER_ATOMIC);
var code = "lcd.clear(" + color + ")\n";
return code;
}
export const lcd_rotation = function (_, generator) {
generator.definitions_['import_lcd'] = 'import lcd';
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var code = "lcd.rotation(" + key + ")\n";
return code;
}
export const lcd_mirror = function (_, generator) {
generator.definitions_['import_lcd'] = 'import lcd';
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var code = "lcd.mirror(" + key + ")\n";
return code;
}
export const lcd_draw_string = function (_, generator) {
generator.definitions_['import_lcd'] = 'import lcd';
var x = generator.valueToCode(this, 'x', generator.ORDER_ATOMIC);
var y = generator.valueToCode(this, 'y', generator.ORDER_ATOMIC);
var tex = generator.valueToCode(this, 'text', generator.ORDER_ATOMIC);
var color_T = generator.valueToCode(this, 'color_T', generator.ORDER_ATOMIC);
var color_S = generator.valueToCode(this, 'color_S', generator.ORDER_ATOMIC);
var code = "lcd.draw_string(" + x + "," + y + "," + tex + "," + color_T + "," + color_S + ")\n";
return code;
}
export const touch_init = function (_, generator) {
generator.definitions_['import_touchscreen'] = 'import touchscreen as ts';
var I2C = generator.valueToCode(this, 'I2C', generator.ORDER_ATOMIC);
var code = "ts.init(" + I2C + ")\n";
return code;
}
export const touch_calibrate = function (_, generator) {
generator.definitions_['import_touchscreen'] = 'import touchscreen as ts';
var code = "ts.calibrate()\n";
return code;
}
export const touch_read = function (_, generator) {
generator.definitions_['import_touchscreen'] = 'import touchscreen as ts';
var key = this.getFieldValue('key');
var code = 'ts.read()' + key + '';
return [code, generator.ORDER_ATOMIC];
}
export const touch_info = function (_, generator) {
generator.definitions_['import_touchscreen'] = 'import touchscreen as ts';
var key = this.getFieldValue('key');
var code = '' + key + '';
return [code, generator.ORDER_ATOMIC];
}
/**/

View File

@@ -0,0 +1,91 @@
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 factory_block_notes = function () {
var VALUE = this.getFieldValue('VALUE');
return '#' + VALUE + '\n';
}

View File

@@ -0,0 +1,44 @@
export const asrloca_init = function (_, generator) {
generator.definitions_['import asrloca'] = 'import asrloca';
var SUB = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var KEY = this.getFieldValue('KEY');
var code = SUB + "=asrloca.ASR_init(" + KEY + ")\n";
return code;
}
export const asrloca_config = function (_, generator) {
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, 'SUB', generator.ORDER_ATOMIC);
for (var n = 0; n < this.itemCount_; n++) {
var keyName = this.getFieldValue('KEY' + n);
ck[n] = keyName
}
for (var n = 0; n < this.itemCount_; n++) {
cv[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || default_value;
}
var code = v + ".config({";
for (var n = 0; n < this.itemCount_; n++) {
ct[n] = "'" + ck[n] + "'" + ': ' + cv[n]
}
code = code + ct.join(', ') + "})\n";
return code;
}
export const asrloca_recognize = function (_, generator) {
var SUB = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = SUB + ".recognize()";
return [code, generator.ORDER_ATOMIC];
}
export const asrloca_del = function (_, generator) {
var SUB = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = SUB + ".__del__()";
return code;
}

View File

@@ -0,0 +1,595 @@
export const true_false = function (_, generator) {
var code = this.getFieldValue('flag');
return [code, generator.ORDER_ATOMIC];
}
export const image_RGB = function (_, generator) {
var R = generator.valueToCode(this, 'R', generator.ORDER_ATOMIC);
var G = generator.valueToCode(this, 'G', generator.ORDER_ATOMIC);
var B = generator.valueToCode(this, 'B', generator.ORDER_ATOMIC);
var code = '[' + R + ',' + G + ',' + B + ']';
return [code, generator.ORDER_ATOMIC];
}
export const image_Image = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var path = generator.valueToCode(this, 'path', generator.ORDER_ATOMIC);
var code = sub + " = image.Image(" + path + ")\n";
return code;
}
export const image_Image1 = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var code = sub + " = image.Image()\n";
return code;
}
export const image_getinfo = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
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 image_save = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var path = generator.valueToCode(this, 'path', generator.ORDER_ATOMIC);
var code = sub + ".save(" + path + ")\n";
return code;
}
//----开始--------------cool.ai-----弃用字体加载,出厂内存加载------------------
export const image_font_free = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var code = "image.font_free()\n";
return code;
}
export const image_font_load = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var path = generator.valueToCode(this, 'path', generator.ORDER_ATOMIC);
var code = "image.font_load(image.UTF8, 16, 16, " + path + ")\n";
return code;
}
export const image_draw_string_flash = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
generator.definitions_['font_load'] = 'image.font_load(image.UTF8, 16, 16, 0xA00000)';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var x0 = generator.valueToCode(this, 'x0', generator.ORDER_ATOMIC);
var y0 = generator.valueToCode(this, 'y0', generator.ORDER_ATOMIC);
var t = generator.valueToCode(this, 'tex', generator.ORDER_ATOMIC);
var color = generator.valueToCode(this, 'color', generator.ORDER_ATOMIC);
var s = generator.valueToCode(this, 'scale', generator.ORDER_ATOMIC);
var x = generator.valueToCode(this, 'x_spacing', generator.ORDER_ATOMIC);
var code = sub + '.draw_string(' + x0 + ',' + y0 + ',str.encode(' + t + '),color=' + color + ',scale=' + s + ',x_spacing=' + x + ',mono_space=1)';
return [code, generator.ORDER_ATOMIC];
}
//----结束--------------cool.ai-----弃用字体加载,出厂内存加载------------------
export const image_draw_string_UTF = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var x0 = generator.valueToCode(this, 'x0', generator.ORDER_ATOMIC);
var y0 = generator.valueToCode(this, 'y0', generator.ORDER_ATOMIC);
var t = generator.valueToCode(this, 'tex', generator.ORDER_ATOMIC);
var color = generator.valueToCode(this, 'color', generator.ORDER_ATOMIC);
var s = generator.valueToCode(this, 'scale', generator.ORDER_ATOMIC);
var x = generator.valueToCode(this, 'x_spacing', generator.ORDER_ATOMIC);
var code = sub + '.draw_string(' + x0 + ',' + y0 + ',str.encode(' + t + '),color=' + color + ',scale=' + s + ',x_spacing=' + x + ',mono_space=1)';
return [code, generator.ORDER_ATOMIC];
}
export const image_draw_string = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var x0 = generator.valueToCode(this, 'x0', generator.ORDER_ATOMIC);
var y0 = generator.valueToCode(this, 'y0', generator.ORDER_ATOMIC);
var t = generator.valueToCode(this, 'tex', generator.ORDER_ATOMIC);
var color = generator.valueToCode(this, 'color', generator.ORDER_ATOMIC);
var s = generator.valueToCode(this, 'scale', generator.ORDER_ATOMIC);
var code = sub + '.draw_string(' + x0 + ',' + y0 + ',' + t + ',' + color + ',' + s + ',mono_space=0)';
return [code, generator.ORDER_ATOMIC];
}
export const image_copy = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var LIST = generator.valueToCode(this, 'LIST', generator.ORDER_ATOMIC);
var code = sub + '.copy(' + LIST + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_compress = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var quality = generator.valueToCode(this, 'quality', generator.ORDER_ATOMIC);
var code = sub + '.compress(' + quality + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_clear = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = sub + ".clear()\n";
return code;
}
export const image_tonew = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
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 image_set_pixel = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var LIST = generator.valueToCode(this, 'LIST', generator.ORDER_ATOMIC);
var color = generator.valueToCode(this, 'color', generator.ORDER_ATOMIC);
var code = sub + '.set_pixel(' + LIST + ',' + color + ')\n';
return code;
}
export const image_get_pixel = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var LIST = generator.valueToCode(this, 'LIST', generator.ORDER_ATOMIC);
var code = sub + '.get_pixel(' + LIST + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_draw_line = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var list = generator.valueToCode(this, 'LIST', generator.ORDER_ATOMIC);
var color = generator.valueToCode(this, 'color', generator.ORDER_ATOMIC);
var t = generator.valueToCode(this, 'thi', generator.ORDER_ATOMIC);
var code = sub + '.draw_line(' + list + ',' + color + ',' + t + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_draw_arrow = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var list = generator.valueToCode(this, 'LIST', generator.ORDER_ATOMIC);
var color = generator.valueToCode(this, 'color', generator.ORDER_ATOMIC);
var t = generator.valueToCode(this, 'thi', generator.ORDER_ATOMIC);
var code = sub + '.draw_arrow(' + list + ',' + color + ',' + t + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_draw_cross = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var list = generator.valueToCode(this, 'LIST', generator.ORDER_ATOMIC);
var color = generator.valueToCode(this, 'color', generator.ORDER_ATOMIC);
var s = generator.valueToCode(this, 'size', generator.ORDER_ATOMIC);
var t = generator.valueToCode(this, 'thi', generator.ORDER_ATOMIC);
var code = sub + '.draw_cross(' + list + ',' + color + ',' + s + ',' + t + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_draw_circle = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var list = generator.valueToCode(this, 'LIST', generator.ORDER_ATOMIC);
var color = generator.valueToCode(this, 'color', generator.ORDER_ATOMIC);
var t = generator.valueToCode(this, 'thi', generator.ORDER_ATOMIC);
var f = generator.valueToCode(this, 'fil', generator.ORDER_ATOMIC);
var code = sub + '.draw_circle(' + list + ',' + color + ',' + t + ',' + f + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_draw_rectangle = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var list = generator.valueToCode(this, 'LIST', generator.ORDER_ATOMIC);
var color = generator.valueToCode(this, 'color', generator.ORDER_ATOMIC);
var t = generator.valueToCode(this, 'thi', generator.ORDER_ATOMIC);
var f = generator.valueToCode(this, 'fil', generator.ORDER_ATOMIC);
var code = sub + '.draw_rectangle(' + list + ',' + color + ',' + t + ',' + f + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_draw_keypoints = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var key = generator.valueToCode(this, 'keypoints', generator.ORDER_ATOMIC);
var color = generator.valueToCode(this, 'color', generator.ORDER_ATOMIC);
var size = generator.valueToCode(this, 'size', generator.ORDER_ATOMIC);
var thi = generator.valueToCode(this, 'thi', generator.ORDER_ATOMIC);
var fil = generator.valueToCode(this, 'fil', generator.ORDER_ATOMIC);
var code = sub + '.draw_keypoints(' + key + ',' + color + ',' + size + ',' + thi + ',' + fil + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_draw_image = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var list = generator.valueToCode(this, 'LIST', generator.ORDER_ATOMIC);
var x_scale = generator.valueToCode(this, 'x_scale', generator.ORDER_ATOMIC);
var y_scale = generator.valueToCode(this, 'y_scale', generator.ORDER_ATOMIC);
var code = sub + '.draw_image(' + sub + ',' + list + ',' + x_scale + ',' + y_scale + ')';
return [code, generator.ORDER_ATOMIC];
}
//--形状识别----------------------------------------------//
export const image_find_lines = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var roi = generator.valueToCode(this, 'roi', generator.ORDER_ATOMIC);
var threshold = generator.valueToCode(this, 'threshold', generator.ORDER_ATOMIC);
var theta_margin = generator.valueToCode(this, 'theta_margin', generator.ORDER_ATOMIC);
var rho_margin = generator.valueToCode(this, 'rho_margin', generator.ORDER_ATOMIC);
var code = sub + '.find_lines(' + roi + ',threshold=' + threshold + ',theta_margin=' + theta_margin + ',rho_margin=' + rho_margin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_find_line_segments = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var roi = generator.valueToCode(this, 'roi', generator.ORDER_ATOMIC);
var distance = generator.valueToCode(this, 'distance', generator.ORDER_ATOMIC);
var difference = generator.valueToCode(this, 'difference', generator.ORDER_ATOMIC);
var code = sub + '.find_line_segments(' + roi + ',' + distance + ',' + difference + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_find_circles = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var roi = generator.valueToCode(this, 'roi', generator.ORDER_ATOMIC);
var threshold = generator.valueToCode(this, 'threshold', generator.ORDER_ATOMIC);
var r_min = generator.valueToCode(this, 'r_min', generator.ORDER_ATOMIC);
var r_max = generator.valueToCode(this, 'r_max', generator.ORDER_ATOMIC);
var r_step = generator.valueToCode(this, 'r_step', generator.ORDER_ATOMIC);
var x_margin = generator.valueToCode(this, 'x_margin', generator.ORDER_ATOMIC);
var y_margin = generator.valueToCode(this, 'y_margin', generator.ORDER_ATOMIC);
var r_margin = generator.valueToCode(this, 'r_margin', generator.ORDER_ATOMIC);
var code = sub + '.find_circles(' + roi + ',threshold=' + threshold + ',x_margin=' + x_margin + ',y_margin=' + y_margin + ',r_margin=' + r_margin + ',r_min=' + r_min + ',r_max=' + r_max + ',r_step=' + r_step + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_find_rects = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var roi = generator.valueToCode(this, 'roi', generator.ORDER_ATOMIC);
var threshold = generator.valueToCode(this, 'threshold', generator.ORDER_ATOMIC);
var code = sub + '.find_rects(' + roi + ',threshold=' + threshold + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_get_regression = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var roi = generator.valueToCode(this, 'roi', generator.ORDER_ATOMIC);
var threshold = generator.valueToCode(this, 'threshold', generator.ORDER_ATOMIC);
var invert = generator.valueToCode(this, 'invert', generator.ORDER_ATOMIC);
var robust = generator.valueToCode(this, 'robust', generator.ORDER_ATOMIC);
var code = sub + '.get_regression([' + threshold + '],invert=' + invert + ',roi=' + roi + ',robust=' + robust + ')';
return [code, generator.ORDER_ATOMIC];
}
//--形状列表解析------------------------------------------//
export const image_line = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
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 image_circle = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
if (key == "circle")
var code = '[' + sub + '.x(),' + sub + '.y(),' + sub + '.r()]';
else
var code = sub + '.' + key + '()';
return [code, generator.ORDER_ATOMIC];
}
export const image_rect = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
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 image_histeq = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var limit = generator.valueToCode(this, 'limit', generator.ORDER_ATOMIC);
var code = sub + '.histeq(' + key + ',' + limit + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_mean = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var size = generator.valueToCode(this, 'size', generator.ORDER_ATOMIC);
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var offset = generator.valueToCode(this, 'offset', generator.ORDER_ATOMIC);
var code = sub + '.mean(' + size + ',' + key + ',' + offset + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_cartoon = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var seed = generator.valueToCode(this, 'seed', generator.ORDER_ATOMIC);
var floa = generator.valueToCode(this, 'float', generator.ORDER_ATOMIC);
var code = sub + '.cartoon(seed_threshold=' + seed + ',floating_threshold=' + floa + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_erode = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var size = generator.valueToCode(this, 'size', generator.ORDER_ATOMIC);
var threshold = generator.valueToCode(this, 'threshold', generator.ORDER_ATOMIC);
var code = sub + '.erode(' + size + ',' + threshold + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_dilate = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var size = generator.valueToCode(this, 'size', generator.ORDER_ATOMIC);
var threshold = generator.valueToCode(this, 'threshold', generator.ORDER_ATOMIC);
var code = sub + '.dilate(' + size + ',' + threshold + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_flood_fill = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var list = generator.valueToCode(this, 'LIST', generator.ORDER_ATOMIC);
var color = generator.valueToCode(this, 'color', generator.ORDER_ATOMIC);
var seed = generator.valueToCode(this, 'seed', generator.ORDER_ATOMIC);
var floa = generator.valueToCode(this, 'float', generator.ORDER_ATOMIC);
var invert = generator.valueToCode(this, 'invert', generator.ORDER_ATOMIC);
var clear = generator.valueToCode(this, 'clear', generator.ORDER_ATOMIC);
var code = sub + '.flood_fill(' + list + ',' + seed + ',' + floa + ',' + color + ',' + invert + ',' + clear + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_linpolar = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var code = sub + '.linpolar(' + key + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_invert = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = sub + '.invert()';
return [code, generator.ORDER_ATOMIC];
}
export const image_lens_corr = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var strength = generator.valueToCode(this, 'strength', generator.ORDER_ATOMIC);
var zoom = generator.valueToCode(this, 'zoom', generator.ORDER_ATOMIC);
var code = sub + '.lens_corr(' + strength + ',' + zoom + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_binary = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var threshold = generator.valueToCode(this, 'threshold', generator.ORDER_ATOMIC);
var invert = generator.valueToCode(this, 'invert', generator.ORDER_ATOMIC);
var zero = generator.valueToCode(this, 'zero', generator.ORDER_ATOMIC);
var code = sub + '.binary([' + threshold + '],invert=' + invert + ',zero=' + zero + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_morph = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var size = generator.valueToCode(this, 'size', generator.ORDER_ATOMIC);
var kernel = generator.valueToCode(this, 'kernel', generator.ORDER_ATOMIC);
var code = sub + '.morph(' + size + ',' + kernel + ')';
return [code, generator.ORDER_ATOMIC];
}
//--条二维码----------------------------------------------//
export const image_find_barcodes = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var roi = generator.valueToCode(this, 'roi', generator.ORDER_ATOMIC);
var code = sub + '.find_barcodes(' + roi + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_find_qrcodes = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var roi = generator.valueToCode(this, 'roi', generator.ORDER_ATOMIC);
var code = sub + '.find_qrcodes(' + roi + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_find_apriltags = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var roi = generator.valueToCode(this, 'roi', generator.ORDER_ATOMIC);
var code = sub + '.find_apriltags(' + roi + ')';
return [code, generator.ORDER_ATOMIC];
}
//--维码列表解析------------------------------------------//
export const image_barcode = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
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 image_qrcode = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
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 image_apriltag = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
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 image_find_blobs = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var LIST = generator.valueToCode(this, 'LIST', generator.ORDER_ATOMIC);
var roi = generator.valueToCode(this, 'roi', generator.ORDER_ATOMIC);
var area1 = generator.valueToCode(this, 'area', generator.ORDER_ATOMIC);
var pixel = generator.valueToCode(this, 'pixel', generator.ORDER_ATOMIC);
var margin = generator.valueToCode(this, 'margin', generator.ORDER_ATOMIC);
var merge = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var code = sub + '.find_blobs([' + LIST + '],roi=' + roi + ',area_threshold=' + area1 + ',pixels_threshold=' + pixel + ',merge=' + merge + ',margin=' + margin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_get_histogram = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var roi = generator.valueToCode(this, 'roi', generator.ORDER_ATOMIC);
var code = sub + '.get_histogram(roi=' + roi + ')';
return [code, generator.ORDER_ATOMIC];
}
//--颜色列表解析------------------------------------------//
export const image_blob = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
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 image_Histogram = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
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 image_percentile = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var per = generator.valueToCode(this, 'percentile', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + '.get_percentile(' + per + ').' + key + '()';
return [code, generator.ORDER_ATOMIC];
}
export const image_threshold = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + '.get_threhsold.' + key + '()';
return [code, generator.ORDER_ATOMIC];
}
//--颜色格式转换------------------------------------------//
export const image_lab_to_rgb = function (_, generator) {
generator.definitions_['import_image_pic'] = 'import image as pic';
var LIST = generator.valueToCode(this, 'LIST', generator.ORDER_ATOMIC);
var code = 'pic.lab_to_rgb(' + LIST + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_rgb_to_lab = function (_, generator) {
generator.definitions_['import_image_pic'] = 'import image as pic';
var LIST = generator.valueToCode(this, 'LIST', generator.ORDER_ATOMIC);
var code = 'pic.rgb_to_lab(' + LIST + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_rgb_to_grayscale = function (_, generator) {
generator.definitions_['import_image_pic'] = 'import image as pic';
var LIST = generator.valueToCode(this, 'LIST', generator.ORDER_ATOMIC);
var code = 'pic.rgb_to_grayscale(' + LIST + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_grayscale_to_rgb = function (_, generator) {
generator.definitions_['import_image_pic'] = 'import image as pic';
var g_value = generator.valueToCode(this, 'g_value', generator.ORDER_ATOMIC);
var code = 'pic.grayscale_to_rgb(' + g_value + ')';
return [code, generator.ORDER_ATOMIC];
}
//--特征识别----------------------------------------------//
export const image_find_hog = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var roi = generator.valueToCode(this, 'roi', generator.ORDER_ATOMIC);
var size = generator.valueToCode(this, 'size', generator.ORDER_ATOMIC);
var code = sub + '.find_hog(' + roi + ',' + size + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_find_keypoints = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var roi = generator.valueToCode(this, 'roi', generator.ORDER_ATOMIC);
var key = generator.valueToCode(this, 'max_keypoints', generator.ORDER_ATOMIC);
var threshold = generator.valueToCode(this, 'threshold', generator.ORDER_ATOMIC);
var scale = generator.valueToCode(this, 'scale_factor', generator.ORDER_ATOMIC);
var normalized = generator.valueToCode(this, 'normalized', generator.ORDER_ATOMIC);
var code = sub + '.find_keypoints(roi=' + roi + ',max_keypoints=' + key + ',threshold=' + threshold + ',scale_factor=' + scale + ',normalized=' + normalized + ')';
return [code, generator.ORDER_ATOMIC];
}
export const image_match_descriptor = function (_, generator) {
generator.definitions_['import_image_pic'] = 'import image as pic';
var sub1 = generator.valueToCode(this, 'VAR1', generator.ORDER_ATOMIC);
var sub2 = generator.valueToCode(this, 'VAR2', generator.ORDER_ATOMIC);
var threshold = generator.valueToCode(this, 'threshold', generator.ORDER_ATOMIC);
var code = 'pic.match_descriptor(' + sub1 + ',' + sub2 + ',threshold=' + threshold + ')';
return [code, generator.ORDER_ATOMIC];
}
//--颜色列表解析------------------------------------------//
export const image_kptmatch = function (_, generator) {
generator.definitions_['import_image'] = 'import image';
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code = sub + '.' + key + '()';
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,106 @@
import * as Blockly from 'blockly/core';
export const PGA_SELET = function (_, generator) {
var code = this.getFieldValue('PGA');
return [code, generator.ORDER_ATOMIC];
}
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_init = function (_, generator) {
generator.definitions_['import board'] = 'import board';
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 + ' = board.pin(' + dropdown_pin + ', board.' + dropdown_mode + ')\n';
return code;
}
export const inout_digital_write = function (_, generator) {
generator.definitions_['import board'] = 'import board';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC);
var code = "";
code = 'pin' + dropdown_pin + '.value(' + dropdown_stat + ')\n'
return code;
}
export const inout_digital_read = function (_, generator) {
generator.definitions_['import board'] = 'import board';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = "";
code = 'pin' + dropdown_pin + '.value()';
return [code, generator.ORDER_ATOMIC];
}
export const inout_pwm_init = function (_, generator) {
generator.definitions_['import board'] = 'import board';
generator.definitions_['from machine import PWM'] = 'from machine import PWM';
generator.definitions_['from machine import Timer'] = 'from machine import Timer';
var pin_obj = this.getFieldValue('PIN_OBJ') || 'pin#';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var varName = (pin_obj == 'pin#') ? 'pin' + dropdown_pin : generator.variableDB_.getName(pin_obj, Blockly.Variables.NAME_TYPE);
var freq = generator.valueToCode(this, 'freq', generator.ORDER_ATOMIC);
var sub = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var Timer = sub % 3
var CHANNEL = parseInt(sub / 3)
var code1 = 'tim' + sub + ' = Timer(Timer.TIMER' + Timer + ',Timer.CHANNEL' + CHANNEL + ', mode=Timer.MODE_PWM)\n';
var code2 = varName + ' = PWM(tim' + sub + ',freq=' + freq + ',duty=0, pin=' + dropdown_pin + ')\n';
return code1 + code2;
}
export const inout_pwm_write = function (_, generator) {
generator.definitions_['from machine import PWM'] = 'from machine import PWM';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var dropdown_stat = generator.valueToCode(this, 'pwm', generator.ORDER_ATOMIC);
var code = "";
code = 'pin' + dropdown_pin + '.duty(' + dropdown_stat + ')\n'
return code;
}
export const inout_adc_init = function (_, generator) {
generator.definitions_['import board'] = 'import board';
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var code = 'board.adc_init(' + key + ')\n';
return code;
}
export const inout_adc_read = function (_, generator) {
generator.definitions_['import board'] = 'import board';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'board.adc_read(' + pin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const inout_adc_Vread = function (_, generator) {
generator.definitions_['import board'] = 'import board';
var pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'board.adc_vread(' + pin + ')';
return [code, generator.ORDER_ATOMIC];
}
export const inout_pin_attachInterrupt = function (_, generator) {
generator.definitions_['import board'] = 'import board';
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 code1 = 'key' + dropdown_pin + '=board.pin(' + dropdown_pin + ', board.GPIO.IN, board.GPIO.PULL_NONE)\n'
var code2 = 'key' + dropdown_pin + '.irq(' + atta + ',board.' + dropdown_mode + ',board.GPIO.WAKEUP_NOT_SUPPORT, 7)\n'
return code1 + code2;
}
export const inout_pin_disirq = function (_, generator) {
generator.definitions_['import board'] = 'import board';
var dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
var code = 'key' + dropdown_pin + '.disirq()\n'
return code;
}
/////////////////////////////////////////////

View File

@@ -0,0 +1,75 @@
export const iot_wifi_connect = function (_, generator) {
// generator.definitions_['import_simple'] = "import simple";
generator.definitions_['import_miot'] = "import miot_no";
var username = generator.valueToCode(this, 'WIFINAME', generator.ORDER_ATOMIC);
var password = generator.valueToCode(this, 'PASSWORD', generator.ORDER_ATOMIC);
var code = 'miot_no.do_connect(' + username + ',' + password + ')\n';
return code;
}
export const iot_onenet_connect = function (_, generator) {
generator.definitions_['import_miot'] = "import miot_no";
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) || '0';
var code = v + ' = miot_no.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_simple'] = "import simple";
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_simple'] = "import simple";
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_simple'] = "import simple";
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_miot'] = "import miot_no";
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 (var n = 0; n < this.itemCount_; n++) {
var keyName = this.getFieldValue('KEY' + n);
ck[n] = keyName
}
for (var n = 0; n < this.itemCount_; n++) {
cv[n] = generator.valueToCode(this, 'ADD' + n,
generator.ORDER_NONE) || default_value;
}
var code = v + ".publish({";
for (var 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;
}

View File

@@ -0,0 +1,358 @@
// export const math_number = function() {
// // Numeric value.
// var code = (this.getFieldValue('NUM'));
// // -4.abs() returns -4 in Dart due to strange order of operation choices.
// // -4 is actually an operator and a number. Reflect this in the order.
// var order = code < 0 ?
// generator.ORDER_UNARY_PREFIX : generator.ORDER_ATOMIC;
// return [code, order];
// }
// generator.math = {}
// generator.addReservedWords("math,random,Number");
export const math_number = function (_, generator) {
// a = parseFloat(a.getFieldValue("NUM"));
// var b;
// Infinity == a ? (a = 'float("inf")', b = generator.ORDER_FUNCTION_CALL) : -Infinity == a ? (a = '-float("inf")', b = generator.ORDER_UNARY_SIGN) : b = 0 > a ? generator.ORDER_UNARY_SIGN : generator.ORDER_ATOMIC;
// return [a, b]
var code = this.getFieldValue('NUM');
// -4.abs() returns -4 in Dart due to strange order of operation choices.
// -4 is actually an operator and a number. Reflect this in the order.
var order = code < 0 ?
generator.ORDER_UNARY_PREFIX : generator.ORDER_ATOMIC;
return [code, order];
}
export const math_constant = function (_, generator) {
generator.definitions_.import_math = "import math";
var name = this.getFieldValue('CONSTANT');
var code = 'math.' + name;
return [code, generator.ORDER_ATOMIC];
}
export const math_bit = function (_, generator) {
var operator = this.getFieldValue('OP');
var order = generator.ORDER_ATOMIC;
var argument0 = generator.valueToCode(this, 'A', order) || '0';
var argument1 = generator.valueToCode(this, 'B', order) || '0';
var code = '(' + argument0 + operator + argument1 + ')';
return [code, order];
}
export const math_arithmetic = function (block, generator) {
var b = {
ADD: [" + ", generator.ORDER_ADDITIVE],
MINUS: [" - ", generator.ORDER_ADDITIVE],
MULTIPLY: [" * ", generator.ORDER_MULTIPLICATIVE],
DIVIDE: [" / ", generator.ORDER_MULTIPLICATIVE],
QUYU: [' % ', generator.ORDER_MULTIPLICATIVE],//增加取余操作
ZHENGCHU: [' // ', generator.ORDER_MULTIPLICATIVE],//增加整除操作
POWER: [" ** ", generator.ORDER_EXPONENTIATION]
}[block.getFieldValue("OP")],
c = b[0],
b = b[1],
d = generator.valueToCode(block, "A", b) || "0";
block = generator.valueToCode(block, "B", b) || "0";
return [d + c + block, b]
}
export const math_selfcalcu = function (_, generator) {
var argument0 = generator.valueToCode(this, 'A', generator.ORDER_RELATIONAL) || '0';
var argument1 = generator.valueToCode(this, 'B', generator.ORDER_RELATIONAL) || '0';
var operator = this.getFieldValue('OP');
switch (operator) {
case 'ADD': var op = '+='; break;
case 'MINUS': var op = '-='; break;
case 'MULTIPLY': var op = '*='; break;
case 'DIVIDE': var op = '/='; break;
case 'QUYU': var op = '%='; break;
case 'ZHENGCHU': var op = '//='; break;
case 'POWER': var op = '**='; break;
}
var code = argument0 + ' ' + op + ' ' + argument1 + '\n';
return code;
}
export const math_single = function (a, generator) {
var b = a.getFieldValue("OP"),
c;
if ("NEG" == b)
return c = generator.valueToCode(a, "NUM", generator.ORDER_UNARY_SIGN) || "0", ["-" + c, generator.ORDER_UNARY_SIGN];
generator.definitions_['import_math'] = "import math";
a = "SIN" == b || "COS" == b || "TAN" == b ? generator.valueToCode(a, "NUM", generator.ORDER_MULTIPLICATIVE) || "0" : generator.valueToCode(a, "NUM", generator.ORDER_NONE) || "0";
switch (b) {
case "ABS":
c = "math.fabs(" + a + ")";
break;
case "ROOT":
c = "math.sqrt(" +
a + ")";
break;
case "LN":
c = "math.log(" + a + ")";
break;
case "LOG10":
c = "math.log10(" + a + ")";
break;
case "EXP":
c = "math.exp(" + a + ")";
break;
case "POW10":
c = "math.pow(10," + a + ")";
break;
case "ROUND":
c = "round(" + a + ")";
break;
case "ROUNDUP":
c = "math.ceil(" + a + ")";
break;
case "ROUNDDOWN":
c = "math.floor(" + a + ")";
break;
case "SIN":
c = "math.sin(" + a + ")";
break;
case "COS":
c = "math.cos(" + a + ")";
break;
case "TAN":
c = "math.tan(" + a + ")";
break;
case "++":
c = "++(" + a + ")";
break;
case "--":
c = "--(" + a + ")";
break;
case "-":
c = "-(" + a + ")";
break;
default:
}
if (c)
return [c, generator.ORDER_FUNCTION_CALL];
switch (b) {
case "ASIN":
c = "math.degrees(math.asin(" + a + "))";
break;
case "ACOS":
c = "math.degrees(math.acos(" + a + "))";
break;
case "ATAN":
c = "math.degrees(math.atan(" + a + "))";
break;
}
return [c, generator.ORDER_MULTIPLICATIVE]
}
export const math_trig = math_single;
export const math_to_int = function (_, generator) {
var argument0 = generator.valueToCode(this, 'A', generator.ORDER_NONE) || '0';
var operator = this.getFieldValue('OP');
var code = "";
if (operator === "round") {
code = operator + '(' + argument0 + ')';
} else {
code = "math." + operator + '(' + argument0 + ')';
generator.definitions_.import_math = "import math";
}
return [code, generator.ORDER_ATOMIC];
}
export const math_max_min = function (_, generator) {
var a = generator.valueToCode(this, 'A', generator.ORDER_NONE) || '0';
var b = generator.valueToCode(this, 'B', generator.ORDER_NONE) || '0';
var operator = this.getFieldValue('OP');
var code = operator + '(' + a + ', ' + b + ')';
return [code, generator.ORDER_ATOMIC];
}
export const math_max_min1 = function (_, generator) {
var a = generator.valueToCode(this, 'LIST', generator.ORDER_NONE) || '0';
var operator = this.getFieldValue('OP');
var code = operator + '(' + a + ')';
return [code, generator.ORDER_ATOMIC];
}
export const math_random = function (_, generator) {
generator.definitions_.import_random = "import random";
// Random integer between [X] and [Y].
var type = this.getFieldValue('TYPE');
var argument0 = generator.valueToCode(this, 'FROM',
generator.ORDER_NONE) || '0';
var argument1 = generator.valueToCode(this, 'TO',
generator.ORDER_NONE) || '0';
if (type == 'int') {
var code = 'random.randint(' + argument0 + ', ' + argument1 + ')';
} else if (type == 'float') {
var code = 'random.uniform(' + argument0 + ', ' + argument1 + ')';
}
return [code, generator.ORDER_UNARY_POSTFIX];
}
export const math_map = function (_, generator) {
var value_num = generator.valueToCode(this, 'NUM', generator.ORDER_NONE);
var value_fl = generator.valueToCode(this, 'fromLow', generator.ORDER_ATOMIC);
var value_fh = generator.valueToCode(this, 'fromHigh', generator.ORDER_ATOMIC);
var value_tl = generator.valueToCode(this, 'toLow', generator.ORDER_ATOMIC);
var value_th = generator.valueToCode(this, 'toHigh', generator.ORDER_ATOMIC);
generator.setups_["mixly_mapping"] = "def mixly_mapping(v, al, ah, bl, bh):\n" +
" return bl + (bh - bl) * (v - al) / (ah - al)\n"
var code = 'mixly_mapping(' + value_num + ', ' + value_fl + ', ' + value_fh + ', ' + value_tl + ', ' + value_th + ')';
return [code, generator.ORDER_NONE];
}
export const math_constrain = function (_, generator) {
// Constrain a number between two limits.
var argument0 = generator.valueToCode(this, 'VALUE',
generator.ORDER_NONE) || '0';
var argument1 = generator.valueToCode(this, 'LOW',
generator.ORDER_NONE) || '0';
var argument2 = generator.valueToCode(this, 'HIGH',
generator.ORDER_NONE) || '0';
var code = 'min(max(' + argument0 + ', ' + argument1 + '), ' + argument2 + ')';
return [code, generator.ORDER_UNARY_POSTFIX];
}
export const math_number_base_conversion = function (a, generator) {
var c1 = a.getFieldValue("OP");
var d = generator.valueToCode(this, 'NUM', generator.ORDER_NONE) || '0';
var c2 = a.getFieldValue("OP2");
generator.definitions_['import_math'] = "import math";
var param1 = "";
var param2 = "10";
if (c1 == "two") {
param2 = '2';
} else if (c1 == "eight") {
param2 = '8'
} else if (c1 == "ten") {
param2 = '10'
} else if (c1 == "sixteen") {
param2 = '16'
}
if (c2 == "two") {
param1 = 'bin';
} else if (c2 == "eight") {
param1 = 'oct'
} else if (c2 == "ten") {
param1 = ''
} else if (c2 == "sixteen") {
param1 = 'hex'
}
if (param1 == "") {
var code = "int(str(" + d + "), " + param2 + ")";
} else {
var code = param1 + "(int(str(" + d + "), " + param2 + "))";
}
return [code, generator.ORDER_ATOMIC];
/*
switch (c1) {
case "two":
switch (c2){
case "two":
var code = '\'{0:b}\''+ '.' + 'format' + '(' + '0b' + '('+d +')'+')';
return [code, generator.ORDER_ATOMIC];
break;
case "eight":
var code = '\'{0:o}\''+ '.' + 'format'+ '(' + '0b' +'('+d +')'+')';
return [code, generator.ORDER_ATOMIC];
break;
case "ten":
var code ='int'+ '(' + d +','+'2'+')';
return [code, generator.ORDER_ATOMIC];
break;
case "sixteen":
var code = '\'{0:x}\''+ '.' + 'format' + '(' + '0b' +'('+d +')'+')';
return [code, generator.ORDER_ATOMIC];
break;
}
break;
case "eight":
switch (c2){
case "two":
var code = '\'{0:b}\''+ '.' + 'format' + '(' + '0o' + '('+d +')' +')';
return [code, generator.ORDER_ATOMIC];
break;
case "eight":
var code = '\'{0:o}\''+ '.' + 'format'+ '(' + '0o' + '('+d +')' +')';
return [code, generator.ORDER_ATOMIC];
break;
case "ten":
var code ='int'+ '(' +d +','+'8'+')';
return [code, generator.ORDER_ATOMIC];
break;
case "sixteen":
var code = '\'{0:x}\''+ '.' + 'format' + '(' + '0o' + '('+d +')' +')';
return [code, generator.ORDER_ATOMIC];
break;
}
break;
case "ten":
switch (c2){
case "two":
var code = '\'{0:b}\''+ '.' + 'format' + '(' + d +')';
return [code, generator.ORDER_ATOMIC];
break;
case "eight":
var code = '\'{0:o}\''+ '.' + 'format'+ '(' + d +')';
return [code, generator.ORDER_ATOMIC];
break;
case "ten":
var code ='int'+ '(' +d +','+'10'+')';
return [code, generator.ORDER_ATOMIC];
break;
case "sixteen":
var code = '\'{0:x}\''+ '.' + 'format' + '(' + d +')';
return [code, generator.ORDER_ATOMIC];
break;
}
break;
case "sixteen":
switch (c2){
case "two":
var code = '\'{0:b}\''+ '.' + 'format' + '(' + '0x' + '('+d +')' +')';
return [code, generator.ORDER_ATOMIC];
break;
case "eight":
var code = '\'{0:o}\''+ '.' + 'format'+ '(' + '0x' + '('+d +')' +')';
return [code, generator.ORDER_ATOMIC];
break;
case "ten":
var code ='int'+ '(' +d +','+'16'+')';
return [code, generator.ORDER_ATOMIC];
break;
case "sixteen":
var code = '\'{0:x}\''+ '.' + 'format' + '(' + '0x' + '('+d +')' +')';
return [code, generator.ORDER_ATOMIC];
break;
}
break;
default:
}
*/
}
export const math_random_seed = function (_, generator) {
// Random integer between [X] and [Y].
generator.definitions_.import_random = "import random";
var a = generator.valueToCode(this, 'NUM', generator.ORDER_NONE) || '0';
var code = 'random.seed(' + a + ');' + '\n';
return code;
}
export const math_indexer_number = function (_, generator) {
var code = this.getFieldValue('NUM');
// -4.abs() returns -4 in Dart due to strange order of operation choices.
// -4 is actually an operator and a number. Reflect this in the order.
var order = code < 0 ?
generator.ORDER_UNARY_PREFIX : generator.ORDER_ATOMIC;
return [code, order];
}
export const base_map = math_map;

View File

@@ -0,0 +1,24 @@
export const nes_joystick_init = function (_, generator) {
generator.definitions_['import nes_no'] = 'import nes_no';
var cs_pin = generator.valueToCode(this, 'cs_pin', generator.ORDER_ATOMIC);
var clk_pin = generator.valueToCode(this, 'clk_pin', generator.ORDER_ATOMIC);
var mosi_pin = generator.valueToCode(this, 'mosi_pin', generator.ORDER_ATOMIC);
var miso_pin = generator.valueToCode(this, 'miso_pin', generator.ORDER_ATOMIC);
var vol = generator.valueToCode(this, 'vol', generator.ORDER_ATOMIC);
var code = "nes_no.joystick_init(" + cs_pin + "," + clk_pin + "," + mosi_pin + "," + miso_pin + "," + vol + ")\n";
return code;
}
export const nes_keyboard_init = function (_, generator) {
generator.definitions_['import nes_no'] = 'import nes_no';
var vol = generator.valueToCode(this, 'vol', generator.ORDER_ATOMIC);
var code = "nes_no.keyboard_init(" + vol + ")\n";
return code;
}
export const nes_run = function (_, generator) {
generator.definitions_['import nes_no'] = 'import nes_no';
var path = generator.valueToCode(this, 'path', generator.ORDER_ATOMIC);
var code = "nes_no.run(" + path + ")\n";
return code;
}

View File

@@ -0,0 +1,119 @@
export const network_init = function (_, generator) {
generator.definitions_['import net_espat'] = "import net_espat";
var TX = generator.valueToCode(this, 'TX', generator.ORDER_ATOMIC);
var RX = generator.valueToCode(this, 'RX', generator.ORDER_ATOMIC);
return "ESP_AT = net_espat.wifi_init(" + RX + "," + TX + ")\n";
}
export const network_scan = function (_, generator) {
generator.definitions_['import net_espat'] = "import net_espat";
var code = "net_espat.scans(ESP_AT)";
return [code, generator.ORDER_ATOMIC];
}
export const network_connect = function (_, generator) {
generator.definitions_['import net_espat'] = "import net_espat";
var account = generator.valueToCode(this, 'account', generator.ORDER_ATOMIC);
var passwor = generator.valueToCode(this, 'password', generator.ORDER_ATOMIC);
var code = "ESP_AT.connect(" + account + "," + passwor + ")\n";
return code;
}
export const network_ifconfig = function (_, generator) {
generator.definitions_['import net_espat'] = "import net_espat";
var mode = this.getFieldValue('mode');
if (mode == "1")
var code = "ESP_AT.ifconfig()";
if (mode == "2")
var code = "ESP_AT.isconnected()";
return [code, generator.ORDER_ATOMIC];
}
export const network_disconnect = function (_, generator) {
generator.definitions_['import net_espat'] = "import net_espat";
var code = "ESP_AT.disconnect()\n";
return code;
}
export const network_enable_ap = function (_, generator) {
generator.definitions_['import net_espat'] = "import net_espat";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var account = generator.valueToCode(this, 'account', generator.ORDER_ATOMIC);
var passwor = generator.valueToCode(this, 'password', generator.ORDER_ATOMIC);
var chl = generator.valueToCode(this, 'chl', generator.ORDER_ATOMIC);
var mode = this.getFieldValue('mode');
var code = "ESP_AT.enable_ap(" + account + "," + passwor + "," + chl + "," + varName + "." + mode + ")\n";
return code;
}
export const network_disable_ap = function (_, generator) {
generator.definitions_['import net_espat'] = "import net_espat";
var code = "ESP_AT.disable_ap()\n";
return code;
}
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'
}
// ok
export const network_socket_init = function (_, generator) {
generator.definitions_['import socket'] = "import socket";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
return "" + varName + " = socket.socket()\n";
}
// ok
export const network_socket_getaddrinfo = function (_, generator) {
generator.definitions_['import socket'] = "import socket";
var addr = generator.valueToCode(this, 'addr', generator.ORDER_ATOMIC);
var code = "socket.getaddrinfo(" + addr + ",80)[0][-1]";
return [code, generator.ORDER_ATOMIC];
}
// ok
export const network_socket_connect = function (_, generator) {
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(" + address + ")\n";
}
// ok
export const network_socket_settimeout = function (_, generator) {
generator.definitions_['import socket'] = "import socket";
var time = generator.valueToCode(this, 'time', generator.ORDER_ATOMIC);
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
return "" + varName + ".settimeout(" + time + ")\n";
}
export const network_socket_receive = function (_, generator) {
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 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_close = function (_, generator) {
generator.definitions_['import socket'] = "import socket";
var varName = generator.valueToCode(this, 'VAR', generator.ORDER_ATOMIC);
var code = "" + varName + ".close()\n";
return code;
}

View File

@@ -0,0 +1,29 @@
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 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,182 @@
export const KEY_SELET = function (_, generator) {
var code = this.getFieldValue('KEY');
return [code, generator.ORDER_ATOMIC];
}
export const sensor_button_init = function (_, generator) {
generator.definitions_['import board'] = 'import board';
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var code1 = 'button' + key + '=board.pin(' + key + ',board.GPIO.IN,board.GPIO.PULL_UP)\n';
return code1;
}
export const sensor_button_read = function (_, generator) {
generator.definitions_['import board'] = 'import board';
var key = generator.valueToCode(this, 'key', generator.ORDER_ATOMIC);
var code = 'not button' + key + '.value()';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_dht11 = function (_, generator) {
generator.definitions_['import dht11'] = 'import dht11';
var TYPE = this.getFieldValue('TYPE');
var PIN = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC);
if (TYPE == "2")
var code = 'dht11.read_data(' + PIN + ')';
else
var code = 'dht11.read_data(' + PIN + ')[' + TYPE + ']';
return [code, generator.ORDER_ATOMIC];
}
export const HCSR04 = function (_, generator) {
generator.definitions_['import_sonar'] = 'import hcr04';
var dropdown_pin1 = generator.valueToCode(this, "PIN1", generator.ORDER_ASSIGNMENT);
var dropdown_pin2 = generator.valueToCode(this, "PIN2", generator.ORDER_ASSIGNMENT);
var code = 'hcr04.Sonar(' + dropdown_pin1 + ', ' + dropdown_pin2 + ')';
return [code, generator.ORDER_ATOMIC];
}
export const sensor_mpu9250_attachGestureInterrupt = function (_, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
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';
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];
}
export const sensor_mpu9250_get_acceleration = function (_, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
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';
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';
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';
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_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';
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 (_, generator) {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
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_use_i2c_init = function (_, generator) {
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var iv = generator.valueToCode(this, 'I2CSUB', generator.ORDER_ATOMIC);
var key = this.getFieldValue('key');
var code;
if (key == 'MPU9250') {
generator.definitions_['import_mpu9250'] = 'import mpu9250';
code = v + ' = mpu9250.' + key + "(" + iv + ')\n';
} else if (key == 'BMP280') {
generator.definitions_['import_bmp280'] = 'import bmp280';
code = v + ' = bmp280.' + key + "(" + iv + ')\n';
} else if (key == 'SHT20') {
generator.definitions_['import_sht20'] = 'import sht20';
code = v + ' = sht20.' + key + "(" + iv + ')\n';
} else if (key == 'ADXL345') {
generator.definitions_['import_adxl345'] = 'import adxl345';
code = v + ' = adxl345.' + key + "(" + iv + ')\n';
}
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_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_sht20'] = 'import sht20';
var code = v + '.' + key;
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,122 @@
export const UART_SELET = function (_, generator) {
var code = this.getFieldValue('UART');
return [code, generator.ORDER_ATOMIC];
}
export const serial_print = function (_, generator) {
generator.definitions_['from machine import UART'] = 'from machine import UART';
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_println = function (_, generator) {
generator.definitions_['from machine import UART'] = 'from machine import UART';
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_['from machine import UART'] = 'from machine import UART';
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_['from machine import UART'] = 'from machine import UART';
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_['from machine import UART'] = 'from machine import UART';
var dropdown_uart = this.getFieldValue('mode');
var code = "uart" + dropdown_uart + ".readline()";
return [code, generator.ORDER_ATOMIC];
}
export const serial_softserial1 = function (_, generator) {
generator.definitions_['from machine import UART'] = 'from machine import UART';
generator.definitions_['import board'] = 'import board';
var dropdown_uart = this.getFieldValue('mode');
var baudrate = this.getFieldValue('baudrate');
var TX = generator.valueToCode(this, 'TX', generator.ORDER_ATOMIC);
var RX = generator.valueToCode(this, 'RX', generator.ORDER_ATOMIC);
var code1 = "board.register(" + TX + ",board.FPIOA.UART" + dropdown_uart + "_TX)\n";
var code2 = "board.register(" + RX + ",board.FPIOA.UART" + dropdown_uart + "_RX)\n";
var code3 = "uart" + dropdown_uart + "=UART(UART.UART" + dropdown_uart + ", " + baudrate + ", timeout=1000, read_buf_len=4096)\n";
var code = code1 + code2 + code3;
return code;
}
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) {
// generator.definitions_['import machine'] = 'import machine';
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) {
// generator.definitions_['import machine'] = 'import machine';
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_mixgoce = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ce_com'] = 'import ce_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 = "ce_com.uart_tx(uart" + dropdown_uart + ", " + content + ", repeat=" + dropdown_stat + ")\n";
return code;
}
export const serial_read_from_mixgoce = function (_, generator) {
generator.definitions_['import_machine'] = 'import machine';
generator.definitions_['import_ce_com'] = 'import ce_com';
var dropdown_uart = this.getFieldValue('mode');
var code = "ce_com.uart_rx(uart" + dropdown_uart + ")";
return [code, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,156 @@
import { Profile } from 'mixly';
export const TIM_SELET = function (_, generator) {
var code = this.getFieldValue('TIM');
return [code, generator.ORDER_ATOMIC];
}
export const system_run_in_background = function (_, generator) {
var branch = generator.statementToCode(this, 'do');
return 'control.inBackground(() => {\n' + branch + '})\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 system_reset = function (_, generator) {
generator.definitions_['import machine'] = 'import machine';
var code = "machine.reset()\n";
return code;
}
export const system_gc_collect = function (_, generator) {
generator.definitions_['import gc'] = 'import gc';
var dropdown_gc = this.getFieldValue('gc');
var code = '' + dropdown_gc + '\n';
return code;
}
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 system_timer = function (_, generator) {
generator.definitions_['from machine import Timer'] = 'from machine import Timer';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var Timer = v % 3
var CHANNEL = parseInt(v / 3)
var period = generator.valueToCode(this, "period", generator.ORDER_NONE);
var mode = this.getFieldValue('mode');
var callback = generator.valueToCode(this, "callback", generator.ORDER_NONE) || "None";
var code = "tim" + v + " =Timer(Timer.TIMER" + Timer + ",Timer.CHANNEL" + CHANNEL + ",mode=Timer.MODE_" + mode + ",period = " + period + ", 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_['from machine import Timer'] = 'from machine import Timer';
var v = generator.valueToCode(this, 'SUB', generator.ORDER_ATOMIC);
var Timer = v % 3
var CHANNEL = parseInt(v / 3)
var code = 'tim' + v + ' = Timer(Timer.TIMER' + Timer + ',Timer.CHANNEL' + CHANNEL + ', mode=Timer.MODE_PWM)\n';
return code;
}
export const Timer_init = system_timer_init;
export const timer2 = system_timer;
export const time_ticks_diff = system_ticks_diff;
export const base_delay = controls_delay;

View File

@@ -0,0 +1,46 @@
function rgb565(colour) {
colour = colour.substr(1);
var R, G, B;
R = colour.substr(0, 2);
G = colour.substr(2, 2);
B = colour.substr(4, 2);
colour = R + G + B;
colour = "0x" + colour;
var RGB565_red = (colour & 0xf80000) >> 19;
var RGB565_green = (colour & 0xfc00) >> 10;
var RGB565_green1 = (RGB565_green & 0x38) >> 3;
var RGB565_green2 = (RGB565_green & 0x07);
var RGB565_blue = (colour & 0xf8) >> 3;
var n565Color = (RGB565_blue << 8) + (RGB565_green2 << 13) + (RGB565_red << 3) + (RGB565_green1 << 0);
// return ''+colour+','+RGB565_green+','+RGB565_green1+','+RGB565_green2+'==='+n565Color+'';
return n565Color;
}
export const lists_create_with_text1 = function (_, generator) {
var text = this.getFieldValue('TEXT');
var code = '[' + text + ']';
return [code, generator.ORDER_ATOMIC];
}
export const tuple_create_with_text3 = function (_, generator) {
var text = this.getFieldValue('TEXT');
var code = '(' + text + ')';
return [code, generator.ORDER_ATOMIC];
}
export const LCD_color_seclet1 = function (_, generator) {
var colour = this.getFieldValue('COLOR');
colour = colour.substr(1);
var R, G, B;
R = "0x" + colour.substr(0, 2);
G = "0x" + colour.substr(2, 2);
B = "0x" + colour.substr(4, 2);
var code = '(' + R + ',' + G + ',' + B + ')';
return [code, generator.ORDER_ATOMIC];
}
export const LCD_color_seclet = function (_, generator) {
var colour = this.getFieldValue('COLOR');
colour = rgb565(colour);
return [colour, generator.ORDER_ATOMIC];
}

View File

@@ -0,0 +1,178 @@
import * as Blockly from 'blockly/core';
import { Profile } from 'mixly';
import {
PythonVariablesBlocks,
PythonControlBlocks,
PythonMathBlocks,
PythonTextBlocks,
PythonListsBlocks,
PythonDictsBlocks,
PythonLogicBlocks,
PythonStorageBlocks,
PythonProceduresBlocks,
PythonTupleBlocks,
PythonSetBlocks,
PythonHtmlBlocks,
PythonUtilityBlocks,
PythonVariablesGenerators,
PythonControlGenerators,
PythonMathGenerators,
PythonTextGenerators,
PythonListsGenerators,
PythonDictsGenerators,
PythonLogicGenerators,
PythonStorageGenerators,
PythonProceduresGenerators,
PythonTupleGenerators,
PythonSetGenerators,
PythonHtmlGenerators,
PythonUtilityGenerators,
Procedures,
Variables,
Python
} from '@mixly/python';
import {
MicroPythonActuatorBlocks,
MicroPythonBlynkBlocks,
MicroPythonDisplayBlocks,
MicroPythonIotBlocks,
MicroPythonActuatorGenerators,
MicroPythonBlynkGenerators,
MicroPythonDisplayGenerators,
MicroPythonIotGenerators
} from '@mixly/micropython';
import {
MicropythonK210MixgoAIPins,
MicropythonK210MixgoAIActuatorBlocks,
MicropythonK210MixgoAIAIBlocks,
MicropythonK210MixgoAIAVBlocks,
MicropythonK210MixgoAICameraBlocks,
MicropythonK210MixgoAICommunicateBlocks,
MicropythonK210MixgoAIDisplayBlocks,
MicropythonK210MixgoAIFactoryBlocks,
MicropythonK210MixgoAIHearBlocks,
MicropythonK210MixgoAIImageBlocks,
MicropythonK210MixgoAIInoutBlocks,
MicropythonK210MixgoAIIotBlocks,
MicropythonK210MixgoAIMathBlocks,
MicropythonK210MixgoAINesBlocks,
MicropythonK210MixgoAINetworkBlocks,
MicropythonK210MixgoAIPinsBlocks,
MicropythonK210MixgoAISensorBlocks,
MicropythonK210MixgoAISerialBlocks,
MicropythonK210MixgoAISystemBlocks,
MicropythonK210MixgoAIUpdataBlocks,
MicropythonK210MixgoAIActuatorGenerators,
MicropythonK210MixgoAIAIGenerators,
MicropythonK210MixgoAIAVGenerators,
MicropythonK210MixgoAICameraGenerators,
MicropythonK210MixgoAICommunicateGenerators,
MicropythonK210MixgoAIDisplayGenerators,
MicropythonK210MixgoAIFactoryGenerators,
MicropythonK210MixgoAIHearGenerators,
MicropythonK210MixgoAIImageGenerators,
MicropythonK210MixgoAIInoutGenerators,
MicropythonK210MixgoAIIotGenerators,
MicropythonK210MixgoAIMathGenerators,
MicropythonK210MixgoAINesGenerators,
MicropythonK210MixgoAINetworkGenerators,
MicropythonK210MixgoAIPinsGenerators,
MicropythonK210MixgoAISensorGenerators,
MicropythonK210MixgoAISerialGenerators,
MicropythonK210MixgoAISystemGenerators,
MicropythonK210MixgoAIUpdataGenerators
} from './';
import './css/color_k210_mixgoai.css';
Object.assign(Blockly.Variables, Variables);
Object.assign(Blockly.Procedures, Procedures);
Blockly.Python = Python;
Blockly.generator = Python;
Profile.default = {};
Object.assign(Profile, MicropythonK210MixgoAIPins);
Object.assign(Profile.default, MicropythonK210MixgoAIPins['k210']);
Object.assign(
Blockly.Blocks,
PythonVariablesBlocks,
PythonControlBlocks,
PythonMathBlocks,
PythonTextBlocks,
PythonListsBlocks,
PythonDictsBlocks,
PythonLogicBlocks,
PythonStorageBlocks,
PythonProceduresBlocks,
PythonTupleBlocks,
PythonSetBlocks,
PythonHtmlBlocks,
PythonUtilityBlocks,
MicroPythonIotBlocks,
MicroPythonDisplayBlocks,
MicroPythonBlynkBlocks,
MicroPythonActuatorBlocks,
MicropythonK210MixgoAIActuatorBlocks,
MicropythonK210MixgoAIAIBlocks,
MicropythonK210MixgoAIAVBlocks,
MicropythonK210MixgoAICameraBlocks,
MicropythonK210MixgoAICommunicateBlocks,
MicropythonK210MixgoAIDisplayBlocks,
MicropythonK210MixgoAIFactoryBlocks,
MicropythonK210MixgoAIHearBlocks,
MicropythonK210MixgoAIImageBlocks,
MicropythonK210MixgoAIInoutBlocks,
MicropythonK210MixgoAIIotBlocks,
MicropythonK210MixgoAIMathBlocks,
MicropythonK210MixgoAINesBlocks,
MicropythonK210MixgoAINetworkBlocks,
MicropythonK210MixgoAIPinsBlocks,
MicropythonK210MixgoAISensorBlocks,
MicropythonK210MixgoAISerialBlocks,
MicropythonK210MixgoAISystemBlocks,
MicropythonK210MixgoAIUpdataBlocks
);
Object.assign(
Blockly.Python.forBlock,
PythonVariablesGenerators,
PythonControlGenerators,
PythonMathGenerators,
PythonTextGenerators,
PythonListsGenerators,
PythonDictsGenerators,
PythonLogicGenerators,
PythonStorageGenerators,
PythonProceduresGenerators,
PythonTupleGenerators,
PythonSetGenerators,
PythonHtmlGenerators,
PythonUtilityGenerators,
MicroPythonIotGenerators,
MicroPythonDisplayGenerators,
MicroPythonBlynkGenerators,
MicroPythonActuatorGenerators,
MicropythonK210MixgoAIActuatorGenerators,
MicropythonK210MixgoAIAIGenerators,
MicropythonK210MixgoAIAVGenerators,
MicropythonK210MixgoAICameraGenerators,
MicropythonK210MixgoAICommunicateGenerators,
MicropythonK210MixgoAIDisplayGenerators,
MicropythonK210MixgoAIFactoryGenerators,
MicropythonK210MixgoAIHearGenerators,
MicropythonK210MixgoAIImageGenerators,
MicropythonK210MixgoAIInoutGenerators,
MicropythonK210MixgoAIIotGenerators,
MicropythonK210MixgoAIMathGenerators,
MicropythonK210MixgoAINesGenerators,
MicropythonK210MixgoAINetworkGenerators,
MicropythonK210MixgoAIPinsGenerators,
MicropythonK210MixgoAISensorGenerators,
MicropythonK210MixgoAISerialGenerators,
MicropythonK210MixgoAISystemGenerators,
MicropythonK210MixgoAIUpdataGenerators
);

View File

@@ -0,0 +1,92 @@
from machine import I2C
import time
import ustruct
DATA_FORMAT = 0x31
BW_RATE = 0x2c
POWER_CTL = 0x2d
INT_ENABLE = 0x2E
OFSX = 0x1e
OFSY =0x1f
OFSZ =0x20
class ADXL345:
def __init__(self, i2c):
self.i2c = i2c
slv = self.i2c.scan()
print(slv)
for s in slv:
buf = self.i2c.readfrom_mem(s, 0, 1)
print(buf)
if(buf[0] == 0xe5):
self.slvAddr = s
print('adxl345 found')
break
#self.writeByte(POWER_CTL,0x00) #sleep
#time.sleep(0.001)
#低电平中断输出,13位全分辨率,输出数据右对齐,16g量程
self.writeByte(DATA_FORMAT,0x2B)
#数据输出速度为100Hz
self.writeByte(BW_RATE,0x0A)
#不使用中断
self.writeByte(INT_ENABLE,0x00)
self.writeByte(OFSX,0x00)
self.writeByte(OFSY,0x00)
self.writeByte(OFSZ,0x00)
#链接使能,测量模式
self.writeByte(POWER_CTL,0x28)
time.sleep(1)
def readXYZ(self):
fmt = '<h' #little-endian
buf1 = self.readByte(0x32)
buf2 = self.readByte(0x33)
buf = bytearray([buf1[0], buf2[0]])
x, = ustruct.unpack(fmt, buf)
x = x*3.9
#print('x:',x)
buf1 = self.readByte(0x34)
buf2 = self.readByte(0x35)
buf = bytearray([buf1[0], buf2[0]])
y, = ustruct.unpack(fmt, buf)
y = y*3.9
#print('y:',y)
buf1 = self.readByte(0x36)
buf2 = self.readByte(0x37)
buf = bytearray([buf1[0], buf2[0]])
z, = ustruct.unpack(fmt, buf)
z = z*3.9
#print('z:',z)
#print('************************')
#time.sleep(0.5)
return (x,y,z)
def readX(self):
return self.readXYZ()[0]
def readY(self):
return self.readXYZ()[1]
def readZ(self):
return self.readXYZ()[2]
def writeByte(self, addr, data):
d = bytearray([data])
self.i2c.writeto_mem(self.slvAddr, addr, d)
def readByte(self, addr):
return self.i2c.readfrom_mem(self.slvAddr, addr, 1)
if __name__ == '__main__':
#初始化
sensor = ADXL345(i2c)
#getXYZ
x,y,z = sensor.readXYZ()
#getX/Y/Z
x0 = sensor.readX()
y0 = sensor.readY()
z0 = sensor.readZ()

View File

@@ -0,0 +1,133 @@
import KPU as kpu
import gc,image,time
import board
try:
kpu.deinit(task_fe)
kpu.deinit(task_ld)
kpu.deinit(task_fd)
del task_fe
del task_ld
del task_fd
except Exception:
pass
gc.collect()
record_ftr = []
record_ftrs = []
img_face = image.Image(size=(128, 128))
a = img_face.pix_to_ai()
dst_point = [(44, 59), (84, 59), (64, 82), (47, 105),(81, 105)]
start_processing = False
tim2 = time.ticks_ms()
task_fd=None
task_ld=None
task_fe=None
info=None
bb=1
def set_key_state(*_):
global start_processing
global tim2
if (time.ticks_ms() - tim2 )> 4000:
start_processing = True
tim2 = time.ticks_ms()
def init(FD,LD,FE):
global task_fd
global task_ld
global task_fe
# task_fd = kpu.load(0x200000)
# task_ld = kpu.load(0x300000)
# task_fe = kpu.load(0x400000)
task_fd = kpu.load(FD)
task_ld = kpu.load(LD)
task_fe = kpu.load(FE)
gc.collect()
key_gpio = board.pin(9,board.GPIO.IN,board.GPIO.PULL_UP)
key_gpio.irq(set_key_state,board.GPIO.IRQ_RISING, board.GPIO.WAKEUP_NOT_SUPPORT)
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437,6.92275, 6.718375, 9.01025) # anchor for face detect
kpu.init_yolo2(task_fd, 0.5, 0.3, 5, anchor)
def train(img,names,threshold):
global task_fd
global task_ld
global task_fe
global start_processing
global info
global bb
code = kpu.run_yolo2(task_fd, img)
if code:
for i in code:
face_cut = img.cut(i.x(), i.y(), i.w(), i.h())
face_cut_128 = face_cut.resize(128, 128)
a = face_cut_128.pix_to_ai()
fmap = kpu.forward(task_ld, face_cut_128)
plist = fmap[:]
le = (i.x()+int(plist[0]*i.w() - 10), i.y()+int(plist[1]*i.h()))
re = (i.x()+int(plist[2]*i.w()), i.y()+int(plist[3]*i.h()))
nose = (i.x()+int(plist[4]*i.w()), i.y()+int(plist[5]*i.h()))
lm = (i.x()+int(plist[6]*i.w()), i.y()+int(plist[7]*i.h()))
rm = (i.x()+int(plist[8]*i.w()), i.y()+int(plist[9]*i.h()))
lb=i.rect()
src_point = [le, re, nose, lm, rm]
T = image.get_affine_transform(src_point, dst_point)
a = image.warp_affine_ai(img, img_face, T)
a = img_face.ai_to_pix()
del(face_cut_128)
fmap = kpu.forward(task_fe, img_face)
feature = kpu.face_encode(fmap[:])
reg_flag = False
scores = []
for j in range(len(record_ftrs)):
score = kpu.face_compare(record_ftrs[j], feature)
scores.append(score)
max_score = 0
index = 0
for k in range(len(scores)):
if max_score < scores[k]:
max_score = scores[k]
index = k
if start_processing:
record_ftr = feature
record_ftrs.append(record_ftr)
start_processing = False
if max_score > threshold:
info=[names[index],max_score,lb,src_point]
else:
if bb==1:
print("Please press BOOT key to enter the face")
bb=0
info=[None,max_score,lb,src_point]
return True
break
else:
info=None
bb=1
return False
gc.collect()
def info_name():
gc.collect()
return info[0]
def info_score():
return info[1]
def info_face():
return info[2]
def info_organs():
return info[3]

View File

@@ -0,0 +1,137 @@
import network,time,random,request,base64,json,board
from machine import UART
wifi_en=board.pin(19,board.GPIO.OUT)
board.register(18,board.FPIOA.UART2_TX)
board.register(17,board.FPIOA.UART2_RX)
def wifi_enable(en):
global wifi_en
wifi_en.value(en)
def wifi_reset():
global uart
wifi_enable(0)
time.sleep_ms(200)
wifi_enable(1)
time.sleep(2)
uart = UART(UART.UART2,115200,timeout=1000, read_buf_len=4096)
tmp = uart.read()
uart.write("AT+UART_CUR=921600,8,1,0,0\r\n")
print(uart.read())
uart = UART(UART.UART2,921600,timeout=1000, read_buf_len=10240) # important! baudrate too low or read_buf_len too small will loose data
uart.write("AT\r\n")
tmp = uart.read()
print(tmp)
if not tmp.endswith("OK\r\n"):
print("reset fail")
return None
try:
nic = network.ESP8285(uart)
except Exception:
return None
return nic
def nic_init(account,password):
nic=wifi_reset()
if not nic:
raise Exception("[Cool.AI]:WiFi init fail")
nic.connect(account,password)
nic.ifconfig()
class SimpleEncode():
keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+-={}[]:;<,>.?/|"
keyLength = len(keyStr)
encryptionA = 17
encryptionB = 8
decodeA = 0
preCountMax = 15
postCount = 5
randomChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop"
randomCharLength = len(randomChar)
#base64字符
ALPHABET = "ABCDEFGHIJKLMN0123456789OPQRSTUVWXYZ+/abcdefghijklmnopqrstuvwxyz"
STANDARD = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" # 标准的字符串索引
#找到密钥
for i in range(1,keyLength):
if (encryptionA * i) % keyLength == 1:
decodeA = i
def base64Encode(self,sourceStr):
encode = ""
for ch in base64.b64encode(sourceStr.encode()).decode():
if ch == '=':
encode += '='
else:
for i in range(64):
if ch == self.STANDARD[i]:
encode += self.ALPHABET[i]
return encode
def encrpyt(self,sourceStr):
srcLength = len(sourceStr)
#先加入干扰字符的数量
addCharCount = random.randint(1,self.preCountMax) if srcLength < self.preCountMax else 0
#随机字符
sb = str(addCharCount)+"|"
for i in range(addCharCount):
sb += self.randomChar[random.randint(0,self.randomCharLength-1)]
sb += sourceStr
#尾部固定增加x个字符
for i in range(self.postCount):
sb += self.randomChar[random.randint(0,self.randomCharLength-1)]
#base64 加密
base64Str = self.base64Encode(sb)
destStr = ''
for i in range(len(base64Str)):
#找到字符所在位置
position = self.keyStr.find(base64Str[i])
#对字符进行转换
y = (self.encryptionA * position + self.encryptionB) % self.keyLength
#找到替换后的字符
destStr += self.keyStr[y]
return destStr
def token(account,password):
url = 'http://ai.heclouds.com:9090/v1/user/oneNetLogin'
headers = {
'Content-Type': 'application/json',
}
simpleencode = SimpleEncode()
data = {'account': account, 'password': simpleencode.encrpyt(password)}
req = request.post(url, data=json.dumps(data), headers=headers)
#print(req.text)
try:
return eval(req.text)['data']['loginToken']
except:
raise ValueError( "[Cool.AI]:Wrong account or password ")
def post_ai(img,urlx,Token):
ur = 'http://183.230.40.32:9090/v1/aiApi/picture/MixPY'
url=ur.replace("MixPY",urlx)
headers ={
'Content-Type':'application/json',
'Login-Token':'Token'
}
headers['Login-Token']=Token
imge = img.compressed(quality=50)
file =imge.to_bytes()
str = base64.b64encode(file).decode()
data = {'picture':[str]}
req = request.post(url,data=json.dumps(data),headers=headers)
return json.loads(req.text)
#return eval(req.text)

View File

@@ -0,0 +1,256 @@
import re
import struct
import binascii
__all__ = [
'encode', 'decode', 'encodebytes', 'decodebytes',
'b64encode', 'b64decode', 'b32encode', 'b32decode',
'b16encode', 'b16decode',
'standard_b64encode', 'standard_b64decode',
'urlsafe_b64encode', 'urlsafe_b64decode',
]
bytes_types = (bytes, bytearray)
def _bytes_from_decode_data(s):
if isinstance(s, str):
try:
return s.encode('ascii')
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 b64encode(s, altchars=None):
if not isinstance(s, bytes_types):
raise TypeError("expected bytes, not %s" % s.__class__.__name__)
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)
return encoded.translate(bytes.maketrans(b'+/', altchars))
return encoded
def b64decode(s, altchars=None, validate=False):
s = _bytes_from_decode_data(s)
if altchars is not None:
altchars = _bytes_from_decode_data(altchars)
assert len(altchars) == 2, repr(altchars)
s = s.translate(bytes.maketrans(altchars, b'+/'))
if validate and not re.match(b'^[A-Za-z0-9+/]*={0,2}$', s):
raise binascii.Error('Non-base64 digit found')
return binascii.a2b_base64(s)
def standard_b64encode(s):
return b64encode(s)
def standard_b64decode(s):
return b64decode(s)
def urlsafe_b64encode(s):
raise NotImplementedError()
def urlsafe_b64decode(s):
raise NotImplementedError()
_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):
if not isinstance(s, bytes_types):
raise TypeError("expected bytes, not %s" % s.__class__.__name__)
quanta, leftover = divmod(len(s), 5)
if leftover:
s = s + bytes(5 - leftover) # Don't use += !
quanta += 1
encoded = bytearray()
for i in range(quanta):
c1, c2, c3 = struct.unpack('!HHB', s[i*5:(i+1)*5])
c2 += (c1 & 1) << 16
c3 += (c2 & 3) << 8
encoded += bytes([_b32tab[c1 >> 11],
_b32tab[(c1 >> 6) & 0x1f],
_b32tab[(c1 >> 1) & 0x1f],
_b32tab[c2 >> 12],
_b32tab[(c2 >> 7) & 0x1f],
_b32tab[(c2 >> 2) & 0x1f],
_b32tab[c3 >> 5],
_b32tab[c3 & 0x1f],
])
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):
s = _bytes_from_decode_data(s)
quanta, leftover = divmod(len(s), 8)
if leftover:
raise binascii.Error('Incorrect padding')
if map01 is not None:
map01 = _bytes_from_decode_data(map01)
assert len(map01) == 1, repr(map01)
s = s.translate(bytes.maketrans(b'01', b'O' + map01))
if casefold:
s = s.upper()
padchars = s.find(b'=')
if padchars > 0:
padchars = len(s) - padchars
s = s[:-padchars]
else:
padchars = 0
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
last = binascii.unhexlify(bytes('%010x' % acc, "ascii"))
if padchars == 0:
last = b''
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)
def b16encode(s):
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):
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)
MAXLINESIZE = 76
MAXBINSIZE = (MAXLINESIZE//4)*3
def encode(input, output):
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):
while True:
line = input.readline()
if not line:
break
s = binascii.a2b_base64(line)
output.write(s)
def encodebytes(s):
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):
import warnings
warnings.warn("encodestring() is a deprecated alias, use encodebytes()",
DeprecationWarning, 2)
return encodebytes(s)
def decodebytes(s):
if not isinstance(s, bytes_types):
raise TypeError("expected bytes, not %s" % s.__class__.__name__)
return binascii.a2b_base64(s)
def decodestring(s):
import warnings
warnings.warn("decodestring() is a deprecated alias, use decodebytes()",
DeprecationWarning, 2)
return decodebytes(s)
def main():
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,178 @@
from ustruct import unpack as unp
import utime
from machine import I2C
# Author David Wahlund david@dafnet.se
# 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,29 @@
"""
MxiGo AI to MxiGo CE COM
MicroPython library for the MxiGo AI
=======================================================
20211213
mixly
"""
data_a=None
def uart_tx(uart,data,repeat=True):
global data_a
data_b = data
if data_b != data_a:
uart.write((str(data)+'\n'))
#print(data)
if not repeat:
data_a=data_b
def uart_rx(uart):
data = uart.readline()
if data:
data_str = data.strip()
try:
data_str=data_str.decode()
return eval(data_str)
except:
return data_str

View File

@@ -0,0 +1,58 @@
import time,board
def read_data(pin_name):
data=[]
j=0
time.sleep_ms(1200)
N1 = board.pin(pin_name, board.GPIO.OUT)
N1.value(0)
time.sleep_ms(20)
N1.value(1)
time.sleep_us(30)
N1 =board.pin(pin_name, board.GPIO.IN)
T1 = time.ticks_us()
while N1.value()==0:
continue
while N1.value()==1:
T2 =time.ticks_us()
if time.ticks_diff(T2, T1) >200000:
#raise ValueError("[MixNo]:Sensor read error")
break
continue
while j<40:
k=0
while N1.value()==0:
continue
while N1.value()==1:
k+=1
if k>100:break
if k<15:
data.append(0)
else:
data.append(1)
j=j+1
del N1
humidity_bit=data[0:8]
humidity_point_bit=data[8:16]
temperature_bit=data[16:24]
temperature_point_bit=data[24:32]
check_bit=data[32:40]
humidity=0
humidity_point=0
temperature=0.0
temperature_point=0
check=0
for i in range(8):
humidity+=humidity_bit[i]*2**(7-i)
humidity_point+=humidity_point_bit[i]*2**(7-i)
temperature+=temperature_bit[i]*2**(7-i)
temperature_point+=temperature_point_bit[i]*2**(7-i)
check+=check_bit[i]*2**(7-i)
tmp=humidity+humidity_point+temperature+temperature_point
#print(humidity_point,temperature_point)
if check==tmp:
#print('temperature is',temperature,'-wet is',humidity,'%')
return (temperature+temperature_point/10,humidity)
else:
#print('Error:',humidity,humidity_point,temperature,temperature_point,check)
return (None,None)

View File

@@ -0,0 +1,27 @@
import time,board
def Sonar(trig1, echo1):
trig = board.pin(trig1, board.GPIO.OUT)
echo = board.pin(echo1, board.GPIO.IN)
time.sleep_ms(10)
trig.value(1)
time.sleep_us(10)
trig.value(0)
n1 = time.ticks_us()
while(echo.value()==0):
n2 =time.ticks_us()
if time.ticks_diff(n2, n1) >200000:
#raise ValueError("[MixNo]:Sensor read error")
break
pass
t1 = time.ticks_us()
while(echo.value()==1):
n3 =time.ticks_us()
if time.ticks_diff(n3, t1) >200000:
#raise ValueError("[MixNo]:Sensor read error")
break
pass
t2 = time.ticks_us()
time.sleep_ms(10)
return round(time.ticks_diff(t2, t1) / 10000 * 340 / 2, 2)

View File

@@ -0,0 +1,47 @@
import time,board
def read_id(pin):
L1 = board.pin(pin, board.GPIO.IN, board.GPIO.PULL_UP)
a = []
t1 = time.ticks_us()
while L1.value() == 1:
t2 = time.ticks_us()
if time.ticks_diff(t2, t1) >1000000:
#raise ValueError("[MixNo]:Sensor read error")
break
pass
time.sleep_us(13560)
for i in range(1000):
v = L1.value()
a.append(v)
time.sleep_us(56)
a_c = []
count = 0
for i in a:
if i == 1:
count += 1
elif i == 0:
if count > 0 :
a_c.append(count)
count =0
for i in range(len(a_c)):
if a_c[i] > 10:
a_c[i] = "1"
else:
a_c[i] = "0"
B1 = "".join(a_c)
B2 = B1[16:32]
#print(len(B1))
if len(B1)==32 or len(B1)==33 or len(B1)==46:
B3=int(B2,2)
return B3
else:
return None

View File

@@ -0,0 +1,97 @@
# SPDX-FileCopyrightText: 2017 Yoch <https://github.com/yoch>
#
# SPDX-License-Identifier: EPL-1.0
"""
`matcher`
====================================================================================
MQTT topic filter matcher from the Eclipse Project's Paho.MQTT.Python
https://github.com/eclipse/paho.mqtt.python/blob/master/src/paho/mqtt/matcher.py
* Author(s): Yoch (https://github.com/yoch)
"""
class MQTTMatcher:
"""Intended to manage topic filters including wildcards.
Internally, MQTTMatcher use a prefix tree (trie) to store
values associated with filters, and has an iter_match()
method to iterate efficiently over all filters that match
some topic name.
"""
# pylint: disable=too-few-public-methods
class Node:
"""Individual node on the MQTT prefix tree."""
__slots__ = "children", "content"
def __init__(self):
self.children = {}
self.content = None
def __init__(self):
self._root = self.Node()
def __setitem__(self, key, value):
"""Add a topic filter :key to the prefix tree
and associate it to :value"""
node = self._root
for sym in key.split("/"):
node = node.children.setdefault(sym, self.Node())
node.content = value
def __getitem__(self, key):
"""Retrieve the value associated with some topic filter :key"""
try:
node = self._root
for sym in key.split("/"):
node = node.children[sym]
if node.content is None:
raise KeyError(key)
return node.content
except KeyError:
raise KeyError(key) from None
def __delitem__(self, key):
"""Delete the value associated with some topic filter :key"""
lst = []
try:
parent, node = None, self._root
for k in key.split("/"):
parent, node = node, node.children[k]
lst.append((parent, k, node))
node.content = None
except KeyError:
raise KeyError(key) from None
else: # cleanup
for parent, k, node in reversed(lst):
if node.children or node.content is not None:
break
del parent.children[k]
def iter_match(self, topic):
"""Return an iterator on all values associated with filters
that match the :topic"""
lst = topic.split("/")
normal = not topic.startswith("$")
def rec(node, i=0):
if i == len(lst):
if node.content is not None:
yield node.content
else:
part = lst[i]
if part in node.children:
for content in rec(node.children[part], i + 1):
yield content
if "+" in node.children and (normal or i > 0):
for content in rec(node.children["+"], i + 1):
yield content
if "#" in node.children and (normal or i > 0):
content = node.children["#"].content
if content is not None:
yield content
return rec(self._root)

View File

@@ -0,0 +1,260 @@
import usocket as socket
import ustruct as struct
import network,time,board
#from ubinascii import hexlify
import ujson as json
from machine import UART
wifi_en=board.pin(19,board.GPIO.OUT)
board.register(18,board.FPIOA.UART2_TX)
board.register(17,board.FPIOA.UART2_RX)
def wifi_enable(en):
global wifi_en
wifi_en.value(en)
def wifi_reset():
global uart
wifi_enable(0)
time.sleep_ms(200)
wifi_enable(1)
time.sleep(2)
uart = UART(UART.UART2,115200,timeout=1000, read_buf_len=4096)
tmp = uart.read()
uart.write("AT+UART_CUR=921600,8,1,0,0\r\n")
print(uart.read())
uart = UART(UART.UART2,921600,timeout=1000, read_buf_len=10240) # important! baudrate too low or read_buf_len too small will loose data
uart.write("AT\r\n")
tmp = uart.read()
print(tmp)
if not tmp.endswith("OK\r\n"):
print("reset fail")
return None
try:
nic = network.ESP8285(uart)
except Exception:
return None
return nic
def get_data_dict(d):
result = {"datastreams":[]}
for x in d:
result["datastreams"].append({"id":x,"datapoints":[{"value":d[x]}]})
return result
def pubData(value, state):
value = get_data_dict(value)
jdata = json.dumps(value)
jlen = len(jdata)
bdata = bytearray(jlen+3)
bdata[0] = 1 # publish data in type of json
bdata[1] = int(jlen / 256) # data lenght
bdata[2] = jlen % 256 # data lenght
bdata[3:jlen+4] = jdata.encode('ascii') # json data
if state:
print(value)
print(bdata)
return bdata
def do_connect(account,password):
nic=wifi_reset()
if not nic:
raise Exception("[Cool.AI]:WiFi init fail")
nic.connect(account,password)
nic.ifconfig()
def init_MQTT_client(sid, address, cid, api, topic, callback):
client = MQTTClient(sid, address, 6002, cid, api)
client.set_callback(callback)
client.connect()
client.subscribe(bytes(topic, 'utf-8'))
return client
class MQTTException(Exception):
pass
class MQTTClient:
def __init__(self, client_id, server, port=0, user=None, password=None, keepalive=0,ssl=False, ssl_params={}):
if port == 0:
port = 8883 if ssl else 1883
self.client_id = client_id
self.sock = None
self.addr = socket.getaddrinfo(server, port)[0][-1]
self.ssl = ssl
self.ssl_params = ssl_params
self.pid = 0
self.cb = None
self.user = user
self.pswd = password
self.keepalive = keepalive
self.lw_topic = None
self.lw_msg = None
self.lw_qos = 0
self.lw_retain = False
def _send_str(self, s):
self.sock.write(struct.pack("!H", len(s)))
self.sock.write(s)
def _recv_len(self):
n = 0
sh = 0
while 1:
b = self.sock.read(1)[0]
n |= (b & 0x7f) << sh
if not b & 0x80:
return n
sh += 7
def set_callback(self, f):
self.cb = f
def set_last_will(self, topic, msg, retain=False, qos=0):
assert 0 <= qos <= 2
assert topic
self.lw_topic = topic
self.lw_msg = msg
self.lw_qos = qos
self.lw_retain = retain
def connect(self, clean_session=True):
self.sock = socket.socket()
self.sock.connect(self.addr)
print(self.addr)
if self.ssl:
import ussl
self.sock = ussl.wrap_socket(self.sock, **self.ssl_params)
msg = bytearray(b"\x10\0\0\x04MQTT\x04\x02\0\0")
msg[1] = 10 + 2 + len(self.client_id)
msg[9] = clean_session << 1
if self.user is not None:
msg[1] += 2 + len(self.user) + 2 + len(self.pswd)
msg[9] |= 0xC0
if self.keepalive:
assert self.keepalive < 65536
msg[10] |= self.keepalive >> 8
msg[11] |= self.keepalive & 0x00FF
if self.lw_topic:
msg[1] += 2 + len(self.lw_topic) + 2 + len(self.lw_msg)
msg[9] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3
msg[9] |= self.lw_retain << 5
self.sock.write(msg)
#print(hex(len(msg)), hexlify(msg, ":"))
self._send_str(self.client_id)
if self.lw_topic:
self._send_str(self.lw_topic)
self._send_str(self.lw_msg)
if self.user is not None:
self._send_str(self.user)
self._send_str(self.pswd)
resp = self.sock.read(4)
assert resp[0] == 0x20 and resp[1] == 0x02
if resp[3] != 0:
raise MQTTException(resp[3])
return resp[2] & 1
def disconnect(self):
self.sock.write(b"\xe0\0")
self.sock.close()
def ping(self):
self.sock.write(b"\xc0\0")
def publish(self, msg, is_print=True, topic='$dp', retain=False, qos=0):
msg = pubData(msg, is_print)
pkt = bytearray(b"\x30\0\0\0")
pkt[0] |= qos << 1 | retain
sz = 2 + len(topic) + len(msg)
if qos > 0:
sz += 2
assert sz < 2097152
i = 1
while sz > 0x7f:
pkt[i] = (sz & 0x7f) | 0x80
sz >>= 7
i += 1
pkt[i] = sz
#print(hex(len(pkt)), hexlify(pkt, ":"))
self.sock.write(pkt, i + 1)
self._send_str(topic)
if qos > 0:
self.pid += 1
pid = self.pid
struct.pack_into("!H", pkt, 0, pid)
self.sock.write(pkt, 2)
self.sock.write(msg)
if qos == 1:
while 1:
op = self.wait_msg()
if op == 0x40:
sz = self.sock.read(1)
assert sz == b"\x02"
rcv_pid = self.sock.read(2)
rcv_pid = rcv_pid[0] << 8 | rcv_pid[1]
if pid == rcv_pid:
return
elif qos == 2:
assert 0
def subscribe(self, topic, qos=0):
assert self.cb is not None, "Subscribe callback is not set"
pkt = bytearray(b"\x82\0\0\0")
self.pid += 1
struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, self.pid)
#print(hex(len(pkt)), hexlify(pkt, ":"))
self.sock.write(pkt)
self._send_str(topic)
self.sock.write(qos.to_bytes(1, "little"))
while 1:
op = self.wait_msg()
if op == 0x90:
resp = self.sock.read(4)
#print(resp)
assert resp[1] == pkt[2] and resp[2] == pkt[3]
if resp[3] == 0x80:
raise MQTTException(resp[3])
return
# Wait for a single incoming MQTT message and process it.
# Subscribed messages are delivered to a callback previously
# set by .set_callback() method. Other (internal) MQTT
# messages processed internally.
def wait_msg(self):
res = self.sock.read(1)
self.sock.setblocking(True)
if res is None:
return None
if res == b"":
raise OSError(-1)
if res == b"\xd0": # PINGRESP
sz = self.sock.read(1)[0]
assert sz == 0
return None
op = res[0]
if op & 0xf0 != 0x30:
return op
sz = self._recv_len()
topic_len = self.sock.read(2)
topic_len = (topic_len[0] << 8) | topic_len[1]
topic = self.sock.read(topic_len)
sz -= topic_len + 2
if op & 6:
pid = self.sock.read(2)
pid = pid[0] << 8 | pid[1]
sz -= 2
msg = self.sock.read(sz)
self.cb(topic, msg)
if op & 6 == 2:
pkt = bytearray(b"\x40\x02\0\0")
struct.pack_into("!H", pkt, 2, pid)
self.sock.write(pkt)
elif op & 6 == 4:
assert 0
# Checks whether a pending message from server is available.
# If not, returns immediately with None. Otherwise, does
# the same processing as wait_msg.
def check_msg(self):
self.sock.setblocking(False)
return self.wait_msg()

View File

@@ -0,0 +1,312 @@
import usocket as socket
import ustruct as struct
import time
import machine
from ubinascii import hexlify
import ujson as json
from matcher import MQTTMatcher
from machine import Timer
ADDITIONAL_TOPIC = 'b640a0ce465fa2a4150c36b305c1c11b'
WILL_TOPIC = '9d634e1a156dc0c1611eb4c3cff57276'
def init_MQTT_client(address, username, password,MQTT_USR_PRJ):
client = MQTTClient(hexlify(machine.unique_id()), address, 1883, username, password)
client.set_last_will(topic=MQTT_USR_PRJ+WILL_TOPIC, msg=client.client_id, qos=2)
if client.connect()==0:
client.publish(MQTT_USR_PRJ+ADDITIONAL_TOPIC, client.client_id, qos=1)
Timer(Timer.TIMER2,Timer.CHANNEL3,mode=Timer.MODE_PERIODIC,period = 10000, callback = lambda x : client.ping())
return client
len_overrided = len
# Add by Mixly Team
def len(object):
if isinstance(object, str):
return len_overrided(object.encode('utf-8'))
else:
return len_overrided(object)
#####################################################
class MQTTException(Exception):
pass
class MQTTClient:
def __init__(self, client_id, server, port=0, username=None, password=None, keepalive=60, ssl=False, ssl_params={}):
if port == 0:
port = 8883 if ssl else 1883
self.client_id = client_id
self.sock = None
self.addr = socket.getaddrinfo(server, port)[0][-1]
self.ssl = ssl
self.ssl_params = ssl_params
self.pid = 0
#self.cb = None
self._on_message = None
self.username = username
self.password = password
#self.project = project
self.keepalive = keepalive
self.lw_topic = None
self.lw_msg = None
self.lw_qos = 0
self.lw_retain = False
self._on_message_filtered = MQTTMatcher()
def _send_str(self, s):
self.sock.write(struct.pack("!H", len(s)))
self.sock.write(s)
def _recv_len(self):
n = 0
sh = 0
while 1:
b = self.sock.read(1)[0]
n |= (b & 0x7f) << sh
if not b & 0x80:
return n
sh += 7
# def set_callback(self, f):
# self.cb = f
def set_callback(self, mqtt_topic, callback_method, MQTT_USR_PRJ):
"""Registers a callback_method for a specific MQTT topic.
:param str mqtt_topic: MQTT topic identifier.
:param str callback_method: Name of callback method.
"""
if mqtt_topic is None or callback_method is None:
raise ValueError("MQTT topic and callback method must both be defined.")
self._on_message_filtered[MQTT_USR_PRJ+mqtt_topic] = callback_method
def remove_callback(self, mqtt_topic):
"""Removes a registered callback method.
:param str mqtt_topic: MQTT topic identifier string.
"""
if mqtt_topic is None:
raise ValueError("MQTT Topic must be defined.")
try:
del self._on_message_filtered[mqtt_topic]
except KeyError:
raise KeyError(
"MQTT topic callback not added with add_topic_callback."
) from None
@property
def on_message(self):
"""Called when a new message has been received on a subscribed topic.
Expected method signature is ``on_message(client, topic, message)``
"""
return self._on_message
@on_message.setter
def on_message(self, method):
self._on_message = method
def _handle_on_message(self, client, topic, message):
matched = False
if topic is not None:
for callback in self._on_message_filtered.iter_match(topic):
callback(client, topic, message) # on_msg with callback
matched = True
if not matched and self.on_message: # regular on_message
self.on_message(client, topic, message)
def set_last_will(self, topic, msg, retain=False, qos=0):
assert 0 <= qos <= 2
assert topic
self.lw_topic = topic
self.lw_msg = msg
self.lw_qos = qos
self.lw_retain = retain
def connect(self, clean_session=True):
self.sock = socket.socket()
self.sock.connect(self.addr)
print(self.addr)
if self.ssl:
import ussl
self.sock = ussl.wrap_socket(self.sock, **self.ssl_params)
msg_header=bytearray([0x10])
msg = bytearray(b"\x04MQTT\x04\x02\0\0")
msg_length = 12 + len(self.client_id)
msg[6] = clean_session << 1
if self.username is not None:
msg_length += 2 + len(self.username) + 2 + len(self.password)
msg[6] |= 0xC0
if self.keepalive:
assert self.keepalive < 65536
msg[7] |= self.keepalive >> 8
msg[8] |= self.keepalive & 0x00FF
if self.lw_topic:
msg_length += 2 + len(self.lw_topic) + 2 + len(self.lw_msg)
msg[6] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3
msg[6] |= self.lw_retain << 5
if msg_length > 0x7F:
while msg_length>0:
encoded_byte = msg_length % 0x80
msg_length = msg_length // 0x80
if msg_length > 0:
encoded_byte |= 0x80
msg_header.append(encoded_byte)
msg_header.append(0x00)
else:
msg_header.append(msg_length)
msg_header.append(0x00)
self.sock.write(msg_header)
self.sock.write(msg)
#print(hexlify(msg_header, ":"), hexlify(msg, ":"))
self._send_str(self.client_id)
if self.lw_topic:
self._send_str(self.lw_topic)
self._send_str(self.lw_msg)
if self.username is not None:
self._send_str(self.username)
self._send_str(self.password)
resp = self.sock.read(4)
assert resp[0] == 0x20 and resp[1] == 0x02
if resp[3] != 0:
raise MQTTException(resp[3])
return resp[2] & 1
def disconnect(self,MQTT_USR_PRJ):
#MQTT_USR_PRJ = "{}/{}/".format(self.username,self.project)
self.publish(MQTT_USR_PRJ+WILL_TOPIC, self.client_id, qos=1)
self.sock.write(b"\xe0\0")
self.sock.close()
def ping(self):
self.sock.write(b"\xc0\0")
def pingSync(self):
time.ticks_ms()
self.ping()
for i in range(0,10):
msg = self.check_msg()
if msg == "PINGRESP":
return True
time.sleep_ms(100)
return False
def publish(self, topic, msg, retain=False, qos=0):
# msg = pubData(msg)
if "+" in topic or "#" in topic:
raise MQTTException("Publish topic can not contain wildcards.")
# check msg/qos kwargs
if msg is None:
raise MQTTException("Message can not be None.")
if isinstance(msg, (int, float)):
msg = str(msg).encode("ascii")
elif isinstance(msg, str):
msg = str(msg).encode("utf-8")
elif isinstance(msg, bytes):
pass
else:
raise MQTTException("Invalid message data type.")
pkt = bytearray(b"\x30\0\0\0")
pkt[0] |= qos << 1 | retain
sz = 2 + len(topic) + len(msg)
if qos > 0:
sz += 2
assert sz < 2097152
i = 1
while sz > 0x7f:
pkt[i] = (sz & 0x7f) | 0x80
sz >>= 7
i += 1
pkt[i] = sz
#print(hex(len(pkt)), hexlify(pkt, ":"))
self.sock.write(pkt, i + 1)
self._send_str(topic)
if qos > 0:
self.pid += 1
pid = self.pid
struct.pack_into("!H", pkt, 0, pid)
self.sock.write(pkt, 2)
self.sock.write(msg)
if qos == 1:
while 1:
op = self.wait_msg()
if op == 0x40:
sz = self.sock.read(1)
assert sz == b"\x02"
rcv_pid = self.sock.read(2)
rcv_pid = rcv_pid[0] << 8 | rcv_pid[1]
if pid == rcv_pid:
return
elif qos == 2:
assert 0
def subscribe(self, topic, qos=0):
#assert self.cb is not None, "Subscribe callback is not set"
pkt = bytearray(b"\x82\0\0\0")
self.pid += 1
if isinstance(topic, str):
topic=topic.encode()
struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, self.pid)
#print(hex(len(pkt)), hexlify(pkt, ":"))
self.sock.write(pkt)
self._send_str(topic)
self.sock.write(qos.to_bytes(1, "little"))
while 1:
op = self.wait_msg()
if op == 0x90:
resp = self.sock.read(4)
#print(resp)
assert resp[1] == pkt[2] and resp[2] == pkt[3]
if resp[3] == 0x80:
raise MQTTException(resp[3])
return
# Wait for a single incoming MQTT message and process it.
# Subscribed messages are delivered to a callback previously
# set by .set_callback() method. Other (internal) MQTT
# messages processed internally.
def wait_msg(self):
res = self.sock.read(1)
self.sock.setblocking(True)
if res is None:
return None
if res == b"":
raise OSError(-1)
if res == b"\xd0": # PINGRESP
sz = self.sock.read(1)[0]
assert sz == 0
return "PINGRESP"
op = res[0]
if op & 0xf0 != 0x30:
return op
sz = self._recv_len()
topic_len = self.sock.read(2)
topic_len = (topic_len[0] << 8) | topic_len[1]
topic = self.sock.read(topic_len)
sz -= topic_len + 2
if op & 6:
pid = self.sock.read(2)
pid = pid[0] << 8 | pid[1]
sz -= 2
msg = self.sock.read(sz)
self._handle_on_message(self, str(topic, "utf-8"), str(msg, "utf-8"))
#self.cb(topic.decode(), msg.decode())
if op & 6 == 2:
pkt = bytearray(b"\x40\x02\0\0")
struct.pack_into("!H", pkt, 2, pid)
self.sock.write(pkt)
elif op & 6 == 4:
assert 0
# Checks whether a pending message from server is available.
# If not, returns immediately with None. Otherwise, does
# the same processing as wait_msg.
def check_msg(self):
self.sock.setblocking(False)
return self.wait_msg()

View File

@@ -0,0 +1,25 @@
import hashlib
import os
def sha_file(f):
if f not in set(os.listdir(".")):
return 'None:::sha_file_end'
else:
sha = hashlib.sha256()
with open(f, encoding='utf-8') as fd:
file_buffer = fd.read(128).encode("utf-8")
while len(file_buffer) > 0:
sha.update(file_buffer)
file_buffer = fd.read(128).encode("utf-8")
h = sha.digest()
return ''.join(['%.2x' % i for i in h]) + ":::sha_file_end"
def reload(mod):
import sys
mod_name = mod.__name__
try:
del sys.modules[mod_name]
__import__(mod_name)
except:
pass

View File

@@ -0,0 +1,84 @@
#coding=utf-8
import math
def math_map(v, al, ah, bl, bh):
if al==ah:
return bl
if al > ah:
al, ah = ah, al
if v > ah:
v = ah
if v < al:
v = al
return bl + (bh - bl) * (v - al) / (ah - al)
def math_mean(myList):
localList = [e for e in myList if type(e) == int or type(e) == float]
if not localList: return
return float(sum(localList)) / len(localList)
def math_median(myList):
localList = sorted([e for e in myList if type(e) == int or type(e) == float])
if not localList: return
if len(localList) % 2 == 0:
return (localList[len(localList) // 2 - 1] + localList[len(localList) // 2]) / 2.0
else:
return localList[(len(localList) - 1) // 2]
def math_modes(some_list):
modes = []
# Using a lists of [item, count] to keep count rather than dict
# to avoid "unhashable" errors when the counted item is itself a list or dict.
counts = []
maxCount = 1
for item in some_list:
found = False
for count in counts:
if count[0] == item:
count[1] += 1
maxCount = max(maxCount, count[1])
found = True
if not found:
counts.append([item, 1])
for counted_item, item_count in counts:
if item_count == maxCount:
modes.append(counted_item)
return modes
def math_standard_deviation(numbers):
n = len(numbers)
if n == 0: return
mean = float(sum(numbers)) / n
variance = sum((x - mean) ** 2 for x in numbers) / n
return math.sqrt(variance)
def lists_sort(my_list, type, reverse):
def try_float(s):
try:
return float(s)
except:
return 0
key_funcs = {
"NUMERIC": try_float,
"TEXT": str,
"IGNORE_CASE": lambda s: str(s).lower()
}
key_func = key_funcs[type]
list_cpy = list(my_list)
return sorted(list_cpy, key=key_func, reverse=reverse)
def format_content(mydict, cid):
if 'lat' in mydict and 'long' in mydict:
res = '{'+'"lat": "{}", "long": "{}", "clientid": "{}"'.format(mydict.pop('lat'),mydict.pop('long'),cid)
if len(mydict)>0:
res += ', "message": ['
for d in mydict:
res += '{{"label": "{}", "value": "{}"}},'.format(d,mydict[d])
res = res[:-1] + "]"
res += '}'
return res
else:
print('Invalid Input')
def format_str(d):
return str(d).replace("'",'"')

View File

@@ -0,0 +1,566 @@
#
# This file is part of MicroPython MPU9250 driver
# Copyright (c) 2018 Mika Tuupola
#
# Licensed under the MIT license:
# http://www.opensource.org/licenses/mit-license.php
#
# Project home:
# https://github.com/tuupola/micropython-mpu9250
#
"""
MicroPython I2C driver for MPU9250 9-axis motion tracking device
"""
# pylint: disable=import-error
from micropython import const
import ustruct
import utime
import time
import math
#from machine import I2C, Pin
# pylint: enable=import-error
__version__ = "0.2.0"
# pylint: disable=import-error
# pylint: enable=import-error
_GYRO_CONFIG = const(0x1b)
_ACCEL_CONFIG = const(0x1c)
_ACCEL_CONFIG2 = const(0x1d)
_INT_PIN_CFG = const(0x37)
_ACCEL_XOUT_H = const(0x3b)
_ACCEL_XOUT_L = const(0x3c)
_ACCEL_YOUT_H = const(0x3d)
_ACCEL_YOUT_L = const(0x3e)
_ACCEL_ZOUT_H = const(0x3f)
_ACCEL_ZOUT_L= const(0x40)
_TEMP_OUT_H = const(0x41)
_TEMP_OUT_L = const(0x42)
_GYRO_XOUT_H = const(0x43)
_GYRO_XOUT_L = const(0x44)
_GYRO_YOUT_H = const(0x45)
_GYRO_YOUT_L = const(0x46)
_GYRO_ZOUT_H = const(0x47)
_GYRO_ZOUT_L = const(0x48)
_WHO_AM_I = const(0x75)
#_ACCEL_FS_MASK = const(0b00011000)
ACCEL_FS_SEL_2G = const(0b00000000)
ACCEL_FS_SEL_4G = const(0b00001000)
ACCEL_FS_SEL_8G = const(0b00010000)
ACCEL_FS_SEL_16G = const(0b00011000)
_ACCEL_SO_2G = 16384 # 1 / 16384 ie. 0.061 mg / digit
_ACCEL_SO_4G = 8192 # 1 / 8192 ie. 0.122 mg / digit
_ACCEL_SO_8G = 4096 # 1 / 4096 ie. 0.244 mg / digit
_ACCEL_SO_16G = 2048 # 1 / 2048 ie. 0.488 mg / digit
#_GYRO_FS_MASK = const(0b00011000)
GYRO_FS_SEL_250DPS = const(0b00000000)
GYRO_FS_SEL_500DPS = const(0b00001000)
GYRO_FS_SEL_1000DPS = const(0b00010000)
GYRO_FS_SEL_2000DPS = const(0b00011000)
_GYRO_SO_250DPS = 131
_GYRO_SO_500DPS = 62.5
_GYRO_SO_1000DPS = 32.8
_GYRO_SO_2000DPS = 16.4
# Used for enablind and disabling the i2c bypass access
_I2C_BYPASS_MASK = const(0b00000010)
_I2C_BYPASS_EN = const(0b00000010)
_I2C_BYPASS_DIS = const(0b00000000)
SF_G = 1
SF_M_S2 = 9.80665 # 1 g = 9.80665 m/s2 ie. standard gravity
SF_DEG_S = 1
SF_RAD_S = 57.295779578552 # 1 rad/s is 57.295779578552 deg/s
_WIA = const(0x00)
_HXL = const(0x03)
_HXH = const(0x04)
_HYL = const(0x05)
_HYH = const(0x06)
_HZL = const(0x07)
_HZH = const(0x08)
_ST2 = const(0x09)
_CNTL1 = const(0x0a)
_ASAX = const(0x10)
_ASAY = const(0x11)
_ASAZ = const(0x12)
_MODE_POWER_DOWN = 0b00000000
MODE_SINGLE_MEASURE = 0b00000001
MODE_CONTINOUS_MEASURE_1 = 0b00000010 # 8Hz
MODE_CONTINOUS_MEASURE_2 = 0b00000110 # 100Hz
MODE_EXTERNAL_TRIGGER_MEASURE = 0b00000100
_MODE_SELF_TEST = 0b00001000
_MODE_FUSE_ROM_ACCESS = 0b00001111
OUTPUT_14_BIT = 0b00000000
OUTPUT_16_BIT = 0b00010000
_SO_14BIT = 0.6 # 渭T per digit when 14bit mode
_SO_16BIT = 0.15 # 渭T per digit when 16bit mode
class MPU6500:
"""Class which provides interface to MPU6500 6-axis motion tracking device."""
def __init__(
self, i2c, address=0x68,
accel_fs=ACCEL_FS_SEL_2G, gyro_fs=GYRO_FS_SEL_250DPS,
accel_sf=SF_M_S2, gyro_sf=SF_RAD_S
):
self.i2c = i2c
self.address = address
if 0x71 != self.whoami:
raise RuntimeError("MPU6500 not found in I2C bus.")
self._accel_so = self._accel_fs(accel_fs)
self._gyro_so = self._gyro_fs(gyro_fs)
self._accel_sf = accel_sf
self._gyro_sf = gyro_sf
# Enable I2C bypass to access for MPU9250 magnetometer access.
char = self._register_char(_INT_PIN_CFG)
char &= ~_I2C_BYPASS_MASK # clear I2C bits
char |= _I2C_BYPASS_EN
self._register_char(_INT_PIN_CFG, char)
@property
def temperature(self):
tempbuf=self._register_short(0x41)
return tempbuf/333.87 + 21 # I think
# @property
def acceleration(self):
"""
Acceleration measured by the sensor. By default will return a
3-tuple of X, Y, Z axis acceleration values in m/s^2 as floats. Will
return values in g if constructor was provided `accel_sf=SF_M_S2`
parameter.
"""
so = self._accel_so
sf = self._accel_sf
xyz = self._register_three_shorts(_ACCEL_XOUT_H)
return tuple([value / so * sf for value in xyz])
@property
def gyro(self):
"""
X, Y, Z radians per second as floats.
"""
so = self._gyro_so
sf = self._gyro_sf
xyz = self._register_three_shorts(_GYRO_XOUT_H)
return tuple([value / so * sf for value in xyz])
@property
def whoami(self):
""" Value of the whoami register. """
return self._register_char(_WHO_AM_I)
def _register_short(self, register, value=None, buf=bytearray(2)):
if value is None:
self.i2c.readfrom_mem_into(self.address, register, buf)
return ustruct.unpack(">h", buf)[0]
ustruct.pack_into(">h", buf, 0, value)
return self.i2c.writeto_mem(self.address, register, buf)
def _register_three_shorts(self, register, buf=bytearray(6)):
self.i2c.readfrom_mem_into(self.address, register, buf)
return ustruct.unpack(">hhh", buf)
def _register_char(self, register, value=None, buf=bytearray(1)):
if value is None:
self.i2c.readfrom_mem_into(self.address, register, buf)
return buf[0]
ustruct.pack_into("<b", buf, 0, value)
return self.i2c.writeto_mem(self.address, register, buf)
def _accel_fs(self, value):
self._register_char(_ACCEL_CONFIG, value)
# Return the sensitivity divider
if ACCEL_FS_SEL_2G == value:
return _ACCEL_SO_2G
elif ACCEL_FS_SEL_4G == value:
return _ACCEL_SO_4G
elif ACCEL_FS_SEL_8G == value:
return _ACCEL_SO_8G
elif ACCEL_FS_SEL_16G == value:
return _ACCEL_SO_16G
def _gyro_fs(self, value):
self._register_char(_GYRO_CONFIG, value)
# Return the sensitivity divider
if GYRO_FS_SEL_250DPS == value:
return _GYRO_SO_250DPS
elif GYRO_FS_SEL_500DPS == value:
return _GYRO_SO_500DPS
elif GYRO_FS_SEL_1000DPS == value:
return _GYRO_SO_1000DPS
elif GYRO_FS_SEL_2000DPS == value:
return _GYRO_SO_2000DPS
def __enter__(self):
return self
def __exit__(self, exception_type, exception_value, traceback):
pass
class AK8963:
"""Class which provides interface to AK8963 magnetometer."""
def __init__(
self, i2c, address=0x0c,
mode=MODE_CONTINOUS_MEASURE_1, output=OUTPUT_16_BIT,
offset=(0, 0, 0), scale=(1, 1, 1)
):
self.i2c = i2c
self.address = address
self._offset = offset
self._scale = scale
if 0x48 != self.whoami:
raise RuntimeError("AK8963 not found in I2C bus.")
# Sensitivity adjustement values
self._register_char(_CNTL1, _MODE_FUSE_ROM_ACCESS)
asax = self._register_char(_ASAX)
asay = self._register_char(_ASAY)
asaz = self._register_char(_ASAZ)
self._register_char(_CNTL1, _MODE_POWER_DOWN)
# Should wait atleast 100us before next mode
self._adjustement = (
(0.5 * (asax - 128)) / 128 + 1,
(0.5 * (asay - 128)) / 128 + 1,
(0.5 * (asaz - 128)) / 128 + 1
)
# Power on
self._register_char(_CNTL1, (mode | output))
if output is OUTPUT_16_BIT:
self._so = _SO_16BIT
else:
self._so = _SO_14BIT
@property
def magnetic(self):
"""
X, Y, Z axis micro-Tesla (uT) as floats.
"""
xyz = list(self._register_three_shorts(_HXL))
self._register_char(_ST2) # Enable updating readings again
# Apply factory axial sensitivy adjustements
xyz[0] *= self._adjustement[0]
xyz[1] *= self._adjustement[1]
xyz[2] *= self._adjustement[2]
# Apply output scale determined in constructor
so = self._so
xyz[0] *= so
xyz[1] *= so
xyz[2] *= so
# Apply hard iron ie. offset bias from calibration
xyz[0] -= self._offset[0]
xyz[1] -= self._offset[1]
xyz[2] -= self._offset[2]
# Apply soft iron ie. scale bias from calibration
xyz[0] *= self._scale[0]
xyz[1] *= self._scale[1]
xyz[2] *= self._scale[2]
return tuple(xyz)
@property
def adjustement(self):
return self._adjustement
@property
def whoami(self):
""" Value of the whoami register. """
return self._register_char(_WIA)
def calibrate(self, count=3, delay=200):
self._offset = (0, 0, 0)
self._scale = (1, 1, 1)
reading = self.magnetic
minx = maxx = reading[0]
miny = maxy = reading[1]
minz = maxz = reading[2]
while count:
utime.sleep_ms(delay)
reading = self.magnetic
minx = min(minx, reading[0])
maxx = max(maxx, reading[0])
miny = min(miny, reading[1])
maxy = max(maxy, reading[1])
minz = min(minz, reading[2])
maxz = max(maxz, reading[2])
count -= 1
# Hard iron correction
offset_x = (maxx + minx) / 2
offset_y = (maxy + miny) / 2
offset_z = (maxz + minz) / 2
self._offset = (offset_x, offset_y, offset_z)
# Soft iron correction
avg_delta_x = (maxx - minx) / 2
avg_delta_y = (maxy - miny) / 2
avg_delta_z = (maxz - minz) / 2
avg_delta = (avg_delta_x + avg_delta_y + avg_delta_z) / 3
scale_x = avg_delta / avg_delta_x
scale_y = avg_delta / avg_delta_y
scale_z = avg_delta / avg_delta_z
self._scale = (scale_x, scale_y, scale_z)
return self._offset, self._scale
def _register_short(self, register, value=None, buf=bytearray(2)):
if value is None:
self.i2c.readfrom_mem_into(self.address, register, buf)
return ustruct.unpack("<h", buf)[0]
ustruct.pack_into("<h", buf, 0, value)
return self.i2c.writeto_mem(self.address, register, buf)
def _register_three_shorts(self, register, buf=bytearray(6)):
self.i2c.readfrom_mem_into(self.address, register, buf)
return ustruct.unpack("<hhh", buf)
def _register_char(self, register, value=None, buf=bytearray(1)):
if value is None:
self.i2c.readfrom_mem_into(self.address, register, buf)
return buf[0]
ustruct.pack_into("<b", buf, 0, value)
return self.i2c.writeto_mem(self.address, register, buf)
def __enter__(self):
return self
def __exit__(self, exception_type, exception_value, traceback):
pass
class MPU9250:
"""Class which provides interface to MPU9250 9-axis motion tracking device."""
def __init__(self, i2c, mpu6500 = None, ak8963 = None):
if mpu6500 is None:
self.mpu6500 = MPU6500(i2c)
else:
self.mpu6500 = mpu6500
if ak8963 is None:
self.ak8963 = AK8963(i2c)
else:
self.ak8963 = ak8963
# @property
# def acceleration(self):
# """
# Acceleration measured by the sensor. By default will return a
# 3-tuple of X, Y, Z axis values in m/s^2 as floats. To get values in g
# pass `accel_fs=SF_G` parameter to the MPU6500 constructor.
# """
# return self.mpu6500.acceleration
def mpu9250_get_temperature(self):
return self.mpu6500.temperature
def mpu9250_get_values(self):
"""
Acceleration measured by the sensor. By default will return a
3-tuple of X, Y, Z axis values in m/s^2 as floats. To get values in g
pass `accel_fs=SF_G` parameter to the MPU6500 constructor.
"""
g = self.mpu6500.acceleration()
a = [round(x/9.8, 2) for x in g]
return tuple(a)
def mpu9250_get_x(self):
"""
Acceleration measured by the sensor. By default will return a
3-tuple of X, Y, Z axis values in m/s^2 as floats. To get values in g
pass `accel_fs=SF_G` parameter to the MPU6500 constructor.
"""
return round(self.mpu6500.acceleration()[0]/9.8, 2)
def mpu9250_get_y(self):
"""
Acceleration measured by the sensor. By default will return a
3-tuple of X, Y, Z axis values in m/s^2 as floats. To get values in g
pass `accel_fs=SF_G` parameter to the MPU6500 constructor.
"""
return round(self.mpu6500.acceleration()[1]/9.8, 2)
def mpu9250_get_z(self):
"""
Acceleration measured by the sensor. By default will return a
3-tuple of X, Y, Z axis values in m/s^2 as floats. To get values in g
pass `accel_fs=SF_G` parameter to the MPU6500 constructor.
"""
return round(self.mpu6500.acceleration()[2]/9.8, 2)
def mpu9250_is_gesture(self,choice):
if choice == 'face up':
if self.mpu6500.acceleration()[2] <= -9:
return True
else:
return False
if choice == 'face down':
if self.mpu6500.acceleration()[2] >= 9:
return True
else:
return False
if choice == 'shake':
if abs(self.mpu6500.acceleration()[0]) >= 9 and abs(self.mpu6500.acceleration()[1]) >= 9 :
return True
else:
return False
if choice == 'up':
if self.mpu6500.acceleration()[1] >= 9:
return True
else:
return False
if choice == 'down':
if self.mpu6500.acceleration()[1] <= -9:
return True
else:
return False
if choice == 'right':
if self.mpu6500.acceleration()[0] <= -9:
return True
else:
return False
if choice == 'left':
if self.mpu6500.acceleration()[0] >= 9:
return True
else:
return False
@property
def mpu9250_gyro(self):
"""
Gyro measured by the sensor. By default will return a 3-tuple of
X, Y, Z axis values in rad/s as floats. To get values in deg/s pass
`gyro_sf=SF_DEG_S` parameter to the MPU6500 constructor.
"""
return self.mpu6500.gyro
def mpu9250_gyro_x(self):
return self.mpu6500.gyro[0]
def mpu9250_gyro_y(self):
return self.mpu6500.gyro[1]
def mpu9250_gyro_z(self):
return self.mpu6500.gyro[2]
def mpu9250_gyro_values(self):
return self.mpu6500.gyro
@property
def mpu9250_magnetic(self):
"""
X, Y, Z axis micro-Tesla (uT) as floats.
"""
return self.ak8963.magnetic
def mpu9250_magnetic_x(self):
return self.mpu9250_magnetic[0]
def mpu9250_magnetic_y(self):
return self.mpu9250_magnetic[1]
def mpu9250_magnetic_z(self):
return self.mpu9250_magnetic[2]
def mpu9250_magnetic_values(self):
return self.mpu9250_magnetic
# @property
def mpu9250_get_field_strength(self):
x=self.mpu9250_magnetic[0]
y=self.mpu9250_magnetic[1]
z=self.mpu9250_magnetic[2]
return (x**2+y**2+z**2)**0.5*1000
def mpu9250_heading(self):
x=self.mpu9250_magnetic[0]
y=self.mpu9250_magnetic[1]
z=self.mpu9250_magnetic[2]
a=math.atan(z/x)
b=math.atan(z/y)
xr=x*math.cos(a)+y*math.sin(a)*math.sin(b)-z*math.cos(b)*math.sin(a)
yr=x*math.cos(b)+z*math.sin(b)
return 60*math.atan(yr/xr)
@property
def whoami(self):
return self.mpu6500.whoami
def __enter__(self):
return self
def __exit__(self, exception_type, exception_value, traceback):
pass
class Compass:
RAD_TO_DEG = 57.295779513082320876798154814105
def __init__(self, sensor):
self.sensor = sensor
def get_x(self):
return self.sensor.mpu9250_magnetic[0]
def get_y(self):
return self.sensor.mpu9250_magnetic[1]
def get_z(self):
return self.sensor.mpu9250_magnetic[2]
def get_field_strength(self):
return self.sensor.mpu9250_get_field_strength()
def heading(self):
from math import atan2
xyz = self.sensor.mpu9250_magnetic
return int(((atan2(xyz[1], xyz[0]) * Compass.RAD_TO_DEG) + 180) % 360)
def is_calibrate(self):
try:
import compass_cfg
return True
except Exception as e:
return False
def reset_calibrate(self):
import os
os.remove("compass_cfg.py")
# compass = mpu
# accelerometer = mpu

View File

@@ -0,0 +1,142 @@
"""
MS32006
Micropython library for the MS32006 step diever
=======================================================
#Changed from circuitpython to micropython 20211206
dahanzimin From the Mixly Team
"""
import time
from micropython import const
MS32006_REG_RESET = const(0x00) #复位
MS32006_FCLK = const(25000000) #芯片输入时钟选择,此参数与运动速度有关。 范围是5-30MHZ
ADDRESS_A = 0x10
ADDRESS_B = 0x18
MOT_FULL = 0
MOT_HALF = 1
MOT_A = 0
MOT_B = 4
MOT_N = 0
MOT_CW = 1
MOT_CCW = 2
MOT_P = 3
class MS32006:
_buffer = bytearray(2)
def __init__(self, i2c_bus,addr=ADDRESS_A,mode=MOT_FULL):
self._device = i2c_bus
self._address = addr
self.reset()
self.mode=mode
def _read_u8(self, address):
self._buffer[0] = address & 0xFF
self._device.writeto(self._address,self._buffer)
self._device.readfrom_into(self._address,self._buffer)
return self._buffer[0]
def _write_u8(self, address, val):
self._buffer[0] = address & 0xFF
self._buffer[1] = val & 0xFF
self._device.writeto(self._address,self._buffer)
def reset(self):
self._write_u8(MS32006_REG_RESET,0x00)
time.sleep(0.1)
self._write_u8(MS32006_REG_RESET,0xC1)
def move(self,moto,mot_dir,mot_pps,mot_step):
readstate_0H = self._read_u8(0x00)
readstate_9H = self._read_u8(0x09)
speed_data=MS32006_FCLK//mot_pps//128 #设置速度 xx pps 128是固定参数
if speed_data<32: #限定转速
speed_data=32
elif speed_data>16383:
speed_data=16383
mot_speed_l=speed_data&0x00ff #取低8位
mot_speed_h=speed_data//0x100 #取高6位
if self.mode==MOT_FULL: #设置整步、半步驱动模式
mot_speed_h|=0x80
else:
mot_speed_h&=0x7f
if mot_step>2047:
raise AttributeError("Reach the set upper limit, up to 2047 step")
mot_step_l=mot_step&0x00ff
mot_step_h=mot_step//0x100
mot_step_h|=0x80
if mot_dir==MOT_CW:
mot_step_h&=0xBF
else:
mot_step_h|=0x40
self._write_u8(0x01+moto,mot_speed_l)
self._write_u8(0x02+moto,mot_speed_h)
self._write_u8(0x03+moto,mot_step_l)
self._write_u8(0x04+moto,mot_step_h)
if moto==MOT_A:
self._write_u8(0x00, readstate_0H&0xfb)
self._write_u8(0x09, readstate_9H|0x80)
else:
self._write_u8(0x00, readstate_0H&0xfd)
self._write_u8(0x09, readstate_9H|0x40)
def close(self,moto): #停止并关闭输出
if moto==MOT_A:
self._write_u8(0x04,0x00)
else:
self._write_u8(0x08,0x00)
def stop(self,moto): #此停止函数,强制让电机停止
readstate = self._read_u8(0x00)
if moto==MOT_A:
self._write_u8(0x00,readstate|0x04)
else:
self._write_u8(0x00,readstate|0x02)
def readstep(self,moto): #读取电机运动步数
if moto==MOT_A:
rdb =self._read_u8(0x0b)
rdc =self._read_u8(0x0c)
else:
rdb =self._read_u8(0x0d)
rdc =self._read_u8(0x0e)
return (rdb*0x100+rdc)&0xfff
def readbusy(self,moto): #读取电机缓存是否有数据
if moto==MOT_A:
busy =(self._read_u8(0x0b)>>6)&1
else:
busy =(self._read_u8(0x0d)>>6)&1
return bool(busy)
def readwork(self,moto): #读取电机是否在运行
if moto==MOT_A:
busy =(self._read_u8(0x0b)>>4)&1
else:
busy =(self._read_u8(0x0d)>>4)&1
return bool(busy)
def dc_motor(self,state,speed): #直流电机驱动
if (state==MOT_CW) | (state==MOT_CCW) :
speed_st=speed*127//100 |0x80
self._write_u8(0x0A,speed_st)
readstate = self._read_u8(0x09) & 0xA0
state_st=(state<<2) | 0X03 | readstate
self._write_u8(0x09,state_st)

View File

@@ -0,0 +1,48 @@
import network,time,board
from machine import UART
import time
def wifi_init(RX_Pin,TX_Pin):
board.register(TX_Pin,board.FPIOA.UART2_TX)
board.register(RX_Pin,board.FPIOA.UART2_RX)
uart = UART(UART.UART2,115200,timeout=1000, read_buf_len=1024*16)
T1=time.ticks_ms()
while True:
tmp=uart.read()
if tmp:
if tmp.endswith("OK\r\n"):
break
else:
uart.write("AT+RST\r\n")
time.sleep_ms(20)
if time.ticks_diff(time.ticks_ms(), T1) >2000:
raise AttributeError("ESP-AT not connected or needs to be reset")
try:
nic = network.ESP8285(uart)
time.sleep(1)
print("ESP-AT OK")
return nic
except Exception:
raise AttributeError("ESP-AT Connection Failed")
def wifi_deal_ap_info(info):
res = []
for ap_str in info:
ap_str = ap_str.split(",")
info_one = []
for node in ap_str:
if node.startswith('"'):
info_one.append(node[1:-1])
else:
info_one.append(int(node))
res.append(info_one)
return res
def scans(nic):
ap_info = nic.scan()
ap_info = wifi_deal_ap_info(ap_info)
ap_info.sort(key=lambda x:x[2], reverse=True)
return ap_info

View File

@@ -0,0 +1,46 @@
import time
from math import pi, isnan
class PID:
_kp = _ki = _kd = _integrator = _imax = 0
_last_error = _last_derivative = _last_t = 0
_RC = 1/(2 * pi * 20)
def __init__(self, p=0, i=0, d=0, imax=0):
self._kp = float(p)
self._ki = float(i)
self._kd = float(d)
self._imax = abs(imax)
self._last_derivative = float('nan')
def get_pid(self, error, scaler):
tnow = time.ticks_ms()
dt = tnow - self._last_t
output = 0
if self._last_t == 0 or dt > 1000:
dt = 0
self.reset_I()
self._last_t = tnow
delta_time = float(dt) / float(1000)
output += error * self._kp
if abs(self._kd) > 0 and dt > 0:
if isnan(self._last_derivative):
derivative = 0
self._last_derivative = 0
else:
derivative = (error - self._last_error) / delta_time
derivative = self._last_derivative + \
((delta_time / (self._RC + delta_time)) * \
(derivative - self._last_derivative))
self._last_error = error
self._last_derivative = derivative
output += self._kd * derivative
output *= scaler
if abs(self._ki) > 0 and dt > 0:
self._integrator += (error * self._ki) * scaler * delta_time
if self._integrator < -self._imax: self._integrator = -self._imax
elif self._integrator > self._imax: self._integrator = self._imax
output += self._integrator
return output
def reset_I(self):
self._integrator = 0
self._last_derivative = float('nan')

View File

@@ -0,0 +1,128 @@
import board
import audio,video
from Maix import I2S
import gc
spk_b=None
spk_d=None
spk_w=None
def spk_init(BLK=8,WS=9,DAT=10,sample_rate=16000):
global spk_b
global spk_d
global spk_w
spk_b=BLK
spk_d=DAT
spk_w=WS
board.register(DAT,board.FPIOA.I2S0_OUT_D1)
board.register(BLK,board.FPIOA.I2S0_SCLK)
board.register(WS,board.FPIOA.I2S0_WS)
wav_dev = I2S(I2S.DEVICE_0)
wav_dev.channel_config(I2S.CHANNEL_1, I2S.TRANSMITTER,resolution = I2S.RESOLUTION_16_BIT, cycles = I2S.SCLK_CYCLES_32, align_mode = I2S.STANDARD_MODE)
wav_dev.set_sample_rate(sample_rate)
spk_rep=wav_dev
return wav_dev
def mic_init(BLK=35,WS=33,DAT=34,sample_rate=16000):
board.register(DAT,board.FPIOA.I2S2_IN_D0)
board.register(BLK,board.FPIOA.I2S2_SCLK)
board.register(WS,board.FPIOA.I2S2_WS)
wav_dev = I2S(I2S.DEVICE_2)
wav_dev.channel_config(I2S.CHANNEL_0, I2S.RECEIVER, resolution = I2S.RESOLUTION_16_BIT, cycles = I2S.SCLK_CYCLES_32, align_mode=I2S.STANDARD_MODE)
wav_dev.set_sample_rate(sample_rate)
return wav_dev
def audio_play(I2S,path,num=80):
try:
player = audio.Audio(path=path)
except Exception as e:
raise NameError("No audio file loaded or {}".format(e))
player.volume(num)
wav_info=player.play_process(I2S)
I2S.set_sample_rate(wav_info[1])
while True:
ret = player.play()
if ret == None:
print("Format Error")
break
elif ret == 0:
print("Play end \n")
player.finish()
break
player.__deinit__()
gc.collect()
def audio_record(I2S,path,record_time,sample_rate=16000):
try:
recorder = audio.Audio(path=path, is_create=True, samplerate=sample_rate)
except Exception as e:
raise NameError("Need audio storage location or {}".format(e))
queue = []
frame_cnt = record_time*sample_rate//2048
for i in range(frame_cnt):
tmp = I2S.record(2048*2)
if len(queue) > 0:
ret = recorder.record(queue[0])
queue.pop(0)
I2S.wait_record()
queue.append(tmp)
print("record:{}s".format(round(((frame_cnt-i-1)/7.7) ,1)))
recorder.finish()
recorder.__deinit__()
del recorder
print("Audio record finish \n")
gc.collect()
def video_play(I2S1,path,num=80):
try:
global spk_b
global spk_d
global spk_w
import lcd
lcd.init()
I2S=spk_init(spk_b,spk_w,spk_d)
vide = video.open(path)
except Exception as e:
raise NameError("No video file loaded or {}".format(e))
vide.volume(num)
while True:
try:
ret = vide.play()
except Exception as e:
raise NameError("Video format error or {}".format(e))
if ret == None:
print("Format Error")
break
elif ret == 0:
print("Play end \n")
break
vide.__del__()
del vide
del I2S
gc.collect()
def video_record(I2S,path,record_time):
import sensor,lcd
lcd.init()
try:
v = video.open(path, audio=False, record=True, interval=200000, quality=80,width=240, height=240)
except Exception as e:
raise NameError("Need video storage location or {}".format(e))
record_time=record_time*5
for i in range(record_time):
try:
img = sensor.snapshot()
except :
raise NameError("Need to initialize camera")
lcd.display(img)
v.record(img)
print("record {}s".format(round((record_time-i-1)*0.2,1)))
v.record_finish()
print("Video record finish \n")
v.__del__()
gc.collect()

View File

@@ -0,0 +1,33 @@
try:
import image
image.font_free()
except:
pass
try:
import lcd,time,gc,machine
lcd.init(color=0x0000)
lcd.draw_string(48,100, "Welcome to MixGo!", lcd.YELLOW, lcd.BLACK)
lcd.draw_string(62,132, "loading .", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50)
lcd.draw_string(62,132, "loading ..", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50)
lcd.draw_string(62,132, "loading ...", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50)
lcd.draw_string(62,132, "loading ....", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50)
lcd.draw_string(62,132, "loading .....", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50)
lcd.draw_string(62,132, "loading ......", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50)
lcd.draw_string(62,132, "loading .......", lcd.YELLOW, lcd.BLACK)
time.sleep_ms(50)
lcd.clear(0x0000)
del time
del lcd
del gc
finally:
import gc
gc.collect()

View File

@@ -0,0 +1,90 @@
# 使用 PAC9685
import math
import ustruct
import time
class PCA9685:
def __init__(self, i2c, address=0x40):
self.i2c = i2c
self.address = address
self.reset()
def _write(self, address, value):
self.i2c.writeto_mem(self.address, address, bytearray([value]))
def _read(self, address):
return self.i2c.readfrom_mem(self.address, address, 1)[0]
def reset(self):
self._write(0x00, 0x00) # Mode1
def freq(self, freq=None):
if freq is None:
return int(25000000.0 / 4096 / (self._read(0xfe) - 0.5))
prescale = int(25000000.0 / 4096.0 / freq + 0.5)
old_mode = self._read(0x00) # Mode 1
self._write(0x00, (old_mode & 0x7F) | 0x10) # Mode 1, sleep
self._write(0xfe, prescale) # Prescale
self._write(0x00, old_mode) # Mode 1
time.sleep_us(5)
self._write(0x00, old_mode | 0xa1) # Mode 1, autoincrement on
def pwm(self, index, on=None, off=None):
if on is None or off is None:
data = self.i2c.readfrom_mem(self.address, 0x06 + 4 * index, 4)
return ustruct.unpack('<HH', data)
data = ustruct.pack('<HH', on, off)
self.i2c.writeto_mem(self.address, 0x06 + 4 * index, data)
def duty(self, index, value=None, invert=False):
if value is None:
pwm = self.pwm(index)
if pwm == (0, 4096):
value = 0
elif pwm == (4096, 0):
value = 4095
value = pwm[1]
if invert:
value = 4095 - value
return value
if not 0 <= value <= 4095:
raise ValueError("Out of range")
if invert:
value = 4095 - value
if value == 0:
self.pwm(index, 0, 4096)
elif value == 4095:
self.pwm(index, 4096, 0)
else:
self.pwm(index, 0, value)
class Servos:
def __init__(self, i2c, address=0x55, freq=50, min_us=600, max_us=2400,
degrees=180):
self.period = 1000000 / freq
self.min_duty = self._us2duty(min_us)
self.max_duty = self._us2duty(max_us)
self.degrees = degrees
self.freq = freq
self.PCA9685 = PCA9685(i2c, address)
self.PCA9685.freq(freq)
def _us2duty(self, value):
return int(4095 * value / self.period)
def position(self, index, degrees=None, radians=None, us=None, duty=None):
span = self.max_duty - self.min_duty
if degrees is not None:
duty = self.min_duty + span * degrees / self.degrees
elif radians is not None:
duty = self.min_duty + span * radians / math.radians(self.degrees)
elif us is not None:
duty = self._us2duty(us)
elif duty is not None:
pass
else:
return self.PCA9685.duty(index)
duty = min(self.max_duty, max(self.min_duty, int(duty)))
self.PCA9685.duty(index, duty)
def release(self, index):
self.PCA9685.duty(index, 0)

View File

@@ -0,0 +1,38 @@
from struct import unpack as unp
from time import sleep_ms
# SHT20 default address
SHT20_I2CADDR = 64
# SHT20 Command
TRI_T_MEASURE_NO_HOLD = b'\xf3'
TRI_RH_MEASURE_NO_HOLD = b'\xf5'
READ_USER_REG = b'\xe7'
WRITE_USER_REG = b'\xe6'
SOFT_RESET = b'\xfe'
class SHT20(object):
def __init__(self, i2c_bus):
self._address = SHT20_I2CADDR
self._bus = i2c_bus
def get_SHT_temperature(self):
self._bus.writeto(self._address, TRI_T_MEASURE_NO_HOLD)
sleep_ms(150)
origin_data = self._bus.readfrom(self._address, 2)
origin_value = unp('>h', origin_data)[0]
value = -46.85 + 175.72 * (origin_value / 65536)
return value
def get_SHT_relative_humidity(self):
self._bus.writeto(self._address, TRI_RH_MEASURE_NO_HOLD)
sleep_ms(150)
origin_data = self._bus.readfrom(self._address, 2)
origin_value = unp('>H', origin_data)[0]
value = -6 + 125 * (origin_value / 65536)
return value
#sht=SHT20(I2C(scl = Pin(22), sda = Pin(21), freq = 100000))

View File

@@ -0,0 +1,53 @@
{
"board": {
"MixGo AI": "MixGo AI",
"MixGoAI智能传感": "MixGo AI sensor",
"MixGoAI图像识别": "MixGo AI sensor2"
},
"language": "MicroPython",
"burn": {
"type": "command",
"portSelect": "all",
"MixGo AI": {
"command": "\"{kflash}\" --port {com} --baudrate 1500000 -n \"{indexPath}/build/MixGo_AI-ASR_V2.0.kfpkg\""
},
"MixGo AI sensor":{
"command": "\"{kflash}\" --port {com} --baudrate 1500000 -n \"{indexPath}/build/MixGo_AI-Sensor_V1.0.kfpkg\""
},
"MixGo AI sensor2":{
"command": "\"{kflash}\" --port {com} --baudrate 1500000 -n \"{indexPath}/build/MixGo_AI-Sensor_V1.2.kfpkg\""
}
},
"upload": {
"type": "command",
"portSelect": "all",
"command": "\"{ampy}\" -p {com} -d 1 -r \"{reset}\" put \"{indexPath}/build/upload\"",
"filePath": "{indexPath}/build/upload/main.py",
"copyLib": true,
"reset": []
},
"nav": {
"burn": true,
"upload": true,
"save": {
"py": true
}
},
"serial": {
"ctrlCBtn": true,
"ctrlDBtn": true,
"baudRates": 115200,
"yMax": 100,
"yMin": 0,
"pointNum": 100,
"rts": false,
"dtr": false
},
"pythonToBlockly": false,
"web": {
"com": "serial",
"upload": {
"reset": []
}
}
}

View File

@@ -0,0 +1 @@
<xml version="Mixly 2.0 Beta11" board="MixGo AI" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_block_notes" id="tG)XoofgeziFBf}`T0c." x="-129" y="66"><field name="VALUE">中断使用</field></block><block type="procedures_defnoreturn" id="M(dqz7yIncEP.Gn*qI.@" x="-128" y="117"><mutation xmlns="http://www.w3.org/1999/xhtml"><arg name="x"></arg></mutation><field name="NAME">irp_func</field><statement name="STACK"><block type="variables_global" id="=IY+:pG8W:+!i}`[GyU!"><value name="VAR"><block type="variables_get" id="`*zJ5n)M5[7-5bWQQ8J."><field name="VAR">num</field></block></value><next><block type="math_selfcalcu" id="[w4ZJ8=_bp^I/x;^6MfU"><field name="OP">ADD</field><value name="A"><shadow xmlns="http://www.w3.org/1999/xhtml" type="variables_get" id="fZi3OzjRXm$~p4PvsGp^"><field name="VAR">a</field></shadow><block type="variables_get" id="7,-.#aH-r6gcKq1`w[5h"><field name="VAR">num</field></block></value><value name="B"><shadow type="math_number" id="b;}S?ZL.1PuY};L-B(]D"><field name="NUM">1</field></shadow></value><next><block type="system_print" id="p`:cLTe}Cs(Cvks2;!Ti"><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="text" id="qaeFAHb$)@^#Uq$m`/0b"><field name="TEXT">Mixly</field></shadow><block type="text_format_noreturn" id="G5}9X7V}ekiLAOt3J%/;"><mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation><value name="VAR"><shadow type="text" id="ojts|ogZ;Tcza6abA_[o"><field name="TEXT">Interrupt Enabled No. is {}</field></shadow></value><value name="ADD0"><block type="number_to_text" id="ruDp6!ZnjwHjx0s8]V2y"><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="ih%oEuDEMuIH/Z7Ntt)A"><field name="NUM">0</field></shadow><block type="variables_get" id="$k(L)]]XMcl;%}74eDra"><field name="VAR">num</field></block></value></block></value></block></value></block></next></block></next></block></statement></block><block type="variables_set" id="TI--h`/4yHD(|zS=}v4Z" x="-123" y="284"><field name="VAR">num</field><value name="VALUE"><block type="math_number" id="3bOv_^{r:catl~ByPUie"><field name="NUM">0</field></block></value><next><block type="inout_pin_attachInterrupt" id="c}i3dKZ0*L.}[q^~RnRg"><field name="mode">GPIO.IRQ_RISING</field><value name="PIN"><shadow type="pins_digital_pin" id="CZl9M8o?]So3nT=;(-M6"><field name="PIN">17</field></shadow></value><value name="DO"><shadow type="factory_block_return" id="(ea%~?_pdKWptwtD17Vc"><field name="VALUE">irp_func</field></shadow></value></block></next></block></xml>

View File

@@ -0,0 +1 @@
<xml version="Mixly 2.0 Beta11" board="MixGo AI" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_block_notes" id="/6]vQTZia0jShOp/^(*j" x="-713" y="89"><field name="VALUE">LED Blink_控制板载灯亮灭操作</field><next><block type="inout_digital_init" id=")exhnN,hDKv*FPKl!8OS"><field name="MODE">GPIO.OUT</field><value name="PIN"><shadow type="pins_digital_pin" id="I+k/g8m5vm5blnnkg^Ua"><field name="PIN">8</field></shadow></value><next><block type="controls_whileUntil" id=".OBss#lx;l7{!=aUD,zv"><field name="MODE">WHILE</field><value name="BOOL"><shadow type="logic_boolean" id="35uTv?e$T@.-EKZ1l4lL"><field name="BOOL">TRUE</field></shadow></value><statement name="DO"><block type="inout_digital_write" id="JhLW#g_jFu*xVXD{)(c_"><value name="PIN"><shadow type="pins_digital_pin" id="RH2cQo[douUbxvfJ`4C|"><field name="PIN">8</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="5rI=[nLh.v!W*Q{+Ju#n"><field name="BOOL">HIGH</field></shadow></value><next><block type="controls_delay" id="::=A1.r+s9q48J4{_i53"><field name="Time">ms</field><value name="DELAY_TIME"><shadow type="math_number" id="ILA$6SijrgxscKeyN[pV"><field name="NUM">1000</field></shadow></value><next><block type="inout_digital_write" id="v~V!aNS?Fk_0}m:l*2H:"><value name="PIN"><shadow type="pins_digital_pin" id="GEg9,C3JY$hVf@;I{%/N"><field name="PIN">8</field></shadow></value><value name="STAT"><shadow type="inout_highlow" id="`FR/zmh+X9OQh4mpagj:"><field name="BOOL">LOW</field></shadow></value><next><block type="controls_delay" id=")`A*q*V}4PXuz]Rw|diq"><field name="Time">ms</field><value name="DELAY_TIME"><shadow type="math_number" id="qW2|oAK,+3dSa00[0Axw"><field name="NUM">1000</field></shadow></value></block></next></block></next></block></next></block></statement></block></next></block></next></block></xml>

View File

@@ -0,0 +1 @@
<xml version="Mixly 2.0 Beta11" board="MixGo AI" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_block_notes" id="tmb8d4+ff@/bLZ0GxPM0" x="-761" y="14"><field name="VALUE">PWM_使板载灯呼吸灯效果</field><next><block type="inout_pwm_init" id="8M4!k;trYKY]L+,5gOl]"><value name="PIN"><shadow type="pins_digital_pin" id="VSV8c`*cZlsLu#2o|V;~"><field name="PIN">8</field></shadow></value><value name="freq"><shadow type="math_number" id="cK:IAOKG$DNu);s:;UYV"><field name="NUM">500000</field></shadow></value><value name="VAR"><shadow type="TIM_SELET" id="n.rI@TQCdb{3RX2:nyc^"><field name="TIM">2</field></shadow></value><next><block type="controls_whileUntil" id="hk)I4Zal!=AdBCwV+#(+"><field name="MODE">WHILE</field><value name="BOOL"><shadow type="logic_boolean" id="V.Kwi,g!c6H0Vtf9o~Tl"><field name="BOOL">TRUE</field></shadow></value><statement name="DO"><block type="controls_forEach" id="z%ZAAomdR-wHS#:A~5pS"><value name="LIST"><shadow xmlns="http://www.w3.org/1999/xhtml" type="list_many_input"><field name="CONTENT">0,1,2,3</field></shadow><block type="controls_range" id="DuAb6}uSj6I-L7J[(~Se"><value name="FROM"><shadow type="math_number" id="?nQ~XZfS-lzcKW+:.KUc"><field name="NUM">0</field></shadow></value><value name="TO"><shadow type="math_number" id="oOq6f*G[aGfRx$JZTC3S"><field name="NUM">100</field></shadow></value><value name="STEP"><shadow type="math_number" id="M2/ZGWqh~a%Y/IO!OCUL"><field name="NUM">1</field></shadow></value></block></value><value name="VAR"><shadow type="variables_get" id="t6V*qd~AT~$;]2dCHXrh"><field name="VAR">i</field></shadow></value><statement name="DO"><block type="inout_pwm_write" id="qgj@vnTSWy*VceGV1]6~"><value name="PIN"><shadow type="pins_digital_pin" id=".e*1+aFO5=P9w}T2ZRZD"><field name="PIN">8</field></shadow></value><value name="pwm"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="H=`LZNK7PUQ©ivX2w3"><field name="NUM">50</field></shadow><block type="variables_get" id=",,oCn-Gi({sQ]O^CkWdi"><field name="VAR">i</field></block></value><next><block type="controls_delay" id="iÚpW$5bB7,yT6NsA=Q"><field name="Time">ms</field><value name="DELAY_TIME"><shadow type="math_number" id="hyh8$Op,xSm+:P1AR3cL"><field name="NUM">10</field></shadow></value></block></next></block></statement><next><block type="controls_forEach" id="C?7ZC``s5jknhD[_7IlY"><value name="LIST"><shadow xmlns="http://www.w3.org/1999/xhtml" type="list_many_input"><field name="CONTENT">0,1,2,3</field></shadow><block type="controls_range" id=")-I+;fk}+h67ygHlmrnP"><value name="FROM"><shadow type="math_number" id="r~Yu2IZAf`|Y0:ro.PeP"><field name="NUM">100</field></shadow></value><value name="TO"><shadow type="math_number" id="fe7Mn$s2G@c`0BMj,Lqj"><field name="NUM">0</field></shadow></value><value name="STEP"><shadow type="math_number" id="s#RK+s.y8;W-CnPX2M!T"><field name="NUM">-1</field></shadow></value></block></value><value name="VAR"><shadow type="variables_get" id="njLm.Vsfk0[`[-h|R%P+"><field name="VAR">i</field></shadow></value><statement name="DO"><block type="inout_pwm_write" id="Bw0a+DLM()eB]T4z}IJ."><value name="PIN"><shadow type="pins_digital_pin" id="b!*Hy[oeqmBf+dCcK[nW"><field name="PIN">8</field></shadow></value><value name="pwm"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="H=`LZNK7PUQ©ivX2w3"><field name="NUM">50</field></shadow><block type="variables_get" id="Ba$*cQhn?q${BSZ=~ZP`"><field name="VAR">i</field></block></value><next><block type="controls_delay" id="{Et]QGSvu]t.@}xU:oe/"><field name="Time">ms</field><value name="DELAY_TIME"><shadow type="math_number" id="[Ua_K@L#N00.g)R?=(Cc"><field name="NUM">10</field></shadow></value></block></next></block></statement></block></next></block></statement></block></next></block></next></block></xml>

View File

@@ -0,0 +1 @@
<xml version="Mixly 2.0 Beta11" board="MixGo AI" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_block_notes" id=";g7Y!=]-rw^0m$:/GOHg" x="-729" y="264"><field name="VALUE">Time_定时器执行定时打印计划</field><next><block type="system_timer" id="u$7yBqLL+:@L:Jlig?L2"><field name="mode">PERIODIC</field><value name="SUB"><shadow type="TIM_SELET" id="lvCA)]wG|yw-G3Dh]mE="><field name="TIM">11</field></shadow></value><value name="period"><shadow type="math_number" id="/6^-dE+-XaM2umbvUpZS"><field name="NUM">1000</field></shadow></value><value name="callback"><shadow type="factory_block_return" id="Z258]@(U?kuK(q%QtHwt"><field name="VALUE">tim_callback</field></shadow></value></block></next></block><block type="procedures_defnoreturn" id="DpE[qQ?97epr_)reN5~Q" x="-726" y="334"><mutation xmlns="http://www.w3.org/1999/xhtml"><arg name="x"></arg></mutation><field name="NAME">tim_callback</field><statement name="STACK"><block type="system_print" id="J!n*l_TO+N[l!zt;LyzX"><value name="VAR"><block type="number_to_text" id="SPAZ_cuNJ=U~6iIZk%OV"><value name="VAR"><block type="controls_millis" id="C{8f5ylDOur0%Oi/zJtz"><field name="Time">ms</field></block></value></block></value></block></statement></block></xml>

View File

@@ -0,0 +1 @@
<xml version="Mixly 2.0 Beta11" board="MixGo AI" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_block_notes" id="QGB?bhvClH-$wMT%onX*" x="161" y="79"><field name="VALUE">UART_外部串口通信</field><next><block type="serial_softserial1" id=",jPlZ};L-$5b~inJ8#da"><field name="mode">1</field><field name="baudrate">115200</field><value name="RX"><shadow type="pins_digital_pin" id="(%1%]%iCVK?yL~[iiL)O"><field name="PIN">6</field></shadow></value><value name="TX"><shadow type="pins_digital_pin" id="Xbt`3Zu6w9YHTsgSqj%R"><field name="PIN">7</field></shadow></value><next><block type="controls_whileUntil" id="uvA(W=+xa}:v8E,C1@ZM"><field name="MODE">WHILE</field><value name="BOOL"><shadow type="logic_boolean" id="b8;#$27Bz{.Roq5XF09;"><field name="BOOL">TRUE</field></shadow></value><statement name="DO"><block type="serial_print" id="xXn/@!ptYtJ~xq{Bvi{H"><field name="mode">1</field><value name="CONTENT"><shadow type="text" id="ab]O:f=vZVM5^^8Zdbp`"><field name="TEXT">Mixly</field></shadow></value><next><block type="controls_delay" id="*/Ym;2(8{p#U+X/oqh6Z"><field name="Time">ms</field><value name="DELAY_TIME"><shadow type="math_number" id="{j247ny[v*Dw5f{KAUi*"><field name="NUM">1000</field></shadow></value><next><block type="controls_if" id="s=Px.m7=b)xde|*Ts#E1"><value name="IF0"><block type="serial_any" id="tZ^F.GU/=q!FGbr9Hk({"><field name="mode">1</field></block></value><statement name="DO0"><block type="system_print" id="!OBO^0_M-6w2{+LE}B@*"><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="text" id="#(]2yvkDZa9mA@:)eiKv"><field name="TEXT">Mixly</field></shadow><block type="serial_readstr" id="|Oo0aD!,ncX#i0anw]M$"><field name="mode">1</field></block></value></block></statement></block></next></block></next></block></statement></block></next></block></next></block></xml>

View File

@@ -0,0 +1 @@
<xml version="Mixly 2.0 Beta11" board="MixGo AI" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_block_notes" id="ro*e8|,Z^W0iK~:[eOt;" x="-515" y="105"><field name="VALUE">舵机_定时器调用控制多路舵机</field><next><block type="actuator_Servo_init" id="+btRR15axBdU:Hh{Tqyj"><value name="PIN"><shadow type="pins_digital_pin" id="SjMTh{xG*ibpC{o[Eb4="><field name="PIN">11</field></shadow></value><value name="time"><shadow type="TIM_SELET" id="tbtiB84BTJ10c`%~mf]s"><field name="TIM">0</field></shadow></value><next><block type="actuator_Servo_init" id="oeA7kF0HgkD#PcK/+)S:"><value name="PIN"><shadow type="pins_digital_pin" id="!pXn/XGV4_Gg6:~)sF_J"><field name="PIN">12</field></shadow></value><value name="time"><shadow type="TIM_SELET" id="n[v)FY5Z$$)5+eF#^rdq"><field name="TIM">1</field></shadow></value><next><block type="actuator_Servo_init" id="$g_B:e7~N+48K+hM[kfX"><value name="PIN"><shadow type="pins_digital_pin" id="FYxfXciFb?2^;0HiSl-~"><field name="PIN">13</field></shadow></value><value name="time"><shadow type="TIM_SELET" id="tpbFx/:3/|jVk+jXX^E{"><field name="TIM">2</field></shadow></value><next><block type="controls_forEach" id="lkAD5Yn[^YS[av{~I+]N"><value name="LIST"><shadow xmlns="http://www.w3.org/1999/xhtml" type="list_many_input"><field name="CONTENT">0,1,2,3</field></shadow><block type="controls_range" id="w4q?c#-UdC709UFGoyHF"><value name="FROM"><shadow type="math_number" id="q{/OR=V]b,|Z]#HVw=%L"><field name="NUM">0</field></shadow></value><value name="TO"><shadow type="math_number" id="=QcOOJ#@6xvA=1AgBCFK"><field name="NUM">180</field></shadow></value><value name="STEP"><shadow type="math_number" id="h(9yHWR=v}q@6OQkZCAM"><field name="NUM">1</field></shadow></value></block></value><value name="VAR"><shadow type="variables_get" id="PZ9oJO{W30Sk=En[S@rO"><field name="VAR">i</field></shadow></value><statement name="DO"><block type="actuator_Servo" id="|8[-[xqF`kh7o!MyNw-l"><value name="PIN"><shadow type="pins_digital_pin" id="3|}Xp:iP:*f*AC{=V$Z3"><field name="PIN">11</field></shadow></value><value name="range"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="ThmI;[``E:)^q)6;MRI]"><field name="NUM">30</field></shadow><block type="variables_get" id="zJBXFHZ%R`Ba/)Q:0$WN"><field name="VAR">i</field></block></value><next><block type="actuator_Servo" id="b4Csz~#~RllKa4qo16.s"><value name="PIN"><shadow type="pins_digital_pin" id="tUvw|DJ0Fd$Ls5l@@-w7"><field name="PIN">12</field></shadow></value><value name="range"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="5J#1$4:aYvJD[3IgVhHf"><field name="NUM">90</field></shadow><block type="math_arithmetic" id="h]hOR(U~n_^f.a+GSbqw"><field name="OP">MINUS</field><value name="A"><shadow type="math_number" id="DCc{I=jnCh)xa#Ph(G/W"><field name="NUM">180</field></shadow></value><value name="B"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="{`nex$WRDJFIL=0)s^FB"><field name="NUM">1</field></shadow><block type="variables_get" id="N5,GI1Q-LOKblE2%1xP@"><field name="VAR">i</field></block></value></block></value><next><block type="actuator_Servo" id="S)tll|/4zZlh-GHpGIL^"><value name="PIN"><shadow type="pins_digital_pin" id="w!1}p_kK%lEkWQLhCmwy"><field name="PIN">13</field></shadow></value><value name="range"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="H,ooBus7vs)G:56AcGF0"><field name="NUM">120</field></shadow><block type="variables_get" id="rpvAPr)hoJ@k42@%7!~?"><field name="VAR">i</field></block></value><next><block type="controls_delay" id="Fs^=e);]*Q}j$_-zN@|E"><field name="Time">ms</field><value name="DELAY_TIME"><shadow type="math_number" id="t8OSSEphUSY!3}*wV%J="><field name="NUM">10</field></shadow></value></block></next></block></next></block></next></block></statement></block></next></block></next></block></next></block></next></block></xml>

View File

@@ -0,0 +1 @@
<xml version="Mixly 2.0 Beta11" board="MixGo AI" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_block_notes" id="=iBrkM|5o{%|;k9OB.Nz" x="-1111" y="88"><field name="VALUE">LCD_屏幕显示累加计数</field><next><block type="lcd_init" id="GwV_fD/?Y7wIR$W+AY@Z" inline="true"><value name="freq"><shadow type="math_number" id="/LsDrwTXz_?*~fYm~Evg"><field name="NUM">15000000</field></shadow></value><value name="color"><shadow type="math_number" id="_Z_z(9)[5W]wq8w4X=te"><field name="NUM">0x0000</field></shadow></value><next><block type="variables_set" id=",LfLXs;b%`-QIlgH@|Dw"><field name="VAR">A</field><value name="VALUE"><block type="math_number" id="xG*UmP=jpKRC-NvkzMW@"><field name="NUM">0</field></block></value><next><block type="controls_whileUntil" id="0|AI)Z|oFrcjV^a#M`ua"><field name="MODE">WHILE</field><value name="BOOL"><shadow type="logic_boolean" id="se!}KqKN-*@0t=(73UpA"><field name="BOOL">TRUE</field></shadow></value><statement name="DO"><block type="variables_set" id="W:IE[lfRU-Sb_+IB`{-p"><field name="VAR">A</field><value name="VALUE"><block type="math_arithmetic" id="!n|NDD?gG,k:HRF][_kd"><field name="OP">ADD</field><value name="A"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="z4ChHJvS``2`eY;!nMSD"><field name="NUM">1</field></shadow><block type="variables_get" id="RL{_gfknAmv-Yk{r@R-x"><field name="VAR">A</field></block></value><value name="B"><shadow type="math_number" id="[reWBY@ZbctnL*[Yr`:C"><field name="NUM">1</field></shadow></value></block></value><next><block type="lcd_draw_string" id="Q4gB*GiH0%nnEmHZg,:+" inline="true"><value name="x"><shadow type="math_number" id="CXb/+boK,4$O=`18Bc,-"><field name="NUM">0</field></shadow></value><value name="y"><shadow type="math_number" id="+^m*P5HÓT-sZN$rvbl"><field name="NUM">0</field></shadow></value><value name="text"><shadow xmlns="http://www.w3.org/1999/xhtml" type="text" id="`6[9KLPfD]7)oZ2n7znm"><field name="TEXT">MixPY</field></shadow><block type="number_to_text" id="xtm|R#}eGdhgmmm=#YH8"><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id=":54NkE{SVh,!B@O{Os@1"><field name="NUM">0</field></shadow><block type="variables_get" id="/H|:jvQ`GOYDMK]%mq+e"><field name="VAR">A</field></block></value></block></value><value name="color_T"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="h^=Rxk1ZD$WlE]Idcy1k"><field name="NUM">0XFFFF</field></shadow><block type="LCD_color_seclet" id="OB,e[DrjaQ4-Y-A%H.3p"><field name="COLOR">#ff0000</field></block></value><value name="color_S"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="|A/VF5_=tpaOm(B`diTW"><field name="NUM">0X0000</field></shadow><block type="LCD_color_seclet" id="aYw.A.BBl|B8.;gm6J|O"><field name="COLOR">#000000</field></block></value></block></next></block></statement></block></next></block></next></block></next></block></xml>

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
<xml version="Mixly 2.0 Beta11" board="MixGo AI" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_block_notes" id="#h%di_|Vi?|bRiw,@`7+" x="-59" y="128"><field name="VALUE">Audio Play_加载SD卡音频文件播放</field><next><block type="spk_init" id="t.,KAqPY7k1DD.+|[2Xm"><value name="SUB"><shadow type="variables_get" id="~L:sFZLAgjzgfc/*GqrX"><field name="VAR">SPK</field></shadow></value><value name="BCK"><shadow type="pins_digital_pin" id="1q3kFN{)|.tic_Z._J|S"><field name="PIN">8</field></shadow></value><value name="WS"><shadow type="pins_digital_pin" id="/k%?v57CbEVeio!fCJ*5"><field name="PIN">9</field></shadow></value><value name="DAT"><shadow type="pins_digital_pin" id="I;_TY]z.,$~7cD%Y=u1T"><field name="PIN">10</field></shadow></value><next><block type="controls_whileUntil" id="IDXfXZDA5b*;JV!lQAP-"><field name="MODE">WHILE</field><value name="BOOL"><shadow type="logic_boolean" id="jeaiHjJ,G!{#X7OyMSL%"><field name="BOOL">TRUE</field></shadow></value><statement name="DO"><block type="audio_play" id="#q,4nxetUFHgw4B^,l2l"><value name="path"><shadow type="text" id="8kyz`b`U?rFIG.H(kGiu"><field name="TEXT">/sd/MixGo.wav</field></shadow></value><value name="SUB"><shadow type="variables_get" id="y+@$^Jhv.1)6?*_9ld-G"><field name="VAR">SPK</field></shadow></value><value name="volume"><shadow type="math_number" id="H=8r463*.u=Na2iXkTo["><field name="NUM">80</field></shadow></value><next><block type="controls_delay" id="$LtWV0sqnvDvIFLd#`Qb"><field name="Time">ms</field><value name="DELAY_TIME"><shadow type="math_number" id="?t{+3PH6loQ;_5+Dd,HF"><field name="NUM">1000</field></shadow></value><next><block type="audio_play" id="X,)C6o7G9D*n6.n~!z_x"><value name="path"><shadow type="text" id="-pc}S|!p!?`DSuJ9DX~w"><field name="TEXT">/sd/MixGo1.wav</field></shadow></value><value name="SUB"><shadow type="variables_get" id="j+2jTk6vdIX_`aNEX)ns"><field name="VAR">SPK</field></shadow></value><value name="volume"><shadow type="math_number" id="Mv!E*zSKvJB,_}uvy^V9"><field name="NUM">80</field></shadow></value><next><block type="controls_delay" id="3m~WG+at%#cZGw4Q#w?e"><field name="Time">ms</field><value name="DELAY_TIME"><shadow type="math_number" id="V;%F?GBY{8aq@F-_UY]l"><field name="NUM">1000</field></shadow></value></block></next></block></next></block></next></block></statement></block></next></block></next></block></xml>

View File

@@ -0,0 +1 @@
<xml version="Mixly 2.0 Beta11" board="MixGo AI" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_block_notes" id="3~5HD^W*f0z!RJ,]1{o-" x="305" y="220"><field name="VALUE">Video Play_加载SD卡视频文件播放</field><next><block type="lcd_init" id=":VT$@c`+fNTW-mWWXtM2" inline="true"><value name="freq"><shadow type="math_number" id="kRU?g!givR~,|j{cia[J"><field name="NUM">15000000</field></shadow></value><value name="color"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number"><field name="NUM">0x0000</field></shadow><block type="LCD_color_seclet" id="7vNhx2N}j[Vy)^}.R3zZ"><field name="COLOR">#000000</field></block></value><next><block type="spk_init" id="e7{2k;k@|#5oV/44X8py"><value name="SUB"><shadow type="variables_get" id="xc@s0H!Z]YVwcO4:8,BM"><field name="VAR">SPK</field></shadow></value><value name="BCK"><shadow type="pins_digital_pin" id="]=js5pD{8V/Qwe8vvV(`"><field name="PIN">8</field></shadow></value><value name="WS"><shadow type="pins_digital_pin" id="v#NEHUCVH?Fquw#d:e|."><field name="PIN">9</field></shadow></value><value name="DAT"><shadow type="pins_digital_pin" id="~pkK%b=%m04PU_:+gd+C"><field name="PIN">10</field></shadow></value><next><block type="video_play" id="0Xp@x)~~`r{RU-E9Xry%" inline="true"><value name="path"><shadow type="text" id=":T53OKlWdZPkq8JlNN7}"><field name="TEXT">/sd/MixGo.avi</field></shadow></value><value name="SUB"><shadow type="variables_get" id="UMmm;?Hq-6yX$p_-/j+i"><field name="VAR">SPK</field></shadow></value><value name="volume"><shadow type="math_number" id="lZE`QmtEdn8w(v0@W?[n"><field name="NUM">80</field></shadow></value></block></next></block></next></block></next></block></xml>

View File

@@ -0,0 +1 @@
<xml version="Mixly 2.0 Beta11" board="MixGo AI" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_block_notes" id="O@+rZPiLAZO0H@^$P]km" x="140" y="170"><field name="VALUE">Video record_录制视频并存放于SD卡</field><next><block type="lcd_init" id="rKd*Z!2XFb#|Jbhxw56c" inline="true"><value name="freq"><shadow type="math_number" id="|n=xcxLI,D)s?qlbW4N_"><field name="NUM">15000000</field></shadow></value><value name="color"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number"><field name="NUM">0x0000</field></shadow><block type="LCD_color_seclet" id="A^lr5F@K)(A~;={T`@8T"><field name="COLOR">#000000</field></block></value><next><block type="mic_init" id="xT?vqU0*Gr}xPfSl!3tx"><value name="SUB"><shadow type="variables_get" id=",d_V+pH*lJv(msN*LK^g"><field name="VAR">MIC</field></shadow></value><next><block type="spk_init" id="5)m!fo2gA6:m{)raJ1n+"><value name="SUB"><shadow type="variables_get" id="2bhOi,Oc9@$MEocgsQAk"><field name="VAR">SPK</field></shadow></value><value name="BCK"><shadow type="pins_digital_pin" id="x@Dar+pSlEeVbc,Xdr^d"><field name="PIN">8</field></shadow></value><value name="WS"><shadow type="pins_digital_pin" id="68(=n:_;:~T=Eu$eWT8?"><field name="PIN">9</field></shadow></value><value name="DAT"><shadow type="pins_digital_pin" id="|:rTrWK%|r6m58Et:6J)"><field name="PIN">10</field></shadow></value><next><block type="camera_init" id="b_u|IaXf,`gHKT.YPnA[" inline="true"><value name="key1"><shadow type="mode" id="NuD[T~wJi,_{YPfO`Ev}"><field name="flag">sensor.RGB565</field></shadow></value><value name="key2"><shadow type="size" id="k-:gFv@2%{d#(AO%y/:w"><field name="flag">sensor.B240X240</field></shadow></value><value name="key3"><shadow type="on_off" id="QRVj4jH-$CwBedn%AIKJ"><field name="flag">1</field></shadow></value><value name="key4"><block type="math_number" id="AcetWgHz$EryiZG{0m|z"><field name="NUM">10</field></block></value><next><block type="camera_set_hmirror" id="ZKtBze44+qoUIG^580}{"><value name="key"><shadow type="on_off" id="q^_?~ph+ZY6Y.bZFr2oO"><field name="flag">0</field></shadow></value><next><block type="video_record" id="zGAE54oS6tQ${b|XkJ8q"><value name="path"><shadow type="text" id="ngTE,+2y_=.s[=!S@g2w"><field name="TEXT">/sd/Cool_AI_0810.avi</field></shadow></value><value name="SUB"><block type="variables_get" id="4As}Jx(qJD#,L3T8%:A{"><field name="VAR">MIC</field></block></value><value name="time"><shadow type="math_number" id="/.^]*.`0#CM$+t!iS;UX"><field name="NUM">10</field></shadow></value><next><block type="controls_delay" id=".y!OG)*~J@un6OQ%#}ZF"><field name="Time">ms</field><value name="DELAY_TIME"><shadow type="math_number" id="*Qj-/z4(*%(@B)@S;_o_"><field name="NUM">1000</field></shadow></value><next><block type="video_play" id="MH}`C`d_$M9si:;+{l|y"><value name="path"><shadow type="text" id="Fk#DC`%yM90MsF3a?@+:"><field name="TEXT">/sd/Cool_AI_0810.avi</field></shadow></value><value name="SUB"><block type="variables_get" id="H9Z7]QS@$/B;M5VX?wa)"><field name="VAR">SPK</field></block></value><value name="volume"><shadow type="math_number" id="i^+r7Fh0)8xZmWwE`2aQ"><field name="NUM">80</field></shadow></value></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></xml>

View File

@@ -0,0 +1 @@
<xml version="Mixly 2.0 Beta11" board="MixGo AI" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_block_notes" id="1suKQ1p5jle%z5efrGiK" x="-124" y="-453"><field name="VALUE">Camera 拍照_持续拍照显示屏幕上</field><next><block type="camera_init" id="pqF#W^r+`hVHB(=EX!^/" inline="true"><value name="key1"><shadow type="mode" id="goC6YSjZ}WzqHFijT|Dx"><field name="flag">sensor.YUV422</field></shadow></value><value name="key2"><shadow type="size" id=";-[3z=iE~J_=K9;ZTaVx"><field name="flag">sensor.B240X240</field></shadow></value><value name="key3"><shadow type="on_off" id="*P-8ne^Uz_~63vU66MU6"><field name="flag">1</field></shadow></value><next><block type="lcd_init" id="PB:KJup.tSZJNW+d#ur;" inline="true"><value name="freq"><shadow type="math_number" id="U?KJMIb9T$m4t(l1ujm3"><field name="NUM">15000000</field></shadow></value><value name="color"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number"><field name="NUM">0x0000</field></shadow><block type="LCD_color_seclet" id="#9.:Ms9/0/hoK+Spl-bj"><field name="COLOR">#000000</field></block></value><next><block type="controls_whileUntil" id="6FW)lkJcX{#t`uL@1xKr"><field name="MODE">WHILE</field><value name="BOOL"><shadow type="logic_boolean" id="Z)oM52+_lTm~H-lpP2TZ"><field name="BOOL">TRUE</field></shadow></value><statement name="DO"><block type="lcd_display" id="wYPSeVtXhoc3uu-hToS%"><value name="img"><shadow xmlns="http://www.w3.org/1999/xhtml" type="factory_block_return" id="Vi+P(!f#S*%PGn3b#}1k"><field name="VALUE">image</field></shadow><block type="camera_snapshot" id="AT+.^6f4Qu`^wXQZpJ?m"></block></value></block></statement></block></next></block></next></block></next></block></xml>

View File

@@ -0,0 +1 @@
<xml version="Mixly 2.0 Beta11" board="MixGo AI" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_block_notes" id="#*3nkjfP(#pJl(pWA]e5" x="-145" y="-368"><field name="VALUE">Imge 显示图片_加载SD卡图片文件显示</field><next><block type="lcd_init" id="#|wK+}de0z^ip-pzf$_." inline="true"><value name="freq"><shadow type="math_number" id="t=?2fei,gLk3U5DfB{$D"><field name="NUM">15000000</field></shadow></value><value name="color"><shadow type="math_number" id="PZqvldn(ZYd4{twMtV4{"><field name="NUM">0x0000</field></shadow></value><next><block type="image_Image" id="zF3zJC%jFb;!,+2AkPuu"><value name="SUB"><shadow type="variables_get" id="/SG=N{Ms3q0HF4(2FkYS"><field name="VAR">image</field></shadow></value><value name="path"><shadow type="text" id="L6FNs@sj`]r|8D$c[SU@"><field name="TEXT">MixGo.jpg</field></shadow></value><next><block type="lcd_display" id="ge4dUOtBQfT?5$nwtOiM"><value name="img"><shadow type="factory_block_return" id="F0G-$k@D__32US4ONX[w"><field name="VALUE">image</field></shadow></value></block></next></block></next></block></next></block></xml>

View File

@@ -0,0 +1 @@
<xml version="Mixly 2.0 Beta11" board="MixGo AI" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_block_notes" id="I6|1)0^Mco9@t)P//Z#G" x="-195" y="-440"><field name="VALUE">Imge 灰度图片_加载SD卡图片文件转换灰度图</field><next><block type="lcd_init" id="#|wK+}de0z^ip-pzf$_." inline="true"><value name="freq"><shadow type="math_number" id="t=?2fei,gLk3U5DfB{$D"><field name="NUM">15000000</field></shadow></value><value name="color"><shadow type="math_number" id="PZqvldn(ZYd4{twMtV4{"><field name="NUM">0x0000</field></shadow></value><next><block type="image_Image" id="7]@YL[cCJU?ibjzbq:g4"><value name="SUB"><shadow type="variables_get" id="%@)Mn0`Hn)0GQPK8#N*M"><field name="VAR">image</field></shadow></value><value name="path"><shadow type="text" id="_)=m4nZ8N]9NiI0Mp7|n"><field name="TEXT">mixgo.jpg</field></shadow></value><next><block type="variables_set" id="FppGFs2Z9SOYDznU:2M1"><field name="VAR">image</field><value name="VALUE"><block type="image_tonew" id="O_2di7b+OC{A+l?DJT_%"><field name="key">to_grayscale</field><value name="VAR"><shadow type="variables_get" id="G$Aaqh9.SleD{ISSvUFr"><field name="VAR">image</field></shadow></value></block></value><next><block type="lcd_display" id="ge4dUOtBQfT?5$nwtOiM"><value name="img"><shadow xmlns="http://www.w3.org/1999/xhtml" type="factory_block_return" id="F0G-$k@D__32US4ONX[w"><field name="VALUE">image</field></shadow><block type="variables_get" id="w]T,$jvE(MGLf3a^c^74"><field name="VAR">image</field></block></value></block></next></block></next></block></next></block></next></block></xml>

View File

@@ -0,0 +1 @@
<xml version="Mixly 2.0 Beta11" board="MixGo AI" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_block_notes" id="*(i])Q5R}@I=PL5^_(j*" x="-111" y="-571"><field name="VALUE">【童芯创悟】-Imge 绘制滤波_采集图形并洪水填充处理</field><next><block type="camera_init" id="@DIUY4eA5lh`EudS1+vp" inline="true"><value name="key1"><shadow type="mode" id="oxZRaMkh?^eySRf|ok(8"><field name="flag">sensor.RGB565</field></shadow></value><value name="key2"><shadow type="size" id="v]6_0e2byT8Qp)P#xLz%"><field name="flag">sensor.B240X240</field></shadow></value><value name="key3"><shadow type="on_off" id="xm/$pq7TN`T{IyUGVc%!"><field name="flag">1</field></shadow></value><next><block type="lcd_init" id="7k30Udj[^A,A{ZWAv@w{" inline="true"><value name="freq"><shadow type="math_number" id="nPqk7J*9N$L(7kuMaKDW"><field name="NUM">15000000</field></shadow></value><value name="color"><shadow type="math_number" id="!V0.x.D$xn:{vIK$Gj$7"><field name="NUM">0x0000</field></shadow></value><next><block type="controls_whileUntil" id="@m}0r#slK4YTsaP+yy)^"><field name="MODE">WHILE</field><value name="BOOL"><shadow type="logic_boolean" id="b4hm+Fi*H2%fy7?.f46J"><field name="BOOL">TRUE</field></shadow></value><statement name="DO"><block type="variables_set" id="CW|M~n?/8$J(RC1;mu@T"><field name="VAR">image</field><value name="VALUE"><block type="camera_snapshot" id="tnDEVtRQm/}7E9Ole6X4"></block></value><next><block type="lcd_display" id="SCPK8n0~2t!q=rDOH-sA"><value name="img"><shadow xmlns="http://www.w3.org/1999/xhtml" type="factory_block_return" id="Sln7v5O@weDVs5h}cyY-"><field name="VALUE">image</field></shadow><block type="image_flood_fill" id="U^T=lN@r{]T;f#S)](]U"><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="variables_get" id="1}RKdg6Bt{}==7`*[mI5"><field name="VAR">image</field></shadow><block type="variables_get" id="vy+JHC*4:lBsI*ZQ8=jn"><field name="VAR">image</field></block></value><value name="LIST"><shadow type="list_many_input" id="wxDepMX}ec-_JZzRq!un"><field name="CONTENT">160,120</field></shadow></value><value name="color"><shadow type="math_number" id="DZDEYIVQ7brz,VwL.6N?"><field name="NUM">0xFFFF</field></shadow></value><value name="seed"><shadow type="math_number" id="c$j7![ex1SsRW@hW$5hE"><field name="NUM">0.05</field></shadow></value><value name="float"><shadow type="math_number" id="pRg23th}`Fp?jD2J`F`{"><field name="NUM">0.05</field></shadow></value><value name="invert"><shadow type="on_off" id="j}$VK4d?Jzv?Ym-P(zhu"><field name="flag">1</field></shadow></value><value name="clear"><shadow type="on_off" id="xHx#F)9b#fKu~(|$%R{t"><field name="flag">1</field></shadow></value></block></value></block></next></block></statement></block></next></block></next></block></next></block></xml>

View File

@@ -0,0 +1 @@
<xml version="Mixly 2.0 Beta11" board="MixGo AI" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_block_notes" id="7z*[!f#qKzvJvLsN6N,#" x="332" y="-139"><field name="VALUE">Imge 直线识别_识别摄像头采集图片中直线线条</field><next><block type="camera_init" id="LMi~5;,I:$e!x_!5x#g|" inline="true"><value name="key1"><shadow type="mode" id="[|,5zz=*qs$`6goSmqcX"><field name="flag">sensor.RGB565</field></shadow></value><value name="key2"><shadow type="size" id="EOP7I%Gi~Fx$ze|8vhhc"><field name="flag">sensor.B240X240</field></shadow></value><value name="key3"><shadow type="on_off" id="}25QG%`{:);p~/R8Uv7p"><field name="flag">1</field></shadow></value><next><block type="lcd_init" id="Zkx^JUJ4pt/6Td*]Ye,m" inline="true"><value name="freq"><shadow type="math_number" id="VEN#xd$u;bTjga2Y7WSV"><field name="NUM">15000000</field></shadow></value><value name="color"><shadow type="math_number" id="eDJa8LG(=pc{B2qotBri"><field name="NUM">0x0000</field></shadow></value><next><block type="controls_whileUntil" id="wz.jTKO21$r/^)Wkmwvm"><field name="MODE">WHILE</field><value name="BOOL"><shadow type="logic_boolean" id="WKaflaFXo)ZB,-B@bggX"><field name="BOOL">TRUE</field></shadow></value><statement name="DO"><block type="variables_set" id="d_m{|O*NOF,E?OLYseq`"><field name="VAR">img</field><value name="VALUE"><block type="camera_snapshot" id="~up9Nu#J?~rT?S}J@c99"></block></value><next><block type="controls_forEach" id="Y^t[jxks/A/*=|/sQF`R"><value name="LIST"><shadow xmlns="http://www.w3.org/1999/xhtml" type="list_many_input" id="6}el?f}`FP3?XZ~bzqHd"><field name="CONTENT">0,1,2,3</field></shadow><block type="image_find_lines" id="oxp8xVd6ou]*sb[M-AL~" inline="true"><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="variables_get" id="`1/ybOMb^vwuByL5Fu!{"><field name="VAR">image</field></shadow><block type="variables_get" id="zX;hJLJ}%|_(6SHhbS8]"><field name="VAR">img</field></block></value><value name="roi"><shadow type="list_many_input" id="HR3+S[%d;}N*0}3/u87L"><field name="CONTENT">0,0,240,240</field></shadow></value><value name="threshold"><shadow type="math_number" id=".T^2t3JFs[CipC1Er@4D"><field name="NUM">1000</field></shadow></value><value name="theta_margin"><shadow type="math_number" id="8ij_-C%|.%%jX%W+dn0R"><field name="NUM">25</field></shadow></value><value name="rho_margin"><shadow type="math_number" id="9u3[a|qxG,1?2N%-AO=Q"><field name="NUM">25</field></shadow></value></block></value><value name="VAR"><shadow type="variables_get" id="YM=N3MI0R]P`qR_y7u-!"><field name="VAR">i</field></shadow></value><statement name="DO"><block type="lcd_display" id="P@Nx|tr;,tLDipPK`hfu"><value name="img"><shadow xmlns="http://www.w3.org/1999/xhtml" type="factory_block_return" id="ESZX9f)Ei!Da5gS)hlmb"><field name="VALUE">image</field></shadow><block type="image_draw_line" id="d:c[Tdwbtm*?U^h24r@?" inline="true"><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="variables_get" id=":.YacURY)3FQ=?[r,Zm["><field name="VAR">image</field></shadow><block type="variables_get" id="MU$w!FWz*7{LKqm`t[aF"><field name="VAR">img</field></block></value><value name="LIST"><shadow xmlns="http://www.w3.org/1999/xhtml" type="list_many_input" id="YLF{z0LN,O|gjyaxu^iz"><field name="CONTENT">10,20,30,40</field></shadow><block type="image_line" id="TXLDJw%()s8ttc^ldwCj"><field name="key">line</field><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="variables_get" id="OQSc,V^FaJt|.jYr#,,A"><field name="VAR">line</field></shadow><block type="variables_get" id="HaH^$7}YapD#1Ozd]]S8"><field name="VAR">i</field></block></value></block></value><value name="color"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="H9(r83],Z3*~C9=+e[`@"><field name="NUM">0xFFFF</field></shadow><block type="tuple_create_with_text_return" id="_#@a~Vz}!OFBB;6sI1Z1"><field name="TEXT">255,0,0</field></block></value><value name="thi"><shadow type="math_number" id="X}mnRB1uJPNqB^Kp$UW}"><field name="NUM">1</field></shadow></value></block></value></block></statement></block></next></block></statement></block></next></block></next></block></next></block></xml>

View File

@@ -0,0 +1 @@
<xml version="Mixly 2.0 Beta11" board="MixGo AI" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_block_notes" id="_glsEO-NwUmRXtD.zhEW" x="304" y="-130"><field name="VALUE">Imge 圆形识别_识别摄像头采集图片中圆形图案</field><next><block type="camera_init" id="LMi~5;,I:$e!x_!5x#g|" inline="true"><value name="key1"><shadow type="mode" id="[|,5zz=*qs$`6goSmqcX"><field name="flag">sensor.YUV422</field></shadow></value><value name="key2"><shadow type="size" id="EOP7I%Gi~Fx$ze|8vhhc"><field name="flag">sensor.B240X240</field></shadow></value><value name="key3"><shadow type="on_off" id="}25QG%`{:);p~/R8Uv7p"><field name="flag">1</field></shadow></value><next><block type="lcd_init" id="Zkx^JUJ4pt/6Td*]Ye,m" inline="true"><value name="freq"><shadow type="math_number" id="VEN#xd$u;bTjga2Y7WSV"><field name="NUM">15000000</field></shadow></value><value name="color"><shadow type="math_number" id="eDJa8LG(=pc{B2qotBri"><field name="NUM">0x0000</field></shadow></value><next><block type="controls_whileUntil" id="wz.jTKO21$r/^)Wkmwvm"><field name="MODE">WHILE</field><value name="BOOL"><shadow type="logic_boolean" id="WKaflaFXo)ZB,-B@bggX"><field name="BOOL">TRUE</field></shadow></value><statement name="DO"><block type="variables_set" id="d_m{|O*NOF,E?OLYseq`"><field name="VAR">img</field><value name="VALUE"><block type="camera_snapshot" id="~up9Nu#J?~rT?S}J@c99"></block></value><next><block type="controls_forEach" id="Y^t[jxks/A/*=|/sQF`R"><value name="LIST"><shadow xmlns="http://www.w3.org/1999/xhtml" type="list_many_input" id="6}el?f}`FP3?XZ~bzqHd"><field name="CONTENT">0,1,2,3</field></shadow><block type="image_find_circles" id="VgpG5SjRDn#|qI{f5}Sa" inline="true"><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="variables_get" id="MLw2*RQ~_SR@6N}3HmkP"><field name="VAR">image</field></shadow><block type="variables_get" id=";_PatR,5)qeqCEGS`rIE"><field name="VAR">img</field></block></value><value name="roi"><shadow type="list_many_input" id="%J73T/kUlv{n=d:S-Pof"><field name="CONTENT">0,0,240,240</field></shadow></value><value name="threshold"><shadow type="math_number" id="u.,B?TIO54!nV!`Zc[EI"><field name="NUM">3500</field></shadow></value><value name="r_min"><shadow type="math_number" id="UPKR1fPV1lGVieVj#Fw5"><field name="NUM">2</field></shadow></value><value name="r_max"><shadow type="math_number" id="TT2%GuU]Z8a29{AHGk!N"><field name="NUM">100</field></shadow></value><value name="r_step"><shadow type="math_number" id="rOi?SSAX%6=uO[d4^^Vf"><field name="NUM">2</field></shadow></value><value name="x_margin"><shadow type="math_number" id="q5|o)R!^gAX{*?7i*IFv"><field name="NUM">10</field></shadow></value><value name="y_margin"><shadow type="math_number" id="b?B`zv:qX)$^`1{C#4Iz"><field name="NUM">10</field></shadow></value><value name="r_margin"><shadow type="math_number" id="eW@s$h}q1!QRpC/:8r.W"><field name="NUM">10</field></shadow></value></block></value><value name="VAR"><shadow type="variables_get" id="YM=N3MI0R]P`qR_y7u-!"><field name="VAR">i</field></shadow></value><statement name="DO"><block type="variables_set" id="|#s6Qn2p0P!p33vyB+1t"><field name="VAR">img</field><value name="VALUE"><block type="image_draw_circle" id="8bKuF_*x?p0gG05AV*fn" inline="true"><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="variables_get" id="L/d@B$+ykds//ZaACs-G"><field name="VAR">image</field></shadow><block type="variables_get" id="MU$w!FWz*7{LKqm`t[aF"><field name="VAR">img</field></block></value><value name="LIST"><shadow xmlns="http://www.w3.org/1999/xhtml" type="list_many_input" id="ZGzFuYdr$_2)?h|2z|g/"><field name="CONTENT">40,30,20</field></shadow><block type="image_circle" id="Lrj)8+*qA@4c-/aNA?wT"><field name="key">circle</field><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="variables_get" id="HA[)x4RCC={ML13M^D/0"><field name="VAR">circle</field></shadow><block type="variables_get" id="HaH^$7}YapD#1Ozd]]S8"><field name="VAR">i</field></block></value></block></value><value name="color"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="{=Nqj*ogCd4w[X=cyB:~"><field name="NUM">0xFFFF</field></shadow><block type="tuple_create_with_text_return" id="9Wdn;dqQKs1DaLYe]|oE"><field name="TEXT">255,0,0</field></block></value><value name="thi"><shadow type="math_number" id="3OYtZZ%~g!oH~c/~xI%P"><field name="NUM">1</field></shadow></value><value name="fil"><shadow type="true_false" id="o`F@UbbRV_2.Z:0BkJ()"><field name="flag">1</field></shadow></value></block></value></block></statement><next><block type="lcd_display" id="P@Nx|tr;,tLDipPK`hfu"><value name="img"><shadow xmlns="http://www.w3.org/1999/xhtml" type="factory_block_return" id="ESZX9f)Ei!Da5gS)hlmb"><field name="VALUE">image</field></shadow><block type="variables_get" id="!,A$g}LY`I;_H*+iTZ,0"><field name="VAR">img</field></block></value></block></next></block></next></block></statement></block></next></block></next></block></next></block></xml>

View File

@@ -0,0 +1 @@
<xml version="Mixly 2.0 Beta11" board="MixGo AI" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_block_notes" id="i5loRPjuJ~ODaP3wJAI+" x="285" y="-201"><field name="VALUE">Imge 矩形识别_识别摄像头采集图片中矩形图案</field><next><block type="camera_init" id="LMi~5;,I:$e!x_!5x#g|" inline="true"><value name="key1"><shadow type="mode" id="[|,5zz=*qs$`6goSmqcX"><field name="flag">sensor.GRAYSCALE</field></shadow></value><value name="key2"><shadow type="size" id="EOP7I%Gi~Fx$ze|8vhhc"><field name="flag">sensor.B240X240</field></shadow></value><value name="key3"><shadow type="on_off" id="}25QG%`{:);p~/R8Uv7p"><field name="flag">1</field></shadow></value><next><block type="lcd_init" id="Zkx^JUJ4pt/6Td*]Ye,m" inline="true"><value name="freq"><shadow type="math_number" id="VEN#xd$u;bTjga2Y7WSV"><field name="NUM">15000000</field></shadow></value><value name="color"><shadow type="math_number" id="eDJa8LG(=pc{B2qotBri"><field name="NUM">0x0000</field></shadow></value><next><block type="controls_whileUntil" id="wz.jTKO21$r/^)Wkmwvm"><field name="MODE">WHILE</field><value name="BOOL"><shadow type="logic_boolean" id="WKaflaFXo)ZB,-B@bggX"><field name="BOOL">TRUE</field></shadow></value><statement name="DO"><block type="variables_set" id="d_m{|O*NOF,E?OLYseq`"><field name="VAR">img</field><value name="VALUE"><block type="camera_snapshot" id="~up9Nu#J?~rT?S}J@c99"></block></value><next><block type="controls_forEach" id="Y^t[jxks/A/*=|/sQF`R"><value name="LIST"><shadow xmlns="http://www.w3.org/1999/xhtml" type="list_many_input" id="6}el?f}`FP3?XZ~bzqHd"><field name="CONTENT">0,1,2,3</field></shadow><block type="image_find_rects" id="[p/~,cR)hso#bbt49vl?" inline="true"><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="variables_get" id="-lB3j[6k#hwen8jZ)$YK"><field name="VAR">image</field></shadow><block type="variables_get" id="MU$w!FWz*7{LKqm`t[aF"><field name="VAR">img</field></block></value><value name="roi"><shadow type="list_many_input" id="{g{T}9KwyKawwFwX75-#"><field name="CONTENT">0,0,240,240</field></shadow></value><value name="threshold"><shadow type="math_number" id="R^2NKIw6MG@;Q_V_R-2N"><field name="NUM">10000</field></shadow></value></block></value><value name="VAR"><shadow type="variables_get" id="YM=N3MI0R]P`qR_y7u-!"><field name="VAR">i</field></shadow></value><statement name="DO"><block type="variables_set" id="|#s6Qn2p0P!p33vyB+1t"><field name="VAR">img</field><value name="VALUE"><block type="image_draw_rectangle" id="(HP|Z{1`;~B58YDVV![R" inline="true"><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="variables_get" id="`Q{7O/K,gvPG7ED!/,T8"><field name="VAR">image</field></shadow><block type="variables_get" id=";_PatR,5)qeqCEGS`rIE"><field name="VAR">img</field></block></value><value name="LIST"><shadow xmlns="http://www.w3.org/1999/xhtml" type="list_many_input" id="DjD}P]z@^GHYJ)?RUSsq"><field name="CONTENT">10,20,30,40</field></shadow><block type="image_rect" id="*bix2y9nsAT_a#IWT*}!"><field name="key">rect</field><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="variables_get" id="h45J)de=c@|%OaogcQ%^"><field name="VAR">rect</field></shadow><block type="variables_get" id="HaH^$7}YapD#1Ozd]]S8"><field name="VAR">i</field></block></value></block></value><value name="color"><shadow xmlns="http://www.w3.org/1999/xhtml" type="math_number" id="SB|HR_tcNL{sXe!K;6yw"><field name="NUM">0xFFFF</field></shadow><block type="tuple_create_with_text_return" id="GYI^u^Jz?bJk54b^X!X+"><field name="TEXT">255,0,0</field></block></value><value name="thi"><shadow type="math_number" id="lu3e=f#Rl2KDOkg_MyP8"><field name="NUM">1</field></shadow></value><value name="fil"><shadow type="true_false" id="LvC:,X.ZGu95W(jRH%q%"><field name="flag">0</field></shadow></value></block></value></block></statement><next><block type="lcd_display" id="P@Nx|tr;,tLDipPK`hfu"><value name="img"><shadow xmlns="http://www.w3.org/1999/xhtml" type="factory_block_return" id="ESZX9f)Ei!Da5gS)hlmb"><field name="VALUE">image</field></shadow><block type="variables_get" id="!,A$g}LY`I;_H*+iTZ,0"><field name="VAR">img</field></block></value></block></next></block></next></block></statement></block></next></block></next></block></next></block></xml>

View File

@@ -0,0 +1 @@
<xml version="Mixly 2.0 Beta11" board="MixGo AI" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_block_notes" id=";Jhz*M*HLILUH4_D6zwO" x="-246" y="-35"><field name="VALUE">Imge 颜色追踪_追踪采集图片中设定色域的颜色</field><next><block type="lcd_init" id="}-[lY$u?cJZF/X1$W-Ow" inline="true"><value name="freq"><shadow type="math_number" id="N;(g]YT@_!yF^J/8xSI@"><field name="NUM">15000000</field></shadow></value><value name="color"><shadow type="math_number" id="esjR0m{w1NQ*7UIC.duR"><field name="NUM">0x0000</field></shadow></value><next><block type="camera_init" id="`8B*Z/A%lp5.=B9;b.%p" inline="true"><value name="key1"><shadow type="mode" id="@IJw]]5}hP:ba8e!8Pn,"><field name="flag">sensor.YUV422</field></shadow></value><value name="key2"><shadow type="size" id="S*rkIvjP?1au8]p)*hjb"><field name="flag">sensor.B240X240</field></shadow></value><value name="key3"><shadow type="on_off" id="AdU=!5vT0Rm*2|J(q:LB"><field name="flag">1</field></shadow></value><next><block type="controls_whileUntil" id="9!0lhMSUX6IObM=YP(p@"><field name="MODE">WHILE</field><value name="BOOL"><shadow type="logic_boolean" id="nx];#JLigb0J@SW7jvTp"><field name="BOOL">TRUE</field></shadow></value><statement name="DO"><block type="variables_set" id="NO4fTiAaNe;d^1S:8h;?"><field name="VAR">img</field><value name="VALUE"><block type="camera_snapshot" id="~,G5XPM%1Yb({1~f{=d0"></block></value><next><block type="controls_forEach" id="i]9IZP}oZ`i*SwQ(Nmdt"><value name="LIST"><shadow xmlns="http://www.w3.org/1999/xhtml" type="list_many_input" id="?Pc7@HZCe0FARr/@u4`y"><field name="CONTENT">0,1,2,3</field></shadow><block type="image_find_blobs" id="nhyQ~pwm=}w8/vi~YTuc" inline="true"><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="variables_get" id="Qn|On[|FnC`K~g(7.26)"><field name="VAR">image</field></shadow><block type="variables_get" id="_0r^pOeUNGvugTKz+iEu"><field name="VAR">img</field></block></value><value name="LIST"><shadow type="list_many_input" id="*mmp4D{N9D+t9a0:Sy=?"><field name="CONTENT">0, 100, 0, 100, 0, 0</field></shadow></value><value name="roi"><shadow type="list_many_input" id="ˆ?aqd2p``bA)]/JlA_"><field name="CONTENT">0,0,240,240</field></shadow></value><value name="area"><shadow type="math_number" id="GmXu+[x~Rh6j+,KZz]B!"><field name="NUM">200</field></shadow></value><value name="pixel"><shadow type="math_number" id="_5jub`Z*0$5^1De8fBMR"><field name="NUM">200</field></shadow></value><value name="margin"><shadow type="math_number" id="dH_Do-iVw8u;{LDQ8z*P"><field name="NUM">10</field></shadow></value><value name="key"><shadow type="on_off" id="L?mJ#S6$wD+1%}}GV$t-"><field name="flag">1</field></shadow></value></block></value><value name="VAR"><shadow type="variables_get" id="Q;5;}g/8x%!@,z.g|]Ub"><field name="VAR">i</field></shadow></value><statement name="DO"><block type="variables_set" id="oEr6w+9.|!6f;MpD|FAy"><field name="VAR">image</field><value name="VALUE"><block type="image_draw_rectangle" id="zcv)s7Ev)2G4O~l#iSEr" inline="true"><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="variables_get" id="vkTnS[H9~#ºj+-mw*w"><field name="VAR">image</field></shadow><block type="variables_get" id="A(O/N`%QYfAdhpPUb2|9"><field name="VAR">img</field></block></value><value name="LIST"><shadow xmlns="http://www.w3.org/1999/xhtml" type="list_many_input" id="oj(hIm)]V6]5LdH5Q_s!"><field name="CONTENT">10,20,30,40</field></shadow><block type="image_blob" id="O#eW5[nlj.DQzAJJ=NQo"><field name="key">rect</field><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="variables_get" id="By?QL_vK!1e$OFQBN}tQ"><field name="VAR">blob</field></shadow><block type="variables_get" id="[i5YzdF-g_`~!}-Wo+aM"><field name="VAR">i</field></block></value></block></value><value name="color"><shadow type="math_number" id=":IpWJK;!}kIxT0eTf8H6"><field name="NUM">0xFFFF</field></shadow></value><value name="thi"><shadow type="math_number" id="@xoLezS6(:oH(l^rMzN5"><field name="NUM">1</field></shadow></value><value name="fil"><shadow type="true_false" id="c`=W*8I=.hTqAuK{.u*e"><field name="flag">0</field></shadow></value></block></value></block></statement><next><block type="lcd_display" id="YaB,Z?R=$%s+U/P=4zgF"><value name="img"><shadow xmlns="http://www.w3.org/1999/xhtml" type="factory_block_return" id="$wv~0.^oNx-19k)]zm9$"><field name="VALUE">image</field></shadow><block type="variables_get" id="DA{(RbT{eWdpwp/AeXj9"><field name="VAR">img</field></block></value></block></next></block></next></block></statement></block></next></block></next></block></next></block></xml>

View File

@@ -0,0 +1 @@
<xml version="Mixly 2.0 Beta11" board="MixGo AI" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_block_notes" id="HN4B:^.J*q#f!fd|Jyw)" x="67" y="-79"><field name="VALUE">Imge 特征识别_识别采集图片的特征点并绘画出</field><next><block type="camera_init" id="p@bo:.g89sNR/!bWs!Pt" inline="true"><value name="key1"><shadow type="mode" id="?D%JO!IAx.D:PBJJw_Kw"><field name="flag">sensor.GRAYSCALE</field></shadow></value><value name="key2"><shadow type="size" id="}/¾N]yq@2_Sd@SC=cQ"><field name="flag">sensor.B240X240</field></shadow></value><value name="key3"><shadow type="on_off" id="v^iAujda~^0ywduJnXNN"><field name="flag">1</field></shadow></value><next><block type="lcd_init" id="5~(Qp-a}(EacxA6QK/ZF" inline="true"><value name="freq"><shadow type="math_number" id="59XW|DR4v-bN,K[Vin2C"><field name="NUM">15000000</field></shadow></value><value name="color"><shadow type="math_number" id="Das,:Rx7W+YiA|XTYd7b"><field name="NUM">0x0000</field></shadow></value><next><block type="camera_setmun" id="6CtRuH?v6|ueqKJh0#8L"><field name="key">set_contrast</field><value name="num"><shadow type="math_number" id="k)|#?T6H.KT%ndRXcYOo"><field name="NUM">-50</field></shadow></value><next><block type="controls_whileUntil" id="rTOtUj}8`a/=`Dbh8Sil"><field name="MODE">WHILE</field><value name="BOOL"><shadow type="logic_boolean" id=",t#}EN(v_}YJLBe})f$3"><field name="BOOL">TRUE</field></shadow></value><statement name="DO"><block type="variables_set" id="iXd7wh17Y8j}Ai3$ltG~"><field name="VAR">image</field><value name="VALUE"><block type="camera_snapshot" id="D5#SggjnjRG5%3rJ`*74"></block></value><next><block type="variables_set" id="KOLo|{waBfytmL8B(UxK"><field name="VAR">kpts</field><value name="VALUE"><block type="image_find_keypoints" id="Rf:WZqzz`$ ?).QmYL" inline="true"><value name="VAR"><shadow type="variables_get" id="KJ}e?p?Y%qQY:(;V5FH,"><field name="VAR">image</field></shadow></value><value name="roi"><shadow type="list_many_input" id="c%);dk+|#;iyQSYx.$t~"><field name="CONTENT">0,0,240,240</field></shadow></value><value name="max_keypoints"><shadow type="math_number" id="z(t-Zzez51}1ca9-Fq|r"><field name="NUM">150</field></shadow></value><value name="threshold"><shadow type="math_number" id=";;Lf}Xx,C;|`rYC9rr7I"><field name="NUM">2</field></shadow></value><value name="scale_factor"><shadow type="math_number" id="O.~fd_icsTfAwSb#ch[J"><field name="NUM">0.2</field></shadow></value><value name="normalized"><shadow type="on_off" id=".~pdaYd(7Qh)`xl]BM]-"><field name="flag">1</field></shadow></value></block></value><next><block type="controls_if" id="u^k3K*j!9!#e7?VO$r?)"><value name="IF0"><block type="variables_get" id="PLebKXlb3T`6_#n7KF(^"><field name="VAR">kpts</field></block></value><statement name="DO0"><block type="variables_set" id="rv/Tl:kWPdfrifS6_$rd"><field name="VAR">image</field><value name="VALUE"><block type="image_draw_keypoints" id="c^5Jw1ALtxcE4Wd-hiqP" inline="true"><value name="VAR"><shadow type="variables_get" id="sKL`v([mNJ,yTVu1-b(V"><field name="VAR">image</field></shadow></value><value name="keypoints"><shadow xmlns="http://www.w3.org/1999/xhtml" type="factory_block_return" id="^m(y+0j%{;@rR+1?ZGm8"><field name="VALUE">keypoints</field></shadow><block type="variables_get" id="(C3oEQ^/:xglwj0V_}5)"><field name="VAR">kpts</field></block></value><value name="color"><shadow type="math_number" id="4ZzBRzV!ZFO-]t)tgD:M"><field name="NUM">0xFFFF</field></shadow></value><value name="size"><shadow type="math_number" id="G:X$PI~5z(!uw7YaEy:D"><field name="NUM">10</field></shadow></value><value name="thi"><shadow type="math_number" id="`TN~pW0!`Bx,BfJK6+mR"><field name="NUM">1</field></shadow></value><value name="fil"><shadow type="true_false" id="~_I2JImP3vfb%c`qZ-u3"><field name="flag">0</field></shadow></value></block></value></block></statement><next><block type="lcd_display" id="HE]dVDh-5;jst`kE1s[V"><value name="img"><shadow type="factory_block_return" id="{ZYyEs,zD@MmF{Ku[G;h"><field name="VALUE">image</field></shadow></value></block></next></block></next></block></next></block></statement></block></next></block></next></block></next></block></next></block></xml>

View File

@@ -0,0 +1 @@
<xml version="Mixly 2.0 Beta11" board="MixGo AI" xmlns="http://www.w3.org/1999/xhtml"><block type="factory_block_notes" id="p3O!+$.D1s49C__I@Vgn" x="-332" y="-102"><field name="VALUE">Imge 条形码识别_识别采集图片的条形码并解析信息</field><next><block type="lcd_init" id="cm}6:2z,NzQG+l3y=*o}" inline="true"><value name="freq"><shadow type="math_number" id="n^5LG`c[akDZpOi~C7N*"><field name="NUM">15000000</field></shadow></value><value name="color"><shadow type="math_number" id="Jn~I{^ifG.pJ]{5(:R?U"><field name="NUM">0x0000</field></shadow></value><next><block type="camera_init" id="wwLU+Y|hpb:WEd$YMoXD" inline="true"><value name="key1"><shadow type="mode" id="[Lxo0T*!MV#ihP`T3:GX"><field name="flag">sensor.YUV422</field></shadow></value><value name="key2"><shadow type="size" id="xuYYq]8gQN@F%%.3m2x)"><field name="flag">sensor.B240X240</field></shadow></value><value name="key3"><shadow type="on_off" id="n*8TBf!x*s6(LpS.f=3/"><field name="flag">1</field></shadow></value><next><block type="controls_whileUntil" id="N4,yQ~el]A/4d;tp4TF="><field name="MODE">WHILE</field><value name="BOOL"><shadow type="logic_boolean" id="LJroho~*25:)Hj2-iAUT"><field name="BOOL">TRUE</field></shadow></value><statement name="DO"><block type="variables_set" id="7S7LC/U~i?U$CGxRY0a{"><field name="VAR">image</field><value name="VALUE"><block type="camera_snapshot" id="pj3D!LEOe*[E7X~d6wn*"></block></value><next><block type="controls_forEach" id="JNx?R[(io2?.?0b!2VNM"><value name="LIST"><shadow xmlns="http://www.w3.org/1999/xhtml" type="list_many_input" id="V#Nr2zw!^xHC.RYts=#?"><field name="CONTENT">0,1,2,3</field></shadow><block type="image_find_barcodes" id="_Ks^Vl~+1fE){p`P4;nT" inline="true"><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="variables_get" id="`.AC[hqqCB!8]|S=w%pq"><field name="VAR">image</field></shadow><block type="variables_get" id="!@Nw@#JGrV6jY]CihmS="><field name="VAR">image</field></block></value><value name="roi"><shadow type="list_many_input" id="Cz9?)[dW=)o@=c.5Z@tU"><field name="CONTENT">0,0,240,240</field></shadow></value></block></value><value name="VAR"><shadow type="variables_get" id="398B[3aS?)5{B~3;)T),"><field name="VAR">i</field></shadow></value><statement name="DO"><block type="system_print" id="9IE+!w4;D(I-lc9xqmv~"><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="text" id="q7G=fkPV}i0B?XM9[#XK"><field name="TEXT">Mixly</field></shadow><block type="image_barcode" id=":_D~).!.:U?vw5nLW-q6"><field name="key">payload</field><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="variables_get" id="bYk$2Uk=J=d^Dywh}OJ7"><field name="VAR">barcode</field></shadow><block type="variables_get" id="RxQvF(`N.nfj@Y4S%!#,"><field name="VAR">i</field></block></value></block></value><next><block type="variables_set" id="eBOgM!l,eO:Lp010)sLm"><field name="VAR">image</field><value name="VALUE"><block type="image_draw_rectangle" id="u6Hzzw^B[5d5:*`+49wb" inline="true"><value name="VAR"><shadow type="variables_get" id="+Yv!*_[[b1c$sS~ZcnC%"><field name="VAR">image</field></shadow></value><value name="LIST"><shadow xmlns="http://www.w3.org/1999/xhtml" type="list_many_input" id="4Aox(.|FTplkyfUwCc5`"><field name="CONTENT">10,20,30,40</field></shadow><block type="image_barcode" id="SkET]8dPqx4r69nkT||B"><field name="key">rect</field><value name="VAR"><shadow xmlns="http://www.w3.org/1999/xhtml" type="variables_get" id="bYk$2Uk=J=d^Dywh}OJ7"><field name="VAR">barcode</field></shadow><block type="variables_get" id="e![_,(r4-GzzPN}:IPXE"><field name="VAR">i</field></block></value></block></value><value name="color"><shadow type="math_number" id="h~|5X2+3My?ZhF65v}YB"><field name="NUM">0x00FF</field></shadow></value><value name="thi"><shadow type="math_number" id="rc_2yycyg5;[AIz0+.mr"><field name="NUM">1</field></shadow></value><value name="fil"><shadow type="true_false" id="[s-Wt;h++3r|XUZ=^`A3"><field name="flag">1</field></shadow></value></block></value></block></next></block></statement><next><block type="lcd_display" id="#hz7c]S1LYD/G=yA2]be"><value name="img"><shadow xmlns="http://www.w3.org/1999/xhtml" type="factory_block_return" id="iK3)%`:p1P]rAB{76NFR"><field name="VALUE">image</field></shadow><block type="variables_get" id="FsH.Z}AqhiPlTu2O^eA@"><field name="VAR">image</field></block></value></block></next></block></next></block></statement></block></next></block></next></block></next></block></xml>

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