diff --git a/src/pixel_stomp_mux.cpp b/src/pixel_stomp_mux.cpp index c1e58be..95100ec 100644 --- a/src/pixel_stomp_mux.cpp +++ b/src/pixel_stomp_mux.cpp @@ -1,18 +1,20 @@ #include "pixel_stomp_mux.h" #include +#define ROXMUX_DELAY 1 + PixelStompMux::PixelStompMux(uint8_t dat, uint8_t ld, uint8_t clk, uint8_t di) : pin_dat(dat), pin_ld(ld), pin_clk(clk), pin_di(di), strip(nullptr), last_button_state(0) { } void PixelStompMux::begin() { - pinMode(pin_ld, OUTPUT); pinMode(pin_clk, OUTPUT); - pinMode(pin_di, INPUT_PULLUP); + pinMode(pin_ld, OUTPUT); + pinMode(pin_di, INPUT); - digitalWrite(pin_ld, LOW); digitalWrite(pin_clk, LOW); + digitalWrite(pin_ld, HIGH); strip = new Adafruit_NeoPixel(NUM_LEDS, pin_dat, NEO_GRB + NEO_KHZ800); strip->begin(); @@ -22,19 +24,25 @@ void PixelStompMux::begin() { Serial.printf("[MUX] Init DAT=%d LD=%d CLK=%d DI=%d\n", pin_dat, pin_ld, pin_clk, pin_di); - Serial.printf("[MUX] 74HC165 x2 daisy-chain for %d buttons\n", NUM_BUTTONS); - Serial.printf("[MUX] WS2812C for %d LEDs\n", NUM_LEDS); - Serial.printf("[MUX] DI pin reads: %d\n", digitalRead(pin_di)); + Serial.printf("[MUX] 74HC165 x2 daisy-chain, WS2812C x%d LEDs\n", NUM_LEDS); } uint8_t PixelStompMux::read_buttons() { - digitalWrite(pin_ld, HIGH); - delayMicroseconds(20); digitalWrite(pin_ld, LOW); - delayMicroseconds(20); + delayMicroseconds(ROXMUX_DELAY); + digitalWrite(pin_ld, HIGH); - last_button_state = shift_in_74hc165(); - return last_button_state; + uint8_t data = 0; + for (int i = 7; i >= 0; i--) { + bitWrite(data, i, digitalRead(pin_di)); + digitalWrite(pin_clk, HIGH); + delayMicroseconds(ROXMUX_DELAY); + digitalWrite(pin_clk, LOW); + delayMicroseconds(ROXMUX_DELAY); + } + + last_button_state = data; + return data; } bool PixelStompMux::is_button_pressed(uint8_t index) { @@ -78,36 +86,17 @@ void PixelStompMux::dump() { } } -uint8_t PixelStompMux::shift_in_74hc165() { - uint8_t data = 0; - - for (int i = NUM_BUTTONS - 1; i >= 0; i--) { - if (digitalRead(pin_di)) { - data |= (1 << i); - } - digitalWrite(pin_clk, HIGH); - delayMicroseconds(2); - digitalWrite(pin_clk, LOW); - delayMicroseconds(2); - } - - return data; -} - void PixelStompMux::probe() { Serial.println("[MUX] === Hardware Probe ==="); - Serial.printf(" DI (GPIO %d) raw: %d\n", pin_di, digitalRead(pin_di)); - Serial.println(" Testing LD pin..."); + Serial.println(" Testing LD pin (RoxMux protocol)..."); digitalWrite(pin_ld, LOW); delayMicroseconds(10); Serial.printf(" LD=LOW, DI=%d\n", digitalRead(pin_di)); digitalWrite(pin_ld, HIGH); delayMicroseconds(10); Serial.printf(" LD=HIGH, DI=%d\n", digitalRead(pin_di)); - digitalWrite(pin_ld, LOW); - delayMicroseconds(10); Serial.println(" Toggling CLK 16 times, reading DI..."); for (int i = 0; i < 16; i++) {