Come astrarre da un display?

5

Sto costruendo un editor di testo incorporato costituito da una tastiera, un display LCD e un microcontrollore PIC32, da programmare in C. L'applicazione dovrebbe apparire, ad esempio, come l'editor di nano di GNU. Il display ha una dimensione di 40x16 caratteri.

Attualmente mi sto chiedendo quale sarebbe una buona astrazione dal display. Potremmo concettualizzare un terminale semplice come segue:

typedef struct {
    char* content;              // Current and past content
    void (*update)(Terminal);   // Update function
} Terminal;
void append(Terminal, char*);   // Append to content & execute update function
void discard(Terminal, int);    // Discard last n characters & execute update f.

Aggiungendo un puntatore a funzione al tipo Terminal , abbiamo fondamentalmente un modello e una vista. Il Terminal può essere controllato dalle funzioni append() e discard() . Con questo Terminal potremmo creare un terminale semplice con stdin e stdout .

Tuttavia, ciò non è sufficiente per un editor nano -like, in cui il testo può essere inserito e rimosso ovunque sullo schermo, non solo alla fine dei dati correnti.

Ora ho creato il seguente tipo:

typedef struct {
    unsigned short rows, columns,     // Screen size
            first_visible_row, first_visible_column,  // Left-top coordinates
            cursor_x, cursor_y;       // Cursor coordinates
    char* content;                    // Current and off-screen content
    void (*update)(Screen);           // Update function
} Screen;

Questo Screen tiene anche i contenuti fuori schermo, e la sua sezione visibile è determinata dalle sue coordinate in alto a sinistra. Ciò facilita lo scorrimento. Ma le funzioni per scrivere su questo schermo in una certa posizione sarebbero complicate, perché non esiste una relazione diretta tra una posizione in content e le sue coordinate nella visualizzazione effettiva.

Più facile lavorare con il tipo terrebbe una matrice di rows char array, per linee diverse sullo schermo. Quindi, content sarebbe un array di array di caratteri, ovvero char** content .

In sostanza, sto chiedendo se ci sono problemi con il mio approccio suggerito e se esiste un approccio più semplice .

Per riassumere, ecco alcuni dei requisiti per lo schermo:

  • Dovrebbe essere facile scorrere
  • Dovrebbe essere possibile aggiungere e rimuovere del testo in qualsiasi punto dello schermo
posta Keelan 19.08.2015 - 17:19
fonte

2 risposte

1

Potresti trarre vantaggio da un concetto di doppio buffer in cui memorizzi le righe più lunghe del display in una struttura più grande e un array 40 * 16 ingrandito che può spostarsi verso l'alto o verso il basso con gli eventi di visualizzazione. Fornire puntatori offset a ogni inizio di riga e la fine viene determinata in modo che le frecce si spostino su un'area più ampia. Limita lo spostamento a min max. Quindi tagliare e incollare è una copia del segmento riga per riga. Le copie dell'area multi linea sarebbero le più difficili da tracciare, potresti limitare a finestra per iniziare.

L'area del buffer dentro e fuori dal file è una singola scrittura alla fine delle operazioni.

Il display è un'operazione personalizzata per stringa.

    
risposta data 29.09.2015 - 03:16
fonte
0

È una buona idea avere un contenuto rappresentato come char* , perché è ciò che è concettualmente.

char** è cattivo come modello di contenuto, perché è legato a dimensioni dello schermo fisse e lunghezza della linea. Quindi ha senso solo come "modello di vista" dello schermo.

Per quanto riguarda le relazioni tra le coordinate del cursore e la posizione all'interno dell'array di contenuti, vedo due opzioni che dovrebbero funzionare entrambe bene:

  • ha una funzione che calcola un indice nel contenuto in base alle coordinate del cursore corrente e alla posizione dello schermo (non vedere perché sarebbe troppo difficile)

  • mantiene una matrice bidimensionale di indici nel contenuto, in cui ogni elemento corrisponde a una possibile posizione del cursore; dovrà essere aggiornato su ogni aggiornamento dello schermo

risposta data 05.09.2015 - 06:32
fonte

Leggi altre domande sui tag