scxmlrun is a stand-alone SCXML processor written in C++ with the following features:
- it is built on top of QtSCXML
- it can be used as a command-line program that simply reads from and writes to local files.
- input/output events can also be received/transmitted over the network via the MQTT protocol.
- several JavaScript functions, including
SCXML.raise
andSCXML.send
for raising/sending events in the JSON format, are introduced for interfacing with the underlying SCXML engine.
Example: echo
The following statechart, which we here call "echo.scxml", receives a single echo event, prints out its data parameter onto the console, and then terminates.
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" datamodel="ecmascript" initial="q1">
<state id="q1">
<transition target="q2" event="echo"><script>console.log (_event.data)</script></transition>
</state>
<final id="q2"/>
</scxml>
$ echo '{"event":{"name":"echo","data":"hello"}}' | scxmlrun echo.scxml
hello
$ scxmlrun echo.scxml --sub echo &
$ mosquitto_pub -t echo -m '{"event":{"name":"echo","data":"world"}}'
world
To see how SCXML processes interact with each other via MQTT, take a look at the ping_pong example.
To browse examples,
check out this list.
For the usage of scxmlrun,
see the man page
which will be accessible through man scxmlrun
after installation.
- run
make docker-build
to build a new docker image for scxmlrun - run
make docker-run
to spawn a container process and enter into it - (in the container, try
make -C /root/tests test
)
-
Qt5 libraries including: libQt5Core, libQt5Qml, and libQt5Network
run:
apt-get install qt5-default qtbase5-dev qtbase5-private-dev
run:apt-get install qtdeclarative5-dev qtdeclarative5-private-dev
Note: as of Sep 2018, the packages for Ubuntu are based on Qt v5.9.5.
-
QtSCXML
download the corresponding version of the QtSCXML source package
run:wget https://github.com/qt/qtscxml/archive/v5.9.5.tar.gz
expand the archive, then build and install QtSCXML
run:cd qtscxml-5.9.5/src/scxml; qmake && make && make install
-
Mosquitto: MQTT broker and development library
run:apt-get install mosquitto mosquitto-clients libmosquitto-dev
-
JSON for C++: JSON parser/serializer
run:apt-get install nlohmann-json-dev
- run:
make && make install
in the top directory.
Once installation is done, try the following.
-
run:
make -C ./tests test
-
run:
make -C ./tests test-mqtt
Note: you may need to install shelltest (by running
apt-get install shelltestrunner
).
Refer to this note.
Although QtSCXML is assumed as the default SCXML engine of scxmlrun, it is not difficult to switch to another one.
For instance,
uSCXML can be used
instead of QtSCXML.
To try this option, see this note.