Salta ai contenuti

Specifiche Tecniche

Principio di Progettazione

L'applicazione è sviluppata utilizzando Flutter e sfrutta il framework di gestione dello stato Riverpod. Interagisce con l'hardware ELRS tramite un'API RESTful esposta dal modulo WiFi integrato del dispositivo, garantendo una comunicazione a bassa latenza e la sincronizzazione dello stato in tempo reale.

Il sistema comunica con l’hardware utilizzando i seguenti endpoint HTTP:

MetodoEndpointDescrizione
GET/configRecupera la configurazione corrente del dispositivo in formato JSON.
POST/options.jsonAggiorna le opzioni di runtime modificabili (SSID, Password, ecc.).
POST/configAggiorna i parametri hardware principali e le mappature PWM.
POST/rebootAttiva un reset hardware per applicare le modifiche.

Il modello RuntimeConfig sfrutta la struttura ELRS 4.x, che separa i parametri in tre nodi principali:

  • settings: Identificatori hardware di sola lettura e stringhe di versione.
  • options: Preferenze utente modificabili e credenziali di rete.
  • config: Configurazioni hardware di basso livello (Protocolli, Array PWM).

Esempio di struttura JSON:

{
"product_name": "Test RX",
"settings": {
"version": "1.0.0",
"module-type": "RX"
},
"options": {
"bindPhrase": "example",
"wifi-ssid": "SSID",
"domain": 1
},
"config": {
"serial-protocol": 0,
"pwm": [
{"channel": 0, "mode": 5}
]
}
}

Il sistema impiega un’architettura reattiva:

  • ConfigViewModel: Gestisce lo stato della connessione in tempo reale, la logica dell’heartbeat e la scoperta IP.
  • FlashingController: Orchestra i download del firmware, il patching binario locale e il processo di caricamento XH-over-HTTP.

ElrsMappings.domains900 mappa l’indice del dominio normativo a 900 MHz utilizzato nell’API alla sua etichetta leggibile dall’uomo:

IDEtichettaDescrizione
0AU915Australia/Nuova Zelanda 915MHz
1FCC915Nord America 915MHz
2EU868Europa 868MHz
3IN866India 866MHz
4AU433Australia 433MHz
5EU433Europa 433MHz
6US433Nord America 433MHz
7US433-WideNord America Wide 433MHz

Il sistema implementa una strategia di persistenza a doppio livello:

  • SharedPreferences: Utilizzato tramite PersistenceService per dati non sensibili come WiFi SSIDs e preferenze generali dell’app.
  • FlutterSecureStorage: Utilizzato per dati sensibili, inclusi Binding Phrases e WiFi Passwords, garantendo la crittografia a livello di sistema operativo.