Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: fe95b068f5550a160789b7578aecfaee8dc7f931 (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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
RoomModel DynamicActorTest6 {

	import etrice.api.types.int32
	import etrice.api.types.string
	import etrice.api.annotations.TestInstance

	ActorClass Appl {
		@TestInstance
		Structure {
			ActorRef ctrl: Controller
		}
		Behavior {
		}
	}

	ActorClass Controller {
		Structure {
			conjugated Port pcont: PCtrl
			conjugated Port pout: PC
			conjugated Port pin: PC
			Attribute caseId: int32
			ActorRef cont: Container
			Binding pcont and cont.fct
			Binding pout and cont.pin
			Binding pin and cont.pout
		}
		Behavior {
			ctor '''caseId = etUnit_openAll("log", "DynamicActorTest6", "org.eclipse.etrice.generator.java.tests.DynamicActorTest6", "DynamicActorTest6_case");'''
			dtor '''etUnit_closeAll(caseId);'''
			StateMachine {
				Transition init: initial -> CreateOptionals {
				}
				Transition tr0: CreateOptionals -> Sending {
					triggers {
						<done: pcont>
					}
				}
				Transition tr1: Sending -> Destroy {
					triggers {
						<hello: pin>
					}
					action '''System.out.println("Controller received: "+transitionData);'''
				}
				Transition tr2: Destroy -> CreateAgain {
					triggers {
						<done: pcont>
					}
				}
				Transition tr3: CreateAgain -> SendAgain {
					triggers {
						<done: pcont>
					}
				}
				Transition tr4: SendAgain -> Done {
					triggers {
						<hello: pin>
					}
					action '''System.out.println("Controller received: "+transitionData);'''
				}
				State CreateOptionals {
					entry '''pcont.createOpts();'''
				}
				State Sending {
					entry '''pout.sayHello();'''
				}
				State Done {
					entry '''etUnit_testFinished(caseId);'''
				}
				State Destroy {
					entry '''pcont.destroyOpts();'''
				}
				State CreateAgain {
					entry '''pcont.createOpts();'''
				}
				State SendAgain {
					entry '''pout.sayHello();'''
				}
			}
		}
	}

	ActorClass Container {
		Interface {
			Port fct: PCtrl
			Port pout: PC
			Port pin: PC
		}
		Structure {
			external Port fct
			optional ActorRef opt1: Optional1
			optional ActorRef opt2: Optional2
			Binding opt1.pout and opt2.pin
			Binding pin and opt1.pin
			Binding pout and opt2.pout
		}
		Behavior {

			// this method prints the passed message and then dumps the object tree consisting of actors and ports
			Operation dumpTree(msg: string) '''
				System.out.println(msg);
				System.out.println(((org.eclipse.etrice.runtime.java.messaging.RTObject)getRoot()).toStringRecursive());'''
			StateMachine {
				Transition init: initial -> Ready {
				}
				Transition tr0: Ready -> Ready {
					triggers {
						<createOpts: fct>
					}
					action '''
						opt1.createOptionalActor("Optional1", getThread());
						opt2.createOptionalActor("Optional2", getThread());
						dumpTree("after creation of op1 and opt2");
						fct.done();'''
				}
				Transition tr1: Ready -> Ready {
					triggers {
						<destroyOpts: fct>
					}
					action '''
						opt1.destroyOptionalActor();
						opt2.destroyOptionalActor();
						fct.done();'''
				}
				State Ready
			}
		}
	}

	ActorClass Optional1 {
		Interface {
			Port pout: PC
			Port pin: PC
		}
		Structure {
			ActorRef sub1: AC1
			Binding pin and sub1.pin
			Binding pout and sub1.pout
		}
		Behavior {
		}
	}

	ActorClass Optional2 {
		Interface {
			Port pout: PC
			conjugated Port pin: PC
		}
		Structure {
			ActorRef sub2: AC2
			Binding pout and sub2.pout
			Binding pin and sub2.pin
		}
		Behavior {
		}
	}

	ActorClass AC1 {
		Interface {
			Port pout: PC
			Port pin: PC
		}
		Structure {
			external Port pout
			external Port pin
		}
		Behavior {
			StateMachine {
				Transition init: initial -> Ready {
				}
				Transition tr0: Ready -> Ready {
					triggers {
						<sayHello: pin>
					}
					action '''pout.hello("this is AC1, instance "+getInstancePath());'''
				}
				State Ready
			}
		}
	}

	ActorClass AC2 {
		Interface {
			Port pout: PC
			conjugated Port pin: PC
		}
		Structure {
			external Port pout
			external Port pin
		}
		Behavior {
			StateMachine {
				Transition init: initial -> Ready {
				}
				Transition tr0: Ready -> Ready {
					triggers {
						<hello: pin>
					}
					action '''
						System.out.println("AC2 received "+transitionData);
						
						pout.hello("AC2: forwarding "+transitionData);'''
				}
				State Ready
			}
		}
	}

	ProtocolClass PC {
		incoming {
			Message sayHello()
		}
		outgoing {
			Message hello(string)
		}
	}

	ProtocolClass PCtrl {
		incoming {
			Message createOpts()
			Message destroyOpts()
		}
		outgoing {
			Message done()
		}
	}
}

Back to the top