Centro di controllo Smarthome con ArduiTouch parte 4 - struttura dei dati per la gestione del centro di controllo

In questo articolo vorrei spiegare in dettaglio la struttura dei dati utilizzata per gestire le attrezzature e i valori misurati. Tutte le definizioni di struttura sono disponibili nel file di libreria AT_Database.h.

Quando un dispositivo viene registrato, le sue caratteristiche vengono memorizzate nell'elenco dei dispositivi. L'elenco dei dispositivi è una matrice di blocchi di dati con la seguente struttura:

Definizione di _Device typedef
struttura ATDEVICE
uint8_t attivo : 0;        il dispositivo definito qui esiste
uint8_t servizio : 0;      0 - Preparazione ESP-Now se altri servizi sono successivi
implemented
uint8_t id[6] : .0,0,0,0; Indirizzo MAC del dispositivo
uint16_t devicebits - 0;  Campo di bit con informazioni sul dispositivo e la trasmissione dei dati
Il nome della stringa è "";         Nome del dispositivo
Stringa ultima: "";         Timestamp per l'ultimo trasferimento di dati riuscito
};

Il numero di dispositivo funge da indice in questo array. La classe definisce AT_Database un elenco di dispositivi per 32 dispositivi. Al fine di memorizzare i datrs dispositivo in modo permanente, sono memorizzati nel file system SPIF nel flash del ESP32.

Le seguenti funzioni della classe vengono utilizzate per utilizzare l'elenco dei dispositivi:

  • booleano readDevices (Stringa fileName); Legge l'elenco dei dispositivi da un file con nomi Filename spiFFS. Restituisce false se si è verificato un errore.
  • booleano writeDevices (Stringa fileName); Scrive l'elenco dei dispositivi in un file con nomi Filename spiFFS. Restituisce false se si è verificato un errore.
  • booleano clearDevices (Stringa fileName); Elimina tutti i dispositivi e salva il risultato in Filename spiFFS. Restituisce false se si è verificato un errore.
  • int16_t findDevice(id uint8_t[6]); Questa funzione trova un dispositivo nell'elenco dei dispositivi Id (indirizzo MAC). La funzione restituisce l'indice al numero di dispositivo del dispositivo. -1 indica che il dispositivo non è presente nell'elenco dei dispositivi.
  • Stringa getDeviceId(uint8_t dispositivo); Restituisce l'ID del dispositivo con il numero di dispositivo Dispositivo Indietro.

Se vengono rilevati valori misurati per un dispositivo registrato, i valori vengono archiviati nella tabella dei risultati. La tabella dei risultati è costituita da elementi con la struttura seguente:

_Structure typedef per l'archiviazione dei valori misurati
struct ATCURVALUES
uint8_t valido;  La struttura contiene un valore misurato valido
passo uint8_t;   viene utilizzato per salvare le fasi di elaborazione
tipo di uint8_t;   Il tipo di valore misurato memorizzato
uint8_t unità;   L'unità del valore misurato immagazzinato
uint8_t valore[4]; quattro byte con lettura em, o intero a 32 bit o float
a seconda del tipo. Il tipo booleano utilizza solo il primo byte
};

La classe AT_Database alloca spazio per una tabella dei risultati con 256 voci (32 dispositivi con un massimo di otto canali ciascuno). L'indice di questa tabella viene calcolato in base al numero di dispositivo e al numero di canale.

Indice , numero di dispositivo , 32 , numero di canale

Le seguenti funzioni del AT_Database Klkasse funzionano con la tabella dei risultati:

  • void setResult(indice uint8_t, dati ATDATAPACKET); Questa funzione aggiorna i dati in corrispondenza dell'indice con i valori nella struttura dei dati. La struttura ATDATAPACKET è stata definita nella libreria ATMessageBuffer e viene utilizzata anche per il trasferimento dei dati.
  • ATCURVALUES getResult(indice uint16_t); Questa funzione restituisce la struttura descritta in precedenza per il risultato e l'indice di posizione nella tabella dei risultati.
  • void setStep(passaggio uint8_t, indice uint16_t); La fase di elaborazione per il risultato in corrispondenza dell'indice nella tabella dei risultati viene impostata sul passaggio del valore.
  • Stringa getValueString(indice uint16_t, precisione uint8_t, unità di utilizzo booleana ); String getValueString(uint16_t index, uint8_t precision, boolean useunit ); Restituisce il valore del risultato nella posizione dell'indice nella tabella dei risultati come stringa. Il parametro precision specifica il numero di posizioni decimali per i valori float.Se il parametro useunit è true, il nome dell'unità viene aggiunto alla stringa.
  • uint8_t getBooleanValue (indice uint16_t);  Restituisce il valore booleano del risultato nella posizione dell'indice come 0 o 1. Utile solo per il tipo booleano.
  • booleano isValueOutput (indice uint16_t);  Restituisce vero se il tipo di risultato nella posizione dell'indice è un tipo di output, ovvero contiene dati inviati dal centro di controllo al dispositivo. (ad es. interruttore).
  • booleano isSwitchOut (indice uint16_t);  Simile alla funzione precedente, restituisce true solo se è un interruttore:
  • booleano isValueZero (indice uint16_t);  Restituisce vero se il valore del risultato all'indice è esattamente 0.
  • void toggleResult (indice uint16_t);  Commuta il risultato sull'indice vo 0 su 1 o viceversa. Utile solo per il tipo booleano.
  • int8_t getResponse (dispositivo int16_t, buffer uint8_t *, dimensione uint8_t *);Esamina tutti i risultati con un tipo di output per il dispositivo del dispositivo e riempie un buffer buffer con un pacchetto di messaggi finito, che può quindi essere trasferito al dispositivo. La dimensione del parametro contiene la dimensione massima del buffer e dopo che la funzione restituisce la dimensione del buffer effettivamente utilizzata. Il valore restituito è il numero di pacchetti di dati trovati o -1 se la dimensione del buffer era troppo piccola.

Un'altra struttura 3 in questa libreria viene utilizzata per controllare la visualizzazione dei risultati sul display. C'è un elenco di pagine. Ogni pagina contiene 8 voci del widget con la seguente struttura:

typedef // Definizione di un widget Diosplay
struct ATDISPLAYWIDGET {
uint16_t fonte; // Indice sul risultato assegnato
uint8_t status; // Stato 0 = non utilizzato, 1 = usato, 2 = segnaposto, 3 = nascosto
dimensione uint8_t; // dimensione del widget 0 = 240x30,1 = 240x60 a sinistra
// 2 = 120x60 a destra 3 = 120x60
tipo uint8_t; // tipo di widget, attualmente solo 0 = semplice
uint16_t bgcolor; // colore di sfondo normale
uint16_t bgcolorOn; // colore di sfondo per i pulsanti quando è attivo
uint16_t fontcolor; // colore del carattere
uint8_t image; // indice di un'immagine (non ancora utilizzato)
precisione uint8_t; // Numero di cifre decimali per i valori misurati
String label = ""; // lettering
};

La classe AT_Database riserva lo spazio per 32 pagine con un massimo di otto widget ciascuna. Le seguenti funzioni funzionano con questa tabella: #

  • int16_t getFreeSlot (pagina uint8_t, dimensione uint8_t);  Questa funzione restituisce l'indice per un widget sulla pagina con le dimensioni, che ha ancora spazio o -1 se non c'è spazio sulla pagina.
  • ATDISPLAYPAGE getPage (pagina uint8_t);  Restituisce un elenco di tutti i widget sulla pagina.

La funzione

booleano registerDev (String deviceId, AT_MessageBuffer msg);

registra un dispositivo con ID ID dispositivo se non è stato ancora registrato. Il parametro msg contiene una struttura AT_Messagebuffer con i dati che sono stati ricevuti l'ultima volta da questo dispositivo. Per ogni canale di questo dispositivo, viene inserita una voce nella tabella dei risultati e viene cercato nello spazio un widget di visualizzazione nella prima pagina della pagina possibile. La dimensione del widget è impostata su 30 x 240 pixel e tutte le impostazioni sono riempite con valori predefiniti. Ciò garantisce che un dispositivo appena registrato possa visualizzare tutti i suoi canali. Nelle versioni successive del centro di controllo, questi parametri di visualizzazione possono quindi essere modificati individualmente mediante un'impostazione.

Quindi penso che sia abbastanza con la teoria, ma per me è importante che tu capisca anche la struttura del sistema al fine di trovare gli errori più facilmente e possibilmente sviluppare estensioni tu stesso.

Projekte für fortgeschritteneCasa intelligente

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert

Post di blog consigliati

  1. Installa ESP32 ora dal gestore del consiglio di amministrazione
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - Programmazione ESP tramite WLAN