Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: 93f86f5bb7602cac594dfb5248cda505993204ce (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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
RoomModel org.eclipse.etrice.integration.PingPongThreadTest {

	import room.basic.service.timing.*


	LogicalSystem System_PingPong {
		SubSystemRef subsystem: SubSystem_PingPong
	}

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

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

	ActorClass MrPingActor {
		Interface {
			conjugated Port PingPongPort  : PingPongProtocol
			conjugated Port PingPongPort2 : PingPongProtocol
			conjugated Port PingPongPort3 : PingPongProtocol 
		}
		Structure {
			external Port PingPongPort 
			external Port PingPongPort2
			external Port PingPongPort3
			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.ping();"
						"PingPongPort2.ping();"
						"pongCount = 0;"
					}
				}
				Transition tr3: waitForPong -> cp cp0 {
					triggers {
						<pong: PingPongPort2>
						or
 						<pong: PingPongPort>					
					}
					action {
						"pongCount++;"
					}
				}
				Transition tr5: cp cp0 -> waitForTimer {
					action {
						"if (count++ > 1000) {"
						"SubSystemClassBase.getInstance().testFinished(0);"	
						"} else {"
						"System.out.println(count);"
						"timer.Start(5);}"
					}
				}
				Transition tr6: cp cp0 -> waitForPong {
					cond {
						"pongCount < 2"
					}
				}
				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 { }
			}
		}
	}
	
	ActorClass MrPongActor2 {
		Interface {
			Port PingPongPort: PingPongProtocol
		}
		Structure {
			external Port PingPongPort
		}
		Behavior {
			StateMachine {
				Transition tr0: initial -> waitForPing {
					action {
						"// simulate blocking call e.g. Queue"
						"try{"
						"Thread.sleep(10000);"
						"}catch (InterruptedException e){}"
					}
				}
				Transition myTrigger: waitForPing -> waitForPing {
					triggers {
						<ping: PingPongPort>
					}
					action {
						"PingPongPort.pong();"
					}
				}
				State waitForPing { }
			}
		}
	}	
	
	ProtocolClass PingPongProtocol {
		incoming {
			Message ping()
		}
		outgoing {
			Message pong()
		}
	}

}

Back to the top