SXXXXXXX_RadarDataReader/IDL_specific.md
2025-07-23 14:03:57 +02:00

7.2 KiB

Documento di Analisi: Logica di Parsing del Tool IDL (Grifo_E_data_reader.pro)

Scopo: Questo documento descrive il processo con cui lo script IDL analizza i file di dati .out, con un focus sulla struttura dei dati, l'ordine dei blocchi e la logica di raggruppamento. L'obiettivo è definire un comportamento di riferimento per validare la nostra implementazione in Python.


1. Principio di Funzionamento Generale

Lo script opera seguendo un approccio sequenziale ben definito:

  1. Lettura Globale: L'intero file .out viene caricato in memoria come un unico grande array di parole a 32-bit non segnate (unsigned long).
  2. Scansione dei Marker: L'array viene scansionato per identificare tutti i possibili punti di inizio dei blocchi di dati, cercando specifici "marker" a 32-bit.
  3. Classificazione dei Blocchi: Per ogni marker trovato, lo script analizza l'header che lo segue per determinarne il tipo (es. DSPHDRIN, SUM, CDPSTS, EXP) e la dimensione del payload.
  4. Raggruppamento Logico (Batching): I blocchi vengono raggruppati in "batch" logici. Un batch rappresenta un ciclo completo di acquisizione ed elaborazione del radar e serve come base per creare una "riga" di dati aggregati.
  5. Estrazione Dati: Una volta identificato e raggruppato un blocco, i dati di interesse (in particolare i dati di segnale IQ) vengono estratti dal suo payload.

2. Fase di Lettura e Scansione: Come Vengono Trovati i Blocchi

Questa è la fase fondamentale da cui dipende tutto il resto.

  • Due Tipi di Marker: Lo script cerca due marker principali per identificare due famiglie di blocchi:

    • 0x5A5A5A5A (Legacy Blocks): Sono i blocchi di dati principali generati dal DSP, come DSPHDRIN, SUM, GUARD, CDPSTS, etc.
    • 0x7A7A7A7A (Firmware Blocks): Sono blocchi di stato/configurazione di basso livello, come EXP (Expander), PC (Pulse Compression) e DET (Detector).
  • Identificazione dell'Inizio Blocco: Lo script non si fida di un singolo marker. Cerca una sequenza di due marker identici e consecutivi. Ad esempio, 0x5A5A5A5A seguito immediatamente da 0x5A5A5A5A. L'inizio effettivo del blocco di dati viene considerato a partire dalla prima delle due parole. Questa è una tecnica robusta per evitare falsi positivi.


3. Struttura e Classificazione dei Blocchi

Una volta trovato l'inizio di un blocco, lo script ne determina la natura e la dimensione leggendo a specifici offset (distanze in parole da 32-bit) dall'inizio.

A. Blocchi Legacy (0x5A5A5A5A)

Questa è la famiglia più complessa, poiché usa una logica di identificazione a più livelli.

  • Dimensione del Payload: Si trova sempre all'offset +5 parole. Contiene la dimensione del payload in bytes.
  • ID Primario del Blocco: Si trova all'offset +17 parole. È un valore numerico che identifica il tipo di blocco (es. 1213223748 per DSPHDRIN).
  • ID Secondario (Discriminatore): Questo è un punto cruciale. Per alcuni blocchi, l'ID primario non è sufficiente. Lo script legge anche la parola all'offset +18 per distinguere tra sotto-tipi. Lo schema è:
    • Se l'ID a +17 è 1213223748 (DSPHDRIN):
      • Se l'ID a +18 è 1431261764 (DSPHDROUT), allora il blocco è un Header di Output.
      • Altrimenti, è un Header di Input (DSPHDRIN).
    • Se l'ID a +17 è 1599362131 (STT_LAA_NAME):
      • Se l'ID a +18 è 4276556, allora il blocco è un blocco di Single Target Track (STT_LAA).
    • Se l'ID a +17 è 1599362125 (MTT_LAA_NAME):
      • Se l'ID a +18 è 4276556, allora il blocco è un blocco di Multi Target Track (MTT_LAA).
B. Blocchi Firmware (0x7A7A7A7A)

Questi sono più semplici.

  • ID del Blocco: Si trova all'offset +2 parole.
  • Dimensione del Payload: Si trova all'offset +5 parole (in bytes).
  • Inizio del Payload: I dati utili iniziano dopo l'header del blocco, che è lungo 8 parole.

4. Logica di Raggruppamento: Cosa Costituisce un "Batch"

Questa è la logica che dobbiamo replicare per evitare i duplicati.

  • L'Inizio di un Batch: Un nuovo batch logico inizia esclusivamente con un blocco DSPHDRIN.
  • Contenuto di un Batch: Un batch è costituito dal blocco DSPHDRIN che lo avvia e da tutti i blocchi di dati successivi (CDPSTS, D1553, segnali SUM/GUARD, blocchi di output come DSPHDROUT e STT_LAA) fino a quando non si incontra il successivo blocco DSPHDRIN.
  • Blocco DSPS: Sebbene sia un blocco di stato, lo script IDL lo tratta in modo simile a un DSPHDRIN di input, usandolo per estrarre informazioni di stato ma non per avviare un nuovo raggruppamento. La nostra logica Python finale che raggruppa tutto sotto il DSPHDRIN precedente è la rappresentazione corretta di questo comportamento.

Schema di un Batch Tipico: Un batch logico nel file .out ha tipicamente questa sequenza:

  1. Blocco DSPHDRIN (Contiene il batch_counter, N_PRI, N_RBIN per questo ciclo)
  2. Blocco CDPSTS (Stato del processore)
  3. Blocco D1553 (Dati avionici)
  4. Blocco SUM (Segnale IQ del canale Somma)
  5. Blocco GUARD (Segnale IQ del canale Guardia)
  6. ... (altri segnali) ...
  7. Blocco DSPHDROUT (Risultati dell'elaborazione per lo stesso batch_counter)
  8. Blocco STT_LAA (Dati di tracking per lo stesso batch_counter)
  9. ... (altri blocchi di output) ... (Il prossimo blocco DSPHDRIN nel file segnerà l'inizio del batch successivo)

5. Estrazione dei Dati di Segnale (IQ)

Per i blocchi che contengono dati di segnale grezzo (es. SUM, GUARD, DAZ, DEL):

  1. Lo script non legge i dati dall'inizio del payload.
  2. Cerca un marker secondario all'interno del payload: 0x4E474953 (che in ASCII corrisponde a "NGIS").
  3. I dati IQ effettivi iniziano 2 parole dopo questo marker "NGIS".
  4. Le dimensioni per ricostruire la matrice del segnale (N_PRI e N_RBIN) vengono prese dall'header DSPHDRIN del batch corrente. Questa è una dipendenza di stato fondamentale.

Punti Chiave per la Verifica della Nostra Applicazione

Per essere certi che la nostra applicazione Python si comporti come il tool IDL, dobbiamo verificare i seguenti punti:

  1. [✓] Raggruppamento per DSPHDRIN: La logica di file_reader.py deve raggruppare tutti i blocchi successivi sotto l'ultimo DSPHDRIN incontrato.
  2. [✓] Identificazione a Doppio Livello: Lo struct_parser.py deve implementare la logica del "discriminatore" (parola a offset +18) per distinguere correttamente DSPHDROUT, STT_LAA, etc.
  3. [✓] Offset di Payload Corretti: Dobbiamo assicurarci che per ogni tipo di blocco (DSPHDROUT, STT_LAA, etc.) si usi l'offset corretto per iniziare a leggere il payload (es. 144 byte per DSPHDROUT, 152 per STT_LAA).
  4. [ ] Gestione Completa dei Blocchi: Dobbiamo mappare e parsare tutti i tipi di blocco menzionati nell'IDL che sono rilevanti per l'output, come MTT_LAA, SLBCRES, etc. (questo sarà il nostro lavoro futuro).
  5. [✓] Dipendenza da Header per i Segnali: Il parsing dei blocchi di segnale (SUM, etc.) deve utilizzare i parametri N_PRI e N_RBIN presi dall'header del batch a cui appartengono.