GPS Device
Loading...
Searching...
No Matches
Menu Internal Helpers

Functions

static ERR_te menu_selectable_run (MENU_HANDLE_ts *menu_handle)
 Renders a MENU_TYPE_SELECTABLE menu to the display.
static ERR_te menu_dataview_run (MENU_HANDLE_ts *menu_handle)
 Renders a MENU_TYPE_DATA_VIEW menu to the display.

Detailed Description

Function Documentation

◆ menu_selectable_run()

ERR_te menu_selectable_run ( MENU_HANDLE_ts * menu_handle)
static

Renders a MENU_TYPE_SELECTABLE menu to the display.

Clamps the selection index to valid bounds, updates the visible window and highlight line based on scroll direction, draws each visible option string, inverts the highlight line to show selection, and draws the title.

The display supports 7 option lines (lines 1–7) plus a title line (line 8). When the option count exceeds 7, a sliding window tracks which options are currently visible.

Parameters
[in,out]menu_handlePointer to the menu handle to render.
Returns
  • ERR_OK always

Definition at line 445 of file menu.c.

445 {
446 // Clamp selected item if possible boundaries exceeded
447 if(menu_handle->selected_option < 0) {
448 menu_handle->selected_option = 0;
449 }
450 else if(menu_handle->selected_option >= menu_handle->options_count) {
451 menu_handle->selected_option = menu_handle->options_count - 1;
452 }
453
454 // Items in options list is greater than 7, thus shifting of the currently showed items is needed
455 if(menu_handle->options_count > 7) {
456 // If selected item is outside (positive direction) of the currently showed items list shift
457 // the window by one in positive direction
458 if(menu_handle->selected_option > menu_handle->last_visible_option) {
459 menu_handle->first_visible_option++;
460 menu_handle->last_visible_option++;
461 }
462 // Opposite direction
463 else if (menu_handle->selected_option < menu_handle->first_visible_option) {
464 menu_handle->first_visible_option--;
465 menu_handle->last_visible_option--;
466 }
467
468 // If selection reached last visible item, shift selection in positive direction
469 if(menu_handle->selected_option == menu_handle->last_visible_option) {
470 menu_handle->line_to_highlight = 7;
471 }
472 // If selection reached first item, shift selection in negative direction
473 else if(menu_handle->selected_option == menu_handle->first_visible_option) {
474 menu_handle->line_to_highlight = 1;
475 }
476 // If selection is in-between, change selection
477 else {
478 // In positive direction
479 if(menu_handle->selected_option > menu_handle->prev_selected_option) {
480 menu_handle->line_to_highlight = menu_handle->selected_option + 1;
481 }
482 // In negative direction
483 else if(menu_handle->selected_option < menu_handle->prev_selected_option) {
484 menu_handle->line_to_highlight = 7 - (menu_handle->last_visible_option - menu_handle->selected_option);
485 }
486 }
487 menu_handle->prev_selected_option = menu_handle->selected_option;
488 }
489 // Shifting of the currently showed items is not needed
490 else {
491 // Select first item in the list
492 if(menu_handle->selected_option == menu_handle->first_visible_option) {
493 menu_handle->line_to_highlight = 1;
494 }
495 // Select next item in the list (positive direction)
496 else if(menu_handle->selected_option > menu_handle->prev_selected_option) {
497 menu_handle->line_to_highlight = menu_handle->selected_option + 1;
498 }
499 // Select next item in the list (negative direction)
500 else if(menu_handle->selected_option < menu_handle->prev_selected_option) {
501 menu_handle->line_to_highlight = menu_handle->options_count - (menu_handle->last_visible_option - menu_handle->selected_option);
502 }
503 else if(menu_handle->selected_option == menu_handle->last_visible_option) {
504 menu_handle->line_to_highlight = menu_handle->selected_option + 1;
505 }
506 menu_handle->prev_selected_option = menu_handle->selected_option;
507 }
508
509 // Draw item list on the screen
510 uint8_t line_counter = 0;
511 for(uint8_t i = menu_handle->first_visible_option; i <= menu_handle->last_visible_option; i++) {
512 line_counter++;
513 ssd1309_draw_text(menu_handle->options[i],
514 get_str_len(menu_handle->options[i]), line_counter, false);
515 }
516
517 // Simulate selection by inverting the value of pixels
518 ssd1309_invert_line(menu_handle->line_to_highlight, false);
519
520 ssd1309_draw_text(menu_handle->title, 16, 8, false);
521
522 return ERR_OK;
523}
uint32_t get_str_len(char const *str)
Returns the length of a string, excluding the null terminator.
Definition common.c:22
@ ERR_OK
Definition err.h:36
ERR_te ssd1309_invert_line(uint8_t line, bool force)
Inverts all pixels in a single display line in the framebuffer.
Definition ssd1309.c:924
ERR_te ssd1309_draw_text(char const *text, uint8_t text_len, uint8_t line, bool force)
Draws a text string into the framebuffer at the specified line.
Definition ssd1309.c:806
int8_t last_visible_option
Definition menu.c:66
int8_t first_visible_option
Definition menu.c:63
char title[SSD1309_MAX_CHARS_IN_LINE]
Definition menu.c:33
int8_t selected_option
Definition menu.c:57
int8_t prev_selected_option
Definition menu.c:60
uint8_t options_count
Definition menu.c:54
char options[CONFIG_MENU_MAX_OPTIONS][SSD1309_MAX_CHARS_IN_LINE]
Definition menu.c:36
uint8_t line_to_highlight
Definition menu.c:48
Here is the call graph for this function:
Here is the caller graph for this function:

◆ menu_dataview_run()

ERR_te menu_dataview_run ( MENU_HANDLE_ts * menu_handle)
static

Renders a MENU_TYPE_DATA_VIEW menu to the display.

Behaves like menu_selectable_run for window and highlight tracking, but renders alternating rows: even-indexed rows display the static option label, odd-indexed rows display the live value returned by MENU_CFG_ts::get_value_fn for the corresponding option index.

Parameters
[in,out]menu_handlePointer to the menu handle to render.
Returns

Definition at line 540 of file menu.c.

540 {
541 ERR_te err;
542
543 // Clamp selected item if possible boundaries exceeded
544 if(menu_handle->selected_option < 0) {
545 menu_handle->selected_option = 0;
546 }
547 else if(menu_handle->selected_option >= menu_handle->options_count) {
548 menu_handle->selected_option = menu_handle->options_count - 1;
549 }
550
551 // Items in options list is greater than 7, thus shifting of the currently showed items is needed
552 if(menu_handle->options_count > 7) {
553 // If selected item is outside (positive direction) of the currently showed items list shift
554 // the window by one in positive direction
555 if(menu_handle->selected_option > menu_handle->last_visible_option) {
556 menu_handle->first_visible_option++;
557 menu_handle->last_visible_option++;
558 }
559 // Opposite direction
560 else if (menu_handle->selected_option < menu_handle->first_visible_option) {
561 menu_handle->first_visible_option--;
562 menu_handle->last_visible_option--;
563 }
564
565 // If selection reached last visible item, shift selection in positive direction
566 if(menu_handle->selected_option == menu_handle->last_visible_option) {
567 menu_handle->line_to_highlight = 7;
568 }
569 // If selection reached first item, shift selection in negative direction
570 else if(menu_handle->selected_option == menu_handle->first_visible_option) {
571 menu_handle->line_to_highlight = 1;
572 }
573 // If selection is in-between, change selection
574 else {
575 // In positive direction
576 if(menu_handle->selected_option > menu_handle->prev_selected_option) {
577 menu_handle->line_to_highlight = menu_handle->selected_option + 1;
578 }
579 // In negative direction
580 else if(menu_handle->selected_option < menu_handle->prev_selected_option) {
581 menu_handle->line_to_highlight = 7 - (menu_handle->last_visible_option - menu_handle->selected_option);
582 }
583 }
584 menu_handle->prev_selected_option = menu_handle->selected_option;
585 }
586 // Shifting of the currently showed items is not needed
587 else {
588 // Select first item in the list
589 if(menu_handle->selected_option == menu_handle->first_visible_option) {
590 menu_handle->line_to_highlight = 1;
591 }
592 // Select next item in the list (positive direction)
593 else if(menu_handle->selected_option > menu_handle->prev_selected_option) {
594 menu_handle->line_to_highlight = menu_handle->selected_option + 1;
595 }
596 // Select next item in the list (negative direction)
597 else if(menu_handle->selected_option < menu_handle->prev_selected_option) {
598 menu_handle->line_to_highlight = menu_handle->options_count - (menu_handle->last_visible_option - menu_handle->selected_option);
599 }
600 else if(menu_handle->selected_option == menu_handle->last_visible_option) {
601 menu_handle->line_to_highlight = menu_handle->selected_option + 1;
602 }
603 menu_handle->prev_selected_option = menu_handle->selected_option;
604 }
605
606 // Draw item list on the screen
607 uint8_t line_counter = 0;
608 uint8_t real_counter = 0;
609
610 if(menu_handle->first_visible_option > 0)
611 real_counter = menu_handle->first_visible_option / 2;
612
613 for(uint8_t i = menu_handle->first_visible_option; i <= menu_handle->last_visible_option; i++) {
614 line_counter++;
615 // Counter is at option label row
616 if(i % 2 == 0) {
617 ssd1309_draw_text(menu_handle->options[real_counter],
618 get_str_len(menu_handle->options[real_counter]), line_counter, false);
619 }
620 // Counter is at live value row
621 else {
622 char *value;
623
624 err = menu_handle->get_value_fn(real_counter, &value);
625 if(err != ERR_OK) {
627 }
628
629 ssd1309_draw_text(value,
630 get_str_len(value),
631 line_counter, false);
632
633 real_counter++;
634 }
635 }
636
637 // Simulate selection by inverting the value of pixels
638 ssd1309_invert_line(menu_handle->line_to_highlight, false);
639
640 ssd1309_draw_text(menu_handle->title, 16, 8, false);
641
642 return ERR_OK;
643}
ERR_te
Standard return type used by all public API functions.
Definition err.h:35
@ ERR_DATA_ACQUISITION_FAILURE
Definition err.h:47
ERR_te(* get_value_fn)(uint8_t index, char **value_o)
Definition menu.c:45
Here is the call graph for this function:
Here is the caller graph for this function: