Skip to content

Commit 9d9fccf

Browse files
Tinyu-Zhaolbuque
authored andcommitted
lib/module: Add DMX Module Support.
Signed-off-by: Tinyu-Zhao <[email protected]>
1 parent 8af4dd2 commit 9d9fccf

File tree

12 files changed

+361
-17
lines changed

12 files changed

+361
-17
lines changed

docs/en/module/dmx.rst

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
DMX512 Module
2+
===========
3+
4+
.. include:: ../refs/module.dmx.ref
5+
6+
DMX-Base is a functional base specially designed for DMX-512 data transmission scenarios, communicating and enabling control with M5 host through serial port, equipped with XLR-5 and XLR-3 male and female interfaces, convenient for users to connect DMX devices with different interfaces, in addition, the module has HT3.96 pitch 485 interface to facilitate connection to Expansion 485 devices.
7+
8+
Support the following products:
9+
10+
|dmx|
11+
12+
Micropython Example Send Data:
13+
14+
.. literalinclude:: ../../../examples/module/dmx/dmx512_core2_send_example.py
15+
:language: python
16+
:linenos:
17+
18+
19+
Micropython Example Receive Data:
20+
21+
.. literalinclude:: ../../../examples/module/dmx/dmx512_core2_receive_example.py
22+
:language: python
23+
:linenos:
24+
25+
26+
27+
UIFLOW2 Master Example:
28+
29+
|tx_example.png|
30+
31+
UIFLOW2 Slave Example:
32+
33+
|rx_example.png|
34+
35+
.. only:: builder_html
36+
37+
|dmx512_core2_send_example.m5f2|
38+
39+
|dmx512_core2_receive_example.m5f2|
40+
41+
42+
class DMX512Module
43+
----------------
44+
45+
Constructors
46+
------------
47+
48+
.. class:: DMX512Module(id, mode = DMX_MASTER)
49+
50+
Initializes the DMX512 module with a specified UART ID and port pins.
51+
52+
:param Literal[0,1,2] id: UART device ID(DMX port id).
53+
:param int mode: Operating mode (1 for Master, 2 for Slave).
54+
55+
UIFLOW2:
56+
57+
|init.png|
58+
59+
Methods
60+
-------
61+
62+
.. method:: DMX512Module.dmx_init(mode) -> None
63+
64+
Initializes the DMX512 communication with UART pins and mode.
65+
66+
:param mode: Operating mode (1 for Master, 2 for Slave).
67+
68+
UIFLOW2:
69+
70+
|dmx_init.png|
71+
72+
.. method:: DMX512Module.deinit() -> None
73+
74+
Deinitializes the DMX512 module and stops any ongoing operations.
75+
76+
UIFLOW2:
77+
78+
|deinit.png|
79+
80+
.. method:: DMX512Module.write_data(channel, data) -> None
81+
82+
Updates the data for a specified DMX channel. Data is sent on the next update cycle.
83+
84+
:param channel: DMX channel number (1-512).
85+
:param data: Data value to be sent (0-255).
86+
@raises ValueError if the channel number is out of range.
87+
88+
UIFLOW2:
89+
90+
|write_data.png|
91+
92+
93+
.. method:: DMX512Module.clear_buffer() -> None
94+
95+
Clears the DMX buffer and resets the data.
96+
97+
UIFLOW2:
98+
99+
|clear_buffer.png|
100+
101+
.. method:: DMX512Module.read_data(channel) -> int
102+
103+
Reads data from a specified DMX channel in Slave mode.
104+
105+
:param channel: DMX channel number (1-512).
106+
107+
UIFLOW2:
108+
109+
|read_data.png|
110+
111+
.. method:: DMX512.receive_none_block() -> None
112+
113+
Starts non-blocking data reception for the specified channels with associated callbacks.
114+
115+
UIFLOW2:
116+
117+
|receive_none_block.png|
118+
119+
.. method:: DMX512Module.attach_channel(channel, callback) -> None
120+
121+
Attaches a callback function to a specified DMX channel.
122+
123+
:param channel: DMX channel number (1-512) to attach the callback to.
124+
:param callback: The function to be called when data changes on the specified channel.
125+
126+
UIFLOW2:
127+
128+
|receive_data_event.png|
129+
130+
.. method:: DMX512.stop_receive() -> None
131+
132+
Stops the non-blocking data reception task.
133+
134+
UIFLOW2:
135+
136+
|stop_receive.png|
137+
138+
.. method:: DMX512Module.detach_channel(channel) -> None
139+
140+
Detaches the callback function from a specified DMX channel.
141+
142+
:param channel: DMX channel number (1-512) to detach the callback from.

docs/en/module/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Module
77
4in8out.rst
88
ain4.rst
99
display.rst
10+
dmx.rst
1011
dualkmeter.rst
1112
gnss.rst
1213
grbl.rst

docs/en/refs/module.dmx.ref

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
.. |dmx| image:: https://static-cdn.m5stack.com/resource/docs/products/module/DMX_Base/img-3ff79a98-9198-428f-a4ea-f50c58d834d1.webp
2+
:target: https://docs.m5stack.com/en/module/DMX_Base
3+
:height: 200px
4+
:width: 200px
5+
6+
.. |init.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/dmx/init.png
7+
.. |dmx_init.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/dmx/dmx_init.png
8+
.. |write_data.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/dmx/write_data.png
9+
.. |update_dmx.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/dmx/update_dmx.png
10+
.. |read_data.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/dmx/read_data.png
11+
.. |clear_buffer.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/dmx/clear_buffer.png
12+
.. |deinit.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/dmx/deinit.png
13+
.. |receive_none_block.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/dmx/receive_none_block.png
14+
.. |receive_data_event.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/dmx/receive_event.png
15+
.. |stop_receive.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/dmx/stop_receive.png
16+
.. |detach_channel.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/dmx/detach_channel.png
17+
18+
.. |tx_example.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/dmx/send_example.png
19+
.. |rx_example.png| image:: https://static-cdn.m5stack.com/mpy_docs/module/dmx/receive_example.png
20+
21+
22+
.. |dmx512_core2_receive_example.m5f2| raw:: html
23+
24+
<a
25+
href="https://uiflow2.m5stack.com/?example=https://raw.githubusercontent.com/m5stack/uiflow-micropython/develop/examples/module/dmx/dmx512_core2_receive_example.m5f2"
26+
target="_blank"
27+
>
28+
dmx512_core2_receive_example.m5f2
29+
</a>
30+
31+
.. |dmx512_core2_send_example.m5f2| raw:: html
32+
33+
<a
34+
href="https://uiflow2.m5stack.com/?example=https://raw.githubusercontent.com/m5stack/uiflow-micropython/develop/examples/module/dmx/dmx512_core2_send_example.m5f2"
35+
target="_blank"
36+
>
37+
dmx512_core2_send_example.m5f2
38+
</a>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"version":"V2.0","versionNumber":"V2.1.8","type":"core2","components":[{"name":"screen","type":"screen","layer":0,"screenId":"builtin","screenName":"","id":"__core2_screen","createTime":1724406992350,"x":0,"y":0,"width":320,"height":240,"backgroundColor":"#222222","size":0,"isSelected":true},{"name":"Title","type":"title","layer":1,"screenId":"builtin","screenName":"","id":"p3!W#cUbuB%Kec#I","createTime":1724407010661,"x":0,"y":0,"color":"#ffffff","backgroundColor":"#0000FF","text":"DMX512Module Rec example","textOffset":3,"font":"Widgets.FONTS.DejaVu18","isSelected":false},{"name":"label0","type":"label","layer":2,"screenId":"builtin","screenName":"","id":"zq5uuS9LZkSgjtui","createTime":1724407155074,"x":0,"y":82,"color":"#ffffff","backgroundColor":"#222222","text":"Channel 1:","engine":"gfx","font":"Widgets.FONTS.DejaVu18","rotation":0,"isSelected":false},{"name":"label1","type":"label","layer":3,"screenId":"builtin","screenName":"","id":"cr#8h&IaoQW`SX$+","createTime":1724407158710,"x":0,"y":134,"color":"#ffffff","backgroundColor":"#222222","text":"Channel 2:","engine":"gfx","font":"Widgets.FONTS.DejaVu18","rotation":0,"isSelected":false}],"resources":[{"hardware":["hardware_button","hardware_pin_button","imu","speaker","touch","mic"]},{"module":["module_dmx"]}],"units":[],"hats":[],"bases":[],"i2cs":[],"blockly":"<variables><variable id=\"/zxoa9p;RYcN:?g+V?s1\">dmx_data</variable><variable id=\"C{V[9=Gr,8%kurF.%2@^\">dmx_data2</variable></variables><block type=\"basic_on_setup\" id=\"setup_block\" deletable=\"false\" x=\"50\" y=\"50\"><mutation isBegin=\"true\"></mutation><field name=\"UPDATEOP\">true</field><statement name=\"FUNC\"><block type=\"system_m5_begin\" id=\"system_m5_begin\"><next><block type=\"module_dmx_init\" id=\"?D$qAj5-wwWsKK]~f8(M\"><field name=\"NAME\">module_dmx_0</field><value name=\"UART\"><shadow type=\"module_dmx_id_option\" id=\"7_-p7=sop42W7:ca.Uj4\"><field name=\"VALUE\">1</field></shadow></value><value name=\"MODE\"><shadow type=\"module_dmx_mode_option\" id=\"iy*:eK.|Y/clGF;GhA-x\"><field name=\"VALUE\">2</field></shadow></value><next><block type=\"module_dmx_start_receive\" id=\"W!sG2c#7xX#v.#L@n2@]\"><field name=\"NAME\">module_dmx_0</field></block></next></block></next></block></statement></block><block type=\"basic_on_loop\" id=\"loop_block\" deletable=\"false\" x=\"450\" y=\"50\"><mutation isUpdate=\"true\"></mutation><field name=\"UPDATEOP\">true</field><statement name=\"FUNC\"><block type=\"system_m5_update\" id=\"system_m5_update\"></block></statement></block><block type=\"module_dmx_receive_data_event\" id=\"b=WdJ.WN6:4?I:vi5;-Y\" x=\"50\" y=\"290\"><field name=\"NAME\">module_dmx_0</field><value name=\"CHANNEL\"><shadow type=\"math_slider\" id=\"DI13~CqQjn3C=QdB@X8r\"><mutation max=\"512\" min=\"1\" step=\"1\" precision=\"1\"></mutation><field name=\"NUM\">1</field></shadow></value><value name=\"DATA\"><block type=\"variables_get\" id=\"#h^!d9FXZH{GY.}yIRkN\"><field name=\"VAR\" id=\"/zxoa9p;RYcN:?g+V?s1\">dmx_data</field></block></value><statement name=\"FUNC\"><block type=\"label_set_text\" id=\"(t9VoE@FC,vH)q/PoZIt\"><field name=\"NAME\">label0</field><value name=\"TEXT\"><shadow type=\"text\" id=\"KeZwXd=i.TY0?2wh/TDz\" disabled=\"true\"><field name=\"TEXT\">Label</field></shadow><block type=\"text_add_str\" id=\"TKk~:Es!Zsg9Hq)mWoao\"><value name=\"VALUE1\"><shadow type=\"text\" id=\"~j-W$o4BvnHtnf~K*9XW\"><field name=\"TEXT\">Channel 1:</field></shadow></value><value name=\"VALUE2\"><block type=\"variables_get\" id=\"AAz@hITjCZxS;2fYJpo)\"><field name=\"VAR\" id=\"/zxoa9p;RYcN:?g+V?s1\">dmx_data</field></block></value></block></value></block></statement></block><block type=\"module_dmx_receive_data_event\" id=\"w.h*DE$Y:H.C!C1C7f)W\" x=\"50\" y=\"410\"><field name=\"NAME\">module_dmx_0</field><value name=\"CHANNEL\"><shadow type=\"math_slider\" id=\"W|^BkZCl8bxc@R]?7|HI\"><mutation max=\"512\" min=\"1\" step=\"1\" precision=\"1\"></mutation><field name=\"NUM\">2</field></shadow></value><value name=\"DATA\"><block type=\"variables_get\" id=\"F#g@vF^w:8^zRekq[(i6\"><field name=\"VAR\" id=\"C{V[9=Gr,8%kurF.%2@^\">dmx_data2</field></block></value><statement name=\"FUNC\"><block type=\"label_set_text\" id=\"+_1@XD_`ppIEY%)t`zk#\"><field name=\"NAME\">label1</field><value name=\"TEXT\"><shadow type=\"text\" id=\"KeZwXd=i.TY0?2wh/TDz\" disabled=\"true\"><field name=\"TEXT\">Label</field></shadow><block type=\"text_add_str\" id=\"5ApG5oZ*XD*Pis*!#Vtr\"><value name=\"VALUE1\"><shadow type=\"text\" id=\"9iGWc/Z1(bKAq8i[#+L)\"><field name=\"TEXT\">Channel 2:</field></shadow></value><value name=\"VALUE2\"><block type=\"variables_get\" id=\"p0ilX(FzSMW}i:HC]|w[\"><field name=\"VAR\" id=\"C{V[9=Gr,8%kurF.%2@^\">dmx_data2</field></block></value></block></value></block></statement></block>","screen":[{"simulationName":"Built-in","type":"builtin","width":320,"height":240,"scale":0.78,"screenName":"","blockId":"","screenColorType":0,"id":"builtin","createTime":1724406992341}],"logicWhenNum":0,"customList":[]}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
2+
#
3+
# SPDX-License-Identifier: MIT
4+
5+
import os, sys, io
6+
import M5
7+
from M5 import *
8+
from module import DMX512Module
9+
10+
11+
Title = None
12+
label0 = None
13+
label1 = None
14+
module_dmx_0 = None
15+
16+
17+
dmx_data = None
18+
dmx_data2 = None
19+
20+
21+
def module_dmx_0_channel1_receive_event(received_data):
22+
global Title, label0, label1, module_dmx_0, dmx_data, dmx_data2
23+
dmx_data = received_data
24+
label0.setText(str((str("Channel 1:") + str(dmx_data))))
25+
26+
27+
def module_dmx_0_channel2_receive_event(received_data):
28+
global Title, label0, label1, module_dmx_0, dmx_data, dmx_data2
29+
dmx_data2 = received_data
30+
label1.setText(str((str("Channel 2:") + str(dmx_data2))))
31+
32+
33+
def setup():
34+
global Title, label0, label1, module_dmx_0, dmx_data, dmx_data2
35+
36+
M5.begin()
37+
Widgets.fillScreen(0x222222)
38+
Title = Widgets.Title(
39+
"DMX512Module Rec example", 3, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu18
40+
)
41+
label0 = Widgets.Label("Channel 1:", 0, 82, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
42+
label1 = Widgets.Label("Channel 2:", 0, 134, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
43+
44+
module_dmx_0 = DMX512Module(1, mode=2)
45+
module_dmx_0.attach_channel(1, module_dmx_0_channel1_receive_event)
46+
module_dmx_0.attach_channel(2, module_dmx_0_channel2_receive_event)
47+
module_dmx_0.receive_none_block()
48+
49+
50+
def loop():
51+
global Title, label0, label1, module_dmx_0, dmx_data, dmx_data2
52+
M5.update()
53+
54+
55+
if __name__ == "__main__":
56+
try:
57+
setup()
58+
while True:
59+
loop()
60+
except (Exception, KeyboardInterrupt) as e:
61+
try:
62+
from utility import print_error_msg
63+
64+
print_error_msg(e)
65+
except ImportError:
66+
print("please update to latest firmware")
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"version":"V2.0","versionNumber":"V2.1.8","type":"core2","components":[{"name":"screen","type":"screen","layer":0,"screenId":"builtin","screenName":"","id":"__core2_screen","createTime":1724406992350,"x":0,"y":0,"width":320,"height":240,"backgroundColor":"#222222","size":0,"isSelected":true},{"name":"Title","type":"title","layer":1,"screenId":"builtin","screenName":"","id":"p3!W#cUbuB%Kec#I","createTime":1724407010661,"x":0,"y":0,"color":"#ffffff","backgroundColor":"#0000FF","text":"DMX512Module Send example","textOffset":3,"font":"Widgets.FONTS.DejaVu18","isSelected":false},{"name":"label0","type":"label","layer":2,"screenId":"builtin","screenName":"","id":"zq5uuS9LZkSgjtui","createTime":1724407155074,"x":2,"y":76,"color":"#ffffff","backgroundColor":"#222222","text":"Not initialized","engine":"gfx","font":"Widgets.FONTS.DejaVu18","rotation":0,"isSelected":false},{"name":"label1","type":"label","layer":1,"screenId":"builtin","screenName":"","id":"z7Va833v6g%Rd3GJ","createTime":1724409886887,"x":2,"y":129,"color":"#ffffff","backgroundColor":"#222222","text":"Not Sent","engine":"gfx","font":"Widgets.FONTS.DejaVu18","rotation":0,"isSelected":false}],"resources":[{"hardware":["hardware_button","hardware_pin_button","imu","speaker","touch","mic"]},{"module":["module_dmx"]}],"units":[],"hats":[],"bases":[],"i2cs":[],"blockly":"<variables><variable id=\"o5|Pm{Z%OaWc^Q|=8b?1\">ch_data</variable></variables><block type=\"basic_on_setup\" id=\"setup_block\" deletable=\"false\" x=\"50\" y=\"50\"><mutation isBegin=\"true\"></mutation><field name=\"UPDATEOP\">true</field><statement name=\"FUNC\"><block type=\"system_m5_begin\" id=\"system_m5_begin\"><next><block type=\"module_dmx_init\" id=\"a--c#RPHSgLP/)QU*cA1\"><field name=\"NAME\">module_dmx_0</field><value name=\"UART\"><shadow type=\"module_dmx_id_option\" id=\"5e(m|i^@{88D/VdqOL.W\"><field name=\"VALUE\">2</field></shadow></value><value name=\"MODE\"><shadow type=\"module_dmx_mode_option\" id=\"W-WTcxACOu};]l)zhKD3\"><field name=\"VALUE\">1</field></shadow></value><next><block type=\"variables_set\" id=\"Ht,~[S*dQ#khDqg{FA1a\"><field name=\"VAR\" id=\"o5|Pm{Z%OaWc^Q|=8b?1\">ch_data</field><value name=\"VALUE\"><block type=\"math_number\" id=\"T9Gm0HwZZ3S2Ezl$}BEU\"><mutation max=\"Infinity\" min=\"-Infinity\" precision=\"0\"></mutation><field name=\"NUM\">0</field></block></value><next><block type=\"label_set_text\" id=\"*2_A}1U8B*j`4ijw}6_e\"><field name=\"NAME\">label0</field><value name=\"TEXT\"><shadow type=\"text\" id=\"0;O;7cnDP*?o7{:ljkc9\"><field name=\"TEXT\">Initialized</field></shadow></value></block></next></block></next></block></next></block></statement></block><block type=\"basic_on_loop\" id=\"loop_block\" deletable=\"false\" x=\"50\" y=\"330\"><mutation isUpdate=\"true\"></mutation><field name=\"UPDATEOP\">true</field><statement name=\"FUNC\"><block type=\"system_m5_update\" id=\"system_m5_update\"><next><block type=\"label_set_text\" id=\"8ZXT,]`!.F$s+O)pbT.%\"><field name=\"NAME\">label1</field><value name=\"TEXT\"><shadow type=\"text\" id=\":nD@rGt+J!RqTI+PMw]G\"><field name=\"TEXT\">Not Sent</field></shadow></value><next><block type=\"variables_set\" id=\"zB^8Kra#pp,AP(#@`Bb|\"><field name=\"VAR\" id=\"o5|Pm{Z%OaWc^Q|=8b?1\">ch_data</field><value name=\"VALUE\"><block type=\"math_arithmetic\" id=\"M6?D.z7w^[k/S%q)U09u\"><field name=\"OP\">ADD</field><value name=\"A\"><shadow type=\"math_number\" id=\"u-eq$cWjG`(33,F.8{H)\"><mutation max=\"Infinity\" min=\"-Infinity\" precision=\"0\"></mutation><field name=\"NUM\">1</field></shadow><block type=\"variables_get\" id=\"MF{Mh#8{+uj7_b^T5N~=\"><field name=\"VAR\" id=\"o5|Pm{Z%OaWc^Q|=8b?1\">ch_data</field></block></value><value name=\"B\"><shadow type=\"math_number\" id=\"dv*NHuF}z2pZadWbBg;8\"><mutation max=\"Infinity\" min=\"-Infinity\" precision=\"0\"></mutation><field name=\"NUM\">1</field></shadow></value></block></value><next><block type=\"controls_if\" id=\"aKv.#R3!t3/;fo|=lmU2\"><value name=\"IF0\"><block type=\"logic_compare\" id=\"Bv[r$CL%;,%H3PQJIU)Y\"><field name=\"OP\">GTE</field><value name=\"A\"><block type=\"variables_get\" id=\"$@$8$^K;Lp?n/yVga`Oe\"><field name=\"VAR\" id=\"o5|Pm{Z%OaWc^Q|=8b?1\">ch_data</field></block></value><value name=\"B\"><block type=\"math_number\" id=\"O^%@.([H!4?0Mh^P$D|3\"><mutation max=\"Infinity\" min=\"-Infinity\" precision=\"0\"></mutation><field name=\"NUM\">255</field></block></value></block></value><statement name=\"DO0\"><block type=\"variables_set\" id=\"g0n=Um]Jyy-9f1{oz$YM\"><field name=\"VAR\" id=\"o5|Pm{Z%OaWc^Q|=8b?1\">ch_data</field><value name=\"VALUE\"><block type=\"math_number\" id=\"bJtaQs.PYR#Gy;8dEvr_\"><mutation max=\"Infinity\" min=\"-Infinity\" precision=\"0\"></mutation><field name=\"NUM\">0</field></block></value></block></statement><next><block type=\"module_dmx_write_data\" id=\"r{o7=vXUzFv3xc]HAt7b\"><field name=\"NAME\">module_dmx_0</field><value name=\"DATA\"><shadow type=\"math_slider\" id=\"Qk|GONv1~CAUkk(]TJ_S\"><mutation max=\"255\" min=\"0\" step=\"1\" precision=\"1\"></mutation><field name=\"NUM\">0</field></shadow><block type=\"variables_get\" id=\",FCCsQ~DR}rFD?m9WFIj\"><field name=\"VAR\" id=\"o5|Pm{Z%OaWc^Q|=8b?1\">ch_data</field></block></value><value name=\"CHANNEL\"><shadow type=\"math_slider\" id=\"kM=S[]PD,)@*=3%;$7@{\"><mutation max=\"512\" min=\"1\" step=\"1\" precision=\"1\"></mutation><field name=\"NUM\">1</field></shadow></value><next><block type=\"module_dmx_write_data\" id=\"0Lqb8fE@v$+ht{($D1M5\"><field name=\"NAME\">module_dmx_0</field><value name=\"DATA\"><shadow type=\"math_slider\" id=\"Qk|GONv1~CAUkk(]TJ_S\"><mutation max=\"255\" min=\"0\" step=\"1\" precision=\"1\"></mutation><field name=\"NUM\">0</field></shadow><block type=\"variables_get\" id=\"[N1T$PE3HzRzoCj@7nHS\"><field name=\"VAR\" id=\"o5|Pm{Z%OaWc^Q|=8b?1\">ch_data</field></block></value><value name=\"CHANNEL\"><shadow type=\"math_slider\" id=\"r)F;,1xlQ(z`dg=DbBLg\"><mutation max=\"512\" min=\"1\" step=\"1\" precision=\"1\"></mutation><field name=\"NUM\">2</field></shadow></value><next><block type=\"module_dmx_write_data\" id=\"L+QrNuUhH)~8bs{YR|99\"><field name=\"NAME\">module_dmx_0</field><value name=\"DATA\"><shadow type=\"math_slider\" id=\"Qk|GONv1~CAUkk(]TJ_S\"><mutation max=\"255\" min=\"0\" step=\"1\" precision=\"1\"></mutation><field name=\"NUM\">0</field></shadow><block type=\"variables_get\" id=\"AM0Ayzlit|t%Mx,[Mdzz\"><field name=\"VAR\" id=\"o5|Pm{Z%OaWc^Q|=8b?1\">ch_data</field></block></value><value name=\"CHANNEL\"><shadow type=\"math_slider\" id=\"0aDUz,MSFv8m{OnBl`Vp\"><mutation max=\"512\" min=\"1\" step=\"1\" precision=\"1\"></mutation><field name=\"NUM\">3</field></shadow></value><next><block type=\"label_set_text\" id=\"a8;-HP2}/+,z7JhyBd#z\"><field name=\"NAME\">label1</field><value name=\"TEXT\"><shadow type=\"text\" id=\"!if$bnl=:Cq-G7t=.,Yu\"><field name=\"TEXT\">Sent</field></shadow></value><next><block type=\"time_sleep_second\" id=\"[Y$qb(u^|}BmB5wO:]4M\"><value name=\"SECOND\"><shadow type=\"math_number\" id=\"+s*-S9_2lC6g4:ByAJJu\"><mutation max=\"Infinity\" min=\"0\" precision=\"0\"></mutation><field name=\"NUM\">0.7</field></shadow></value></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></statement></block>","screen":[{"simulationName":"Built-in","type":"builtin","width":320,"height":240,"scale":0.78,"screenName":"","blockId":"","screenColorType":0,"id":"builtin","createTime":1724406992341}],"logicWhenNum":0,"customList":[]}

0 commit comments

Comments
 (0)