初始化提交
This commit is contained in:
3
boards/default_src/micropython_k210_mixgoai/.npmignore
Normal file
3
boards/default_src/micropython_k210_mixgoai/.npmignore
Normal file
@@ -0,0 +1,3 @@
|
||||
node_modules
|
||||
build
|
||||
origin
|
||||
276
boards/default_src/micropython_k210_mixgoai/blocks/actuator.js
Normal file
276
boards/default_src/micropython_k210_mixgoai/blocks/actuator.js
Normal 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("根据参数返回运算结果");
|
||||
}
|
||||
};
|
||||
360
boards/default_src/micropython_k210_mixgoai/blocks/ai.js
Normal file
360
boards/default_src/micropython_k210_mixgoai/blocks/ai.js
Normal 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---------------------------------------------------
|
||||
|
||||
|
||||
161
boards/default_src/micropython_k210_mixgoai/blocks/av.js
Normal file
161
boards/default_src/micropython_k210_mixgoai/blocks/av.js
Normal 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("视频录制");
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
265
boards/default_src/micropython_k210_mixgoai/blocks/camera.js
Normal file
265
boards/default_src/micropython_k210_mixgoai/blocks/camera.js
Normal 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("设置摄像头窗口大小");
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
273
boards/default_src/micropython_k210_mixgoai/blocks/display.js
Normal file
273
boards/default_src/micropython_k210_mixgoai/blocks/display.js
Normal 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("在液晶屏上显示一张image(GRAYSCALE或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("读取当前屏幕的状态以及按下的点的坐标值");
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
286
boards/default_src/micropython_k210_mixgoai/blocks/factory.js
Normal file
286
boards/default_src/micropython_k210_mixgoai/blocks/factory.js
Normal 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);
|
||||
}
|
||||
};
|
||||
200
boards/default_src/micropython_k210_mixgoai/blocks/hear.js
Normal file
200
boards/default_src/micropython_k210_mixgoai/blocks/hear.js
Normal 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("语音识别,注销语音识别,释放内存");
|
||||
}
|
||||
};
|
||||
|
||||
1626
boards/default_src/micropython_k210_mixgoai/blocks/image.js
Normal file
1626
boards/default_src/micropython_k210_mixgoai/blocks/image.js
Normal file
File diff suppressed because it is too large
Load Diff
154
boards/default_src/micropython_k210_mixgoai/blocks/inout.js
Normal file
154
boards/default_src/micropython_k210_mixgoai/blocks/inout.js
Normal 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("取消中断");
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
306
boards/default_src/micropython_k210_mixgoai/blocks/iot.js
Normal file
306
boards/default_src/micropython_k210_mixgoai/blocks/iot.js
Normal 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;
|
||||
@@ -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;
|
||||
444
boards/default_src/micropython_k210_mixgoai/blocks/math.js
Normal file
444
boards/default_src/micropython_k210_mixgoai/blocks/math.js
Normal 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
|
||||
72
boards/default_src/micropython_k210_mixgoai/blocks/nes.js
Normal file
72
boards/default_src/micropython_k210_mixgoai/blocks/nes.js
Normal 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");
|
||||
}
|
||||
};
|
||||
|
||||
249
boards/default_src/micropython_k210_mixgoai/blocks/network.js
Normal file
249
boards/default_src/micropython_k210_mixgoai/blocks/network.js
Normal 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);
|
||||
}
|
||||
};
|
||||
220
boards/default_src/micropython_k210_mixgoai/blocks/pins.js
Normal file
220
boards/default_src/micropython_k210_mixgoai/blocks/pins.js
Normal 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);
|
||||
}
|
||||
};
|
||||
322
boards/default_src/micropython_k210_mixgoai/blocks/sensor.js
Normal file
322
boards/default_src/micropython_k210_mixgoai/blocks/sensor.js
Normal 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;
|
||||
});
|
||||
}
|
||||
};
|
||||
341
boards/default_src/micropython_k210_mixgoai/blocks/serial.js
Normal file
341
boards/default_src/micropython_k210_mixgoai/blocks/serial.js
Normal 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);
|
||||
}
|
||||
};
|
||||
199
boards/default_src/micropython_k210_mixgoai/blocks/system.js
Normal file
199
boards/default_src/micropython_k210_mixgoai/blocks/system.js
Normal 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;
|
||||
59
boards/default_src/micropython_k210_mixgoai/blocks/updata.js
Normal file
59
boards/default_src/micropython_k210_mixgoai/blocks/updata.js
Normal 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("颜色");
|
||||
}
|
||||
};
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
83
boards/default_src/micropython_k210_mixgoai/export.js
Normal file
83
boards/default_src/micropython_k210_mixgoai/export.js
Normal 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
|
||||
};
|
||||
@@ -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];
|
||||
}
|
||||
149
boards/default_src/micropython_k210_mixgoai/generators/ai.js
Normal file
149
boards/default_src/micropython_k210_mixgoai/generators/ai.js
Normal 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---------------------------------------------------
|
||||
55
boards/default_src/micropython_k210_mixgoai/generators/av.js
Normal file
55
boards/default_src/micropython_k210_mixgoai/generators/av.js
Normal 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;
|
||||
}
|
||||
115
boards/default_src/micropython_k210_mixgoai/generators/camera.js
Normal file
115
boards/default_src/micropython_k210_mixgoai/generators/camera.js
Normal 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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
/**/
|
||||
@@ -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';
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
595
boards/default_src/micropython_k210_mixgoai/generators/image.js
Normal file
595
boards/default_src/micropython_k210_mixgoai/generators/image.js
Normal 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];
|
||||
}
|
||||
106
boards/default_src/micropython_k210_mixgoai/generators/inout.js
Normal file
106
boards/default_src/micropython_k210_mixgoai/generators/inout.js
Normal 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;
|
||||
}
|
||||
/////////////////////////////////////////////
|
||||
@@ -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;
|
||||
}
|
||||
358
boards/default_src/micropython_k210_mixgoai/generators/math.js
Normal file
358
boards/default_src/micropython_k210_mixgoai/generators/math.js
Normal 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;
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
182
boards/default_src/micropython_k210_mixgoai/generators/sensor.js
Normal file
182
boards/default_src/micropython_k210_mixgoai/generators/sensor.js
Normal 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];
|
||||
}
|
||||
122
boards/default_src/micropython_k210_mixgoai/generators/serial.js
Normal file
122
boards/default_src/micropython_k210_mixgoai/generators/serial.js
Normal 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];
|
||||
}
|
||||
156
boards/default_src/micropython_k210_mixgoai/generators/system.js
Normal file
156
boards/default_src/micropython_k210_mixgoai/generators/system.js
Normal 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;
|
||||
@@ -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];
|
||||
}
|
||||
178
boards/default_src/micropython_k210_mixgoai/index.js
Normal file
178
boards/default_src/micropython_k210_mixgoai/index.js
Normal 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
|
||||
);
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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()
|
||||
@@ -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]
|
||||
|
||||
@@ -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)
|
||||
@@ -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()
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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()
|
||||
@@ -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()
|
||||
@@ -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
|
||||
|
||||
@@ -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("'",'"')
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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')
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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()
|
||||
@@ -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)
|
||||
@@ -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))
|
||||
@@ -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": []
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -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>
|
||||
File diff suppressed because one or more lines are too long
@@ -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>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user