# tpdDiangosticGenerator

# ⚙️ tpdDiangosticGenerator

La classe tpdDiangosticGenerator è il cuore pulsante del sistema diagnostico. Si occupa di generare automaticamente i modelli diagnostici e i pulsanti di navigazione per diverse componenti hardware e di sicurezza del progetto.

Con questa classe, la configurazione e la gestione della diagnostica diventano semplici, rapide e centralizzate.

## 🚦 Panoramica generale

Il generatore lavora su due fronti principali:

- Modelli diagnostici: rappresentazioni strutturate di assi, alimentatori, sicurezza, ecc.
- Pulsanti di navigazione: bottoni che permettono di accedere rapidamente alle schermate diagnostiche relative ai modelli.

## 🛠️ Metodi principali

Metodo | Descrizione | Note
--- | --- | ---
`GenerateALL()` | Genera tutti i modelli e i pulsanti, invocando i metodi specifici sottostanti. | Metodo “one-shot”
`GenerateAllModels()` | Invoca la generazione di tutti i modelli specifici (assi, PSU, sicurezza, ecc.) |
`GenerateAllButtons()` | Invoca la generazione di tutti i pulsanti specifici per ogni modello diagnostico |
`GenerateAxisModel()` | Genera i modelli degli assi sulla base dei tag `stStandardAxis`. | Usa `AxisType`
`GenerateAxisButtons()` | Crea i pulsanti di navigazione collegati agli assi, puntando alla pagina diagnostica asse `_810_DiagAxis` |
`GeneratePSUModel()` | Genera i modelli per le unità di alimentazione (`PSUType`). |
`GeneratePSUButtons()` | Pulsanti per le PSU, con link alla pagina `_814_DiagPSU`. |
`GenerateDCSModel()` | Genera modelli per i componenti di sicurezza `SafetyDCSType` basati su tag `DCI_STOP`. |
`GenerateCROUTModel()` | Modelli sicurezza `SafetyCROUTType` basati su tag `CONFIGURABLE_ROUT`. |
`GenerateFPMSModel()` | Modelli sicurezza `SafetyFPMSType` basati su tag `FIVE_POS_MODE_SELECTOR`. |
`GenerateSafetyButtons()` | Pulsanti per la sicurezza, puntano a `_830_DiagSafety`. |

## 🧰 Come funziona “sotto il cofano”

Il fulcro del generatore è il metodo privato `GenerateModels`, che:

1. Cerca nelle cartelle di comunicazione i tag corrispondenti al tipo specificato (es. `stStandardAxis`).
2. Per ogni tag, crea (o trova) un modello corrispondente nella cartella modelli.
3. Imposta un nome leggibile e associa un puntatore al tag originale.

Analogamente, `GenerateButtons` crea per ogni modello un pulsante di navigazione nella pagina diagnostica dedicata, utilizzando un template di pulsante personalizzato.

## 💡 Funzioni di supporto utili

- `ExtractReadableName(string variableName)`: estrae un nome utente-friendly da un nome di variabile tecnica, inserendo spazi e capitalizzando correttamente.
  Es.: `"Axis_X1"` → `"X 1"`

# 🔍 In Depth: Funzioni di tpdDiangosticGenerator

### `GenerateALL()`

> Descrizione:
> Metodo principale “one-shot” che rigenera tutti i modelli diagnostici e tutti i pulsanti di navigazione in un solo colpo.
> È pensato per un uso “a caldo” dopo modifiche estese ai tag o alla struttura del progetto.

> Dettagli tecnici:
> Invoca internamente `GenerateAllModels()` e `GenerateAllButtons()`, orchestrando così la generazione completa della diagnostica.

> Esempio d’uso:

>     diagnosticGenerator.GenerateALL();

> Nota da interfaccia Optix:
> È possibile eseguire questo metodo cliccando con il tasto destro sull’oggetto design time NetLogic o sul suo genitore e selezionando Execute GenerateALL.

### `GenerateAllModels()`

> Descrizione:
> Chiama i generatori specifici per ogni categoria di modello diagnostico (assi, PSU, sicurezza), in modo ordinato e modulare.

> Modelli generati:

> - Assi (Axis)
> - Alimentatori (PSU)
> - Componenti di sicurezza (DCS, CROUT, FPMS)

### `GenerateAllButtons()`

> Descrizione:
> Genera i pulsanti di navigazione associati ai modelli diagnostici appena creati, suddivisi per categoria (assi, PSU, sicurezza).

### `GenerateAxisModel()`

> Descrizione:
> Scansiona i tag di tipo `stStandardAxis` presenti nei driver di comunicazione e genera i modelli `AxisType` corrispondenti.

> Dettagli:
> Imposta la proprietà `AxisPointer` del modello con il riferimento al tag originale.

### `GenerateAxisButtons()`

> Descrizione:
> Per ogni modello asse generato, crea un pulsante di navigazione che punta alla schermata diagnostica asse `_810_DiagAxis`.

### `GeneratePSUModel()`

> Descrizione:
> Genera i modelli `PSUType` per tutti i tag di tipo `stPowerSupply` trovati, collegandoli opportunamente.

### `GeneratePSUButtons()`

> Descrizione:
> Crea i pulsanti di navigazione per ogni modello PSU, collegati alla pagina `_814_DiagPSU`.

### `GenerateDCSModel()`

> Descrizione:
> Genera modelli diagnostici per i componenti di sicurezza `SafetyDCSType` basandosi sui tag `DCI_STOP`.

### `GenerateCROUTModel()`

> Descrizione:
> Genera modelli `SafetyCROUTType` per tag `CONFIGURABLE_ROUT` correlati ai sistemi di sicurezza configurabili.

### `GenerateFPMSModel()`

> Descrizione:
> Genera modelli `SafetyFPMSType` basati sui tag `FIVE_POS_MODE_SELECTOR`, tipici di selettori modalità a 5 posizioni.

### `GenerateSafetyButtons()`

> Descrizione:
> Crea i pulsanti di navigazione per tutti i modelli di sicurezza, puntando alla schermata `_830_DiagSafety`.

### `ExtractReadableName(string variableName)`

> Descrizione:
> Estrae un nome leggibile e “user-friendly” da un nome tecnico di variabile.
> Ad esempio: `"Axis_X1"` diventa `"X 1"`.

> Come funziona:

> - Prende l’ultima parte dopo l’ultimo underscore
> - Inserisce spazi prima di lettere maiuscole o cifre
> - Formattta la stringa con la prima lettera maiuscola, il resto minuscolo

### `GenerateModels(string modelFolderPath, string tagTypeName, Type modelType, string pointerVariableName)`

> Descrizione:
> Metodo generico interno per creare i modelli diagnostici.

> - Cerca nelle cartelle di comunicazione i tag con il tipo specificato.
> - Per ciascun tag, crea o recupera un modello corrispondente nella cartella modelli.
> - Imposta il nome leggibile e il puntatore al tag originale.

### `GenerateButtons(string modelFolderPath, string diagnosticPagePath)`

> Descrizione:
> Per ogni modello nella cartella indicata, crea (o riusa) un pulsante di navigazione nella pagina diagnostica specificata.
> Usa un template di pulsante predefinito per mantenere l’uniformità grafica e funzionale.

### `CreateModel(TagStructure tag, Type modelType, Folder modelsFolder)`

> Descrizione:
> Crea un nuovo oggetto modello con il nome del tag e del tipo specificato, e lo inserisce nella cartella dei modelli.

### `PopulateModel(IUAObject model, TagStructure tag, string pointerVariableName)`

> Descrizione:
> Riempie il modello con un nome leggibile e imposta la variabile puntatore con il NodeId del tag originale.

### `CreateButton(string browseName, ScreenType diagnosticScreen)`

> Descrizione:
> Crea un nuovo pulsante di navigazione utilizzando il template `tpButtNavigationDiagnostic`, lo aggiunge al layout della schermata diagnostica e lo restituisce per ulteriori configurazioni.