Statecharts and Class Diagram Compiler ====================================== Installation ------------- Within the `src` directory, execute `python setup.py install --user`. Compiling SCCDXML Files ------------- To compile a conforming SCCDXML file, the provided Python compiler can be used: ```sh $python -m sccd.compiler.sccdc --help usage: python -m sccd.compiler.sccdc [-h] [-o OUTPUT] [-v VERBOSE] [-p PLATFORM] [-l LANGUAGE] input positional arguments: input The path to the XML file to be compiled. optional arguments: -h, --help show this help message and exit -o OUTPUT, --output OUTPUT The path to the generated code. Defaults to the same name as the input file but with matching extension. -v VERBOSE, --verbose VERBOSE 2 = all output; 1 = only warnings and errors; 0 = only errors; -1 = no output. Defaults to 2. -p PLATFORM, --platform PLATFORM Let the compiled code run on top of threads, gameloop or eventloop. The default is eventloop. -l LANGUAGE, --language LANGUAGE Target language, either "javascript" or "python". Defaults to the latter. ``` The Threads Platform ------------- The `Threads` platform is the most basic platform. It runs the SCCD model on the main thread when `Controller.run()` is called (meaning that the program will block on this call). If input needs to be provided to the SCCD model or the output of the SCCD model needs to be processed while it's running, a separate thread should be started. For example, the code below shows how input/output works for a compiled SCCD model `target_py/target.py` which was compiled for the `threads` platform and has two ports ("input" and "output"): ```python import target_py.target as target from sccd.runtime.statecharts_core import Event import threading if __name__ == '__main__': controller = target.Controller() def raw_inputter(): while 1: controller.addInput(Event(raw_input(), "input", [])) input_thread = threading.Thread(target=raw_inputter) input_thread.daemon = True input_thread.start() output_listener = controller.addOutputListener(["output"]) def outputter(): while 1: print output_listener.fetch(-1) output_thread = threading.Thread(target=outputter) output_thread.daemon = True output_thread.start() controller.start() ``` The Eventloop Platform ------------- The `Eventloop` platform works only in combination with a UI system that allows for scheduling events. Default implementations are provided for the Tkinter UI library on Python, and the default scheduler found in Javascript (through the `setTimeout` function). In Python: ```python import Tkinter as tk import target_py.target as target from sccd.runtime.libs.ui import ui from sccd.runtime.statecharts_core import Event from sccd.runtime.tkinter_eventloop import * if __name__ == '__main__': ui.window = tk.Tk() ui.window.withdraw() controller = target.Controller(TkEventLoop(ui.window)) controller.start() ui.window.mainloop() ``` In Javascript: ```javascript ``` The Gameloop Platform ------------- The `Gameloop` platform works in combination with a game engine, which calls the `update` function of the controller at regular intervals. Examples ------------- A number of examples can be found in the `examples` folder, demonstrating the syntax and capabilities of SCCD. They can be compiled by executing `make clean all` inside the `examples` folder. Each example has an associated runner file, with which the example can be executed. Tests ------------- A number of tests are provided which make sure the compiler and runtime implement the correct behaviour. They can be compiled by executing `make clean all` inside the `tests` folder. Tests are compiled for both Python and Javascript. The generated Python test cases (in the `tests/target_py` folder) can be run by executing `run_tests.py` inside the `tests` folder. The generated Javascript test cases (in the `tests/target_js` folder) can be run by executing `run_tests.html` inside the `tests` folder.