Pular para o conteúdo

Especificação Técnica

Princípio de Design

O aplicativo é construído usando Flutter e aproveita o framework de gerenciamento de estado **Riverpod**. Ele interage com o hardware ELRS via uma API RESTful exposta pelo módulo WiFi integrado do dispositivo, garantindo comunicação de baixa latência e sincronização de estado em tempo real.

O sistema se comunica com o hardware usando os seguintes endpoints HTTP:

MétodoEndpointDescrição
GET/configRecupera a configuração atual do dispositivo em formato JSON.
POST/options.jsonAtualiza opções de tempo de execução modificáveis (SSID, Password, etc.).
POST/configAtualiza parâmetros de hardware essenciais e mapeamentos PWM.
POST/rebootAciona um reset de hardware para aplicar as mudanças.

O modelo RuntimeConfig aproveita a estrutura ExpressLRS 4.x, que separa os parâmetros em três nós principais:

  • settings: Identificadores de hardware e strings de versão somente leitura.
  • options: Preferências do usuário modificáveis e credenciais de rede.
  • config: Configurações de hardware de baixo nível (Protocolos, Arrays PWM).

Exemplo de estrutura 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}
]
}
}

O sistema emprega uma arquitetura reativa:

  • ConfigViewModel: Gerencia o estado da conexão em tempo real, lógica de heartbeat e descoberta de IP.
  • FlashingController: Orquestra downloads de firmware, patch binário local e o processo de upload XH-over-HTTP.

ElrsMappings.domains900 mapeia o índice do domínio regulatório de 900 MHz usado na API para seu rótulo legível por humanos:

IDRótuloDescrição
0AU915Austrália/Nova Zelândia 915MHz
1FCC915América do Norte 915MHz
2EU868Europeu 868MHz
3IN866Indiano 866MHz
4AU433Austrália 433MHz
5EU433Europeu 433MHz
6US433América do Norte 433MHz
7US433-WideAmérica do Norte Ampla 433MHz

O sistema implementa uma estratégia de persistência de duas camadas:

  • SharedPreferences: Utilizado via PersistenceService para dados não sensíveis, como SSIDs WiFi e preferências gerais do aplicativo.
  • FlutterSecureStorage: Usado para dados sensíveis, incluindo Binding Phrases e Senhas WiFi, garantindo criptografia no nível do sistema operacional.