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,7 +2,7 @@
2
2
 
3
3
  from utime import sleep_ms
4
4
  from machine import Pin
5
- from microIO import physical_pin, pinmap_dump
5
+ from microIO import bind_pin, pinmap_search
6
6
  STEPPER_INST = None
7
7
 
8
8
 
@@ -30,10 +30,10 @@ class StepperULN2003:
30
30
  [1, 0, 0, 1]]
31
31
  self.delay = 2
32
32
  # Init stepper pins
33
- self.pin1 = Pin(physical_pin('stppr_1'), Pin.OUT)
34
- self.pin2 = Pin(physical_pin('stppr_2'), Pin.OUT)
35
- self.pin3 = Pin(physical_pin('stppr_3'), Pin.OUT)
36
- self.pin4 = Pin(physical_pin('stppr_4'), Pin.OUT)
33
+ self.pin1 = Pin(bind_pin('stppr_1'), Pin.OUT)
34
+ self.pin2 = Pin(bind_pin('stppr_2'), Pin.OUT)
35
+ self.pin3 = Pin(bind_pin('stppr_3'), Pin.OUT)
36
+ self.pin4 = Pin(bind_pin('stppr_4'), Pin.OUT)
37
37
  # Initialize all value to 0 - "OFF"
38
38
  self.reset()
39
39
 
@@ -86,7 +86,7 @@ def __init_stepper(mode='HALF'):
86
86
  return STEPPER_INST
87
87
 
88
88
 
89
- def load_n_init(mode="HALF"):
89
+ def load(mode="HALF"):
90
90
  """
91
91
  Init stepper motor module
92
92
  :param mode: step mode: HALF/FULL
@@ -141,7 +141,7 @@ def pinmap():
141
141
  - info which pins to use for this application
142
142
  :return dict: pin name (str) - pin value (int) pairs
143
143
  """
144
- return pinmap_dump(['stppr_1', 'stppr_2', 'stppr_3', 'stppr_4'])
144
+ return pinmap_search(['stppr_1', 'stppr_2', 'stppr_3', 'stppr_4'])
145
145
 
146
146
 
147
147
  def help(widgets=False):
@@ -154,5 +154,5 @@ def help(widgets=False):
154
154
  return 'angle dg=+/-360 speed=<ms>',\
155
155
  'step st=+/-2 speed=<ms>',\
156
156
  'standby',\
157
- 'load_n_init mode=<"HALF"/"FULL">', 'pinmap'\
157
+ 'load mode=<"HALF"/"FULL">', 'pinmap'\
158
158
  'Info: stepper: 28byj-48 driver: ULN2003'
@@ -1,5 +1,7 @@
1
1
  from machine import Pin
2
- from microIO import physical_pin, pinmap_dump
2
+ from microIO import bind_pin, pinmap_search
3
+ from Common import data_dir
4
+ from Types import resolve
3
5
 
4
6
  #########################################
5
7
  # DIGITAL IO SWITCH #
@@ -7,6 +9,7 @@ from microIO import physical_pin, pinmap_dump
7
9
  __SWITCH_OBJ = [None, None, None, None]
8
10
  __PERSISTENT_CACHE = False
9
11
  __SWITCH_STATE = [0, 0, 0, 0]
12
+ __FILE_CACHE = data_dir('switch.cache')
10
13
 
11
14
 
12
15
  #########################################
@@ -15,7 +18,7 @@ __SWITCH_STATE = [0, 0, 0, 0]
15
18
 
16
19
  def __persistent_cache_manager(mode):
17
20
  """
18
- pds - persistent data structure
21
+ File cache
19
22
  modes:
20
23
  r - recover, s - save
21
24
  """
@@ -24,12 +27,12 @@ def __persistent_cache_manager(mode):
24
27
  global __SWITCH_STATE
25
28
  if mode == 's':
26
29
  # SAVE CACHE
27
- with open('switch.pds', 'w') as f:
30
+ with open(__FILE_CACHE, 'w') as f:
28
31
  f.write(','.join([str(k) for k in __SWITCH_STATE]))
29
32
  return
30
33
  try:
31
34
  # RESTORE CACHE
32
- with open('switch.pds', 'r') as f:
35
+ with open(__FILE_CACHE, 'r') as f:
33
36
  __SWITCH_STATE = [int(data) for data in f.read().strip().split(',')]
34
37
  except:
35
38
  pass
@@ -49,11 +52,11 @@ def __init_switches_state(state=None, ch_init=None):
49
52
  set_state4(state)
50
53
 
51
54
 
52
- def load_n_init(cache=None, ch_init=None):
55
+ def load(cache=None, ch_init=None):
53
56
  """
54
57
  Initiate switch module (4 switch pack)
55
58
  :param cache bool: file state machine cache: True/False/None(default: automatic True)
56
- - Load .pds (state machine cache) for this load module
59
+ - Load .cache (state machine cache) for this load module
57
60
  - Apply loaded states to gpio pins (boot function)
58
61
  :return str: Cache state
59
62
  """
@@ -81,7 +84,7 @@ def load_n_init(cache=None, ch_init=None):
81
84
 
82
85
  def __switch_init():
83
86
  if __SWITCH_OBJ[0] is None:
84
- __SWITCH_OBJ[0] = Pin(physical_pin('switch_1'), Pin.OUT)
87
+ __SWITCH_OBJ[0] = Pin(bind_pin('switch_1'), Pin.OUT)
85
88
  return __SWITCH_OBJ[0]
86
89
 
87
90
 
@@ -117,7 +120,7 @@ def toggle():
117
120
 
118
121
  def __switch2_init():
119
122
  if __SWITCH_OBJ[1] is None:
120
- __SWITCH_OBJ[1] = Pin(physical_pin('switch_2'), Pin.OUT)
123
+ __SWITCH_OBJ[1] = Pin(bind_pin('switch_2'), Pin.OUT)
121
124
  return __SWITCH_OBJ[1]
122
125
 
123
126
 
@@ -152,7 +155,7 @@ def toggle2():
152
155
 
153
156
  def __switch3_init():
154
157
  if __SWITCH_OBJ[2] is None:
155
- __SWITCH_OBJ[2] = Pin(physical_pin('switch_3'), Pin.OUT)
158
+ __SWITCH_OBJ[2] = Pin(bind_pin('switch_3'), Pin.OUT)
156
159
  return __SWITCH_OBJ[2]
157
160
 
158
161
 
@@ -187,7 +190,7 @@ def toggle3():
187
190
 
188
191
  def __switch4_init():
189
192
  if __SWITCH_OBJ[3] is None:
190
- __SWITCH_OBJ[3] = Pin(physical_pin('switch_4'), Pin.OUT)
193
+ __SWITCH_OBJ[3] = Pin(bind_pin('switch_4'), Pin.OUT)
191
194
  return __SWITCH_OBJ[3]
192
195
 
193
196
 
@@ -250,7 +253,7 @@ def pinmap():
250
253
  - info which pins to use for this application
251
254
  :return dict: pin name (str) - pin value (int) pairs
252
255
  """
253
- return pinmap_dump(['switch_1', 'switch_2', 'switch_3', 'switch_4'])
256
+ return pinmap_search(['switch_1', 'switch_2', 'switch_3', 'switch_4'])
254
257
 
255
258
 
256
259
  def help(widgets=False):
@@ -260,10 +263,10 @@ def help(widgets=False):
260
263
  (widgets=False) list of functions implemented by this application
261
264
  (widgets=True) list of widget json for UI generation
262
265
  """
263
- return 'set_state state=<0,1>', 'toggle', \
264
- 'set_state2 state=<0,1>', 'toggle2', \
265
- 'set_state3 state=<0,1>', 'toggle3', \
266
- 'set_state4 state=<0,1>', 'toggle4', \
267
- 'load_n_init cache=None<True/False> ch_init=[1,2,3,4]',\
268
- 'status',\
269
- 'pinmap'
266
+ return resolve(('set_state state=<0,1>', 'BUTTON toggle',
267
+ 'set_state2 state=<0,1>', 'BUTTON toggle2',
268
+ 'set_state3 state=<0,1>', 'BUTTON toggle3',
269
+ 'set_state4 state=<0,1>', 'BUTTON toggle4',
270
+ 'load cache=None<True/False> ch_init=[1,2,3,4]',
271
+ 'status',
272
+ 'pinmap'), widgets=widgets)
@@ -1,9 +1,13 @@
1
- from os import statvfs, getcwd
1
+ from uos import statvfs, getcwd, uname
2
2
  from utime import localtime
3
- from Common import socket_stream
4
- from Network import get_mac
3
+ from network import WLAN, STA_IF, AP_IF
4
+ from binascii import hexlify
5
+ from Common import socket_stream, console
6
+ from Network import get_mac, ifconfig as network_config
5
7
  from Time import ntp_time, set_time, uptime
6
8
  from Tasks import Manager
9
+ from Types import resolve
10
+ from Notify import Notify
7
11
 
8
12
  try:
9
13
  from gc import mem_free, mem_alloc, collect
@@ -51,13 +55,12 @@ def info():
51
55
  - cpu clock, ram, free fs, upython, board, mac addr, uptime
52
56
  """
53
57
  from machine import freq
54
- from os import uname
55
58
 
56
59
  buffer = top()
57
60
  buffer.update({'CPU clock [MHz]': int(freq() * 0.0000001), 'upython': uname()[3],
58
61
  'board': uname()[4], 'uptime': uptime()})
59
62
  try:
60
- buffer['mac'] = get_mac()
63
+ buffer['mac'] = hexlify(get_mac(), ':').decode()
61
64
  except:
62
65
  buffer['mac'] = 'n/a'
63
66
  return buffer
@@ -79,6 +82,7 @@ def heartbeat():
79
82
  """
80
83
  Test function for built-in led blinking and test reply message
81
84
  """
85
+ console("<3 heartbeat <3")
82
86
  return "<3 heartbeat <3"
83
87
 
84
88
 
@@ -120,18 +124,18 @@ def sun(refresh=False):
120
124
  return Sun.TIME
121
125
 
122
126
 
123
- def setclock(year, month, mday, hour, min, sec):
127
+ def setclock(year, month, mday, hour, minute, sec):
124
128
  """
125
129
  Set Localtime + RTC Clock manually
126
130
  :param year
127
131
  :param month
128
132
  :param mday
129
133
  :param hour
130
- :param min
134
+ :param minute
131
135
  :param sec
132
136
  :return: localtime
133
137
  """
134
- set_time(year, month, mday, hour, min, sec)
138
+ set_time(year, month, mday, hour, minute, sec)
135
139
  return localtime()
136
140
 
137
141
 
@@ -139,78 +143,109 @@ def rssi():
139
143
  """
140
144
  Show Wifi RSSI - wifi strength
141
145
  """
142
- from network import WLAN, STA_IF
143
- value = WLAN(STA_IF).status('rssi')
144
- if value > -67:
145
- return {'Amazing': value}
146
- if value > -70:
147
- return {'VeryGood': value}
148
- if value > -80:
149
- return {'Okay': value}
150
- if value > -90:
151
- return {'NotGood': value}
152
- return {'Unusable': value}
153
-
154
-
155
- def pinmap(key='builtin'):
146
+ if ifconfig()[0] == "STA":
147
+ value = WLAN(STA_IF).status('rssi')
148
+ if value > -67:
149
+ return {'Amazing': value}
150
+ if value > -70:
151
+ return {'VeryGood': value}
152
+ if value > -80:
153
+ return {'Okay': value}
154
+ if value > -90:
155
+ return {'NotGood': value}
156
+ return {'Unusable': value}
157
+ return {'Unavailable': -90}
158
+
159
+
160
+ def list_stations():
161
+ """
162
+ AccessPoint mode "router"
163
+ - list connected devices
164
+ """
165
+ if ifconfig()[0] == "AP":
166
+ ap = WLAN(AP_IF)
167
+ stations = ap.status('stations')
168
+ connected_devices = []
169
+ for sta in stations:
170
+ mac_address, mac_rssi = '', ''
171
+ if len(sta) > 0:
172
+ mac_bytes = sta[0]
173
+ mac_address = hexlify(mac_bytes, ':').decode()
174
+ elif len(sta) > 1:
175
+ mac_rssi = sta(1)
176
+ connected_devices.append((mac_address, mac_rssi))
177
+ return connected_devices
178
+ return [("NoAP", '')]
179
+
180
+
181
+ def pinmap(keys:str=None) -> dict:
156
182
  """
157
183
  Get Logical pin by key runtime
158
- :param key str: logical pin name to resolve
184
+ :param keys: logical pin name or names to resolve
185
+ example: 'builtin irq1 irq2 irq3 irq4'
159
186
  :return dict: key map
160
187
  """
161
- from microIO import pinmap_dump, get_pinmap
162
- map = get_pinmap()
163
- map[key] = pinmap_dump(key)[key]
164
- return map
188
+ from microIO import pinmap_search, pinmap_info
189
+ if keys is None:
190
+ map = pinmap_info(show_all=True) # map, booked, custom, known_maps
191
+ return map
192
+ keys = keys.replace(',', '').split()
193
+ return pinmap_search(keys)
194
+
165
195
 
166
196
  @socket_stream
167
- def alarms(clean=False, test=False, msgobj=None):
197
+ def alarms(clean=False, msgobj=None):
168
198
  """
169
199
  Show micrOS alarms - system error list
170
200
  :param clean bool: clean alarms, default: False
171
- :param test bool: create test alarms, set True
172
201
  :return dict: verdict
173
202
  """
174
- from Debug import errlog_get, errlog_add, errlog_clean
175
- if test:
176
- errlog_add('[ERR] TeSt ErRoR')
203
+ from Logger import log_clean, syslog
177
204
  if clean:
178
- errlog_clean(msgobj=msgobj)
179
- errcnt = errlog_get(msgobj=msgobj)
205
+ log_clean(msgobj=msgobj)
206
+ errcnt = -1 if syslog is None else syslog(msgobj=msgobj)
180
207
  return {'NOK alarm': errcnt} if errcnt > 0 else {'OK alarm': errcnt}
181
208
 
182
209
 
183
- def dat_dump():
210
+ def ifconfig():
184
211
  """
185
- Generic .dat file dump
186
- - logged data from LMs
212
+ Show network ifconfig
187
213
  """
188
- from os import listdir
189
- dats = (f for f in listdir() if f.endswith('.dat'))
190
- out = {}
191
- for dat in dats:
192
- with open(dat, 'r') as f:
193
- out[dat] = f.read()
194
- return out
214
+ return network_config()
195
215
 
196
216
 
197
- def ifconfig():
217
+ def hosts():
198
218
  """
199
- Show network ifconfig
219
+ Dump cached hosts
220
+ - urequests (only memory cache)
221
+ - intercon connection cache
200
222
  """
201
- from Network import ifconfig
202
- return ifconfig()
223
+ from urequests import host_cache
224
+ from InterConnect import host_cache as ihost_cache
225
+ return {"urequests": host_cache(), "intercon": ihost_cache()}
203
226
 
204
227
 
205
- def urequests_host_cache():
228
+ def notifications(enable=None):
206
229
  """
207
- Debug function for urequests address caching
208
- - returns all known http(s) host addresses
209
- - cache only in memory
230
+ Global notifications control for micrOS
231
+ :param enable: True: Enable notifications / False: Disable notifications
232
+ return: show state verdict and available notification handlers
210
233
  """
211
- from urequests import host_cache
212
- return host_cache()
234
+ return Notify.notifications(state=enable)
213
235
 
236
+ def notify(msg, *args, **kwargs):
237
+ """
238
+ Send notification over registered notification handlers
239
+ :param msg: notification message
240
+ :param channels (optional): select communication interface(s) by class name
241
+ e.g. "Telegram", "MQTT" or an iterable of these.
242
+ If omitted or empty, sends over all available channels.
243
+ :param *: optional interface dependent options (topic, chat_id, etc...)
244
+ Control with:
245
+ system notifications enable=True
246
+ system notifications enable=False
247
+ """
248
+ return Notify.notify(msg, *args, **kwargs)
214
249
 
215
250
  #######################
216
251
  # LM helper functions #
@@ -223,8 +258,10 @@ def help(widgets=False):
223
258
  (widgets=False) list of functions implemented by this application
224
259
  (widgets=True) list of widget json for UI generation
225
260
  """
226
- return 'info', 'top', 'gclean', 'heartbeat', 'clock',\
227
- 'setclock year month mday hour min sec',\
228
- 'ntp', 'rssi', 'pinmap key="dhtpin"/None', 'alarms clean=False',\
229
- 'sun refresh=False', 'ifconfig', 'memory_usage',\
230
- 'disk_usage', 'dat_dump', 'urequests_host_cache'
261
+ return resolve(('info', 'TEXTBOX top', 'gclean', 'heartbeat', 'clock',
262
+ 'setclock year month mday hour minute sec',
263
+ 'ntp', 'rssi', 'list_stations', 'pinmap key="builtin"', 'alarms clean=False',
264
+ 'notifications enable=<None,True,False>',
265
+ 'notify "msg" *',
266
+ 'sun refresh=False', 'ifconfig', 'memory_usage',
267
+ 'disk_usage', 'hosts'), widgets=widgets)
@@ -0,0 +1,187 @@
1
+ """
2
+ A MicroPython library for the TCS3472 light sensing chip
3
+ https://github.com/tti0/tcs3472-micropython
4
+
5
+ Copyright (c) 2021 tti0
6
+ Licensed under the MIT License
7
+ """
8
+
9
+ from struct import unpack
10
+ from time import sleep
11
+ from machine import I2C, Pin, PWM
12
+ from microIO import bind_pin, pinmap_search
13
+ from Types import resolve
14
+
15
+ from LM_neopixel import load as neo_load, color as neo_color, toggle as neo_toggle # local neopixel light indicator
16
+ from LM_cluster import run as cluster_run # DEMO: neomatrix cluster
17
+
18
+ CURRENT_ANIMATION_INDEX = 0 # DEMO: neomatrix cluster animation
19
+
20
+ class TCS3472:
21
+ INSTANCE = None
22
+
23
+ def __init__(self, address=0x29, led_pin=None):
24
+ self._bus = I2C(sda=Pin(bind_pin('i2c_sda')), scl=Pin(bind_pin('i2c_scl')))
25
+ self._i2c_address = address
26
+ self._bus.writeto(self._i2c_address, b'\x80\x03')
27
+ self._bus.writeto(self._i2c_address, b'\x81\x2b')
28
+ self.led = PWM(Pin(bind_pin('led', led_pin), Pin.OUT), freq=20480)
29
+ self.led_brightness = 20
30
+ TCS3472.INSTANCE = self
31
+
32
+ def scaled(self, saturation=1.5):
33
+ """
34
+ Normalize by strongest color, then adjust saturation.
35
+ saturation = 1.0 -> normal
36
+ saturation > 1.0 -> more vibrant
37
+ saturation < 1.0 -> more pastel
38
+ """
39
+ _, r, g, b = self.raw()
40
+ m = max(r, g, b)
41
+ if m == 0:
42
+ return 0.0, 0.0, 0.0
43
+
44
+ # Normalize by strongest channel
45
+ r, g, b = r / m, g / m, b / m
46
+
47
+ # Grayscale = average of channels
48
+ gray = (r + g + b) / 3
49
+
50
+ # Interpolate between gray and color
51
+ r = gray + (r - gray) * saturation
52
+ g = gray + (g - gray) * saturation
53
+ b = gray + (b - gray) * saturation
54
+
55
+ # Clamp to 0..1
56
+ return max(0, min(1, r)), max(0, min(1, g)), max(0, min(1, b))
57
+
58
+ def rgb(self):
59
+ return tuple(int(x * 255) for x in self.scaled())
60
+
61
+ def light(self):
62
+ return self.raw()[0]
63
+
64
+ def brightness(self, level=65.535):
65
+ return int((self.light() / level))
66
+
67
+ def valid(self):
68
+ self._bus.writeto(self._i2c_address, b'\x93')
69
+ return self._bus.readfrom(self._i2c_address, 1)[0] & 1
70
+
71
+ def raw(self):
72
+ self._bus.writeto(self._i2c_address, b'\xb4')
73
+ return unpack("<HHHH", self._bus.readfrom(self._i2c_address, 8))
74
+
75
+
76
+ ############################ Exposed functions ############################
77
+
78
+ def load(led_pin=20):
79
+ """
80
+ Load the TCS3472 Color sensor instance.
81
+ """
82
+ if TCS3472.INSTANCE is None:
83
+ TCS3472(led_pin=led_pin)
84
+ neo_load(ledcnt=1)
85
+ led(False)
86
+ return TCS3472.INSTANCE
87
+
88
+
89
+ def pinmap():
90
+ """
91
+ Show used pin mapping for this module.
92
+ """
93
+ return pinmap_search(['i2c_scl', 'i2c_sda', 'led'])
94
+
95
+
96
+ def measure():
97
+ """
98
+ MEASURE sensor
99
+ """
100
+ sensor = load()
101
+ measurement = {"rgb": sensor.rgb(), "light": sensor.light(), "brightness": sensor.brightness()}
102
+ return measurement
103
+
104
+
105
+ def led(state:bool=None, br:int=None):
106
+ """
107
+ SENSOR LED toggle
108
+ :param state: None-automatic, True-ON, False-OFF
109
+ :param br: brightness 0-100
110
+ """
111
+ def _set_duty(_br):
112
+ _br = sensor.led_brightness if _br is None else _br
113
+ sensor.led.duty(int(_br * 10))
114
+ if _br != 0:
115
+ sensor.led_brightness = _br
116
+
117
+ sensor = load()
118
+ if state is None:
119
+ # INVERT STATE
120
+ led_current_state = sensor.led.duty() > 0
121
+ if led_current_state:
122
+ _set_duty(br)
123
+ _set_duty(0)
124
+ neo_toggle(False)
125
+ else:
126
+ _set_duty(br)
127
+ neo_toggle(True)
128
+ else:
129
+ # SET STATE: ON/OFF
130
+ if state:
131
+ _set_duty(br)
132
+ neo_toggle(True)
133
+ else:
134
+ _set_duty(br)
135
+ _set_duty(0)
136
+ neo_toggle(False)
137
+ return f"LED on, {sensor.led_brightness}%" if sensor.led.duty()>0 else f"LED off"
138
+
139
+
140
+ def indicator(br=5):
141
+ """
142
+ Color indicator Neopixel LED update
143
+ :param br: brightness 0-100
144
+ """
145
+ r, g, b = measure()['rgb']
146
+ br = float(br / 100)
147
+ _r, _g, _b = int(r*br), int(g*br), int(b*br)
148
+ neo_color(_r, _g, _b, smooth=False)
149
+ return r, g, b
150
+
151
+
152
+ def neomatrix_update():
153
+ """
154
+ DEMO - Send color codes for all neomatrix devices over espnow cluster
155
+ """
156
+ r, g, b = indicator()
157
+ command = f"neomatrix color_fill {r} {g} {b}"
158
+ cluster_run(command)
159
+ return {"cmd": command, "cluster": "task show con.espnow.*"}
160
+
161
+
162
+ def neomatrix_animation():
163
+ """
164
+ DEMO - Set random animation on neomatrix espnow cluster
165
+ """
166
+ global CURRENT_ANIMATION_INDEX
167
+ animations = ('spiral', 'snake', 'noise')
168
+
169
+ next_animation = CURRENT_ANIMATION_INDEX + 1
170
+ CURRENT_ANIMATION_INDEX = 0 if next_animation >= len(animations) else next_animation
171
+ command = f"neomatrix {animations[CURRENT_ANIMATION_INDEX]}"
172
+ cluster_run(command)
173
+ return {"cmd": command, "cluster": "task show con.espnow.*"}
174
+
175
+
176
+ def help(widgets=False):
177
+ """
178
+ TCS3472 Color sensor
179
+ """
180
+ return resolve(('load led_pin=20',
181
+ 'TEXTBOX measure',
182
+ 'BUTTON led state=<True,False>',
183
+ 'SLIDER led state=True br=<0-100-5>',
184
+ 'indicator br=<0-100>',
185
+ 'BUTTON neomatrix_update',
186
+ 'BUTTON neomatrix_animation',
187
+ 'pinmap'), widgets=widgets)