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,338 @@
1
+ let selected = null;
2
+ let selectedEl = null; // DOM element of selected file row
3
+ let selectedDir = 'user_data'; // fallback
4
+ let _editorScriptLoaded = false;
5
+ let editorFile = null; // 🔹 track what's currently opened in editor
6
+
7
+ // 🔹 Simple root message output
8
+ let _msgTimer, _fadeTimer;
9
+ function popUpMsg(msg) {
10
+ let el = document.getElementById('root-message');
11
+ if (!el) {
12
+ el = document.createElement('div');
13
+ el.id = 'root-message';
14
+ Object.assign(el.style, {
15
+ position: 'fixed',
16
+ top: '8px',
17
+ left: '50%',
18
+ transform: 'translateX(-50%)',
19
+ background: 'rgba(220, 60, 60, 0.9)', // warm UI red
20
+ color: '#fff',
21
+ padding: '6px 12px',
22
+ borderRadius: '4px',
23
+ fontSize: '12px',
24
+ zIndex: '99999',
25
+ transition: 'opacity 0.4s ease',
26
+ opacity: '0'
27
+ });
28
+ document.body.appendChild(el);
29
+ }
30
+ el.textContent = msg;
31
+ el.style.display = 'block';
32
+ requestAnimationFrame(() => el.style.opacity = '1');
33
+ // Clean timers
34
+ clearTimeout(_msgTimer);
35
+ clearTimeout(_fadeTimer);
36
+ // Start timer
37
+ _msgTimer = setTimeout(() => {
38
+ el.style.opacity = '0';
39
+ _fadeTimer = setTimeout(() => el.style.display = 'none', 400);
40
+ }, 5000);
41
+ }
42
+
43
+ // 🔹 centralized selection clear
44
+ function clearSelection() {
45
+ document
46
+ .querySelectorAll('#list .file-item')
47
+ .forEach(x => x.className = 'file-item');
48
+
49
+ selected = null;
50
+ selectedEl = null;
51
+ }
52
+
53
+ function load() {
54
+ console.info('load.loadDirs');
55
+
56
+ loadDirs().then(() => {
57
+ console.info('load.loadFiles:', selectedDir);
58
+ loadFiles();
59
+ });
60
+ console.info('load.loadDiskUsage');
61
+ updateDiskUsage();
62
+ }
63
+
64
+ function loadFiles() {
65
+ const contentList = document.getElementById('list');
66
+
67
+ // 🔹 Enter loading state
68
+ contentList.classList.add('loading');
69
+
70
+ fetch('/fs/list', {
71
+ method: 'POST',
72
+ headers: {
73
+ 'Content-Type': 'text/plain'
74
+ },
75
+ body: selectedDir || '/'
76
+ })
77
+ .then(r => r.json())
78
+ .then(files => {
79
+ list.innerHTML = '';
80
+ clearSelection();
81
+ // 🔹 Empty folder placeholder
82
+ if (!Array.isArray(files) || files.length === 0) {
83
+ const d = document.createElement('div');
84
+ d.className = 'file-item placeholder';
85
+ d.textContent = '.empty';
86
+ d.style.opacity = '0.5';
87
+ d.style.pointerEvents = 'none'; // 🔹 non-clickable
88
+ list.appendChild(d);
89
+
90
+ console.info("Files loaded (empty folder)");
91
+ return;
92
+ }
93
+ // 🔹 Files listing
94
+ files.forEach(f => {
95
+ const name = f.path.split('/').pop();
96
+ const d = document.createElement('div');
97
+ d.className = 'file-item';
98
+ d.textContent = `${name} ${f.size}B`;
99
+
100
+ d.onclick = (e) => {
101
+ e.stopPropagation();
102
+
103
+ if (selectedEl === d) {
104
+ clearSelection();
105
+ return;
106
+ }
107
+
108
+ clearSelection();
109
+ d.className = 'file-item sel';
110
+ selected = name;
111
+ selectedEl = d;
112
+ };
113
+
114
+ list.appendChild(d);
115
+ });
116
+
117
+ console.info("Files loaded");
118
+ })
119
+ .catch(err => {
120
+ console.error("load failed:", err);
121
+ popUpMsg("Failed to load files: " + err.message);
122
+ })
123
+ .finally(() => {
124
+ // 🔹 Exit loading state (success or error)
125
+ contentList.classList.remove('loading');
126
+ });
127
+ }
128
+
129
+ function loadDirs() {
130
+ return fetch('/fs/dirs')
131
+ .then(r => r.json())
132
+ .then(dirs => {
133
+ const container = document.getElementById('folder-path');
134
+ container.innerHTML = '';
135
+
136
+ if (!Array.isArray(dirs) || !dirs.length) return;
137
+
138
+ dirs.forEach(dir => {
139
+ const normalized = dir.replace(/^\/+/, '');
140
+ const d = document.createElement('div');
141
+ d.className = 'dir-item';
142
+ d.textContent = normalized;
143
+
144
+ d.onclick = () => {
145
+ document
146
+ .querySelectorAll('#folder-path .dir-item')
147
+ .forEach(x => x.className = 'dir-item');
148
+
149
+ d.className = 'dir-item sel';
150
+ selectedDir = normalized;
151
+ console.info('dirChange.loadFiles:', selectedDir);
152
+ loadFiles();
153
+ };
154
+
155
+ // 🔹 Selection logic
156
+ if (!selectedDir) {
157
+ selectedDir = normalized;
158
+ d.className = 'dir-item sel';
159
+ }
160
+ else if (normalized === selectedDir) {
161
+ d.className = 'dir-item sel';
162
+ }
163
+
164
+ container.appendChild(d);
165
+ console.info("Folders loaded");
166
+ });
167
+
168
+ // 🔹 Fallback if folder vanished
169
+ if (
170
+ !container.querySelector('.dir-item.sel') &&
171
+ container.firstChild
172
+ ) {
173
+ selectedDir = container.firstChild.textContent;
174
+ container.firstChild.classList.add('sel');
175
+ }
176
+ })
177
+ .catch(err => {
178
+ console.error("dirs load failed:", err);
179
+ popUpMsg("Failed to load folders: " + err.message);
180
+ })
181
+ }
182
+
183
+ function uploadFile() {
184
+ const f = file.files[0];
185
+ if (!f) return;
186
+
187
+ const fd = new FormData();
188
+ const targetPath = `${selectedDir}/${f.name}`;
189
+ // This sets filename="selectedDir/file.txt" in multipart
190
+ fd.append('file', f, targetPath);
191
+
192
+ console.info("uploadFile:", targetPath);
193
+ fetch('/fs/files', { method: 'POST', body: fd })
194
+ .then(async r => {
195
+ if (!r.ok) {
196
+ const resp = (await r.text()) || r.statusText;
197
+ throw new Error(`${r.status} - ${resp}`);
198
+ }
199
+ return r;
200
+ })
201
+ .then(load)
202
+ .catch(err => {
203
+ console.error("uploadFile error:", err);
204
+ popUpMsg("Upload failed: " + err.message);
205
+ });
206
+ }
207
+
208
+ function openFile() {
209
+ if (!selected) return;
210
+ const resource = `/${selectedDir}/${selected}`;
211
+ console.info('openFile:', resource);
212
+ window.open(resource);
213
+ }
214
+
215
+ function download() {
216
+ if (!selected) return;
217
+
218
+ const resource = `/${selectedDir}/${selected}`;
219
+ console.info('download:', resource);
220
+
221
+ const a = document.createElement('a');
222
+ a.href = resource;
223
+ a.download = selected;
224
+ a.click();
225
+ }
226
+
227
+ function deleteFile() {
228
+ if (!selected) return;
229
+
230
+ const toDelete = `/${selectedDir}/${selected}`;
231
+ console.info("deleteFile:", toDelete);
232
+
233
+ fetch('/fs/files', { method: 'DELETE', body: toDelete })
234
+ .then(async r => {
235
+ if (!r.ok) {
236
+ const resp = (await r.text()) || r.statusText;
237
+ throw new Error(`${r.status} - ${resp}`);
238
+ }
239
+ return r;
240
+ })
241
+ .then(() => {
242
+ // 🔹 If the deleted file is open in editor → DESTROY editor
243
+ if (_editorScriptLoaded && editorFile === toDelete) {
244
+ window.destroyEditor?.();
245
+ editorFile = null;
246
+ console.info("deleteFile: editor destroyed");
247
+ }
248
+ })
249
+ .then(load)
250
+ .catch(err => {
251
+ console.error("deleteFile failed:", err);
252
+ popUpMsg("Delete failed: " + err.message);
253
+ });
254
+ }
255
+
256
+ function loadEditorScript() {
257
+ if (_editorScriptLoaded) return Promise.resolve();
258
+
259
+ return new Promise((resolve, reject) => {
260
+ const s = document.createElement('script');
261
+ s.src = '../editor.js';
262
+ s.onload = () => {
263
+ _editorScriptLoaded = true;
264
+ resolve();
265
+ };
266
+ s.onerror = reject;
267
+ document.head.appendChild(s);
268
+ });
269
+ }
270
+
271
+ async function editor() {
272
+ const filename = selected ?? `LM_blinky.py`;
273
+ const resource = `/${selectedDir}/${filename}`;
274
+ console.info('editor:', resource);
275
+
276
+ await loadEditorScript();
277
+
278
+ let container = document.getElementById('editor');
279
+ if (!container) {
280
+ container = document.createElement('div');
281
+ container.id = 'editor';
282
+ }
283
+
284
+ window.createEditor(container);
285
+
286
+ // 🔹 placement delegated to editor.js
287
+ window.openEditor(resource, {
288
+ anchor: selectedEl,
289
+ list: document.getElementById('list')
290
+ });
291
+
292
+ editorFile = resource; // 🔹 track currently opened file
293
+ }
294
+
295
+ function updateDiskUsage() {
296
+ fetch('/fs/usage')
297
+ .then(r => r.json())
298
+ .then(data => {
299
+ const usedMB = (data.used / (1024 * 1024)).toFixed(1);
300
+ const freeMB = (data.free / (1024 * 1024)).toFixed(1);
301
+ const total = data.used + data.free;
302
+ const percent = total ? (data.used / total) * 100 : 0;
303
+
304
+ document.getElementById('disktext').textContent =
305
+ `Disk: ${usedMB} MB used / ${freeMB} MB free`;
306
+
307
+ document.getElementById('diskused').style.width =
308
+ `${percent.toFixed(1)}%`;
309
+
310
+ console.info("DiskUsage: update");
311
+ })
312
+ .catch(err => {
313
+ console.error("disk usage failed:", err);
314
+ popUpMsg("Disk usage unavailable: " + err.message);
315
+ })
316
+ }
317
+
318
+ // 🔹 Global outside-click handler
319
+ document.addEventListener('click', (e) => {
320
+ // Ignore toolbar / editor buttons
321
+ if (e.target.closest('button')) return;
322
+
323
+ // If editor is open, keep selection locked
324
+ if (_editorScriptLoaded && editorFile) return;
325
+
326
+ const list = document.getElementById('list');
327
+ const editor = document.getElementById('editor');
328
+
329
+ if (
330
+ list &&
331
+ !list.contains(e.target) &&
332
+ (!editor || !editor.contains(e.target))
333
+ ) {
334
+ clearSelection();
335
+ }
336
+ });
337
+
338
+ load();
@@ -6,14 +6,56 @@
6
6
  <meta name="theme-color" media="(prefers-color-scheme: dark)" content="black" />
7
7
  <title>microWeb</title>
8
8
  <link rel="stylesheet" href="ustyle.css">
9
+ <style>
10
+ hr {
11
+ border: none;
12
+ height: 2px;
13
+ background: rgba(255, 255, 255, 0.25);
14
+ margin: 16px 0;
15
+ }
16
+ #restInfoHeader {
17
+ margin-bottom: 12px;
18
+ }
19
+ /* Container */
20
+ .endpoint-groups {
21
+ display: flex;
22
+ flex-wrap: wrap;
23
+ gap: 12px;
24
+ margin-bottom: 12px;
25
+ width: 100%;
26
+ }
27
+
28
+ /* Group cards */
29
+ .endpoint-group {
30
+ display: flex;
31
+ flex-wrap: wrap;
32
+ align-items: center;
33
+ gap: 6px;
34
+ padding: 8px;
35
+ border-radius: 6px;
36
+ background: rgba(255, 255, 255, 0.12);
37
+ backdrop-filter: blur(2px);
38
+ max-width: 100%;
39
+ }
40
+
41
+ /* Prevent buttons from getting tiny */
42
+ .endpoint-group button {
43
+ white-space: nowrap;
44
+ }
45
+ </style>
9
46
  <script src="uapi.js" defer></script>
10
47
  </head>
11
48
  <body>
12
49
  <img src="https://github.com/BxNxM/micrOS/blob/master/media/logo_mini.png?raw=true" alt="micrOS Logo" width="60" height="60">
13
50
  <h1> microWeb server </h1>
14
- <p id="restInfo"></p>
51
+ <div id="restInfo">
52
+ <div id="restInfoHeader"></div>
53
+ <div id="endpointHint">🔗 Endpoints:</div>
54
+ <div id="endpointGroups" class="endpoint-groups"></div>
55
+ </div>
56
+ <hr>
15
57
  <h2>🚀 REST API</h2>
16
- <p>Clickable examples 🕹</p>
58
+ <p>Shortcuts:</p>
17
59
  <button onclick="restAPI('system/info')">SysInfo</button>
18
60
  <button onclick="restAPI('system/alarms')">Alarms</button>
19
61
  <button onclick="restAPI('system/clock')">Clock</button>
@@ -0,0 +1,103 @@
1
+ // CORE MICROS BACKEND INTERFACE
2
+
3
+ const BASE_URL = `http://${window.location.hostname}${window.location.port ? `:${window.location.port}` : ""}`;
4
+
5
+ function restAPICore(cmd, timeout=5000) {
6
+ const query = `${BASE_URL}/rest/${cmd.trim().replace(/\s+/g, '/')}`;
7
+ const controller = new AbortController();
8
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
9
+ const startTime = performance.now();
10
+
11
+ return fetch(query, { signal: controller.signal })
12
+ .then(response => {
13
+ clearTimeout(timeoutId);
14
+ if (!response.ok) {throw new Error(`restAPICore code NOK: ${response.status}`);}
15
+ return response.json().then(data => ({response: data,
16
+ delta: (performance.now() - startTime).toFixed(0), query
17
+ }));
18
+ }).catch(error => {
19
+ clearTimeout(timeoutId);
20
+ console.error('Error in restAPICore:', error);
21
+ throw error;
22
+ });
23
+ }
24
+
25
+ function restAPI(cmd='', consoleOut=true, timeout=5000) {
26
+ if (cmd === '') {cmd = document.getElementById('restCmdInput').value;}
27
+ return restAPICore(cmd, timeout).then(({ response, delta, query }) => {
28
+ if (consoleOut) {restConsole(query, response, delta);}
29
+ return response;
30
+ }).catch(error => {
31
+ if (error.name === 'AbortError') {console.error(`Timeout (${timeout}ms) - restAPICore: ${cmd}`);
32
+ } else {console.error('Error in restAPI:', error);}
33
+ return { response: null, delta: 0, query: 'restAPI error' };
34
+ });
35
+ }
36
+
37
+ function restConsole(apiUrl, data, delta) {
38
+ // UPDATES: restConsoleUrl, restConsoleResponse, restConsoleTime
39
+ document.getElementById('restConsoleUrl').innerHTML = `<strong>Generated URL:</strong><br> <a href="${apiUrl}" target="_blank" style="color: white;">${apiUrl}</a>`;
40
+ document.getElementById('restConsoleResponse').innerHTML = JSON.stringify(data, null, 4).replace(/\\n/g, "<br/>" + "&nbsp;".repeat(15));
41
+ document.getElementById('restConsoleTime').innerHTML = `⏱ Response time: ${delta} ms`;
42
+ }
43
+
44
+ function renderEndpointGroups(endpoints) {
45
+ const container = document.getElementById('endpointGroups');
46
+ if (!container) {return;}
47
+ container.innerHTML = '';
48
+ if (!Array.isArray(endpoints) || endpoints.length === 0) {return;}
49
+ const groups = endpoints.reduce((acc, endpoint) => {
50
+ const trimmed = endpoint.replace(/^\/+/, '');
51
+ if (!trimmed) {return acc;}
52
+ const root = trimmed.split('/')[0];
53
+ acc[root] = acc[root] || [];
54
+ acc[root].push(trimmed);
55
+ return acc;
56
+ }, {});
57
+ Object.keys(groups).sort().forEach(group => {
58
+ const entries = groups[group].sort();
59
+ const isSingle = entries.length === 1 && entries[0] === group;
60
+ if (isSingle) {
61
+ const button = document.createElement('button');
62
+ button.textContent = group;
63
+ button.onclick = () => window.open(`/${group}`, '_blank');
64
+ container.appendChild(button);
65
+ return;
66
+ }
67
+ const groupEl = document.createElement('div');
68
+ groupEl.className = 'endpoint-group';
69
+ const title = document.createElement('span');
70
+ title.className = 'endpoint-group-title';
71
+ title.textContent = group;
72
+ groupEl.appendChild(title);
73
+ entries.forEach(entry => {
74
+ const label = entry === group ? group : entry.replace(`${group}/`, '');
75
+ const button = document.createElement('button');
76
+ button.textContent = label;
77
+ button.onclick = () => window.open(`/${entry}`, '_blank');
78
+ groupEl.appendChild(button);
79
+ });
80
+ container.appendChild(groupEl);
81
+ });
82
+ }
83
+
84
+ function restInfo(showPages=true) {
85
+ // UPDATES: 'restInfo' and restConsole(...)
86
+ restAPICore(cmd = '').then(({ response, delta, query }) => {
87
+ // Update API Console
88
+ restConsole(query, response, delta)
89
+ // Update 'restInfo' tag
90
+ const result = response['result'];
91
+ const auth = result.auth ? "🔑" : "";
92
+ let infoHeader = `micrOS: ${result.micrOS} ❖ node: ${result.node}${auth}`;
93
+ if (showPages) {
94
+ const endpoints = result['usr_endpoints'] ? Array.from(result['usr_endpoints']) : [];
95
+ renderEndpointGroups(endpoints);
96
+ }
97
+ document.getElementById('restInfoHeader').innerHTML = infoHeader;
98
+ }).catch(error => {
99
+ console.error('Error in restAPI:', error);
100
+ });
101
+ }
102
+
103
+ // Designed by BxNxM |/|/|/|/
@@ -0,0 +1,129 @@
1
+ // API HELPER FUNCTION - get module exposed widgets
2
+ function moduleHelp(module) {
3
+ const endpoint = `${module}/help/True`;
4
+ console.log(`[API] Endpoint: ${endpoint}`);
5
+ return restAPI(endpoint).then(({ result }) => {
6
+ const parsedWidgets = result.map(item => JSON.parse(item.replace(/\\"/g, '"')));
7
+ console.log(`Parsed ${module} help:`, parsedWidgets);
8
+ return parsedWidgets;
9
+ }).catch(error => {
10
+ console.error(error);
11
+ return [];
12
+ });
13
+ }
14
+
15
+ // PAGE GENERATION
16
+
17
+ function containerAppendChild(elements, container) {
18
+ // Append list of elements into the container aka draw elements :D
19
+ if (!elements || !container) {
20
+ console.error("Inputs array or container element is missing.");
21
+ return;
22
+ }
23
+ elements.forEach(function(element) {
24
+ container.appendChild(element);});
25
+ }
26
+
27
+ function generateElement(type, module, lm_call="", options={}) {
28
+ // type: slider, button, box, h1, h2, p, li, etc.
29
+ // data: rest command
30
+ console.log(`type: ${type}`);
31
+ const data = `${module}/${lm_call}`;
32
+ console.log(`data: ${data}`);
33
+ const container = document.getElementById(`container-${module}`);
34
+ if(!container) {
35
+ console.error("No container");
36
+ }
37
+ if (type === 'slider') {
38
+ // Create slider widget
39
+ sliderWidget(container, data, options)
40
+ } else if (type === 'button') {
41
+ // Create button widget
42
+ buttonWidget(container, data, options)
43
+ } else if (type === 'textbox') {
44
+ // Create textbox widget
45
+ textBoxWidget(container, data, options)
46
+ } else if (type === 'color') {
47
+ // Create color palette widget
48
+ colorPaletteWidget(container, data, options)
49
+ } else if (type === 'joystick') {
50
+ // Create joystick widget
51
+ joystickWidget(container, data, options)
52
+ } else {
53
+ // Create other elements
54
+ const element = document.createElement(type);
55
+ element.textContent = `🧬 ${module}`;
56
+ containerAppendChild([element], container);
57
+ }
58
+ }
59
+
60
+ function autoTitleLen(widgets, lm_call) {
61
+ try {
62
+ const func = lm_call.split('/')[0].split(' ')[0];
63
+ const count = widgets.reduce((accumulator, { lm_call }) => accumulator + (lm_call.split(' ')[0] === func ? 1 : 0), 0);
64
+ return count > 1 ? 2 : 1;
65
+ } catch (error) {
66
+ console.error(error);
67
+ return 1;
68
+ }
69
+ }
70
+
71
+ function craftModuleWidgets(module, widgets) {
72
+ if (!widgets.length) {
73
+ console.log(`${module} no exposed widgets`);
74
+ return;
75
+ }
76
+
77
+ console.log(`Craft widget to ${module}`);
78
+ // Create HTML elements for widgets
79
+ const widgets_section = document.getElementById('widgets-section');
80
+ const widget_container = document.createElement('ol');
81
+ widget_container.id = `container-${module}`;
82
+ widget_container.className = "widget";
83
+ widgets_section.appendChild(widget_container);
84
+ // Create widget title
85
+ generateElement('h2', module);
86
+
87
+ const widgetTypeOptions = {
88
+ button: item => ({title_len: autoTitleLen(widgets, item.lm_call), options: item.options }),
89
+ slider: item => ({title_len: autoTitleLen(widgets, item.lm_call), range: item.range }),
90
+ color: item => ({title_len: autoTitleLen(widgets, item.lm_call), range: item.range }),
91
+ textbox: item => ({title_len: autoTitleLen(widgets, item.lm_call), refresh: item.refresh }),
92
+ joystick: item => ({title_len: autoTitleLen(widgets, item.lm_call), range: item.range })
93
+ };
94
+
95
+ // Create control elements for widget
96
+ widgets.forEach(item => {
97
+ let { type, lm_call } = item;
98
+ lm_call = lm_call.replace(/\s/g, '/');
99
+ const type_options = widgetTypeOptions[type] ? widgetTypeOptions[type](item) : null;
100
+ if (!type_options) {
101
+ console.log(`Unsupported micrOS widget html_type: ${type}`);
102
+ return;
103
+ }
104
+
105
+ try {
106
+ console.log("adding widget controls");
107
+ generateElement(type, module, lm_call, type_options);
108
+ } catch (error) {
109
+ console.error(error);
110
+ }
111
+ });
112
+ }
113
+
114
+ function DynamicWidgetLoad() {
115
+ restAPI('modules').then(data => {
116
+ const app_list = data.result;
117
+ app_list.forEach(module => {
118
+ moduleHelp(module).then(widgets => {
119
+ craftModuleWidgets(module, widgets);
120
+ }).catch(error => {
121
+ console.error(`Error processing module ${module}:`, error);
122
+ });
123
+ });
124
+ }).catch(error => {
125
+ console.error('Error loading modules:', error);
126
+ });
127
+ }
128
+
129
+ // craftModuleWidgets
@@ -0,0 +1,55 @@
1
+ @keyframes backgroundAnimation {
2
+ 0% {background-position: 0% 50%;}
3
+ 50% {background-position: 100% 50%;}
4
+ 100% {background-position: 0% 50%;}
5
+ }
6
+ body {
7
+ min-height: 100vh;
8
+ min-width: 100vw;
9
+ margin: 3%;
10
+ padding: env(safe-area-inset-top)
11
+ env(safe-area-inset-right)
12
+ env(safe-area-inset-bottom)
13
+ env(safe-area-inset-left);
14
+ background: linear-gradient(110deg, #4b3c66, #21184f, #712336);
15
+ background-size: 200% 200%;
16
+ animation: backgroundAnimation 15s infinite;
17
+ color: #d9d9d9;
18
+ font-family: 'Verdana', Sans-serif;
19
+ }
20
+ p {
21
+ word-wrap: break-word;
22
+ }
23
+ pre {
24
+ word-wrap: break-word;
25
+ white-space: pre-wrap;
26
+ }
27
+ button {
28
+ background-color: #e7e7e7; /* Gray */
29
+ border: none;
30
+ color: black;
31
+ font-size: 14px;
32
+ border-radius: 4px;
33
+ transition-duration: 0.4s;
34
+ }
35
+ button:hover {
36
+ background-color: #555555; /* Black */
37
+ color: white;
38
+ }
39
+ ol.widget {
40
+ list-style-type: none;
41
+ padding: 0px;
42
+ margin-right: 40px;
43
+ }
44
+ #widgets-section {
45
+ display: flex; /* Display list items horizontally */
46
+ flex-wrap: wrap; /* Wrap items to multiple lines if needed */
47
+ }
48
+ @media (max-width: 768px) { /* Adjust the breakpoint as needed */
49
+ #widgets-section {
50
+ flex-direction: column; /* Display list items vertically */
51
+ }
52
+ ol.widget {
53
+ margin-right: 0px;
54
+ }
55
+ }