# Note di Implementazione ICD - Discrepanze e Decisioni

**Documento**: Tracciamento discrepanze tra specifica ICD e implementazione di riferimento  
**Riferimento ICD**: `ICD_DECD_FTH - GRIFO-F_TH, Data Exchange Control Document for, rev -A, Draft 2`  
**Implementazione di Riferimento**: GrifoScope C++ (`th_b1553_icd.h`)  
**Data Prima Revisione**: Dicembre 2025

---

## 🎯 Principio Guida

**In caso di discrepanza tra ICD documento e implementazione C++ GrifoScope, si segue SEMPRE l'implementazione C++.**

**Motivazioni**:
1. GrifoScope è il software di riferimento testato e funzionante sul campo
2. Il simulatore radar GRIFO-F/TH risponde ai messaggi codificati secondo l'implementazione C++
3. La compatibilità binaria con il sistema esistente è requisito critico
4. L'ICD documento potrebbe contenere errori di trascrizione o versioni superate

---

## 📋 Discrepanze Identificate

### 1. Designation Control Field (A2/01 e B7/01)

**ICD Documento** (Sezione 7.1.2.1 - Tab. A2/01-B):
```
Field B: Designation Control
Bit No: 04, 05, 06, 07 (4 bits)
NOT VALID = decimal 15 (0b1111)
```

**Implementazione C++ GrifoScope** (`th_b1553_icd.h`, linee 434-444):
```cpp
typedef idd_bitfield_u16_t<IDD_REVBIT16(6), 3, des_control_t> des_control_field_t;
//                          IDD_REVBIT16(6) → LSB position = 15-6 = 9
//                                       ^^^ Width = 3 bits (NON 4!)

enum des_control_t {
  LOCK_ON,           // 0
  LOCK_ON_DTT,       // 1
  TRANS_HPT_BUT,     // 2
  REJECT,            // 3
  LOCK_ON_STT,       // 4
  DES_TRACK_LABEL,   // 5
  EXEC_SAR,          // 6
  NOT_VALID          // 7 (massimo rappresentabile con 3 bits)
};
```

**Decisione Implementativa**:
- ✅ **Adottato**: 3 bits, range 0-7, NOT_VALID = 7
- ❌ **Scartato**: 4 bits, range 0-15, NOT_VALID = 15

**Impatto**:
- Tutti i bit successivi in Word A2/01 e B7/01 shiftati di 1 posizione verso sinistra
- File modificati:
  - `pybusmonitor1553/lib1553/constants.py`: `DesignationControl` enum corretta
  - `pybusmonitor1553/lib1553/messages/msg_a2.py`: `designation_ctrl` width=3
  - `pybusmonitor1553/lib1553/messages/msg_b7.py`: `designation_status` width=3

**Verifica Compatibilità**:
```python
# Test: tools/compare_a2_messages.py
# Risultato: ✓ MATCH binario al 100% con encoding C++ atteso
Phase 1: Expected=0x0E88, Actual=0x0E88 ✓
Phase 2: Expected=0x0E00, Actual=0x0E00 ✓
```

---

## 🔍 Metodologia di Verifica

Quando si implementano nuovi messaggi o si modificano strutture esistenti:

### Step 1: Confronto ICD vs C++

```bash
# Leggere definizione ICD documento
doc/ICD_DECD_FTH...md → Sezione specifica messaggio

# Verificare implementazione C++ (fonte di verità)
___OLD/_old/cpp/GrifoScope/GrifoSdkEif/pub/TH/th_b1553_icd.h
```

### Step 2: Analisi Typedef C++

La macro `IDD_REVBIT16(N)` converte bit ICD MSB-first a LSB position:
```cpp
#define IDD_REVBIT16(pos) (15 - pos)

// Esempio:
typedef idd_bitfield_u16_t<IDD_REVBIT16(8), 1, stby_selection_t> stby_field_t;
// IDD_REVBIT16(8) = 15-8 = 7 (LSB shift position)
// Width = 1 bit
// In MSB numbering: 15-7 = Bit 8 (ICD)
```

### Step 3: Implementazione Python

```python
# msg_aX.py o msg_bX.py
field_name = EnumField(
    word_index=X,
    start_bit=N,    # Numero bit ICD (MSB-first, 0-15)
    width=W,        # Width da C++ typedef
    enum_cls=EnumClass
)

# La classe Field calcola automaticamente:
# _shift = 16 - (start_bit + width)
```

### Step 4: Test Binario

```python
# Creare test dedicato simile a tools/compare_a2_messages.py
# Verificare encoding word-per-word contro valori attesi C++
assert actual_word == expected_cpp_word, f"Mismatch: 0x{actual_word:04X} != 0x{expected_cpp_word:04X}"
```

---

## 📊 Tabella Riepilogativa Campi Critici

| Messaggio | Word | Campo | ICD Bits | C++ Bits | Python start_bit | Python width |
|-----------|------|-------|----------|----------|------------------|--------------|
| A2 | 01 | master_mode | 00-03 | 00-03 | 0 | 4 |
| A2 | 01 | designation_ctrl | 04-07 ❌ | 04-06 ✅ | 4 | 3 |
| A2 | 01 | int_bit_req | 08 ❌ | 07 ✅ | 7 | 1 |
| A2 | 01 | standby_cmd | 09 ❌ | 08 ✅ | 8 | 1 |
| A2 | 01 | freeze_cmd | 10 ❌ | 09 ✅ | 9 | 1 |
| A2 | 01 | pwr_up_stop | 11 ❌ | 10 ✅ | 10 | 1 |
| A2 | 01 | reserved | 12 ❌ | 11 ✅ | 11 | 1 |
| A2 | 01 | silence | 13 ❌ | 12 ✅ | 12 | 1 |
| B7 | 01 | master_mode_tb | 00-03 | 00-03 | 0 | 4 |
| B7 | 01 | designation_status | 04-07 ❌ | 04-06 ✅ | 4 | 3 |
| B7 | 01 | int_bit_status | 08 ❌ | 07 ✅ | 7 | 1 |
| B7 | 01 | standby_status | 09 ❌ | 08 ✅ | 8 | 1 |
| B7 | 01 | freeze_status | 10 ❌ | 09 ✅ | 9 | 1 |
| B7 | 01 | degraded_status | 11 ❌ | 10 ✅ | 10 | 1 |
| B7 | 01 | reserved | 12 ❌ | 11 ✅ | 11 | 1 |
| B7 | 01 | rf_radiation_status | 13 ❌ | 12 ✅ | 12 | 1 |
| B7 | 01 | transition_status | 14 ❌ | 13 ✅ | 13 | 1 |
| B7 | 01 | last_acq_result | 15 ❌ | 14 ✅ | 14 | 1 |

**Legenda**:
- ❌ = ICD documento (ERRATO, non usare)
- ✅ = Implementazione C++ (CORRETTO, usato nel codice)

---

## 🔄 Storia Revisioni

| Data | Autore | Modifiche |
|------|--------|-----------|
| 2025-12-12 | AI/Developer | Documento creato. Identificata discrepanza Designation Control (3 vs 4 bits). Corretti A2/01 e B7/01. Verificata compatibilità binaria. |

---

## 📞 Contatti e Segnalazioni

Se vengono identificate nuove discrepanze:

1. **Non modificare il codice** basandosi solo sull'ICD documento
2. **Verificare** sempre con `th_b1553_icd.h` C++
3. **Documentare** in questo file la discrepanza trovata
4. **Testare** compatibilità binaria con test dedicato
5. **Aggiornare** tabella riepilogativa

---

## 🔗 Riferimenti

- **ICD Documento**: `doc/ICD_DECD_FTH - GRIFO-F_TH, Data Exchange Control Document for, rev -A, Draft 2.md`
- **Header C++ Riferimento**: `___OLD/_old/cpp/GrifoScope/GrifoSdkEif/pub/TH/th_b1553_icd.h`
- **Implementazione Simulator**: `___OLD/_old/cpp/GrifoScope/GrifoMCS/GADS/MCS/MCS_G346/g346/g346_a1a2.cpp`
- **Architettura Tecnica**: `doc/Technical-Architecture.md` (Sezione 2.4)
- **Test Compatibilità**: `tools/compare_a2_messages.py`
