diff --git a/firmware/src/main.c b/firmware/src/main.c index b7ac373..99d9146 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -29,10 +29,38 @@ 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 } }; @@ -55,6 +83,9 @@ 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 } }; @@ -239,6 +270,102 @@ 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: @@ -252,6 +379,8 @@ static void change_state(enum state new_state) { case ch3: break; case setup: + lcd_setup(); + current_state = setup; break; } } @@ -278,6 +407,20 @@ static void update_home(enum input event) { } } +static void update_setup(enum input event) { + switch (event) { + case cw: + break; + case ccw: + break; + case click: + break; + case hold: + change_state(home); + break; + } +} + static void update_state(enum input event) { switch (current_state) { case home: @@ -290,6 +433,7 @@ static void update_state(enum input event) { case ch3: break; case setup: + update_setup(event); break; } }