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,156 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import os
|
|
3
|
+
import re
|
|
4
|
+
|
|
5
|
+
try:
|
|
6
|
+
import readline # Linux/macOS
|
|
7
|
+
except ImportError:
|
|
8
|
+
import pyreadline3 as readline # Windows (PowerShell, CMD)
|
|
9
|
+
|
|
10
|
+
try:
|
|
11
|
+
from .TerminalColors import Colors as color
|
|
12
|
+
except:
|
|
13
|
+
from TerminalColors import Colors as color
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
ANSI_ESCAPE_RE = re.compile(r"\x1B\[[0-?]*[ -/]*[@-~]")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class CommandInterface:
|
|
20
|
+
def __init__(self, prompt):
|
|
21
|
+
self._prompt = ""
|
|
22
|
+
self._prompt_plain = ""
|
|
23
|
+
self._last_rendered_length = 0
|
|
24
|
+
self.prompt = prompt
|
|
25
|
+
self.command_history = ["help"]
|
|
26
|
+
self.history_file = os.path.expanduser("~/.micrOS_cmd_history") # History file (Linux/macOS)
|
|
27
|
+
|
|
28
|
+
# Configure readline
|
|
29
|
+
self.load_history()
|
|
30
|
+
readline.set_completer_delims("") # Ensure entire command is considered
|
|
31
|
+
readline.set_completer(self.autocomplete)
|
|
32
|
+
# Check if we're running on macOS using libedit
|
|
33
|
+
if "libedit" in readline.__doc__:
|
|
34
|
+
readline.parse_and_bind("bind ^I rl_complete") # macOS alternative
|
|
35
|
+
else:
|
|
36
|
+
readline.parse_and_bind("tab: complete") # Linux/GNU readline
|
|
37
|
+
readline.set_pre_input_hook(self.pre_input_hook)
|
|
38
|
+
readline.set_completion_display_matches_hook(self.completion_display)
|
|
39
|
+
|
|
40
|
+
def __auto_clear_history(self):
|
|
41
|
+
cmd_history = []
|
|
42
|
+
# Load file history in order - skip duplicates
|
|
43
|
+
if os.path.exists(self.history_file):
|
|
44
|
+
with open(self.history_file, "r") as f:
|
|
45
|
+
for line in reversed(f.readlines()):
|
|
46
|
+
if line in cmd_history:
|
|
47
|
+
continue
|
|
48
|
+
cmd_history.append(line)
|
|
49
|
+
# Save cleaned history to file
|
|
50
|
+
with open(self.history_file, "w") as f:
|
|
51
|
+
f.writelines(f"{item}\n" for item in reversed(cmd_history))
|
|
52
|
+
|
|
53
|
+
def load_history(self):
|
|
54
|
+
"""Loads command history from a file if available."""
|
|
55
|
+
print(f"Command history: {self.history_file}")
|
|
56
|
+
try:
|
|
57
|
+
self.__auto_clear_history()
|
|
58
|
+
except Exception as e:
|
|
59
|
+
print(f"Auto clean history error: {e}")
|
|
60
|
+
if os.path.exists(self.history_file):
|
|
61
|
+
with open(self.history_file, "r") as f:
|
|
62
|
+
for line in f:
|
|
63
|
+
clean_line = line.strip()
|
|
64
|
+
if clean_line: # Avoid empty lines
|
|
65
|
+
self.command_history.append(clean_line)
|
|
66
|
+
readline.add_history(clean_line)
|
|
67
|
+
|
|
68
|
+
def save_history(self):
|
|
69
|
+
"""Saves command history to a file."""
|
|
70
|
+
with open(self.history_file, "w") as f:
|
|
71
|
+
for cmd in self.command_history:
|
|
72
|
+
f.write(cmd + "\n")
|
|
73
|
+
|
|
74
|
+
def add_history(self, cmd):
|
|
75
|
+
"""Updates readline history and command_history."""
|
|
76
|
+
cmd = cmd.strip()
|
|
77
|
+
if cmd and cmd != self.command_history[-1]: # Avoid duplicate last command
|
|
78
|
+
self.command_history.append(cmd)
|
|
79
|
+
readline.add_history(cmd)
|
|
80
|
+
|
|
81
|
+
def autocomplete(self, text, state):
|
|
82
|
+
"""Autocomplete function: suggests previous commands."""
|
|
83
|
+
matches = list(dict.fromkeys(cmd for cmd in self.command_history if cmd.startswith(text)))
|
|
84
|
+
return matches[state] if state < len(matches) else None
|
|
85
|
+
|
|
86
|
+
@staticmethod
|
|
87
|
+
def _strip_ansi(value):
|
|
88
|
+
if not value:
|
|
89
|
+
return ""
|
|
90
|
+
return ANSI_ESCAPE_RE.sub("", value)
|
|
91
|
+
|
|
92
|
+
@property
|
|
93
|
+
def prompt(self):
|
|
94
|
+
return self._prompt
|
|
95
|
+
|
|
96
|
+
@prompt.setter
|
|
97
|
+
def prompt(self, value):
|
|
98
|
+
self._prompt = value
|
|
99
|
+
self._prompt_plain = self._strip_ansi(value)
|
|
100
|
+
|
|
101
|
+
def pre_input_hook(self):
|
|
102
|
+
"""Ensures prompt visibility when scrolling through history."""
|
|
103
|
+
buffer = readline.get_line_buffer()
|
|
104
|
+
sys.stdout.write("\r")
|
|
105
|
+
rendered = f"{self.prompt}{buffer}"
|
|
106
|
+
sys.stdout.write(rendered)
|
|
107
|
+
|
|
108
|
+
visible_length = len(self._prompt_plain) + len(buffer)
|
|
109
|
+
if visible_length < self._last_rendered_length:
|
|
110
|
+
padding = " " * (self._last_rendered_length - visible_length)
|
|
111
|
+
sys.stdout.write(padding)
|
|
112
|
+
sys.stdout.write("\r")
|
|
113
|
+
sys.stdout.write(rendered)
|
|
114
|
+
|
|
115
|
+
sys.stdout.flush()
|
|
116
|
+
self._last_rendered_length = visible_length
|
|
117
|
+
readline.redisplay() # Ensures history navigation does not erase prompt
|
|
118
|
+
|
|
119
|
+
def completion_display(self, substitutions, matches, longest_match_length):
|
|
120
|
+
print("\nSuggestions:", ", ".join(matches))
|
|
121
|
+
|
|
122
|
+
#####################################
|
|
123
|
+
# STANDALONE TEST METHODS #
|
|
124
|
+
#####################################
|
|
125
|
+
|
|
126
|
+
def dummy_send_cmd(self, cmd, stream):
|
|
127
|
+
"""TEST FUNCTION - OUTPUT STRUCTURE SIMULATION (Must remain unchanged)."""
|
|
128
|
+
dummy_reply = "Bye!" if cmd.strip() in ["exit", "reboot"] else f"Dummy reply for {cmd}"
|
|
129
|
+
if stream:
|
|
130
|
+
print(dummy_reply) # micrOS protocol: return response data
|
|
131
|
+
print(self.prompt, end="") # micrOS protocol: return prompt -> indicating ready state
|
|
132
|
+
else:
|
|
133
|
+
dummy_reply = f"{dummy_reply}\n{self.prompt}"
|
|
134
|
+
return dummy_reply
|
|
135
|
+
|
|
136
|
+
def dummy_run(self):
|
|
137
|
+
"""TEST FUNCTION - Simulated interactive terminal."""
|
|
138
|
+
print(f"{self.prompt}", end="", flush=True)
|
|
139
|
+
while True:
|
|
140
|
+
try:
|
|
141
|
+
cmd = input()
|
|
142
|
+
output = self.dummy_send_cmd(cmd, stream=True)
|
|
143
|
+
self.add_history(cmd)
|
|
144
|
+
if 'Bye!' in str(output):
|
|
145
|
+
break
|
|
146
|
+
except KeyboardInterrupt:
|
|
147
|
+
print("\nExiting...")
|
|
148
|
+
break
|
|
149
|
+
|
|
150
|
+
self.save_history()
|
|
151
|
+
print("Session closed.")
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
if __name__ == "__main__":
|
|
155
|
+
shell = CommandInterface(prompt="<prompt_placeholder>$ ")
|
|
156
|
+
shell.dummy_run()
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import sys
|
|
2
|
-
from sys import executable
|
|
3
2
|
import os
|
|
4
3
|
import subprocess
|
|
4
|
+
import getpass
|
|
5
|
+
USER = getpass.getuser()
|
|
5
6
|
MYPATH = os.path.dirname(__file__)
|
|
6
7
|
USER_DATA_OPT_INST_DONE = os.path.join(MYPATH, '../user_data/.opt_dep_install')
|
|
7
|
-
INTERPRETER = executable
|
|
8
|
+
INTERPRETER = sys.executable
|
|
8
9
|
|
|
9
10
|
sys.path.append(os.path.join(MYPATH, '../'))
|
|
10
11
|
from DevEnvCompile import Compile
|
|
@@ -40,13 +41,39 @@ def list_packages():
|
|
|
40
41
|
return AVAILABLE_PACKAGES
|
|
41
42
|
|
|
42
43
|
|
|
43
|
-
def
|
|
44
|
+
def run_subprocess(cmd_list: list):
|
|
44
45
|
try:
|
|
45
|
-
|
|
46
|
+
result = subprocess.run(
|
|
47
|
+
cmd_list,
|
|
48
|
+
capture_output=True, # Captures stdout and stderr
|
|
49
|
+
text=True, # Decodes output into strings
|
|
50
|
+
check=True # Raises CalledProcessError for non-zero exit codes
|
|
51
|
+
)
|
|
52
|
+
print(f"Subprocess output: {result.stdout}")
|
|
53
|
+
return True, result.stdout
|
|
54
|
+
except subprocess.CalledProcessError as e:
|
|
55
|
+
print(f"{TerminalColors.Colors.ERR}Subprocess error:{TerminalColors.Colors.NC} {e.stderr}")
|
|
56
|
+
return False, e.stderr
|
|
57
|
+
|
|
58
|
+
def install_package(name, additional_pip_param=None):
|
|
59
|
+
print(f"Install optional dependency (pip): {name}")
|
|
60
|
+
try:
|
|
61
|
+
if additional_pip_param is None:
|
|
62
|
+
state, out = run_subprocess([INTERPRETER, '-m', 'pip', 'install', '--user', USER, name])
|
|
63
|
+
else:
|
|
64
|
+
state, out = run_subprocess([INTERPRETER, '-m', 'pip', 'install', '--user', USER, name, additional_pip_param])
|
|
46
65
|
if state:
|
|
47
66
|
print(f"{TerminalColors.Colors.OK}[PIP] install {name} OK{TerminalColors.Colors.NC}")
|
|
48
67
|
else:
|
|
49
68
|
print(f"{TerminalColors.Colors.WARN}[PIP] install {name} NOK{TerminalColors.Colors.NC}")
|
|
69
|
+
if "--break-system-packages" in out:
|
|
70
|
+
# (Retry) Support system wide package install
|
|
71
|
+
install_package(name, additional_pip_param="--break-system-packages")
|
|
72
|
+
elif "This environment is externally managed" in out:
|
|
73
|
+
# (Retry-Fallback) Support brew installed python
|
|
74
|
+
if "brew install" in out:
|
|
75
|
+
print(f"Install optional dependency (brew): {name}")
|
|
76
|
+
state, out = run_subprocess(["brew", "install", name])
|
|
50
77
|
except subprocess.CalledProcessError as e:
|
|
51
78
|
print(f"{TerminalColors.Colors.ERR}[PIP] error: {e}{TerminalColors.Colors.NC}")
|
|
52
79
|
state = False
|
toolkit/micrOSdashboard.py
CHANGED
|
@@ -6,17 +6,12 @@ import os
|
|
|
6
6
|
import threading
|
|
7
7
|
import subprocess
|
|
8
8
|
import time
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
from PyQt5.
|
|
13
|
-
from PyQt5.QtGui import QIcon
|
|
14
|
-
|
|
15
|
-
from PyQt5.QtWidgets import QApplication, QPlainTextEdit
|
|
16
|
-
from PyQt5.QtCore import QThread, pyqtSignal
|
|
17
|
-
from PyQt5.QtGui import QFont
|
|
18
|
-
from PyQt5 import QtGui
|
|
19
|
-
from PyQt5.QtGui import QPixmap
|
|
9
|
+
|
|
10
|
+
from PyQt5.QtWidgets import (QApplication, QPlainTextEdit, QPushButton, QProgressBar, QComboBox, QLabel, QCheckBox,
|
|
11
|
+
QLineEdit, QMessageBox, QWidget, QToolTip)
|
|
12
|
+
from PyQt5.QtCore import pyqtSlot, QThread, QSize, pyqtSignal
|
|
13
|
+
from PyQt5.QtGui import QIcon, QTextCursor, QFont, QPixmap
|
|
14
|
+
|
|
20
15
|
import concurrent.futures
|
|
21
16
|
|
|
22
17
|
MYPATH = os.path.dirname(__file__)
|
|
@@ -29,14 +24,14 @@ try:
|
|
|
29
24
|
from . import socketClient
|
|
30
25
|
from . import dashboard_apps
|
|
31
26
|
from .lib import LocalMachine
|
|
32
|
-
from .lib.
|
|
27
|
+
from .lib.MicrosFiles import check_all_extensions
|
|
33
28
|
except Exception as e:
|
|
34
29
|
print("Import warning: {}".format(e))
|
|
35
30
|
import MicrOSDevEnv
|
|
36
31
|
import socketClient
|
|
37
32
|
import dashboard_apps
|
|
38
33
|
from lib import LocalMachine
|
|
39
|
-
from lib.
|
|
34
|
+
from lib.MicrosFiles import check_all_extensions
|
|
40
35
|
|
|
41
36
|
APP_DIR = os.path.join(MYPATH, 'dashboard_apps')
|
|
42
37
|
|
|
@@ -454,7 +449,7 @@ class HeaderInfo:
|
|
|
454
449
|
logo_path = os.path.join(MYPATH, '../media/logo_mini.png')
|
|
455
450
|
button = QPushButton('', self.parent_obj)
|
|
456
451
|
button.setIcon(QIcon(logo_path))
|
|
457
|
-
button.setIconSize(
|
|
452
|
+
button.setIconSize(QSize(50, 50))
|
|
458
453
|
button.setGeometry(20, 5, 50, 50)
|
|
459
454
|
button.setToolTip(f"Open micrOS repo documentation\n{self.url}")
|
|
460
455
|
button.setStyleSheet('border: 0px solid black;')
|
|
@@ -581,7 +576,7 @@ class ClusterStatus:
|
|
|
581
576
|
except:
|
|
582
577
|
hwuid = hello
|
|
583
578
|
status = '🟢' if status else '🔴'
|
|
584
|
-
msg = f"{status}{hwuid}|{devip}🏷{fuid} v
|
|
579
|
+
msg = f"{status}{hwuid} | {devip}🏷{fuid} v:{version}"
|
|
585
580
|
return msg
|
|
586
581
|
|
|
587
582
|
with concurrent.futures.ThreadPoolExecutor() as executor:
|
|
@@ -609,7 +604,7 @@ class QuickOTAUpload(QLabel):
|
|
|
609
604
|
width = 200
|
|
610
605
|
height = 15
|
|
611
606
|
label = QLabel(self.parent_obj)
|
|
612
|
-
label.setText("
|
|
607
|
+
label.setText("Drag-n-Drop OTA file upload")
|
|
613
608
|
label.setGeometry(start_x, start_y, width, height)
|
|
614
609
|
label.setStyleSheet("background-color: white")
|
|
615
610
|
|
|
@@ -638,14 +633,14 @@ class QuickOTAUpload(QLabel):
|
|
|
638
633
|
pixmap = QPixmap(logo_path)
|
|
639
634
|
pixmap = pixmap.scaled(100, 100)
|
|
640
635
|
self.setPixmap(pixmap)
|
|
641
|
-
self.setToolTip(f"
|
|
636
|
+
self.setToolTip(f"OTA File (py,mpy,js,html,css) upload to micrOS board via webrepl\nSimulator path: {os.path.join(MYPATH, 'workspace/simulator')}")
|
|
642
637
|
self.setAcceptDrops(True)
|
|
643
638
|
|
|
644
639
|
def get_upload_callback(self):
|
|
645
640
|
if len(self.contents_path) == 0:
|
|
646
641
|
self.parent_obj.console.append_output(f"Empty upload list.")
|
|
647
642
|
else:
|
|
648
|
-
if not self.parent_obj.start_bg_application_popup(text="
|
|
643
|
+
if not self.parent_obj.start_bg_application_popup(text="OTA UPLOAD?",
|
|
649
644
|
verify_data_dict={i+1: path for i, path in enumerate(self.contents_path)}):
|
|
650
645
|
return
|
|
651
646
|
self.parent_obj.on_click_lm_quick_update(upload_path_list=self.contents_path)
|
|
@@ -954,7 +949,7 @@ class micrOSGUI(QWidget):
|
|
|
954
949
|
self.devenv_usb_deployment_is_active = True
|
|
955
950
|
# Create a Thread with a function without any arguments
|
|
956
951
|
self.console.append_output('[usb_deploy] |- start usb_deploy job')
|
|
957
|
-
th = threading.Thread(target=self.devtool_obj.deploy_micros, kwargs={'
|
|
952
|
+
th = threading.Thread(target=self.devtool_obj.deploy_micros, kwargs={'restore_config': False, "cleanup_workdir": True},
|
|
958
953
|
daemon=DAEMON)
|
|
959
954
|
th.start()
|
|
960
955
|
self.bgjob_thread_obj_dict['usb_deploy'] = th
|
|
@@ -1064,7 +1059,7 @@ class micrOSGUI(QWidget):
|
|
|
1064
1059
|
'forced LM_ prefix': not self.modifiers_obj.unsafe_ota_enabled}):
|
|
1065
1060
|
return
|
|
1066
1061
|
|
|
1067
|
-
self.console.append_output('[quick_ota]
|
|
1062
|
+
self.console.append_output('[quick_ota] Module upload over wifi')
|
|
1068
1063
|
# Start init_progressbar
|
|
1069
1064
|
pth = ProgressbarUpdateThread()
|
|
1070
1065
|
pth.eta_sec = ProgressbarTimers.quick_ota
|
|
@@ -1219,7 +1214,7 @@ class micrOSGUI(QWidget):
|
|
|
1219
1214
|
|
|
1220
1215
|
def main():
|
|
1221
1216
|
app = QApplication(sys.argv)
|
|
1222
|
-
app.setWindowIcon(
|
|
1217
|
+
app.setWindowIcon(QIcon(os.path.join(MYPATH, '../media/logo.png')))
|
|
1223
1218
|
ex = micrOSGUI()
|
|
1224
1219
|
ex.draw()
|
|
1225
1220
|
sys.exit(app.exec_())
|
toolkit/micrOSlint.py
CHANGED
|
@@ -18,7 +18,7 @@ MICROS_SOURCE_DIR = os.path.join(MYPATH, '../micrOS/source')
|
|
|
18
18
|
RELEASE_INFO_PATH = os.path.join(MYPATH, '../micrOS/release_info/micrOS_ReleaseInfo')
|
|
19
19
|
|
|
20
20
|
# MICROS LINTER CONFIG
|
|
21
|
-
ALLOWED_LM_DEP_WARNS =
|
|
21
|
+
ALLOWED_LM_DEP_WARNS = 3 # ALLOWED NUMBER OF LM CORE DEPENDENCY (less is better)
|
|
22
22
|
|
|
23
23
|
def parse_micros_file_categories(verbose=True):
|
|
24
24
|
"""
|
|
@@ -27,11 +27,17 @@ def parse_micros_file_categories(verbose=True):
|
|
|
27
27
|
file_ignore_list = ['.DS_Store']
|
|
28
28
|
# micrOS file categories
|
|
29
29
|
categories = {'core': [], 'load_module': [], 'pin_maps': [], 'other': []}
|
|
30
|
-
|
|
30
|
+
modules_path = os.path.join(MICROS_SOURCE_DIR, "modules")
|
|
31
|
+
web_path = os.path.join(MICROS_SOURCE_DIR, "web")
|
|
32
|
+
check_file = lambda _b, _f: os.path.isfile(os.path.join(_b, _f)) and _f not in file_ignore_list
|
|
33
|
+
root_files = [f for f in LocalMachine.FileHandler.list_dir(MICROS_SOURCE_DIR) if check_file(MICROS_SOURCE_DIR, f)]
|
|
34
|
+
module_files = [f"modules/{f}" for f in LocalMachine.FileHandler.list_dir(modules_path) if check_file(modules_path, f)]
|
|
35
|
+
web_files = [f"web/{f}" for f in LocalMachine.FileHandler.list_dir(web_path) if check_file(web_path, f)]
|
|
36
|
+
files = root_files + module_files + web_files
|
|
31
37
|
for f in files:
|
|
32
|
-
if f.
|
|
38
|
+
if f.endswith('.py') and "LM_" in f:
|
|
33
39
|
categories['load_module'].append(f)
|
|
34
|
-
elif f.
|
|
40
|
+
elif f.endswith('.py') and "IO_" in f:
|
|
35
41
|
categories['pin_maps'].append(f)
|
|
36
42
|
elif f.endswith('.py'):
|
|
37
43
|
categories['core'].append(f)
|
|
@@ -172,14 +178,15 @@ def core_dep_checker(categories, verbose=True):
|
|
|
172
178
|
def load_module_checker(categories, verbose=True):
|
|
173
179
|
|
|
174
180
|
def _is_allowed(_relation):
|
|
175
|
-
_allowed_whitelist = ['Common', 'microIO', 'Types']
|
|
181
|
+
_allowed_whitelist = ['Common', 'microIO', 'Types', 'urequests', 'Auth']
|
|
176
182
|
_allowed = []
|
|
177
183
|
for _allow in _relation:
|
|
178
184
|
if _allow in _allowed_whitelist:
|
|
179
185
|
_allowed.append(_allow)
|
|
180
186
|
return _relation, _allowed
|
|
181
187
|
|
|
182
|
-
lm_god_mode = ['LM_system.py', '
|
|
188
|
+
lm_god_mode = ['modules/LM_system.py', 'modules/LM_pacman.py',
|
|
189
|
+
'modules/LM_espnow.py', 'modules/LM_cluster.py']
|
|
183
190
|
state_lm_dep = True
|
|
184
191
|
verdict = []
|
|
185
192
|
lm_resources = categories['load_module']
|
|
@@ -222,7 +229,12 @@ def _run_pylint(file_name):
|
|
|
222
229
|
'--disable=broad-exception-caught', # Disable BROAD exception
|
|
223
230
|
'--disable=broad-exception-raised', # Disable BROAD exception
|
|
224
231
|
'--disable=too-many-return-statements', # :D I don't think so :D
|
|
225
|
-
'--disable=too-many-branches'
|
|
232
|
+
'--disable=too-many-branches', # :D I don't think so :D
|
|
233
|
+
'--disable=too-many-positional-arguments', # :D I don't think so :D
|
|
234
|
+
'--disable=too-many-instance-attributes', # :D I don't think so :D
|
|
235
|
+
'--disable=wrong-import-position', # :D I don't think so :D !!! It is needed due to optimizations
|
|
236
|
+
'--disable=too-many-arguments', # :D I know what I am doing...
|
|
237
|
+
'--disable=multiple-statements', # :D I line oneliners
|
|
226
238
|
]
|
|
227
239
|
if file_name in ['Tasks.py', 'microIO.py', 'Types.py']:
|
|
228
240
|
pylint_opts.append('--disable=exec-used') # Disable micrOS execution core exec/eval warning
|
|
@@ -239,7 +251,7 @@ def _run_pylint(file_name):
|
|
|
239
251
|
|
|
240
252
|
def run_pylint(categories, verbose=True, dry_run=False):
|
|
241
253
|
# ERROR CONFIG: drop error if this is in pylint output
|
|
242
|
-
error_msg_core = ['syntax-error', 'undefined-variable', 'no-member'
|
|
254
|
+
error_msg_core = ['syntax-error', 'undefined-variable', 'bad-indentation'] # 'no-member' ?
|
|
243
255
|
# BYPASS 'no-member' due to duty and sleep_ms micropython functions is drops false alarm, etc.
|
|
244
256
|
error_msg_lm = ['syntax-error', 'undefined-variable']
|
|
245
257
|
|
|
@@ -346,13 +358,18 @@ def _verdict_gen(master_key, categories, verbose=True):
|
|
|
346
358
|
ref = ['?', []]
|
|
347
359
|
spacer = "\n" + " " * 98
|
|
348
360
|
ref_verdict = f'{ref[0]}:{spacer.join(ref[1])}' if verbose else ref[0]
|
|
361
|
+
if isinstance(ref_verdict, int):
|
|
362
|
+
ref_cnt = f"{Colors.BOLD}{ref_verdict}{Colors.NC}" if ref_verdict > 0 else ref_verdict
|
|
363
|
+
else:
|
|
364
|
+
ref_cnt = ref_verdict
|
|
349
365
|
|
|
350
366
|
mlint = categories[master_key][master_module]['linter']['mlint'][0]
|
|
367
|
+
mlint = f"{Colors.OK}OK{Colors.NC}" if mlint else f"{Colors.WARN}NOK{Colors.NC}"
|
|
351
368
|
try:
|
|
352
369
|
pylint = categories[master_key][master_module]['linter']['pylint'][0]
|
|
353
370
|
except Exception as e:
|
|
354
371
|
pylint = f'{e}'
|
|
355
|
-
long_verdict.append(f"\t{i+1}\t{lines}\t{master_module}{_spacer(master_module)}(mlint: {mlint})\t(pylint: {pylint})\t(ref.: {
|
|
372
|
+
long_verdict.append(f"\t{i+1}\t{lines}\t{master_module}{_spacer(master_module)}(mlint: {mlint})\t(pylint: {pylint})\t(ref.: {ref_cnt})")
|
|
356
373
|
short_result[master_module] = [pylint, ref_verdict]
|
|
357
374
|
return short_result, long_verdict
|
|
358
375
|
|
|
@@ -502,8 +519,9 @@ def diff_short_summary(summary, verbose=True):
|
|
|
502
519
|
|
|
503
520
|
def save_system_analysis_json(categories):
|
|
504
521
|
file_path = os.path.join(MYPATH, 'user_data/system_analysis.json')
|
|
522
|
+
sorted_categories = {key: categories[key] for key in sorted(categories)}
|
|
505
523
|
with open(file_path, 'w') as json_file:
|
|
506
|
-
json.dump(
|
|
524
|
+
json.dump(sorted_categories, json_file, indent=4)
|
|
507
525
|
return f"system_analysis json saved to {file_path}"
|
|
508
526
|
|
|
509
527
|
def save_system_summary_json(summary):
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
class AIOESPNow:
|
|
4
|
+
|
|
5
|
+
def __init__(self):
|
|
6
|
+
self._active = False
|
|
7
|
+
self.peers_table = None
|
|
8
|
+
|
|
9
|
+
def active(self, state=None):
|
|
10
|
+
if state is not None:
|
|
11
|
+
self._active = state
|
|
12
|
+
return self._active
|
|
13
|
+
|
|
14
|
+
def stats(self):
|
|
15
|
+
pass
|
|
16
|
+
|
|
17
|
+
def add_peer(self, mac):
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
async def asend(self, mac, full_msg):
|
|
21
|
+
pass
|
|
22
|
+
|
|
23
|
+
def send(self, mac, full_msg):
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
def __iter__(self):
|
|
27
|
+
return (i for i in range(0, 3))
|
|
28
|
+
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import time
|
|
3
|
+
MYPATH = os.path.dirname(__file__)
|
|
4
|
+
|
|
5
|
+
JPEG = None
|
|
6
|
+
XCLK_20MHz = None
|
|
7
|
+
PSRAM = None
|
|
8
|
+
FRAME_SVGA = None
|
|
9
|
+
FRAME_HD = None
|
|
10
|
+
FRAME_HVGA = None
|
|
11
|
+
|
|
12
|
+
EFFECT_NEG = None
|
|
13
|
+
EFFECT_BW = None
|
|
14
|
+
EFFECT_RED = None
|
|
15
|
+
EFFECT_GREEN = None
|
|
16
|
+
EFFECT_BLUE = None
|
|
17
|
+
EFFECT_RETRO = None
|
|
18
|
+
EFFECT_NONE = None
|
|
19
|
+
|
|
20
|
+
WB_SUNNY = None
|
|
21
|
+
WB_CLOUDY = None
|
|
22
|
+
WB_OFFICE = None
|
|
23
|
+
WB_HOME = None
|
|
24
|
+
WB_NONE = None
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _dummy_images_gen():
|
|
28
|
+
images = [os.path.join(MYPATH, 'view01.jpg'), os.path.join(MYPATH, 'view02.jpg')]
|
|
29
|
+
while True:
|
|
30
|
+
for img in images:
|
|
31
|
+
yield img
|
|
32
|
+
|
|
33
|
+
_DUMMY_IMAGES = _dummy_images_gen()
|
|
34
|
+
|
|
35
|
+
def init(*args, **kwargs):
|
|
36
|
+
print("Init dummy camera module")
|
|
37
|
+
print(args)
|
|
38
|
+
print(kwargs)
|
|
39
|
+
return True
|
|
40
|
+
|
|
41
|
+
def deinit(*args, **kwargs):
|
|
42
|
+
print("DeInit dummy camera module")
|
|
43
|
+
print(args)
|
|
44
|
+
print(kwargs)
|
|
45
|
+
return True
|
|
46
|
+
|
|
47
|
+
def framesize(*args, **kwargs):
|
|
48
|
+
pass
|
|
49
|
+
|
|
50
|
+
def flip(*args, **kwargs):
|
|
51
|
+
pass
|
|
52
|
+
|
|
53
|
+
def mirror(*args, **kwargs):
|
|
54
|
+
pass
|
|
55
|
+
|
|
56
|
+
def speffect(*args, **kwargs):
|
|
57
|
+
pass
|
|
58
|
+
|
|
59
|
+
def whitebalance(*args, **kwargs):
|
|
60
|
+
pass
|
|
61
|
+
|
|
62
|
+
def saturation(*args, **kwargs):
|
|
63
|
+
pass
|
|
64
|
+
|
|
65
|
+
def brightness(*args, **kwargs):
|
|
66
|
+
pass
|
|
67
|
+
|
|
68
|
+
def contrast(*args, **kwargs):
|
|
69
|
+
pass
|
|
70
|
+
|
|
71
|
+
def quality(*args, **kwargs):
|
|
72
|
+
pass
|
|
73
|
+
|
|
74
|
+
def capture():
|
|
75
|
+
print("Load dummy image")
|
|
76
|
+
image = next(_DUMMY_IMAGES)
|
|
77
|
+
try:
|
|
78
|
+
time.sleep(1)
|
|
79
|
+
with open(image, 'rb') as f:
|
|
80
|
+
image_bin = f.read()
|
|
81
|
+
return image_bin
|
|
82
|
+
except Exception as e:
|
|
83
|
+
print(f"Cannot load {image}: {e}")
|
|
84
|
+
return b''
|
toolkit/simulator_lib/dht.py
CHANGED
|
@@ -1,6 +1,54 @@
|
|
|
1
1
|
|
|
2
2
|
MONO_VLSB = None
|
|
3
|
+
MONO_HMSB = None
|
|
3
4
|
|
|
4
5
|
|
|
5
6
|
class FrameBuffer:
|
|
6
|
-
|
|
7
|
+
|
|
8
|
+
def __init__(self, *args, **kwargs):
|
|
9
|
+
pass
|
|
10
|
+
|
|
11
|
+
def fill(self, color=0):
|
|
12
|
+
pass
|
|
13
|
+
|
|
14
|
+
def show(self):
|
|
15
|
+
pass
|
|
16
|
+
|
|
17
|
+
def write_cmd(self, cmd):
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
def reset(self):
|
|
21
|
+
pass
|
|
22
|
+
|
|
23
|
+
def poweron(self):
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
def poweroff(self):
|
|
27
|
+
pass
|
|
28
|
+
|
|
29
|
+
def flip(self, *args, **kwargs):
|
|
30
|
+
pass
|
|
31
|
+
|
|
32
|
+
def rotate(self, *args, **kwargs):
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
def text(self, string, x, y, color=0):
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
def pixel(self, x, y, color=0):
|
|
39
|
+
pass
|
|
40
|
+
|
|
41
|
+
def line(self, x0, y0, x1, y1, color=0):
|
|
42
|
+
pass
|
|
43
|
+
|
|
44
|
+
def rect(self, x0, y0, x1, y1, color=0):
|
|
45
|
+
pass
|
|
46
|
+
|
|
47
|
+
def fill_rect(self, x, y, w, h, color=0):
|
|
48
|
+
pass
|
|
49
|
+
|
|
50
|
+
def blit(self, fbuf, x, y, key, palette):
|
|
51
|
+
pass
|
|
52
|
+
|
|
53
|
+
def scroll(self, dx, dy):
|
|
54
|
+
pass
|