diff --git a/soundcube-firmware/soundcube-firmware.ino b/soundcube-firmware/soundcube-firmware.ino index 02f2f40..d20f257 100644 --- a/soundcube-firmware/soundcube-firmware.ino +++ b/soundcube-firmware/soundcube-firmware.ino @@ -47,13 +47,15 @@ int lut_matrix[13] = {56,55,57,58,59,62,61,60,63,64,65,67,66}; int active = 0; int active_led_ring = 0; +bool speakerToggle = false; + uint32_t lastTime = 0; int32_t position = 0; CRGB ui_leds[74]; CRGB edge_leds[11]; -volatile bool flag = false; +volatile bool buttonChanged = false; volatile bool click = false; volatile bool amp = false; @@ -141,7 +143,12 @@ void pwm_audio_callback() { } void tca_irq() { - flag = true; + buttonChanged = true; +} + +void speaker(bool state){ + digitalWrite(12, state ? HIGH : LOW); + digitalWrite(13, state ? HIGH : LOW); } void setup() { @@ -160,8 +167,7 @@ void setup() { pinMode(12, OUTPUT); pinMode(13, OUTPUT); - digitalWrite(12, HIGH); - digitalWrite(13, HIGH); + speaker(false); pinMode(21, INPUT_PULLUP); sd_card_detected = !digitalRead(21); @@ -288,7 +294,6 @@ void setup() { // } // } - digitalWrite(6, HIGH); delay(50); digitalWrite(6, LOW); @@ -301,21 +306,6 @@ void loop() { if(sd_card_detected) edge_leds[8] = CRGB(0,10,0); if(!sd_card_detected) edge_leds[8] = CRGB(10,0,0); - // for (int i = 0; i < NSTREAMS; i++) { - // if(!ringbuffer[i].isFull()){ - // int cnt = 0; - // while (!ringbuffer[i].isFull() && cnt < 10000) { - // uint8_t samplebyte[2]; - // streams[i].read(samplebyte, 2); - // if(!streams[i].available()) streams[i].seek(44, SeekSet); - - // int16_t sample = (samplebyte[1] << 8) + samplebyte[0]; - // ringbuffer[i].push(sample); - // cnt++; - // } - // } - // } - // EDGE LEDs for (int i = 0; i < 8; i++) { edge_leds[i] = CRGB(config.edge_color_r, config.edge_color_g, config.edge_color_b); @@ -331,23 +321,37 @@ void loop() { ui_leds[1] = CRGB(0, 0, 0); ui_leds[2] = CRGB(0, 0, 0); - // flag = true when a button is pushed - if (flag) { - int val = TCA.read16(); + // buttonChanged = true when a button is pushed + if (buttonChanged) { + int buttonValues = TCA.read16(); + bool buttonsNew[16] = {false}; + int buttonsDir[16] = {0}; + + bool buttonUp = false; + bool buttonDown = false; for(int i = 0; i < 16; i++){ - buttons[i] = ~(val >> i) & 0x01; + buttonsNew[i] = ~(buttonValues >> i) & 0x01; + if(buttonsNew[i] == true && buttons[i] == false) { + buttonsDir[i] = 1; + buttonDown = true; + } + if(buttonsNew[i] == false && buttons[i] == true) { + buttonsDir[i] = -1; + buttonUp = true; + } + buttons[i] = buttonsNew[i]; } // Make vibration - if (HAPTIC) { + if (HAPTIC && buttonDown) { digitalWrite(6, HIGH); delay(50); digitalWrite(6, LOW); } // Make beep - if (AURAL) { + if (AURAL && buttonDown) { digitalWrite(7, HIGH); click = true; } @@ -363,7 +367,12 @@ void loop() { if(active == 13) active = 0; if(active == -1) active = 12; - flag = false; + if(buttons[DEBUG3]) { + speakerToggle = !speakerToggle; + speaker(speakerToggle); + } + + buttonChanged = false; } // empty LED matrix