RoomModel org.eclipse.etrice.examples.dynamicactors9 {

	import room.basic.service.timing.* from "../../../org.eclipse.etrice.modellib.java/model/TimingService.room"

	LogicalSystem LogSys1 {
		SubSystemRef subSysRef1: SubSysClass1
	}

	SubSystemClass SubSysClass1 {
		ActorRef actorRef1: PingPongTop
		ActorRef timingService: ATimingService
		LayerConnection ref actorRef1 satisfied_by timingService.timer
		LogicalThread defaultThread
	}

	ActorClass PingPongTop {
		Structure {
			ActorRef container: Container
		}
		Behavior { }
	}
	
	ActorClass Container {
		Structure {
			optional ActorRef pp: PingPong
		}
		Behavior {
			StateMachine {
				Transition init: initial -> Running { }
				State Running {
					entry '''pp.createOptionalActor("PingPong", getThread());'''
				}
			}
		}
	}

	ActorClass PingPong {
		Structure {
			ActorRef receiver: Receiver
			ActorRef sender: Sender
			Binding receiver.sender and sender.receiver
		}
		Behavior { }
	}
	ActorClass Sender {
		Interface {
			conjugated Port receiver: PingPongProtocol
		}
		Structure {
			external Port receiver
		}
		Behavior {
			StateMachine {
				Transition init: initial -> SendingPing { }
				Transition tr0: SendingPing -> ReceivedPong {
					triggers {
						<pong: receiver>
					}
				}
				State SendingPing {
					entry '''receiver.ping();'''
				}
				State ReceivedPong {
					entry '''System.out.println("Done, enter 'quit' to exit");'''
				}
			}
		}
	}

	ActorClass Receiver {
		Interface {
			Port sender: PingPongProtocol
		}
		Structure {
			external Port sender
			SAP timing: PTimer
		}
		Behavior {
			StateMachine {
				Transition init: initial -> WaitingForPing { }
				Transition tr0: WaitingForPing -> WaitingForAWhile {
					triggers {
						<ping: sender>
					}
				}
				Transition tr1: WaitingForAWhile -> SentPong {
					triggers {
						<timeout: timing>
					}
				}
				State WaitingForPing
				State WaitingForAWhile {
					entry '''timing.startTimeout(1000);'''
				}
				State SentPong {
					entry '''sender.pong();'''
				}
			}
		}
	}

	ProtocolClass PingPongProtocol {
		incoming {
			Message ping()
		}
		outgoing {
			Message pong()
		}
	}

}