diff --git a/firmware/src/main.c b/firmware/src/main.c index 99d9146..f70b58d 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -29,38 +29,10 @@ struct symbol { uint8_t symbol[]; }; -static const struct symbol sym_a = { 6, { 0xC0, 0xF0, 0x3C, 0x3C, 0xF0, 0xC0, - 0x3F, 0x3F, 0x06, 0x06, 0x3F, 0x3F } }; -static const struct symbol sym_b = { 6, { 0xFC, 0xFC, 0x8C, 0x8C, 0xFC, 0x78, - 0x3F, 0x3F, 0x31, 0x31, 0x3F, 0x1E } }; static const struct symbol sym_c = { 5, { 0xF8, 0xFC, 0x0C, 0x1C, 0x18, 0x1F, 0x3F, 0x30, 0x38, 0x18 } }; -static const struct symbol sym_e = { 5, { 0xFC, 0xFC, 0x8C, 0x8C, 0x0C, - 0x3F, 0x3F, 0x31, 0x31, 0x30 } }; -static const struct symbol sym_g = { 6, { 0xF8, 0xFC, 0x0C, 0x0C, 0x3C, 0x38, - 0x1F, 0x3F, 0x30, 0x33, 0x3F, 0x1F } }; static const struct symbol sym_h = { 6, { 0xFC, 0xFC, 0x80, 0x80, 0xFC, 0xFC, 0x3F, 0x3F, 0x01, 0x01, 0x3F, 0x3F } }; -static const struct symbol sym_i = { 4, { 0x0C, 0xFC, 0xFC, 0x0C, - 0x30, 0x3F, 0x3F, 0x30 } }; -static const struct symbol sym_k = { 6, { 0xFC, 0xFC, 0xC0, 0xF0, 0x7C, 0x1C, - 0x3F, 0x3F, 0x03, 0x0F, 0x3E, 0x38 } }; -static const struct symbol sym_l = { 5, { 0xFC, 0xFC, 0x00, 0x00, 0x00, - 0x3F, 0x3F, 0x30, 0x30, 0x30 } }; -static const struct symbol sym_n = { 7, { 0xFC, 0xFC, 0xF0, 0xC0, 0x00, 0xFC, 0xFC, - 0x3F, 0x3F, 0x00, 0x03, 0x0F, 0x3F, 0x3F } }; -static const struct symbol sym_o = { 6, { 0xF8, 0xFC, 0x0C, 0x0C, 0xFC, 0xF8, - 0x1F, 0x3F, 0x30, 0x30, 0x3F, 0x1F } }; -static const struct symbol sym_p = { 6, { 0xFC, 0xFC, 0x8C, 0x8C, 0xFC, 0xF8, - 0x3F, 0x3F, 0x01, 0x01, 0x01, 0x00 } }; -static const struct symbol sym_r = { 6, { 0xFC, 0xFC, 0x8C, 0x8C, 0xFC, 0xF8, - 0x3F, 0x3F, 0x01, 0x03, 0x3F, 0x3E } }; -static const struct symbol sym_s = { 6, { 0xF8, 0xFC, 0x8C, 0x8C, 0x9C, 0x18, - 0x18, 0x39, 0x31, 0x31, 0x3F, 0x1F } }; -static const struct symbol sym_t = { 6, { 0x0C, 0x0C, 0xFC, 0xFC, 0x0C, 0x0C, - 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00 } }; -static const struct symbol sym_u = { 6, { 0xFC, 0xFC, 0x00, 0x00, 0xFC, 0xFC, - 0x3F, 0x3F, 0x30, 0x30, 0x3F, 0x3F } }; static const struct symbol sym_0 = { 5, { 0xF8, 0xFC, 0x0C, 0xFC, 0xF8, 0x1F, 0x3F, 0x30, 0x3F, 0x1F } }; @@ -83,18 +55,15 @@ static const struct symbol sym_8 = { 5, { 0x78, 0xFC, 0x8C, 0xFC, 0x78, static const struct symbol sym_9 = { 5, { 0xF8, 0xFC, 0x8C, 0xFC, 0xF8, 0x1C, 0x3D, 0x31, 0x3F, 0x1F } }; -static const struct symbol sym_colon = { 2, { 0x30, 0x30, - 0x0C, 0x0C } }; - static const struct symbol sym_setup = { 19, { 0xF8, 0x98, 0xB8, 0x00, 0xF8, 0x98, 0x18, 0x00, 0x18, 0xF8, 0x18, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x98, 0xF8, 0x1D, 0x19, 0x1F, 0x00, 0x1F, 0x19, 0x18, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x18, 0x1F, 0x00, 0x1F, 0x01, 0x01 } }; -enum input {cw, ccw, click, hold}; +enum input {cw, ccw}; -static volatile enum state {home, ch1, ch2, ch3, setup} current_state = home; -static volatile enum state home_state = ch1; +static enum state {home} current_state = home; +static enum home_state {ch1, ch2, ch3, setup} current_home_state = ch1; -static volatile uint8_t enc = 0; +static uint8_t enc = 0; void spi_init(void) { SPI_DDR |= (1 << SPI_SCK) | (1 << SPI_MOSI) | (1 << SPI_SS); @@ -200,7 +169,7 @@ static void lcd_home(void) { bool ch3_selected = false; bool setup_selected = false; - switch(home_state) { + switch(current_home_state) { case ch1: ch1_selected = true; break; @@ -270,154 +239,20 @@ static void lcd_home(void) { } } -static void lcd_setup(void) { - lcd_fill(0x00); - - for (uint8_t i = 0; i < 2; i++) { - SPI_PORT &= ~(1 << LCD_CD); - lcd_write(0x00); - lcd_write(0x10); - lcd_write(0xB0 + i); - SPI_PORT |= (1 << LCD_CD); - - lcd_write_kerning(32, true); - lcd_write_symbol_page(&sym_s, i, true); - lcd_write_kerning(2, true); - lcd_write_symbol_page(&sym_e, i, true); - lcd_write_kerning(2, true); - lcd_write_symbol_page(&sym_t, i, true); - lcd_write_kerning(2, true); - lcd_write_symbol_page(&sym_u, i, true); - lcd_write_kerning(2, true); - lcd_write_symbol_page(&sym_p, i, true); - lcd_write_kerning(33, true); - } - - for (uint8_t i = 0; i < 2; i++) { - SPI_PORT &= ~(1 << LCD_CD); - lcd_write(0x02); - lcd_write(0x10); - lcd_write(0xB2 + i); - SPI_PORT |= (1 << LCD_CD); - - lcd_write_symbol_page(&sym_c, i, false); - lcd_write_kerning(2, false); - lcd_write_symbol_page(&sym_o, i, false); - lcd_write_kerning(2, false); - lcd_write_symbol_page(&sym_n, i, false); - lcd_write_kerning(2, false); - lcd_write_symbol_page(&sym_t, i, false); - lcd_write_kerning(2, false); - lcd_write_symbol_page(&sym_r, i, false); - lcd_write_kerning(2, false); - lcd_write_symbol_page(&sym_a, i, false); - lcd_write_kerning(2, false); - lcd_write_symbol_page(&sym_s, i, false); - lcd_write_kerning(2, false); - lcd_write_symbol_page(&sym_t, i, false); - lcd_write_kerning(2, false); - lcd_write_symbol_page(&sym_colon, i, false); - lcd_write_kerning(13, false); - } - - for (uint8_t i = 0; i < 2; i++) { - SPI_PORT &= ~(1 << LCD_CD); - lcd_write(0x02); - lcd_write(0x10); - lcd_write(0xB4 + i); - SPI_PORT |= (1 << LCD_CD); - - lcd_write_symbol_page(&sym_b, i, false); - lcd_write_kerning(2, false); - lcd_write_symbol_page(&sym_a, i, false); - lcd_write_kerning(2, false); - lcd_write_symbol_page(&sym_c, i, false); - lcd_write_kerning(2, false); - lcd_write_symbol_page(&sym_k, i, false); - lcd_write_kerning(2, false); - lcd_write_symbol_page(&sym_l, i, false); - lcd_write_kerning(2, false); - lcd_write_symbol_page(&sym_i, i, false); - lcd_write_kerning(2, false); - lcd_write_symbol_page(&sym_g, i, false); - lcd_write_kerning(2, false); - lcd_write_symbol_page(&sym_h, i, false); - lcd_write_kerning(2, false); - lcd_write_symbol_page(&sym_t, i, false); - lcd_write_kerning(2, false); - lcd_write_symbol_page(&sym_colon, i, false); - lcd_write_kerning(9, false); - } - - for (uint8_t i = 0; i < 2; i++) { - SPI_PORT &= ~(1 << LCD_CD); - lcd_write(0x03); - lcd_write(0x12); - lcd_write(0xB6 + i); - SPI_PORT |= (1 << LCD_CD); - - lcd_write_symbol_page(&sym_b, i, false); - lcd_write_kerning(2, false); - lcd_write_symbol_page(&sym_a, i, false); - lcd_write_kerning(2, false); - lcd_write_symbol_page(&sym_c, i, false); - lcd_write_kerning(2, false); - lcd_write_symbol_page(&sym_k, i, false); - } -} - -static void change_state(enum state new_state) { - switch(new_state) { - case home: - lcd_home(); - current_state = home; - break; - case ch1: - break; - case ch2: - break; - case ch3: - break; - case setup: - lcd_setup(); - current_state = setup; - break; - } -} - static void update_home(enum input event) { switch (event) { case cw: - home_state++; - if (home_state > setup) - home_state = ch1; + current_home_state++; + if (current_home_state > setup) + current_home_state = ch1; lcd_home(); break; case ccw: - home_state--; - if (home_state > setup) - home_state = setup; + current_home_state--; + if (current_home_state > setup) + current_home_state = setup; lcd_home(); break; - case click: - change_state(home_state); - break; - case hold: - break; - } -} - -static void update_setup(enum input event) { - switch (event) { - case cw: - break; - case ccw: - break; - case click: - break; - case hold: - change_state(home); - break; } } @@ -426,14 +261,14 @@ static void update_state(enum input event) { case home: update_home(event); break; - case ch1: - break; - case ch2: - break; - case ch3: - break; - case setup: - update_setup(event); + } +} + +static void change_state(enum state new_state) { + switch(new_state) { + case home: + lcd_home(); + current_state = home; break; } } @@ -475,45 +310,12 @@ ISR(PCINT0_vect) { break; } - // TODO: proper dechattering + // TODO: proper debounce and dechattering _delay_us(100); sei(); } -// encoder button interrupt -ISR(PCINT1_vect) { - cli(); - - if (PINC & (1 << PC0)) { // release - TCCR1B &= (0 << CS11) & (0 << CS10); // Disable Timer/Counter1 - if (TCNT1 != 0) { - update_state(click); // Switch to selected state - TCNT1 = 0; - } - } else { // press - if (!(TCCR1B & (1 << CS10))) { - TCCR1B |= (1 << CS11) | (1 << CS10); // Enable Timer/Counter1 - } - } - - // TODO: proper debouncing - _delay_us(70); - - sei(); -} - -// Timer/Counter1 compare match A -ISR(TIMER1_COMPA_vect) { - cli(); - - TCCR1B &= (0 << CS11) & (0 << CS10); // Disable Timer/Counter1 - TCNT1 = 0; - update_state(hold); - - sei(); -} - int main(void) { // FastPWM: 1.25kHz // TODO: Try to get the backlit even more dim @@ -532,15 +334,6 @@ int main(void) { PCICR |= (1 << PCIE0); PCMSK0 |= (1 << PCINT6) | (1 << PCINT7); - // Encoder switch setup - PORTC |= (1 << PC0); - PCICR |= (1 << PCIE1); - PCMSK1 |= (1 << PCINT8); - - // Timer1 setup to recognize held button - OCR1A = 8192; - TIMSK1 |= (1 << OCIE1A); // Enable match compare A - // Show splash screen and load the menu lcd_splash(); _delay_ms(250);