控制台输出 MQTT消息控制 循环与延时 组件:按键/开关 组件:滑杆 组件:文本输入 组件:摇杆手柄 组件:RGB色盘 组件:指示灯 组件:文本显示屏 组件:折线图表 组件:柱状图表 组件:数据表格 组件:仪表盘 组件:数据地图 组件:实时气象仪 命名空间

MixIO Logic API (Release Preview)

Last Modified: 2021/11/28 00:56

MixIO

逻辑视图所处的安全命名变量。为方便拼写,可使用全小写的“mixio”间接访问这一变量。

MixIO.log(text)

text - 待输出的文本

向逻辑视图的“输出”框中输出指定文本。

示例程序1

向“输出”框中输出"Hello world":

MixIO.log("Hello world")

MixIO.onMessage(triggerFunction)

triggerFunction - 希望触发的函数

当收到MQTT消息时,执行对应函数。

示例程序2

每当收到MQTT消息时,输出其主题和消息体:

MixIO.onMessage(function(topic,message){

  MixIO.log(topic)

  MixIO.log(message)

})

MixIO.publish(topic,message)

topic - 发布消息的主题

message - 发布消息的内容

在当前项目下,发送一则自定义的MQTT消息。

示例程序3

发送一则主题为'greeting',内容为'hello'的消息:

MixIO.publish('greeting','hello')

警告

为防止异常递归,发送的最大频率被限制为5次/500ms。超出频率限制的消息会被拦截。

MixIO.setInterval(triggerFunction,time)

triggerFunction - 希望触发的函数

time - 触发的循环间隔(单位:ms)

间隔指定时间,循环触发指定函数。

示例程序4

每隔1s,输出当前时间:

MixIO.setInterval(function(){

  MixIO.log(new Date())

},1000)

警告

请勿使用JavaScript原生的setInterval()方法。该方法设置的循环触发事件,在项目停止时无法被正确移除。

MixIO.setTimeout(triggerFunction,time)

triggerFunction - 希望触发的函数

time - 触发的延迟间隔(单位:ms)

延迟指定时间,触发指定函数。

示例程序5

10s后,输出'Good night':

MixIO.setTimeout(function(){

  MixIO.log('Good night')

},10000)

警告

请勿使用JavaScript原生的setTimeout()方法。该方法设置的延时触发事件,在项目停止时无法被正确移除。

MixIO.getInstance(name,type)

name - 希望获取的组件名称

type - 希望获取的组件类别(必须是MixIO.typeTags中定义的)

获取指定的组件实例(在下文中用MixIOUnit表示)。

可能出现的异常

当查询不到项目中存在name,type对应的组件时,throw MixIOLogicError

type不属于MixIO.typeTags中定义的合法值时,throw MixIOLogicError

MixIOUnit

组件类。

仅可通过MixIO.getInstance(name,type)创建其子类的实例。此类型实例均具有的方法:

bind(eventTag,triggerFunction) - 为组件添加事件监听器。

其中,eventTag必须为MixIO.eventTags中定义的合法事件类型,且必须与type相对应。

triggerFunction为期望触发的监听方法。

trigger(actionTag,[actionParams]) - 触发组件事件。

其中,actionTag必须为MixIO.actionTags中定义的合法事件类型,且必须与type相对应。

[actionParams]为事件参数列表。

Button extends MixIOUnit

按键/开关类(继承自组件类)。

仅可通过MixIO.getInstance(name,MixIO.typeTags.BUTTON)创建此类型的实例。此类型实例具有的方法:

bind(eventTag,triggerFunction) - 为按键/开关添加事件监听器。

其中,eventTag可以为:

MixIO.eventTags.BUTTON_LOOSED - 开关/按键被松开

MixIO.eventTags.BUTTON_PRESSED - 按键被按下

MixIO.eventTags.BUTTON_CHANGED - 开关收到消息

triggerFunction为期望触发的监听方法。

示例程序6

当名为“按钮1”的开关或按键被松开时,输出“被松开”:

MixIO.getInstance("按钮1",MixIO.typeTags.BUTTON).bind(MixIO.eventTags.BUTTON_LOOSED,function(){

  MixIO.log('被松开')

})

示例程序7

当名为“按钮2”的按键被按下时,输出“被按下”:

MixIO.getInstance("按钮2",MixIO.typeTags.BUTTON).bind(MixIO.eventTags.BUTTON_PRESSED,function(){

  MixIO.log('被按下')

})

示例程序8

当名为“开关1”的开关收到消息时,输出收到的消息:

MixIO.getInstance("开关1",MixIO.typeTags.BUTTON).bind(MixIO.eventTags.BUTTON_CHANGED,function(event,message){

  MixIO.log(message)

})

trigger(actionTag,[actionParams]) - 触发按键/开关的指定事件。

其中,actionTag可以为:

MixIO.actionTags.BUTTON_SWITCH - 切换开关状态

actionParams仅包含1个值,表示期望切换至的状态(false-关,true-开)。

示例程序9

每隔1s,切换一次“开关”的状态:

var status = true

MixIO.setInterval(function(){

  MixIO.getInstance("开关",MixIO.typeTags.BUTTON).trigger(MixIO.actionTags.BUTTON_SWITCH,[status])

  status = !status

},1000)

isOn() - 获取开关的当前状态(返回Boolean)。

示例程序10

30s后,如果“开关1”没有关闭,则打开“开关2”:

MixIO.setTimeout(function(){

  if(MixIO.getInstance("开关1",MixIO.typeTags.BUTTON).isOn())

    MixIO.getInstance("开关2",MixIO.typeTags.BUTTON).trigger(MixIO.actionTags.BUTTON_SWITCH,[true])

},30000)

Slider extends MixIOUnit

滑杆类(继承自组件类)。

仅可通过MixIO.getInstance(name,MixIO.typeTags.SLIDER)创建此类型的实例。此类型实例具有的方法:

bind(eventTag,triggerFunction) - 为滑杆添加事件监听器。

其中,eventTag可以为:

MixIO.eventTags.SLIDER_SLIDED - 滑杆被拖动

MixIO.eventTags.SLIDER_CHANGED - 滑杆收到消息

triggerFunction为期望触发的监听方法。

示例程序11

当名为“蓄力”的滑杆被拖动时,打开名为“发射”的开关:

MixIO.getInstance("蓄力",MixIO.typeTags.SLIDER).bind(MixIO.eventTags.SLIDER_SLIDED,function(){

  MixIO.getInstance("发射",MixIO.typeTags.BUTTON).trigger(MixIO.actionTags.BUTTON_SWITCH,[true])

})

示例程序12

当名为“进度条”、最大值为10的滑杆收到消息时,输出其当前值占最大值的百分比:

MixIO.getInstance("进度条",MixIO.typeTags.SLIDER).bind(MixIO.eventTags.SLIDER_CHANGED,function(event,message){

  MixIO.log(message*10+"%")

})

trigger(actionTag,[actionParams]) - 触发按键/开关的指定事件。

其中,actionTag可以为:

MixIO.actionTags.SLIDER_SEND - 改变滑杆数值

actionParams仅包含1个值,表示期望改变至的数值。

示例程序13

每隔1s,随机改变名为“进度条”的滑杆的值:

MixIO.setInterval(function(){

  MixIO.getInstance("进度条",MixIO.typeTags.SLIDER).trigger(MixIO.actionTags.SLIDER_SEND,[parseInt(Math.random()*10)])

},1000)

getValue() - 获取滑杆的当前值

示例程序14

每隔1s,输出名为“进度条”的滑杆的值:

MixIO.setInterval(function(){

  MixIO.log(MixIO.getInstance("进度条",MixIO.typeTags.SLIDER).getValue())

},1000)

Keyboard extends MixIOUnit

文本输入类(继承自组件类)。

仅可通过MixIO.getInstance(name,MixIO.typeTags.KEYBOARD)创建此类型的实例。此类型实例具有的方法:

bind(eventTag,triggerFunction) - 为文本输入添加事件监听器。

其中,eventTag可以为:

MixIO.eventTags.KEYBOARD_SENT - 文本输入器点击发送消息

triggerFunction为期望触发的监听方法。

示例程序15

当名为“输入”的文本输入器点击发送消息时,向名为“计数”的滑杆发送消息字符串的长度:

MixIO.getInstance("输入",MixIO.typeTags.KEYBOARD).bind(MixIO.eventTags.KEYBOARD_SENT,function(event,message){

  MixIO.getInstance("计数",MixIO.typeTags.SLIDER).trigger(MixIO.actionTags.SLIDER_SEND,[message.length])

})

trigger(actionTag,[actionParams]) - 触发文本输入的指定事件。

其中,actionTag可以为:

MixIO.actionTags.KEYBOARD_SEND - 发送文本消息

actionParams仅包含1个值,表示期望发送的消息。

示例程序16

当名为“消息”的文本输入器点击发送消息时,令名为“时钟”的文本输入器发送当前时间:

MixIO.getInstance("消息",MixIO.typeTags.KEYBOARD).bind(MixIO.eventTags.KEYBOARD_SENT,function(event,message){

  MixIO.getInstance("时钟",MixIO.typeTags.KEYBOARD).trigger(MixIO.actionTags.KEYBOARD_SEND,[new Date().toString()])

})

Joystick extends MixIOUnit

摇杆手柄类(继承自组件类)。

仅可通过MixIO.getInstance(name,MixIO.typeTags.JOYSTICK)创建此类型的实例。此类型实例具有的方法:

bind(eventTag,triggerFunction) - 为摇杆手柄添加事件监听器。

其中,eventTag可以为:

MixIO.eventTags.JOYSTICK_CHANGED - 摇杆手柄被拖动

triggerFunction为期望触发的监听方法。

示例程序17

当名为“摇杆”的摇杆手柄被拖动时,向文本输入器“方向”发送当前的手柄方向:

MixIO.getInstance("摇杆",MixIO.typeTags.JOYSTICK).bind(MixIO.eventTags.JOYSTICK_CHANGED,function(event,x,y){

  var direction = (x>0?"右":"左")+(y>0?"上":"下")

  MixIO.getInstance("方向",MixIO.typeTags.KEYBOARD).trigger(MixIO.actionTags.KEYBOARD_SEND,[direction])

})

trigger(actionTag,[actionParams]) - 触发摇杆手柄的指定事件。

其中,actionTag可以为:

MixIO.actionTags.JOYSTICK_SEND - 发送位置消息

actionParams仅包含2个值,表示期望发送的横坐标和纵坐标。

示例程序18

每隔1s,通过名为“摇杆”的摇杆手柄随机发送1个位置消息:

MixIO.setInterval(function(){

  var randomX = parseInt(Math.random()*200-100)

  var randomY = parseInt(Math.random()*200-100)

  MixIO.getInstance("摇杆",MixIO.typeTags.JOYSTICK).trigger(MixIO.actionTags.JOYSTICK_SEND,[randomX,randomY])

},1000)

getX() - 获取摇杆的当前横坐标

getY() - 获取摇杆的当前纵坐标

示例程序19

每隔1s,获取名为“摇杆”的摇杆手柄的当前横、纵坐标,如果二者绝对值之和大于100,则向主题"加速"发送消息'1',反之发送'0':

var joystickInstance = MixIO.getInstance("摇杆",MixIO.typeTags.JOYSTICK)

MixIO.setInterval(function(){

  if(Math.abs(joystickInstance.getX())+Math.abs(joystickInstance.getY())>100)

    MixIO.publish("加速",1)

  else

    MixIO.publish("加速",0)

},1000)

RGB_PICKER extends MixIOUnit

RGB色盘类(继承自组件类)。

仅可通过MixIO.getInstance(name,MixIO.typeTags.RGB_PICKER)创建此类型的实例。此类型实例具有的方法:

bind(eventTag,triggerFunction) - 为RGB色盘添加事件监听器。

其中,eventTag可以为:

MixIO.eventTags.RGB_PICKER_PICKED - 色盘被点击选色

MixIO.eventTags.RGB_PICKER_CHANGED - 色盘收到消息

triggerFunction为期望触发的监听方法。

示例程序20

当名为“色盘”的RGB色盘被选色时,通过文本输入器“红”发送当前的R通道颜色值:

MixIO.getInstance("色盘",MixIO.typeTags.RGB_PICKER).bind(MixIO.eventTags.RGB_PICKER_PICKED,function(event,r,g,b){

  MixIO.getInstance("红",MixIO.typeTags.KEYBOARD).trigger(MixIO.actionTags.KEYBOARD_SEND,[r])

})

示例程序21

当名为“色盘”的RGB色盘收到消息时,输出收到消息的通道及其值:

MixIO.getInstance("色盘",MixIO.typeTags.RGB_PICKER).bind(MixIO.eventTags.RGB_PICKER_CHANGED,function(event,r,g,b){

  var channel = r!="-1"?"R":(g!="-1"?"G":"B")

  var value = r!="-1"?r:(g!="-1"?g:b)

  MixIO.log(channel+" - "+value)

})

trigger(actionTag,[actionParams]) - 触发RGB色盘的指定事件。

其中,actionTag可以为:

MixIO.actionTags.RGB_PICKER_SEND - 发送颜色消息

actionParams包含3个值,表示期望发送颜色的R通道、G通道、B通道值。

示例程序22

每隔1s,通过名为“色盘”的RGB色盘随机发送1个颜色值:

MixIO.setInterval(function(){

  var randomR = parseInt(Math.random()*255)

  var randomG = parseInt(Math.random()*255)

  var randomB = parseInt(Math.random()*255)

  MixIO.getInstance("色盘",MixIO.typeTags.RGB_PICKER).trigger(MixIO.actionTags.RGB_PICKER_SEND,[randomR,randomG,randomB])

},1000)

getColor() - 获取色盘的当前颜色值(返回一个包含三个通道值的列表)

示例程序23

每隔1s,获取名为“色盘”的RGB色盘的当前RGB颜色值,将其转化为HEX字符串并通过名为“16进制颜色”的文本输入器发送:

MixIO.setInterval(function(){

  var rgbColor = MixIO.getInstance("色盘",MixIO.typeTags.RGB_PICKER).getColor()

  var hexColor = RGB2Hex(rgbColor[0],rgbColor[1],rgbColor[2])

  MixIO.getInstance("16进制颜色",MixIO.typeTags.KEYBOARD).trigger(MixIO.actionTags.KEYBOARD_SEND,[hexColor])

},1000)

BULB extends MixIOUnit

指示灯类(继承自组件类)。

仅可通过MixIO.getInstance(name,MixIO.typeTags.BULB)创建此类型的实例。此类型实例具有的方法:

bind(eventTag,triggerFunction) - 为指示灯添加事件监听器。

其中,eventTag可以为:

MixIO.eventTags.BULB_CHANGED - 指示灯收到消息

triggerFunction为期望触发的监听方法。

示例程序24

当名为“日光灯”的指示灯被点亮时,打开名为“光敏开关”的开关,反之则关闭:

MixIO.getInstance("日光灯",MixIO.typeTags.BULB).bind(MixIO.eventTags.BULB_CHANGED,function(event,message){

  if(message>0)

    MixIO.getInstance("光敏开关",MixIO.typeTags.BUTTON).trigger(MixIO.actionTags.BUTTON_SWITCH,true)

  else

    MixIO.getInstance("光敏开关",MixIO.typeTags.BUTTON).trigger(MixIO.actionTags.BUTTON_SWITCH,false)

})

trigger(actionTag,[actionParams]) - 触发指示灯的指定事件。

其中,actionTag可以为:

MixIO.actionTags.BULB_CHANGE - 改变指示灯状态

actionParams仅包含1个值,表示期望改变至的状态(0-熄灭;1-绿灯;2-黄灯;3-红灯)。

示例程序25

设计一个每隔3s切换一次状态的“交通信号灯”:

var status = 0

MixIO.setInterval(function(){

  MixIO.getInstance("交通信号灯",MixIO.typeTags.BULB).trigger(MixIO.actionTags.BULB_CHANGE,[status%3+1])

  status = status + 1

},3000)

getStatus() - 获取指示灯的当前状态(0-熄灭;1-绿灯;2-黄灯;3-红灯)。

示例程序26

每隔1s,获取名为“交通信号灯”的当前状态,如果为“绿灯”,则打开名为“油门”的开关,否则关闭:

MixIO.setInterval(function(){

  var status = MixIO.getInstance("交通信号灯",MixIO.typeTags.BULB).getStatus()

  MixIO.getInstance("油门",MixIO.typeTags.BUTTON).trigger(MixIO.actionTags.BUTTON_SWITCH,[status=="1"])

},1000)

TEXT_SCREEN extends MixIOUnit

文本显示屏类(继承自组件类)。

仅可通过MixIO.getInstance(name,MixIO.typeTags.BULB)创建此类型的实例。此类型实例具有的方法:

bind(eventTag,triggerFunction) - 为文本显示屏添加事件监听器。

其中,eventTag可以为:

MixIO.eventTags.TEXT_SCREEN_CHANGED - 文本显示屏收到消息

triggerFunction为期望触发的监听方法。

示例程序27

当名为“LED”的文本显示屏收到消息时,向名为“文本长度”的滑杆发送消息长度:

MixIO.getInstance("LED",MixIO.typeTags.TEXT_SCREEN).bind(MixIO.eventTags.TEXT_SCREEN_CHANGED,function(event,message){

  MixIO.getInstance("文本长度",MixIO.typeTags.SLIDER).trigger(MixIO.actionTags.SLIDER_SEND,message.length)

})

trigger(actionTag,[actionParams]) - 触发文本显示屏的指定事件。

其中,actionTag可以为:

MixIO.actionTags.TEXT_SCREEN_CHANGE - 显示文本消息

actionParams仅包含1个值,表示期望显示的文本。

示例程序28

令文本显示屏“LED”循环显示三段不同的文字:

var texts = ['空山新雨后,天气晚来秋','小舟从此逝,江海寄余生','夜来南风起,小麦覆垄黄']

var index = 0

MixIO.setInterval(function(){

  MixIO.getInstance("LED",MixIO.typeTags.TEXT_SCREEN).trigger(MixIO.actionTags.TEXT_SCREEN_CHANGE,[texts[index%3]])

  index = index + 1

},1000)

getText() - 获取文本显示屏的显示文字。

示例程序29

每隔10s,将文本显示屏“LED”的显示更新同步到逻辑视图输出中:

MixIO.setInterval(function(){

  MixIO.log(MixIO.getInstance("LED",MixIO.typeTags.TEXT_SCREEN).getText())

},10000)

LINE_CHART extends MixIOUnit

折线图表类(继承自组件类)。

仅可通过MixIO.getInstance(name,MixIO.typeTags.LINE_CHART)创建此类型的实例。此类型实例具有的方法:

bind(eventTag,triggerFunction) - 为折线图表添加事件监听器。

其中,eventTag可以为:

MixIO.eventTags.LINE_CHART_CHANGED - 折线图表收到消息

triggerFunction为期望触发的监听方法。

示例程序30

当名为“温度监测”的折线图表收到大于80的消息,令“警报”指示灯亮红灯:

MixIO.getInstance("温度监测",MixIO.typeTags.LINE_CHART).bind(MixIO.eventTags.LINE_CHART_CHANGED,function(event,time,value){

  if(parseInt(value)>80)

    MixIO.getInstance("警报",MixIO.typeTags.BULB).trigger(MixIO.actionTags.BULB_CHANGE,[3])

  else

    MixIO.getInstance("警报",MixIO.typeTags.BULB).trigger(MixIO.actionTags.BULB_CHANGE,[0])

})

trigger(actionTag,[actionParams]) - 触发折线图表的指定事件。

其中,actionTag可以为:

MixIO.actionTags.LINE_CHART_CHANGE - 向折线图表发送消息

actionParams仅包含1个值,表示期望发送的消息。

示例程序31

每隔2秒,将在“签到”主题下收到消息的累计个数发送到“签到统计”折线图表中:

var count = 0

MixIO.onMessage(function(topic,message){

  if(topic=='签到')

    count = count+1

})

MixIO.setInterval(function(){

  MixIO.getInstance("签到统计",MixIO.typeTags.LINE_CHART).trigger(MixIO.actionTags.LINE_CHART_CHANGE,[count])

},2000)

MixIO.actionTags.LINE_CHART_CLEAR - 令折线图表清空

actionParams不包含任何值,可以被省略。

示例程序32

当“签到”主题收到消息“finish”时,清空“签到统计”折线图表:

MixIO.onMessage(function(topic,message){

  if(topic=='签到'&&message=='finish')

    MixIO.getInstance("签到统计",MixIO.typeTags.LINE_CHART).trigger(MixIO.actionTags.LINE_CHART_CLEAR)

})

getAllMessages() - 获取折线图表的全部历史消息。

getLatestMessages(count) - 获取折线图表的至多前count条消息。

getLatestMessage - 获取折线图表的最新一条消息。

示例程序33

每隔5s,输出“签到统计”的至多前3条消息:

MixIO.setInterval(function(){

  MixIO.log(JSON.stringify(MixIO.getInstance("签到统计",MixIO.typeTags.LINE_CHART).getLatestMessages(3)))

},5000)

BAR_CHART extends MixIOUnit

柱状图表类(继承自组件类)。

仅可通过MixIO.getInstance(name,MixIO.typeTags.BAR_CHART)创建此类型的实例。此类型实例具有的方法:

bind(eventTag,triggerFunction) - 为柱状图表添加事件监听器。

其中,eventTag可以为:

MixIO.eventTags.BAR_CHART_CHANGED - 柱状图表收到消息

triggerFunction为期望触发的监听方法。

示例程序34

当名为“选择题”的柱状图表累计收到等同于班级同学数目的消息数时,令“完成”指示灯亮绿灯:

var STUDENT_NUM = 30

var count = 0

MixIO.getInstance("选择题",MixIO.typeTags.BAR_CHART).bind(MixIO.eventTags.BAR_CHART_CHANGED,function(event,message){

  count = count+1

  if(count>=STUDENT_NUM)

    MixIO.getInstance("完成",MixIO.typeTags.BULB).trigger(MixIO.actionTags.BULB_CHANGE,[1])

})

trigger(actionTag,[actionParams]) - 触发柱状图表的指定事件。

其中,actionTag可以为:

MixIO.actionTags.BAR_CHART_CHANGE - 向柱状图表发送消息

actionParams仅包含1个值,表示期望发送的消息。

示例程序35

随机作答选择题30次,在30秒内将这些消息发送给“选择题”柱状图表:

var count = 0

MixIO.setInterval(function(){

  if(count<30){

    var seed = Math.random()

    var option = seed<0.25?"A":(seed<0.5?"B":(seed<0.75?"C":"D"))

    MixIO.getInstance("选择题",MixIO.typeTags.BAR_CHART).trigger(MixIO.actionTags.BAR_CHART_CHANGE,[option])

    count = count+1

  }

},1000)

MixIO.actionTags.BAR_CHART_CLEAR - 令柱状图表清空

actionParams不包含任何值,可以被省略。

示例程序36

当“切换题目”主题收到消息“next”时,清空“选择题”柱状图表:

MixIO.onMessage(function(topic,message){

  if(topic=='切换题目'&&message=='next')

    MixIO.getInstance("选择题",MixIO.typeTags.BAR_CHART).trigger(MixIO.actionTags.BAR_CHART_CLEAR)

})

getData() - 获取柱状图表的当前数据。

示例程序37

每隔5s,输出“选择题”柱状图表的当前数据:

MixIO.setInterval(function(){

  MixIO.log(JSON.stringify(MixIO.getInstance("选择题",MixIO.typeTags.BAR_CHART).getData()))

},5000)

DATA_TABLE extends MixIOUnit

数据表格类(继承自组件类)。

仅可通过MixIO.getInstance(name,MixIO.typeTags.DATA_TABLE)创建此类型的实例。此类型实例具有的方法:

bind(eventTag,triggerFunction) - 为数据表格添加事件监听器。

其中,eventTag可以为:

MixIO.eventTags.DATA_TABLE_CHANGED - 数据表格收到消息

triggerFunction为期望触发的监听方法。

示例程序38

当名为“签到表”的数据表格累计收到等同于班级同学数目的消息数时,令“完成”指示灯亮绿灯:

var STUDENT_NUM = 30

var count = 0

MixIO.getInstance("签到表",MixIO.typeTags.DATA_TABLE).bind(MixIO.eventTags.DATA_TABLE_CHANGED,function(event,message){

  count = count+1

  if(count>=STUDENT_NUM)

    MixIO.getInstance("完成",MixIO.typeTags.BULB).trigger(MixIO.actionTags.BULB_CHANGE,[1])

})

trigger(actionTag,[actionParams]) - 触发数据表格的指定事件。

其中,actionTag可以为:

MixIO.actionTags.DATA_TABLE_CHANGE - 向数据表格发送消息

actionParams仅包含1个值,表示期望发送的消息。

示例程序39

每隔1秒,随机生成一个签到信息,发送给“签到表”:

function listsGetRandomItem(list, remove) {

  var x = Math.floor(Math.random() * list.length)

  if (remove)

    return list.splice(x, 1)[0]

  else

    return list[x]

}

function getRandomName() {

  lastNames = '赵,钱,孙,李,周,吴,郑,王'.split(',')

  firstNames = '明,刚,强,美,丽,光,威,红'.split(',')

  return String(listsGetRandomItem(lastNames, false)) + String(listsGetRandomItem(firstNames, false))

}

MixIO.setInterval(function(){

  MixIO.getInstance('签到表',MixIO.typeTags.DATA_TABLE).trigger(MixIO.actionTags.DATA_TABLE_CHANGE,[(getRandomName())])

},1000)

MixIO.actionTags.DATA_TABLE_CLEAR - 令数据表格清空

actionParams不包含任何值,可以被省略。

示例程序40

当“上课”主题收到消息时,清空“签到表”数据表格:

MixIO.onMessage(function(topic,message){

  if(topic=='上课')

    MixIO.getInstance("签到表",MixIO.typeTags.DATA_TABLE).trigger(MixIO.actionTags.DATA_TABLE_CLEAR)

})

getData() - 获取数据表格的全部数据。

示例程序41

每隔5s,输出“签到表”数据表格的全部数据:

MixIO.setInterval(function(){

  MixIO.log(JSON.stringify(MixIO.getInstance("签到表",MixIO.typeTags.DATA_TABLE).getData()))

},5000)

DASHBOARD extends MixIOUnit

仪表盘类(继承自组件类)。

仅可通过MixIO.getInstance(name,MixIO.typeTags.DASHBOARD)创建此类型的实例。此类型实例具有的方法:

bind(eventTag,triggerFunction) - 为仪表盘添加事件监听器。

其中,eventTag可以为:

MixIO.eventTags.DASHBOARD_CHANGED - 仪表盘收到消息

triggerFunction为期望触发的监听方法。

示例程序42

当名为“CPU温度”的仪表盘收到大于80的消息时,令“警报”指示灯亮红灯:

MixIO.getInstance("CPU温度",MixIO.typeTags.DASHBOARD).bind(MixIO.eventTags.DASHBOARD_CHANGED,function(event,message){

  if(message>80)

    MixIO.getInstance("警报",MixIO.typeTags.BULB).trigger(MixIO.actionTags.BULB_CHANGE,[3])

})

trigger(actionTag,[actionParams]) - 触发仪表盘的指定事件。

其中,actionTag可以为:

MixIO.actionTags.DASHBOARD_CHANGE - 向仪表盘发送消息

actionParams仅包含1个值,表示期望发送的消息。

示例程序43

令“CPU温度”仪表盘归零:

MixIO.getInstance("CPU温度",MixIO.typeTags.DASHBOARD).trigger(MixIO.actionTags.DASHBOARD_CHANGE,[0])

DATA_MAP extends MixIOUnit

数据地图类(继承自组件类)。

仅可通过MixIO.getInstance(name,MixIO.typeTags.DATA_MAP)创建此类型的实例。此类型实例具有的方法:

bind(eventTag,triggerFunction) - 为数据地图添加事件监听器。

其中,eventTag可以为:

MixIO.eventTags.DATA_MAP_CHANGED - 数据地图收到消息

triggerFunction为期望触发的监听方法。

示例程序44

当名为“公交车路线”的数据地图收到名为“306路-A”的公交车发来的位置信息时,计算与当前位置的距离,输出在“距离”文本显示器中:

var currentPos = [116.397128,39.916527]

MixIO.getInstance("公交车路线",MixIO.typeTags.DATA_MAP).bind(MixIO.eventTags.DATA_MAP_CHANGED,function(event,clientid,long,lat,message){

  if(message[0]['value']>="306路-A"){

    var busPos = [parseFloat(long),parseFloat(lat)]

    var x = (busPos[0]-currentPos[0])/0.00001141

    var y = (busPos[1]-currentPos[1])/0.00000899

    var distance = Math.sqrt(x*x+y*y)

    MixIO.getInstance("距离",MixIO.typeTags.TEXT_SCREEN).trigger(MixIO.actionTags.TEXT_SCREEN_CHANGE,["当前306路-A公交车与您的距离是"+Math.round(distance)+"米。"])

  }

})

trigger(actionTag,[actionParams]) - 触发数据地图的指定事件。

其中,actionTag可以为:

MixIO.actionTags.DATA_MAP_CHANGE - 向数据地图发送消息

actionParams仅包含1个值,表示期望发送的消息。

示例程序45

向“定位”数据地图报告自己的当前位置:

var currentPos = ["116.397128","39.916527"]

var myName = "张三"

MixIO.getInstance("定位",MixIO.typeTags.DATA_MAP).trigger(MixIO.actionTags.DATA_MAP_CHANGE,{"long":currentPos[0],"lat":currentPos[1],"clientid":myName,"message":[{"label":"name","value":myName}]})

MixIO.actionTags.DATA_TABLE_CLEAR - 令数据表格清空

actionParams不包含任何值,可以被省略。

示例程序46

当“下线”主题收到消息时,清空“定位”数据地图:

MixIO.onMessage(function(topic,message){

  if(topic=='下线')

    MixIO.getInstance("定位",MixIO.typeTags.DATA_MAP).trigger(MixIO.actionTags.DATA_MAP_CLEAR)

})

WEATHER extends MixIOUnit

实时气象仪类(继承自组件类)。

仅可通过MixIO.getInstance(name,MixIO.typeTags.WEATHER)创建此类型的实例。此类型实例具有的方法:

bind(eventTag,triggerFunction) - 为实时气象仪添加事件监听器。

其中,eventTag可以为:

MixIO.eventTags.WEATHER_SYNCED - 气象仪气象信息更新

MixIO.eventTags.WEATHER_SENT - 气象仪气象信息下发

triggerFunction为期望触发的监听方法。

示例程序47

当名为“气象站”的气象仪更新气象数据时,向文本显示屏“更新记录”中追加更新时间;当名为“气象站”的气象仪下发气象数据时,向文本显示屏“下发记录”中追加下发时间:

var updates = []

var sends = []

MixIO.getInstance('气象站',MixIO.typeTags.WEATHER).bind(MixIO.eventTags.WEATHER_SYNCED, function(event,district,weather_type,temperature,humidity,wind_dir,wind_class){

  updates.push(new Date());

  MixIO.getInstance('更新记录',MixIO.typeTags.TEXT_SCREEN).trigger(MixIO.actionTags.TEXT_SCREEN_CHANGE,(updates.join(',')))

})

MixIO.getInstance('气象站',MixIO.typeTags.WEATHER).bind(MixIO.eventTags.WEATHER_SENT, function(event,district,weather_type,temperature,humidity,wind_dir,wind_class){

  sends.push(new Date())

  MixIO.getInstance('下发记录',MixIO.typeTags.TEXT_SCREEN).trigger(MixIO.actionTags.TEXT_SCREEN_CHANGE,(sends.join(',')))

})

trigger(actionTag,[actionParams]) - 触发实时气象仪的指定事件。

其中,actionTag可以为:

MixIO.actionTags.WEATHER_SYNC - 更新气象仪信息

MixIO.actionTags.WEATHER_SEND - 下发气象仪信息

actionParams仅包含1个值,表示期望发送的消息。

示例程序48

每隔1小时,更新并下发“气象站”的信息:

MixIO.setInterval(function(){

  MixIO.getInstance('气象站',MixIO.typeTags.WEATHER).trigger(MixIO.actionTags.WEATHER_SYNC)

  MixIO.getInstance('气象站',MixIO.typeTags.WEATHER).trigger(MixIO.actionTags.WEATHER_SEND)

},3600000)

getData(datatype) - 获取实时气象仪的某一类别数据。

datatype - 期望获取的数据类别,可以为:

weather_type - 天气类别

temperature - 温度

humidity - 相对湿度

wind_dir - 风向

wind_class - 风级

district - 数据来源区域

示例程序49

每隔1小时,获取“气象仪”的“温度”数据,并发送至“温度”折线图表:

MixIO.setInterval(function(){

  MixIO.getInstance('温度',MixIO.typeTags.LINE_CHART).trigger(MixIO.actionTags.LINE_CHART_CHANGE,MixIO.getInstance('气象站',MixIO.typeTags.WEATHER).getData("temperature"))

},3600000)

MixIO.typeTags

全部组件类别标签的集合变量。

按键/开关 - MixIO.typeTags.BUTTON

滑杆 - MixIO.typeTags.SLIDER

文本输入 - MixIO.typeTags.KEYBOARD

摇杆手柄 - MixIO.typeTags.JOYSTICK

RGB色盘 - MixIO.typeTags.RGB_PICKER

指示灯 - MixIO.typeTags.BULB

文本显示屏 - MixIO.typeTags.TEXT_SCREEN

折线图表 - MixIO.typeTags.LINE_CHART

柱状图表 - MixIO.typeTags.BAR_CHART

数据表格 - MixIO.typeTags.DATA_TABLE

仪表盘 - MixIO.typeTags.DASHBOARD

数据地图 - MixIO.typeTags.DATA_MAP

实时气象仪 - MixIO.typeTags.WEATHER

MixIO.eventTags

全部组件监听事件标签的集合变量。

开关

开关被点按后松开 - MixIO.eventTags.BUTTON_LOOSED

开关收到消息 - MixIO.eventTags.BUTTON_CHANGED

按键

按键被点按后松开 - MixIO.eventTags.BUTTON_PRESSED

按键被点按后松开 - MixIO.eventTags.BUTTON_LOOSED

按键收到消息 - MixIO.eventTags.BUTTON_CHANGED

滑杆

滑杆被拖动 - MixIO.eventTags.SLIDER_SLIDED

滑杆收到消息 - MixIO.eventTags.SLIDER_CHANGED

文本输入

文本输入器点击发送消息 - MixIO.eventTags.KEYBOARD_SENT

摇杆手柄

摇杆被拖动 - MixIO.eventTags.JOYSTICK_CHANGED

RGB色盘

色盘被选色 - MixIO.eventTags.RGB_PICKER_PICKED

色盘收到消息 - MixIO.eventTags.RGB_PICKER_CHANGED

指示灯

指示灯收到消息 - MixIO.eventTags.BULB_CHANGED

文本显示屏

文本显示屏收到消息 - MixIO.eventTags.TEXT_SCREEN_CHANGED

折线图表

折线图表收到消息 - MixIO.eventTags.LINE_CHART_CHANGED

柱状图表

柱状图表收到消息 - MixIO.eventTags.BAR_CHART_CHANGED

数据表格

数据表格收到消息 - MixIO.eventTags.DATA_TABLE_CHANGED

仪表盘

仪表盘收到消息 - MixIO.eventTags.DASHBOARD_CHANGED

数据地图

数据地图收到消息 - MixIO.eventTags.DATA_MAP_CHANGED

实时气象仪

气象仪更新数据 - MixIO.eventTags.WEATHER_SYNCED

气象仪发送数据 - MixIO.eventTags.WEATHER_SENT

MixIO.actionTags

全部组件触发事件标签的集合变量。

开关

切换开关状态 - MixIO.actionTags.BUTTON_SWITCH

按键

滑杆

改变滑杆数值 - MixIO.actionTags.SLIDER_SEND

文本输入

发送文本消息 - MixIO.actionTags.KEYBOARD_SEND

摇杆手柄

发送位置消息 - MixIO.actionTags.JOYSTICK_SEND

RGB色盘

发送颜色消息 - MixIO.actionTags.RGB_PICKER_SEND

指示灯

切换指示灯状态 - MixIO.actionTags.BULB_CHANGE

文本显示屏

显示文本消息 - MixIO.actionTags.TEXT_SCREEN_CHANGE

折线图表

发送消息 - MixIO.actionTags.LINE_CHART_CHANGE

清空消息 - MixIO.actionTags.LINE_CHART_CLEAR

柱状图表

发送消息 - MixIO.actionTags.BAR_CHART_CHANGE

清空消息 - MixIO.actionTags.BAR_CHART_CLEAR

数据表格

发送消息 - MixIO.actionTags.DATA_TABLE_CHANGE

清空消息 - MixIO.actionTags.DATA_TABLE_CLEAR

仪表盘

发送数值消息 - MixIO.eventTags.DASHBOARD_CHANGE

数据地图

发送消息 - MixIO.actionTags.DATA_MAP_CHANGE

清空消息 - MixIO.actionTags.DATA_MAP_CLEAR

实时气象仪

更新数据 - MixIO.eventTags.WEATHER_SYNC

发送数据 - MixIO.eventTags.WEATHER_SEND