Boot: - Editor now picks local vs server mode based on URL flag, sign-in state, and a stale local-mode flag. Signed-in users are no longer bounced to IndexedDB if they had previously clicked "Use locally". Local mode: - New LocalWorkspaceClient (src/static/local-workspace.js) with pluggable IndexedDB and File System Access backends. Picked folder handles persist across reloads with a Reconnect button when the permission lapses. - Static-only host: scripts/serve_static_editor.py serves src/static/ with COOP/COEP so SharedArrayBuffer-backed sims keep working. - Bundled MicroPython stubs ship under src/static/bundled-lib/ for static hosting; FastAPI also exposes them at /api/public/lib-bundle. Workspace import / export: - Zero-dep ZIP encoder + reader (STORE + DEFLATE via DecompressionStream). Export/Import buttons in the workspace badge work in both local and server modes; imports are confined to code/. Pin / ADC / Serial simulation: - machine.py grows ADC, UART, expanded Pin, and PWM mocks, all driven by SharedArrayBuffer when cross-origin isolated and falling back to postMessage + [pin-out] stdout markers otherwise — pins, ADC slider, and serial input now keep working over plain HTTP / LAN-IP origins. - NeoPixel pins are claimed via a [pin-claim] marker and dropped from the Pins panel so the data line doesn't flicker per write(). - New demos: adc_slider_demo.py, pin_demo.py, serial_demo.py. Lib layout: - Single source of truth at repo lib/; workspace/lib/ caching layer removed and the directory deleted. Filesystem service reads stubs directly from PROJECT_ROOT/lib. UI: - Home page slimmed to "Sign in" + "Use locally" with optional editor / manage-users links. Admin user/invite UI moved to /users. - Workspace badge gains storage indicator, Folder…/Reconnect, Export, Import, and Exit controls. - Mobile-friendly tweaks: safer-area padding, larger touch targets, iOS-zoom-proof serial input, file-tree highlight fix. Tests: - test_auth.py patches PROJECT_ROOT for the lib-shared test so the repo-root lib refactor stays green. test_api.py asserts the new "LED Editor" branding. Co-authored-by: Cursor <cursoragent@cursor.com>
56 lines
1.2 KiB
Python
56 lines
1.2 KiB
Python
"""ADC slider demo — drag the sliders that appear under the editor.
|
|
|
|
Two simulated ADCs:
|
|
* pin 34 — sets the base hue of a rainbow
|
|
* pin 35 — sets overall brightness
|
|
|
|
The strip lights up while the script runs; the values update live (no need to
|
|
restart the script when you move the slider).
|
|
"""
|
|
|
|
import time
|
|
|
|
from machine import ADC, Pin
|
|
from neopixel import NeoPixel
|
|
|
|
|
|
NUM_LEDS = 16
|
|
strip = NeoPixel(Pin(5, Pin.OUT), NUM_LEDS)
|
|
|
|
hue_pot = ADC(Pin(34))
|
|
bri_pot = ADC(Pin(35))
|
|
|
|
|
|
def hsv_to_rgb(h, s, v):
|
|
h = h - int(h)
|
|
i = int(h * 6)
|
|
f = h * 6 - i
|
|
p = v * (1 - s)
|
|
q = v * (1 - f * s)
|
|
t = v * (1 - (1 - f) * s)
|
|
if i == 0:
|
|
r, g, b = v, t, p
|
|
elif i == 1:
|
|
r, g, b = q, v, p
|
|
elif i == 2:
|
|
r, g, b = p, v, t
|
|
elif i == 3:
|
|
r, g, b = p, q, v
|
|
elif i == 4:
|
|
r, g, b = t, p, v
|
|
else:
|
|
r, g, b = v, p, q
|
|
return int(r * 255), int(g * 255), int(b * 255)
|
|
|
|
|
|
print("Move the ADC sliders below the editor while this runs.")
|
|
|
|
while True:
|
|
base_hue = hue_pot.read_u16() / 65535
|
|
brightness = bri_pot.read_u16() / 65535
|
|
for i in range(NUM_LEDS):
|
|
h = (base_hue + i / NUM_LEDS) % 1.0
|
|
strip[i] = hsv_to_rgb(h, 1.0, brightness)
|
|
strip.write()
|
|
time.sleep(0.04)
|