From 6eb515e2d4aad7ba699e8890f147c28e9a2704f4 Mon Sep 17 00:00:00 2001 From: finga Date: Sat, 11 Sep 2021 00:10:46 +0200 Subject: [PATCH 1/2] Display digits and integers Display digits and integers, for the later displaying leading zeroes is supported via parameter. Demo integers are displayed in the setup screen. --- firmware/src/main.c | 62 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/firmware/src/main.c b/firmware/src/main.c index 99d9146..cafa3c7 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -165,6 +165,62 @@ static void lcd_write_symbol_page(const struct symbol* sym, lcd_write(sym->symbol[page * sym->length + i]); } +static void lcd_write_digit_page(uint8_t digit, uint8_t page, + bool invert) { + switch (digit) { + case 0: + lcd_write_symbol_page(&sym_0, page, invert); + break; + case 1: + lcd_write_symbol_page(&sym_1, page, invert); + break; + case 2: + lcd_write_symbol_page(&sym_2, page, invert); + break; + case 3: + lcd_write_symbol_page(&sym_3, page, invert); + break; + case 4: + lcd_write_symbol_page(&sym_4, page, invert); + break; + case 5: + lcd_write_symbol_page(&sym_5, page, invert); + break; + case 6: + lcd_write_symbol_page(&sym_6, page, invert); + break; + case 7: + lcd_write_symbol_page(&sym_7, page, invert); + break; + case 8: + lcd_write_symbol_page(&sym_8, page, invert); + break; + case 9: + lcd_write_symbol_page(&sym_9, page, invert); + break; + } +} + +static void lcd_write_integer_page(uint8_t integer, uint8_t digits, + uint8_t page, bool invert) { + if (digits != 0 || integer != 0) { + uint8_t input_digits = 0; + uint16_t comperator = 1; + + for (; comperator <= integer; comperator *= 10, input_digits++); + for (int8_t i = digits - input_digits; i > 0; i--) { + lcd_write_kerning(2, invert); + lcd_write_digit_page(0, page, invert); + } + + for (; comperator >= 10; comperator /= 10) { + lcd_write_kerning(2, invert); + lcd_write_digit_page((integer % comperator) / (comperator / 10), + page, invert); + } + } +} + void lcd_splash(void) { lcd_fill(0x00); @@ -317,7 +373,8 @@ static void lcd_setup(void) { 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); + lcd_write_kerning(11, false); + lcd_write_integer_page(123, 1, i, false); } for (uint8_t i = 0; i < 2; i++) { @@ -346,7 +403,8 @@ static void lcd_setup(void) { 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); + lcd_write_kerning(7, false); + lcd_write_integer_page(123, 3, i, false); } for (uint8_t i = 0; i < 2; i++) { From e2d30d705077ff98712832bce71b2e91a53272d7 Mon Sep 17 00:00:00 2001 From: finga Date: Sat, 11 Sep 2021 00:21:01 +0200 Subject: [PATCH 2/2] Fix indents and switch syntax Fix indentions in `spi_byte()` and add missing space after `switch` keywords. --- firmware/src/main.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/firmware/src/main.c b/firmware/src/main.c index cafa3c7..fac89de 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -104,10 +104,10 @@ void spi_init(void) { } uint8_t spi_byte(uint8_t data) { - SPDR = data; - while(!(SPSR & (1 << SPIF))); - return SPDR; - } + SPDR = data; + while(!(SPSR & (1 << SPIF))); + return SPDR; +} void lcd_write(uint8_t data) { SPI_PORT &= ~(1 << SPI_SS); @@ -256,7 +256,7 @@ static void lcd_home(void) { bool ch3_selected = false; bool setup_selected = false; - switch(home_state) { + switch (home_state) { case ch1: ch1_selected = true; break; @@ -425,7 +425,7 @@ static void lcd_setup(void) { } static void change_state(enum state new_state) { - switch(new_state) { + switch (new_state) { case home: lcd_home(); current_state = home; @@ -500,7 +500,7 @@ static void update_state(enum input event) { ISR(PCINT0_vect) { cli(); - switch(enc) { + switch (enc) { case 0: if (ENC_A && !ENC_B) enc = 1;