<blocks app="Snap! 10.6.0, https://snap.berkeley.edu" version="2"><palette><category name="CoCube WebSockets" color="0,116,143,1"/></palette><block-definition s="connect to robot id %&apos;id&apos;" type="command" category="CoCube WebSockets"><header></header><code></code><translations>zh_CN:连接到ID为 _ 的机器人&#xD;</translations><inputs><input type="%n" initial="1">1</input></inputs><script><custom-block s="create %s var %mult%txt"><l>sprite</l><list><l>__websocket__message__</l></list></custom-block><custom-block s="create %s var %mult%txt"><l>sprite</l><list><l>address</l></list></custom-block><block s="doSetVar"><l>address</l><block s="reportJoinWords"><list><l>ws://192.168.10.</l><block s="reportVariadicSum"><list><l>100</l><block var="id"/></list></block><l>:81</l></list></block></block><block s="doDeclareVariables"><list><l>start</l></list></block><block s="doSetVar"><l>start</l><block s="reportDate"><l><option>time in milliseconds</option></l></block></block><block s="doSetVar"><l>__websocket__message__</l><l></l></block><block s="doApplyExtension"><l>ws_connect(address)</l><list><block var="address"/></list></block><block s="doWaitUntil"><block s="reportVariadicOr"><list><custom-block s="robot connected?"></custom-block><block s="reportVariadicGreaterThan"><list><block s="reportDate"><l><option>time in milliseconds</option></l></block><block s="reportVariadicSum"><list><block var="start"/><l>2000</l></list></block></list></block></list></block></block><block s="doIf"><custom-block s="robot connected?"></custom-block><script><block s="doApplyExtension"><l>ws_onreceive(callback)</l><list><block s="reifyScript"><script><block s="doSetVar"><l>__websocket__message__</l><block var="message"/></block></script><list><l>message</l></list></block></list></block></script><list><l><bool>true</bool></l><script><custom-block s="disconnect robot"></custom-block><block s="doApplyExtension"><l>err_error(msg)</l><list><block s="reportJoinWords"><list><l>Timed out when trying to connect to </l><block var="address"/><block s="reportUnicodeAsLetter"><l>10</l></block><l>Make sure the protocol, address and port are correct.</l></list></block></list></block></script></list></block></script></block-definition><block-definition s="robot position (x, y, degree)" type="reporter" category="CoCube WebSockets"><header></header><code></code><translations>zh_CN:机器人坐标 (x, y, degree)&#xD;</translations><inputs></inputs><script><block s="doDeclareVariables"><list><l>position</l></list></block><block s="doSetVar"><l>position</l><block s="reportTextSplit"><block var="__websocket__message__"/><l>,</l></block></block><block s="doIf"><block s="reportVariadicEquals"><list><block s="reportListItem"><l>1</l><block var="position"/></block><l>pose</l></list></block><script><block s="doReport"><block s="reportCDR"><block var="position"/></block></block></script><list></list></block><block s="doReport"><block s="reportNewList"><list><l>0</l><l>0</l><l>0</l></list></block></block></script></block-definition><block-definition s="disconnect robot" type="command" category="CoCube WebSockets"><header></header><code></code><translations>zh_CN:断开机器人连接&#xD;</translations><inputs></inputs><script><block s="doApplyExtension"><l>ws_disconnect()</l><list></list></block></script></block-definition><block-definition s="robot connected?" type="reporter" category="CoCube WebSockets"><header></header><code></code><translations>zh_CN:机器人已连接？&#xD;</translations><inputs></inputs><script><block s="doReport"><block s="reportApplyExtension"><l>ws_connected()</l><list></list></block></block></script></block-definition><block-definition s="Move %&apos;direction&apos; at %&apos;speed&apos; speed (0-50) for %&apos;time&apos; msecs" type="command" category="CoCube WebSockets" space="true"><header></header><code></code><translations>zh_CN:向 _ 以 _ 速度(0-50)移动 _ 毫秒&#xD;</translations><inputs><input type="%s" readonly="true" initial="1">$_forward<options>$_forward&#xD;$_backward</options></input><input type="%n" initial="1">50</input><input type="%n" initial="1">1000</input></inputs><script><block s="doDeclareVariables"><list><l>uuid</l></list></block><block s="doSetVar"><l>uuid</l><block s="reportRandom"><l>1</l><l>1000</l></block></block><custom-block s="call microblocks function %s %s %s"><l>msg_block</l><l>CoCube move for msecs</l><block s="reportJoinWords"><list><block var="uuid"/><l>,</l><l>cocube;</l><block var="direction"/><l>,</l><block var="speed"/><l>,</l><block var="time"/></list></block></custom-block><block s="doWait"><block s="reportQuotient"><block var="time"/><l>1000</l></block></block></script></block-definition><block-definition s="Rotate %&apos;direction&apos; at %&apos;speed&apos; speed (0-50) for %&apos;time&apos; msecs" type="command" category="CoCube WebSockets"><header></header><code></code><translations>zh_CN:向 _ 以 _ 速度(0-50)旋转 _ 毫秒&#xD;</translations><inputs><input type="%s" readonly="true" initial="1">$_left<options>$_left&#xD;$_right</options></input><input type="%n" initial="1">30</input><input type="%n" initial="1">1000</input></inputs><script><block s="doDeclareVariables"><list><l>uuid</l></list></block><block s="doSetVar"><l>uuid</l><block s="reportRandom"><l>1</l><l>1000</l></block></block><custom-block s="call microblocks function %s %s %s"><l>msg_block</l><l>CoCube rotate for msecs</l><block s="reportJoinWords"><list><block var="uuid"/><l>,</l><l>cocube;</l><block var="direction"/><l>,</l><block var="speed"/><l>,</l><block var="time"/></list></block></custom-block><block s="doWait"><block s="reportQuotient"><block var="time"/><l>1000</l></block></block></script></block-definition><block-definition s="Move %&apos;direction&apos; at %&apos;speed&apos; speed (0-50)" type="command" category="CoCube WebSockets" space="true"><header></header><code></code><translations>zh_CN:向 _ 以 _ 速度(0-50)移动&#xD;</translations><inputs><input type="%s" readonly="true" initial="1">$_forward<options>$_forward&#xD;$_backward</options></input><input type="%n" initial="1">40</input></inputs><script><custom-block s="call microblocks function %s %s %s"><l>msg</l><l>CoCube move</l><block s="reportJoinWords"><list><l>cocube;</l><block var="direction"/><l>,</l><block var="speed"/></list></block></custom-block></script></block-definition><block-definition s="Rotate %&apos;direction&apos; at %&apos;speed&apos; speed (0-50)" type="command" category="CoCube WebSockets" space="true"><header></header><code></code><translations>zh_CN:向 _ 以 _ 速度(0-50)旋转&#xD;</translations><inputs><input type="%s" readonly="true" initial="1">$_left<options>$_left&#xD;$_right</options></input><input type="%n" initial="1">40</input></inputs><script><custom-block s="call microblocks function %s %s %s"><l>msg</l><l>CoCube rotate</l><block s="reportJoinWords"><list><l>cocube;</l><block var="direction"/><l>,</l><block var="speed"/></list></block></custom-block></script></block-definition><block-definition s="Set wheel left %&apos;left&apos; right %&apos;right&apos; (-50 to 50)" type="command" category="CoCube WebSockets"><header></header><code></code><translations>zh_CN:左轮以 _ 速度、右轮以 _ 速度移动&#xD;</translations><inputs><input type="%n" initial="1">40</input><input type="%n" initial="1">20</input></inputs><script><custom-block s="call microblocks function %s %s %s"><l>msg</l><l>CoCube set wheel</l><block s="reportJoinWords"><list><block var="left"/><l>,</l><block var="right"/></list></block></custom-block></script></block-definition><block-definition s="Wheels stop" type="command" category="CoCube WebSockets" space="true"><header></header><code></code><translations>zh_CN:电机停转&#xD;</translations><inputs></inputs><script><custom-block s="call microblocks function %s %s %s"><l>msg</l><l>CoCube wheels stop</l><l></l></custom-block></script></block-definition><block-definition s="Wheels break" type="command" category="CoCube WebSockets"><header></header><code></code><translations>zh_CN:电机刹车&#xD;</translations><inputs></inputs><script><custom-block s="call microblocks function %s %s %s"><l>msg</l><l>CoCube wheels break</l><l></l></custom-block></script></block-definition><block-definition s="Move %&apos;direction&apos; at %&apos;speed&apos; speed (0-50) by %&apos;steps&apos; steps" type="command" category="CoCube WebSockets" space="true"><header></header><code></code><translations>zh_CN:向 _ 以 _ 速度(0-50)移动 _ 步&#xD;</translations><inputs><input type="%s" readonly="true" initial="1">$_forward<options>$_forward&#xD;$_backward</options></input><input type="%n" initial="1">40</input><input type="%n" initial="1">50</input></inputs><script><block s="doDeclareVariables"><list><l>uuid</l></list></block><block s="doSetVar"><l>uuid</l><block s="reportRandom"><l>1</l><l>1000</l></block></block><block s="doDeclareVariables"><list><l>begin_x</l><l>begin_y</l></list></block><block s="doSetVar"><l>begin_x</l><block s="reportListItem"><l>1</l><custom-block s="robot position (x, y, degree)"></custom-block></block></block><block s="doSetVar"><l>begin_y</l><block s="reportListItem"><l>2</l><custom-block s="robot position (x, y, degree)"></custom-block></block></block><custom-block s="call microblocks function %s %s %s"><l>msg_block</l><l>CoCube move by step</l><block s="reportJoinWords"><list><block var="uuid"/><l>,</l><l>cocube;</l><block var="direction"/><l>,</l><block var="speed"/><l>,</l><block var="steps"/></list></block></custom-block><block s="doWaitUntil"><block s="reportVariadicLessThan"><list><block s="reportMonadic"><l><option>abs</option></l><block s="reportDifference"><block s="reportMonadic"><l><option>abs</option></l><custom-block s="_cocube_calculate_distance_error %s %s"><block var="begin_x"/><block var="begin_y"/></custom-block></block><block var="steps"/></block></block><l>3</l></list></block></block></script></block-definition><block-definition s="rotate %&apos;direction&apos; at %&apos;speed&apos; speed (0-50) by %&apos;degree&apos; degree" type="command" category="CoCube WebSockets"><header></header><code></code><translations>zh_CN:向 _ 以 _ 速度(0-50)旋转 _ 度&#xD;</translations><inputs><input type="%s" readonly="true" initial="1">$_left<options>$_left&#xD;$_right</options></input><input type="%n" initial="1">30</input><input type="%n" initial="1">90</input></inputs><script><block s="doDeclareVariables"><list><l>uuid</l></list></block><block s="doSetVar"><l>uuid</l><block s="reportRandom"><l>1</l><l>1000</l></block></block><block s="doDeclareVariables"><list><l>begin_angle</l></list></block><block s="doSetVar"><l>begin_angle</l><block s="reportListItem"><l>3</l><custom-block s="robot position (x, y, degree)"></custom-block></block></block><custom-block s="call microblocks function %s %s %s"><l>msg_block</l><l>CoCube rotate by degree</l><block s="reportJoinWords"><list><block var="uuid"/><l>,</l><l>cocube;</l><block var="direction"/><l>,</l><block var="speed"/><l>,</l><block var="degree"/></list></block></custom-block><block s="doWaitUntil"><block s="reportVariadicLessThan"><list><block s="reportMonadic"><l><option>abs</option></l><block s="reportDifference"><block s="reportMonadic"><l><option>abs</option></l><custom-block s="_cocube_calculate_angle_error %s"><block var="begin_angle"/></custom-block></block><block var="degree"/></block></block><l>3</l></list></block></block></script></block-definition><block-definition s="Rotate to angle %&apos;angle&apos; at %&apos;speed&apos; speed (0-50)" type="command" category="CoCube WebSockets" space="true"><header></header><code></code><translations>zh_CN:转向角度 _ 速度 _ (0-50)&#xD;</translations><inputs><input type="%n" initial="1">0</input><input type="%n" initial="1">30</input></inputs><script><block s="doDeclareVariables"><list><l>uuid</l></list></block><block s="doSetVar"><l>uuid</l><block s="reportRandom"><l>1</l><l>1000</l></block></block><custom-block s="call microblocks function %s %s %s"><l>msg_block</l><l>CoCube rotate to angle</l><block s="reportJoinWords"><list><block var="uuid"/><l>,</l><block var="angle"/><l>,</l><block var="speed"/></list></block></custom-block><block s="doWaitUntil"><block s="reportVariadicLessThan"><list><block s="reportMonadic"><l><option>abs</option></l><custom-block s="_cocube_calculate_angle_error %s"><block var="angle"/></custom-block></block><l>3</l></list></block></block></script></block-definition><block-definition s="Point towards X %&apos;x&apos; Y %&apos;y&apos; at %&apos;speed&apos; speed (0-50)" type="command" category="CoCube WebSockets"><header></header><code></code><translations>zh_CN:转向目标点X _ Y _ 速度 _ (0-50)&#xD;</translations><inputs><input type="%n" initial="1">0</input><input type="%n" initial="1">0</input><input type="%n" initial="1">30</input></inputs><script><block s="doDeclareVariables"><list><l>angle</l></list></block><block s="doSetVar"><l>angle</l><block s="reportAtan2"><block s="reportDifference"><block var="x"/><block s="reportListItem"><l>1</l><custom-block s="robot position (x, y, degree)"></custom-block></block></block><block s="reportDifference"><block var="y"/><block s="reportListItem"><l>2</l><custom-block s="robot position (x, y, degree)"></custom-block></block></block></block></block><custom-block s="Rotate to angle %n at %n speed (0-50)"><block var="angle"/><block var="speed"/></custom-block></script></block-definition><block-definition s="Move to X %&apos;x&apos; Y %&apos;y&apos; at %&apos;speed&apos; speed (0-50)" type="command" category="CoCube WebSockets"><header></header><code></code><translations>zh_CN:移动到目标点X _ Y _ 速度 _ (0-50)&#xD;</translations><inputs><input type="%n" initial="1">0</input><input type="%n" initial="1">0</input><input type="%n" initial="1">40</input></inputs><script><block s="doDeclareVariables"><list><l>uuid</l></list></block><block s="doSetVar"><l>uuid</l><block s="reportRandom"><l>1</l><l>1000</l></block></block><custom-block s="call microblocks function %s %s %s"><l>msg_block</l><l>CoCube move to</l><block s="reportJoinWords"><list><block var="uuid"/><l>,</l><block var="x"/><l>,</l><block var="y"/><l>,</l><block var="speed"/></list></block></custom-block><block s="doWaitUntil"><block s="reportVariadicLessThan"><list><block s="reportMonadic"><l><option>abs</option></l><custom-block s="_cocube_calculate_distance_error %s %s"><block var="x"/><block var="y"/></custom-block></block><l>7</l></list></block></block></script></block-definition><block-definition s="gripper open" type="command" category="CoCube WebSockets" space="true"><header></header><code></code><translations>zh_CN:夹爪张开&#xD;</translations><inputs></inputs><script><custom-block s="call microblocks function %s %s %s"><l>msg</l><l>ccmodule_gripper open</l><l></l></custom-block></script></block-definition><block-definition s="gripper close" type="command" category="CoCube WebSockets"><header></header><code></code><translations>zh_CN:夹爪闭合&#xD;</translations><inputs></inputs><script><custom-block s="call microblocks function %s %s %s"><l>msg</l><l>ccmodule_gripper close</l><l></l></custom-block></script></block-definition><block-definition s="gripper degrees %&apos;degrees&apos; (0 to 70)" type="command" category="CoCube WebSockets"><header></header><code></code><translations>zh_CN:夹爪角度 _ (0-70)&#xD;</translations><inputs><input type="%n" initial="1">0</input></inputs><script><custom-block s="call microblocks function %s %s %s"><l>msg</l><l>ccmodule_gripper degree</l><block var="degrees"/></custom-block></script></block-definition><block-definition s="gripper stop" type="command" category="CoCube WebSockets"><header></header><code></code><translations>zh_CN:夹爪停止&#xD;</translations><inputs></inputs><script><custom-block s="call microblocks function %s %s %s"><l>msg</l><l>ccmodule_gripper stop</l><l></l></custom-block></script></block-definition><block-definition s="power on module" type="command" category="CoCube WebSockets"><header></header><code></code><translations>zh_CN:开启外接模块电源&#xD;</translations><inputs></inputs><script><custom-block s="call microblocks function %s %s %s"><l>msg</l><l>ccmodule_power on module</l><l></l></custom-block></script></block-definition><block-definition s="send robot %&apos;message&apos;" type="command" category="CoCube WebSockets" helper="true" space="true"><header></header><code></code><translations>zh_CN:给机器人发送websockets消息 _&#xD;</translations><inputs><input type="%s" initial="1"></input></inputs><script><block s="doIf"><block s="reportApplyExtension"><l>ws_connected()</l><list></list></block><script><block s="doApplyExtension"><l>ws_send(message)</l><list><block var="message"/></list></block></script><list></list></block></script></block-definition><block-definition s="__init robot websockets extension__" type="command" category="CoCube WebSockets" helper="true"><header></header><code></code><translations></translations><inputs></inputs><script><custom-block s="create %s var %mult%txt"><l>global</l><list><l>__module__websockets__</l></list></custom-block><block s="doSetVar"><l>__module__websockets__</l><l>libraries/websockets/init.js</l></block></script></block-definition><block-definition s="create %&apos;_scope&apos; var %&apos;_names&apos;" type="command" category="variables"><comment x="0" y="0" w="146" collapsed="false">This block creates  new variables on the selected scope: global (for all sprites), sprite (for this sprite only) or script (only for that blocks stack) with the names given (in &apos;names&apos; list).&#xD;&#xD;If there is already a variable with that name in that scope, it does nothing: no errors and no overwrites.</comment><header></header><code></code><translations>pt:cria as variáveis _ _&#xD;ca:crea les _ variables _&#xD;es:crear las _ variables _&#xD;de:erstellen _ var _&#xD;pl:utwórz zmienną _ _&#xD;</translations><inputs><input type="%s" readonly="true">global<options>global&#xD;sprite&#xD;script</options></input><input type="%mult%txt"></input></inputs><script><block s="doWarp"><script><block s="doForEach"><l>_item</l><block var="_names"/><script><block s="doApplyExtension"><l>var_declare(scope, name)</l><list><block var="_scope"/><block var="_item"/></list></block></script></block></script></block></script></block-definition><block-definition s="call microblocks function %&apos;msg_type&apos; %&apos;name&apos; %&apos;params&apos;" type="command" category="CoCube WebSockets" helper="true"><header></header><code></code><translations>zh_CN:调用microblocks函数 _ _ _&#xD;</translations><inputs><input type="%s" initial="1"></input><input type="%s" initial="1"></input><input type="%s" initial="1"></input></inputs><script><block s="doIf"><custom-block s="robot connected?"></custom-block><script><custom-block s="send robot %s"><block s="reportJoinWords"><list><block var="msg_type"/><l>,</l><block var="name"/><l>,</l><block var="params"/></list></block></custom-block></script><list><l><bool>true</bool></l><script><block s="bubble"><l>Please connect websockets device!</l></block></script></list></block></script></block-definition><block-definition s="_cocube_calculate_angle_error %&apos;angle&apos;" type="reporter" category="CoCube WebSockets" helper="true"><header></header><code></code><translations></translations><inputs><input type="%s" initial="1"></input></inputs><script><block s="doDeclareVariables"><list><l>angle_error</l></list></block><block s="doSetVar"><l>angle_error</l><block s="reportDifference"><block s="reportListItem"><l>3</l><custom-block s="robot position (x, y, degree)"></custom-block></block><block s="reportModulus"><block var="angle"/><l>360</l></block></block></block><block s="doIf"><block s="reportVariadicLessThan"><list><block var="angle_error"/><l>-180</l></list></block><script><block s="doReport"><block s="reportVariadicSum"><list><block var="angle_error"/><l>360</l></list></block></block></script><list><block s="reportVariadicGreaterThan"><list><block var="angle_error"/><l>180</l></list></block><script><block s="doReport"><block s="reportDifference"><block var="angle_error"/><l>360</l></block></block></script></list></block><block s="doReport"><block var="angle_error"/></block></script></block-definition><block-definition s="_cocube_calculate_distance_error %&apos;x&apos; %&apos;y&apos;" type="reporter" category="CoCube WebSockets" helper="true"><header></header><code></code><translations></translations><inputs><input type="%s" initial="1"></input><input type="%s" initial="1"></input></inputs><script><block s="doDeclareVariables"><list><l>error_x</l><l>error_y</l></list></block><block s="doSetVar"><l>error_x</l><block s="reportDifference"><block var="x"/><block s="reportListItem"><l>1</l><custom-block s="robot position (x, y, degree)"></custom-block></block></block></block><block s="doSetVar"><l>error_y</l><block s="reportDifference"><block var="y"/><block s="reportListItem"><l>2</l><custom-block s="robot position (x, y, degree)"></custom-block></block></block></block><block s="doReport"><block s="reportMonadic"><l><option>sqrt</option></l><block s="reportVariadicSum"><list><block s="reportVariadicProduct"><list><block var="error_x"/><block var="error_x"/></list></block><block s="reportVariadicProduct"><list><block var="error_y"/><block var="error_y"/></list></block></list></block></block></block></script></block-definition><variables><variable name="__module__websockets__" hidden="true"><l>libraries/websockets/init.js</l></variable></variables><local-variables><variable name="__websocket__message__"><l>pose,2,6,203</l></variable><variable name="address"><l>ws://192.168.1.101:81</l></variable></local-variables></blocks>