Add boot self-test and idle indicator; target the Waveshare RP2350-Plus
The board arriving is a Waveshare RP2350-Plus (4MB, USB-C), which is now the default BOARD. Its pico-sdk header defines neither PICO_DEFAULT_LED_PIN nor PICO_DEFAULT_WS2812_PIN - it has no onboard indicator at all - so a bare board gives no sign of life. The status-LED support added for boards that do have one (zero, one, tiny, usb_a on GPIO16; eth on GPIO25) is kept and compiles out here. That makes feedback on the strip itself the useful path, and it turns out to be the better one anyway: - Boot self-test sweeps one pixel from index 0 to the far end once at startup. It answers in a single glance whether the firmware runs, PIO drives the line, the strip is the length LED_COUNT claims, the far end holds voltage, and - because you see which end it starts from - whether STRIP_REVERSED is right. It runs before USB, so the first test needs nothing but 5V. - Idle indicator holds one dim pixel lit while no host is connected, separating "powered and waiting" from "no power" and from "crashed". Both are platform-independent, so the Circle build gets them too. Verified: tests pass across seventeen configurations, now including the self-test and idle paths on and off. Both platforms build clean with no warnings from project sources. Note on the previous commit's verification: a filtered build log hid a real compile error in the Pico target (sleep_ms takes uint32_t, which is unsigned long here, and did not match the portable void(*)(unsigned) delay callback). The build script now gets an explicit success check rather than a grep. Claude-Session: https://claude.ai/code/session_01TVCB25LBsmeteWvaSMz4Ne
This commit is contained in:
@@ -16,6 +16,11 @@
|
||||
|
||||
static const char FromKernel[] = "kernel";
|
||||
|
||||
static void SelfTestDelay (unsigned nMilliSeconds)
|
||||
{
|
||||
CTimer::Get ()->MsDelay (nMilliSeconds);
|
||||
}
|
||||
|
||||
void CKernel::MIDIPacketHandler (unsigned nCable, u8 *pPacket, unsigned nLength,
|
||||
unsigned nDevice, void *pParam)
|
||||
{
|
||||
@@ -108,6 +113,7 @@ void CKernel::UpdateMIDIDevice (void)
|
||||
// The gadget builds a new device object on each enumeration, so
|
||||
// clear anything held at the moment the host went away.
|
||||
m_PianoLEDs.AllOff ();
|
||||
m_PianoLEDs.SetHostConnected (true);
|
||||
|
||||
m_pMIDIDevice->RegisterPacketHandler (MIDIPacketHandler, this);
|
||||
|
||||
@@ -117,6 +123,7 @@ void CKernel::UpdateMIDIDevice (void)
|
||||
{
|
||||
// Host went away mid-chord. Do not leave keys lit.
|
||||
m_PianoLEDs.AllOff ();
|
||||
m_PianoLEDs.SetHostConnected (false);
|
||||
|
||||
m_Logger.Write (FromKernel, LogNotice, "USB MIDI gadget disconnected");
|
||||
}
|
||||
@@ -135,6 +142,9 @@ TShutdownMode CKernel::Run (void)
|
||||
(unsigned) GLOBAL_BRIGHTNESS, (unsigned) MAX_LIT_KEYS);
|
||||
m_Logger.Write (FromKernel, LogNotice, "Waiting for USB host");
|
||||
|
||||
// Runs on power alone, before any host is present.
|
||||
m_PianoLEDs.RunSelfTest (SelfTestDelay);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
UpdateMIDIDevice ();
|
||||
|
||||
Reference in New Issue
Block a user