Provide BOOT-triggered USB CDC maintenance mode for file updates, plus onboard LED activity flashes and enhanced display status information.
60 lines
2.0 KiB
Python
60 lines
2.0 KiB
Python
"""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()
|