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
@@ -2,22 +2,16 @@
2
2
 
3
3
  import os
4
4
  import sys
5
- import time
6
5
  MYPATH = os.path.dirname(os.path.abspath(__file__))
7
- sys.path.append(os.path.dirname(MYPATH))
8
- import socketClient
9
6
  sys.path.append(os.path.join(MYPATH, '../lib/'))
10
7
  from TerminalColors import Colors
11
8
 
12
- # FILL OUT
13
- DEVICE = 'node01'
14
- PASSWD = None
15
-
16
- def base_cmd():
17
- if PASSWD is None:
18
- return ['--dev', DEVICE]
19
- return ['--dev', DEVICE, '--password', PASSWD]
9
+ try:
10
+ from ._app_base import AppBase
11
+ except:
12
+ from _app_base import AppBase
20
13
 
14
+ CLIENT = None
21
15
 
22
16
  def app(devfid=None, pwd=None):
23
17
  """
@@ -25,14 +19,13 @@ def app(devfid=None, pwd=None):
25
19
  send command(s) over socket connection [socketClient.run(args)]
26
20
  list load module commands and send in single connection
27
21
  """
28
- global DEVICE, PASSWD
29
- if devfid is not None:
30
- DEVICE = devfid
31
- if pwd is not None:
32
- PASSWD = pwd
33
- # EDIT YOUR COMMAND
34
- args = base_cmd() + ['help', 'version']
35
- status, answer = socketClient.run(args)
22
+ global CLIENT
23
+ CLIENT = AppBase(device=devfid, password=pwd)
24
+
25
+ output = CLIENT.execute(['help', 'version'])
26
+ status = output[0]
27
+ result = output[1]
28
+ print(f"{Colors.WARN}[{status}]{Colors.NC} {result}")
36
29
 
37
30
 
38
31
  if __name__ == "__main__":
@@ -0,0 +1,34 @@
1
+ #####################################
2
+ # APP CONFIG #
3
+ #####################################
4
+ import os, sys
5
+ MYPATH = os.path.dirname(os.path.abspath(__file__))
6
+ sys.path.append(os.path.dirname(MYPATH))
7
+ import socketClient
8
+
9
+ class AppBase:
10
+
11
+ def __init__(self, device:str, password:str):
12
+ self.device = device
13
+ self.password = password
14
+
15
+ def base_cmd(self) -> list:
16
+ if self.password is None:
17
+ return ['--dev', self.device]
18
+ return ['--dev', self.device, '--password', self.password]
19
+
20
+ def get_device(self):
21
+ return self.device
22
+
23
+ def execute(self, cmd_list, tout=5, verbose=False):
24
+ cmd_args = self.base_cmd() + cmd_list
25
+ print(f"Execute: {cmd_args}")
26
+ return socketClient.run(cmd_args, timeout=tout, verbose=verbose)
27
+
28
+ def run(self, cmd_list):
29
+ """Legacy"""
30
+ out = self.execute(cmd_list)
31
+ return out[0], out[1]
32
+
33
+ def connection_metrics(self):
34
+ return socketClient.connection_metrics(f"{self.device}.local")
@@ -0,0 +1,78 @@
1
+ import matplotlib.pyplot as plt
2
+ import matplotlib.animation as animation
3
+ import multiprocessing as mp
4
+ from collections import deque
5
+ from datetime import datetime
6
+ import matplotlib.dates as mdates
7
+
8
+ def visualizer_main(queue):
9
+ # Make figure wider and a bit taller
10
+ fig, (ax_accel, ax_gyro) = plt.subplots(2, 1, figsize=(14, 8))
11
+ plt.subplots_adjust(top=0.88, bottom=0.12, hspace=0.3)
12
+
13
+ history = 100
14
+ accel_data = {'x': deque([0] * history, maxlen=history),
15
+ 'y': deque([0] * history, maxlen=history),
16
+ 'z': deque([0] * history, maxlen=history)}
17
+ gyro_data = {'x': deque([0] * history, maxlen=history),
18
+ 'y': deque([0] * history, maxlen=history),
19
+ 'z': deque([0] * history, maxlen=history)}
20
+ time_axis = deque([datetime.now()] * history, maxlen=history)
21
+
22
+ # Increase line width here
23
+ line_width = 2.5
24
+
25
+ accel_lines = {
26
+ axis: ax_accel.plot([], [], label=f'accel_{axis}', linewidth=line_width)[0]
27
+ for axis in 'xyz'
28
+ }
29
+ gyro_lines = {
30
+ axis: ax_gyro.plot([], [], label=f'gyro_{axis}', linewidth=line_width)[0]
31
+ for axis in 'xyz'
32
+ }
33
+
34
+ ax_accel.set_ylim(-2, 2)
35
+ ax_gyro.set_ylim(-300, 300)
36
+
37
+ for ax in [ax_accel, ax_gyro]:
38
+ ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M:%S'))
39
+ ax.legend()
40
+ ax.grid(True)
41
+ ax.set_xlabel("Time (H:M:S)")
42
+
43
+ ax_accel.set_title("Acceleration")
44
+ ax_gyro.set_title("Gyroscope")
45
+
46
+ def update(_):
47
+ try:
48
+ while not queue.empty():
49
+ data = queue.get_nowait()
50
+ current_time = datetime.now()
51
+ time_axis.append(current_time)
52
+
53
+ for axis, val in zip('xyz', data['accel']):
54
+ accel_data[axis].append(val)
55
+ for axis, val in zip('xyz', data['gyro']):
56
+ gyro_data[axis].append(val)
57
+ except Exception as e:
58
+ print(f"Visualizer error: {e}")
59
+ return
60
+
61
+ for axis in 'xyz':
62
+ accel_lines[axis].set_data(time_axis, accel_data[axis])
63
+ gyro_lines[axis].set_data(time_axis, gyro_data[axis])
64
+
65
+ for ax in [ax_accel, ax_gyro]:
66
+ ax.set_xlim(time_axis[0], time_axis[-1])
67
+ ax.figure.autofmt_xdate()
68
+
69
+ return list(accel_lines.values()) + list(gyro_lines.values())
70
+
71
+ ani = animation.FuncAnimation(fig, update, interval=50)
72
+ plt.show()
73
+
74
+
75
+ if __name__ == "__main__":
76
+ mp.set_start_method('spawn')
77
+ queue = mp.Queue()
78
+ visualizer_main(queue)
@@ -4,28 +4,23 @@ import os
4
4
  import sys
5
5
  import time
6
6
  MYPATH = os.path.dirname(os.path.abspath(__file__))
7
- sys.path.append(os.path.dirname(MYPATH))
8
- import socketClient
9
7
  sys.path.append(os.path.join(MYPATH, '../lib/'))
10
8
  from TerminalColors import Colors
11
9
 
12
- # FILL OUT
13
- DEVICE = 'node01'
14
-
15
-
16
- def base_cmd():
17
- return ['--dev', DEVICE]
10
+ try:
11
+ from ._app_base import AppBase
12
+ except:
13
+ from _app_base import AppBase
18
14
 
15
+ CLIENT = None
19
16
 
20
17
  def light_demo(modules, smooth=True, sample=10):
21
18
  verdict = [True, []]
22
19
  smooth_str = '[smooth]' if smooth else '[simple]'
23
20
 
24
- if 'LM_rgb' in modules:
25
- args = base_cmd() + [f'rgb random {smooth}'] * sample + ['rgb toggle False']
26
- print(args)
21
+ if 'rgb' in modules:
27
22
  delta_t = time.time()
28
- status_rgb, answer_rgb = socketClient.run(args)
23
+ status_rgb, answer_rgb = CLIENT.run([f'rgb random {smooth}'] * sample + ['rgb toggle False'])
29
24
  delta_t = round((time.time() - delta_t) / sample, 2)
30
25
  if status_rgb:
31
26
  msg = f"{smooth_str} rgb module random color func: {Colors.OK}OK{Colors.NC} [{delta_t}sec]"
@@ -35,10 +30,9 @@ def light_demo(modules, smooth=True, sample=10):
35
30
  verdict[1].append(msg)
36
31
  verdict[0] &= False
37
32
 
38
- if 'LM_cct' in modules:
39
- args = base_cmd() + [f'cct random {smooth}'] * sample + ['cct toggle False']
33
+ if 'cct' in modules:
40
34
  delta_t = time.time()
41
- status_cct, answer_cct = socketClient.run(args)
35
+ status_cct, answer_cct = CLIENT.run([f'cct random {smooth}'] * sample + ['cct toggle False'])
42
36
  delta_t = round((time.time() - delta_t) / sample, 2)
43
37
  if status_cct:
44
38
  msg = f"{smooth_str} cct module random color func: {Colors.OK}OK{Colors.NC} [{delta_t}sec]"
@@ -48,10 +42,9 @@ def light_demo(modules, smooth=True, sample=10):
48
42
  verdict[1].append(msg)
49
43
  verdict[0] &= False
50
44
 
51
- if 'LM_neopixel' in modules:
52
- args = base_cmd() + [f'neopixel random {smooth}'] * sample + ['neopixel toggle False']
45
+ if 'neopixel' in modules:
53
46
  delta_t = time.time()
54
- status_neo, answer_neo = socketClient.run(args)
47
+ status_neo, answer_neo = CLIENT.run([f'neopixel random {smooth}'] * sample + ['neopixel toggle False'])
55
48
  delta_t = round((time.time() - delta_t) / sample, 2)
56
49
  if status_neo:
57
50
  msg = f"{smooth_str} neopixel module random color func: {Colors.OK}OK{Colors.NC} [{delta_t}sec]"
@@ -63,19 +56,17 @@ def light_demo(modules, smooth=True, sample=10):
63
56
  return verdict
64
57
 
65
58
 
66
- def app(devfid=None):
59
+ def app(devfid=None, pwd=None):
67
60
  """
68
61
  devfid: selected device input
69
62
  send command(s) over socket connection [socketClient.run(args)]
70
63
  list load module commands and send in single connection
71
64
  """
72
- global DEVICE
73
- if devfid is not None:
74
- DEVICE = devfid
65
+ global CLIENT
66
+ CLIENT = AppBase(device=devfid, password=pwd)
75
67
 
76
68
  # Get loaded modules
77
- args = base_cmd() + ['lmpacman module']
78
- status, modules = socketClient.run(args)
69
+ status, modules = CLIENT.run(['modules'])
79
70
  print("status: {}\nanswer: {}".format(status, modules))
80
71
 
81
72
  if not status:
toolkit/index.html CHANGED
@@ -11,15 +11,15 @@
11
11
  50% {background-position: 100% 50%;}
12
12
  100% {background-position: 0% 50%;}}
13
13
  body {
14
- height: 400vh;
15
- width: 200vh;
14
+ height: calc(100vh - 6%); /* Set the height to 100% of the viewport height */
15
+ width: calc(100vw - 6%); /* Set the width to 200% of the viewport height */
16
16
  padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);
17
- margin: 40px;
17
+ margin: 3%;
18
18
  background: linear-gradient(110deg, #720000, #656565, #252525);
19
19
  background-size: 400% 400%;
20
20
  animation: backgroundAnimation 20s infinite;
21
21
  color: #d9d9d9;
22
- font-family: 'Arial', sans-serif;
22
+ font-family: 'Verdana', Sans-serif;
23
23
  }
24
24
  button {
25
25
  background-color: #e7e7e7; /* Gray */
@@ -40,7 +40,7 @@
40
40
  <h1> micrOS GATEWAY </h1>
41
41
  <!-- Display micrOSDevices output -->
42
42
  <p id="micrOSDevices"></p>
43
- <p> micrOS gateway <b>v2.0</b> </p>
43
+ <p> micrOS gateway <b>v2.1</b> </p>
44
44
  <p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/list &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List known devices, sort by online/offline </p>
45
45
  <p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/search &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Search devices </p>
46
46
  <p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/status &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Get all device status - node info </p>
@@ -49,6 +49,7 @@
49
49
  <p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/image/&lt;device&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Get esp camera image over gateway (without device param endpoint lists cameras)</p>
50
50
  <p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/imgstream&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Get esp camera image stream (with camera endpoint detection)</p>
51
51
  <p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/webhooks/&lt;payload&gt;/&lt;args&gt &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Webhook for micrOS Gateway. Payload: name of the script. Args: optional script args </p>
52
+ <p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/webhooks/macro/&lt;macroName&gt &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Webhook/macro for micrOS Gateway. macroName: macro to call </p>
52
53
 
53
54
  <div id="camera_stream_link">Camera stream link</div>
54
55
 
@@ -186,11 +186,13 @@ class FileHandler:
186
186
  os.remove(path)
187
187
  elif type_ == 'd':
188
188
  shutil.rmtree(path)
189
+ return True
189
190
  except Exception as e:
190
191
  if ignore:
191
192
  debug_print("[DEBUG] Removing " + path + " is forced to ignore failure: " + str(e))
192
193
  else:
193
194
  raise Exception("Cannot remove " + path + ": " + str(e))
195
+ return False
194
196
 
195
197
  @staticmethod
196
198
  def extract_tar(targz, extract_path):
@@ -210,7 +212,10 @@ class FileHandler:
210
212
  def copy(from_path, to_path):
211
213
  debug_print("[DEBUG] Copy " + from_path + " to " + to_path)
212
214
  try:
213
- shutil.copy(from_path, to_path)
215
+ if os.path.isdir(from_path):
216
+ shutil.copytree(from_path, to_path, dirs_exist_ok=True)
217
+ else:
218
+ shutil.copy(from_path, to_path)
214
219
  return True
215
220
  except Exception as e:
216
221
  debug_print("Copy error: {}".format(e))
@@ -0,0 +1,46 @@
1
+ import os
2
+
3
+ try:
4
+ from . import LocalMachine
5
+ except Exception as e:
6
+ print("Import warning __name__:{}: {}".format(__name__, e))
7
+ import LocalMachine
8
+
9
+ PYTHON_EXTENSIONS = ('py', 'mpy')
10
+ WEB_ONLY = ('js', 'html', 'css', 'json', 'ico', 'jpeg', 'png')
11
+ ENABLED_EXTENSIONS = PYTHON_EXTENSIONS + WEB_ONLY
12
+
13
+ def check_all_extensions(path):
14
+ extension = path.split('.')[-1]
15
+ if extension in ENABLED_EXTENSIONS:
16
+ return True
17
+ return False
18
+
19
+ def check_web_extensions(path):
20
+ extension = path.split('.')[-1]
21
+ if extension in WEB_ONLY:
22
+ return True
23
+ return False
24
+
25
+ def check_python_extensions(path):
26
+ extension = path.split('.')[-1]
27
+ if extension in PYTHON_EXTENSIONS:
28
+ return True
29
+ return False
30
+
31
+ def micros_resource_list(root_folder):
32
+ resources_path = []
33
+ subfolders = []
34
+ for source in LocalMachine.FileHandler.list_dir(root_folder):
35
+ source_full_path = os.path.join(root_folder, source)
36
+ # [1] / Root directory source files and folders.
37
+ if check_all_extensions(source):
38
+ resources_path.append(source_full_path)
39
+ # [2] /dir Handle sub dictionary sources
40
+ elif LocalMachine.FileHandler.path_is_exists(source_full_path)[1] == 'd':
41
+ subfolders.append(source)
42
+ for sub_source in LocalMachine.FileHandler.list_dir(source_full_path):
43
+ sub_source_full_path = os.path.join(source_full_path, sub_source)
44
+ if check_all_extensions(sub_source):
45
+ resources_path.append(sub_source_full_path)
46
+ return resources_path, subfolders
@@ -0,0 +1,64 @@
1
+ import requests
2
+ import zipfile
3
+ import io
4
+ import os
5
+
6
+ try:
7
+ from .LocalMachine import CommandHandler
8
+ except:
9
+ from LocalMachine import CommandHandler
10
+
11
+
12
+ def git_clone_archive(url):
13
+ """
14
+ Clone git repo as archive (without git installed)
15
+ Note: No git history, it is just a snapshot
16
+ :param url: https://github.com/micropython/webrepl
17
+ """
18
+ print(f"CLONE ARCHIVE: {url}")
19
+ url = url.replace(".git", "") if url.endswith(".git") else url
20
+ # URL of the repository zip archive (adjust branch name if needed)
21
+ target_name = url.split("/")[-1].strip()
22
+ zip_url = f"{url}/archive/refs/heads/master.zip"
23
+ response = requests.get(zip_url)
24
+ if response.status_code == 200:
25
+ # Read the downloaded content as a binary stream
26
+ with zipfile.ZipFile(io.BytesIO(response.content)) as z:
27
+ for member in z.infolist():
28
+ # Each member's filename is something like 'webrepl-master/filename'
29
+ # Remove the first directory component
30
+ parts = member.filename.split('/', 1)
31
+ if len(parts) > 1:
32
+ relative_path = parts[1]
33
+ else:
34
+ relative_path = parts[0]
35
+
36
+ # Build the target path relative to the current directory
37
+ target_path = os.path.join(target_name, relative_path)
38
+
39
+ if member.is_dir():
40
+ os.makedirs(target_path, exist_ok=True)
41
+ else:
42
+ os.makedirs(os.path.dirname(target_path), exist_ok=True)
43
+ with z.open(member) as source, open(target_path, 'wb') as target_file:
44
+ target_file.write(source.read())
45
+ print(f"\tRepository extracted successfully: {target_name}")
46
+ return 0, zip_url, ""
47
+ print(f"\tFailed to download repository archive: {target_name}")
48
+ return 1, zip_url, ""
49
+
50
+
51
+ def git_clone(url):
52
+ """
53
+ Git clone - subshell call
54
+ - git is needed to be preinstalled
55
+ """
56
+ print(f"GIT CLONE: {url}")
57
+ target_name = url.split("/")[-1].strip().replace(".git", "")
58
+ command = 'git clone {url} {name}'.format(name=target_name, url=url)
59
+ exitcode, stdout, stderr = CommandHandler.run_command(command, shell=True)
60
+ if exitcode == 0:
61
+ print(f"\tRepository was cloned successfully: {target_name}")
62
+ else:
63
+ print(f"\tRepository clone failed: {target_name}")
64
+ return exitcode, stdout, stderr
@@ -16,6 +16,8 @@ class Colors:
16
16
  OKGREEN = '\033[92m'
17
17
  HEADER = '\033[95m'
18
18
  UNDERLINE = '\033[4m'
19
+ LIGHT_GRAY = '\033[37m'
20
+ GRAY = '\033[90m'
19
21
  else:
20
22
  NC = ''
21
23
  OK = ''
@@ -26,6 +28,8 @@ class Colors:
26
28
  OKGREEN = ''
27
29
  HEADER = ''
28
30
  UNDERLINE = ''
31
+ LIGHT_GRAY = ''
32
+ GRAY = ''
29
33
 
30
34
 
31
35
  if __name__ == "__main__":