This project is an implementation of the CCSDS MO MAL Standard in C using ZeroMQ as transport backend.
CCSDS Mission Operation implementations for other languages (e.g. Java) can be found on the CCSDS MO WebSite
Complete MAL specification can be found on the CCSDS website in the published documents section. In particular:
- CCSDS 521.0-B-2, Mission Operations Message Abstraction Layer (MAL)
- CCSDS 524.1-B-1, Mission Operations--MAL Space Packet Transport Binding and Binary Encoding
- CCSDS 524.2-B-1, Mission Operations--MAL Binding to TCP/IP Transport and Split Binary Encoding
- CCSDS 524.4-R-1, Mission Operations--MAL Binding to ZMTP Transport
The CCSDS MO MAL C API was originally developed for the CNES, the French Space Agency, by ScalAgent, a french company specialized in distributed technologies. All contributions are welcome.
Project documentation is available at https://ccsdsmo.github.io/malc
Source code and comments in the source code are in English so you can proably get a good idea of what is goining on by just having a look at the code. A good place to start is the samples
directory.
The project requires GSL version 4.1 to be installed. GSL can be found here.
The project requires CZMQ version 3.0.2 to be installed. CZMQ can be found here.
The project requires zproject to be installed. zproject can be found here.
After installing 'zproject', the file 'zproject_known_projects.xml' (normally located in /usr/local/bin directory) has to be updated in order to contain the right versions of czmq, and the definition of new projects such as 'mal':
<!-- MAL/C Projects -->
<use project = "util"
repository = ""
test = "clog_test"
cmake_name = "UTIL">
</use>
<use project = "malattributes"
repository = ""
test = "mal_string_test"
cmake_name = "MALATTRIBUTES">
</use>
<use project = "mal"
repository = ""
test = "mal_ctx_test"
cmake_name = "MAL">
</use>
<use project = "malbinary"
repository = ""
test = "malbinary_encoder_test"
cmake_name = "MALBINARY">
</use>
<use project = "malsplitbinary"
repository = ""
test = "malsplitbinary_encoder_test"
cmake_name = "MALSPLITBINARY">
</use>
<use project = "malzmq"
repository = ""
test = "malzmq_ctx_test"
cmake_name = "MALZMQ">
</use>
<use project = "maltcp"
repository = ""
test = "maltcp_ctx_test"
cmake_name = "MALTCP">
</use>
<use project = "testarea"
repository = ""
test = "testarea_testservice_testcomposite_test"
cmake_name = "TESTAREA">
</use>
<use project = "malactor"
repository = ""
test = "mal_actor_test"
cmake_name = "MALACTOR">
</use>
Download the current stable version of ZeroMQ (4.1.3) from here.
Download the sources from github (https://github.com/ccsdsmo/malc) in the MAL_HOME directory (for example ~/cnes/malc).
Go to MAL home (MAL_HOME) directory and launch "./genmakeall" shell script. This script generates makefiles for each module then compiles and installs the different modules.
The last modules are base tests for the multiples MAL interactions (SEND, SUBMIT, REQUEST, INVOKE, PROGRESS and PUBLISH/SUBSCRIBE). If unwanted you can comment the call to "genmake_tests" function in the last line of the genmakeall shell script.
The genmakeall commands accept multiples targets:
- all (default target): generates makefiles, then compiles and installs all the modules.
- clean: cleans all the generated stuff.
- gen: generates makefiles.
- compile: compiles each modules.
- install: installs the generated libraries and includes.
- check: launches unit tests.
By default, the installation directory for MAL/C libraries and includes is "MAL_HOME/local". It can be changed by defining the MAL_LOCAL environnement variable.
The project is composed of multiples modules:
- util: currently logging API.
- malattributes: The MAL attributes are extracted from the MAL API to avoid a circular dependency between MAL API and encoding APIs.
- malbinary: An implementation of the SPP encoding.
- malsplitbinary: An implementation of the split binary encoding.
- mal: The MAL/C API implementation.
- malactor: An actor framework on top of the MAL C API, it uses the notions of poller, end-point and handler. It is based on the notion of CZMQ actor.
- malzmq: An implementation of the ZMTP transport
- maltcp: An implementation of the TCP transport.
The test directory contains examples of code for each MAL interaction: SEND, SUBMIT, REQUEST, INVOKE, PROGRESS and PUBLISH/SUBSCRIBE. Each example constitutes a module.
Each module can be individually built using the genmake shell script in the corresponding directory. The genmake commands accept multiples targets:
- all (default target): generates makefiles for the module, then compiles and installs the generated libraries and includes.
- clean: cleans all the generated stuff.
- gen: generates makefiles for the module.
- compile: compiles the module.
- check: launches unit tests.
- install: installs the generated libraries and includes.
The module can be manually built as follows (corresponding to target gen + compile):
./generate.sh
./autogen.sh
./configure --prefix=$MAL_LOCAL
make
The command to compile the source is:
make
The command to launch the tests is:
make check
The command to install the libraries and includes(in $MAL_LOCAL) is:
make install
In 'project.xml' all dependencies must be listed in the order of the dependence, even if a dependency depends on another. For example the project 'testarea' depends on:
<use project = "malattributes" />
<use project = "malbinary" />
<use project = "mal" />
C99 is required.
For bool type:
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/include/stdbool.h
For NULL Macro:
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/include/stddef.h
Project documentation is entirely in Markdown and lives in the docs
directory. It is compiled into a static site thanks to mkdocs.
After updating the content of the docs
directory in the master
branch, you can automatically upload the docs to Github Pages with the following command:
mkdocs gh-deploy --clean