# tpPopulateIORack

# ⚙️ tpPopulateIORack

La classe tpPopulateIORack è una NetLogic che si occupa di popolare dinamicamente la UI con le schede IO (Input/Output) di un rack remoto, basandosi su una configurazione YAML e strutture dati presenti nel progetto Factory Talk Optix.

> ⚠️ Nota: La configurazione YAML viene deserializzata in oggetti C# di tipo IOCardConfig (definiti in un file dedicato, IOCardConfig.md).
> Questa classe rappresenta la struttura dei dati usata per leggere la configurazione e differenziare schede normali e safety.

## 🚦 Panoramica generale

La logica si basa su:

- Un file di configurazione YAML (`io_card_config.yaml`) che descrive le caratteristiche e tipologie delle schede IO, corrispondente alla classe `IOCardConfig`.
- Folder di progetto contenenti i template grafici (di tipo `RectangleType`) per le schede IO da istanziare.
- Un folder `CommDrivers` che contiene le variabili remote corrispondenti ai dispositivi IO fisici.
- Un layout UI (`RemoteIOBackplane`) dove vengono aggiunte dinamicamente le schede.

## 🛠️ Funzionamento principale

Elemento | Descrizione
--- | ---
`Populate()` | Metodo pubblico esportato per avviare il popolamento tramite task asincrono a lunga durata.
`LoadConfiguration()` | Legge e deserializza il file YAML con la configurazione delle schede IO in oggetti `IOCardConfig`.
`InitializeNodeTypes()` | Recupera i template grafici (RectangleType) per ogni tipo di scheda configurata.
`PopulateIOCards()` | Crea e aggiunge i nodi scheda nel layout UI, sincronizzando l’ordine con un meccanismo di semafori.

# 🔍 In Depth: Funzioni di tpPopulateIORack

### `Populate()`

> Descrizione:
> Avvia il processo di popolamento della UI.
> Esegue in background la lettura della configurazione, l’inizializzazione dei template e la creazione dinamica delle schede IO.

### `LoadConfiguration()`

> Descrizione:
> Legge il file YAML di configurazione (`io_card_config.yaml`) e lo deserializza in oggetti IOCardConfig per uso interno.

### `InitializeNodeTypes()`

> Descrizione:
> Carica i template grafici (`RectangleType`) associati a ciascun tipo di scheda definito nella configurazione YAML.

### `PopulateIOCards()`

> Descrizione:
> Per ogni slot del rack (da 1 a 64), verifica la presenza di dispositivi remoti e crea le schede IO normali o di sicurezza corrispondenti, aggiungendole al layout UI.

### `TryCreateAndAddNormalCard()`

> Descrizione:
> Tenta di creare e aggiungere una scheda IO normale basata sulla configurazione e i dati trovati nel folder `CommDrivers`.

### `TryCreateAndAddSafetyCard()`

> Descrizione:
> Tenta di creare e aggiungere una scheda IO di sicurezza, gestendo input e output associati.

### `MakeCardAndAddToLayout()`

> Descrizione:
> Metodo interno che istanzia la scheda IO, imposta le proprietà comuni e la inserisce ordinatamente nel layout UI, rispettando la sincronizzazione con i semafori.

### `SetCardCommonProperties()`

> Descrizione:
> Imposta variabili comuni della scheda (come indice, nome, colori LED) per assicurare la corretta rappresentazione grafica e funzionale.

## 🗂️ Esempio di configurazione YAML (`io_card_config.yaml`)

    normalIoCards:
      AB:1734_DI8:C:0:
        type: IB8
        nodeType: IOCard_8B
        iODirection: I
        colors:
          card: 0xff1b83df
          led_on: 0xff00fa7e
          led_off: 0xff0f4d29

      AB:1734_DOB8:C:0:
        type: OB8
        nodeType: IOCard_8B
        iODirection: O
        colors:
          card: 0xff40aa84
          led_on: 0xffea2e2e
          led_off: 0xff500f0f

    safetyIoCards:
      AB:1734_IB8S_Safety2:I:0:
        outputType: AB:1734_IB8S:O:0
        type: IB8S
        nodeType: IOCard_8BS
        iODirection: I
        colors:
          card: 0xffe4564b
          led_on: 0xff00fa7e
          led_off: 0xff0f4d29