From 730bb3708e1384c60cc5bd45c4dcc86b3f95396d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gu=C3=B0ni=20M=C3=A1r=20Gilbert?= Date: Sat, 14 Jan 2023 13:50:05 +0000 Subject: [PATCH] Fix an issue with menu_draw_item_puts_P Change in memory: Flash: +16 bytes SRAM: 0 bytes --- Firmware/lcd.cpp | 4 ++-- Firmware/lcd.h | 7 ++++++- Firmware/menu.cpp | 10 +++++----- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Firmware/lcd.cpp b/Firmware/lcd.cpp index f9d83f17d..a726c6db2 100644 --- a/Firmware/lcd.cpp +++ b/Firmware/lcd.cpp @@ -538,14 +538,14 @@ char lcd_print_pad(const char* s, uint8_t len) return *s; } -char lcd_print_pad_P(const char* s, uint8_t len) +uint8_t lcd_print_pad_P(const char* s, uint8_t len) { while (len && pgm_read_byte(s)) { lcd_write(pgm_read_byte(s++)); --len; } lcd_space(len); - return *s; + return len; } void lcd_print(char c, int base) diff --git a/Firmware/lcd.h b/Firmware/lcd.h index 12014a814..9949683cb 100644 --- a/Firmware/lcd.h +++ b/Firmware/lcd.h @@ -54,7 +54,12 @@ extern void lcd_printFloat(double number, uint8_t digits); extern void lcd_print(const char*); extern char lcd_print_pad(const char* s, uint8_t len); -char lcd_print_pad_P(const char* s, uint8_t len); + +/// @brief print a string from PROGMEM with left-adjusted padding +/// @param s string from PROGMEM. +/// @param len maximum number of characters to print, including padding. Ranges from 0 to LCD_WIDTH. +/// @return number of padded bytes. 0 means there was no padding. +uint8_t lcd_print_pad_P(const char* s, uint8_t len); extern void lcd_print(char, int = 0); extern void lcd_print(unsigned char, int = 0); extern void lcd_print(int, int = 10); diff --git a/Firmware/menu.cpp b/Firmware/menu.cpp index b55b74a2a..e4e2259c1 100755 --- a/Firmware/menu.cpp +++ b/Firmware/menu.cpp @@ -242,11 +242,11 @@ static void menu_draw_item_puts_E(char type_char, const Sheet &sheet) static void menu_draw_item_puts_P(char type_char, const char* str, char num) { - lcd_set_cursor(0, menu_row); - lcd_putc(menu_selection_mark()); - lcd_print_pad_P(str, LCD_WIDTH - 3); - lcd_putc(num); - lcd_putc(type_char); + const uint8_t max_strlen = LCD_WIDTH - 3; + lcd_putc_at(0, menu_row, menu_selection_mark()); + uint8_t len = lcd_print_pad_P(str, max_strlen); + lcd_putc_at((max_strlen - len) + 2, menu_row, num); + lcd_putc_at(LCD_WIDTH - 1, menu_row, type_char); } void menu_item_dummy(void)