config-dacc e o backend de configuracao da DACC Station. Ele fornece uma API C++ para que a UI controle audio, video, rede, bateria e Bluetooth sem depender diretamente de comandos de terminal ou de parsing de texto bruto.
O objetivo deste modulo e transformar operacoes de sistema Linux em contratos previsiveis, tipados e seguros para a interface grafica.
O modulo e responsavel por:
- executar comandos de sistema com controle de erro;
- detectar ferramentas disponiveis;
- ler informacoes simples do sistema, como bateria;
- listar e selecionar dispositivos de audio;
- listar monitores, resolucoes e escala;
- alterar resolucao e escala;
- listar redes Wi-Fi;
- detectar conexao Wi-Fi e conexao cabeada;
- conectar, desconectar e ligar/desligar Wi-Fi;
- consultar estado do Bluetooth;
- escanear, parear, confiar, conectar, desconectar e remover dispositivos Bluetooth;
- normalizar resultados de erro com
system_result.
Ele nao deve:
- renderizar UI;
- decidir layout visual;
- iniciar jogos;
- manter estado visual de telas;
- expor saida bruta de comandos como contrato principal.
include/config-dacc/functions.hpp: contrato publico consumido pela UI.include/config-dacc/ErrorCodes.hpp: constantes dos codigos estaveis de erro.functions.hpp: wrapper de compatibilidade para includes antigos.ConfigCommand.cpp: execucao de comandos e utilitarios basicos do sistema.SystemControl.cpp: tempo e leitura de bateria.Capabilities.cpp: snapshot de capacidades disponiveis no ambiente.AudioControl.cpp: volume e dispositivos de audio.DisplayControl.cpp: sessao grafica, resolucao, escala e brilho.NetworkControl.cpp: Wi-Fi, Ethernet e status de conexao.BluetoothControl.cpp: API publica de Bluetooth e regras de alto nivel.BluetoothInternal.cpp: sessoesbluetoothctl, parser, polling e funcoes auxiliares.BluetoothInternal.hpp: contrato interno do modulo Bluetooth.include/config-dacc/: contrato publico, parsers testaveis e includes compartilhados.Makefile: build da biblioteca estatica e testes.tests/test_bluetooth_parser.cpp: testes do parser de eventos Bluetooth.tests/test_audio_parser.cpp: testes de parsing dewpctl,pactl,aplaye volume.tests/test_display_parser.cpp: testes de parsing dexrandrewlr-randr.
Compilar somente o backend:
make -C config-daccRodar testes do backend:
make -C config-dacc testCompilar o utilitario de diagnostico de capacidades:
make -C config-dacc capabilities-smoke
./config-dacc/tests/bin/capabilities_smokeLimpar artefatos:
make -C config-dacc cleanO build gera libdacc-config.a, linkado pela UI.
Todo contrato publico fica em include/config-dacc/functions.hpp. Esse arquivo e a fronteira entre a UI e o backend.
system_result e o contrato unico para operacoes de configuracao que podem falhar:
struct system_result {
bool ok = false;
std::string mensagem;
std::string codigo;
std::string detalhes;
};Campos:
ok:truequando a operacao terminou com sucesso.mensagem: mensagem pronta para UI ou log de alto nivel.codigo: codigo estavel, usado para diferenciar tipos de falha.detalhes: saida bruta, stderr/stdout ou contexto tecnico.
Por que foi unificado:
- audio, video, Wi-Fi e Bluetooth tinham structs duplicadas com os mesmos campos;
- um contrato unico reduz repeticao e facilita evolucao;
- a UI pode ter tratamento uniforme para sucesso, erro e fallback;
- logs e mensagens ficam consistentes entre modulos.
Regras de uso:
- novas operacoes mutaveis devem retornar
system_result; codigodeve ser estavel e legivel;mensagemdeve ser compreensivel para usuario/desenvolvedor;detalhesdeve conter informacao tecnica suficiente para debug;- funcoes antigas que retornam
boolpodem existir por compatibilidade, mas a UI deve preferir_result.
command_result representa o resultado bruto de um comando:
struct command_result {
bool ok = false;
int exit_code = -1;
std::string stdout_output;
std::string stderr_output;
std::string mensagem;
};Ele e usado internamente para converter saida de ferramentas Linux em system_result ou em structs especializadas.
O backend deve detectar capacidades em tempo de execucao, nao assumir perfis fixos de hardware. Use obter_capacidades_sistema() para saber se recursos como audio_select, display_info, brightness e network estao realmente disponiveis. Esse snapshot consulta os contratos _result dos modulos principais em vez de apenas verificar se comandos existem.
Ordem de fallback atual:
- audio:
wpctl, depoispactl, depoisaplayapenas para listagem; - volume:
wpctl, depoispactl, depoisamixer; - display:
wlr-randrem Wayland,xrandrem X11, com fallback quando possivel; - brilho:
brightnessctl, depois/sys/class/backlight. - rede:
nmcli, com diferenca entre NetworkManager ausente, Wi-Fi desligado e scan vazio.
Quando uma capacidade faltar, retorne system_result com codigo estavel, como audio_subsystem_missing, display_subsystem_missing, brightness_not_supported ou network_manager_missing.
Os codigos padronizados ficam centralizados em include/config-dacc/ErrorCodes.hpp, no namespace config_dacc::errors. Ao adicionar novos retornos _result, prefira reutilizar essas constantes em vez de repetir strings diretamente nos controladores.
Implementacao: ConfigCommand.cpp e SystemControl.cpp.
Verifica se um comando esta disponivel no PATH.
Como funciona:
- le a variavel de ambiente
PATH; - percorre cada diretorio;
- monta o caminho completo;
- verifica se o arquivo existe e e executavel.
Por que existe:
- evita tentar usar ferramentas ausentes;
- permite escolher fallback;
- ajuda a gerar erros mais claros.
Executa um comando textual e retorna a saida como string.
Uso esperado:
- comandos simples e controlados;
- consultas internas onde nao ha entrada de usuario.
Observacao:
- por receber string de comando, pode envolver shell;
- para argumentos variaveis, prefira
exec_command_args_result.
Executa um comando simples e retorna command_result.
Como funciona:
- captura stdout e stderr;
- preserva codigo de saida;
- preenche
okconforme sucesso do comando.
Uso esperado:
- leituras de estado;
- chamadas onde shell e aceitavel;
- comandos sem argumentos vindos diretamente da UI.
Executa um comando com argumentos separados.
Como funciona:
- usa processo filho;
- chama
execvp; - passa argumentos como vetor, sem concatenar shell;
- captura saidas;
- interpreta status de saida.
Por que e importante:
- evita injecao de shell;
- lida melhor com SSIDs, nomes de conexao e caminhos com espacos;
- deve ser a escolha padrao para comandos com dados dinamicos.
Retorna tempo monotonicamente crescente em milissegundos.
Uso:
- timeouts;
- comparacao de intervalos;
- tarefas assicronas ou polling.
Le o nivel de bateria do sistema.
Como funciona:
- tenta ler
/sys/class/power_supply/BAT0/capacity; - retorna valor percentual quando disponivel;
- retorna
-1quando nao ha bateria ou a leitura falha.
Por que retorna -1:
- desktops e algumas Stations podem nao ter bateria;
- a UI pode esconder o indicador ou mostrar estado desconhecido;
- falha de bateria nao deve derrubar a interface.
Implementacao: AudioControl.cpp.
enum class audio_backend {
wpctl,
pactl,
alsa
};
struct device_audio {
int id = -1;
std::string backend_id;
std::string descricao;
bool padrao = false;
audio_backend backend = audio_backend::wpctl;
};Campos:
id: identificador numerico usado por compatibilidade com chamadas antigas.backend_id: identificador real do backend; nopactl, e o nome do sink.descricao: nome legivel do dispositivo.padrao: indica se e o dispositivo atual.backend: ferramenta que originou o dispositivo (wpctl,pactloualsa).
Aumenta o volume em um incremento padrao.
Uso:
- atalhos de UI;
- controles fisicos;
- ajustes simples sem abrir a tela completa.
Diminui o volume em um incremento padrao.
Mesma finalidade de aumentar_volume, mas no sentido inverso.
Use estas funcoes quando a chamada precisar reagir a falhas:
system_result aumentar_volume_result();system_result diminuir_volume_result();system_result definir_volume_result(int valor_int);system_result obter_volume_atual_result(int& volume).system_result alternar_mudo_result();system_result obter_mudo_result(bool& mudo).
Elas retornam audio_subsystem_missing quando nenhuma ferramenta compativel esta disponivel.
As funcoes antigas aumentar_volume(), diminuir_volume() e definir_volume() apenas delegam para as variantes _result.
Fallbacks:
- volume/mudo:
wpctl, depoispactl, depoisamixer; wpctl get-volumedetecta mudo por[MUTED];pactl get-sink-mutedetectaMute: yes/no;amixer get Masterdetecta[off]ou[on].
Consulta o volume atual.
Como funciona:
- tenta ler do sistema de audio disponivel;
- interpreta saidas de ferramentas como
wpctl,pactlouamixer; - converte para percentual.
Por que o parsing e no backend:
- saidas variam por ferramenta;
- a UI so precisa de um numero;
- erros de ambiente ficam isolados.
Define o volume em percentual.
Comportamento:
- recebe valor inteiro;
- limita a faixa esperada;
- tenta aplicar usando a ferramenta disponivel.
Estratégia:
- prioriza ferramentas modernas quando possivel;
- usa fallback para manter compatibilidade com maquinas diferentes.
Lista saidas de audio disponiveis.
Como funciona:
- consulta o sistema de audio;
- identifica dispositivos e descricoes;
- marca o dispositivo padrao.
Uso na UI:
- preencher a lista de dispositivos na janela Audio/Video;
- permitir troca de saida sem expor comandos ao usuario.
Contrato preferencial para listagem de audio.
Possui cache curto de aproximadamente 2 segundos para evitar chamadas repetidas a wpctl, pactl ou aplay em atualizacoes frequentes da UI.
Retornos comuns:
ok: lista preenchida.audio_subsystem_missing:wpctl,pactleaplayausentes.audio_no_devices: ferramentas existem, mas nenhum dispositivo foi encontrado ou parseado.
Seleciona dispositivo de audio e ignora detalhes do resultado.
Motivo de existir:
- compatibilidade com chamadas antigas;
- uso simples quando a chamada nao precisa exibir erro.
Preferencia:
- em UI nova, use
selecionar_dispositivo_audio_result(const device_audio&).
Seleciona dispositivo de audio e retorna sucesso/falha detalhado.
Essa variante existe por compatibilidade: ela lista os dispositivos atuais, procura pelo id numerico e entao delega para a selecao por device_audio.
Seleciona usando backend e backend_id.
Retornos comuns:
ok: dispositivo definido.audio_select_failed: falha ao definir dispositivo.audio_subsystem_missing:wpctlepactlindisponiveis.audio_select_unsupported: dispositivo veio de backend somente-listagem, como ALSA.
Uso na UI:
- aplicar alteracoes e mostrar mensagem clara em caso de erro.
Funcao auxiliar para debug via terminal.
Nao deve ser usada como fonte de dados da UI.
Implementacao: DisplayControl.cpp.
struct DisplayMode {
int width;
int height;
float refresh_rate;
bool is_current;
};
struct DisplayOutput {
std::string name;
std::string backend_id;
bool connected;
std::vector<DisplayMode> modes;
DisplayMode current_mode;
float current_scale;
display_backend backend;
};DisplayMode descreve uma resolucao/taxa disponivel. DisplayOutput descreve uma saida fisica/logica de video e guarda o backend que produziu a informacao (xrandr ou wlr-randr).
Detecta o tipo de sessao grafica.
Fontes comuns:
XDG_SESSION_TYPE- variaveis de ambiente relacionadas a Wayland/X11
Por que importa:
- X11 e Wayland usam ferramentas diferentes;
- escala em GNOME tem caminho proprio;
- aplicar comando errado pode falhar silenciosamente.
Funcao de apoio/debug para inspecionar a sessao atual.
Retorna monitores conectados, modos e escala atual quando possivel.
Existe por compatibilidade; para novas chamadas, prefira listar_displays_result.
Uso:
- preencher opcoes de resolucao na UI;
- saber qual modo esta ativo;
- evitar apresentar resolucoes inexistentes.
Contrato preferencial para listagem de displays.
Possui cache curto de aproximadamente 3 segundos para evitar chamadas repetidas a xrandr ou wlr-randr durante atualizacoes frequentes da UI.
Retornos comuns:
ok: lista preenchida.display_subsystem_missing:xrandrewlr-randrausentes.display_no_outputs: ferramentas existem, mas nenhum display foi encontrado ou parseado.
Funcao auxiliar para imprimir resolucoes no terminal.
Aplica resolucao e retorna apenas sucesso/falha.
Existe por compatibilidade. Para UI, prefira alterarResolucao_result.
Aplica resolucao com retorno detalhado.
Parametros:
saida: nome do monitor/saida.width: largura.height: altura.rate: taxa de atualizacao desejada.
Comportamento:
- monta comando conforme sessao;
- executa com argumentos separados quando aplicavel;
- retorna erro mapeado se a ferramenta falhar.
Aplica escala e retorna apenas booleano.
Existe por compatibilidade.
Aplica escala com retorno detalhado.
Como decide:
- GNOME pode usar
gsettings; - X11 pode usar
xrandr; - Wayland/wlroots pode usar
wlr-randr.
Por que escala e delicada:
- compositores diferentes usam modelos diferentes;
- nem toda sessao permite escala por saida;
- falhas precisam ser comunicadas sem travar a UI.
Ajustam brilho por incremento.
Existem por compatibilidade e delegam para as variantes _result.
Use estas funcoes quando a chamada precisar reagir a falhas:
system_result obter_brilho_result(int& brilho);system_result definir_brilho_result(int valor);system_result alterar_brilho_result(int delta);system_result aumentar_brilho_result();system_result diminuir_brilho_result().
Fallbacks:
- leitura:
brightnessctl get/max, depois/sys/class/backlight/*/brightness; - escrita absoluta:
brightnessctl set <valor>%, depois escrita em sysfs; - incremento:
brightnessctl set +N%/N%-, depois leitura e escrita em sysfs.
obter_brilho_result possui cache curto de aproximadamente 2 segundos. Falhas sem backend disponivel retornam brightness_not_supported.
Implementacao: NetworkControl.cpp.
struct wifi_network {
std::string backend_id;
std::string bssid;
std::string ssid;
int sinal;
std::string seguranca;
bool em_uso;
};Campos:
backend_id: identificador usado pelo backend; hoje prefere o BSSID.bssid: MAC do ponto de acesso quando informado pelonmcli.ssid: nome da rede.sinal: intensidade do sinal.seguranca: tipo de seguranca informado pelo NetworkManager.em_uso: indica se e a rede atual.
struct wifi_adapter_status {
bool enabled = false;
bool disponivel = true;
bool conectado_wifi = false;
bool conectado_cabeado = false;
std::string dispositivo_cabeado;
std::string conexao_cabeada;
std::string dispositivo_wifi;
std::string conexao_wifi;
std::string output;
};Uso:
- informar estado do radio Wi-Fi;
- indicar se ha adaptador disponivel;
- propagar estado de conexao cabeada para a UI de rede.
struct network_connection_status {
bool conectado = false;
bool wifi_conectado = false;
bool cabeado_conectado = false;
std::string tipo;
std::string dispositivo;
std::string conexao;
std::string dispositivo_wifi;
std::string conexao_wifi;
std::string dispositivo_cabeado;
std::string conexao_cabeada;
};Uso:
- representar a conexao primaria;
- manter detalhes separados de Wi-Fi e Ethernet;
- permitir que
SystemStatuseJanelaRedetomem decisoes leves.
Lista redes no terminal.
Funcao auxiliar/debug. Para UI, use listar_wifi_result.
Escaneia redes Wi-Fi e retorna structs.
Existe por compatibilidade; para novas chamadas, prefira listar_wifi_result.
Como funciona:
- chama
nmcliem modo tabular; - usa parser que respeita caracteres escapados;
- trata SSIDs com
:corretamente; - preenche BSSID,
backend_id, sinal, seguranca e indicador de rede atual.
Por que o parser e necessario:
nmcli -tsepara campos por:;- SSIDs tambem podem conter
:; - parsing simples por split quebraria nomes reais de rede.
Contrato preferencial para scan Wi-Fi.
Possui cache curto de aproximadamente 8 segundos para evitar chamadas repetidas a nmcli device wifi list, que pode ser custoso no Raspberry Pi.
Retornos comuns:
ok: lista preenchida.network_manager_missing:nmcliausente.wifi_disabled: radio Wi-Fi desligado.wifi_scan_failed:nmclifalhou durante o scan.wifi_no_networks: scan executou, mas nao encontrou redes parseaveis.
Retorna estado do Wi-Fi e informacoes de conexao.
Inclui:
- radio ligado/desligado;
- disponibilidade;
- conexao Wi-Fi;
- conexao cabeada;
- nomes de dispositivos e conexoes.
Detecta conexao de rede ativa.
Como funciona:
- consulta
nmcli device status; - identifica dispositivos
wifieethernet; - marca Ethernet como conexao primaria quando conectada;
- ainda preserva dados de Wi-Fi se existir.
Por que Ethernet tem prioridade:
- se cabo esta conectado, a rede ja esta funcional;
- scan Wi-Fi deixa de ser necessario para a experiencia principal;
- a UI pode renderizar painel mais leve.
Retorna se ha Wi-Fi conectado.
Observacao:
- nao significa que ha qualquer rede;
- para saber se ha cabo ou rede primaria, use
obter_status_conexao_rede.
Liga ou desliga o radio Wi-Fi.
Retornos comuns:
okwifi_toggle_failednetwork_manager_missing
Depois de ligar Wi-Fi, a UI pode disparar novo sync para recarregar redes. O cache de scan e invalidado quando o estado do radio muda com sucesso.
Conecta a uma rede e descarta detalhes.
Funcao de compatibilidade.
Conecta a uma rede Wi-Fi.
Parametros:
ssid: nome da rede.senha: senha; pode ser vazia para rede aberta ou rede ja conhecida.
Mapeamento de falhas:
network_manager_missing;- autenticacao incorreta;
- rede indisponivel;
- Wi-Fi desligado;
- falha generica do NetworkManager.
Ao conectar com sucesso, o cache de scan e invalidado.
Desconecta e descarta detalhes.
Funcao de compatibilidade.
Derruba uma conexao Wi-Fi pelo identificador/nome da conexao.
Uso:
- tela de rede;
- acoes administrativas futuras.
Retorna network_manager_missing quando nmcli nao esta disponivel e invalida o cache ao desconectar com sucesso.
Implementacoes:
BluetoothControl.cppBluetoothInternal.cppBluetoothInternal.hpp
Bluetooth e o modulo mais sensivel porque bluetoothctl nao foi desenhado como API de maquina. Ele e uma ferramenta interativa, com prompt, eventos assicronos e codigos ANSI.
struct device_bt {
std::string mac;
std::string nome;
std::string icon;
bool conectado = false;
bool pareado = false;
bool confiavel = false;
};Campos:
mac: endereco do dispositivo.nome: nome exibido ao usuario.icon: categoria informada pelo BlueZ.conectado: estado atual.pareado: se ja foi pareado.confiavel: se foi marcado como trusted.
struct bluetooth_adapter_status {
bool powered = false;
bool soft_blocked = false;
bool hard_blocked = false;
bool controller_disponivel = true;
std::string show_output;
std::string rfkill_output;
};Representa o estado do adaptador e bloqueios rfkill.
struct bluetooth_state_snapshot {
bluetooth_adapter_status adapter;
std::vector<device_bt> conhecidos;
std::vector<device_bt> pareados;
};Snapshot tecnico do estado conhecido.
struct bluetooth_ui_snapshot {
bluetooth_adapter_status adapter;
std::vector<device_bt> desconhecidos_conectados;
std::vector<device_bt> pareados;
std::vector<device_bt> escaneados_filtrados;
bool vindo_do_cache = false;
std::string erro_codigo;
std::string erro_mensagem;
std::string erro_detalhes;
};Snapshot orientado para UI.
Por que existe:
- a tela nao precisa conhecer todos os detalhes do BlueZ;
- evita scans repetidos;
- separa listas que tem comportamento visual diferente;
- permite mostrar estado de erro sem quebrar renderizacao.
Retorna se Bluetooth esta ligado.
Uso:
- indicadores simples;
- compatibilidade.
Consulta status do adaptador.
Como funciona:
- executa
bluetoothctl show; - consulta
rfkill; - detecta ausencia de controller;
- diferencia bloqueio fisico e logico.
Retorna adaptador, conhecidos e pareados.
Uso:
- sincronizacao interna;
- base para snapshots mais amigaveis.
Retorna snapshot leve para UI sem necessariamente fazer scan novo.
Importancia:
- evita travar tela;
- permite abrir configuracao rapidamente;
- usa cache quando adequado.
Retorna snapshot para UI com scan ativo por tempo definido.
Uso:
- botao de buscar dispositivos;
- atualizacao manual;
- descoberta de novos dispositivos.
Liga/desliga Bluetooth e retorna apenas booleano.
Funcao de compatibilidade.
Liga/desliga Bluetooth com retorno detalhado.
Fluxo ao ligar:
- tenta desbloquear via
rfkill; - valida adaptador;
- envia
power on; - verifica saida;
- retorna
system_result.
Fluxo ao desligar:
- tenta validar quando necessario;
- envia
power off; - retorna sucesso/falha.
Lista dispositivos conhecidos pelo BlueZ.
Lista dispositivos pareados.
Escaneia dispositivos por um periodo.
Como funciona:
- abre sessao
bluetoothctl; - liga scan;
- coleta eventos;
- parseia stream;
- desliga scan;
- retorna lista ordenada/filtrada.
Pareia um dispositivo.
Fluxo:
- garante Bluetooth desbloqueado;
- valida adaptador;
- prepara agent;
- executa
pair; - verifica sucesso/falha;
- retorna mensagem normalizada.
Marca dispositivo como confiavel (trust).
Por que e importante:
- permite reconexao automatica;
- reduz necessidade de repetir pareamento.
Fluxo completo para dispositivos novos:
- parear;
- confiar;
- conectar.
Se qualquer etapa falhar, retorna o system_result daquela etapa.
Conecta dispositivo pareado/conhecido.
Possui tratamento para pareamento obsoleto:
- identifica falhas de autenticacao ou chave antiga;
- remove dispositivo antigo quando seguro;
- tenta parear/confiar/conectar novamente.
Wrapper booleano para compatibilidade.
Desconecta dispositivo.
Tratamentos:
- dispositivo ja desconectado;
- dispositivo indisponivel;
- timeout de operacao;
- falha generica do
bluetoothctl.
Wrapper booleano para compatibilidade.
Remove dispositivo do BlueZ.
Fluxo:
- consulta estado inicial;
- se conectado, tenta desconectar;
- executa
remove; - verifica saida;
- retorna
system_result.
Parser central de eventos do Bluetooth.
Assinatura:
void parsing_bluetooth_stream(
std::istream& input,
std::unordered_map<std::string, device_bt>& mapa,
std::string& ultimo_mac_context
);Responsabilidades:
- remover codigos ANSI;
- detectar linhas com MAC;
- manter contexto do ultimo dispositivo;
- preencher nome, icon, conectado, pareado e confiavel;
- lidar com eventos parciais emitidos durante scan/conexao.
Por que recebe ultimo_mac_context:
bluetoothctlfrequentemente imprime propriedades em linhas seguintes;- nem toda linha repete o MAC;
- o parser precisa saber a qual dispositivo aquela propriedade pertence.
O backend usa PTY porque bluetoothctl espera terminal interativo. Sem PTY, algumas operacoes podem nao emitir eventos do mesmo jeito ou podem se comportar de forma diferente.
Operacoes interativas usam listas de marcadores:
- sucesso: textos esperados na saida;
- falha: textos que indicam erro conhecido.
Isso permite encerrar operacoes antes do timeout quando o resultado ja e conhecido.
Depois de conectar/desconectar/parear, o hardware pode demorar alguns instantes para refletir estado final. O backend consulta o dispositivo algumas vezes antes de declarar falha definitiva.
As telas da UI que consomem diretamente config-dacc sao:
JanelaRedeJanelaBluetoothJanelaAudioEVideoSystemStatus
Regras:
- UI deve consumir structs e
system_result; - UI nao deve parsear
nmcli,bluetoothctl,wpctlouxrandr; - operacoes lentas devem acontecer em tarefa de segundo plano na UI;
- backend deve retornar detalhes suficientes para debug;
- mensagens exibidas podem usar
mensagem, com fallback local se vazia.
Os codigos nao sao uma enum formal, mas devem ser tratados como contrato estavel.
Padroes usados:
okaudio_device_not_foundaudio_select_faileddisplay_output_not_founddisplay_scale_faileddisplay_resolution_failedwifi_auth_failedwifi_not_foundwifi_disablednetwork_manager_unavailablewifi_toggle_failedwifi_connect_failedwifi_disconnect_failedadapter_unavailableadapter_blockedadapter_hard_blockedadapter_soft_blockedrfkill_unblock_failedpower_failedpair_failedpair_not_reflectedtrust_failedtrust_not_reflectedconnect_failedconnect_not_reflecteddisconnect_faileddisconnect_not_reflectedremove_failedremove_not_reflecteddevice_unavailabledevice_not_connectedauthentication_failedoperation_timeoutbluetoothctl_timeoutbluetoothctl_failedbluetoothctl_signaledforkpty_failedwrite_failedread_failedstale_pairing_remove_failed
Ao adicionar novos codigos:
- use snake_case;
- prefira nomes especificos;
- mantenha compatibilidade com a UI;
- documente quando a UI precisar comportamento especial.
Ao adicionar uma nova funcao de configuracao:
- Declare o contrato em
include/config-dacc/functions.hpp. - Se a operacao puder falhar, retorne
system_result. - Use
exec_command_args_resultquando houver argumentos dinamicos. - Coloque parsing no backend, nao na UI.
- Retorne structs tipadas para listas/estado.
- Preencha
codigo,mensagemedetalhes. - Adicione teste se houver parser ou regra nao trivial.
- Rode
make -C config-daccemake test. - Rode build limpo da UI se
include/config-dacc/functions.hppmudou.
Depois de alterar este modulo:
make -C config-dacc
make -C config-dacc test
make -C ui clean
make
./scripts/start_station.shChecklist manual:
- abrir tela de rede;
- testar modo cabeado;
- testar Wi-Fi quando disponivel;
- abrir Audio/Video;
- abrir Bluetooth;
- executar scan Bluetooth curto;
- confirmar que a UI nao trava durante operacoes lentas;
- verificar logs em caso de erro.
- Contratos publicos devem ser pequenos e estaveis.
- Parsing de ferramentas externas deve ficar perto da chamada que gerou a saida.
- A UI deve receber dados prontos para renderizar.
- Erros esperados de hardware nao devem virar excecoes fatais.
- Fallbacks sao aceitaveis quando preservam funcionamento em hardware variado.
- Detalhes tecnicos devem ir para
detalhes, nao para texto principal de UI. - Mudancas em Bluetooth devem ser testadas com cuidado, porque o hardware responde de forma assíncrona.