Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 345684a

Browse files
Initial version, added AIControlledDBSystem
1 parent 5efdd1f commit 345684a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+3860
-0
lines changed
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
package dbssystem.actuators;
2+
3+
import java.util.Optional;
4+
import dbssystem.common.DBSControl;
5+
import dbssystem.common.DBSSignal;
6+
import sysmlinjava.annotations.Constraint;
7+
import sysmlinjava.annotations.Flow;
8+
import sysmlinjava.annotations.FullPort;
9+
import sysmlinjava.annotations.Value;
10+
import sysmlinjava.blocks.SysMLBlock;
11+
import sysmlinjava.common.SysMLConstraint;
12+
import sysmlinjava.valuetypes.FrequencyHertz;
13+
import sysmlinjava.valuetypes.IInteger;
14+
import sysmlinjava.valuetypes.InternetAddress;
15+
import sysmlinjava.valuetypes.PhaseShiftRadians;
16+
import sysmlinjava.valuetypes.PotentialElectricalVolts;
17+
18+
/**
19+
* DBSActuator is the SysMLinJava model of an actuator for a deep-brain
20+
* stimulation system. It receives control signals and transforms them into low
21+
* power electrical signals to be injected into the patient's brain to
22+
* reduce/control the patient's tremor.
23+
*
24+
* @author ModelerOne
25+
*
26+
*/
27+
public class DBSActuator extends SysMLBlock
28+
{
29+
/**
30+
* Port for ouput of the DBS signal to the patient
31+
*/
32+
@FullPort
33+
public DBSSignalOutPort dbsSignalPort;
34+
/**
35+
* Port for input of the control signals to the acuator
36+
*/
37+
@FullPort
38+
public DBSControlInPort controlPort;
39+
40+
/**
41+
* Value of the control that was last input
42+
*/
43+
@Value
44+
public DBSControl controlIn;
45+
/**
46+
* Value of the standard amplitude to be used for the DBS signal to the patient
47+
*/
48+
@Value
49+
private PotentialElectricalVolts standardAmplitude;
50+
/**
51+
* Value of the UDP port used to receive the controls
52+
*/
53+
@Value
54+
private IInteger controlUDPPort;
55+
/**
56+
* Value of the IP address used to receive the controls
57+
*/
58+
@Value
59+
private InternetAddress controlIPAddress;
60+
61+
/**
62+
* Flow value of the DBS signal currently being injected out into the patient's
63+
* brain.
64+
*/
65+
@Flow
66+
public DBSSignal signalOut;
67+
68+
/**
69+
* Constraint that calculates the DBS signal output from the control input
70+
*/
71+
@Constraint
72+
public SysMLConstraint controlToSignal;
73+
74+
/**
75+
* Constructor
76+
*/
77+
public DBSActuator()
78+
{
79+
super("DBSActuator", 0L);
80+
}
81+
82+
/**
83+
* Event handler for receipt of new DBS control object. The operation stores the
84+
* control information, invokes the constraint to calculate the new DBS signal
85+
* value, and transmits the new signal to the patient's brain.
86+
*
87+
* @param control control data received
88+
*/
89+
public void onDBSControl(DBSControl control)
90+
{
91+
logger.info(control.toString());
92+
controlIn.frequency.value = control.frequency.value;
93+
controlIn.phaseShift.value = control.phaseShift.value;
94+
controlToSignal.apply();
95+
dbsSignalPort.transmit(signalOut);
96+
}
97+
98+
/**
99+
* Starts the actuator, ie. starts the state machine and the control port
100+
*/
101+
@Override
102+
public void start()
103+
{
104+
super.start();
105+
controlPort.start();
106+
}
107+
108+
/**
109+
* Stops the actuator
110+
*/
111+
@Override
112+
public void stop()
113+
{
114+
controlPort.stop();
115+
super.stop();
116+
}
117+
118+
@Override
119+
protected void createStateMachine()
120+
{
121+
stateMachine = Optional.of(new DBSActuatorStateMachine(this));
122+
}
123+
124+
@Override
125+
protected void createValues()
126+
{
127+
controlIn = new DBSControl(new FrequencyHertz(0), new PhaseShiftRadians(0));
128+
standardAmplitude = new PotentialElectricalVolts(20.0e-6);
129+
controlIPAddress = InternetAddress.ofLocalHost();
130+
controlUDPPort = new IInteger(8703);
131+
}
132+
133+
@Override
134+
protected void createFlows()
135+
{
136+
signalOut = new DBSSignal(new FrequencyHertz(0), new PotentialElectricalVolts(0), new PhaseShiftRadians(0));
137+
}
138+
139+
@Override
140+
protected void createFullPorts()
141+
{
142+
dbsSignalPort = new DBSSignalOutPort(this);
143+
controlPort = new DBSControlInPort(this, controlIPAddress.toInetAddress(), controlUDPPort.toInteger());
144+
}
145+
146+
/**
147+
* Creates the actuator's constraint that simply sets the actuator outputs to
148+
* the values provided in the actuator's control.
149+
*/
150+
@Override
151+
protected void createConstraints()
152+
{
153+
controlToSignal = () ->
154+
{
155+
signalOut.frequency.value = controlIn.frequency.value;
156+
signalOut.phaseShift.value = controlIn.phaseShift.value;
157+
signalOut.amplitude.value = standardAmplitude.value;
158+
};
159+
}
160+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package dbssystem.actuators;
2+
3+
import java.util.Optional;
4+
import sysmlinjava.annotations.statemachines.Effect;
5+
import sysmlinjava.annotations.statemachines.EffectActivity;
6+
import sysmlinjava.annotations.statemachines.State;
7+
import sysmlinjava.annotations.statemachines.Transition;
8+
import sysmlinjava.statemachine.FinalTransition;
9+
import sysmlinjava.statemachine.InitialTransition;
10+
import sysmlinjava.statemachine.SysMLEffect;
11+
import sysmlinjava.statemachine.SysMLEffectActivity;
12+
import sysmlinjava.statemachine.SysMLState;
13+
import sysmlinjava.statemachine.SysMLStateMachine;
14+
import sysmlinjava.statemachine.SysMLTransition;
15+
import sysmlinjava.statemachine.SysMLTransitionKind;
16+
17+
/**
18+
* State machine for the DBSActuator. The state machine consists of only two
19+
* states - one to initialize the actuator and one to repeatedly handle receipts of control
20+
* values.
21+
*
22+
* @author ModelerOne
23+
*
24+
*/
25+
public class DBSActuatorStateMachine extends SysMLStateMachine
26+
{
27+
@State
28+
protected SysMLState initializingState;
29+
@State
30+
protected SysMLState operationalState;
31+
32+
@Transition
33+
protected InitialTransition initialToInitializingTransition;
34+
@Transition
35+
protected SysMLTransition initializingToOperationalTransition;
36+
@Transition
37+
protected SysMLTransition operationalOnDBSControlTransition;
38+
@Transition
39+
protected SysMLTransition operationalToFinalTransition;
40+
41+
@EffectActivity
42+
protected SysMLEffectActivity onDBSControlEffectActivity;
43+
44+
@Effect
45+
protected SysMLEffect onDBSControlEffect;
46+
47+
public DBSActuatorStateMachine(DBSActuator contextBlock)
48+
{
49+
super(Optional.of(contextBlock), true, "DBSActuatorStateMachine");
50+
}
51+
52+
@Override
53+
protected void createStates()
54+
{
55+
super.createStates();
56+
initializingState = new SysMLState(contextBlock, "Initializing");
57+
operationalState = new SysMLState(contextBlock, "Operational");
58+
}
59+
60+
@Override
61+
protected void createEffectActivities()
62+
{
63+
onDBSControlEffectActivity = (event, contextBlock) ->
64+
{
65+
DBSControlSignalEvent controlEvent = (DBSControlSignalEvent)event.get();
66+
DBSActuator actuator = (DBSActuator)contextBlock.get();
67+
actuator.onDBSControl(controlEvent.getControl());
68+
};
69+
}
70+
71+
@Override
72+
protected void createEffects()
73+
{
74+
super.createEffects();
75+
onDBSControlEffect = new SysMLEffect(contextBlock, onDBSControlEffectActivity, "onDBSControl");
76+
}
77+
78+
@Override
79+
protected void createTransitions()
80+
{
81+
initialToInitializingTransition = new InitialTransition(contextBlock, initialState, initializingState, "InitialToInitializing");
82+
initializingToOperationalTransition = new SysMLTransition(contextBlock, initializingState, operationalState, "InitializingToOperational");
83+
operationalOnDBSControlTransition = new SysMLTransition(contextBlock, operationalState, operationalState, Optional.of(DBSControlSignalEvent.class), Optional.empty(), Optional.of(onDBSControlEffect), "OperationalOnDBSControl",
84+
SysMLTransitionKind.internal);
85+
operationalToFinalTransition = new FinalTransition(contextBlock, operationalState, finalState, "OperationalToFinal");
86+
}
87+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package dbssystem.actuators;
2+
3+
import java.net.InetAddress;
4+
import java.util.Optional;
5+
import dbssystem.common.DBSControlSignal;
6+
import sysmlinjava.common.SysMLSignal;
7+
import sysmlinjava.events.SysMLSignalEvent;
8+
import sysmlinjava.ports.SysMLFullPort;
9+
10+
/**
11+
* Port to receive control data by the DBS actuator
12+
*
13+
* @author ModelerOne
14+
*
15+
*/
16+
public class DBSControlInPort extends SysMLFullPort
17+
{
18+
/**
19+
* Constructor
20+
*
21+
* @param contextBlock DBSActuator to receive the signals
22+
* @param ipAddress IP address to be used for UDP-based port receptions
23+
* @param udpPort UDP port number to be used for UDP-based port receptions
24+
*/
25+
public DBSControlInPort(DBSActuator contextBlock, InetAddress ipAddress, Integer udpPort)
26+
{
27+
super(contextBlock, Optional.of(contextBlock), ipAddress, udpPort, 0L, "DBSControlInPort");
28+
}
29+
30+
@Override
31+
protected SysMLSignalEvent eventFor(SysMLSignal signal)
32+
{
33+
SysMLSignalEvent result = null;
34+
if (signal instanceof DBSControlSignal control)
35+
result = new DBSControlSignalEvent(control);
36+
return result;
37+
}
38+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package dbssystem.actuators;
2+
3+
import dbssystem.common.DBSControl;
4+
import dbssystem.common.DBSControlSignal;
5+
import sysmlinjava.events.SysMLSignalEvent;
6+
import sysmlinjava.valuetypes.FrequencyHertz;
7+
import sysmlinjava.valuetypes.PhaseShiftRadians;
8+
9+
public class DBSControlSignalEvent extends SysMLSignalEvent
10+
{
11+
public DBSControlSignalEvent(DBSControlSignal signal)
12+
{
13+
super("DBSControl");
14+
this.signal = signal;
15+
}
16+
17+
public DBSControl getControl()
18+
{
19+
return ((DBSControlSignal)signal).control;
20+
}
21+
22+
@Override
23+
public void createSignal()
24+
{
25+
signal = new DBSControlSignal(new DBSControl(new FrequencyHertz(0), new PhaseShiftRadians(0)) );
26+
}
27+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package dbssystem.actuators;
2+
3+
import dbssystem.common.DBSSignal;
4+
import dbssystem.common.DBSSignalSignal;
5+
import sysmlinjava.common.SysMLClass;
6+
import sysmlinjava.common.SysMLSignal;
7+
import sysmlinjava.ports.SysMLFullPort;
8+
9+
/**
10+
* Port to transmit a low-power signal out of the DBS actuator
11+
*
12+
* @author ModelerOne
13+
*
14+
*/
15+
public class DBSSignalOutPort extends SysMLFullPort
16+
{
17+
18+
public DBSSignalOutPort(DBSActuator contextBlock)
19+
{
20+
super(contextBlock, 0L, "DBSSignalOutPort");
21+
}
22+
23+
@Override
24+
protected SysMLSignal signalFor(SysMLClass object)
25+
{
26+
SysMLSignal result = null;
27+
if(object instanceof DBSSignal signal)
28+
result = new DBSSignalSignal(signal);
29+
return result;
30+
}
31+
32+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/**
2+
* Actuator model element of the DBS System model. The DBSActuator
3+
* models/simulates a system component that is embedded in the patient's brain
4+
* and receives control signals from the DBSController. It translates these
5+
* control signals into very small power signals, injecting them into the
6+
* patients brain to reduce his tremor.
7+
*/
8+
package dbssystem.actuators;

0 commit comments

Comments
 (0)