blob: b52973ed7f9fd5531331878bf7fd59a940cc3ac6 [file] [log] [blame]
RoomModel org.eclipse.etrice.examples.dynamicactors3 {
import room.basic.types.* from "../../../org.eclipse.etrice.modellib.java/model/Types.room"
LogicalSystem LS {
SubSystemRef main: Main
}
SubSystemClass Main {
ActorRef appl: Appl
LogicalThread dflt_thread
}
ActorClass Appl {
Structure {
ActorRef cont: Container
}
Behavior { }
}
ActorClass Container {
Structure {
conjugated Port p0[*]: PC
optional ActorRef optarray[*]: Optional
Binding p0 and optarray.p0
}
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 -> CreateOptional2 { }
Transition tr0: CreateOptional2 -> CreateOptional1 {
triggers {
<hello: p0>
}
action {
"System.out.println(txt+\"\\n\");"
}
}
Transition tr2: CreateOptional1 -> ReceivedHelloAgain {
triggers {
<hello: p0>
}
action {
"System.out.println(txt+\"\\n\");"
}
}
Transition tr1: ReceivedHelloAgain -> Destroy0 {
triggers {
<hello: p0>
}
action {
"System.out.println(txt+\"\\n\");"
}
}
Transition tr3: Destroy0 -> Destroy1Create2 {
triggers {
<hello: p0>
}
action {
"System.out.println(txt+\"\\n\");"
}
}
Transition tr4: Destroy1Create2 -> Done {
triggers {
<hello: p0>
}
action {
"System.out.println(txt+\"\\n\");"
}
}
State CreateOptional2 {
entry {
"dumpTree(\"before creation of Optional2\");"
"optarray.createOptionalActor(\"Optional2\", getThread());"
"dumpTree(\"after creation of Optional2\");"
"p0.sayHello();"
}
}
State CreateOptional1 {
entry {
"optarray.createOptionalActor(\"Optional1\", getThread());"
"p0.sayHello();"
"dumpTree(\"after creation of Optional1\");"
}
}
State ReceivedHelloAgain
State Destroy0 {
entry {
"optarray.destroyOptionalActor(0);"
"dumpTree(\"after deletion of Optional2\");"
"p0.sayHello();"
}
}
State Destroy1Create2 {
entry {
"optarray.destroyOptionalActor(1);"
"dumpTree(\"after deletion of Optional1\");"
""
"optarray.createOptionalActor(\"Optional2\", getThread());"
"dumpTree(\"after second creation of Optional2\");"
"p0.sayHello();"
}
}
State Done {
entry {
"System.out.println(\"Done, enter 'quit' to exit\"); "
}
}
}
}
}
// the class that is referenced as optional by the Container
// since it is abstract it just serves as an interface
abstract ActorClass Optional {
Interface {
Port p0: PC
}
Structure { }
Behavior { }
}
// a sub class of Optional which is valid as optional actor
ActorClass Optional1 extends Optional {
Structure {
ActorRef sub1: AC1
Binding p0 and sub1.p0
}
Behavior { }
}
// a sub class of Optional which is valid as optional actor
ActorClass Optional2 extends Optional {
Structure {
ActorRef sub2: AC2
Binding p0 and sub2.p0
}
Behavior { }
}
// the following actor classes are part of the possible optional instance sub trees
ActorClass AC1 {
Interface {
Port p0: PC
}
Structure {
external Port p0
conjugated Port hlp: PC
ActorRef helper: AC3
Binding hlp and helper.p0
}
Behavior {
StateMachine {
Transition init: initial -> Ready { }
Transition tr0: Ready -> AskHelper {
triggers {
<sayHello: p0>
}
}
Transition tr1: AskHelper -> Ready {
triggers {
<hello: hlp>
}
action {
"System.out.println(\"helper said \"+txt);"
"p0.hello(\"this is AC1, instance \"+getInstancePath());"
}
}
State Ready
State AskHelper {
entry {
"hlp.sayHello();"
}
}
}
}
}
ActorClass AC2 {
Interface {
Port p0: PC
}
Structure {
ActorRef deep_sub: AC3
Binding p0 and deep_sub.p0
}
Behavior { }
}
ActorClass AC3 {
Interface {
Port p0: PC
}
Structure {
external Port p0
}
Behavior {
StateMachine {
Transition init: initial -> Ready { }
Transition tr0: Ready -> Ready {
triggers {
<sayHello: p0>
}
action {
"p0.hello(\"this is AC3, instance \"+getInstancePath());"
}
}
State Ready
}
}
}
// a simple protocol that is used to demonstrate that actors are connected
ProtocolClass PC {
incoming {
Message sayHello()
}
outgoing {
Message hello(txt: string)
}
}
}