From 17add5a3e4640bb3ca513b09d1ab0dd2f0d0969d Mon Sep 17 00:00:00 2001 From: Marten Lohstroh Date: Mon, 4 Apr 2022 19:57:38 -0700 Subject: [PATCH] Remove example directory --- example/.gitignore | 11 - example/C/src/Deadline.lf | 92 ---- example/C/src/Delay.lf | 62 --- .../DistributedDatabase/FederatedDatabase.lf | 33 -- .../DistributedDatabase/ReplicatedDatabase.lf | 256 ---------- .../ReplicatedDatabaseThree.lf | 38 -- .../C/src/DistributedHelloWorld/HelloWorld.lf | 81 ---- .../DistributedHelloWorld/HelloWorldAfter.lf | 18 - .../HelloWorldDecentralized.lf | 53 --- .../HelloWorldDecentralizedSTP.lf | 47 -- .../HelloWorldPhysical.lf | 27 -- .../HelloWorldPhysicalAfter.lf | 23 - .../docker/HelloWorldContainerized.lf | 22 - .../DistributedHelloWorld/docker/README.md | 51 -- .../FederatedResourceManagement.lf | 60 --- .../ResourceManagement.lf | 442 ------------------ example/C/src/MQTT/MQTTDistributed.lf | 146 ------ example/C/src/MQTT/MQTTPhysical.lf | 136 ------ example/C/src/MQTT/MQTTPublisher.lf | 179 ------- example/C/src/MQTT/MQTTSubscriber.lf | 253 ---------- .../MQTT/include/mosquitto-extension.cmake | 37 -- example/C/src/MQTT/include/net_utils.cmake | 1 - .../C/src/MQTT/include/paho-extension.cmake | 49 -- .../C/src/Patterns/Chain_01_SendReceive.lf | 15 - example/C/src/Patterns/Chain_02_Pipeline.lf | 32 -- .../Patterns/FullyConnected_00_Broadcast.lf | 41 -- .../Patterns/FullyConnected_01_Addressable.lf | 44 -- example/C/src/Patterns/Loop_01_Single.lf | 20 - example/C/src/Patterns/Loop_02_SingleDelay.lf | 24 - example/C/src/Patterns/README.md | 5 - .../C/src/Patterns/lib/SendersAndReceivers.lf | 205 -------- example/C/src/Patterns/lib/TakeTime.lf | 44 -- .../ProtocolBuffers/HelloProtocolBuffers.lf | 70 --- .../C/src/ProtocolBuffers/hello_string.proto | 5 - example/C/src/ROS/BasicROS.lf | 169 ------- example/C/src/ROS/PTIDES-ROS.lf | 175 ------- example/C/src/ROS/README.md | 21 - example/C/src/ROS/ROSBuiltInSerialization.lf | 68 --- example/C/src/ROS/ROSSerialization.lf | 96 ---- example/C/src/ROS/build-ROS-node.sh | 9 - .../C/src/ROS/include/CMakeListsExtension.txt | 9 - example/C/src/ReflexGame.lf | 137 ------ example/C/src/ReflexGame/ReflexGameTest.lf | 48 -- example/C/src/Rhythm/CMakeLists.txt | 63 --- example/C/src/Rhythm/PlayWaveform.lf | 114 ----- example/C/src/Rhythm/Rhythm.lf | 325 ------------- example/C/src/Rhythm/RhythmDistributed.lf | 69 --- example/C/src/Rhythm/RhythmDistributedNoUI.lf | 76 --- example/C/src/Rhythm/SensorSimulator.lf | 40 -- example/C/src/Rhythm/compile.sh | 52 --- .../C/src/Rhythm/include/mlib-extension.cmake | 3 - .../Rhythm/include/ncurses-extension.cmake | 3 - example/C/src/Rhythm/sounds/Bass-Drum-1.wav | Bin 221080 -> 0 bytes example/C/src/Rhythm/sounds/Claves.wav | Bin 202986 -> 0 bytes example/C/src/Rhythm/sounds/Cowbell-1.wav | Bin 14446 -> 0 bytes example/C/src/Rhythm/sounds/Cuica-1.wav | Bin 74794 -> 0 bytes .../src/Rhythm/sounds/Ensoniq-ESQ-1-Snare.wav | Bin 29102 -> 0 bytes example/C/src/Rhythm/sounds/Floor-Tom-1.wav | Bin 140120 -> 0 bytes example/C/src/Rhythm/sounds/Guiro.wav | Bin 67700 -> 0 bytes example/C/src/Rhythm/sounds/Hi-Bongo.wav | Bin 41204 -> 0 bytes example/C/src/Rhythm/sounds/High-Conga-1.wav | Bin 62846 -> 0 bytes example/C/src/RockPaperScissors.lf | 55 --- example/C/src/SleepingBarber.lf | 315 ------------- example/C/src/Smokers.lf | 158 ------- example/C/src/TrainDoor/TrainDoor.lf | 113 ----- .../C/src/TrainDoor/TrainDoorAsymmetric.lf | 49 -- example/C/src/TrainDoor/TrainDoorSimplest.lf | 39 -- .../C/src/TrainDoor/TrainDoorWithDeadlines.lf | 66 --- .../TrainDoor/TrainDoorWithDoorOpenState.lf | 56 --- example/C/src/TrainDoor/TrainDoorWithOpen.lf | 52 --- example/Cpp/src/AlarmClock/AlarmClock.cmake | 9 - example/Cpp/src/AlarmClock/AlarmClock.lf | 40 -- example/Cpp/src/AlarmClock/Clock.lf | 206 -------- example/Cpp/src/AlarmClock/Network.lf | 225 --------- example/Cpp/src/AlarmClock/README.md | 171 ------- example/Cpp/src/AlarmClock/derivation.nix | 110 ----- example/Cpp/src/AlarmClock/flake.nix | 15 - example/Cpp/src/AlarmClock/images/clock.png | Bin 18704 -> 0 bytes .../src/AlarmClock/images/entire_program.png | Bin 56985 -> 0 bytes example/Cpp/src/AlarmClock/images/trigger.png | Bin 4745 -> 0 bytes example/Cpp/src/AlarmClock/shared_header.hpp | 34 -- example/Cpp/src/CarBrake/CarBrake.lf | 92 ---- example/Cpp/src/CarBrake/CarBrake2.lf | 112 ----- example/Cpp/src/CarBrake/README.md | 19 - example/Cpp/src/CarBrake/threads.cmake | 2 - .../Patterns/FullyConnected_00_Broadcast.lf | 38 -- .../Patterns/FullyConnected_01_Addressable.lf | 40 -- .../Patterns/MatrixConnectedRowsAndColumns.lf | 75 --- example/Cpp/src/ROS/MinimalPublisher.lf | 31 -- example/Cpp/src/ROS/MinimalSubscriber.lf | 32 -- example/Cpp/src/ROS/README.md | 5 - example/Cpp/src/ReflexGame/ReflexGame.cmake | 2 - example/Cpp/src/ReflexGame/ReflexGame.lf | 137 ------ .../DoubleUnlock/DoubleUnlockDemo.lf | 200 -------- .../src/DigitalTwin/DoubleUnlock/README.md | 6 - .../src/DigitalTwin/DoubleUnlock/Simulator.lf | 63 --- .../src/DigitalTwin/DoubleUnlock/run_fob.sh | 3 - .../src/DigitalTwin/DoubleUnlock/run_rti.sh | 1 - .../DigitalTwin/DoubleUnlock/run_simulator.sh | 3 - .../src/DigitalTwin/DoubleUnlock/run_twin.sh | 3 - .../src/DigitalTwin/KeyFob/KeyFobDemo.lf | 127 ----- .../Python/src/DigitalTwin/KeyFob/README.md | 91 ---- .../src/DigitalTwin/KeyFob/dev/README.md | 111 ----- .../KeyFob/scripts/cloud/cleanup.sh | 19 - .../KeyFob/scripts/cloud/run_local_copy.sh | 29 -- .../DigitalTwin/KeyFob/scripts/cloud/setup.sh | 70 --- .../KeyFob/scripts/local/run_fob.sh | 2 - .../KeyFob/scripts/local/run_rti.sh | 1 - .../KeyFob/scripts/local/run_twin.sh | 2 - example/Python/src/DigitalTwin/utils.py | 36 -- example/Python/src/Piano/Piano.lf | 228 --------- example/Python/src/Piano/README.md | 33 -- example/Python/src/Piano/gui.py | 243 ---------- example/Python/src/Piano/keys.png | Bin 26609 -> 0 bytes example/Python/src/ReflexGame/README.md | 14 - example/Python/src/ReflexGame/ReflexGame.lf | 184 -------- example/Python/src/ReflexGame/gui.py | 140 ------ example/Python/src/YOLOv5/README.md | 13 - example/Python/src/YOLOv5/YOLOv5_Webcam.lf | 211 --------- .../Python/src/YOLOv5/YOLOv5_Webcam_Timer.lf | 63 --- example/Python/src/YOLOv5/requirements.txt | 17 - example/README.md | 6 - example/Rust/src/CounterProgram.lf | 34 -- example/Rust/src/Snake/KeyboardEvents.lf | 61 --- example/Rust/src/Snake/README.md | 5 - example/Rust/src/Snake/Snake.lf | 143 ------ example/Rust/src/Snake/snakes.rs | 266 ----------- .../src/DistributedHelloWorld/HelloWorld.lf | 72 --- .../src/HTTPSRequestReactor/HTTPSRequest.lf | 34 -- .../src/HTTPServerReactor/HTTPServer.lf | 40 -- .../src/HTTPServerReactor/gcp/Dockerfile | 4 - .../src/HTTPServerReactor/gcp/README.md | 93 ---- 132 files changed, 9068 deletions(-) delete mode 100644 example/.gitignore delete mode 100644 example/C/src/Deadline.lf delete mode 100644 example/C/src/Delay.lf delete mode 100644 example/C/src/DistributedDatabase/FederatedDatabase.lf delete mode 100644 example/C/src/DistributedDatabase/ReplicatedDatabase.lf delete mode 100644 example/C/src/DistributedDatabase/ReplicatedDatabaseThree.lf delete mode 100644 example/C/src/DistributedHelloWorld/HelloWorld.lf delete mode 100644 example/C/src/DistributedHelloWorld/HelloWorldAfter.lf delete mode 100644 example/C/src/DistributedHelloWorld/HelloWorldDecentralized.lf delete mode 100644 example/C/src/DistributedHelloWorld/HelloWorldDecentralizedSTP.lf delete mode 100644 example/C/src/DistributedHelloWorld/HelloWorldPhysical.lf delete mode 100644 example/C/src/DistributedHelloWorld/HelloWorldPhysicalAfter.lf delete mode 100644 example/C/src/DistributedHelloWorld/docker/HelloWorldContainerized.lf delete mode 100644 example/C/src/DistributedHelloWorld/docker/README.md delete mode 100644 example/C/src/DistributedResourceManagement/FederatedResourceManagement.lf delete mode 100644 example/C/src/DistributedResourceManagement/ResourceManagement.lf delete mode 100644 example/C/src/MQTT/MQTTDistributed.lf delete mode 100644 example/C/src/MQTT/MQTTPhysical.lf delete mode 100644 example/C/src/MQTT/MQTTPublisher.lf delete mode 100644 example/C/src/MQTT/MQTTSubscriber.lf delete mode 100644 example/C/src/MQTT/include/mosquitto-extension.cmake delete mode 100644 example/C/src/MQTT/include/net_utils.cmake delete mode 100644 example/C/src/MQTT/include/paho-extension.cmake delete mode 100644 example/C/src/Patterns/Chain_01_SendReceive.lf delete mode 100644 example/C/src/Patterns/Chain_02_Pipeline.lf delete mode 100644 example/C/src/Patterns/FullyConnected_00_Broadcast.lf delete mode 100644 example/C/src/Patterns/FullyConnected_01_Addressable.lf delete mode 100644 example/C/src/Patterns/Loop_01_Single.lf delete mode 100644 example/C/src/Patterns/Loop_02_SingleDelay.lf delete mode 100644 example/C/src/Patterns/README.md delete mode 100644 example/C/src/Patterns/lib/SendersAndReceivers.lf delete mode 100644 example/C/src/Patterns/lib/TakeTime.lf delete mode 100644 example/C/src/ProtocolBuffers/HelloProtocolBuffers.lf delete mode 100644 example/C/src/ProtocolBuffers/hello_string.proto delete mode 100644 example/C/src/ROS/BasicROS.lf delete mode 100644 example/C/src/ROS/PTIDES-ROS.lf delete mode 100644 example/C/src/ROS/README.md delete mode 100644 example/C/src/ROS/ROSBuiltInSerialization.lf delete mode 100644 example/C/src/ROS/ROSSerialization.lf delete mode 100755 example/C/src/ROS/build-ROS-node.sh delete mode 100644 example/C/src/ROS/include/CMakeListsExtension.txt delete mode 100644 example/C/src/ReflexGame.lf delete mode 100644 example/C/src/ReflexGame/ReflexGameTest.lf delete mode 100644 example/C/src/Rhythm/CMakeLists.txt delete mode 100644 example/C/src/Rhythm/PlayWaveform.lf delete mode 100644 example/C/src/Rhythm/Rhythm.lf delete mode 100644 example/C/src/Rhythm/RhythmDistributed.lf delete mode 100644 example/C/src/Rhythm/RhythmDistributedNoUI.lf delete mode 100644 example/C/src/Rhythm/SensorSimulator.lf delete mode 100755 example/C/src/Rhythm/compile.sh delete mode 100644 example/C/src/Rhythm/include/mlib-extension.cmake delete mode 100644 example/C/src/Rhythm/include/ncurses-extension.cmake delete mode 100644 example/C/src/Rhythm/sounds/Bass-Drum-1.wav delete mode 100644 example/C/src/Rhythm/sounds/Claves.wav delete mode 100644 example/C/src/Rhythm/sounds/Cowbell-1.wav delete mode 100644 example/C/src/Rhythm/sounds/Cuica-1.wav delete mode 100644 example/C/src/Rhythm/sounds/Ensoniq-ESQ-1-Snare.wav delete mode 100644 example/C/src/Rhythm/sounds/Floor-Tom-1.wav delete mode 100644 example/C/src/Rhythm/sounds/Guiro.wav delete mode 100644 example/C/src/Rhythm/sounds/Hi-Bongo.wav delete mode 100644 example/C/src/Rhythm/sounds/High-Conga-1.wav delete mode 100644 example/C/src/RockPaperScissors.lf delete mode 100644 example/C/src/SleepingBarber.lf delete mode 100644 example/C/src/Smokers.lf delete mode 100644 example/C/src/TrainDoor/TrainDoor.lf delete mode 100644 example/C/src/TrainDoor/TrainDoorAsymmetric.lf delete mode 100644 example/C/src/TrainDoor/TrainDoorSimplest.lf delete mode 100644 example/C/src/TrainDoor/TrainDoorWithDeadlines.lf delete mode 100644 example/C/src/TrainDoor/TrainDoorWithDoorOpenState.lf delete mode 100644 example/C/src/TrainDoor/TrainDoorWithOpen.lf delete mode 100644 example/Cpp/src/AlarmClock/AlarmClock.cmake delete mode 100644 example/Cpp/src/AlarmClock/AlarmClock.lf delete mode 100644 example/Cpp/src/AlarmClock/Clock.lf delete mode 100644 example/Cpp/src/AlarmClock/Network.lf delete mode 100644 example/Cpp/src/AlarmClock/README.md delete mode 100644 example/Cpp/src/AlarmClock/derivation.nix delete mode 100644 example/Cpp/src/AlarmClock/flake.nix delete mode 100755 example/Cpp/src/AlarmClock/images/clock.png delete mode 100755 example/Cpp/src/AlarmClock/images/entire_program.png delete mode 100755 example/Cpp/src/AlarmClock/images/trigger.png delete mode 100644 example/Cpp/src/AlarmClock/shared_header.hpp delete mode 100644 example/Cpp/src/CarBrake/CarBrake.lf delete mode 100644 example/Cpp/src/CarBrake/CarBrake2.lf delete mode 100644 example/Cpp/src/CarBrake/README.md delete mode 100644 example/Cpp/src/CarBrake/threads.cmake delete mode 100644 example/Cpp/src/Patterns/FullyConnected_00_Broadcast.lf delete mode 100644 example/Cpp/src/Patterns/FullyConnected_01_Addressable.lf delete mode 100644 example/Cpp/src/Patterns/MatrixConnectedRowsAndColumns.lf delete mode 100644 example/Cpp/src/ROS/MinimalPublisher.lf delete mode 100644 example/Cpp/src/ROS/MinimalSubscriber.lf delete mode 100644 example/Cpp/src/ROS/README.md delete mode 100644 example/Cpp/src/ReflexGame/ReflexGame.cmake delete mode 100644 example/Cpp/src/ReflexGame/ReflexGame.lf delete mode 100644 example/Python/src/DigitalTwin/DoubleUnlock/DoubleUnlockDemo.lf delete mode 100644 example/Python/src/DigitalTwin/DoubleUnlock/README.md delete mode 100644 example/Python/src/DigitalTwin/DoubleUnlock/Simulator.lf delete mode 100755 example/Python/src/DigitalTwin/DoubleUnlock/run_fob.sh delete mode 100755 example/Python/src/DigitalTwin/DoubleUnlock/run_rti.sh delete mode 100755 example/Python/src/DigitalTwin/DoubleUnlock/run_simulator.sh delete mode 100755 example/Python/src/DigitalTwin/DoubleUnlock/run_twin.sh delete mode 100644 example/Python/src/DigitalTwin/KeyFob/KeyFobDemo.lf delete mode 100644 example/Python/src/DigitalTwin/KeyFob/README.md delete mode 100644 example/Python/src/DigitalTwin/KeyFob/dev/README.md delete mode 100755 example/Python/src/DigitalTwin/KeyFob/scripts/cloud/cleanup.sh delete mode 100755 example/Python/src/DigitalTwin/KeyFob/scripts/cloud/run_local_copy.sh delete mode 100755 example/Python/src/DigitalTwin/KeyFob/scripts/cloud/setup.sh delete mode 100755 example/Python/src/DigitalTwin/KeyFob/scripts/local/run_fob.sh delete mode 100755 example/Python/src/DigitalTwin/KeyFob/scripts/local/run_rti.sh delete mode 100755 example/Python/src/DigitalTwin/KeyFob/scripts/local/run_twin.sh delete mode 100644 example/Python/src/DigitalTwin/utils.py delete mode 100644 example/Python/src/Piano/Piano.lf delete mode 100644 example/Python/src/Piano/README.md delete mode 100644 example/Python/src/Piano/gui.py delete mode 100644 example/Python/src/Piano/keys.png delete mode 100644 example/Python/src/ReflexGame/README.md delete mode 100644 example/Python/src/ReflexGame/ReflexGame.lf delete mode 100644 example/Python/src/ReflexGame/gui.py delete mode 100644 example/Python/src/YOLOv5/README.md delete mode 100644 example/Python/src/YOLOv5/YOLOv5_Webcam.lf delete mode 100644 example/Python/src/YOLOv5/YOLOv5_Webcam_Timer.lf delete mode 100644 example/Python/src/YOLOv5/requirements.txt delete mode 100644 example/README.md delete mode 100644 example/Rust/src/CounterProgram.lf delete mode 100644 example/Rust/src/Snake/KeyboardEvents.lf delete mode 100644 example/Rust/src/Snake/README.md delete mode 100644 example/Rust/src/Snake/Snake.lf delete mode 100644 example/Rust/src/Snake/snakes.rs delete mode 100644 example/TypeScript/src/DistributedHelloWorld/HelloWorld.lf delete mode 100644 example/TypeScript/src/HTTPSRequestReactor/HTTPSRequest.lf delete mode 100644 example/TypeScript/src/HTTPServerReactor/HTTPServer.lf delete mode 100644 example/TypeScript/src/HTTPServerReactor/gcp/Dockerfile delete mode 100644 example/TypeScript/src/HTTPServerReactor/gcp/README.md diff --git a/example/.gitignore b/example/.gitignore deleted file mode 100644 index f842b2dff2..0000000000 --- a/example/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -*.class -*.xml_gen -*._trace -/*/bin/ -/*/build/ -/*/test-bin/ -/*/src-gen/ -my_trace -include -lib -share diff --git a/example/C/src/Deadline.lf b/example/C/src/Deadline.lf deleted file mode 100644 index 0256020612..0000000000 --- a/example/C/src/Deadline.lf +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Example that demonstrates the detection of deadline misses. - * This program models a sensor, some work done on the sensor - * data, and an actuator with a deadline. The sensor is your - * keyboard Return or Enter button. The work that is done - * is simulated every second time to take more than 500 microseconds - * (by sleeping for 500 usecs). Hence, you should see that - * deadline is missed every second time you hit Return. - * - * @author Edward A. Lee - */ -target C { - keepalive: true -}; -preamble {= - #include - =} -reactor Sensor { - preamble {= - void* read_input(void* response) { - int c; - while(1) { - while((c = getchar()) != '\n') { - if (c == EOF) { - request_stop(); - break; - } - } - schedule(response, 0); - if (c == EOF) { - break; - } - } - return NULL; - } - =} - - physical action response; - output y:bool; - - reaction(startup) -> response {= - lf_thread_t thread_id; - lf_thread_create(&thread_id, &read_input, response); - printf("Press Enter to produce a sensor value.\n"); - =} - - reaction(response) -> y {= - printf("Reacting to physical action at %lld\n", get_elapsed_logical_time()); - SET(y, true); - =} -} - -reactor Analysis { - input x:bool; - output y:bool; - state do_work:bool(false); - reaction(x) -> y {= - if (self->do_work) { - printf("Working for 500 msecs...\n"); - usleep(500); - } else { - printf("Skipping work!\n"); - } - self->do_work = !self->do_work; - SET(y, true); - =} -} - -reactor Actuator { - input x:bool; - reaction(x) {= - instant_t l = get_elapsed_logical_time(); - instant_t p = get_elapsed_physical_time(); - printf("Actuating... Logical time: %lld " - "Physical time: %lld Lag: %lld\n", - l, p, p-l); - =} deadline(500 usecs) {= - instant_t d = get_elapsed_physical_time() - - get_elapsed_logical_time(); - printf("Deadline missed! Lag: %lld " - "(too late by %lld nsecs)\n", - d, d-500000); - =} -} - -main reactor { - sense = new Sensor(); - analyze = new Analysis(); - actuate = new Actuator(); - sense.y -> analyze.x; - analyze.y -> actuate.x; -} diff --git a/example/C/src/Delay.lf b/example/C/src/Delay.lf deleted file mode 100644 index cb577eb013..0000000000 --- a/example/C/src/Delay.lf +++ /dev/null @@ -1,62 +0,0 @@ -/** - * This (rather trivial) example illustrates a logical action used - * to model a delay. The delay is also realized a second time - * using the `after` keyword. - * - * @author Marten Lohstroh - * @author Edward A. Lee - */ -target C {timeout: 1 sec}; - -main reactor { - ramp = new Ramp(); - delay = new Delay2(); - print = new Print(); - ramp.y -> delay.x; - delay.y -> print.x; - - ramp2 = new Ramp(); - print2 = new Print(); - ramp2.y -> print2.x after 50 msec; -} - -/** - * Generate a counting sequence with outputs every 100 msec. - */ -reactor Ramp { - timer t(0, 100 msec); - output y:int; - state count:int(0); - reaction(t) -> y {= - SET(y, self->count); - self->count++; - =} -} - -/** - * Realize a logical delay of 50 msec. - */ -reactor Delay2 { - logical action a(50 msec):int; - input x:int; - output y:int; - reaction(a) -> y {= - SET(y, a->value); - =} - reaction(x) -> a {= - schedule_int(a, 0, x->value); - =} -} - -/** - * Print the (elapsed) logical and physical times at which inputs are received. - */ -reactor Print { - input x:int; - reaction(x) {= - printf("Logical time: %lld, Physical time %lld" - ", Value: %d\n", - get_elapsed_logical_time(), - get_elapsed_physical_time(), x->value); - =} -} diff --git a/example/C/src/DistributedDatabase/FederatedDatabase.lf b/example/C/src/DistributedDatabase/FederatedDatabase.lf deleted file mode 100644 index 2e6a562626..0000000000 --- a/example/C/src/DistributedDatabase/FederatedDatabase.lf +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Federated version of ReplicatedDatabase. - * This is identical, except that it is federated. - * - * @author Edward A. Lee - * @author Soroush Bateni - */ -target C { - timeout: 5 sec, - coordination: centralized -} - -import Platform from "ReplicatedDatabase.lf" - -federated reactor ( - query_period:time(1 sec), - num_remote_inputs:int(1) -) { - a = new Platform( - query_period = query_period, - update_period = 5 sec, - update_amount = 100, - name = "San Francisco", - num_remote_inputs = num_remote_inputs); - b = new Platform( - query_period = query_period, - update_period = 1 sec, - update_amount = -20, - name = "Berkeley", - num_remote_inputs = num_remote_inputs); - b.publish -> a.update; - a.publish -> b.update; -} diff --git a/example/C/src/DistributedDatabase/ReplicatedDatabase.lf b/example/C/src/DistributedDatabase/ReplicatedDatabase.lf deleted file mode 100644 index 49cae5fd3f..0000000000 --- a/example/C/src/DistributedDatabase/ReplicatedDatabase.lf +++ /dev/null @@ -1,256 +0,0 @@ -/** - * Test program illustrating the architecture of a replicated distributed - * database. This models a simple banking system that maintains a single - * balance in multiple locations. Deposits and withdrawals (updates) can - * be performed at any of the locations. In the model, these updates - * are performed by a "Server" model emulating a web server. The server - * also periodically queries for the balance. All locations are required - * to report the same balance given the same time-stamped query. - * - * If the two servers simultaneously update the record, then both updates - * are applied. Any query at the time of these updates is required to - * report the result after both updates have been performed. - * - * @author Edward A. Lee - * @author Soroush Bateni - */ -target C { - timeout: 5 sec -} - -main reactor ( - query_period:time(1 sec), - num_remote_inputs:int(1) -) { - a = new Platform( - query_period = query_period, - update_period = 5 sec, - update_amount = 100, - name = "San Francisco", - num_remote_inputs = num_remote_inputs); - b = new Platform( - query_period = query_period, - update_period = 1 sec, - update_amount = -20, - name = "Berkeley", - num_remote_inputs = num_remote_inputs); - b.publish -> a.update; - a.publish -> b.update; -} - -/** - * Mockup for a web server that issues deposits or withdrawals - * as well as periodic queries for the balance in the database. - * The queries and updates are issued periodically with the period - * and amount of the update controlled by parameters. - * In a real server, these outputs would not be periodic, but - * rather would be triggered by external events, such as incoming - * HTTP requests. - * - * This reactor expects a reply to each query. It prints those - * replies. It produces an error in its shutdown reaction if - * the number of replies does not match the number of queries. - * - * @param query_period The period of query outputs. - * @param update_period The period of update outputs. - * @param update_amount The amount of each deposit (or withdrawal if negative). - * @param server_name The name (for reporting). - * - * @input reply Accepts the reply to a query for the balance. - * - * @output query Issue a query, expecting a reply. - * @output update Issue an update. - */ -reactor Server( - name:char*("unnamed server"), - query_period:time(150 msec), - update_period:time(100 msec), - update_deadline:time(200 msec), - update_amount:int(0), - server_name:char*("unnamed server") -) { - timer query_trigger(0, query_period); - timer update_trigger(0, update_period); - input reply:int; - output query:bool; - output update:int; - state queries_outstanding:int(0); - reaction(query_trigger) -> query {= - SET(query, true); - self->queries_outstanding++; - =} - - reaction(update_trigger) -> update {= - SET(update, self->update_amount); - =} deadline(update_deadline) {= - error_print("At tag (%lld, %u), deadline missed at database \"%s\". Rejecting update.\n" - " Elapsed physical time is %lld.", - get_logical_time() - start_time, - get_microstep(), - self->name, - get_elapsed_physical_time() - ); - =} - - reaction(reply) {= - info_print("***** At tag (%lld, %u), server \"%s\" reports balance: %d.", - get_elapsed_logical_time(), get_microstep(), self->server_name, reply->value - ); - self->queries_outstanding--; - =} - - reaction(shutdown) {= - if (self->queries_outstanding != 0) { - error_print("Server \"%s\": Number of queries with no reply: %d.", - self->server_name, - self->queries_outstanding - ); - } else { - info_print("Server \"%s\" successfully replied to all queries.", - self->server_name - ); - } - =} -} - -/** - * A mockup for a replicated database. This simple database contains - * only one record, and the value of that record is an integer. - * It represents a bank balance, where deposits and withdrawals - * (updates) can occur at any node in the system. - * If two or more updates occur at the same logical time, then all - * are applied. - * - * This reactor has two update inputs, `local_update` and `remote_update`. - * The first is intended to be used for updates to the database that are - * generated on the local platform. The second receives notifications - * of updates on remote platforms. When a `local_update` is received, - * the update will also be sent to the `publish` output so that it can - * be forwarded to other replicas. When any `remote_update` input arrives, - * its value will be added to the balance. - * - * The `query` input is used to retrieve the current balance. The - * balance will be sent to the `balance` output in response. - * If a `query` and an update arrive simultaneously, the reply - * will include the cumulative effect of all the updates. - * - * Instances of these `Database` reactors can be arranged in ring - * or in a broadcast configuration, where each replica sends updates to - * all other replicas. - * - * There is a deadline on the `local_update` inputs. If this deadline is - * violated, then the update is rejected and has no effect on the balance. - * - * @param update_deadline A deadline imposed on the reaction to `local_update` inputs. - * @param name A name for the database instance (used in reporting). - * @param num_remote_inputs The number of inputs from other database replicas. - * - * @input local_update An update (deposit or withdrawal) to add to the record. - * @input remote_update A multiport input for receiving updates from other replicas. - * @input query A trigger to read the current value of the record. - * - * @output publish This is just the update passed through. - * @output balance The time value of the record. - */ -reactor Database( - name:char*("unnamed database"), - num_remote_inputs:int(1) -) { - input local_update:int; - input[num_remote_inputs] remote_update:int; - input query:bool; - output balance:int; - state record:int(0); - - reaction(local_update, remote_update) {= - if (local_update->is_present) { - self->record += local_update->value; - } - for (int i = 0; i < remote_update_width; i++) { - if (remote_update[i]->is_present) { - self->record += remote_update[i]->value; - } - } - info_print("At tag (%lld, %u), database \"%s\" updated balance to %d.\n" - " Elapsed physical time is %lld.", - get_logical_time() - start_time, get_microstep(), - self->name, - self->record, - get_elapsed_physical_time() - ); - =} STP (4 msec) {= -#ifdef FEDERATED_DECENTRALIZED - for (int i = 0; i < remote_update_width; i++) { - if (remote_update[i]->is_present) { - warning_print("At tag (%lld, %u), database \"%s\" " - "received remote update (%d) with intended tag (%lld, %u).\n" - " Balance previously reported may have been incorrect.\n" - " Elapsed physical time is %lld.", - current_tag.time - start_time, - current_tag.microstep, - self->name, - remote_update[i]->value, - remote_update[i]->intended_tag.time - start_time, - remote_update[i]->intended_tag.microstep, - get_elapsed_physical_time() - ); - self->record += remote_update[i]->value; - } - } -#else - // The tardy handler should not be invoked - error_print_and_exit("FATAL: Update is tardy and coordination is not decentralized."); -#endif - =} - - reaction(query) -> balance {= - SET(balance, self->record); - =} -} - -/** - * A mockup of a platform (e.g. a pod, a virtual machine, a physical - * machine, etc.) that hosts a replicated database and a web server. - * The platform performs local updates and accepts remote updates. - * Instances of this platform can be arranged in a ring or in a - * broadcast configuration, where each platform broadcasts updates - * to all other platforms. - * - * @param query_period The period at which the balance is queried. - * @param update_period The period at which local updates are generated. - * @param update_amount The amount of each local update. - * @param num_remote_inputs The number of remote inputs from other replicas. - * @param STP The safe-to-process offset (used only in decentralized coordination). - * @param name The name assigned to this platform (for reporting). - * - * @input update An update notification from another replica. - * - * @output publish A copy of any local updates. - */ -reactor Platform( - query_period:time(150 msec), - update_period:time(100 msec), - update_amount:int(0), - num_remote_inputs:int(1), - name:char*("unnamed platform") // Used for more visible logging -) { - input[num_remote_inputs] update:int; - output publish:int; - server = new Server( - name = name, - query_period = query_period, - update_period = update_period, - update_amount = update_amount, - server_name = name - ); - database = new Database( - name = name, - num_remote_inputs = num_remote_inputs - ); - server.query -> database.query; - server.update -> database.local_update; - database.balance -> server.reply; - server.update -> publish; - update -> database.remote_update; -} - diff --git a/example/C/src/DistributedDatabase/ReplicatedDatabaseThree.lf b/example/C/src/DistributedDatabase/ReplicatedDatabaseThree.lf deleted file mode 100644 index 9fc0e651f5..0000000000 --- a/example/C/src/DistributedDatabase/ReplicatedDatabaseThree.lf +++ /dev/null @@ -1,38 +0,0 @@ -/** - * A version of ReplicatedDatabase.lf with three replicas arranged in - * a broadcast pattern. - * @author Edward A. Lee - * @author Soroush Bateni - */ -target C { - timeout: 5 sec -} - -import Platform from "ReplicatedDatabase.lf" - -main reactor ( - query_period:time(1 sec), - num_remote_inputs:int(2) -) { - a = new Platform( - query_period = query_period, - update_period = 5 sec, - update_amount = 100, - name = "San Francisco", - num_remote_inputs = num_remote_inputs); - b = new Platform( - query_period = query_period, - update_period = 1 sec, - update_amount = -20, - name = "Berkeley", - num_remote_inputs = num_remote_inputs); - c = new Platform( - query_period = query_period, - update_period = 3 sec, - update_amount = 10, - name = "Berkeley", - num_remote_inputs = num_remote_inputs); - b.publish, c.publish -> a.update; - a.publish, c.publish -> b.update; - a.publish, b.publish -> c.update; -} diff --git a/example/C/src/DistributedHelloWorld/HelloWorld.lf b/example/C/src/DistributedHelloWorld/HelloWorld.lf deleted file mode 100644 index 98e252cd59..0000000000 --- a/example/C/src/DistributedHelloWorld/HelloWorld.lf +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Distributed LF program where a MessageGenerator creates a string - * message that is sent via the RTI (runtime infrastructure) to a - * receiver that prints the message. - * - * The code generator generates three programs: - * - * * bin/DistributedHelloWorld: A script that launches the other three - * programs on localhost. Run this program. - * - * * bin/DistrubtedHelloWorld_source: The program that produces the sequence - * of messages. - * - * * bin/DistrubtedHelloWorld_print: The program that produces the sequence - * of messages. - * - * To run this manually, you can start the RTI and then each of the last - * two programs. They will synchronize the start time and run for 10 seconds. - * - * Note: The RTI is a separate program that has to be installed separately. - * See https://github.com/lf-lang/reactor-c/tree/main/core/federated/RTI - * - * @author Edward A. Lee - */ -target C { - timeout: 10 secs -}; - -/** - * Reactor that generates a sequence of messages, one per second. - * The message will be a string consisting of a prefix string followed - * by a count. - * @param prefix The prefix string. - * @output message The message. - */ -reactor MessageGenerator(prefix:string("")) { - // Output type char* instead of string is used for dynamically - // allocated character arrays (as opposed to static constant strings). - output message:char*; - state count:int(1); - // Send first message after 1 sec so that the startup reactions - // do not factor into the transport time measurement on the first message. - timer t(1 sec, 1 sec); - reaction(t) -> message {= - // With NULL, 0 arguments, snprintf tells us how many bytes are needed. - // Add one for the null terminator. - int length = snprintf(NULL, 0, "%s %d", self->prefix, self->count) + 1; - // Dynamically allocate memory for the output. - SET_NEW_ARRAY(message, length); - // Populate the output string and increment the count. - snprintf(message->value, length, "%s %d", self->prefix, self->count++); - - tag_t tag = get_current_tag(); - info_print("At (elapsed) logical tag (%lld, %u), source sends message: %s", - tag.time - start_time, tag.microstep, - message->value - ); - =} -} - -/** - * Reactor that prints the current tag and an incoming string. - * - * @input message The message. - */ -reactor PrintMessage { - input message:char*; - reaction(message) {= - tag_t tag = get_current_tag(); - info_print("At (elapsed) logical tag (%lld, %u), print receives: %s", - tag.time - start_time, tag.microstep, - message->value - ); - =} -} - -federated reactor HelloWorld { - source = new MessageGenerator(prefix = "Hello World"); - print = new PrintMessage(); - source.message -> print.message; -} \ No newline at end of file diff --git a/example/C/src/DistributedHelloWorld/HelloWorldAfter.lf b/example/C/src/DistributedHelloWorld/HelloWorldAfter.lf deleted file mode 100644 index 7ddb437fbf..0000000000 --- a/example/C/src/DistributedHelloWorld/HelloWorldAfter.lf +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Version of HelloWorld with an `after` on the connection. - * The after value on the connection gives a logical time offset - * between the sender and the receiver. - * - * @author Edward A. Lee - */ -target C { - timeout: 10 secs -}; -import MessageGenerator from "HelloWorld.lf" -import PrintMessage from "HelloWorld.lf" - -federated reactor HelloWorldAfter { - source = new MessageGenerator(prefix = "Hello World"); - print = new PrintMessage(); - source.message -> print.message after 10 msec; -} \ No newline at end of file diff --git a/example/C/src/DistributedHelloWorld/HelloWorldDecentralized.lf b/example/C/src/DistributedHelloWorld/HelloWorldDecentralized.lf deleted file mode 100644 index e6d67c5ff1..0000000000 --- a/example/C/src/DistributedHelloWorld/HelloWorldDecentralized.lf +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Version of HelloWorld that uses decentralized coordination. - * The `offset` parameter at the top level specifies an `after` delay to - * use on the connection. If this delay is too small, then the `print` - * receiving federate will report tardy messages, which are messages where - * the intended timestamp cannot be assigned because the message arrived - * too late. - * - * If the sender and receiver are running in the same machine - * then there is no clock synchronization error and the communication latency - * should be well less than 10msec, so an `offset` of 10 msec should be plenty - * adequate to avoid any tardy messages. If you change the offset to - * 10 usec, then tardy messages will likely occur, unless, on your machine, - * communication between two processes can reliably occur within 10 microseconds. - * - * @author Edward A. Lee - */ -target C { - timeout: 10 secs, - coordination: decentralized -}; -import MessageGenerator from "HelloWorld.lf" -import PrintMessage from "HelloWorld.lf" - -reactor PrintMessageWithDetector(offset:time(10 msec)) extends PrintMessage { - // The timer here creates a worst-case scenario where the receiving - // federate has an event to process whose timestamp matches that of an - // incoming message. Without this timer, you will not see any tardy - // messages because the `print` reactor has no reason to advance its - // logical time, and hence any incoming intended tag can be handled. - timer local(offset, 1 sec); - reaction (message) {= - // Empty. The base class will react and report the incoming message. - =} STP(0) {= - warning_print("Message is tardy. Intended tag is (%lld, %u).", - message->intended_tag.time - start_time, message->intended_tag.microstep - ); - =} - reaction(local) {= - tag_t tag = get_current_tag(); - info_print("Timer triggered at logical tag (%lld, %u).", - tag.time - start_time, tag.microstep - ); - =} -} - -federated reactor HelloWorldDecentralized(offset:time(10 msec)) { - source = new MessageGenerator(prefix = "Hello World"); - print = new PrintMessageWithDetector( - offset = offset - ); - source.message -> print.message after offset; -} \ No newline at end of file diff --git a/example/C/src/DistributedHelloWorld/HelloWorldDecentralizedSTP.lf b/example/C/src/DistributedHelloWorld/HelloWorldDecentralizedSTP.lf deleted file mode 100644 index 41b3649b8f..0000000000 --- a/example/C/src/DistributedHelloWorld/HelloWorldDecentralizedSTP.lf +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Version of HelloWorldDecentralized that uses decentralized - * coordination with an STP (safe to process) offset instead of an `after` - * delay. In this version, the timestamps at the receiving federate `print` - * are the same as the timestamps at the sender `source`. - * - * The `STP_offset` parameter on the `print` federate tells the runtime - * system to wait the amount of time specified before processing events. - * That is, before processing an event with timestamp *t*, the federate - * waits until physical time *T* exceeds *t* + `STP`. - * - * If the `STP_offset` is too small, then the `print` - * receiving federate will report tardy messages, which are messages where - * the intended timestamp cannot be assigned because the message arrived - * too late. - * - * If the sender and receiver are running in the same machine - * then there is no clock synchronization error and the communication latency - * should be well less than 10msec, so an `offset` of 10 msec should be plenty - * adequate to avoid any tardy messages. If you change the offset to - * 10 usec, then tardy messages will likely occur, unless, on your machine, - * communication between two processes can reliably occur within 10 microseconds. - * - * @author Edward A. Lee - */ -target C { - timeout: 10 secs, - coordination: decentralized -}; -import MessageGenerator from "HelloWorld.lf" -import PrintMessageWithDetector from "HelloWorldDecentralized.lf" - -/** - * Subclass that simply adds an `STP` parameter, nothing more. - */ -reactor PrintMessageWithSTP(STP_offset:time(10 msec)) extends PrintMessageWithDetector { - -} - -federated reactor { - source = new MessageGenerator(prefix = "Hello World"); - print = new PrintMessageWithSTP( - offset = 0, - STP_offset = 10 msec - ); - source.message -> print.message; -} \ No newline at end of file diff --git a/example/C/src/DistributedHelloWorld/HelloWorldPhysical.lf b/example/C/src/DistributedHelloWorld/HelloWorldPhysical.lf deleted file mode 100644 index 407dbf2e11..0000000000 --- a/example/C/src/DistributedHelloWorld/HelloWorldPhysical.lf +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Version of HelloWorld that uses a physical connection, - * indicated by ~>. - * - * The timestamp assigned at the receiving end depends on the value - * of the physical clock at the receiving end. The extend to which this - * disagrees with the timestamp at the sending end is a measure of the - * communication time between the processes. - * - * Note that with physical connections, messages go directly from one - * federate to another, not through the RTI as they normally would with - * logical connections and centralized control (the default). - * - * @author Edward A. Lee - */ -target C { - timeout: 10 secs -}; - -import MessageGenerator from "HelloWorld.lf" -import PrintMessage from "HelloWorld.lf" - -federated reactor HelloWorldPhysical { - source = new MessageGenerator(prefix = "Hello World"); - print = new PrintMessage(); - source.message ~> print.message; -} \ No newline at end of file diff --git a/example/C/src/DistributedHelloWorld/HelloWorldPhysicalAfter.lf b/example/C/src/DistributedHelloWorld/HelloWorldPhysicalAfter.lf deleted file mode 100644 index 7d659e4191..0000000000 --- a/example/C/src/DistributedHelloWorld/HelloWorldPhysicalAfter.lf +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Version of HelloWorldPhysical that uses a physical connection, - * indicated by ~>, with an `after` on the connection. - * - * The after value on the connection gives a logical time offset - * between the sender and the receiver. If the connection were not a physical one, - * indicated with ~>, then this logical time offset would simply be the logical - * time offset obtained. However, since it is a physical one, the offset between - * the timestamps is the the communication latency plus 10 msec. - * - * @author Edward A. Lee - */ -target C { - timeout: 10 secs -}; -import MessageGenerator from "HelloWorld.lf" -import PrintMessage from "HelloWorld.lf" - -federated reactor HelloWorldPhysicalAfter { - source = new MessageGenerator(prefix = "Hello World"); - print = new PrintMessage() at localhost; - source.message ~> print.message after 10 msec; -} \ No newline at end of file diff --git a/example/C/src/DistributedHelloWorld/docker/HelloWorldContainerized.lf b/example/C/src/DistributedHelloWorld/docker/HelloWorldContainerized.lf deleted file mode 100644 index 70161f6946..0000000000 --- a/example/C/src/DistributedHelloWorld/docker/HelloWorldContainerized.lf +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Containerized distributed LF program where a MessageGenerator creates a string - * message that is sent via the RTI (runtime infrastructure) to a - * receiver that prints the message. - * - * For run instructions, see README. - * - * @author Edward A. Lee - */ -target C { - timeout: 10 secs, - docker: true -}; - -import MessageGenerator from "../HelloWorld.lf" -import PrintMessage from "../HelloWorld.lf" - -federated reactor HelloWorldContainerized at rti { - source = new MessageGenerator(prefix = "Hello World"); - print = new PrintMessage(); - source.message -> print.message; -} \ No newline at end of file diff --git a/example/C/src/DistributedHelloWorld/docker/README.md b/example/C/src/DistributedHelloWorld/docker/README.md deleted file mode 100644 index 0d9bb582ca..0000000000 --- a/example/C/src/DistributedHelloWorld/docker/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# ContainerizedFederatedHelloWorld -This is a basic example showing containerized federated execution. - -For more details, see: [Containerized Execution in Lingua Franca](https://github.com/lf-lang/lingua-franca/wiki/Containerized-Execution) - -## Run instructions -Put HelloWorld.lf in a src directory. -Then, run: -```bash -lfc HelloWorldContainerized.lf -``` - -There would be 3 build messages, 1 for the RTI and 2 for the reactors, indicating where the docker file is generated, as well as the instruction to build the docker file. - -A message would look something like this: -``` -Dockerfile for written to / -##################################### -To build the docker image, use: - - docker build -t -f / - -##################################### -``` - -If you cannot find the build message for the RTI, try a clean build using: -```bash -lfc --clean HelloWorld.lf -``` - -Then, use the printed commands to build the 3 docker images. - -Set up a docker network using -```bash -docker network create lf -``` - -Open 3 terminals, 1 for the RTI and 1 for each reactor. - -Run the RTI: -```bash -docker run --rm -it --network=lf --name=rti rti -i 1 -n 2 -``` - -Run the two reactors: -```bash -docker run --rm -it --network=lf helloworldcontainerized_source -i 1 -``` -```bash -docker run --rm -it --network=lf helloworldcontainerized_print -i 1 -``` \ No newline at end of file diff --git a/example/C/src/DistributedResourceManagement/FederatedResourceManagement.lf b/example/C/src/DistributedResourceManagement/FederatedResourceManagement.lf deleted file mode 100644 index 0fdf2c0093..0000000000 --- a/example/C/src/DistributedResourceManagement/FederatedResourceManagement.lf +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Demo program illustrating the architecture of a distributed resource management - * problem like that described in: - * - * Lamport, L. (1984). "Using Time Instead of Timeout for Fault-Tolerant Distributed Systems." - * ACM Transactions on Programming Languages and Systems 6(2): 254-280. - * - * The goal is distributed first-come, first-served exclusive access to a shared - * resource. - * - * Each instance of Client is initially idle for a time given by its - * `idle_time` parameter. It then requests exclusive access to the resource by - * sending a `request` message to its local instance of ResourceManager. - * If the resource is available, then the ResourceManager immediately replies - * with a `grant` message. The Client will then hold the resource for an - * amount of time given by its `use_time` parameter, after which it will send - * a `release` message to the ResourceManager. If the resource is not available - * when the Client requests it, then the ResourceManager queues the request - * and sends the `grant` message when the resource becomes available. - * - * Each instance of ResourceManager maintains a copy of the queue of pending - * requests to the resource. The entries in the queue are ordered by tag - * (logical time and microstep) so that they will be granted using a first-come, - * first-served policy. If two requests are made simultaneously (with the same - * tag), then they will be granted access in order of their IDs. - * - * At all logical tags, every instance of ResourceManager should have exactly - * the same queue contents. Hence, at every tag, all ResourceManagers agree on - * which manager has access to the resource. It is the manager at the head of - * their queue. - * - * @author Edward A. Lee - */ -target C { - timeout: 1 sec -} - -import Platform from "ResourceManagement.lf" - -federated reactor FederatedResourceManagement( - num_other_resource_managers:int(1) -) { - // Each platform needs a unique id that is between 0 and QUEUE_SIZE-1. - a = new Platform( - idle_time = 50 msec, - use_time = 60 msec, - name = "San Francisco", - id = 0, - num_other_resource_managers = num_other_resource_managers); - b = new Platform( - idle_time = 200 msec, - use_time = 40 msec, - name = "Berkeley", - id = 1, - num_other_resource_managers = num_other_resource_managers); - b.request -> a.remote_request; - b.release -> a.remote_release; - a.request -> b.remote_request; - a.release -> b.remote_release; -} diff --git a/example/C/src/DistributedResourceManagement/ResourceManagement.lf b/example/C/src/DistributedResourceManagement/ResourceManagement.lf deleted file mode 100644 index 1053ad4c20..0000000000 --- a/example/C/src/DistributedResourceManagement/ResourceManagement.lf +++ /dev/null @@ -1,442 +0,0 @@ -/** - * Demo program illustrating the architecture of a distributed resource management - * problem like that described in: - * - * Lamport, L. (1984). "Using Time Instead of Timeout for Fault-Tolerant Distributed Systems." - * ACM Transactions on Programming Languages and Systems 6(2): 254-280. - * - * The goal is distributed first-come, first-served exclusive access to a shared - * resource. - * - * Each instance of Client is initially idle for a time given by its - * `idle_time` parameter. It then requests exclusive access to the resource by - * sending a `request` message to its local instance of ResourceManager. - * If the resource is available, then the ResourceManager immediately replies - * with a `grant` message. The Client will then hold the resource for an - * amount of time given by its `use_time` parameter, after which it will send - * a `release` message to the ResourceManager. If the resource is not available - * when the Client requests it, then the ResourceManager queues the request - * and sends the `grant` message when the resource becomes available. - * - * Each instance of ResourceManager maintains a copy of the queue of pending - * requests to the resource. The entries in the queue are ordered by tag - * (logical time and microstep) so that they will be granted using a first-come, - * first-served policy. If two requests are made simultaneously (with the same - * tag), then they will be granted access in order of their IDs. - * - * At all logical tags, every instance of ResourceManager should have exactly - * the same queue contents. Hence, at every tag, all ResourceManagers agree on - * which manager has access to the resource. It is the manager at the head of - * their queue. - * - * @author Edward A. Lee - */ -target C { - timeout: 1 sec -} - -/** - * Mockup for a client that requests for access to the resource. - * This client issues a `request` after `idle_time`. When it receives - * a `grant`, it waits an amount of time `use_time` and then issues - * a `release` output. - - * @param idle_time The time until the next `request`. - * @param use_time The time after a `grant` input before a `release` output. - * - * @input grant Accepts a reply that grants the resource. - * - * @output request Request access to the resource. - * @output update Release the resource. - */ -reactor Client( - idle_time:time(150 msec), - use_time:time(30 msec), - id:int(0), - name:char*("unnamed Client") // Used for more visible logging -) { - logical action request_trigger(idle_time); - logical action release_trigger(use_time); - - input grant:bool; - - output request:bool; - output release:bool; - - state requests_outstanding:int(0); - - reaction(startup, release_trigger) -> release, request_trigger {= - if (release_trigger->is_present) { - tag_t tag = get_current_tag(); - info_print("%s (ID %d): At tag (%lld, %u), released access.", - self->name, - self->id, - tag.time - start_time, tag.microstep - ); - SET(release, true); - } - schedule(request_trigger, 0); - =} - - reaction(request_trigger) -> request {= - tag_t tag = get_current_tag(); - info_print("%s (ID %d): At tag (%lld, %u), requesting access.", - self->name, - self->id, - tag.time - start_time, tag.microstep - ); - self->requests_outstanding++; - SET(request, true); - =} - - reaction (grant) -> release_trigger {= - tag_t tag = get_current_tag(); - info_print("%s (ID %d): At tag (%lld, %u), granted access.", - self->name, - self->id, - tag.time - start_time, tag.microstep - ); - self->requests_outstanding--; - schedule(release_trigger, 0); - =} - - reaction(shutdown) {= - info_print("%s (ID %d): Number of requests that were never granted: %d", - self->name, - self->id, - self->requests_outstanding - ); - =} -} - -/** - * A distributed resource manager that grants exclusive access to a shared resource - * to a local client. A local client requests and releases access to the resource - * through the `local_request` and `local_release` input ports. The `request` and - * `release` output ports must be connected to every other instance of this ResourceManager. - * The `remote_request` and `remote_release` input ports come from all other instances - * of this ResourceManager. - * - * The total number of other resource managers is required to match the - * `num_other_resource_managers` parameter, and each resource manager is - * required to have a unique `id` between 0 and `num_other_resource_managers`. - * A resource manager may also optionally have a `name`, which is used - * when reporting errors. - * - * @param name A name for the database instance (used in reporting). - * @param id A unique id between 0 and `num_other_resource_managers`. - * @param num_other_resource_managers The total number of other resource managers. - * - * @input local_request A local request for access to the resource. - * @input local_release Release the resource held locally. - * @input remote_request A multiport accepting remote requests. - * @input remote_release A multiport accepting remote releases. - * - * @output local_grant Grant the resource to the local client. - * @output request Broadcast requests to other resource managers. - * @output release Broadcast release to other resource managers. - */ -reactor ResourceManager( - name:char*("unnamed ResourceManager"), - id:int(0), - num_other_resource_managers:int(1) -) { - input local_request:bool; - input local_release:bool; - input[num_other_resource_managers] remote_request:int; - input[num_other_resource_managers] remote_release:int; - - output request:int; - output release:int; - output local_grant:bool; - - state queue:request_q_t; - - preamble {= - // Queue is a circular buffer. The tail variable points to the - // position to write to. - typedef struct request_q_t { - int* queue; - int head; - int tail; - int size; - int capacity; - } request_q_t; - - // Return the index of the next entry on the queue if there is one, - // and otherwise return -1. If the argument is negative, then this - // returns the first entry on the queue or -1 if the queue is empty. - // Otherwise, if the argument specifies the index of entry on the queue, - // return the index of the next entry or -1 if there is none. - // Otherwise, return -1. - // If the entry is non-negative by not on the queue at all, return -2. - int next_index(request_q_t* queue, int index) { - if (queue->size == 0) return -1; // Queue is empty. - if (index < 0) return queue->head; - index++; - if (index >= queue->capacity) { - index = 0; - } - if (index == queue->tail) return -1; // Reached the tail. - return index; - } - - // Push a value to the end of the queue unless the queue is full. - // Return -1 if the queue is full and 0 otherwise. - int push(request_q_t* queue, int entry) { - int next_tail = queue->tail + 1; - if (next_tail >= queue->capacity) { - next_tail = 0; - } - if (queue->size >= queue->capacity) { - // Queue is full. - warning_print("Queue is full. " - "Resource request from ID %d will be dropped.", - entry - ); - return -1; - } - queue->queue[queue->tail] = entry; - queue->tail = next_tail; - queue->size++; - return 0; - } - - // Pop a value from the head of the queue unless the queue is empty. - // Return the value in the argument, or if the argument is NULL, - // discard the value. Return 0 for success and -1 - // for failure (the queue is empty). - int pop(request_q_t* queue, int* result) { - if (queue->size == 0) return -1; // Queue is empty. - if (result != NULL) { - *result = queue->queue[queue->head]; - } - queue->head++; - if (queue->head >= queue->capacity) { - queue->head = 0; - } - queue->size--; - return 0; - } - - // Return 1 if the specified entry is on the specified queue - // and 0 otherwise. - int on_queue(request_q_t* queue, int entry) { - // Iterate over the queue to check. - int j = next_index(queue, -1); // Head of the queue or -1 if empty. - while (j >= 0) { - if (queue->queue[j] == entry) { - // The entry is on the queue. - return 1; - } - j = next_index(queue, j); - } - return 0; - } - =} - - reaction(startup) {= - self->queue.capacity = self->num_other_resource_managers + 1; - self->queue.queue = malloc(sizeof(int) * self->queue.capacity); - self->queue.head = 0; - self->queue.tail = 0; - self->queue.size = 0; - =} - - reaction(local_request) -> request {= - // Just forward the request. The determination of whether - // the request can be granted cannot be made until we have received - // any remote requests with the same tag. - SET(request, self->id); - =} - - reaction(local_release) -> release {= - if (self->queue.queue[self->queue.head] != self->id) { - warning_print("%s (ID %d): attempting to release the resource but " - "does not hold it.", - self->name, - self->id - ); - } else { - pop(&self->queue, NULL); - SET(release, self->id); - } - =} - - reaction(remote_release) -> local_grant {= - for (int i = 0; i < remote_release_width; i++) { - if (remote_release[i]->is_present) { - // NOTE: There should not be more than one resource release - // at any logical tag. - if (remote_release[i]->value != self->queue.queue[self->queue.head]) { - warning_print("%s: Received release from manager %d, but that " - "manager does not hold the resource. Ignoring the release.", - self->name, - remote_release[i]->value - ); - } else { - pop(&self->queue, NULL); - if (self->queue.head != self->queue.tail - && self->queue.queue[self->queue.head] == self->id - ) { - // Next request on the queue is me! - SET(local_grant, true); - } - // Since there shouldn't be more than one request, return now. - return; - } - } - } - =} - - reaction(local_request, remote_request) -> local_grant {= - int local = -1; // -1 indicates there is no local request. - if (local_request->is_present) { - // If the local node is already on the request queue, ignore the request. - if (on_queue(&self->queue, self->id)) { - // (this should not happen). - warning_print("%s: Redundant resource request. " - "My manager ID %d is already on the queue.", - self->name, - self->id - ); - } else { - local = self->id; - } - } - for (int i = 0; i < remote_request_width; i++) { - // NOTE: Resource managers must be connected to other - // resource managers all in the same order so that they - // agree on the order in which simultaneous requests will - // be handled. - if (remote_request[i]->is_present) { - int id = remote_request[i]->value; - // Check that the ID is not already on the queue. - if (on_queue(&self->queue, id)) { - // The ID is already on the queue - // (this should not happen). - warning_print("%s (ID %d): received redundant resource request. " - "Manager %d is already on the queue. Ignoring request.", - self->name, - self->id, - id - ); - } else { - // If there is a local request and the local ID has higher priority, - // push the local ID first. - if (local >= 0 && local < id) { - if (push(&self->queue, local) != 0) { - warning_print("%s: (ID %d) queue is full. Ignoring local request.", - self->name, - self->id - ); - } - // Indicate that the local request has been pushed. - local = -1; - } - // Now push the remote request. - if (push(&self->queue, id) != 0) { - warning_print("%s (ID %d): Queue is full. Ignoring request.", - self->name, - self->id - ); - } - } - } - } - // If there is a local request and it has not yet gotten pushed to the queue, - // push it now. - if (local >= 0) { - if (push(&self->queue, local) != 0) { - warning_print("%s: (ID %d) queue is full. Ignoring local request.", - self->name, - self->id - ); - } - } - // Finally, if there was a local request and the head of the queue - // matches the local ID, grant the request. - if (local_request->is_present && self->queue.queue[self->queue.head] == self->id) { - // Grant request. - SET(local_grant, true); - } - =} - - reaction(shutdown) {= - free(self->queue.queue); - =} -} - -/** - * A mockup of a platform (e.g. a pod, a virtual machine, a physical - * machine, etc.) that hosts a client that needs exclusive access to - * some resource managed by a ResourceManager. - * - * @param idle_time The amount of time the client is idle before requesting the resource. - * @param use_time The amount of time the client holds on to the resource. - * @param num_other_resource_managers The number of other resource managers requiring access. - * @param id A unique ID between 0 and num_other_resource_managers. - * @param name A name (for reporting). - * - * @input remote_request A multiport input accepting remote requests for the resource. - * @input remote_release A multiport input accepting remote releases of the resource. - * - * @output request An output to broadcast a local request for the resource. - * @output release An output to broadcast a local release of the resource. - */ -reactor Platform( - idle_time:time(150 msec), - use_time:time(30 msec), - num_other_resource_managers:int(1), - id:int(0), - name:char*("unnamed Platform") // Used for more visible logging -) { - input[num_other_resource_managers] remote_request:int; - input[num_other_resource_managers] remote_release:int; - - output request:int; - output release:int; - - client = new Client( - name = name, - id = id, - idle_time = idle_time, - use_time = use_time - ); - - manager = new ResourceManager( - name = name, - id = id, - num_other_resource_managers = num_other_resource_managers - ); - - client.request -> manager.local_request; - client.release -> manager.local_release; - manager.request -> request; - manager.release -> release; - manager.local_grant -> client.grant; - remote_request -> manager.remote_request; - remote_release -> manager.remote_release; -} - -main reactor ResourceManagement( - num_other_resource_managers:int(1) -) { - // Each platform needs a unique id that is between 0 and QUEUE_SIZE-1. - a = new Platform( - idle_time = 50 msec, - use_time = 60 msec, - name = "San Francisco", - id = 0, - num_other_resource_managers = num_other_resource_managers); - b = new Platform( - idle_time = 200 msec, - use_time = 40 msec, - name = "Berkeley", - id = 1, - num_other_resource_managers = num_other_resource_managers); - b.request -> a.remote_request; - b.release -> a.remote_release; - a.request -> b.remote_request; - a.release -> b.remote_release; -} diff --git a/example/C/src/MQTT/MQTTDistributed.lf b/example/C/src/MQTT/MQTTDistributed.lf deleted file mode 100644 index b3eff1df68..0000000000 --- a/example/C/src/MQTT/MQTTDistributed.lf +++ /dev/null @@ -1,146 +0,0 @@ -/** - * Test case for MQTT pub/sub. In this version, the publisher and - * subscriber are mapped to distinct federates. The code generator - * produces three programs, bin/MQTTDistributed_RTI, - * bin/MQTTDistributed_source, and bin/MQTTDistributed_destination, - * plus a script bin/MQTTDistributed that runs all three. - * - * The publisher sends a sequence of strings, and at the MQTTSubscriber - * reactor, the offset parameter gives the logical time increment - * between the publisher and the subscriber. If this offset is greater - * than the physical latency from the MessageGenerator through MQTT - * to the MQTTSubscriber, plus the clock synchronization error, - * then the timestamps at the receiver will be deterministic. - * They are the sender's timestamp plus the offset. - * Otherwise, the timestamps will be larger and will match the - * physical time at which the subscriber receives the message. - * Since the source and destination are running in the same - * executable, there is no clock synchronization error. - * However, the interprocess communication seems rather high. - * On a Mac, I am seeing latencies on the order of one second. - * - * To measure the total communication latency from the MessageGenerator, - * through the publisher and through MQTT, set the offset to 0. - * In this case, the subscriber will always issue a warning and - * retimestamp the received - * message using physical time. At the end of execution, when the - * timeout expires, the average and maximum latency will be printed. - * - * To get deterministic timestamps, the offset needs to be larger - * than the total latency. An offset of 2 sec seems to be required. - * - * Prerequisites: - * - * To get this example to compile, you will need to install the Paho - * MQTT client library, which requires that you first install - * openSSL. To run the compiled code, you will need to have an - * MQTT broker, such as mosquitto, running. - * - * The Eclipse Paho library for MQTT clients can be obtained here: - * [https://github.com/eclipse/paho.mqtt.c]. - * - * This openSSL library (see [https://www.openssl.org]) is here: - * [https://github.com/openssl/openssl.git]. - * - * Finally, you need an MQTT broker to be running. For example, - * the Mosquitto Eclipse project provides one that can be downloaded - * at [https://mosquitto.org/download/]. - * Alternatively, on a Mac, you can use homebrew: - * - * brew install mosquitto - * - * To start the broker and test it, you can do this: - * - * 1. Start the broker in the background: - * > mosquitto & - * 2. Start a command-line subscriber: - * > mosquitto_sub -v -t 'test/topic' - * 3. In another terminal window, publish a message: - * > mosquitto_pub -t 'test/topic' -m 'Hello World' - * - * @author Ravi Akella - * @author Edward A. Lee - */ -target C { - cmake-include: [ - "include/paho-extension.cmake", - "include/mosquitto-extension.cmake"], - timeout: 10 secs, - keepalive: true, - cmake: true -}; - -import MQTTPublisher from "MQTTPublisher.lf"; -import MQTTSubscriber from "MQTTSubscriber.lf"; - -/** - * Reactor that generates a sequence of messages, one per second. - * The message will be a string consisting of a root string followed - * by a count. - * @param root The root string. - * @output message The message. - */ -reactor MessageGenerator(root:string("")) { - // Output type char* instead of string is used for dynamically - // allocated character arrays (as opposed to static constant strings). - output message:char*; - state count:int(1); - // Send first message after 1 sec so that the startup reactions - // do not factor into the transport time measurement on the first message. - timer t(1 sec, 1 sec); - reaction(t) -> message {= - // With NULL, 0 arguments, snprintf tells us how many bytes are needed. - // Add one for the null terminator. - int length = snprintf(NULL, 0, "%s %d", self->root, self->count) + 1; - // Dynamically allocate memory for the output. - SET_NEW_ARRAY(message, length); - // Populate the output string and increment the count. - snprintf(message->value, length, "%s %d", self->root, self->count++); - info_print("MessageGenerator: At time %lld, publish message: %s", - get_elapsed_logical_time(), - message->value - ); - =} -} - -/** - * Reactor that prints an incoming string. - * @param prefix A prefix for the message. - * @input message The message. - */ -reactor PrintMessage { - input message:char*; - reaction(message) {= - info_print("PrintMessage: At (elapsed) logical time %lld, subscriber receives: %s", - get_elapsed_logical_time(), - message->value - ); - =} -} - -reactor Source { - msg = new MessageGenerator(root = "Hello World"); - pub = new MQTTPublisher( - topic = "my/test", - address = "tcp://localhost:1883", - clientID = "TestPublisher", - include_physical_timestamp = 1 - ); - msg.message->pub.in; -} - -reactor Destination { - sub = new MQTTSubscriber( - address = "tcp://localhost:1883", - clientID = "TestSubscriber2", - topic = "my/test", - offset = 0 sec - ); - dsp = new PrintMessage(); - sub.message->dsp.message; -} - -federated reactor { - source = new Source(); - destination = new Destination(); -} diff --git a/example/C/src/MQTT/MQTTPhysical.lf b/example/C/src/MQTT/MQTTPhysical.lf deleted file mode 100644 index 3112f39236..0000000000 --- a/example/C/src/MQTT/MQTTPhysical.lf +++ /dev/null @@ -1,136 +0,0 @@ -/** - * Test case for MQTT pub/sub. In this version, the publisher and - * subscriber are running in the same single executable program. - * See MQTTDistributed for the more interesting case where they - * are in separate programs. - * - * The publisher sends a sequence of strings, and at the MQTTSubscriber - * reactor, the offset parameter gives the logical time increment - * between the publisher and the subscriber. - * If this offset is greater than the physical - * latency of communication through MQTT plus the clock synchronization - * error, then the timestamps at the receiver will be deterministic. - * They are the sender's timestamp plus the offset. - * Otherwise, the timestamps will be larger and will match the - * physical time at which the subscriber receives the message. - * Since the publisher and subscriber are running in the same - * executable, there is no clock synchronization error and the - * communication latency should be relatively low. One to five - * milliseconds seems typical. - * - * To measure the total communication latency from the MessageGenerator, - * through the publisher and through MQTT, set the offset to 0. - * In this case, the subscriber will always retimestamp the received - * message using physical time. At the end of execution, when the - * timeout expires, the average and maximum latency will be printed. - * - * To get deterministic timestamps, the offset needs to be larger - * than the total latency. An offset of 10 msec will likely be enough. - * - * Prerequisites: - * - * To get this example to compile, you will need to install the Paho - * MQTT client library, which requires that you first install - * openSSL. To run the compiled code, you will need to have an - * MQTT broker, such as mosquitto, running. - * - * The Eclipse Paho library for MQTT clients can be obtained here: - * https://github.com/eclipse/paho.mqtt.c. - * - * This openSSL library (see https://www.openssl.org) is here: - * https://github.com/openssl/openssl.git - * - * Finally, you need an MQTT broker to be running. For example, - * the Mosquitto Eclipse project provides one that can be downloaded - * at https://mosquitto.org/download/. - * Alternatively, on a Mac, you can use homebrew: - * - * brew install mosquitto - * - * To start the broker and test it, you can do this: - * - * 1. Start the broker in the background: - * > mosquitto & - * 2. Start a command-line subscriber: - * > mosquitto_sub -v -t 'test/topic' - * 3. In another terminal window, publish a message: - * > mosquitto_pub -t 'test/topic' -m 'Hello World' - * - * @author Ravi Akella - * @author Edward A. Lee - */ -target C { - cmake-include: [ - "include/paho-extension.cmake", - "include/mosquitto-extension.cmake", - "include/net_utils.cmake"], - timeout: 10 secs -}; - -import MQTTPublisher from "MQTTPublisher.lf"; -import MQTTSubscriber from "MQTTSubscriber.lf"; - -/** - * Reactor that generates a sequence of messages, one per second. - * The message will be a string consisting of a root string followed - * by a count. - * @param root The root string. - * @output message The message. - */ -reactor MessageGenerator(root:string("")) { - // Output type char* instead of string is used for dynamically - // allocated character arrays (as opposed to static constant strings). - output message:char*; - state count:int(1); - // Send first message after 1 sec so that the startup reactions - // do not factor into the transport time measurement on the first message. - timer t(1 sec, 1 sec); - reaction(t) -> message {= - // With NULL, 0 arguments, snprintf tells us how many bytes are needed. - // Add one for the null terminator. - int length = snprintf(NULL, 0, "%s %d", self->root, self->count) + 1; - // Dynamically allocate memory for the output. - SET_NEW_ARRAY(message, length); - // Populate the output string and increment the count. - snprintf(message->value, length, "%s %d", self->root, self->count++); - printf("MessageGenerator: At time %lld, publish message: %s\n", - get_elapsed_logical_time(), - message->value - ); - =} -} - -/** - * Reactor that prints an incoming string. - * @param prefix A prefix for the message. - * @input message The message. - */ -reactor PrintMessage { - input message:char*; - reaction(message) {= - printf("PrintMessage: At (elapsed) time %lld, subscriber receives: %s\n", - get_elapsed_logical_time(), - message->value - ); - =} -} - -main reactor MQTTPhysical { - pub = new MQTTPublisher( - topic = "my/test", - address = "tcp://localhost:1883", - clientID = "TestPublisher", - include_physical_timestamp = 1 - ); - msg = new MessageGenerator(root = "Hello World"); - msg.message->pub.in; - - sub = new MQTTSubscriber( - address = "tcp://localhost:1883", - clientID = "TestSubscriber2", - topic = "my/test", - offset = 10 msec - ); - dsp = new PrintMessage(); - sub.message->dsp.message; -} diff --git a/example/C/src/MQTT/MQTTPublisher.lf b/example/C/src/MQTT/MQTTPublisher.lf deleted file mode 100644 index b0eb7aef82..0000000000 --- a/example/C/src/MQTT/MQTTPublisher.lf +++ /dev/null @@ -1,179 +0,0 @@ -/** - * Reactor that publishes strings to a specified MQTT topic. - * See MQTTPhysical and MQTTLogical for prerequisites and an example usage. - * - * @author Ravi Akella - * @author Edward A. Lee - */ -target C; - -/** - * Reactor that publishes strings to a specified MQTT topic. - * This publisher appends to the end of the message the - * timestamp of the message at the publisher. The receiving - * end adds to this timestamp a specified offset, and if that - * offset is larger than the current physical time at which it - * receives the message, assigns that incremented timestamp - * to the message. If the offset is always greater than or - * equal to the transport latency plus the clock synchronization - * error, then the overall program remains deterministic. - * - * This publisher also ensures in-order delivery messages to - * subscribers. If an attempt is made to send a message before - * the delivery of the previous message has completed, then the reaction - * that sends the message (the reaction to an input 'in') will - * block until the previous delivery has completed. - * - * @param topic The topic name on which to publish. - * @param address The IP address of the MQTT broker. - * @param clientID The name of the client instance. - * These names are required to be unique. - * @param include_physical_timestamp If true, include - * in the message the time of the local physical clock - * when the message is sent. - * @see MQTTSubscriber. - */ -reactor MQTTPublisher ( - topic:string("DefaultTopic"), - address:string("tcp://localhost:1883"), - clientID:string("DefaultPublisher"), - include_physical_timestamp:int(0) -) { - preamble {= - #include "MQTTClient.h" - #include "core/federated/net_util.h" - - // Timeout for completion of message sending in milliseconds. - #define TIMEOUT 10000L - - // Connection options for the client. - // Making this global means that all instances of this reactor have - // the same connection options. - MQTTClient_connectOptions pub_connect_options = MQTTClient_connectOptions_initializer; - - // Struct type used to keep track of messages in flight between reactions. - typedef struct inflight_t { - bool message_in_flight; - MQTTClient_deliveryToken delivery_token; - char* message; - } inflight_t; - - // Callback invoked once delivery is complete. - void pub_delivered(void *inflight, MQTTClient_deliveryToken dt) { - // printf("DEBUG: Message with token value %d delivery confirmed\n", dt); - ((inflight_t*)inflight)->message_in_flight = false; - free(((inflight_t*)inflight)->message); - } - // Callback invoked if the connection is lost. - void pub_connection_lost(void *context, char *cause) { - printf("\nMQTTPublisher: Connection lost\n"); - printf(" cause: %s\n", cause); - } - =} - /** - * Input type char* instead of string is used for dynamically - * allocated character arrays (as opposed to static constant strings). - */ - input in:char*; - - /** State variable that keeps track of a message in flight. */ - state inflight:inflight_t({={false, 0, NULL}=}); - - /** The client object. */ - state client:MQTTClient({=NULL=}); - - /** The message object. */ - state mqtt_msg:MQTTClient_message({=MQTTClient_message_initializer=}); - - /** Connect to the broker. Exit if this fails. */ - reaction(startup){= - MQTTClient_create(&self->client, self->address, self->clientID, MQTTCLIENT_PERSISTENCE_NONE, NULL); - pub_connect_options.keepAliveInterval = 20; - pub_connect_options.cleansession = 1; - - // Set up callback functions. - // Second to last argument should be a pointer to a function - // to handle notification of delivery of a message. - // But this reactor isn't sending any messages. - // Second argument is a pointer to context that will be passed to pub_delivered, - // which in this case is a pointer to the inflight state variable. - MQTTClient_setCallbacks(self->client, &self->inflight, pub_connection_lost, NULL, pub_delivered); - - // Connect to the broker. - int rc; // response code. - if ((rc = MQTTClient_connect(self->client, &pub_connect_options)) != MQTTCLIENT_SUCCESS) { - fprintf(stderr, "MQTTPublisher: Failed to connect to MQTT broker.\n"); - fprintf(stderr, "Perhaps one is not running? Return code: %d\n", rc); - exit(EXIT_FAILURE); - } - // printf("DEBUG: MQTTPublisher connected to broker.\n"); - =} - - /** - * React to an input by sending a message with the value of the input as the payload. - * If delivery has not yet completed for a previously sent message, then wait for - * it to complete before proceeding (blocking this reaction). - * This copies the message from the input into a buffer, so the input can - * freed upon return of this reaction (LF will automatically decrement its - * reference count). - */ - reaction(in) {= - if(self->inflight.message_in_flight) { - // Wait for message delivery to be complete. - // printf("DEBUG: Waiting for publication of previous message\n"); - int rc = MQTTClient_waitForCompletion(self->client, self->inflight.delivery_token, TIMEOUT); - if (rc != MQTTCLIENT_SUCCESS) { - fprintf(stderr, "ERROR: Message delivery failed with error code %d.\n", rc); - fprintf(stderr, "Message: %s\n", in->value); - fprintf(stderr, "On topic '%s' for publisher with ClientID: %s\n", self->topic, self->clientID); - } - } - // printf("DEBUG: Publishing message: %s\n", in); - // printf("DEBUG: on topic '%s' for publisher with ClientID: %s\n", self->topic, self->clientID); - - // Allocate memory for a copy of the message. - // The length includes the null-terminator of the string and 8 bytes for the timestamp. - int length = strlen(in->value) + 1 + sizeof(instant_t); - if (self->include_physical_timestamp) { - length += sizeof(instant_t); - } - self->inflight.message = malloc(sizeof(char) * length); - memcpy(self->inflight.message, in->value, strlen(in->value) + 1); - - // Append the current timestamp to the message. - // This is always last, after the physical timestamp if it is included. - encode_int64(get_logical_time(), - (unsigned char*)(self->inflight.message + length - sizeof(instant_t)) - ); - // printf("DEBUG: Timestamp of sending message: %lld.\n", *timestamp); - - self->mqtt_msg.payload = self->inflight.message; - self->mqtt_msg.payloadlen = length; - - // QoS 2 means that the message will be delivered exactly once. - self->mqtt_msg.qos = 2; - - // Retained messages are held by the server and sent to future new subscribers. - // Specify that this message should not be retained. - // It will be sent only to subscribers currently subscribed. - self->mqtt_msg.retained = 0; - - // As close as possible to the publishing of the message, insert - // the physical timestamp if it has been requested. - if (self->include_physical_timestamp) { - encode_int64(get_physical_time(), - (unsigned char*)(self->inflight.message + length - 2 * sizeof(instant_t)) - ); - } - - MQTTClient_publishMessage(self->client, self->topic, &self->mqtt_msg, &self->inflight.delivery_token); - self->inflight.message_in_flight = true; - =} - - /** Disconnect the client. */ - reaction(shutdown) {= - printf("MQTTPublisher: Client ID %s disconnecting.\n", self->clientID); - MQTTClient_disconnect(self->client, 10000); - MQTTClient_destroy(&self->client); - =} -} diff --git a/example/C/src/MQTT/MQTTSubscriber.lf b/example/C/src/MQTT/MQTTSubscriber.lf deleted file mode 100644 index efb9d9dc8e..0000000000 --- a/example/C/src/MQTT/MQTTSubscriber.lf +++ /dev/null @@ -1,253 +0,0 @@ -/** - * Reactor that subscribes to a specified MQTT topic on which - * string messages are published. - * See MQTTPhysical and MQTTLogical for prerequisites and an example usage. - * - * @author Ravi Akella - * @author Edward A. Lee - */ -target C; - -/** - * Reactor that subscribes to a specified MQTT topic on which - * string messages are published. - * This reactor extracts the sender's timestamp from the message - * and adds to this timestamp the specified offset. If that - * offset is larger than the current physical time at which this - * reactor receives the message, then it assigns that incremented timestamp - * to the message. Otherwise, the received message gets a timestamp - * equal to the physical time at which the message is received. - * - * In addition, if the corresponding MQTTPublisher has its - * parameter include_physical_timestamp set to non-zero, then - * this reactor measures the physical transport time from the - * time of sending (as reported by the physical clock at the sender) - * and the time at which this reactor's reaction is invoked - * (as reported by the physical clock at this receiver). - * - * If the offset is always greater than or equal to the sum of - * transport latency, clock synchronization error, and execution - * times between creation of the timestamped event at the sender - * and its reception at the receiver, then the overall program - * remains deterministic. - * Hence, a good practice, if the application can tolerate the - * latency, is to set the offset to be larger than this expected - * communication latency between a publisher and a subscriber. - * To determine whether an execution was deterministic in this - * sense, set include_physical_timestamp = 0 at the sender, - * set a non-zero offset at the receiver, and see if the reported - * average latency equals the reported maximum latency. If they - * are equal, then execution was deterministic. - * - * By default, the offset is 0, so the assigned timestamp will - * always be the physical time at which the message is received, - * assuming the clock synchronization error is less than the - * transport latency. With this setting, this timestamp increment - * also measures the total communication latency. If the sender has - * include_physical_timestamp set to zero, then this reactor - * reports at the end of execution the average and - * maximum timestamp increments rather than physical latencies. - * - * @param topic The topic name on which to publish. - * @param address The IP address of the MQTT broker. - * @param clientID The name of the client instance. - * These names are required to be unique. - * @param offset The offset to add to the sender's timestamp. - * @see MQTTPublisher. - */ -reactor MQTTSubscriber ( - address:string("tcp://localhost:1883"), - clientID:string("DefaultSubscriber"), - topic:string("DefaultTopic"), - offset:time(0) -) { - preamble {= - #include "MQTTClient.h" - #include "core/federated/net_util.h" - - #define QOS 2 - #define TIMEOUT 10000L - - // Connection options for the client. - // Making this global means that all instances of this reactor have - // the same connection options. - MQTTClient_connectOptions sub_connect_options = MQTTClient_connectOptions_initializer; - - // Callback function invoked by MQTT when a message arrives. - int message_arrived( - void *incoming_message, - char *topicName, - int topicLen, - MQTTClient_message *message - ) { - instant_t receive_physical_time = get_physical_time(); - // If a physical timestamp was sent, report the transport time. - size_t string_length = strlen((char*)message->payload); // Assumes null-terminated string. - if (message->payloadlen == string_length + 1 + 2*sizeof(instant_t)) { - instant_t* physical_timestamp = (instant_t*)((char*)message->payload + string_length + 1); - // printf("DEBUG: MQTTReceiver.message_arrived: Received message after measured latency of %lld nsec (assuming synchronized clocks).\n", receive_physical_time - *physical_timestamp); - } - - // printf("DEBUG: MQTTSubscriber: Message arrived on topic %s: %s\n", topicName, (char*)message->payload); - - // Extract the timestamp and calculate delay from current_time to that timestamp. - // Note that if this subscriber's current time is ahead of current time - // at the publisher (something that can easily happen in a distributed execution), - // then this extra delay may be negative and a warning will be issued. - // First acquire the mutex lock. Otherwise, logical time could have a big - // jump between this calculation and the call to schedule, resulting in a long delay. - - // NOTE: Since schedule_copy also acquires this lock, we assume here that the - // pthreads library correctly implements recursive mutex locks to unlock all - // locks held by the current thread when waiting for signals. - lf_mutex_lock(&mutex); - - instant_t timestamp = extract_int64((unsigned char*)message->payload + message->payloadlen - sizeof(instant_t)); - interval_t delay = timestamp - get_logical_time(); - // printf("DEBUG: MQTTSubscriber.message_arrived: received timestamp that is %lld ahead of current_time %lld.\n", *timestamp - start_time, current_time); - // printf("DEBUG: MQTTSubscriber.message_arrived: physical time is ahead of current logical time by: %lld.\n", receive_physical_time - current_time); - - // Schedule the event. Since incoming_message is a physical action, - // the offset specified in the second argument will be added to current_time - // and to the min_delay in the action and then compared to physical time. - // If the sum is greater than physical time - // (i.e. if the offset + min_delay is large enough), then the event will be scheduled at - // exactly the logical time at the publisher plus the offset. - // Otherwise, it will be scheduled at the current physical time. - // The incoming message is in dynamically allocated memory. - // We copy the message using schedule_copy() because, unfortunately, Paho MQTT uses its own - // version of malloc() and free() (defined in Heap.h and Heap.c). - // We could modify Paho MQTT to use the generic malloc() and free(), - // and then we could use schedule_value() to avoid the copy. - // Note that the last 8 bytes of the message are the sender's timestamp. - // We include that in the copy so that the reaction to the physical action - // can measure the latency. - schedule_copy(incoming_message, delay, (char*)message->payload, message->payloadlen); - - lf_mutex_unlock(&mutex); - - // MQTTClient_freeMessage() also frees the memory allocated to the payload, - // which is why we have to copy the message here. - MQTTClient_freeMessage(&message); - MQTTClient_free(topicName); - - // Return true to indicate that the message has been successfully handled. - return 1; - } - - /** Callback invoked if the connection is lost. */ - void sub_connection_lost(void *incoming_message, char *cause) { - printf("\nConnection lost\n"); - printf(" cause: %s\n", cause); - } - =} - - /** - * Output for sending the incoming MQTT message. - * Use type char* rather than string because it is not - * a static string, but rather dynamically allocated memory. - */ - output message:char*; - - /** - * Action that is triggered when there is an incoming MQTT message. - * Use a physical action here so that the logical time when the action - * is triggered is the physical time of arrival of the message if - * the offset is 0. If the offset is larger than the communication - * latency plus the clock synchronization error, - * then the incoming message will have have a timestamp deterministically - * larger than the sender's timestamp by the offset. - */ - physical action incoming_message(offset):char*; - - /** - * State variable storing the MQTT client created for each instance of this reactor. - */ - state client:MQTTClient({=NULL=}); - - /** - * Maximum observed latency from the originator of the message to here. - */ - state max_latency:time(0); - - /** - * Sum of all observed latencies. - */ - state latencies:time(0); - - /** - * Count of messages. - */ - state count:int(0); - - reaction(startup) -> incoming_message {= - MQTTClient_create(&self->client, self->address, self->clientID, MQTTCLIENT_PERSISTENCE_NONE, NULL); - sub_connect_options.keepAliveInterval = 20; - sub_connect_options.cleansession = 1; - - // Set up callback functions. - // Last argument should be a pointer to a function to - // handle notification of delivery of a sent message. - // But this reactor isn't sending any messages. - MQTTClient_setCallbacks(self->client, incoming_message, sub_connection_lost, message_arrived, NULL); - - // Connect to the broker. - int rc; // response code. - if ((rc = MQTTClient_connect(self->client, &sub_connect_options)) != MQTTCLIENT_SUCCESS) { - fprintf(stderr, "MQTTSubscriber: Failed to connect to MQTT broker.\n"); - fprintf(stderr, "Perhaps one is not running? Return code: %d\n", rc); - exit(EXIT_FAILURE); - } - - MQTTClient_subscribe(self->client, self->topic, QOS); - =} - - reaction(incoming_message) -> message {= - self->count++; - - // The incoming_message action contains a token that we can just forward. - // The allocated memory will be freed when the token's reference count hits 0. - // Note that this token will still contain the sender's timestamp. - SET_TOKEN(message, incoming_message->token); - - // Get the sender's timestamp. - instant_t* timestamp = (instant_t*)( - incoming_message->token->value + incoming_message->token->length - sizeof(instant_t) - ); - // printf("DEBUG: Received message carrying timestamp %lld.\n", *timestamp); - - // If the offset is 0, then the latency will be a measure of - // the physical latency between creation of the message at the sender - // and its receipt here, offset by the clock synchronization error, - // assuming that the sender sent the message at a physical time matching its - // logical timestamp. - interval_t latency = get_logical_time() - *timestamp; - LOG_PRINT("MQTTSubscriber.reaction: Received timestamp is larger than sent timestamp by: %lld.", latency); - - // If a physical timestamp was sent, use that to collect - // latency stats instead of the logical time increment. - size_t string_length = strlen(incoming_message->value); // Assumes null-terminated string. - if (incoming_message->token->length == string_length + 1 + 2*sizeof(instant_t)) { - instant_t receive_physical_time = get_physical_time(); - instant_t physical_timestamp = extract_int64((unsigned char*)(incoming_message->value + string_length + 1)); - latency = receive_physical_time - physical_timestamp; - // printf("DEBUG: MQTTReceiver.reaction: Reacted to message after measured latency of %lld nsec (assuming synchronized clocks).\n", latency); - } - - self->latencies += latency; - - if (latency > self->max_latency) { - self->max_latency = latency; - } - =} - - reaction(shutdown) {= - printf("MQTTSubscriber: Maximum latency measured at receiver (in nsec): %lld.\n", self->max_latency); - if (self->count > 0) { - printf("MQTTSubscriber: Average latency measured at receiver (in nsec): %lld.\n", self->latencies/self->count); - } - printf("MQTTSubscriber: Client ID %s disconnecting.\n", self->clientID); - MQTTClient_disconnect(self->client, 10000); - MQTTClient_destroy(&self->client); - =} -} diff --git a/example/C/src/MQTT/include/mosquitto-extension.cmake b/example/C/src/MQTT/include/mosquitto-extension.cmake deleted file mode 100644 index 3f31ad915e..0000000000 --- a/example/C/src/MQTT/include/mosquitto-extension.cmake +++ /dev/null @@ -1,37 +0,0 @@ -# find_package(Mosquitto REQUIRED)x -list(APPEND CMAKE_PREFIX_PATH "/opt/homebrew") -list(APPEND CMAKE_PREFIX_PATH "/usr/local/") - -# Taken from: https://github.com/tarantool/mqtt/tree/master/cmake -# - Find libmosquitto -# Find the native libmosquitto includes and libraries -# -# MOSQUITTO_INCLUDE_DIR - where to find mosquitto.h, etc. -# MOSQUITTO_LIBRARIES - List of libraries when using libmosquitto. -# MOSQUITTO_FOUND - True if libmosquitto found. - -if (NOT MOSQUITTO_INCLUDE_DIR) - find_path(MOSQUITTO_INCLUDE_DIR mosquitto.h) -endif() - -if (NOT MOSQUITTO_LIBRARY) - find_library( - MOSQUITTO_LIBRARY - NAMES mosquitto) -endif() - -include(FindPackageHandleStandardArgs) - -find_package_handle_standard_args( - MOSQUITTO DEFAULT_MSG - MOSQUITTO_LIBRARY MOSQUITTO_INCLUDE_DIR) - -message(STATUS "libmosquitto include dir: ${MOSQUITTO_INCLUDE_DIR}") -message(STATUS "libmosquitto: ${MOSQUITTO_LIBRARY}") -set(MOSQUITTO_LIBRARIES ${MOSQUITTO_LIBRARY}) - -mark_as_advanced(MOSQUITTO_INCLUDE_DIR MOSQUITTO_LIBRARY) -######## - -include_directories(/usr/local/include) -target_link_libraries(${LF_MAIN_TARGET} ${MOSQUITTO_LIBRARY}) diff --git a/example/C/src/MQTT/include/net_utils.cmake b/example/C/src/MQTT/include/net_utils.cmake deleted file mode 100644 index 448ea62eb9..0000000000 --- a/example/C/src/MQTT/include/net_utils.cmake +++ /dev/null @@ -1 +0,0 @@ -target_sources(${LF_MAIN_TARGET} PRIVATE "core/federated/net_util.c") diff --git a/example/C/src/MQTT/include/paho-extension.cmake b/example/C/src/MQTT/include/paho-extension.cmake deleted file mode 100644 index 339cb995af..0000000000 --- a/example/C/src/MQTT/include/paho-extension.cmake +++ /dev/null @@ -1,49 +0,0 @@ -# find_package(Mosquitto REQUIRED)x -list(APPEND CMAKE_PREFIX_PATH "/opt/homebrew/") -list(APPEND CMAKE_PREFIX_PATH "/usr/local/") - -find_package(OpenSSL) -if(${OpenSSL_FOUND}) - set(PAHO_WITH_SSL true) -ELSE (${OpenSSL_FOUND}) - set(PAHO_WITH_SSL false) - MESSAGE(ERROR " Could not locate OpenSSL. Will skip using it.") -ENDIF (${OpenSSL_FOUND}) -# Taken from: https://github.com/eclipse/paho.mqtt.cpp/tree/master/cmake -# find the Paho MQTT C library -if(PAHO_WITH_SSL) - set(_PAHO_MQTT_C_LIB_NAME paho-mqtt3cs) -else() - set(_PAHO_MQTT_C_LIB_NAME paho-mqtt3c) -endif() - -# add suffix when using static Paho MQTT C library variant on Windows -if(WIN32) - if(PAHO_BUILD_STATIC) - set(_PAHO_MQTT_C_LIB_NAME ${_PAHO_MQTT_C_LIB_NAME}-static) - endif() -endif() - -find_library(PAHO_MQTT_C_LIBRARIES NAMES ${_PAHO_MQTT_C_LIB_NAME}) -unset(_PAHO_MQTT_C_LIB_NAME) -find_path(PAHO_MQTT_C_INCLUDE_DIRS NAMES MQTTAsync.h) - -add_library(PahoMqttC::PahoMqttC UNKNOWN IMPORTED) - -set_target_properties(PahoMqttC::PahoMqttC PROPERTIES - IMPORTED_LOCATION "${PAHO_MQTT_C_LIBRARIES}" - INTERFACE_INCLUDE_DIRECTORIES "${PAHO_MQTT_C_INCLUDE_DIRS}" - IMPORTED_LINK_INTERFACE_LANGUAGES "C") -if(PAHO_WITH_SSL) - set_target_properties(PahoMqttC::PahoMqttC PROPERTIES - INTERFACE_COMPILE_DEFINITIONS "OPENSSL=1" - INTERFACE_LINK_LIBRARIES "OpenSSL::SSL;OpenSSL::Crypto") -endif() - -include(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(PahoMqttC - REQUIRED_VARS PAHO_MQTT_C_LIBRARIES PAHO_MQTT_C_INCLUDE_DIRS) -######## - -include_directories(${PAHO_MQTT_C_INCLUDE_DIRS}) -target_link_libraries(${LF_MAIN_TARGET} ${PAHO_MQTT_C_LIBRARIES}) diff --git a/example/C/src/Patterns/Chain_01_SendReceive.lf b/example/C/src/Patterns/Chain_01_SendReceive.lf deleted file mode 100644 index 26ffbd3100..0000000000 --- a/example/C/src/Patterns/Chain_01_SendReceive.lf +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Very basic chain with just two reactors, one that sends - * a message a startup feeding one that reports receiving it. - * - * @author Edward A. Lee - */ -target C; - -import SendOnce, Receive from "lib/SendersAndReceivers.lf"; - -main reactor { - r1 = new SendOnce(); - r2 = new Receive(); - r1.out -> r2.in; -} diff --git a/example/C/src/Patterns/Chain_02_Pipeline.lf b/example/C/src/Patterns/Chain_02_Pipeline.lf deleted file mode 100644 index 8b9656ed31..0000000000 --- a/example/C/src/Patterns/Chain_02_Pipeline.lf +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Basic pipeline pattern where a periodic source feeds - * a chain of reactors that can all execute in parallel - * at each logical time step. - * - * The threads argument specifies the number of worker - * threads, which enables the reactors in the chain to - * execute on multiple cores simultaneously. - * - * This uses the TakeTime reactor to perform computation - * (it computes Fibonacci numbers). If you reduce the - * number of worker threads to 1, the execution time - * will be approximately four times as long. - * - * @author Edward A. Lee - */ -target C { - workers: 4, - timeout: 1 sec -} - -import SendCount, Receive from "lib/SendersAndReceivers.lf"; -import TakeTime from "lib/TakeTime.lf"; - -main reactor { - r0 = new SendCount(period = 100 msec); - rp = new[4] TakeTime(approximate_time = 100 msec); - r5 = new Receive(); - r0.out, rp.out -> rp.in, r5.in after 100 msec; -} - - \ No newline at end of file diff --git a/example/C/src/Patterns/FullyConnected_00_Broadcast.lf b/example/C/src/Patterns/FullyConnected_00_Broadcast.lf deleted file mode 100644 index 975b89ca0a..0000000000 --- a/example/C/src/Patterns/FullyConnected_00_Broadcast.lf +++ /dev/null @@ -1,41 +0,0 @@ -/** - * This illustrates bank of reactors where each reactor produces an - * output that is broadcast to all reactors in the bank, including - * itself. - * - * @author Christian Menard - * @author Edward A. Lee - */ -target C; - -reactor Node( - num_nodes: size_t(4), - bank_index: int(0) -) { - input[num_nodes] in: int; - output out: int; - - state received: bool(false); - - reaction (startup) -> out{= - info_print("Hello from node %d!", self->bank_index); - // broadcast my ID to everyone - SET(out, self->bank_index); - =} - - reaction (in) {= - printf("Node %d received messages from ", self->bank_index); - for (int i = 0; i < in_width; i++) { - if (in[i]->is_present) { - self->received = true; - printf("%d, ", in[i]->value); - } - } - printf("\n"); - =} -} - -main reactor(num_nodes: size_t(4)) { - nodes = new[num_nodes] Node(num_nodes=num_nodes); - (nodes.out)+ -> nodes.in; -} diff --git a/example/C/src/Patterns/FullyConnected_01_Addressable.lf b/example/C/src/Patterns/FullyConnected_01_Addressable.lf deleted file mode 100644 index 0e6dc97bf2..0000000000 --- a/example/C/src/Patterns/FullyConnected_01_Addressable.lf +++ /dev/null @@ -1,44 +0,0 @@ -/** - * This illustrates bank of reactors where each reactor produces an - * output that is sent to a reactor in the bank of its choice. In this - * particular example, each reactor chooses to send its output to the - * reactor with the next higher bank_index, wrapping around when it gets - * to the end of the bank. - * - * @author Christian Menard - * @author Edward A. Lee - */ -// In this pattern, each node can send direct messages to individual other nodes - -target C; - -reactor Node( - num_nodes: size_t(4), - bank_index: int(0) -) { - input[num_nodes] in: int; - output[num_nodes] out: int; - - reaction (startup) -> out{= - info_print("Hello from node %d!", self->bank_index); - // broadcast my ID to everyone - SET(out[(self->bank_index + 1) % self->num_nodes], self->bank_index); - =} - - reaction (in) {= - printf("Node %d received messages from ", self->bank_index); - size_t count = 0; - for (int i = 0; i < in_width; i++) { - if (in[i]->is_present) { - count++; - printf("%d, ", in[i]->value); - } - } - printf("\n"); - =} -} - -main reactor(num_nodes: size_t(4)) { - nodes = new[num_nodes] Node(num_nodes=num_nodes); - nodes.out -> interleaved(nodes.in); -} diff --git a/example/C/src/Patterns/Loop_01_Single.lf b/example/C/src/Patterns/Loop_01_Single.lf deleted file mode 100644 index d685f877d9..0000000000 --- a/example/C/src/Patterns/Loop_01_Single.lf +++ /dev/null @@ -1,20 +0,0 @@ -/** - * A single reactor sends data to itself. - * The receiving reaction has to be appear lexically later - * in the source code, so that the sending reaction has - * higher priority, or else a causality loop arises. - * You can observe the causality loop by replacing the - * imported reactor with ReceiveAndSendPeriodically. - * - * @author Edward A. Lee - */ -target C { - timeout: 5 sec -}; - -import SendPeriodicallyAndReceive from "lib/SendersAndReceivers.lf"; - -main reactor { - r1 = new SendPeriodicallyAndReceive(); - r1.out -> r1.in; -} \ No newline at end of file diff --git a/example/C/src/Patterns/Loop_02_SingleDelay.lf b/example/C/src/Patterns/Loop_02_SingleDelay.lf deleted file mode 100644 index fd3088b12e..0000000000 --- a/example/C/src/Patterns/Loop_02_SingleDelay.lf +++ /dev/null @@ -1,24 +0,0 @@ -/** - * A single reactor sends data to itself with delay. - * Unlike Loop_01_Single.lf, this can have reactions - * appear in reverse order, where the receiving reaction - * occurs before the sending reaction. This is because the - * delay of a single microstep breaks the causality loop. - * - * Note that the received values are reported at microstep 1 - * rather than 0. - * - * @author Edward A. Lee - */ -target C { - timeout: 5 sec -}; - -import ReceiveAndSendPeriodically from "lib/SendersAndReceivers.lf"; - -main reactor ( - a_1_1:time(0) -) { - r1 = new ReceiveAndSendPeriodically(); - r1.out -> r1.in after a_1_1; -} \ No newline at end of file diff --git a/example/C/src/Patterns/README.md b/example/C/src/Patterns/README.md deleted file mode 100644 index ccb1623abf..0000000000 --- a/example/C/src/Patterns/README.md +++ /dev/null @@ -1,5 +0,0 @@ -This directory contains Lingua Franca programs representing a number of common design patterns. The naming convention is that each example is in a file named Class_Num_Description.lf, where Class identifies a class of patterns (Chain, Loop, etc.), the Num is a two digit number suggesting the order in which to look at the examples, and Description is a short hint at what particular variant of the pattern the program represents. - -These programs reuse a collection of library reactors contained in the lib subdirectory. - -If you add to these patterns, please use or extend the library reactors rather than just creating new reactors with similar functionality. Please also fully document your patterns. What do they illustrate? How can the user experiment with them? Also, for each pattern, please add a test in the test subdirectory. Tests should use corresponding test receivers in the lib directory. \ No newline at end of file diff --git a/example/C/src/Patterns/lib/SendersAndReceivers.lf b/example/C/src/Patterns/lib/SendersAndReceivers.lf deleted file mode 100644 index 0d6c9b543c..0000000000 --- a/example/C/src/Patterns/lib/SendersAndReceivers.lf +++ /dev/null @@ -1,205 +0,0 @@ -/** - * Library of reactors that are reused in various design pattern examples. - * - * @author Edward A. Lee - */ -target C; - -/** - * Send an output (42) at startup. - */ -reactor SendOnce { - output out:int; - reaction(startup) -> out {= - SET(out, 42); - =} -} - -/** - * Send counting sequence periodically. - * - * @param offset The starting time. - * @param period The period. - * @param start The first output. - * @param increment The increment between outputs - */ -reactor SendCount( - offset:time(0), - period:time(1 sec), - start:int(0), - increment:int(1) -) { - state count:int(start); - output out:int; - timer t(offset, period); - reaction(t) -> out {= - SET(out, self->count); - self->count += self->increment; - =} -} - -/** - * Receive an input and report the elpased logical tag - * and the value of the input. - */ -reactor Receive { - input in:int; - reaction(in) {= - info_print("At elapsed tag (%lld, %d), received %d.", - get_elapsed_logical_time(), get_microstep(), - in->value - ); - =} -} - -reactor ReceiveAndSend { - input in:int; - output out:int; - reaction(in) -> out {= - SET(out, in->value); - =} -} -reactor SendOnceAndReceive { - input in:int; - output out:int; - reaction(startup) -> out {= - SET(out, 42); - =} - reaction(in) {= - info_print("At tag (%lld, %d), received %d.", - get_elapsed_logical_time(), - get_microstep(), - in->value - ); - =} -} - -/** - * This reactor periodically increments its state and sends it out. - * When an input is received, it simply reports the value. - * - * @param offset The time of the first output. - * @param period The period of the outputs. - * @param start The initial output value. - * @param increment The increment between outputs. - * - * @input in The input to report. - * @output out The counting output. - * - * @label Increment the state, send, report received. - */ -reactor SendPeriodicallyAndReceive extends SendCount, Receive { - // This reactor simply composes SendCount and Receive, in that order. -} - -/** - * This reactor periodically increments its state and sends it out. - * When an input is received, it simply reports the value. - * - * @param offset The time of the first output. - * @param period The period of the outputs. - * @param start The initial output value. - * @param increment The increment between outputs. - * - * @input in The input to report. - * @output out The counting output. - * - * @label Increment the state, send, report received. - */ -reactor ReceiveAndSendPeriodically extends Receive, SendCount { - // This reactor simply composes Receive and SendCount, in that order. -} - -/** - * This reactor periodically increments its state and sends it out. - * When an input is received, it simply reports the value. - * @label Increment the state, send, report received. - */ -reactor SendPeriodicallyAndReceiveMultiport ( - offset:time(0), - period:time(1 sec), - start:int(0), - increment:int(1), - width:int(4) -) { - input[width] in:int; - output out:int; - - timer t(offset, period); - - state count:int(start); - - reaction(t) -> out {= - SET(out, self->count); - self->count += self->increment; - =} - reaction(in) {= - info_print("At tag (%lld, %d), received:", - get_elapsed_logical_time(), get_microstep() - ); - for (int i = 0; i < self->width; i++) { - info_print(" On channel %d: %d", i, in[i]->value); - } - =} -} - -/** - * This reactor maintains a local state that periodically incremented - * and incremented whenever an input arrives. - * @label Increment the state, send increment, accept increment. - */ -reactor LocalRemoteUpdates( - offset:time(0), - period:time(1 sec), - increment:int(1) -) { - input in:int; - output out:int; - - timer t(offset, period); - - state count:int(0); - - reaction(t) -> out {= - SET(out, self->increment); - self->count += self->increment; - =} - reaction(in) {= - self->count += in->value; - info_print("At tag (%lld, %d), count is %d", - get_elapsed_logical_time(), get_microstep(), - self->count - ); - =} -} -// @label Accumulate local/remote increments, locally query. -reactor SendAndReceiveWithLocalQuery( - query_offset:time(0), - query_period:time(1 sec) -) extends LocalRemoteUpdates { - local_query = new SendPeriodicallyAndReceive( - offset = query_offset, - period = query_period - ); - reaction(local_query.out) -> local_query.in {= - SET(local_query.in, self->count); - =} -} -// @label Accumulate local/remote increments, delayed query. -reactor SendAndReceiveWithDelayedQuery( - query_offset:time(0), - query_period:time(1 sec), - query_delay:time(10 msec) -) extends LocalRemoteUpdates { - local_query = new SendPeriodicallyAndReceive( - offset = query_offset, - period = query_period - ); - logical action a(query_delay); - reaction(local_query.out) -> a {= - schedule(a, 0); - =} - reaction(a) -> local_query.in {= - SET(local_query.in, self->count); - =} -} diff --git a/example/C/src/Patterns/lib/TakeTime.lf b/example/C/src/Patterns/lib/TakeTime.lf deleted file mode 100644 index 47f34f720f..0000000000 --- a/example/C/src/Patterns/lib/TakeTime.lf +++ /dev/null @@ -1,44 +0,0 @@ -target C; -/** - * Compute Fibonacci numbers until at least the specified - * physical time has passed. This will compute numbers until - * they overflow the 64-bit representation, and then start over. - * When at least the specified physical time has elapased, - * report the last number computed. - * This is used in some design patterns to provide - * significant computation. - * - * @param approximate_time The approximate amount of physical - * time to take for each input. - * - * @input in A triggering input. - * - * @output out The computed Fibonacci number. - */ -reactor TakeTime( - approximate_time:time(100 msec) -) { - input in:int; - output out:int; - reaction(in) -> out {= - instant_t start_time = get_physical_time(); - int f0 = 0; - int f1 = 1; - int count = 0; - while (get_physical_time() < start_time + self->approximate_time) { - int next_term = f0 + f1; - if (next_term < 0LL) { - // Overflow has occurred. Start over. - count = 0; - f0 = 0; - f1 = 1; - } else { - f0 = f1; - f1 = next_term; - count++; - } - } - SET(out, f1); - info_print("The %d-th Fibonacci number is %d.", count, f0); - =} -} \ No newline at end of file diff --git a/example/C/src/ProtocolBuffers/HelloProtocolBuffers.lf b/example/C/src/ProtocolBuffers/HelloProtocolBuffers.lf deleted file mode 100644 index b84551a0cc..0000000000 --- a/example/C/src/ProtocolBuffers/HelloProtocolBuffers.lf +++ /dev/null @@ -1,70 +0,0 @@ -/** - * This example demonstrates a very simple use of protocol buffers - * within a reactor. It encodes and decodes a very simple protocol - * buffer definition in hello_string.proto. This reactor is heavily - * based on the examples at https: * github.com/protobuf-c/protobuf-c/wiki/Examples. - * - * To run this example first install the protocol buffers compiler - * from https: * github.com/protocolbuffers/protobuf. For Mac, it is - * available from homebrew via - * ``` - * brew install protobuf - * ``` - * You may also need to do: - * ``` - * brew install protobuf-c - * brew install coreutils - * ``` - * Building protobuf from source is very slow, so avoid doing that - * if possible. Next install the C plugin for protocol buffers from - * [https://github.com/protobuf-c/protobuf-c]. - * - * Navigate to the directory containing the protocol buffer definition - * hello_string.proto. To compile it, run the command: - * ``` - * protoc-c --c_out=. hello_string.proto - * ``` - * This should generate the files "hello_string.pb-c.c" and "hello_string.pb-c.h". - * Move both files to the src-gen directory where the C code for this - * reactor is generated by Lingua Franca. Compile there with: - * ``` - * cc HelloProtocolBuffers.c hello_string.pb-c.c -l protobuf-c - * ``` - * and run - * ``` - * ./a.out - * ``` - * - * @author Matt Weber - * @author Edward A. Lee - */ - -target C { - protobufs: hello_string.proto -}; - -main reactor HelloProtocolBuffers { - - timer t; - reaction(t) {= - HelloString pack_msg = HELLO_STRING__INIT; // Macro to create the protocol buffer - void *buf; // Buffer to store the serialized data - unsigned len; // Length of the packed message - - char* hello_msg = "Hello Protocol Buffers!"; - pack_msg.message = hello_msg; - - //Pack the message into buf. - len = hello_string__get_packed_size(&pack_msg); - buf = malloc(len); - hello_string__pack(&pack_msg,buf); - - //Now unpack the message from buf. - HelloString *unpacked_msg; - unpacked_msg = hello_string__unpack(NULL, len, buf); - - //Extract and print the unpacked message. - printf("Read: %s\n", unpacked_msg->message); - free(buf); // Free the allocated serialized buffer - =} -} diff --git a/example/C/src/ProtocolBuffers/hello_string.proto b/example/C/src/ProtocolBuffers/hello_string.proto deleted file mode 100644 index 1af5a66756..0000000000 --- a/example/C/src/ProtocolBuffers/hello_string.proto +++ /dev/null @@ -1,5 +0,0 @@ -syntax = "proto3"; - -message HelloString { - string message = 1; -} \ No newline at end of file diff --git a/example/C/src/ROS/BasicROS.lf b/example/C/src/ROS/BasicROS.lf deleted file mode 100644 index b898974161..0000000000 --- a/example/C/src/ROS/BasicROS.lf +++ /dev/null @@ -1,169 +0,0 @@ -/** - * This is an example of exchanging messages between reactors using ROS2. - * - * There is a MessageGenerator reactor that publishes String messages on 'topic' - * and a MessageReceiver reactor that subscribes to 'topic'. - * - * 1- To get this example working, install full ROS 2 desktop - * ('https://index.ros.org/doc/ros2/Installation/Foxy/'). - * - * Please note that 'colcon' should also be installed. - * See 'https://index.ros.org/doc/ros2/Tutorials/Colcon-Tutorial/' for more details. - * - * 2- Follow the instruction in - * https://index.ros.org/doc/ros2/Tutorials/Writing-A-Simple-Cpp-Publisher-And-Subscriber/ - * **section 1** to create a 'cpp_pubsub' package in the current (example/ROS) folder. - * - * 3- Follow section 2.2 and 2.3 to modify the CMakeLists.txt and package.xml. - * - * 4- Replace the default C++14 standard in CMakeLists.txt (i.e., set(CMAKE_CXX_STANDARD 14)) - * with: - * - * # Default to C++20 - * if(NOT CMAKE_CXX_STANDARD) - * set(CMAKE_CXX_STANDARD 20) - * endif() - * - * 5- Add the following lines to CMakeLists.txt: - * - * add_compile_definitions(NUMBER_OF_WORKERS=4) - * - * add_library(platform_support src/core/platform/lf_linux_support.cpp) - * - * add_executable(talker src/BasicROS.cpp) - * - * target_link_libraries(talker platform_support) - * - * install(TARGETS - * platform_support - * DESTINATION lib - * ) - * - * 6- Use lfc (in bin/) to compile the provided .lf file - * - * lfc BasicROS.lf - * - * 7- Run the provided build-ROS-node.sh: - * - * ./build-ROS-node.sh BasicROS cpp_pubsub - * - * This will create a 'talker' node in the package cpp_pubsub (these names can be changed in - * CMakeLists.txt and in the argument to build-ROS-node.sh). - * - * 7- Source the appropriate setup.bash and run the node: - * - * source cpp_pubsub/install/setup.bash - * ros2 run cpp_pubsub talker - * - */ -target C { - keepalive: true, - logging: DEBUG, - no-compile: true -}; - -preamble {= - #include - #include - #include - #include - - #include "rclcpp/rclcpp.hpp" - #include "std_msgs/msg/string.hpp" -=} - -reactor MessageGenerator { - preamble {= - class MinimalPublisher : public rclcpp::Node { - public: - MinimalPublisher() - : Node("minimal_publisher") - { - publisher_ = this->create_publisher("topic", 10); - } - - rclcpp::Publisher::SharedPtr publisher_; - }; - =} - state minimal_publisher:{=std::shared_ptr=}; - state i:int(0); - timer t(0, 500 msec); - reaction(startup) {= - std::cout << "Executing startup." << std::endl; - char *argv[] = {(char*)"BasicROSPub", NULL}; - rclcpp::init(1, argv); - self->minimal_publisher = std::make_shared(); - =} - reaction(t) {= - auto message = std_msgs::msg::String(); - std::cout << "Executing timer reaction." << std::endl; - message.data = "Hello, world! " + std::to_string(self->i++); - RCLCPP_INFO(self->minimal_publisher->get_logger(), - "Sender publishing: '%s'", message.data.c_str()); - self->minimal_publisher->publisher_->publish(message); - rclcpp::spin_some(self->minimal_publisher); - std::cout << "Done executing timer reaction." << std::endl; - =} - - reaction(shutdown) {= - std::cout << "Executing shutdown reaction." << std::endl; - rclcpp::shutdown(); - =} -} - -reactor MessageReceiver { - preamble {= - class MinimalSubscriber : public rclcpp::Node { - public: - MinimalSubscriber(void* physical_action) - : Node("minimal_subscriber"), physical_action_(physical_action) { - subscription_ = this->create_subscription( - "topic", 10, std::bind(&MinimalSubscriber::topic_callback, this, std::placeholders::_1)); - } - - private: - void topic_callback(const std_msgs::msg::String::SharedPtr msg) const { - char* writable_string = (char*)malloc(msg->data.length() + 1); - strcpy(writable_string, msg->data.c_str()); - // writable_string[msg->data.length()] = '\0'; // Terminate with 0 - RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->data.c_str()); - std::cout << "At tag (" << get_elapsed_logical_time() << "," - << get_microstep() << ") calling schedule_value with value " - << writable_string << " and length " << msg->data.length() - << "." << std::endl; - schedule_copy(physical_action_, 0, &(writable_string), msg->data.length() + 1); - // std::cout << "Done calling schedule_value." << std::endl; - } - rclcpp::Subscription::SharedPtr subscription_; - void* physical_action_; - }; - =} - physical action ros_message_a:string; - state minimal_subscriber:{=std::shared_ptr=}; - reaction(startup) -> ros_message_a {= - // std::cout << "Executing startup." << std::endl; - self->minimal_subscriber = std::make_shared(ros_message_a); - =} - - reaction(ros_message_a){= - std::cout << "Physical action triggered." << std::endl; - printf("Received: %s.\n", ros_message_a->value); - =} - - - timer t(0, 500 msec); - reaction(t) {= - rclcpp::spin_some(self->minimal_subscriber); - // std::cout << "Timer triggered." << std::endl; - =} - - reaction(shutdown) {= - // std::cout << "Executing shutdown reaction." << std::endl; - rclcpp::shutdown(); - =} -} - -main reactor { - sender = new MessageGenerator(); - receiver = new MessageReceiver(); -} \ No newline at end of file diff --git a/example/C/src/ROS/PTIDES-ROS.lf b/example/C/src/ROS/PTIDES-ROS.lf deleted file mode 100644 index 11b2d275bc..0000000000 --- a/example/C/src/ROS/PTIDES-ROS.lf +++ /dev/null @@ -1,175 +0,0 @@ -/** - * This is an example of exchanging messages between reactors using ROS2. - * This version uses a 25 msec delay to demonstrate the usage of PTIDES - * to conserve message timestamp sent over the ROS2 network. - * - * There is a MessageGenerator reactor that publishes String messages on 'topic' - * and a MessageReceiver reactor that subscribes to 'topic'. - * - * 1- To get this example working, install full ROS 2 desktop - * ('https://index.ros.org/doc/ros2/Installation/Foxy/'). - * - * Please note that 'colcon' should also be installed. - * See 'https://index.ros.org/doc/ros2/Tutorials/Colcon-Tutorial/' for more details. - * - * 2- Follow the instruction in - * https://index.ros.org/doc/ros2/Tutorials/Writing-A-Simple-Cpp-Publisher-And-Subscriber/ - * **section 1** to create a 'cpp_pubsub' package in the current (example/ROS) folder. - * - * 3- Follow section 2.2 and 2.3 to modify the CMakeLists.txt and package.xml. - * - * 4- Replace the default C++14 standard in CMakeLists.txt (i.e., set(CMAKE_CXX_STANDARD 14)) - * with: - * - * # Default to C++20 - * if(NOT CMAKE_CXX_STANDARD) - * set(CMAKE_CXX_STANDARD 20) - * endif() - * - * 5- Add the following lines to CMakeLists.txt: - * - * add_compile_definitions(NUMBER_OF_WORKERS=4) - * - * add_library(platform_support src/core/platform/lf_linux_support.cpp) - * - * add_executable(talker src/PTIDES-ROS.cpp) - * - * target_link_libraries(talker platform_support) - * - * install(TARGETS - * platform_support - * DESTINATION lib - * ) - * - * 6- Use lfc (in bin/) to compile the provided .lf file - * - * lfc PTIDES-ROS.lf - * - * 7- Run the provided build-ROS-node.sh: - * - * ./build-ROS-node.sh PTIDES-ROS cpp_pubsub - * - * This will create a 'talker' node in the package cpp_pubsub (these names can be changed in - * CMakeLists.txt and in the argument to build-ROS-node.sh). - * - * 7- Source the appropriate setup.bash and run the node: - * - * source cpp_pubsub/install/setup.bash - * ros2 run cpp_pubsub talker - * - */ -target C { - keepalive: true, - no-compile: true -}; - -preamble {= - #include - #include - #include - #include - - #include "rclcpp/rclcpp.hpp" - #include "std_msgs/msg/int64.hpp" -=} - -reactor MessageGenerator { - preamble {= - class MinimalPublisher : public rclcpp::Node { - public: - MinimalPublisher() - : Node("minimal_publisher") - { - publisher_ = this->create_publisher("topic", 10); - } - - rclcpp::Publisher::SharedPtr publisher_; - }; - =} - state minimal_publisher:{=std::shared_ptr=}; - state i:int(0); - timer t(0, 500 msec); - reaction(startup) {= - // std::cout << "Executing startup." << std::endl; - char *argv[] = {(char*)"BasicROSPub", NULL}; - rclcpp::init(1, argv); - self->minimal_publisher = std::make_shared(); - =} - reaction(t) {= - auto message = std_msgs::msg::Int64(); - // std::cout << "Executing timer reaction." << std::endl; - message.data = get_logical_time() + MSEC(25); // Add a 25 msec delay - // RCLCPP_INFO(self->minimal_publisher->get_logger(), - // "Sender publishing: '%lld'", message.data); - self->minimal_publisher->publisher_->publish(message); - rclcpp::spin_some(self->minimal_publisher); - // std::cout << "Done executing timer reaction." << std::endl; - =} - - reaction(shutdown) {= - std::cout << "Executing shutdown reaction." << std::endl; - rclcpp::shutdown(); - =} -} - -reactor MessageReceiver { - preamble {= - class MinimalSubscriber : public rclcpp::Node { - public: - MinimalSubscriber(void* physical_action) - : Node("minimal_subscriber"), physical_action_(physical_action) { - subscription_ = this->create_subscription( - "topic", 10, std::bind(&MinimalSubscriber::topic_callback, this, std::placeholders::_1)); - } - - private: - void topic_callback(const std_msgs::msg::Int64::SharedPtr msg) const { - // writable_string[msg->data.length()] = '\0'; // Terminate with 0 - // RCLCPP_INFO(this->get_logger(), "I heard: '%lld'", msg->data); - // std::cout << "At tag (" << get_elapsed_logical_time() << "," - // << get_microstep() << ") calling schedule_copy with value " - // << msg->data << "." << std::endl; - schedule_copy(physical_action_, 0, &(msg->data), sizeof(instant_t)); - // std::cout << "Done calling schedule_value." << std::endl; - } - rclcpp::Subscription::SharedPtr subscription_; - void* physical_action_; - }; - =} - physical action ros_message_a:instant_t; - logical action ros_message_l; - state minimal_subscriber:{=std::shared_ptr=}; - reaction(startup) -> ros_message_a {= - // std::cout << "Executing startup." << std::endl; - self->minimal_subscriber = std::make_shared(ros_message_a); - =} - - reaction(ros_message_a) -> ros_message_l {= - // std::cout << "Physical action triggered." << std::endl; - // printf("Received: %lld.\n", ros_message_a->value); - schedule(ros_message_l, ros_message_a->value - get_logical_time()); - =} - - reaction(ros_message_l) {= - printf("PTIDES reaction called at tag (%lld, %u).\n", - get_elapsed_logical_time(), - get_microstep()); - =} - - - timer t(0, 5 msec); - reaction(t) {= - rclcpp::spin_some(self->minimal_subscriber); - // std::cout << "Timer triggered." << std::endl; - =} - - reaction(shutdown) {= - // std::cout << "Executing shutdown reaction." << std::endl; - rclcpp::shutdown(); - =} -} - -main reactor { - sender = new MessageGenerator(); - receiver = new MessageReceiver(); -} \ No newline at end of file diff --git a/example/C/src/ROS/README.md b/example/C/src/ROS/README.md deleted file mode 100644 index 84584f677a..0000000000 --- a/example/C/src/ROS/README.md +++ /dev/null @@ -1,21 +0,0 @@ -This folder contains some examples of possible interactions between ROS 2 and Lingua Franca. - -To install the latest version of ROS 2, refer to (https://index.ros.org/doc/ros2/Installation/). - -The examples have been tested on *Foxy Fitzroy* on Ubuntu 20.04 LTS. - -To see instructions on how to set up each example, refer to the files themselves. Here is an -overview of the current examples: - -- BasicROS: A basic two reactor example that publishes and subscribes to 'topic' and sends a "Hello, world!" string. - -- PTIDES-ROS: Similar to BasicROS but the content of the message is an Int64 which is the current logical time of - the sender + 25 msec. If 25 msec is sufficiently larger, the timestamp will be preserved between the - sender reactor and the receiver reactor. This is an implementation of a poor-person's Ptides. - -- ROSBuiltInSerialization: A two reactor sender-receiver example that demonstrates the built-in capability to serialize - and deserialize ROS 2 messages in federated programs using the CCpp target. - -- ROSSerialization: Similar to ROSBuiltInSerialization but the inner-workings of serialization and deserialization are - exposed in reaction bodies. - diff --git a/example/C/src/ROS/ROSBuiltInSerialization.lf b/example/C/src/ROS/ROSBuiltInSerialization.lf deleted file mode 100644 index b9e588a1ce..0000000000 --- a/example/C/src/ROS/ROSBuiltInSerialization.lf +++ /dev/null @@ -1,68 +0,0 @@ -/** - * This example showcases the infrastructure that is built into the - * CCpp target that can automatically serialize and deserialize ROS2 - * messages in federated programs. - * - * This example contains a sender-receiver federated program in which - * the 'sender' federate sends a std_msgs::msg::Int32 message to the - * 'receiver' federate. - * - * To run this example, make sure that your terminal is properly sourced - * for ROS2. See - * https://docs.ros.org/en/foxy/Tutorials/Configuring-ROS2-Environment.html. - * - * Then you can use lfc to compile this program: - * - * lfc ROSBuiltInSerialization.lf - * - * And launch the federated program in the `bin` folder: - * - * example/C/bin/ROSBuiltInSerialization - * - * @author Soroush Bateni - */ - target CCpp { - cmake: true, // Only CMake is supported - cmake-include: "include/CMakeListsExtension.txt", -}; - -preamble {= - #include "std_msgs/msg/int32.hpp" - -=} - -reactor Sender { - output out:std_msgs::msg::Int32; - - // state serialized_msg_pcl:rclcpp::SerializedMessage({=0u=}); - state count:int(0); - - timer t (0, 1 sec); - - reaction (t) -> out {= - std_msgs::msg::Int32 ros_message; - ros_message.data = self->count++; - SET(out, ros_message); - - =} -} - - -reactor Receiver { - input in:std_msgs::msg::Int32; - - reaction (in) {= - // Print the ROS2 message data - info_print( - "Serialized integer after deserialization: %d", - in->value.data - ); - =} -} - -federated reactor { - sender = new Sender(); - receiver = new Receiver(); - - sender.out -> receiver.in serializer "ros2"; -} diff --git a/example/C/src/ROS/ROSSerialization.lf b/example/C/src/ROS/ROSSerialization.lf deleted file mode 100644 index ae808c0f2a..0000000000 --- a/example/C/src/ROS/ROSSerialization.lf +++ /dev/null @@ -1,96 +0,0 @@ -/** - * A simple source-sink example that uses the federated Lingua Franca runtime to - * send ROS messages of type std_msgs::msg::Int32. The serialization/deserialization - * techniques are exposed here in the sender/receiver reactions. This mechanism should - * work for any ROS2 message type. - * - * Note: the terminal must be properly sourced for ROS2. See - * https://docs.ros.org/en/foxy/Tutorials/Configuring-ROS2-Environment.html. - * - * There is a variant of this example called ROSBuiltInSerialization.lf that uses - * the built-in ROS 2 serialization feature that is provided in LF. - */ -target CCpp { - coordination: decentralized, - timeout: 10 sec, - cmake-include: "include/CMakeListsExtension.txt", - files: ["include/ament_target_dependencies.cmake"], -}; - -preamble {= - #include "rclcpp/rclcpp.hpp" - #include "std_msgs/msg/int32.hpp" - #include "rcutils/allocator.h" - #include "rclcpp/rclcpp.hpp" - #include "rclcpp/serialization.hpp" - - - #include "rclcpp/serialized_message.hpp" - - #include "rosidl_typesupport_cpp/message_type_support.hpp" -=} - -reactor Clock(offset:time(0), period:time(1 sec)) { - output y:uint8_t*; - - timer t(0, period); - state count:int(0); - state serialized_msg:rclcpp::SerializedMessage({=0u=}); - reaction(t) -> y {= - - (self->count)++; - - // From https://github.com/ros2/demos/blob/master/demo_nodes_cpp/src/topics/talker_serialized_message.cpp - - auto msg = std::make_shared(); - msg->data = self->count; - - auto message_header_length = 8u; - auto message_payload_length = 10u; - self->serialized_msg.reserve(message_header_length + message_payload_length); - - static rclcpp::Serialization serializer_obj; - serializer_obj.serialize_message(msg.get(), &self->serialized_msg); - - SET_NEW_ARRAY(y, self->serialized_msg.size()); - y->value = self->serialized_msg.get_rcl_serialized_message().buffer; - =} -} -reactor Destination { - input x:uint8_t*; - - state s:int(1); - reaction(x) {= - auto message = std::make_unique( rcl_serialized_message_t{ - .buffer = (uint8_t*)x->token->value, - .buffer_length = x->token->length, - .buffer_capacity = x->token->length, - .allocator = rcl_get_default_allocator() - }); - - // Check the ref count == 1 - // info_print("%d", x->token->ref_count); - // assert(x->token->ref_count == 1); // Might be optimized away (see validate in cpp target) - - //rclcpp::SerializedMessage* msg = new rclcpp::SerializedMessage(x->token->length, rcl_get_default_allocator()); - auto msg = std::make_unique(std::move(*message.get())); - x->token->value = NULL; // Manually move it - - // In order to deserialize the message we have to manually create a ROS2 - // message in which we want to convert the serialized data. - std_msgs::msg::Int32 int_msg; - auto serializer_obj = rclcpp::Serialization(); - serializer_obj.deserialize_message(msg.get(), &int_msg); - - info_print("Received %d.", int_msg.data); - if (int_msg.data != self->s) { - warning_print("Expected %d and got %d.", self->s, int_msg.data); - } - self->s++; - =} -} -federated reactor (period:time(1 sec)) { - c = new Clock(period = period); - d = new Destination(); - c.y -> d.x; -} diff --git a/example/C/src/ROS/build-ROS-node.sh b/example/C/src/ROS/build-ROS-node.sh deleted file mode 100755 index 9861b1ea02..0000000000 --- a/example/C/src/ROS/build-ROS-node.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -# usage: ./build-ROS-node name-of-lf-file-without-.lf name-of-ROS-package -lfc -r $1.lf -cp -R src-gen/$1/* $2/src/ -mv $2/src/$1.c $2/src/$1.cpp -mv $2/src/core/platform/lf_linux_support.c $2/src/core/platform/lf_linux_support.cpp -pushd $2 -colcon build --packages-select $2 -popd diff --git a/example/C/src/ROS/include/CMakeListsExtension.txt b/example/C/src/ROS/include/CMakeListsExtension.txt deleted file mode 100644 index 2caddb8b3b..0000000000 --- a/example/C/src/ROS/include/CMakeListsExtension.txt +++ /dev/null @@ -1,9 +0,0 @@ -find_package(ament_cmake REQUIRED) -find_package(rclcpp REQUIRED) -find_package(rclcpp_components REQUIRED) -find_package(rcutils) -find_package(rmw REQUIRED) -find_package(sensor_msgs REQUIRED) -find_package(std_msgs REQUIRED) - -ament_target_dependencies( ${LF_MAIN_TARGET} rclcpp sensor_msgs std_msgs rmw) \ No newline at end of file diff --git a/example/C/src/ReflexGame.lf b/example/C/src/ReflexGame.lf deleted file mode 100644 index 16a65b0527..0000000000 --- a/example/C/src/ReflexGame.lf +++ /dev/null @@ -1,137 +0,0 @@ -/** - * This example illustrates the use of logical and physical actions, - * asynchronous external inputs, the use of startup and shutdown - * reactions, and the use of actions with values. - * - * The example is fashioned after an Esterel implementation given by - * Berry and Gonthier in "The ESTEREL synchronous programming language: - * design, semantics, implementation," Science of Computer Programming, - * 19(2) pp. 87-152, Nov. 1992, DOI: 10.1016/0167-6423(92)90005-V. - * - * @author Edward A. Lee - * @author Marten Lohstroh - */ -target C { - keepalive: true -}; -/** - * Produce a counting sequence at random times with a minimum - * and maximum time between outputs specified as parameters. - * - * @param min_time The minimum time between outputs. - * @param max_time The maximum time between outputs. - */ -reactor RandomSource(min_time:time(2 sec), max_time:time(8 sec)) { - preamble {= - // Generate a random additional delay over the minimum. - // Assume millisecond precision is enough. - interval_t additional_time(interval_t min_time, interval_t max_time) { - int interval_in_msec = (max_time - min_time) / MSEC(1); - return (rand() % interval_in_msec) * MSEC(1); - } - =} - input another:int; - output out:int; - logical action prompt(min_time); - state count:int(0); - - reaction(startup) -> prompt {= - printf("***********************************************\n"); - printf("Watch for the prompt, then hit Return or Enter.\n"); - printf("Type Control-D (EOF) to quit.\n\n"); - - // Random number functions are part of stdlib.h, which is included by reactor.h. - // Set a seed for random number generation based on the current time. - srand(time(0)); - - // Schedule the first event. - schedule(prompt, additional_time(0, self->max_time - self->min_time)); - =} - reaction(prompt) -> out {= - self->count++; - printf("%d. Hit Return or Enter!", self->count); - fflush(stdout); - SET(out, self->count); - =} - reaction(another) -> prompt {= - // Schedule the next event. - schedule(prompt, additional_time(0, self->max_time - self->min_time)); - =} -} -/** - * Upon receiving a prompt, record the time of the prompt, - * then listen for user input. When the user hits return, - * then schedule a physical action that records the time - * of this event and then report the response time. - */ -reactor GetUserInput { - preamble {= - // Thread to read input characters until an EOF is received. - // Each time a newline is received, schedule a user_response action. - void* read_input(void* user_response) { - int c; - while(1) { - while((c = getchar()) != '\n') { - if (c == EOF) break; - } - schedule_copy(user_response, 0, &c, 1); - if (c == EOF) break; - } - return NULL; - } - =} - - physical action user_response:char; - state prompt_time:time(0); - state total_time_in_ms:int(0); - state count:int(0); - - input prompt:int; - output another:int; - - reaction(startup) -> user_response {= - // Start the thread that listens for Enter or Return. - lf_thread_t thread_id; - lf_thread_create(&thread_id, &read_input, user_response); - =} - - reaction(prompt) {= - self->prompt_time = get_logical_time(); - =} - - reaction(user_response) -> another {= - if (user_response->value == EOF) { - request_stop(); - return; - } - // If the prompt_time is 0, then the user is cheating and - // hitting return before being prompted. - if (self->prompt_time == 0LL) { - printf("YOU CHEATED!\n"); - request_stop(); - } else { - int time_in_ms = (get_logical_time() - self->prompt_time) / 1000000LL; - printf("Response time in milliseconds: %d\n", time_in_ms); - self->count++; - self->total_time_in_ms += time_in_ms; - // Reset the prompt_time to indicate that there is no new prompt. - self->prompt_time = 0LL; - // Trigger another prompt. - SET(another, 42); - } - =} - - reaction(shutdown) {= - if (self->count > 0) { - printf("\n**** Average response time: %d.\n", self->total_time_in_ms/self->count); - } else { - printf("\n**** No attempts.\n"); - } - =} -} -main reactor ReflexGame { - p = new RandomSource(); - g = new GetUserInput(); - p.out -> g.prompt; - g.another -> p.another; -} diff --git a/example/C/src/ReflexGame/ReflexGameTest.lf b/example/C/src/ReflexGame/ReflexGameTest.lf deleted file mode 100644 index b959c39c56..0000000000 --- a/example/C/src/ReflexGame/ReflexGameTest.lf +++ /dev/null @@ -1,48 +0,0 @@ -target C { - keepalive: true, - timeout: 5 sec -}; -main reactor { - preamble {= - // Specify a thread that sends all keyboard characters - // as valued physical actions until an EOF (control-d or - // control-z) is received. - void* read_char(void* a) { - while(1) { - char* c = (char*)malloc(sizeof(char)); - *c = getchar(); - schedule_value(a, 0, c, 1); - if (*c == EOF) break; - } - return NULL; - } - =} - - state thread_id:lf_thread_t(0); - state request_time:time(0); - // NOTE: The following will get the default 1 nsec minimum - // interarrival time. - physical action a:char*; - - reaction(startup) -> a {= - // Start listening for key strokes. - // Note that these will not be received until Enter. - lf_thread_create(&self->thread_id, &read_char, a); - printf("Enter character(s) followed by return: "); - self->request_time = get_logical_time(); - =} - - reaction(a) {= - if (*a->value == EOF) { - printf("\nEnd of file received.\n"); - request_stop(); - } else if (*a->value == '\n') { - printf("Enter character(s) followed by return: "); - self->request_time = get_logical_time(); - fflush(stdout); - } else { - interval_t elapsed = get_logical_time() - self->request_time; - printf("Character entered: %c after %lld nsec.\n", *a->value, elapsed); - } - =} -} diff --git a/example/C/src/Rhythm/CMakeLists.txt b/example/C/src/Rhythm/CMakeLists.txt deleted file mode 100644 index 6465f1aa8e..0000000000 --- a/example/C/src/Rhythm/CMakeLists.txt +++ /dev/null @@ -1,63 +0,0 @@ -# This is a cmake build script providing an alternative solution for compiling -# the Rhythm example in this directory.. -# -# Usage: -# -# The following commands assume that your current working directory is -# ''example/C' within the LF repository. To build the Rhythm example, first -# generate the sources with lfc. To compile with cmake, run the following -# commands: -# -# $> mkdir build && cd build -# $> cmake -DLF_SOURCE_GEN_DIRECTORY=../src-gen/Rhythm/Rhythm ../src/Rhythm/ -# $> make -# -# This create a binary Rhythm in the current working directory. Note that the -# build directory can be created anywhere in the file system. Only the paths -# provided to the call to cmake need to be adjusted accordingly - -cmake_minimum_required(VERSION 3.12) -project(Rythm VERSION 1.0.0 LANGUAGES C) - -# check which system we are running on to select the correct platform support -# file and assign the file's path to LF_PLATFORM_FILE -if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") - set(LF_PLATFORM_FILE "${LF_SOURCE_GEN_DIRECTORY}/core/platform/lf_linux_support.c") -elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") - set(LF_PLATFORM_FILE "${LF_SOURCE_GEN_DIRECTORY}/core/platform/lf_macos_support.c") -else() - message(FATAL_ERROR "Your platform is not supported!") -endif() - -# declare a new executable target and list all its sources -add_executable(Rhythm "${LF_SOURCE_GEN_DIRECTORY}/Rhythm.c" "${LF_PLATFORM_FILE}") - -# set the number of workers to 2 -target_compile_definitions(Rhythm PUBLIC NUMBER_OF_WORKERS=2) - -# The above code could be generated by the c code generator -#################################################################################### -# The below code could be provided by the user in a cmake include file. The C++ -# target uses the `cmake-include` target property for this purpose - -# find pthreads and link to it -find_package(Threads REQUIRED) -target_link_libraries(Rhythm Threads::Threads) - -# find curses and link to it -find_package(Curses REQUIRED) -# the find function of curses does not define a convenient target as for threads -# above. Thus, wee need to configure the include dir and libraries individually. -target_include_directories(Rhythm PUBLIC ${CURSES_INCLUDE_DIR}) -target_link_libraries(Rhythm ${CURSES_LIBRARIES}) - -if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") - # If on linux, then find and link to alsa - find_package(ALSA REQUIRED) - target_link_libraries(Rhythm ALSA::ALSA) -else() - # on Mac OS, we find and link to AudioToolbox and CoreFoundation instead - find_library(AudioToolbox "AudioToolbox") - find_library(CoreFoundation "CoreFoundation") - target_link_libraries(Rhythm ${AudioToolbox} ${CoreFoundation}) -endif() diff --git a/example/C/src/Rhythm/PlayWaveform.lf b/example/C/src/Rhythm/PlayWaveform.lf deleted file mode 100644 index 82f36196a3..0000000000 --- a/example/C/src/Rhythm/PlayWaveform.lf +++ /dev/null @@ -1,114 +0,0 @@ -/** - * Reactor to play a waveform defined in a .wav file. - * It serves as a demonstration for how to write Lingua Franca - * programs that use Apple's AudioToolbox. - * - * To use this, you must include the target parameters that are - * given below. - * - * This reactor provides a small collection of built-in audio - * waveforms which are read at startup time from .wav files. - * The waveform input specifies which of the waveforms to play - * upon the next `note` input received. - * It is a number between 0 and NUM_WAVEFORMS. If a number outside - * this range is received, then simple tick sounds will be produced. - * Number 0 is specially interpreted for silence. - * - * The `note` input is a number, normally between 0.0 and 1.0, - * that specifies the loudness of the note. If the loudness exceeds - * 1.0, or if too many notes are played at once, clipping may occur. - * - * The sound files come from here: - * https://freewavesamples.com - * - * Sound files are assumed to be wav files with sample rate 44,100, - * 16-bit samples, linear PCM encoded. - * Use afconvert on Mac to convert to the assumed input format. - * - * @author Edward A. Lee - */ -target C { - // Include the following flags in the file that imports this reactor. - // These are commented out here because this file is only compiled to a .o file - // and is not linked, so including these flags results in a warning. - // flags: ["-framework", "AudioToolbox", "-framework", "CoreFoundation", "-lm"], - files: ["/lib/c/reactor-c/util/wave_file_reader.c", "/lib/c/reactor-c/util/wave_file_reader.h", - "/lib/c/reactor-c/util/audio_loop_mac.c", "/lib/c/reactor-c/util/audio_loop.h", - "/lib/c/reactor-c/util/audio_loop_linux.c", - "sounds/Bass-Drum-1.wav", "sounds/Hi-Bongo.wav", "sounds/Claves.wav", "sounds/High-Conga-1.wav", - "sounds/Cowbell-1.wav", "sounds/Cuica-1.wav", "sounds/Guiro.wav", - "sounds/Ensoniq-ESQ-1-Snare.wav", "sounds/Floor-Tom-1.wav"], - // Include the cmake support for the audio loop - cmake-include: ["/lib/c/reactor-c/util/audio_loop.cmake"] -} -preamble {= - #include "wave_file_reader.c" - #include "audio_loop.h" - - // wav files giving the waveforms. - // These have to also be included in the files target directive. - #define NUM_WAVEFORMS 9 // Number of waveforms. - char* waveform_files[] = { - TARGET_FILES_DIRECTORY "/Bass-Drum-1.wav", - TARGET_FILES_DIRECTORY "/Hi-Bongo.wav", - TARGET_FILES_DIRECTORY "/Claves.wav", - TARGET_FILES_DIRECTORY "/High-Conga-1.wav", - TARGET_FILES_DIRECTORY "/Cowbell-1.wav", - TARGET_FILES_DIRECTORY "/Cuica-1.wav", - TARGET_FILES_DIRECTORY "/Guiro.wav", - TARGET_FILES_DIRECTORY "/Ensoniq-ESQ-1-Snare.wav", - TARGET_FILES_DIRECTORY "/Floor-Tom-1.wav" - }; - - // The waveforms themselves. - lf_waveform_t* waveforms[NUM_WAVEFORMS + 1]; - - lf_waveform_t empty_waveform = { 0 }; -=} - -/** - * Produce a note when a `note` input is received. - */ -reactor PlayWaveform ( - default_waveform_id:int(0) // Silent waveform -) { - input note:float; - input waveform:int; - - /** - * Index of the current waveform. - * -1 means no waveform (just make ticks)). - */ - state waveform_id:int(default_waveform_id); - - reaction(startup) {= - - // First waveform is empty. - waveforms[0] = &empty_waveform; - - // Open and read waveform files. - for (int i = 0; i < NUM_WAVEFORMS; i++) { - waveforms[i + 1] = read_wave_file(waveform_files[i]); - } - - // Start an audio loop that will become ready to receive - // amplitude samples of audio data. - lf_start_audio_loop(get_logical_time()); - =} - - reaction(waveform) {= - self->waveform_id = waveform->value; - =} - - reaction(note) {= - if (self->waveform_id < 0 || self->waveform_id > NUM_WAVEFORMS) { - lf_play_audio_waveform(NULL, note->value, get_logical_time()); - } else { - lf_play_audio_waveform(waveforms[self->waveform_id], note->value, get_logical_time()); - } - =} - - reaction(shutdown) {= - lf_stop_audio_loop(); - =} -} diff --git a/example/C/src/Rhythm/Rhythm.lf b/example/C/src/Rhythm/Rhythm.lf deleted file mode 100644 index 49b93f2fdd..0000000000 --- a/example/C/src/Rhythm/Rhythm.lf +++ /dev/null @@ -1,325 +0,0 @@ -/** - * Rhythm generator using samples of percussion instruments. - * This program runs on MacOS and Linux, at least. - * - * This program opens a simple, terminal-based user interface for - * specifying a rhythmic audio output. The rhythm is displayed in - * the terminal as it is generated and produced as audio using - * sample audio files. - * - * This program also uses ncurses, which needs to be installed on your machine - * for this to work. It also uses the library utility sensor_simulator, - * provided with Lingua Franca, which uses keyboard input to simulate - * asynchronous sensors and beeps to simulate timed output. - * See sensor_simulator.h for documentation. - * - * The merengue rhythm comes from here: - * https://www.8notes.com/school/lessons/percussion/merengue.asp - * - * The sound files come from here: - * https://freewavesamples.com - * - * Sound files are assumed to be wav files with sample rate 44,100, - * 16-bit samples, linear PCM encoded. - * Use afconvert on Mac to convert to the assumed input format. - * - * @author Edward A. Lee - * - * @see RhythmDistributed.lf - * @see RhythmDistributedNoUI.lf - */ -target C { - tracing: true, - files: [ - "/lib/c/reactor-c/util/sensor_simulator.c", "/lib/c/reactor-c/util/sensor_simulator.h", - "/lib/c/reactor-c/util/wave_file_reader.c", "/lib/c/reactor-c/util/wave_file_reader.h", - "/lib/c/reactor-c/util/audio_loop_mac.c", "/lib/c/reactor-c/util/audio_loop.h", - "/lib/c/reactor-c/util/audio_loop_linux.c", - "sounds/Bass-Drum-1.wav", "sounds/Hi-Bongo.wav", "sounds/Claves.wav", "sounds/High-Conga-1.wav", - "sounds/Cowbell-1.wav", "sounds/Cuica-1.wav", "sounds/Guiro.wav", - "sounds/Ensoniq-ESQ-1-Snare.wav", "sounds/Floor-Tom-1.wav"], - // Include cmake support for some needed functionality - cmake-include: [ - "/lib/c/reactor-c/util/sensor_simulator.cmake", // Enable support for the sensor simulator - "include/ncurses-extension.cmake", // Enable support for ncurses - "include/mlib-extension.cmake"] // Enable support for the math lib -}; - -import PlayWaveform from "PlayWaveform.lf" - -preamble {= - #include - #include // Defines mkdir. - #include "sensor_simulator.h" - - ///////////////////////////// - // Configuration of the audio. - - // Beat pattern with 1 note followed by 7 silences, repeated. - #define DOWNBEAT 0x0101 - - // Merenque in binary covers two bars (in temporal order): 1001 1010 1010 1111 - // Reverse the order to get the bit sequence: 1111 0101 0101 1001 - #define MERENGUE 0xf559 - // Merengue emphasis in binary (in temporal order): 1001 0010 0010 1000 - // Reverse the order to get the bit sequence: 0001 0100 0100 1001 - #define MERENGUE_EMPHASIS 0x1449 - - // Bossa nova: In temporal order: 1001 0010 0010 0110 - // Note: last '1' is questionable. Held over from previous '1'. - // Reverse order: 0110 0100 0100 1001 - #define BOSSA_NOVA 0x6449 - #define BOSSA_NOVA_EMPHASIS 0x2449 - - // Samba: Temporal order: 0000 1010 1101 1010 - // Reversed: 0101 1011 0101 0000 - // Alt: 0101 1011 1011 1011 - // Rev: 1101 1101 1101 1010 - #define SAMBA 0xddda - #define SAMBA_EMPHASIS 0x99ca - - ////////////////////////////////////// - // Configuration of the user interface. - - char* instructions[] = { - "Basic control:", - " x: quit", - " +: speed up", - " -: slow down", - "Instrument:", - " 0: none", - " 1: bass drum", - " 2: bongo", - " 3: claves", - " 4: conga", - " 5: cowbell", - " 6: cuica", - " 7: guiro", - " 8: snare", - " 9: tom", - "Rhythm:", - " d: down beat", - " m: merengue", - " b: bossa nova", - " s: samba" - }; - int instructions_length = 20; -=} - -/** - * Reactor that outputs notes (which carry an emphasis)) - * according to a specified rhythm. The minimum time - * between notes is given by the 'tick_duration' state - * variable. This can be adjusted up or down. - * This is designed to coordinate between multiple - * instances of this RhythmSource so each can change - * the rhythm and tempo while keeping the others in sync. - * - * @param sixteenth Initial duration of one sixteenth note. - * @param delta The amount by which to change sixteenth when tempo is increased or decreased. - * @param message An array of strings to display. - * @param message_length The length of the message array. - */ -reactor RhythmSource( - sixteenth:time(200 msec), - delta:time(10 msec), - message:char**({=instructions=}), - message_length:int({=instructions_length=}), - log_to_file:bool(false) -) { - input rhythm_change_in:char; // To change the rhythm. - input tempo_change_in:interval_t; // To change the tempo. - - output note:float; // To play a note with the given emphasis. - output instrument:int; // Instrument selection. - output rhythm_change:char; // To change the rhythm. - output tempo_change:interval_t; // To change the tempo. - - state tick_duration:time(200 msec); - logical action tick; - - // Count of sixteenth notes. - state count:int(0); - - // Action to be invoked when a key is pressed. - physical action key:char; - - // Indicator of when to make a sound. - state rhythm:int({=DOWNBEAT=}); - - // Indicator of whether to emphasize the sound. - state emphasis:int({=DOWNBEAT=}); - - // Currently active rhythm. This becomes - // active from rhythm on the downbeat. - state active_rhythm:int({=DOWNBEAT=}); - - // Currently active emphasis. This becomes - // active from rhythm on the downbeat. - state active_emphasis:int({=DOWNBEAT=}); - - // Position of the cursor in the terminal window. - state cursor:int(0); - - reaction(startup) -> key, note, tick {= - // Start the sensor simulator, which starts ncurses. - char* log_file_name = NULL; - if (self->log_to_file) { - log_file_name = calloc(40, sizeof(char)); - // FIXME: log directory won't work in Windows (wrong separator). - mkdir("log", 0755); - int fed_id = get_fed_id(); - if (fed_id < 0) { - sprintf(log_file_name, "log/Rhythm_%lld.log", get_logical_time()); - } else { - sprintf(log_file_name, "log/Rhythm_%d_%lld.log", fed_id, get_logical_time()); - } - } - if (start_sensor_simulator( - self->message, self->message_length, 16, log_file_name, LOG_LEVEL_ALL - )) { - error_print_and_exit("ERROR: Failed to start sensor simulator."); - } - - // Register action to trigger on key press. - register_sensor_key('\0', key); - - schedule(tick, self->tick_duration); - =} - - /** - * React to a key press. - */ - reaction(key) -> instrument, rhythm_change, tempo_change {= - int numeric; - switch (key->value) { - case '0': - SET(instrument, 0); - break; - case 'd': - self->rhythm = DOWNBEAT; - self->emphasis = DOWNBEAT; - SET(rhythm_change, 'd'); - info_print("Changing rhythm to downbeat only."); - break; - case 'm': - self->rhythm = MERENGUE; - self->emphasis = MERENGUE_EMPHASIS; - SET(rhythm_change, 'm'); - info_print("Changing rhythm to merengue."); - break; - case 'b': - self->rhythm = BOSSA_NOVA; - self->emphasis = BOSSA_NOVA_EMPHASIS; - SET(rhythm_change, 'b'); - info_print("Changing rhythm to bossa nova."); - break; - case 's': - self->rhythm = SAMBA; - self->emphasis = SAMBA_EMPHASIS; - SET(rhythm_change, 's'); - info_print("Changing rhythm to samba."); - break; - case 'x': - request_stop(); - break; - case '+': - self->tick_duration -= self->delta; - if (self->tick_duration < self->delta) { - self->tick_duration = self->delta; - } - SET(tempo_change, self->delta); - info_print("Speeding up tempo."); - break; - case '-': - self->tick_duration += self->delta; - SET(tempo_change, -self->delta); - info_print("Slowing down tempo."); - break; - default: - numeric = (int)key->value; - if (numeric >= 49 && numeric <= 57) { - // A digit between 1 and 9. - SET(instrument, numeric - 48); - info_print("Changing instrument to %c.", numeric); - } - } - =} - - /** - * React to a remote rhythm change. - */ - reaction(rhythm_change_in) {= - switch (rhythm_change_in->value) { - case 'm': - self->rhythm = MERENGUE; - self->emphasis = MERENGUE_EMPHASIS; - info_print("REMOTE: Changing rhythm to merengue."); - break; - case 'b': - self->rhythm = BOSSA_NOVA; - self->emphasis = BOSSA_NOVA_EMPHASIS; - info_print("REMOTE: Changing rhythm to bossa nova."); - break; - case 's': - self->rhythm = SAMBA; - self->emphasis = SAMBA_EMPHASIS; - info_print("REMOTE: Changing rhythm to samba."); - break; - default: - self->rhythm = DOWNBEAT; - self->emphasis = DOWNBEAT; - info_print("REMOTE: Changing rhythm to downbeat only."); - break; - } - =} - - reaction(tempo_change_in) {= - self->tick_duration -= tempo_change_in->value; - info_print("REMOTE: Changing the tempo period by %lld ns.", - -tempo_change_in->value - ); - =} - - reaction(tick) -> note, tick {= - int beeped = 0; - int position = 0; - position = 1 << self->count; - if (position & self->active_rhythm) { - double emphasis = 0.25; - if (position & self->active_emphasis) { - emphasis = 1.0; - } - SET(note, emphasis); - beeped++; - } - if (beeped > 0) { - if (position & self->active_emphasis) { - show_tick("!"); - } else { - show_tick("*"); - } - } else { - show_tick("."); - } - self->count++; - if (self->count == 16) { - self->active_rhythm = self->rhythm; - self->active_emphasis = self->emphasis; - self->count = 0; - } - - schedule(tick, self->tick_duration); - =} - - reaction(shutdown) {= - end_sensor_simulator(); - =} -} - -main reactor { - source = new RhythmSource(); - play = new PlayWaveform(); - source.note -> play.note; - source.instrument -> play.waveform; -} \ No newline at end of file diff --git a/example/C/src/Rhythm/RhythmDistributed.lf b/example/C/src/Rhythm/RhythmDistributed.lf deleted file mode 100644 index fa1bee5aeb..0000000000 --- a/example/C/src/Rhythm/RhythmDistributed.lf +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Demonstration of timed distributed Lingua Franca programs. - * This program runs on MacOS and Linux, at least. - * - * This program elaborates Rhythm to have two players that - * run on different machines. Both players can select a musical - * instrument, but only one of the players can control the rhythm - * and the tempo. - * - * To run this program, open three distinct terminal windows - * and run the following generated binaries, one in each window: - * - * * RTI -n 2 - * * bin/RhythmDistributed_player1 - * * bin/RhythmDistributed_player2 - * - * The `-n 2` argument specifies the number of federates. - * Note that you have to have installed the RTI on your path. - * See the instructions in the README file in this directory in the LF repo: - * - * org.lflang/src/lib/core/federated/RTI - * - * You can also map these three to distinct machines by specifying an `at` clause - * on the lines at the end of this file that instantiate the reactors. - * See [[https://github.com/icyphy/lingua-franca/wiki/Distributed-Execution]]. - * - * @see Rhythm.lf - * @see RhythmDistributedNoUI.lf - * - * @author Edward A. Lee - */ -target C { - coordination: centralized, - files: [ - "/lib/C/util/sensor_simulator.c", "/lib/C/util/sensor_simulator.h", - "/lib/C/util/wave_file_reader.c", "/lib/C/util/wave_file_reader.h", - "/lib/C/util/audio_loop_mac.c", "/lib/C/util/audio_loop.h", - "/lib/C/util/audio_loop_linux.c", - "sounds/Bass-Drum-1.wav", "sounds/Hi-Bongo.wav", "sounds/Claves.wav", "sounds/High-Conga-1.wav", - "sounds/Cowbell-1.wav", "sounds/Cuica-1.wav", "sounds/Guiro.wav", - "sounds/Ensoniq-ESQ-1-Snare.wav", "sounds/Floor-Tom-1.wav"] -}; - -import RhythmSource from "Rhythm.lf" -import PlayWaveform from "PlayWaveform.lf" - -reactor Player { - input tempo_change_in:interval_t; // To accept a tempo change. - input rhythm_change_in:char; // To accept a rhythm change. - output tempo_change:interval_t; // To change the tempo. - output rhythm_change:char; // To change the rhythm. - source = new RhythmSource(); - play = new PlayWaveform(); - source.note -> play.note; - source.instrument -> play.waveform; - source.rhythm_change -> rhythm_change; - source.tempo_change -> tempo_change; - rhythm_change_in -> source.rhythm_change_in; - tempo_change_in -> source.tempo_change_in; -} - -federated reactor { - player1 = new Player(); - player2 = new Player(); - player1.rhythm_change -> player2.rhythm_change_in; - player1.tempo_change -> player2.tempo_change_in; - player2.rhythm_change -> player1.rhythm_change_in; - player2.tempo_change -> player1.tempo_change_in; -} \ No newline at end of file diff --git a/example/C/src/Rhythm/RhythmDistributedNoUI.lf b/example/C/src/Rhythm/RhythmDistributedNoUI.lf deleted file mode 100644 index 3d268a2043..0000000000 --- a/example/C/src/Rhythm/RhythmDistributedNoUI.lf +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Rhythm generator using samples of percussion instruments. - * This version can run on multiple machines leveraging - * synchronized clocks to stay in sync. - * This program runs on MacOS and Linux, at least. - * - * This program tests clock synchronization by producing - * sounds on each of two computers that, if the clocks are - * synchronized well enough, sound like they are occurring - * at identical times. In this version, there is no communication - * between the components other than clock synchronization. - * - * To map these programs onto distinct machines, at the end - * of this file, change the lines like this: - * ``` - * player1 = new RhythmPlayer(); - * ``` - * to something like - * ``` - * player1 = new RhythmPlayer() at 10.0.0.42; - * ``` - * where the last part is the IP address or machine name of - * a machine on which you want to run the particular component. - * See [[https://github.com/icyphy/lingua-franca/wiki/Distributed-Execution]]. - * - * @see RhythmMac.lf - * @see RhythmMacDistributed.lf - * @see RhythmMacDistributedIndependent.lf - * - * @author Edward A. Lee - */ -target C { - coordination: decentralized, - timeout: 10 sec, - clock-sync: on, - clock-sync-options: { - local-federates-on: true, - test-offset: 200 msec, - period: 5 msec, - trials: 10, - attenuation: 10 - }, - files: [ - "/lib/C/util/wave_file_reader.c", "/lib/C/util/wave_file_reader.h", - "/lib/C/util/audio_loop_mac.c", "/lib/C/util/audio_loop.h", - "/lib/C/util/audio_loop_linux.c", - "sounds/Bass-Drum-1.wav", "sounds/Hi-Bongo.wav", "sounds/Claves.wav", "sounds/High-Conga-1.wav", - "sounds/Cowbell-1.wav", "sounds/Cuica-1.wav", "sounds/Guiro.wav", - "sounds/Ensoniq-ESQ-1-Snare.wav", "sounds/Floor-Tom-1.wav"] -}; -import PlayWaveform from "PlayWaveform.lf" - -/** - * Reactor that outputs a note request at the specified period. - */ -reactor BeatSource(period:time(1600 msec)) { - output note:float; // To play a note with the given emphasis. - - timer tick(0, period); - - reaction(tick) -> note {= - SET(note, 1.0f); - =} -} - -reactor RhythmPlayer { - source = new BeatSource(); - play = new PlayWaveform(default_waveform_id = 3); - source.note -> play.note; -} - -federated reactor { - player1 = new RhythmPlayer(); - player2 = new RhythmPlayer(); -} - diff --git a/example/C/src/Rhythm/SensorSimulator.lf b/example/C/src/Rhythm/SensorSimulator.lf deleted file mode 100644 index 8eb6383713..0000000000 --- a/example/C/src/Rhythm/SensorSimulator.lf +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Simple demonstration of the sensor simulator used in the Rhythm examples. - * This has no audio output, but just tests the ncurses interface. - */ -target C { - keepalive: true, - files: [ - "/lib/c/reactor-c/util/sensor_simulator.c", - "/lib/c/reactor-c/util/sensor_simulator.h", - ], - cmake-include: [ - "/lib/c/reactor-c/util/sensor_simulator.cmake", - "include/ncurses-extension.cmake" - ] -}; -preamble {= - #include "sensor_simulator.h" - char* messages[] = {"Hello", "World"}; - int num_messages = 2; -=} -main reactor { - timer t(0, 1 sec); - timer r(0, 2 sec); - physical action key:char*; - reaction(startup) -> key {= - info_print("Starting sensor simulator."); - start_sensor_simulator(messages, num_messages, 16, NULL, LOG_LEVEL_INFO); - register_sensor_key('\0', key); - =} - reaction(t) {= - show_tick("*"); - =} - reaction(r) {= - info_print("Elapsed logical time: %lld.", get_elapsed_logical_time()); - show_tick("."); - =} - reaction(key) {= - info_print("You typed '%s' at elapsed time %lld.", key->value, get_elapsed_logical_time()); - =} -} diff --git a/example/C/src/Rhythm/compile.sh b/example/C/src/Rhythm/compile.sh deleted file mode 100755 index 1eec9942bb..0000000000 --- a/example/C/src/Rhythm/compile.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash -# -# Script to compile the code generated by lfc or by the Lingua Franca IDE -# for the programs in this directory using arguments that are suitable to the -# OS on which this is running. The OS is detected using the Posix command uname. -# This script will only work for Posix-compliant platforms such as MacOS and Linux. -# This script is expected to be run in the directory in which the generated code -# and all supporting files are placed. -# -# Usage: -# -# compile.sh root_file_name -# -# where the root_file_name is one of Rhythm, RhythmDistributed_player1, etc., and -# bin_dir is the directory into which to put the resulting binary. - -CC="gcc" - -# Identify the operating system -OS=`uname` -if [[ "$OS" == *"Darwin"* ]] -then - echo "*** Compiling for MacOS" - echo "*** Current directory is $LF_CURRENT_WORKING_DIRECTORY" - $CC ${LF_SOURCE_GEN_DIRECTORY}/$1.c \ - ${LF_SOURCE_GEN_DIRECTORY}/core/platform/lf_macos_support.c \ - -o ${LF_BIN_DIRECTORY}/$1 \ - -pthread -DNUMBER_OF_WORKERS=2 \ - -lncurses -framework AudioToolbox -framework CoreFoundation -lm - echo "*** Bin directory is $LF_BIN_DIRECTORY" - -elif [[ "$OS" == *"Linux"* ]] -then - echo "*** Compiling for Linux" - echo "*** Current directory is $LF_CURRENT_WORKING_DIRECTORY" - $CC ${LF_SOURCE_GEN_DIRECTORY}/$1.c \ - ${LF_SOURCE_GEN_DIRECTORY}/core/platform/lf_linux_support.c \ - -o ${LF_BIN_DIRECTORY}/$1 \ - -lpthread -DNUMBER_OF_WORKERS=2 \ - -lncurses -lasound -lm - echo "*** Bin directory is $LF_BIN_DIRECTORY" -else - echo "*** Unsupported operating system: ${OS}. Attempting Linux compile." - echo "*** Current directory is $LF_CURRENT_WORKING_DIRECTORY" - $CC ${LF_SOURCE_GEN_DIRECTORY}/$1.c \ - ${LF_SOURCE_GEN_DIRECTORY}/core/platform/lf_macos_support.c \ - -o ${LF_BIN_DIRECTORY}/$1 \ - -lpthread -DNUMBER_OF_WORKERS=2 \ - -lncurses -lasound -lm - echo "*** Bin directory is $LF_BIN_DIRECTORY" -fi - diff --git a/example/C/src/Rhythm/include/mlib-extension.cmake b/example/C/src/Rhythm/include/mlib-extension.cmake deleted file mode 100644 index 566f429058..0000000000 --- a/example/C/src/Rhythm/include/mlib-extension.cmake +++ /dev/null @@ -1,3 +0,0 @@ -IF (NOT WIN32) - target_link_libraries( ${LF_MAIN_TARGET} m) # Links the m library -ENDIF() diff --git a/example/C/src/Rhythm/include/ncurses-extension.cmake b/example/C/src/Rhythm/include/ncurses-extension.cmake deleted file mode 100644 index 9ef0214b93..0000000000 --- a/example/C/src/Rhythm/include/ncurses-extension.cmake +++ /dev/null @@ -1,3 +0,0 @@ -find_package(Curses REQUIRED) # Finds the lncurses library -include_directories(${CURSES_INCLUDE_DIR}) # "The include directories needed to use Curses" -target_link_libraries( ${LF_MAIN_TARGET} ${CURSES_LIBRARIES} ) # Links the Curses library \ No newline at end of file diff --git a/example/C/src/Rhythm/sounds/Bass-Drum-1.wav b/example/C/src/Rhythm/sounds/Bass-Drum-1.wav deleted file mode 100644 index 566181d942aa4542f36826d55161845f9ed0ad53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221080 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
  • 60JcG?;$VvR*l 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%0DPyWASwtTqG(=xxC$ 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 SDKvxKf8YHd->)J*!STQJWc(5U diff --git a/example/C/src/Rhythm/sounds/Cowbell-1.wav b/example/C/src/Rhythm/sounds/Cowbell-1.wav deleted file mode 100644 index 04003dd9f5d8b1c6c438a76052cc815019938101..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14446 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 RzMPAE8IRqnYHrnV{|9Kn{L=sc diff --git a/example/C/src/Rhythm/sounds/Cuica-1.wav b/example/C/src/Rhythm/sounds/Cuica-1.wav deleted file mode 100644 index 4a308bcf3868f8e851d08cb5dda66be3d4660f0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74794 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

  • M|)Fg$cL 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 b>~hOR`{wWw`FCU_#(~QTJLlWGn>PJ_EqRtL diff --git a/example/C/src/Rhythm/sounds/Guiro.wav b/example/C/src/Rhythm/sounds/Guiro.wav deleted file mode 100644 index b1207129608455afced7f3e38f7dd4512d1639ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67700 zcmeFaiCDEL=Z<(3B`;|Ej2kNhaA$(A&$u*Ih2}14)IVP5-l~Q9P%N3 zC^d&1;xT2{ zc>ej>!K(82=Te7Fd-I=NA{0eY6-^oXm7+v^ttoaTLV14FsK1?W$s2$E_a_DZq`;pP z_>%&EQs7St{7Hd7Dexx+{-nU46!?<@e^TI23jF_y0#hdabJAnKDoVLkZcS7sDyd4k z605{32bELG93@AI;p;VRu~wiIDA7S52Yr>$*wZnlAVulh+%L~eHqSKcj&>;_1-StH*VkgPwX%AexCB5rkfio4_0tx<6(W1{<86uu}0ac zqy-lTHv}aIxAJ}M9a>*h_l`bYPtj&*n?1ce!`)5I8$*VK4r?73y*WIoWuK6Lg}fZJ zE$Dwj6T&9D4!LUdZ}r!GU3~v&I8;BOD)W!i`f2^~mQAem(}>PN(}QNUaJTq($X`Rd z*azDalmw;FDzrA4x#qp*8O>Mf`qXvt-th=cGu^e#&(^$AJ+gM&gDOvf=NhMbWY0 zd&3i3-fCIe;x8eeIev6pZt;(hckN%8yPez5do*3>6pB7RY zq8r~Dn=9v3G~D_4_Vs)J{(aE>301xR=vC>ddA{aSb53)UXNTu#^N8l3+&OMvQ%;j! zJFIqAT}kcCMt{RLW1De0XkhTfFnf4Y#P_YT+AeDs`N;TAdpj)c_-bU2$g&otu6ONk z+a{Y=j9>f_dW`y&mKMM?K9M3tvbar*T zO-QGr#nI?tM!C&gZsfS=ZD^?W|g$m03PzvYugl?t9BW-q*wbmj4;O ztN(rfO=w==8SMGc|C~SCsL{t++15n$o@%pQv$b;EbR6cs&fxPwH-aAv-XFBb`I+N$ z`vd!v_Eyf5j;=u?gC00WIuq3O>KU)i_h`ep`koJ-s(Dber`lcbu5-DQn%BeUMY_lT zvJq#DGy9wOl@w)-x|%)2sC|*OmD*g}6x)Z6BaY%=cW}FqF)e1b$aWP4=LaPR8IE_^ z+q=$=wmbG1Wu^L-(bMeed)xP^`>1=kXM*QT{~P{FBicwaf745O^)!R@LgRw}it&NI z!uVFN)K}eMe99roAi9RpLr^<+=6;e-Qjj(EHBW&RW~s z_8fJT_Jq|=*CI{^b$~QM!pZG%c2EEKEGG-ek<`2eb;B353HN%>(&nb-Dee^acfL1#n~cuJI^(u}*oZLtTQ|(J z%2}nYIzv6GzNQ^e2Wywn%WSjESY)m<&RMz{uNEkos!utp?&iv&meYL7C^eI7{51g~1(pBf!ppLdV zTD7&6yT7b|35_F+UH)vVlX*|I6jPg^U9%0aeT=M6uvghqm1)**{z1M8-o@^@-nO0| z{!e_H^bUp-sW`2tnQ2C`xyYPleQP+)kCBI8{15!E_&)L-@ZR*E_67Mn8-=WOmNlRC zynt;PY^&04JKlGE>wMYyi*uLrSx2<2W?2w9s`Wcx#JCTO4Yk2d@Zv*YP-B;kbDS=?c=%cqe#L(f8EmnT>m!6Pi}K z-*dm={nR_w|A%k7{;K~2eTVN`|BJp?{NMUt)uYW}W){5NZsl8}mEOuNb+h`t?Iqi% z_8qqO?SpLt90zy}wzaZb>Hz!K+6BAUw!=Qa{;BOvo2hlPEw&x7$$#yXcFH>aH@%Jj zLw^T-tp1oe#w@fHeAv%QxUyTRH*Y}IY4FkwwZoNPjC!-&$TzdCwN{072#bBgsPI+FGifQU+vHbTro;|Jv4V}vW+txJ6VE;@18EVEicVX>-@ne&YW z%6YR&on~ERhu_=Yv%O~D;h1Z`>X^b$o7EXwIJO~1v)RsQt?ZB62HQ>B8|Xx&mZW5} zqr>Je##p0+-c^6#8;fMWikH3U?crbLn{RmZDCM$sfX|;*gSB{Njq~Rm zt5!Rzy=xD)53+w~n`{5V_Nfh8E4gTJd$Wma*QkrtTgpA<7`$JtOjR~o%dKRylUZc; zG-J@C6UqW*H2Y3hHmmVSood}u@{Dpb&!}YgMP?4#dKSv~l$Bi7S9PhwwQkx`I5xn3 zMmt~|uC3CJs(242iB+~nuCiI(GkPxe;H;usyVW)72xYG_8(sXvKUSY?^u&IYo0pV4 zp0u4;ZzaU)Z$+TLhEKf4SR=#i#JWy^u~s4*6SP{}YuYVjsR-;-WQ8kBloRT9D^cBV zZpYiTwoa&9lqc zXJtaQy~H<0WH{ev}IGozuGP7u&Pz7s80Bjp$+pIR$+fcABrpw z)ZM0!M+4podf7QdJ*)I}Tg{t2Ri0tSdEm6>3>LH295v=&2KTnft!S3;A*o&}Gr@DJ0wH%@KLtuLwn zSHq;ng}kOVMKwR;f7L%+ouWR@v*su%AQ|0?Fjea|9{Wqd`Eoi^pW`QZ;iv~#1mGY zxkVWPLP%BXtvSf0Zmm(Ssn@Vl&>Q)F!AjKP)vM^*hqlMTS0&~iy}^GHOf{dKY*Av> zqgd;2?C&_r6i~!Ruu1~C==BK>MiWp^Nt<%=-`Z?G?(gH5p*)>j{PG?n9XMI zs}9l%%{(gvpVk_zkc*z@vfeba#&}oP^poJG=|;9O8HDqO{}(*YNqo*gGmFiaW|>)HCZLlWlx0LW>Bvwzz9Sw@z06(fk$fMBX{B}%y^mL8l&z*_e5nhEkN9T$ zSNKand`ZZNOC1G5oTxr+^I_4~+X|q?YT~B_@WEzV#c#XVVv*_9*r#yyF1~4_tQO?f z8`QE!sWG==dq;Bb&iZ-7(2L9xqY|67*6M^k%0vUg)pU5Z6^~hF#VS!q<`}$JF_x_o z@1Ja4F$Y@pri;jPrP>7Ive_=FQ}8(lplgaU(#%G)ioi*Q=5B0FB)If|_P8yPy=@^* zns1K7l63}2#F^KXL*V0ZB~l#?Jyt7jJYNY<*b0W&YT1=CE6Y-?VNkNnxWQW5VuRM> z-&|a+fG|hnlgsdw$>8jKqQ7z50Pq$x(qE?sWgG!mTJFi_t1uA ztUej*nZ`W}kmVfwNfOlmS>gYRUG2_2E75{vEXQH9n5UMrzA<2hkyvu4u}SZ#i!W|( z4m0Acab`QHy;mtkI@7pohBZX#hwr_l#Ava|=^XVZ{Q62(l7bwkSS?9C!Rlf_ zjRn|G-E#5ye#qHsWw^Q)KmILR{}lG1zZnfzR5QdH2ybrSQ`>?MZfR{|fTM@a?(nPv zq+?g>pxG3)7dG}7elt?d2gB-Cx>{t-#5aU13#}1waW(Jyc*ZK*NA@ahfXxMci;=Ol zRu+~l0kFr;b_Hb zsIUyJ8==%G;qb*GS}f*Hc~%NIB@@0*#CI1WcV!mbf__=px)7^9+EC687xC<9yk-=D~()p z99nP;Ubbb;Im$SwP;V|li!7*^fd5S3t|{sX#p1Ols&l|> z%fJmq#Kh-#g|mhXb{~ht|APNqj@>JPlO^VPG@w226vKbXnA}5)n~)}p`_*Hk%FH3i zNnbTVnWHAbyAnabSe?V@|8z8Uzwwx1`osGl#Yu;dQ6`p=zuiUn_u)@^{&#^Yo9yzIBdj3{n+t*@X&I!(T7!PQcq|{ z?57=#cFkF2PO=s>?`#gK+g>}n=JV<=YmQW>HXm$S48NC!G>3d2`F_;%Q4gX9N34%n z6LvPNxJ7k~Pl)&nt$kKLIh@|e`*_=Twl2gk@z}dexOT)I>SzdB6zmM%9(>0BrlUPn zJ=*MY4{hk)@Q?cQb?&;#+J81a(J+O`YBGLpH{6Lw-qNArBDmN?f7#!`|F-Y8{~dA< z$;K7r(}hm0QLEI!w#~%lp^jEgazc&{o{hfrMk7;Ld3!8Gp;2OF5Kql#-$Sra7M9>`JnEZJ?IrR6 z2Z-^0(uU(3@1su%?DQNvA7c%*YRvxVPzGKno9M0xKbfEm!Ot!LU#zvFjgdrjUmBnA zYS7D}z$T*CWnki?pomY|K}TCA_GOUPOWP|vMWcqIX%X1P_8^?K$Q+&#+nRvZb>eyb z(a_FF_Gvv2M3hYy<}&sto%Kuv<=NFW?6|Eu9Jx%uGwf!EOF-_c)$2-I+bK=Hc9XFQ zCXY42b_87tv!@XG+xbLmY}GdG))g`-ujq@=-eI7YSym}4?vD+40ff`qnr!Bo!jt`A z&)fPWG7%Q2x|>!29^^%w5R0Wh1izB_J{%u41)TW1_O*6PtA&FXwc+qe;?+TZVLt1~!^>sh z2dCkc4q}^zvkxD7-VXefg-zXrtxYp3$woK$FX)DU5!{S08?e4nOMk5rWYptxwfMH~^wVQ^}HuGB5O8ZxmSTiw=n0IV|+4E+RD$>+`k&ErC8 zY(oVWU=H+3!2jO>Q72*peDE;|omh!~S&MWyk(NbVKZg5f;k%QOPNzB4Dlx{G=aE+@ zm|Ns$4E7`nTfdXIJsdCV19?h*AOmFZ1d+I)xH@Dv7W?%$nTM~iwjFI#;Ne89o=aVT z)lDJ0d`7#Y#X`kfXk{|ID;1#6MS;+yfBmxz;x z5F5IXhCWFCILpo5w(mTlA6Tt_Up~qHhBNj|_cny}; zj=sgh@4lc!L2(Jhha0VV>`o%+YIadg_T-#(9ZPnf*U!))6@7?->M@{%Q`+0Mqju(@;T8MlkBO%#*9|M;r zv!_ZUj@<1Pqn!NmI?)XzP_i>q;rbBnv4(ii1xA~Qy!T^OF6`+-Z2t>fBN4w^g2L71SdZiICI*?y z;ZsA{v1EKNBOSR|A+dc~P<}ZYLN=YKtOAebf`2!lZWiy);}y>5XCe(Nu^pFqep~jt zf!*jxj(yq=*Gr5|`1vQ$`Qxm(i0eg;v+-{_ zG?=5bwstEmxq}=3a|MbQVF%rT-RGh|qMt*s36UVMz2q)dtKBq-123b|xp=)0?pPm) zh_|z!;s8acyy6Mx@al_X?q>fR901%DeH z;4hgjQ4EaY-zzggZ-hgVWY!#huv`fwZ(YsRjB`tFShAe zV|Byd8Wy{MYWC46LXpzc1K@V-{YQI_fGfY?j7E4-YZnq5?S9njt|LQ zZgRd)jp=o2k$Z@Ryi{{W;UO1L>p4nZsuyVL9zS10BMyM|hJ%;S@=hQ4cw2wQxJriY zP4Cmbk33I$e|Hb|bfJd(s_!MAPCPXSIZeT0CX#ha?zfU z*51eN6=N9$0Csh1wOYvV=G#9y^x9dgowqQt>|p(604sTKl~%f`bbtQ9sRn`-cvvgspzR4FI7Ngy7VWq?oioAcRcPbfu&iai!XrR}`7V#jp6%M!fY zG2s!EUVyc40wEtIKYtItlV3nqCC`|G?-6+u+*b^?aY3VMc*2U=%L-6%2C-@p+4Kyu z&mqX%WxfOxOCEg50Wd5MVfrbQVQ`Ah?iC5gMP;mjSLLcklnTiF! zmEv0^2QR#BZC#;Cwx8H?KA2)!AZq=Y)m*}(O(lPx#WlI?IRjl8YQ?ah)z|@{W!pe> zT*7lYfiFAZzt&Re9gX+D706Zn3|d9}zWP=56@Vs@z=@KdS0c}34VQ$5%55< z6Lg#hjimxO5e@F9UBU(>Vvn}KU7gr)JD)j+3`8mO0{(kF*mMF`OKL{9kZOx~YK}64 z8qh7SNC5$cE6bt#4es8K=x3i*$aC|M;0%z@YApX!HJ1DDL|*f-GEz&~#5%9g`yzRt z$yC^#&@CLfJqC^DAfM$>znD)ihkjJixi*cw<8rK0J@@VeefwkWve`G*4y;7wo*byy zz+4c;EVS4Sriw)$CSvm~G{C~z3KpG1W_lT1T?mGl#Old|qCG=+X9^x69jT7tO8kX- z939VPM;qaw*q$43Yb!Fi6oc2rx+cyBE>s1MS;2h z77rpNnP9tcbfzAzxw*Q8>mu$w2Avg4sVu|KjP8SM)GUk*p| z`AivjZ3`Ugg%+gqiBZrbiLY36oO%e9j0tFS8FDMwH-RTc@w*Z}w~>leJ=mLkHg-9j zuQ;Bxj?8-zSbslpu=M>M#=dlihq+jUwE?UxR7nWrXj<}p9#*3aU6n{QgKM&gxA4TQ z{5mVR&euxrKLiU?fpkdJmrOhy64+Ba*0Br?AHg2?@tcQnb1}P%$7*fBw%mnVl5t-h z(7Z{|z7S6`6@5-p?cl~pY~x;hkN7poHc`WZqIszxD4DUqr*)St9Hbu9NPC{yeu3*`nfyo({)~+{O0|L7Fo}L%=8!lSrO*B6?c@ znj3;$6M0$2o`zs0>(RV(P^q4MMe*4LC^QqjJs9whIb5+7IV{9$OlEags2nWhYN5gL zz`8TgzdZIj4@z_*BEEvvssWFox$sf6?=Ez?k0qA8Z8)f;4tYI`br!6%1bG=jhA)cm zBD+!{UBcd_;u!~p^08#g@y24)yCbbzS#2rL-i~CaLH}ejk7>wM7FRFi`i%iUcbO|i z8(ioo_zTK}V-ZeaA^P#GeNa!bIsJIr23E2GJ8%LI^fM9UZYY_8r?tc9D6UOJiekV{ z`=EAz_!+{!q+4$ic1fbuqJW*43B?lekxS8$Inen!zM>3S>4P((yH}BkFHT#JB?EyZl#xrH2rKiwDvA%Io?mW~Qiq&_s ziXl*-0F90z1{}pzVvBF_{}g1b1nZs=@V!#ebi<>CJUa_}AX?g+D0~Z4ItDeUw(##V zv^AF%2;!K;>o`|e@T3a%lZ1ttL-aipTa}8G%6boR&spfLc#CgjJ`pN3aDe)7gCid`v?6BUO?0wLEbk_B59- zJNt-5!m3&4R-}46JahB;cvdPp5(8CA0#;mXxr;bMvNt8{Q*1ODFV?)4rwOJTh?KWS ze&hHqG$C)y{e?T?^m6S;eW|Htv9hxRC* zmE=IxnXFEM0<+*jy+m`!t6&fvjS{OUbSQ-8+3cMDME1H7`eh&?$?SL%^vZ|xvWr7J zr-+@24ZFb#gzvF|y-LJE_+% zV4YZPzS3D|6w)W&QS5XzvX}|AE}`$cxn==-8NzeLf6VsYm11ffehKkbAsyWvzS&lgX- z5V{}YxkqDW0_kDM&(-+65?~fPBUNYV5uj|cLS{e`EZ@#2%kpvyZ3$(*Fg$F!CJio07 z{JR~p5rtMKAcYdml|qF=Xj06b?Cir1-7W{DGAZ!ycJRs$Z;O!^>BA9?s)s)=WY!J` zB}?BM8qDM>=@60VB?=3D4!m@T-E2q44qEPA^Z4$zOul{!)&aj0lY7VF#|&?E7tTX;#wO7DQYkAQNA(53d+4>!5Q)_fm> zWS?W7QYE>|l}%9X80$-iUzd3|4GvC2CZ!7Ff=VeoeF##~kE;^6UJ!Q?`;(eqHhMIU zyWhZ5EGM=oAye@Llqh27^2v4qO}T+)rXf4zYN1Ujbdvl@Kkk-^gm2-=E1~NMWTZD# z5+A#S)ooy1sc@zY+DlDEi)5X{M~uJ{uSRYsq66ZU#hRSs$%5ykb5=Z@n>)rM z&*@w_hwlsczM4;FLeCf^OpxS5G$C>dZ~G{SMjT2hh{;; zG0>n7QeRGnN6=*ZfG#ZO+6rX7AA6X?a~8n8iL5sjJ||+e1XI^@FTsKJ>?VO-OGfHC z+=vVy86ViePLAweK-Nm2OD>UjNBqnou8{~({$)qf%LD%wsmkRp_<6K63i+1ROXOO> zQ;xy$oq=a1A~{3&k~)!K@>_8F1g|Z8i6@b6q3Qs~BsN`3;F0PO@+PPYAi5;4_ zxvm)LmhAFS5Qt=-go2X6)mcj^uXEf(?1$J`SxFRY6D>$&XA-+i<++*sM*8}yp{Yo> z$iIuPC{`z^i@r)eCBEnek|Z8hx^qR&)1kQ_(-Ux1I@QwAcsZr$g2y7673@Lm++|jE zoV7{bU>_1(`v2KH$)k{oWv`N_koxg<*149ItmV@Zr{%K;I_=@z5OgsCDk|uBbpS;R zfK0XvtS=GXNPSfLoga1$h<6m*77s^~;6W^0efWL` z9G}PiB;ObhZ3J@;;X1K3Gg;{p=(3D82>0auIox+I&pOC&Px1ar))~utV#|iIcBxOS zg~DQ4<9X5u=pM`Gq|0_AdLg|krTj)m!bD5teZehKU6h*UE$*C1t|1BRO&=`J-^pI2 zt0@tCUmrkHPM$Q2r-&8{b|U)$EkrujLPxQ5?csU|?@NY)sxAL2y%Rx`HT3y2K@)G@4J)N5}gTnTls#!xhW;{}NWZfc+=JAD#Oj=gE@M z+89`ibO%U`B+; zIfxNlH-tS19Y(Xd5xnLgQBof~7~pj(oQ`KFqM1_h77s4iO?D!^3W5P2`VZNQ*olW3 z$KLQP7F3tW>mj#C^T|}6ATskX1}kLc^t?m0ee6)IRWb4-88|_Ug=n6{dWQm8jyU#~ zjhsm5qGaB4u&k036FDV+!o77+LpjLt5YH9K6I(1XU~kqO&hE;f%sK8NR#)Uj^lu+e z6#LzqJ4gm7K0wtZq+a+hXifA=cqh6c==DY*&XC;?;kW&`N+|hISB0~Z-630rtrGiF z4+o?lOmZNFa7DTt1hY!+Q0_Pac}j=6g4pCG)J|eAcGe^LTd_LgDJ451>x*F*qFb`N zc-|3@P|DqBCq5KsKsB>!51{Es26hk_iwAmb{JlDnZkNw;tw*NAS#4sI(GF z%BgTU9W)v_ck%CV{w-DL3a%{=tXg96awJ!}CZxYd(7;0kF7`f!XGrXoj>VOeTr<(` z4g8zh342v|x=89))>_1xi{ZQAD2Z9^yenBRIbje*q$bgt8_l{5Jq6vw^L`3{@(NK3B+z!-rABGVp6}s3ZF4;%N_k)Ew3$IV;gB;k`uv;oPSm&rD)HvK#4Hk=XTN zes?>2D&i`M^TdNlbe6;&C-Mo=Vu`PX`w}Cs4ruvGo*_Oto_7?!OASe6Lt--VPz#aa zd0>isctZ`CCq1(s1@E+`%iMJ+d3=-rW% zIt$h3Am_cP=1BjOiwvLiK<(vIqD>O{=Teu6qi3!sXPU^o5<~T2eQsj=o!tLtcDe)} z%jv&De9ppvwn-kkkSrjTb+QO3Pee`>PW@R&u_gJ9ihkJ5J`F`~$hbChEes=r~NJPos(Yn$!Xl@Krwi z`c7yr+O-6_2YPy-&Nz6uiM-@|?z~ICK*zxf&M!}`bPBo!E`^Zm@dcapKKrEa-X zp$pL*OJ}ciE1aY+B9*#VH(M`T8%Hb0-$R#$eio&*eminc0R`FB-gF0z4nKXc>%B2%=J$2 zo@G~Wa^g#YSIe44H%+VmYyJ0}5xLR!pY6xA-PrCaPV|q2M)}a@UFzJEsUa*!F4l1p zCC0PaJ>0#!d4O++H=8)xPFIBVgU4~sdyn(Bb4BaP(H};Rjmm-6m352i=0EtOCa(6C z2e)f3RCjL}SYJv1MM>}ruKQuv!as=mw)MrB@tt-&Qq^f;$p3~!H9pd?v*K^}R#*Jx z-ZM2%Ru^(Mp{zxpkmD^L4e7*ryd}NT}`~o^&qys?e@E_1` z(9Ltvolfu1D(}XkY)hdq(pv&SmCfFV|E3dXl*SLoU3W&tJ@12l;OL z^6~yV={%)Rgfpr0=>M$Y9Oy6pr@eDMR@2Xo?V6e!f<5W(FX?&~|8)dYY5f<@ z@n&E~cY&5U0@Ptex}_{s7nC<;>Ls|FfLusnG|buj{F;*tlxEO-=<4 zrtc_)>_iG3g7o~;4L^+jbtiHv@nJ7|&ez*sv|nUi!h3Wmi;dgB-U_h0nb?MQ__hM< zua6F=7&<@Na&jS+ig6kidJHvLCw(NJ(bu+(Gt|#8jboryW?aV>t*6>M5xbL!y_|&| z`Ix=5;k?MZzCV21I8EWo<63FaAg2}z^j-NA!m3xVO2liY;=jS4sK*2 zaZ5N4nW}Yzs!!VAwy&o@Mmki>pjj%Jo@4ljL@M&PutPKGr!Sz3-{NfG8myLXR#+)i}cx0#~GFw~_2*KdzR_UM#&ZWcc|>;dd3Fkg0g6wsd_=ky;NkEN*hH{YCU^ z2KL|*y;Ez55hYGerYGV&PgsO~Zi$xm!SiI{2c<7j*0K=YnM@zn57_rH^lfEOHNYO3(QgWiIEIUg9*yDBDNO@)%`{r0-)p-eEqT zf?hzQJEuX0P>Gi;YXunL24B+4C|J%-9Z!0j&r8oac3ALd2J-48|ES~7-1Im|u2IgN z-%~qs;^1+nRdmy?AxBH`Ua{1emw_<^-4&C$%fs))p&u$e9a~vzB-h-fmx$}J6Jgp! z`l_T?IfmR&47^t8e3$M}!R2eHnALKPk82n6y?}m^c(D~$-ck|H=uoyHmGad=aa$xGM?nRFnh@KQh#>yeEd zz9u50_xOrIo}@A*+07iD>>~b_YL3KgoTh^FxA1mSDUet=4N7t12R^ihha0JRf!Wl3 z;62ItN>z}vDvF#jO5uw*2s^m}&f2NoPoeU+8{T&ZeN3lM_&n$O8xaO1GTNOoj)u$gW5~@hI*^*95jnGJX952vMTPdhU3b z>nqW{dGt+*-!XwIdUx(7ooQ0FEN3dl3+PD_Pq_z9-4f8RnXDz9 z-wBdU10Aa1A(541^qJ9Lh{d`_hw3GyYzjT-*XcVgv>pQ^T%negj6SAu-{ah0K~n62 zb2;6i?sE1jbxj?sAoZP?08RFy&zJBM8_-5MW19$#O0ZJ<_}4~cQnFf7L6qozC~Iwr zolax*{g8)9b}MI;@6$P!h=xcf{uS0CeRR_QznV|SlSN-ieUr{WbpI$7>%~}iyDE8b zsamzi(p_P0!wvdR!QJ$bU*-&N4z#=#@I3vX%tpMmoCR`%)7N1u8VnDZ_BgokIFchZ zlyufF-Hj3%OHEQT@6w6TiJ$V>yJR{fk6a!2F44^fu9VX)k^ym{mA&~%^4$`-G%S%l@-!5{FTSb9TFhsbP_#a#0#z1C~MCX$1dF44nS z?oC)tk<;_obE(6gMPnt?AT_rvba+2pmLA(0G*zT;OTb%OP?|nWx{wm7*~|HNtT&ca z`dFn4uLPxI%#P@*NnKg`a3+IYqUj^{&=Z@6Ev;j%KVk2E zyg1>e=Hks4@%{(QczKptFVW0G`I1vv*?9MI@+^|Q8U!_eaen5U&y2q3nXS|pYDr#F z&Q-PM^C7&XuHK0gQ138J;{q6;bK`~z!YXBNZxM^-88yaC?B04#&MvlnVUv!FBI5%* z*L3u}1a#FCyO064Y^(jwsf-IuRr{E80iW^QFYHI`l7IgaEJ}C3C(?VubAfZkzv=6k zr85vo^l-`!Q~`B<0>6#7KW#TS&Ab%pm3(t7J}Vdbn2e7sr#p5LvN=UNLA+fBcIvH6 z;;hB2w*TGk#a3M-rOTo%am{~1{x3AyRqO(No2MUat9h}y&HaPTQO()lsuJ!H!MTkI z;HeB|nT=@v@20Kg{eQiAzvKNS&3&5(c-wfT(|~C-+I#MU%~xuFdGMc*C85DjjD7Nz zCkuPGiPWP0V7|&b)$iSpuT(0&zW;sIvZmfm;sZYAtj0HX8>gOljTJYD0h zF8gg?`Mst!O%ucIEl;-oAo{N@a$EGmE=fl2N#^+ts#^L->))UFZFTdg=FjSi|XYX~LEiQz=uVEb1*i_j&Z{}uKl za|J)Z_FZMdgU-tKqUo=5Qasz0@A_NVny_ToLYGuoyE5-4jTu8(_`G~{eHdqOot1pUAS!pDMs<8yB^W8whsiH#e{Jj>~PUjvqV5#4#;ewEnk zDDg%P_+b_&WVh+7pwm(22KFLXaMHiaAB`oQ&UyR?xhc3K`E#~p6Cp*(j6v~UEmbk+f3bhPy5hTZ6&G9EU|i#Cq< zg&)(I;ppV`ap3Iivt<2t>G@c`41CBHJd1RX#}nNiz^7hhI#-kS6H{4ksZ+4u33xoJ zQ>t`gR)R!j0?A5MEMynk*VsZ+dm7&%{M}(2jz4S-uAGlw=t_Rb>wClBhHOC`I=&T5 zQ~+YQ0nZO}&L$0Hu^l9E9(3bGQ}>Vqc~yVWAHunsPW;9V2LB1WVPl7{JHBI=&oW!A zmE$g%o=U+`%o&=6u9tuhQ@QILa7QhZ{oY_cX*YWh#|CCh72z4i;v=?V70!ZjHnX>0 z+D>ryW#T(MFu&#%GAXyw&5!+K;n#2aW$t&32xSTVjfq72)%d5a#C`^o;l}DCnR}yy zo`!*6`mn<7RCmrXzphF7o&3vdNYg2FQu_1~$W{ohP6A)Y;)SKtu06=_JkiJ#pv)X3 zfs;P=J6dPQaA+7wkFAS&cVn2B2@MVAQh;90gFe9j;53;BAxOuijv=HKCymFBqWbj^yiC+m-9az$eG>tKgIl_IOw|{OrFX_ zfCBYv&Y=~Mjp5Wd7?o-OalG_eN@tHmSDYE)Oxs@K0?G2bK?<3Cstc39f^8NEV-C1- zDmYvE=huRE1lO%2%3EQiF*Bv7*#yph(|!|~GqoYmV-_*mB+g`0C(=SdKPx!X7Y#Q< z%)@#TlX~tGncXM;OytfIuP%fmZ-Htez(F!Yq!5&~pA2AkvPNronh!Y|g>6`m&aELo z;AFomuqFG+1v~+jdV_;T5M#}O8?mfBl5+qub#Dced&rRE0IIsXck-qeFndHP2w7J>|X8Mp7;CH*}Mb9BmF_oOAWKv(ix2Hq5Dae$} zqzd%*AQ@TETq1&EVsV`vhH&j<&Vp=*S3|*%(!EoJ{}sf|2^UkkdL`bKKCMgef?OaL zr7gK}HxjuC&$9^%k7QElyJ$oRGq)~VGngxK3i&yKe~_%1bYZ`IQ$y%xhRz1$Z-; zTuLE&FEy@Z#0BEFrFT*|JDfOX2%IR#cQEAxtv-(Ba&jhhKOS`!=f{~YM;1=bsujSK zdsJ`ebF=pA+l){AHF(bmd_gg|T(WdAoU-c+e|Hjbawd&xU=9L=(! z9+#=ZnQ9{E_rf{5o=?3^&dJ6?xxMJK3k}I3$1;Q8EZ~W^h=GI2QzZsY=x37kA?AZx z8fW;1fvu&VAsoq;6N)#;Lv97_gm8B48TdC{XG#+GX)-yH1n6Cb)C|%x=>#7~jF83N zWRj%hnKM|mOd$Q4_;msDc7l0kr^xTg`O;(TFN0`m3^qE8IAlLqO3paQsrH|=FlIMY zX+zL(ndx_l-9anlPh#{MW)RJyswzDS32;9h4Z2UJVhdU*bx!H?laASV@;M@vHJro( zH}lMR^i3+q`;qNzaLZQkeHQ!pfxK`L5zBsdIvW1Ds5i*zg>Z5PGU?$I{BRKy$pn~k zY=O)w@ge7nIiWTlJT?j+CS4hYWVoi|_a+miJO%}bYthppX3#N-gq;`gy`JkTi3nxp zP%=JCdK5V0hn?=m)W!i!&HS3U&>}u_k|X>Qi%@PzkGRZwSV``3Df%L3!lY{|7a5&Q zycb8!WjPi~PG^lFlPHv#TLycS_B~wedd7*^N4<=@9YG; z3S+0H)&um>(eW0iul zx%Jg`-#GUNoeN11OVnoAK7jA}c<_=8QiLtv*YW2{o(E}cW>W0Nj>p>|7X4`&huK~ku5)A z{^!oH1>ue0l9zQ&?|46~YFPQmUw>_kYGS%7QQPmfKd5n}hNp)AU#KfA1oYmrp_C^V z*KKIdY+mV(alh)T^1kCd=?sc&6*a7NUUX2@v#q;2zi~D<{9nUI)uGkr8fP|M03V;k zt0`2VKXkn7_;=Xm@HUa3MLin2EG(Q1!+7e19erOg&GcX z=CjnzhG6y9dulyf>$B^}Fc<85Vx!MMUapq5h@R1U^pVKM$W!bqsAk9g@QQQ4?|Sf{ z=6lalPYKnNHS$^Pg3J@R?Renmz>M%rWPE^km8XF!^9c}RH>y(!WITMFe!c@{yoL2R z!vwGof;t2r4&LrE?Ry;Ov1|MBLCgTOUSb~7Ys?qhPImEL^S$Pl^@r*v*EQ6(tlwI9 zrEXT;q=rWu26-O$tiiL*a&32w37Hwv4Qw!**`PKiS-+}Z@H1VTwJlM)2F(ttWu|`D z)<3i!AMt&}Q_NwPtokm_N6T5X8AJy?oLbQ9Ob7dkDw)i+nC<_>e}>uhUwJ>I=DNa= zQ{=PIs<-?X{8PMD9?QMCxz?T9JlH$KbDH^Gulr|%vG*Hg;6-LIpaUngJG>gPn0M?4 zY|k<)E}NZtoa=(R5MO1Isgcuf0TcwPKLAyhf<4yYrDL(9twBDYkh_=x9|loRe+PZI zz;vxKph=mom zc+m;gk=*DhEWVsj9*S>sgIbFNS(69;AR@*N{x^MNiDhrF3KzW!wb<2QupyJGE;N``;zm5%gM8q81%Rpo3Jt2Seo`&#%SgSt<&itHQKVf zHdNMHVfW?|UByDdt)S~!cu=N~f_sapaUHVyYE#H-?uN30Z7yTaWx_xK=!Cixzg-Hl zILrSd@jG%VxH~*5K@xrd$;%8&>F!D5J~?<+smzt)L&yblcO3~xCdQC#xSV2;9vSIJ zm7duWc$dX#%KgM=v-qs^KiNSIs{@mA1eKfshfD++CNOR0XFlgc4<(bC8mNh-6D@Eq z5Wk!ZekkL6d!Aa1jtQFLu}c(kmu9S^?wgOVCVHU#&soV^&q(J;TbjQ z*kzi}L&UR;kg_naQ(uk4de3JBL z%U{AMq-r1?6{UF9QoP)H>dFP&?}#omt*0VD>xF5TpY zM}s{$heh60&Sp*l=l^b7rF~?ZNTjk5i7f&5v}Vu8k>Q^~Y8I9xhS?$$*{SpZ9_Q0? zQdR0w)kseQHb!PDCLzCa)tL-H zc>famA-1WE>7&1Za;{JbSVJs+4PP-BD`YYitS>p4AyAkZOT2plFX{Dl*5B|y6_|(G z9(_pw_4PtK&*1f$wuo+z0VB%aPI2P%juV+3qh2|f{)Vr(Mkc>V&Nv_GIZuT}P7e!q zlDR{JiN_+THp}d9In7YU$=ymKOPPpP0=8l@D>45jW|mYkOFD&EReHiwm|rlrXW*i;CweMP7_E* zEWiys&kyux7&=o}h`B0}0XmBV)BHD+dGkTXyUf-rH#g}|8J+P#(pMmzvte4T`kv%N zq4{R4j+`E$M+K>$gtaIpL$Z)4W+w6XQ8GC1X>LxCO6A2v?9NnM@K=AV?mF(L8&Z*$ z^LKLAO1fQ{z<@S*hz6sLvE=qOCM7TDdg)S4BG+-2$n`xY)Q_TK&`Z0-Q)I&AakBVn zL>28>!#VoQcdH*cdN9Sv6ZDPqDt|2`DCl|edpor=w%>@y3||mYCKJw(u|jHzWvq4< z8u$TOnL;vdh1hadik)9UX6;K}`*kn*SMZ5D&P+Dm1QpxpBzl#cQ?+OK+W`L+axSE0$Uj1v zW1^+FeeTjaXZ>gQAHP4fqTju+s)?0H})jt~CbuV7~^zxm{mo7f_YyMr!{gJ0Us3th4!}X34amih;cUaJIU&zlP zSHW-@caPkz{GsOhJJp}wABa7F!yn}DMErcb?O)sfrTyPK$h?GK>zCKfU;^y}Z-M8P znj`nGFtL_-_v)JwL6PU%RJS|W@#rI8Mr~^ikCYc0*4Dp$|6x~E z$9n#1&=;+Y$mF={t}VO05Z~*O?;rVlNb8UsW>!7gu&=(bF01aD+Of5{WXX<(cZpaL zJ)gfFbh`DwLn}fWjLEvQ_N|)F>8CqaUr4@sZR7Q(V@=P|=XBI#^Ng$gttPMTvD#zA zL3<*5MCG=d+Wy(rouc=KP7QmE_}QwMS~0GC+plA(U3>xVD#SbPaXjU$3vCWtO;28n z7XKY`*!e+lYcdBbnb-6<`S!jM2U<=IZx?o!u8t{KvZA2#K{Choe$!6=+R&1wH$Vux z=-rYo-@B5FLB~J#?_y4UC|SxQewTY`^S>K^Zd~2G*geRz%G=y@s(DglRAT|yZZ4i_ zeB?*1^4sLL84$5K;$`Q^pcUBu$Kg?Z!@R~6PmE_ev!`B;E{Xo%4(T1INB>)+b&XyfXp#O4cNH|g1u87Ak69k=lp6vEv9Pvd6yf~FV!J;)qC@LA0}-9I;- zrFT*DOINqd+8-HI*q4OY@G&+eEVY5aem;1p~-`GQ)e+yd~ekWpX ztAB_7SLiE_m+WP9Mt<$dbSJrUnqTxj?wyQvTdDc9L3HX3aNM+awDr|K06ir&hc|6# z9MQPS)5gnRd11EMcu?U@$8b8dq-L-ZJSDm~kj!#DwGf#%xEQ}Ar{pk+*&y!7`8<_ullb=7L)9($(NA{CozOD{tVreyW&%MD+vo7So4gQWp zAM#Y`cs$9yN%w)^^7Y{A)y;ot+S}CJ7!1yTml#=Qjy}truj#~e`(6EA%lR8XUpPV? zOX;DNX+vpve6hCDd-##Pn|-$PUB_u+oF|>HIBMxSO~B@l)ITt~`d;;4B~L%wZ}_*7 z+b@BV((yZhyy$wY^g?809nuj*59=4++2H**{5Sa_5`X_Vu-gKlb18Io$U(7mMIj+KmFP&lZ)0WajRKgmH@bS_s&e?hL zT^p3)WcGJBo_4(Hc*pTIdH(*O(pU67{Kc5Jc)e^q@I@Oh`SyU~e)G%hSx!qEmp}=( z=-#?XzTzu7=kmx)b|%YmmA{L0)%PKPD`b~1M=3L&CfhwW=%#(F^Bbh15f9R&iDa$v zRYL1+)UEit6XeKB@F+4t?K^uL7&wyv+LB;VP<^^QF50Hhn*+yy7ug^pzkVb$0w$T;S@H0J|Irb&w zkEF-k#a%M-~@hM-AKb($J6j-3U(!m-K<0RXY+T+;^=gl#NGR9y=*-kK~#*s3>xcv z)%mt9n0mXM6^TQ8C*w!o;m%HcKY!(pm}noq(vGBWCZ`n(#>fNRmXPC*gL=2g{67cE zT!*B|iPB6E%X+AmN>oGNJeryfXOp2;A8H$Gi94nLZ8;p5%-$%jN>KBeaC@3b$uiG0 z8;+eLT0B4%YYMV`N9$r2slP&WBmI4JRS>sKRb=*jA{jfAn&xKggo_H)ES?~zz%7X{ zvF~=QxAe0eN4D$9e?^d|>+1i8C~z0?>vVHCamh2xV}FUi@e~G*N+L?g$L98CAJ@qF z_T~P+6P4E@skw9?4e~wXAB+w9fx4me0LtI^n$6#D3nFX$ofnVmebRRYyIn=ks+(GE zb;!Jsb*>j&JJ8jqplOWfZI8oz^#dwP<2^O4E?ioX{WX755SJeX?J8fs$WtRu`j z^kBPd1YMKwlU~rtaHAW!p9{|XpwF;F<68VPWKy@kcmHeKY3-t^|8}4nt2uuNdjI~_ z`^PG7RrEy?t3!H+u4?sCt1u=D7uFdMR@6MWKc%X+a&N_!ds`b?H0%aRWe|z!wIA0^ zabIfsu+etFc{^=7BgF1bi5Gxd{p2(OXY})J-5AOWxr!3+t)26`}}D8|7l+k!=aTKpaJ@)w>NWZt z{@vi<@As_o{;hFi{eLyo*JZi3x@?`k>3p(v&o-Q_R%L1mGwzJxo)pjeKdj3Cm!$K6 zi|Wqa{+&KBbWj9Qtk`1LD2v@#VvNcfUDOb3EYYx*#TdJ>#IibVZ&^z$QGziV zV~M>t#6m|p!}PiD_wauFn4-Yk`zxnB=Q+>$UzQ>3F?YIp@WhY@fy09zS-$kYW~%Q~ z>^$#!pIe%%=AO-c86LxE5JKGa{!!>FLo4|55!mgfXx@XQXAM)8_ zykH!stEuxdwlJRZS?qg6w^=U}^ag{MIc@2-p{)HCVs?F1#qAq3fZ>Kytu|D&uQ*g1 zR{CW{z4DQcE4I$qVa4y?mS_HF{q6K5Frz>-j1w1InPRP9*0^*hypT?YgZkp&ir~HU zRs7-qhkvDXexU*XVLD|8<1M3f++3u0;5*{n z7;F2ABla`)&G6JGfNCd$g;3of4{=fz7!7xGnx_}uD-Umm{v5fbFzlsw@va(0JuIE| zTL!{kiscr5RXX|UO5*zy#3XCb+iV7-5iKNYA)qs4J2%N29>Y0b0dHTjI1QgCv&T+i zi+YkdF2L>{#9v)^IGnd&34l+K&HTcrS~Xs<$m-lxG`z7D1H3O>4#yzJMcXHwkvQVf zeMCFVf`fBnMFKbPcq_B@LG3j*D*0Gu}VdKDX5m07-|Ph0;X(X zClIL?40d_c<`0gJ3rfIC! z5_0Fq?jkt%lhwwa4ccc)F|(qg4V&q_@aogG6ZN4mEhKyGj!kOdUg)Av%)1gRT8t0B zu4@Q4#7Z4xgr*IC<1;d^$>8xbwBb~MTk1*`Fhepx(c)Q5t|WH!5Ee#ApX|AOnZ6YoGp9FKt~5o}QAVLc`L{+d~Wq4w-<#}&Yjer(m@^4@q~0e zv+mLnUO@Gz4v1R`^}@Nt03E?!CxMP^BwtM+lf30x>b&gw!s!7wyv(ZfVh^Vh+Xz4A zGFiXY1;YZ)$!2D0CBPnwpd!PpI&%A^REFO$|KcL=gnlRWvpO&+cId6ziEs(l5Q%=H z9j8;MDwa{T9t}erH51}J(fmIJ%jJb_+XEPcVTj_JKgF#OA_5{=ZgeuBrFvV|RL=^Ez&fs6S4w>M9nM zz#=m9I6U(J5X)_JLG@LNJX=wd&j1fV^B$dSx~)M*TTx?7p>C&R4qJaM6?qW1v&2vX zgh$PtSj{^w()7^faN<+>HC#WEC~*iC3V$X}JVoDqF|!LNcqDT_0RHM`k{!GcctSrI zqKHgH^~=KgZNio{Ag7t*`qO!Vcv(8R=W~ig#ZWpPz6agz1*@q66T=QLUqqOp<-}?U zU|r#KvfL*>sX)nh4bLe$FJm|ZGhL^+w>QCJdum348J?!*)55r(sbwWR+gpv)yywWX z!CZ(Yev-ZpQHPoZ7TNgqK1=@e&57?g{NdwydLVnGAuvR4hMw54)3 zOTcTk@LgXKw`GwhCWA|~BE}I`bq;@N2;#5`20L4vk}zcz5+cb%i3=^VJ-IiiG7oGx@>HJ>n@ z^SEIRllWAkp9I(;>-gF!%=Ft{Wj#Z=w^3kX9qH;B3rgNZZ`O>?Z0#4{p>n;@S*P z0-4EIeCAWEfCHA|X6jjIKm#Aa2?s~3QlD=_Ci?q^tIE+{~8r#^MnyhF!TB|tK&EOS`;+*vIYQZ?#GQIINc;6&q z3T!a?*ulmY`fRNgM3|{2Sp6Wd!xdChZ(`fJf&4|WT39Il>>QEo$K2;<#F(gCvKPWD z`Bt5Pt+cx~xxqMz*oT258O_D|1IBP_+@j4?1diPXF3B8M18nvl*Hk!AC0N}-y07V< zvNDSSonG*-1D+19Cyo)ee(oJk=`@{-UG=BqEQz`?3hkg_X=Egy!K6QCzOGE5o8=6^KP9m1a6GJ>ZhvNN_UV@f{F$<6w+ zP**rk;;!ufW$&xpV*A6=*T1%JneV6oHDF=r>(Dl4yU7dpvb?B!(aXX?g$)a4`(6Y*pIn|>b|WA@Fs0_& zsDQ{jk@}ivYtF8Itoj@Dx$jc_oLgYc?@-dMWDKID_$Gh7*p}qcCf|gU7vA51wr$DG``HpB!if!--$)|jG4|a-~g|rrhSBS z+!od5nZ^dp5bB{n?ONb&>KMy}VXPSp(PngWeq~jxx0q}x+KcgMw>P6ptP5Q&lZk|? zfu$aIw{Si79B?rQ#oNhHQ@_F#WV(f)o~~;OcPv1&4&VC&F~ShXpLP#fwwWCF67|hx z0jqfX?7+T$C;d(vmzdBe)l7l$*pl-x+}_qv9jxLqwrvdGU(VTucgNc{VPZ}-Za_4) zagH3(h#*zQq;|4j)C$q$ZrvHN7;UoH6h6mawU=~;5>qWyV&vFW{@Dx62AZq}-2W&x< z@ld$|g~rQF?k4i2M$w07-3X)aCwl5W zB!?E8D!PybpzlL?mbp6VWD{+?UtuOiDHHIgMdGjNS;+t|61C*voY33a9mGg>IE~EX zqW(FG`I#@k1Mj)>VWw9&<2)B!o2sy!1nM_3Cnp`YdAvqYm_6V=w^)r+Op#d(9yA%e zyft;asr>vRp1DwECY0tnK0rr}jvipmIT!)GuztzZIi#<(;5bZ@ zB|l$)=D5u8Tuel5VdiqYavdyTI5~Gaa3Llo(-VU-2xlOUT8nfVN)O@{euIrtL5G(_ zPB)H-m}v=`227om8^6iz#@AY?ye4|-EKsZKFKX6q_z zFp~&Ic%y0bLbUddVN&EN_cBW*zzxn3pNaYzXPCUH zGx7KqP@YuSTc2{Lt9eb_ifHV~@@G|E95I5!! zzs=LkW};ReXjV(QWBb5EZbsGXS1_*e>@Eu3Ok`PrJ^7WLC?u*1z{i#n?MY9`9rF1& zwE>aCYgfLD&Pnd!YVP4x=3dX>wwAyYGLtpT1Bpt+drt#jTEW{I!P+$JS|Y0$K;&hv z(h)yP9K*b8R_qS%Er`?-PS-T%k5{Xjax@-a{{esg5sZfVTqVjAB_$hAGnKczSv7HJ zK0hsyb8TS)`+iQ?4KmhnB9e{7^^3Gln4R=yQN2FOl)pRVJClg(WBEK3bBP!m!}M*; zWcWPT(HYd8h1;3J&&dIA?28?V;1GmJrLHf#YW-rgGxxGKeFOF&A{5H`;y3v%+O-kjdv$HW)8{ay=_ytBG;WI#yLpco`~o&!SeMVJ-Ao7LI!%7LmmKab)|@Ea+YkO$ zZ%$SR_E|cihLhWskYCQAms`{^FOk!}AR4Pi4Kta1csFbKZPk>E8N|i&$k1zTZ<;>judfFmTsT^IwmZ9o1c4?iI@tQuhj5~+hGU))U;I;Z%fg!|mHh4!oL7vo&5%W&y0@ zq|!ry%KQMl;30Z!1&u#Sy?+!;m%E&XZP(;lmM483QkWB5o|aZMrRcApGt-Y zi=rueRmz`_=DS3{{3@ugsHip~bDIi2D9Y`q2~o+mv2W-z;(JBMS@QHt_!&`j6y-M2 z)%pehCDW-y^19&nOO?EWHM6;m7x3RTq)nNxfQT8N-Po z=K>k#{7&VJi8A^_&c4*y-!L=&0nzPF&dXPPs_4qfbS}|?D^yaQt^%B-!kWZ zKS;qP;^Wr*oO^t}uv@4>uqrZhZI36D+#->)^MGo43F!AYKBY4}!gj3tLpUbPz5&fG zC&S}5u%A7#JX_eCS%eDLN4 ze1}<=RK=4n;ufA0ufUl&PA*!FI*`m---tcjh-JFLe)F`{7h$~MpALC1!#zF#k{ASk zBaHlXE4$bbYuH)e1OALZT+zEASed8;Tp&(c!G1jAGrDoUP*{ZR0KQe!W2sZPjk#c1AA`Z$up)9}8pFeBL$=nO_-!yYN>nhP!<$UU5{rsE z897s1$8mNAXlM{I}CoJ(r#1EO& z3_bAJ4!DHr#qCc%J)u9`pCbRIl%QWHI{XReWHUPU_M}1->XXF?;yYz&v0M&R|`1|{L z0qp{v9e()7i#pxvT_|o`+_&<(N`Gd5#;0F-(Te;klJ1|A6V$Qj-|dS!_v_?vx?*x`P-%0DPym0K&P$?MLqYFS<7=AiVzVRcM(e{G<| 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 D6MYu} diff --git a/example/C/src/Rhythm/sounds/Hi-Bongo.wav b/example/C/src/Rhythm/sounds/Hi-Bongo.wav deleted file mode 100644 index 981148b05335c2a909af1b327139f3078c46b6b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41204 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 I@vn3L2OBhWBLDyZ diff --git a/example/C/src/Rhythm/sounds/High-Conga-1.wav b/example/C/src/Rhythm/sounds/High-Conga-1.wav deleted file mode 100644 index fb40501237658ee350ea77ecb8838ba0c4430e38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62846 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 N;TV$7;l6)B(x2uHj*$QW diff --git a/example/C/src/RockPaperScissors.lf b/example/C/src/RockPaperScissors.lf deleted file mode 100644 index a41057b939..0000000000 --- a/example/C/src/RockPaperScissors.lf +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Demonstration of the classic rock-paper-scissors game. See - * [https://en.wikipedia.org/wiki/Rock_paper_scissors]. - * This illustrates interactive feedback in Lingua Franca - * and the importance of reaction order. If you reorder the - * second and third reactions in the Player reactor, a causality - * loop emerges. - * - * @author Marten Lohstroh - */ -target C; - -preamble {= - typedef enum {paper=0, rock=1, scissors=2} symbol_t; - const char* symbol_names[] = {"paper", "rock", "scissors"}; -=} - -main reactor RockPaperScissors { - - player1 = new Player(id=1); - player2 = new Player(id=2); - - player1.reveal -> player2.observe; - player2.reveal -> player1.observe; -} - -reactor Player(id:char(0)) { - - input observe:symbol_t; - output reveal:symbol_t; - logical action repeat(1 sec); - - state choice:symbol_t; - - reaction(startup) {= - // Seed the random number generator. - // Use the ID to ensure each player has a different seed. - srand((unsigned) get_logical_time() / self->id); - =} - - reaction(startup, repeat) -> reveal {= - self->choice = rand() % 3; - SET(reveal, self->choice); - printf("Player %d chose '%s'\n", self->id, symbol_names[self->choice]); - =} - - reaction(observe) -> repeat {= - if (observe->value == self->choice) { - printf("Player %d declares a tie.\n", self->id); - schedule(repeat, 0); - } else if (observe->value == (self->choice + 1) % 3) { - printf("Player %d won!\n", self->id); - } - =} -} \ No newline at end of file diff --git a/example/C/src/SleepingBarber.lf b/example/C/src/SleepingBarber.lf deleted file mode 100644 index db6849658b..0000000000 --- a/example/C/src/SleepingBarber.lf +++ /dev/null @@ -1,315 +0,0 @@ -/** - * This example illustrates the classic problem in concurrent - * computing called the "sleeping barber problem," often attributed - * to Edsger Dijkstra (see https://en.wikipedia.org/wiki/Sleeping_barber_problem). - * Using the logical times of Lingua Franca, many of the potential - * problems that can arise do not arise. - * - * Upon startup, the barber goes to sleep and is woken up by - * the arrival of a customer. After serving each customer, - * the barber checks the waiting room for the next customer. - * If there is no customer waiting, the barber goes back - * to sleep. Customers arrive independently from each other - * at random times. If the barber is sleeping, the customer - * gets served right away. Otherwise, if there is room in the - * waiting room, the customer waits. If the waiting room is - * full, the customer goes away and returns a random amount - * of time later. Execution ends when all customers have been - * served. - * - * This example is inspired by Savina benchmark by the same name, - * which has a C target implementation here: - * [https://github.com/lf-lang/lingua-franca/blob/master/benchmark/C/Savina/src/concurrency/SleepingBarber.lf]. - * Unlike the benchmark, this example is a direct implementation - * of the problem at hand using the features of Lingua Franca. - * It resembles the Savina benchmark only in overall structure. - * - * @author Christian Menard - * @author Hannes Klein - * @author Matthew Chorlian - * @author Edward A. Lee - * @author Thee Ho - */ - -target C { - fast: true, - threading: false, - cmake-include: "/lib/c/reactor-c/util/deque.cmake", - files: ["/lib/c/reactor-c/util/deque.h", "/lib/c/reactor-c/util/deque.c"] -}; - -preamble {= - /** - * Return a random time that is uniformly distributed between - * 0 and max. This assumes interval_t is a 64-bit integer and - * that max is less that (2^63)/RAND_MAX so that RAND_MAX * max - * does not overflow. - */ - interval_t random_time(interval_t max) { - interval_t result = (((interval_t)rand()) * RAND_MAX) % max; - return result; - } -=} - -/** - * Upon startup or the triggering of the `next` action, - * produce the send_customer output, then schedule another occurrence of the - * action `next` a random amount of time later. - * The first customer will be produced at logical time 0. - * The time between new customers is uniformly between 0 and - * `max_time_between_customers`. - * - * When a `customer_returned` input arrives, schedule a - * resending of the same customer a random amount of time later, - * where the random number is again uniformly distributed between - * 0 and `max_time_between_customers`. - * - * This reactor uses the customer_done input to count customers and request - * halting the program when all customers have been served. - */ -reactor CustomerFactory( - num_customers:size_t(20), - max_time_between_customers:time(10 minutes) -) { - output send_customer: size_t; - input[num_customers] customer_done: bool; - input[num_customers] customer_returned: bool; - - logical action next; // Next new customer. - logical action again:int; // Returning customer. Payload is customer ID. - - state done_customers: size_t(0); // Count of finished customers. - state attempts: size_t(0); // Count of customer attempts. - state next_customer_id: size_t(0); // ID of next new customer. - - reaction(startup, next) -> send_customer, next {= - // send the new customer to the waiting room - self->attempts++; - SET(send_customer, self->next_customer_id++); - - if (self->next_customer_id < self->num_customers) { - // Schedule again. - interval_t delay = random_time(self->max_time_between_customers); - schedule(next, delay); - } - =} - - reaction (again) -> send_customer {= - size_t customer_id = again->value; - self->attempts++; - SET(send_customer, customer_id); - =} - - reaction (customer_returned) -> again {= - for (int i = 0; i < self->num_customers; i++) { - if (customer_returned[i]->is_present) { - // The customer returned because the waiting room is full. - // Schedule again. - interval_t delay = random_time(self->max_time_between_customers); - schedule_int(again, delay, i); - } - } - =} - - reaction (customer_done) {= - // Only one customer can be done at any logical tag, so we - // only need to count invocations of this reaction. - self->done_customers++; - if (self->done_customers >= self->num_customers) { - request_stop(); - } - =} - - reaction (shutdown) {= - char buffer[LF_TIME_BUFFER_LENGTH]; - lf_readable_time(buffer, get_elapsed_logical_time()); - info_print("Finished: %d customers got haircuts in %d attempts over %s.", - self->done_customers, self->attempts, buffer - ); - =} -} - -/** - * When a customer_enters input arrives, if the barber is asleep, - * then wake the barber up and send the customer ID to the - * `barber_leaves_with_customer` output. If the barber is - * awake and there is room in the queue, - * then put the customer ID on the queue and produce a wait output - * on the channel corresponding to the customer ID. If the queue - * is full, then produce a full output on the channel corresponding - * to the customer ID. - */ -reactor WaitingRoom(capacity:size_t(1000), num_customers:size_t(2000)) { - preamble {= - #include "deque.h" - =} - input customer_enters: size_t; - - output[num_customers] full: bool; - output[num_customers] wait: bool; - - input barber_arrives: bool; - output barber_leaves_with_customer: int; - - state queue: deque_t; - state barber_asleep: bool(true); - - reaction (customer_enters) -> full, wait, barber_leaves_with_customer {= - size_t customer_id = customer_enters->value; - - if (deque_size(&self->queue) == self->capacity) { - SET(full[customer_id], true); - } else { - if (self->barber_asleep) { - self->barber_asleep = false; - SET(barber_leaves_with_customer, customer_id); - } else { - // Note that the customer_id is being cast to a pointer - // because the payload of a queue element is a pointer. - // As long as we never dereference that pointer, it is OK - // to recast it to size_t, assuming void* has at least as - // many bits as size_t, which it must. - deque_push_back(&self->queue, (void*)customer_id); - SET(wait[customer_id], true); - } - } - =} - - reaction (barber_arrives) -> barber_leaves_with_customer {= - if (deque_is_empty(&self->queue)) { - self->barber_asleep = true; - } else { - SET(barber_leaves_with_customer, (size_t)deque_pop_front(&self->queue)); - } - =} -} - -/** - * Reactor representing a customer. - * This reactor reports on what is happening from the perspective of - * a customer. It also relays a `room_full` input to its `returned` - * output and its `done_cutting` input to its `done` output. - */ -reactor Customer(bank_index:size_t(0)) { - input room_full: bool; - input wait: bool; - input start_cutting: bool; - input done_cutting: bool; - - output returned: bool; - output done: bool; - - reaction (room_full) -> returned {= - char buffer[LF_TIME_BUFFER_LENGTH]; - lf_readable_time(buffer, get_elapsed_logical_time()); - info_print("Customer %d: Turned away at %s. Will try later.", - self->bank_index, buffer - ); - SET(returned, true); - =} - - reaction (wait) {= - char buffer[LF_TIME_BUFFER_LENGTH]; - lf_readable_time(buffer, get_elapsed_logical_time()); - info_print("Customer %d: Entered waiting room at %s. Waiting.", - self->bank_index, buffer - ); - =} - - reaction (start_cutting) {= - char buffer[LF_TIME_BUFFER_LENGTH]; - lf_readable_time(buffer, get_elapsed_logical_time()); - info_print("Customer %d: Started a haircut at %s.", - self->bank_index, buffer - ); - =} - - reaction (done_cutting) -> done {= - char buffer[LF_TIME_BUFFER_LENGTH]; - lf_readable_time(buffer, get_elapsed_logical_time()); - info_print("Customer %d: Finished a haircut at %s.", - self->bank_index, buffer - ); - SET(done, true); - =} -} - -/** - * Upon receiving an `enter` input (whose value is a customer ID), - * send a `start_cutting` output to corresponding customer, then - * then schedule the logical action `done` to trigger a random - * amount of time later. Upon triggering the `done` action, send a - * `done_cutting` output to the corresponding customer and a - * `next` output to ask for the next customer. - * - * The random time the haircut takes is uniformly distributed between - * `min_cut_time` and `max_cut_time`. - */ -reactor Barber( - min_cut_time:time(5 minutes), - max_cut_time:time(15 minutes), - num_customers:size_t(20) -) { - input enter: int; - - output[num_customers] start_cutting: bool; - output[num_customers] done_cutting: bool; - output next: bool; - - logical action done: int; - - reaction (done) -> done_cutting, next {= - int customer_id = done->value; - SET(done_cutting[customer_id], true); - SET(next, true); - =} - - reaction (enter) -> start_cutting, done {= - int customer_id = enter->value; - SET(start_cutting[customer_id], true); - - // Calculate a random delay. - interval_t delay = self->min_cut_time - + random_time(self->max_cut_time - self->min_cut_time); - - // Notify the customer - schedule_int(done, delay, customer_id); - =} -} - - -main reactor ( - waiting_room_capacity:size_t(7), - max_time_between_customers:time(10 minutes), - min_cut_time:time(5 minutes), - max_cut_time:time(15 minutes), - num_customers:size_t(20) -) { - - factory = new CustomerFactory( - num_customers=num_customers, - max_time_between_customers=max_time_between_customers - ); - room = new WaitingRoom( - capacity=waiting_room_capacity, - num_customers=num_customers - ); - - barber = new Barber( - min_cut_time=min_cut_time, - max_cut_time=max_cut_time, - num_customers=num_customers - ) - customers = new[num_customers] Customer(); - - factory.send_customer -> room.customer_enters; - room.full -> customers.room_full; - room.wait -> customers.wait; - room.barber_leaves_with_customer -> barber.enter; - barber.next -> room.barber_arrives; - barber.start_cutting -> customers.start_cutting; - barber.done_cutting -> customers.done_cutting; - customers.done -> factory.customer_done; - - customers.returned -> factory.customer_returned; -} diff --git a/example/C/src/Smokers.lf b/example/C/src/Smokers.lf deleted file mode 100644 index 9106dc481d..0000000000 --- a/example/C/src/Smokers.lf +++ /dev/null @@ -1,158 +0,0 @@ -/** - * A classic challenge program in concurrent programming is called the - * "cigarette smoker's problem" was introduced by Suhas Patil in 1971 - * (Patil, 1971) and is discussed in Downey's *Little Book of Semaphores* - * (Downey, 2016). Patil's original formulation goes like this: - * - * "Three smokers are sitting at a table. One of them has tobacco, - * another has cigarette papers, and the third one has matches---each - * one has a different ingredient required to make and smoke a cigarette - * but he may not give any ingredient to another. On the table in front - * of them, two of the three ingredients will be placed, and the smoker - * who has the necessary third ingredient should pick up the ingredients - * from the table, make the cigarette and smoke it. Since a new set of - * ingredients will not be placed on the table until this action is - * completed, the other smokers who cannot make and smoke a cigarette - * with the ingredients on the table must not interfere with the fellow - * who can." - * - * A naive solution realizes each smoker as follows (in pseudo code, - * shown for the smoker that holds tobacco): - * ``` - * while(true) { - * acquire_paper(); - * acquire_matches(); - * smoke(); - * release(); - * } - * ``` - * The two "acquire" functions block until the specified resource is - * available on the table and then acquire exclusive access to that resource. - * This realization, however, very likely deadlocks because after this smoker - * acquires paper, another smoker may acquire the matches (or the supplier - * process supplies tobacco instead of matches). At that point, no further - * progress is possible and all smokers freeze. - * - * Patil imposed some constraints, that "the process which supplies the - * ingredients cannot be changed," and that "no conditional statements - * can be used." Patil argued that under these constraints, the problem - * cannot be solved using Dijkstra's semaphores. - * - * In 1975, Parnas showed that Patil had imposed some additional unstated - * constraints on the use of semaphores and gave a solution that uses - * vector semaphores, but still avoids conditional statements - * (Parnas, 1975). Downey argued that the constraint to avoid conditional - * statements is rather artificial, but with the less artificial constraint - * that the supplier not be modified (it could, after all, represent an - * operating system), then the problem is interesting and the solutions - * can get quite convoluted (Downey, 2016). Searching the web for solutions - * to this problem yields a few other attempts to solve it, including one - * that argues that the problem demonstrates the requirement for tests - * that enrich semaphores such as POSIX operations such as `sem_try_wait()` - * or `pthread_mutex_trylock()`. See for example OpenCSF: - * [https://w3.cs.jmu.edu/kirkpams/OpenCSF/Books/csf/html/CigSmokers.html], - * although, unfortunately, the solution given there still exhibits the - * possibility of a form of deadlock, where one thread repeatedly, - * unfairly acquires a semaphore in a busy wait. - * - * A more commonly accepted solution, one implemented for example in - * the Savina actor benchmark suite (Imam and Sarkar, 2014), defines - * a centralized coordinator that first determines what the supplier - * has supplied, then decides which smoker should be given permission - * to take the supplies and dispatches a message to that smoker. - * - * Here, we give a Lingua Franca solution to Patil's original problem - * statement that does not use semaphores (except under the hood in the - * Lingua Franca implementation). This does not really solve Patil's - * problem, which was explicitly about how to accomplish this with - * semaphores, but instead demonstrates that some problems that become - * challenging puzzles with semaphores becomes trivially easy and - * uninteresting in Lingua Franca. - * - * References: - * - * Downey, A.B.: The Little Book of Semaphores, vol. Version 2.2.1. - * Green Tea Press, second edition edn. (2016), - * [https://greenteapress.com/semaphores/ LittleBookOfSemaphores.pdf] - * - * Imam,S.,Sarkar,V.: "Savina---An Actor Benchmark Suite Enabling Empirical - * Evaluation of Actor Libraries." In: Workshop on Programming based on - * Actors, Agents, and Decentralized Control (AGERE) (2014). - * [https://doi.org/10.1145/2687357.2687368] - * - * Parnas, D.L.: "On a Solution to the Cigarette Smokers’ Problem - * (Without Conditional Statements)." Communications of the ACM 18(3), - * 181–183 (March 1975). [https://doi.org/10.1145/360680.360709]. - * - * Patil,S.S.: "Limitations and Capabilities of Dijkstra’s Semaphore - * Primitives for Coordination among Processes." Report, Computation - * Structures Group, Project MAC, MIT (February 1971) - * - * @author Edward A. Lee - */ -target C; -main reactor { - a = new Agent(); - s1 = new Smoker(smoke_time = 1 sec, has = 0); // Has tobacco. - s2 = new Smoker(smoke_time = 2 sec, has = 1); // Has paper. - s3 = new Smoker(smoke_time = 3 sec, has = 2); // Has matches. - (a.tobacco)+ -> s1.tobacco, s2.tobacco, s3.tobacco; - (a.paper)+ -> s1.paper, s2.paper, s3.paper; - (a.matches)+ -> s1.matches, s2.matches, s3.matches; - s1.done, s2.done, s3.done -> a.trigger; -} -reactor Agent { - input[3] trigger:bool; - output tobacco:bool; - output paper:bool; - output matches:bool; - reaction(startup) {= - // At start, seed the random number. - srand((unsigned)get_logical_time()); - =} - reaction(startup, trigger) -> tobacco, paper, matches {= - int choice = rand() % 3; - if (choice == 0) { - SET(tobacco, true); - SET(paper, true); - info_print("Agent putting tobacco and paper on the table."); - } else if (choice == 1) { - SET(tobacco, true); - SET(matches, true); - info_print("Agent putting tobacco and matches on the table."); - } else { - SET(paper, true); - SET(matches, true); - info_print("Agent putting paper and matches on the table."); - } - =} -} -reactor Smoker( - smoke_time:time(1 sec), - has:int(0) // 0 for tobacco, 1 for paper, 2 for matches -) { - input tobacco:bool; - input paper:bool; - input matches:bool; - - output done:bool; - - logical action smoke; - - reaction(smoke) -> done {= - info_print("Smoker is done smoking."); - SET(done, true); - =} - reaction(tobacco, paper, matches) -> smoke {= - if (self->has == 0 && paper->is_present && matches->is_present) { - info_print("Smoker with tobacco starts smoking."); - schedule(smoke, self->smoke_time); - } else if (self->has == 1 && tobacco->is_present && matches->is_present) { - info_print("Smoker with paper starts smoking."); - schedule(smoke, self->smoke_time); - } else if (self->has == 2 && tobacco->is_present && paper->is_present) { - info_print("Smoker with matches starts smoking."); - schedule(smoke, self->smoke_time); - } - =} -} diff --git a/example/C/src/TrainDoor/TrainDoor.lf b/example/C/src/TrainDoor/TrainDoor.lf deleted file mode 100644 index 4b2d2bddca..0000000000 --- a/example/C/src/TrainDoor/TrainDoor.lf +++ /dev/null @@ -1,113 +0,0 @@ -target C {keepalive: true}; - -preamble {= - #include - struct { - void* move; - void* open; - void* close; - } buttons; - - void* read_input(void* arg) { - printf("***************************************************************\n"); - printf("Press 'o' and hit return or enter to open the door\n"); - printf("Press 'c' and hit return or enter to close the door\n"); - printf("Press 'm' and hit return or enter perturb the motion sensor\n"); - while(1) { - int c = getchar(); - if (c == 'm') { - schedule(buttons.move, 0); - } - if (c == 'o') { - schedule(buttons.open, 0); - } - if (c == 'c') { - schedule(buttons.close, 0); - } - if (c == EOF) { - break; - } - } - request_stop(); - return NULL; - } -=} - -reactor MotionDetector { - physical action movement; - state timestamp:time(0); - state moved:bool(false); - input check:bool; - output ok:bool; - reaction(startup) -> movement {= - buttons.move = movement; - lf_thread_t thread_id; - lf_thread_create(&thread_id, &read_input, NULL); - =} - reaction(movement) {= - printf("Motion detected!\n"); - self->moved = true; - self->timestamp = get_logical_time(); - =} - reaction(check) -> ok {= - if (!self->moved || (get_logical_time() - self->timestamp) > SECS(2)) { - SET(ok, true); - } else { - SET(ok, false); - } - =} -} - -reactor DoorController { - - physical action open; - physical action close; - - output check:bool; - input ok:bool; - state opened:bool(false); - state requested:bool(false); - reaction(startup) -> open, close {= - buttons.open = open; - buttons.close = close; - =} - - reaction(open) -> check {= - if (self->opened) { - printf("The door is already open\n"); - } else { - printf("Checking the motion sensor\n"); - SET(check, false); - self->requested = true; - } - =} - - reaction(close) {= - printf("Closing the door\n"); - self->opened = false; - =} - - reaction(ok) {= - if (self->requested && ok->value) { - self->opened = true; - printf("Opening the door.\n"); - } else { - printf("Cannot open the door; recent motion detected.\n"); - } - self->requested = false; - =} -} - -/** - * Reactor that emulates a train door. It has two components: one that - * controls the door and one that senses motion. When the door controller - * receives a request to open the door (a button press), it has to first - * check whether the vehicle was recently in motion. The request will be - * denied if motion has been detected less than two seconds ago. - */ -main reactor TrainDoor { - motion = new MotionDetector(); - door = new DoorController(); - door.check -> motion.check; - motion.ok -> door.ok; -} diff --git a/example/C/src/TrainDoor/TrainDoorAsymmetric.lf b/example/C/src/TrainDoor/TrainDoorAsymmetric.lf deleted file mode 100644 index ddb892b355..0000000000 --- a/example/C/src/TrainDoor/TrainDoorAsymmetric.lf +++ /dev/null @@ -1,49 +0,0 @@ -// This is a variant of the example is considered in this paper: -// https://www.mdpi.com/2227-7390/8/7/1068 -// where it is studied for its verifiability. -target C; -reactor Controller { - output lock:bool; output unlock:bool; - output move:bool; output stop:bool; - physical action external:bool; - reaction(startup) {= - // ... Set up external sensing. - =} - reaction(external)->lock, unlock, move, stop {= - if (external->value) { - SET(lock, true); SET(move, true); - } else { - SET(unlock, true); SET(stop, true); - } - =} -} -reactor Train { - input move:bool; input stop:bool; - state moving:bool(false); - reaction(move) {= - self->moving = true; - =} - reaction(stop) {= - self->moving = false; - =} -} -reactor Door { - input lock:bool; input unlock:bool; - state locked:bool(false); - reaction(lock) {= - // ... Actuate to lock door. - self->locked = true; - =} - reaction(unlock) {= - // ... Actuate to unlock door. - self->locked = false; - =} -} -main reactor { - c = new Controller(); d = new Door(); - t = new Train(); - c.lock -> d.lock; - c.unlock -> d.unlock after 100 msec; // |\label{line:unlockafter}| - c.move -> t.move after 100 msec; // |\label{line:moveafter}| - c.stop -> t.stop; -} diff --git a/example/C/src/TrainDoor/TrainDoorSimplest.lf b/example/C/src/TrainDoor/TrainDoorSimplest.lf deleted file mode 100644 index 0a43d2c8bc..0000000000 --- a/example/C/src/TrainDoor/TrainDoorSimplest.lf +++ /dev/null @@ -1,39 +0,0 @@ -// This simple example is considered in this paper: -// https://www.mdpi.com/2227-7390/8/7/1068 -// where it is studied for its verifiability. -target C; -reactor Controller { - output lock:bool; - output move:bool; - physical action external_move:bool; - reaction(startup) {= - // ... Set up sensing. - =} - reaction(external_move)->lock, move {= - SET(lock, external_move->value); - SET(move, external_move->value); - =} -} -reactor Train { - input move:bool; - state moving:bool(false); - reaction(move) {= - // ... actuate to move or stop - self->moving = move->value; - =} -} -reactor Door { - input lock:bool; - state locked:bool(false); - reaction(lock) {= - // ... Actuate to lock or unlock door. - self->locked = lock->value; - =} -} -main reactor { - controller = new Controller(); - door = new Door(); - train = new Train(); - controller.lock -> door.lock; - controller.move -> train.move; -} diff --git a/example/C/src/TrainDoor/TrainDoorWithDeadlines.lf b/example/C/src/TrainDoor/TrainDoorWithDeadlines.lf deleted file mode 100644 index fd312f5c5c..0000000000 --- a/example/C/src/TrainDoor/TrainDoorWithDeadlines.lf +++ /dev/null @@ -1,66 +0,0 @@ -// This is a variant of the example is considered in this paper: -// https://www.mdpi.com/2227-7390/8/7/1068 -// where it is studied for its verifiability. -target C; -reactor Controller { - output lock:bool; - output unlock:bool; - output move:bool; - output stop:bool; - physical action external_move(100 msec):bool; - reaction(startup) {= - // ... Set up sensing. - =} - reaction(external_move)->lock, move, unlock, stop {= - SET(lock, external_move->value); - SET(move, external_move->value); - =} -} -realtime reactor Train { - input move:bool; - input stop:bool; - state moving:bool(false); - reaction(stop) {= - self->moving = false; - =} deadline (50 msec) {= =} - reaction(move) {= - self->moving = false; - =} deadline(48 msec) {= =} -} -realtime reactor Door { - input lock:bool; - input unlock:bool; - physical action external_open; - state locked:bool(false); - state open:bool(false); - reaction(startup) {= - // ... Set up sensing. - =} deadline(48 msec) {= =} - reaction(lock) {= - if (lock && self->open) { - // ... Actuate to close door. - self->open = false; - } - self->locked = lock->value; - =} deadline(50 msec) {= - // ... handle the deadline violation... - =} - reaction(unlock) {= - self->locked = true; - =} - reaction(external_open) {= - if (!self->locked) { - // ... Actuate to open door. - self->open = true; - } - =} -} -main reactor { - controller = new Controller(); - door = new Door(); - train = new Train(); - controller.lock -> door.lock; - controller.move -> train.move after 51 msec; - controller.unlock -> door.unlock after 51 msec; - controller.stop -> train.stop; -} diff --git a/example/C/src/TrainDoor/TrainDoorWithDoorOpenState.lf b/example/C/src/TrainDoor/TrainDoorWithDoorOpenState.lf deleted file mode 100644 index b75694c999..0000000000 --- a/example/C/src/TrainDoor/TrainDoorWithDoorOpenState.lf +++ /dev/null @@ -1,56 +0,0 @@ -// This is a variant of the example is considered in this paper: -// https://www.mdpi.com/2227-7390/8/7/1068 -// where it is studied for its verifiability. -target C; -reactor Controller { - output lock:bool; - output move:bool; - physical action external_move:bool; - reaction(startup) {= - // ... Set up sensing. - =} - reaction(external_move)->lock, move {= - SET(lock, external_move->value); - SET(move, external_move->value); - =} -} -reactor Train { - input move:bool; - state moving:bool(false); - reaction(move) {= - if (move) { - self->moving = true; - } else { - self->moving = false; - } - =} -} -reactor Door { - input lock:bool; - physical action external_open; - state locked:bool(false); - state open:bool(false); - reaction(startup) {= - // ... Set up sensing. - =} - reaction(lock) {= - if (lock && self->open) { - // ... Actuate to close door. - self->open = false; - } - self->locked = lock->value; - =} - reaction(external_open) {= - if (!self->locked) { - // ... Actuate to open door. - self->open = true; - } - =} -} -main reactor { - controller = new Controller(); - door = new Door(); - train = new Train(); - controller.lock -> door.lock; - controller.move -> train.move; -} diff --git a/example/C/src/TrainDoor/TrainDoorWithOpen.lf b/example/C/src/TrainDoor/TrainDoorWithOpen.lf deleted file mode 100644 index 96610904ee..0000000000 --- a/example/C/src/TrainDoor/TrainDoorWithOpen.lf +++ /dev/null @@ -1,52 +0,0 @@ -// This is a variant of the example is considered in this paper: -// https://www.mdpi.com/2227-7390/8/7/1068 -// where it is studied for its verifiability. -target C; -reactor Controller { - output close:bool; output lock:bool; - output unlock:bool; output open:bool; - physical action external:bool; - reaction(startup) {= - // ... Set up external sensing. - =} - reaction(external)->close, lock, open, unlock {= - if (external->value) { - SET(close, true); SET(lock, true); - } else { - SET(open, true); SET(unlock, true); - } - =} -} -reactor Door { - input close:bool; input lock:bool; - input unlock:bool; input open:bool; - physical action ext_open:bool; - state locked:bool(false); - state is_open:bool(false); - reaction(close) {= - // ... Actuate to close door. - self->is_open = false; - =} - reaction(lock) {= - // ... Actuate to lock door. - if(!self->is_open) - self->locked = true; - =} - reaction(unlock) {= - // ... Actuate to unlock door. - self->locked = false; - =} - reaction(open, ext_open) {= - // ... Actuate to open door. - if(!self->locked) - self->is_open = true; - =} -} -main reactor { - c = new Controller(); - d = new Door(); - c.lock -> d.lock after 5 msec; // |\label{line:unlockafter}| - c.unlock -> d.unlock after 4 msec; // |\label{line:unlockafter}| - c.open -> d.open after 7 msec; // |\label{line:unlockafter}| - c.close -> d.close after 3 msec; // |\label{line:unlockafter}| -} diff --git a/example/Cpp/src/AlarmClock/AlarmClock.cmake b/example/Cpp/src/AlarmClock/AlarmClock.cmake deleted file mode 100644 index d764890d3c..0000000000 --- a/example/Cpp/src/AlarmClock/AlarmClock.cmake +++ /dev/null @@ -1,9 +0,0 @@ -find_package (Threads) -find_package (Crow) - -set(CROW_HEADERS ../../Crow/include/) -set(CPP_SOURCES ${CMAKE_CURRENT_LIST_DIR}) - -target_link_libraries(${LF_MAIN_TARGET} ${CMAKE_THREAD_LIBS_INIT} Crow::Crow) -target_include_directories(${LF_MAIN_TARGET} PUBLIC ${CPP_SOURCES}) - diff --git a/example/Cpp/src/AlarmClock/AlarmClock.lf b/example/Cpp/src/AlarmClock/AlarmClock.lf deleted file mode 100644 index 338b219fdb..0000000000 --- a/example/Cpp/src/AlarmClock/AlarmClock.lf +++ /dev/null @@ -1,40 +0,0 @@ -/* -* This is a minimal example of an alarmclock implemeted using the -* features lingua franca supplies. -* -* This is just an extract and simplification from the main project -* which you can find here: https://github.com/revol-xut/lf-alarm-clock -* -* This file contains the networking implementation it is really just an -* simple socket application which parses simple http headers and respondes -* in text/plain -* -* @author Tassilo Tanneberer -*/ - -target Cpp{ - cmake-include: "AlarmClock.cmake", - keepalive: true -}; - -import Network from "./Network.lf"; -import Clock from "./Clock.lf"; - -#import Network.lf; -#import Clock.lf; - -main reactor AlarmClock { - clock = new Clock(); - network = new Network(); - - // additon of a new event - network.event -> clock.event; - network.delete_index -> clock.cancel_by_index; - clock.event_dump -> network.updated_events; - - reaction (startup) {= - std::cout << "Starting Lingua Franca AlarmClock" << std::endl; - =} -} - - diff --git a/example/Cpp/src/AlarmClock/Clock.lf b/example/Cpp/src/AlarmClock/Clock.lf deleted file mode 100644 index 30e3c64199..0000000000 --- a/example/Cpp/src/AlarmClock/Clock.lf +++ /dev/null @@ -1,206 +0,0 @@ -/* -* This is a minimal example of an alarmclock implemeted using the -* features lingua franca supplies. -* -* This is just an extract and simplification from the main project -* which you can find here: https://github.com/revol-xut/lf-alarm-clock -* -* Author: Tassilo Tanneberer -*/ - - -target Cpp{ - cmake-include: "AlarmClock.cmake", - keepalive: true -}; - -public preamble {= - #include "shared_header.hpp" -=} - -reactor Trigger { - private preamble {= - auto convert_to_relative = [](long time_stamp){ - const auto t = std::chrono::system_clock::now(); - std::chrono::seconds desired_time = std::chrono::seconds(time_stamp); - std::chrono::seconds current_time = - std::chrono::duration_cast(t.time_since_epoch()); - std::chrono::seconds delta_t = desired_time - current_time; - return delta_t; - }; - =} - - input input_event: {=Event=}; - input input_interrupt: long; - logical action interrupt; - logical action triggered_event: {=std::string=}; - state ignore_flag: bool; - - //the input_event will scheduled - reaction (input_event) -> triggered_event {= - if(input_event.is_present()) { - auto extracted = input_event.get().get(); - auto delta_t = convert_to_relative(extracted->time_stamp_); - triggered_event.schedule(extracted->message_, delta_t); - } - =} - - reaction (input_interrupt) -> interrupt {= - if(input_interrupt.is_present()){ - auto delta_t = convert_to_relative(*(input_interrupt.get().get())); - interrupt.schedule(delta_t); - } - =} - - // reaction which will be triggered when a event is due - reaction(triggered_event) {= - auto select_random_file = []{ - std::vector files; - for (const auto& file : std::filesystem::directory_iterator(kMusicDir)) { - files.push_back(file.path().filename()); - } - - return files[rand() % files.size()]; - }; - - // takes a random audio file and playes it with mpg321 - if(triggered_event.is_present() and not ignore_flag){ - std::cout << "Triggering Event: " << *(triggered_event.get().get()) << std::endl; - std::string command = std::string(kPlayerCommand) + " " + std::string(kMusicDir) + select_random_file(); - if( system(command.c_str()) != 0 ){ - std::runtime_error("mpc finished with non zero return value"); - } - } - ignore_flag = false; - =} - - reaction (interrupt) {= - ignore_flag = true; - =} -} - -reactor Clock { - // function which is used to check if a given event has already past - private preamble {= - auto time_over(const Event& event) noexcept -> bool { - const auto p1 = std::chrono::system_clock::now(); - auto current_time = std::chrono::duration_cast(p1.time_since_epoch()).count(); - return current_time > event.time_stamp_; - } - =} - - // trigger reactor which handles the execution of the scheduled reaction - trigger = new Trigger(); - // this event will be scheduled and added to persistent storage - input event: Event; - input cancel_by_index: std::size_t; - // list of events - output event_dump: {= std::vector =}; - // timer which triggers clear and save - timer maintance(10 sec, 30 sec); - - // persistant storage - state events: std::vector(); - - // reaction that appends new events which will be scheduled - // the newtwork reactor is updated - reaction (event) -> trigger.input_event, event_dump {= - if (event.is_present() and not time_over(*event.get())){ - trigger.input_event.set(*event.get()); - events.push_back(*event.get()); - event_dump.set(events); - } - =} - - // initiation ... reading file to create state - reaction (startup) -> trigger.input_event, event_dump {= - // if the calender file doesn't exists it's created - if (not std::filesystem::exists(kFile)){ - std::ofstream{kFile}; - } - - std::ifstream file; - file.open(kFile); - - std::string line; - if(not file.is_open()) { - throw std::runtime_error("Cannot open event file!"); - } - - // iterating through the file every line corresponds to one events (csv) - while (file) { - std::getline(file, line); - if (line.empty()) { - break; - } - - Event serialized_event {}; - - // an event has the shape message;time_stamp\newline - std::size_t colon_pos = line.find(";"); - serialized_event.message_ = line.substr(0, colon_pos); - serialized_event.time_stamp_ = static_cast( - std::stoi(line.substr(colon_pos + 1, line.size() - 2)) - ); - - // if the given event is not already in the past it gets schedules by lingua franca - if(not time_over(serialized_event)){ - trigger.input_event.set(serialized_event); - events.push_back(serialized_event); - } - } - - file.close(); - event_dump.set(events); - =} - - // state needs to be saved to file - reaction (shutdown, maintance) -> event_dump {= - remove_events(); - save(); - event_dump.set(events); - =} - - reaction (cancel_by_index) -> trigger.input_interrupt, event_dump {= - if(cancel_by_index.is_present()) { - std::size_t index = *(cancel_by_index.get().get()); - - if( index < events.size()){ - auto tag = events.at(index).time_stamp_; - trigger.input_interrupt.set(tag); - events.erase(events.begin() + index); - event_dump.set(events); - } - - } - =} - - method remove_events() {= - // list of element which can be removed in the next iteration - std::vector removed_indices; - std::size_t index = 0; - for(const Event& event: events) { - if (time_over(event)){ - removed_indices.push_back(index); - } - index++; - } - - std::size_t removed_counter = 0; - for (std::size_t i : removed_indices) { - events.erase(events.begin() + i - removed_counter); - removed_counter++; - } - =} - - method save() {= - std::ofstream file(kFile, std::ios::trunc); - - for (const Event& e : events ) { - file << e.message_ + ";" + std::to_string(e.time_stamp_) + "\n"; - } - - file.close(); - =} -} - diff --git a/example/Cpp/src/AlarmClock/Network.lf b/example/Cpp/src/AlarmClock/Network.lf deleted file mode 100644 index 630922078d..0000000000 --- a/example/Cpp/src/AlarmClock/Network.lf +++ /dev/null @@ -1,225 +0,0 @@ -/* -* This is a minimal example of an alarmclock implemeted using the -* features lingua franca supplies. -* -* This is just an extract and simplification from the main project -* which you can find here: https://github.com/revol-xut/lf-alarm-clock - -* This file contains the networking implementation it is really just an -* simple socket application which parses simple http headers and respondes -* in text/plain -* -* @author Tassilo Tanneberer -*/ - -target Cpp{ - cmake-include: "AlarmClock.cmake", - keepalive: true -}; - -public preamble {= - #include "shared_header.hpp" -=} - -reactor Network { - private preamble {= - #include - #include - #include - #include - #include - =} - - // physical event which is triggered by receiving a request - physical action new_event: Event; - physical action delete_request: std::size_t; - - // variables for the receive thread - state thread: std::thread; // receive thread - state events: std::vector; // copy - - input updated_events: std::vector; - output event: Event; // event which will be added to the clock - output delete_index: std::size_t; - - // this reaction transforms a physical action into a logical reaction - reaction (new_event) -> event {= - if(new_event.is_present()){ - event.set(new_event.get()); - } - =} - - reaction (delete_request) -> delete_index {= - if(delete_request.is_present()){ - delete_index.set(delete_request.get()); - } - =} - - // main starts receive thread - reaction (startup) -> delete_request, new_event{= - thread = std::thread([&] { - crow::SimpleApp app; - - // returns json of all the upcoming events - CROW_ROUTE(app, "/list") ([&]{ - // function converts unix timestamp to human readable datetime string - auto unix_to_human_readable = [](unsigned int time_stamp){ - using Clock = std::chrono::high_resolution_clock; - using TimePoint = std::chrono::time_point; - const Clock::duration duration_time_stamp = std::chrono::seconds(time_stamp); - const TimePoint chrono_time_point(duration_time_stamp); - std::time_t end_time = std::chrono::system_clock::to_time_t(chrono_time_point); - std::string return_string(std::ctime(&end_time)); - return return_string.substr(0, return_string.size() - 2); - }; - - crow::json::wvalue response; - for (const Event& event : events ){ - crow::json::wvalue json_event; - json_event["date"] = std::move(unix_to_human_readable(event.time_stamp_)); - json_event["message"] = event.message_; - - response[std::to_string(event.time_stamp_)] = std::move(json_event); - }; - return crow::response(response); - }); - - // adds new event by unix time stamp - CROW_ROUTE(app, "/add_event_timestamp").methods("POST"_method) - ([&new_event](const crow::request& req){ - auto json_body = crow::json::load(req.body); - if (!json_body) { - return crow::response(400); - } - - // maybe add extra input validation - Event serialized_event { - json_body["message"].s(), - static_cast(json_body["time_stamp"].u()) - }; - - // triggers physical action - new_event.schedule(serialized_event, 0ms); - crow::json::wvalue response; - response["success"] = true; - return crow::response(response); - }); - - // adds new event by relativ times - CROW_ROUTE(app, "/add_event_relative").methods("POST"_method) - ([&new_event](const crow::request& req){ - auto relativ_time = 0l; - auto json_body = crow::json::load(req.body); - if (!json_body) { - return crow::response(400); - } - - // calculates relative time in seconds - if(json_body.has("day")){ - relativ_time += 24 * 60 * 60 * json_body["day"].i(); - } - if(json_body.has("hour")){ - relativ_time += 60 * 60 * json_body["hour"].i(); - } - if(json_body.has("minute")){ - relativ_time += 60 * json_body["minute"].i(); - } - if(json_body.has("second")){ - relativ_time += json_body["second"].i(); - } - - const auto now = std::chrono::system_clock::now(); - auto current_time = std::chrono::duration_cast(now.time_since_epoch()).count(); - - std::cout << "current_time: " << current_time << " offset:" << relativ_time << std::endl; - Event serialized_event { - json_body["message"].s(), - current_time + relativ_time - }; - - // triggers physical action - new_event.schedule(serialized_event, 0ms); - crow::json::wvalue response; - response["success"] = true; - return crow::response(response); - }); - - // will set the timer in the text 24 hours - CROW_ROUTE(app, "/add_event_time").methods("POST"_method) - ([&new_event](const crow::request& req){ - // just % doesn't work because it is the remainder operator - // and does not behave like modulo for negative numbers - auto mod = [](int a, int b) { - int r = a % b; - return r < 0 ? r + b : r; - }; - - auto relativ_time = 0l; - auto json_body = crow::json::load(req.body); - if (!json_body) { - return crow::response(400); - } - - // use std::chrono::hh_mm_ss when C++20 is available - time_t time_struct = time(NULL); - struct tm *formatted_time = localtime(&time_struct); - - // calculating time differences and turning them into seconds for the time_stamp - if(json_body.has("hour")){ - relativ_time += 3600 * mod(json_body["hour"].i() - formatted_time->tm_hour - 1, 24); - } - if(json_body.has("minute")){ - relativ_time += 60 * mod(json_body["minute"].i() - formatted_time->tm_min - 1, 60); - } - if(json_body.has("second")){ - relativ_time += mod(json_body["second"].u() - formatted_time->tm_sec - 1, 60); - } - - Event serialized_event { - json_body["message"].s(), - relativ_time + time_struct - }; - - // triggers physical action - new_event.schedule(serialized_event, 0ms); - crow::json::wvalue response; - response["success"] = true; - return crow::response(response); - }); - - // request stopping playing music - // just used pidof to kill the process - CROW_ROUTE(app, "/stop") ([]{ - int status = system((std::string(kKillCommand) + " $(" + std::string(kPidofCommand) + " mpg321)").c_str()); - crow::json::wvalue response; - response["success"] = status; - return crow::response(response); - }); - - CROW_ROUTE(app, "/remove").methods("POST"_method) - ([&delete_request](const crow::request& req){ - auto json_body = crow::json::load(req.body); - if (!json_body) { - return crow::response(400); - } - - std::size_t index = json_body["index"].u(); - delete_request.schedule(index, 0s); - - crow::json::wvalue response; - response["success"] = true; - return crow::response(response); - }); - - // start the http server - app.port(kPort).multithreaded().run(); - }); - =} - reaction (updated_events) {= - events = std::move(*updated_events.get()); - =} - - reaction ( shutdown ) {= - thread.join(); - =} -} diff --git a/example/Cpp/src/AlarmClock/README.md b/example/Cpp/src/AlarmClock/README.md deleted file mode 100644 index 914f796dfd..0000000000 --- a/example/Cpp/src/AlarmClock/README.md +++ /dev/null @@ -1,171 +0,0 @@ -Lingua Franca Alarm Clock ----------------------------- - -**Contact:** - -**Main Repository:** [](https://github.com/revol-xut/lf-alarm-clock) - -A small and tiny alarmclock which is written using the scheduling and time features from lingua franca. - -## What you will learn - -- sharing state between reactors -- stopping scheduled events - -## Project - -![Programm Structure](./images/entire_program.png) - - -## Building - -**Dependencies:** jdk11, boost, mpg321, Crow - - -```bash - $ lfc ./AlarmClock.lf -``` - -**Building with nix** - -This cross compiles for aarch64. -``` - nix build .#packages.aarch64-linux.lf-alarm-clock -``` - -## Installation - -By default the AlarmClock expects the sound files to be placed in `~/music/AlarmClock/` you can change this -path by editing the `shared_header.cpp` file. Furthermore is it possible to configure paths to other binaries -in this file e.g. kill, mpg321 -commands. - -### Installing Crow from source - -On most distros, Crow needs to be build and installed from source: - -```bash - $ git clone git@github.com:CrowCpp/Crow.git - $ mkdir Crow/build - $ cd Crow/build - $ cmake -DCMAKE_INSTALL_PREFIX= - $ make install -``` -Note that you can adjust the preferred install location by replacing ``. - -To build the alarm clock using this manually installed version of Crow, simply run: -```bash - $ CMAKE_PREFIX_PATH= lfc ./AlarmClock.lf -``` - -## Endpoints & Usage - -### /list **GET** -Returns a list of upcoming events. - -```json - "timestamp": { - "date": "" - "message": "" - } -``` - -**Examples** - -``` -$ curl http://0.0.0.0:8680/list -``` - -### /stop **GET** -Stops the currently playing alarm sound. - -```json -{ - "success": "exit code" -} -``` - -**Examples** - -``` -$ curl http://0.0.0.0:8680/stop -``` - -### /add_event_timestamp **POST** -Will schedule your alarmclock for the given timestamp - -Request: -```json -{ - "message": "", - "time_stamp": 0 -} -``` -Response: -```json -{ - "success": true -} -``` - -**Examples** - -``` -$ curl http://0.0.0.0:8680/add_event_timestamp -X POST -H "Content-Type: text/json" -d '{"message": "test", "time_stamp": 1643400000}' -``` - -Schedules event for given timestamp. - -### /add_event_relative **POST** -Will schedule a event relative to the current time. - -Request -```json -{ - "days": 0, - "hours": 0, - "minutes": 0, - "seconds": 0 -} -``` - -Response: -``` -{ - "success": true -} -``` - -**Example** - -``` -$ curl http://0.0.0.0:8680/add_event_relative -X POST -H "Content-Type: text/json" -d '{"hour": 6, "minute":0, "second": 0, "message": "hello"}' -``` - -Schedules sets your alarmclock to activate in 6 hours. - -### /add_event_time **POST** -Schedule event for this time in the next 24 hours. If a parameter -is unspecified the current time is used. - -Request -```json -{ - "hour": 0, - "minute": 0, - "second": 0 -} -``` - -Response: -```json -{ - "success": true -} -``` -**Example** - -``` - $ curl http://0.0.0.0:8680/add_event_time -X POST -H "Content-Type: text/json" -d '{"message": "test", "hour": 6, "minute":0, "second": 0, "message": "hello"}' -``` - -Schedules the event for the next time the given time occures. diff --git a/example/Cpp/src/AlarmClock/derivation.nix b/example/Cpp/src/AlarmClock/derivation.nix deleted file mode 100644 index bd65751d5d..0000000000 --- a/example/Cpp/src/AlarmClock/derivation.nix +++ /dev/null @@ -1,110 +0,0 @@ -{stdenv, pkgs, lib, fetchFromGitHub,...}: -let - -lfc = stdenv.mkDerivation { - pname = "lfc"; - version = "0.1.0"; - - src = fetchFromGitHub { - owner = "revol-xut"; - repo = "lingua-franca-nix-releases"; - rev = "11c6d5297cd63bf0b365a68c5ca31ec80083bd05"; - sha256 = "DgxunzC8Ep0WdwChDHWgG5QJbJZ8UgQRXtP1HZqL9Jg="; - }; - - buildInputs = with pkgs; [ jdk11_headless ]; - - _JAVA_HOME = "${pkgs.jdk11_headless}/"; - - postPatch = '' - substituteInPlace bin/lfc \ - --replace 'base=`dirname $(dirname ''${abs_path})`' "base='$out'" \ - --replace "run_lfc_with_args" "${pkgs.jdk11_headless}/bin/java -jar $out/lib/jars/org.lflang.lfc-0.1.0-SNAPSHOT-all.jar" - ''; - - installPhase = '' - cp -r ./ $out/ - chmod +x $out/bin/lfc - ''; - - meta = with lib; { - description = "Polyglot coordination language"; - longDescription = '' - Lingua Franca (LF) is a polyglot coordination language for concurrent - and possibly time-sensitive applications ranging from low-level - embedded code to distributed cloud and edge applications. - ''; - homepage = "https://github.com/lf-lang/lingua-franca"; - license = licenses.bsd2; - platforms = platforms.linux; - maintainers = with maintainers; [ revol-xut ]; - }; -}; - -# downloading the cpp runtime -cpp-runtime = stdenv.mkDerivation { - name = "cpp-lingua-franca-runtime"; - - src = fetchFromGitHub { - owner = "lf-lang"; - repo = "reactor-cpp"; - rev = "007143225dbc198a5fee233ce125c3584a9541d8"; - sha256 = "sha256-wiBTJ4jSzoAu/Tg2cMqMWv7qZD29F+ysDOOF6F/DLJM="; - }; - - nativeBuildInputs = with pkgs; [ cmake gcc ]; - configurePhase = '' - echo "Configuration" - ''; - - buildPhase = '' - mkdir -p build - cd build - cmake .. -DCMAKE_INSTALL_PREFIX=./ - make install - ''; - - installPhase = '' - cp -r ./ $out/ - ''; - - fixupPhase = '' - echo "FIXUP PHASE SKIP" - ''; -}; - - - -in - stdenv.mkDerivation { - name = "alarm-clock"; - version = "0.0.1"; - - src = fetchFromGitHub { - owner = "revol-xut"; - repo = "lf-alarm-clock"; - rev = "8113a2c84db3d960d56455a91b288e8e7c584964"; - sha256 = "sha256-WHGSlqD5CUl4JhILZeiwB0/zXP+h6rsOuEvKzn5SqFA="; - fetchSubmodules = true; - }; - - buildInputs = with pkgs; [ lfc which gcc cmake git boost ]; - - configurePhase = '' - echo "Test"; - ''; - - buildPhase = '' - echo "Starting compiling" - mkdir -p include/reactor-cpp/ - ls -a ${cpp-runtime} - cp -r ${cpp-runtime}/include/reactor-cpp/* include/reactor-cpp/ - ${lfc}/bin/lfc --external-runtime-path ${cpp-runtime}/ src/AlarmClock.lf - ''; - - installPhase = '' - mkdir -p $out/bin - cp -r ./bin/* $out/bin - ''; - } - diff --git a/example/Cpp/src/AlarmClock/flake.nix b/example/Cpp/src/AlarmClock/flake.nix deleted file mode 100644 index a05f5f6cce..0000000000 --- a/example/Cpp/src/AlarmClock/flake.nix +++ /dev/null @@ -1,15 +0,0 @@ -{ - description = "build script for the lingua-franca alarm clock"; - - inputs = { - utils.url = "github:numtide/flake-utils"; - }; - - outputs = inputs@{self, utils, nixpkgs, ...}: - utils.lib.eachDefaultSystem (system: let - pkgs = nixpkgs.legacyPackages.${system}; - in rec { - packages.lf-alarm-clock = nixpkgs.legacyPackages.${system}.callPackage ./derivation.nix {}; - } - ); -} diff --git a/example/Cpp/src/AlarmClock/images/clock.png b/example/Cpp/src/AlarmClock/images/clock.png deleted file mode 100755 index 583f4dbd1c90f0a58b9e049f6b3585fb7a49352b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18704 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 diff --git a/example/Cpp/src/AlarmClock/images/entire_program.png b/example/Cpp/src/AlarmClock/images/entire_program.png deleted file mode 100755 index 8249326de1f48db187cdd36bfcebef7497fc3a49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56985 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 TqHzh>OJXuHv@odAcaHflGk;%) diff --git a/example/Cpp/src/AlarmClock/shared_header.hpp b/example/Cpp/src/AlarmClock/shared_header.hpp deleted file mode 100644 index 1221ea486a..0000000000 --- a/example/Cpp/src/AlarmClock/shared_header.hpp +++ /dev/null @@ -1,34 +0,0 @@ -/* -* This is a minimal example of an alarmclock implemeted using the -* features lingua franca supplies. -* -* This is just an extract and simplification from the main project -* which you can find here: https://github.com/revol-xut/lf-alarm-clock -* -* Author: Tassilo Tanneberer -*/ - -#ifndef SHARED_HEADER_INCLUDE_GUARD -#define SHARED_HEADER_INCLUDE_GUARD - -#include -#include -#include -#include -#include - -struct Event { - std::string message_; - long time_stamp_; -}; - -constexpr const char* kMusicDir = "./sounds/"; -constexpr const char* kFile = "./alarm_clock_events.csv"; -constexpr const char* kPlayerCommand = "mpg321"; -constexpr const char* kKillCommand = "kill"; -constexpr const char* kPidofCommand = "pidof"; - -constexpr unsigned short kPort = 8680; - -#endif //SHARED_HEADER_INCLUDE_GUARD - diff --git a/example/Cpp/src/CarBrake/CarBrake.lf b/example/Cpp/src/CarBrake/CarBrake.lf deleted file mode 100644 index 31b88b805a..0000000000 --- a/example/Cpp/src/CarBrake/CarBrake.lf +++ /dev/null @@ -1,92 +0,0 @@ -target Cpp { - keepalive: true, - cmake-include: "threads.cmake" -}; - -reactor Camera { - timer t(20msecs, 20msecs) - output frame: void - - reaction (t) -> frame {= - frame.set(); // send a "frame" - =} -} - -reactor BrakingAssistant { - input frame: void; - output trigger_brake: void; - - state counter: int(0); - - reaction(frame) -> trigger_brake {= - // processing takes some time - std::this_thread::sleep_for(10ms); - - if (counter % 10 == 0) { - std::cout << "[automatic] Send the brake signal - " << get_physical_time() << std::endl; - trigger_brake.set(); - } - counter++; - =} -} - -reactor BrakePedal { - physical action pedal; - output trigger_brake: void; - - state thread: std::thread; - - reaction(startup) -> pedal {= - this->thread = std::thread([&] () { - // press the brake pedal roughly every second - while (true) { - std::this_thread::sleep_for(1005ms); - std::cout << "[manual] Pressing the break pedal - " << get_physical_time() << std::endl; - pedal.schedule(0ms); - } - }); - =} - - reaction(pedal) -> trigger_brake {= - std::cout << "[manual] Send the brake signal - " << get_physical_time() << std::endl; - trigger_brake.set(); - =} - - reaction(shutdown) {= - thread.join(); - =} -} - -reactor Brake { - public preamble {= - #include - =} - - input brake_assistant: void; - input brake_pedal: void; - - reaction(brake_pedal) {= - std::cout << "[system] Brake triggered - " << get_physical_time() << std::endl; - std::cout << "[system] source: manual" << std::endl; - =} deadline (3msecs) {= - std::cout << "\033[1;31m[error]\033[0m Deadline on manual braking violated - " << get_physical_time() << std::endl; - =} - - reaction(brake_assistant) {= - std::cout << "[system] Brake triggered - " << get_physical_time() << std::endl; - std::cout << "[system] source: assistant" << std::endl; - =} deadline (15msecs) {= - std::cout << "\033[1;31m[error]\033[0m Deadline on automatic braking violated - " << get_physical_time() << std::endl; - =} -} - -main reactor { - camera = new Camera(); - assistant = new BrakingAssistant(); - pedal = new BrakePedal(); - brake = new Brake(); - - camera.frame -> assistant.frame; - assistant.trigger_brake -> brake.brake_assistant; - pedal.trigger_brake -> brake.brake_pedal; -} diff --git a/example/Cpp/src/CarBrake/CarBrake2.lf b/example/Cpp/src/CarBrake/CarBrake2.lf deleted file mode 100644 index 4a953a7e8a..0000000000 --- a/example/Cpp/src/CarBrake/CarBrake2.lf +++ /dev/null @@ -1,112 +0,0 @@ -/** - * This version of the CarBreak example decouples the Vision analysis. - * If this execution is federated, then the Vision component has no effect - * on the ability to meet deadlines in the response to brake pedal actions. - */ -target Cpp { - keepalive: true, - cmake-include: "threads.cmake" -}; - -reactor Camera { - timer t(20msecs, 20msecs) - output frame: void - - reaction (t) -> frame {= - frame.set(); // send a "frame" - =} -} - -reactor BrakingAssistant { - input frame: void; - output trigger_brake: void; - - state counter: int(0); - - reaction(frame) -> trigger_brake {= - // processing takes some time - std::this_thread::sleep_for(10ms); - - if (counter % 10 == 0) { - std::cout << "[automatic] Send the brake signal - " << get_physical_time() << std::endl; - trigger_brake.set(); - } - counter++; - =} -} - -reactor BrakePedal { - physical action pedal; - output trigger_brake: void; - - state thread: std::thread; - - reaction(startup) -> pedal {= - this->thread = std::thread([&] () { - // press the brake pedal roughly every second - - while (true) { - std::this_thread::sleep_for(1005ms); - std::cout << "[manual] Pressing the break pedal - " << get_physical_time() << std::endl; - pedal.schedule(0ms); - } - }); - =} - - reaction(pedal) -> trigger_brake {= - std::cout << "[manual] Send the brake signal - " << get_physical_time() << std::endl; - trigger_brake.set(); - =} - - reaction(shutdown) {= - thread.join(); - =} -} - -reactor Brake { - public preamble {= - #include - =} - - input brake_assistant: void; - input brake_pedal: void; - - reaction(brake_pedal) {= - std::cout << "[system] Brake triggered - " << get_physical_time() << std::endl; - std::cout << "[system] source: manual" << std::endl; - =} deadline (3msecs) {= - std::cout << "\033[1;31m[error]\033[0m Deadline on manual braking violated - " << get_physical_time() << std::endl; - =} - - reaction(brake_assistant) {= - std::cout << "[system] Brake triggered - " << get_physical_time() << std::endl; - std::cout << "[system] source: assistant" << std::endl; - =} deadline (15msecs) {= - std::cout << "\033[1;31m[error]\033[0m Deadline on automatic braking violated - " << get_physical_time() << std::endl; - =} -} - -reactor Braking { - input brake_assistant: void; - pedal = new BrakePedal(); - brake = new Brake(); - - pedal.trigger_brake -> brake.brake_pedal; - brake_assistant -> brake.brake_assistant; -} - -reactor Vision { - output trigger_brake: void; - camera = new Camera(); - assistant = new BrakingAssistant(); - - camera.frame -> assistant.frame; - assistant.trigger_brake -> trigger_brake; -} - -main reactor { - braking = new Braking(); - vision = new Vision(); - - vision.trigger_brake ~> braking.brake_assistant; -} diff --git a/example/Cpp/src/CarBrake/README.md b/example/Cpp/src/CarBrake/README.md deleted file mode 100644 index d31b19e604..0000000000 --- a/example/Cpp/src/CarBrake/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Car Brake Example - -This example illustrates a deadline violation in a car brake that can be triggered either by the car's automatic braking assistant or the driver. -The hypothetical braking assistant would receive a frame from the car's camera and process it to identify potentially dangerous situations. -This processing takes about 10ms in our hypothetical example. -Upon identifying a condition requiring intervention, the braking mechanism triggers. - -At the same time, the driver may brake at any given time. - -## Actual result - -Currently, the braking mechanism can miss its deadline when hitting the brake, indicating a delayed braking. - -## Variant that fixes this - -The CarBrake2.lf variant, if made federated, decouples the vision system from the handling of brake pedal actions -in a way that makes it impossible for the vision system to have any effect on the ability of the other component -to make deadlines. The price for this decoupling is added nondeterminacy because the physical connection -reassigns time stamps based on the current physical clock. diff --git a/example/Cpp/src/CarBrake/threads.cmake b/example/Cpp/src/CarBrake/threads.cmake deleted file mode 100644 index dec272690b..0000000000 --- a/example/Cpp/src/CarBrake/threads.cmake +++ /dev/null @@ -1,2 +0,0 @@ -find_package (Threads) -target_link_libraries(${LF_MAIN_TARGET} ${CMAKE_THREAD_LIBS_INIT}) diff --git a/example/Cpp/src/Patterns/FullyConnected_00_Broadcast.lf b/example/Cpp/src/Patterns/FullyConnected_00_Broadcast.lf deleted file mode 100644 index d273f82cf5..0000000000 --- a/example/Cpp/src/Patterns/FullyConnected_00_Broadcast.lf +++ /dev/null @@ -1,38 +0,0 @@ -/** - * This illustrates bank of reactors where each reactor produces an - * output that is broadcast to all reactors in the bank, including - * itself. - * - * @author Christian Menard - * @author Edward A. Lee - */ - -target Cpp { -} - -reactor Node(bank_index: size_t(0), num_nodes: size_t(4)) { - input[num_nodes] in: size_t - output out: size_t - - reaction (startup) -> out{= - std::cout << "Hello from node " << bank_index << "!\n"; - // broadcast my ID to everyone - out.set(bank_index); - =} - - reaction (in) {= - std::cout << "Node " << bank_index << " received messages from "; - for (auto& port : in) { - if (port.is_present()) { - std::cout << *port.get() << ", "; - } - } - std::cout << '\n'; - =} -} - -main reactor(num_nodes: size_t(4)) { - nodes = new[num_nodes] Node(num_nodes=num_nodes); - (nodes.out)+ -> nodes.in; -} - diff --git a/example/Cpp/src/Patterns/FullyConnected_01_Addressable.lf b/example/Cpp/src/Patterns/FullyConnected_01_Addressable.lf deleted file mode 100644 index 70b9537b95..0000000000 --- a/example/Cpp/src/Patterns/FullyConnected_01_Addressable.lf +++ /dev/null @@ -1,40 +0,0 @@ -/** - * This illustrates bank of reactors where each reactor produces an - * output that is sent to a reactor in the bank of its choice. In this - * particular example, each reactor chooses to send its output to the - * reactor with the next higher bank_index, wrapping around when it gets - * to the end of the bank. - * - * @author Christian Menard - * @author Edward A. Lee - */ - -target Cpp { -} - -reactor Node(bank_index: size_t(0), num_nodes: size_t(4)) { - input[num_nodes] in: size_t - output[num_nodes] out: size_t - - reaction (startup) -> out{= - std::cout << "Hello from node " << bank_index << "!\n"; - // send my ID only to my right neighbour - out[(bank_index + 1) % num_nodes].set(bank_index); - =} - - reaction (in) {= - std::cout << "Node " << bank_index << " received messages from "; - for (auto& port : in) { - if (port.is_present()) { - std::cout << *port.get() << ", "; - } - } - std::cout << '\n'; - =} -} - -main reactor(num_nodes: size_t(4)) { - nodes = new[num_nodes] Node(num_nodes=num_nodes); - nodes.out -> interleaved(nodes.in); -} - diff --git a/example/Cpp/src/Patterns/MatrixConnectedRowsAndColumns.lf b/example/Cpp/src/Patterns/MatrixConnectedRowsAndColumns.lf deleted file mode 100644 index 42bee9c95c..0000000000 --- a/example/Cpp/src/Patterns/MatrixConnectedRowsAndColumns.lf +++ /dev/null @@ -1,75 +0,0 @@ -// This pattern creates a matrix of nodes, where each of the nodes can send -// messages to all other nodes in the same row or in the same column. Since -// banks in LF are one dimensional, we use hierachy to implement the second -// dimension. Nodes are organized in Rows which are grouped to form the matrix. - -target Cpp { -}; - -public preamble {= - struct Pos { - size_t col; - size_t row; - }; - - std::ostream& operator<<(std::ostream& os, const Pos& pos); -=} - -private preamble {= - std::ostream& operator<<(std::ostream& os, const Pos& pos) { - os << '(' << pos.col << ',' << pos.row << ')'; - return os; - } -=} - -reactor Node(bank_index: size_t(0), row_index: size_t(0), num_rows: size_t(4), num_cols:size_t(4)) { - input[num_cols] fromRow: Pos - input[num_rows] fromCol: Pos - - output toRowAndCol: Pos - - state pos: Pos{bank_index, row_index} - - reaction (startup) -> toRowAndCol {= - std::cout << "Hello from " << pos << '\n'; - // send my position to everyone else in my row and column - toRowAndCol.set(pos); - =} - - reaction (fromRow) {= - std::cout << pos << " received row messages from: "; - for (auto& port : fromRow) { - if (port.is_present()) { - std::cout << *port.get() << ", "; - } - } - std::cout << '\n'; - =} - - reaction (fromCol) {= - std::cout << pos << " received col messages from: "; - for (auto& port : fromCol) { - if (port.is_present()) { - std::cout << *port.get() << ", "; - } - } - std::cout << '\n'; - =} -} - -reactor Row(bank_index: size_t(0), num_rows:size_t(4), num_cols:size_t(4)) { - nodes = new[num_cols] Node(row_index=bank_index, num_rows=num_rows, num_cols=num_cols) - - input[{=num_rows * num_cols=}] fromCol: Pos - output[num_cols] toCol: Pos - - (nodes.toRowAndCol)+ -> nodes.fromRow - nodes.toRowAndCol -> toCol - fromCol -> interleaved(nodes.fromCol) -} - -main reactor (num_rows:size_t(4), num_cols:size_t(4)) { - rows = new[num_rows] Row(num_rows=num_rows, num_cols=num_cols) - (rows.toCol)+ -> rows.fromCol; -} - diff --git a/example/Cpp/src/ROS/MinimalPublisher.lf b/example/Cpp/src/ROS/MinimalPublisher.lf deleted file mode 100644 index c2cbdf2781..0000000000 --- a/example/Cpp/src/ROS/MinimalPublisher.lf +++ /dev/null @@ -1,31 +0,0 @@ -target Cpp { - ros2: true -} - -public preamble {= - #include "rclcpp/rclcpp.hpp" - #include "std_msgs/msg/string.hpp" -=} - -main reactor { - private preamble {= - // FIXME: forward declaration to make the node visible - extern rclcpp::Node* lf_node; - =} - - state publisher: {= rclcpp::Publisher::SharedPtr =} - state count: unsigned(0) - - timer t(0, 500 ms) - - reaction(startup) {= - publisher = lf_node->create_publisher("topic", 10); - =} - - reaction(t) {= - auto message = std_msgs::msg::String(); - message.data = "Hello, world! " + std::to_string(count++); - reactor::log::Info() << "Publishing: " << message.data; - publisher->publish(message); - =} -} diff --git a/example/Cpp/src/ROS/MinimalSubscriber.lf b/example/Cpp/src/ROS/MinimalSubscriber.lf deleted file mode 100644 index 0c7cf3cd8e..0000000000 --- a/example/Cpp/src/ROS/MinimalSubscriber.lf +++ /dev/null @@ -1,32 +0,0 @@ -target Cpp { - ros2: true, - keepalive: true, -} - -public preamble {= - #include "rclcpp/rclcpp.hpp" - #include "std_msgs/msg/string.hpp" -=} - -main reactor { - private preamble {= - // FIXME: forward declaration to make the node visible - extern rclcpp::Node* lf_node; - =} - - state subscription: {= rclcpp::Subscription::SharedPtr =} - state count: unsigned(0) - - physical action message: std::string; - - reaction(startup) -> message {= - subscription = lf_node->create_subscription( - "topic", 10, [&message](const std_msgs::msg::String::SharedPtr msg) { message.schedule(msg->data); } ); - // FIXME: Why can't we use a reference type in the lambda argument? - // const std_msgs::msg::String::SharedPtr& msg - =} - - reaction(message) {= - reactor::log::Info() << "I heard: " << *message.get(); - =} -} diff --git a/example/Cpp/src/ROS/README.md b/example/Cpp/src/ROS/README.md deleted file mode 100644 index 1ed55731d5..0000000000 --- a/example/Cpp/src/ROS/README.md +++ /dev/null @@ -1,5 +0,0 @@ -This is an LF reimplementation of the ROS 2 minimal publisher and sunscriber -[example](https://docs.ros.org/en/galactic/Tutorials/Writing-A-Simple-Cpp-Publisher-And-Subscriber.html). - -It consists of two LF files, MinimalPublisher and MinimalSubscriber, each -implementing the corresponding nodes from the original example. diff --git a/example/Cpp/src/ReflexGame/ReflexGame.cmake b/example/Cpp/src/ReflexGame/ReflexGame.cmake deleted file mode 100644 index dec272690b..0000000000 --- a/example/Cpp/src/ReflexGame/ReflexGame.cmake +++ /dev/null @@ -1,2 +0,0 @@ -find_package (Threads) -target_link_libraries(${LF_MAIN_TARGET} ${CMAKE_THREAD_LIBS_INIT}) diff --git a/example/Cpp/src/ReflexGame/ReflexGame.lf b/example/Cpp/src/ReflexGame/ReflexGame.lf deleted file mode 100644 index 8eb3a1ea76..0000000000 --- a/example/Cpp/src/ReflexGame/ReflexGame.lf +++ /dev/null @@ -1,137 +0,0 @@ -/** - * This example illustrates the use of logical and physical actions, - * asynchronous external inputs, the use of startup and shutdown - * reactions, and the use of actions with values. - * - * @author Felix Wittwer - * @author Edward A. Lee - * @author Marten Lohstroh - */ -target Cpp { - keepalive: true, - cmake-include: "ReflexGame.cmake" -}; - -/** - * Produce a counting sequence at random times with a minimum - * and maximum time between outputs specified as parameters. - * - * @param min_time The minimum time between outputs. - * @param max_time The maximum time between outputs. - */ -reactor RandomSource(min_time:time(2 sec), max_time:time(8 sec)) { - private preamble {= - // Generate a random additional delay over the minimum. - // Assume millisecond precision is enough. - reactor::Duration additional_time(reactor::Duration min_time, reactor::Duration max_time) { - int interval_in_msec = (max_time - min_time) / std::chrono::milliseconds(1); - return (std::rand() % interval_in_msec) * std::chrono::milliseconds(1); - } - =} - input another: void; - output out: void; - logical action prompt(min_time); - state count: int(0); - - reaction(startup) -> prompt {= - std::cout << "***********************************************" << std::endl; - std::cout << "Watch for the prompt, then hit Return or Enter." << std::endl; - std::cout << "Type Control-D (EOF) to quit." << std::endl << std::endl; - - // TODO: Manual inclusion of header necessary? - // Set a seed for random number generation based on the current time. - std::srand(std::time(nullptr)); - - // Schedule the first event. - prompt.schedule(additional_time(0ms, max_time - min_time)); - =} - reaction(prompt) -> out {= - count++; - std::cout << count << ". Hit Return or Enter!" << std::endl << std::flush; - out.set(); - =} - reaction(another) -> prompt {= - // Schedule the next event. - prompt.schedule(additional_time(0ms, max_time - min_time)); - =} -} - -/** - * Upon receiving a prompt, record the time of the prompt, - * then listen for user input. When the user hits return, - * then schedule a physical action that records the time - * of this event and then report the response time. - */ -reactor GetUserInput { - public preamble {= - #include - =} - - physical action user_response: char; - state prompt_time: {= reactor::TimePoint =} ({= reactor::TimePoint::min() =}); - state total_time: time(0); - state count: int(0); - state thread: {= std::thread =}; - - input prompt: void; - output another: void; - - reaction(startup) -> user_response {= - // Start the thread that listens for Enter or Return. - thread = std::thread([&] () { - int c; - while(1) { - while((c = getchar()) != '\n') { - if (c == EOF) break; - } - user_response.schedule(c, 0ms); - if (c == EOF) break; - } - }); - =} - - reaction(prompt) {= - prompt_time = get_physical_time(); - =} - - reaction(user_response) -> another {= - auto c = user_response.get(); - if (*c == EOF) { - environment()->sync_shutdown(); - return; - } - // If the prompt_time is 0, then the user is cheating and - // hitting return before being prompted. - if (prompt_time == reactor::TimePoint::min()) { - std::cout << "YOU CHEATED!" << std::endl; - environment()->sync_shutdown(); - } else { - reactor::TimePoint logical = get_logical_time(); - std::chrono::duration elapsed = (logical - prompt_time); - auto time_in_ms = std::chrono::duration_cast(elapsed); - std::cout << "Response time in milliseconds: " << time_in_ms << std::endl; - count++; - total_time += time_in_ms; - // Reset the prompt_time to indicate that there is no new prompt. - prompt_time = reactor::TimePoint::min(); - // Trigger another prompt. - another.set(); - } - =} - - reaction(shutdown) {= - thread.join(); - if (count > 0) { - std::cout << std::endl << "**** Average response time: " << std::chrono::duration_cast(total_time/count) << std::endl; - } else { - std::cout << std::endl << "**** No attempts." << std::endl; - } - =} -} -main reactor ReflexGame { - p = new RandomSource(); - g = new GetUserInput(); - p.out -> g.prompt; - g.another -> p.another; -} - diff --git a/example/Python/src/DigitalTwin/DoubleUnlock/DoubleUnlockDemo.lf b/example/Python/src/DigitalTwin/DoubleUnlock/DoubleUnlockDemo.lf deleted file mode 100644 index 28467318c0..0000000000 --- a/example/Python/src/DigitalTwin/DoubleUnlock/DoubleUnlockDemo.lf +++ /dev/null @@ -1,200 +0,0 @@ -/** - * Example of a basic digital twin setup, with two federates - * maintaining a shared state "lock state". - * - * For run instructions, see README.md in the same directory. - * - * @author Hou Seng Wong (housengw@berkeley.edu) - */ - - target Python { - docker: true, - files: ["../utils.py"] -}; - -preamble {= - import curses - import threading - from utils import Logger, Window - import enum - - class LockStates(enum.Enum): - Locked = 0 - DriverUnlocked = 1 - AllUnlocked = 2 - - class LockStateNames(enum.Enum): - Locked = "Locked" - DriverUnlocked = "Driver's door unlocked" - AllUnlocked = "All doors unlocked" -=} - -/** - * A key fob that detects "lock" and "unlock" key presses, - * and sends and receives lock state to and from other key fobs. - */ -reactor DoubleUnlockKeyFob(auto_lock_duration(5)) { - /* logger / window related state variables */ - state logger({=None=}); - state window({=None=}); - state main_message_begins(0); - - /* KeyFob related state variables */ - state lock_state(0); - state listener({=None=}); - state auto_lock_counter; - - /* I/O ports and actions */ - input get_lock_action; - input get_lock_press_from_tester; - output send_lock_action; - physical action press_lock; - physical action press_unlock; - logical action handle_press_lock; - logical action handle_press_unlock; - logical action do_lock; - - /* Autolock timer */ - timer autolock_timer(0, 100 msec); - - preamble {= - def lock_state_str(self, lock_state): - if lock_state == LockStates.Locked: - return LockStateNames.Locked.value - elif lock_state == LockStates.DriverUnlocked: - return LockStateNames.DriverUnlocked.value - elif lock_state == LockStates.AllUnlocked: - return LockStateNames.AllUnlocked.value - else: - return "ERROR: Lock state is invalid" - - def print_lock_state(self): - self.window.change_line(self.main_message_begins, f"Lock State: {self.lock_state_str(self.lock_state)}") - - def print_log(self): - if self.logger.log_size() > 0: - for i, line in enumerate(self.logger.get_log()): - self.window.change_line(self.main_message_begins + 1 + i, line) - - def format_log_message(self, line): - elapsed_ptime, tag, remote, do_lock, auto = line - return (f"At (tag: ({'{:,}'.format(tag.time)} ns, {tag.microstep}), " - f"lag: {'{:,}'.format(elapsed_ptime - tag.time)} ns), " - f"{'[Auto] ' if auto else ''}{'[Remote]' if remote else '[Local]'} lock action: {'Lock' if do_lock else 'Unlock'}") - - # log structure: (elapsed_physical_time:int, tag:int, remote:bool, do_lock:bool, auto:bool) - def append_log(self, auto, remote, do_lock): - elapsed_tag = Tag(get_elapsed_logical_time(), get_microstep()) - log_entry = (get_elapsed_physical_time(), elapsed_tag, remote, do_lock, auto) - self.logger.append_log(self.format_log_message(log_entry)) - - def listen_for_keypress(self, press_lock, press_unlock): - key = "" - while key != ord("q"): - key = self.window.getch() - if key == ord("l"): - press_lock.schedule(0) - elif key == ord("u"): - press_unlock.schedule(0) - request_stop() - - def reset_autolock_counter(self): - self.auto_lock_counter = self.auto_lock_duration - =} - - reaction(startup) -> press_lock, press_unlock {= - # Set up the logger and the curses window - self.window = Window() - self.logger = Logger() - messages = [ - "Press 'l' to send a lock signal, 'u' to send an unlock signal, 'q' to quit", - "", - "Rules:", - "1. A lock signal locks all doors.", - "2. An unlock signal unlocks driver's door if driver's door was locked.", - "3. An unlock signal unlocks all door if driver's door was NOT locked.", - "", - "All doors automatically lock after 5 seconds if no unlock signal is received. ", - "" - ] - for i, msg in enumerate(messages): - self.window.change_line(i, msg) - self.main_message_begins = len(messages) - self.lock_state = LockStates.Locked - self.reset_autolock_counter() - self.print_lock_state() - self.print_log() - self.window.refresh() - - # Spawn thread to listen for key presses - t = threading.Thread(target=self.listen_for_keypress, args=(press_lock, press_unlock)) - self.listener = t - t.start() - =} - - reaction(press_lock) -> handle_press_lock {= - handle_press_lock.schedule(0) - =} - - reaction(press_unlock) -> handle_press_unlock {= - handle_press_unlock.schedule(0) - =} - - reaction(handle_press_lock) -> do_lock, send_lock_action {= - self.append_log(auto=False, remote=False, do_lock=True) - do_lock.schedule(0, True) - send_lock_action.set(True) - =} - - reaction(handle_press_unlock) -> do_lock, send_lock_action {= - self.append_log(auto=False, remote=False, do_lock=False) - do_lock.schedule(0, False) - send_lock_action.set(False) - =} - - reaction(get_lock_press_from_tester) -> handle_press_lock, handle_press_unlock {= - press_lock_val = get_lock_press_from_tester.value - if press_lock_val: - handle_press_lock.schedule(0) - else: - handle_press_unlock.schedule(0) - =} - - reaction(get_lock_action) -> do_lock {= - self.append_log(auto=False, remote=True, do_lock=get_lock_action.value) - do_lock.schedule(0, get_lock_action.value) - =} - - reaction(do_lock) {= - if do_lock.value: - self.lock_state = LockStates.Locked - elif self.lock_state == LockStates.Locked: - self.lock_state = LockStates.DriverUnlocked - self.reset_autolock_counter() - elif self.lock_state == LockStates.DriverUnlocked: - self.lock_state = LockStates.AllUnlocked - self.print_lock_state() - self.print_log() - self.window.refresh() - =} - - reaction(autolock_timer) -> do_lock {= - if self.auto_lock_counter > 0: - self.auto_lock_counter -= 0.1 - elif self.lock_state != LockStates.Locked: - self.append_log(auto=True, remote=False, do_lock=True) - do_lock.schedule(0, True) - =} - - reaction(shutdown) {= - self.listener.join() - curses.endwin() - =} -} - -federated reactor { - fob = new DoubleUnlockKeyFob(); - twin = new DoubleUnlockKeyFob(); - fob.send_lock_action -> twin.get_lock_action; - twin.send_lock_action -> fob.get_lock_action; -} diff --git a/example/Python/src/DigitalTwin/DoubleUnlock/README.md b/example/Python/src/DigitalTwin/DoubleUnlock/README.md deleted file mode 100644 index 8cfde843b0..0000000000 --- a/example/Python/src/DigitalTwin/DoubleUnlock/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Double Unlock Key Fob (Digital Twin) Example - -This example is similar to the Key Fob Demo, but with 3 states: Locked, Driver's Door Unlocked, and All Doors Unlocked. -A simulator program `Simulator.lf` is also included to demonstrate generating simulated signals at arbitrary logical time. - -To run the program, do `lfc Simulator.lf` and use the bash scripts to launch each federate in a separate terminal window. diff --git a/example/Python/src/DigitalTwin/DoubleUnlock/Simulator.lf b/example/Python/src/DigitalTwin/DoubleUnlock/Simulator.lf deleted file mode 100644 index 38749705c8..0000000000 --- a/example/Python/src/DigitalTwin/DoubleUnlock/Simulator.lf +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Example of a reactor that sends simulated key presses at arbitrary - * logical time to the key fobs. - * - * For run instructions, see README.md in the same directory. - * - * @author Hou Seng Wong (housengw@berkeley.edu) - */ - -target Python { - docker: true, - files: ["../utils.py"] -}; - -import DoubleUnlockKeyFob from "DoubleUnlockDemo.lf"; - - -reactor DoubleUnlockKeyFobTester(initial_delay(5)) { - state logger({=None=}); - state window({=None=}); - - logical action do_test; - logical action simulate_press_fob; - logical action simulate_press_twin; - output send_lock_press_to_fob; - output send_lock_press_to_twin; - - reaction(startup) -> do_test {= - print(f"Test starts in {self.initial_delay} seconds...") - do_test.schedule(SEC(self.initial_delay)) - =} - - reaction(do_test) -> simulate_press_fob, simulate_press_twin {= - simulate_press_fob.schedule(0, False) - simulate_press_twin.schedule(0, False) - - # Feel free to add other simulated key presses... - # simulate_press_fob.schedule(0, True) - # simulate_press_twin.schedule(0, True) - =} - - reaction(simulate_press_fob) -> send_lock_press_to_fob {= - tag = get_current_tag() - print(f"Sent lock press {simulate_press_fob.value} to fob at ({tag.time}, {tag.microstep})") - send_lock_press_to_fob.set(simulate_press_fob.value) - =} - - reaction(simulate_press_twin) -> send_lock_press_to_twin {= - tag = get_current_tag() - print(f"Sent lock press {simulate_press_twin.value} to twin at ({tag.time}, {tag.microstep})") - send_lock_press_to_twin.set(simulate_press_twin.value) - =} -} - -federated reactor { - fob = new DoubleUnlockKeyFob(); - twin = new DoubleUnlockKeyFob(); - tester = new DoubleUnlockKeyFobTester(); - tester.send_lock_press_to_fob -> fob.get_lock_press_from_tester; - tester.send_lock_press_to_twin -> twin.get_lock_press_from_tester; - fob.send_lock_action -> twin.get_lock_action; - twin.send_lock_action -> fob.get_lock_action; -} \ No newline at end of file diff --git a/example/Python/src/DigitalTwin/DoubleUnlock/run_fob.sh b/example/Python/src/DigitalTwin/DoubleUnlock/run_fob.sh deleted file mode 100755 index 3c9dd7d2da..0000000000 --- a/example/Python/src/DigitalTwin/DoubleUnlock/run_fob.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -cd ../../../src-gen/DigitalTwin/DoubleUnlock/Simulator/fob -python3 Simulator_fob.py -i 1 diff --git a/example/Python/src/DigitalTwin/DoubleUnlock/run_rti.sh b/example/Python/src/DigitalTwin/DoubleUnlock/run_rti.sh deleted file mode 100755 index b865088205..0000000000 --- a/example/Python/src/DigitalTwin/DoubleUnlock/run_rti.sh +++ /dev/null @@ -1 +0,0 @@ -RTI -i 1 -n 3 \ No newline at end of file diff --git a/example/Python/src/DigitalTwin/DoubleUnlock/run_simulator.sh b/example/Python/src/DigitalTwin/DoubleUnlock/run_simulator.sh deleted file mode 100755 index 666d22241a..0000000000 --- a/example/Python/src/DigitalTwin/DoubleUnlock/run_simulator.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -cd ../../../src-gen/DigitalTwin/DoubleUnlock/Simulator/simulator -python3 Simulator_tester.py -i 1 diff --git a/example/Python/src/DigitalTwin/DoubleUnlock/run_twin.sh b/example/Python/src/DigitalTwin/DoubleUnlock/run_twin.sh deleted file mode 100755 index b37cc57d20..0000000000 --- a/example/Python/src/DigitalTwin/DoubleUnlock/run_twin.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -cd ../../../src-gen/DigitalTwin/DoubleUnlock/Simulator/twin -python3 Simulator_twin.py -i 1 diff --git a/example/Python/src/DigitalTwin/KeyFob/KeyFobDemo.lf b/example/Python/src/DigitalTwin/KeyFob/KeyFobDemo.lf deleted file mode 100644 index 6272976afe..0000000000 --- a/example/Python/src/DigitalTwin/KeyFob/KeyFobDemo.lf +++ /dev/null @@ -1,127 +0,0 @@ -/** - * Example of a basic digital twin setup, with two federates - * maintaining a shared state "locked". - * - * For run instructions, see README.md in the same directory. - * - * @author Hou Seng Wong (housengw@berkeley.edu) - */ - -target Python { - docker: true, - files: ["../utils.py"] -}; - -preamble {= - import curses - import threading - from utils import Logger, Window -=} - -/** - * A key fob that detects "lock" and "unlock" key presses, - * and sends and receives lock state to and from other key fobs. - */ -reactor KeyFob { - /* logger / window related state variables */ - state logger({=None=}); - state window({=None=}); - - /* KeyFob related state variables */ - state locked({=False=}); - state listener({=None=}); - - /* I/O ports and actions */ - input get_lock_state; - output send_lock_state; - physical action press_lock; - physical action press_unlock; - - preamble {= - def lock_state_str(self, locked): - return "Locked" if locked else "Unlocked" - - def print_lock_state(self): - self.window.change_line(1, f"Lock Status: {self.lock_state_str(self.locked)}") - - def print_log(self): - if self.logger.log_size() > 0: - for i, line in enumerate(self.logger.get_log()): - self.window.change_line(2 + i, line) - - def format_log_message(self, line): - elapsed_ptime, tag, remote, locked = line - return (f"At (tag: ({'{:,}'.format(tag.time)} ns, {tag.microstep}), " - f"lag: {'{:,}'.format(elapsed_ptime - tag.time)} ns), " - f"{'[Remote]' if remote else '[Local]'} Updated lock state to: {self.lock_state_str(locked)}") - - # log structure: (elapsed_physical_time:int, tag:int, remote:bool, locked:bool) - def append_log(self, remote, locked): - elapsed_tag = Tag(get_elapsed_logical_time(), get_microstep()) - log_entry = (get_elapsed_physical_time(), elapsed_tag, remote, locked) - self.logger.append_log(self.format_log_message(log_entry)) - - def listen_for_keypress(self, press_lock, press_unlock): - key = "" - while key != ord("q"): - key = self.window.getch() - if key == ord("l"): - press_lock.schedule(0) - elif key == ord("u"): - press_unlock.schedule(0) - request_stop() - =} - - reaction(startup) -> press_lock, press_unlock {= - # Set up the logger and the curses window - self.window = Window() - self.logger = Logger() - self.window.change_line(0, "Press 'l' to lock, 'u' to unlock, 'q' to quit") - self.print_lock_state() - self.print_log() - self.window.refresh() - - # Spawn thread to listen for key presses - t = threading.Thread(target=self.listen_for_keypress, args=(press_lock, press_unlock)) - self.listener = t - t.start() - =} - - reaction(press_lock) -> send_lock_state {= - self.append_log(remote=False, locked=True) - self.locked = True - self.print_lock_state() - self.print_log() - self.window.refresh() - send_lock_state.set(True) - =} - - reaction(press_unlock) -> send_lock_state {= - self.append_log(remote=False, locked=False) - self.locked = False - self.print_lock_state() - self.print_log() - self.window.refresh() - send_lock_state.set(False) - =} - - reaction(get_lock_state) {= - self.append_log(remote=True, locked=get_lock_state.value) - self.locked = get_lock_state.value - self.print_lock_state() - self.print_log() - self.window.refresh() - =} - - reaction(shutdown) {= - self.listener.join() - curses.endwin() - =} -} - -federated reactor { - fob = new KeyFob(); - twin = new KeyFob(); - fob.send_lock_state -> twin.get_lock_state; - twin.send_lock_state -> fob.get_lock_state; -} \ No newline at end of file diff --git a/example/Python/src/DigitalTwin/KeyFob/README.md b/example/Python/src/DigitalTwin/KeyFob/README.md deleted file mode 100644 index e2d8a180a4..0000000000 --- a/example/Python/src/DigitalTwin/KeyFob/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# Key Fob (Digital Twin) Example - -This example shows two federates, one hosted locally and the other hosted on Google Cloud, interacting via an RTI that is also hosted on Google Cloud. - -Check out this (video)[https://www.youtube.com/watch?v=s7dYKLoHXVE] for a recorded demo. - -## Before we start - -Make sure you have a Google Cloud Platform (GCP) account and a project set up. - -To set up an account, see here: -https://console.cloud.google.com - -To set up a GCP project, see here: -https://cloud.google.com/resource-manager/docs/creating-managing-projects - -We will be working with the Google Cloud SDK. For installation instructions, see here: -https://cloud.google.com/sdk/docs/quickstart#installing_the_latest_version - - -Mac users can download it using brew. -```bash -user$ brew install --cask google-cloud-sdk -``` - -After downloading the Google Cloud SDK, do the following and follow the [guide]( -https://cloud.google.com/sdk/docs/quickstart) to finish initializing the SDK: - -```bash -user$ gcloud init -``` - - -Then, authenticate google cloud for docker: -```bash -user$ gcloud auth login -user$ gcloud auth configure-docker -``` - -Additionally, export the project ID of the project you want to use for this example: -```bash -user$ gcloud projects list -user$ export PROJECT_ID=YOUR_PROJECT_ID -``` - -For clarity purposes, I will use `user$ ` to denote a local terminal, `user@rti-vm ~ $ ` to denote the terminal RTI VM, and `user@twin-vm ~ $ ` to denote the terminal inside the digital twin VM. - - -## Instructions - -### Setting up the RTI and the digital twin on the cloud - -Run the `setup.sh` script to set up the RTI and the digital twin on the cloud: -```bash -user$ ./scripts/cloud/setup.sh -``` - -When the script finishes, ssh into the digital twin: -```bash -user$ gcloud compute ssh twin-vm -``` - -Inside the VM, find the container ID of the digital twin: -```bash -user@twin-vm ~ $ docker container list -``` - -Attach the digital twin container using the container ID from the previous step: -```bash -user@twin-vm ~ $ docker container attach CONTAINER_ID -``` - -### Running the local key fob - -Open another terminal in the directory where the `docker-compose.yml` is located. Run `run_local_copy.sh` to run the local key fob: -```bash -user$ ./scripts/cloud/run_local_copy.sh -``` - -Now you should see the key fobs in each terminal syncing with each other through the RTI on the cloud. - -### Clean up - -Run the clean up script: -```bash -user$ ./scripts/cloud/cleanup.sh -``` - -### Conclusion - -Congrats! You just executed a federated LF program using an RTI hosted on the cloud. diff --git a/example/Python/src/DigitalTwin/KeyFob/dev/README.md b/example/Python/src/DigitalTwin/KeyFob/dev/README.md deleted file mode 100644 index 8eaf1e095e..0000000000 --- a/example/Python/src/DigitalTwin/KeyFob/dev/README.md +++ /dev/null @@ -1,111 +0,0 @@ -# Digital Twin Example: Developer Docs - -This document contains detailed descriptions of each command used in the digital twin demo. - -### Hosting the RTI on the cloud - -Set up firewall rules to allow ingress and egress traffic to VMs: -```bash -user$ gcloud compute firewall-rules create rti-firewall-egress --direction=egress --action=allow --rules=all -user$ gcloud compute firewall-rules create rti-firewall-ingress --direction=ingress --action=allow --rules=all -``` - -Create a VM for the RTI: -```bash -user$ gcloud compute instances create-with-container rti-vm \ - --container-image=lflang/rti:rti \ - --container-command=RTI \ - --container-arg="-i" \ - --container-arg=1 \ - --container-arg="-n" \ - --container-arg=2 -``` - -A list of statuses for the newly created virtual machine instance should pop up, which looks like this: -```bash -Created [https://www.googleapis.com/compute/v1/projects/linguafranca-333319/zones/us-central1-a/instances/rti-vm]. -NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS -rti-vm us-central1-a n1-standard-1 10.128.0.7 34.133.143.163 RUNNING -``` - -Export the `EXTERNAL_IP` of the RTI: -```bash -RTI_IP=`gcloud compute instances list | grep 'rti-vm' | awk '{print $5}'` -``` - -### Running the digital twin - -Build `KeyFobDemo.lf` locally: -```bash -user$ lfc KeyFobDemo.lf -``` - -Go to the directory where the generated code is located, which is usually located at `src-gen/DigitalTwin/KeyFob/KeyFobDemo`. There should be a docker-compose.yml in that directory. Build the docker images of the two key fobs: -```bash -user$ docker compose build fob twin --no-cache -``` - -Tag and push the digital twin's docker image to the cloud: -```bash -user$ docker tag keyfobdemo_twin gcr.io/$PROJECT_ID/twin -user$ docker push gcr.io/$PROJECT_ID/twin -``` - -Create a VM for the digital twin, passing the address of the RTI: -```bash -gcloud compute instances create-with-container twin-vm \ - --container-image=gcr.io/$PROJECT_ID/twin \ - --container-arg="-i" \ - --container-arg=1 \ - --container-arg="--rti" \ - --container-arg=$RTI_IP \ - --container-stdin \ - --container-tty -``` - -ssh into the digital twin: -```bash -user$ gcloud compute ssh --project=$PROJECT_ID twin-vm -``` - -Find the container ID of the digital twin: -```bash -user@twin-vm ~ $ docker container list -``` - -Attach the digital twin container using the container ID from the previous step: -```bash -user@twin-vm ~ $ docker container attach CONTAINER_ID -``` - -### Running the local key fob - -Open another terminal in the directory where the `docker-compose.yml` is located. Pass in the address of the RTI. Run: -```bash -user$ docker compose run --rm fob -i 1 --rti $RTI_IP -``` - -Now you should see the key fobs in each terminal syncing with each other through the RTI on the cloud. - -### Clean up - -Remove the RTI VM: -```bash -user$ gcloud compute instances delete rti-vm --quiet -``` - -Remove the digital twin VM: -```bash -user$ gcloud compute instances delete twin-vm --quiet -``` - -Remove the digital twin image from google cloud: -```bash -user$ gcloud container images delete gcr.io/$PROJECT_ID/twin --quiet -``` - -Delete firewall rules: -```bash -user$ gcloud compute firewall-rules delete rti-firewall-egress --quiet -user$ gcloud compute firewall-rules delete rti-firewall-ingress --quiet -``` \ No newline at end of file diff --git a/example/Python/src/DigitalTwin/KeyFob/scripts/cloud/cleanup.sh b/example/Python/src/DigitalTwin/KeyFob/scripts/cloud/cleanup.sh deleted file mode 100755 index 10df37adff..0000000000 --- a/example/Python/src/DigitalTwin/KeyFob/scripts/cloud/cleanup.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -if ! command -v gcloud &> /dev/null -then - echo "ERROR: gcloud could not be found" - exit -fi - -if [ -z ${PROJECT_ID+x} ]; -then - echo "ERROR: environment variable PROJECT_ID is not set" - exit -fi - -gcloud compute instances delete rti-vm --quiet -gcloud compute firewall-rules delete rti-firewall-egress --quiet -gcloud compute firewall-rules delete rti-firewall-ingress --quiet -gcloud container images delete gcr.io/$PROJECT_ID/twin --quiet -gcloud compute instances delete twin-vm --quiet -unset RTI_IP diff --git a/example/Python/src/DigitalTwin/KeyFob/scripts/cloud/run_local_copy.sh b/example/Python/src/DigitalTwin/KeyFob/scripts/cloud/run_local_copy.sh deleted file mode 100755 index 48f6b7601d..0000000000 --- a/example/Python/src/DigitalTwin/KeyFob/scripts/cloud/run_local_copy.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash -if ! command -v gcloud &> /dev/null -then - echo "ERROR: gcloud could not be found" - exit -fi - -if ! command -v docker &> /dev/null -then - echo "ERROR: docker could not be found" - exit -fi - -RTI_IP=`gcloud compute instances list | grep 'rti-vm' | awk '{print $5}'` - -if [ -z "$RTI_IP" ] -then - echo "ERROR: IP address of the RTI is empty or not set. Did you spawn the RTI on the cloud?". - exit -fi - -if [[ "$OSTYPE" == "linux-gnu"* ]]; then - docker_compose="docker-compose" -else - docker_compose="docker compose" -fi - -cd ../../../src-gen/DigitalTwin/KeyFob/KeyFobDemo -$docker_compose run --rm fob -i 1 --rti $RTI_IP diff --git a/example/Python/src/DigitalTwin/KeyFob/scripts/cloud/setup.sh b/example/Python/src/DigitalTwin/KeyFob/scripts/cloud/setup.sh deleted file mode 100755 index fe52e195f2..0000000000 --- a/example/Python/src/DigitalTwin/KeyFob/scripts/cloud/setup.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/bin/bash -if ! command -v gcloud &> /dev/null -then - echo "ERROR: gcloud could not be found" - exit -fi - -if ! command -v lfc &> /dev/null -then - echo "ERROR: lfc could not be found" - exit -fi - -if ! command -v docker &> /dev/null -then - echo "ERROR: docker could not be found" - exit -fi - -if [ -z ${PROJECT_ID+x} ]; -then - echo "ERROR: environment variable PROJECT_ID is not set" - exit -fi - -if [[ "$OSTYPE" == "linux-gnu"* ]]; then - docker_compose="docker-compose" -else - docker_compose="docker compose" -fi - -set -e -gcloud config set compute/zone us-central1-c -gcloud compute firewall-rules create rti-firewall-egress --direction=egress --action=allow --rules=all -gcloud compute firewall-rules create rti-firewall-ingress --direction=ingress --action=allow --rules=all - -gcloud compute instances create-with-container rti-vm \ - --container-image=lflang/rti:rti \ - --container-command=RTI \ - --container-arg="-i" \ - --container-arg=1 \ - --container-arg="-n" \ - --container-arg=2 - -RTI_IP=`gcloud compute instances list | grep 'rti-vm' | awk '{print $5}'` - -if [ -z "$RTI_IP" ] -then - echo "ERROR: IP address of the RTI is empty or not set. Did you spawn the RTI on the cloud?". - exit -fi - -lfc KeyFobDemo.lf - -cd ../../../src-gen/DigitalTwin/KeyFob/KeyFobDemo - -$docker_compose build --no-cache fob twin - -docker tag keyfobdemo_twin gcr.io/$PROJECT_ID/twin - -docker push gcr.io/$PROJECT_ID/twin - -gcloud compute instances create-with-container twin-vm \ - --container-image=gcr.io/$PROJECT_ID/twin \ - --container-arg="-i" \ - --container-arg=1 \ - --container-arg="--rti" \ - --container-arg=$RTI_IP \ - --container-stdin \ - --container-tty diff --git a/example/Python/src/DigitalTwin/KeyFob/scripts/local/run_fob.sh b/example/Python/src/DigitalTwin/KeyFob/scripts/local/run_fob.sh deleted file mode 100755 index cd41af8e74..0000000000 --- a/example/Python/src/DigitalTwin/KeyFob/scripts/local/run_fob.sh +++ /dev/null @@ -1,2 +0,0 @@ -cd ../../../src-gen/DigitalTwin/KeyFob/KeyFobDemo -python3 fob/KeyFobDemo_fob.py -i 1 \ No newline at end of file diff --git a/example/Python/src/DigitalTwin/KeyFob/scripts/local/run_rti.sh b/example/Python/src/DigitalTwin/KeyFob/scripts/local/run_rti.sh deleted file mode 100755 index 7321705ec1..0000000000 --- a/example/Python/src/DigitalTwin/KeyFob/scripts/local/run_rti.sh +++ /dev/null @@ -1 +0,0 @@ -RTI -i 1 -n 2 \ No newline at end of file diff --git a/example/Python/src/DigitalTwin/KeyFob/scripts/local/run_twin.sh b/example/Python/src/DigitalTwin/KeyFob/scripts/local/run_twin.sh deleted file mode 100755 index 99ae7bb6c5..0000000000 --- a/example/Python/src/DigitalTwin/KeyFob/scripts/local/run_twin.sh +++ /dev/null @@ -1,2 +0,0 @@ -cd ../../../src-gen/DigitalTwin/KeyFob/KeyFobDemo -python3 twin/KeyFobDemo_twin.py -i 1 \ No newline at end of file diff --git a/example/Python/src/DigitalTwin/utils.py b/example/Python/src/DigitalTwin/utils.py deleted file mode 100644 index 769bd4d9b3..0000000000 --- a/example/Python/src/DigitalTwin/utils.py +++ /dev/null @@ -1,36 +0,0 @@ -import curses - -class Logger: - def __init__(self, max_lines=3): - self.max_lines = max_lines - self.log = [] - - def append_log(self, msg): - self.log.append(msg) - if len(self.log) > self.max_lines: - self.log.pop(0) - - def get_log(self): - return self.log - - def log_size(self): - return len(self.log) - - -class Window: - def __init__(self): - self.window = curses.initscr() - curses.cbreak() - curses.noecho() - self.window.keypad(True) - - def change_line(self, y, new_msg): - self.window.addstr(y, 0, new_msg) - self.window.clrtoeol() - - def refresh(self): - self.window.refresh() - - def getch(self): - return self.window.getch() - diff --git a/example/Python/src/Piano/Piano.lf b/example/Python/src/Piano/Piano.lf deleted file mode 100644 index 640a906318..0000000000 --- a/example/Python/src/Piano/Piano.lf +++ /dev/null @@ -1,228 +0,0 @@ -target Python { - files: [gui.py, keys.png, soundfont.sf2], - keepalive: true -}; - - -/* - * Receives key presses from the pygame piano process - */ -reactor GetUserInput { - preamble {= - import threading - def listen_for_input(self, user_response): - while 1: - try: - c = self.user_input.recv() - except EOFError: - request_stop() - return - # Each time a key press is received, schedule a user_response event - user_response.schedule(0, c) - =} - physical action user_response; - input user_input_pipe_init; - output user_input; - state user_input({=None=}) # multiprocessing.connection.PipeConnection - - reaction(user_input_pipe_init) -> user_response {= - # starts a thread to receive key presses from the pygame process - self.user_input = user_input_pipe_init.value - t = self.threading.Thread(target=self.listen_for_input, args=(user_response, )) - t.start() - =} - - reaction(user_response) -> user_input {= - user_input.set(user_response.value) - =} -} - - -/* - * Sends graphics updates to the pygame piano process - */ -reactor UpdateGraphics { - input note; - input update_graphics_pipe_init; - state update_graphics({=None=}); # multiprocessing.connection.PipeConnection - state pressed_keys({=set()=}) - - reaction(update_graphics_pipe_init) {= - self.update_graphics = update_graphics_pipe_init.value - =} - - reaction(note) {= - key_down, note_t = note.value - if key_down and note_t not in self.pressed_keys: - self.pressed_keys.add(note_t) - self.update_graphics.send(self.pressed_keys) - if not key_down and note_t in self.pressed_keys: - self.pressed_keys.remove(note_t) - self.update_graphics.send(self.pressed_keys) - =} -} - - -/* - * Plays sound using fluidsynth upon receiving signal from TranslateKeyToNote - */ -reactor PlaySound { - state lowest(4); # the octave of the lowest "C" on the piano. - state channel(8); - state Note; - state fluidsynth; - input note; - input play_sound_init; - - reaction(play_sound_init) {= - self.fluidsynth, self.Note = play_sound_init.value - =} - - reaction(note) {= - # upon receiving a note, play or stop the note depending on if its a key down or key up. - key_down, note_t = note.value - if key_down: - self.fluidsynth.play_Note(self.Note(note_t[0], self.lowest + note_t[1]), self.channel, 100) - else: - self.fluidsynth.stop_Note(self.Note(note_t[0], self.lowest + note_t[1]), self.channel) - =} -} - -/* - * Translates key presses to piano keys and triggers the initialization of StartGui - */ -reactor TranslateKeyToNote { - preamble {= - piano_keys = { - "z": ("C", 0), - "s": ("C#", 0), - "x": ("D", 0), - "d": ("D#", 0), - "c": ("E", 0), - "v": ("F", 0), - "g": ("F#", 0), - "b": ("G", 0), - "h": ("G#", 0), - "n": ("A", 0), - "j": ("A#", 0), - "m": ("B", 0), - "w": ("C", 1), - "3": ("C#", 1), - "e": ("D", 1), - "4": ("D#", 1), - "r": ("E", 1), - "t": ("F", 1), - "6": ("F#", 1), - "y": ("G", 1), - "7": ("G#", 1), - "u": ("A", 1), - "8": ("A#", 1), - "i": ("B", 1) - } - =} - - input user_input; - input translate_init; - output note; - output gui_init; - - reaction(translate_init) -> gui_init {= - gui_init.set(self.piano_keys) - =} - - reaction(user_input) -> note {= - key_down, c = user_input.value - if c in self.piano_keys: - note.set((key_down, self.piano_keys[c])) - =} -} - -reactor StartFluidSynth { - preamble {= - import sys - import os - - try: - from mingus.containers.note import Note - except: - print("Import Error: Failed to import 'mingus'. Try 'pip3 install mingus'") - request_stop() - sys.exit(1) - - try: - from mingus.midi import fluidsynth - except: - if sys.platform == "darwin": - print("Import Error: fluidsynth is missing. Try 'brew install fluidsynth'") - elif sys.platform == "linux" or sys.platform == "linux2": - print("Import Error: fluidsynth is missing. Try 'sudo apt-get install -y fluidsynth'") - else: - print("Import Error: fluidsynth is missing. ") - request_stop() - sys.exit(1) - =} - state soundfont({=self.os.path.join(self.os.path.dirname(__file__), "soundfont.sf2")=}) - output translate_init; - output play_sound_init; - - reaction(startup) -> play_sound_init, translate_init {= - if not self.os.path.exists(self.soundfont): - print("Error: Soundfont file does not exist.") - print("Try downloading a soundfont file from here (this is the soundfont used for testing the demo): ") - print("http://www.schristiancollins.com/generaluser.php") - print("Alternatively, pick and download a soundfont from here:") - print("https://github.com/FluidSynth/fluidsynth/wiki/SoundFont") - print("Rename the soundfont to \"soundfont.sf2\" and put it under the same directory as Piano.lf.") - request_stop() - return - - # initialize fluidsynth - driver = None - if self.sys.platform == "linux" or self.sys.platform == "linux2": - driver = "alsa" - if not self.fluidsynth.init(self.soundfont, driver): - print("Error: Failed to initialize fluidsynth") - request_stop() - return - - play_sound_init.set((self.fluidsynth, self.Note)) - translate_init.set(0) - =} -} - -/* - * Starts the GUI and triggers initialization of UpdateGraphics and GetUserInput reactors. - */ -reactor StartGui { - preamble {= - import gui - =} - input gui_init; - output user_input_pipe; - output update_graphics_pipe; - - reaction(gui_init) -> user_input_pipe, update_graphics_pipe {= - piano_keys = gui_init.value - user_input_pout, update_graphics_pin = self.gui.start_gui(piano_keys) - user_input_pipe.set(user_input_pout) - update_graphics_pipe.set(update_graphics_pin) - =} -} - -main reactor { - gui = new StartGui() - fs = new StartFluidSynth() - translate = new TranslateKeyToNote() - update_graphics = new UpdateGraphics() - get_user_input = new GetUserInput() - play_sound = new PlaySound() - - fs.translate_init -> translate.translate_init; - fs.play_sound_init -> play_sound.play_sound_init; - gui.user_input_pipe -> get_user_input.user_input_pipe_init - gui.update_graphics_pipe -> update_graphics.update_graphics_pipe_init - get_user_input.user_input -> translate.user_input - translate.note -> update_graphics.note - translate.note -> play_sound.note - translate.gui_init -> gui.gui_init -} diff --git a/example/Python/src/Piano/README.md b/example/Python/src/Piano/README.md deleted file mode 100644 index b0b494414c..0000000000 --- a/example/Python/src/Piano/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# Piano -This is a pygame-based piano demo for the Python target of Lingua Franca. -The contents of the demo is mostly adapted from: https://github.com/bspaans/python-mingus/tree/master/mingus_examples/pygame-piano - -## Installation -Download a soundfont file from here (this is the soundfont used for testing the demo): -http://www.schristiancollins.com/generaluser.php - -Alternatively, pick and download a soundfont from here: -https://github.com/FluidSynth/fluidsynth/wiki/SoundFont - -Rename the soundfont to "soundfont.sf2" and put it under the same directory as Piano.lf. - -### MacOs: -```bash -$ brew install sdl2 sdl2_gfx sdl2_image sdl2_mixer sdl2_net sdl2_ttf -$ brew install Caskroom/cask/xquartz -$ brew install fluid-synth -$ python3 -m pip install mingus -$ python3 -m pip install pygame -``` -Then, go to ```System Preferences -> Security & Privacy -> Privacy -> Input Monitoring``` and check Terminal so that the Terminal application can read keystrokes. - -### Linux: -```bash - $ sudo apt install libsdl2-2* libsdl2-image-2* - $ sudo apt install fluidsynth - $ pip3 install mingus - $ pip3 install pygame -``` - - -### Windows: \ No newline at end of file diff --git a/example/Python/src/Piano/gui.py b/example/Python/src/Piano/gui.py deleted file mode 100644 index 910f8504b4..0000000000 --- a/example/Python/src/Piano/gui.py +++ /dev/null @@ -1,243 +0,0 @@ -import multiprocessing -from multiprocessing import Process, connection -from threading import Thread -import sys -import os -os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide" - -try: - import pygame -except: - print("Import Error: Failed to import 'pygame'. Try 'pip3 install pygame'") - sys.exit(1) - - -# sound font and the picture of the keyboard -KEYS_PNG = os.path.join(os.path.dirname(__file__), "keys.png") - -# number of octaves to show -OCTAVES = 2 - -# names of white keys -WHITE_KEYS = ["C", "D", "E", "F", "G", "A", "B"] - -# names of black keys -BLACK_KEYS = ["C#", "D#", "F#", "G#", "A#"] - -def start_gui(piano_keys): - ''' - Spawns a process to run the pygame piano. - - Parameters - ---------- - piano_keys: dict[str] -> tuple(str, int) - a mapping of keyboard characters to piano notes. - - Returns - ---------- - multiprocessing.connection.PipeConnection - a pipe object for the LF program to receive key presses from the pygame process - - multiprocessing.connection.PipeConnection - a pipe object for the LF program to send graphics update to the pygame process - ''' - multiprocessing.set_start_method("spawn") - user_input_pout, user_input_pin = connection.Pipe(duplex=False) - update_graphics_pout, update_graphics_pin = connection.Pipe(duplex=False) - p = Process(target=gui, args=(user_input_pin, update_graphics_pout, piano_keys)) - p.start() - return user_input_pout, update_graphics_pin - - -def gui(user_input_pin, update_graphics_pout, piano_keys): - ''' - Starts the pygame piano GUI. - - Parameters - ---------- - user_input_pin : multiprocessing.connection.PipeConnection - a pipe object for the pygame piano to send key press signals to the LF program. - update_graphics_pout: multiprocessing.connection.PipeConnection - a pipe object for the pygame piano to receive acutations from the LF program. - piano_keys: dict[str] -> tuple(str, int) - a mapping of keyboard characters to piano notes. - - Returns - ---------- - None - ''' - gui = PianoGui(user_input_pin, update_graphics_pout, piano_keys) - gui.start() - - -class PianoGui: - def __init__(self, user_input_pin, update_graphics_pout, piano_keys): - ''' - Initialize the screen of the pygame piano. - - Parameters - ---------- - user_input_pin : multiprocessing.connection.PipeConnection - a pipe object for the pygame piano to send key press signals to the LF program. - update_graphics_pout: multiprocessing.connection.PipeConnection - a pipe object for the pygame piano to receive acutations from the LF program. - piano_keys: dict[str] -> tuple(str, int) - a mapping of keyboard characters to piano notes. - - Returns - ---------- - None - ''' - self.user_input_pin = user_input_pin - self.update_graphics_pout = update_graphics_pout - self.note_to_key = {v: k for k, v in piano_keys.items()} - - pygame.init() - pygame.font.init() - self.font = pygame.font.SysFont("monospace", 14) - self.screen = pygame.display.set_mode((640, 480)) - self.image = pygame.image.load(KEYS_PNG).convert() - (self.key_graphic, self.kgrect) = (self.image, self.image.get_rect()) - (self.width, self.height) = (self.kgrect.width, self.kgrect.height) - self.white_key_width = self.width / 7 - - # Reset display to wrap around the keyboard image - pygame.display.set_mode((OCTAVES * self.width, self.height)) - pygame.display.set_caption("piano demo") - - # pressed is a surface that is used to show where a key has been pressed - self.pressed = pygame.Surface((self.white_key_width, self.height)) - self.pressed.fill((0, 230, 0)) - - - def get_note_coordinate(self, note_name, octave): - ''' - Calculates the x-coordinate of the note on the screen of the pygame piano - - Parameters - ---------- - note_name: str - the name of the note (Ex. "C", "D#", etc...). - octave: int - the number of octave(s) above the lowest "C" note on the pygame piano. - - Returns - ---------- - int - the x-coordinate of the Note object on the screen. - ''' - octave_offset = octave * self.width - if note_name in WHITE_KEYS: - coordinate = WHITE_KEYS.index(note_name) * self.white_key_width + octave_offset - else: - i = BLACK_KEYS.index(note_name) - if i == 0: - coordinate = 18 - elif i == 1: - coordinate = 58 - elif i == 2: - coordinate = 115 - elif i == 3: - coordinate = 151 - else: - coordinate = 187 - coordinate += octave_offset - return coordinate - - - def listen_for_graphics_update(self): - ''' - Receives graphics update from the LF program. - Redraw the screen upon receiving graphics update. - - Parameters - ---------- - None - - Returns - ---------- - None - ''' - while 1: - try: - playing_notes = self.update_graphics_pout.recv() - except EOFError: - pygame.quit() - return - self.blit_keyboard() - - # draw the pressed white keys - for note_name, octave in playing_notes: - if note_name in WHITE_KEYS: - self.screen.blit(self.pressed, (self.get_note_coordinate(note_name, octave), 0), None, pygame.BLEND_SUB) - - # draw the pressed black keys - for note_name, octave in playing_notes: - if note_name in BLACK_KEYS: - self.screen.blit(self.pressed, (self.get_note_coordinate(note_name, octave), 1), (0, 0, 19, 68), pygame.BLEND_ADD) - pygame.display.flip() - - - def blit_keyboard(self): - ''' - Draws the piano keyboard and the key presses for each note. - - Parameters - ---------- - None - - Returns - ---------- - None - ''' - - # Displaying the keyboard - for i in range(OCTAVES): - self.screen.blit(self.key_graphic, (i * self.width, 0)) - - # Displaying the text for each white key - for j, white_key in enumerate(WHITE_KEYS): - key_surface = self.font.render(self.note_to_key[(white_key, i)], False, (0, 0, 0)) - self.screen.blit(key_surface, - (self.get_note_coordinate(white_key, i) + self.white_key_width / 2, self.height * 0.8)) - - # Displaying the text for each black key - for j, black_key in enumerate(BLACK_KEYS): - key_surface = self.font.render(self.note_to_key[(black_key, i)], False, (255, 255, 255)) - self.screen.blit(key_surface, - (self.get_note_coordinate(black_key, i) + self.white_key_width / 3, self.height * 0.2)) - - - def start(self): - ''' - starts the pygame piano loop - - Parameters - ---------- - None - - Returns - ---------- - None - ''' - self.blit_keyboard() - pygame.display.flip() - - listener = Thread(target=self.listen_for_graphics_update) - listener.daemon = True - listener.start() - - try: - while 1: - event = pygame.event.wait() - if event.type == pygame.QUIT: - sys.exit(0) - elif event.type == pygame.KEYDOWN: - self.user_input_pin.send((True, # Key Down == True - event.unicode)) - elif event.type == pygame.KEYUP: - self.user_input_pin.send((False, - event.unicode)) - except KeyboardInterrupt: - pygame.quit() - sys.exit(0) diff --git a/example/Python/src/Piano/keys.png b/example/Python/src/Piano/keys.png deleted file mode 100644 index 90b630be953cb90b7c6bbfc47ce21898bb71bd37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26609 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 diff --git a/example/Python/src/ReflexGame/README.md b/example/Python/src/ReflexGame/README.md deleted file mode 100644 index 8acdaf4a40..0000000000 --- a/example/Python/src/ReflexGame/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Reflex Game -This is a pygame-based reflex game demo for the python target. -The logic in this demo is heavily modeled after the reflex game of C/C++ targets. - -## Installation -### MacOS -``` -pip3 install pygame -``` - -### Linux -``` -pip3 install pygame -``` \ No newline at end of file diff --git a/example/Python/src/ReflexGame/ReflexGame.lf b/example/Python/src/ReflexGame/ReflexGame.lf deleted file mode 100644 index 337b9a1ea0..0000000000 --- a/example/Python/src/ReflexGame/ReflexGame.lf +++ /dev/null @@ -1,184 +0,0 @@ -target Python { - keepalive: true, - files: [gui.py] -} - -reactor RandomSource(min_time(2 sec), max_time(8 sec)) { - preamble {= - import random - def additional_time(self, min_time, max_time): - return self.random.randint(min_time, max_time) - =} - input another; - output out; - logical action prompt(min_time); - state count(0); - reaction(startup) {= - self.random.seed() - =} - - reaction(prompt) -> out {= - self.count += 1 - out.set(self.count) - =} - - reaction(another) -> prompt {= - # schedule a prompt event - prompt.schedule(self.additional_time(0, self.max_time - self.min_time)) - =} -} - -/* - * Receives key presses from the pygame process. - */ -reactor GetUserInput { - preamble {= - import threading - def listen_for_input(self, user_response): - while 1: - try: - c = self.user_input.recv() - except EOFError: - request_stop() - return - # Each time a key press is received, schedule a user_response event - user_response.schedule(0, c) - =} - - physical action user_response; - state user_input({=None=}); # multiprocessing.connection.PipeConnection - input user_input_pipe_init; - output user_input; - - reaction(user_input_pipe_init) -> user_response {= - # Stores the Pipe object that will be used to receive key presses from - # the pygame process - self.user_input = user_input_pipe_init.value - - # Starts the thread that receives key presses from the pygame process - t = self.threading.Thread(target=self.listen_for_input, args=(user_response, )) - t.start() - =} - - reaction(user_response) -> user_input {= - user_input.set(user_response.value) - =} -} - - -/* - * Sends graphics updates to the pygame process. - */ -reactor UpdateGraphics { - input prompt; - input update_graphics_pipe_init; - input user_input; - output another; - state update_graphics({=None=}); # multiprocessing.connection.PipeConnection - state first({=True=}) - state count(0); - state total_time_in_ms(0); - state prompt_time(0); - - reaction(update_graphics_pipe_init) {= - # Stores the Pipe object that will be used to send graphics update to - # the pygame process - self.update_graphics = update_graphics_pipe_init.value - - # Displays an introductory prompt to the user. - self.update_graphics.send(((0,0,0), # Color of background - (255, 255, 255), # Color of text - "Press any key to begin", - "To end the game, you can either: ", - "1. Close this window", - "2. Press CTRL+C in the Terminal", - "3. Press any key before the prompt shows up.")) - =} - - reaction(prompt) {= - # Ask the user for input upon receiving a prompt input from RandomSource - self.update_graphics.send(((152,251,152), - (0, 0, 0), - "{}. Press any key!".format(prompt.value))) - self.prompt_time = get_physical_time() - =} - - reaction(user_input) -> another {= - if self.first: - # if the first ever key press is detected, set "another" to trigger a prompt from RandomSource - self.first = False - self.update_graphics.send(((205,92,92), - (0, 0, 0), - "Wait for the prompt...")) - - # ask for the first ever prompt - another.set(42) - elif self.prompt_time == 0: - if self.count > 0: - self.update_graphics.send(((205,92,92), - (0, 0, 0), - "YOU CHEATED!", - "Average response time: {:.2f} ms".format(self.total_time_in_ms / self.count))) - else: - self.update_graphics.send(((205,92,92), - (0, 0, 0), - "YOU CHEATED!", - "Average response time: undefined")) - request_stop() - else: - time_in_ms = (get_logical_time() - self.prompt_time) // MSEC(1) - self.update_graphics.send(((205,92,92), - (0, 0, 0), - "Response time in milliseconds: {}".format(time_in_ms), - "Wait for the prompt...")) - self.count += 1 - self.total_time_in_ms += time_in_ms - self.prompt_time = 0 - - # ask for another prompt - another.set(42) - =} - - reaction(shutdown) {= - if self.count > 0: - print("Average response time: {:.2f} ms".format(self.total_time_in_ms / self.count)) - else: - print("Average response_time: undefined") - =} -} - -/* - * Starts the GUI and pass the user_input_pout and - * update_graphics_pin Pipe objects - * to GetUserInput and UpdateGraphics - */ -reactor StartGui { - preamble {= - import gui - =} - - output user_input_pipe; - output update_graphics_pipe; - - reaction(startup) -> user_input_pipe, update_graphics_pipe {= - # Starts the gui pygame process - user_input_pout, update_graphics_pin = self.gui.start_gui() - - # Sets the outputs to trigger the initialization of GetUserInput and UpdateGrpahics - user_input_pipe.set(user_input_pout) - update_graphics_pipe.set(update_graphics_pin) - =} -} - - -main reactor { - random_source = new RandomSource() - get_user_input = new GetUserInput() - update_graphics = new UpdateGraphics() - random_source.out -> update_graphics.prompt - get_user_input.user_input -> update_graphics.user_input - update_graphics.another -> random_source.another - gui = new StartGui() - gui.user_input_pipe -> get_user_input.user_input_pipe_init; - gui.update_graphics_pipe -> update_graphics.update_graphics_pipe_init; -} diff --git a/example/Python/src/ReflexGame/gui.py b/example/Python/src/ReflexGame/gui.py deleted file mode 100644 index 4e79205a14..0000000000 --- a/example/Python/src/ReflexGame/gui.py +++ /dev/null @@ -1,140 +0,0 @@ -import multiprocessing -from multiprocessing import connection -import threading -import sys -import os -os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide" - -try: - import pygame -except: - print("Import Error: Failed to import 'pygame'. Try 'pip3 install pygame'") - sys.exit(1) - - -def start_gui(): - ''' - Spawns a new process that runs the pygame gui. - - Parameters - ---------- - None - - Returns - ---------- - multiprocessing.connection.PipeConnection - a Pipe object for the pygame process to send user input to the LF program - multiprocessing.connection.PipeConnection - a Pipe object for the LF program to send graphics update to the pygame process - ''' - user_input_pout, user_input_pin = connection.Pipe(duplex=False) - update_graphics_pout, update_graphics_pin = connection.Pipe(duplex=False) - multiprocessing.set_start_method("spawn") - p = multiprocessing.Process(target=gui, args=(user_input_pin, update_graphics_pout)) - p.start() - return user_input_pout, update_graphics_pin - - -def gui(user_input_pin, update_graphics_pout): - ''' - Initializes a Gui class and starts the gui. - - Parameters - ---------- - user_input_pin : multiprocessing.connection.PipeConnection - a Pipe object for the pygame process to send user input to the LF program - update_graphics_pout : multiprocessing.connection.PipeConnection - a Pipe object for the LF program to send graphics update to the pygame process - - Returns - ---------- - None - ''' - pygame.init() - pygame.font.init() - g = Gui(user_input_pin=user_input_pin, update_graphics_pout=update_graphics_pout) - g.start() - - -class Gui: - def __init__(self, user_input_pin, update_graphics_pout): - ''' - Initializes the pygame window and spawns a thread to listen for graphics update from the LF program. - - Parameters - ---------- - user_input_pin : multiprocessing.connection.PipeConnection - a Pipe object for the pygame process to send user input to the LF program - update_graphics_pout : multiprocessing.connection.PipeConnection - a Pipe object for the LF program to send graphics update to the pygame process - - Returns - ---------- - None - ''' - self.user_input_pin = user_input_pin - self.font = pygame.font.SysFont("arial", 18) - self.size = self.width, self.height = 500, 500 - self.terminate = False - self.black = 0, 0, 0 - self.screen = pygame.display.set_mode(self.size) - self.listener = threading.Thread(target=self.listen_for_update_graphic, args=(update_graphics_pout, )) - - def start(self): - ''' - Draw the pygame window and listen for user input. - Sends user input to the LF program using self.user_input upon detection. - - Parameters - ---------- - None - - Returns - ---------- - None - ''' - self.screen.fill(self.black) - pygame.display.flip() - self.listener.daemon = True - self.listener.start() - try: - while 1: - event = pygame.event.wait() - if event.type == pygame.QUIT: - sys.exit(0) - elif event.type == pygame.KEYDOWN: - self.user_input_pin.send(event.unicode) - except KeyboardInterrupt: - pygame.quit() - sys.exit(0) - - def listen_for_update_graphic(self, update_graphics_pout): - ''' - Listens for graphics update from the LF program. - Redraw the pygame window upon receiving graphics update. - - Parameters - ---------- - update_graphics_pout : multiprocessing.connection.PipeConnection - a Pipe object for the LF program to send graphics update to the pygame process - - Returns - ---------- - None - ''' - while 1: - try: - bg_color, text_color, *msg = update_graphics_pout.recv() - except EOFError: - pygame.quit() - return - - self.screen.fill(bg_color) - for i, text in enumerate(msg): - text_surface = self.font.render(text, False, text_color) - text_height = text_surface.get_height() - text_rect = text_surface.get_rect(center=(self.width // 2, - self.height // 2 + text_height * (0.5 + i - 0.5 * len(msg)))) - self.screen.blit(text_surface, text_rect) - pygame.display.flip() - diff --git a/example/Python/src/YOLOv5/README.md b/example/Python/src/YOLOv5/README.md deleted file mode 100644 index 51182cf344..0000000000 --- a/example/Python/src/YOLOv5/README.md +++ /dev/null @@ -1,13 +0,0 @@ -To run the example(s): - -First, go to the PyTorch website and follow the instructions to install PyTorch: https://pytorch.org/get-started/locally/ - -IMPORTANT: If running with NVidia GPU, select the correct CUDA version on the installation page. - -Then, install other libraries and compile the LF file: - - - python3 -m pip install -r requirements.txt - lfc YOLOv5_Webcam.lf # (or lfc YOLOv5_Webcam_Timer.lf) - -Follow the instructions printed by `lfc` to run the program. diff --git a/example/Python/src/YOLOv5/YOLOv5_Webcam.lf b/example/Python/src/YOLOv5/YOLOv5_Webcam.lf deleted file mode 100644 index bd8687187c..0000000000 --- a/example/Python/src/YOLOv5/YOLOv5_Webcam.lf +++ /dev/null @@ -1,211 +0,0 @@ -/** - * Example of a Deep Neural Network (YOLOv5) in LF. - * Please see README.md for instructions. - * Adapted from - * https://towardsdatascience.com/implementing-real-time-object-detection-system-using-pytorch-and-opencv-70bac41148f7 - */ -target Python; - -preamble {= - BILLION = 1_000_000_000 -=} - -/** - * Use OpenCV2 to read from the user webcam. - * - * Camera frames are captured into the LF program - * via a physical action. - * - * 'webcam_id' (default 0) can be adjusted - * according your the local setup. - */ -reactor WebCam(webcam_id(0)) { - output camera_frame - state stream - state video_capture_thread - state thread_should_be_running - physical action frame_action - preamble {= - import cv2 - import threading - - def video_capture(self, frame_action, running): - # Read a frame - ret, frame = self.stream.read() - while running.is_set(): - if ret is True: - # If got a frame, schedule the physical action - frame_action.schedule(0, (get_elapsed_physical_time(), frame)) - ret, frame = self.stream.read() - return None - =} - reaction(startup) -> frame_action {= - self.stream = self.cv2.VideoCapture(self.webcam_id, self.cv2.CAP_ANY) - if (self.stream.isOpened() is not True): - sys.stderr.write("Error: Failed to capture from the webcam.\n") - exit(1) - - self.stream.set(self.cv2.CAP_PROP_FPS, 30) # Set the camera's FPS to 30 - - self.thread_should_be_running = self.threading.Event() - self.thread_should_be_running.set() - - self.video_capture_thread = self.threading.Thread(target=self.video_capture, args=(frame_action, self.thread_should_be_running)) - self.video_capture_thread.start() - =} - reaction(frame_action) -> camera_frame {= - camera_frame.set(frame_action.value) - =} - - reaction(shutdown) {= - self.thread_should_be_running.clear() - self.video_capture_thread.join() - self.stream.release() - =} -} - -/** - * A YOLOv5 DNN that takes a frame as input and - * produces object 'labels' and object label coordinates - * (where each label/object is on the frame). - */ -reactor DNN { - // Image input frame - input frame - - // Label outputs - output labels - // Label coordinates - output label_coordinates - // Send the model to anyone who's interested - output model - - state _model # The DNN model - state _device # The device to use (e.g., cpu or cuda) - preamble {= - import torch - from torch import hub - =} - reaction(startup) -> model {= - # Load YOLOv5 - self._model = self.torch.hub.load("ultralytics/yolov5", "yolov5s", pretrained=True) - # Find out if CUDA is supported - self._device = "cuda" if self.torch.cuda.is_available() else 'cpu' - # Send the model to device - self._model.to(self._device) - # Send the model to whoever is interested (other reactors) - model.set(self._model) - =} - reaction(frame) -> labels, label_coordinates {= - _, frame_data = frame.value - # Convert the frame into a tuple - fr = [frame_data] - # Run the model on the frame - results = self._model(fr) - # Extract the labels - labels.set(results.xyxyn[0][:, -1].cpu().numpy()) - # Extract the coordinates for the label - label_coordinates.set(results.xyxyn[0][:, :-1].cpu().numpy()) - =} -} - -/** - * Plot frames with labels superimposed on top of - * each object in the frame. - */ -reactor Plotter(label_deadline(100 msec)) { - input frame - input labels - input label_coordinates - input model - state _model # Keep the model - state _prev_time(0); - - preamble {= - import cv2 - =} - - /** - * Receive the DNN model - */ - reaction(model) {= - self._model = model.value - print("\n******* Press 'q' to exit *******\n") - =} - - /** - * Impose a deadline on object labels - */ - reaction(labels) {= - # DNN output was on time - =} deadline(label_deadline) {= - print(f"Received the DNN output late by about {(get_physical_time() - get_logical_time())/1000000}ms.") - =} - - /** - * Given a frame, object labels, and the corresponding - * object label coordinates, draw an interactive OpenCV window. - */ - reaction(frame, labels, label_coordinates) {= - if (not frame.is_present or - not labels.is_present or - not label_coordinates.is_present): - sys.stderr.write("Error: Expected all inputs to be present at the same time.\n") - request_stop() - - elapsed_time, frame_data = frame.value - # Get how many labels we have - n = len(labels.value) - x_shape, y_shape = frame_data.shape[1], frame_data.shape[0] - for i in range(n): - row = label_coordinates.value[i] - # If score is less than 0.2 we avoid making a prediction. - if row[4] < 0.2: - continue - x1 = int(row[0]*x_shape) - y1 = int(row[1]*y_shape) - x2 = int(row[2]*x_shape) - y2 = int(row[3]*y_shape) - bgr = (0, 255, 0) # color of the box - classes = self._model.names # Get the name of label index - label_font = self.cv2.FONT_HERSHEY_SIMPLEX #Font for the label. - self.cv2.rectangle(frame_data, \ - (x1, y1), (x2, y2), \ - bgr, 2) #Plot the boxes - self.cv2.putText(frame_data,\ - classes[int(labels.value[i])], \ - (x1, y1), \ - label_font, 0.9, bgr, 2) #Put a label over box. - - fps = int(1 / (elapsed_time / BILLION - self._prev_time / BILLION)) - self._prev_time = elapsed_time - self.cv2.putText(frame_data, str(fps), (7, 70), - self.cv2.FONT_HERSHEY_SIMPLEX, 3, - (100, 255, 0), 3, self.cv2.LINE_AA) - self.cv2.imshow("frame", frame_data) - # press 'Q' if you want to exit - if self.cv2.waitKey(1) & 0xFF == ord('q'): - request_stop() - =} - - reaction(shutdown) {= - # Destroy the all windows now - self.cv2.destroyAllWindows() - =} -} - -main reactor { - webcam = new WebCam() - dnn = new DNN() - plotter = new Plotter() - - // Send the camera frame to the DNN to be process and to the plotter to be depicted - (webcam.camera_frame)+ -> dnn.frame, plotter.frame - // Send outputs of the DNN (object labels and their coordinates) to the plotter - dnn.labels, dnn.label_coordinates -> plotter.labels, plotter.label_coordinates - - // Send the DNN model to the plotter. It will be used to extract the human-readable names - // of each label. - dnn.model -> plotter.model - -} diff --git a/example/Python/src/YOLOv5/YOLOv5_Webcam_Timer.lf b/example/Python/src/YOLOv5/YOLOv5_Webcam_Timer.lf deleted file mode 100644 index 13c6e628d1..0000000000 --- a/example/Python/src/YOLOv5/YOLOv5_Webcam_Timer.lf +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Example of a Deep Neural Network (YOLOv5) in LF. - * Please see README.md for instructions. - * This example is similar to YOLOv5_Webcam but uses a timer to - * get camera frames instead of physical actions. - * Adapted from - * https://towardsdatascience.com/implementing-real-time-object-detection-system-using-pytorch-and-opencv-70bac41148f7 - */ -target Python; - -import DNN, Plotter from "YOLOv5_Webcam.lf" - -/** - * Use OpenCV2 to read from the user webcam. - * - * Camera frames are captured periodically - * using a timer. - * - * 'webcam_id' (default 0) can be adjusted - * according to your local setup. - */ -reactor WebCam { - output camera_frame - state stream - state video_capture_thread - state thread_should_be_running - - preamble {= - import cv2 - =} - reaction(startup) {= - self.stream = self.cv2.VideoCapture(0, self.cv2.CAP_ANY) - if (self.stream.isOpened() is not True): - sys.stderr.write("Error: Failed to capture from the webcam.\n") - exit(1) - - self.stream.set(self.cv2.CAP_PROP_FPS, 30) # Set the camera's FPS to 30 - =} - - timer camera_tick(3 sec, 100 msec); - - reaction(camera_tick) -> camera_frame {= - ret, frame = self.stream.read() - if ret is True: - camera_frame.set((get_elapsed_physical_time(), frame)) - =} - - reaction(shutdown) {= - self.stream.release() - =} -} - -main reactor { - webcam = new WebCam() - dnn = new DNN() - plotter = new Plotter(label_deadline = 100 msec) - - (webcam.camera_frame)+ -> dnn.frame, plotter.frame - dnn.labels, dnn.label_coordinates -> plotter.labels, plotter.label_coordinates - - dnn.model -> plotter.model - -} \ No newline at end of file diff --git a/example/Python/src/YOLOv5/requirements.txt b/example/Python/src/YOLOv5/requirements.txt deleted file mode 100644 index 28cf9e5b5c..0000000000 --- a/example/Python/src/YOLOv5/requirements.txt +++ /dev/null @@ -1,17 +0,0 @@ -opencv-python -pandas -tqdm -seaborn -ipywidgets -ipython -ipykernel -matplotlib>=3.2.2 -numpy>=1.18.5 -Pillow>=7.1.2 -PyYAML>=5.3.1 -scipy>=1.4.1 - -# Logging ------------------------------------- -tensorboard>=2.4.1 -# wandb -thop # FLOPs computation diff --git a/example/README.md b/example/README.md deleted file mode 100644 index 66c3a0fc5f..0000000000 --- a/example/README.md +++ /dev/null @@ -1,6 +0,0 @@ -This directory contains partially developed examples of applications of reactors. -Each example has own directory and includes an explanation and instructions for -running it. - -These examples may not keep up with changes in the language and compiler. -See the regression tests for validated examples. \ No newline at end of file diff --git a/example/Rust/src/CounterProgram.lf b/example/Rust/src/CounterProgram.lf deleted file mode 100644 index 55942cb56a..0000000000 --- a/example/Rust/src/CounterProgram.lf +++ /dev/null @@ -1,34 +0,0 @@ -//! A simple counter program. The counter's stride and period -//! may be configured using the CLI: -//! ./counter_program --main-stride 20 --main-period 500msec -//! -//! Author: Clément Fournier - -target Rust { - timeout: 3 sec, - cargo-features: ["cli"] -}; - -reactor Counter(stride: u32(1), period: time(1 sec)) { - state count: u32(0); - state stride(stride); - timer t(0, period); - output out: u32; - reaction(t) -> out {= - ctx.set(out, self.count); - self.count += self.stride; - =} -} -reactor Printer { - input in: u32; - reaction(in) {= - if let Some(value) = ctx.get(r#in) { - println!("Hello World! value={}.", value); - } - =} -} -main reactor CounterProgram(stride: u32(10), period: time(1 sec)) { - counter = new Counter(stride=stride, period=period); - printer = new Printer(); - counter.out -> printer.in; -} diff --git a/example/Rust/src/Snake/KeyboardEvents.lf b/example/Rust/src/Snake/KeyboardEvents.lf deleted file mode 100644 index 975d378bfc..0000000000 --- a/example/Rust/src/Snake/KeyboardEvents.lf +++ /dev/null @@ -1,61 +0,0 @@ -//! Support reactor for the Snake.lf example. - -target Rust { - cargo-dependencies: { termion: "1", } -}; - -/// Capture asynchronous key presses, and sends them through an output port. -/// Used by the other examples. -reactor KeyboardEvents { - preamble {= - use std::io::Stdout; - - use termion::event::Key; - use termion::raw::{RawTerminal, IntoRawMode}; - =} - - /// The latest key press. - output arrow_key_pressed: Key; - - physical action key_press: Key; - - state raw_terminal: Option>; - - reaction(key_press) -> arrow_key_pressed {= - ctx.set(arrow_key_pressed, ctx.get(key_press).unwrap()); - =} - - reaction(shutdown) {= - drop(self.raw_terminal.take()) // exit raw mode - =} - - reaction(startup) -> key_press {= - - let stdin = std::io::stdin(); - - // enter raw mode, to get key presses one by one - // this will stay so until this variable is dropped - self.raw_terminal = Some(std::io::stdout().into_raw_mode().unwrap()); - - let key_press = key_press.clone(); - ctx.spawn_physical_thread(move |link| { - use termion::input::TermRead; - - for c in stdin.keys() { - match c.unwrap() { - k@(Key::Left | Key::Right | Key::Up | Key::Down) => { - trace!("received {:?}", k); - link.schedule_physical_with_v(&key_press, Some(k), Asap).ok(); - }, - Key::Ctrl('c') => { - link.request_stop(Asap).unwrap(); - break; - }, - k => { - trace!("received {:?}", k); - } - } - } - }); - =} -} diff --git a/example/Rust/src/Snake/README.md b/example/Rust/src/Snake/README.md deleted file mode 100644 index e505be66dc..0000000000 --- a/example/Rust/src/Snake/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Snake - -A snake terminal game. Does not support windows. - -This example was presented at the [ESWEEK](https://esweek.org/) Tutorial *Deterministic Reactive Programming for Cyber-Physical Systems Using Lingua Franca* on October 8th, 2021. A recording of this presentation is [available on YouTube](https://www.youtube.com/watch?v=0AteHXOHnto&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=4&t=2014s). diff --git a/example/Rust/src/Snake/Snake.lf b/example/Rust/src/Snake/Snake.lf deleted file mode 100644 index 6f90d51864..0000000000 --- a/example/Rust/src/Snake/Snake.lf +++ /dev/null @@ -1,143 +0,0 @@ -//! A snake terminal game. Does not support windows. -//! -//! Highlights of this example: -//! - external packages are linked in using Cargo (see `cargo-dependencies` target property) -//! - a support library is linked into the generated crate (see `rust-include` target property) -//! - physical actions are used to handle keyboard input asynchronously (see `KeyboardEvents.lf`) -//! - logical actions are used to implement a timed loop with variable period -//! - the game may be configured with the CLI -//! -//! This example was presented at the ESWEEK Tutorial -//! "Deterministic Reactive Programming for Cyber-Physical -//! Systems Using Lingua Franca" on October 8th, 2021. -//! -//! Author: Clément Fournier -//! -//! Note: Git history of this file may be found in https://github.com/lf-lang/reactor-rust -//! under the path examples/src/Snake.lf - -target Rust { - // LF-Rust programs integrate well with Cargo - cargo-dependencies: { - termcolor: "1", - termion: "1", // (this doesn't support windows) - rand: "0.8", - }, - // This will be linked into the root of the crate as a Rust module: `pub mod snakes;` - rust-include: "snakes.rs", - // This is a conditional compilation flag that enables the CLI. - // Without it, command-line arguments are ignored and produce a warning. - cargo-features: ["cli"], -}; - -// Import a shared reactor -import KeyboardEvents from "KeyboardEvents.lf"; - -// main reactor parameters can be set on the CLI, eg: -// ./snake --main-grid-side 48 -main reactor Snake(grid_side: usize(32), - tempo_step: time(40 msec), - food_limit: u32(2)) { - preamble {= - use crate::snakes::*; - use crate::snakes; - use termion::event::Key; - use rand::prelude::*; - =} - - /// this thing helps capturing key presses - keyboard = new KeyboardEvents(); - - // model classes for the game. - state snake: CircularSnake ({= CircularSnake::new(grid_side) =}); - state grid: SnakeGrid ({= SnakeGrid::new(grid_side, &snake) =}); // note that this one borrows snake temporarily - - /// Triggers a screen refresh, not a timer because we can - /// shrink the period over time to speed up the game. - logical action screen_refresh; - /// The game speed level - state tempo: u32(1); - state tempo_step(tempo_step); - - /// Changes with arrow key presses, might be invalid. - /// Only committed to snake_direction on grid update. - state pending_direction: Direction ({= Direction::RIGHT =}); - /// Whither the snake has slithered last - state snake_direction: Direction ({= Direction::RIGHT =}); - - /// manually triggered - logical action manually_add_more_food; - /// periodic - timer add_more_food(0, 5 sec); - // state vars for food - state food_on_grid: u32(0); - state max_food_on_grid(food_limit); - - // @label startup - reaction(startup) -> screen_refresh {= - // KeyboardEvents makes stdout raw on startup so this is safe - snakes::output::paint_on_raw_console(&self.grid); - - // schedule the first one, then it reschedules itself. - ctx.schedule(screen_refresh, after!(1 sec)); - =} - - // @label schedule_next_tick - reaction(screen_refresh) -> screen_refresh {= - // select a delay depending on the tempo - let delay = delay!(400 ms) - (self.tempo_step * self.tempo).min(delay!(300 ms)); - - ctx.schedule(screen_refresh, After(delay)); - =} - - // @label refresh_screen - reaction(screen_refresh) -> manually_add_more_food {= - // check that the user's command is valid - if self.pending_direction != self.snake_direction.opposite() { - self.snake_direction = self.pending_direction; - } - - match self.snake.slither_forward(self.snake_direction, &mut self.grid) { - UpdateResult::GameOver => { ctx.request_stop(Asap); return; }, - UpdateResult::FoodEaten => { - self.food_on_grid -= 1; - if self.food_on_grid == 0 { - ctx.schedule(manually_add_more_food, Asap); - } - self.tempo += 1; - }, - UpdateResult::NothingInParticular => {/* do nothing in particular. */} - } - - snakes::output::paint_on_raw_console(&self.grid); - =} - - // @label handle_key_press - reaction(keyboard.arrow_key_pressed) {= - // this might be overwritten several times, only committed on screen refreshes - self.pending_direction = match ctx.get(keyboard__arrow_key_pressed).unwrap() { - Key::Left => Direction::LEFT, - Key::Right => Direction::RIGHT, - Key::Up => Direction::UP, - Key::Down => Direction::DOWN, - _ => unreachable!(), - }; - =} - - // @label add_food - reaction(manually_add_more_food, add_more_food) {= - if self.food_on_grid >= self.max_food_on_grid { - return; // there's enough food there - } - - if let Some(cell) = self.grid.find_random_free_cell() { - self.grid[cell] = CellState::Food; // next screen update will catch this. - self.food_on_grid += 1; - } - =} - - // @label shutdown - reaction(shutdown) {= - println!("New high score: {}", self.snake.len()); - =} -} diff --git a/example/Rust/src/Snake/snakes.rs b/example/Rust/src/Snake/snakes.rs deleted file mode 100644 index 046ea957dc..0000000000 --- a/example/Rust/src/Snake/snakes.rs +++ /dev/null @@ -1,266 +0,0 @@ -//! Support module for the snake game example. - - -use std::ops::{Index, IndexMut}; - - -/// Position on the grid -#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)] -pub struct Cell { row: usize, col: usize } - -pub fn cell(row: usize, col: usize) -> Cell { - Cell { row, col } -} - -#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] -pub enum Direction { UP, RIGHT, DOWN, LEFT } - -impl Direction { - pub fn opposite(&self) -> Self { - match *self { - Self::UP => Self::DOWN, - Self::DOWN => Self::UP, - Self::RIGHT => Self::LEFT, - Self::LEFT => Self::RIGHT, - } - } -} - -impl Cell { - fn wrap_add(a: usize, add: bool, grid_side: usize) -> usize { - if a == grid_side - 1 && add { 0 } else if a == 0 && !add { grid_side - 1 } else if add { a + 1 } else { a - 1 } - } - - /// Returns the neighbor cell that's in the given direction, - /// wrap around the grid if needed. - fn shift(self, direction: Direction, grid_side: usize) -> Cell { - let Cell { row, col } = self; - match direction { - Direction::UP => Cell { row: Self::wrap_add(row, false, grid_side), col }, - Direction::RIGHT => Cell { row, col: Self::wrap_add(col, true, grid_side) }, - Direction::DOWN => Cell { row: Self::wrap_add(row, true, grid_side), col }, - Direction::LEFT => Cell { row, col: Self::wrap_add(col, false, grid_side) }, - } - } -} - -/// Keeps track of the positions of the snake, can update them -/// incrementally. -pub struct CircularSnake { - /// Circular buffer, the head field is the first element, - /// then they're in order when you read from right to left. - /// ```no_compile - /// [3, 2, 1] - /// ^head - /// ``` - /// This makes advancing while preserving order a constant - /// time/space operation. But growing the snake is linear. - snake_positions: Vec, - /// Index of the snake head in the position list - head: usize, - /// Side of the square grid - grid_side: usize, -} - -impl CircularSnake { - pub fn new(grid_side: usize) -> Self { - let mid = grid_side / 2; - Self { - snake_positions: vec![ - cell(mid, mid), - cell(mid, mid - 1), - ], - head: 0, - grid_side, - } - } - - pub fn head(&self) -> Cell { - self.snake_positions[self.head] - } - - pub fn len(&self) -> usize { - self.snake_positions.len() - } - - /// Mutate internal state of the grid too. - /// Returns cells that have changed. If none, the move was illegal - pub fn slither_forward(&mut self, snake_heading: Direction, grid: &mut SnakeGrid) -> UpdateResult { - let old_head = *&self.snake_positions[self.head]; - let new_head = old_head.shift(snake_heading, self.grid_side); - match grid[new_head] { - // we're eating our tail, move is illegal - CellState::Snake | CellState::SnakeHead => UpdateResult::GameOver, - CellState::Food => { - // then the tail is not moving, we increase size of the snake - self.snake_positions.insert(self.head + 1, new_head); - self.head = self.head + 1; - grid[old_head] = CellState::Snake; - grid[new_head] = CellState::SnakeHead; - UpdateResult::FoodEaten - } - CellState::Free => { - // replace old tail with new head, shift head ptr wrapping around - let tail = (self.head + 1) % self.snake_positions.len(); - let old_tail = self.snake_positions[tail]; - self.snake_positions[tail] = new_head; - self.head = tail; - - // note old_head and old_tail may be same if snake has length 1 - grid[old_head] = CellState::Snake; - grid[old_tail] = CellState::Free; - grid[new_head] = CellState::SnakeHead; - UpdateResult::NothingInParticular - } - } - } -} - -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -pub enum UpdateResult { - FoodEaten, - GameOver, - NothingInParticular, -} - -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -pub enum CellState { - SnakeHead, - Snake, - Food, - Free, -} - -pub struct SnakeGrid { - grid: Vec, - grid_side: usize, -} - -impl Index for SnakeGrid { - type Output = CellState; - - fn index(&self, cell: Cell) -> &Self::Output { - &self.grid[self.index_of(cell)] - } -} - -impl IndexMut for SnakeGrid { - fn index_mut(&mut self, cell: Cell) -> &mut Self::Output { - let i = self.index_of(cell); - &mut self.grid[i] - } -} - -impl SnakeGrid { - pub fn new(grid_side: usize, snake: &CircularSnake) -> Self { - assert!(grid_side >= 4, "Grid is too small"); - let mut grid = Self { - grid_side, - grid: vec![CellState::Free; grid_side * grid_side], - }; - - for cell in &snake.snake_positions { - grid[*cell] = CellState::Snake; - } - grid[snake.head()] = CellState::SnakeHead; - grid - } - - pub fn find_random_free_cell(&self) -> Option { - use rand::Rng; - - // find a random free cell that will become food - let mut rng = rand::thread_rng(); - for _ in 0..60 { // don't loop infinitely - let row = rng.gen_range(0..self.grid_side); - let col = rng.gen_range(0..self.grid_side); - if self[cell(row, col)] == CellState::Free { - return Some(cell(row, col)); - } - // otherwise try again - } - None - } - - pub fn grid_side(&self) -> usize { - self.grid_side - } - - fn index_of(&self, cell: Cell) -> usize { - cell.row * self.grid_side + cell.col - } -} - -pub mod output { - use std::io::{Write, Error, Result, ErrorKind}; - use termcolor::{Buffer, BufferWriter, Color, ColorChoice, ColorSpec, WriteColor}; - use super::*; - - pub fn paint_on_raw_console(grid: &SnakeGrid) { - use std::io::Write; - let str = format_for_raw_console(grid).unwrap(); - let stdout = std::io::stdout(); - let mut stdout = stdout.lock(); - - // this escape char clears the terminal - write!(stdout, "\x1B[2J\n\r{}", str).unwrap(); - stdout.flush().unwrap(); - } - - fn print_fence(buf: &mut Buffer, side: usize) -> Result<()> { - write!(buf, "+")?; - for _ in 0..side { - write!(buf, "~~")?; - } - write!(buf, "+\n\r") - } - - fn write_colored(buf: &mut Buffer, string: &str, color: &ColorSpec) -> Result<()> { - buf.set_color(color)?; - write!(buf, "{}", string)?; - buf.set_color(&ColorSpec::new()) - } - - - fn format_for_raw_console(grid: &SnakeGrid) -> Result { - - let bufwtr = BufferWriter::stdout(ColorChoice::Always); - let mut buf = bufwtr.buffer(); - - - let snake_color = { - let mut it = ColorSpec::new(); - it.set_fg(Some(Color::Green)); - it - }; - - let food_color = { - let mut it = ColorSpec::new(); - it.set_fg(Some(Color::Yellow)); - it - }; - - print_fence(&mut buf, grid.grid_side())?; - - // note: each cell is two chars wide because tty - // characters are taller than they're wide. This - // way vertical/horizontal speed is not warped. - - for row in 0..grid.grid_side() { - write!(&mut buf, "|").unwrap(); - for col in 0..grid.grid_side() { - match grid[cell(row, col)] { - CellState::SnakeHead => write_colored(&mut buf, "@ ", &snake_color)?, - CellState::Snake => write_colored(&mut buf, "o ", &snake_color)?, - CellState::Food => write_colored(&mut buf, "x ", &food_color)?, - CellState::Free => write!(&mut buf, " ")?, - } - } - write!(&mut buf, "|\n\r")?; - } - - print_fence(&mut buf, grid.grid_side())?; - - String::from_utf8(buf.into_inner()).map_err(|e| Error::new(ErrorKind::Other, e)) - } -} diff --git a/example/TypeScript/src/DistributedHelloWorld/HelloWorld.lf b/example/TypeScript/src/DistributedHelloWorld/HelloWorld.lf deleted file mode 100644 index 4dcf7c5b35..0000000000 --- a/example/TypeScript/src/DistributedHelloWorld/HelloWorld.lf +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Distributed LF program (in TypeScript) where a MessageGenerator creates - * a string message that is sent via the RTI (runtime infrastructure) to a - * receiver that prints the message. - * - * The code generator generates two TypeScript files: - * - * * src-gen/DistrubtedHelloWorld/HelloWorld/src/DistrubtedHelloWorld_source.ts: - * The program that produces the sequence of messages. - * * src-gen/DistrubtedHelloWorld/HelloWorld/src/DistrubtedHelloWorld_print.ts: - * The program that prints the sequence of messages received from source. - * - * The code generator also creates compiled JavaScript files out of TypeScript - * files above, respectively. - * - * * src-gen/DistributedHelloWorld/HelloWorld/dist/HelloWorld_source.js - * * src-gen/DistributedHelloWorld/HelloWorld/dist/HelloWorld_print.js - * - * To run this example, first you need to start the standalone RTI program in - * org.lflang/src/lib/core/federated/RTI using `build/RTI -n 2`. - * - * After starting the RTI, you need to run both compiled JavaScript files using - * node as shown below (inside src-gen/DistributedHelloWorld/HelloWorld/). - * - * * node dist/HelloWorld_source.js - * * node dist/HelloWorld_print.js - * - * @author Edward A. Lee - * @author Hokeun Kim - */ -target TypeScript { - timeout: 10 secs -}; - -/** - * Reactor that generates a sequence of messages, one per second. - * The message will be a string consisting of a root string followed - * by a count. - * @param root The root string. - * @output message The message. - */ -reactor MessageGenerator(root:string("")) { - // Output type char* instead of string is used for dynamically - // allocated character arrays (as opposed to static constant strings). - output message:string; - state count:number(1); - // Send first message after 1 sec so that the startup reactions - // do not factor into the transport time measurement on the first message. - timer t(1 sec, 1 sec); - reaction(t) -> message {= - message = root + " " + count++; - console.log(`At time (elapsed) logical tag ${util.getElapsedLogicalTime()}, source sends message: ${message}`); - =} -} - -/** - * Reactor that prints the current tag and an incoming string. - * - * @input message The message. - */ -reactor PrintMessage { - input message:string; - reaction(message) {= - console.log(`PrintMessage: At (elapsed) logical time ${util.getElapsedLogicalTime()}, receiver receives: ${message}`); - =} -} - -federated reactor HelloWorld { - source = new MessageGenerator(root = "Hello World"); - print = new PrintMessage(); - source.message -> print.message; -} \ No newline at end of file diff --git a/example/TypeScript/src/HTTPSRequestReactor/HTTPSRequest.lf b/example/TypeScript/src/HTTPSRequestReactor/HTTPSRequest.lf deleted file mode 100644 index 9b9780ff7f..0000000000 --- a/example/TypeScript/src/HTTPSRequestReactor/HTTPSRequest.lf +++ /dev/null @@ -1,34 +0,0 @@ -target TypeScript{ - keepalive : true - //logging : "debug" -}; -main reactor { - preamble {= - import * as https from "https" - import * as http from "http" - =} - physical action data:{= Buffer =}; - physical action done; - reaction (startup) -> data, done {= - https.get("https://ptolemy.berkeley.edu/projects/icyphy/", (res : http.IncomingMessage) => { - console.log("statusCode:", res.statusCode); - console.log("headers:", res.headers); - res.on("data", (d : Buffer) => { - actions.data.schedule(0, d); - }); - res.on("end", () => { - actions.done.schedule(0, null); - }); - }); - =} - reaction (data) {= - let serverData = data; - if (serverData) { - console.log(serverData.toString()); - } - =} - reaction (done) {= - console.log("No more data in response."); - util.requestStop(); - =} -} diff --git a/example/TypeScript/src/HTTPServerReactor/HTTPServer.lf b/example/TypeScript/src/HTTPServerReactor/HTTPServer.lf deleted file mode 100644 index ff104d109e..0000000000 --- a/example/TypeScript/src/HTTPServerReactor/HTTPServer.lf +++ /dev/null @@ -1,40 +0,0 @@ -target TypeScript { - keepalive : true - //logging : "debug" - //timeout : 10 sec -}; -main reactor { - preamble {= - import * as https from "https" - import * as http from "http" - =} - state count:number(0); - state server:{=http.Server | undefined=}({=undefined=}); - physical action serverRequest:{= [ http.IncomingMessage, http.ServerResponse ] =}; - reaction (startup) -> serverRequest {= - let options = {}; - server = http.createServer(options, (req : http.IncomingMessage, res : http.ServerResponse) => { - // Generally browsers make two requests, the first is for favicon.ico. - // See https://stackoverflow.com/questions/11961902/nodejs-http-createserver-seems-to-call-twice - if (req.url != "/favicon.ico") { - actions.serverRequest.schedule(0, [req, res]) - } - }).listen(8000); - =} - reaction (serverRequest) {= - let requestArray = serverRequest; - if (requestArray) { - let req = requestArray[0]; - let res = requestArray[1]; - res.writeHead(200); - count++; - res.write("ping count: " + count + "\n"); - res.end("hello world\n"); - } - =} - reaction (shutdown) {= - if (server) { - server.close(); - } - =} -} diff --git a/example/TypeScript/src/HTTPServerReactor/gcp/Dockerfile b/example/TypeScript/src/HTTPServerReactor/gcp/Dockerfile deleted file mode 100644 index 5ce0cf4eaf..0000000000 --- a/example/TypeScript/src/HTTPServerReactor/gcp/Dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM node:alpine -WORKDIR /linguafranca/HTTPServer -COPY . . -ENTRYPOINT ["node", "dist/HTTPServer.js"] \ No newline at end of file diff --git a/example/TypeScript/src/HTTPServerReactor/gcp/README.md b/example/TypeScript/src/HTTPServerReactor/gcp/README.md deleted file mode 100644 index f8c260a900..0000000000 --- a/example/TypeScript/src/HTTPServerReactor/gcp/README.md +++ /dev/null @@ -1,93 +0,0 @@ -# Deploying a Lingua Franca Server to Google Cloud Platform (GCP) - -## Prerequisites -A GCP account with billing enabled is required. You can sign up for free [here](https://cloud.google.com/free). - -### Instructions - -#### MacOS -1. Go to [Google Cloud Console](https://console.cloud.google.com/). - -2. Click on the search bar at the top and search `Create a project`.
    -Name your project `lf-example`. - -3. Follow this [link](https://console.cloud.google.com/flows/enableapi?apiid=artifactregistry.googleapis.com,container.googleapis.com) to enable the Artifact Registry and Google Kubernetes Engine APIs. You need to enable billing on your GCP account or this step will fail. See [here](https://cloud.google.com/billing/docs/how-to/modify-project#confirm_billing_is_enabled_on_a_project) on how to check if billing is enabled on your account. Once this step is done, you can close Cloud Console. - -4. On your local machine, install google cloud sdk using brew:
    -`brew install --cask google-cloud-sdk` - - -5. Log into gcloud using `gcloud init`
    -Type `y` when it asks you to log in.
    -A browser tab to the Google login page should spawn. Log in. - -6. After logging in, the sdk would ask to select or create a project. Select the project you just created in step 2. If it asks you `Do you want to configure a default Compute Region and Zone? (Y/n)?`, type `n`. - -7. Check the project id of the project you just created:
    -`gcloud projects list`
    -Export its Project ID:
    -`export PROJECT_ID=your_project_id` - -8. Set the compute engine region:
    -`gcloud config set compute/region us-central1`. - -9. Set the compute engine zone:
    -`gcloud config set compute/zone us-central1-a`. - -10. Set up a repo on the artifact registry. This is where you will push your containerized LF application:
    -`gcloud artifacts repositories create lf-server-repo --repository-format=docker --location=us-central1 --description="Docker repository"` - -11. go to `example/TypeScript` in the lingua-franca repo. - -12. Compile the server example:
    -`lfc src/HTTPServerReactor/HTTPServer.lf` - -13. Copy the docker file into the generated source folder:
    -`cp src/HTTPServerReactor/gcp/Dockerfile src-gen/HTTPServerReactor/HTTPServer/Dockerfile` - -14. Cd into the generated source folder:
    -`cd src-gen/src-gen/HTTPServerReactor/HTTPServer/` - -15. Build the docker image:
    -`docker build -t us-central1-docker.pkg.dev/${PROJECT_ID}/lf-server-repo/lf-server:v1 .` - -16. Configure the Docker command-line tool to authenticate to Artifact Registry:
    -`gcloud auth configure-docker us-central1-docker.pkg.dev` - -17. Push the docker image to gcloud container registry:
    -`docker push us-central1-docker.pkg.dev/${PROJECT_ID}/lf-server-repo/lf-server:v1` - -18. Create a kubernetes cluster with one node:
    -`gcloud container clusters create lf-cluster --num-nodes=1 --machine-type=e2-micro`
    -This may take a few minutes to finish. - -19. Create a kubernetes deployment for the lf server:
    -`kubectl create deployment lf-server --image=us-central1-docker.pkg.dev/${PROJECT_ID}/lf-server-repo/lf-server:v1` - -20. Expose the lf server:
    -`kubectl expose deployment lf-server --name=lf-server-service --type=LoadBalancer --port 80 --target-port 8000` - -21. Check the status of the exposed service:
    -`kubectl get service`
    -If the external IP of the service is ``, wait a while and try `kubectl get service` again. - -22. When the external IP of the service is ready, open up a browser and go to that address. You should see a `ping count` and a `helloworld` message. - -23. Finally, we need to do clean up to avoid incurring charges. Clean up the service:
    -`kubectl delete service lf-server-service` - - -24. Clean up the cluster:
    -`gcloud container clusters delete lf-cluster --zone us-central1-a`
    -This might take a couple of minutes. - -25. Clean up the container images:
    -`gcloud artifacts docker images delete us-central1-docker.pkg.dev/${PROJECT_ID}/lf-server-repo/lf-server:v1 --delete-tags --quiet` - - -Congratulations! You just finished deploying a lingua franca program on Google Cloud. - - -## References -1. https://cloud.google.com/kubernetes-engine/docs/quickstart -2. https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app