# Capitolo 5: Configurazione della Comunicazione

Una volta definito uno scenario, il passo successivo è configurare la comunicazione per trasmettere i dati dei target simulati al sistema radar (device under test). L'applicazione supporta diversi protocolli, gestiti tramite un'unica finestra di configurazione.

## 5.1. La Finestra `ConnectionSettingsWindow`

Questa finestra di dialogo, accessibile dal menu `Settings -> Connection...` o dal pulsante `Settings...` nel Pannello di Connessione, centralizza la configurazione per le due interfacce logiche principali: **Target Connection** e **LRU Connection**.

*(Placeholder per l'immagine)*

**Descrizione dell'Immagine:** `finestra_connessioni.png`
*Qui ti aspetti uno screenshot della finestra `ConnectionSettingsWindow`. Evidenzia le seguenti aree:*
1.  *Un riquadro attorno alla sezione "Target Connection".*
2.  *Un riquadro attorno alla sezione "LRU Connection" (anche se non ancora utilizzata, va mostrata).*
3.  *Una freccia che punta al menu a tendina "Type" per selezionare il protocollo (SFP, TFTP, Seriale).*
4.  *Una freccia che punta alle schede sottostanti, che cambiano in base al tipo selezionato.*
5.  *Una freccia che punta al pulsante "Test Connection".*

---

La finestra permette di configurare in modo indipendente la comunicazione per l'invio dei dati dei target (`Target Connection`) e per un'eventuale comunicazione secondaria con un'altra LRU (`LRU Connection`). Per ogni connessione, è possibile scegliere il tipo di protocollo e impostarne i parametri specifici.

Profilazione target e nuova schermata di configurazione

È stata aggiunta una scheda di configurazione dedicata alla profilazione dei target e alla loro integrazione con la comunicazione verso il server. Questa nuova schermata è accessibile dalla finestra di connessione (`Settings -> Connection...`) o direttamente dall'Editor di Traiettoria tramite un pulsante `Profiling/Characteristics`.

Caratteristiche della schermata di profilazione:

- **Elenco Profili:** mostra i profili disponibili (nome profilo, descrizione breve, ultima modifica) e permette di crearne di nuovi o modificare quelli esistenti.
- **Elenco Profili:** mostra i profili disponibili (nome profilo, descrizione breve, ultima modifica) e permette di crearne di nuovi o modificare quelli esistenti. Le definizioni di questi profili sono persistite nel file `target_types.json` (gestito da `TargetTypeManager`) mentre l'assegnazione del profilo a singoli target è memorizzata nello `scenarios.json`.
- **Assegnazione Target → Profilo:** consente di associare un profilo a un target specifico all'interno dello scenario corrente.
- **Opzioni di invio:** scegliere se includere i campi `rcs` e `amplitude` nei payload JSON inviati al server, con opzione per invio statico (valore fisso) o dinamico (override da waypoint).
- **Test profilo:** invia un singolo payload di prova con il profilo selezionato (utilizza lo stesso meccanismo del `Simple Target Sender` nello `SFP Packet Inspector`).

Quando un profilo è assegnato a un target, i relativi campi vengono inclusi nelle operazioni di `tgtinit` / payload JSON (se il protocollo JSON è attivo). L'Editor di Traiettoria mostra uno stato di sincronizzazione che indica se il profilo assegnato è stato inviato correttamente al server.

Placeholder immagine - Scheda Profiling

*(Placeholder: `connection_profiling_tab.png`)*

Layout consigliato per la scheda Profiling nella `ConnectionSettingsWindow`:

- Colonna sinistra: **Elenco Profili** (tabella con colonne `Name`, `Type`, `Last Modified`).
- Colonna destra superiore: **Dettaglio Profilo** (Name, Description, RCS, Amplitude, Tags).
- Colonna destra inferiore: **Opzioni di invio** (checkbox `Include in JSON`, `Send dynamic per waypoint`, `Test profile`).
- Footer: pulsanti `Save Profile`, `Assign to Target`, `Send Test Payload`.

Esempio di configurazione `settings.json` per abilitare IO-trace e profiling:

```json
{
	"debug": {
		"enable_io_trace": true,
		"io_trace_sent_filename": "sent_positions.csv",
		"io_trace_received_filename": "received_positions.csv",
		"temp_folder_name": "Temp",
		"enable_performance_profiling": true
	}
}
```

Esempio di payload JSON di `tgtinit`/`tgtset` con profilo incluso:

```json
{
	"CMD": "tgtinit",
	"targets": [
		{
			"target_id": 3,
			"profile": {
				"name": "F-16_Profile",
				"rcs": 1.25,
				"amplitude": 0.87,
				"characteristics": "Fast jet, small RCS"
			}
		}
	]
}
```

## 5.2. Dettaglio dei Protocolli

### 5.2.1. Configurazione SFP (Simple Fragmentation Protocol)

SFP è un protocollo basato su UDP progettato per la trasmissione affidabile di dati. È il metodo di comunicazione più avanzato e raccomandato per l'applicazione.

*   **Server IP:** L'indirizzo IP del sistema radar che riceverà i dati.
*   **Server Port:** La porta UDP su cui il sistema radar è in ascolto per i pacchetti SFP.
*   **Local Port:** La porta UDP su cui l'applicazione si metterà in ascolto per ricevere i pacchetti di ritorno (es. ACK SFP o dati reali dal radar). **È fondamentale che questa porta non sia in uso da altre applicazioni sulla macchina.**
*   **Use JSON Protocol:** Se selezionato, il simulatore invierà gli aggiornamenti dei target utilizzando un payload JSON compatto, invece del formato testuale legacy. Questo è il metodo preferito per i sistemi radar che lo supportano, in quanto più efficiente e strutturato.
*   **Prediction Offset (ms):** Un valore in millisecondi che introduce una compensazione manuale per la latenza. Il motore di simulazione anticiperà il calcolo della posizione del target di questo intervallo di tempo prima di inviare i dati, per compensare la latenza di rete e di elaborazione del server.
*   **RCS / Amplitude (opzionali):** Alcune implementazioni SFP supportano l'inclusione di campi `rcs` (radar cross section) e `amplitude` per target singoli. Se il device remoto li riconosce, questi campi vengono inviati nei payload (soprattutto in modalità JSON) e possono essere visualizzati nelle viste di debug.
*   **Comandi preparatori e reset atomico:** L'implementazione utilizza talvolta comandi preparatori (es. impostazioni di riga terminale) e reset atomici per evitare perdite di messaggi durante la fase di inizializzazione. Ad esempio vengono inviati comandi preparatori prima di effettuare un reset globale dei target e, quando possibile, il reset viene eseguito in modo atomico (evitando sequenze multiple che potrebbero essere perse).
*   **Nota sulla porta locale:** Quando si usa SFP assicurarsi che la `Local Port` non sia occupata; l'apertura del socket è parte del controllo eseguito da `Test Connection`.

### 5.2.2. Configurazione TFTP (Trivial File Transfer Protocol)

In questa modalità, l'applicazione genera uno script di comandi testuali e lo carica su un server TFTP in esecuzione sul sistema radar.

*   **Server IP:** L'indirizzo IP del server TFTP.
*   **Server Port:** La porta del servizio TFTP (di solito la 69).

### 5.2.3. Configurazione Seriale

Questa modalità utilizza una connessione seriale (es. RS-232/RS-422) per inviare i comandi testuali.

*   **COM Port:** Il nome della porta seriale da utilizzare (es. `COM1` su Windows, `/dev/ttyS0` su Linux). Il menu a tendina viene popolato automaticamente con le porte rilevate sul sistema.
*   **Baud Rate:** La velocità di trasmissione. Deve corrispondere a quella impostata sul dispositivo ricevente.
*   **Altri Parametri (Parity, etc.):** Sebbene non esposti nell'interfaccia principale `ConnectionSettingsWindow`, possono essere configurati nel file `settings.json` se necessario.

## 5.3. Testare la Connessione

Il pulsante `Test Connection` esegue un rapido controllo per verificare la raggiungibilità e la configurazione di base del servizio selezionato, senza stabilire una connessione permanente.

*   **SFP:** Tenta di aprire e associare un socket sulla porta locale specificata. Un successo indica che la porta è libera e utilizzabile.
*   **TFTP:** Invia una richiesta di lettura (RRQ) per un file inesistente. Un successo si ha se il server risponde (anche con un errore "file not found"), confermando che il server TFTP è in esecuzione e raggiungibile. Un fallimento indica un timeout o un problema di rete.
*   **Seriale:** Tenta di aprire la porta COM con i parametri specificati e la richiude immediatamente. Un successo indica che la porta esiste e non è bloccata da un'altra applicazione.

L'uso di questa funzione è fortemente raccomandato dopo aver modificato i parametri di connessione per diagnosticare rapidamente eventuali problemi di configurazione.