Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: 41ad806c5de5dea9c51e844e1e02cec217c2515b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
RoomModel org.eclipse.etrice.integration.PingPongThreadTestReplPort {

	import room.basic.service.timing.* from "../../../runtime/org.eclipse.etrice.modellib/models/TimingService.room"

	LogicalSystem System_PingPongReplPort {
		SubSystemRef subsystem: SubSystem_PingPongReplPort
	}

	SubSystemClass SubSystem_PingPongReplPort {
		ActorRef application: PingPongTop
		ActorRef services: ATimingService
		LayerConnection ref application satisfied_by services.timer
		LayerConnection ref application satisfied_by services.timeout
		LogicalThread mrPingThread prio=5 {application.MrPing}
		LogicalThread mrPong1Thread prio=5 {application.MrPong1}
		LogicalThread mrPong2Thread prio=5 {application.MrPong2}
		LogicalThread mrPong3Thread prio=5 {application.MrPong3}
	}

	ActorClass PingPongTop {
		Structure {
			ActorRef MrPing: MrPingActor
			ActorRef MrPong1: MrPongActor1
			ActorRef MrPong2: MrPongActor1
			ActorRef MrPong3: MrPongActor1
			Binding MrPing.PingPongPort and MrPong1.PingPongPort
			Binding MrPing.PingPongPort and MrPong2.PingPongPort
			Binding MrPing.PingPongPort and MrPong3.PingPongPort
		}
		Behavior { }
	}

	ActorClass MrPingActor {
		Interface {
			conjugated Port PingPongPort [3]  : PingPongProtocol
		}
		Structure {
			usercode1 {
				"import org.eclipse.etrice.runtime.java.messaging.RTServices;"
			}
			external Port PingPongPort 
			SAP timer: PTimeout
			Attribute count : int32
			Attribute pongCount : int32
		}
		Behavior {
			StateMachine {
				Transition tr0: initial -> waitForTimer {
					action {
						"count = 0;"
						"timer.Start(1000);"
					}
				}
				Transition tr1: waitForTimer -> waitForPong {
					triggers {
						<timeoutTick: timer>
					}
					action {
						"PingPongPort.get(0).ping();"
						"PingPongPort.get(1).ping();"
						"PingPongPort.get(2).ping();"
						"pongCount = 0;"
					}
				}
				Transition tr3: waitForPong -> cp cp0 {
					triggers {
						<pong: PingPongPort>					
					}
					action {
						"pongCount++;"
					}
				}
				Transition tr4: cp cp0 -> waitForTimer {
					action {
						"if (count++ > 1000) {"
						"RTServices.getInstance().getSubSystem().testFinished(0);"
						"} else {"
						"//PingPongPort.get(0).ping();"
						"//PingPongPort.get(1).ping();"
						"//PingPongPort.get(2).ping();"
						"System.out.println(pongCount);"
						"System.out.println(count);"
						"pongCount = 0;"
						"timer.Start(10);"
						"}"
					}
				}
				Transition tr6: cp cp0 -> waitForPong {
					cond {
						"pongCount < 3"
					}
				}
				ChoicePoint cp0
				State waitForTimer
				State waitForPong
			}
		}
	}

	ActorClass MrPongActor1 {
		Interface {
			Port PingPongPort: PingPongProtocol
		}
		Structure {
			external Port PingPongPort
		}
		Behavior {
			StateMachine {
				Transition tr0: initial -> waitForPing { }
				Transition myTrigger: waitForPing -> waitForPing {
					triggers {
						<ping: PingPongPort>
					}
					action {
						"PingPongPort.pong();"
					}
				}
				State waitForPing
			}
		}
	}
	
	ProtocolClass PingPongProtocol {
		incoming {
			Message ping()
		}
		outgoing {
			Message pong()
		}
	}

}

Back to the top