Skip to main content

Menu Driver - Overview Page

Introduction

The List Page is a navigation-oriented page type within the menu driver. It provides a structured interface for selecting between multiple entries, typically representing:

  • subpages
  • actions
  • system modules

It is the primary mechanism for user-driven navigation within the menu system.

Purpose

The list page exists to answer:

“Where do you want to go next?”

It is not responsible for displaying system state in detail. Instead, it:

  • presents a bounded set of selectable entries
  • tracks the current selection
  • provides visual feedback for navigation
  • enables transitions to other pages

In practice, it functions as the entry point and routing layer of the UI.

Architectural Role

The list page sits at the intersection of:

  • input handling (user navigation)
  • menu structure (page hierarchy)
  • visual rendering (icons and labels)
[ Input ] → [ List Page ] → [ Page Transition ]

It does not consume system data (like overview pages), but rather controls flow through the interface.

Data Model

The list page is backed by the following state structure:

typedef struct {
  uint8_t num_entries;
  uint8_t selected_index;
  uint8_t entry_ids[MAX_LIST_ENTRIES];
  const uint8_t (*entry_icons)[MENU_DRIVER_ICON_BYTE_SIZE];
  bool first_render;
} page_list_state;

Entry Management

num_entries

Defines how many entries are currently active.

This value must not exceed MAX_LIST_ENTRIES.

entry_ids

Maps each visible entry to a logical identifier.

These IDs are typically used to:

  • determine which page to switch to
  • associate actions with selections

entry_icons

Pointer to icon data associated with each entry.

  • Icons are rendered alongside entries
  • Each icon is a fixed-size bitmap
  • Icons are stored in flash as static data

Selection State

selected_index

Indicates which entry is currently selected.

This is the central piece of state for navigation.

All rendering and transitions depend on this value.

Render Control

first_render

Indicates whether the page is being rendered for the first time.

Used to:

  • trigger full initial draw
  • avoid redundant rendering of static UI elements

Rendering Model

The list page uses a focused rendering strategy, rather than displaying all entries simultaneously.

Visible Entries

Only three entries are rendered at any time:

  • previous entry
  • current (selected) entry
  • next entry

This creates a scrolling effect without requiring full list rendering.

Rendering Optimization

The only expensive draw of the list page is the initial one which draws the selection border, all initial entries (both icons and names).

After that the only thing that gets redrawn are the icons and the texts. There is also heavier optimization done for minimal font redrawing by keeping track of previously rendered text widths.

This is critical for SPI-driven displays, where bandwidth is limited.

Interaction Model

The list page assumes an abstract input interface:

menu_input (*get_input)(void);

The page does not interpret physical inputs directly. Instead, it operates on abstract input values, allowing it to remain independent of hardware specifics.

Expected interactions include:

  • move selection up
  • move selection down
  • confirm selection

Relationship to Menu System

The list page enables hierarchical navigation through:

  • entry_ids → target page identifiers
  • parent_id (in menu_page_t) → upward navigation

This allows the menu system to behave as a tree of pages, rather than a flat structure.

Performance Considerations

The list page is designed for constrained environments:

  • partial rendering minimizes SPI usage
  • static memory avoids allocation overhead
  • limited visible entries reduce draw complexity