Initial commit

This commit is contained in:
2026-03-29 14:47:13 +02:00
commit b49984b9c0
32 changed files with 2394 additions and 0 deletions
+70
View File
@@ -0,0 +1,70 @@
// usb_serial.h
// Bidirektionale Kommunikation zwischen Board und Windows-App über CDC Serial.
//
// Das Board erscheint als COM-Port unter Windows (kein Treiber nötig).
// Alle Pakete haben feste Größe (SERIAL_PKT_SIZE = 8 Bytes) kein
// Längen-Header nötig, vereinfacht Parsing auf beiden Seiten.
//
// Byte-Layout aller Pakete:
// [0] Command/Event-ID
// [1] key_id (Button 024 oder Encoder 03)
// [2] r / Daten-Byte A
// [3] g / Daten-Byte B
// [4] b
// [5..7] reserviert (0x00)
//
// Richtungen:
// PC → Board (Commands, 0x010x7F): poll_vendor() in CMainController
// Board → PC (Events, 0x810xFF): usb_serial_send() in processEvents()
#pragma once
#include <stdint.h>
#define SERIAL_PKT_SIZE 8
// ── Commands: PC → Board ──────────────────────────────────────────────────────
#define USB_CMD_SET_LED_OVERRIDE 0x01 // key_id, r, g, b → Override-LED setzen
#define USB_CMD_CLEAR_LED_OVERRIDE 0x02 // key_id → Override löschen, zurück zu base
#define USB_CMD_SET_LED_BASE 0x03 // key_id, r, g, b → Base-LED dauerhaft ändern
// Config-Übertragung (mehrteilig, 6 Nutzbytes pro Paket):
// BEGIN: Data[1] = Anzahl Chunks die folgen
// DATA: Data[1] = Chunk-Index (0-based), Data[2..7] = 6 Bytes Nutzdaten
// COMMIT: CRC prüfen + NVM schreiben + Buttons neu laden
#define USB_CMD_PING 0x05 // Board antwortet sofort mit USB_EVT_PONG
#define USB_CMD_CONFIG_BEGIN 0x10
#define USB_CMD_CONFIG_DATA 0x11
#define USB_CMD_CONFIG_COMMIT 0x12
#define USB_CMD_CONFIG_READ 0x13 // Board sendet aktuelle NVM-Config zurück
// ── Events: Board → PC ────────────────────────────────────────────────────────
#define USB_EVT_KEY_DOWN 0x81 // key_id → HOST_COMMAND-Button gedrückt
#define USB_EVT_KEY_UP 0x82 // key_id → HOST_COMMAND-Button losgelassen
#define USB_EVT_ENC_CW 0x83 // enc_id → Encoder Schritt CW (HOST_COMMAND)
#define USB_EVT_ENC_CCW 0x84 // enc_id → Encoder Schritt CCW (HOST_COMMAND)
#define USB_EVT_PONG 0x85 // Antwort auf USB_CMD_PING
#define USB_EVT_CONFIG_ACK 0x90 // Config erfolgreich in NVM geschrieben
#define USB_EVT_CONFIG_NACK 0x91 // Config CRC/Magic ungültig nicht geschrieben
#define USB_EVT_CONFIG_BEGIN 0x92 // Beginn Config-Dump: Data[1] = Chunk-Anzahl
#define USB_EVT_CONFIG_DATA 0x93 // Config-Chunk: Data[1] = Index, Data[2..7] = 6B
#define USB_EVT_CONFIG_END 0x94 // Config-Dump abgeschlossen
// Paket-Struct mit Accessor-Methoden für lesbareren Code
struct SerialPacket
{
uint8_t data[SERIAL_PKT_SIZE];
uint8_t command() const { return data[0]; }
uint8_t key_id() const { return data[1]; }
uint8_t r() const { return data[2]; }
uint8_t g() const { return data[3]; }
uint8_t b() const { return data[4]; }
};
void usb_serial_init();
// Board → PC: 8-Byte-Event-Paket senden (nur wenn SerialUSB verbunden)
void usb_serial_send(uint8_t event_type, uint8_t key_id, uint8_t a = 0, uint8_t b = 0);
// PC → Board: nächstes vollständiges Paket abholen.
// Gibt true zurück wenn ein Paket verfügbar war.
bool usb_serial_poll(SerialPacket& out);