Add maintenance mode and board status indicators
Provide BOOT-triggered USB CDC maintenance mode for file updates, plus onboard LED activity flashes and enhanced display status information.
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
"""Short APA102 activity flashes for the T-Dongle-S3's onboard RGB LED."""
|
||||
|
||||
import time
|
||||
from machine import Pin
|
||||
|
||||
# Verified against LILYGO's T-Dongle-S3 pin map. The APA102 uses BGR order.
|
||||
_DATA_PIN = 40
|
||||
_CLOCK_PIN = 39
|
||||
_PULSE_MS = 90
|
||||
_BRIGHTNESS = 1 # APA102 global brightness: 1 (dim) through 31 (full).
|
||||
|
||||
class ActivityLed:
|
||||
"""Drive the single onboard APA102 LED without delaying the main loop."""
|
||||
|
||||
def __init__(self):
|
||||
self._available = True
|
||||
self._off_at = None
|
||||
try:
|
||||
self._data = Pin(_DATA_PIN, Pin.OUT, value=0)
|
||||
self._clock = Pin(_CLOCK_PIN, Pin.OUT, value=0)
|
||||
self._write(0, 0, 0)
|
||||
except (OSError, ValueError):
|
||||
# Keep display-less or alternate ESP32-S3 development boards usable.
|
||||
self._available = False
|
||||
|
||||
def pulse(self, red, green, blue, now):
|
||||
"""Show one colour briefly; a later event simply extends the flash."""
|
||||
if not self._available:
|
||||
return
|
||||
self._write(red, green, blue)
|
||||
self._off_at = time.ticks_add(now, _PULSE_MS)
|
||||
|
||||
def tick(self, now):
|
||||
"""Turn the LED off after its scheduled pulse without sleeping."""
|
||||
if (self._available and self._off_at is not None and
|
||||
time.ticks_diff(now, self._off_at) >= 0):
|
||||
self._write(0, 0, 0)
|
||||
self._off_at = None
|
||||
|
||||
def _write(self, red, green, blue):
|
||||
# APA102: start frame, global-brightness pixel frame, end frame.
|
||||
self._send_byte(0)
|
||||
self._send_byte(0)
|
||||
self._send_byte(0)
|
||||
self._send_byte(0)
|
||||
self._send_byte(0xE0 | _BRIGHTNESS)
|
||||
self._send_byte(blue)
|
||||
self._send_byte(green)
|
||||
self._send_byte(red)
|
||||
self._send_byte(0xFF)
|
||||
self._send_byte(0xFF)
|
||||
self._send_byte(0xFF)
|
||||
self._send_byte(0xFF)
|
||||
|
||||
def _send_byte(self, value):
|
||||
for bit in range(7, -1, -1):
|
||||
self._data.value((value >> bit) & 1)
|
||||
self._clock.on()
|
||||
self._clock.off()
|
||||
Reference in New Issue
Block a user