Simulator Notes

10/5/10

This chapter provides detailed notes on the PLEXIL Simulator. It is directed at software developers rather than users.

Introduction

Although the objective of the PLEXIL simulator is to program it to mimic a real-life application, in the interest of customizability and ease of use, it is a good idea to identify and separate out the aspects of the architecture that are common to all applications. In particular, the design of the simulator consists of two parts;

  • An application (or domain) independent core

  • An application (or domain) dependent aspect that needs to be tweaked on a per application basis such as the inter-process communication protocol setup, code that parses the message received by the simulator constructs the response messages.

The core part of the simulator architecture comprises of specific implementations as well as base classes whose concrete form needs to be provided by the user. Specifically, the core consists of an implementation of a reader for the non-customizable part of the simulation script (i.e., line 1), a manager that keeps track of the commands to be simulated and their corresponding responses, a timing service the serves the purpose of setting timers and handling wakeup calls and a scheduler that coordinates the entire simulation activity. The core also provides several base classes that are implemented by the application dependent peripheral.

Application Independent Core

Script Reader

Reads and parses the mandatory line 1 of the simulator script files and passes on the optional line 2 to a parser implemented by the user for to extract the return value information that is specific to a command or data pertaining to a specific state being posted as telemetry data.

Response Message Manager

Manages the response that are to be posted for a command. In particular, it is responsible for customizing the response for a specific occurrence of a command since the simulator design allows the user to customize the behavior per command occurrence.

Timing Service

Performs the job of setting timers and provides the necessary handlers that will be called with the scheduled time expires. The design makes use of the Posix interval timer.

Simulator

Coordinates all the steps involved in the simulation activity such as reading script files, maintaining a list of pending tasks, requesting and handling wakeup calls and calling the appropriate entity to send a response.

Response Base

A base class that encapsulates the actual response object as well as the time delay for that response. It declares a pure virtual function

virtual ResponseMessage* createResponseMessage() = 0;

that is to be implemented by the user which creates the actual response message.

Response Factory Base

A base class that has a pure virtual function that invokes the method to parse line 2 in the simulation script.

ResponseBase* ResponseFactory::parse(const std::string& cmdName,
                                     timeval tDelay, std::istringstream& inStr) = 0;

The virtual method takes in three arguments, which are the name of the command whose response is being parsed, the time delay for the response, and the entire contents of line 2. The method subsequently returns a pointer to response object it creates.

Communication Relay Base

A base class that serves as the conduit for communication between the simulator core and the user provided communication interface. The base class declares a pure virtual function

virtual void sendResponse(const ResponseMessage* respMsg) = 0;

that is to be implemented by the user. The virtual function will be invoked by the simulator core when a response needs to be sent and takes as its argument a pointer the the response message. The implementation provided by the user is then responsible for publishing the response.

Application Dependent Peripheral

Response Factory Implementation

Provides a concrete implementation of the parser for line 2 entries if the simulation script. The user is expected to construct the appropriate response for each of the command entries specified in the simulation script including all specific occurrences of a command.

Response Implementation

Provides the implementation of the response that the response factory implementation instantiates.

Communication Relay Implementation

Provides the concrete implementation of the communication relay base class that was described in the simulator core.

Communication Mechanism

Since the “simulator” part of the PLEXIL Simulator is a process in its own right, we need some sort of a inter-process communication mechanism to send it commands and also receive responses. We have chosen the IPC package from Carnegie Mellon University. IPC handles both the communication and data marshalling aspects of inter-process communication making it straightforward for the user to program the simulator to send and receive appropriate messages. This package is found in plexil/third-party/ipc in the PLEXIL distribution.

Steps to Construct a Simulator

Let us now look at in greater detail the steps involved in building a simulator. The process of building a simulator for a specific application consists of two steps, the first of which is to build the simulator core library as described above. The core library as we saw earlier contains all the application independent parts. The second step is the responsibility of the user and it involves providing concrete implementations of all the base classes provided in the core. The concrete implementation capture information that are specific to the scenario being simulated such as the structure of values returned in response to issued commands and the specific communication mechanism and protocol. An example of the second has been provided as part of the PLEXIL Simulator distribution in

plexil/src/apps/StandAloneSimulator/PlexilSimulator

Concrete Implementations

The classes PlexilSimResponseFactory and PlexilSimResponse provide responses. The former establishes the correspondence between the command being simulated and the response that has to be created while the latter specifies the detail structure of each of the responses.

The class PlexilCommRelay provides communication. The file PlexilSimulator.cc provides the main() function and creates the simulator.

Built-in Default Message structures

In order to facilitate ease of use, a default command and telemetry data structure has been implemented in the simulator. The user will not be required to provide any specializations for parsing either the command or the telemetry script files provided the values posted by them is an array of integer or real values. The command and telemetry files given as examples in the earlier sections will be parsed by the built in response parser. If however, one or more of the values being returned on response to a command or as a telemetry state is a string, the user will have to provide a customized parser.