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