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
@@ -1,7 +1,8 @@
1
1
  from machine import Pin
2
2
  import micropython
3
3
  from Common import socket_stream, syslog
4
- from microIO import physical_pin, pinmap_dump
4
+ from microIO import bind_pin, pinmap_search
5
+ from Types import resolve
5
6
 
6
7
  # https://www.coderdojotc.org/micropython/sensors/10-rotary-encoder/
7
8
 
@@ -42,27 +43,43 @@ class Rotary:
42
43
 
43
44
  class Data:
44
45
  ROTARY_OBJ = None
45
- VAL = 0
46
46
  EVENT = True
47
+ VAL = 0
48
+ MIN_VAL = 0
49
+ MAX_VAL = 20
50
+ COLOR = (None, ())
47
51
 
48
52
 
49
53
  def _rotary_changed(change):
50
54
  if change == Rotary.ROT_CW:
51
55
  Data.EVENT = True
52
56
  Data.VAL = Data.VAL + 1
57
+ if Data.VAL > Data.MAX_VAL:
58
+ Data.VAL = Data.MIN_VAL
53
59
  elif change == Rotary.ROT_CCW:
54
60
  Data.EVENT = True
55
61
  Data.VAL = Data.VAL - 1
62
+ if Data.VAL < Data.MIN_VAL:
63
+ Data.VAL = Data.MAX_VAL
64
+ # Color on neopixel
65
+ if callable(Data.COLOR[0]):
66
+ try:
67
+ r, g, b = Data.COLOR[1][Data.VAL]
68
+ Data.COLOR[0](r, g, b)
69
+ except Exception as e:
70
+ syslog(f"[ERR] rencoder color: {e}")
56
71
 
57
72
 
58
- def load_n_init():
73
+ def load(min_val=0, max_val=20):
59
74
  """
60
75
  Create rotary encoder
61
76
  """
62
77
  if Data.ROTARY_OBJ is None:
63
78
  # GPIO Pins 33 and 35 are for the encoder pins.
64
- Data.ROTARY_OBJ = Rotary(physical_pin('rot_dt'), physical_pin('rot_clk'))
65
- Data.VAL = 0
79
+ Data.ROTARY_OBJ = Rotary(bind_pin('rot_dt'), bind_pin('rot_clk'))
80
+ Data.MIN_VAL = min_val
81
+ Data.MAX_VAL = max_val
82
+ Data.VAL = min_val
66
83
  Data.ROTARY_OBJ.add_handler(_rotary_changed)
67
84
  return 'Init RotaryEncoder with IRQs.'
68
85
 
@@ -72,7 +89,7 @@ def read_state(msgobj=None):
72
89
  """
73
90
  Read rotary encoder status / relative position
74
91
  """
75
- load_n_init()
92
+ load()
76
93
  if msgobj is not None:
77
94
  if Data.EVENT:
78
95
  msgobj(f"[stream] RotaryState: {Data.VAL}")
@@ -87,19 +104,31 @@ def reset_state():
87
104
  Reset rotary encoder state to 0
88
105
  """
89
106
  msg = f"Reset state {Data.VAL} -> 0"
90
- Data.VAL = 0
107
+ Data.VAL = Data.MIN_VAL
91
108
  return msg
92
109
 
93
110
 
94
- def pinmap(widgets=False):
111
+ def pinmap():
95
112
  """
96
113
  [i] micrOS LM naming convention
97
114
  Load Module built-in help message
98
115
  :return tuple: list of functions implemented by this application (widgets=False)
99
116
  :return tuple: list of widget json for UI generation (widgets=True)
100
117
  """
101
- return pinmap_dump(['rot_clk', 'rot_dt'])
118
+ return pinmap_search(['rot_clk', 'rot_dt'])
119
+
120
+
121
+ def color_indicator():
122
+ """Encoder visualization on LED colors (LM_neopixel)"""
123
+ from LM_neopixel import color
124
+ palette_template = ((20, 0, 0), (10, 10, 0), (0, 20, 0), (0, 10, 10), (0, 0, 20))
125
+ repeat = int(Data.MAX_VAL / len(palette_template))+1
126
+ palette = palette_template * repeat
127
+ Data.COLOR = (color, palette)
128
+ color(0, 0, 0) # initial color OFF
129
+ return palette
102
130
 
103
131
 
104
- def help():
105
- return 'load_n_init', 'read_state', 'reset_state', 'pinmap'
132
+ def help(widgets=False):
133
+ return resolve(('load min_val=0 max_val=20', 'TEXTBOX read_state',
134
+ 'reset_state', 'color_indicator', 'pinmap'), widgets=widgets)
@@ -0,0 +1,81 @@
1
+ from urequests import get as http_get
2
+ from urequests import aget as http_aget
3
+ from Common import micro_task
4
+
5
+
6
+ class Rest:
7
+ GATEWAY_HOST = None
8
+
9
+
10
+ def load(gateway_url=None):
11
+ """
12
+ Set gateway url aka main domain
13
+ :param gateway_url: base url of gateway, like: http://gateway.local:5005
14
+ """
15
+ if gateway_url is None:
16
+ if Rest.GATEWAY_HOST is None:
17
+ return 'Missing Gateway url'
18
+ return Rest.GATEWAY_HOST
19
+ if gateway_url.startswith("http"):
20
+ Rest.GATEWAY_HOST = gateway_url
21
+ else:
22
+ return f"URL have to starts with http/https"
23
+ return f'Gateway url: {gateway_url}'
24
+
25
+
26
+ def _subdomain(subdomain):
27
+ if Rest.GATEWAY_HOST is None:
28
+ raise Exception('Missing Gateway url')
29
+ if not subdomain.startswith('/'):
30
+ subdomain = '/' + subdomain
31
+ domain = f'{Rest.GATEWAY_HOST}{subdomain}'
32
+ return domain
33
+
34
+
35
+ def url(subdomain):
36
+ """
37
+ Execute rest call with given subdomain / url
38
+ :param subdomain: url parameter, http(s) full url or gateway subdomain like: /webhooks/template
39
+ """
40
+ if subdomain.startswith('http'):
41
+ domain = subdomain
42
+ else:
43
+ domain = _subdomain(subdomain)
44
+ status_code, response = http_get(domain, jsonify=True)
45
+ return {'status': status_code, 'response': response}
46
+
47
+
48
+ async def __task(subdomain, tag):
49
+ with micro_task(tag=tag) as my_task:
50
+ my_task.out = f"GET {subdomain}"
51
+ if subdomain.startswith('http'):
52
+ domain = subdomain
53
+ else:
54
+ domain = _subdomain(subdomain)
55
+ status_code, response = await http_aget(domain, jsonify=True)
56
+ my_task.out = f'status: {status_code}, response: {response}'
57
+ return {'status': status_code, 'response': response}
58
+
59
+
60
+ def aurl(subdomain):
61
+ """
62
+ Execute async rest call with given subdomain / url
63
+ :param subdomain: url parameter, http(s) full url or gateway subdomain like: /webhooks/template
64
+ """
65
+ # [!] ASYNC TASK CREATION [1*] with async task callback + taskID (TAG) handling
66
+ tag = "rest." + subdomain.replace("http://", '').replace("https://", '')
67
+ if len(tag) > 50:
68
+ tag = tag[0:50]
69
+ return micro_task(tag=tag, task=__task(subdomain, tag))
70
+
71
+
72
+ def help(widgets=False):
73
+ """
74
+ [i] micrOS LM naming convention - built-in help message
75
+ :return tuple:
76
+ (widgets=False) list of functions implemented by this application
77
+ (widgets=True) list of widget json for UI generation
78
+ """
79
+ return ('load gateway_url=<http://gateway.local:5005>',
80
+ 'url subdomain=</webhooks/template>',
81
+ 'aurl subdomain=</webhooks/template>')
@@ -2,11 +2,9 @@
2
2
  # ANALOG rgb CONTROLLER PARAMS #
3
3
  #########################################
4
4
  from machine import Pin, PWM
5
- from sys import platform
6
- from Common import transition_gen, micro_task
7
- import uasyncio as asyncio
5
+ from Common import transition_gen, micro_task, data_dir
8
6
  from utime import sleep_ms
9
- from microIO import physical_pin, pinmap_dump
7
+ from microIO import bind_pin, pinmap_search
10
8
  from random import randint
11
9
  from Types import resolve
12
10
 
@@ -21,31 +19,27 @@ class Data:
21
19
  CH_MAX = 1000 # maximum value per channel
22
20
  TASK_STATE = False
23
21
  RGB_TASK_TAG = "rgb._tran"
22
+ FILE_CACHE = data_dir('rgb.cache')
24
23
 
25
24
 
26
25
  #########################################
27
26
  # ANALOG rgb WITH 3 channel PWM #
28
27
  #########################################
29
28
 
30
- def __RGB_init():
29
+ def __RGB_init(red_pin=None, green_pin=None, blue_pin=None):
31
30
  if Data.RGB_OBJS[0] is None or Data.RGB_OBJS[1] is None or Data.RGB_OBJS[2] is None:
32
- red = Pin(physical_pin('redgb'))
33
- green = Pin(physical_pin('rgreenb'))
34
- blue = Pin(physical_pin('rgbue'))
35
- if platform == 'esp8266':
36
- Data.RGB_OBJS = (PWM(red, freq=1024),
37
- PWM(green, freq=1024),
38
- PWM(blue, freq=1024))
39
- else:
40
- Data.RGB_OBJS = (PWM(red, freq=20480),
41
- PWM(green, freq=20480),
42
- PWM(blue, freq=20480))
31
+ red = Pin(bind_pin('redgb', red_pin))
32
+ green = Pin(bind_pin('rgreenb', green_pin))
33
+ blue = Pin(bind_pin('rgbue', blue_pin))
34
+ Data.RGB_OBJS = (PWM(red, freq=20480),
35
+ PWM(green, freq=20480),
36
+ PWM(blue, freq=20480))
43
37
  return Data.RGB_OBJS
44
38
 
45
39
 
46
40
  def __persistent_cache_manager(mode):
47
41
  """
48
- pds - persistent data structure
42
+ File state cache
49
43
  modes:
50
44
  r - recover, s - save
51
45
  """
@@ -53,12 +47,12 @@ def __persistent_cache_manager(mode):
53
47
  return
54
48
  if mode == 's':
55
49
  # SAVE CACHE
56
- with open('rgb.pds', 'w') as f:
50
+ with open(Data.FILE_CACHE, 'w') as f:
57
51
  f.write(','.join([str(k) for k in Data.RGB_CACHE]))
58
52
  return
59
53
  try:
60
54
  # RESTORE CACHE
61
- with open('rgb.pds', 'r') as f:
55
+ with open(Data.FILE_CACHE, 'r') as f:
62
56
  Data.RGB_CACHE = [float(data) for data in f.read().strip().split(',')]
63
57
  except:
64
58
  pass
@@ -74,20 +68,18 @@ def __state_machine(r, g, b):
74
68
  __persistent_cache_manager('s')
75
69
 
76
70
 
77
- def load_n_init(cache=None):
71
+ def load(red_pin=None, green_pin=None, blue_pin=None, cache=True):
78
72
  """
79
73
  Initiate RGB module
80
- :param cache bool: file state machine cache: True/False/None(default: automatic True)
81
- - Load .pds (state machine cache) for this load module
82
- - Apply loaded states to gpio pins (boot function)
74
+ :param red_pin: optional red color pin to overwrite built-in
75
+ :param green_pin: optional green color pin to overwrite built-in
76
+ :param blue_pin: optional blue color pin to overwrite built-in
77
+ :param cache: file state machine cache: True/False (.cache), default=True
83
78
  :return str: Cache state
84
79
  """
85
- from sys import platform
86
- if cache is None:
87
- Data.PERSISTENT_CACHE = False if platform == 'esp8266' else True
88
- else:
89
- Data.PERSISTENT_CACHE = cache
80
+ Data.PERSISTENT_CACHE = cache
90
81
  __persistent_cache_manager('r') # recover data cache if enabled
82
+ __RGB_init(red_pin, green_pin, blue_pin)
91
83
  if Data.RGB_CACHE[3] == 1:
92
84
  Data.RGB_CACHE[3] = 0 # Force ON at boot
93
85
  toggle(True)
@@ -240,7 +232,7 @@ def transition(r=None, g=None, b=None, sec=1.0, wake=False):
240
232
  Data.RGB_CACHE[1] = _g if _g > 5 else 5 # SAVE VALUE TO CACHE > 5 ! because toggle
241
233
  Data.RGB_CACHE[2] = _b if _b > 5 else 5 # SAVE VALUE TO CACHE > 5 ! because toggle
242
234
  my_task.out = f"Dimming: R:{_r} G:{_g} B:{_b}"
243
- await asyncio.sleep_ms(ms_period)
235
+ await my_task.feed(sleep_ms=ms_period)
244
236
  if Data.RGB_CACHE[3] == 1 or wake:
245
237
  __state_machine(_r, _g, _b)
246
238
  my_task.out = f"Dimming DONE: R:{_r} G:{_g} B:{_b}"
@@ -254,8 +246,7 @@ def transition(r=None, g=None, b=None, sec=1.0, wake=False):
254
246
  # Create transition generator and calculate step_ms
255
247
  rgb_gen, step_ms = transition_gen(r_from, r, g_from, g, b_from, b, interval_sec=sec)
256
248
  # [!] ASYNC TASK CREATION [1*] with async task callback + taskID (TAG) handling
257
- state = micro_task(tag=Data.RGB_TASK_TAG, task=_task(ms_period=step_ms, iterable=rgb_gen))
258
- return "Starting transition" if state else "Transition already running"
249
+ return micro_task(tag=Data.RGB_TASK_TAG, task=_task(ms_period=step_ms, iterable=rgb_gen))
259
250
 
260
251
 
261
252
  def random(smooth=True, max_val=1000):
@@ -303,7 +294,7 @@ def pinmap():
303
294
  - info which pins to use for this application
304
295
  :return dict: pin name (str) - pin value (int) pairs
305
296
  """
306
- return pinmap_dump(['redgb', 'rgreenb', 'rgbue'])
297
+ return pinmap_search(['redgb', 'rgreenb', 'rgbue'])
307
298
 
308
299
 
309
300
  def help(widgets=False):
@@ -313,8 +304,8 @@ def help(widgets=False):
313
304
  (widgets=False) list of functions implemented by this application
314
305
  (widgets=True) list of widget json for UI generation
315
306
  """
316
- return resolve(( 'COLOR color r=<0-1000> g b smooth=True force=True',
317
- 'TOGGLE toggle state smooth=True', 'load_n_init',
307
+ return resolve(( 'COLOR color r=<0-1000-10> g b smooth=True force=True',
308
+ 'BUTTON toggle state=<True,False> smooth=True', 'load',
318
309
  'SLIDER brightness percent=<0-100> smooth=True wake=True',
319
310
  'transition r=None g=None b=None sec=1.0 wake=False',
320
311
  'BUTTON random smooth=True max_val=1000',
@@ -3,12 +3,12 @@ import LM_cct
3
3
  from Types import resolve
4
4
 
5
5
 
6
- def load_n_init(cache=None):
6
+ def load(cache=None):
7
7
  """
8
8
  Unified rgb and cct module usage as one module
9
9
  """
10
- s1 = LM_rgb.load_n_init(cache)
11
- s2 = LM_cct.load_n_init(cache)
10
+ s1 = LM_rgb.load(cache)
11
+ s2 = LM_cct.load(cache)
12
12
  return f'RGB: {s1}, CCT: {s2}'
13
13
 
14
14
 
@@ -59,7 +59,7 @@ def help(widgets=False):
59
59
  (widgets=False) list of functions implemented by this application
60
60
  (widgets=True) list of widget json for UI generation
61
61
  """
62
- return resolve(('load_n_init',
63
- 'BUTTON toggle state smooth=True',
62
+ return resolve(('load',
63
+ 'BUTTON toggle state=<True,False> smooth=True',
64
64
  'SLIDER brightness percent smooth=True wake=True',
65
65
  'status', 'pinmap'), widgets=widgets)
@@ -1,10 +1,9 @@
1
1
  from utime import sleep_ms
2
2
  from random import randint
3
3
  import LM_servo as servo
4
- from LM_switch import set_state
5
- from LM_switch import pinmap as pm
6
- from Common import transition, micro_task
7
- import uasyncio as asyncio
4
+ from LM_switch import set_state, pinmap as switch_pinmap
5
+ from Common import transition, micro_task, data_dir
6
+ from Types import resolve
8
7
 
9
8
 
10
9
  class RoboArm:
@@ -14,29 +13,30 @@ class RoboArm:
14
13
  SPEED_MS = 10 # Set default speed between steps (ms)
15
14
  MOVE_RECORD = [] # Buffer for XY move record/replay
16
15
  PLAY_TAG = 'roboarm._play'
16
+ FILE_CACHE = data_dir('rarm.cache')
17
17
 
18
18
 
19
19
  def __persistent_cache_manager(mode):
20
20
  """
21
- pds - persistent data structure
21
+ File state cache
22
22
  modes:
23
23
  r - recover, s - save
24
24
  """
25
25
 
26
26
  if mode == 's':
27
27
  # SAVE CACHE
28
- with open('rarm.pds', 'w') as f:
28
+ with open(RoboArm.FILE_CACHE, 'w') as f:
29
29
  f.write(','.join([str(k) for k in RoboArm.MOVE_RECORD]))
30
30
  return
31
31
  try:
32
32
  # RESTORE CACHE
33
- with open('rarm.pds', 'r') as f:
33
+ with open(RoboArm.FILE_CACHE, 'r') as f:
34
34
  RoboArm.MOVE_RECORD = [int(data) for data in f.read().strip().split(',')]
35
35
  except:
36
36
  pass
37
37
 
38
38
 
39
- def load_n_init():
39
+ def load():
40
40
  """
41
41
  Initiate roboarm module
42
42
  - move servo motors to middle position
@@ -52,11 +52,11 @@ def load_n_init():
52
52
  return f'Init and Move to home X{x}, Y{y}'
53
53
 
54
54
 
55
- def control(x_new, y_new, speed_ms=None, smooth=True):
55
+ def control(x, y, speed_ms=None, smooth=True):
56
56
  """
57
57
  Control robot arm function
58
- :param x_new: new x position (40-115)
59
- :param y_new: new y position (40-115)
58
+ :param x: new x position (40-115)
59
+ :param y: new y position (40-115)
60
60
  :param speed_ms: speed - step wait in ms
61
61
  :param smooth: smooth transition, default True
62
62
  :return str: move verdict
@@ -76,11 +76,11 @@ def control(x_new, y_new, speed_ms=None, smooth=True):
76
76
  sleep_ms(step_ms)
77
77
 
78
78
  # Skip if new XY is the same as current
79
- if RoboArm.ACTUAL_XY[0] == x_new and RoboArm.ACTUAL_XY[1] == y_new:
80
- return f"Already on X:{x_new} Y:{y_new}"
79
+ if RoboArm.ACTUAL_XY[0] == x and RoboArm.ACTUAL_XY[1] == y:
80
+ return f"Already on X:{x} Y:{y}"
81
81
  # Check input parameter range
82
- if RoboArm.RANGE[0] > x_new > RoboArm.RANGE[1] or RoboArm.RANGE[0] > y_new > RoboArm.RANGE[1]:
83
- return f"X{x_new}/Y{y_new} out of range... range: {RoboArm.RANGE[0]}-{RoboArm.RANGE[1]}"
82
+ if RoboArm.RANGE[0] > x > RoboArm.RANGE[1] or RoboArm.RANGE[0] > y > RoboArm.RANGE[1]:
83
+ return f"X{x}/Y{y} out of range... range: {RoboArm.RANGE[0]}-{RoboArm.RANGE[1]}"
84
84
 
85
85
  # Set arm speed
86
86
  RoboArm.SPEED_MS = speed_ms if isinstance(speed_ms, int) else RoboArm.SPEED_MS
@@ -90,14 +90,14 @@ def control(x_new, y_new, speed_ms=None, smooth=True):
90
90
 
91
91
  if smooth:
92
92
  # Move roboarm to position
93
- __buttery(x_prev, y_prev, x_new, y_new)
94
- RoboArm.ACTUAL_XY = [x_new, y_new]
93
+ __buttery(x_prev, y_prev, x, y)
94
+ RoboArm.ACTUAL_XY = [x, y]
95
95
  else:
96
96
  # Fast move robaorm to position
97
- servo.sduty(x_new)
98
- servo.s2duty(y_new)
99
- RoboArm.ACTUAL_XY[0] = x_new
100
- RoboArm.ACTUAL_XY[1] = y_new
97
+ servo.sduty(x)
98
+ servo.s2duty(y)
99
+ RoboArm.ACTUAL_XY[0] = x
100
+ RoboArm.ACTUAL_XY[1] = y
101
101
  return 'Move X{}->{} Y{}->{}'.format(x_prev, RoboArm.ACTUAL_XY[0], y_prev, RoboArm.ACTUAL_XY[1])
102
102
 
103
103
 
@@ -109,7 +109,7 @@ def boot_move(speed_ms=None):
109
109
  """
110
110
  RoboArm.SPEED_MS = speed_ms if isinstance(speed_ms, int) else RoboArm.SPEED_MS
111
111
  # Set arm to center
112
- load_n_init()
112
+ load()
113
113
  sleep_ms(RoboArm.SPEED_MS*2)
114
114
  # Test X
115
115
  control(RoboArm.RANGE[0], RoboArm.CENTER_XY)
@@ -179,7 +179,7 @@ async def _play(args, deinit, delay):
179
179
  if task is not None:
180
180
  task.out = "Roboarm X:{} Y:{}".format(x, y)
181
181
  # Async wait between steps
182
- await asyncio.sleep_ms(delay)
182
+ await task.feed(sleep_ms=delay)
183
183
  if deinit:
184
184
  servo.deinit()
185
185
  # OFF LASER
@@ -204,11 +204,10 @@ def play(*args, s=None, delay=None, deinit=True):
204
204
 
205
205
  # Start play - servo XY in async task
206
206
  # [!] ASYNC TASK CREATION [1*] with async task callback + taskID (TAG) handling
207
- state = micro_task(tag=RoboArm.PLAY_TAG, task=_play(args, deinit, delay))
208
- if state:
209
- return 'Play: {} steps'.format(int(len(args)/2))
210
- return 'Play - already running'
211
207
 
208
+ state:dict = micro_task(tag=RoboArm.PLAY_TAG, task=_play(args, deinit, delay))
209
+ state.update({"Play steps": int(len(args)/2)})
210
+ return state
212
211
 
213
212
  def record(clean=False, rec_limit=8):
214
213
  """
@@ -262,15 +261,6 @@ def status(lmf=None):
262
261
  return {'X': RoboArm.ACTUAL_XY[0], 'Y': RoboArm.ACTUAL_XY[1]}
263
262
 
264
263
 
265
- def lmdep():
266
- """
267
- Show Load Module dependency
268
- - List of load modules used by this application
269
- :return: tuple
270
- """
271
- return 'servo', 'switch'
272
-
273
-
274
264
  def pinmap():
275
265
  """
276
266
  [i] micrOS LM naming convention
@@ -279,7 +269,7 @@ def pinmap():
279
269
  :return dict: pin name (str) - pin value (int) pairs
280
270
  """
281
271
  s_pm = servo.pinmap()
282
- s_pm.update({'switch_1': pm()['switch_1']})
272
+ s_pm.update(switch_pinmap())
283
273
  return s_pm
284
274
 
285
275
 
@@ -290,11 +280,13 @@ def help(widgets=False):
290
280
  (widgets=False) list of functions implemented by this application
291
281
  (widgets=True) list of widget json for UI generation
292
282
  """
293
- return 'control x=<40-115> y=<40-115> s=<ms delay> smooth=True',\
294
- 'boot_move speed_ms',\
295
- 'standby y_pos=45',\
296
- 'jiggle delta=2',\
297
- 'play 40 40 115 115 s=<speed ms> delay=<ms> deinit=True',\
298
- 'record clean=False rec_limit=8',\
299
- 'random x_range=20 y_range=20 speed_ms=5',\
300
- 'load_n_init', 'pinmap', 'status', 'lmdep'
283
+ return resolve(('JOYSTICK control x=<40-115> y=<40-115> speed_ms=5 smooth=True',
284
+ 'BUTTON boot_move speed_ms=10',
285
+ 'BUTTON standby y_pos=45',
286
+ 'BUTTON jiggle delta=3',
287
+ 'play 40 40 115 115 s=<speed ms> delay=<ms> deinit=True',
288
+ 'BUTTON play deinit=True',
289
+ 'record clean=False rec_limit=8',
290
+ 'random x_range=20 y_range=20 speed_ms=5',
291
+ 'load', 'pinmap',
292
+ 'status'), widgets=widgets)
@@ -0,0 +1,137 @@
1
+ from LM_system import memory_usage
2
+ from Common import socket_stream, syslog, micro_task
3
+ from Auth import sudo
4
+
5
+
6
+ @socket_stream
7
+ def raise_error(msgobj=None):
8
+ """
9
+ Test function - raise LM exception
10
+ """
11
+ if msgobj is not None:
12
+ msgobj("Raise test exception")
13
+ state = syslog('Robustness TeSt ErRoR')
14
+ raise Exception(f"Test exception: {'OK' if state else 'NOK'}")
15
+
16
+
17
+ @socket_stream
18
+ def memory_leak(cnt=160, msgobj=None):
19
+ """
20
+ Test function - allocate lot of memory
21
+ :param cnt: data counter, default 160 iteration
22
+ :return: verdict
23
+ """
24
+ dict_test = {}
25
+ mem_start = memory_usage()['mem_used']
26
+ for k in range(cnt):
27
+ mem = memory_usage()['percent']
28
+ data = "micrOS memory usage: {} %".format(mem)
29
+ if msgobj is not None:
30
+ msgobj("[{}] gen: {}".format(k, data))
31
+ dict_test[k] = data
32
+ mem_end = memory_usage()['mem_used']
33
+ delta = mem_start - mem_end
34
+ return '[{}] RAM Alloc.: {} kB {} byte'.format(len(dict_test), int(delta / 1024), int(delta % 1024))
35
+
36
+ @socket_stream
37
+ def recursion_limit(limit=14, msgobj=None):
38
+ cnt = 0
39
+ for cnt in range(1, limit+1):
40
+ try:
41
+ _recursion(cnt, msgobj=msgobj)
42
+ except Exception as e:
43
+ msgobj(f"ok error: {e}")
44
+ break
45
+ return f"Recursion limit: {cnt}"
46
+
47
+
48
+ def _recursion(cnt, msgobj=None):
49
+ """
50
+ Test function - recursion test
51
+ :param cnt: recursion depth
52
+ :return: verdict
53
+ Error example:
54
+ node01 $ robustness recursion_limit 15
55
+ lm_exec LM_robustness->recursion_limit: maximum recursion depth exceeded
56
+ """
57
+ if cnt > 0:
58
+ remain = _recursion(cnt-1)
59
+ if msgobj is not None:
60
+ msgobj("recalled {}".format(cnt))
61
+ else:
62
+ remain = 0
63
+ return remain
64
+
65
+ ################## TEST micro_task UCs ##########################
66
+
67
+ async def __task(tag, period_ms):
68
+ counter = 0
69
+ with micro_task(tag=tag) as my_task:
70
+ while True:
71
+ # DO something here in the async loop...
72
+ counter += 1
73
+
74
+ # Store data in task cache (task show mytask)
75
+ my_task.out = f'MyTask Counter: {counter}'
76
+
77
+ # Async sleep - feed event loop
78
+ await my_task.feed(sleep_ms=period_ms)
79
+ # [i] feed same as "await asyncio.sleep_ms(period_ms)" with micrOS features (WDT)
80
+
81
+ def create_task():
82
+ """
83
+ Legacy way of task creation (with exact task tagging)
84
+ """
85
+ # [!] ASYNC TASK CREATION [1*] with async task callback + taskID (TAG) handling
86
+ task_tag = "microtask.run"
87
+ return micro_task(tag=task_tag, task=__task(tag=task_tag, period_ms=5))
88
+
89
+
90
+ @micro_task("microtask", _wrap=True)
91
+ async def mytask(tag, period_ms=30):
92
+ """
93
+ New shorter way of task creation
94
+ with decorator function
95
+ """
96
+ counter = 0
97
+ with micro_task(tag=tag) as my_task:
98
+ while True:
99
+ # DO something here in the async loop...
100
+ counter += 1
101
+
102
+ # Store data in task cache (task show mytask)
103
+ my_task.out = f'MyTask Counter: {counter}'
104
+
105
+ # Async sleep - feed event loop
106
+ await my_task.feed(sleep_ms=period_ms)
107
+ # [i] feed same as "await asyncio.sleep_ms(period_ms)" with micrOS features (WDT)
108
+
109
+
110
+ @sudo
111
+ def func_sudo():
112
+ """
113
+ Function execution requires pwd=<...>
114
+ """
115
+ return "Access granted"
116
+
117
+
118
+ @sudo(_force_only=(True, 0))
119
+ def func_sudo_force(force=False):
120
+ """
121
+ Function requires pwd=<...> when force=True
122
+ """
123
+ return f"Access granted, force flag: {force}"
124
+
125
+ ##############################################################################
126
+
127
+ def help(widgets=False):
128
+ """
129
+ [i] micrOS LM naming convention - built-in help message
130
+ :return tuple:
131
+ (widgets=False) list of functions implemented by this application
132
+ (widgets=True) list of widget json for UI generation
133
+ """
134
+ return 'NOTE: This is a test module to validate system robustness', \
135
+ 'raise_error', 'memory_leak cnt=160', 'recursion_limit cnt=14', \
136
+ 'create_task', 'mytask', "func_sudo", "func_sudo_force"
137
+
@@ -12,4 +12,7 @@ def temp():
12
12
 
13
13
 
14
14
  def help(widgets=False):
15
+ """
16
+ [BETA]
17
+ """
15
18
  return 'temp'
@@ -42,5 +42,8 @@ def read_file(name):
42
42
 
43
43
 
44
44
  def help(widgets=False):
45
+ """
46
+ [BETA]
47
+ """
45
48
  return "mount_storage", "unmount_storage", "list_storage",\
46
49
  "write_file name content", "read_file name"