Default UI: optimized layout_t struct and _ui_calculateLayout() function

Small optimizations to layout management code, saved around 132 bytes of
.text space.
This commit is contained in:
Silvano Seva 2023-12-29 12:02:29 +01:00
parent d8c0ab1c44
commit c533c47103
2 changed files with 102 additions and 117 deletions

View File

@ -194,8 +194,6 @@ typedef struct layout_t
fontSize_t bottom_font; fontSize_t bottom_font;
fontSize_t input_font; fontSize_t input_font;
fontSize_t menu_font; fontSize_t menu_font;
fontSize_t mode_font_big;
fontSize_t mode_font_small;
} layout_t; } layout_t;
/** /**

View File

@ -289,152 +289,140 @@ static uint8_t evQueue_wrPos;
static event_t evQueue[MAX_NUM_EVENTS]; static event_t evQueue[MAX_NUM_EVENTS];
static layout_t _ui_calculateLayout() static void _ui_calculateLayout(layout_t *layout)
{ {
// Horizontal line height // Horizontal line height
const uint16_t hline_h = 1; static const uint16_t hline_h = 1;
// Compensate for fonts printing below the start position // Compensate for fonts printing below the start position
const uint16_t text_v_offset = 1; static const uint16_t text_v_offset = 1;
// Calculate UI layout depending on vertical resolution // Calculate UI layout depending on vertical resolution
// Tytera MD380, MD-UV380 // Tytera MD380, MD-UV380
#if CONFIG_SCREEN_HEIGHT > 127 #if CONFIG_SCREEN_HEIGHT > 127
// Height and padding shown in diagram at beginning of file // Height and padding shown in diagram at beginning of file
const uint16_t top_h = 16; static const uint16_t top_h = 16;
const uint16_t top_pad = 4; static const uint16_t top_pad = 4;
const uint16_t line1_h = 20; static const uint16_t line1_h = 20;
const uint16_t line2_h = 20; static const uint16_t line2_h = 20;
const uint16_t line3_h = 20; static const uint16_t line3_h = 20;
const uint16_t line3_large_h = 40; static const uint16_t line3_large_h = 40;
const uint16_t line4_h = 20; static const uint16_t line4_h = 20;
const uint16_t menu_h = 16; static const uint16_t menu_h = 16;
const uint16_t bottom_h = 23; static const uint16_t bottom_h = 23;
const uint16_t bottom_pad = top_pad; static const uint16_t bottom_pad = top_pad;
const uint16_t status_v_pad = 2; static const uint16_t status_v_pad = 2;
const uint16_t small_line_v_pad = 2; static const uint16_t small_line_v_pad = 2;
const uint16_t big_line_v_pad = 6; static const uint16_t big_line_v_pad = 6;
const uint16_t horizontal_pad = 4; static const uint16_t horizontal_pad = 4;
// Top bar font: 8 pt // Top bar font: 8 pt
const fontSize_t top_font = FONT_SIZE_8PT; static const fontSize_t top_font = FONT_SIZE_8PT;
const symbolSize_t top_symbol_size = SYMBOLS_SIZE_8PT; static const symbolSize_t top_symbol_size = SYMBOLS_SIZE_8PT;
// Text line font: 8 pt // Text line font: 8 pt
const fontSize_t line1_font = FONT_SIZE_8PT; static const fontSize_t line1_font = FONT_SIZE_8PT;
const symbolSize_t line1_symbol_size = SYMBOLS_SIZE_8PT; static const symbolSize_t line1_symbol_size = SYMBOLS_SIZE_8PT;
const fontSize_t line2_font = FONT_SIZE_8PT; static const fontSize_t line2_font = FONT_SIZE_8PT;
const symbolSize_t line2_symbol_size = SYMBOLS_SIZE_8PT; static const symbolSize_t line2_symbol_size = SYMBOLS_SIZE_8PT;
const fontSize_t line3_font = FONT_SIZE_8PT; static const fontSize_t line3_font = FONT_SIZE_8PT;
const symbolSize_t line3_symbol_size = SYMBOLS_SIZE_8PT; static const symbolSize_t line3_symbol_size = SYMBOLS_SIZE_8PT;
const fontSize_t line4_font = FONT_SIZE_8PT; static const fontSize_t line4_font = FONT_SIZE_8PT;
const symbolSize_t line4_symbol_size = SYMBOLS_SIZE_8PT; static const symbolSize_t line4_symbol_size = SYMBOLS_SIZE_8PT;
// Frequency line font: 16 pt // Frequency line font: 16 pt
const fontSize_t line3_large_font = FONT_SIZE_16PT; static const fontSize_t line3_large_font = FONT_SIZE_16PT;
// Bottom bar font: 8 pt // Bottom bar font: 8 pt
const fontSize_t bottom_font = FONT_SIZE_8PT; static const fontSize_t bottom_font = FONT_SIZE_8PT;
// TimeDate/Frequency input font // TimeDate/Frequency input font
const fontSize_t input_font = FONT_SIZE_12PT; static const fontSize_t input_font = FONT_SIZE_12PT;
// Menu font // Menu font
const fontSize_t menu_font = FONT_SIZE_8PT; static const fontSize_t menu_font = FONT_SIZE_8PT;
// Mode screen frequency font: 12 pt
const fontSize_t mode_font_big = FONT_SIZE_12PT;
// Mode screen details font: 9 pt
const fontSize_t mode_font_small = FONT_SIZE_9PT;
// Radioddity GD-77 // Radioddity GD-77
#elif CONFIG_SCREEN_HEIGHT > 63 #elif CONFIG_SCREEN_HEIGHT > 63
// Height and padding shown in diagram at beginning of file // Height and padding shown in diagram at beginning of file
const uint16_t top_h = 11; static const uint16_t top_h = 11;
const uint16_t top_pad = 1; static const uint16_t top_pad = 1;
const uint16_t line1_h = 10; static const uint16_t line1_h = 10;
const uint16_t line2_h = 10; static const uint16_t line2_h = 10;
const uint16_t line3_h = 10; static const uint16_t line3_h = 10;
const uint16_t line3_large_h = 16; static const uint16_t line3_large_h = 16;
const uint16_t line4_h = 10; static const uint16_t line4_h = 10;
const uint16_t menu_h = 10; static const uint16_t menu_h = 10;
const uint16_t bottom_h = 15; static const uint16_t bottom_h = 15;
const uint16_t bottom_pad = 0; static const uint16_t bottom_pad = 0;
const uint16_t status_v_pad = 1; static const uint16_t status_v_pad = 1;
const uint16_t small_line_v_pad = 1; static const uint16_t small_line_v_pad = 1;
const uint16_t big_line_v_pad = 0; static const uint16_t big_line_v_pad = 0;
const uint16_t horizontal_pad = 4; static const uint16_t horizontal_pad = 4;
// Top bar font: 6 pt // Top bar font: 6 pt
const fontSize_t top_font = FONT_SIZE_6PT; static const fontSize_t top_font = FONT_SIZE_6PT;
const symbolSize_t top_symbol_size = SYMBOLS_SIZE_6PT; static const symbolSize_t top_symbol_size = SYMBOLS_SIZE_6PT;
// Middle line fonts: 5, 8, 8 pt // Middle line fonts: 5, 8, 8 pt
const fontSize_t line1_font = FONT_SIZE_6PT; static const fontSize_t line1_font = FONT_SIZE_6PT;
const symbolSize_t line1_symbol_size = SYMBOLS_SIZE_6PT; static const symbolSize_t line1_symbol_size = SYMBOLS_SIZE_6PT;
const fontSize_t line2_font = FONT_SIZE_6PT; static const fontSize_t line2_font = FONT_SIZE_6PT;
const symbolSize_t line2_symbol_size = SYMBOLS_SIZE_6PT; static const symbolSize_t line2_symbol_size = SYMBOLS_SIZE_6PT;
const fontSize_t line3_font = FONT_SIZE_6PT; static const fontSize_t line3_font = FONT_SIZE_6PT;
const symbolSize_t line3_symbol_size = SYMBOLS_SIZE_6PT; static const symbolSize_t line3_symbol_size = SYMBOLS_SIZE_6PT;
const fontSize_t line3_large_font = FONT_SIZE_10PT; static const fontSize_t line3_large_font = FONT_SIZE_10PT;
const fontSize_t line4_font = FONT_SIZE_6PT; static const fontSize_t line4_font = FONT_SIZE_6PT;
const symbolSize_t line4_symbol_size = SYMBOLS_SIZE_6PT; static const symbolSize_t line4_symbol_size = SYMBOLS_SIZE_6PT;
// Bottom bar font: 6 pt // Bottom bar font: 6 pt
const fontSize_t bottom_font = FONT_SIZE_6PT; static const fontSize_t bottom_font = FONT_SIZE_6PT;
// TimeDate/Frequency input font // TimeDate/Frequency input font
const fontSize_t input_font = FONT_SIZE_8PT; static const fontSize_t input_font = FONT_SIZE_8PT;
// Menu font // Menu font
const fontSize_t menu_font = FONT_SIZE_6PT; static const fontSize_t menu_font = FONT_SIZE_6PT;
// Mode screen frequency font: 9 pt
const fontSize_t mode_font_big = FONT_SIZE_9PT;
// Mode screen details font: 6 pt
const fontSize_t mode_font_small = FONT_SIZE_6PT;
// Radioddity RD-5R // Radioddity RD-5R
#elif CONFIG_SCREEN_HEIGHT > 47 #elif CONFIG_SCREEN_HEIGHT > 47
// Height and padding shown in diagram at beginning of file // Height and padding shown in diagram at beginning of file
const uint16_t top_h = 11; static const uint16_t top_h = 11;
const uint16_t top_pad = 1; static const uint16_t top_pad = 1;
const uint16_t line1_h = 0; static const uint16_t line1_h = 0;
const uint16_t line2_h = 10; static const uint16_t line2_h = 10;
const uint16_t line3_h = 10; static const uint16_t line3_h = 10;
const uint16_t line3_large_h = 18; static const uint16_t line3_large_h = 18;
const uint16_t line4_h = 10; static const uint16_t line4_h = 10;
const uint16_t menu_h = 10; static const uint16_t menu_h = 10;
const uint16_t bottom_h = 0; static const uint16_t bottom_h = 0;
const uint16_t bottom_pad = 0; static const uint16_t bottom_pad = 0;
const uint16_t status_v_pad = 1; static const uint16_t status_v_pad = 1;
const uint16_t small_line_v_pad = 1; static const uint16_t small_line_v_pad = 1;
const uint16_t big_line_v_pad = 0; static const uint16_t big_line_v_pad = 0;
const uint16_t horizontal_pad = 4; static const uint16_t horizontal_pad = 4;
// Top bar font: 6 pt // Top bar font: 6 pt
const fontSize_t top_font = FONT_SIZE_6PT; static const fontSize_t top_font = FONT_SIZE_6PT;
const symbolSize_t top_symbol_size = SYMBOLS_SIZE_6PT; static const symbolSize_t top_symbol_size = SYMBOLS_SIZE_6PT;
// Middle line fonts: 16, 16 // Middle line fonts: 16, 16
const fontSize_t line2_font = FONT_SIZE_6PT; static const fontSize_t line2_font = FONT_SIZE_6PT;
const fontSize_t line3_font = FONT_SIZE_6PT; static const fontSize_t line3_font = FONT_SIZE_6PT;
const fontSize_t line4_font = FONT_SIZE_6PT; static const fontSize_t line4_font = FONT_SIZE_6PT;
const fontSize_t line3_large_font = FONT_SIZE_12PT; static const fontSize_t line3_large_font = FONT_SIZE_12PT;
// TimeDate/Frequency input font // TimeDate/Frequency input font
const fontSize_t input_font = FONT_SIZE_8PT; static const fontSize_t input_font = FONT_SIZE_8PT;
// Menu font // Menu font
const fontSize_t menu_font = FONT_SIZE_6PT; static const fontSize_t menu_font = FONT_SIZE_6PT;
// Mode screen frequency font: 9 pt
const fontSize_t mode_font_big = FONT_SIZE_9PT;
// Mode screen details font: 6 pt
const fontSize_t mode_font_small = FONT_SIZE_6PT;
// Not present on this resolution // Not present on this resolution
const fontSize_t line1_font = 0; static const fontSize_t line1_font = 0;
const fontSize_t bottom_font = 0; static const fontSize_t bottom_font = 0;
#else #else
#error Unsupported vertical resolution! #error Unsupported vertical resolution!
#endif #endif
// Calculate printing positions // Calculate printing positions
point_t top_pos = {horizontal_pad, top_h - status_v_pad - text_v_offset}; static const uint16_t top_pos = top_h - status_v_pad - text_v_offset;
point_t line1_pos = {horizontal_pad, top_h + top_pad + line1_h - small_line_v_pad - text_v_offset}; static const uint16_t line1_pos = top_h + top_pad + line1_h - small_line_v_pad - text_v_offset;
point_t line2_pos = {horizontal_pad, top_h + top_pad + line1_h + line2_h - small_line_v_pad - text_v_offset}; static const uint16_t line2_pos = top_h + top_pad + line1_h + line2_h - small_line_v_pad - text_v_offset;
point_t line3_pos = {horizontal_pad, top_h + top_pad + line1_h + line2_h + line3_h - small_line_v_pad - text_v_offset}; static const uint16_t line3_pos = top_h + top_pad + line1_h + line2_h + line3_h - small_line_v_pad - text_v_offset;
point_t line4_pos = {horizontal_pad, top_h + top_pad + line1_h + line2_h + line3_h + line4_h - small_line_v_pad - text_v_offset}; static const uint16_t line4_pos = top_h + top_pad + line1_h + line2_h + line3_h + line4_h - small_line_v_pad - text_v_offset;
point_t line3_large_pos = {horizontal_pad, top_h + top_pad + line1_h + line2_h + line3_large_h - big_line_v_pad - text_v_offset}; static const uint16_t line3_large_pos = top_h + top_pad + line1_h + line2_h + line3_large_h - big_line_v_pad - text_v_offset;
point_t bottom_pos = {horizontal_pad, CONFIG_SCREEN_HEIGHT - bottom_pad - status_v_pad - text_v_offset}; static const uint16_t bottom_pos = CONFIG_SCREEN_HEIGHT - bottom_pad - status_v_pad - text_v_offset;
layout_t new_layout = layout_t new_layout =
{ {
@ -451,13 +439,13 @@ static layout_t _ui_calculateLayout()
status_v_pad, status_v_pad,
horizontal_pad, horizontal_pad,
text_v_offset, text_v_offset,
top_pos, {horizontal_pad, top_pos},
line1_pos, {horizontal_pad, line1_pos},
line2_pos, {horizontal_pad, line2_pos},
line3_pos, {horizontal_pad, line3_pos},
line3_large_pos, {horizontal_pad, line3_large_pos},
line4_pos, {horizontal_pad, line4_pos},
bottom_pos, {horizontal_pad, bottom_pos},
top_font, top_font,
top_symbol_size, top_symbol_size,
line1_font, line1_font,
@ -471,11 +459,10 @@ static layout_t _ui_calculateLayout()
line4_symbol_size, line4_symbol_size,
bottom_font, bottom_font,
input_font, input_font,
menu_font, menu_font
mode_font_big,
mode_font_small
}; };
return new_layout;
memcpy(layout, &new_layout, sizeof(layout_t));
} }
static void _ui_drawLowBatteryScreen() static void _ui_drawLowBatteryScreen()
@ -1246,7 +1233,7 @@ void ui_init()
{ {
last_event_tick = getTick(); last_event_tick = getTick();
redraw_needed = true; redraw_needed = true;
layout = _ui_calculateLayout(); _ui_calculateLayout(&layout);
layout_ready = true; layout_ready = true;
// Initialize struct ui_state to all zeroes // Initialize struct ui_state to all zeroes
// This syntax is called compound literal // This syntax is called compound literal
@ -2477,7 +2464,7 @@ bool ui_updateGUI()
if(!layout_ready) if(!layout_ready)
{ {
layout = _ui_calculateLayout(); _ui_calculateLayout(&layout);
layout_ready = true; layout_ready = true;
} }
// Draw current GUI page // Draw current GUI page