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,159 @@
1
+ # Copyright (c) 2019 Joseph Hopfmüller
2
+ # This module is a fork of Christophe Rousseaus module.
3
+ # see: https://github.com/palouf34/veml7700.git
4
+
5
+ from machine import SoftI2C, Pin
6
+ from time import sleep
7
+ from micropython import const
8
+ from microIO import bind_pin, pinmap_search
9
+ from Types import resolve
10
+
11
+ # start const
12
+ # default address
13
+ addr = const(0x10)
14
+
15
+ # Write registers
16
+ als_conf_0 = const(0x00)
17
+ als_WH = const(0x01)
18
+ als_WL = const(0x02)
19
+ pow_sav = const(0x03)
20
+
21
+ # Read registers
22
+ als = const(0x04)
23
+ white = const(0x05)
24
+ interrupt = const(0x06)
25
+
26
+ # gain 0.125 0.25 1 2 integration time
27
+ confValues = {25: {1 / 8: bytearray([0x00, 0x13]), 1 / 4: bytearray([0x00, 0x1B]), 1: bytearray([0x00, 0x01]),
28
+ 2: bytearray([0x00, 0x0B])}, # 25
29
+ 50: {1 / 8: bytearray([0x00, 0x12]), 1 / 4: bytearray([0x00, 0x1A]), 1: bytearray([0x00, 0x02]),
30
+ 2: bytearray([0x00, 0x0A])}, # 50
31
+ 100: {1 / 8: bytearray([0x00, 0x10]), 1 / 4: bytearray([0x00, 0x18]), 1: bytearray([0x00, 0x00]),
32
+ 2: bytearray([0x00, 0x08])}, # 100
33
+ 200: {1 / 8: bytearray([0x40, 0x10]), 1 / 4: bytearray([0x40, 0x18]), 1: bytearray([0x40, 0x00]),
34
+ 2: bytearray([0x40, 0x08])}, # 200
35
+ 400: {1 / 8: bytearray([0x80, 0x10]), 1 / 4: bytearray([0x80, 0x18]), 1: bytearray([0x80, 0x00]),
36
+ 2: bytearray([0x80, 0x08])}, # 400
37
+ 800: {1 / 8: bytearray([0xC0, 0x10]), 1 / 4: bytearray([0xC0, 0x18]), 1: bytearray([0xC0, 0x00]),
38
+ 2: bytearray([0xC0, 0x08])}} # 800
39
+
40
+ # gain 0.125, 0.25, 1, 2 integration time
41
+ gainValues = {25: {1 / 8: 1.8432, 1 / 4: 0.9216, 1: 0.2304, 2: 0.1152}, # 25
42
+ 50: {1 / 8: 0.9216, 1 / 4: 0.4608, 1: 0.1152, 2: 0.0576}, # 50
43
+ 100: {1 / 8: 0.4608, 1 / 4: 0.2304, 1: 0.0288, 2: 0.0144}, # 100
44
+ 200: {1 / 8: 0.2304, 1 / 4: 0.1152, 1: 0.0288, 2: 0.0144}, # 200
45
+ 400: {1 / 8: 0.1152, 1 / 4: 0.0576, 1: 0.0144, 2: 0.0072}, # 400
46
+ 800: {1 / 8: 0.0876, 1 / 4: 0.0288, 1: 0.0072, 2: 0.0036}} # 800
47
+
48
+ # fin des constante
49
+
50
+ # Reference data sheet Table 1 for configuration settings
51
+
52
+ interrupt_high = bytearray([0x00, 0x00]) # Clear values
53
+ # Reference data sheet Table 2 for High Threshold
54
+
55
+ interrupt_low = bytearray([0x00, 0x00]) # Clear values
56
+ # Reference data sheet Table 3 for Low Threshold
57
+
58
+ power_save_mode = bytearray([0x00, 0x00]) # clear values
59
+
60
+
61
+ # Reference data sheet Table 4 for Power Saving Modes
62
+
63
+
64
+ class VEML7700:
65
+ INSTANCE = None
66
+
67
+ def __init__(self,
68
+ address=addr,
69
+ i2c=None,
70
+ it=25,
71
+ gain=1 / 8,
72
+ **kwargs):
73
+
74
+ self.address = address
75
+ if i2c is None:
76
+ raise ValueError('An I2C object is required.')
77
+ self.i2c = i2c
78
+ VEML7700.INSTANCE = self
79
+
80
+ confValuesForIt = confValues.get(it)
81
+ gainValuesForIt = gainValues.get(it)
82
+ if confValuesForIt is not None and gainValuesForIt is not None:
83
+ confValueForGain = confValuesForIt.get(gain)
84
+ gainValueForGain = gainValuesForIt.get(gain)
85
+ if confValueForGain is not None and gainValueForGain is not None:
86
+ self.confValues = confValueForGain
87
+ self.gain = gainValueForGain
88
+ else:
89
+ raise ValueError('Wrong gain value. Use 1/8, 1/4, 1, 2')
90
+ else:
91
+ raise ValueError('Wrong integration time value. Use 25, 50, 100, 200, 400, 800')
92
+
93
+ self.init()
94
+
95
+ def init(self):
96
+
97
+ # load calibration data
98
+ # self.i2c.writeto_mem(self.address, als_conf_0, bytearray([0x00,0x13]) )
99
+ self.i2c.writeto_mem(self.address, als_conf_0, self.confValues)
100
+ self.i2c.writeto_mem(self.address, als_WH, interrupt_high)
101
+ self.i2c.writeto_mem(self.address, als_WL, interrupt_low)
102
+ self.i2c.writeto_mem(self.address, pow_sav, power_save_mode)
103
+
104
+ def detect(self):
105
+ """ Functions is verified is module has detecedself.
106
+
107
+ this function not implemented for this time
108
+ """
109
+ None
110
+
111
+ def read_lux(self):
112
+ """ Reads the data from the sensor and returns the data.
113
+
114
+ Returns:
115
+ the number of lux detect by this captor.
116
+ """
117
+ # The frequency to read the sensor should be set greater than
118
+ # the integration time (and the power saving delay if set).
119
+ # Reading at a faster frequency will not cause an error, but
120
+ # will result in reading the previous data
121
+
122
+ self.lux = bytearray(2)
123
+
124
+ sleep(.04) # 40ms
125
+
126
+ self.i2c.readfrom_mem_into(self.address, als, self.lux)
127
+ self.lux = self.lux[0] + self.lux[1] * 256
128
+ self.lux = self.lux * self.gain
129
+ return (int(round(self.lux, 0)))
130
+
131
+
132
+ def load():
133
+ """
134
+ VEML7700 Digital light intensity sensor
135
+ """
136
+ if VEML7700.INSTANCE is None:
137
+ i2c = SoftI2C(Pin(bind_pin('i2c_scl')), Pin(bind_pin('i2c_sda')))
138
+ VEML7700.INSTANCE = VEML7700(address=0x10, i2c=i2c, it=100, gain=1/8)
139
+ return VEML7700.INSTANCE
140
+
141
+
142
+ def read_lux():
143
+ """Read LUX value"""
144
+ lux = load().read_lux()
145
+ return {"LUX": lux}
146
+
147
+
148
+ def pinmap():
149
+ """
150
+ [i] micrOS LM naming convention
151
+ Shows logical pins - pin number(s) used by this Load module
152
+ - info which pins to use for this application
153
+ :return dict: pin name (str) - pin value (int) pairs
154
+ """
155
+ return pinmap_search(['i2c_scl', 'i2c_sda'])
156
+
157
+
158
+ def help(widgets=False):
159
+ return resolve(('load', 'TEXTBOX read_lux', 'pinmap', '[info] Digital light intensity sensor'), widgets=widgets)
@@ -0,0 +1,38 @@
1
+ """
2
+ Web backend loader
3
+ - Dynamic application dashboard
4
+ - Fileserver
5
+ """
6
+
7
+ from Common import web_endpoint, web_mounts
8
+
9
+
10
+ def load(dashboard=True, fileserver:bool=False, fs_explore:bool=False):
11
+ """
12
+ Centralized Web Backend Services Loader
13
+ - Dynamic application dashboard
14
+ - Fileserver
15
+ :param dashboard: bool - enable*/disable application dashboard
16
+ :param fileserver: bool - enable/disable* fileserver
17
+ :param fs_explore: bool - enable all shared web mounts: modules, data
18
+ """
19
+ endpoints = []
20
+ if dashboard:
21
+ web_endpoint('dashboard', 'dashboard.html')
22
+ endpoints.append("Dashboard initialized, endpoint: /dashboard")
23
+ if fileserver:
24
+ import LM_fileserver
25
+ endpoints.append(LM_fileserver.load())
26
+ endpoints.append(web_mounts(fs_explore, fs_explore, fs_explore))
27
+ return endpoints
28
+
29
+
30
+ def help(widgets=False):
31
+ """
32
+ [i] micrOS LM naming convention - built-in help message
33
+ :return tuple:
34
+ (widgets=False) list of functions implemented by this application
35
+ (widgets=True) list of widget json for UI generation
36
+ """
37
+ return ('load dashboard=True fileserver=False fsdir=None fs_explore=False',
38
+ 'help')
@@ -1,103 +1,84 @@
1
- from usocket import socket, getaddrinfo
2
- from ussl import wrap_socket
1
+ """
2
+ This module implements an optimized version of requests module
3
+ for async and sync http get and post requests.
4
+
5
+ Designed by Marcell Ban aka BxNxM GitHub
6
+ """
7
+
3
8
  from json import loads, dumps
4
- from Debug import errlog_add
9
+ from usocket import socket, getaddrinfo
10
+ try:
11
+ from ussl import wrap_socket # Legacy micropython ssl usage (+simulator mode)
12
+ except ImportError:
13
+ from ssl import wrap_socket # From micropython 1.23...
14
+ from Debug import syslog
15
+ import uasyncio as asyncio
5
16
 
6
17
 
7
18
  ADDR_CACHE = {}
8
19
 
20
+ #############################################
21
+ # micropython request - helper functions #
22
+ #############################################
9
23
 
10
- def request(method, url, data=None, json=None, headers=None, sock_size=256, jsonify=False):
24
+
25
+ def _host_to_addr(host, port, force=False):
11
26
  """
12
- Micropython syncronous HTTP request function for REST API handling
13
- :param method: GET/POST
14
- :param url: URL for REST API
15
- :param data: string body (handle bare string as data for POST method)
16
- :param json: json body (handle json as data for POST method)
17
- :param headers: define headers
18
- :param sock_size: socket buffer size (chuck size), default 256 byte (micropython defualt)
19
- :param jsonify: convert response body to json
27
+ Resolve host name to IP address
28
+ and cache host address to avoid slow getaddrinfo
20
29
  """
30
+ addr = ADDR_CACHE.get(host, None)
31
+ if addr is None or force:
32
+ addr = getaddrinfo(host, port)[0][-1]
33
+ ADDR_CACHE[host] = addr
34
+ return addr
21
35
 
22
- #############################################
23
- # micropython request - internal functions #
24
- #############################################
25
- def _chunked(_body):
26
- decoded = bytearray()
27
- while _body:
28
- # Find the end of the chunk size line
29
- line_end = _body.find(b"\r\n")
30
- if line_end < 0:
31
- break
32
36
 
33
- # Extract the chunk size and convert to int
34
- chunk_size_str = _body[:line_end]
35
- try:
36
- chunk_size = int(chunk_size_str, 16)
37
- except ValueError as e:
38
- chunk_size = 0
37
+ def _chunked(_body):
38
+ decoded = bytearray()
39
+ while _body:
40
+ # Find the end of the chunk size line
41
+ line_end = _body.find(b"\r\n")
42
+ if line_end < 0:
43
+ break
39
44
 
40
- # Check chunk size
41
- if chunk_size == 0:
42
- break
45
+ # Extract the chunk size and convert to int
46
+ chunk_size_str = _body[:line_end]
47
+ try:
48
+ chunk_size = int(chunk_size_str, 16)
49
+ except ValueError:
50
+ chunk_size = 0
43
51
 
44
- # Add the chunk data to the decoded data
45
- chunk_data = _body[line_end + 2: line_end + 2 + chunk_size]
46
- decoded += chunk_data
52
+ # Check chunk size
53
+ if chunk_size == 0:
54
+ break
47
55
 
48
- # Move to the next chunk
49
- _body = _body[line_end + 4 + chunk_size:]
56
+ # Add the chunk data to the decoded data
57
+ chunk_data = _body[line_end + 2: line_end + 2 + chunk_size]
58
+ decoded += chunk_data
50
59
 
51
- # Check for end of message marker again
52
- if not _body.startswith(b"\r\n"):
53
- break
54
- return decoded
55
-
56
- def _host_to_addr(force=False):
57
- """
58
- Cache host address to avoid getaddrinfo (slow)
59
- """
60
- nonlocal host, port
61
- _addr = ADDR_CACHE.get(host, None)
62
- if _addr is None or force:
63
- _addr = getaddrinfo(host, port)[0][-1]
64
- ADDR_CACHE[host] = _addr
65
- return _addr
66
-
67
- #############################################
68
- # micropython request main #
69
- #############################################
70
-
71
- # [_parse_url] Parse HTTP(S) URL
72
- headers = {} if headers is None else headers
60
+ # Move to the next chunk
61
+ _body = _body[line_end + 4 + chunk_size:]
62
+
63
+ # Check for end of message marker again
64
+ if not _body.startswith(b"\r\n"):
65
+ break
66
+ return decoded
67
+
68
+
69
+ def _parse_url(url):
73
70
  # PARSE URL -> proto (http/https), host, path + SET PORT
74
71
  proto, _, host, path = url.split('/', 3)
75
-
76
72
  port = 443 if proto == 'https:' else 80
77
73
  # PARSE HOST - handle direct port number as input after :
78
74
  if ':' in host:
79
75
  host, port = host.split(':', 1)
80
76
  port = int(port)
77
+ return host, port, proto, path
81
78
 
82
- # [1] CONNECT - create socket object
83
- sock = socket()
84
- sock.settimeout(3)
85
- # [1.1] CONNECT - resolve IP by host
86
- addr = _host_to_addr()
87
- # [1.2] CONNECT - if https handle ssl
88
- try:
89
- sock.connect(addr)
90
- except Exception:
91
- # Refresh host address & reconnect
92
- addr = _host_to_addr(force=True)
93
- sock.connect(addr)
94
-
95
- try:
96
- sock = wrap_socket(sock) if proto == 'https:' else sock
97
- except Exception as e:
98
- errlog_add(f'[ERR] https soc-wrap: {e}')
99
79
 
100
- # [_build_request] Create request (body, headers)
80
+ def _build_request(host, method, path, headers, data=None, json=None):
81
+ # Create request (body, headers)
101
82
  body = None
102
83
  if data:
103
84
  body = data.encode('utf-8')
@@ -116,6 +97,60 @@ def request(method, url, data=None, json=None, headers=None, sock_size=256, json
116
97
  http_request = '\r\n'.join(lines) + '\r\n\r\n'
117
98
  if body:
118
99
  http_request += body.decode('utf-8')
100
+ return http_request
101
+
102
+
103
+ def _parse_response(response):
104
+ # Parse response - get body
105
+ headers, body = response.split(b'\r\n\r\n', 1)
106
+ status_code = int(headers.split(b' ')[1])
107
+ headers = dict(h.split(b': ') for h in headers.split(b'\r\n')[1:])
108
+ if headers.get(b'Transfer-Encoding', b'') == b'chunked':
109
+ body = _chunked(body)
110
+ else:
111
+ body = body.decode('utf-8')
112
+ return status_code, body
113
+
114
+
115
+ #############################################
116
+ # micropython HTTP request #
117
+ #############################################
118
+
119
+ def request(method:str, url:str, data:str=None, json=None, headers:dict=None, sock_size=256, jsonify=False):
120
+ """
121
+ Micropython syncronous HTTP request function for REST API handling
122
+ :param method: GET/POST
123
+ :param url: URL for REST API
124
+ :param data: string body (handle bare string as data for POST method)
125
+ :param json: json body (handle json as data for POST method)
126
+ :param headers: define headers
127
+ :param sock_size: socket buffer size (chuck size), default 256 byte (micropython defualt)
128
+ :param jsonify: convert response body to json
129
+ """
130
+
131
+ # Parse HTTP(S) URL and headers
132
+ headers = {} if headers is None else headers
133
+ host, port, proto, path = _parse_url(url)
134
+ addr = _host_to_addr(host, port)
135
+
136
+ # [1] CONNECT - create socket object
137
+ sock = socket()
138
+ sock.settimeout(3)
139
+ # [1.1] CONNECT - if https handle ssl
140
+ try:
141
+ sock.connect(addr)
142
+ except Exception:
143
+ # Refresh host address & reconnect
144
+ addr = _host_to_addr(host, port, force=True)
145
+ sock.connect(addr)
146
+
147
+ try:
148
+ sock = wrap_socket(sock) if proto == 'https:' else sock
149
+ except Exception as e:
150
+ syslog(f'[ERR] https soc-wrap: {e}')
151
+
152
+ # [1] BUILD REQUEST
153
+ http_request = _build_request(host, method, path, headers, data, json)
119
154
 
120
155
  # [2] SEND REQUEST
121
156
  if proto == 'https:':
@@ -135,32 +170,94 @@ def request(method, url, data=None, json=None, headers=None, sock_size=256, json
135
170
  response += data
136
171
  sock.close()
137
172
 
138
- # [_parse_response] Parse response - get body
139
- headers, body = response.split(b'\r\n\r\n', 1)
140
- status_code = int(headers.split(b' ')[1])
141
- headers = dict(h.split(b': ') for h in headers.split(b'\r\n')[1:])
142
- if headers.get(b'Transfer-Encoding', b'') == b'chunked':
143
- body = _chunked(body)
144
- else:
145
- body = body.decode('utf-8')
173
+ # [4] PARSE RESPONSE
174
+ status_code, body = _parse_response(response)
146
175
 
147
- # Return status code, headers and body (text or jsons)
148
- return status_code, loads(body) if jsonify else body
176
+ # Return status code, body (text or json)
177
+ return status_code, loads(body) if jsonify and status_code == 200 else body
149
178
 
150
179
 
151
180
  #############################################
152
- # Implement http get/post functions #
181
+ # async micropython HTTP request #
153
182
  #############################################
154
183
 
184
+ async def arequest(method:str, url:str, data:str=None, json=None, headers:dict=None, sock_size=256, jsonify=False):
185
+ """
186
+ Micropython asynchronous HTTP request function for REST API handling
187
+ :param method: GET/POST
188
+ :param url: URL for REST API
189
+ :param data: string body (handle bare string as data for POST method)
190
+ :param json: json body (handle json as data for POST method)
191
+ :param headers: define headers
192
+ :param sock_size: socket buffer size (chunk size), default 256 bytes (micropython default)
193
+ :param jsonify: convert response body to json
194
+ """
195
+ headers = {} if headers is None else headers
196
+ host, port, proto, path = _parse_url(url)
197
+ addr = _host_to_addr(host, port)
198
+ reader, writer = None, None
199
+
200
+ # Open a connection
201
+ try:
202
+ reader, writer = await asyncio.open_connection(addr[0], port, ssl=(proto == 'https:'))
203
+ except Exception as e:
204
+ # Refresh host address & reconnect
205
+ if "EHOSTUNREACH" in str(e):
206
+ addr = _host_to_addr(host, port, force=True)
207
+ reader, writer = await asyncio.open_connection(addr[0], port, ssl=(proto == 'https:'))
208
+ else:
209
+ syslog(f"[ERR] arequest connection: {e}")
210
+
211
+ # Send request + Wait for the response
212
+ try:
213
+ # Build the HTTP request
214
+ http_request = _build_request(host, method, path, headers, data, json)
215
+
216
+ # Send the request
217
+ writer.write(http_request.encode('utf-8'))
218
+ await writer.drain()
219
+
220
+ # Receive response
221
+ response = b''
222
+ while True:
223
+ chunk = await reader.read(sock_size)
224
+ if not chunk:
225
+ break
226
+ response += chunk
227
+
228
+ # Parse response
229
+ status_code, body = _parse_response(response)
230
+ except Exception as e:
231
+ status_code = 500
232
+ # https://github.com/micropython/micropython/blob/8785645a952c03315dbf93667b5f7c7eec49762f/cc3200/simplelink/include/device.h
233
+ if "-104" == str(e):
234
+ body = "[WARN] arequest: ASSOC_REJECT"
235
+ elif "ECONNABORTED" in str(e):
236
+ body = f"[WARN] arequest: {e}"
237
+ else:
238
+ body = f"[ERR] arequest: {e}"
239
+ syslog(body)
240
+ finally:
241
+ if writer:
242
+ writer.close()
243
+ await writer.wait_closed()
244
+ return status_code, loads(body) if jsonify and status_code == 200 else body
245
+
246
+
247
+ #############################################
248
+ # Implement http get/post functions #
249
+ #############################################
155
250
 
156
- def get(url, headers={}, sock_size=256, jsonify=False):
251
+ def get(url:str, headers:dict=None, sock_size=256, jsonify=False):
157
252
  """
158
253
  GENERIC HTTP GET FUNCTION
159
254
  """
255
+ if headers is None:
256
+ headers = {}
160
257
  return request('GET', url, headers=headers, sock_size=sock_size, jsonify=jsonify)
161
258
 
162
259
 
163
- def post(url, data=None, json=None, headers={}, sock_size=256, jsonify=False):
260
+ def post(url:str, data=None, json=None, headers:dict=None, sock_size=256, jsonify=False):
164
261
  """
165
262
  GENERIC HTTP POST FUNCTION
166
263
  :param data: string body (handle bare string as data for POST method)
@@ -169,7 +266,23 @@ def post(url, data=None, json=None, headers={}, sock_size=256, jsonify=False):
169
266
  return request('POST', url, data=data, json=json, headers=headers, sock_size=sock_size, jsonify=jsonify)
170
267
 
171
268
 
172
- def host_cache():
269
+ async def aget(url:str, headers:dict=None, sock_size=256, jsonify=False):
270
+ """
271
+ GENERIC ASYNC HTTP GET FUNCTION
272
+ """
273
+ return await arequest('GET', url, headers=headers, sock_size=sock_size, jsonify=jsonify)
274
+
275
+
276
+ async def apost(url, data=None, json=None, headers:dict=None, sock_size=256, jsonify=False):
277
+ """
278
+ GENERIC ASYNC HTTP POST FUNCTION
279
+ :param data: string body (handle bare string as data for POST method)
280
+ :param json: json body (handle json as data for POST method)
281
+ """
282
+ return await arequest('POST', url, data=data, json=json, headers=headers, sock_size=sock_size, jsonify=jsonify)
283
+
284
+
285
+ def host_cache() -> dict:
173
286
  """
174
287
  Return address cache
175
288
  """
@@ -31,14 +31,18 @@
31
31
  transition: border-color 0.3s ease; /* Smooth transition for border color */
32
32
  }
33
33
  </style>
34
- <script src="uapi.js" defer></script>
35
- <script src="uwidgets.js" defer></script>
36
- <script src="udashboard.js" defer></script>
34
+ <script src="uapi.js" ></script>
35
+ <script src="uwidgets.js" ></script>
36
+ <script src="uwidgets_pro.js" ></script>
37
+ <script src="udashboard.js" ></script>
37
38
  </head>
38
39
  <body>
39
40
  <h1> micrOS dashboard </h1>
41
+ <div id="restInfo">
42
+ <div id="restInfoHeader"></div>
43
+ </div>
40
44
  <!-- Container for the dynamically generated list -->
41
- <ul id="dynamicContent"></ul>
45
+ <section id="widgets-section"></section>
42
46
  <br><br><br>
43
47
  <button id="toggleDebugSection">console</button>
44
48
  <div id="debugSection" style="display: none;">
@@ -53,6 +57,7 @@
53
57
  <script>
54
58
  document.addEventListener("DOMContentLoaded", function() {
55
59
  // Init basic info from board after DOM is fully loaded
60
+ restInfo(showPages=false);
56
61
 
57
62
  // INIT DASHBOARD (load active modules -> build page)
58
63
  DynamicWidgetLoad();