17 KiB
Analisi Comparativa: Target1 (Versione Intermedia) vs Versione Corrente
Data Analisi: 2026-02-02
Analista: AI Assistant
Scopo: Identificare modifiche implementate dal collega in target1 e valutare se adottarle nella versione corrente
1. Executive Summary
Contesto
La cartella target1 contiene una versione intermedia sviluppata da un collega che ha cercato di portare alcune modifiche su target. Questa versione non funziona correttamente ma contiene alcune idee interessanti.
Raccomandazione Finale
✅ MANTENERE LA VERSIONE CORRENTE con le seguenti integrazioni selettive da target1:
- ✅ Adottare: Meccanismo di rilevamento perdita comunicazione 1553
- ❌ Non adottare: Modifica indentazione errata in
leo_grifo_terminal.py - ⚠️ Valutare: Rimozione commenti B8 (già presente nella nostra versione)
2. Confronto Strutturale
2.1 File Modificati in Target1
| File | Stato in Target1 | File .bak Presente |
|---|---|---|
GRIFO_M_PBIT.py |
Modificato (1125 righe) | ✅ Sì |
test_common_function.py |
Modificato | ✅ Sì |
leo_grifo_terminal.py |
Modificato | ✅ Sì |
brainbox_interface.py |
Modificato | ✅ Sì |
Nota: I file .bak indicano versioni pre-modifica salvate dal collega.
3. Analisi Dettagliata delle Modifiche
3.1 GRIFO_M_PBIT.py - Differenze Chiave
A) Configurazione Parametri
Target1:
NUMBER_OF_REPETITIONS = 2 # Total test cycles to execute (4 perfect runs = 40%)
PBIT_SEC_TIME = 180 # BIT completion timeout in seconds
EXPORT_STATISTICS_CSV = True
Versione Corrente:
NUMBER_OF_REPETITIONS = 10 # Total test cycles to execute
PBIT_SEC_TIME = 182 # BIT completion timeout (aligned with target2)
EXPORT_STATISTICS_CSV = True
FORCE_B8_DRILL_DOWN = False # NEW: conditional B8 execution
Differenza Critica:
- ✅ Nostra versione SUPERIORE:
PBIT_SEC_TIME = 182(allineato a target2) - ✅ Nostra versione SUPERIORE: Flag
FORCE_B8_DRILL_DOWNper flessibilità - ⚠️ Target1 ha
NUMBER_OF_REPETITIONS = 2(probabilmente per debug veloce)
B) Known Failures Implementation
Target1:
KNOWN_FAILURES = [
"radar_health_status_and_bit_report_valid_RdrHealthStatusAndBitReport_pedestal_status",
# Add more known HW setup limitations here as needed
]
Versione Corrente:
KNOWN_FAILURES = {
"radar_health_status_and_bit_report_valid_RdrHealthStatusAndBitReport_pedestal_status":
"Pedestal subsystem not present in test HW setup",
}
Differenza:
- ✅ Nostra versione SUPERIORE: Usa dict con descrizioni esplicative (più manutenibile)
- ⚠️ Target1 usa lista semplice (meno informativa)
C) ⭐ MECCANISMO RILEVAMENTO PERDITA 1553 (IDEA INTERESSANTE)
Target1 - Righe 810-830:
max_counter_1553_msg = 20
while remaining_time > 0:
start = time.perf_counter()
ret_rep_is_avail = False
msg_cnt = 0
mil1553_error_flag = max_counter_1553_msg
for i in range(100):
cnt = interface.getSingleMessageReceivedSz("B6_MsgRdrSettingsAndParametersTellback")
value = interface.getMessageFieldValue(...)
ret_rep_is_avail = value == "true"
if ret_rep_is_avail is True:
break
time.sleep(0.05)
# ⭐ CHECK COMUNICAZIONE 1553 ⭐
if cnt > msg_cnt:
mil1553_error_flag = max_counter_1553_msg
else:
mil1553_error_flag -= 1
msg_cnt = cnt
if mil1553_error_flag == 0:
logging.critical("1553 communication lost")
return False
Versione Corrente:
# NON PRESENTE - polling semplice senza rilevamento perdita comunicazione
for i in range(100):
cnt = interface.getSingleMessageReceivedSz("B6_MsgRdrSettingsAndParametersTellback")
value = interface.getMessageFieldValue(...)
ret_rep_is_avail = value == "true"
if ret_rep_is_avail:
break
time.sleep(0.05)
Valutazione:
- ✅ IDEA UTILE: Rileva se il contatore di messaggi 1553 si blocca (indica perdita bus)
- ✅ VANTAGGIO: Evita attese inutili di 180s se il bus è morto
- ⚠️ IMPLEMENTAZIONE: Necessita test su hardware reale per validare la soglia (20 iterazioni)
- 📊 RACCOMANDAZIONE: DA INTEGRARE NELLA NOSTRA VERSIONE con parametro configurabile
D) Commenti nei Campi B8
Target1:
bit_fields = (
# ===== B8: Degradation Conditions =====
#"degradation_conditions_w1_DegradationConditionsW1_bcn_fail", # COMMENTATI
#"degradation_conditions_w1_DegradationConditionsW1_gm_rbm_sea1_ta_wa_fail",
# ... altri commentati ...
# ===== B8: SRU Failure Locations =====
#"failure_location_pedestal_FailureLocationPedestal_sru1_gimbal", # COMMENTATO
"failure_location_pedestal_FailureLocationPedestal_sru2_waveguide", # ATTIVO
# ... mix di commentati e attivi ...
Versione Corrente:
# B8 fields: tutti definiti e categorizzati in bit_fields_categories
bit_fields_categories = {
'B6_LRU_Status': [...], # 12 fields
'B8_Degradation': [...], # 12 fields - TUTTI ATTIVI
'B8_SRU_Locations': [...], # 43 fields - TUTTI ATTIVI
'B8_AGC_Tests': [...], # etc.
}
Differenza:
- ✅ Nostra versione SUPERIORE: Tutti i campi B8 attivi e categorizzati per report strutturato
- ⚠️ Target1 ha campi commentati (probabilmente per debugging incrementale)
- ✅ Nostra versione: Drill-down condizionale tramite
FORCE_B8_DRILL_DOWN(più flessibile)
3.2 test_common_function.py - Power Control
Implementazione wait_before
Target1:
def power_grifo_on(wait_after=0, wait_before=0):
time.sleep(wait_before)
setValue(theBrainBox, True, 'MAIN_POWER')
ret, err = check(theBrainBox, 1, 'MAIN_POWER')
time.sleep(wait_after)
return ret
def power_grifo_off(wait_after=0, wait_before=0):
time.sleep(wait_before)
setValue(theBrainBox, False, 'MAIN_POWER')
ret, err = check(theBrainBox, 0, 'MAIN_POWER', timeout=0.1)
time.sleep(wait_after)
return ret
Versione Corrente: IDENTICA ✅
Conclusione: Questa modifica è già presente nella nostra versione (implementata durante l'integrazione target2).
3.3 leo_grifo_terminal.py - ⚠️ BUG CRITICO
Indentazione Errata in Target1
Target1 - Righe 66-69:
elif '%%F' in dummy:
self._serial_stats['fatal_messages'] += 1
self._serial_stats['fatal_details'].append((timestamp, dummy))
# ⚠️ INDENTAZIONE ERRATA - check RECYCLE dentro elif %%F ⚠️
if 'RECYCLE' in dummy.upper():
self._serial_stats['recycle_count'] += 1
self._serial_stats['recycle_details'].append((timestamp, dummy))
Problema: Il check RECYCLE è indentato dentro elif '%%F', quindi viene eseguito SOLO per messaggi %%F, non per messaggi %%E!
Versione Corrente (CORRETTA):
if '%%E' in dummy:
self._serial_stats['error_messages'] += 1
self._serial_stats['error_details'].append((timestamp, dummy))
elif '%%F' in dummy:
self._serial_stats['fatal_messages'] += 1
self._serial_stats['fatal_details'].append((timestamp, dummy))
# ✅ INDENTAZIONE CORRETTA - check RECYCLE fuori da if/elif ✅
if 'RECYCLE' in dummy.upper():
self._serial_stats['recycle_count'] += 1
self._serial_stats['recycle_details'].append((timestamp, dummy))
Valutazione:
- ❌ Target1 ha BUG: RECYCLE non viene rilevato nei messaggi
%%E - ✅ Nostra versione CORRETTA: RECYCLE rilevato in TUTTI i messaggi di errore
- 🚫 NON ADOTTARE questa modifica da target1
3.4 brainbox_interface.py - Modifiche Socket
Target1:
def send_data(self, message: str) -> (bool, AnyStr):
try:
if self.__client_socket is None:
self.__connect()
self.__client_socket.sendall(message.encode())
except Exception as e:
return False, None, f'BrainboxInterface EXCEPTION: {e}'
self.__client_socket.settimeout(self.timeout)
data_raw = self.__client_socket.recv(1024)
data = data_raw.decode()
error = None
self.__disconnect() # ⭐ CHIUDE SOCKET DOPO OGNI COMANDO
# ... gestione risposte ...
Versione Corrente:
- Non disponibile per confronto diretto (probabilmente identica alla versione target2)
Valutazione:
- ⚠️ La chiusura socket dopo ogni comando è corretta per protocollo request-response
- ✅ Probabilmente già presente nella nostra versione (da verificare)
4. Statistiche e Report CSV
4.1 Export CSV Strutturato
Target1 - Righe 204-400:
def export_statistics_to_csv(custom_statistics, test_name, output_folder):
"""
Export test statistics to CSV file for external analysis (Excel, etc.).
Creates a CSV file with three sections:
1. Per-Run Statistics: Detailed results for each run
2. Aggregate Statistics: Overall summary metrics
3. Problem Distribution: Analysis of failure types
"""
# ... implementazione completa con JSON per dettagli ...
# Section 4: Problem Distribution Analysis
problem_counts = {}
for run in custom_statistics['repetitions']:
if not run['success']:
for field, value in run['failures']:
# Extract clean field names
test_name_clean = field.split('RdrHealthStatusAndBitReport_')[-1]
problem_counts[test_name_clean] = problem_counts.get(test_name_clean, 0) + 1
Versione Corrente: IDENTICA (già implementata) ✅
Conclusione: Export CSV già presente nella nostra versione con stessa struttura.
5. GUI Monitor Integration
5.1 Integrazione GUI Real-time
Target1 ha integrazione GUI estesa:
# Update GUI - power on
if gui_monitor:
gui_monitor.update_status(power_on=True)
gui_monitor.log_event('info', 'Power ON - waiting for BIT...')
# Update GUI with B6 progress
if gui_monitor and run_stats['b6_total'] % 3 == 0:
gui_monitor.update_statistics(
b6_total=run_stats['b6_total'],
b6_pass=run_stats['b6_pass'],
b6_fail=run_stats['b6_fail'],
b6_known=run_stats['b6_known_fail']
)
Versione Corrente: IDENTICA (già implementata) ✅
Conclusione: Integrazione GUI già presente e funzionante nella nostra versione.
6. Tabella Comparativa Sintetica
| Feature | Target1 | Versione Corrente | Vincitore |
|---|---|---|---|
PBIT_SEC_TIME |
180s | 182s (aligned target2) | ✅ Corrente |
wait_before parameter |
✅ Presente | ✅ Presente | ⚖️ Pari |
| Known Failures | Lista semplice | Dict con descrizioni | ✅ Corrente |
FORCE_B8_DRILL_DOWN |
❌ Assente | ✅ Presente | ✅ Corrente |
| Campi B8 completi | ❌ Parziali (commentati) | ✅ Tutti attivi | ✅ Corrente |
| Rilevamento perdita 1553 | ✅ Presente | ❌ Assente | ⚠️ Target1 |
| Check RECYCLE | ❌ Bug indentazione | ✅ Corretto | ✅ Corrente |
| Export CSV | ✅ Presente | ✅ Presente | ⚖️ Pari |
| GUI Integration | ✅ Presente | ✅ Presente | ⚖️ Pari |
| Serial logging completo | ❌ Solo DEBUG | ✅ INFO (appena implementato) | ✅ Corrente |
7. Problemi Identificati in Target1
7.1 Bug Critici
-
❌ Indentazione RECYCLE (leo_grifo_terminal.py:66-69)
- Impatto: RECYCLE non rilevato in messaggi
%%E - Soluzione: Già corretto nella nostra versione
- Impatto: RECYCLE non rilevato in messaggi
-
❌ Campi B8 commentati (GRIFO_M_PBIT.py:515-530)
- Impatto: Copertura incompleta test B8
- Soluzione: Nostra versione ha tutti i campi attivi
7.2 Configurazioni Subottimali
-
⚠️
PBIT_SEC_TIME = 180s- Problema: Non allineato a target2 (182s)
- Rischio: Timeout prematuro su hardware lento
- Soluzione: Già corretto nella nostra versione (182s)
-
⚠️
NUMBER_OF_REPETITIONS = 2- Problema: Troppo basso per statistica robusta
- Soluzione: Nostra versione usa 10 (configurabile)
8. Modifiche Consigliate per Versione Corrente
8.1 DA INTEGRARE ✅
1. Meccanismo Rilevamento Perdita Comunicazione 1553
Priorità: ALTA
File: GRIFO_M_PBIT.py
Linee: ~940-960 (polling loop BIT)
Implementazione Consigliata:
# In GRIFO_M_PBIT.py, aggiungere parametro configurabile
COMM_LOSS_THRESHOLD = 20 # iterations without msg count increase = comm lost
# Nel polling loop:
max_counter_1553_msg = COMM_LOSS_THRESHOLD
msg_cnt = 0
mil1553_error_flag = max_counter_1553_msg
for i in range(100):
cnt = interface.getSingleMessageReceivedSz("B6_MsgRdrSettingsAndParametersTellback")
# Check communication health
if cnt > msg_cnt:
mil1553_error_flag = max_counter_1553_msg # Reset counter
else:
mil1553_error_flag -= 1
msg_cnt = cnt
if mil1553_error_flag == 0:
logging.critical("1553 communication lost - message counter stalled")
report.add_comment("CRITICAL: 1553 bus communication lost", False)
return False
value = interface.getMessageFieldValue(...)
ret_rep_is_avail = value == "true"
if ret_rep_is_avail:
break
time.sleep(0.05)
Vantaggi:
- ✅ Rileva freeze del bus 1553 (HW issue o disconnessione)
- ✅ Evita attese inutili di 180s quando il bus è morto
- ✅ Fornisce diagnostica chiara dell'errore
- ✅ Parametro configurabile per tuning su HW reale
Test richiesti:
- Validare soglia
COMM_LOSS_THRESHOLD = 20su hardware target - Test di disconnessione bus durante PBIT
- Verificare comportamento con messaggi 1553 sporadici
8.2 DA NON INTEGRARE ❌
-
❌ Indentazione RECYCLE errata (leo_grifo_terminal.py)
- Nostra versione già corretta
-
❌ Campi B8 commentati (GRIFO_M_PBIT.py)
- Nostra versione ha copertura completa
-
❌
PBIT_SEC_TIME = 180s- Nostra versione già aggiornata a 182s
-
❌ Known Failures come lista
- Nostra versione usa dict con descrizioni (migliore)
9. Conclusioni e Raccomandazioni Finali
9.1 Decisione Strategica
✅ MANTENERE VERSIONE CORRENTE COME BASE
La nostra versione è superiore in quasi tutti gli aspetti:
- ✅ Timeout PBIT corretto (182s vs 180s)
- ✅ Flag
FORCE_B8_DRILL_DOWNper flessibilità - ✅ Known failures con descrizioni esplicative
- ✅ Tutti i campi B8 attivi e categorizzati
- ✅ Check RECYCLE corretto
- ✅ Serial logging completo (INFO level)
9.2 Unica Modifica Utile da Target1
⭐ Integrare meccanismo rilevamento perdita comunicazione 1553
- Priorità: ALTA
- Tempo Implementazione: ~30 minuti
- Testing: Necessario su hardware reale
- Rischio: BASSO (fail-safe: timeout esistente rimane come backup)
9.3 Piano di Azione Consigliato
Step 1: Integrazione Meccanismo 1553 (OPZIONALE)
# 1. Aggiungere parametro configurabile in GRIFO_M_PBIT.py
COMM_LOSS_THRESHOLD = 20 # default, tunable
# 2. Implementare logica rilevamento nel polling loop
# 3. Test in simulazione
python TestEnvironment\scripts\GRIFO_M_PBIT.py --simulate
# 4. Test su hardware reale (quando disponibile)
python TestEnvironment\scripts\GRIFO_M_PBIT.py
Step 2: Validazione Finale
- ✅ Test simulazione: verificare che non impatti funzionalità esistenti
- ✅ Test hardware: validare soglia 20 iterazioni è appropriata
- ✅ Test disconnessione: simulare perdita bus 1553 durante PBIT
Step 3: Deploy su Target
- Usare versione corrente con/senza meccanismo 1553 (a scelta)
- Verificare tutti i test passano correttamente
- Monitorare log per eventuali false positive "communication lost"
10. Appendice: File Log Target1
Log Presenti (target1/GrifoAutomaticTestEnv/TestEnvironment/scripts/):
Grifo 1553 Interface__2026_01_28_16_37_03.log
Grifo 1553 Interface__2026_01_28_16_50_56.log
Grifo 1553 Interface__2026_01_28_16_52_12.log
Grifo 1553 Interface__2026_01_28_16_58_18.log
Grifo 1553 Interface__2026_01_28_17_12_54.log
Osservazione: Presenza di 5 log in una finestra temporale ristretta (21 minuti) suggerisce:
- ⚠️ Tentativi multipli di debug
- ⚠️ Possibili crash o errori ripetuti
- ⚠️ Test non completati con successo
Questo conferma che target1 non funziona correttamente come dichiarato dall'utente.
11. Riepilogo Esecutivo (TL;DR)
✅ Cosa Fare
- MANTENERE versione corrente come base definitiva
- INTEGRARE (opzionale) meccanismo rilevamento perdita 1553
- PROCEDERE con test su hardware reale usando versione corrente
❌ Cosa NON Fare
- NON adottare indentazione RECYCLE errata da target1
- NON adottare campi B8 commentati da target1
- NON regredire timeout PBIT a 180s
- NON rimuovere flag
FORCE_B8_DRILL_DOWNo known failures dict
📊 Confidence Score
- Versione Corrente Superiority: 95%
- Target1 Ideas Worth Adopting: 5% (solo meccanismo 1553)
- Risk of Regression: LOW (con attenzione a non adottare bug)
Fine Documento
Prossimo Step: Decidere se integrare meccanismo 1553 o procedere con versione corrente as-is per test hardware.