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,338 @@
|
|
|
1
|
+
let selected = null;
|
|
2
|
+
let selectedEl = null; // DOM element of selected file row
|
|
3
|
+
let selectedDir = 'user_data'; // fallback
|
|
4
|
+
let _editorScriptLoaded = false;
|
|
5
|
+
let editorFile = null; // 🔹 track what's currently opened in editor
|
|
6
|
+
|
|
7
|
+
// 🔹 Simple root message output
|
|
8
|
+
let _msgTimer, _fadeTimer;
|
|
9
|
+
function popUpMsg(msg) {
|
|
10
|
+
let el = document.getElementById('root-message');
|
|
11
|
+
if (!el) {
|
|
12
|
+
el = document.createElement('div');
|
|
13
|
+
el.id = 'root-message';
|
|
14
|
+
Object.assign(el.style, {
|
|
15
|
+
position: 'fixed',
|
|
16
|
+
top: '8px',
|
|
17
|
+
left: '50%',
|
|
18
|
+
transform: 'translateX(-50%)',
|
|
19
|
+
background: 'rgba(220, 60, 60, 0.9)', // warm UI red
|
|
20
|
+
color: '#fff',
|
|
21
|
+
padding: '6px 12px',
|
|
22
|
+
borderRadius: '4px',
|
|
23
|
+
fontSize: '12px',
|
|
24
|
+
zIndex: '99999',
|
|
25
|
+
transition: 'opacity 0.4s ease',
|
|
26
|
+
opacity: '0'
|
|
27
|
+
});
|
|
28
|
+
document.body.appendChild(el);
|
|
29
|
+
}
|
|
30
|
+
el.textContent = msg;
|
|
31
|
+
el.style.display = 'block';
|
|
32
|
+
requestAnimationFrame(() => el.style.opacity = '1');
|
|
33
|
+
// Clean timers
|
|
34
|
+
clearTimeout(_msgTimer);
|
|
35
|
+
clearTimeout(_fadeTimer);
|
|
36
|
+
// Start timer
|
|
37
|
+
_msgTimer = setTimeout(() => {
|
|
38
|
+
el.style.opacity = '0';
|
|
39
|
+
_fadeTimer = setTimeout(() => el.style.display = 'none', 400);
|
|
40
|
+
}, 5000);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 🔹 centralized selection clear
|
|
44
|
+
function clearSelection() {
|
|
45
|
+
document
|
|
46
|
+
.querySelectorAll('#list .file-item')
|
|
47
|
+
.forEach(x => x.className = 'file-item');
|
|
48
|
+
|
|
49
|
+
selected = null;
|
|
50
|
+
selectedEl = null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function load() {
|
|
54
|
+
console.info('load.loadDirs');
|
|
55
|
+
|
|
56
|
+
loadDirs().then(() => {
|
|
57
|
+
console.info('load.loadFiles:', selectedDir);
|
|
58
|
+
loadFiles();
|
|
59
|
+
});
|
|
60
|
+
console.info('load.loadDiskUsage');
|
|
61
|
+
updateDiskUsage();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function loadFiles() {
|
|
65
|
+
const contentList = document.getElementById('list');
|
|
66
|
+
|
|
67
|
+
// 🔹 Enter loading state
|
|
68
|
+
contentList.classList.add('loading');
|
|
69
|
+
|
|
70
|
+
fetch('/fs/list', {
|
|
71
|
+
method: 'POST',
|
|
72
|
+
headers: {
|
|
73
|
+
'Content-Type': 'text/plain'
|
|
74
|
+
},
|
|
75
|
+
body: selectedDir || '/'
|
|
76
|
+
})
|
|
77
|
+
.then(r => r.json())
|
|
78
|
+
.then(files => {
|
|
79
|
+
list.innerHTML = '';
|
|
80
|
+
clearSelection();
|
|
81
|
+
// 🔹 Empty folder placeholder
|
|
82
|
+
if (!Array.isArray(files) || files.length === 0) {
|
|
83
|
+
const d = document.createElement('div');
|
|
84
|
+
d.className = 'file-item placeholder';
|
|
85
|
+
d.textContent = '.empty';
|
|
86
|
+
d.style.opacity = '0.5';
|
|
87
|
+
d.style.pointerEvents = 'none'; // 🔹 non-clickable
|
|
88
|
+
list.appendChild(d);
|
|
89
|
+
|
|
90
|
+
console.info("Files loaded (empty folder)");
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// 🔹 Files listing
|
|
94
|
+
files.forEach(f => {
|
|
95
|
+
const name = f.path.split('/').pop();
|
|
96
|
+
const d = document.createElement('div');
|
|
97
|
+
d.className = 'file-item';
|
|
98
|
+
d.textContent = `${name} ${f.size}B`;
|
|
99
|
+
|
|
100
|
+
d.onclick = (e) => {
|
|
101
|
+
e.stopPropagation();
|
|
102
|
+
|
|
103
|
+
if (selectedEl === d) {
|
|
104
|
+
clearSelection();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
clearSelection();
|
|
109
|
+
d.className = 'file-item sel';
|
|
110
|
+
selected = name;
|
|
111
|
+
selectedEl = d;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
list.appendChild(d);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
console.info("Files loaded");
|
|
118
|
+
})
|
|
119
|
+
.catch(err => {
|
|
120
|
+
console.error("load failed:", err);
|
|
121
|
+
popUpMsg("Failed to load files: " + err.message);
|
|
122
|
+
})
|
|
123
|
+
.finally(() => {
|
|
124
|
+
// 🔹 Exit loading state (success or error)
|
|
125
|
+
contentList.classList.remove('loading');
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function loadDirs() {
|
|
130
|
+
return fetch('/fs/dirs')
|
|
131
|
+
.then(r => r.json())
|
|
132
|
+
.then(dirs => {
|
|
133
|
+
const container = document.getElementById('folder-path');
|
|
134
|
+
container.innerHTML = '';
|
|
135
|
+
|
|
136
|
+
if (!Array.isArray(dirs) || !dirs.length) return;
|
|
137
|
+
|
|
138
|
+
dirs.forEach(dir => {
|
|
139
|
+
const normalized = dir.replace(/^\/+/, '');
|
|
140
|
+
const d = document.createElement('div');
|
|
141
|
+
d.className = 'dir-item';
|
|
142
|
+
d.textContent = normalized;
|
|
143
|
+
|
|
144
|
+
d.onclick = () => {
|
|
145
|
+
document
|
|
146
|
+
.querySelectorAll('#folder-path .dir-item')
|
|
147
|
+
.forEach(x => x.className = 'dir-item');
|
|
148
|
+
|
|
149
|
+
d.className = 'dir-item sel';
|
|
150
|
+
selectedDir = normalized;
|
|
151
|
+
console.info('dirChange.loadFiles:', selectedDir);
|
|
152
|
+
loadFiles();
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
// 🔹 Selection logic
|
|
156
|
+
if (!selectedDir) {
|
|
157
|
+
selectedDir = normalized;
|
|
158
|
+
d.className = 'dir-item sel';
|
|
159
|
+
}
|
|
160
|
+
else if (normalized === selectedDir) {
|
|
161
|
+
d.className = 'dir-item sel';
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
container.appendChild(d);
|
|
165
|
+
console.info("Folders loaded");
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
// 🔹 Fallback if folder vanished
|
|
169
|
+
if (
|
|
170
|
+
!container.querySelector('.dir-item.sel') &&
|
|
171
|
+
container.firstChild
|
|
172
|
+
) {
|
|
173
|
+
selectedDir = container.firstChild.textContent;
|
|
174
|
+
container.firstChild.classList.add('sel');
|
|
175
|
+
}
|
|
176
|
+
})
|
|
177
|
+
.catch(err => {
|
|
178
|
+
console.error("dirs load failed:", err);
|
|
179
|
+
popUpMsg("Failed to load folders: " + err.message);
|
|
180
|
+
})
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function uploadFile() {
|
|
184
|
+
const f = file.files[0];
|
|
185
|
+
if (!f) return;
|
|
186
|
+
|
|
187
|
+
const fd = new FormData();
|
|
188
|
+
const targetPath = `${selectedDir}/${f.name}`;
|
|
189
|
+
// This sets filename="selectedDir/file.txt" in multipart
|
|
190
|
+
fd.append('file', f, targetPath);
|
|
191
|
+
|
|
192
|
+
console.info("uploadFile:", targetPath);
|
|
193
|
+
fetch('/fs/files', { method: 'POST', body: fd })
|
|
194
|
+
.then(async r => {
|
|
195
|
+
if (!r.ok) {
|
|
196
|
+
const resp = (await r.text()) || r.statusText;
|
|
197
|
+
throw new Error(`${r.status} - ${resp}`);
|
|
198
|
+
}
|
|
199
|
+
return r;
|
|
200
|
+
})
|
|
201
|
+
.then(load)
|
|
202
|
+
.catch(err => {
|
|
203
|
+
console.error("uploadFile error:", err);
|
|
204
|
+
popUpMsg("Upload failed: " + err.message);
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function openFile() {
|
|
209
|
+
if (!selected) return;
|
|
210
|
+
const resource = `/${selectedDir}/${selected}`;
|
|
211
|
+
console.info('openFile:', resource);
|
|
212
|
+
window.open(resource);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function download() {
|
|
216
|
+
if (!selected) return;
|
|
217
|
+
|
|
218
|
+
const resource = `/${selectedDir}/${selected}`;
|
|
219
|
+
console.info('download:', resource);
|
|
220
|
+
|
|
221
|
+
const a = document.createElement('a');
|
|
222
|
+
a.href = resource;
|
|
223
|
+
a.download = selected;
|
|
224
|
+
a.click();
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
function deleteFile() {
|
|
228
|
+
if (!selected) return;
|
|
229
|
+
|
|
230
|
+
const toDelete = `/${selectedDir}/${selected}`;
|
|
231
|
+
console.info("deleteFile:", toDelete);
|
|
232
|
+
|
|
233
|
+
fetch('/fs/files', { method: 'DELETE', body: toDelete })
|
|
234
|
+
.then(async r => {
|
|
235
|
+
if (!r.ok) {
|
|
236
|
+
const resp = (await r.text()) || r.statusText;
|
|
237
|
+
throw new Error(`${r.status} - ${resp}`);
|
|
238
|
+
}
|
|
239
|
+
return r;
|
|
240
|
+
})
|
|
241
|
+
.then(() => {
|
|
242
|
+
// 🔹 If the deleted file is open in editor → DESTROY editor
|
|
243
|
+
if (_editorScriptLoaded && editorFile === toDelete) {
|
|
244
|
+
window.destroyEditor?.();
|
|
245
|
+
editorFile = null;
|
|
246
|
+
console.info("deleteFile: editor destroyed");
|
|
247
|
+
}
|
|
248
|
+
})
|
|
249
|
+
.then(load)
|
|
250
|
+
.catch(err => {
|
|
251
|
+
console.error("deleteFile failed:", err);
|
|
252
|
+
popUpMsg("Delete failed: " + err.message);
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function loadEditorScript() {
|
|
257
|
+
if (_editorScriptLoaded) return Promise.resolve();
|
|
258
|
+
|
|
259
|
+
return new Promise((resolve, reject) => {
|
|
260
|
+
const s = document.createElement('script');
|
|
261
|
+
s.src = '../editor.js';
|
|
262
|
+
s.onload = () => {
|
|
263
|
+
_editorScriptLoaded = true;
|
|
264
|
+
resolve();
|
|
265
|
+
};
|
|
266
|
+
s.onerror = reject;
|
|
267
|
+
document.head.appendChild(s);
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
async function editor() {
|
|
272
|
+
const filename = selected ?? `LM_blinky.py`;
|
|
273
|
+
const resource = `/${selectedDir}/${filename}`;
|
|
274
|
+
console.info('editor:', resource);
|
|
275
|
+
|
|
276
|
+
await loadEditorScript();
|
|
277
|
+
|
|
278
|
+
let container = document.getElementById('editor');
|
|
279
|
+
if (!container) {
|
|
280
|
+
container = document.createElement('div');
|
|
281
|
+
container.id = 'editor';
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
window.createEditor(container);
|
|
285
|
+
|
|
286
|
+
// 🔹 placement delegated to editor.js
|
|
287
|
+
window.openEditor(resource, {
|
|
288
|
+
anchor: selectedEl,
|
|
289
|
+
list: document.getElementById('list')
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
editorFile = resource; // 🔹 track currently opened file
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
function updateDiskUsage() {
|
|
296
|
+
fetch('/fs/usage')
|
|
297
|
+
.then(r => r.json())
|
|
298
|
+
.then(data => {
|
|
299
|
+
const usedMB = (data.used / (1024 * 1024)).toFixed(1);
|
|
300
|
+
const freeMB = (data.free / (1024 * 1024)).toFixed(1);
|
|
301
|
+
const total = data.used + data.free;
|
|
302
|
+
const percent = total ? (data.used / total) * 100 : 0;
|
|
303
|
+
|
|
304
|
+
document.getElementById('disktext').textContent =
|
|
305
|
+
`Disk: ${usedMB} MB used / ${freeMB} MB free`;
|
|
306
|
+
|
|
307
|
+
document.getElementById('diskused').style.width =
|
|
308
|
+
`${percent.toFixed(1)}%`;
|
|
309
|
+
|
|
310
|
+
console.info("DiskUsage: update");
|
|
311
|
+
})
|
|
312
|
+
.catch(err => {
|
|
313
|
+
console.error("disk usage failed:", err);
|
|
314
|
+
popUpMsg("Disk usage unavailable: " + err.message);
|
|
315
|
+
})
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// 🔹 Global outside-click handler
|
|
319
|
+
document.addEventListener('click', (e) => {
|
|
320
|
+
// Ignore toolbar / editor buttons
|
|
321
|
+
if (e.target.closest('button')) return;
|
|
322
|
+
|
|
323
|
+
// If editor is open, keep selection locked
|
|
324
|
+
if (_editorScriptLoaded && editorFile) return;
|
|
325
|
+
|
|
326
|
+
const list = document.getElementById('list');
|
|
327
|
+
const editor = document.getElementById('editor');
|
|
328
|
+
|
|
329
|
+
if (
|
|
330
|
+
list &&
|
|
331
|
+
!list.contains(e.target) &&
|
|
332
|
+
(!editor || !editor.contains(e.target))
|
|
333
|
+
) {
|
|
334
|
+
clearSelection();
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
load();
|
|
@@ -6,14 +6,56 @@
|
|
|
6
6
|
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="black" />
|
|
7
7
|
<title>microWeb</title>
|
|
8
8
|
<link rel="stylesheet" href="ustyle.css">
|
|
9
|
+
<style>
|
|
10
|
+
hr {
|
|
11
|
+
border: none;
|
|
12
|
+
height: 2px;
|
|
13
|
+
background: rgba(255, 255, 255, 0.25);
|
|
14
|
+
margin: 16px 0;
|
|
15
|
+
}
|
|
16
|
+
#restInfoHeader {
|
|
17
|
+
margin-bottom: 12px;
|
|
18
|
+
}
|
|
19
|
+
/* Container */
|
|
20
|
+
.endpoint-groups {
|
|
21
|
+
display: flex;
|
|
22
|
+
flex-wrap: wrap;
|
|
23
|
+
gap: 12px;
|
|
24
|
+
margin-bottom: 12px;
|
|
25
|
+
width: 100%;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* Group cards */
|
|
29
|
+
.endpoint-group {
|
|
30
|
+
display: flex;
|
|
31
|
+
flex-wrap: wrap;
|
|
32
|
+
align-items: center;
|
|
33
|
+
gap: 6px;
|
|
34
|
+
padding: 8px;
|
|
35
|
+
border-radius: 6px;
|
|
36
|
+
background: rgba(255, 255, 255, 0.12);
|
|
37
|
+
backdrop-filter: blur(2px);
|
|
38
|
+
max-width: 100%;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* Prevent buttons from getting tiny */
|
|
42
|
+
.endpoint-group button {
|
|
43
|
+
white-space: nowrap;
|
|
44
|
+
}
|
|
45
|
+
</style>
|
|
9
46
|
<script src="uapi.js" defer></script>
|
|
10
47
|
</head>
|
|
11
48
|
<body>
|
|
12
49
|
<img src="https://github.com/BxNxM/micrOS/blob/master/media/logo_mini.png?raw=true" alt="micrOS Logo" width="60" height="60">
|
|
13
50
|
<h1> microWeb server </h1>
|
|
14
|
-
<
|
|
51
|
+
<div id="restInfo">
|
|
52
|
+
<div id="restInfoHeader"></div>
|
|
53
|
+
<div id="endpointHint">🔗 Endpoints:</div>
|
|
54
|
+
<div id="endpointGroups" class="endpoint-groups"></div>
|
|
55
|
+
</div>
|
|
56
|
+
<hr>
|
|
15
57
|
<h2>🚀 REST API</h2>
|
|
16
|
-
<p>
|
|
58
|
+
<p>Shortcuts:</p>
|
|
17
59
|
<button onclick="restAPI('system/info')">SysInfo</button>
|
|
18
60
|
<button onclick="restAPI('system/alarms')">Alarms</button>
|
|
19
61
|
<button onclick="restAPI('system/clock')">Clock</button>
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// CORE MICROS BACKEND INTERFACE
|
|
2
|
+
|
|
3
|
+
const BASE_URL = `http://${window.location.hostname}${window.location.port ? `:${window.location.port}` : ""}`;
|
|
4
|
+
|
|
5
|
+
function restAPICore(cmd, timeout=5000) {
|
|
6
|
+
const query = `${BASE_URL}/rest/${cmd.trim().replace(/\s+/g, '/')}`;
|
|
7
|
+
const controller = new AbortController();
|
|
8
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
9
|
+
const startTime = performance.now();
|
|
10
|
+
|
|
11
|
+
return fetch(query, { signal: controller.signal })
|
|
12
|
+
.then(response => {
|
|
13
|
+
clearTimeout(timeoutId);
|
|
14
|
+
if (!response.ok) {throw new Error(`restAPICore code NOK: ${response.status}`);}
|
|
15
|
+
return response.json().then(data => ({response: data,
|
|
16
|
+
delta: (performance.now() - startTime).toFixed(0), query
|
|
17
|
+
}));
|
|
18
|
+
}).catch(error => {
|
|
19
|
+
clearTimeout(timeoutId);
|
|
20
|
+
console.error('Error in restAPICore:', error);
|
|
21
|
+
throw error;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function restAPI(cmd='', consoleOut=true, timeout=5000) {
|
|
26
|
+
if (cmd === '') {cmd = document.getElementById('restCmdInput').value;}
|
|
27
|
+
return restAPICore(cmd, timeout).then(({ response, delta, query }) => {
|
|
28
|
+
if (consoleOut) {restConsole(query, response, delta);}
|
|
29
|
+
return response;
|
|
30
|
+
}).catch(error => {
|
|
31
|
+
if (error.name === 'AbortError') {console.error(`Timeout (${timeout}ms) - restAPICore: ${cmd}`);
|
|
32
|
+
} else {console.error('Error in restAPI:', error);}
|
|
33
|
+
return { response: null, delta: 0, query: 'restAPI error' };
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function restConsole(apiUrl, data, delta) {
|
|
38
|
+
// UPDATES: restConsoleUrl, restConsoleResponse, restConsoleTime
|
|
39
|
+
document.getElementById('restConsoleUrl').innerHTML = `<strong>Generated URL:</strong><br> <a href="${apiUrl}" target="_blank" style="color: white;">${apiUrl}</a>`;
|
|
40
|
+
document.getElementById('restConsoleResponse').innerHTML = JSON.stringify(data, null, 4).replace(/\\n/g, "<br/>" + " ".repeat(15));
|
|
41
|
+
document.getElementById('restConsoleTime').innerHTML = `⏱ Response time: ${delta} ms`;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function renderEndpointGroups(endpoints) {
|
|
45
|
+
const container = document.getElementById('endpointGroups');
|
|
46
|
+
if (!container) {return;}
|
|
47
|
+
container.innerHTML = '';
|
|
48
|
+
if (!Array.isArray(endpoints) || endpoints.length === 0) {return;}
|
|
49
|
+
const groups = endpoints.reduce((acc, endpoint) => {
|
|
50
|
+
const trimmed = endpoint.replace(/^\/+/, '');
|
|
51
|
+
if (!trimmed) {return acc;}
|
|
52
|
+
const root = trimmed.split('/')[0];
|
|
53
|
+
acc[root] = acc[root] || [];
|
|
54
|
+
acc[root].push(trimmed);
|
|
55
|
+
return acc;
|
|
56
|
+
}, {});
|
|
57
|
+
Object.keys(groups).sort().forEach(group => {
|
|
58
|
+
const entries = groups[group].sort();
|
|
59
|
+
const isSingle = entries.length === 1 && entries[0] === group;
|
|
60
|
+
if (isSingle) {
|
|
61
|
+
const button = document.createElement('button');
|
|
62
|
+
button.textContent = group;
|
|
63
|
+
button.onclick = () => window.open(`/${group}`, '_blank');
|
|
64
|
+
container.appendChild(button);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const groupEl = document.createElement('div');
|
|
68
|
+
groupEl.className = 'endpoint-group';
|
|
69
|
+
const title = document.createElement('span');
|
|
70
|
+
title.className = 'endpoint-group-title';
|
|
71
|
+
title.textContent = group;
|
|
72
|
+
groupEl.appendChild(title);
|
|
73
|
+
entries.forEach(entry => {
|
|
74
|
+
const label = entry === group ? group : entry.replace(`${group}/`, '');
|
|
75
|
+
const button = document.createElement('button');
|
|
76
|
+
button.textContent = label;
|
|
77
|
+
button.onclick = () => window.open(`/${entry}`, '_blank');
|
|
78
|
+
groupEl.appendChild(button);
|
|
79
|
+
});
|
|
80
|
+
container.appendChild(groupEl);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function restInfo(showPages=true) {
|
|
85
|
+
// UPDATES: 'restInfo' and restConsole(...)
|
|
86
|
+
restAPICore(cmd = '').then(({ response, delta, query }) => {
|
|
87
|
+
// Update API Console
|
|
88
|
+
restConsole(query, response, delta)
|
|
89
|
+
// Update 'restInfo' tag
|
|
90
|
+
const result = response['result'];
|
|
91
|
+
const auth = result.auth ? "🔑" : "";
|
|
92
|
+
let infoHeader = `micrOS: ${result.micrOS} ❖ node: ${result.node}${auth}`;
|
|
93
|
+
if (showPages) {
|
|
94
|
+
const endpoints = result['usr_endpoints'] ? Array.from(result['usr_endpoints']) : [];
|
|
95
|
+
renderEndpointGroups(endpoints);
|
|
96
|
+
}
|
|
97
|
+
document.getElementById('restInfoHeader').innerHTML = infoHeader;
|
|
98
|
+
}).catch(error => {
|
|
99
|
+
console.error('Error in restAPI:', error);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Designed by BxNxM |/|/|/|/
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// API HELPER FUNCTION - get module exposed widgets
|
|
2
|
+
function moduleHelp(module) {
|
|
3
|
+
const endpoint = `${module}/help/True`;
|
|
4
|
+
console.log(`[API] Endpoint: ${endpoint}`);
|
|
5
|
+
return restAPI(endpoint).then(({ result }) => {
|
|
6
|
+
const parsedWidgets = result.map(item => JSON.parse(item.replace(/\\"/g, '"')));
|
|
7
|
+
console.log(`Parsed ${module} help:`, parsedWidgets);
|
|
8
|
+
return parsedWidgets;
|
|
9
|
+
}).catch(error => {
|
|
10
|
+
console.error(error);
|
|
11
|
+
return [];
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// PAGE GENERATION
|
|
16
|
+
|
|
17
|
+
function containerAppendChild(elements, container) {
|
|
18
|
+
// Append list of elements into the container aka draw elements :D
|
|
19
|
+
if (!elements || !container) {
|
|
20
|
+
console.error("Inputs array or container element is missing.");
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
elements.forEach(function(element) {
|
|
24
|
+
container.appendChild(element);});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function generateElement(type, module, lm_call="", options={}) {
|
|
28
|
+
// type: slider, button, box, h1, h2, p, li, etc.
|
|
29
|
+
// data: rest command
|
|
30
|
+
console.log(`type: ${type}`);
|
|
31
|
+
const data = `${module}/${lm_call}`;
|
|
32
|
+
console.log(`data: ${data}`);
|
|
33
|
+
const container = document.getElementById(`container-${module}`);
|
|
34
|
+
if(!container) {
|
|
35
|
+
console.error("No container");
|
|
36
|
+
}
|
|
37
|
+
if (type === 'slider') {
|
|
38
|
+
// Create slider widget
|
|
39
|
+
sliderWidget(container, data, options)
|
|
40
|
+
} else if (type === 'button') {
|
|
41
|
+
// Create button widget
|
|
42
|
+
buttonWidget(container, data, options)
|
|
43
|
+
} else if (type === 'textbox') {
|
|
44
|
+
// Create textbox widget
|
|
45
|
+
textBoxWidget(container, data, options)
|
|
46
|
+
} else if (type === 'color') {
|
|
47
|
+
// Create color palette widget
|
|
48
|
+
colorPaletteWidget(container, data, options)
|
|
49
|
+
} else if (type === 'joystick') {
|
|
50
|
+
// Create joystick widget
|
|
51
|
+
joystickWidget(container, data, options)
|
|
52
|
+
} else {
|
|
53
|
+
// Create other elements
|
|
54
|
+
const element = document.createElement(type);
|
|
55
|
+
element.textContent = `🧬 ${module}`;
|
|
56
|
+
containerAppendChild([element], container);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function autoTitleLen(widgets, lm_call) {
|
|
61
|
+
try {
|
|
62
|
+
const func = lm_call.split('/')[0].split(' ')[0];
|
|
63
|
+
const count = widgets.reduce((accumulator, { lm_call }) => accumulator + (lm_call.split(' ')[0] === func ? 1 : 0), 0);
|
|
64
|
+
return count > 1 ? 2 : 1;
|
|
65
|
+
} catch (error) {
|
|
66
|
+
console.error(error);
|
|
67
|
+
return 1;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function craftModuleWidgets(module, widgets) {
|
|
72
|
+
if (!widgets.length) {
|
|
73
|
+
console.log(`${module} no exposed widgets`);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
console.log(`Craft widget to ${module}`);
|
|
78
|
+
// Create HTML elements for widgets
|
|
79
|
+
const widgets_section = document.getElementById('widgets-section');
|
|
80
|
+
const widget_container = document.createElement('ol');
|
|
81
|
+
widget_container.id = `container-${module}`;
|
|
82
|
+
widget_container.className = "widget";
|
|
83
|
+
widgets_section.appendChild(widget_container);
|
|
84
|
+
// Create widget title
|
|
85
|
+
generateElement('h2', module);
|
|
86
|
+
|
|
87
|
+
const widgetTypeOptions = {
|
|
88
|
+
button: item => ({title_len: autoTitleLen(widgets, item.lm_call), options: item.options }),
|
|
89
|
+
slider: item => ({title_len: autoTitleLen(widgets, item.lm_call), range: item.range }),
|
|
90
|
+
color: item => ({title_len: autoTitleLen(widgets, item.lm_call), range: item.range }),
|
|
91
|
+
textbox: item => ({title_len: autoTitleLen(widgets, item.lm_call), refresh: item.refresh }),
|
|
92
|
+
joystick: item => ({title_len: autoTitleLen(widgets, item.lm_call), range: item.range })
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// Create control elements for widget
|
|
96
|
+
widgets.forEach(item => {
|
|
97
|
+
let { type, lm_call } = item;
|
|
98
|
+
lm_call = lm_call.replace(/\s/g, '/');
|
|
99
|
+
const type_options = widgetTypeOptions[type] ? widgetTypeOptions[type](item) : null;
|
|
100
|
+
if (!type_options) {
|
|
101
|
+
console.log(`Unsupported micrOS widget html_type: ${type}`);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
try {
|
|
106
|
+
console.log("adding widget controls");
|
|
107
|
+
generateElement(type, module, lm_call, type_options);
|
|
108
|
+
} catch (error) {
|
|
109
|
+
console.error(error);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function DynamicWidgetLoad() {
|
|
115
|
+
restAPI('modules').then(data => {
|
|
116
|
+
const app_list = data.result;
|
|
117
|
+
app_list.forEach(module => {
|
|
118
|
+
moduleHelp(module).then(widgets => {
|
|
119
|
+
craftModuleWidgets(module, widgets);
|
|
120
|
+
}).catch(error => {
|
|
121
|
+
console.error(`Error processing module ${module}:`, error);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
}).catch(error => {
|
|
125
|
+
console.error('Error loading modules:', error);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// craftModuleWidgets
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
@keyframes backgroundAnimation {
|
|
2
|
+
0% {background-position: 0% 50%;}
|
|
3
|
+
50% {background-position: 100% 50%;}
|
|
4
|
+
100% {background-position: 0% 50%;}
|
|
5
|
+
}
|
|
6
|
+
body {
|
|
7
|
+
min-height: 100vh;
|
|
8
|
+
min-width: 100vw;
|
|
9
|
+
margin: 3%;
|
|
10
|
+
padding: env(safe-area-inset-top)
|
|
11
|
+
env(safe-area-inset-right)
|
|
12
|
+
env(safe-area-inset-bottom)
|
|
13
|
+
env(safe-area-inset-left);
|
|
14
|
+
background: linear-gradient(110deg, #4b3c66, #21184f, #712336);
|
|
15
|
+
background-size: 200% 200%;
|
|
16
|
+
animation: backgroundAnimation 15s infinite;
|
|
17
|
+
color: #d9d9d9;
|
|
18
|
+
font-family: 'Verdana', Sans-serif;
|
|
19
|
+
}
|
|
20
|
+
p {
|
|
21
|
+
word-wrap: break-word;
|
|
22
|
+
}
|
|
23
|
+
pre {
|
|
24
|
+
word-wrap: break-word;
|
|
25
|
+
white-space: pre-wrap;
|
|
26
|
+
}
|
|
27
|
+
button {
|
|
28
|
+
background-color: #e7e7e7; /* Gray */
|
|
29
|
+
border: none;
|
|
30
|
+
color: black;
|
|
31
|
+
font-size: 14px;
|
|
32
|
+
border-radius: 4px;
|
|
33
|
+
transition-duration: 0.4s;
|
|
34
|
+
}
|
|
35
|
+
button:hover {
|
|
36
|
+
background-color: #555555; /* Black */
|
|
37
|
+
color: white;
|
|
38
|
+
}
|
|
39
|
+
ol.widget {
|
|
40
|
+
list-style-type: none;
|
|
41
|
+
padding: 0px;
|
|
42
|
+
margin-right: 40px;
|
|
43
|
+
}
|
|
44
|
+
#widgets-section {
|
|
45
|
+
display: flex; /* Display list items horizontally */
|
|
46
|
+
flex-wrap: wrap; /* Wrap items to multiple lines if needed */
|
|
47
|
+
}
|
|
48
|
+
@media (max-width: 768px) { /* Adjust the breakpoint as needed */
|
|
49
|
+
#widgets-section {
|
|
50
|
+
flex-direction: column; /* Display list items vertically */
|
|
51
|
+
}
|
|
52
|
+
ol.widget {
|
|
53
|
+
margin-right: 0px;
|
|
54
|
+
}
|
|
55
|
+
}
|