led-panel/docs/glove-firmware.md
Salty 71515ef517 Initial: panel docs, BLE tools, glove firmware notes
- LED panel BLE protocol (partial RE from glove firmware)
- Panel MAC: E0:6E:41:94:39:70, BLE name: YS623B101069L
- led-panel-ble.py: scan, slot switch, cycle tool
- ble-capture-only.py: GATT server capture proxy
- Glove firmware docs (ESP32 WROOM, 4-button controller)
- Slot switch command doesn't work — capture needed
2026-04-01 17:46:23 -04:00

2.7 KiB

Glove Firmware Notes

Source: /home/seb/glove/ on saltylab-orin

Project Structure

glove/
├── platformio.ini          # ESP32 WROOM (upesy_wroom), espressif32 6.7.0
├── partitions.csv          # Custom partition table
├── src/
│   ├── main.cpp            # Current main (V13 + WLED + LED panel)
│   ├── main.cpp.good       # Known working version
│   ├── main.cpp.v14        # V14 variant?
│   ├── main.cpp.test       # Test version
│   └── main.cpp.inmotion   # Inmotion-only version
├── lib/
│   ├── Device/
│   │   ├── Device.h         # Base device interface
│   │   ├── common.h         # Globals (mutex)
│   │   ├── led/
│   │   │   ├── Led.h        # LED panel BLE client
│   │   │   └── Led.cpp      # Slot switch implementation
│   │   ├── wled/
│   │   │   ├── Wled.h       # WLED HTTP client
│   │   │   └── Wled.cpp     # Preset switching via /json/state
│   │   └── EUC/Inmotion/
│   │       ├── Inmotion.h   # V13 BLE client
│   │       ├── Inmotion.cpp # Speed/brake event parsing
│   │       └── InmotionUtils.h
│   └── InputManager/
│       ├── InputManager.h   # 4-button interrupt handler
│       └── InputManager.cpp # Debounce + sequence detection

Key Implementation Details

InputManager

  • 4 GPIO inputs (32, 33, 25, 26) with pull-up, interrupt on CHANGE
  • Debounce: 175ms
  • Sequence detection: 700ms timeout timer — accumulates button presses into a string
  • "1" = button 1 single, "11" = button 1 double-tap, etc.

Led (BLE Panel Client)

  • Connects by MAC address (passed as constructor string)
  • Uses BLE_ADDR_TYPE_RANDOM for connection
  • Single write characteristic for commands
  • Slot command: 20-byte packet with offset calculation from slot_id 61
  • The slot command doesn't work on current panel — needs re-reverse-engineering

Wled (WiFi WLED Client)

  • Resolves via mDNS or direct IP
  • Fetches /presets.json on connect, builds name→ID map
  • Switches presets via POST to /json/state with {"ps":"<id>"}
  • Actions mapped by preset name: "LEFT", "RIGHT", "BRAKE", "NEUTRAL"

Inmotion V13

  • BLE connection to EUC
  • Parses speed data from notifications
  • Fires BRAKE event when decelerating, NEUTRAL when stable
  • Also supports HORN and TOGGLE_LIGHT commands

WiFi

  • SSID: SASI, password: h3ll0w1f1
  • Hostname: "controller"
  • mDNS enabled
  • BLE/WiFi coexistence: ESP_COEX_PREFER_BALANCE

Build

cd /home/seb/glove
pio run -e upesy_wroom        # build
pio run -e upesy_wroom -t upload  # flash