Wire protocol modes

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
Joey Yakimowich-Payne 2026-08-11 12:23:07 +09:00
commit 05e04b2632
6 changed files with 53 additions and 203 deletions

View file

@ -4,7 +4,9 @@
#include "hardware/uart.h"
#include "pico/stdlib.h"
#include "tusb.h"
#include "switch_pro_driver.h"
#include "switch_input.h"
#include "switch_protocol.h"
#include "switch_uart_protocol.h"
#ifdef SWITCH_PICO_LOG
#define LOG_PRINTF(...) printf(__VA_ARGS__)
@ -60,7 +62,7 @@ static void on_rumble_from_switch(const uint8_t rumble[8]) {
send_rumble_uart_frame(rumble);
}
// Consume UART bytes and forward complete frames to the Switch Pro driver.
// Consume UART bytes and decode complete input frames.
static bool poll_uart_frames() {
static uint8_t buffer[64];
static uint8_t index = 0;
@ -103,7 +105,7 @@ static bool poll_uart_frames() {
if (expected_len > 0 && index >= expected_len) {
SwitchInputState parsed{};
if (switch_pro_apply_uart_packet(buffer, expected_len, &parsed)) {
if (switch_uart_decode_input_frame(buffer, expected_len, &parsed)) {
g_user_state = parsed;
new_data = true;
LOG_PRINTF("[UART] packet buttons=0x%04x hat=%u lx=%u ly=%u rx=%u ry=%u\n",
@ -137,7 +139,7 @@ static bool poll_uart_frames() {
static void log_usb_state() {
bool mounted = tud_mounted();
bool ready = switch_pro_is_ready();
bool ready = switch_protocol_is_ready();
if (mounted != g_last_mounted) {
g_last_mounted = mounted;
@ -156,10 +158,10 @@ int main() {
init_uart_input();
tusb_init();
switch_pro_init();
switch_pro_set_rumble_callback(on_rumble_from_switch);
switch_protocol_init();
switch_protocol_set_rumble_callback(on_rumble_from_switch);
g_user_state = neutral_input();
switch_pro_set_input(g_user_state);
switch_protocol_set_input(g_user_state);
LOG_PRINTF("[BOOT] switch-pico starting (UART0 log @ 115200)\n");
LOG_PRINTF("[INFO] UART1 pins TX=%d RX=%d baud=%d\n",
@ -170,8 +172,8 @@ int main() {
bool new_data = poll_uart_frames(); // Pull controller state from UART1
(void)new_data;
SwitchInputState state = g_user_state;
switch_pro_set_input(state);
switch_pro_task(); // Push state to the Switch host
switch_protocol_set_input(state);
switch_protocol_task(); // Push state to the Switch host
log_usb_state();
}
}