Added MDS Import files

Signed-off-by: Bernardo Carvalho <bernardo.carvalho@tecnico.ulisboa.pt>
This commit is contained in:
2024-11-14 23:24:59 +00:00
parent 870b4dde23
commit 762316bbc8
6 changed files with 1418 additions and 0 deletions

View File

@@ -0,0 +1,854 @@
+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 = Run
}
}
+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
+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 = "Run.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
}
}
}
+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 = 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 = {
OutputSignal1 = {
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
}
OutputSignal1 = {
DataSource = "DDB1"
Type = float64
}
CycleTime = {
DataSource = Timings
Alias = Idle.Thread1_CycleTime
Type = uint32
}
}
OutputSignals = {
OutMdsW0 = {
DataSource = MDSWriter
Type = float32
}
OutMdsW1 = {
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, 1 or 2
HoleManagement = 1 //could be 0 or 1
}
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" // node of the tree node
Period = 0.0001 //Compulsory. Period between signal samples.
AutomaticSegmentation = 0
MakeSegmentAfterNWrites = 100
}
CycleTime = { //As many as required.
NodeName = "\TOP.OUT.Cycle_Time" // node of the tree node
//NodeName = "Cycle_Time" //Compulsory. MDSplus node name
Period = 0.0001 //Compulsory. Period between signal samples.
AutomaticSegmentation = 0
MakeSegmentAfterNWrites = 100
}
}
}
}
+States = {
Class = ReferenceContainer
+Idle = {
Class = RealTimeState
+Threads = {
Class = ReferenceContainer
+Thread1 = {
Class = RealTimeThread
CPUs = 0x1
Functions = {GAMTimer GAMWF1}
}
}
}
+Run = {
Class = RealTimeState
+Threads = {
Class = ReferenceContainer
+Thread1 = {
Class = RealTimeThread
CPUs = 0x1
Functions = {GAMTimer GAMWF1 GAMMDSReader GAMConvert2Double GAMSSM GAMMDSWriter}
}
}
}
}
+Scheduler = {
Class = GAMScheduler
TimingDataSource = Timings
}
}
// vim: syntax=cpp ts=4 sw=4 sts=4 sr et

View File

@@ -0,0 +1,444 @@
+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 = {{"1", "GOTORUN"}, {"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
}
+GOTORUN = {
Class = Message
Destination = StateMachine
Function = GOTORUN
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
+GOTORUN = {
Class = StateMachineEvent
NextState = "RUN"
NextStateError = "IDLE"
Timeout = 0
+ChangeToRunMsg = {
Class = Message
Destination = MdsLoopApp
Mode = ExpectsReply
Function = PrepareNextState
+Parameters = {
Class = ConfigurationDatabase
param1 = Run
}
}
+StopCurrentStateExecutionMsg = {
Class = Message
Destination = MdsLoopApp
Function = StopCurrentStateExecution
Mode = ExpectsReply
}
+StartNextStateExecutionMsg = {
Class = Message
Destination = MdsLoopApp
Function = StartNextStateExecution
Mode = ExpectsReply
}
}
}
+RUN = {
Class = ReferenceContainer
+ENTER = {
Class = ReferenceContainer
+SetStatusPV = {
Class = Message
Destination = "EPICSCAInterface.PV_STATUS"
Function = CAPut
Mode = ExpectsReply
+Parameters = {
Class = ConfigurationDatabase
param1 = 1
}
}
}
+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 = "Run.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
}
}
}
+GAMMDSReader = {
Class = IOGAM
InputSignals = {
MirnovMdsR0 = {
DataSource = MDSReader
Type = float32
}
MirnovMdsR1 = {
DataSource = MDSReader
Type = float32
}
Time = {
DataSource = MDSReader
Type = uint32
}
}
OutputSignals = {
Mirnov0 = {
DataSource = "DDB1"
Type = float32
}
Mirnov1 = {
DataSource = "DDB1"
Type = float32
}
MdsTime = {
DataSource = "DDB1"
Type = uint32
}
}
}
+GAMMDSWriter = {
Class = IOGAM
InputSignals = {
Mirnov0 = {
DataSource = "DDB1"
Type = float32
}
Mirnov1 = {
DataSource = "DDB1"
Type = float32
}
CycleTime = {
DataSource = Timings
Alias = Idle.Thread1_CycleTime
Type = uint32
}
}
OutputSignals = {
OutMdsW0 = {
DataSource = MDSWriter
Type = float32
}
OutMdsW1 = {
DataSource = MDSWriter
Type = float32
}
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.IOC1.CHANNELS.INPUT_00.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
}
MirnovMdsR1 = {
NodeName = "\TOP.HARDWARE.ATCA1.IOC1.CHANNELS.INPUT_01.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
}
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" // node of the tree node
Period = 0.0001 //Compulsory. Period between signal samples.
AutomaticSegmentation = 0
MakeSegmentAfterNWrites = 100
}
CycleTime = { //As many as required.
NodeName = "\TOP.OUT.Cycle_Time" // node of the tree node
//NodeName = "Cycle_Time" //Compulsory. MDSplus node name
Period = 0.0001 //Compulsory. Period between signal samples.
AutomaticSegmentation = 0
MakeSegmentAfterNWrites = 100
}
}
}
}
+States = {
Class = ReferenceContainer
+Idle = {
Class = RealTimeState
+Threads = {
Class = ReferenceContainer
+Thread1 = {
Class = RealTimeThread
CPUs = 0x1
Functions = {GAMTimer GAMWF1 }
}
}
}
+Run = {
Class = RealTimeState
+Threads = {
Class = ReferenceContainer
+Thread1 = {
Class = RealTimeThread
CPUs = 0x1
Functions = {GAMTimer GAMWF1 GAMMDSReader GAMMDSWriter}
}
}
}
}
+Scheduler = {
Class = GAMScheduler
TimingDataSource = Timings
}
}
// vim: syntax=cpp ts=4 sw=4 sts=4 sr et