blob: 3a10ce5a46b47c5625d877c93c8bc9a5d466c81e [file] [log] [blame]
RoomModel DynamicActorTest6 {
import room.basic.types.int32
import room.basic.types.string
import room.basic.test.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()
}
}
}