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:
- Lettura Globale: L'intero file
.outviene caricato in memoria come un unico grande array di parole a 32-bit non segnate (unsigned long). - 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.
- 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. - 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.
- 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, comeDSPHDRIN,SUM,GUARD,CDPSTS, etc.0x7A7A7A7A(Firmware Blocks): Sono blocchi di stato/configurazione di basso livello, comeEXP(Expander),PC(Pulse Compression) eDET(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,
0x5A5A5A5Aseguito immediatamente da0x5A5A5A5A. 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
+5parole. Contiene la dimensione del payload in bytes. - ID Primario del Blocco: Si trova all'offset
+17parole. È un valore numerico che identifica il tipo di blocco (es.1213223748perDSPHDRIN). - ID Secondario (Discriminatore): Questo è un punto cruciale. Per alcuni blocchi, l'ID primario non è sufficiente. Lo script legge anche la parola all'offset
+18per 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
- 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
- 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).
- Se l'ID a
- Se l'ID a
B. Blocchi Firmware (0x7A7A7A7A)
Questi sono più semplici.
- ID del Blocco: Si trova all'offset
+2parole. - Dimensione del Payload: Si trova all'offset
+5parole (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
DSPHDRINche lo avvia e da tutti i blocchi di dati successivi (CDPSTS,D1553, segnaliSUM/GUARD, blocchi di output comeDSPHDROUTeSTT_LAA) fino a quando non si incontra il successivo bloccoDSPHDRIN. - Blocco
DSPS: Sebbene sia un blocco di stato, lo script IDL lo tratta in modo simile a unDSPHDRINdi input, usandolo per estrarre informazioni di stato ma non per avviare un nuovo raggruppamento. La nostra logica Python finale che raggruppa tutto sotto ilDSPHDRINprecedente è la rappresentazione corretta di questo comportamento.
Schema di un Batch Tipico:
Un batch logico nel file .out ha tipicamente questa sequenza:
- Blocco
DSPHDRIN(Contiene ilbatch_counter,N_PRI,N_RBINper questo ciclo) - Blocco
CDPSTS(Stato del processore) - Blocco
D1553(Dati avionici) - Blocco
SUM(Segnale IQ del canale Somma) - Blocco
GUARD(Segnale IQ del canale Guardia) - ... (altri segnali) ...
- Blocco
DSPHDROUT(Risultati dell'elaborazione per lo stessobatch_counter) - Blocco
STT_LAA(Dati di tracking per lo stessobatch_counter) - ... (altri blocchi di output) ...
(Il prossimo blocco
DSPHDRINnel 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):
- Lo script non legge i dati dall'inizio del payload.
- Cerca un marker secondario all'interno del payload:
0x4E474953(che in ASCII corrisponde a "NGIS"). - I dati IQ effettivi iniziano 2 parole dopo questo marker "NGIS".
- Le dimensioni per ricostruire la matrice del segnale (
N_PRIeN_RBIN) vengono prese dall'headerDSPHDRINdel 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:
- [✓] Raggruppamento per
DSPHDRIN: La logica difile_reader.pydeve raggruppare tutti i blocchi successivi sotto l'ultimoDSPHDRINincontrato. - [✓] Identificazione a Doppio Livello: Lo
struct_parser.pydeve implementare la logica del "discriminatore" (parola a offset +18) per distinguere correttamenteDSPHDROUT,STT_LAA, etc. - [✓] 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 perDSPHDROUT, 152 perSTT_LAA). - [ ] 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). - [✓] Dipendenza da Header per i Segnali: Il parsing dei blocchi di segnale (
SUM, etc.) deve utilizzare i parametriN_PRIeN_RBINpresi dall'header del batch a cui appartengono.