micrOSDevToolKit 2.1.5__py3-none-any.whl → 2.26.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. env/driver_cp210x/.DS_Store +0 -0
  2. env/driver_cp210x/macOS_VCP_Driver/SiLabsUSBDriverDisk.dmg +0 -0
  3. env/driver_cp210x/macOS_VCP_Driver/macOS_VCP_Driver_Release_Notes.txt +17 -1
  4. micrOS/micropython/esp32-20251209-v1.27.0.bin +0 -0
  5. micrOS/micropython/esp32c3-20251209-v1.27.0.bin +0 -0
  6. micrOS/micropython/esp32c6-20251209-v1.27.0.bin +0 -0
  7. micrOS/micropython/esp32s2-20251209-v1.27.0.bin +0 -0
  8. micrOS/micropython/esp32s2-LOLIN_MINI-20251209-v1.27.0.bin +0 -0
  9. micrOS/micropython/esp32s3-4MBflash-20241129-v1.24.1.bin +0 -0
  10. micrOS/micropython/esp32s3-8MBflash-20251209-v1.27.0.bin +0 -0
  11. micrOS/micropython/esp32s3_spiram_oct-20251209-v1.27.0.bin +0 -0
  12. micrOS/micropython/rpi-pico-w-20251209-v1.27.0.uf2 +0 -0
  13. micrOS/micropython/tinypico-20251209-v1.27.0.bin +0 -0
  14. micrOS/release_info/micrOS_ReleaseInfo/system_analysis_sum.json +191 -151
  15. micrOS/source/Auth.py +37 -0
  16. micrOS/source/Common.py +376 -102
  17. micrOS/source/Config.py +55 -25
  18. micrOS/source/Debug.py +54 -193
  19. micrOS/source/Espnow.py +404 -0
  20. micrOS/source/Files.py +207 -0
  21. micrOS/source/Hooks.py +88 -16
  22. micrOS/source/InterConnect.py +130 -46
  23. micrOS/source/Interrupts.py +8 -8
  24. micrOS/source/Logger.py +131 -0
  25. micrOS/source/Network.py +41 -21
  26. micrOS/source/Notify.py +74 -198
  27. micrOS/source/Pacman.py +326 -0
  28. micrOS/source/Scheduler.py +18 -55
  29. micrOS/source/Server.py +84 -217
  30. micrOS/source/Shell.py +103 -93
  31. micrOS/source/Tasks.py +239 -173
  32. micrOS/source/Time.py +21 -22
  33. micrOS/source/Types.py +89 -54
  34. micrOS/source/Web.py +485 -0
  35. micrOS/source/__pycache__/Common.cpython-312.pyc +0 -0
  36. micrOS/source/__pycache__/Debug.cpython-312.pyc +0 -0
  37. micrOS/source/__pycache__/Files.cpython-312.pyc +0 -0
  38. micrOS/source/__pycache__/Logger.cpython-312.pyc +0 -0
  39. micrOS/source/__pycache__/Scheduler.cpython-312.pyc +0 -0
  40. micrOS/source/__pycache__/Server.cpython-312.pyc +0 -0
  41. micrOS/source/__pycache__/Shell.cpython-312.pyc +0 -0
  42. micrOS/source/__pycache__/replhelper.cpython-312.pyc +0 -0
  43. micrOS/source/helpers.py +132 -0
  44. micrOS/source/micrOS.py +25 -21
  45. micrOS/source/micrOSloader.py +14 -23
  46. micrOS/source/microIO.py +94 -57
  47. toolkit/simulator_lib/LP_darwin.py → micrOS/source/modules/IO_esp32.py +22 -11
  48. micrOS/source/{IO_esp32c3.py → modules/IO_esp32c3.py} +6 -1
  49. micrOS/source/modules/IO_esp32c6.py +38 -0
  50. micrOS/source/{IO_esp32s2.py → modules/IO_esp32s2.py} +6 -1
  51. micrOS/source/{IO_esp32s3.py → modules/IO_esp32s3.py} +43 -2
  52. micrOS/source/modules/IO_m5stamp.py +86 -0
  53. micrOS/source/{IO_qtpy.py → modules/IO_qtpy.py} +28 -18
  54. micrOS/source/{IO_tinypico.py → modules/IO_tinypico.py} +48 -3
  55. micrOS/source/modules/LM_L298N.py +161 -0
  56. {toolkit/workspace/precompiled → micrOS/source/modules}/LM_L9110_DCmotor.py +4 -4
  57. micrOS/source/{LM_OV2640.py → modules/LM_OV2640.py} +53 -42
  58. micrOS/source/{LM_VL53L0X.py → modules/LM_VL53L0X.py} +5 -5
  59. micrOS/source/{LM_aht10.py → modules/LM_aht10.py} +12 -4
  60. micrOS/source/{LM_bme280.py → modules/LM_bme280.py} +13 -25
  61. micrOS/source/{LM_buzzer.py → modules/LM_buzzer.py} +42 -40
  62. micrOS/source/{LM_cct.py → modules/LM_cct.py} +22 -27
  63. micrOS/source/modules/LM_cluster.py +255 -0
  64. micrOS/source/{LM_co2.py → modules/LM_co2.py} +13 -6
  65. micrOS/source/{LM_dht11.py → modules/LM_dht11.py} +13 -29
  66. micrOS/source/{LM_dht22.py → modules/LM_dht22.py} +13 -28
  67. micrOS/source/{LM_dimmer.py → modules/LM_dimmer.py} +19 -16
  68. micrOS/source/modules/LM_distance.py +135 -0
  69. micrOS/source/{LM_ds18.py → modules/LM_ds18.py} +12 -4
  70. micrOS/source/{LM_esp32.py → modules/LM_esp32.py} +16 -4
  71. micrOS/source/modules/LM_espnow.py +53 -0
  72. micrOS/source/modules/LM_fileserver.py +265 -0
  73. micrOS/source/{LM_gameOfLife.py → modules/LM_gameOfLife.py} +5 -5
  74. micrOS/source/{LM_genIO.py → modules/LM_genIO.py} +49 -35
  75. micrOS/source/modules/LM_haptic.py +111 -0
  76. micrOS/source/modules/LM_i2c.py +61 -0
  77. micrOS/source/{LM_i2s_mic.py → modules/LM_i2s_mic.py} +20 -23
  78. micrOS/source/{LM_ld2410.py → modules/LM_ld2410.py} +3 -3
  79. micrOS/source/{LM_light_sensor.py → modules/LM_light_sensor.py} +22 -26
  80. micrOS/source/modules/LM_mh_z19c.py +198 -0
  81. micrOS/source/modules/LM_neoeffects.py +284 -0
  82. micrOS/source/{LM_neopixel.py → modules/LM_neopixel.py} +26 -31
  83. micrOS/source/{LM_oled.py → modules/LM_oled.py} +28 -20
  84. micrOS/source/{LM_oled_sh1106.py → modules/LM_oled_sh1106.py} +28 -24
  85. micrOS/source/{LM_oled_ui.py → modules/LM_oled_ui.py} +132 -174
  86. micrOS/source/modules/LM_pacman.py +320 -0
  87. micrOS/source/{LM_presence.py → modules/LM_presence.py} +24 -36
  88. micrOS/source/modules/LM_qmi8658.py +204 -0
  89. micrOS/source/{LM_rencoder.py → modules/LM_rencoder.py} +40 -11
  90. micrOS/source/modules/LM_rest.py +81 -0
  91. micrOS/source/{LM_rgb.py → modules/LM_rgb.py} +25 -34
  92. micrOS/source/{LM_rgbcct.py → modules/LM_rgbcct.py} +5 -5
  93. micrOS/source/{LM_roboarm.py → modules/LM_roboarm.py} +37 -45
  94. micrOS/source/modules/LM_robustness.py +137 -0
  95. micrOS/source/{LM_rp2w.py → modules/LM_rp2w.py} +3 -0
  96. micrOS/source/{LM_sdcard.py → modules/LM_sdcard.py} +3 -0
  97. micrOS/source/{LM_servo.py → modules/LM_servo.py} +4 -4
  98. micrOS/source/modules/LM_sound_event.py +751 -0
  99. micrOS/source/{LM_stepper.py → modules/LM_stepper.py} +8 -8
  100. micrOS/source/{LM_switch.py → modules/LM_switch.py} +21 -18
  101. micrOS/source/{LM_system.py → modules/LM_system.py} +96 -59
  102. micrOS/source/modules/LM_tcs3472.py +187 -0
  103. micrOS/source/modules/LM_telegram.py +388 -0
  104. micrOS/source/modules/LM_trackball.py +287 -0
  105. micrOS/source/modules/LM_veml7700.py +159 -0
  106. micrOS/source/modules/LM_web.py +38 -0
  107. micrOS/source/urequests.py +204 -91
  108. {toolkit/workspace/precompiled → micrOS/source/web}/dashboard.html +9 -4
  109. micrOS/source/web/editor.js +440 -0
  110. micrOS/source/web/filesui.html +178 -0
  111. micrOS/source/web/filesui.js +338 -0
  112. micrOS/source/{index.html → web/index.html} +44 -2
  113. micrOS/source/web/uapi.js +103 -0
  114. micrOS/source/web/udashboard.js +129 -0
  115. micrOS/source/web/ustyle.css +55 -0
  116. micrOS/source/web/uwidgets.js +172 -0
  117. micrOS/source/web/uwidgets_pro.js +99 -0
  118. micrOS/utests/__init__.py +0 -0
  119. micrOS/utests/test_scheduler.py +435 -0
  120. {micrOSDevToolKit-2.1.5.data → microsdevtoolkit-2.26.1.data}/scripts/devToolKit.py +47 -4
  121. {micrOSDevToolKit-2.1.5.dist-info → microsdevtoolkit-2.26.1.dist-info}/METADATA +392 -279
  122. microsdevtoolkit-2.26.1.dist-info/RECORD +396 -0
  123. {micrOSDevToolKit-2.1.5.dist-info → microsdevtoolkit-2.26.1.dist-info}/WHEEL +1 -1
  124. toolkit/DevEnvCompile.py +63 -33
  125. toolkit/DevEnvOTA.py +72 -22
  126. toolkit/DevEnvUSB.py +147 -77
  127. toolkit/Gateway.py +9 -9
  128. toolkit/LM_to_compile.dat +12 -4
  129. toolkit/MicrOSDevEnv.py +129 -51
  130. toolkit/WebRepl.py +73 -0
  131. toolkit/dashboard_apps/BackupRestore.py +171 -0
  132. toolkit/dashboard_apps/CCTDemo.py +12 -17
  133. toolkit/dashboard_apps/CCTTest.py +20 -24
  134. toolkit/dashboard_apps/CamStream.py +2 -6
  135. toolkit/dashboard_apps/CatGame.py +14 -16
  136. toolkit/dashboard_apps/Dimmer.py +11 -21
  137. toolkit/dashboard_apps/GetVersion.py +11 -19
  138. toolkit/dashboard_apps/MicrophoneTest.py +2 -7
  139. toolkit/dashboard_apps/NeoEffectsDemo.py +22 -35
  140. toolkit/dashboard_apps/NeopixelTest.py +20 -25
  141. toolkit/dashboard_apps/PresenceTest.py +2 -8
  142. toolkit/dashboard_apps/QMI8685_GYRO.py +68 -0
  143. toolkit/dashboard_apps/RGBTest.py +20 -24
  144. toolkit/dashboard_apps/RoboArm.py +24 -32
  145. toolkit/dashboard_apps/SED_test.py +10 -14
  146. toolkit/dashboard_apps/SensorsTest.py +61 -0
  147. toolkit/dashboard_apps/SystemTest.py +219 -117
  148. toolkit/dashboard_apps/Template_app.py +12 -19
  149. toolkit/dashboard_apps/_app_base.py +34 -0
  150. toolkit/dashboard_apps/_gyro_visualizer.py +78 -0
  151. toolkit/dashboard_apps/uLightDemo.py +15 -24
  152. toolkit/index.html +6 -5
  153. toolkit/lib/LocalMachine.py +6 -1
  154. toolkit/lib/MicrosFiles.py +46 -0
  155. toolkit/lib/Repository.py +64 -0
  156. toolkit/lib/TerminalColors.py +4 -0
  157. toolkit/lib/macroScript.py +371 -0
  158. toolkit/lib/micrOSClient.py +124 -51
  159. toolkit/lib/micrOSClientHistory.py +156 -0
  160. toolkit/lib/pip_package_installer.py +31 -4
  161. toolkit/micrOSdashboard.py +16 -21
  162. toolkit/micrOSlint.py +28 -10
  163. toolkit/simulator_lib/.DS_Store +0 -0
  164. micrOS/source/IO_esp32.py → toolkit/simulator_lib/IO_darwin.py +3 -0
  165. toolkit/simulator_lib/__pycache__/IO_darwin.cpython-312.pyc +0 -0
  166. toolkit/simulator_lib/__pycache__/aioespnow.cpython-312.pyc +0 -0
  167. toolkit/simulator_lib/__pycache__/camera.cpython-312.pyc +0 -0
  168. toolkit/simulator_lib/__pycache__/framebuf.cpython-312.pyc +0 -0
  169. toolkit/simulator_lib/__pycache__/machine.cpython-312.pyc +0 -0
  170. toolkit/simulator_lib/__pycache__/micropython.cpython-312.pyc +0 -0
  171. toolkit/simulator_lib/__pycache__/mip.cpython-312.pyc +0 -0
  172. toolkit/simulator_lib/__pycache__/neopixel.cpython-312.pyc +0 -0
  173. toolkit/simulator_lib/__pycache__/network.cpython-312.pyc +0 -0
  174. toolkit/simulator_lib/__pycache__/sim_common.cpython-312.pyc +0 -0
  175. toolkit/simulator_lib/__pycache__/simgc.cpython-312.pyc +0 -0
  176. toolkit/simulator_lib/__pycache__/simulator.cpython-312.pyc +0 -0
  177. toolkit/simulator_lib/__pycache__/uasyncio.cpython-312.pyc +0 -0
  178. toolkit/simulator_lib/__pycache__/uos.cpython-312.pyc +0 -0
  179. toolkit/simulator_lib/__pycache__/urandom.cpython-312.pyc +0 -0
  180. toolkit/simulator_lib/__pycache__/usocket.cpython-312.pyc +0 -0
  181. toolkit/simulator_lib/__pycache__/ussl.cpython-312.pyc +0 -0
  182. toolkit/simulator_lib/aioespnow.py +28 -0
  183. toolkit/simulator_lib/camera.py +84 -0
  184. toolkit/simulator_lib/dht.py +1 -1
  185. toolkit/simulator_lib/framebuf.py +49 -1
  186. toolkit/simulator_lib/machine.py +32 -2
  187. toolkit/simulator_lib/micropython.py +3 -3
  188. toolkit/simulator_lib/mip.py +165 -0
  189. toolkit/simulator_lib/neopixel.py +3 -2
  190. toolkit/simulator_lib/network.py +2 -1
  191. toolkit/simulator_lib/node_config.json +2 -3
  192. toolkit/simulator_lib/ntptime.py +1 -1
  193. toolkit/simulator_lib/{sim_console.py → sim_common.py} +2 -3
  194. toolkit/simulator_lib/simgc.py +6 -2
  195. toolkit/simulator_lib/simulator.py +138 -46
  196. toolkit/simulator_lib/uasyncio.py +34 -3
  197. toolkit/simulator_lib/uos.py +147 -0
  198. toolkit/simulator_lib/urandom.py +4 -0
  199. toolkit/simulator_lib/usocket.py +5 -1
  200. toolkit/simulator_lib/view01.jpg +0 -0
  201. toolkit/simulator_lib/view02.jpg +0 -0
  202. toolkit/socketClient.py +43 -23
  203. toolkit/user_data/webhooks/generic.py +1 -1
  204. toolkit/user_data/webhooks/macro.py +44 -0
  205. toolkit/user_data/webhooks/template.macro +20 -0
  206. toolkit/user_data/webhooks/template.py +1 -1
  207. toolkit/workspace/precompiled/Auth.mpy +0 -0
  208. toolkit/workspace/precompiled/Common.mpy +0 -0
  209. toolkit/workspace/precompiled/Config.mpy +0 -0
  210. toolkit/workspace/precompiled/Debug.mpy +0 -0
  211. toolkit/workspace/precompiled/Espnow.mpy +0 -0
  212. toolkit/workspace/precompiled/Files.mpy +0 -0
  213. toolkit/workspace/precompiled/Hooks.mpy +0 -0
  214. toolkit/workspace/precompiled/InterConnect.mpy +0 -0
  215. toolkit/workspace/precompiled/Interrupts.mpy +0 -0
  216. toolkit/workspace/precompiled/Logger.mpy +0 -0
  217. toolkit/workspace/precompiled/Network.mpy +0 -0
  218. toolkit/workspace/precompiled/Notify.mpy +0 -0
  219. toolkit/workspace/precompiled/Pacman.mpy +0 -0
  220. toolkit/workspace/precompiled/Scheduler.mpy +0 -0
  221. toolkit/workspace/precompiled/Server.mpy +0 -0
  222. toolkit/workspace/precompiled/Shell.mpy +0 -0
  223. toolkit/workspace/precompiled/Tasks.mpy +0 -0
  224. toolkit/workspace/precompiled/Time.mpy +0 -0
  225. toolkit/workspace/precompiled/Types.mpy +0 -0
  226. toolkit/workspace/precompiled/Web.mpy +0 -0
  227. toolkit/workspace/precompiled/_mpy.version +1 -1
  228. toolkit/workspace/precompiled/config/_git.keep +0 -0
  229. toolkit/workspace/precompiled/helpers.mpy +0 -0
  230. toolkit/workspace/precompiled/micrOS.mpy +0 -0
  231. toolkit/workspace/precompiled/micrOSloader.mpy +0 -0
  232. toolkit/workspace/precompiled/microIO.mpy +0 -0
  233. toolkit/workspace/precompiled/modules/IO_esp32.mpy +0 -0
  234. toolkit/workspace/precompiled/modules/IO_esp32c3.mpy +0 -0
  235. toolkit/workspace/precompiled/modules/IO_esp32c6.mpy +0 -0
  236. toolkit/workspace/precompiled/modules/IO_esp32s2.mpy +0 -0
  237. toolkit/workspace/precompiled/modules/IO_esp32s3.mpy +0 -0
  238. toolkit/workspace/precompiled/modules/IO_m5stamp.mpy +0 -0
  239. toolkit/workspace/precompiled/modules/IO_qtpy.mpy +0 -0
  240. toolkit/workspace/precompiled/modules/IO_rp2.mpy +0 -0
  241. toolkit/workspace/precompiled/modules/IO_tinypico.mpy +0 -0
  242. toolkit/workspace/precompiled/modules/LM_L298N.mpy +0 -0
  243. {micrOS/source → toolkit/workspace/precompiled/modules}/LM_L9110_DCmotor.py +4 -4
  244. toolkit/workspace/precompiled/modules/LM_OV2640.mpy +0 -0
  245. toolkit/workspace/precompiled/{LM_VL53L0X.py → modules/LM_VL53L0X.py} +5 -5
  246. toolkit/workspace/precompiled/modules/LM_aht10.mpy +0 -0
  247. toolkit/workspace/precompiled/modules/LM_bme280.mpy +0 -0
  248. toolkit/workspace/precompiled/{LM_buzzer.mpy → modules/LM_buzzer.mpy} +0 -0
  249. toolkit/workspace/precompiled/modules/LM_cct.mpy +0 -0
  250. toolkit/workspace/precompiled/modules/LM_cluster.mpy +0 -0
  251. toolkit/workspace/precompiled/modules/LM_co2.mpy +0 -0
  252. toolkit/workspace/precompiled/modules/LM_dht11.mpy +0 -0
  253. toolkit/workspace/precompiled/modules/LM_dht22.mpy +0 -0
  254. toolkit/workspace/precompiled/modules/LM_dimmer.mpy +0 -0
  255. toolkit/workspace/precompiled/modules/LM_distance.mpy +0 -0
  256. toolkit/workspace/precompiled/modules/LM_ds18.mpy +0 -0
  257. toolkit/workspace/precompiled/{LM_esp32.py → modules/LM_esp32.py} +16 -4
  258. toolkit/workspace/precompiled/modules/LM_espnow.py +53 -0
  259. toolkit/workspace/precompiled/modules/LM_fileserver.mpy +0 -0
  260. toolkit/workspace/precompiled/{LM_gameOfLife.mpy → modules/LM_gameOfLife.mpy} +0 -0
  261. toolkit/workspace/precompiled/modules/LM_genIO.mpy +0 -0
  262. toolkit/workspace/precompiled/modules/LM_haptic.mpy +0 -0
  263. toolkit/workspace/precompiled/modules/LM_i2c.py +61 -0
  264. toolkit/workspace/precompiled/modules/LM_i2s_mic.mpy +0 -0
  265. toolkit/workspace/precompiled/{LM_ld2410.mpy → modules/LM_ld2410.mpy} +0 -0
  266. toolkit/workspace/precompiled/modules/LM_light_sensor.mpy +0 -0
  267. toolkit/workspace/precompiled/modules/LM_mh_z19c.py +198 -0
  268. toolkit/workspace/precompiled/modules/LM_neoeffects.mpy +0 -0
  269. toolkit/workspace/precompiled/modules/LM_neopixel.mpy +0 -0
  270. toolkit/workspace/precompiled/modules/LM_oled.mpy +0 -0
  271. toolkit/workspace/precompiled/modules/LM_oled_sh1106.mpy +0 -0
  272. toolkit/workspace/precompiled/modules/LM_oled_ui.mpy +0 -0
  273. toolkit/workspace/precompiled/modules/LM_pacman.mpy +0 -0
  274. toolkit/workspace/precompiled/modules/LM_presence.mpy +0 -0
  275. toolkit/workspace/precompiled/modules/LM_qmi8658.py +204 -0
  276. toolkit/workspace/precompiled/{LM_rencoder.py → modules/LM_rencoder.py} +40 -11
  277. toolkit/workspace/precompiled/modules/LM_rest.mpy +0 -0
  278. toolkit/workspace/precompiled/modules/LM_rgb.mpy +0 -0
  279. toolkit/workspace/precompiled/{LM_rgbcct.mpy → modules/LM_rgbcct.mpy} +0 -0
  280. toolkit/workspace/precompiled/modules/LM_roboarm.mpy +0 -0
  281. toolkit/workspace/precompiled/modules/LM_robustness.py +137 -0
  282. toolkit/workspace/precompiled/{LM_rp2w.py → modules/LM_rp2w.py} +3 -0
  283. toolkit/workspace/precompiled/{LM_sdcard.py → modules/LM_sdcard.py} +3 -0
  284. toolkit/workspace/precompiled/{LM_servo.mpy → modules/LM_servo.mpy} +0 -0
  285. toolkit/workspace/precompiled/modules/LM_sound_event.mpy +0 -0
  286. toolkit/workspace/precompiled/{LM_stepper.mpy → modules/LM_stepper.mpy} +0 -0
  287. toolkit/workspace/precompiled/modules/LM_switch.mpy +0 -0
  288. toolkit/workspace/precompiled/modules/LM_system.mpy +0 -0
  289. toolkit/workspace/precompiled/modules/LM_tcs3472.py +187 -0
  290. toolkit/workspace/precompiled/modules/LM_telegram.mpy +0 -0
  291. toolkit/workspace/precompiled/{LM_tinyrgb.mpy → modules/LM_tinyrgb.mpy} +0 -0
  292. toolkit/workspace/precompiled/modules/LM_trackball.mpy +0 -0
  293. toolkit/workspace/precompiled/modules/LM_veml7700.mpy +0 -0
  294. toolkit/workspace/precompiled/modules/LM_web.mpy +0 -0
  295. toolkit/workspace/precompiled/urequests.mpy +0 -0
  296. {micrOS/source → toolkit/workspace/precompiled/web}/dashboard.html +9 -4
  297. toolkit/workspace/precompiled/web/editor.js +440 -0
  298. toolkit/workspace/precompiled/web/filesui.html +178 -0
  299. toolkit/workspace/precompiled/web/filesui.js +338 -0
  300. toolkit/workspace/precompiled/{index.html → web/index.html} +44 -2
  301. toolkit/workspace/precompiled/web/uapi.js +103 -0
  302. toolkit/workspace/precompiled/web/udashboard.js +129 -0
  303. toolkit/workspace/precompiled/web/ustyle.css +55 -0
  304. toolkit/workspace/precompiled/web/uwidgets.js +172 -0
  305. toolkit/workspace/precompiled/web/uwidgets_pro.js +99 -0
  306. env/driver_cp210x/CH34XSER_MAC/CH34X_DRV_INSTALL_INSTRUCTIONS.pdf +0 -0
  307. env/driver_cp210x/CH34XSER_MAC/CH34xVCPDriver.pkg +0 -0
  308. micrOS/micropython/esp32-20231005-v1.21.0.bin +0 -0
  309. micrOS/micropython/esp32c3-GENERIC-20240105-v1.22.1.bin +0 -0
  310. micrOS/micropython/esp32c3-GENERIC-20240222-v1.22.2.bin +0 -0
  311. micrOS/micropython/esp32s2-GENERIC-20240105-v1.22.1.bin +0 -0
  312. micrOS/micropython/esp32s2-LOLIN_MINI-20220618-v1.19.1.bin +0 -0
  313. micrOS/micropython/esp32s3-GENERIC-20240105-v1.22.1.bin +0 -0
  314. micrOS/micropython/esp32s3_spiram_oct-20231005-v1.21.0.bin +0 -0
  315. micrOS/micropython/rpi-pico-w-20231005-v1.21.0.uf2 +0 -0
  316. micrOS/micropython/tinypico-20231005-v1.21.0.bin +0 -0
  317. micrOS/micropython/tinypico-usbc-UM-20240105-v1.22.1.bin +0 -0
  318. micrOS/source/LM_L298N_DCmotor.py +0 -86
  319. micrOS/source/LM_catgame.py +0 -74
  320. micrOS/source/LM_dashboard_be.py +0 -37
  321. micrOS/source/LM_demo.py +0 -85
  322. micrOS/source/LM_distance.py +0 -88
  323. micrOS/source/LM_i2c.py +0 -44
  324. micrOS/source/LM_intercon.py +0 -57
  325. micrOS/source/LM_keychain.py +0 -318
  326. micrOS/source/LM_lmpacman.py +0 -126
  327. micrOS/source/LM_neoeffects.py +0 -327
  328. micrOS/source/LM_pet_feeder.py +0 -76
  329. micrOS/source/LM_ph_sensor.py +0 -51
  330. micrOS/source/LM_rest.py +0 -40
  331. micrOS/source/LM_robustness.py +0 -73
  332. micrOS/source/LM_telegram.py +0 -96
  333. micrOS/source/reset.py +0 -11
  334. micrOS/source/uapi.js +0 -76
  335. micrOS/source/udashboard.js +0 -137
  336. micrOS/source/ustyle.css +0 -28
  337. micrOS/source/uwidgets.js +0 -179
  338. micrOSDevToolKit-2.1.5.dist-info/RECORD +0 -337
  339. toolkit/dashboard_apps/AirQualityBME280.py +0 -36
  340. toolkit/dashboard_apps/AirQualityDHT22_CO2.py +0 -36
  341. toolkit/lib/file_extensions.py +0 -16
  342. toolkit/simulator_lib/__pycache__/LP_darwin.cpython-312.pyc +0 -0
  343. toolkit/simulator_lib/__pycache__/LP_darwin.cpython-38.pyc +0 -0
  344. toolkit/simulator_lib/__pycache__/LP_darwin.cpython-39.pyc +0 -0
  345. toolkit/simulator_lib/__pycache__/sim_console.cpython-312.pyc +0 -0
  346. toolkit/simulator_lib/__pycache__/sim_console.cpython-38.pyc +0 -0
  347. toolkit/simulator_lib/__pycache__/sim_console.cpython-39.pyc +0 -0
  348. toolkit/workspace/precompiled/IO_esp32.mpy +0 -0
  349. toolkit/workspace/precompiled/IO_esp32c3.mpy +0 -0
  350. toolkit/workspace/precompiled/IO_esp32s2.mpy +0 -0
  351. toolkit/workspace/precompiled/IO_esp32s3.mpy +0 -0
  352. toolkit/workspace/precompiled/IO_qtpy.mpy +0 -0
  353. toolkit/workspace/precompiled/IO_rp2.mpy +0 -0
  354. toolkit/workspace/precompiled/IO_tinypico.mpy +0 -0
  355. toolkit/workspace/precompiled/LM_L298N_DCmotor.mpy +0 -0
  356. toolkit/workspace/precompiled/LM_OV2640.mpy +0 -0
  357. toolkit/workspace/precompiled/LM_aht10.mpy +0 -0
  358. toolkit/workspace/precompiled/LM_bme280.mpy +0 -0
  359. toolkit/workspace/precompiled/LM_catgame.py +0 -74
  360. toolkit/workspace/precompiled/LM_cct.mpy +0 -0
  361. toolkit/workspace/precompiled/LM_co2.mpy +0 -0
  362. toolkit/workspace/precompiled/LM_dashboard_be.py +0 -37
  363. toolkit/workspace/precompiled/LM_demo.py +0 -85
  364. toolkit/workspace/precompiled/LM_dht11.mpy +0 -0
  365. toolkit/workspace/precompiled/LM_dht22.mpy +0 -0
  366. toolkit/workspace/precompiled/LM_dimmer.mpy +0 -0
  367. toolkit/workspace/precompiled/LM_distance.py +0 -88
  368. toolkit/workspace/precompiled/LM_ds18.mpy +0 -0
  369. toolkit/workspace/precompiled/LM_genIO.mpy +0 -0
  370. toolkit/workspace/precompiled/LM_i2c.py +0 -44
  371. toolkit/workspace/precompiled/LM_i2s_mic.mpy +0 -0
  372. toolkit/workspace/precompiled/LM_intercon.mpy +0 -0
  373. toolkit/workspace/precompiled/LM_keychain.mpy +0 -0
  374. toolkit/workspace/precompiled/LM_light_sensor.mpy +0 -0
  375. toolkit/workspace/precompiled/LM_lmpacman.mpy +0 -0
  376. toolkit/workspace/precompiled/LM_neoeffects.mpy +0 -0
  377. toolkit/workspace/precompiled/LM_neopixel.mpy +0 -0
  378. toolkit/workspace/precompiled/LM_oled.mpy +0 -0
  379. toolkit/workspace/precompiled/LM_oled_sh1106.mpy +0 -0
  380. toolkit/workspace/precompiled/LM_oled_ui.mpy +0 -0
  381. toolkit/workspace/precompiled/LM_pet_feeder.py +0 -76
  382. toolkit/workspace/precompiled/LM_ph_sensor.py +0 -51
  383. toolkit/workspace/precompiled/LM_presence.mpy +0 -0
  384. toolkit/workspace/precompiled/LM_rest.mpy +0 -0
  385. toolkit/workspace/precompiled/LM_rgb.mpy +0 -0
  386. toolkit/workspace/precompiled/LM_roboarm.mpy +0 -0
  387. toolkit/workspace/precompiled/LM_robustness.py +0 -73
  388. toolkit/workspace/precompiled/LM_switch.mpy +0 -0
  389. toolkit/workspace/precompiled/LM_system.mpy +0 -0
  390. toolkit/workspace/precompiled/LM_telegram.mpy +0 -0
  391. toolkit/workspace/precompiled/reset.mpy +0 -0
  392. toolkit/workspace/precompiled/uapi.js +0 -76
  393. toolkit/workspace/precompiled/udashboard.js +0 -137
  394. toolkit/workspace/precompiled/ustyle.css +0 -28
  395. toolkit/workspace/precompiled/uwidgets.js +0 -179
  396. /toolkit/user_data/node_config_archive/.include → /micrOS/source/config/_git.keep +0 -0
  397. /micrOS/source/{IO_rp2.py → modules/IO_rp2.py} +0 -0
  398. /micrOS/source/{LM_tinyrgb.py → modules/LM_tinyrgb.py} +0 -0
  399. {micrOSDevToolKit-2.1.5.dist-info → microsdevtoolkit-2.26.1.dist-info/licenses}/LICENSE +0 -0
  400. {micrOSDevToolKit-2.1.5.dist-info → microsdevtoolkit-2.26.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,326 @@
1
+ """
2
+ Module is responsible for Package management and installation
3
+ Install from
4
+ Package URL (package.json):
5
+ https://github.com/BxNxM/micrOSPackages/tree/main/blinky_example
6
+ github:BxNxM/micrOSPackages/blinky_example
7
+ File URL:
8
+ https://github.com/BxNxM/micrOS/blob/master/toolkit/workspace/precompiled/modules/LM_rgb.mpy
9
+ github:BxNxM/micrOS/toolkit/workspace/precompiled/modules/LM_rgb.mpy
10
+ Default packages:
11
+ by name (micropython doc.)
12
+
13
+ Load Modules in /lib/LM_* will be automatically moved to /modules/LM_* as post install step.
14
+
15
+ Designed by Marcell Ban aka BxNxM
16
+ """
17
+
18
+ from json import load
19
+ from mip import install as mipstall
20
+ from uos import rename, mkdir
21
+ from Files import OSPath, path_join, is_file, ilist_fs, is_dir, remove_file, remove_dir
22
+ from Debug import syslog, console_write
23
+ from urequests import get as uget
24
+
25
+
26
+ # ---------------------------------------------------------------------
27
+ # Utility helpers
28
+ # ---------------------------------------------------------------------
29
+
30
+ def _normalize_source(ref):
31
+ """
32
+ Normalize GitHub URLs or shorthand for mip compatibility.
33
+ Converts:
34
+ - https://github.com/user/repo/blob/branch/path/file.py → https://raw.githubusercontent.com/user/repo/branch/path/file.py
35
+ - https://github.com/user/repo/tree/branch/path → github:user/repo/path
36
+ Returns (normalized_ref, branch)
37
+ """
38
+ try:
39
+ ref = ref.strip().rstrip("/")
40
+ # Already in github: shorthand
41
+ if ref.startswith("github:"):
42
+ return ref, None
43
+
44
+ if ref.startswith("https://"):
45
+ ref = ref.replace("https://", "")
46
+ if ref.startswith("github.com"):
47
+ # Folder (tree) case → github:user/repo/path
48
+ if "/tree/" in ref:
49
+ console_write("[mip-normalize] detected GitHub tree folder link")
50
+ parts = ref.split("/")
51
+ user, repo = parts[1], parts[2]
52
+ branch = parts[4]
53
+ path = "/".join(parts[5:])
54
+ github_ref = f"github:{user}/{repo}/{path}".rstrip("/")
55
+ return github_ref, branch
56
+
57
+ # File (blob) case → raw.githubusercontent.com
58
+ if "/blob/" in ref:
59
+ console_write("[mip-normalize] detected GitHub blob file link")
60
+ url_base = "https://raw.githubusercontent.com/"
61
+ ref = ref.replace("github.com/", url_base).replace("/blob", "")
62
+ return ref, None
63
+
64
+ # Direct GitHub file (no blob/tree) → github:user/repo/path
65
+ if ref.count("/") >= 2:
66
+ console_write("[mip-normalize] direct GitHub path (no blob/tree)")
67
+ parts = ref.split("/")
68
+ user, repo = parts[1], parts[2]
69
+ path = "/".join(parts[3:])
70
+ github_ref = f"github:{user}/{repo}/{path}".rstrip("/")
71
+ return github_ref, None
72
+
73
+ console_write("[mip-normalize] unchanged")
74
+ return ref, None
75
+
76
+ except Exception as e:
77
+ syslog(f"[ERR][pacman] normalize failed: {ref}: {e}")
78
+ return str(ref), None
79
+
80
+
81
+ def _protected_resource(source_name):
82
+ return source_name.split(".")[0] in ("LM_system", "LM_pacman", "LM_cluster")
83
+
84
+
85
+ def _unpack_from_pacman_json(path:str, packages:tuple) -> tuple[bool, str]:
86
+ """
87
+ Unpack Load Modules and other resources based on pacman.json
88
+ :param path: packages library path (default: /lib)
89
+ :param packages: list of package names, but least one to unpack
90
+ """
91
+ verdict = ""
92
+ # Check all input packages
93
+ for pack in packages:
94
+ pack_meta_path = path_join(path, pack, 'pacman.json')
95
+ if is_file(pack_meta_path):
96
+ verdict += f"\n UNPACKING {pack_meta_path}"
97
+ # Load package layout metadata
98
+ try:
99
+ with open(pack_meta_path, 'r') as p:
100
+ layout = load(p).get('layout', {})
101
+ except Exception as e:
102
+ syslog(f"[ERR] Package unpack {pack_meta_path}: {e}")
103
+ layout = {}
104
+ # Unpack files based on layout metadata
105
+ for target, source_list in layout.items():
106
+ # Restrict write access for /config/*
107
+ if target.lstrip("/").startswith("config"):
108
+ verdict += f"\n ✗ Protected target dir: {target}"
109
+ continue
110
+ target_dir = path_join(OSPath._ROOT, target)
111
+ for source in source_list:
112
+ source_path = path_join(path, source)
113
+ source_name = source.split('/')[-1] if '/' in source else source
114
+ if _protected_resource(source_name):
115
+ verdict += f"\n ! Unpack skip - protected target: {source_name}"
116
+ continue
117
+ if is_file(source_path):
118
+ try:
119
+ if not is_dir(target_dir):
120
+ # Support single-level child dir
121
+ mkdir(target_dir)
122
+ except Exception as e:
123
+ verdict += f"\n ✗ Unpack subdir error {target_dir}: {e}"
124
+ try:
125
+ rename(source_path, path_join(target_dir, source_name))
126
+ verdict += f"\n ✓ Unpacked {source} -> {target_dir}"
127
+ except Exception as e:
128
+ verdict += f"\n ✗ Unpack error {source}: {e}"
129
+ elif not is_file(path_join(target_dir, source)):
130
+ # Check already unpacked target resource
131
+ verdict += f"\n ✗ Unpack error: {source} not exists"
132
+ return "\nNothing to unpack" if verdict == "" else verdict
133
+
134
+
135
+ # ---------------------------------------------------------------------
136
+ # Core installer
137
+ # ---------------------------------------------------------------------
138
+
139
+ def _install_any(ref, target=None):
140
+ """Internal wrapper with consistent error handling and debug output."""
141
+ verdict = f"[mip] Installing: {ref}\n"
142
+ try:
143
+ ref, branch = _normalize_source(ref)
144
+ kwargs = {}
145
+ if branch:
146
+ kwargs["version"] = branch
147
+ kwargs["target"] = target or OSPath.LIB
148
+ verdict = f"[mip] Installing: {ref} {kwargs}\n"
149
+ # MIP Install
150
+ mipstall(ref, **kwargs)
151
+ verdict += f" ✓ Installed under {kwargs['target']}"
152
+ except Exception as e:
153
+ err = f" ✗ Failed to install '{ref}': {e}"
154
+ syslog(f"[ERR][pacman] {err}")
155
+ verdict += err
156
+ return verdict
157
+
158
+
159
+ # ---------------------------------------------------------------------
160
+ # Public install functions
161
+ # ---------------------------------------------------------------------
162
+
163
+ def install_requirements(source="requirements.txt"):
164
+ """Install from a requirements.txt file under /config."""
165
+ source_path = path_join(OSPath.CONFIG, source)
166
+ verdict = f"[mip] Installing from requirements file: {source_path}\n"
167
+ if is_file(source_path):
168
+ with open(source_path, "r") as f:
169
+ for req in f:
170
+ try:
171
+ verdict += _install_any(req, target=OSPath.LIB) + "\n"
172
+ except Exception as e:
173
+ err = f" ✗ Failed to process {source}: {e}"
174
+ syslog(f"[ERR][pacman] {err}")
175
+ verdict += err
176
+ verdict += " ✓ All listed packages processed"
177
+ else:
178
+ err = f" ✗ {source_path} not exists"
179
+ syslog(f"[ERR][pacman] {err}")
180
+ verdict += err
181
+ return verdict
182
+
183
+
184
+ def unpack(ref:str=None):
185
+ """
186
+ Unpack downloaded package from /lib
187
+ - use pacman.json metadata layout to unpack files to multiple targets
188
+ :param ref: install reference (extract package name from this)
189
+ """
190
+
191
+ if ref is None:
192
+ # Collect all package names under /lib and unpack all
193
+ packages = tuple(ilist_fs(OSPath.LIB, type_filter='d'))
194
+ else:
195
+ # Handle single explicit ref for unpacking
196
+ ref_parts = [p for p in ref.split("/") if p]
197
+ pack_name = ref_parts[-2] if '.' in ref_parts[-1] else ref_parts[-1]
198
+ packages = (pack_name, )
199
+
200
+ return _unpack_from_pacman_json(OSPath.LIB, packages)
201
+
202
+ # ---------------------------------------------------------------------
203
+ # Unified entry point
204
+ # ---------------------------------------------------------------------
205
+
206
+ def install(ref):
207
+ """
208
+ Unified mip-based installer for micrOS.
209
+ Automatically detects:
210
+ - requirements.txt files (local)
211
+ - Single-file load modules (LM_/IO_ names or URLs)
212
+ - GitHub or raw URLs (tree/blob/github:)
213
+ - Official MicroPython packages
214
+ """
215
+
216
+ if not ref:
217
+ return "[mip] Nothing to install (empty input)"
218
+
219
+ # 1. Install from requirements.txt
220
+ if ref == "requirements.txt":
221
+ verdict = install_requirements(ref)
222
+ verdict += unpack()
223
+ return verdict
224
+
225
+ # 2. Install from URL or Shorthand file / package reference
226
+ if ref.startswith("github") or ref.startswith("http"):
227
+ # 2.1. Exact file ref: LM_/IO_ load modules → /modules
228
+ if ref.endswith("py") and ("LM_" in ref or "IO_" in ref):
229
+ return _install_any(ref, target=OSPath.MODULES)
230
+
231
+ # 2.2. Package ref: GitHub or raw URLs → /lib
232
+ verdict = _install_any(ref, target=OSPath.LIB)
233
+ verdict += unpack(ref)
234
+ return verdict
235
+
236
+ # 3. Fallback/Official micropython package → /lib
237
+ return _install_any(ref, target=OSPath.LIB)
238
+
239
+
240
+ def uninstall(package_name):
241
+ """
242
+ Uninstalls package from /lib with its dependencies
243
+ :param package_name: package name under /lib
244
+ """
245
+ pack_path = path_join(OSPath.LIB, package_name)
246
+ pack_meta = path_join(pack_path, "pacman.json")
247
+
248
+ if not is_dir(pack_path):
249
+ return f"✗ No packaged found: {pack_path}"
250
+
251
+ verdict = f"Uninstall {package_name}\n"
252
+ if is_file(pack_meta):
253
+ # Load package layout metadata
254
+ try:
255
+ with open(pack_meta, 'r') as p:
256
+ layout = load(p).get('layout', {})
257
+ except Exception as e:
258
+ syslog(f"[ERR] Package uninstall {pack_meta}: {e}")
259
+ layout = {}
260
+
261
+ for target, source_list in layout.items():
262
+ # Restrict write access for /config/*
263
+ if target.lstrip("/").startswith("config"):
264
+ verdict += f" ✗ Protected target dir: {target}\n"
265
+ continue
266
+ target_dir = path_join(OSPath._ROOT, target)
267
+ for source in source_list:
268
+ source_name = source.split('/')[-1] if '/' in source else source
269
+ if _protected_resource(source_name):
270
+ verdict += f" ✗ Remove skip - protected target: {source_name}\n"
271
+ continue
272
+ unpacked_path = path_join(target_dir, source_name)
273
+ if is_file(unpacked_path):
274
+ remove_file(unpacked_path)
275
+ verdict += f" ✓ Removed: {unpacked_path}\n"
276
+
277
+ # Delete package
278
+ verdict += " " + remove_dir(pack_path)
279
+ return verdict
280
+
281
+ def upgrade(package_name, force=False):
282
+ """
283
+ Update package based on package name and paccman.json[versions][package]
284
+ - embeds unified mip-based installer for micrOS.: install paccman.json[url]
285
+ :param package_name: package name under /lib
286
+ :param force: skip version check
287
+ """
288
+ pack_path = path_join(OSPath.LIB, package_name)
289
+ pack_meta = path_join(pack_path, "pacman.json")
290
+
291
+ if not is_dir(pack_path) or not is_file(pack_meta):
292
+ return f"✗ No packaged (metadata) found: {pack_path}"
293
+
294
+ verdict = f"Upgrade: collecting package info {package_name}\n"
295
+ # 1. Get local package info
296
+ with open(pack_meta, 'r') as f:
297
+ pm_json = load(f)
298
+ current_version = pm_json.get("versions", {"package": "0.0.0"}).get("package")
299
+ package_url = pm_json.get("url", "")
300
+ # 2. Get latest package version
301
+ latest_version = current_version
302
+ if package_url:
303
+ _part1 = '/'.join(package_url.split(':', 1)[1].split('/', 2)[:2])
304
+ _part2 = package_url.split(':', 1)[1].split('/', 2)[2]
305
+ package_json_url = f"https://raw.githubusercontent.com/{_part1}/refs/heads/main/{_part2}/package.json"
306
+ try:
307
+ code, body = uget(url=package_json_url, sock_size=256, jsonify=True)
308
+ if code == 200:
309
+ # Set remote/latest version for real
310
+ latest_version = body.get("version", current_version)
311
+ else:
312
+ verdict += f" ✗ Failed to retrieve remote version, code: {code}"
313
+ del body # Cleanup
314
+ except Exception as e:
315
+ verdict += f" ✗ Failed to retrieve remote version: {e}"
316
+
317
+ # Evaluate package upgrade request
318
+ if force or current_version != latest_version:
319
+ if package_url:
320
+ verdict += f" ✓ Upgrade package ({current_version}->{latest_version}): {package_url}\n"
321
+ verdict += install(package_url)
322
+ else:
323
+ verdict += f" ✗ Skip upgrade, package URL unavailable: {package_url}\n"
324
+ else:
325
+ verdict += f" ✓ Skip upgrade, up-to-date: {current_version} == {latest_version}\n"
326
+ return verdict
@@ -1,8 +1,9 @@
1
1
  from time import localtime
2
2
  from re import compile
3
- from Tasks import exec_lm_core_schedule
4
- from Debug import console_write, errlog_add
3
+ from Tasks import exec_lm_pipe_schedule
4
+ from Debug import console_write, syslog
5
5
  from Time import Sun, suntime, ntp_time
6
+ from Config import cfgget
6
7
 
7
8
  """
8
9
  # SYSTEM TIME FORMAT: Y, M, D, H, M, S, WD, YD
@@ -16,39 +17,6 @@ S: 0-59
16
17
 
17
18
  LAST_CRON_TASKS = []
18
19
 
19
- '''
20
- #############################
21
- # SYSTEM TEST MODULES #
22
- #############################
23
-
24
- def system_time_generator(max=100000000):
25
-
26
- def systime(sec):
27
- h = int(sec / 60 / 60) % 24
28
- m = int(sec / 60 % 60)
29
- s = sec % 60
30
- wd = int(sec / 60 / 60 / 24) % 7
31
- day = int(sec / 60 / 60 / 24) % 30
32
- return 2020, 9, day, h, m, s, wd, 0
33
-
34
- generator = (systime(sec) for sec in range(0, max, 3))
35
- return generator
36
-
37
- def dummy_irq(cron_data, irqperiod):
38
- from time import sleep
39
- while True:
40
- scheduler(cron_data, irqperiod)
41
- sleep(0.00001)
42
-
43
- ##### TEST CODE INIT #####
44
- # Create time gen (use instead localtime)
45
- GEN = system_time_generator()
46
- from ConfigHandler import cfgget
47
- # Emulate scheduler execution ... LOOP
48
- dummy_irq(cfgget('crontasks'), int(cfgget('timirqseq')/1000))
49
- '''
50
-
51
-
52
20
  #############################
53
21
  # SCHEDULER FUNCTIONS #
54
22
  #############################
@@ -101,7 +69,7 @@ def __resolve_time_tag(check_time, crontask):
101
69
  # Resolve tag
102
70
  value = Sun.TIME.get(tag, None)
103
71
  if value is None or len(value) < 3:
104
- errlog_add(f'[ERR] cron syntax error: {tag}:{value}')
72
+ syslog(f'[ERR] cron syntax error: {tag}:{value}')
105
73
  return ()
106
74
 
107
75
  # Update check_time with resolved value by tag
@@ -179,14 +147,14 @@ def __scheduler_trigger(cron_time_now, crontask, deltasec=2):
179
147
  lm_state = False
180
148
  if isinstance(crontask[1], str):
181
149
  # [1] Execute Load Module as a string (user LMs)
182
- lm_state = exec_lm_core_schedule(crontask[1].split())
150
+ lm_state = exec_lm_pipe_schedule(crontask[1])
183
151
  else:
184
152
  try:
185
153
  # [2] Execute function reference (built-in functions)
186
154
  console_write(f"[builtin cron] {crontask[1]()}")
187
155
  lm_state = True
188
156
  except Exception as e:
189
- errlog_add(f"[ERR] cron function exec error: {e}")
157
+ syslog(f"[ERR] cron function exec error: {e}")
190
158
  if not lm_state:
191
159
  console_write(f"[cron]now[{cron_time_now}] \
192
160
  {__convert_sec_to_time(tolerance_min_sec)} <-> {__convert_sec_to_time(tolerance_max_sec)} \
@@ -202,11 +170,12 @@ def __scheduler_trigger(cron_time_now, crontask, deltasec=2):
202
170
  return False
203
171
 
204
172
 
205
- def deserialize_raw_input(cron_data):
173
+ def deserialize_raw_tasks():
206
174
  """
207
175
  Scheduler/Cron input string format
208
- :param cron_data: raw cron tasks, time based task execution input (bytearray)
176
+ cron_data: raw cron tasks, time based task execution input (str)
209
177
  example: WD:H:M:S!LM func;WD:H:M:S!LM func; ...
178
+ multi command example: WD:H:M:S!LM func;LM func2;; WD:H:M:S!LM func;; ...
210
179
 
211
180
  time_tag: timestamp / time-tag aka suntime
212
181
  timestamp: WD:H:M:S
@@ -217,29 +186,23 @@ def deserialize_raw_input(cron_data):
217
186
  task: LoadModule function args
218
187
  Returns tuple: (("WD:H:M:S", 'LM FUNC'), ("WD:H:M:S", 'LM FUNC'), ...)
219
188
  """
189
+ cron_data:str = cfgget('crontasks')
220
190
  try:
221
- # Parse and create return - convert cron_data (bytearray) to string
222
- return (tuple(cron.split('!')) for cron in str(cron_data, 'utf-8').split(';'))
191
+ # Parse and create return
192
+ sep = ';;' if ';;' in cron_data else ';' # support multi command with ;;
193
+ return (tuple(cron.split('!')) for cron in cron_data.split(sep))
223
194
  except Exception as e:
224
- errlog_add(f"[ERR] cron deserialize - syntax error: {e}")
195
+ syslog(f"[ERR] cron deserialize - syntax error: {e}")
225
196
  return ()
226
197
 
227
198
 
228
- def scheduler(cron_data, irqperiod):
199
+ def scheduler(irqperiod:int):
229
200
  """
230
- :param cron_data: bytearray data (check syntax down below)
231
- :param irqperiod: - in sec
232
- RAW INPUT SYNTAX:
233
- 'WD:H:M:S!CMD;WD:H:M:S!CMD2;...'
234
- RAW INPUT SYNTAX TAG SUPPORT:
235
- 'sunrise!CMD;sunset!CMD'
236
- ! - execute
237
- ; - cron task separator
201
+ :param irqperiod: sampling period in seconds
238
202
  """
239
203
  builtin_tasks = (("*:3:0:0", suntime), ("*:3:5:0", ntp_time))
240
204
  state = False
241
205
  time_now = localtime()[3:7]
242
- # time_now = next(GEN) # USE FOR TESTING (time machine)
243
206
 
244
207
  # Actual time - WD, H, M, S
245
208
  cron_time_now = (time_now[3], time_now[0], time_now[1], time_now[2])
@@ -249,9 +212,9 @@ def scheduler(cron_data, irqperiod):
249
212
  for cron in builtin_tasks:
250
213
  state |= __scheduler_trigger(cron_time_now, cron, deltasec=irqperiod)
251
214
  # Check user tasks (str)
252
- for cron in deserialize_raw_input(cron_data):
215
+ for cron in deserialize_raw_tasks():
253
216
  state |= __scheduler_trigger(cron_time_now, cron, deltasec=irqperiod)
254
217
  return state
255
218
  except Exception as e:
256
- errlog_add(f'[ERR] cron callback error: {e}')
219
+ syslog(f'[ERR] cron callback error: {e}')
257
220
  return False