+EPICSCAInterface= { Class = EPICS::EPICSCAClient StackSize = 1048576 CPUs = 0x1 AutoStart = 0 +PV_STATUS = { Class = EPICS::EPICSPV PVName = "MARTE2-DEMO-APP:STATUS" PVType = int32 } +PV_COMMAND = { Class = EPICS::EPICSPV PVName = "MARTE2-DEMO-APP:COMMAND" PVType = uint32 Event = { Destination = StateMachine PVValue = Function FunctionMap = {{"2", "GOTOPULSING"}, {"1", "GOTOWAITING_FOR_PRE"}, {"0", "GOTOIDLE"}} } } } +WebRoot = { Class = HttpObjectBrowser Root = "." +ObjectBrowse = { Class = HttpObjectBrowser Root = "/" } +ResourcesHtml = { Class = HttpDirectoryResource BaseDir = "../../MARTe2/MARTe2/Resources/HTTP/" } +HttpMessageInterface = { Class = HttpMessageInterface +GOTOIDLE = { Class = Message Destination = StateMachine Function = GOTOIDLE Mode = ExpectsReply } +GOTOWAITING_FOR_PRE = { Class = Message Destination = StateMachine Function = GOTOWAITING_FOR_PRE Mode = ExpectsReply } +GOTOPULSING = { Class = Message Destination = StateMachine Function = GOTOPULSING Mode = ExpectsReply } +GOTOERR = { Class = Message Destination = StateMachineError Function = GOTOERR Mode = ExpectsReply } } } +WebServer = { Class = HttpService Port = 8084 WebRoot = WebRoot Timeout = 0 ListenMaxConnections = 255 AcceptTimeout = 1000 MaxNumberOfThreads = 8 MinNumberOfThreads = 1 } +StateMachine = { Class = StateMachine +INITIAL = { Class = ReferenceContainer +START = { Class = StateMachineEvent NextState = "IDLE" NextStateError = "IDLE" Timeout = 0 +StartHttpServer = { Class = Message Destination = "WebServer" Function = "Start" Mode = ExpectsReply } +StartEPICSCAInterface = { Class = Message Destination = "EPICSCAInterface" Mode = ExpectsReply Function = "Start" } +OpenTreeMsg = { Class = Message Destination = "MdsLoopApp.Data.MDSWriter" Function = OpenTree Mode = ExpectsReply +Parameters = { Class = ConfigurationDatabase param1 = 1 } } +ChangeToStateIdleMsg = { Class = Message Destination = MdsLoopApp Mode = ExpectsReply Function = PrepareNextState +Parameters = { Class = ConfigurationDatabase param1 = Idle } } +StartNextStateExecutionMsg = { Class = Message Destination = MdsLoopApp Function = StartNextStateExecution Mode = ExpectsReply } } } +IDLE = { Class = ReferenceContainer +GOTOWAITING_FOR_PRE = { Class = StateMachineEvent NextState = "WAITING_FOR_PRE" NextStateError = "IDLE" Timeout = 0 +ChangeToRunMsg = { Class = Message Destination = MdsLoopApp Mode = ExpectsReply Function = PrepareNextState +Parameters = { Class = ConfigurationDatabase param1 = Online } } +StopCurrentStateExecutionMsg = { Class = Message Destination = MdsLoopApp Function = StopCurrentStateExecution Mode = ExpectsReply } +StartNextStateExecutionMsg = { Class = Message Destination = MdsLoopApp Function = StartNextStateExecution Mode = ExpectsReply } } } +WAITING_FOR_PRE = { Class = ReferenceContainer +ENTER = { Class = ReferenceContainer +SetStatusPV = { Class = Message Destination = "EPICSCAInterface.PV_STATUS" Function = CAPut Mode = ExpectsReply +Parameters = { Class = ConfigurationDatabase param1 = 1 } } } +GOTOPULSING = { Class = StateMachineEvent NextState = "PULSING" NextStateError = "IDLE" Timeout = 0 +ChangeToRunMsg = { Class = Message Destination = MdsLoopApp Mode = ExpectsReply Function = PrepareNextState +Parameters = { Class = ConfigurationDatabase param1 = Online } } +CalcOffSetsMsg = { Class = "Message" Destination = "MdsLoopApp.Functions.GAMElectricProbes" Function = "CalcOffSets" Mode = "ExpectsReply" } +StopCurrentStateExecutionMsg = { Class = Message Destination = MdsLoopApp Function = StopCurrentStateExecution Mode = ExpectsReply } +StartNextStateExecutionMsg = { Class = Message Destination = MdsLoopApp Function = StartNextStateExecution Mode = ExpectsReply } } } +PULSING = { Class = ReferenceContainer +ENTER = { Class = ReferenceContainer +SetStatusPV = { Class = Message Destination = "EPICSCAInterface.PV_STATUS" Function = CAPut Mode = ExpectsReply +Parameters = { Class = ConfigurationDatabase param1 = 2 } } } +GOTOIDLE = { Class = StateMachineEvent NextState = "IDLE" NextStateError = "IDLE" Timeout = 0 +ChangeToIdleMsg = { Class = Message Destination = MdsLoopApp Mode = ExpectsReply Function = PrepareNextState +Parameters = { Class = ConfigurationDatabase param1 = Idle } } +StopCurrentStateExecutionMsg = { Class = Message Destination = MdsLoopApp Function = StopCurrentStateExecution Mode = ExpectsReply } +StartNextStateExecutionMsg = { Class = Message Destination = MdsLoopApp Function = StartNextStateExecution Mode = ExpectsReply } +SetStatusPV = { Class = Message Destination = "EPICSCAInterface.PV_STATUS" Function = CAPut Mode = ExpectsReply +Parameters = { Class = ConfigurationDatabase param1 = 0 } } } } } $MdsLoopApp = { Class = RealTimeApplication +Functions = { Class = ReferenceContainer +GAMTimer = { Class = IOGAM InputSignals = { Counter = { DataSource = Timer Type = uint32 } Time = { Frequency = 10000 DataSource = Timer Type = uint32 } Idle_Thread1_CycleTime = { DataSource = Timings Alias = "Idle.Thread1_CycleTime" Type = uint32 } Run_Thread1_CycleTime = { DataSource = Timings Alias = "Online.Thread1_CycleTime" Type = uint32 } } OutputSignals = { Counter = { DataSource = DDB1 Type = uint32 } Time = { DataSource = DDB1 Type = uint32 } Idle_Thread1_CycleTime = { DataSource = DDB1 Type = uint32 } Run_Thread1_CycleTime = { DataSource = DDB1 Type = uint32 } } } +GAMWF1 = { Class = WaveformGAM::WaveformSin Amplitude = 10.0 Frequency = 1.0 Phase = 0.0 Offset = 1.1 InputSignals = { Time = { DataSource = "DDB1" Type = uint32 //Supported type uint32 (int32 also valid since time cannot be negative. uint64 && int64 valid types) } } OutputSignals = { Wave = { DataSource = "DDB1" Type = float32 } } } +GAMLangSigs= { Class = IOGAM InputSignals = { Langmuir0 = { DataSource = "DDB1" Type = float32 } Langmuir1 = { DataSource = "DDB1" Type = float32 } Langmuir2 = { DataSource = "DDB1" Type = float32 } Langmuir3 = { DataSource = "DDB1" Type = float32 } } OutputSignals = { LangmuirSigs = { DataSource = "DDB1" Type = float32 NumberOfElements = 4 } } } +GAMElectricProbes = { Class = ElectricProbesGAM Gain = 5 //Compulsory NumberOfSamplesAvg = 4 //Compulsory ResetInEachState = 0//Compulsory. 1–> reset in each state, 0–> reset if the previous state is different from the next state InputSignals = { Time = { DataSource = "DDB1" Type = uint32 } LangmuirSigs = { DataSource = "DDB1" Type = float32 NumberOfElements = 4 } } /* InputSignals = { Langmuir0 = { DataSource = "DDB1" Type = float32 } Langmuir1 = { DataSource = "DDB1" Type = float32 } Langmuir2 = { DataSource = "DDB1" Type = float32 } Langmuir3 = { DataSource = "DDB1" Type = float32 } } */ OutputSignals = { SignalEP_OutR = { DataSource = "DDB1" Type = float32 } SignalEP_OutZ = { DataSource = "DDB1" Type = float32 } } } +GAMConvert2Double = { Class = "ConversionGAM" InputSignals = { Mirnov0 = { DataSource = "DDB1" Type = float32 } Mirnov1 = { DataSource = DDB1 DataSource = "DDB1" Type = float32 } Mirnov2 = { DataSource = "DDB1" Type = float32 } Mirnov3 = { DataSource = "DDB1" Type = float32 } Mirnov4 = { DataSource = "DDB1" Type = float32 } Mirnov5 = { DataSource = "DDB1" Type = float32 } Mirnov6 = { DataSource = "DDB1" Type = uint32 Type = float32 } Mirnov7 = { DataSource = "DDB1" Type = float32 } Mirnov8 = { DataSource = "DDB1" Type = float32 } Mirnov9 = { DataSource = "DDB1" Type = float32 } Mirnov10= { DataSource = "DDB1" Type = float32 } Mirnov11 = { DataSource = "DDB1" Type = float32 } } OutputSignals = { MirnovD0 = { DataSource = "DDB1" Type = float64 } MirnovD1 = { DataSource = DDB1 DataSource = "DDB1" Type = float64 } MirnovD2 = { DataSource = "DDB1" Type = float64 } MirnovD3 = { DataSource = "DDB1" Type = float64 } MirnovD4 = { DataSource = "DDB1" Type = float64 } MirnovD5 = { DataSource = "DDB1" Type = float64 } MirnovD6 = { DataSource = "DDB1" Type = float64 } MirnovD7 = { DataSource = "DDB1" Type = float64 } MirnovD8 = { DataSource = "DDB1" Type = float64 } MirnovD9 = { DataSource = "DDB1" Type = float64 } MirnovD10= { DataSource = "DDB1" Type = float64 } MirnovD11 = { DataSource = "DDB1" Type = float64 } } } +GAMSSM = { Class = SSMGAM StateMatrix = {{1.0 0}{0 1.0}} //Compulsory InputMatrix = {{0 0 0 0}{0 0 0 0}} //Compulsory OutputMatrix = {{0 0}} //Compulsory FeedthroughMatrix = {{1 1 1 1}} //Optional ResetInEachState = 1//Compulsory. 1–> reset in each state, 0–> reset if the previous state is different from the next state SampleFrequency = 0.0001 // Currently optional and not used. InputSignals = { MirnovD0 = { //input of the SS DataSource = "DDB1" Type = float64 //Only supported type. NumberOfElements = 1 NumberOfDimensions = 1 // or 0 Samples = 1 } MirnovD1 = { DataSource = "DDB1" Type = float64 //Only supported type. NumberOfElements = 1 NumberOfDimensions = 1 Samples = 1 } MirnovD2 = { DataSource = "DDB1" Type = float64 //Only supported type. NumberOfElements = 1 NumberOfDimensions = 1 Samples = 1 } MirnovD3 = { DataSource = "DDB1" Type = float64 //Only supported type. NumberOfElements = 1 NumberOfDimensions = 1 Samples = 1 } } OutputSignals = { OutputSignalSSM = { DataSource = "DDB1" Type = float64 } State0 = { Type = float64 DataSource = "DDB1" } State1 = { Type = float64 DataSource = "DDB1" } } } +GAMMDSReader = { Class = IOGAM InputSignals = { MirnovMdsR0 = { DataSource = MDSReader Type = float32 } MirnovMdsR1 = { DataSource = MDSReader Type = float32 } MirnovMdsR2 = { DataSource = MDSReader Type = float32 } MirnovMdsR3 = { DataSource = MDSReader Type = float32 } MirnovMdsR4 = { DataSource = MDSReader Type = float32 } MirnovMdsR5 = { DataSource = MDSReader Type = float32 } MirnovMdsR6 = { DataSource = MDSReader Type = float32 } MirnovMdsR7 = { DataSource = MDSReader Type = float32 } MirnovMdsR8 = { DataSource = MDSReader Type = float32 } MirnovMdsR9 = { DataSource = MDSReader Type = float32 } MirnovMdsR10 = { DataSource = MDSReader Type = float32 } MirnovMdsR11 = { DataSource = MDSReader Type = float32 } LangmuirMdsR0 = { DataSource = MDSReader Type = float32 } LangmuirMdsR1 = { DataSource = MDSReader Type = float32 } LangmuirMdsR2 = { DataSource = MDSReader Type = float32 } LangmuirMdsR3 = { DataSource = MDSReader Type = float32 } Time = { DataSource = MDSReader Type = uint32 } } OutputSignals = { Mirnov0 = { DataSource = "DDB1" Type = float32 } Mirnov1 = { DataSource = DDB1 DataSource = "DDB1" Type = float32 } Mirnov2 = { DataSource = "DDB1" Type = float32 } Mirnov3 = { DataSource = "DDB1" Type = float32 } Mirnov4 = { DataSource = "DDB1" Type = float32 } Mirnov5 = { DataSource = "DDB1" Type = float32 } Mirnov6 = { DataSource = "DDB1" Type = float32 } Mirnov7 = { DataSource = "DDB1" Type = float32 } Mirnov8 = { DataSource = "DDB1" Type = float32 } Mirnov9 = { DataSource = "DDB1" Type = float32 } Mirnov10= { DataSource = "DDB1" Type = float32 } Mirnov11 = { DataSource = "DDB1" Type = float32 } Langmuir0 = { DataSource = "DDB1" Type = float32 } Langmuir1 = { DataSource = "DDB1" Type = float32 } Langmuir2 = { DataSource = "DDB1" Type = float32 } Langmuir3 = { DataSource = "DDB1" Type = float32 } MdsTime = { DataSource = "DDB1" Type = uint32 } } } +GAMMDSWriter = { Class = IOGAM InputSignals = { Mirnov0 = { DataSource = "DDB1" Type = float32 } Langmuir0 = { DataSource = "DDB1" Type = float32 } OutputSignalSSM = { DataSource = "DDB1" Type = float64 } CycleTime = { DataSource = Timings Alias = Idle.Thread1_CycleTime Type = uint32 } } OutputSignals = { OutMdsW0 = { DataSource = MDSWriter Type = float32 } OutMdsW1 = { DataSource = MDSWriter Type = float32 } OutMdsW2 = { DataSource = MDSWriter Type = float64 } CycleTime = { DataSource = MDSWriter Type = uint32 } } } } +Data = { Class = ReferenceContainer DefaultDataSource = DDB1 +DDB1 = { Class = GAMDataSource } +LoggerDataSource = { Class = LoggerDataSource } +Timings = { Class = TimingDataSource } +Timer = { Class = LinuxTimer SleepNature = "Default" ExecutionMode = RealTimeThread Signals = { Counter = { Type = uint32 } Time = { Type = uint32 } } } +MDSReader = { Class = MDSReader TreeName = "isttoksdas" //Compulsory. Name of the MDSplus tree. //TreeName = "rtappwriter" //Compulsory. Name of the MDSplus tree. ShotNumber = 46241//Compulsory. 0 –> last shot number (to use 0 shotid.sys must exist) Frequency = 10000 // in Hz. Is the cycle time of the real time application. Signals = { MirnovMdsR0 = { NodeName = "\TOP.HARDWARE.ATCA1.IOC_0.CHANNEL_0.RAW" // node of the tree node // \TOP.HARDWARE.ATCA1.IOC_0.CHANNEL_0.RAW Type = "float32" // Can be any of the node supported types NumberOfElements = 1 DataManagement = 0 //could be 0, 1 or 2 HoleManagement = 1 //could be 0 or 1 } MirnovMdsR1 = { NodeName = "\TOP.HARDWARE.ATCA1.IOC_0.CHANNEL_1.RAW" // node of the tree node Type = "float32" // Can be any of the node supported types NumberOfElements = 1 DataManagement = 0 //could be 0, 1 or 2 HoleManagement = 1 //could be 0 or 1 } MirnovMdsR2 = { NodeName = "\TOP.HARDWARE.ATCA1.IOC_0.CHANNEL_2.RAW" // node of the tree node Type = "float32" // Can be any of the node supported types NumberOfElements = 1 DataManagement = 0 //could be 0, 1 or 2 HoleManagement = 1 //could be 0 or 1 } MirnovMdsR3 = { NodeName = "\TOP.HARDWARE.ATCA1.IOC_0.CHANNEL_3.RAW" // node of the tree node Type = "float32" // Can be any of the node supported types NumberOfElements = 1 DataManagement = 0 //could be 0, 1 or 2 HoleManagement = 1 //could be 0 or 1 } MirnovMdsR4 = { NodeName = "\TOP.HARDWARE.ATCA1.IOC_0.CHANNEL_4.RAW" // node of the tree node Type = "float32" // Can be any of the node supported types NumberOfElements = 1 DataManagement = 0 //could be 0, 1 or 2 HoleManagement = 1 //could be 0 or 1 } MirnovMdsR5 = { NodeName = "\TOP.HARDWARE.ATCA1.IOC_0.CHANNEL_5.RAW" // node of the tree node Type = "float32" // Can be any of the node supported types NumberOfElements = 1 DataManagement = 0 //could be 0, 1 or 2 HoleManagement = 1 //could be 0 or 1 } MirnovMdsR6 = { NodeName = "\TOP.HARDWARE.ATCA1.IOC_0.CHANNEL_6.RAW" // node of the tree node Type = "float32" // Can be any of the node supported types NumberOfElements = 1 DataManagement = 0 //could be 0, 1 or 2 HoleManagement = 1 //could be 0 or 1 } MirnovMdsR7 = { NodeName = "\TOP.HARDWARE.ATCA1.IOC_0.CHANNEL_7.RAW" // node of the tree node Type = "float32" // Can be any of the node supported types NumberOfElements = 1 DataManagement = 0 //could be 0, 1 or 2 HoleManagement = 1 //could be 0 or 1 } MirnovMdsR8 = { NodeName = "\TOP.HARDWARE.ATCA1.IOC_0.CHANNEL_8.RAW" // node of the tree node Type = "float32" // Can be any of the node supported types NumberOfElements = 1 DataManagement = 0 //could be 0, 1 or 2 HoleManagement = 1 //could be 0 or 1 } MirnovMdsR9 = { NodeName = "\TOP.HARDWARE.ATCA1.IOC_0.CHANNEL_9.RAW" // node of the tree node Type = "float32" // Can be any of the node supported types NumberOfElements = 1 DataManagement = 0 //could be 0, 1 or 2 HoleManagement = 1 //could be 0 or 1 } MirnovMdsR10 = { NodeName = "\TOP.HARDWARE.ATCA1.IOC_0.CHANNEL_10.RAW" // node of the tree node Type = "float32" // Can be any of the node supported types NumberOfElements = 1 DataManagement = 0 //could be 0, 1 or 2 HoleManagement = 1 //could be 0 or 1 } MirnovMdsR11 = { NodeName = "\TOP.HARDWARE.ATCA1.IOC_0.CHANNEL_11.RAW" // node of the tree node Type = "float32" // Can be any of the node supported types NumberOfElements = 1 DataManagement = 0 //could be 0, 1 or 2 HoleManagement = 1 //could be 0 or 1 } LangmuirMdsR0 = { NodeName = "\TOP.HARDWARE.ATCA1.IOC_1.CHANNEL_0.RAW" // node of the tree node Type = "float32" // Can be any of the node supported types NumberOfElements = 1 DataManagement = 0 //could be 0, 1 or 2 HoleManagement = 1 //could be 0 or 1 } LangmuirMdsR1 = { NodeName = "\TOP.HARDWARE.ATCA1.IOC_1.CHANNEL_1.RAW" // node of the tree node Type = "float32" // Can be any of the node supported types NumberOfElements = 1 DataManagement = 0 //could be 0, 1 or 2 HoleManagement = 1 //could be 0 or 1 } LangmuirMdsR2 = { NodeName = "\TOP.HARDWARE.ATCA1.IOC_1.CHANNEL_2.RAW" // node of the tree node Type = "float32" // Can be any of the node supported types NumberOfElements = 1 DataManagement = 0 //could be 0, 1 or 2 HoleManagement = 1 //could be 0 or 1 } LangmuirMdsR3 = { NodeName = "\TOP.HARDWARE.ATCA1.IOC_1.CHANNEL_3.RAW" // node of the tree node Type = "float32" // Can be any of the node supported types NumberOfElements = 1 DataManagement = 0 //could be 0, 0 –> MDSReader takes the data from the tree as it is (raw). 1 or 2 HoleManagement = 1 //could be 0 or 1, 1-> fills the absence of data with the last value. } Time = { //Compulsory Type = "uint32" //can be any of the supported types NumberOfElements = 1 //must be always one. } } } +MDSWriter = { Class = MDSWriter NumberOfBuffers = 10 //Compulsory. Number of buffers in the circular buffer defined above. Each buffer is capable of holding a copy of all the DataSourceI signals. CPUMask = 2 //Compulsory. Affinity assigned to the threads responsible for asynchronously flush data into the MDSplus database. StackSize = 10000000 //Compulsory. Stack size of the thread above. TreeName = "isttokoutput" //Compulsory. Name of the MDSplus tree. PulseNumber = 1 //Optional. If -1 a new pulse will be created and the MDSplus pulse number incremented. StoreOnTrigger = 0 //Compulsory. If 0 all the data in the circular buffer is continuously stored. If 1 data is stored when the Trigger signal is 1 (see below). EventName = "updatejScope" //Compulsory. Event sent to jScope when TimeRefresh seconds have elapsed. TimeRefresh = 5 //Compulsory. An event with the name set in the property EventName is sent to jScope when TimeRefresh seconds have elapsed. Signals = { OutMdsW0 = { //As many as required. NodeName = "\TOP.OUT.OUT0" // node of the tree node Period = 0.0001 //Compulsory. Period between signal samples. AutomaticSegmentation = 0 MakeSegmentAfterNWrites = 100 } OutMdsW1 = { //As many as required. NodeName = "\TOP.OUT.OUT1" Period = 0.0001 AutomaticSegmentation = 1 // MakeSegmentAfterNWrites = 100 } OutMdsW2 = { NodeName = "\TOP.OUT.OUT2" Period = 0.0001 AutomaticSegmentation = 0 MakeSegmentAfterNWrites = 100 } CycleTime = { //As many as required. NodeName = "\TOP.OUT.Cycle_Time" // node of the tree node Period = 0.0001 AutomaticSegmentation = 0 MakeSegmentAfterNWrites = 100 } } } } +States = { Class = ReferenceContainer +Idle = { Class = RealTimeState +Threads = { Class = ReferenceContainer +Thread1 = { Class = RealTimeThread CPUs = 0x1 Functions = {GAMTimer GAMWF1} } } } +Online = { Class = RealTimeState +Threads = { Class = ReferenceContainer +Thread1 = { Class = RealTimeThread CPUs = 0x1 Functions = {GAMTimer GAMWF1 GAMMDSReader GAMConvert2Double GAMLangSigs GAMElectricProbes GAMSSM GAMMDSWriter} } } } } +Scheduler = { Class = GAMScheduler TimingDataSource = Timings } } // vim: syntax=cpp ts=4 sw=4 sts=4 sr et