# Application Ambassador - Implementation Details

The Application Simulator is completely implemented as an Eclipse MOSAIC Ambassador in Java. The main class ApplicationAmbassador is started by the RTI and creates different components, like the SimulationKernel singleton or the CentralNavigationComponent. Subsequently, it will find all the Java Archive (JAR) files in the application configuration directory, belonging to the currently started scenario, and add their classes to the class path. These JARs contain the application classes. Furthermore, the ApplicationAmbassador is registered as a handle for different Eclipse MOSAIC messages in the configuration file etc/runtime.json in the Eclipse MOSAIC folder. After initialization, the Application Simulator will receive these messages from Eclipse MOSAIC when they appear and perform corresponding actions.

### Node Creation

Application classes are only instantiated when a node, carrying that application, is created. This is signaled by messages for node creation like (AddedVehicle,AddedRsu,AddedTrafficLight, …). When the Mapping ambassador spawns a new node, it will send those messages to the RTI. The message then contains the fully qualified names of all applications associated with the spawned node, as well as the vehicle type itself. Depending on this type, the Application Simulator creates a new SimulationUnit object (i.e. a subclass of SimulationUnit like Vehicle, RoadSideUnit or TrafficLight), representing the new node. This task is served by the UnitSimulatorclass, which performs book keeping of all SimulationUnits. Upon Creation of a node, the UnitSimulator will schedule an event to start all applications, belonging to the new node. The required information is saved in a StartApplications object, which also includes a ApplicationUnit object, an abstract representation of a node (a.k.a. unit) having at least one application.

However, as, for example, SUMO does not simulate vehicles strictly from their creation on, but only since their first movement, Applications for vehicles cannot be started directly upon an AddedVehicle message. Instead, every added vehicle will be kept in the addedVehicles Map, until a VehicleMovements message, belonging to that vehicle is processed. The vehicle will then be added by the UnitSimulator like any other node.

### Other Messages and Time Advance

Apart from the ones for node creation, there are many other messages (see Interaction ), signaling events to the Application Simulator. For most of them, an event in the future will be programmed, such that the implied action is carried out at that simulation time. The processing of the events happens when the RTI calls the advanceTime() method on the ambassador. Upon this, Application Simulator will obtain a list of all events up to the new time and let the processor of the event process them. Every potential event processor implements the EventProcessor interface. The corresponding method is the advanceTime() method of ApplicationAmbassador, which calls scheduleEvents() on the event scheduler. Subsequently, some interesting messages and their handling process is sketched shortly:

Message Description
VehicleUpdates Signals that a vehicle has moved. The Vehicle object, which is a subclass of SimulationUnit, that corresponds to the moved vehicle will be updated to contain the new position. The new information is encapsulated in a VehicleInfo object, containing different vehicle data. To update the data, an event is scheduled at the given time and processed upon time advance. Vehicles not yet added to the simulation (see Node Creation ), are added by calling addVehicleIfNotYetAdded().
MessageReception This message represents the reception of a V2X-message by a simulated node. The SimulationUnit with the id saved in the ReceivedV2XMessage object is scheduled for the processing of the message at the given simulation time. When simulation time reaches the reception time, the SimulationUnit will obtain the message from the message cache and hand it to all applications that implement the CommunicationApplication interface in the method SimulationUnit.processReceiveV2XMessage().
ApplicationInteraction While most other messages are specific to the a SimulationUnit, that then forwards the event to its applications, the ApplicationSpecificMessage is directly handed to all applications. Thereby, the SimulationUnit, whose applications shall receive the message can be specified. If this is not done, all applications of all units will get the message and have the opportunity to handle it.