=Paper=
{{Paper
|id=Vol-2245/mdetools_paper_5
|storemode=property
|title=Implementing the MDETools'18 Challenge with ThingML
|pdfUrl=https://ceur-ws.org/Vol-2245/mdetools_paper_5.pdf
|volume=Vol-2245
|authors=Jakob Høgenes,Brice Morin
|dblpUrl=https://dblp.org/rec/conf/models/HogenesM18
}}
==Implementing the MDETools'18 Challenge with ThingML==
Implementing the MDETools’18 challenge
with ThingML⋆
Jakob Høgenes and Brice Morin
SINTEF Digital, Oslo, Norway
first.last@sintef.no
Abstract. This paper presents a ThingML implementation of the MDE-
Tools’18 challenge. ThingML is a textual modeling language that imple-
ments a sub-set of the UML (components and state-machines) and com-
plements it with a first-class action language. ThingML also comes with
a set of compilers targeting a large variety of platforms and program-
ming languages. Using ThingML, we have been able to 1) fully model
the MDETools’18 challenge, 2) automatically compile this specification
it to two distinct programming languages, and 3) successfully execute
the resulting programs and achieve reasonable results in the simulation.
Keywords: Model-Driven Engineering, Tool, Reactive Systems
1 Introduction
This paper presents a ThingML [1–3] implementation of the MDETools’18 chal-
lenge. ThingML is a textual modeling language that implements a sub-set of
the UML (components and state-machines) and complements it with a first-
class action language. The MDETools’18 challenge being to implement a con-
trol system for a follower rover interacting with a simulated leader rover, we
believe state-machines communicating through asynchronous message passing
is an adequate paradigm, and ThingML a relevant MDE tool supporting this
paradigm. ThingML employs a textual syntax based on XText, fully integrated
in the Eclipse IDE, providing an advanced editor with syntax highlighting, error
reporting and code completion. Code for multiple target platforms can easily
be generated using the standard Eclipse build interface. A key advantage of
ThingML is its first-class action language, which allows modeling fine-grained
behavior (e.g. actions in states and transitions) in a platform-independent way.
Still, ThingML also provides a “kick-down” mechanism for mixing ThingML
code with platform-specific code in order to leverage existing libraries and frame-
works to avoid over-modeling by forcing designer to remodel those libraries. The
complete implementation of the challenge is publicly available on GitHub1 .
⋆
The research leading to these results has received funding from the European Com-
mission’s H2020 programme under grant agreement no 780351 (ENACT).
1
https://github.com/SINTEF-9012/mdetools18-challenge-thingml
The remainder of this paper is organized as follows. Section 2 details how
the challenge is modeled in ThingML. Section 3 presents how the platform-
independent specifications from Section 2 can be specialized and compiled to
different platforms. Section 4 concludes and discusses the strengths and weak-
nesses of ThingML when implementing this challenge.
2 Modeling the MDETools’18 Challenge with ThingML
The simulated environment of the posed challenge exposes two TCP ports for
the external application (challenge solution) to 1) poll for the current state of
the environment, and 2) send control signals to the follower rover. Not depicted
in the figure, is a file containing parameters which describe both how the leader
rover moves, the target distance for the follower rover, and the endpoints of the
TCP ports.
The proposed solution to the problem, is an application consisting of: a) A
settings parser, b) Communication with the simulator, c) State estima-
tion, d) A control system, and e) A timer. Figure 1 shows how these parts are
connected and interact with the simulated environment. A more detailed view
into the actual components composing the application is given in Figure 3. The
following sections will detail each part.
Fig. 1. Conceptual architecture of the proposed solution application. The direction of
the arrows indicate the direction of flow of messages.
2.1 Settings parser
The settings parser is implemented with a single component. It reads the line-
formatted file of parameters, parses them into suitable ThingML datatypes and
when the whole file is read, sends a message out to the listening components
containing the parsed parameters. In the proposed solution, the following pa-
rameters are used:
– simulationIP, controlPort, observationPort: for the communica-
tion part that needs to open TCP sockets to the simulator.
– minDistance, maxDistance: for the control system to calculate the tar-
get distance.
– runTime: for the control system to know when it is done and apply the
brakes.
2.2 Communication
This part of the application is implemented with three components. There are
two instances of a generic line-based TCP socket that 1) forwards ThingML
messages containing a single string to the simulator as lines, and 2) reads lines
coming from the simulator and sends them out as ThingML messages. The third
component implements the communication protocol of the simulator, acting as
the ThingML proxy to the simulator. It implements the parsing and formatting of
strings and the ThingML messages shown in Listing 1.1, and uses two regions to
handle the communication with both the leader and follower rovers concurrently,
shown in Figure 2.
Listing 1.1. The communication API
1 thing fragment CommunicatorMsgs {
2 message Ready()
3 message SimulationStarted()
4
5 message SetRoverLRPower(left : Integer, right : Integer)
6 message SetBrake(brake : Integer)
7 message GetRoverPosition()
8 message GetRoverCompass()
9 message RoverPosition(x : Double, y : Double)
10 message RoverCompass(phi : Double)
11
12 message LeaderStart()
13 message GetLeaderPosition()
14 message GetLeaderDistance()
15 message LeaderPosition(x : Double, y : Double)
16 message LeaderDistance(d : Double)
17 }
2.3 State estimation
The simulated environment only provides the position of the leader and follower,
the heading of the follower, and the distance between the leader and follower
rovers. To implement a decent control system, derivatives of these quantities
are also needed. This part therefore contains two components that estimate the
first and second order derivatives, using a finite difference scheme with 2nd order
accuracy, one for each of the rovers. At a fixed time interval each estimator
requests the current position of its assigned rover. When the response arrives,
the last three position values are used to estimate the derivatives.
A third component buffers the received state estimates from each of the rover
estimators, and calculates values that are passed on to the control system:
Fig. 2. Excerpt of the communicator thing statechart. Upon receiving the parsed set-
tings from the settings parser, and opening observation and control sockets, the com-
municator enters the depicted composite state. The two parallel regions handle com-
munications with the leader and follower rovers concurrently. As a command or request
is received in the form of a ThingML message, it is formatted as a string and passed
on to the appropriate socket. If a response is expected, an intermediate waiting state
is entered until a string is received from the socket, which is then parsed and passed
on as a ThingML message to listening components.
1. The angle from the follower to the leader, the heading.
2. The distance between the leader and follower.
3. The speed of the leader.
4. The speed of the rover, projected onto the speed of the leader. This is used
to prevent the follower from going full in the wrong direction.
2.4 Control system
The control system consists of three components responsible for controlling dif-
ferent aspects of the system, and a fourth component for coordinating and com-
posing the final inputs to the follower rover. The implemented control compo-
nents are:
1. Distance controller. A P-controller that tries to keep the follower at a
distance of (minDistance + maxDistance)/2 from the leader.
2. Heading controller. A P-controller that tries to point the follower directly
towards the leader.
3. Speed controller. A PI-controller with anti-windup, that tries to match
the projected speed of the follower with the speed of the leader.
These control systems receive state estimates from the estimation component,
and buffer the last received values. At a configurable time interval the control
multiplexer component sends a message to the first controller with (0, 0) as the
inputs for the left and right wheels of the follower. Each of the controllers add
their own control input on top of the received input, and pass it on to the
next controller, and finally back to the control multiplexer. When the control
multiplexer gets the combined input from all the controllers back, it scales the
values to make sure it is within the allowed range of [−100, 100], and sends it to
the communication component to be passed to the simulated environment.
Fig. 3. Detailed component diagram generated by the PlantUML ThingML compiler.
The colored boxes indicate the parts of the system shown in the conceptual architecture
in Figure 1, and described in sections 2.1-2.5 . For each component, a corresponding
state machine defines the component behavior. The lines depict connectors between
ports of the components, which indicate the flow of messages in the system.
2.5 Timer
The timer is a single component that receives requests to start a countdown
for a specific ID, and when the countdown has elapsed sends a notification to
all listening components with the corresponding ID. Although the component
is very simple, it is essential since the rest of system operates asynchronously
without any notion of time.
3 Generating and Executing Code for Two Languages
ThingML comes with a rich platform-independent action language, and compil-
ers targeting C (for microcontrollers and Linux), Java, JavaScript (Node.JS and
Browser) and Go. This means that generating complete and executable code for
multiple platforms, in many cases, comes at no extra cost to the developer. How-
ever, as very specialized functionality (like ad hoc communication protocols) are
not included in the ThingML modeling language, some situations require plat-
form specific models. There are three ways to accomplish this using ThingML:
1. Using plug-ins that come bundled with the ThingML compilers. These plug-
ins are specialized for each target language, and generate code for exchanging
ThingML messages across network protocols (such as MQTT and WebSock-
ets) with other ThingML or legacy applications.
2. Using standard libraries that come bundled with ThingML. These libraries
provide commonly used functions (e.g. mathematical functions or string for-
matting and parsing) as both platform independent abstract declarations,
and platform specific concrete implementations.
3. Manually mix in platform specific code using the “kick-down” mechanism,
or applying compiler specific options using annotations.
To demonstrate how platform independent and platform specific models are
specified and mixed in ThingML, the proposed solution was implemented with
models to generate code for both Java and Go. The final models consist of mainly
platform independent components, while the following parts of the ThingML
model is implemented in a platform specific way: a) Mathematical functions, b)
String formatting and parsing, c) The timer component, d) Line-based messaging
over TCP, and e) Reading the configuration file line-by-line.
The following sections first demonstrate how platform independent and spe-
cific models may be combined by showing the ThingML implementation of the
configuration file parser, then compare the implementation of the proposed so-
lution using the two languages.
3.1 Example of Platform Specific Models Using ThingML
The settings parser component is responsible for converting a specially formatted
file of parameters to ThingML datatypes, and notifying listening components
about their values. Reading files and parsing strings are not functionalities that
is supported in the ThingML action language directly, so this component requires
platform specific implementations using the mechanisms provided by ThingML.
Listing 1.2 shows the platform independent partial (indicated by fragment)
implementation of the component. This model defines the relatively simple be-
havior of the component. Once started, the ReadConfigFile function is called,
which again is supposed to call HandleLine for each line in the file, and after
all lines are read, the parsed parameters are sent out over the Loaded port.
The model uses two ways of defining platform independent behavior with-
out the platform specific implementation. The ReadConfigFile function is
declared as an abstract function, leaving all the details up to the final imple-
mentation of the component. The HandleLine function calls abstract functions
declared in the platform independent String component from the ThingML
Strings library, shown in Listing 1.4. To implement these functions, one may
simply include the appropriate *Strings component from the library.
Listing 1.2. Platform independent partial implementation of the settings parser com-
ponent. Some details have been left out to save space (...).
1 thing fragment SettingsParser includes ..., Strings {
2 provided port Loaded { sends Settings }
3 property ConfigPath : String = "Challenge ⤸
problem/Settings/config.txt"
4 property controlPort : Long = 0
5 ...
6 function HandleLine(line : String) do
7 var option : String[2]
8 SplitInto(line, "=", option)
9 if (Equals(option[0], "controlPort")) do
10 controlPort = ParseLong(option[1])
11 return
12 end
13 ...
14 end
15
16 abstract function ReadConfigFile(path : String)
17
18 statechart Loader init LoadConfiguration {
19 state LoadConfiguration {
20 on entry do
21 ReadConfigFile(ConfigPath)
22 Loaded!Settings(controlPort, ...)
23 end
24 }
25 }
26 }
The final implementation of the settings parser component for Java is shown
in Listing 1.3. It includes the JavaStrings component from the Strings library
that implements the abstract functions for Java (wrapping methods from the
Java String class in a straightforward manner), while the ReadConfigFile is
manually implemented with Java-code using the “kick-down” mechanism. The
java import annotation instructs the ThingML Java compiler to include these
additional imports at the top of the generated Java source files.
Listing 1.3. Platform specific implementation of the settings parser for Java.
1 thing JavaSettingsParser includes SettingsParser, JavaStrings
2 @java_import ‘
3 import java.io.FileReader;
4 import java.io.BufferedReader;
5 import java.io.IOException;‘
6 {
7 function ReadConfigFile(path : String) do ‘
8 try (BufferedReader br = new BufferedReader(new ⤸
FileReader(‘&path&‘))) {
9 for (String line = br.readLine(); line != null; line = ⤸
br.readLine()) {
10 ‘ HandleLine(‘line‘ as String) ‘
11 }
12 } catch (IOException e) {
13 System.err.println("Couldn’t read config file: "+‘&path&‘);
14 System.exit(1);
15 }
16 ‘ end
17 }
Listing 1.4. ThingML Strings library, showing both the platform independent decla-
ration and the platform specific implementation for Java. Some details have been left
out to save space (...).
1 thing fragment Strings {
2 abstract function ParseLong(s : String) : Long
3 ...
4 }
5
6 thing fragment JavaStrings {
7 function ParseLong(s : String) : Long do
8 return (‘Integer.parseInt(‘&s&‘)‘) as Long
9 end
10 ...
11 }
3.2 Evaluation of Controllers Generated Using Two Languages
To evaluate the performance of the proposed solution, and to ensure that the
generated code for both Java and Go perform equally well and consistently, an
experiment was conducted. The experiment consists of five scenarios correspond-
ing to five randomly generated leader rover paths. For each scenario, both the
generated Java and Go controllers were executed during five runs alongside the
simulated environment. The resulting power input to the follower rover and the
distance between the leader and follower rover were recorded over time, as well
as the final percentage of time in the zone.
Table 1 shows the final percentage of time in the zone for all runs of the
experiment. Overall, the performance of the two languages are similar for each
scenario, and quite consistent across the runs within each scenario. For a couple
of runs, the Go controller performed significantly worse than the other runs of the
same scenario (highlighted with gray cells). The reason for this is still unclear,
but since it does not seem to happen for the Java, it might be a manifestation
of a bug in the ThingML Go compiler, which warrants further investigation.
Figure 4 provides a more detailed view of the execution of the controllers for
both Java and Go. It shows the power input to the follower rover and the distance
between leader and follower rover over time for the two controllers, for randomly
selected runs in a randomly selected scenario. In general, the two controllers
produce quite similar input, and perform equally well. The slight differences
are likely caused by timing differences (since the setup is not a hard real-time
system), and potential floating point number inaccuracies. The jaggedness of
the power input is probably a result of the sampling of position of the rovers
from the simulated environment, either that the sampling rate is too high, the
sampling time being non-uniform, or the low-order finite differentiation scheme
implemented. As the controllers performed satisfactory, this issue has not been
further investigated.
Power - left
100
50
0
−50 Go
Java
Power - right
100
50
0
−50
Distance
14.5
14.0
13.5
13.0
12.5
0 10 20 30 40 50 60
Fig. 4. Comparison of the power inputs for the Go and Java controllers, and the
distance between leader and follower rover, for a a single execution.
Table 1. Resulting percentage of time in the zone for multiple runs of the simulation
with both Go and Java controllers. Outliers are highlighted with gray cells.
Scenario: Language: Run 1: Run 2: Run 3: Run 4: Run 5:
Scenario 1 Go 100% 100% 100% 100% 100%
Java 100% 100% 100% 100% 100%
Scenario 2 Go 69.2% 67.5% 70.0% 68.8% 68.8%
Java 70.0% 70.0% 70.0% 70.4% 73.3%
Scenario 3 Go 97.5% 98.3% 29.6% 97.5% 97.5%
Java 97.5% 97.5% 97.5% 97.0% 97.0%
Scenario 4 Go 100% 70.3% 100% 100% 97.9%
Java 95.8% 95.0% 96.3% 100% 100%
Scenario 5 Go 100% 100% 100% 100% 100%
Java 100% 100% 100% 100% 100%
4 Conclusion
In this work, we have proposed a solution to the MDETools’18 Challenge prob-
lem using the ThingML modeling language and accompanying tools. Leveraging
the ThingML language and tools, we were able to generate executable code in
two languages (Java and Go) that in our experiments produced similar and
reasonably good results.
The resulting ThingML models for both languages consist of 767 lines of
platform-independent code, and 71 (8%) and 88 (10%) lines of platform specific
code for Java and Go respectively. In addition, 157 lines of code for new libraries
has been written for the two languages that is to be contributed to the ThingML
standard libraries.
This small amount of platform specific code, substantiates the claim that the
ThingML modeling language is useful in practical applications, such as the posed
challenge. Coupled with the wide range of platforms targeted by the ThingML
compilers, it also means that generating code for suitable targets comes at little
extra cost to the developer.
In terms of the control system implemented in the proposed solution of this
work, the performance is far from optimal. However, as ThingML offers no spe-
cific support for control systems, the authors consider this as outside the main
scope of this challenge, and leave further improvements for future work. Such
improvements (such as limiting the rate of change of applied power to void
wheel-spin) could with ease be implemented with platform independent models.
Extending the proposed solution to other languages (e.g. C and JavaScript) is
also reserved for future work.
During the work with solving the posed challenge, some bugs and shortcom-
ings of the ThingML modeling language and tools was discovered, despite the
already strong test suite in place for the compilers. Most have already been
fixed and contributed to the official ThingML repository, while some (particu-
larly related to the inconsistent behavior of the Go controller) requires further
investigation, and will definitely be dealt with by the ThingML developers. As
such, the posed challenge has both been a good exercise to assure the practicality
of ThingML, as well as providing substantial input for the future development.
References
1. Franck Fleurey, Brice Morin, Arnor Solberg, and Olivier Barais. MDE to manage
communications with and between resource-constrained systems. In International
Conference on Model Driven Engineering Languages and Systems, pages 349–363.
Springer, 2011.
2. Nicolas Harrand, Franck Fleurey, Brice Morin, and Knut Eilif Husa. ThingML:
a language and code generation framework for heterogeneous targets. In Proceed-
ings of the ACM/IEEE 19th International Conference on Model Driven Engineering
Languages and Systems, pages 125–135. ACM, 2016.
3. Brice Morin, Nicolas Harrand, and Franck Fleurey. Model-based Software Engineer-
ing to tame the IoT Jungle. IEEE Software, 34(1):30–36, 2017.