Line-based JSON protocol over the ESP32-S3 native USB OTG port,
providing deterministic sub-millisecond attenuator control without
WiFi interference. Runs alongside the existing REST API.
Commands: identify, status, config, set, sweep, sweep_stop
Protocol: usb-serial-json-v1 (one JSON object per \n-terminated line)
Also addresses pre-existing reliability issues found during review:
- Thread safety: FreeRTOS mutex in Attenuator class (web server
callbacks run on async_tcp task, not loop())
- NVS flash wear: skip persist during sweep, save on stop
- WiFi credentials: moved to gitignored platformio_local.ini
- Shared header: sweep.h replaces duplicated extern declarations
- Add SSD1306 128x64 OLED display with attenuation bar, dB readout,
step counter, sweep indicator, and WiFi RSSI
- Switch all debug output to Serial0 (UART0 via CH343) for consistent
serial comms when USB CDC is not used
- Remove unused USB.h includes from all source files
- Add development notes to CLAUDE.md (no stty, serial config docs)
- Add #include <USB.h> to all .cpp files (required for HWCDCSerial)
- Use ESP-IDF v5.x esp_task_wdt_config_t struct instead of removed API
- Remove duplicate ARDUINO_USB_MODE/CDC flags from platformio.ini
(board definition already provides these)