16 KiB
Analisi Comparativa: Versione Corrente vs Target2 (Versione Funzionante)
Data Analisi: 2 Febbraio 2026
Obiettivo: Identificare le modifiche necessarie per portare la versione corrente alla stessa funzionalità della versione target2, senza perdere le nuove features.
EXECUTIVE SUMMARY
La versione target2 è una versione più semplice e snella rispetto alla nostra versione corrente. Essa ha 379 righe contro le nostre 1250 righe. La nostra versione ha introdotto numerose funzionalità avanzate:
- Statistiche aggregate con export CSV
- Sistema di known failures
- Report PDF avanzato con grafici
- Tracking dettagliato seriale con contatori
- Sistema lazy-proxy per simulation mode
Differenze critiche da riportare nella nostra versione:
- Parametro wait_before nelle funzioni power (target2 lo ha, noi no)
- Logica "force check" nel B8 drill-down (target2 forza sempre il check B8 per statistiche)
- Numero di ripetizioni più basso (target2: 2, noi: 10)
- Timeout PBIT (target2: 182s, noi: 180s)
1. DIFFERENZE NEL FILE PRINCIPALE: GRIFO_M_PBIT.py
1.1 Struttura e Complessità
| Aspetto | Target2 (Funzionante) | Versione Corrente | Azione Richiesta |
|---|---|---|---|
| Linee di codice | 379 | 1250 | ✅ Mantenere versione estesa |
| Imports | Base (no csv, json) | +csv, +json | ✅ Mantenere imports estesi |
| Documentazione | Minima | Docstring completa | ✅ Mantenere docstring |
| Known failures | ❌ Non presente | ✅ Presente | ✅ Mantenere sistema known failures |
| Statistiche | ❌ Non presente | ✅ Presente (test_statistics) | ✅ Mantenere tracking statistiche |
1.2 Configurazione Costanti
# TARGET2 (Funzionante):
NUMBER_OF_REPETITIONS = 2
PBIT_SEC_TIME = 182
# VERSIONE CORRENTE:
NUMBER_OF_REPETITIONS = 10
PBIT_SEC_TIME = 180
EXPORT_STATISTICS_CSV = True
⚠️ AZIONE 1.2.1: Considerare se target2 usa 182 secondi per motivi specifici (timeout hardware più lungo). Testare entrambi i valori.
⚠️ AZIONE 1.2.2: Il numero di ripetizioni più basso (2) può essere dovuto a testing manuale. Mantenere configurabile (default 10).
1.3 Logica di Power Cycling - DIFFERENZA CRITICA
TARGET2 (Funzionante):
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
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
# Nel test loop:
power_grifo_off(4, 1) # wait_after=4s, wait_before=1s
power_grifo_on(0.100) # wait_after=100ms
VERSIONE CORRENTE:
def power_grifo_off(wait_after=0):
setValue(theBrainBox,False,'MAIN_POWER')
ret,err = check(theBrainBox,0,'MAIN_POWER',timeout=0.1)
time.sleep(wait_after)
return ret
def power_grifo_on(wait_after=0):
setValue(theBrainBox,True,'MAIN_POWER')
ret,err = check(theBrainBox,1,'MAIN_POWER')
time.sleep(wait_after)
return ret
# Nel test loop (quando chiamate):
power_grifo_off() # Nessun parametro
power_grifo_on(0.100)
🔴 AZIONE 1.3.1 - CRITICA: Aggiungere parametro wait_before a entrambe le funzioni power_grifo_on() e power_grifo_off() in test_common_function.py.
🔴 AZIONE 1.3.2 - CRITICA: Modificare le chiamate in GRIFO_M_PBIT.py per usare power_grifo_off(4, 1) come in target2.
Motivazione: Il wait_before potrebbe essere necessario per stabilizzare l'hardware prima di cambiare lo stato di alimentazione. Questa è una differenza comportamentale significativa.
1.4 Logica "Force Check" B8 Drill-Down - DIFFERENZA FUNZIONALE
TARGET2 (Funzionante):
no_fail=True
for lru in lru_fields:
ret_proc_sts, err= check(theGrifo1553,"false",
"B6_MsgRdrSettingsAndParametersTellback",
lru)
if ret_proc_sts is False: no_fail=False
# ATTENZIONE: Forza sempre il check B8
no_fail=False # force check (to verify SW req.) and to obtain a valid step fail statistic
if no_fail is False:
logging.info("Check BIT Report...")
for f in bit_fields:
ret_error_field, err = check(theGrifo1553,"false","B8_MsgBitReport",f)
test_return = (test_return and ret_error_field)
VERSIONE CORRENTE:
# Logica più complessa con known_failures, drill-down condizionale
# B8 viene eseguito SOLO se ci sono REAL failures (non known)
b6_pass_count = 0
b6_fail_count = 0
b6_known_fail_count = 0
b6_failures = []
b6_known_failures = []
for lru_field in lru_fields:
ret, value, err = check(theGrifo1553, "false",
"B6_MsgRdrSettingsAndParametersTellback", lru_field)
if not ret:
if lru_field in KNOWN_FAILURES:
b6_known_fail_count += 1
b6_known_failures.append((lru_field, value))
else:
b6_fail_count += 1
b6_failures.append((lru_field, value))
else:
b6_pass_count += 1
# B8 drill-down SOLO se ci sono REAL failures
if b6_fail_count > 0:
logging.info("Real B6 failures detected, performing B8 drill-down...")
# ... logica B8 ...
⚠️ AZIONE 1.4.1: Valutare se target2 forza sempre il check B8 per requisiti software specifici (statistiche, tracciabilità). Il commento dice "to verify SW req. and to obtain a valid step fail statistic".
⚠️ AZIONE 1.4.2: Se necessario, aggiungere un flag di configurazione FORCE_B8_DRILL_DOWN che permetta di forzare il check B8 anche quando ci sono solo known failures. Esempio:
FORCE_B8_DRILL_DOWN = True # Force B8 check for all runs (as in target2)
# Nel codice:
if b6_fail_count > 0 or (FORCE_B8_DRILL_DOWN and b6_known_fail_count > 0):
logging.info("Performing B8 drill-down...")
# ... logica B8 ...
Motivazione: La versione target2 raccoglie sempre le statistiche B8, il che può essere un requisito di test per avere tracciabilità completa anche quando non ci sono failure reali.
1.5 BIT Fields Commentati
TARGET2:
- Molti campi di
bit_fieldssono commentati pedestal_statusè commentato inlru_fields
VERSIONE CORRENTE:
- Usa sistema
KNOWN_FAILURESinvece di commentare - Tutti i campi sono attivi
✅ AZIONE 1.5.1: Mantenere il sistema KNOWN_FAILURES - è più pulito e tracciabile rispetto ai commenti.
1.6 Funzioni tgt_gen() e tgt_gen_alone()
TARGET2:
def tgt_gen(interface):
return # Funzione disabilitata con return immediato
# ... codice commentato per target generation test ...
def tgt_gen_alone(interface):
return # Funzione disabilitata
# ... codice commentato ...
VERSIONE CORRENTE:
- Queste funzioni non esistono più
✅ AZIONE 1.6.1: Non riportare queste funzioni - erano legacy code disabilitato. La nostra versione è più pulita.
2. DIFFERENZE IN test_common_function.py
2.1 Parametro wait_before - CRITICA
File: TestEnvironment/env/test_common_function.py
TARGET2:
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:
def power_grifo_on(wait_after=0):
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):
setValue(theBrainBox,False,'MAIN_POWER')
ret,err = check(theBrainBox,0,'MAIN_POWER',timeout=0.1)
time.sleep(wait_after)
return ret
🔴 AZIONE 2.1.1 - PRIORITÀ ALTA:
Modificare entrambe le funzioni in test_common_function.py:
def power_grifo_on(wait_after=0, wait_before=0):
time.sleep(wait_before) # ← AGGIUNGERE QUESTA RIGA
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) # ← AGGIUNGERE QUESTA RIGA
setValue(theBrainBox,False,'MAIN_POWER')
ret,err = check(theBrainBox,0,'MAIN_POWER',timeout=0.1)
time.sleep(wait_after)
return ret
Compatibilità: Mantenere wait_before=0 come default preserva la retrocompatibilità con tutti i chiamanti esistenti.
3. DIFFERENZE IN leo_grifo_terminal.py
3.1 Statistiche Seriale
TARGET2:
- NON ha statistiche seriale
- Semplice callback con logging
VERSIONE CORRENTE:
- ✅ Sistema completo di statistiche (
_serial_stats) - ✅ Tracking di %%E, %%F, RECYCLE
- ✅ Metodi
get_serial_statistics()ereset_serial_statistics()
✅ AZIONE 3.1.1: Mantenere le statistiche seriale - sono un valore aggiunto della nostra versione.
4. DIFFERENZE IN leo_grifo_1553.py
4.1 Lazy Proxy Pattern
TARGET2:
- Singleton diretto:
theGrifo1553 = GrifoInstrumentInterface(0.2) - Nessun sistema di lazy initialization
VERSIONE CORRENTE:
- ✅ Sistema
_LazyGrifoProxyper simulation mode - ✅ Permette monkey-patching per mocks
✅ AZIONE 4.1.1: Mantenere il lazy proxy - è necessario per la simulation mode che target2 non ha.
5. DIFFERENZE IN leo_grifo_io_box.py
5.1 Identico
Risultato: I file leo_grifo_io_box.py in target2 e nella versione corrente sono identici.
✅ AZIONE 5.1.1: Nessuna modifica necessaria.
6. FUNZIONALITÀ NUOVE DA PRESERVARE
Le seguenti features della versione corrente NON sono presenti in target2 e devono essere mantenute:
6.1 Sistema Known Failures
- Lista
KNOWN_FAILURESconfigurabile - Distinzione tra real failures e known failures
- Reporting separato
6.2 Statistiche Aggregate
- Dizionario
test_statisticsglobale - Tracking per-run di:
pbit_timebit_availablesuccess/fail countsB6/B8 statistics
6.3 Export CSV
- Flag
EXPORT_STATISTICS_CSV - Generazione file CSV con timing e failures
6.4 Report PDF Avanzato
- Funzione
generate_final_statistics_report() - Formattazione professionale
- Grafici e tabelle
6.5 Simulation Mode
--simulateflag- Mock objects in
GRIFO_M_PBIT_mock.py - Lazy proxy pattern
6.6 GUI Launcher
GRIFO_M_PBIT_gui.py- Selezione interattiva parametri
7. PIANO DI IMPLEMENTAZIONE MODIFICHE
PRIORITÀ ALTA (Implementare subito)
Modifica 1: Aggiungere wait_before alle funzioni power
File: TestEnvironment/env/test_common_function.py
Modifica:
def power_grifo_on(wait_after=0, wait_before=0):
time.sleep(wait_before) # ← NUOVA RIGA
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) # ← NUOVA RIGA
setValue(theBrainBox,False,'MAIN_POWER')
ret,err = check(theBrainBox,0,'MAIN_POWER',timeout=0.1)
time.sleep(wait_after)
return ret
Retrocompatibilità: ✅ Default wait_before=0 preserva comportamento esistente
Modifica 2: Usare wait_before nelle chiamate power
File: TestEnvironment/scripts/GRIFO_M_PBIT.py
Localizzazione: Cerca le chiamate a power_grifo_off() nel loop principale
Modifica:
# PRIMA:
power_grifo_off(4)
# DOPO:
power_grifo_off(wait_after=4, wait_before=1) # Come in target2
Motivazione: Target2 usa 1 secondo di wait_before per stabilizzare hardware prima di spegnere.
PRIORITÀ MEDIA (Testare e valutare)
Modifica 3: Valutare timeout PBIT
File: TestEnvironment/scripts/GRIFO_M_PBIT.py
Test:
- Eseguire test con
PBIT_SEC_TIME = 180(corrente) - Eseguire test con
PBIT_SEC_TIME = 182(target2) - Verificare se ci sono timeout con 180s
Azione: Se si verificano timeout, aumentare a 182s.
Modifica 4: Aggiungere flag FORCE_B8_DRILL_DOWN
File: TestEnvironment/scripts/GRIFO_M_PBIT.py
Modifica:
# Nella sezione configurazione:
FORCE_B8_DRILL_DOWN = False # Set True to force B8 check even with only known failures
# Nel codice B8 drill-down:
if b6_fail_count > 0 or (FORCE_B8_DRILL_DOWN and b6_known_fail_count > 0):
logging.info("Performing B8 drill-down...")
# ... existing B8 logic ...
Motivazione: Permette di replicare il comportamento target2 quando necessario, ma mantiene la logica ottimizzata come default.
PRIORITÀ BASSA (Nice to have)
Modifica 5: Documentare differenza force check
File: GRIFO_M_PBIT.py docstring
Aggiungere nota:
"""
...
Configuration Options:
FORCE_B8_DRILL_DOWN: If True, always perform B8 drill-down even when only
known failures are detected (matches target2 behavior
for complete SW requirement verification).
...
"""
8. CHECKLIST PRE-DEPLOYMENT
Prima di considerare le modifiche complete:
- Implementata Modifica 1 (wait_before in power functions)
- Implementata Modifica 2 (wait_before nelle chiamate)
- Testato in simulation mode con nuove modifiche
- Testato su hardware (se disponibile) con nuove modifiche
- Verificato che KNOWN_FAILURES funzioni correttamente
- Verificato che CSV export funzioni
- Verificato che PDF report sia generato
- Verificato retrocompatibilità con script esistenti
- Valutato se implementare FORCE_B8_DRILL_DOWN
- Testato timeout PBIT (180 vs 182 secondi)
9. ANALISI RISCHI
Rischio 1: wait_before Timing
Probabilità: Bassa
Impatto: Medio
Mitigazione: Test estensivo con timing diversi. Default 0 mantiene comportamento attuale.
Rischio 2: Force Check B8
Probabilità: Bassa
Impatto: Basso
Mitigazione: Flag configurabile permette di abilitare solo se necessario.
Rischio 3: Timeout PBIT
Probabilità: Media
Impatto: Alto (test fallisce prematuramente)
Mitigazione: Monitorare log per timeout reali, aumentare se necessario.
10. CONCLUSIONI
Modifiche Essenziali (MUST HAVE):
- ✅ Aggiungere parametro
wait_beforealle funzioni power - ✅ Usare
power_grifo_off(4, 1)come in target2
Modifiche Opzionali (NICE TO HAVE):
- ⚠️ Valutare
PBIT_SEC_TIME = 182vs 180 - ⚠️ Implementare flag
FORCE_B8_DRILL_DOWN
Features da Mantenere:
- Sistema Known Failures
- Statistiche aggregate
- Export CSV
- Report PDF avanzato
- Simulation mode
- GUI launcher
- Tracking seriale
Verdetto Finale:
La versione corrente è significativamente più avanzata di target2. Le uniche modifiche critiche da riportare sono i timing di power cycling (wait_before). Tutto il resto sono features nuove che target2 non ha e che dobbiamo preservare.
ALLEGATI
A. Differenze Dimensionali
| File | Target2 (righe) | Corrente (righe) | Delta |
|---|---|---|---|
| GRIFO_M_PBIT.py | 379 | 1250 | +871 |
| leo_grifo_terminal.py | 48 | 126 | +78 |
| leo_grifo_1553.py | 148 | 211 | +63 |
| leo_grifo_io_box.py | 78 | 78 | 0 |
| test_common_function.py | ~85 | ~85 | 0 |
B. Files Presenti Solo in Target2
brainbox_interface - Copia.py(backup file, ignorare)GRIFO_M_PBIT - Copia.py(backup file, ignorare)GRIFO_M_PBIT - Copia (2).py(backup file, ignorare)GRIFO_M_PBIT.py.bak(backup file, ignorare)- Log files (runtime artifacts)
C. Files Presenti Solo in Versione Corrente
GRIFO_M_PBIT_mock.py(simulation support)GRIFO_M_PBIT_gui.py(GUI launcher)GRIFO_M_PBIT_simulate_launcher.py(simulation wrapper)test_lazy_proxy.py(unit test)LAZY_INITIALIZATION_GUIDE.md(documentation)IMPLEMENTATION_SUMMARY.md(documentation)
Fine Analisi
Data: 2 Febbraio 2026
Revisione: 1.0