Considerazioni sulla progettazione per il menu di configurazione sul sistema incorporato

7

Sto lavorando su un sistema embedded che si interfaccia con l'utente con diversi pulsanti e un piccolo display grafico.

Come nota a margine: poiché sono su un sistema embedded, vorrei evitare il più possibile l'allocazione dinamica della memoria. Qualcosa come std :: vector non è nemmeno disponibile.

Ho bisogno di implementare un menu di configurazione usando una classica struttura di menu annidata come questa:

Level A Node 1
 -> Level B Node 1
    -> Level C Node 1
 -> Level B Node 2
 -> Level B Node 3
Level A Node 2
Level A Node 3

Sono molto incerto sull'approccio migliore qui. Ho letto su diversi modi per avvicinarmi a qualcosa del genere come usare il Pattern Composito. Tuttavia, mi imbatto sempre in qualcosa che sembra buono "sulla carta", ma sembra essere un disastro da implementare.

Il mio pensiero generale è di avere qualcosa una classe MenuNode che conosca i suoi sub-nodi e il nodo genitore al momento dell'inizializzazione. Una classe Menu potrebbe gestire la navigazione e l'elaborazione del nodo. Ovviamente, ogni MenuNode deve eseguire / implementare comportamenti specifici come:

  • Segnala al Menu cosa vuole visualizzare (il layout / posizionamento effettivo non dovrebbe essere il problema di MenuNode )
  • Reagire all'input dell'utente (come un pulsante premere per aumentare / diminuire / cambiare un valore)
  • Accedi al valore effettivo di interesse (risiedono in una classe ApplicationSettings )

Quale sarebbe il modo migliore per implementarlo?

  1. Utilizza una classe di base (astratta) MenuNode e crea una sottoclasse per OGNI voce di nodo di menu. Durante l'inizializzazione potrei fornire un puntatore a ApplicationSettings o altre dipendenze di cui potrebbe aver bisogno. In qualche modo sembra sbagliato creare 10 classi derivate in cui ciascuna sarà istanziata una sola volta.

  2. Utilizza la stessa classe MenuNode per ogni nodo e implementa la funzionalità tramite i callback alle funzioni gratuite. Da quello che ho letto è piuttosto comune "accoppiare" funzioni libere con oggetti. Tuttavia, sembra che complicherebbe le cose. Per ogni membro ci potrebbe essere, come ReportButtonPress () o qualcosa del genere, dovrei fornire il callback per l'effettiva implementazione durante l'inizializzazione.

  3. Sono sicuro che c'è qualcosa che sto trascurando qui.

posta Rev1.0 30.11.2016 - 11:09
fonte

1 risposta

1

Vai con l'opzione 1, crea staticamente una classe per elemento dell'interfaccia utente per associare eventi di input alle azioni. In questo modo l'implementazione NON assegnerà memoria al runtime.

Se il tuo compilatore C ++ supporta le chiusure lambda, questo è un modo ordinato per associare gli eventi di input alle azioni nel tuo codice di configurazione del menu.

Con tutto ciò che gli strumenti di verifica del codice statico hanno la possibilità di rilevare errori.

Ignora i suggerimenti per avere un "formato di file di menu" e crea i tuoi strumenti. Non sei nel business della vendita di librerie di toolkit menu, quindi non farlo.

Dici di avere un piccolo display grafico ... È un grafico (display bitmap?) Se non si utilizza un kit di strumenti GUI, chiedersi perché no? Se proprio non andrà bene, abbastanza giusto. QT incorporato o qualcosa di più leggero potrebbe farti risparmiare un sacco di codice del widget della GUI soggetta a errori.

    
risposta data 20.06.2017 - 01:51
fonte

Leggi altre domande sui tag