# 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: 1. ✅ **Adottare**: Meccanismo di rilevamento perdita comunicazione 1553 2. ❌ **Non adottare**: Modifica indentazione errata in `leo_grifo_terminal.py` 3. ⚠️ **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**: ```python 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**: ```python 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_DOWN` per flessibilità - ⚠️ Target1 ha `NUMBER_OF_REPETITIONS = 2` (probabilmente per debug veloce) --- #### B) Known Failures Implementation **Target1**: ```python KNOWN_FAILURES = [ "radar_health_status_and_bit_report_valid_RdrHealthStatusAndBitReport_pedestal_status", # Add more known HW setup limitations here as needed ] ``` **Versione Corrente**: ```python 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**: ```python 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**: ```python # 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**: ```python 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**: ```python # 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**: ```python 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**: ```python 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)**: ```python 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**: ```python 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: ```python 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: ```python # 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 1. **❌ Indentazione RECYCLE** (leo_grifo_terminal.py:66-69) - **Impatto**: RECYCLE non rilevato in messaggi `%%E` - **Soluzione**: Già corretto nella nostra versione 2. **❌ 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 1. **⚠️ `PBIT_SEC_TIME = 180s`** - **Problema**: Non allineato a target2 (182s) - **Rischio**: Timeout prematuro su hardware lento - **Soluzione**: Già corretto nella nostra versione (182s) 2. **⚠️ `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**: ```python # 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 = 20` su hardware target - Test di disconnessione bus durante PBIT - Verificare comportamento con messaggi 1553 sporadici --- ### 8.2 DA NON INTEGRARE ❌ 1. **❌ Indentazione RECYCLE errata** (leo_grifo_terminal.py) - Nostra versione già corretta 2. **❌ Campi B8 commentati** (GRIFO_M_PBIT.py) - Nostra versione ha copertura completa 3. **❌ `PBIT_SEC_TIME = 180s`** - Nostra versione già aggiornata a 182s 4. **❌ 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_DOWN` per 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) ```bash # 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 1. **MANTENERE** versione corrente come base definitiva 2. **INTEGRARE** (opzionale) meccanismo rilevamento perdita 1553 3. **PROCEDERE** con test su hardware reale usando versione corrente ### ❌ Cosa NON Fare 1. **NON adottare** indentazione RECYCLE errata da target1 2. **NON adottare** campi B8 commentati da target1 3. **NON regredire** timeout PBIT a 180s 4. **NON rimuovere** flag `FORCE_B8_DRILL_DOWN` o 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.