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.
- env/driver_cp210x/.DS_Store +0 -0
- env/driver_cp210x/macOS_VCP_Driver/SiLabsUSBDriverDisk.dmg +0 -0
- env/driver_cp210x/macOS_VCP_Driver/macOS_VCP_Driver_Release_Notes.txt +17 -1
- micrOS/micropython/esp32-20251209-v1.27.0.bin +0 -0
- micrOS/micropython/esp32c3-20251209-v1.27.0.bin +0 -0
- micrOS/micropython/esp32c6-20251209-v1.27.0.bin +0 -0
- micrOS/micropython/esp32s2-20251209-v1.27.0.bin +0 -0
- micrOS/micropython/esp32s2-LOLIN_MINI-20251209-v1.27.0.bin +0 -0
- micrOS/micropython/esp32s3-4MBflash-20241129-v1.24.1.bin +0 -0
- micrOS/micropython/esp32s3-8MBflash-20251209-v1.27.0.bin +0 -0
- micrOS/micropython/esp32s3_spiram_oct-20251209-v1.27.0.bin +0 -0
- micrOS/micropython/rpi-pico-w-20251209-v1.27.0.uf2 +0 -0
- micrOS/micropython/tinypico-20251209-v1.27.0.bin +0 -0
- micrOS/release_info/micrOS_ReleaseInfo/system_analysis_sum.json +191 -151
- micrOS/source/Auth.py +37 -0
- micrOS/source/Common.py +376 -102
- micrOS/source/Config.py +55 -25
- micrOS/source/Debug.py +54 -193
- micrOS/source/Espnow.py +404 -0
- micrOS/source/Files.py +207 -0
- micrOS/source/Hooks.py +88 -16
- micrOS/source/InterConnect.py +130 -46
- micrOS/source/Interrupts.py +8 -8
- micrOS/source/Logger.py +131 -0
- micrOS/source/Network.py +41 -21
- micrOS/source/Notify.py +74 -198
- micrOS/source/Pacman.py +326 -0
- micrOS/source/Scheduler.py +18 -55
- micrOS/source/Server.py +84 -217
- micrOS/source/Shell.py +103 -93
- micrOS/source/Tasks.py +239 -173
- micrOS/source/Time.py +21 -22
- micrOS/source/Types.py +89 -54
- micrOS/source/Web.py +485 -0
- micrOS/source/__pycache__/Common.cpython-312.pyc +0 -0
- micrOS/source/__pycache__/Debug.cpython-312.pyc +0 -0
- micrOS/source/__pycache__/Files.cpython-312.pyc +0 -0
- micrOS/source/__pycache__/Logger.cpython-312.pyc +0 -0
- micrOS/source/__pycache__/Scheduler.cpython-312.pyc +0 -0
- micrOS/source/__pycache__/Server.cpython-312.pyc +0 -0
- micrOS/source/__pycache__/Shell.cpython-312.pyc +0 -0
- micrOS/source/__pycache__/replhelper.cpython-312.pyc +0 -0
- micrOS/source/helpers.py +132 -0
- micrOS/source/micrOS.py +25 -21
- micrOS/source/micrOSloader.py +14 -23
- micrOS/source/microIO.py +94 -57
- toolkit/simulator_lib/LP_darwin.py → micrOS/source/modules/IO_esp32.py +22 -11
- micrOS/source/{IO_esp32c3.py → modules/IO_esp32c3.py} +6 -1
- micrOS/source/modules/IO_esp32c6.py +38 -0
- micrOS/source/{IO_esp32s2.py → modules/IO_esp32s2.py} +6 -1
- micrOS/source/{IO_esp32s3.py → modules/IO_esp32s3.py} +43 -2
- micrOS/source/modules/IO_m5stamp.py +86 -0
- micrOS/source/{IO_qtpy.py → modules/IO_qtpy.py} +28 -18
- micrOS/source/{IO_tinypico.py → modules/IO_tinypico.py} +48 -3
- micrOS/source/modules/LM_L298N.py +161 -0
- {toolkit/workspace/precompiled → micrOS/source/modules}/LM_L9110_DCmotor.py +4 -4
- micrOS/source/{LM_OV2640.py → modules/LM_OV2640.py} +53 -42
- micrOS/source/{LM_VL53L0X.py → modules/LM_VL53L0X.py} +5 -5
- micrOS/source/{LM_aht10.py → modules/LM_aht10.py} +12 -4
- micrOS/source/{LM_bme280.py → modules/LM_bme280.py} +13 -25
- micrOS/source/{LM_buzzer.py → modules/LM_buzzer.py} +42 -40
- micrOS/source/{LM_cct.py → modules/LM_cct.py} +22 -27
- micrOS/source/modules/LM_cluster.py +255 -0
- micrOS/source/{LM_co2.py → modules/LM_co2.py} +13 -6
- micrOS/source/{LM_dht11.py → modules/LM_dht11.py} +13 -29
- micrOS/source/{LM_dht22.py → modules/LM_dht22.py} +13 -28
- micrOS/source/{LM_dimmer.py → modules/LM_dimmer.py} +19 -16
- micrOS/source/modules/LM_distance.py +135 -0
- micrOS/source/{LM_ds18.py → modules/LM_ds18.py} +12 -4
- micrOS/source/{LM_esp32.py → modules/LM_esp32.py} +16 -4
- micrOS/source/modules/LM_espnow.py +53 -0
- micrOS/source/modules/LM_fileserver.py +265 -0
- micrOS/source/{LM_gameOfLife.py → modules/LM_gameOfLife.py} +5 -5
- micrOS/source/{LM_genIO.py → modules/LM_genIO.py} +49 -35
- micrOS/source/modules/LM_haptic.py +111 -0
- micrOS/source/modules/LM_i2c.py +61 -0
- micrOS/source/{LM_i2s_mic.py → modules/LM_i2s_mic.py} +20 -23
- micrOS/source/{LM_ld2410.py → modules/LM_ld2410.py} +3 -3
- micrOS/source/{LM_light_sensor.py → modules/LM_light_sensor.py} +22 -26
- micrOS/source/modules/LM_mh_z19c.py +198 -0
- micrOS/source/modules/LM_neoeffects.py +284 -0
- micrOS/source/{LM_neopixel.py → modules/LM_neopixel.py} +26 -31
- micrOS/source/{LM_oled.py → modules/LM_oled.py} +28 -20
- micrOS/source/{LM_oled_sh1106.py → modules/LM_oled_sh1106.py} +28 -24
- micrOS/source/{LM_oled_ui.py → modules/LM_oled_ui.py} +132 -174
- micrOS/source/modules/LM_pacman.py +320 -0
- micrOS/source/{LM_presence.py → modules/LM_presence.py} +24 -36
- micrOS/source/modules/LM_qmi8658.py +204 -0
- micrOS/source/{LM_rencoder.py → modules/LM_rencoder.py} +40 -11
- micrOS/source/modules/LM_rest.py +81 -0
- micrOS/source/{LM_rgb.py → modules/LM_rgb.py} +25 -34
- micrOS/source/{LM_rgbcct.py → modules/LM_rgbcct.py} +5 -5
- micrOS/source/{LM_roboarm.py → modules/LM_roboarm.py} +37 -45
- micrOS/source/modules/LM_robustness.py +137 -0
- micrOS/source/{LM_rp2w.py → modules/LM_rp2w.py} +3 -0
- micrOS/source/{LM_sdcard.py → modules/LM_sdcard.py} +3 -0
- micrOS/source/{LM_servo.py → modules/LM_servo.py} +4 -4
- micrOS/source/modules/LM_sound_event.py +751 -0
- micrOS/source/{LM_stepper.py → modules/LM_stepper.py} +8 -8
- micrOS/source/{LM_switch.py → modules/LM_switch.py} +21 -18
- micrOS/source/{LM_system.py → modules/LM_system.py} +96 -59
- micrOS/source/modules/LM_tcs3472.py +187 -0
- micrOS/source/modules/LM_telegram.py +388 -0
- micrOS/source/modules/LM_trackball.py +287 -0
- micrOS/source/modules/LM_veml7700.py +159 -0
- micrOS/source/modules/LM_web.py +38 -0
- micrOS/source/urequests.py +204 -91
- {toolkit/workspace/precompiled → micrOS/source/web}/dashboard.html +9 -4
- micrOS/source/web/editor.js +440 -0
- micrOS/source/web/filesui.html +178 -0
- micrOS/source/web/filesui.js +338 -0
- micrOS/source/{index.html → web/index.html} +44 -2
- micrOS/source/web/uapi.js +103 -0
- micrOS/source/web/udashboard.js +129 -0
- micrOS/source/web/ustyle.css +55 -0
- micrOS/source/web/uwidgets.js +172 -0
- micrOS/source/web/uwidgets_pro.js +99 -0
- micrOS/utests/__init__.py +0 -0
- micrOS/utests/test_scheduler.py +435 -0
- {micrOSDevToolKit-2.1.5.data → microsdevtoolkit-2.26.1.data}/scripts/devToolKit.py +47 -4
- {micrOSDevToolKit-2.1.5.dist-info → microsdevtoolkit-2.26.1.dist-info}/METADATA +392 -279
- microsdevtoolkit-2.26.1.dist-info/RECORD +396 -0
- {micrOSDevToolKit-2.1.5.dist-info → microsdevtoolkit-2.26.1.dist-info}/WHEEL +1 -1
- toolkit/DevEnvCompile.py +63 -33
- toolkit/DevEnvOTA.py +72 -22
- toolkit/DevEnvUSB.py +147 -77
- toolkit/Gateway.py +9 -9
- toolkit/LM_to_compile.dat +12 -4
- toolkit/MicrOSDevEnv.py +129 -51
- toolkit/WebRepl.py +73 -0
- toolkit/dashboard_apps/BackupRestore.py +171 -0
- toolkit/dashboard_apps/CCTDemo.py +12 -17
- toolkit/dashboard_apps/CCTTest.py +20 -24
- toolkit/dashboard_apps/CamStream.py +2 -6
- toolkit/dashboard_apps/CatGame.py +14 -16
- toolkit/dashboard_apps/Dimmer.py +11 -21
- toolkit/dashboard_apps/GetVersion.py +11 -19
- toolkit/dashboard_apps/MicrophoneTest.py +2 -7
- toolkit/dashboard_apps/NeoEffectsDemo.py +22 -35
- toolkit/dashboard_apps/NeopixelTest.py +20 -25
- toolkit/dashboard_apps/PresenceTest.py +2 -8
- toolkit/dashboard_apps/QMI8685_GYRO.py +68 -0
- toolkit/dashboard_apps/RGBTest.py +20 -24
- toolkit/dashboard_apps/RoboArm.py +24 -32
- toolkit/dashboard_apps/SED_test.py +10 -14
- toolkit/dashboard_apps/SensorsTest.py +61 -0
- toolkit/dashboard_apps/SystemTest.py +219 -117
- toolkit/dashboard_apps/Template_app.py +12 -19
- toolkit/dashboard_apps/_app_base.py +34 -0
- toolkit/dashboard_apps/_gyro_visualizer.py +78 -0
- toolkit/dashboard_apps/uLightDemo.py +15 -24
- toolkit/index.html +6 -5
- toolkit/lib/LocalMachine.py +6 -1
- toolkit/lib/MicrosFiles.py +46 -0
- toolkit/lib/Repository.py +64 -0
- toolkit/lib/TerminalColors.py +4 -0
- toolkit/lib/macroScript.py +371 -0
- toolkit/lib/micrOSClient.py +124 -51
- toolkit/lib/micrOSClientHistory.py +156 -0
- toolkit/lib/pip_package_installer.py +31 -4
- toolkit/micrOSdashboard.py +16 -21
- toolkit/micrOSlint.py +28 -10
- toolkit/simulator_lib/.DS_Store +0 -0
- micrOS/source/IO_esp32.py → toolkit/simulator_lib/IO_darwin.py +3 -0
- toolkit/simulator_lib/__pycache__/IO_darwin.cpython-312.pyc +0 -0
- toolkit/simulator_lib/__pycache__/aioespnow.cpython-312.pyc +0 -0
- toolkit/simulator_lib/__pycache__/camera.cpython-312.pyc +0 -0
- toolkit/simulator_lib/__pycache__/framebuf.cpython-312.pyc +0 -0
- toolkit/simulator_lib/__pycache__/machine.cpython-312.pyc +0 -0
- toolkit/simulator_lib/__pycache__/micropython.cpython-312.pyc +0 -0
- toolkit/simulator_lib/__pycache__/mip.cpython-312.pyc +0 -0
- toolkit/simulator_lib/__pycache__/neopixel.cpython-312.pyc +0 -0
- toolkit/simulator_lib/__pycache__/network.cpython-312.pyc +0 -0
- toolkit/simulator_lib/__pycache__/sim_common.cpython-312.pyc +0 -0
- toolkit/simulator_lib/__pycache__/simgc.cpython-312.pyc +0 -0
- toolkit/simulator_lib/__pycache__/simulator.cpython-312.pyc +0 -0
- toolkit/simulator_lib/__pycache__/uasyncio.cpython-312.pyc +0 -0
- toolkit/simulator_lib/__pycache__/uos.cpython-312.pyc +0 -0
- toolkit/simulator_lib/__pycache__/urandom.cpython-312.pyc +0 -0
- toolkit/simulator_lib/__pycache__/usocket.cpython-312.pyc +0 -0
- toolkit/simulator_lib/__pycache__/ussl.cpython-312.pyc +0 -0
- toolkit/simulator_lib/aioespnow.py +28 -0
- toolkit/simulator_lib/camera.py +84 -0
- toolkit/simulator_lib/dht.py +1 -1
- toolkit/simulator_lib/framebuf.py +49 -1
- toolkit/simulator_lib/machine.py +32 -2
- toolkit/simulator_lib/micropython.py +3 -3
- toolkit/simulator_lib/mip.py +165 -0
- toolkit/simulator_lib/neopixel.py +3 -2
- toolkit/simulator_lib/network.py +2 -1
- toolkit/simulator_lib/node_config.json +2 -3
- toolkit/simulator_lib/ntptime.py +1 -1
- toolkit/simulator_lib/{sim_console.py → sim_common.py} +2 -3
- toolkit/simulator_lib/simgc.py +6 -2
- toolkit/simulator_lib/simulator.py +138 -46
- toolkit/simulator_lib/uasyncio.py +34 -3
- toolkit/simulator_lib/uos.py +147 -0
- toolkit/simulator_lib/urandom.py +4 -0
- toolkit/simulator_lib/usocket.py +5 -1
- toolkit/simulator_lib/view01.jpg +0 -0
- toolkit/simulator_lib/view02.jpg +0 -0
- toolkit/socketClient.py +43 -23
- toolkit/user_data/webhooks/generic.py +1 -1
- toolkit/user_data/webhooks/macro.py +44 -0
- toolkit/user_data/webhooks/template.macro +20 -0
- toolkit/user_data/webhooks/template.py +1 -1
- toolkit/workspace/precompiled/Auth.mpy +0 -0
- toolkit/workspace/precompiled/Common.mpy +0 -0
- toolkit/workspace/precompiled/Config.mpy +0 -0
- toolkit/workspace/precompiled/Debug.mpy +0 -0
- toolkit/workspace/precompiled/Espnow.mpy +0 -0
- toolkit/workspace/precompiled/Files.mpy +0 -0
- toolkit/workspace/precompiled/Hooks.mpy +0 -0
- toolkit/workspace/precompiled/InterConnect.mpy +0 -0
- toolkit/workspace/precompiled/Interrupts.mpy +0 -0
- toolkit/workspace/precompiled/Logger.mpy +0 -0
- toolkit/workspace/precompiled/Network.mpy +0 -0
- toolkit/workspace/precompiled/Notify.mpy +0 -0
- toolkit/workspace/precompiled/Pacman.mpy +0 -0
- toolkit/workspace/precompiled/Scheduler.mpy +0 -0
- toolkit/workspace/precompiled/Server.mpy +0 -0
- toolkit/workspace/precompiled/Shell.mpy +0 -0
- toolkit/workspace/precompiled/Tasks.mpy +0 -0
- toolkit/workspace/precompiled/Time.mpy +0 -0
- toolkit/workspace/precompiled/Types.mpy +0 -0
- toolkit/workspace/precompiled/Web.mpy +0 -0
- toolkit/workspace/precompiled/_mpy.version +1 -1
- toolkit/workspace/precompiled/config/_git.keep +0 -0
- toolkit/workspace/precompiled/helpers.mpy +0 -0
- toolkit/workspace/precompiled/micrOS.mpy +0 -0
- toolkit/workspace/precompiled/micrOSloader.mpy +0 -0
- toolkit/workspace/precompiled/microIO.mpy +0 -0
- toolkit/workspace/precompiled/modules/IO_esp32.mpy +0 -0
- toolkit/workspace/precompiled/modules/IO_esp32c3.mpy +0 -0
- toolkit/workspace/precompiled/modules/IO_esp32c6.mpy +0 -0
- toolkit/workspace/precompiled/modules/IO_esp32s2.mpy +0 -0
- toolkit/workspace/precompiled/modules/IO_esp32s3.mpy +0 -0
- toolkit/workspace/precompiled/modules/IO_m5stamp.mpy +0 -0
- toolkit/workspace/precompiled/modules/IO_qtpy.mpy +0 -0
- toolkit/workspace/precompiled/modules/IO_rp2.mpy +0 -0
- toolkit/workspace/precompiled/modules/IO_tinypico.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_L298N.mpy +0 -0
- {micrOS/source → toolkit/workspace/precompiled/modules}/LM_L9110_DCmotor.py +4 -4
- toolkit/workspace/precompiled/modules/LM_OV2640.mpy +0 -0
- toolkit/workspace/precompiled/{LM_VL53L0X.py → modules/LM_VL53L0X.py} +5 -5
- toolkit/workspace/precompiled/modules/LM_aht10.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_bme280.mpy +0 -0
- toolkit/workspace/precompiled/{LM_buzzer.mpy → modules/LM_buzzer.mpy} +0 -0
- toolkit/workspace/precompiled/modules/LM_cct.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_cluster.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_co2.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_dht11.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_dht22.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_dimmer.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_distance.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_ds18.mpy +0 -0
- toolkit/workspace/precompiled/{LM_esp32.py → modules/LM_esp32.py} +16 -4
- toolkit/workspace/precompiled/modules/LM_espnow.py +53 -0
- toolkit/workspace/precompiled/modules/LM_fileserver.mpy +0 -0
- toolkit/workspace/precompiled/{LM_gameOfLife.mpy → modules/LM_gameOfLife.mpy} +0 -0
- toolkit/workspace/precompiled/modules/LM_genIO.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_haptic.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_i2c.py +61 -0
- toolkit/workspace/precompiled/modules/LM_i2s_mic.mpy +0 -0
- toolkit/workspace/precompiled/{LM_ld2410.mpy → modules/LM_ld2410.mpy} +0 -0
- toolkit/workspace/precompiled/modules/LM_light_sensor.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_mh_z19c.py +198 -0
- toolkit/workspace/precompiled/modules/LM_neoeffects.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_neopixel.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_oled.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_oled_sh1106.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_oled_ui.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_pacman.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_presence.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_qmi8658.py +204 -0
- toolkit/workspace/precompiled/{LM_rencoder.py → modules/LM_rencoder.py} +40 -11
- toolkit/workspace/precompiled/modules/LM_rest.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_rgb.mpy +0 -0
- toolkit/workspace/precompiled/{LM_rgbcct.mpy → modules/LM_rgbcct.mpy} +0 -0
- toolkit/workspace/precompiled/modules/LM_roboarm.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_robustness.py +137 -0
- toolkit/workspace/precompiled/{LM_rp2w.py → modules/LM_rp2w.py} +3 -0
- toolkit/workspace/precompiled/{LM_sdcard.py → modules/LM_sdcard.py} +3 -0
- toolkit/workspace/precompiled/{LM_servo.mpy → modules/LM_servo.mpy} +0 -0
- toolkit/workspace/precompiled/modules/LM_sound_event.mpy +0 -0
- toolkit/workspace/precompiled/{LM_stepper.mpy → modules/LM_stepper.mpy} +0 -0
- toolkit/workspace/precompiled/modules/LM_switch.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_system.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_tcs3472.py +187 -0
- toolkit/workspace/precompiled/modules/LM_telegram.mpy +0 -0
- toolkit/workspace/precompiled/{LM_tinyrgb.mpy → modules/LM_tinyrgb.mpy} +0 -0
- toolkit/workspace/precompiled/modules/LM_trackball.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_veml7700.mpy +0 -0
- toolkit/workspace/precompiled/modules/LM_web.mpy +0 -0
- toolkit/workspace/precompiled/urequests.mpy +0 -0
- {micrOS/source → toolkit/workspace/precompiled/web}/dashboard.html +9 -4
- toolkit/workspace/precompiled/web/editor.js +440 -0
- toolkit/workspace/precompiled/web/filesui.html +178 -0
- toolkit/workspace/precompiled/web/filesui.js +338 -0
- toolkit/workspace/precompiled/{index.html → web/index.html} +44 -2
- toolkit/workspace/precompiled/web/uapi.js +103 -0
- toolkit/workspace/precompiled/web/udashboard.js +129 -0
- toolkit/workspace/precompiled/web/ustyle.css +55 -0
- toolkit/workspace/precompiled/web/uwidgets.js +172 -0
- toolkit/workspace/precompiled/web/uwidgets_pro.js +99 -0
- env/driver_cp210x/CH34XSER_MAC/CH34X_DRV_INSTALL_INSTRUCTIONS.pdf +0 -0
- env/driver_cp210x/CH34XSER_MAC/CH34xVCPDriver.pkg +0 -0
- micrOS/micropython/esp32-20231005-v1.21.0.bin +0 -0
- micrOS/micropython/esp32c3-GENERIC-20240105-v1.22.1.bin +0 -0
- micrOS/micropython/esp32c3-GENERIC-20240222-v1.22.2.bin +0 -0
- micrOS/micropython/esp32s2-GENERIC-20240105-v1.22.1.bin +0 -0
- micrOS/micropython/esp32s2-LOLIN_MINI-20220618-v1.19.1.bin +0 -0
- micrOS/micropython/esp32s3-GENERIC-20240105-v1.22.1.bin +0 -0
- micrOS/micropython/esp32s3_spiram_oct-20231005-v1.21.0.bin +0 -0
- micrOS/micropython/rpi-pico-w-20231005-v1.21.0.uf2 +0 -0
- micrOS/micropython/tinypico-20231005-v1.21.0.bin +0 -0
- micrOS/micropython/tinypico-usbc-UM-20240105-v1.22.1.bin +0 -0
- micrOS/source/LM_L298N_DCmotor.py +0 -86
- micrOS/source/LM_catgame.py +0 -74
- micrOS/source/LM_dashboard_be.py +0 -37
- micrOS/source/LM_demo.py +0 -85
- micrOS/source/LM_distance.py +0 -88
- micrOS/source/LM_i2c.py +0 -44
- micrOS/source/LM_intercon.py +0 -57
- micrOS/source/LM_keychain.py +0 -318
- micrOS/source/LM_lmpacman.py +0 -126
- micrOS/source/LM_neoeffects.py +0 -327
- micrOS/source/LM_pet_feeder.py +0 -76
- micrOS/source/LM_ph_sensor.py +0 -51
- micrOS/source/LM_rest.py +0 -40
- micrOS/source/LM_robustness.py +0 -73
- micrOS/source/LM_telegram.py +0 -96
- micrOS/source/reset.py +0 -11
- micrOS/source/uapi.js +0 -76
- micrOS/source/udashboard.js +0 -137
- micrOS/source/ustyle.css +0 -28
- micrOS/source/uwidgets.js +0 -179
- micrOSDevToolKit-2.1.5.dist-info/RECORD +0 -337
- toolkit/dashboard_apps/AirQualityBME280.py +0 -36
- toolkit/dashboard_apps/AirQualityDHT22_CO2.py +0 -36
- toolkit/lib/file_extensions.py +0 -16
- toolkit/simulator_lib/__pycache__/LP_darwin.cpython-312.pyc +0 -0
- toolkit/simulator_lib/__pycache__/LP_darwin.cpython-38.pyc +0 -0
- toolkit/simulator_lib/__pycache__/LP_darwin.cpython-39.pyc +0 -0
- toolkit/simulator_lib/__pycache__/sim_console.cpython-312.pyc +0 -0
- toolkit/simulator_lib/__pycache__/sim_console.cpython-38.pyc +0 -0
- toolkit/simulator_lib/__pycache__/sim_console.cpython-39.pyc +0 -0
- toolkit/workspace/precompiled/IO_esp32.mpy +0 -0
- toolkit/workspace/precompiled/IO_esp32c3.mpy +0 -0
- toolkit/workspace/precompiled/IO_esp32s2.mpy +0 -0
- toolkit/workspace/precompiled/IO_esp32s3.mpy +0 -0
- toolkit/workspace/precompiled/IO_qtpy.mpy +0 -0
- toolkit/workspace/precompiled/IO_rp2.mpy +0 -0
- toolkit/workspace/precompiled/IO_tinypico.mpy +0 -0
- toolkit/workspace/precompiled/LM_L298N_DCmotor.mpy +0 -0
- toolkit/workspace/precompiled/LM_OV2640.mpy +0 -0
- toolkit/workspace/precompiled/LM_aht10.mpy +0 -0
- toolkit/workspace/precompiled/LM_bme280.mpy +0 -0
- toolkit/workspace/precompiled/LM_catgame.py +0 -74
- toolkit/workspace/precompiled/LM_cct.mpy +0 -0
- toolkit/workspace/precompiled/LM_co2.mpy +0 -0
- toolkit/workspace/precompiled/LM_dashboard_be.py +0 -37
- toolkit/workspace/precompiled/LM_demo.py +0 -85
- toolkit/workspace/precompiled/LM_dht11.mpy +0 -0
- toolkit/workspace/precompiled/LM_dht22.mpy +0 -0
- toolkit/workspace/precompiled/LM_dimmer.mpy +0 -0
- toolkit/workspace/precompiled/LM_distance.py +0 -88
- toolkit/workspace/precompiled/LM_ds18.mpy +0 -0
- toolkit/workspace/precompiled/LM_genIO.mpy +0 -0
- toolkit/workspace/precompiled/LM_i2c.py +0 -44
- toolkit/workspace/precompiled/LM_i2s_mic.mpy +0 -0
- toolkit/workspace/precompiled/LM_intercon.mpy +0 -0
- toolkit/workspace/precompiled/LM_keychain.mpy +0 -0
- toolkit/workspace/precompiled/LM_light_sensor.mpy +0 -0
- toolkit/workspace/precompiled/LM_lmpacman.mpy +0 -0
- toolkit/workspace/precompiled/LM_neoeffects.mpy +0 -0
- toolkit/workspace/precompiled/LM_neopixel.mpy +0 -0
- toolkit/workspace/precompiled/LM_oled.mpy +0 -0
- toolkit/workspace/precompiled/LM_oled_sh1106.mpy +0 -0
- toolkit/workspace/precompiled/LM_oled_ui.mpy +0 -0
- toolkit/workspace/precompiled/LM_pet_feeder.py +0 -76
- toolkit/workspace/precompiled/LM_ph_sensor.py +0 -51
- toolkit/workspace/precompiled/LM_presence.mpy +0 -0
- toolkit/workspace/precompiled/LM_rest.mpy +0 -0
- toolkit/workspace/precompiled/LM_rgb.mpy +0 -0
- toolkit/workspace/precompiled/LM_roboarm.mpy +0 -0
- toolkit/workspace/precompiled/LM_robustness.py +0 -73
- toolkit/workspace/precompiled/LM_switch.mpy +0 -0
- toolkit/workspace/precompiled/LM_system.mpy +0 -0
- toolkit/workspace/precompiled/LM_telegram.mpy +0 -0
- toolkit/workspace/precompiled/reset.mpy +0 -0
- toolkit/workspace/precompiled/uapi.js +0 -76
- toolkit/workspace/precompiled/udashboard.js +0 -137
- toolkit/workspace/precompiled/ustyle.css +0 -28
- toolkit/workspace/precompiled/uwidgets.js +0 -179
- /toolkit/user_data/node_config_archive/.include → /micrOS/source/config/_git.keep +0 -0
- /micrOS/source/{IO_rp2.py → modules/IO_rp2.py} +0 -0
- /micrOS/source/{LM_tinyrgb.py → modules/LM_tinyrgb.py} +0 -0
- {micrOSDevToolKit-2.1.5.dist-info → microsdevtoolkit-2.26.1.dist-info/licenses}/LICENSE +0 -0
- {micrOSDevToolKit-2.1.5.dist-info → microsdevtoolkit-2.26.1.dist-info}/top_level.txt +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
from machine import Pin
|
|
2
2
|
import micropython
|
|
3
3
|
from Common import socket_stream, syslog
|
|
4
|
-
from microIO import
|
|
4
|
+
from microIO import bind_pin, pinmap_search
|
|
5
|
+
from Types import resolve
|
|
5
6
|
|
|
6
7
|
# https://www.coderdojotc.org/micropython/sensors/10-rotary-encoder/
|
|
7
8
|
|
|
@@ -42,27 +43,43 @@ class Rotary:
|
|
|
42
43
|
|
|
43
44
|
class Data:
|
|
44
45
|
ROTARY_OBJ = None
|
|
45
|
-
VAL = 0
|
|
46
46
|
EVENT = True
|
|
47
|
+
VAL = 0
|
|
48
|
+
MIN_VAL = 0
|
|
49
|
+
MAX_VAL = 20
|
|
50
|
+
COLOR = (None, ())
|
|
47
51
|
|
|
48
52
|
|
|
49
53
|
def _rotary_changed(change):
|
|
50
54
|
if change == Rotary.ROT_CW:
|
|
51
55
|
Data.EVENT = True
|
|
52
56
|
Data.VAL = Data.VAL + 1
|
|
57
|
+
if Data.VAL > Data.MAX_VAL:
|
|
58
|
+
Data.VAL = Data.MIN_VAL
|
|
53
59
|
elif change == Rotary.ROT_CCW:
|
|
54
60
|
Data.EVENT = True
|
|
55
61
|
Data.VAL = Data.VAL - 1
|
|
62
|
+
if Data.VAL < Data.MIN_VAL:
|
|
63
|
+
Data.VAL = Data.MAX_VAL
|
|
64
|
+
# Color on neopixel
|
|
65
|
+
if callable(Data.COLOR[0]):
|
|
66
|
+
try:
|
|
67
|
+
r, g, b = Data.COLOR[1][Data.VAL]
|
|
68
|
+
Data.COLOR[0](r, g, b)
|
|
69
|
+
except Exception as e:
|
|
70
|
+
syslog(f"[ERR] rencoder color: {e}")
|
|
56
71
|
|
|
57
72
|
|
|
58
|
-
def
|
|
73
|
+
def load(min_val=0, max_val=20):
|
|
59
74
|
"""
|
|
60
75
|
Create rotary encoder
|
|
61
76
|
"""
|
|
62
77
|
if Data.ROTARY_OBJ is None:
|
|
63
78
|
# GPIO Pins 33 and 35 are for the encoder pins.
|
|
64
|
-
Data.ROTARY_OBJ = Rotary(
|
|
65
|
-
Data.
|
|
79
|
+
Data.ROTARY_OBJ = Rotary(bind_pin('rot_dt'), bind_pin('rot_clk'))
|
|
80
|
+
Data.MIN_VAL = min_val
|
|
81
|
+
Data.MAX_VAL = max_val
|
|
82
|
+
Data.VAL = min_val
|
|
66
83
|
Data.ROTARY_OBJ.add_handler(_rotary_changed)
|
|
67
84
|
return 'Init RotaryEncoder with IRQs.'
|
|
68
85
|
|
|
@@ -72,7 +89,7 @@ def read_state(msgobj=None):
|
|
|
72
89
|
"""
|
|
73
90
|
Read rotary encoder status / relative position
|
|
74
91
|
"""
|
|
75
|
-
|
|
92
|
+
load()
|
|
76
93
|
if msgobj is not None:
|
|
77
94
|
if Data.EVENT:
|
|
78
95
|
msgobj(f"[stream] RotaryState: {Data.VAL}")
|
|
@@ -87,19 +104,31 @@ def reset_state():
|
|
|
87
104
|
Reset rotary encoder state to 0
|
|
88
105
|
"""
|
|
89
106
|
msg = f"Reset state {Data.VAL} -> 0"
|
|
90
|
-
Data.VAL =
|
|
107
|
+
Data.VAL = Data.MIN_VAL
|
|
91
108
|
return msg
|
|
92
109
|
|
|
93
110
|
|
|
94
|
-
def pinmap(
|
|
111
|
+
def pinmap():
|
|
95
112
|
"""
|
|
96
113
|
[i] micrOS LM naming convention
|
|
97
114
|
Load Module built-in help message
|
|
98
115
|
:return tuple: list of functions implemented by this application (widgets=False)
|
|
99
116
|
:return tuple: list of widget json for UI generation (widgets=True)
|
|
100
117
|
"""
|
|
101
|
-
return
|
|
118
|
+
return pinmap_search(['rot_clk', 'rot_dt'])
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def color_indicator():
|
|
122
|
+
"""Encoder visualization on LED colors (LM_neopixel)"""
|
|
123
|
+
from LM_neopixel import color
|
|
124
|
+
palette_template = ((20, 0, 0), (10, 10, 0), (0, 20, 0), (0, 10, 10), (0, 0, 20))
|
|
125
|
+
repeat = int(Data.MAX_VAL / len(palette_template))+1
|
|
126
|
+
palette = palette_template * repeat
|
|
127
|
+
Data.COLOR = (color, palette)
|
|
128
|
+
color(0, 0, 0) # initial color OFF
|
|
129
|
+
return palette
|
|
102
130
|
|
|
103
131
|
|
|
104
|
-
def help():
|
|
105
|
-
return '
|
|
132
|
+
def help(widgets=False):
|
|
133
|
+
return resolve(('load min_val=0 max_val=20', 'TEXTBOX read_state',
|
|
134
|
+
'reset_state', 'color_indicator', 'pinmap'), widgets=widgets)
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
from urequests import get as http_get
|
|
2
|
+
from urequests import aget as http_aget
|
|
3
|
+
from Common import micro_task
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Rest:
|
|
7
|
+
GATEWAY_HOST = None
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def load(gateway_url=None):
|
|
11
|
+
"""
|
|
12
|
+
Set gateway url aka main domain
|
|
13
|
+
:param gateway_url: base url of gateway, like: http://gateway.local:5005
|
|
14
|
+
"""
|
|
15
|
+
if gateway_url is None:
|
|
16
|
+
if Rest.GATEWAY_HOST is None:
|
|
17
|
+
return 'Missing Gateway url'
|
|
18
|
+
return Rest.GATEWAY_HOST
|
|
19
|
+
if gateway_url.startswith("http"):
|
|
20
|
+
Rest.GATEWAY_HOST = gateway_url
|
|
21
|
+
else:
|
|
22
|
+
return f"URL have to starts with http/https"
|
|
23
|
+
return f'Gateway url: {gateway_url}'
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _subdomain(subdomain):
|
|
27
|
+
if Rest.GATEWAY_HOST is None:
|
|
28
|
+
raise Exception('Missing Gateway url')
|
|
29
|
+
if not subdomain.startswith('/'):
|
|
30
|
+
subdomain = '/' + subdomain
|
|
31
|
+
domain = f'{Rest.GATEWAY_HOST}{subdomain}'
|
|
32
|
+
return domain
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def url(subdomain):
|
|
36
|
+
"""
|
|
37
|
+
Execute rest call with given subdomain / url
|
|
38
|
+
:param subdomain: url parameter, http(s) full url or gateway subdomain like: /webhooks/template
|
|
39
|
+
"""
|
|
40
|
+
if subdomain.startswith('http'):
|
|
41
|
+
domain = subdomain
|
|
42
|
+
else:
|
|
43
|
+
domain = _subdomain(subdomain)
|
|
44
|
+
status_code, response = http_get(domain, jsonify=True)
|
|
45
|
+
return {'status': status_code, 'response': response}
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
async def __task(subdomain, tag):
|
|
49
|
+
with micro_task(tag=tag) as my_task:
|
|
50
|
+
my_task.out = f"GET {subdomain}"
|
|
51
|
+
if subdomain.startswith('http'):
|
|
52
|
+
domain = subdomain
|
|
53
|
+
else:
|
|
54
|
+
domain = _subdomain(subdomain)
|
|
55
|
+
status_code, response = await http_aget(domain, jsonify=True)
|
|
56
|
+
my_task.out = f'status: {status_code}, response: {response}'
|
|
57
|
+
return {'status': status_code, 'response': response}
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def aurl(subdomain):
|
|
61
|
+
"""
|
|
62
|
+
Execute async rest call with given subdomain / url
|
|
63
|
+
:param subdomain: url parameter, http(s) full url or gateway subdomain like: /webhooks/template
|
|
64
|
+
"""
|
|
65
|
+
# [!] ASYNC TASK CREATION [1*] with async task callback + taskID (TAG) handling
|
|
66
|
+
tag = "rest." + subdomain.replace("http://", '').replace("https://", '')
|
|
67
|
+
if len(tag) > 50:
|
|
68
|
+
tag = tag[0:50]
|
|
69
|
+
return micro_task(tag=tag, task=__task(subdomain, tag))
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def help(widgets=False):
|
|
73
|
+
"""
|
|
74
|
+
[i] micrOS LM naming convention - built-in help message
|
|
75
|
+
:return tuple:
|
|
76
|
+
(widgets=False) list of functions implemented by this application
|
|
77
|
+
(widgets=True) list of widget json for UI generation
|
|
78
|
+
"""
|
|
79
|
+
return ('load gateway_url=<http://gateway.local:5005>',
|
|
80
|
+
'url subdomain=</webhooks/template>',
|
|
81
|
+
'aurl subdomain=</webhooks/template>')
|
|
@@ -2,11 +2,9 @@
|
|
|
2
2
|
# ANALOG rgb CONTROLLER PARAMS #
|
|
3
3
|
#########################################
|
|
4
4
|
from machine import Pin, PWM
|
|
5
|
-
from
|
|
6
|
-
from Common import transition_gen, micro_task
|
|
7
|
-
import uasyncio as asyncio
|
|
5
|
+
from Common import transition_gen, micro_task, data_dir
|
|
8
6
|
from utime import sleep_ms
|
|
9
|
-
from microIO import
|
|
7
|
+
from microIO import bind_pin, pinmap_search
|
|
10
8
|
from random import randint
|
|
11
9
|
from Types import resolve
|
|
12
10
|
|
|
@@ -21,31 +19,27 @@ class Data:
|
|
|
21
19
|
CH_MAX = 1000 # maximum value per channel
|
|
22
20
|
TASK_STATE = False
|
|
23
21
|
RGB_TASK_TAG = "rgb._tran"
|
|
22
|
+
FILE_CACHE = data_dir('rgb.cache')
|
|
24
23
|
|
|
25
24
|
|
|
26
25
|
#########################################
|
|
27
26
|
# ANALOG rgb WITH 3 channel PWM #
|
|
28
27
|
#########################################
|
|
29
28
|
|
|
30
|
-
def __RGB_init():
|
|
29
|
+
def __RGB_init(red_pin=None, green_pin=None, blue_pin=None):
|
|
31
30
|
if Data.RGB_OBJS[0] is None or Data.RGB_OBJS[1] is None or Data.RGB_OBJS[2] is None:
|
|
32
|
-
red = Pin(
|
|
33
|
-
green = Pin(
|
|
34
|
-
blue = Pin(
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
PWM(blue, freq=1024))
|
|
39
|
-
else:
|
|
40
|
-
Data.RGB_OBJS = (PWM(red, freq=20480),
|
|
41
|
-
PWM(green, freq=20480),
|
|
42
|
-
PWM(blue, freq=20480))
|
|
31
|
+
red = Pin(bind_pin('redgb', red_pin))
|
|
32
|
+
green = Pin(bind_pin('rgreenb', green_pin))
|
|
33
|
+
blue = Pin(bind_pin('rgbue', blue_pin))
|
|
34
|
+
Data.RGB_OBJS = (PWM(red, freq=20480),
|
|
35
|
+
PWM(green, freq=20480),
|
|
36
|
+
PWM(blue, freq=20480))
|
|
43
37
|
return Data.RGB_OBJS
|
|
44
38
|
|
|
45
39
|
|
|
46
40
|
def __persistent_cache_manager(mode):
|
|
47
41
|
"""
|
|
48
|
-
|
|
42
|
+
File state cache
|
|
49
43
|
modes:
|
|
50
44
|
r - recover, s - save
|
|
51
45
|
"""
|
|
@@ -53,12 +47,12 @@ def __persistent_cache_manager(mode):
|
|
|
53
47
|
return
|
|
54
48
|
if mode == 's':
|
|
55
49
|
# SAVE CACHE
|
|
56
|
-
with open(
|
|
50
|
+
with open(Data.FILE_CACHE, 'w') as f:
|
|
57
51
|
f.write(','.join([str(k) for k in Data.RGB_CACHE]))
|
|
58
52
|
return
|
|
59
53
|
try:
|
|
60
54
|
# RESTORE CACHE
|
|
61
|
-
with open(
|
|
55
|
+
with open(Data.FILE_CACHE, 'r') as f:
|
|
62
56
|
Data.RGB_CACHE = [float(data) for data in f.read().strip().split(',')]
|
|
63
57
|
except:
|
|
64
58
|
pass
|
|
@@ -74,20 +68,18 @@ def __state_machine(r, g, b):
|
|
|
74
68
|
__persistent_cache_manager('s')
|
|
75
69
|
|
|
76
70
|
|
|
77
|
-
def
|
|
71
|
+
def load(red_pin=None, green_pin=None, blue_pin=None, cache=True):
|
|
78
72
|
"""
|
|
79
73
|
Initiate RGB module
|
|
80
|
-
:param
|
|
81
|
-
|
|
82
|
-
|
|
74
|
+
:param red_pin: optional red color pin to overwrite built-in
|
|
75
|
+
:param green_pin: optional green color pin to overwrite built-in
|
|
76
|
+
:param blue_pin: optional blue color pin to overwrite built-in
|
|
77
|
+
:param cache: file state machine cache: True/False (.cache), default=True
|
|
83
78
|
:return str: Cache state
|
|
84
79
|
"""
|
|
85
|
-
|
|
86
|
-
if cache is None:
|
|
87
|
-
Data.PERSISTENT_CACHE = False if platform == 'esp8266' else True
|
|
88
|
-
else:
|
|
89
|
-
Data.PERSISTENT_CACHE = cache
|
|
80
|
+
Data.PERSISTENT_CACHE = cache
|
|
90
81
|
__persistent_cache_manager('r') # recover data cache if enabled
|
|
82
|
+
__RGB_init(red_pin, green_pin, blue_pin)
|
|
91
83
|
if Data.RGB_CACHE[3] == 1:
|
|
92
84
|
Data.RGB_CACHE[3] = 0 # Force ON at boot
|
|
93
85
|
toggle(True)
|
|
@@ -240,7 +232,7 @@ def transition(r=None, g=None, b=None, sec=1.0, wake=False):
|
|
|
240
232
|
Data.RGB_CACHE[1] = _g if _g > 5 else 5 # SAVE VALUE TO CACHE > 5 ! because toggle
|
|
241
233
|
Data.RGB_CACHE[2] = _b if _b > 5 else 5 # SAVE VALUE TO CACHE > 5 ! because toggle
|
|
242
234
|
my_task.out = f"Dimming: R:{_r} G:{_g} B:{_b}"
|
|
243
|
-
await
|
|
235
|
+
await my_task.feed(sleep_ms=ms_period)
|
|
244
236
|
if Data.RGB_CACHE[3] == 1 or wake:
|
|
245
237
|
__state_machine(_r, _g, _b)
|
|
246
238
|
my_task.out = f"Dimming DONE: R:{_r} G:{_g} B:{_b}"
|
|
@@ -254,8 +246,7 @@ def transition(r=None, g=None, b=None, sec=1.0, wake=False):
|
|
|
254
246
|
# Create transition generator and calculate step_ms
|
|
255
247
|
rgb_gen, step_ms = transition_gen(r_from, r, g_from, g, b_from, b, interval_sec=sec)
|
|
256
248
|
# [!] ASYNC TASK CREATION [1*] with async task callback + taskID (TAG) handling
|
|
257
|
-
|
|
258
|
-
return "Starting transition" if state else "Transition already running"
|
|
249
|
+
return micro_task(tag=Data.RGB_TASK_TAG, task=_task(ms_period=step_ms, iterable=rgb_gen))
|
|
259
250
|
|
|
260
251
|
|
|
261
252
|
def random(smooth=True, max_val=1000):
|
|
@@ -303,7 +294,7 @@ def pinmap():
|
|
|
303
294
|
- info which pins to use for this application
|
|
304
295
|
:return dict: pin name (str) - pin value (int) pairs
|
|
305
296
|
"""
|
|
306
|
-
return
|
|
297
|
+
return pinmap_search(['redgb', 'rgreenb', 'rgbue'])
|
|
307
298
|
|
|
308
299
|
|
|
309
300
|
def help(widgets=False):
|
|
@@ -313,8 +304,8 @@ def help(widgets=False):
|
|
|
313
304
|
(widgets=False) list of functions implemented by this application
|
|
314
305
|
(widgets=True) list of widget json for UI generation
|
|
315
306
|
"""
|
|
316
|
-
return resolve(( 'COLOR color r=<0-1000> g b smooth=True force=True',
|
|
317
|
-
'
|
|
307
|
+
return resolve(( 'COLOR color r=<0-1000-10> g b smooth=True force=True',
|
|
308
|
+
'BUTTON toggle state=<True,False> smooth=True', 'load',
|
|
318
309
|
'SLIDER brightness percent=<0-100> smooth=True wake=True',
|
|
319
310
|
'transition r=None g=None b=None sec=1.0 wake=False',
|
|
320
311
|
'BUTTON random smooth=True max_val=1000',
|
|
@@ -3,12 +3,12 @@ import LM_cct
|
|
|
3
3
|
from Types import resolve
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
def
|
|
6
|
+
def load(cache=None):
|
|
7
7
|
"""
|
|
8
8
|
Unified rgb and cct module usage as one module
|
|
9
9
|
"""
|
|
10
|
-
s1 = LM_rgb.
|
|
11
|
-
s2 = LM_cct.
|
|
10
|
+
s1 = LM_rgb.load(cache)
|
|
11
|
+
s2 = LM_cct.load(cache)
|
|
12
12
|
return f'RGB: {s1}, CCT: {s2}'
|
|
13
13
|
|
|
14
14
|
|
|
@@ -59,7 +59,7 @@ def help(widgets=False):
|
|
|
59
59
|
(widgets=False) list of functions implemented by this application
|
|
60
60
|
(widgets=True) list of widget json for UI generation
|
|
61
61
|
"""
|
|
62
|
-
return resolve(('
|
|
63
|
-
'BUTTON toggle state smooth=True',
|
|
62
|
+
return resolve(('load',
|
|
63
|
+
'BUTTON toggle state=<True,False> smooth=True',
|
|
64
64
|
'SLIDER brightness percent smooth=True wake=True',
|
|
65
65
|
'status', 'pinmap'), widgets=widgets)
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
from utime import sleep_ms
|
|
2
2
|
from random import randint
|
|
3
3
|
import LM_servo as servo
|
|
4
|
-
from LM_switch import set_state
|
|
5
|
-
from
|
|
6
|
-
from
|
|
7
|
-
import uasyncio as asyncio
|
|
4
|
+
from LM_switch import set_state, pinmap as switch_pinmap
|
|
5
|
+
from Common import transition, micro_task, data_dir
|
|
6
|
+
from Types import resolve
|
|
8
7
|
|
|
9
8
|
|
|
10
9
|
class RoboArm:
|
|
@@ -14,29 +13,30 @@ class RoboArm:
|
|
|
14
13
|
SPEED_MS = 10 # Set default speed between steps (ms)
|
|
15
14
|
MOVE_RECORD = [] # Buffer for XY move record/replay
|
|
16
15
|
PLAY_TAG = 'roboarm._play'
|
|
16
|
+
FILE_CACHE = data_dir('rarm.cache')
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
def __persistent_cache_manager(mode):
|
|
20
20
|
"""
|
|
21
|
-
|
|
21
|
+
File state cache
|
|
22
22
|
modes:
|
|
23
23
|
r - recover, s - save
|
|
24
24
|
"""
|
|
25
25
|
|
|
26
26
|
if mode == 's':
|
|
27
27
|
# SAVE CACHE
|
|
28
|
-
with open(
|
|
28
|
+
with open(RoboArm.FILE_CACHE, 'w') as f:
|
|
29
29
|
f.write(','.join([str(k) for k in RoboArm.MOVE_RECORD]))
|
|
30
30
|
return
|
|
31
31
|
try:
|
|
32
32
|
# RESTORE CACHE
|
|
33
|
-
with open(
|
|
33
|
+
with open(RoboArm.FILE_CACHE, 'r') as f:
|
|
34
34
|
RoboArm.MOVE_RECORD = [int(data) for data in f.read().strip().split(',')]
|
|
35
35
|
except:
|
|
36
36
|
pass
|
|
37
37
|
|
|
38
38
|
|
|
39
|
-
def
|
|
39
|
+
def load():
|
|
40
40
|
"""
|
|
41
41
|
Initiate roboarm module
|
|
42
42
|
- move servo motors to middle position
|
|
@@ -52,11 +52,11 @@ def load_n_init():
|
|
|
52
52
|
return f'Init and Move to home X{x}, Y{y}'
|
|
53
53
|
|
|
54
54
|
|
|
55
|
-
def control(
|
|
55
|
+
def control(x, y, speed_ms=None, smooth=True):
|
|
56
56
|
"""
|
|
57
57
|
Control robot arm function
|
|
58
|
-
:param
|
|
59
|
-
:param
|
|
58
|
+
:param x: new x position (40-115)
|
|
59
|
+
:param y: new y position (40-115)
|
|
60
60
|
:param speed_ms: speed - step wait in ms
|
|
61
61
|
:param smooth: smooth transition, default True
|
|
62
62
|
:return str: move verdict
|
|
@@ -76,11 +76,11 @@ def control(x_new, y_new, speed_ms=None, smooth=True):
|
|
|
76
76
|
sleep_ms(step_ms)
|
|
77
77
|
|
|
78
78
|
# Skip if new XY is the same as current
|
|
79
|
-
if RoboArm.ACTUAL_XY[0] ==
|
|
80
|
-
return f"Already on X:{
|
|
79
|
+
if RoboArm.ACTUAL_XY[0] == x and RoboArm.ACTUAL_XY[1] == y:
|
|
80
|
+
return f"Already on X:{x} Y:{y}"
|
|
81
81
|
# Check input parameter range
|
|
82
|
-
if RoboArm.RANGE[0] >
|
|
83
|
-
return f"X{
|
|
82
|
+
if RoboArm.RANGE[0] > x > RoboArm.RANGE[1] or RoboArm.RANGE[0] > y > RoboArm.RANGE[1]:
|
|
83
|
+
return f"X{x}/Y{y} out of range... range: {RoboArm.RANGE[0]}-{RoboArm.RANGE[1]}"
|
|
84
84
|
|
|
85
85
|
# Set arm speed
|
|
86
86
|
RoboArm.SPEED_MS = speed_ms if isinstance(speed_ms, int) else RoboArm.SPEED_MS
|
|
@@ -90,14 +90,14 @@ def control(x_new, y_new, speed_ms=None, smooth=True):
|
|
|
90
90
|
|
|
91
91
|
if smooth:
|
|
92
92
|
# Move roboarm to position
|
|
93
|
-
__buttery(x_prev, y_prev,
|
|
94
|
-
RoboArm.ACTUAL_XY = [
|
|
93
|
+
__buttery(x_prev, y_prev, x, y)
|
|
94
|
+
RoboArm.ACTUAL_XY = [x, y]
|
|
95
95
|
else:
|
|
96
96
|
# Fast move robaorm to position
|
|
97
|
-
servo.sduty(
|
|
98
|
-
servo.s2duty(
|
|
99
|
-
RoboArm.ACTUAL_XY[0] =
|
|
100
|
-
RoboArm.ACTUAL_XY[1] =
|
|
97
|
+
servo.sduty(x)
|
|
98
|
+
servo.s2duty(y)
|
|
99
|
+
RoboArm.ACTUAL_XY[0] = x
|
|
100
|
+
RoboArm.ACTUAL_XY[1] = y
|
|
101
101
|
return 'Move X{}->{} Y{}->{}'.format(x_prev, RoboArm.ACTUAL_XY[0], y_prev, RoboArm.ACTUAL_XY[1])
|
|
102
102
|
|
|
103
103
|
|
|
@@ -109,7 +109,7 @@ def boot_move(speed_ms=None):
|
|
|
109
109
|
"""
|
|
110
110
|
RoboArm.SPEED_MS = speed_ms if isinstance(speed_ms, int) else RoboArm.SPEED_MS
|
|
111
111
|
# Set arm to center
|
|
112
|
-
|
|
112
|
+
load()
|
|
113
113
|
sleep_ms(RoboArm.SPEED_MS*2)
|
|
114
114
|
# Test X
|
|
115
115
|
control(RoboArm.RANGE[0], RoboArm.CENTER_XY)
|
|
@@ -179,7 +179,7 @@ async def _play(args, deinit, delay):
|
|
|
179
179
|
if task is not None:
|
|
180
180
|
task.out = "Roboarm X:{} Y:{}".format(x, y)
|
|
181
181
|
# Async wait between steps
|
|
182
|
-
await
|
|
182
|
+
await task.feed(sleep_ms=delay)
|
|
183
183
|
if deinit:
|
|
184
184
|
servo.deinit()
|
|
185
185
|
# OFF LASER
|
|
@@ -204,11 +204,10 @@ def play(*args, s=None, delay=None, deinit=True):
|
|
|
204
204
|
|
|
205
205
|
# Start play - servo XY in async task
|
|
206
206
|
# [!] ASYNC TASK CREATION [1*] with async task callback + taskID (TAG) handling
|
|
207
|
-
state = micro_task(tag=RoboArm.PLAY_TAG, task=_play(args, deinit, delay))
|
|
208
|
-
if state:
|
|
209
|
-
return 'Play: {} steps'.format(int(len(args)/2))
|
|
210
|
-
return 'Play - already running'
|
|
211
207
|
|
|
208
|
+
state:dict = micro_task(tag=RoboArm.PLAY_TAG, task=_play(args, deinit, delay))
|
|
209
|
+
state.update({"Play steps": int(len(args)/2)})
|
|
210
|
+
return state
|
|
212
211
|
|
|
213
212
|
def record(clean=False, rec_limit=8):
|
|
214
213
|
"""
|
|
@@ -262,15 +261,6 @@ def status(lmf=None):
|
|
|
262
261
|
return {'X': RoboArm.ACTUAL_XY[0], 'Y': RoboArm.ACTUAL_XY[1]}
|
|
263
262
|
|
|
264
263
|
|
|
265
|
-
def lmdep():
|
|
266
|
-
"""
|
|
267
|
-
Show Load Module dependency
|
|
268
|
-
- List of load modules used by this application
|
|
269
|
-
:return: tuple
|
|
270
|
-
"""
|
|
271
|
-
return 'servo', 'switch'
|
|
272
|
-
|
|
273
|
-
|
|
274
264
|
def pinmap():
|
|
275
265
|
"""
|
|
276
266
|
[i] micrOS LM naming convention
|
|
@@ -279,7 +269,7 @@ def pinmap():
|
|
|
279
269
|
:return dict: pin name (str) - pin value (int) pairs
|
|
280
270
|
"""
|
|
281
271
|
s_pm = servo.pinmap()
|
|
282
|
-
s_pm.update(
|
|
272
|
+
s_pm.update(switch_pinmap())
|
|
283
273
|
return s_pm
|
|
284
274
|
|
|
285
275
|
|
|
@@ -290,11 +280,13 @@ def help(widgets=False):
|
|
|
290
280
|
(widgets=False) list of functions implemented by this application
|
|
291
281
|
(widgets=True) list of widget json for UI generation
|
|
292
282
|
"""
|
|
293
|
-
return 'control x=<40-115> y=<40-115>
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
283
|
+
return resolve(('JOYSTICK control x=<40-115> y=<40-115> speed_ms=5 smooth=True',
|
|
284
|
+
'BUTTON boot_move speed_ms=10',
|
|
285
|
+
'BUTTON standby y_pos=45',
|
|
286
|
+
'BUTTON jiggle delta=3',
|
|
287
|
+
'play 40 40 115 115 s=<speed ms> delay=<ms> deinit=True',
|
|
288
|
+
'BUTTON play deinit=True',
|
|
289
|
+
'record clean=False rec_limit=8',
|
|
290
|
+
'random x_range=20 y_range=20 speed_ms=5',
|
|
291
|
+
'load', 'pinmap',
|
|
292
|
+
'status'), widgets=widgets)
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
from LM_system import memory_usage
|
|
2
|
+
from Common import socket_stream, syslog, micro_task
|
|
3
|
+
from Auth import sudo
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@socket_stream
|
|
7
|
+
def raise_error(msgobj=None):
|
|
8
|
+
"""
|
|
9
|
+
Test function - raise LM exception
|
|
10
|
+
"""
|
|
11
|
+
if msgobj is not None:
|
|
12
|
+
msgobj("Raise test exception")
|
|
13
|
+
state = syslog('Robustness TeSt ErRoR')
|
|
14
|
+
raise Exception(f"Test exception: {'OK' if state else 'NOK'}")
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@socket_stream
|
|
18
|
+
def memory_leak(cnt=160, msgobj=None):
|
|
19
|
+
"""
|
|
20
|
+
Test function - allocate lot of memory
|
|
21
|
+
:param cnt: data counter, default 160 iteration
|
|
22
|
+
:return: verdict
|
|
23
|
+
"""
|
|
24
|
+
dict_test = {}
|
|
25
|
+
mem_start = memory_usage()['mem_used']
|
|
26
|
+
for k in range(cnt):
|
|
27
|
+
mem = memory_usage()['percent']
|
|
28
|
+
data = "micrOS memory usage: {} %".format(mem)
|
|
29
|
+
if msgobj is not None:
|
|
30
|
+
msgobj("[{}] gen: {}".format(k, data))
|
|
31
|
+
dict_test[k] = data
|
|
32
|
+
mem_end = memory_usage()['mem_used']
|
|
33
|
+
delta = mem_start - mem_end
|
|
34
|
+
return '[{}] RAM Alloc.: {} kB {} byte'.format(len(dict_test), int(delta / 1024), int(delta % 1024))
|
|
35
|
+
|
|
36
|
+
@socket_stream
|
|
37
|
+
def recursion_limit(limit=14, msgobj=None):
|
|
38
|
+
cnt = 0
|
|
39
|
+
for cnt in range(1, limit+1):
|
|
40
|
+
try:
|
|
41
|
+
_recursion(cnt, msgobj=msgobj)
|
|
42
|
+
except Exception as e:
|
|
43
|
+
msgobj(f"ok error: {e}")
|
|
44
|
+
break
|
|
45
|
+
return f"Recursion limit: {cnt}"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _recursion(cnt, msgobj=None):
|
|
49
|
+
"""
|
|
50
|
+
Test function - recursion test
|
|
51
|
+
:param cnt: recursion depth
|
|
52
|
+
:return: verdict
|
|
53
|
+
Error example:
|
|
54
|
+
node01 $ robustness recursion_limit 15
|
|
55
|
+
lm_exec LM_robustness->recursion_limit: maximum recursion depth exceeded
|
|
56
|
+
"""
|
|
57
|
+
if cnt > 0:
|
|
58
|
+
remain = _recursion(cnt-1)
|
|
59
|
+
if msgobj is not None:
|
|
60
|
+
msgobj("recalled {}".format(cnt))
|
|
61
|
+
else:
|
|
62
|
+
remain = 0
|
|
63
|
+
return remain
|
|
64
|
+
|
|
65
|
+
################## TEST micro_task UCs ##########################
|
|
66
|
+
|
|
67
|
+
async def __task(tag, period_ms):
|
|
68
|
+
counter = 0
|
|
69
|
+
with micro_task(tag=tag) as my_task:
|
|
70
|
+
while True:
|
|
71
|
+
# DO something here in the async loop...
|
|
72
|
+
counter += 1
|
|
73
|
+
|
|
74
|
+
# Store data in task cache (task show mytask)
|
|
75
|
+
my_task.out = f'MyTask Counter: {counter}'
|
|
76
|
+
|
|
77
|
+
# Async sleep - feed event loop
|
|
78
|
+
await my_task.feed(sleep_ms=period_ms)
|
|
79
|
+
# [i] feed same as "await asyncio.sleep_ms(period_ms)" with micrOS features (WDT)
|
|
80
|
+
|
|
81
|
+
def create_task():
|
|
82
|
+
"""
|
|
83
|
+
Legacy way of task creation (with exact task tagging)
|
|
84
|
+
"""
|
|
85
|
+
# [!] ASYNC TASK CREATION [1*] with async task callback + taskID (TAG) handling
|
|
86
|
+
task_tag = "microtask.run"
|
|
87
|
+
return micro_task(tag=task_tag, task=__task(tag=task_tag, period_ms=5))
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
@micro_task("microtask", _wrap=True)
|
|
91
|
+
async def mytask(tag, period_ms=30):
|
|
92
|
+
"""
|
|
93
|
+
New shorter way of task creation
|
|
94
|
+
with decorator function
|
|
95
|
+
"""
|
|
96
|
+
counter = 0
|
|
97
|
+
with micro_task(tag=tag) as my_task:
|
|
98
|
+
while True:
|
|
99
|
+
# DO something here in the async loop...
|
|
100
|
+
counter += 1
|
|
101
|
+
|
|
102
|
+
# Store data in task cache (task show mytask)
|
|
103
|
+
my_task.out = f'MyTask Counter: {counter}'
|
|
104
|
+
|
|
105
|
+
# Async sleep - feed event loop
|
|
106
|
+
await my_task.feed(sleep_ms=period_ms)
|
|
107
|
+
# [i] feed same as "await asyncio.sleep_ms(period_ms)" with micrOS features (WDT)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
@sudo
|
|
111
|
+
def func_sudo():
|
|
112
|
+
"""
|
|
113
|
+
Function execution requires pwd=<...>
|
|
114
|
+
"""
|
|
115
|
+
return "Access granted"
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@sudo(_force_only=(True, 0))
|
|
119
|
+
def func_sudo_force(force=False):
|
|
120
|
+
"""
|
|
121
|
+
Function requires pwd=<...> when force=True
|
|
122
|
+
"""
|
|
123
|
+
return f"Access granted, force flag: {force}"
|
|
124
|
+
|
|
125
|
+
##############################################################################
|
|
126
|
+
|
|
127
|
+
def help(widgets=False):
|
|
128
|
+
"""
|
|
129
|
+
[i] micrOS LM naming convention - built-in help message
|
|
130
|
+
:return tuple:
|
|
131
|
+
(widgets=False) list of functions implemented by this application
|
|
132
|
+
(widgets=True) list of widget json for UI generation
|
|
133
|
+
"""
|
|
134
|
+
return 'NOTE: This is a test module to validate system robustness', \
|
|
135
|
+
'raise_error', 'memory_leak cnt=160', 'recursion_limit cnt=14', \
|
|
136
|
+
'create_task', 'mytask', "func_sudo", "func_sudo_force"
|
|
137
|
+
|