Compare commits

..

No commits in common. "ac3b2aa90f1400c3c3b4f8b068999d74fa05c68b" and "802ab858e126face963f8742881e3fc89b0533e6" have entirely different histories.

5 changed files with 5 additions and 20 deletions

View File

@ -110,8 +110,6 @@ Die GUI nutzt derzeit vor allem `STATIC`, `BLINK`, `PULSE` und `COLOR_CYCLE`.
Config und Makros liegen in getrennten reservierten NVM-Bereichen. Config und Makros liegen in getrennten reservierten NVM-Bereichen.
Beim Serial-Dump der Config werden 124 Chunks zu je 6 Nutzbytes uebertragen. Implementierungen muessen den daraus berechneten Byte-Offset mindestens 16 Bit breit halten, weil Profil 2 und 3 hinter Byte 255 liegen.
## Werksreset ## Werksreset
Die Firmware hat einen eingebauten Recovery-Pfad: Die Firmware hat einen eingebauten Recovery-Pfad:

View File

@ -13,17 +13,12 @@ Encoder-SW-Tasten laufen **nicht** durch diesen HAL, sondern durch den Matrix-Sc
``` ```
Zustand = (A << 1) | B 4 Bits: 00 / 01 / 10 / 11 Zustand = (A << 1) | B 4 Bits: 00 / 01 / 10 / 11
LUT[prev<<2 | cur] Roh-Vorzeichen, 0 (ungueltig/Prellen) LUT[prev<<2 | cur] +1 (CW), -1 (CCW), 0 (ungültig/Prellen)
``` ```
Mechanische Encoder erzeugen 4 Flanken pro Raste → Akkumulator zählt Halbschritte. Mechanische Encoder erzeugen 4 Flanken pro Raste → Akkumulator zählt Halbschritte.
Ein Event wird erst gefeuert wenn `|accum| >= 4` (= ein vollständiger Klick). Ein Event wird erst gefeuert wenn `|accum| >= 4` (= ein vollständiger Klick).
Die VersaPad-PCB-Verdrahtung liefert das Quadratur-Vorzeichen gegenueber der sichtbaren Drehrichtung invertiert. Deshalb bleibt die LUT konventionell, aber der HAL dreht das Vorzeichen vor dem Callback mit `ENCODER_DIRECTION_SIGN = -1`. Nach aussen gilt weiterhin:
- `direction = +1` -> `ENC_CW`
- `direction = -1` -> `ENC_CCW`
## ISR-Aufbau ## ISR-Aufbau
8 ISR-Wrapper (je einer pro Pin, da `attachInterrupt` keinen Parameter unterstützt): 8 ISR-Wrapper (je einer pro Pin, da `attachInterrupt` keinen Parameter unterstützt):

View File

@ -79,8 +79,6 @@ Config: ceil(740 / 6) = 124 Chunks
Makros: ceil(512 / 6) = 86 Chunks Makros: ceil(512 / 6) = 86 Chunks
``` ```
Wichtig fuer Implementierungen: Der Byte-Offset eines Chunks muss mindestens 16 Bit breit sein. Bei der Config liegt der Offset ab Chunk 43 ueber 255 Byte; ein 8-Bit-Offset wuerde ueberlaufen und spaetere Profilbereiche falsch dumpen.
## Transferablauf ## Transferablauf
### PC -> Board ### PC -> Board

View File

@ -245,7 +245,7 @@ void CMainController::poll_vendor()
uint8_t p[SERIAL_PKT_SIZE] = {}; uint8_t p[SERIAL_PKT_SIZE] = {};
p[0] = USB_EVT_CONFIG_DATA; p[0] = USB_EVT_CONFIG_DATA;
p[1] = i; p[1] = i;
uint16_t offset = (uint16_t)i * payload; uint8_t offset = i * payload;
for (uint8_t b = 0; b < payload; b++) { for (uint8_t b = 0; b < payload; b++) {
if (offset + b < sz) p[2 + b] = raw[offset + b]; if (offset + b < sz) p[2 + b] = raw[offset + b];
} }

View File

@ -8,9 +8,7 @@
// Bei jedem Flankenwechsel (CHANGE) auf A oder B wird der neue Zustand // Bei jedem Flankenwechsel (CHANGE) auf A oder B wird der neue Zustand
// bestimmt und mit dem vorherigen verglichen. // bestimmt und mit dem vorherigen verglichen.
// //
// Lookup-Tabelle [prev<<2 | curr] → Roh-Vorzeichen, 0 (ungültig/Prellen) // Lookup-Tabelle [prev<<2 | curr] → +1 (CW), -1 (CCW), 0 (ungültig/Prellen)
// Die physische CW/CCW-Bedeutung wird nach dem Akkumulator per
// ENCODER_DIRECTION_SIGN an die VersaPad-PCB-Verdrahtung angepasst.
static const int8_t k_lut[16] = { static const int8_t k_lut[16] = {
// curr: 00 01 10 11 // curr: 00 01 10 11
0, +1, -1, 0, // prev = 00 0, +1, -1, 0, // prev = 00
@ -30,10 +28,6 @@ static encoder_cb_t s_cb = nullptr;
static const uint8_t k_pin_a[ENCODER_COUNT] = { PIN_ENC0_A, PIN_ENC1_A, PIN_ENC2_A, PIN_ENC3_A }; static const uint8_t k_pin_a[ENCODER_COUNT] = { PIN_ENC0_A, PIN_ENC1_A, PIN_ENC2_A, PIN_ENC3_A };
static const uint8_t k_pin_b[ENCODER_COUNT] = { PIN_ENC0_B, PIN_ENC1_B, PIN_ENC2_B, PIN_ENC3_B }; static const uint8_t k_pin_b[ENCODER_COUNT] = { PIN_ENC0_B, PIN_ENC1_B, PIN_ENC2_B, PIN_ENC3_B };
// The PCB wiring makes the quadrature sign opposite to the user-facing knob
// direction. Keep the lookup table conventional and invert once at the HAL edge.
static constexpr int8_t ENCODER_DIRECTION_SIGN = -1;
// Generischer Handler — wird von den 8 ISR-Wrappern unten aufgerufen. // Generischer Handler — wird von den 8 ISR-Wrappern unten aufgerufen.
static void handle_encoder(uint8_t enc) static void handle_encoder(uint8_t enc)
{ {
@ -51,10 +45,10 @@ static void handle_encoder(uint8_t enc)
// 4 Halb-Schritte = 1 vollständige Raste // 4 Halb-Schritte = 1 vollständige Raste
if (s_accum[enc] >= 4) { if (s_accum[enc] >= 4) {
s_accum[enc] = 0; s_accum[enc] = 0;
if (s_cb) s_cb(enc, +1 * ENCODER_DIRECTION_SIGN); if (s_cb) s_cb(enc, +1);
} else if (s_accum[enc] <= -4) { } else if (s_accum[enc] <= -4) {
s_accum[enc] = 0; s_accum[enc] = 0;
if (s_cb) s_cb(enc, -1 * ENCODER_DIRECTION_SIGN); if (s_cb) s_cb(enc, -1);
} }
} }