Subsystem Simulator(supSimulator)
The Subsystem Simulator mimics the respond of a generic subsystem process. It is used to have an independent validation of the standard interface used between the System Supervisor and subsystems. The Subsystem Simulator is a dummy RAD based application which implements the standard state machine and the standard interface together with few specific features.
Note
From now on we will use the term Simulator to refer to the Subsystem Simulator.
The Simulator uses the OLDB to store run-time information. The Simulator publishes its own status following the requirements for interacting with the System Supervisor.
Command Line Arguments
Command line argument help is available under the option --help
.
--server-id ARG| -i ARG
(string)Server id. If not specified uses the one included in the configuration file.
--config ARG| -c ARG
(string)Application configuration file.
--log-level ARG| -l ARG
(enum) [default: ERROR]Log level to use. One of ERROR, INFO, DEBUG, TRACE.
--log-prop-file ARG| -l ARG
(string)Log property file.
--req-endpoint ARG| -l ARG
(string)Server MAL Req/Rep endpoint (zpb.rr://<ipaddr>:<port>/).
Environment Variables
$CFGPATH
Used to resolve configuration file paths.
Simulator State Machine
The Simulator uses a state machine described in a SCXML format that is
interpreted by the state machine engine provided by the rad
application framework.
(SCXML specification).

Simulator State Machine Diagram.
Configuration
SubSystem Simulator Configuration
The server configuration in version 4.0.0 has been ported to the CII config-ng library. Unlike yaml-cpp, this library allows to define type information for the configuration parameters. The Simulator includes a predefined set of configuration definitions. These files can be found in the subsim/server/resources/config directory.
You can find more information about CII config-ng in the following link. (Config-ng manual).
Each command has its own set of configuration parameters
An example of a server configuration is provided below.
!cfg.include config/sup/subsim/server/definitions.yaml:
server: !cfg.type:SubSim
server_id : 'subsim1'
req_endpoint : "zpb.rr://127.0.0.1:15086/"
pub_endpoint : "zpb.ps://127.0.0.1:15046/"
db_timeout : 2000
log_properties : "config/utils/bat/log_properties.cfg"
scxml : "config/sup/subsim/server/sm.xml"
oldb_prefix : "ins1"
commands: [
{
name: 'Init',
reply_ok: true,
reply_delay: 3000,
reply_error_msg: "Init failed - subsystem could not initialize"
},
{
name: 'Enable',
reply_ok: true,
reply_delay: 3000,
reply_error_msg: "ERROR: Enable failed"
},
{
name: 'Disable',
reply_ok: true,
reply_delay: 3000,
reply_error_msg: "ERROR: Enable failed"
},
]
Simulator OLDB
The simulator stores the actual values of the server configuration parameters into the OLDB . This helps to verify whether the configuration has been loaded correctly. For details of the server configuration parameters, see :ref: sup_sim_config_ref_.
OLDB Key |
---|
<server id>/cfg/db_timeout |
<server id>/cfg/dictionaries |
<server id>/cfg/req_timeout |
<server id>/cfg/mon_timeout |
<server id>/cfg/filename |
<server id>/cfg/pub_endpoint |
<server id>/cfg/req_endpoint |
<server id>/cfg/scxml |
<server id>/cfg/server_id |
<server id>/cfg/<command id>/reply_delay |
<server id>/cfg/<command id>/reply_error_msg |
<server id>/cfg/<command id>/reply_ok |
Server Status
The server stores the string representation of its state and substate into the DB.
OLDB Key |
---|
<instrument id>/<server id>/stat/states/state |
<instrument id>/<server id>/stat/states/substate |
Commands
Error Handling
Simulator commands throw an exception (subsimif::ExceptionErr) in case of errors or timeouts from Simulator specific commands. For standard commands, the server throws a stdif::Exception. Client applications can catch the exceptions and obtain the error message associated with the function getDesc(). This error does not contain neither the history nor the error stack but it normally indicates precisely where the error occurred.
try {
auto reply = client->GetState();
} catch (const stdif::ExceptionErr& e) {
RAD_LOG_ERROR() << "Error reply " << e.getDesc() << ").";
}
Serialization
The Subsystem Simulator uses the CII MAL ZPB (ZeroMQ + Google Proto buffers) for serialising commands.
Note
Each command has two parts: a payload and its corresponding reply, see the details in the supif module. The normal replies are plain strings.
Sever Commands
The commands (events) currently supported by the Simulator are:
Command |
Parameters |
Interface |
---|---|---|
Init |
“” |
stdif |
Enable |
“” |
stdif |
Disable |
“” |
stdif |
Reset |
“” |
stdif |
GetState |
“” |
stdif |
GetStatus |
“” |
stdif |
Exit |
“” |
stdif |
SetLogLevel |
“<ERROR|INFO|DEBUG|TRACE>” |
subsimif |
Setup |
“” |
subsimif |
Config |
“<config buffer>” |
subsimif |
GetConfig |
“” |
subsimif |
GetConfig Command
The GetConfig command returns the actual configuration used by the Simulator. This command is useful when starting the process with Nomad where configuration might be rendered.
Publishing
The Subsystem Simulator publishes as any other subsystem its state/substate. This is a requirement for enable visibility from the System Supervisor.
Parameter |
end point |
---|---|
status |
<ps endpoint>/std/status |
Troubleshooting
Logging
The Subsystem Simulator implements logging levels according to the log4cplus package where the concept is:
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
The basic log levels supported by the Simulator for troubleshooting are listed in the table below.
Name |
Verbosity |
Description |
---|---|---|
ERROR |
very low |
Provide logging only in case of errors. |
INFO |
low |
Provide information for the most important actions. |
DEBUG |
medium |
Provide additional information for the developer. |
TRACE |
very high |
Includes all the function tracing. |
C++ Simulator Client
The client application (supsimClient) is a simple utility allowing to send messages to the Simulator from
the command line. In this context we use the words messages and events as synonyms.
The supDummyClient uses two interface module (stdif
and supsimif
) to compose the payload of the messages. For
simplicity purposes, the associated interface for each command is hidden to the user.
The supsimClient sends the messages using CII MAL request/reply.
Note
This client uses the synchronous version of the stdif and supsimif interfaces.
$ supsimClient <serviceURI> <command> ["<parameters>"]
Where
<serviceURI> destination of the command (e.g. zpb.rr://127.0.0.1:12081)
<command> command to be sent to the server (e.g. Init)
<parameters> optional parameters of the command.
Examples
$ supsimClient zpb.rr://134.171.3.48:30519 Init
Note
The Config command is not supported by the C++ client.
Python Client Library
It is possible to communicate with the Subsystem Simulator through clients developed in
Python. The Simulator provides a library that simplifies the interaction with the System Supervisor (clib
).
Users might want to interact directly with Supervisor ICD binding methods. This is, of course possible, but it is outside the scope of this library.
Note
The Supervisor python library uses the synchronous mal interface.
Error Handling
The clib
reports as a RuntimeError exceptions that may be delivered by the Simulator.
Classes
The clib
library provides one class that encapsulates the interface with the Supervisor.
This class is the SubsimCommands class.
SubsimCommands
The constructor of the SubsimCommands class support two parameters: uri and timeout. The timeout is optional and has a default of one minute, expressed in milliseconds.
The class handles two MAL client interfaces to deal with standard commands and Simulator specific commands. The correct interface will be selected according to the method used so this is hidden to the user.
Methods for Command Interface
Method |
parameters |
interface |
---|---|---|
setup |
None |
subsimif |
config |
None |
subsimif |
get_config |
None |
subsimif |
state |
None |
stdif |
status |
None |
stdif |
init |
None |
stdif |
enable |
None |
stdif |
disable |
None |
stdif |
reset |
None |
stdif |
stop |
None |
stdif |
Additional Methods
The SubsimCommands class provides additional methods which uses the Config command to facilitate the update of the configuration at run-time.
Method |
parameters |
interface |
---|---|---|
cfgreply |
<cmd>, <flag> |
subsimif |
cfgdelay |
<cmd>, <delay> |
subsimif |
cfgerrmsg |
<cmd>, <msg> |
subsimif |
Examples
Retrieving the Status
import ifw.sup.subsim.clib.subsim_commands as subsim
uri = "zpb.rr://134.171.3.48:28206"
subsimif = subsim.SubsimCommands(uri)
print(subsimif.status())
Simulator CLI
The Simulator CLI (supsimcli) provides a experimental command shell with simple
commands aiming to simplify the interaction with the Simulator. The Simulator shell can be invoked issuing the
command supsimcli
.
Command Line Parameters
The supsimcli offers few command line parameters. If no parameters are specified. The supsimcli shell commands are not necessary using the same names as the MAL interfaces with the purpose to shorten the commands names.
Parameter |
Description |
---|---|
–uri |
if the URI is specified, the subsimcli will use it to connect to the server |
–name |
When using nomad, one could specify the name of the service instead of the URI |
–module |
Custom interface library |
–class_name |
Custom command class name |
–timeout |
Timeout for CII MAL requests in ms |
–log_level |
log level (ERROR, INFO, DEBUG) |
–help |
Show the usage message |
Warning
The supsimcli shell assumes NOMAD/CONSUL services are up and running. If this is not the case then only –uri parameter can be used.
Note
The supsimcli shell was created for the Simulator but since it uses the standard interface, it can be used for any server implementing this interface, although only for the standard events like init, enable, disable, etc.
supsimcli --uri zpb.rr://134.171.3.48:30269
supsimSh>?
Available command list:
- cfgdelay
- cfgreply
- cfgerrmsg
- disable
- enable
- help
- init
- reset
- setloglevel
- setup
- get_config
- state
- status
Command |
Parameters |
Description |
---|---|---|
disable |
sends the disable (stdif) event to the connected server |
|
enable |
sends the enable (stdif) event to the connected server |
|
help |
print the list of supported commands |
|
init |
sends the init (stdif) event to the connected server |
|
reset |
sends the reset (stdif) event to the connected server |
|
state |
sends the GetState (stdif) event to the connected server |
|
status |
sends the GetStatus (stdif) event to the connected server |
|
setup |
sends the setup (subsimif) event to the connected server |
|
get_config |
sends the GetConfig (subsimif) event to the connected server |
|
cfgreply |
<cmd>,<true|false> |
Configure reply flag for a given command. If flag is true, the command will return successfully otherwise with an error. |
cfgdelay |
<cmd>,<delay> |
Configure reply delay for a given command in milliseconds. |
cfgerrmsg |
<cmd>,<msg> |
Configure reply error message for a given command. The reply flag has to be false to take any effect. |
setlogloevel |
<INFO|DEBUG|TRACE> |
sends the SetLogLevel (stdif) event to the connected server |
ctrl-d |
Stop the shell |
Setting Configuration Parameters
Forcing Init command to finalize with an error:
supsimSh> cfgreply Init,false
reply> = OK
supsimSh>
Changing delay time for Init command:
supsimSh> cfgdelay Init,3000
reply> = OK
supsimSh>