Files
Pi Developer 6af9fcad7e
Build Docker Image for Raspberry Pi / build-and-push (push) Failing after 4m42s
feat(v2.0): Auto-discovery, correzione bug critici, e documentazione completa
🆕 Funzionalità Auto-Discovery
- Aggiunto metodo AutoDiscoverBufferSizes() per rilevamento automatico QPIGS/QPIRI/QMOD/QPIWS
- Supporto variabili d'ambiente (INVERTER_DEVICE, MQTT_SERVER, etc.)
- Caching persistente buffer sizes in /cache/inverter.conf.cache
- Flag -a/--auto-discover per modalità auto-detection

🐛 Bug Fixes Critici
- **Parsing interi**: Aggiunta attemptAddSettingInt() con stoi() invece di stof()
  - Fix: stof('98') = 98.0f → 97 (int), ora stoi('98') = 98 direttamente
  - Applicato a: qpiri, qpiws, qmod, qpigs
- **Thread sync**: Aggiunto ups_qpiws_changed a main loop e condizione exit poll()
  - Fix: loop principale controllava solo 3 flag su 4, causava hang
  - Fix: thread poll() non usciva in runOnce perché mancava controllo QPIWS
- **Config accuracy**: Corretti buffer sizes (qpiri: 98→103, qpiws: 36→40)
  - Rimosso sources/inverter-cli/inverter.conf che sovrascriveva config globale
  - Validato con test: inverter_poller -1 completa in 6s con JSON completo

📚 Documentazione Completa
- Creato documentation/CODE_ARCHITECTURE.md (38KB)
  - Mappa logica variabili globali
  - Flusso esecuzione main() con diagrammi ASCII
  - Sequence diagram classe cInverter (poll, query, auto-discovery)
  - Thread synchronization diagrams
  - MQTT integration bash scripts flow
  - Mappa concettuale 5-layer system architecture
  - Error handling e performance optimizations
- Organizzati file .md in documentation/ (AUTO_DISCOVERY, IMPLEMENTATION, QUICKSTART, DEBUG)
- Aggiornato README.md con sezione v2.0 e indice documentazione
- Aggiornato .github/copilot-instructions.md con novità v2.0

🔧 Miglioramenti Build & CI/CD
- Gitea Actions per build multi-arch (arm/v6, arm/v7, arm64, amd64, 386)
- Configurazione VS Code completa (tasks, launch, debug GDB)
- Script test-autodiscovery.sh e test-device.sh

 Testing Validato
- inverter_poller -1 completa in 6 secondi
- Output JSON completo con tutte le metriche
- Exit pulito senza timeout (exit code 0)
- Tutte le 4 query QMOD/QPIGS/QPIRI/QPIWS funzionanti
2026-01-25 15:00:48 +01:00

8.7 KiB

Debug Configuration - inverter-cli

Questa directory contiene le configurazioni per il debug dell'applicazione inverter-cli in VS Code.

Prerequisiti

Software Richiesto

# Installa gli strumenti di build e debug
sudo apt-get update
sudo apt-get install -y build-essential cmake gdb

# Verifica installazione
gdb --version
cmake --version
g++ --version

Estensioni VS Code Consigliate

  • C/C++ (ms-vscode.cpptools) - IntelliSense, debugging, browsing
  • CMake (twxs.cmake) - Syntax highlighting per CMakeLists.txt
  • CMake Tools (ms-vscode.cmake-tools) - Integrazione CMake avanzata

Configurazioni di Debug Disponibili

1. Debug inverter_poller (Release Build)

Nome: (gdb) Debug inverter_poller

  • Build in modalità Release con ottimizzazioni
  • Esegue con flag -d -1 (debug + run-once)
  • Utile per debug rapido senza simboli completi

2. Debug inverter_poller - Run Once with Debug

Nome: (gdb) Debug inverter_poller - Run Once with Debug

  • Build in modalità Debug con simboli completi
  • Esegue con flag -d -1
  • Include tutti i simboli di debug per analisi dettagliata
  • Consigliato per debug approfondito

3. Debug inverter_poller - Loop Mode

Nome: (gdb) Debug inverter_poller - Loop Mode

  • Build in modalità Debug
  • Esegue in modalità loop continuo con debug -d
  • Utile per debug di problemi intermittenti o di threading

4. Debug inverter_poller - Raw Command

Nome: (gdb) Debug inverter_poller - Raw Command

  • Build in modalità Debug
  • Esegue comando raw specifico: -r QPIGS
  • Modifica l'argomento in launch.json per testare altri comandi

5. Attach to running inverter_poller

Nome: (gdb) Attach to running inverter_poller

  • Attach a processo già in esecuzione
  • Utile per debug di container o processi daemon
  • Richiede permessi adeguati (potrebbe richiedere sudo)

Tasks di Build

Build Tasks

build-inverter-cli (Default)

Ctrl+Shift+B

Build in modalità Release con ottimizzazioni (-O2).

build-inverter-cli-debug

Build in modalità Debug con simboli completi (-O0 -g).

clean-inverter-cli

Pulisce tutti i file di build generati.

rebuild-inverter-cli

Pulisce e ricompila completamente il progetto.

Run Tasks

run-inverter-cli-once

Tasks: Run Task → run-inverter-cli-once

Compila ed esegue il poller una volta con debug abilitato.

run-inverter-cli-loop

Compila ed esegue il poller in modalità loop continuo.

Docker Tasks

docker-build

Build dell'immagine Docker locale per development.

docker-run

Avvia il container con docker-compose.

docker-logs

Mostra i log del container in tempo reale.

docker-stop

Ferma il container docker-compose.

Workflow di Debug Tipici

Debug Locale (senza device fisico)

Il programma proverà ad aprire il device seriale. Se non è disponibile, otterrai errori ma puoi comunque:

  1. Debug della logica di parsing:

    # Modifica temporaneamente main.cpp per usare dati mock
    # Oppure esegui con un device virtuale
    
  2. Debug con socat (porta seriale virtuale):

    # Installa socat
    sudo apt-get install socat
    
    # Crea coppia di porte virtuali
    socat -d -d pty,raw,echo=0 pty,raw,echo=0
    # Output: PTY is /dev/pts/2 e /dev/pts/3
    
    # Modifica config/inverter.conf
    device=/dev/pts/2
    
    # In un altro terminale, simula risposte inverter su /dev/pts/3
    

Debug con Device Reale

  1. Identifica il device:

    ls -la /dev/ttyUSB* /dev/ttyS* /dev/hidraw*
    dmesg | grep tty  # Per vedere device USB
    
  2. Verifica permessi:

    sudo chmod 666 /dev/ttyUSB0  # O il tuo device
    # OPPURE aggiungi utente al gruppo
    sudo usermod -a -G dialout $USER
    # Logout e login necessari
    
  3. Aggiorna configurazione:

    # Modifica config/inverter.conf
    device=/dev/ttyUSB0
    
  4. Avvia debug:

    • Imposta breakpoint dove necessario
    • Premi F5 o seleziona configurazione dal menu Debug
    • Step through con F10 (step over), F11 (step into)

Debug Problemi Comuni

CRC Errors

Breakpoint: inverter.cpp → funzione CheckCRC()

  • Verifica calcolo CRC
  • Controlla dati ricevuti in buf[]

Device Communication Issues

Breakpoint: inverter.cpp → funzione query()

  • Verifica apertura device (errno)
  • Controlla configurazione seriale (baud rate, etc.)
  • Monitora write() e read() operations

Threading Issues

Breakpoint: inverter.cpppoll() e main.cpp → main loop

  • Verifica sincronizzazione mutex
  • Controlla atomic_bool flags
  • Watch variables: ups_status_changed, ecc.

JSON Parsing Issues

Breakpoint: main.cpp → dopo sscanf() calls

  • Verifica parsing corretto delle risposte
  • Controlla valori delle variabili dopo sscanf
  • Debug calcoli (ampfactor, wattfactor)

Debugging con Watchpoints

Variabili Chiave da Monitorare

In VS Code Debug View → Watch, aggiungi:

voltage_grid
voltage_batt
pv_input_watts
mode
ups_qpigs_changed
device_status

GDB Commands Utili

Nel Debug Console (Ctrl+Shift+Y):

# Print strutture dati
-exec p voltage_grid
-exec p device_status

# Backtrace
-exec bt

# Info threads
-exec info threads

# Print tutti i local vars
-exec info locals

# Watch memory
-exec x/100c buf

Configurazione IntelliSense

Il file .vscode/c_cpp_properties.json viene auto-generato. Se necessario, puoi personalizzarlo:

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/usr/include"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/g++",
            "cStandard": "c11",
            "cppStandard": "c++11",
            "intelliSenseMode": "linux-gcc-arm"
        }
    ],
    "version": 4
}

Debug Container Docker

Attach a Container in Esecuzione

# Trova il processo nel container
docker exec -it voltronic-mqtt ps aux | grep inverter

# Installa gdbserver nel container (se necessario)
docker exec -it voltronic-mqtt apt-get install -y gdbserver

# Avvia gdbserver nel container
docker exec -it voltronic-mqtt gdbserver :2345 /opt/inverter-cli/bin/inverter_poller -d -1

# Nella configurazione launch.json, aggiungi:
{
    "name": "(gdb) Remote Debug",
    "type": "cppdbg",
    "request": "launch",
    "program": "${workspaceFolder}/sources/inverter-cli/bin/inverter_poller",
    "miDebuggerServerAddress": "localhost:2345",
    "miDebuggerPath": "/usr/bin/gdb",
    "MIMode": "gdb"
}

Debug Logs

# Tail logs in tempo reale
docker logs -f voltronic-mqtt

# Exec nel container per debug manuale
docker exec -it voltronic-mqtt bash
cd /opt/inverter-cli/bin
./inverter_poller -d -1

Performance Profiling

Con valgrind

# Installa valgrind
sudo apt-get install valgrind

# Memory leak detection
valgrind --leak-check=full --show-leak-kinds=all \
    ./sources/inverter-cli/bin/inverter_poller -1

# Profiling
valgrind --tool=callgrind ./sources/inverter-cli/bin/inverter_poller -1

Con gprof

# Compila con profiling
cd sources/inverter-cli
cmake -DCMAKE_CXX_FLAGS="-pg" .
make

# Esegui
./bin/inverter_poller -1

# Analizza
gprof bin/inverter_poller gmon.out > analysis.txt

Tips & Tricks

  1. Conditional Breakpoints:

    • Click destro su breakpoint → Edit Breakpoint
    • Aggiungi condizione, es: voltage_batt < 24.0
  2. Logpoints:

    • Invece di breakpoint, logpoint stampa senza fermare
    • Click destro → Add Logpoint
    • Esempio: Voltage: {voltage_grid}V
  3. Debug con file di log:

    • Il programma scrive su /tmp/inverter.log (vedi LOG_FILE in tools.h)
    • Usa tail -f /tmp/inverter.log in terminale separato
  4. Quick Debug:

    # Build e run rapido senza VS Code
    cd sources/inverter-cli
    cmake -DCMAKE_BUILD_TYPE=Debug . && make && gdb --args bin/inverter_poller -d -1
    

Troubleshooting Debug Setup

GDB non trova simboli

# Verifica che binary abbia simboli debug
file sources/inverter-cli/bin/inverter_poller
# Output dovrebbe contenere: "not stripped"

# Se stripped, rebuilda in debug mode
cd sources/inverter-cli && cmake -DCMAKE_BUILD_TYPE=Debug . && make

Permission denied su /dev/ttyUSB0

sudo chmod 666 /dev/ttyUSB0
# O permanentemente:
sudo usermod -a -G dialout $USER

VS Code non trova GDB

# Installa gdb
sudo apt-get install gdb

# Verifica path in launch.json
which gdb  # Usa questo path in miDebuggerPath

Risorse Aggiuntive