+NiDevice = {
    Class               = NI9157Device
    NiRioDeviceName     = "RIO0"
    NiRioSerialNumber   = "0x01E4B4D5"
    NiRioGenFile        = "/opt/codac/ampegon-ps-tb/BitStreams/AmpegonPsTb_NI9159_V2.lvbitx"
    NiRioGenSignature   = "455F662BA8258B060FD324C9DEF38604"
    Open                = 1
    Run                 = 1
    Reset               = 1
    Clear               = 1
    ResetPostSleepMs    = 120
}

+StateMachine = {
    Class = StateMachine
    +INITIAL = {
        Class = ReferenceContainer
        +START = {
            Class = StateMachineEvent
            NextState = "PRE_CFG"
            NextStateError = "ERROR"
            Timeout = 0
            +OpenDANWriterT1 = {
                Class = Message
                Destination = "TbTestApp.Data.DANWriterT1"
                Function = OpenStream
                Mode = ExpectsReply
            }                
            +OpenDANWriterT2 = {
                Class = Message
                Destination = "TbTestApp.Data.DANWriterT2"
                Function = OpenStream
                Mode = ExpectsReply
            }
            +OpenDANWriterT3 = {
                Class = Message
                Destination = "TbTestApp.Data.DANWriterT3"
                Function = OpenStream
                Mode = ExpectsReply
            }             
            +ChangeToStateIdleMsg = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = PrepareNextState
                +Parameters = {
                    Class = ConfigurationDatabase
                    param1 = PreCfg
                }
            }
            +StartNextStateExecutionMsg = {
                Class = Message
                Destination = TbTestApp
                Function = StartNextStateExecution
                Mode = ExpectsReply
            }
        }
    }
    +PRE_CFG = {
        Class = ReferenceContainer
        +ENTER = {
            Class = ReferenceContainer
            // Set Current State
            +SetCurrentState = {
                Class = Message
                Destination = TbTestApp.Functions.AppStateMachineState
                Function = SetOutput
                +Parameters = {
                    Class = ConfigurationDatabase
                    SignalName = SMState_DDB1
                    SignalValue = 1
                }
            }
            // Enable DANWriterWriteT1
            +EnableDANWriterWriteT1 = {
                Class = Message
                Destination = TbTestApp.Functions.DANWriterWriteEnable
                Function = SetOutput
                +Parameters = {
                    Class = ConfigurationDatabase
                    SignalName = DANWriterEnable_DDB1
                    SignalValue = 1
                }
            }
        }
        +GOTO_MXI_CFG = {
            Class = StateMachineEvent
            NextState = "MXI_CFG"
            NextStateError = "ERROR"
            Timeout = 0
            // Prepare Next State
            +StopCurrentStateExecutionMsg = {
                Class = Message
                Destination = TbTestApp
                Function = StopCurrentStateExecution
                Mode = ExpectsReply
            }
            +PrepareRun = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = PrepareNextState
                +Parameters = {
                    Class = ConfigurationDatabase
                    param1 = MxiCfg
                }
            }
            +GoToNextState = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = StartNextStateExecution
            }
        }
        +GOTO_CFG_ERROR = {
            Class = StateMachineEvent
            NextState = "CFG_ERROR"
            NextStateError = "ERROR"
            Timeout = 0
            +StopCurrentStateExecutionMsg = {
                Class = Message
                Destination = TbTestApp
                Function = StopCurrentStateExecution
                Mode = ExpectsReply
            }
            +PrepareCfgError = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = PrepareNextState
                +Parameters = {
                    Class = ConfigurationDatabase
                    param1 = CfgError
                }
            }
            +GoToNextState = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = StartNextStateExecution
            }
        }
    }
    +MXI_CFG = {
        Class = ReferenceContainer
        +ENTER = {
            Class = ReferenceContainer
            // Set Current State
            +SetCurrentState = {
                Class = Message
                Destination = TbTestApp.Functions.AppStateMachineState
                Function = SetOutput
                +Parameters = {
                    Class = ConfigurationDatabase
                    SignalName = SMState_DDB1
                    SignalValue = 2
                }
            }
            // Trigger MXIConfigurationSupervisor Configuration
            +MxiCfgSup_MsgMode_1 = {
                Class = Message
                Destination = TbTestApp.Functions.MXIConfigurationSupervisor
                Function = MXIOperation
                +Parameters = {
                    Class = ConfigurationDatabase
                    param1 = 1
                    param2 = null
                    param3 = null
                    param4 = null
                }
            }
        }
        +GOTO_PLC_CFG = {
            Class = StateMachineEvent
            NextState = "PLC_CFG"
            NextStateError = "ERROR"
            Timeout = 0
            // Prepare Next State
            +StopCurrentStateExecutionMsg = {
                Class = Message
                Destination = TbTestApp
                Function = StopCurrentStateExecution
                Mode = ExpectsReply
            }
            +PrepareRun = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = PrepareNextState
                +Parameters = {
                    Class = ConfigurationDatabase
                    param1 = PlcCfg
                }
            }
            +GoToNextState = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = StartNextStateExecution
            }
        }
        +GOTO_CFG_ERROR = {
            Class = StateMachineEvent
            NextState = "CFG_ERROR"
            NextStateError = "ERROR"
            Timeout = 0
            +StopCurrentStateExecutionMsg = {
                Class = Message
                Destination = TbTestApp
                Function = StopCurrentStateExecution
                Mode = ExpectsReply
            }
            +PrepareCfgError = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = PrepareNextState
                +Parameters = {
                    Class = ConfigurationDatabase
                    param1 = CfgError
                }
            }
            +GoToNextState = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = StartNextStateExecution
            }
        }
    }
    +PLC_CFG = {
        Class = ReferenceContainer
        +ENTER = {
            Class = ReferenceContainer
            // Set Current State
            +SetCurrentState = {
                Class = Message
                Destination = TbTestApp.Functions.AppStateMachineState
                Function = SetOutput
                +Parameters = {
                    Class = ConfigurationDatabase
                    SignalName = SMState_DDB1
                    SignalValue = 3
                }
            }
            // Trigger PLCConfigurationSupervisor Configuration
            +PlcCfgSup_MsgMode_0 = {
                Class = Message
                Destination = TbTestApp.Functions.PlcConfigurationSupervisor
                Function = TriggerSelected
                +Parameters = {
                    Class = ConfigurationDatabase
                    param1 = 0
                    param2 = null
                    param3 = null
                    param4 = null
                }
            }
        }
        +GOTO_TEST_RUN = {
            Class = StateMachineEvent
            NextState = "TEST_RUN"
            NextStateError = "ERROR"
            Timeout = 0
            // Prepare Next State
            +StopCurrentStateExecutionMsg = {
                Class = Message
                Destination = TbTestApp
                Function = StopCurrentStateExecution
                Mode = ExpectsReply
            }
            +PrepareRun = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = PrepareNextState
                +Parameters = {
                    Class = ConfigurationDatabase
                    param1 = TestRun
                }
            }
            +GoToNextState = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = StartNextStateExecution
            }
        }
        +GOTO_CFG_ERROR = {
            Class = StateMachineEvent
            NextState = "CFG_ERROR"
            NextStateError = "ERROR"
            Timeout = 0
            +StopCurrentStateExecutionMsg = {
                Class = Message
                Destination = TbTestApp
                Function = StopCurrentStateExecution
                Mode = ExpectsReply
            }
            +PrepareCfgError = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = PrepareNextState
                +Parameters = {
                    Class = ConfigurationDatabase
                    param1 = CfgError
                }
            }
            +GoToNextState = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = StartNextStateExecution
            }
        }
    }
    +TEST_RUN = {
        Class = ReferenceContainer
        +ENTER = {
            Class = ReferenceContainer
            // Set Current State
            +SetCurrentState = {
                Class = Message
                Destination = TbTestApp.Functions.AppStateMachineState
                Function = SetOutput
                +Parameters = {
                    Class = ConfigurationDatabase
                    SignalName = SMState_DDB1
                    SignalValue = 4
                }
            }
        }
        +GOTO_TEST_POST = {
            Class = StateMachineEvent
            NextState = "TEST_POST"
            NextStateError = "ERROR"
            Timeout = 0
            // Prepare Next State
            +StopCurrentStateExecutionMsg = {
                Class = Message
                Destination = TbTestApp
                Function = StopCurrentStateExecution
                Mode = ExpectsReply
            }
            +PrepareTestPost = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = PrepareNextState
                +Parameters = {
                    Class = ConfigurationDatabase
                    param1 = TestPost
                }
            }
            +GoToNextState = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = StartNextStateExecution
            }
        }
    }
    +TEST_POST = {
        Class = ReferenceContainer
        +ENTER = {
            Class = ReferenceContainer
            // Set Current State
            +SetCurrentState = {
                Class = Message
                Destination = TbTestApp.Functions.AppStateMachineState
                Function = SetOutput
                +Parameters = {
                    Class = ConfigurationDatabase
                    SignalName = SMState_DDB1
                    SignalValue = 5
                }
            }
        }
        +GOTO_TEST_DONE = {
            Class = StateMachineEvent
            NextState = "TEST_DONE"
            NextStateError = "ERROR"
            Timeout = 0
            // Trigger PLCConfigurationSupervisor Disable
            // Not used in this test
            // Trigger MXIConfigurationSupervisor Disable
            +MxiCfgSup_MsgMode_2 = {
                Class = Message
                Destination = TbTestApp.Functions.MXIConfigurationSupervisor
                Function = MXIOperation
                +Parameters = {
                    Class = ConfigurationDatabase
                    param1 = 2
                    param2 = null
                    param3 = null
                    param4 = null
                }
            }
            // Flush DANWriterT2
            +FlushDANWriterT2 = {
                Class = Message
                Destination = TbTestApp.Data.DANWriterT2
                Function = CloseStream
                Mode = ExpectsReply
            }
            // Flush FileWriterBufferT2
            +FlushFileWriterBufferT2 = {
                Class = Message
                Destination = TbTestApp.Data.FileWriterBufferT2
                Function = FlushFile
                Mode = ExpectsReply
            }
            // Flush DANWriterT3
            +FlushDANWriterT3 = {
                Class = Message
                Destination = TbTestApp.Data.DANWriterT3
                Function = CloseStream
                Mode = ExpectsReply
            }
            +StopCurrentStateExecutionMsg = {
                Class = Message
                Destination = TbTestApp
                Function = StopCurrentStateExecution
                Mode = ExpectsReply
            }
            +PrepareTestDone = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = PrepareNextState
                +Parameters = {
                    Class = ConfigurationDatabase
                    param1 = TestDone
                }
            }
            +GoToNextState = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = StartNextStateExecution
            }
        }
    }
    +TEST_DONE = {
        Class = ReferenceContainer
        +ENTER = {
            Class = ReferenceContainer
            // Set Current State
            +SetCurrentState = {
                Class = Message
                Destination = TbTestApp.Functions.AppStateMachineState
                Function = SetOutput
                +Parameters = {
                    Class = ConfigurationDatabase
                    SignalName = SMState_DDB1
                    SignalValue = 7
                }
            }
        }
        +TEST_DONE_TASKS = {
            Class = StateMachineEvent
            NextState = "TEST_DONE"
            NextStateError = "ERROR"
            Timeout = 0
            // Disable DANWriterWriteT1
            +DisableDANWriterWriteT1 = {
                Class = Message
                Destination = TbTestApp.Functions.DANWriterWriteEnable
                Function = SetOutput
                +Parameters = {
                    Class = ConfigurationDatabase
                    SignalName = DANWriterEnable_DDB1
                    SignalValue = 0
                }
            }
            // Flush DANWriterT1
            +FlushDANWriterT1 = {
                Class = Message
                Destination = TbTestApp.Data.DANWriterT1
                Function = CloseStream
                Mode = ExpectsReply
            }
        }
        +GOTO_PRE_CFG = {
            Class = StateMachineEvent
            NextState = "PRE_CFG"
            NextStateError = "ERROR"
            Timeout = 0
            +StopCurrentStateExecutionMsg = {
                Class = Message
                Destination = TbTestApp
                Function = StopCurrentStateExecution
                Mode = ExpectsReply
            }
            +PreparePreCfg = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = PrepareNextState
                +Parameters = {
                    Class = ConfigurationDatabase
                    param1 = PreCfg
                }
            }
            +GoToNextState = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = StartNextStateExecution
            }
        }
    }
    +CFG_ERROR = {
        Class = ReferenceContainer
        +ENTER = {
            Class = ReferenceContainer
            // Set Current State
            +SetCurrentState = {
                Class = Message
                Destination = TbTestApp.Functions.AppStateMachineState
                Function = SetOutput
                +Parameters = {
                    Class = ConfigurationDatabase
                    SignalName = SMState_DDB1
                    SignalValue = 8
                }
            }
            // Trigger PLCConfigurationSupervisor Disable
            // Not used in this test
            // Trigger MXIConfigurationSupervisor Disable
            +MxiCfgSup_MsgMode_2 = {
                Class = Message
                Destination = TbTestApp.Functions.MXIConfigurationSupervisor
                Function = MXIOperation
                +Parameters = {
                    Class = ConfigurationDatabase
                    param1 = 2
                    param2 = null
                    param3 = null
                    param4 = null
                }
            }
            // Disable DANWriterWriteT1
            +DisableDANWriterWriteT1 = {
                Class = Message
                Destination = TbTestApp.Functions.DANWriterWriteEnable
                Function = SetOutput
                +Parameters = {
                    Class = ConfigurationDatabase
                    SignalName = DANWriterEnable_DDB1
                    SignalValue = 0
                }
            }
            // Flush DANWriterTreeT1
            +FlushDANWriterT1 = {
                Class = Message
                Destination = TbTestApp.Data.DANWriterT1
                Function = CloseStream
                Mode = ExpectsReply
            }
            // Flush DANWriterTreeT2
            +FlushDANWriterT2 = {
                Class = Message
                Destination = TbTestApp.Data.DANWriterT2
                Function = CloseStream
                Mode = ExpectsReply
            }
            // Flush FileWriterBufferT2
            +FlushFileWriterBufferT2 = {
                Class = Message
                Destination = TbTestApp.Data.FileWriterBufferT2
                Function = FlushFile
                Mode = ExpectsReply
            }
            // Flush DANWriterTreeT3
            +FlushDANWriterT3 = {
                Class = Message
                Destination = TbTestApp.Data.DANWriterT3
                Function = CloseStream
                Mode = ExpectsReply
            }
        }
        +GOTO_PRE_CFG = {
            Class = StateMachineEvent
            NextState = "PRE_CFG"
            NextStateError = "ERROR"
            Timeout = 0
            +StopCurrentStateExecutionMsg = {
                Class = Message
                Destination = TbTestApp
                Function = StopCurrentStateExecution
                Mode = ExpectsReply
            }
            +PreparePreCfg = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = PrepareNextState
                +Parameters = {
                    Class = ConfigurationDatabase
                    param1 = PreCfg
                }
            }
            +GoToNextState = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = StartNextStateExecution
            }
        }
    }
    +ERROR = {
        Class = ReferenceContainer
        +ENTER = {
            Class = ReferenceContainer
            // Set Current State
            +SetCurrentState = {
                Class = Message
                Destination = TbTestApp.Functions.AppStateMachineState
                Function = SetOutput
                +Parameters = {
                    Class = ConfigurationDatabase
                    SignalName = SMState_DDB1
                    SignalValue = 9
                }
            }
            // Trigger PLCConfigurationSupervisor Disable
            // Not used in this test
            // Trigger MXIConfigurationSupervisor Disable
            +MxiCfgSup_MsgMode_2 = {
                Class = Message
                Destination = TbTestApp.Functions.MXIConfigurationSupervisor
                Function = MXIOperation
                +Parameters = {
                    Class = ConfigurationDatabase
                    param1 = 2
                    param2 = null
                    param3 = null
                    param4 = null
                }
            }
            // Disable DANWriterWriteT1
            +DisableDANWriterWriteT1 = {
                Class = Message
                Destination = TbTestApp.Functions.DANWriterWriteEnable
                Function = SetOutput
                +Parameters = {
                    Class = ConfigurationDatabase
                    SignalName = DANWriterEnable_DDB1
                    SignalValue = 0
                }
            }
            // Flush DANWriterTreeT1
            +FlushDANWriterT1 = {
                Class = Message
                Destination = TbTestApp.Data.DANWriterT1
                Function = CloseStream
                Mode = ExpectsReply
            }
            // Flush DANWriterTreeT2
            +FlushDANWriterT2 = {
                Class = Message
                Destination = TbTestApp.Data.DANWriterT2
                Function = CloseStream
                Mode = ExpectsReply
            }
            // Flush FileWriterBufferT2
            +FlushFileWriterBufferT2 = {
                Class = Message
                Destination = TbTestApp.Data.FileWriterBufferT2
                Function = FlushFile
                Mode = ExpectsReply
            }
            // Flush DANWriterTreeT3
            +FlushDANWriterT3 = {
                Class = Message
                Destination = TbTestApp.Data.DANWriterT3
                Function = CloseStream
                Mode = ExpectsReply
            }
            +StopCurrentStateExecutionMsg = {
                Class = Message
                Destination = TbTestApp
                Function = StopCurrentStateExecution
                Mode = ExpectsReply
            }
            +PrepareError = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = PrepareNextState
                +Parameters = {
                    Class = ConfigurationDatabase
                    param1 = Error
                }
            }
            +GoToNextState = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = StartNextStateExecution
            }
        }
        +GOTO_PRE_CFG = {
            Class = StateMachineEvent
            NextState = "PRE_CFG"
            NextStateError = "ERROR"
            Timeout = 0
            +StopCurrentStateExecutionMsg = {
                Class = Message
                Destination = TbTestApp
                Function = StopCurrentStateExecution
                Mode = ExpectsReply
            }
            +PreparePreCfg = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = PrepareNextState
                +Parameters = {
                    Class = ConfigurationDatabase
                    param1 = PreCfg
                }
            }
            +GoToNextState = {
                Class = Message
                Destination = TbTestApp
                Mode = ExpectsReply
                Function = StartNextStateExecution
            }
        }
    }
}

$TbTestApp = {
    Class = RealTimeApplication
    +Functions = {
        Class = ReferenceContainer

        // ----------- T1 START ----------- //
        // Slow Timer Thread - Configuration and monitoring
        // ------ TIMER ------ //
        +Timer = {
            Class = IOGAM
            InputSignals = {
                Counter = {
                    DataSource = Timer
                    Type = uint32
                }
                Time = {
                    Frequency = 100
                    DataSource = Timer
                    Type = uint32
                }
                AbsoluteTime = {
                    DataSource = Timer
                    Type = uint64
                }
            }
            OutputSignals = {
                Counter_DDB1 = {
                    DataSource = DDB1
                    Type = uint32
                }
                Time_DDB1 = {
                    DataSource = DDB1
                    Type = uint32
                }
                AbsTimeSrc_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                }
            }
        }
        
        +CurrentTime_T1 = {
            Class = SystemClockGAM
            OutputSignals = {
                AbsTimeT1_DDB1 = { 
                    DataSource = DDB1
                    Type = uint64
                }
            }
        }
        
        +TimeConverter = {
            Class = AbsTimeConverterGAM
            InputSignals = {
                AbsTimeSrc_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                }
            }
            OutputSignals = {
                AbsTime_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                }
            }
        }
        // ------------------- //

        // ----- RX PATH ----- //
        +MXIRead = {
            Class = IOGAM
            InputSignals = {
                hl_tx_spi_done = {
                    DataSource = MXIRegistersRead
                    Type = bool
                    NumberOfElements = 1
                    Trigger = 1
                }
                hl_rx_spi_done = {
                    DataSource = MXIRegistersRead
                    Type = bool
                    NumberOfElements = 1
                }
                dsc_ao_0_ctr_out = {
                    DataSource = MXIRegistersRead
                    Type = uint8
                    NumberOfElements = 1
                }
                dsc_ao_1_ctr_out = {
                    DataSource = MXIRegistersRead
                    Type = uint8
                    NumberOfElements = 1
                }
                dsc_ao_2_ctr_out = {
                    DataSource = MXIRegistersRead
                    Type = uint8
                    NumberOfElements = 1
                }
                dsc_mo_0_ctr_out = {
                    DataSource = MXIRegistersRead
                    Type = uint8
                    NumberOfElements = 1
                }
                dsc_mo_1_ctr_out = {
                    DataSource = MXIRegistersRead
                    Type = uint8
                    NumberOfElements = 1
                }
                dsc_do_n_ctr_out = {
                    DataSource = MXIRegistersRead
                    Type = uint8
                    NumberOfElements = 1
                }
                dsc_fs_0_ctr_out = {
                    DataSource = MXIRegistersRead
                    Type = uint8
                    NumberOfElements = 1
                }
                dsc_fs_1_ctr_out = {
                    DataSource = MXIRegistersRead
                    Type = uint8
                    NumberOfElements = 1
                }
                dsc_full_mod_out = {
                    DataSource = MXIRegistersRead
                    Type = uint8
                    NumberOfElements = 1
                }
                dsc_acq_en_out = {
                    DataSource = MXIRegistersRead
                    Type = bool
                    NumberOfElements = 1
                }
                dsc_ts_status = {
                    DataSource = MXIRegistersRead
                    Type = bool
                    NumberOfElements = 1
                }
                dsc_ts_out = {
                    DataSource = MXIRegistersRead
                    Type = uint64
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                MXI_HL_TX_SPI_DONE_DDB1 = {
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
                MXI_HL_RX_SPI_DONE_DDB1 = {
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
                MXI_DSC_AO_0_CTR_OUT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_DSC_AO_1_CTR_OUT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_DSC_AO_2_CTR_OUT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_DSC_MO_0_CTR_OUT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_DSC_MO_1_CTR_OUT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_DSC_DO_N_CTR_OUT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_DSC_FS_0_CTR_OUT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_DSC_FS_1_CTR_OUT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_DSC_FULL_MOD_OUT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_DSC_ACQ_EN_OUT_DDB1 = {
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
                MXI_DSC_TS_STATUS_DDB1 = {
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
                MXI_DSC_TS_OUT_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 1
                }
            }
        }

        +MXIModuleFullFlagSplitter = {
            Class = BitSplitterGAM
            InputSignals = {
                DigitalSignal = {
                    Alias = MXI_DSC_FULL_MOD_OUT_DDB1
                    DataSource = DDB1
                    Type = uint8
                }
            }
            OutputSignals = {
                Bit_0 = {
                    Alias = MXI_DSC_AO_0_FULL_OUT_DDB1
                    DataSource = DDB1
                    Type = bool
                }
                Bit_1 = {
                    Alias = MXI_DSC_AO_1_FULL_OUT_DDB1
                    DataSource = DDB1
                    Type = bool
                }
                Bit_2 = {
                    Alias = MXI_DSC_AO_2_FULL_OUT_DDB1
                    DataSource = DDB1
                    Type = bool
                }
                Bit_3 = {
                    Alias = MXI_DSC_MO_0_FULL_OUT_DDB1
                    DataSource = DDB1
                    Type = bool
                }
                Bit_4 = {
                    Alias = MXI_DSC_MO_1_FULL_OUT_DDB1
                    DataSource = DDB1
                    Type = bool
                }
                Bit_5 = {
                    Alias = MXI_DSC_DO_N_FULL_OUT_DDB1
                    DataSource = DDB1
                    Type = bool
                }
                Bit_6 = {
                    Alias = MXI_DSC_FS_0_FULL_OUT_DDB1
                    DataSource = DDB1
                    Type = bool
                }
                Bit_7 = {
                    Alias = MXI_DSC_FS_1_FULL_OUT_DDB1
                    DataSource = DDB1
                    Type = bool
                }
            }
        }

        +MXIMasterTime = {
            Class = TimeArrayGAM
            TimePerTicks = 25
            TimeStep = 500
            InputSignals = {
                MXI_DSC_TS_OUT_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                MXIAbsTime_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
            }
        }

        +PlcPacketRx = {
            Class = IOGAM
            InputSignals = {
                PlcReceivedAbsTime = {
                    DataSource = SdnPlcSub
                    Alias = Header
                    NumberOfElements = 48
                    Type = uint8
                    Ranges = {{32, 39}}
                    Trigger = 1
                }
                PLC_HEADER = {
                    DataSource = SdnPlcSub
                    Type = uint8
                    NumberOfElements = 8
                }
                ACK_CFG = {
                    DataSource = SdnPlcSub
                    Type = uint8
                    NumberOfElements = 1
                }
                ACK_SMC = {
                    DataSource = SdnPlcSub
                    Type = uint8
                    NumberOfElements = 1
                }
                STATE_CFG = {
                    DataSource = SdnPlcSub
                    Type = uint8
                    NumberOfElements = 1
                }
                STATE_SMC = {
                    DataSource = SdnPlcSub
                    Type = uint8
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                PlcPacketRx_AbsTime_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                }
                PlcPacketRx_HEADER_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 8
                    NumberOfDimensions = 1
                }
                PlcPacketRx_ACK_CFG_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                PlcPacketRx_ACK_SMC_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                PlcPacketRx_STATE_CFG_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                PlcPacketRx_STATE_SMC_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
            }
        }
        // ------------------- //

        // ---- CONST GAM ---- //
        +AppStateMachineState = {
            Class = ConstantGAM
            OutputSignals = {
                SMState_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                    Default = 0
                }
            }
        }

        +DANWriterWriteEnable = {
            Class = ConstantGAM
            OutputSignals = {
                DANWriterEnable_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                    Default = 0
                }
            }
        }

        +MXISupervisorVariables = {
            Class = ConstantGAM
            OutputSignals = {
                MXIConfigurationSupervisor_Trigger_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                    Default = 0
                }
                MXIConfigurationSupervisor_Mode_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                    Default = 0
                }
            }
        }

        +MXIBaseConfigurationVariables = {
            Class = ConstantGAM
            OutputSignals = {
                MXI_RST_IN_DDB1 = {
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                    Default = 1
                }
                MXI_HL_TX_1_OPT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                    Default = 4
                }
                MXI_HL_TX_2_OPT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                    Default = 4
                }
                MXI_HL_TX_3_OPT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                    Default = 4
                }
                MXI_HL_TX_OPT_TRG_DDB1 = {
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                    Default = 1
                }
                MXI_HL_RX_1_OPT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                    Default = 4
                }
                MXI_HL_RX_2_OPT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                    Default = 4
                }
                MXI_HL_RX_3_OPT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                    Default = 4
                }
                MXI_HL_RX_4_OPT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                    Default = 4
                }
                MXI_HL_RX_5_OPT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                    Default = 4
                }
                MXI_HL_RX_6_OPT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                    Default = 4
                }
                MXI_HL_RX_7_OPT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                    Default = 4
                }
                MXI_HL_RX_OPT_TRG_DDB1 = {
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                    Default = 1
                }
                MXI_DBG_EN_SEL_IN_DDB1 = {
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                    Default = 1
                }
                MXI_DBG_EN_IN_DDB1 = {
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                    Default = 0
                }
            }
        }

        +MXIDsFifoAcqEnVariables = {
            Class = ConstantGAM
            OutputSignals = {
                MXI_ACQ_EN_PAT_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 1
                    Default = 0xAAAAAAAAAAAAAAAA
                }
            }
        }

        +PlcPacketTxVariables = {
            Class = ConstantGAM
            OutputSignals = {
                PlcPacketTx_Trigger_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    Default = 0
                }
                PlcPacketTx_Select_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    Default = 0
                }
                PlcPacketTx_HeaderNF_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    Default = 11
                }
                PlcPacketTx_HeaderNI_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    Default = 10
                }
                PlcPacketTx_HeaderNC_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    Default = 2
                }
                PlcPacketTx_HeaderNS_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    Default = 0
                }
                PlcPacketTx_HeaderNA_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    Default = 0
                }
                PlcPacketTx_HeaderS_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfDimensions = 1
                    NumberOfElements = 3
                    Default = {0 0 0}
                }
            }
        }

        +StateMachineTasksDelay = {
            Class = ConstantGAM
            OutputSignals = {
                CycleCounterReset_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                    Default = 0
                }
                DelayCycles_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 1
                    Default = 50
                }
            }
        }

        +AcquisitionStatusDaq = {
            Class = ConstantGAM
            OutputSignals = {
                AcquisitionStatusT2_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                    Default = 0
                }
            }
        }

        +AcquisitionStatusDbg = {
            Class = ConstantGAM
            OutputSignals = {
                AcquisitionStatusT3_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                    Default = 0
                }
            }
        }
        // ------------------- //

        // ---- FLOW CTRL ---- //
        +MXIConfigurationSupervisor = {
            Class = MXIConfigurationSupervisorGAM
            InputSignals = {
                // --- Trigger Signals --- //
                TriggerInput = {
                    Alias = MXIConfigurationSupervisor_Trigger_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                ModeInput = {
                    Alias = MXIConfigurationSupervisor_Mode_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                // --- Monitor Signals --- //
                // Base Configuration
                BaseDone = {
                    Alias = MXIBaseConfigurationDone_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                BaseStatus = {
                    Alias = MXIBaseConfigurationStatus_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                // Acquisition Enable
                AcqEnDone = {
                    Alias = MXIAcquisitionEnableDone_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                AcqEnStatus = {
                    Alias = MXIAcquisitionEnableStatus_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                // Triplet Configuration
                TripletDone = {
                    Alias = MXITripletConfigurationDone_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                TripletStatus = {
                    Alias = MXITripletConfigurationStatus_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                // --- Trigger Signals --- //
                // Base Configuration
                BaseTrigger = {
                    Alias = MXIBaseConfiguration_Trigger_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                BaseMode = {
                    Alias = MXIBaseConfiguration_Mode_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                // Acquisition Configuration
                AcqTrigger = {
                    Alias = MXIAcquisitionEnable_Trigger_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                // Triplet Configuration
                TripletTrigger = {
                    Alias = MXITripletConfiguration_Trigger_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                // Status Signals
                CfgDone = {
                    Alias = MXIConfigurationSupervisor_Done_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                CfgError = {
                    Alias = MXIConfigurationSupervisor_Error_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                CfgStatus = {
                    Alias = MXIConfigurationSupervisor_Status_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
            }
        }

        +MXIBaseConfiguration = {
            Class = MXIBaseConfigurationGAM
            ConfigurationStepTimeOutMs = 50
            InputSignals = {
                // Timer and activation signals
                TimerAbsTimeUs = {
                    Alias = AbsTime_DDB1
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 1
                }
                TriggerInput = {
                    Alias = MXIBaseConfiguration_Trigger_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                ModeInput = {
                    Alias = MXIBaseConfiguration_Mode_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                // Monitoring Signals
                HlTxDone = {
                    Alias = MXI_HL_TX_SPI_DONE_DDB1
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
                HlRxDone = {
                    Alias = MXI_HL_RX_SPI_DONE_DDB1
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
                DscStatus = {
                    Alias = MXI_DSC_TS_STATUS_DDB1
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                // Trigger Signals
                TriggerReset = {
                    Alias = Trigger_MXIWriteRst_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                TriggerHotLink = {
                    Alias = Trigger_MXIWriteHlOpt_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                TriggerEnable = {
                    Alias = Trigger_MXIWriteEn_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                TriggerDebug = {
                    Alias = Trigger_MXIWriteDbg_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                // Data Signals
                Enable = {
                    Alias = MXI_EN_IN_DDB1
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
                // Status Signals
                CfgDone = {
                    Alias = MXIBaseConfigurationDone_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                CfgStatus = {
                    Alias = MXIBaseConfigurationStatus_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
            }
        }

        +MXIAcquisitionEnable = {
            Class = MXIAcquisitionEnableGAM
            ConfigurationStepTimeOutMs = 50
            InputSignals = {
                // Timer and activation signals
                TimerAbsTimeUs = {
                    Alias = AbsTime_DDB1
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 1
                }
                TriggerInput = {
                    Alias = MXIAcquisitionEnable_Trigger_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                // Monitoring Signals
                AcqEnStatus = {
                    Alias = MXI_DSC_ACQ_EN_OUT_DDB1
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                // Trigger Signals
                TriggerAcquisition = {
                    Alias = Trigger_MXIWriteIDsFifoAcqEn_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                // Status Signals
                CfgDone = {
                    Alias = MXIAcquisitionEnableDone_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                CfgStatus = {
                    Alias = MXIAcquisitionEnableStatus_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
            }
        }

        +MXITripletConfiguration = {
            Class = MXITripletConfigurationGAM
            ConfigurationStepTimeOutMs = 5000
            ReplayEvents = 3
            +Channels = {
                Class = ReferenceContainer
                +AnalogueOutput_0 = {
                    Class = TripletsContainer
                    Type = AnalogueOutput
                    StartTimeToTimeStampTicks = 25
                    Triplets = {
                        {    1,           1, 0x3FFF0000, 0x2000},
                        {    2,  5100000000, 0x00036FF2, 0x3ADA},
                        {    3,  5200000000, 0x00036FF2, 0x2000}
                    }
                }
                +AnalogueOutput_1 = {
                    Class = TripletsContainer
                    Type = AnalogueOutput
                    StartTimeToTimeStampTicks = 25
                    Triplets = {
                        {    1,           1, 0x3FFF0000, 0x2000},
                        {    2,  5140000000, 0x00036FF2, 0x3FFF},
                        {    3,  5150000000, 0x00036FF2, 0x2000}
                    }
                }
                +AnalogueOutput_2 = {
                    Class = TripletsContainer
                    Type = AnalogueOutput
                    StartTimeToTimeStampTicks = 25
                    Triplets = {
                        {    1,           1, 0x3FFF0000, 0x2000},
                        {    2,  5140000000, 0x00036FF2, 0x3FFF},
                        {    3,  5150000000, 0x00036FF2, 0x2000}
                    }
                }
                +ModulationOutput_0 = {
                    Class = TripletsContainer
                    Type = ModulationOutput
                    StartTimeToTimeStampTicks = 25
                    ParamTimeToTicks = 500
                    Triplets = {
                        {    1,           1,          0,       0}
                    }
                }
                +ModulationOutput_1 = {
                    Class = TripletsContainer
                    Type = ModulationOutput
                    StartTimeToTimeStampTicks = 25
                    ParamTimeToTicks = 500
                    Triplets = {
                        {    1,           1,          0,       0}
                    }
                }
                +DigitalOutput_N = {
                    Class = TripletsContainer
                    Type = DigitalOutput
                    StartTimeToTimeStampTicks = 25
                    Triplets = {
                        {    1,  5098000000, 0, 0, 0, 0, 1},
                        {    2,  5202000000, 0, 0, 0, 0, 0}
                    }
                }
                +FastShutdownOutput_0 = {
                    Class = TripletsContainer
                    Type = FastShutdownOutput
                    StartTimeToTimeStampTicks = 25
                    Triplets = {
                        {    1,           1,        0,        16,       8}
                    }
                }
                +FastShutdownOutput_1 = {
                    Class = TripletsContainer
                    Type = FastShutdownOutput
                    StartTimeToTimeStampTicks = 25
                    Triplets = {
                        {    1,           1,        0,        16,       8}
                    }
                }
            }
            InputSignals = {
                TimerAbsTimeUs = {
                    Alias = MXIAbsTime_DDB1
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 1
                }
                TriggerInput = {
                    Alias = MXITripletConfiguration_Trigger_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                AnalogueOutput_0_Counter = {
                    Alias = MXI_DSC_AO_0_CTR_OUT_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                AnalogueOutput_0_Full = {
                    Alias = MXI_DSC_AO_0_FULL_OUT_DDB1
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
                AnalogueOutput_1_Counter = {
                    Alias = MXI_DSC_AO_1_CTR_OUT_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                AnalogueOutput_1_Full = {
                    Alias = MXI_DSC_AO_1_FULL_OUT_DDB1
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
                AnalogueOutput_2_Counter = {
                    Alias = MXI_DSC_AO_2_CTR_OUT_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                AnalogueOutput_2_Full = {
                    Alias = MXI_DSC_AO_2_FULL_OUT_DDB1
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
                ModulationOutput_0_Counter = {
                    Alias = MXI_DSC_MO_0_CTR_OUT_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                ModulationOutput_0_Full = {
                    Alias = MXI_DSC_MO_0_FULL_OUT_DDB1
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
                ModulationOutput_1_Counter = {
                    Alias = MXI_DSC_MO_1_CTR_OUT_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                ModulationOutput_1_Full = {
                    Alias = MXI_DSC_MO_1_FULL_OUT_DDB1
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
                DigitalOutput_N_Counter = {
                    Alias = MXI_DSC_DO_N_CTR_OUT_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                DigitalOutput_N_Full = {
                    Alias = MXI_DSC_DO_N_FULL_OUT_DDB1
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
                FastShutdown_0_Counter = {
                    Alias = MXI_DSC_FS_0_CTR_OUT_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                FastShutdown_0_Full = {
                    Alias = MXI_DSC_FS_0_FULL_OUT_DDB1
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
                FastShutdown_1_Counter = {
                    Alias = MXI_DSC_FS_1_CTR_OUT_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                FastShutdown_1_Full = {
                    Alias = MXI_DSC_FS_1_FULL_OUT_DDB1
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                TriggerTriplets = {
                    Alias = Trigger_MXIWriteDsFifoConfig_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                TripletsPacket = {
                    Alias = MXI_PCK_TRIPLETS_DDB1
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 16
                    NumberOfDimensions = 1
                }
                CfgDone = {
                    Alias = MXITripletConfigurationDone_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                CfgError = {
                    Alias = MXITripletConfigurationError_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                CfgStatus = {
                    Alias = MXITripletConfigurationStatus_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
            }
        }

        +PlcConfigurationSupervisor = {
            Class = PlcConfigurationSupervisorGAM
            ReplyTimeOutMs = 10000
            +Configurations = {
                Class = ReferenceContainer
                +ConfigSet_0_Start = {
                    Class = ReferenceContainer
                    +ConfigStep_0_ChangeToState2 = {
                        Class = PlcConfigurationContainer
                        Floats = { 0.0 35.0 0.0 35.0 15.0 15.0 20.0 20.0 20000.0 0.0 0.2 }
                        Integers = { 1000 1000 1 1 0 1 1000 1 2 2 }
                        Commands = { 0 1 }
                    }
                    +ConfigStep_1_SetParameters = {
                        Class = PlcConfigurationContainer
                        Floats = { 0.0 35.0 0.0 35.0 15.0 15.0 20.0 20.0 20000.0 0.0 0.2 }
                        Integers = { 1000 1000 1 1 1 1 1000 1 0 2 }
                        Commands = { 1 0 }
                    }
                    +ConfigStep_2_SetParameters = {
                        Class = PlcConfigurationContainer
                        Floats = { 0.0 35.0 0.0 35.0 15.0 15.0 20.0 20.0 20000.0 0.0 0.2 }
                        Integers = { 1000 1000 1 1 0 1 1000 1 0 2 }
                        Commands = { 1 0 }
                    }
                    +ConfigStep_3_ChangeToState3 = {
                        Class = PlcConfigurationContainer
                        Floats = { 0.0 35.0 0.0 35.0 15.0 15.0 20.0 20.0 20000.0 0.0 0.2 }
                        Integers = { 1000 1000 1 1 0 1 1000 1 3 2 }
                        Commands = { 0 1 }
                    }
                }
            }
            InputSignals = {
                // Timer and activation signals
                TimerAbsTimeUs = {
                    Alias = AbsTime_DDB1
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 1
                }
                TriggerInput = {
                    Alias = PlcPacketTx_Trigger_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                SelectInput = {
                    Alias = PlcPacketTx_Select_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                // Monitor Signals
                PLCReadAbsTime = {
                    Alias = PlcPacketRx_AbsTime_DDB1
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 1
                }
                PLCReadAckCfg = {
                    Alias = PlcPacketRx_ACK_CFG_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                PLCReadAckSmc = {
                    Alias = PlcPacketRx_ACK_SMC_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                PLCReadStateCfg = {
                    Alias = PlcPacketRx_STATE_CFG_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                PLCReadStateSmc = {
                    Alias = PlcPacketRx_STATE_SMC_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                // Trigger Signals
                TriggerOutput = {
                    Alias = PlcPacketTx_TrgOut_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                // PLC Signals
                VB1TREF = {
                    Alias = PlcPacketTx_VB1TREF_DDB1
                    DataSource = DDB1
                    Type = float32
                    NumberOfElements = 1
                }
                VB1 = {
                    Alias = PlcPacketTx_VB1_DDB1
                    DataSource = DDB1
                    Type = float32
                    NumberOfElements = 1
                }
                VB2TREF = {
                    Alias = PlcPacketTx_VB2TREF_DDB1
                    DataSource = DDB1
                    Type = float32
                    NumberOfElements = 1
                }
                VB2 = {
                    Alias = PlcPacketTx_VB2_DDB1
                    DataSource = DDB1
                    Type = float32
                    NumberOfElements = 1
                }
                VB1RR = {
                    Alias = PlcPacketTx_VB1RR_DDB1
                    DataSource = DDB1
                    Type = float32
                    NumberOfElements = 1
                }
                VB2RR = {
                    Alias = PlcPacketTx_VB2RR_DDB1
                    DataSource = DDB1
                    Type = float32
                    NumberOfElements = 1
                }
                VB1TH = {
                    Alias = PlcPacketTx_VB1TH_DDB1
                    DataSource = DDB1
                    Type = float32
                    NumberOfElements = 1
                }
                VB2TH = {
                    Alias = PlcPacketTx_VB2TH_DDB1
                    DataSource = DDB1
                    Type = float32
                    NumberOfElements = 1
                }
                VKTH = {
                    Alias = PlcPacketTx_VKTH_DDB1
                    DataSource = DDB1
                    Type = float32
                    NumberOfElements = 1
                }
                VK = {
                    Alias = PlcPacketTx_VK_DDB1
                    DataSource = DDB1
                    Type = float32
                    NumberOfElements = 1
                }
                PSKT = {
                    Alias = PlcPacketTx_PSKT_DDB1
                    DataSource = DDB1
                    Type = float32
                    NumberOfElements = 1
                }
                VB1UP = {
                    Alias = PlcPacketTx_VB1UP_DDB1
                    DataSource = DDB1
                    Type = uint16
                    NumberOfElements = 1
                }
                VB2UP = {
                    Alias = PlcPacketTx_VB2UP_DDB1
                    DataSource = DDB1
                    Type = uint16
                    NumberOfElements = 1
                }
                VB1TSEL = {
                    Alias = PlcPacketTx_VB1TSEL_DDB1
                    DataSource = DDB1
                    Type = uint16
                    NumberOfElements = 1
                }
                VB2TSEL = {
                    Alias = PlcPacketTx_VB2TSEL_DDB1
                    DataSource = DDB1
                    Type = uint16
                    NumberOfElements = 1
                }
                VKSEL = {
                    Alias = PlcPacketTx_VKSEL_DDB1
                    DataSource = DDB1
                    Type = uint16
                    NumberOfElements = 1
                }
                BODR = {
                    Alias = PlcPacketTx_BODR_DDB1
                    DataSource = DDB1
                    Type = uint16
                    NumberOfElements = 1
                }
                VKUP = {
                    Alias = PlcPacketTx_VKUP_DDB1
                    DataSource = DDB1
                    Type = uint16
                    NumberOfElements = 1
                }
                MDKF = {
                    Alias = PlcPacketTx_MDKF_DDB1
                    DataSource = DDB1
                    Type = uint16
                    NumberOfElements = 1
                }
                CSTAT = {
                    Alias = PlcPacketTx_CSTAT_DDB1
                    DataSource = DDB1
                    Type = uint16
                    NumberOfElements = 1
                }
                COMOD = {
                    Alias = PlcPacketTx_COMOD_DDB1
                    DataSource = DDB1
                    Type = uint16
                    NumberOfElements = 1
                }
                CFG_MOD = {
                    Alias = PlcPacketTx_CFG_MOD_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                SM_MOD = {
                    Alias = PlcPacketTx_SM_MOD_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                // Status Flags
                CfgDone = {
                    Alias = PlcConfigurationSupervisor_Done_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                CfgError = {
                    Alias = PlcConfigurationSupervisor_Error_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                CfgStatus = {
                    Alias = PlcConfigurationSupervisor_Status_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
            }
        }
        // ------------------- //

        // ----- TX PATH ----- //
        +MXIWriteRst = {
            Class = TriggeredIOGAM
            InputSignals = {
                Trigger_MXIWriteRst_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_RST_IN_DDB1 = {
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                rst_in = {
                    DataSource = MXIRegistersWriteRst
                    Type = bool
                    NumberOfElements = 1
                    Trigger = 1
                }
            }
        }

        +MXIWriteHlOpt = {
            Class = TriggeredIOGAM
            InputSignals = {
                Trigger_MXIWriteHlOpt_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_HL_TX_1_OPT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_HL_TX_2_OPT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_HL_TX_3_OPT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_HL_TX_OPT_TRG_DDB1 = {
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
                MXI_HL_RX_1_OPT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_HL_RX_2_OPT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_HL_RX_3_OPT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_HL_RX_4_OPT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_HL_RX_5_OPT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_HL_RX_6_OPT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_HL_RX_7_OPT_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_HL_RX_OPT_TRG_DDB1 = {
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                hl_tx_1_opt = {
                    DataSource = MXIRegistersWriteHlOpt
                    Type = uint8
                    NumberOfElements = 1
                    Trigger = 1
                }
                hl_tx_2_opt = {
                    DataSource = MXIRegistersWriteHlOpt
                    Type = uint8
                    NumberOfElements = 1
                }
                hl_tx_3_opt = {
                    DataSource = MXIRegistersWriteHlOpt
                    Type = uint8
                    NumberOfElements = 1
                }
                hl_tx_opt_trg = {
                    DataSource = MXIRegistersWriteHlOpt
                    Type = bool
                    NumberOfElements = 1
                }
                hl_rx_1_opt = {
                    DataSource = MXIRegistersWriteHlOpt
                    Type = uint8
                    NumberOfElements = 1
                }
                hl_rx_2_opt = {
                    DataSource = MXIRegistersWriteHlOpt
                    Type = uint8
                    NumberOfElements = 1
                }
                hl_rx_3_opt = {
                    DataSource = MXIRegistersWriteHlOpt
                    Type = uint8
                    NumberOfElements = 1
                }
                hl_rx_4_opt = {
                    DataSource = MXIRegistersWriteHlOpt
                    Type = uint8
                    NumberOfElements = 1
                }
                hl_rx_5_opt = {
                    DataSource = MXIRegistersWriteHlOpt
                    Type = uint8
                    NumberOfElements = 1
                }
                hl_rx_6_opt = {
                    DataSource = MXIRegistersWriteHlOpt
                    Type = uint8
                    NumberOfElements = 1
                }
                hl_rx_7_opt = {
                    DataSource = MXIRegistersWriteHlOpt
                    Type = uint8
                    NumberOfElements = 1
                }
                hl_rx_opt_trg = {
                    DataSource = MXIRegistersWriteHlOpt
                    Type = bool
                    NumberOfElements = 1
                }
            }
        }

        +MXIWriteEn = {
            Class = TriggeredIOGAM
            InputSignals = {
                Trigger_MXIWriteEn_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_EN_IN_DDB1 = {
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                dsc_en_in = {
                    DataSource = MXIRegistersWriteEn
                    Type = bool
                    NumberOfElements = 1
                    Trigger = 1
                }
            }
        }

        +MXIWriteDbg = {
            Class = TriggeredIOGAM
            InputSignals = {
                Trigger_MXIWriteDbg_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_DBG_EN_SEL_IN_DDB1 = {
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
                MXI_DBG_EN_IN_DDB1 = {
                    DataSource = DDB1
                    Type = bool
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                dbg_en_sel_in = {
                    DataSource = MXIRegistersDgbEn
                    Type = bool
                    NumberOfElements = 1
                    Trigger = 1
                }
                dbg_en_in = {
                    DataSource = MXIRegistersDgbEn
                    Type = bool
                    NumberOfElements = 1
                }
            }
        }

        +MXIWriteDsFifoAcqEn = {
            Class = TriggeredIOGAM
            InputSignals = {
                Trigger_MXIWriteIDsFifoAcqEn_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_ACQ_EN_PAT_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                FIFO0_U64_WR = {
                    DataSource = MXIDsFifoAcqEn
                    Type = uint64
                    NumberOfElements = 1
                    NumberOfDimensions = 1
                    Trigger = 1
                }
            }
        }

        +MXIWriteDsFifoConfig = {
            Class = TriggeredIOGAM
            InputSignals = {
                Trigger_MXIWriteDsFifoConfig_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXI_PCK_TRIPLETS_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 16
                    NumberOfDimensions = 1
                }
            }
            OutputSignals = {
                FIFO0_U64_WR = {
                    DataSource = MXIDsFifoConfig
                    Type = uint64
                    NumberOfElements = 16
                    NumberOfDimensions = 1
                    Trigger = 1
                }
            }
        }

        +PlcPacketTx = {
            Class = TriggeredIOGAM
            InputSignals = {
                PlcPacketTx_TrgOut_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                }
                PlcPacketTx_HeaderNF_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                }
                PlcPacketTx_HeaderNI_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                }
                PlcPacketTx_HeaderNC_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                }
                PlcPacketTx_HeaderNS_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                }
                PlcPacketTx_HeaderNA_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                }
                PlcPacketTx_HeaderS_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfDimensions = 1
                    NumberOfElements = 3
                }
                PlcPacketTx_VB1TREF_DDB1 = {
                    DataSource = DDB1
                    Type = float32
                }
                PlcPacketTx_VB1_DDB1 = {
                    DataSource = DDB1
                    Type = float32
                }
                PlcPacketTx_VB2TREF_DDB1 = {
                    DataSource = DDB1
                    Type = float32
                }
                PlcPacketTx_VB2_DDB1 = {
                    DataSource = DDB1
                    Type = float32
                }
                PlcPacketTx_VB1RR_DDB1 = {
                    DataSource = DDB1
                    Type = float32
                }
                PlcPacketTx_VB2RR_DDB1 = {
                    DataSource = DDB1
                    Type = float32
                }
                PlcPacketTx_VB1TH_DDB1 = {
                    DataSource = DDB1
                    Type = float32
                }
                PlcPacketTx_VB2TH_DDB1 = {
                    DataSource = DDB1
                    Type = float32
                }
                PlcPacketTx_VKTH_DDB1 = {
                    DataSource = DDB1
                    Type = float32
                }
                PlcPacketTx_VK_DDB1 = {
                    DataSource = DDB1
                    Type = float32
                }
                PlcPacketTx_PSKT_DDB1 = {
                    DataSource = DDB1
                    Type = float32
                }
                PlcPacketTx_VB1UP_DDB1 = {
                    DataSource = DDB1
                    Type = uint16
                }
                PlcPacketTx_VB2UP_DDB1 = {
                    DataSource = DDB1
                    Type = uint16
                }
                PlcPacketTx_VB1TSEL_DDB1 = {
                    DataSource = DDB1
                    Type = uint16
                }
                PlcPacketTx_VB2TSEL_DDB1 = {
                    DataSource = DDB1
                    Type = uint16
                }
                PlcPacketTx_VKSEL_DDB1 = {
                    DataSource = DDB1
                    Type = uint16
                }
                PlcPacketTx_BODR_DDB1 = {
                    DataSource = DDB1
                    Type = uint16
                }
                PlcPacketTx_VKUP_DDB1 = {
                    DataSource = DDB1
                    Type = uint16
                }
                PlcPacketTx_MDKF_DDB1 = {
                    DataSource = DDB1
                    Type = uint16
                }
                PlcPacketTx_CSTAT_DDB1 = {
                    DataSource = DDB1
                    Type = uint16
                }
                PlcPacketTx_COMOD_DDB1 = {
                    DataSource = DDB1
                    Type = uint16
                }
                PlcPacketTx_CFG_MOD_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                }
                PlcPacketTx_SM_MOD_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                }
            }
            OutputSignals = {
                HeaderNF = {
                    DataSource = SdnPlcPub
                    Type = uint8
                    Trigger = 1
                }
                HeaderNI = {
                    DataSource = SdnPlcPub
                    Type = uint8
                }
                HeaderNC = {
                    DataSource = SdnPlcPub
                    Type = uint8
                }
                HeaderNS = {
                    DataSource = SdnPlcPub
                    Type = uint8
                }
                HeaderNA = {
                    DataSource = SdnPlcPub
                    Type = uint8
                }
                HeaderS = {
                    DataSource = SdnPlcPub
                    Type = uint8
                    NumberOfElements = 3
                }
                VB1TREF = {
                    DataSource = SdnPlcPub
                    Type = float32
                }
                VB1 = {
                    DataSource = SdnPlcPub
                    Type = float32
                }
                VB2TREF = {
                    DataSource = SdnPlcPub
                    Type = float32
                }
                VB2 = {
                    DataSource = SdnPlcPub
                    Type = float32
                }
                VB1RR = {
                    DataSource = SdnPlcPub
                    Type = float32
                }
                VB2RR = {
                    DataSource = SdnPlcPub
                    Type = float32
                }
                VB1TH = {
                    DataSource = SdnPlcPub
                    Type = float32
                }
                VB2TH = {
                    DataSource = SdnPlcPub
                    Type = float32
                }
                VKTH = {
                    DataSource = SdnPlcPub
                    Type = float32
                }
                VK = {
                    DataSource = SdnPlcPub
                    Type = float32
                }
                PSKT = {
                    DataSource = SdnPlcPub
                    Type = float32
                }
                VB1UP = {
                    DataSource = SdnPlcPub
                    Type = uint16
                }
                VB2UP = {
                    DataSource = SdnPlcPub
                    Type = uint16
                }
                VB1TSEL = {
                    DataSource = SdnPlcPub
                    Type = uint16
                }
                VB2TSEL = {
                    DataSource = SdnPlcPub
                    Type = uint16
                }
                VKSEL = {
                    DataSource = SdnPlcPub
                    Type = uint16
                }
                BODR = {
                    DataSource = SdnPlcPub
                    Type = uint16
                }
                VKUP = {
                    DataSource = SdnPlcPub
                    Type = uint16
                }
                MDKF = {
                    DataSource = SdnPlcPub
                    Type = uint16
                }
                CSTAT = {
                    DataSource = SdnPlcPub
                    Type = uint16
                }
                COMOD = {
                    DataSource = SdnPlcPub
                    Type = uint16
                }
                CFG = {
                    DataSource = SdnPlcPub
                    Type = uint8
                }
                SM = {
                    DataSource = SdnPlcPub
                    Type = uint8
                }
            }
        }
        // ------------------- //

        // -- MON/STATE CTRL - //
        +AppMonitor = {
            Class = TestMonitorGAM
            InputSignals = {
                AbsTime_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 1
                }
                MXIAbsTime_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 1
                }
                SMState_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXIConfigurationSupervisor_Done_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXIConfigurationSupervisor_Error_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXIConfigurationSupervisor_Status_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                PlcConfigurationSupervisor_Done_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                PlcConfigurationSupervisor_Error_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                PlcConfigurationSupervisor_Status_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                ExtStateTransition_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                AbortConfigurationState_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                TerminateRunningState_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
            }
        }

        +EventMessageBypassPreCfg = {
            Class = MessageGAM
            TriggerOnChange = 1
            +Events = {
                Class = ReferenceContainer
                // App Driven -> From PRE_CFG (1) send to MXI_CFG (2)
                +AppMonitorTempBypass_PRE_CFG_GOTO_MXI_CFG = {
                    Class = EventConditionTrigger
                    EventTrigger = {
                        Command_SMState_DDB1 = 1
                    }
                    +TST_PRE_CFG_GOTO_MXI_CFG = {
                        Class = Message
                        Destination = StateMachine
                        Function = GOTO_MXI_CFG
                        Mode = ExpectsReply
                    }
                }
            }
            InputSignals = {
                Command_SMState_DDB1 = {
                    Alias = SMState_DDB1
                    DataSource = DDB1
                    Type = uint8
                }
            }
            OutputSignals = {
                Clear_SMState_DDB1 = {
                    DataSource = DDB1
                    Type = uint32
                }
            }
        }

        +AcquisitionStatusMonitor = {
            Class = MathExpressionGAM
            Expression = "
                        AcqStatus_DDB1 = (uint8)(
                            (uint8)(AcquisitionStatusT2_DDB1) == (uint8)(1) &&
                            (uint8)(AcquisitionStatusT3_DDB1) == (uint8)(1)
                            );
                        "
            InputSignals = {
                AcquisitionStatusT2_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                }
                AcquisitionStatusT3_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                }
            }
            OutputSignals = {
                AcqStatus_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
            }
        }

        +AcquisitionStatusMessages = {
            Class = MessageGAM
            TriggerOnChange = 1
            +Events = {
                Class = ReferenceContainer
                // App Driven -> From TEST_RUN (4) send to TEST_POST (5)
                +TriggerStateTransition_TEST_RUN_GOTO_TEST_POST = {
                    Class = EventConditionTrigger
                    EventTrigger = {
                        Command_AcqStatus_DDB1 = 1
                    }
                    +TST_TEST_RUN_GOTO_TEST_POST = {
                        Class = Message
                        Destination = StateMachine
                        Function = GOTO_TEST_POST
                        Mode = ExpectsReply
                    }
                }
            }
            InputSignals = {
                Command_AcqStatus_DDB1 = {
                    Alias = AcqStatus_DDB1
                    DataSource = DDB1
                    Type = uint8
                }
            }
            OutputSignals = {
                Clear_AcqStatus_DDB1 = {
                    DataSource = DDB1
                    Type = uint32
                }
            }
        }

        +CycleCounterT1 = {
            Class = CycleCounterGAM
            ResetOnStateChange = 1
            ZeroIfReset = 1
            Step = 1
            InputSignals = {
                Reset = {
                    Alias = CycleCounterReset_DDB1
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                CycleCounter = {
                    Alias = CycleCounter_DDB1
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 1
                }
            }
        }

        +TestPostTasksDelay = {
            Class = MathExpressionGAM
            Expression = "
                        Tasks_Trigger_DDB1 = (uint8)((uint64)(CycleCounter_DDB1) > (uint64)(DelayCycles_DDB1));
                        "
            InputSignals = {
                CycleCounter_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 1
                }
                DelayCycles_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                Tasks_Trigger_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
            }
        }

        +TestPostGotoTestDone = {
            Class = MessageGAM
            TriggerOnChange = 1
            +Events = {
                Class = ReferenceContainer
                // Application driven -> When in TEST_POST (5) go to TEST_DONE (7)
                +AppMonitorTempBypass_TEST_POST_CALL_GOTO_TEST_DONE = {
                    Class = EventConditionTrigger
                    EventTrigger = {
                        Command_Tasks_Trigger_DDB1 = 1
                        Signal_SMState_DDB1 = 5
                    }
                    +TAF_TEST_POST_GOTO_TEST_DONE = {
                        Class = Message
                        Destination = StateMachine
                        Function = GOTO_TEST_DONE
                        Mode = ExpectsReply
                    }
                }
            }
            InputSignals = {
                Command_Tasks_Trigger_DDB1 = {
                    Alias = Tasks_Trigger_DDB1
                    DataSource = DDB1
                    Type = uint8
                }
                Signal_SMState_DDB1 = {
                    Alias = SMState_DDB1
                    DataSource = DDB1
                    Type = uint8
                }
            }
            OutputSignals = {
                Clear_Tasks_Trigger_DDB1 = {
                    DataSource = DDB1
                    Type = uint32
                }
            }
        }

        +TestDoneCallTasks = {
            Class = MessageGAM
            TriggerOnChange = 1
            +Events = {
                Class = ReferenceContainer
                // BYPASS AppMonitor -> When in TEST_DONE (7) call TEST_DONE_TASKS
                +AppMonitorTempBypass_TEST_POST_CALL_TEST_DONE_TASKS = {
                    Class = EventConditionTrigger
                    EventTrigger = {
                        Command_Tasks_Trigger_DDB1 = 1
                        Signal_SMState_DDB1 = 7
                    }
                    +TAF_TEST_DONE_TEST_DONE_TASKS = {
                        Class = Message
                        Destination = StateMachine
                        Function = TEST_DONE_TASKS
                        Mode = ExpectsReply
                    }
                }
            }
            InputSignals = {
                Command_Tasks_Trigger_DDB1 = {
                    Alias = Tasks_Trigger_DDB1
                    DataSource = DDB1
                    Type = uint8
                }
                Signal_SMState_DDB1 = {
                    Alias = SMState_DDB1
                    DataSource = DDB1
                    Type = uint8
                }
            }
            OutputSignals = {
                Clear_Tasks_Trigger_DDB1 = {
                    DataSource = DDB1
                    Type = uint32
                }
            }
        }

        +EventMessages = {
            Class = MessageGAM
            TriggerOnChange = 1
            +Events = {
                Class = ReferenceContainer
                // Ext Driven -> From PRE_CFG (1) send to CFG_ERROR (6)
                +TriggerStateTransition_PRE_CFG_GOTO_CFG_ERROR = {
                    Class = EventConditionTrigger
                    EventTrigger = {
                        Command_ExtStateTransition_DDB1 = 2
                        Signal_SMState_DDB1 = 1
                    }
                    +TST_PRE_CFG_GOTO_CFG_ERROR = {
                        Class = Message
                        Destination = StateMachine
                        Function = GOTO_CFG_ERROR
                        Mode = ExpectsReply
                    }
                }
                // App Driven ->From MXI_CFG (2) send to PLC_CFG (3)
                +TriggerStateTransition_MXI_CFG_GOTO_PLC_CFG = {
                    Class = EventConditionTrigger
                    EventTrigger = {
                        Command_MXIConfigurationSupervisor_Done_DDB1 = 1
                        Command_MXIConfigurationSupervisor_Error_DDB1 = 0
                        Signal_SMState_DDB1 = 2
                    }
                    +TST_MXI_CFG_GOTO_PLC_CFG = {
                        Class = Message
                        Destination = StateMachine
                        Function = GOTO_PLC_CFG
                        Mode = ExpectsReply
                    }
                }
                // App Driven ->From MXI_CFG (2) send to CFG_ERROR (6)
                +TriggerStateTransition_MXI_CFG_GOTO_CFG_ERROR = {
                    Class = EventConditionTrigger
                    EventTrigger = {
                        Command_MXIConfigurationSupervisor_Error_DDB1 = 1
                        Signal_SMState_DDB1 = 2
                    }
                    +TST_MXI_CFG_GOTO_CFG_ERROR = {
                        Class = Message
                        Destination = StateMachine
                        Function = GOTO_CFG_ERROR
                        Mode = ExpectsReply
                    }
                }
                // App Driven ->From PLC_CFG (3) send to TEST_RUN (4)
                +TriggerStateTransition_PLC_CFG_GOTO_TEST_RUN = {
                    Class = EventConditionTrigger
                    EventTrigger = {
                        Command_PlcConfigurationSupervisor_Done_DDB1 = 1
                        Command_PlcConfigurationSupervisor_Error_DDB1 = 0
                        Signal_SMState_DDB1 = 3
                    }
                    +TST_PLC_CFG_GOTO_TEST_RUN = {
                        Class = Message
                        Destination = StateMachine
                        Function = GOTO_TEST_RUN
                        Mode = ExpectsReply
                    }
                }
                // App Driven ->From PLC_CFG (3) send to CFG_ERROR (6)
                +TriggerStateTransition_PLC_CFG_GOTO_CFG_ERROR = {
                    Class = EventConditionTrigger
                    EventTrigger = {
                        Command_PlcConfigurationSupervisor_Error_DDB1 = 1
                        Signal_SMState_DDB1 = 3
                    }
                    +TST_PLC_CFG_GOTO_CFG_ERROR = {
                        Class = Message
                        Destination = StateMachine
                        Function = GOTO_CFG_ERROR
                        Mode = ExpectsReply
                    }
                }
                // Ext Driven -> From {PRE_CFG (1), MXI_CFG (2), PLC_CFG (3)} to CFG_ERROR (6)
                +ForceStateTransition_ANY_GOTO_CFG_ERROR = {
                    Class = EventConditionTrigger
                    EventTrigger = {
                        Command_AbortConfigurationState_DDB1 = 1
                    }
                    +FST_ANY_GOTO_CFG_ERROR = {
                        Class = Message
                        Destination = StateMachine
                        Function = GOTO_CFG_ERROR
                        Mode = ExpectsReply
                    }
                }
                // Ext Driven -> TEST_RUN (4) to TEST_POST (5)
                +ForceStateTransition_TEST_RUN_GOTO_TEST_POST = {
                    Class = EventConditionTrigger
                    EventTrigger = {
                        Command_TerminateRunningState_DDB1 = 1
                    }
                    +FST_TEST_RUN_GOTO_TEST_POST = {
                        Class = Message
                        Destination = StateMachine
                        Function = GOTO_TEST_POST
                        Mode = ExpectsReply
                    }
                }
            }
            InputSignals = {
                Command_ExtStateTransition_DDB1 = {
                    Alias = ExtStateTransition_DDB1
                    DataSource = DDB1
                    Type = uint8
                }
                Command_AbortConfigurationState_DDB1 = {
                    Alias = AbortConfigurationState_DDB1
                    DataSource = DDB1
                    Type = uint8
                }
                Command_TerminateRunningState_DDB1 = {
                    Alias = TerminateRunningState_DDB1
                    DataSource = DDB1
                    Type = uint8
                }
                Command_MXIConfigurationSupervisor_Done_DDB1 = {
                    Alias = MXIConfigurationSupervisor_Done_DDB1
                    DataSource = DDB1
                    Type = uint8
                }
                Command_MXIConfigurationSupervisor_Error_DDB1 = {
                    Alias = MXIConfigurationSupervisor_Error_DDB1
                    DataSource = DDB1
                    Type = uint8
                }
                Command_PlcConfigurationSupervisor_Done_DDB1 = {
                    Alias = PlcConfigurationSupervisor_Done_DDB1
                    DataSource = DDB1
                    Type = uint8
                }
                Command_PlcConfigurationSupervisor_Error_DDB1 = {
                    Alias = PlcConfigurationSupervisor_Error_DDB1
                    DataSource = DDB1
                    Type = uint8
                }
                Signal_SMState_DDB1 = {
                    Alias = SMState_DDB1
                    DataSource = DDB1
                    Type = uint8
                }
            }
            OutputSignals = {
                Clear_ExtStateTransition_DDB1 = {
                    DataSource = DDB1
                    Type = uint32
                }
                Clear_AbortConfigurationState_DDB1 = {
                    DataSource = DDB1
                    Type = uint32
                }
                Clear_TerminateRunningState_DDB1 = {
                    DataSource = DDB1
                    Type = uint32
                }
                Clear_MXIConfigurationSupervisor_Done_DDB1 = {
                    DataSource = DDB1
                    Type = uint32
                }
                Clear_MXIConfigurationSupervisor_Error_DDB1 = {
                    DataSource = DDB1
                    Type = uint32
                }
                Clear_PlcConfigurationSupervisor_Done_DDB1 = {
                    DataSource = DDB1
                    Type = uint32
                }
                Clear_PlcConfigurationSupervisor_Error_DDB1 = {
                    DataSource = DDB1
                    Type = uint32
                }
            }
        }
        // ------------------- //

        // ----- STORAGE ----- //
        
        
        +StoreStartPulseTime_T1 = {
            Class = TriggerEnableGAM
            NumberOfTriggers = 1
            ResetCycles = 1
            InputSignals = {
                DANWriterEnable_DDB1 = {
                    Type = uint8
                    DataSource = DDB1
                }
                AbsTimeT1_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                }
                InitTime_1_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                }
            }
            OutputSignals = {
                InitTime_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                }
            }
        }
        +StoreStopPulseTime_T1 = {
            Class = TriggerEnableGAM
            NumberOfTriggers = 1
            Negated = 1 
            ResetCycles = 1
            InputSignals = {
                DANWriterEnable_DDB1 = {
                    Type = uint8
                    DataSource = DDB1
                }
                AbsTimeT1_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                }
                FinalTime_1_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                }
            }
            OutputSignals = {
                FinalTime_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                }
            }
        }
        
        +DANWriterWriteData = {
            Class = IOGAM
            InputSignals = {
                DANWriterEnable_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                // Time Signals
                TimeSamples_DDB1 = {
                    Alias = AbsTimeT1_DDB1
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 1
                }
                AbsTime_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 1
                }
                MXIAbsTime_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                    NumberOfElements = 1
                }
                // State
                SMState_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                AcqStatus_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                // MXI Supervisor
                MXIConfigurationSupervisor_Done_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXIConfigurationSupervisor_Error_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXIConfigurationSupervisor_Status_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                // MXI Supervisor - Base Configuration
                MXIBaseConfiguration_Trigger_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXIBaseConfiguration_Mode_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXIBaseConfigurationDone_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXIBaseConfigurationStatus_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                // MXI Supervisor - Acquisition Enable
                MXIAcquisitionEnable_Trigger_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXIAcquisitionEnableDone_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXIAcquisitionEnableStatus_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                // MXI Supervisor - Triplet Configuration
                MXITripletConfiguration_Trigger_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXITripletConfigurationDone_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                MXITripletConfigurationError_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                // PLC Supervisor
                PlcPacketTx_TrgOut_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                PlcConfigurationSupervisor_Done_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                PlcConfigurationSupervisor_Error_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                PlcConfigurationSupervisor_Status_DDB1 = {
                    DataSource = DDB1
                    Type = uint8
                    NumberOfElements = 1
                }
                // Statistics
                T1_PreCfg_CycleTime = {
                    Alias = PreCfg.Thread1Cfg_CycleTime
                    DataSource = Timings
                    Type = uint32
                    NumberOfElements = 1
                }
                T1_MxiCfg_CycleTime = {
                    Alias = MxiCfg.Thread1Cfg_CycleTime
                    DataSource = Timings
                    Type = uint32
                    NumberOfElements = 1
                }
                T1_PlcCfg_CycleTime = {
                    Alias = PlcCfg.Thread1Cfg_CycleTime
                    DataSource = Timings
                    Type = uint32
                    NumberOfElements = 1
                }
                T1_TestRun_CycleTime = {
                    Alias = TestRun.Thread1Cfg_CycleTime
                    DataSource = Timings
                    Type = uint32
                    NumberOfElements = 1
                }
                T1_TestPost_CycleTime = {
                    Alias = TestPost.Thread1Cfg_CycleTime
                    DataSource = Timings
                    Type = uint32
                    NumberOfElements = 1
                }
                T1_CfgError_CycleTime = {
                    Alias = CfgError.Thread1Cfg_CycleTime
                    DataSource = Timings
                    Type = uint32
                    NumberOfElements = 1
                }
                T1_Error_CycleTime = {
                    Alias = Error.Thread1Cfg_CycleTime
                    DataSource = Timings
                    Type = uint32
                    NumberOfElements = 1
                }
                T1_FirstGAM_ReadTime = {
                    Alias = TimeConverter_ReadTime
                    DataSource = Timings
                    Type = uint32
                    NumberOfElements = 1
                }
                T1_LastGAM_ExecTime = {
                    Alias = EventMessages_ExecTime
                    DataSource = Timings
                    Type = uint32
                    NumberOfElements = 1
                }
                InitTime_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                }        
                FinalTime_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                }   
                InitTime_Save_DDB1 = {
                    Alias = InitTime_DDB1
                    DataSource = DDB1
                    Type = uint64
                }        
                FinalTime_Save_DDB1 = {
                    Alias = FinalTime_DDB1
                    DataSource = DDB1
                    Type = uint64
                }                                       
            }
            OutputSignals = {
                DANWriterT1_Trigger = {
                    DataSource = DANWriterT1
                    Type = uint8
                    NumberOfElements = 1
                }
                DANWriterT1_TimeSamples = {
                    DataSource = DANWriterT1
                    Type = uint64
                    NumberOfElements = 1
                }
                DANWriterT1_Time = {
                    DataSource = DANWriterT1
                    Type = uint64
                    NumberOfElements = 1
                }
                DANWriterT1_MXIAbsTime = {
                    DataSource = DANWriterT1
                    Type = uint64
                    NumberOfElements = 1
                }
                DANWriterT1_SMState = {
                    DataSource = DANWriterT1
                    Type = uint8
                    NumberOfElements = 1
                }
                DANWriterT1_AcqStatus = {
                    DataSource = DANWriterT1
                    Type = uint8
                    NumberOfElements = 1
                }
                // MXI Supervisor
                DANWriterT1_MXICfgSupDone = {
                    DataSource = DANWriterT1
                    Type = uint8
                    NumberOfElements = 1
                }
                DANWriterT1_MXICfgSupError = {
                    DataSource = DANWriterT1
                    Type = uint8
                    NumberOfElements = 1
                }
                DANWriterT1_MXICfgSupStatus = {
                    DataSource = DANWriterT1
                    Type = uint8
                    NumberOfElements = 1
                }
                // MXI Supervisor - Base Configuration
                DANWriterT1_MXIBaseCfgTrg = {
                    DataSource = DANWriterT1
                    Type = uint8
                    NumberOfElements = 1
                }
                DANWriterT1_MXIBaseCfgMode = {
                    DataSource = DANWriterT1
                    Type = uint8
                    NumberOfElements = 1
                }
                DANWriterT1_MXIBaseCfgDone = {
                    DataSource = DANWriterT1
                    Type = uint8
                    NumberOfElements = 1
                }
                DANWriterT1_MXIBaseCfgStatus = {
                    DataSource = DANWriterT1
                    Type = uint8
                    NumberOfElements = 1
                }
                // MXI Supervisor - Acquisition Enable
                DANWriterT1_MXIAcqEnTrg = {
                    DataSource = DANWriterT1
                    Type = uint8
                    NumberOfElements = 1
                }
                DANWriterT1_MXIAcqEnDone = {
                    DataSource = DANWriterT1
                    Type = uint8
                    NumberOfElements = 1
                }
                DANWriterT1_MXIAcqEnStatus = {
                    DataSource = DANWriterT1
                    Type = uint8
                    NumberOfElements = 1
                }
                // MXI Supervisor - Triplet Configuration
                DANWriterT1_MXITrpCfgTrg = {
                    DataSource = DANWriterT1
                    Type = uint8
                    NumberOfElements = 1
                }
                DANWriterT1_MXITrpCfgDone = {
                    DataSource = DANWriterT1
                    Type = uint8
                    NumberOfElements = 1
                }
                DANWriterT1_MXITrpCfgError = {
                    DataSource = DANWriterT1
                    Type = uint8
                    NumberOfElements = 1
                }
                // PLC Supervisor
                DANWriterT1_PlcCfgSupTxTrg = {
                    DataSource = DANWriterT1
                    Type = uint8
                    NumberOfElements = 1
                }
                DANWriterT1_PlcCfgSupDone = {
                    DataSource = DANWriterT1
                    Type = uint8
                    NumberOfElements = 1
                }
                DANWriterT1_PlcCfgSupError = {
                    DataSource = DANWriterT1
                    Type = uint8
                    NumberOfElements = 1
                }
                DANWriterT1_PlcCfgSupStatus = {
                    DataSource = DANWriterT1
                    Type = uint8
                    NumberOfElements = 1
                }
                // Statistics
                DANWriterT1_PreCfg_CycleTime = {
                    DataSource = DANWriterT1
                    Type = uint32
                    NumberOfElements = 1
                }
                DANWriterT1_MxiCfg_CycleTime = {
                    DataSource = DANWriterT1
                    Type = uint32
                    NumberOfElements = 1
                }
                DANWriterT1_PlcCfg_CycleTime = {
                    DataSource = DANWriterT1
                    Type = uint32
                    NumberOfElements = 1
                }
                DANWriterT1_TestRun_CycleTime = {
                    DataSource = DANWriterT1
                    Type = uint32
                    NumberOfElements = 1
                }
                DANWriterT1_TestPost_CycleTime = {
                    DataSource = DANWriterT1
                    Type = uint32
                    NumberOfElements = 1
                }
                DANWriterT1_CfgError_CycleTime = {
                    DataSource = DANWriterT1
                    Type = uint32
                    NumberOfElements = 1
                }
                DANWriterT1_Error_CycleTime = {
                    DataSource = DANWriterT1
                    Type = uint32
                    NumberOfElements = 1
                }
                DANWriterT1_FirstGAM_ReadTime = {
                    DataSource = DANWriterT1
                    Type = uint32
                    NumberOfElements = 1
                }
                DANWriterT1_LastGAM_ExecTime = {
                    DataSource = DANWriterT1
                    Type = uint32
                    NumberOfElements = 1
                }
                InitTime_L = {
                    DataSource = EpicsOutput_T1
                    Type = uint32
                }
                InitTime_H = {
                    DataSource = EpicsOutput_T1
                    Type = uint32
                }
                FinalTime_L = {
                    DataSource = EpicsOutput_T1
                    Type = uint32
                }
                FinalTime_H = {
                    DataSource = EpicsOutput_T1
                    Type = uint32
                } 
                InitTime_1_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                }        
                FinalTime_1_DDB1 = {
                    DataSource = DDB1
                    Type = uint64
                }                  
            }
        }
        // ------------------- //
        // ------------ T1 END ------------ //

        // ----------- T2 START ----------- //
        // Fast Thread - GET ACQ Data + WaveformMonitors + DANWriterWriter2
        // ----- RX PATH ----- //
        +MxiDataUsFifoDataT2 = {
            Class = IOGAM
            InputSignals = {
                MXIUpstreamData = {
                    DataSource = MXIUsFifoDataT2
                    Type = uint64
                    NumberOfElements = 3001
                    NumberOfDimensions = 1
                    Trigger = 1
                    Frequency = 0
                }
                MXIUpstreamDataErrorCheck = {
                    Alias = ErrorCheck
                    DataSource = MXIUsFifoDataT2
                    Type = uint32
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                USC_TS_VALUE_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                    NumberOfElements = 1
                }
                USC_AI_0_VALUE_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_AI_1_VALUE_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_AI_2_VALUE_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_AI_3_VALUE_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_AI_4_VALUE_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_AI_5_VALUE_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_AI_6_VALUE_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_AI_7_VALUE_NU_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_DI_62_0_VALUES_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_DATA_ERRORCHECK_DDB2 = {
                    DataSource = DDB2
                    Type = uint32
                    NumberOfElements = 1
                }
            }
        }

        +DigitalInputSplitterT2 = {
            Class = BitSplitterGAM
            InputSignals = {
                DigitalInputs = {
                    Alias = USC_DI_62_0_VALUES_DDB2
                    DataSource = DDB2
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
            }
            OutputSignals = {
                DigitalInput_0 = {
                    Alias = USC_DI_0_VALUES_DDB2
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DigitalInput_1 = {
                    Alias = USC_DI_1_VALUES_DDB2
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
            }
        }

        +TimeConversionT2 = {
            Class = TimeArrayGAM
            TimePerTicks = 25   // 25 ns / tick
            TimeStep = 500      // 500 ns
            InputSignals = {
                USC_TS_VALUE_DDB2 = { // FPGA Clock Ticks
                    DataSource = DDB2
                    Type = uint64
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                TimeArrayNs_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
            }
        }
        
        +TimeConversionT2_Abs = {
            Class = TimeArrayGAM
            TimePerTicks = 25   // 25 ns / tick
            TimeStep = 500      // 500 ns
            AbsoluteTime = 1
            InputSignals = {
                USC_TS_VALUE_DDB2 = { // FPGA Clock Ticks
                    DataSource = DDB2
                    Type = uint64
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                TimeArrayNs_Abs_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
            }
        }        

        +MXIMasterTimeT2 = {
            Class = IOGAM
            InputSignals = {
                TimeArrayNs_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                    Ranges = {{0,0}}
                }
            }
            OutputSignals = {
                MXIAbsTime_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
            }
        }
        // ------------------- //

        // ---- CONST GAM ---- //
        +DANWriterWriteDataWindowLimitsT2 = {
            Class = ConstantGAM
            OutputSignals = {
                DANWriterWriteDataWindowLowerLimit_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                    NumberOfElements = 1
                    Default = 5000000000
                }
                DANWriterWriteDataWindowUpperLimit_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                    NumberOfElements = 1
                    Default = 6000000000
                }
            }
        }
        // ------------------- //

        // ---- FLOW CTRL ---- //
        +DANWriterWriteDataWindowT2 = {
            Class = MathExpressionGAM
            Expression = "
                        DANWriterWriterEnable_DDB2 = (uint8)(((uint64)(MXIAbsTime_DDB2) >= (uint64)(DANWriterWriteDataWindowLowerLimit_DDB2))
                                                && ((uint64)(MXIAbsTime_DDB2) <= (uint64)(DANWriterWriteDataWindowUpperLimit_DDB2)));
                        DANWriterWriterDone_DDB2 = (uint8)((uint64)(MXIAbsTime_DDB2) > (uint64)(DANWriterWriteDataWindowUpperLimit_DDB2));
                        "
            InputSignals = {
                MXIAbsTime_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                    NumberOfElements = 1
                }
                DANWriterWriteDataWindowLowerLimit_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                    NumberOfElements = 1
                }
                DANWriterWriteDataWindowUpperLimit_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                DANWriterWriterEnable_DDB2 = {
                    DataSource = DDB2
                    Type = uint8
                }
                DANWriterWriterDone_DDB2 = {
                    DataSource = DDB2
                    Type = uint8
                }
            }
        }
        // ------------------- //

        // -- MON/STATE CTRL - //
        +AppMonitorT2 = {
            Class = TestMonitorGAM
            InputSignals = {
                MXIAbsTime_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                    NumberOfElements = 1
                }
                DANWriterWriterDone_DDB2 = {
                    DataSource = DDB2
                    Type = uint8
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                AbortRunningState_DDB2 = {
                    DataSource = DDB2
                    Type = uint8
                    NumberOfElements = 1
                }
            }
        }

        +ExecutionMonitorT2 = {
            Class = MessageGAM
            TriggerOnChange = 1
            +Events = {
                Class = ReferenceContainer
                // App Driven -> Notify T1 that T2 acquisition/storage is completed
                +StatusNotificationT2 = {
                    Class = EventConditionTrigger
                    EventTrigger = {
                        Command_DANWriterWriterDone_DDB2 = 1
                    }
                    +NOTIFY_T1_STATUS_T2 = {
                        Class = Message
                        Destination = TbTestApp.Functions.AcquisitionStatusDaq
                        Function = SetOutput
                        +Parameters = {
                            Class = ConfigurationDatabase
                            SignalName = AcquisitionStatusT2_DDB1
                            SignalValue = 1
                        }
                    }
                }
            }
            InputSignals = {
                Command_DANWriterWriterDone_DDB2 = {
                    Alias = DANWriterWriterDone_DDB2
                    DataSource = DDB2
                    Type = uint8
                }
            }
            OutputSignals = {
                Clear_DANWriterWriterDone_DDB2 = {
                    DataSource = DDB2
                    Type = uint32
                }
            }
        }
        // ------------------- //

        // ----- STORAGE ----- //
        
        +StoreStartPulseTime_T2 = {
            Class = TriggerEnableGAM
            NumberOfTriggers = 1
            ResetCycles = 1
            InputSignals = {
                DANWriterWriterEnable_DDB2 = {
                    Type = uint8
                    DataSource = DDB2
                }
                TimeArrayNs_Abs_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                    Ranges = {{0, 0}}
                }
                InitTime_1_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                }
            }
            OutputSignals = {
                InitTime_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                }
            }
        }
        +StoreStopPulseTime_T2 = {
            Class = TriggerEnableGAM
            NumberOfTriggers = 1
            Negated = 1 
            ResetCycles = 1
            InputSignals = {
                DANWriterWriterEnable_DDB2 = {
                    Type = uint8
                    DataSource = DDB2
                }
                TimeArrayNs_Abs_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                    Ranges = {{0, 0}}
                }
                FinalTime_1_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                }
            }
            OutputSignals = {
                FinalTime_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                }
            }
        }        
        
        
        +DANWriterWriteDataT2 = {
            Class = IOGAM
            InputSignals = {
                DANWriterWriterEnable_DDB2 = {
                    DataSource = DDB2
                    Type = uint8
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                TimeArrayNs_Abs_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                    Ranges = {{0, 0}}
                }
                TimeArrayNs_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_AI_0_VALUE_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_AI_1_VALUE_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_AI_2_VALUE_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_AI_3_VALUE_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_AI_4_VALUE_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_AI_5_VALUE_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_AI_6_VALUE_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_DI_0_VALUES_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_DI_1_VALUES_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_DATA_ERRORCHECK_DDB2 = {
                    DataSource = DDB2
                    Type = uint32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                T2_PlcCfg_CycleTime = {
                    Alias = PlcCfg.Thread2Daq_CycleTime
                    DataSource = Timings
                    Type = uint32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                T2_TestRun_CycleTime = {
                    Alias = TestRun.Thread2Daq_CycleTime
                    DataSource = Timings
                    Type = uint32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                T2_TestPost_CycleTime = {
                    Alias = TestPost.Thread2Daq_CycleTime
                    DataSource = Timings
                    Type = uint32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                T2_FirstGAM_ReadTime = {
                    Alias = DigitalInputSplitterT2_ReadTime
                    DataSource = Timings
                    Type = uint32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                T2_LastGAM_ExecTime = {
                    Alias = ExecutionMonitorT2_ExecTime
                    DataSource = Timings
                    Type = uint32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                InitTime_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                }        
                FinalTime_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                }   
                InitTime_Save_DDB2 = {
                    Alias = InitTime_DDB2
                    DataSource = DDB2
                    Type = uint64
                }        
                FinalTime_Save_DDB2 = {
                    Alias = FinalTime_DDB2
                    DataSource = DDB2
                    Type = uint64
                }                   
            }
            OutputSignals = {
                DANWriterT2_Trigger = {
                    DataSource = DANWriterT2
                    Type = uint8
                    NumberOfElements = 1
                }
                DANWriterT2_TimeSamples = {
                    DataSource = DANWriterT2
                    Type = uint64
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                DANWriterT2_Time = {
                    DataSource = DANWriterT2
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT2_USC_AI_0_VALUE = {
                    DataSource = DANWriterT2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT2_USC_AI_1_VALUE = {
                    DataSource = DANWriterT2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT2_USC_AI_2_VALUE = {
                    DataSource = DANWriterT2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT2_USC_AI_3_VALUE = {
                    DataSource = DANWriterT2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT2_USC_AI_4_VALUE = {
                    DataSource = DANWriterT2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT2_USC_AI_5_VALUE = {
                    DataSource = DANWriterT2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT2_USC_AI_6_VALUE = {
                    DataSource = DANWriterT2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT2_USC_DI_0_VALUE = {
                    DataSource = DANWriterT2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT2_USC_DI_1_VALUE = {
                    DataSource = DANWriterT2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT2_ERRORCHECK = {
                    DataSource = DANWriterT2
                    Type = uint32
                }
                DANWriterT2_PlcCfg_CycleTime = {
                    DataSource = DANWriterT2
                    Type = uint32
                }
                DANWriterT2_TestRun_CycleTime = {
                    DataSource = DANWriterT2
                    Type = uint32
                }
                DANWriterT2_TestPost_CycleTime = {
                    DataSource = DANWriterT2
                    Type = uint32
                }
                DANWriterT2_FirstGAM_ReadTime = {
                    DataSource = DANWriterT2
                    Type = uint32
                }
                DANWriterT2_LastGAM_ExecTime = {
                    DataSource = DANWriterT2
                    Type = uint32
                }
                InitTime_L = {
                    DataSource = EpicsOutput_T2
                    Type = uint32
                }
                InitTime_H = {
                    DataSource = EpicsOutput_T2
                    Type = uint32
                }
                FinalTime_L = {
                    DataSource = EpicsOutput_T2
                    Type = uint32
                }
                FinalTime_H = {
                    DataSource = EpicsOutput_T2
                    Type = uint32
                } 
                InitTime_1_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                }        
                FinalTime_1_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                }                   
            }
        }

        +FileWriterBufferDataT2 = {
            Class = IOGAM
            InputSignals = {
                FileWriterBufferEnable_DDB2 = {
                    Alias = DANWriterWriterEnable_DDB2
                    DataSource = DDB2
                    Type = uint8
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                TimeArrayNs_DDB2 = {
                    DataSource = DDB2
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_AI_0_VALUE_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_AI_1_VALUE_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_AI_2_VALUE_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                USC_DI_0_VALUES_DDB2 = {
                    DataSource = DDB2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
            }
            OutputSignals = {
                FileWriterT2_Trigger = {
                    DataSource = FileWriterBufferT2
                    Type = uint8
                    NumberOfElements = 1
                }
                FileWriterT2_Time = {
                    DataSource = FileWriterBufferT2
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                FileWriterT2_USC_AI_0_VALUE = {
                    DataSource = FileWriterBufferT2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                FileWriterT2_USC_AI_1_VALUE = {
                    DataSource = FileWriterBufferT2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                FileWriterT2_USC_AI_2_VALUE = {
                    DataSource = FileWriterBufferT2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                FileWriterT2_USC_DI_0_VALUE = {
                    DataSource = FileWriterBufferT2
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
            }
        }
        // ------------------- //
        // ------------ T2 END ------------ //

        // ----------- T3 START ----------- //
        // Fast Thread - Get DEBUG Data + DANWriterWriter 3
        // ----- RX PATH ----- //
        +MxiDataUsFifoDataT3 = {
            Class = IOGAM
            InputSignals = {
                MXIUpstreamDebug = {
                    DataSource = MXIUsFifoDebugT3
                    Type = uint64
                    NumberOfElements = 2001
                    NumberOfDimensions = 1
                    Trigger = 1
                    Frequency = 0
                }
                MXIUpstreamDebugErrorCheck = {
                    Alias = ErrorCheck
                    DataSource = MXIUsFifoDebugT3
                    Type = uint32
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                DBG_TS_VALUE_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                    NumberOfElements = 1
                }
                DBG_AO_0_VALUE_DDB3 = {
                    DataSource = DDB3
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_AO_1_VALUE_DDB3 = {
                    DataSource = DDB3
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_AO_2_VALUE_DDB3 = {
                    DataSource = DDB3
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_AO_3_VALUE_DDB3 = {
                    DataSource = DDB3
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_DO_62_0_VALUES_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_DATA_ERRORCHECK_DDB3 = {
                    DataSource = DDB3
                    Type = uint32
                    NumberOfElements = 1
                }
            }
        }

        +DigitalInputSplitterT3 = {
            Class = BitSplitterGAM
            InputSignals = {
                DigitalInputs = {
                    Alias = DBG_DO_62_0_VALUES_DDB3
                    DataSource = DDB3
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
            }
            OutputSignals = {
                DigitalInput_0 = {
                    Alias = DBG_MO_0_VALUES_DDB3
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DigitalInput_1 = {
                    Alias = DBG_MO_1_VALUES_DDB3
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DigitalInput_2 = {
                    Alias = DBG_DO_0_VALUES_DDB3
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DigitalInput_3 = {
                    Alias = DBG_DO_1_VALUES_DDB3
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DigitalInput_4 = {
                    Alias = DBG_DO_2_VALUES_DDB3
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DigitalInput_5 = {
                    Alias = DBG_DO_3_VALUES_DDB3
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DigitalInput_6 = {
                    Alias = DBG_DO_4_VALUES_DDB3
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DigitalInput_7 = {
                    Alias = DBG_MOD1_VALUES_DDB3
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DigitalInput_8 = {
                    Alias = DBG_MOD2_VALUES_DDB3
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DigitalInput_9 = {
                    Alias = DBG_FS1_VALUES_DDB3
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DigitalInput_10 = {
                    Alias = DBG_FS2_VALUES_DDB3
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DigitalInput_11 = {
                    Alias = DBG_PWON_VALUES_DDB3
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
            }
        }

        +TimeConversionT3 = {
            Class = TimeArrayGAM
            TimePerTicks = 25   // 25 ns / tick
            TimeStep = 500      // 500 ns
            InputSignals = {
                DBG_TS_VALUE_DDB3 = { // FPGA Clock Ticks
                    DataSource = DDB3
                    Type = uint64
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                TimeArrayNs_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
            }
        }
        
        +TimeConversionT3_Abs = {
            Class = TimeArrayGAM
            TimePerTicks = 25   // 25 ns / tick
            TimeStep = 500      // 500 ns
            AbsoluteTime = 1
            InputSignals = {
                DBG_TS_VALUE_DDB3 = { // FPGA Clock Ticks
                    DataSource = DDB3
                    Type = uint64
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                TimeArrayNs_Abs_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
            }
        }        

        +MXIMasterTimeT3 = {
            Class = IOGAM
            InputSignals = {
                TimeArrayNs_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                    Ranges = {{0,0}}
                }
            }
            OutputSignals = {
                MXIAbsTime_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
            }
        }
        // ------------------- //

        // ---- CONST GAM ---- //
        +DANWriterWriteDataWindowLimitsT3 = {
            Class = ConstantGAM
            OutputSignals = {
                DANWriterWriteDataWindowLowerLimit_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                    NumberOfElements = 1
                    Default = 5000000000
                }
                DANWriterWriteDataWindowUpperLimit_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                    NumberOfElements = 1
                    Default = 6000000000
                }
            }
        }
        // ------------------- //

        // ---- FLOW CTRL ---- //
        +DANWriterWriteDataWindowT3 = {
            Class = MathExpressionGAM
            Expression = "
                        DANWriterWriterEnable_DDB3 = (uint8)(((uint64)(MXIAbsTime_DDB3) >= (uint64)(DANWriterWriteDataWindowLowerLimit_DDB3))
                                                && ((uint64)(MXIAbsTime_DDB3) <= (uint64)(DANWriterWriteDataWindowUpperLimit_DDB3)));
                        DANWriterWriterDone_DDB3 = (uint8)((uint64)(MXIAbsTime_DDB3) > (uint64)(DANWriterWriteDataWindowUpperLimit_DDB3));
                        "
            InputSignals = {
                MXIAbsTime_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                    NumberOfElements = 1
                }
                DANWriterWriteDataWindowLowerLimit_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                    NumberOfElements = 1
                }
                DANWriterWriteDataWindowUpperLimit_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                    NumberOfElements = 1
                }
            }
            OutputSignals = {
                DANWriterWriterEnable_DDB3 = {
                    DataSource = DDB3
                    Type = uint8
                }
                DANWriterWriterDone_DDB3 = {
                    DataSource = DDB3
                    Type = uint8
                }
            }
        }
        // ------------------- //

        // -- MON/STATE CTRL - //
        +AppMonitorT3 = {
            Class = TestMonitorGAM
            InputSignals = {
                MXIAbsTime_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                    NumberOfElements = 1
                }
                DANWriterWriterEnable_DDB3 = {
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1
                }
                DANWriterWriterDone_DDB3 = {
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1
                }
            }
        }

        +ExecutionMonitorT3 = {
            Class = MessageGAM
            TriggerOnChange = 1
            +Events = {
                Class = ReferenceContainer
                // App Driven -> Notify T1 that T3 acquisition/storage is completed
                +StatusNotificationT3 = {
                    Class = EventConditionTrigger
                    EventTrigger = {
                        Command_DANWriterWriterDone_DDB3 = 1
                    }
                    +NOTIFY_T1_STATUS_T3 = {
                        Class = Message
                        Destination = TbTestApp.Functions.AcquisitionStatusDbg
                        Function = SetOutput
                        +Parameters = {
                            Class = ConfigurationDatabase
                            SignalName = AcquisitionStatusT3_DDB1
                            SignalValue = 1
                        }
                    }
                }
            }
            InputSignals = {
                Command_DANWriterWriterDone_DDB3 = {
                    Alias = DANWriterWriterDone_DDB3
                    DataSource = DDB3
                    Type = uint8
                }
            }
            OutputSignals = {
                Clear_DANWriterWriterDone_DDB3 = {
                    DataSource = DDB3
                    Type = uint32
                }
            }
        }
        // ------------------- //

        // ----- STORAGE ----- //

        +StoreStartPulseTime_T3 = {
            Class = TriggerEnableGAM
            NumberOfTriggers = 1
            ResetCycles = 1
            InputSignals = {
                DANWriterWriterEnable_DDB3 = {
                    Type = uint8
                    DataSource = DDB3
                }
                TimeArrayNs_Abs_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                    Ranges = {{0, 0}}
                }
                InitTime_1_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                }
            }
            OutputSignals = {
                InitTime_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                }
            }
        }
        +StoreStopPulseTime_T3 = {
            Class = TriggerEnableGAM
            NumberOfTriggers = 1
            Negated = 1 
            ResetCycles = 1
            InputSignals = {
                DANWriterWriterEnable_DDB3 = {
                    Type = uint8
                    DataSource = DDB3
                }
                TimeArrayNs_Abs_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                    Ranges = {{0, 0}}
                }
                FinalTime_1_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                }
            }
            OutputSignals = {
                FinalTime_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                }
            }
        }

        +DANWriterWriteDataT3 = {
            Class = IOGAM
            InputSignals = {
                DANWriterWriterEnable_DDB3 = {
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                TimeArrayNs_Abs_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                    Ranges = {{0, 0}}
                }
                TimeArrayNs_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_AO_0_VALUE_DDB3 = {
                    DataSource = DDB3
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_AO_1_VALUE_DDB3 = {
                    DataSource = DDB3
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_AO_2_VALUE_DDB3 = {
                    DataSource = DDB3
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_MO_0_VALUES_DDB3 = {
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_MO_1_VALUES_DDB3 = {
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_DO_0_VALUES_DDB3 = {
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_DO_1_VALUES_DDB3 = {
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_DO_2_VALUES_DDB3 = {
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_DO_3_VALUES_DDB3 = {
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_DO_4_VALUES_DDB3 = {
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_MOD1_VALUES_DDB3 = {
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_MOD2_VALUES_DDB3 = {
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_FS1_VALUES_DDB3 = {
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_FS2_VALUES_DDB3 = {
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_PWON_VALUES_DDB3 = {
                    DataSource = DDB3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DBG_DATA_ERRORCHECK_DDB3 = {
                    DataSource = DDB3
                    Type = uint32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                T3_PlcCfg_CycleTime = {
                    Alias = PlcCfg.Thread3Dbg_CycleTime
                    DataSource = Timings
                    Type = uint32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                T3_TestRun_CycleTime = {
                    Alias = TestRun.Thread3Dbg_CycleTime
                    DataSource = Timings
                    Type = uint32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                T3_TestPost_CycleTime = {
                    Alias = TestPost.Thread3Dbg_CycleTime
                    DataSource = Timings
                    Type = uint32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                T3_FirstGAM_ReadTime = {
                    Alias = DigitalInputSplitterT3_ReadTime
                    DataSource = Timings
                    Type = uint32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                T3_LastGAM_ReadTime = {
                    Alias = ExecutionMonitorT3_ExecTime
                    DataSource = Timings
                    Type = uint32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                InitTime_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                }        
                FinalTime_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                }   
                InitTime_Save_DDB3 = {
                    Alias = InitTime_DDB3
                    DataSource = DDB3
                    Type = uint64
                }        
                FinalTime_Save_DDB3 = {
                    Alias = FinalTime_DDB3
                    DataSource = DDB3
                    Type = uint64
                }                   
            }
            OutputSignals = {
                DANWriterT3_Trigger = {
                    DataSource = DANWriterT3
                    Type = uint8
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                DANWriterT3_TimeSamples = {
                    DataSource = DANWriterT3
                    Type = uint64
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }             
                DANWriterT3_Time = {
                    DataSource = DANWriterT3
                    Type = uint64
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_AO_0_VALUE = {
                    DataSource = DANWriterT3
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_AO_1_VALUE = {
                    DataSource = DANWriterT3
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_AO_2_VALUE = {
                    DataSource = DANWriterT3
                    Type = uint16
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_MO_0_VALUE = {
                    DataSource = DANWriterT3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_MO_1_VALUE = {
                    DataSource = DANWriterT3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_DO_0_VALUE = {
                    DataSource = DANWriterT3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_DO_1_VALUE = {
                    DataSource = DANWriterT3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_DO_2_VALUE = {
                    DataSource = DANWriterT3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_DO_3_VALUE = {
                    DataSource = DANWriterT3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_DO_4_VALUE = {
                    DataSource = DANWriterT3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_MOD1_VALUE = {
                    DataSource = DANWriterT3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_MOD2_VALUE = {
                    DataSource = DANWriterT3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_FS1_VALUE = {
                    DataSource = DANWriterT3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_FS2_VALUE = {
                    DataSource = DANWriterT3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_PWON_VALUE = {
                    DataSource = DANWriterT3
                    Type = uint8
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_ERRORCHECK = {
                    DataSource = DANWriterT3
                    Type = uint32
                }
                DANWriterT3_PlcCfg_CycleTime = {
                    DataSource = DANWriterT3
                    Type = uint32
                }
                DANWriterT3_TestRun_CycleTime = {
                    DataSource = DANWriterT3
                    Type = uint32
                }
                DANWriterT3_TestPost_CycleTime = {
                    DataSource = DANWriterT3
                    Type = uint32
                }
                DANWriterT3_FirstGAM_ReadTime = {
                    DataSource = DANWriterT3
                    Type = uint32
                }
                DANWriterT3_LastGAM_ExecTime = {
                    DataSource = DANWriterT3
                    Type = uint32
                }
                InitTime_L = {
                    DataSource = EpicsOutput_T3
                    Type = uint32
                }
                InitTime_H = {
                    DataSource = EpicsOutput_T3
                    Type = uint32
                }
                FinalTime_L = {
                    DataSource = EpicsOutput_T3
                    Type = uint32
                }
                FinalTime_H = {
                    DataSource = EpicsOutput_T3
                    Type = uint32
                } 
                InitTime_1_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                }        
                FinalTime_1_DDB3 = {
                    DataSource = DDB3
                    Type = uint64
                }                   
            }
        }
        // ------------------- //

        // ------------ T3 END ------------ //
    }
    +Data = {
        Class = ReferenceContainer
        DefaultDataSource = DDB1
        // ----------- T1 START ----------- //
        // Slow Timer Thread - Configuration and monitoring
        +DDB1 = {
            Class = GAMDataSource
        }

        +LoggerDataSource = {
            Class = LoggerDataSource
        }

        +Timings = {
            Class = TimingDataSource
        }

        +Timer = {
            Class = LinuxTimer
            ExecutionMode = RealTimeThread
            SleepNature = Busy
            SleepPercentage = 0
            Phase = 0
            CPUMask = 0x00000100
            Signals = {
                Counter = {
                    Type = uint32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                Time = {
                    Type = uint32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                AbsoluteTime = {
                    Type = uint64
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
            }
        }

        +MXIRegistersRead = {
            Class = NI9157::NI9157MxiDataSource
            RunNi = 0
            NI9157DevicePath = NiDevice
            NumberOfPacketsInFIFO = 10
            BlockIfNotRunning = 0
            Signals = {
                hl_tx_spi_done = {      // TX SPI done (all)
                    Type = bool
                    NumberOfElements = 1
                }
                hl_rx_spi_done = {      // RX SPI done (all)
                    Type = bool
                    NumberOfElements = 1
                }
                dsc_ao_0_ctr_out = {        // AO 0 Accepted Triplet Counter
                    Type = uint8
                    NumberOfElements = 1
                }
                dsc_ao_1_ctr_out = {        // AO 1 Accepted Triplet Counter
                    Type = uint8
                    NumberOfElements = 1
                }
                dsc_ao_2_ctr_out = {        // AO 2 Accepted Triplet Counter
                    Type = uint8
                    NumberOfElements = 1
                }
                dsc_mo_0_ctr_out = {        // MO 0 Accepted Triplet Counter
                    Type = uint8
                    NumberOfElements = 1
                }
                dsc_mo_1_ctr_out = {        // MO 1 Accepted Triplet Counter
                    Type = uint8
                    NumberOfElements = 1
                }
                dsc_do_n_ctr_out = {        // DO N Accepted Triplet Counter
                    Type = uint8
                    NumberOfElements = 1
                }
                dsc_fs_0_ctr_out = {        // FS 0 Accepted Triplet Counter
                    Type = uint8
                    NumberOfElements = 1
                }
                dsc_fs_1_ctr_out = {        // FS 1 Accepted Triplet Counter
                    Type = uint8
                    NumberOfElements = 1
                }
                dsc_full_mod_out = {        // Modules FIFO Full status flag
                    Type = uint8
                    NumberOfElements = 1
                }
                dsc_acq_en_out = {      // USC Acquisition Enable
                    Type = bool
                    NumberOfElements = 1
                }
                dsc_ts_status = {        // Timestamp generation status
                    Type = bool
                    NumberOfElements = 1
                }
                dsc_ts_out = {        // Timestamp current value
                    Type = uint64
                    NumberOfElements = 1
                }
            }
        }

        +MXIRegistersWriteRst = {
            Class = NI9157::NI9157MxiDataSource
            RunNi = 0
            NI9157DevicePath = NiDevice
            NumberOfPacketsInFIFO = 10
            BlockIfNotRunning = 0
            Signals = {
                rst_in = {   // Reset Firmware (toggle switch)
                    Type = bool
                    NumberOfElements = 1
                }
            }
        }

        +MXIRegistersWriteEn = {
            Class = NI9157::NI9157MxiDataSource
            RunNi = 0
            NI9157DevicePath = NiDevice
            NumberOfPacketsInFIFO = 10
            BlockIfNotRunning = 0
            Signals = {
                dsc_en_in = {   // Enable DSC
                    Type = bool
                    NumberOfElements = 1
                }
            }
        }

        +MXIRegistersDgbEn = {
            Class = NI9157::NI9157MxiDataSource
            RunNi = 0
            NI9157DevicePath = NiDevice
            NumberOfPacketsInFIFO = 10
            BlockIfNotRunning = 0
            Signals = {
                dbg_en_sel_in = {   // DBG Enable Selector (0 -> dbg_en_in driven, 1-> dsc_acq_en_out driven)
                    Type = bool
                    NumberOfElements = 1
                }
                dbg_en_in = {       // DBG Enable Input (usable when dbg_en_sel_in <= 1'b0)
                    Type = bool
                    NumberOfElements = 1
                }
            }
        }

        +MXIRegistersWriteHlOpt = {
            Class = NI9157::NI9157MxiDataSource
            RunNi = 0
            NI9157DevicePath = NiDevice
            NumberOfPacketsInFIFO = 10
            BlockIfNotRunning = 0
            Signals = {
                hl_tx_1_opt = {     // HL TX 1 CFG
                    Type = uint8
                    NumberOfElements = 1
                }
                hl_tx_2_opt = {     // HL TX 2 CFG
                    Type = uint8
                    NumberOfElements = 1
                }
                hl_tx_3_opt = {     // HL TX 3 CFG
                    Type = uint8
                    NumberOfElements = 1
                }
                hl_tx_opt_trg = {   // Trigger HL TX configuration (toggle switch)
                    Type = bool
                    NumberOfElements = 1
                }
                hl_rx_1_opt = {     // HL RX 1 CFG
                    Type = uint8
                    NumberOfElements = 1
                }
                hl_rx_2_opt = {     // HL RX 2 CFG
                    Type = uint8
                    NumberOfElements = 1
                }
                hl_rx_3_opt = {     // HL RX 3 CFG
                    Type = uint8
                    NumberOfElements = 1
                }
                hl_rx_4_opt = {     // HL RX 4 CFG
                    Type = uint8
                    NumberOfElements = 1
                }
                hl_rx_5_opt = {     // HL RX 5 CFG
                    Type = uint8
                    NumberOfElements = 1
                }
                hl_rx_6_opt = {     // HL RX 6 CFG
                    Type = uint8
                    NumberOfElements = 1
                }
                hl_rx_7_opt = {     // HL RX 7 CFG
                    Type = uint8
                    NumberOfElements = 1
                }
                hl_rx_opt_trg = {   // Trigger HL RX configuration (toggle switch)
                    Type = bool
                    NumberOfElements = 1
                }
            }
        }

        +MXIDsFifoAcqEn = {
            Class = NI9157::NI9157MxiDataSource
            NI9157DevicePath = NiDevice
            RunNi = 0
            NumberOfPacketsInFIFO = 1
            BlockIfNotRunning = 0
            Signals = {
                FIFO0_U64_WR = {
                    Type = uint64
                    NumberOfElements = 1
                    NumberOfDimensions = 1
                }
            }
        }

        +MXIDsFifoConfig = {
            Class = NI9157::NI9157MxiDataSource
            NI9157DevicePath = NiDevice
            RunNi = 0
            NumberOfPacketsInFIFO = 1
            BlockIfNotRunning = 0
            Signals = {
                FIFO0_U64_WR = {
                    Type = uint64
                    NumberOfElements = 16
                    NumberOfDimensions = 1
                }
            }
        }

        +SdnPlcPub = {
            Class = SDN::SDNPublisher
            Interface = "eno2"
            Address = "10.0.0.20:2004"
            Topic = 0
            NetworkByteOrder = 1
            Signals = {
                // Header Signals
                HeaderNF = {
                    Type = uint8
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                HeaderNI = {
                    Type = uint8
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                HeaderNC = {
                    Type = uint8
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                HeaderNS = {
                    Type = uint8
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                HeaderNA = {
                    Type = uint8
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                HeaderS = {
                    Type = uint8
                    NumberOfElements = 3
                    NumberOfDimensions = 1
                }
                // Float32 Signals
                VB1TREF = {
                    Type = float32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                VB1 = {
                    Type = float32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                VB2TREF = {
                    Type = float32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                VB2 = {
                    Type = float32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                VB1RR = {
                    Type = float32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                VB2RR = {
                    Type = float32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                VB1TH = {
                    Type = float32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                VB2TH = {
                    Type = float32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                VKTH = {
                    Type = float32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                VK = {
                    Type = float32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                PSKT = {
                    Type = float32
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                // UInt16 Signals
                VB1UP = {
                    Type = uint16
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                VB2UP = {
                    Type = uint16
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                VB1TSEL = {
                    Type = uint16
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                VB2TSEL = {
                    Type = uint16
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                VKSEL = {
                    Type = uint16
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                BODR = {
                    Type = uint16
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                VKUP = {
                    Type = uint16
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                MDKF = {
                    Type = uint16
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                CSTAT = {
                    Type = uint16
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                COMOD = {
                    Type = uint16
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                // UInt8 Commands
                CFG = {
                    Type = uint8
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                SM = {
                    Type = uint8
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
            }
        }

        +SdnPlcSub = {
            Class = SDN::SDNSubscriber
            ExecutionMode = IndependentThread
            Interface = "eno2"
            Address = "10.0.0.22:2004"
            CPUs = 0x00020000
            Topic = 0
            IgnoreTimeoutError = 1
            Timeout = 0
            Signals = {
                Header = {
                    Type = uint8
                    NumberOfElements = 48
                    NumberOfDimensions = 1
                }
                PLC_HEADER = {
                    Type = uint8
                    NumberOfElements = 8
                    NumberOfDimensions = 1
                }
                ACK_CFG = {
                    Type = uint8
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                ACK_SMC = {
                    Type = uint8
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                STATE_CFG = {
                    Type = uint8
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
                STATE_SMC = {
                    Type = uint8
                    NumberOfElements = 1
                    NumberOfDimensions = 0
                }
            }
        }

        +DANWriterT1 = {
            Class = DAN::DANSource
            NumberOfBuffers = 300
            CPUMask = 0x00040000
            DanBufferMultiplier = 8
            StackSize = 10000000
            NumberOfPreTriggers = 0
            NumberOfPostTriggers = 0
            StoreOnTrigger = 1
            ICProgName = MARTeAppRun
            Signals = {
                DANWriterT1_Trigger = {
                    Type = uint8
                }
                DANWriterT1_TimeSamples = {
                    Type = uint64
                    TimeSignal = 1
                    AbsoluteTime = 1
                }
                DANWriterT1_Time = {
                    Type = uint64
                    NodeName = "EC-GN-P5C:R_T1_Time"
                    Period = 10.0e-3
                }
                DANWriterT1_MXIAbsTime = {
                    Type = uint64
                    NodeName = "EC-GN-P5C:R_T1_MXIAbsTime"
                    Period = 10.0e-3
                }
                DANWriterT1_SMState = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T1_SMState"
                    Period = 10.0e-3
                }
                DANWriterT1_AcqStatus = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T1_AcqStatus"
                    Period = 10.0e-3
                }
                DANWriterT1_MXICfgSupDone = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T1_MXICfgSupDone"
                    Period = 10.0e-3
                }
                DANWriterT1_MXICfgSupError = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T1_MXICfgSupError"
                    Period = 10.0e-3
                }
                DANWriterT1_MXICfgSupStatus = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T1_MXICfgSupStatus"
                    Period = 10.0e-3
                }
                DANWriterT1_MXIBaseCfgTrg = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T1_MXIBaseCfgTrg"
                    Period = 10.0e-3
                }
                DANWriterT1_MXIBaseCfgMode = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T1_MXIBaseCfgMode"
                    Period = 10.0e-3
                }
                DANWriterT1_MXIBaseCfgDone = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T1_MXIBaseCfgDone"
                    Period = 10.0e-3
                }
                DANWriterT1_MXIBaseCfgStatus = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T1_MXIBaseCfgStatus"
                    Period = 10.0e-3
                }
                DANWriterT1_MXIAcqEnTrg = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T1_MXIAcqEnTrg"
                    Period = 10.0e-3
                }
                DANWriterT1_MXIAcqEnDone = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T1_MXIAcqEnDone"
                    Period = 10.0e-3
                }
                DANWriterT1_MXIAcqEnStatus = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T1_MXIAcqEnStatus"
                    Period = 10.0e-3
                }
                DANWriterT1_MXITrpCfgTrg = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T1_MXITrpCfgTrg"
                    Period = 10.0e-3
                }
                DANWriterT1_MXITrpCfgDone = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T1_MXITrpCfgDone"
                    Period = 10.0e-3
                }
                DANWriterT1_MXITrpCfgError = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T1_MXITrpCfgError"
                    Period = 10.0e-3
                }
                DANWriterT1_PlcCfgSupTxTrg = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T1_PlcCfgSupTxTrg"
                    Period = 10.0e-3
                }
                DANWriterT1_PlcCfgSupDone = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T1_PlcCfgSupDone"
                    Period = 10.0e-3
                }
                DANWriterT1_PlcCfgSupError = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T1_PlcCfgSupError"
                    Period = 10.0e-3
                }
                DANWriterT1_PlcCfgSupStatus = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T1_PlcCfgSupStatus"
                    Period = 10.0e-3
                }
                DANWriterT1_PreCfg_CycleTime = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T1_PreCfg_CT"
                    Period = 10.0e-3
                }
                DANWriterT1_MxiCfg_CycleTime = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T1_MxiCfg_CT"
                    Period = 10.0e-3
                }
                DANWriterT1_PlcCfg_CycleTime = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T1_PlcCfg_CT"
                    Period = 10.0e-3
                }
                DANWriterT1_TestRun_CycleTime = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T1_TestRun_CT"
                    Period = 10.0e-3
                }
                DANWriterT1_TestPost_CycleTime = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T1_TestPost_CT"
                    Period = 10.0e-3
                }
                DANWriterT1_CfgError_CycleTime = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T1_CfgError_CT"
                    Period = 10.0e-3
                }
                DANWriterT1_Error_CycleTime = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T1_Error_CT"
                    Period = 10.0e-3
                }
                DANWriterT1_FirstGAM_ReadTime = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T1_FirstGAM_RT"
                    Period = 10.0e-3
                }
                DANWriterT1_LastGAM_ExecTime = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T1_LastGAM_ET"
                    Period = 10.0e-3
                }
            }
        }
        +EpicsOutput_T1 = {
            Class = EPICSCA::EPICSCAOutput
            CPUs = 0xFF
            NumberOfBuffers = 50
            Signals = {
                InitTime_L = {
                    PVName = EC-GN-P5C:R_T1_ONLINE_T_L
                    Type = uint32
                }
                InitTime_H = {
                    PVName = EC-GN-P5C:R_T1_ONLINE_T_H
                    Type = uint32
                }
                FinalTime_L = {
                    PVName = EC-GN-P5C:R_T1_OFFLINE_T_L
                    Type = uint32
                }
                FinalTime_H = {
                    PVName = EC-GN-P5C:R_T1_OFFLINE_T_H
                    Type = uint32
                }
            }
        }
        
        // ------------ T1 END ------------ //

        // ----------- T2 START ----------- //
        // Fast Thread - GET ACQ Data + WaveformMonitors + DANWriterWriter2
        +DDB2 = {
            Class = GAMDataSource
        }

        +MXIUsFifoDataT2 = {
            Class = NI9157::NI9157CircularFifoReader
            NumberOfBuffers = 300
            CpuMask = 0x00008000
            NI9157DevicePath = NiDevice
            RunNi = 0
            NumberOfPacketsInFIFO = 3
            NonBlockSleepT = 1.0e-6
            TriggerAfterNPackets = 1
            Timeout = 1
            FifoName = FIFO1_U64_RD
            GetFirst = 1
            CheckFrame = 1
            +Checker = {
                Class = MarkerBitChecker
                SampleSize = 8
                NumOfFrameForSync = 1
                MarkerBitMask = 0x8000000000000000
                ResetBitMask = 0xC000000000000000
            }
            Signals = {
                MXIUpstreamData = {
                    Type = uint64
                    NumberOfDimensions = 1
                    NumberOfElements = 3001
                    HeaderSize = 8
                    // AI3[63:48] AI2[47:32] AI1[31:16] AI0[15:0]
                    // NU[63:48] AI6[47:32] AI5[31:16] AI4[15:0]
                    // NU[63:2] DI0[1] DI0[0]
                    PacketMemberSizes = {2, 2, 2, 2, 2, 2, 2, 2, 8}
                }
                ErrorCheck = {
                    Type = uint32
                    NumberOfElements = 1
                }
            }
        }

        +DANWriterT2 = {
            Class = DAN::DANSource
            NumberOfBuffers = 300
            CPUMask = 0x00080000
            DanBufferMultiplier = 8
            StackSize = 10000000
            NumberOfPreTriggers = 0
            NumberOfPostTriggers = 0
            StoreOnTrigger = 1
            ICProgName = MARTeAppRun
            Signals = {
                DANWriterT2_Trigger = {
                    Type = uint8
                }
                DANWriterT2_TimeSamples = {
                    Type = uint64
                    TimeSignal = 1
                    AbsoluteTime = 1
                }
                DANWriterT2_Time = {
                    Type = uint64
                    NodeName = "EC-GN-P5C:R_T2_Time"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT2_USC_AI_0_VALUE = {
                    Type = uint16
                    NodeName = "EC-GN-P5C:R_T2_USC_AI_0"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT2_USC_AI_1_VALUE = {
                    Type = uint16
                    NodeName = "EC-GN-P5C:R_T2_USC_AI_1"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT2_USC_AI_2_VALUE = {
                    Type = uint16
                    NodeName = "EC-GN-P5C:R_T2_USC_AI_2"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT2_USC_AI_3_VALUE = {
                    Type = uint16
                    NodeName = "EC-GN-P5C:R_T2_USC_AI_3"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT2_USC_AI_4_VALUE = {
                    Type = uint16
                    NodeName = "EC-GN-P5C:R_T2_USC_AI_4"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT2_USC_AI_5_VALUE = {
                    Type = uint16
                    NodeName = "EC-GN-P5C:R_T2_USC_AI_5"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT2_USC_AI_6_VALUE = {
                    Type = uint16
                    NodeName = "EC-GN-P5C:R_T2_USC_AI_6"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT2_USC_DI_0_VALUE = {
                    Type = uint16
                    NodeName = "EC-GN-P5C:R_T2_USC_DI_0"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT2_USC_DI_1_VALUE = {
                    Type = uint16
                    NodeName = "EC-GN-P5C:R_T2_USC_DI_1"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT2_ERRORCHECK = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T2_ERRORCHECK"
                    Period = 500.0e-6
                }
                DANWriterT2_PlcCfg_CycleTime = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T2_PlcCfg_CT"
                    Period = 500.0e-6
                }
                DANWriterT2_TestRun_CycleTime = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T2_TestRun_CT"
                    Period = 500.0e-6
                }
                DANWriterT2_TestPost_CycleTime = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T2_TestPost_CT"
                    Period = 500.0e-6
                }
                DANWriterT2_FirstGAM_ReadTime = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T2_FirstGAM_RT"
                    Period = 500.0e-6
                }
                DANWriterT2_LastGAM_ExecTime = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T2_LastGAM_ET"
                    Period = 500.0e-6
                }
            }
        }

        +FileWriterBufferT2 = {
            Class = FileDataSource::FileWriter
            NumberOfBuffers = 300
            CPUMask = 0x00400000
            StackSize = 10000000
            Filename = "/mnt/disktmpfs/AmpegonPsTb_Data/AmpegonPsTb_BinaryBuffers/TestRunBuffer_REGKEY_POST_BUILD_DAN_PREFIX5101001.bin"
            Overwrite = "yes"
            FileFormat = "binary"
            StoreOnTrigger = 1
            RefreshContent = 0
            NumberOfPreTriggers = 0
            NumberOfPostTriggers = 0
            Signals = {
                FileWriterT2_Trigger = {
                    Type = uint8
                }
                FileWriterT2_Time = {
                    Type = uint64
                    NumberOfElements = 1000
                }
                FileWriterT2_USC_AI_0_VALUE = {
                    Type = uint16
                    NumberOfElements = 1000
                }
                FileWriterT2_USC_AI_1_VALUE = {
                    Type = uint16
                    NumberOfElements = 1000
                }
                FileWriterT2_USC_AI_2_VALUE = {
                    Type = uint16
                    NumberOfElements = 1000
                }
                FileWriterT2_USC_DI_0_VALUE = {
                    Type = uint16
                    NumberOfElements = 1000
                }
            }
        }
        
        +EpicsOutput_T2 = {
            Class = EPICSCA::EPICSCAOutput
            CPUs = 0xFF
            NumberOfBuffers = 50
            Signals = {
                InitTime_L = {
                    PVName = EC-GN-P5C:R_T2_ONLINE_T_L
                    Type = uint32
                }
                InitTime_H = {
                    PVName = EC-GN-P5C:R_T2_ONLINE_T_H
                    Type = uint32
                }
                FinalTime_L = {
                    PVName = EC-GN-P5C:R_T2_OFFLINE_T_L
                    Type = uint32
                }
                FinalTime_H = {
                    PVName = EC-GN-P5C:R_T2_OFFLINE_T_H
                    Type = uint32
                }
            }
        }        
        
        // ------------ T2 END ------------ //

        // ----------- T3 START ----------- //
        // Fast Thread - Get DEBUG Data + DANWriterWriter 3
        +DDB3 = {
            Class = GAMDataSource
        }

        +MXIUsFifoDebugT3 = {
            Class = NI9157::NI9157CircularFifoReader
            NumberOfBuffers = 300
            CpuMask = 0x00010000
            NI9157DevicePath = NiDevice
            RunNi = 0
            NumberOfPacketsInFIFO = 3
            NonBlockSleepT = 1.0e-6
            TriggerAfterNPackets = 1
            Timeout = 1
            FifoName = FIFO2_U64_RD
            GetFirst = 1
            CheckFrame = 1
            +Checker = {
                Class = MarkerBitChecker
                SampleSize = 8
                NumOfFrameForSync = 1
                MarkerBitMask = 0x8000000000000000
                ResetBitMask = 0xC000000000000000
            }
            Signals = {
                MXIUpstreamDebug = {
                    Type = uint64
                    NumberOfDimensions = 1
                    NumberOfElements = 2001
                    HeaderSize = 8
                    // NU[63:48] AO2[47:32] AO1[31:16] AO0[15:0]}
                    // NU[63:12] PWON[11] FS2[10] FS1[9] MOD2[8]
                    //      MOD1[7] DO4[6] DO3[5] DO2[4]
                    //      DO1[3] DO0[2] MO1[1] MO0[0]
                    PacketMemberSizes = {2, 2, 2, 2, 8}
                }
                ErrorCheck = {
                    Type = uint32
                    NumberOfElements = 1
                }
            }
        }

        +DANWriterT3 = {
            Class = DAN::DANSource
            NumberOfBuffers = 300
            CPUMask = 0x00100000
            DanBufferMultiplier = 8
            StackSize = 10000000
            NumberOfPreTriggers = 0
            NumberOfPostTriggers = 0
            StoreOnTrigger = 1
            ICProgName = MARTeAppRun 
            Signals = {
                DANWriterT3_Trigger = {
                    Type = uint8
                }
                DANWriterT3_TimeSamples = {
                    Type = uint64
                    TimeSignal = 1
                    AbsoluteTime = 1
                }
                DANWriterT3_Time = {
                    Type = uint64
                    NodeName = "EC-GN-P5C:R_T3_Time"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_AO_0_VALUE = {
                    Type = uint16
                    NodeName = "EC-GN-P5C:R_T3_DBG_AO_0"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_AO_1_VALUE = {
                    Type = uint16
                    NodeName = "EC-GN-P5C:R_T3_DBG_AO_1"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_AO_2_VALUE = {
                    Type = uint16
                    NodeName = "EC-GN-P5C:R_T3_DBG_AO_2"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_MO_0_VALUE = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T3_DBG_MO_0"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_MO_1_VALUE = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T3_DBG_MO_1"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_DO_0_VALUE = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T3_DBG_DO_0"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_DO_1_VALUE = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T3_DBG_DO_1"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_DO_2_VALUE = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T3_DBG_DO_2"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_DO_3_VALUE = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T3_DBG_DO_3"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_DO_4_VALUE = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T3_DBG_DO_4"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_MOD1_VALUE = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T3_DBG_MOD1"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_MOD2_VALUE = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T3_DBG_MOD2"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_FS1_VALUE = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T3_DBG_FS1"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_FS2_VALUE = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T3_DBG_FS2"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_DBG_PWON_VALUE = {
                    Type = uint8
                    NodeName = "EC-GN-P5C:R_T3_DBG_PWON"
                    Period = 500.0e-9
                    NumberOfElements = 1000
                    NumberOfDimensions = 1
                }
                DANWriterT3_ERRORCHECK = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T3_ERRORCHECK"
                    Period = 500.0e-6
                }
                DANWriterT3_PlcCfg_CycleTime = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T3_PlcCfg_CT"
                    Period = 500.0e-6
                }
                DANWriterT3_TestRun_CycleTime = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T3_TestRun_CT"
                    Period = 500.0e-6
                }
                DANWriterT3_TestPost_CycleTime = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T3_TestPost_CT"
                    Period = 500.0e-6
                }
                DANWriterT3_FirstGAM_ReadTime = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T3_FirstGAM_RT"
                    Period = 500.0e-6
                }
                DANWriterT3_LastGAM_ExecTime = {
                    Type = uint32
                    NodeName = "EC-GN-P5C:R_T3_LastGAM_ET"
                    Period = 500.0e-6
                }
            }
        }
        +EpicsOutput_T3 = {
            Class = EPICSCA::EPICSCAOutput
            CPUs = 0xFF
            NumberOfBuffers = 50
            Signals = {
                InitTime_L = {
                    PVName = EC-GN-P5C:R_T3_ONLINE_T_L
                    Type = uint32
                }
                InitTime_H = {
                    PVName = EC-GN-P5C:R_T3_ONLINE_T_H
                    Type = uint32
                }
                FinalTime_L = {
                    PVName = EC-GN-P5C:R_T3_OFFLINE_T_L
                    Type = uint32
                }
                FinalTime_H = {
                    PVName = EC-GN-P5C:R_T3_OFFLINE_T_H
                    Type = uint32
                }
            }
        }            
        // ------------ T3 END ------------ //
    }
    +States = {
        Class = ReferenceContainer
        +PreCfg = {
            Class = RealTimeState
            +Threads = {
                Class = ReferenceContainer
                +Thread1Cfg = {
                    Class = RealTimeThread
                    CPUs = 0x00000100
                    Functions = {
                        // TIMER
                        Timer, CurrentTime_T1, TimeConverter,
                        // RX PATH
                        MXIRead, MXIModuleFullFlagSplitter, MXIMasterTime, PlcPacketRx,
                        // CONST GAM
                        AppStateMachineState, DANWriterWriteEnable, MXISupervisorVariables, MXIBaseConfigurationVariables,
                        MXIDsFifoAcqEnVariables, PlcPacketTxVariables, StateMachineTasksDelay,
                        AcquisitionStatusDaq, AcquisitionStatusDbg,
                        // FLOW CTRL
                        MXIConfigurationSupervisor, MXIBaseConfiguration,
                        MXIAcquisitionEnable, MXITripletConfiguration, PlcConfigurationSupervisor,
                        // TX PATH
                        MXIWriteRst, MXIWriteHlOpt, MXIWriteEn, MXIWriteDbg,
                        MXIWriteDsFifoAcqEn, MXIWriteDsFifoConfig, PlcPacketTx,
                        // MON/STATE CTRL
                        AppMonitor, EventMessageBypassPreCfg, AcquisitionStatusMonitor, /*AcquisitionStatusMessages,
                        CycleCounterT1, TestPostTasksDelay, TestPostGotoTestDone, TestDoneCallTasks,*/ EventMessages,
                        // STORAGE
                        StoreStartPulseTime_T1,
                        StoreStopPulseTime_T1,
                        DANWriterWriteData
                    }
                }
            }
        }
        +MxiCfg = {
            Class = RealTimeState
            +Threads = {
                Class = ReferenceContainer
                +Thread1Cfg = {
                    Class = RealTimeThread
                    CPUs = 0x00000100
                    Functions = {
                        // TIMER
                        Timer, CurrentTime_T1, TimeConverter,
                        // RX PATH
                        MXIRead, MXIModuleFullFlagSplitter, MXIMasterTime, PlcPacketRx,
                        // CONST GAM
                        AppStateMachineState, DANWriterWriteEnable, MXISupervisorVariables, MXIBaseConfigurationVariables,
                        MXIDsFifoAcqEnVariables, PlcPacketTxVariables, StateMachineTasksDelay,
                        AcquisitionStatusDaq, AcquisitionStatusDbg,
                        // FLOW CTRL
                        MXIConfigurationSupervisor, MXIBaseConfiguration,
                        MXIAcquisitionEnable, MXITripletConfiguration, PlcConfigurationSupervisor,
                        // TX PATH
                        MXIWriteRst, MXIWriteHlOpt, MXIWriteEn, MXIWriteDbg,
                        MXIWriteDsFifoAcqEn, MXIWriteDsFifoConfig, PlcPacketTx,
                        // MON/STATE CTRL
                        AppMonitor, /*EventMessageBypassPreCfg,*/ AcquisitionStatusMonitor, /*AcquisitionStatusMessages,
                        CycleCounterT1, TestPostTasksDelay, TestPostGotoTestDone, TestDoneCallTasks,*/ EventMessages,
                        // STORAGE
                        StoreStartPulseTime_T1,
                        StoreStopPulseTime_T1,
                        DANWriterWriteData
                    }
                }
            }
        }
        +PlcCfg = {
            Class = RealTimeState
            +Threads = {
                Class = ReferenceContainer
                +Thread1Cfg = {
                    Class = RealTimeThread
                    CPUs = 0x00000100
                    Functions = {
                        // TIMER
                        Timer, CurrentTime_T1, TimeConverter,
                        // RX PATH
                        MXIRead, MXIModuleFullFlagSplitter, MXIMasterTime, PlcPacketRx,
                        // CONST GAM
                        AppStateMachineState, DANWriterWriteEnable, MXISupervisorVariables, MXIBaseConfigurationVariables,
                        MXIDsFifoAcqEnVariables, PlcPacketTxVariables, StateMachineTasksDelay,
                        AcquisitionStatusDaq, AcquisitionStatusDbg,
                        // FLOW CTRL
                        MXIConfigurationSupervisor, MXIBaseConfiguration,
                        MXIAcquisitionEnable, MXITripletConfiguration, PlcConfigurationSupervisor,
                        // TX PATH
                        MXIWriteRst, MXIWriteHlOpt, MXIWriteEn, MXIWriteDbg,
                        MXIWriteDsFifoAcqEn, MXIWriteDsFifoConfig, PlcPacketTx,
                        // MON/STATE CTRL
                        AppMonitor, /*EventMessageBypassPreCfg,*/ AcquisitionStatusMonitor, /*AcquisitionStatusMessages,
                        CycleCounterT1, TestPostTasksDelay, TestPostGotoTestDone, TestDoneCallTasks,*/ EventMessages,
                        // STORAGE
                        StoreStartPulseTime_T1,
                        StoreStopPulseTime_T1,
                        DANWriterWriteData
                    }
                }
                +Thread2Daq = {
                    Class = RealTimeThread
                    CPUs = 0x00000200
                    Functions = {
                        // RX PATH
                        MxiDataUsFifoDataT2, DigitalInputSplitterT2, TimeConversionT2, TimeConversionT2_Abs, MXIMasterTimeT2,
                        // CONST GAM
                        DANWriterWriteDataWindowLimitsT2,
                        // FLOW CTRL
                        DANWriterWriteDataWindowT2,
                        // MON/STATE CTRL
                        AppMonitorT2, ExecutionMonitorT2,
                        // STORAGE
                        StoreStartPulseTime_T2,
                        StoreStopPulseTime_T2,
                        DANWriterWriteDataT2, FileWriterBufferDataT2
                    }
                }
                +Thread3Dbg = {
                    Class = RealTimeThread
                    CPUs = 0x00000400
                    Functions = {
                        // RX PATH
                        MxiDataUsFifoDataT3, DigitalInputSplitterT3, TimeConversionT3, TimeConversionT3_Abs, MXIMasterTimeT3,
                        // CONST GAM
                        DANWriterWriteDataWindowLimitsT3,
                        // FLOW CTRL
                        DANWriterWriteDataWindowT3,
                        // TX PATH
                        // NOOP,
                        // MON/STATE CTR
                        AppMonitorT3, ExecutionMonitorT3,
                        // STORAGE
                        StoreStartPulseTime_T3,
                        StoreStopPulseTime_T3,
                        DANWriterWriteDataT3
                    }
                }
            }
        }
        +TestRun = {
            Class = RealTimeState
            +Threads = {
                Class = ReferenceContainer
                +Thread1Cfg = {
                    Class = RealTimeThread
                    CPUs = 0x00000100
                    Functions = {
                        // TIMER
                        Timer, CurrentTime_T1, TimeConverter,
                        // RX PATH
                        MXIRead, MXIModuleFullFlagSplitter, MXIMasterTime, PlcPacketRx,
                        // CONST GAM
                        AppStateMachineState, DANWriterWriteEnable, MXISupervisorVariables, MXIBaseConfigurationVariables,
                        MXIDsFifoAcqEnVariables, PlcPacketTxVariables, StateMachineTasksDelay,
                        AcquisitionStatusDaq, AcquisitionStatusDbg,
                        // FLOW CTRL
                        MXIConfigurationSupervisor, MXIBaseConfiguration,
                        MXIAcquisitionEnable, MXITripletConfiguration, PlcConfigurationSupervisor,
                        // TX PATH
                        MXIWriteRst, MXIWriteHlOpt, MXIWriteEn, MXIWriteDbg,
                        MXIWriteDsFifoAcqEn, MXIWriteDsFifoConfig, PlcPacketTx,
                        // MON/STATE CTRL
                        AppMonitor, /*EventMessageBypassPreCfg,*/ AcquisitionStatusMonitor, AcquisitionStatusMessages,
                        /*CycleCounterT1, TestPostTasksDelay, TestPostGotoTestDone, TestDoneCallTasks,*/ EventMessages,
                        // STORAGE
                        StoreStartPulseTime_T1,
                        StoreStopPulseTime_T1,
                        DANWriterWriteData
                    }
                }
                +Thread2Daq = {
                    Class = RealTimeThread
                    CPUs = 0x00000200
                    Functions = {
                        // RX PATH
                        MxiDataUsFifoDataT2, DigitalInputSplitterT2, TimeConversionT2, TimeConversionT2_Abs, MXIMasterTimeT2,
                        // CONST GAM
                        DANWriterWriteDataWindowLimitsT2,
                        // FLOW CTRL
                        DANWriterWriteDataWindowT2,
                        // MON/STATE CTRL
                        AppMonitorT2, ExecutionMonitorT2,
                        // STORAGE
                        StoreStartPulseTime_T2,
                        StoreStopPulseTime_T2,
                        DANWriterWriteDataT2, FileWriterBufferDataT2
                    }
                }
                +Thread3Dbg = {
                    Class = RealTimeThread
                    CPUs = 0x00000400
                    Functions = {
                        // RX PATH
                        MxiDataUsFifoDataT3, DigitalInputSplitterT3, TimeConversionT3, TimeConversionT3_Abs, MXIMasterTimeT3,
                        // CONST GAM
                        DANWriterWriteDataWindowLimitsT3,
                        // FLOW CTRL
                        DANWriterWriteDataWindowT3,
                        // TX PATH
                        // NOOP,
                        // MON/STATE CTR
                        AppMonitorT3, ExecutionMonitorT3,
                        // STORAGE
                        StoreStartPulseTime_T3,
                        StoreStopPulseTime_T3,
                        DANWriterWriteDataT3
                    }
                }
            }
        }
        +TestPost = {
            Class = RealTimeState
            +Threads = {
                Class = ReferenceContainer
                +Thread1Cfg = {
                    Class = RealTimeThread
                    CPUs = 0x00000100
                    Functions = {
                        // TIMER
                        Timer, CurrentTime_T1, TimeConverter,
                        // RX PATH
                        MXIRead, MXIModuleFullFlagSplitter, MXIMasterTime, PlcPacketRx,
                        // CONST GAM
                        AppStateMachineState, DANWriterWriteEnable, MXISupervisorVariables, MXIBaseConfigurationVariables,
                        MXIDsFifoAcqEnVariables, PlcPacketTxVariables, StateMachineTasksDelay,
                        AcquisitionStatusDaq, AcquisitionStatusDbg,
                        // FLOW CTRL
                        MXIConfigurationSupervisor, MXIBaseConfiguration,
                        MXIAcquisitionEnable, MXITripletConfiguration, PlcConfigurationSupervisor,
                        // TX PATH
                        MXIWriteRst, MXIWriteHlOpt, MXIWriteEn, MXIWriteDbg,
                        MXIWriteDsFifoAcqEn, MXIWriteDsFifoConfig, PlcPacketTx,
                        // MON/STATE CTRL
                        AppMonitor, /*EventMessageBypassPreCfg,*/ AcquisitionStatusMonitor, /*AcquisitionStatusMessages,*/
                        CycleCounterT1, TestPostTasksDelay, TestPostGotoTestDone, /*TestDoneCallTasks,*/ EventMessages,
                        // STORAGE
                        StoreStartPulseTime_T1,
                        StoreStopPulseTime_T1,                        
                        DANWriterWriteData
                    }
                }
            }
        }
        +TestDone = {
            Class = RealTimeState
            +Threads = {
                Class = ReferenceContainer
                +Thread1Cfg = {
                    Class = RealTimeThread
                    CPUs = 0x00000100
                    Functions = {
                        // TIMER
                        Timer, CurrentTime_T1, TimeConverter,
                        // RX PATH
                        MXIRead, MXIModuleFullFlagSplitter, MXIMasterTime, PlcPacketRx,
                        // CONST GAM
                        AppStateMachineState, DANWriterWriteEnable, MXISupervisorVariables, MXIBaseConfigurationVariables,
                        MXIDsFifoAcqEnVariables, PlcPacketTxVariables, StateMachineTasksDelay,
                        AcquisitionStatusDaq, AcquisitionStatusDbg,
                        // FLOW CTRL
                        MXIConfigurationSupervisor, MXIBaseConfiguration,
                        MXIAcquisitionEnable, MXITripletConfiguration, PlcConfigurationSupervisor,
                        // TX PATH
                        MXIWriteRst, MXIWriteHlOpt, MXIWriteEn, MXIWriteDbg,
                        MXIWriteDsFifoAcqEn, MXIWriteDsFifoConfig, PlcPacketTx,
                        // MON/STATE CTRL
                        AppMonitor, /*EventMessageBypassPreCfg,*/ AcquisitionStatusMonitor, /*AcquisitionStatusMessages,*/
                        CycleCounterT1, TestPostTasksDelay, /*TestPostGotoTestDone,*/ TestDoneCallTasks, EventMessages,
                        // STORAGE
                        StoreStartPulseTime_T1,
                        StoreStopPulseTime_T1,
                        DANWriterWriteData
                    }
                }
            }
        }
        +CfgError = {
            Class = RealTimeState
            +Threads = {
                Class = ReferenceContainer
                +Thread1Cfg = {
                    Class = RealTimeThread
                    CPUs = 0x00000100
                    Functions = {
                        // TIMER
                        Timer, CurrentTime_T1, TimeConverter,
                        // RX PATH
                        MXIRead, MXIModuleFullFlagSplitter, MXIMasterTime, PlcPacketRx,
                        // CONST GAM
                        AppStateMachineState, DANWriterWriteEnable, MXISupervisorVariables, MXIBaseConfigurationVariables,
                        MXIDsFifoAcqEnVariables, PlcPacketTxVariables, StateMachineTasksDelay,
                        AcquisitionStatusDaq, AcquisitionStatusDbg,
                        // FLOW CTRL
                        MXIConfigurationSupervisor, MXIBaseConfiguration,
                        MXIAcquisitionEnable, MXITripletConfiguration, PlcConfigurationSupervisor,
                        // TX PATH
                        MXIWriteRst, MXIWriteHlOpt, MXIWriteEn, MXIWriteDbg,
                        MXIWriteDsFifoAcqEn, MXIWriteDsFifoConfig, PlcPacketTx,
                        // MON/STATE CTRL
                        AppMonitor, /*EventMessageBypassPreCfg,*/ AcquisitionStatusMonitor, /*AcquisitionStatusMessages,
                        CycleCounterT1, TestPostTasksDelay, TestPostGotoTestDone, TestDoneCallTasks,*/ EventMessages,
                        // STORAGE
                        StoreStartPulseTime_T1,
                        StoreStopPulseTime_T1,
                        DANWriterWriteData
                    }
                }
            }
        }
        +Error = {
            Class = RealTimeState
            +Threads = {
                Class = ReferenceContainer
                +Thread1Cfg = {
                    Class = RealTimeThread
                    CPUs = 0x00000100
                    Functions = {
                        // TIMER
                        Timer, CurrentTime_T1, TimeConverter,
                        // RX PATH
                        MXIRead, MXIModuleFullFlagSplitter, MXIMasterTime, PlcPacketRx,
                        // CONST GAM
                        AppStateMachineState, DANWriterWriteEnable, MXISupervisorVariables, MXIBaseConfigurationVariables,
                        MXIDsFifoAcqEnVariables, PlcPacketTxVariables, StateMachineTasksDelay,
                        AcquisitionStatusDaq, AcquisitionStatusDbg,
                        // FLOW CTRL
                        MXIConfigurationSupervisor, MXIBaseConfiguration,
                        MXIAcquisitionEnable, MXITripletConfiguration, PlcConfigurationSupervisor,
                        // TX PATH
                        MXIWriteRst, MXIWriteHlOpt, MXIWriteEn, MXIWriteDbg,
                        MXIWriteDsFifoAcqEn, MXIWriteDsFifoConfig, PlcPacketTx,
                        // MON/STATE CTRL
                        AppMonitor, /*EventMessageBypassPreCfg,*/ AcquisitionStatusMonitor, /*AcquisitionStatusMessages,
                        CycleCounterT1, TestPostTasksDelay, TestPostGotoTestDone, TestDoneCallTasks,*/ EventMessages,
                        // STORAGE
                        StoreStartPulseTime_T1,
                        StoreStopPulseTime_T1,
                        DANWriterWriteData
                    }
                }
            }
        }
    }
    +Scheduler = {
        Class = GAMScheduler
        TimingDataSource = Timings
    }
}
