diff --git a/firmware/apps/tonictest.c b/firmware/apps/tonictest.c index 29c8abf..bde21f1 100644 --- a/firmware/apps/tonictest.c +++ b/firmware/apps/tonictest.c @@ -1,21 +1,30 @@ #include #include +#include static void init(void) { - pentatonic_direction(ALL_OUT); + pentatonic_direction(ALL_IN); } static void run(void) { - pentatonic_led_on(0); + pentatonic_direction(ALL_IN); - for(uint8_t i = 0; i < 5; ++i) { - wait_ms(500); + for(;;) { + uint8_t buttons = pentatonic_buttons(); - pentatonic_led_on((i + 1) % 5); + if(buttons) { + pentatonic_direction(ALL_OUT); - wait_ms(200); + pentatonic_all_led_set(buttons); - pentatonic_led_off(i); + led_inv(RIGHT); + + wait_ms(1000); + + break; + } + + wait_ms(1); } } diff --git a/firmware/include/pentabug/pentatonic.h b/firmware/include/pentabug/pentatonic.h index 0991b3d..ea162c6 100644 --- a/firmware/include/pentabug/pentatonic.h +++ b/firmware/include/pentabug/pentatonic.h @@ -6,15 +6,31 @@ #define ALL_OUT 0xff #define ALL_IN 0x00 +// every call affecting multiple LEDs/buttons expects a bitmap +// the first 5 bits of this bitmap repressent the LEDs/buttons (from left to right) + +// set direction in which to use pentatonic extension, you might use one of the ALL_* from above +// IMPORTANT: you have to call this function before using any other function from this file void pentatonic_direction(uint8_t direction); +// direct access to single LED void pentatonic_led_on(uint8_t led); void pentatonic_led_off(uint8_t led); +// turn multiple LEDs on or off with one call void pentatonic_multi_led_on(uint8_t leds); void pentatonic_multi_led_off(uint8_t leds); +// set the state of a single LEDs void pentatonic_led_set(uint8_t led, uint8_t state); + +// sets the state of all LEDs void pentatonic_all_led_set(uint8_t leds); +// get the state of all buttons +uint8_t pentatonic_buttons(void); + +// get the state of a specific button +uint8_t pentatonic_button(uint8_t button); + #endif /* PENTATONIC_H */ diff --git a/firmware/lib/pentatonic.c b/firmware/lib/pentatonic.c index b5ebea8..5e75122 100644 --- a/firmware/lib/pentatonic.c +++ b/firmware/lib/pentatonic.c @@ -3,8 +3,10 @@ #include // pins affected by pentatonic on each port -const uint8_t bits_c = (1 << 4) | (1 << 5); -const uint8_t bits_d = (1 << 5) | (1 << 6) | (1 << 7); +static const uint8_t bits_c = (1 << 4) | (1 << 5); +static const uint8_t bits_d = (1 << 5) | (1 << 6) | (1 << 7); + +// these functions assign the pentatonic bits to pins on a port static inline uint8_t bits_to_c(uint8_t direction) { return ((direction & (1 << 3)) << 2) | (direction & (1 << 4)); @@ -17,21 +19,18 @@ static inline uint8_t bits_to_d(uint8_t direction) { void pentatonic_direction(uint8_t direction) { // map bits to pins - uint8_t part_c = bits_to_c(direction); - uint8_t part_d = bits_to_d(direction); + const uint8_t part_c = bits_to_c(direction); + const uint8_t part_d = bits_to_d(direction); - // reset everything + // reset direction - PORTC &= ~bits_c; DDRC &= ~bits_c; - - PORTD &= ~bits_d; DDRD &= ~bits_d; // pullup if input, off if output (inverted) - PORTC |= part_c; - PORTD |= part_d; + PORTC |= bits_c; + PORTD |= bits_d; // set new direction @@ -42,8 +41,8 @@ void pentatonic_direction(uint8_t direction) { void pentatonic_multi_led_on(uint8_t leds) { // map bits to pins - uint8_t part_c = bits_to_c(leds); - uint8_t part_d = bits_to_d(leds); + const uint8_t part_c = bits_to_c(leds); + const uint8_t part_d = bits_to_d(leds); // set leds on (inverted) @@ -83,3 +82,19 @@ void pentatonic_all_led_set(uint8_t leds) { pentatonic_multi_led_off(0xff); pentatonic_multi_led_on(leds); } + +uint8_t pentatonic_buttons(void) { + // assign pins to pentatonic bits + + uint8_t part_c = ((PINC & (1 << 5)) >> 2) | (PINC & (1 << 4)); + uint8_t part_d = PIND >> 5 & 0b111; + + // return inverted as switches are connected to ground + + return ~(part_c | part_d) & 0b11111; +} + +uint8_t pentatonic_button(uint8_t button) { + return pentatonic_buttons() & (1 << button); +} +