Skip to content

Commit c592b89

Browse files
Code-generate for federated programs (#175)
* Have LFC generate a main function that can optionally be included in the build * CI * CI * CI * Setup LFC in RIOT container * Switch to riot master * Fix * Install LFC deps in zephyr CI also * WIP * WIP * WIP: SimpleFederated.lf now compiles. But invoking CMake correctly to generate two binaries and a shell script in `bin` is not working * Generate a launch script for federated native * Make federated launch script executable * WIP * Rework the handling of connections * Various fixes to get all standalone tests to pass again * Formatting * More WIP * Formatting * More WIP * Add @interface attr * More WIP * More WIP * More WIP * All tests are passing * Refactor * Formatting * Refactorings * More docs * CI * Fixes * TcpIp fixes * Revert more tcp stuff * Avoid flooding log when a federate closes a socket * Remove merge mistake * Formatting * Fix posix federated * More minor fixes * Format * Minimum event queue of 2 * Remove some dead code * Also close send_failed socketpair on reset * Generate return 0 in main function * Only generate launch script when we target native * Set timeout of 1minute on our LF tests * Add some info prints * Add was_ever_connected API to network_channel * Fix some warnings in unit-tests * Avoid some unnecessary LF_INFO calls * Do not timestamp logs for FlexPRET * Format * Remove build.sh in riot Lf example * Use global _lf_environment * Fix missing _lf_environment in test * Dont need environment arg to TcpIp and CoapUdp ctors * Coap updates * Remove stale ref --------- Co-authored-by: Lasse Rosenow <[email protected]>
1 parent 15ea9ba commit c592b89

File tree

78 files changed

+2533
-926
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

78 files changed

+2533
-926
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
**/build/
22
**/src-gen/
33
**/bin/
4+
**/*.log
45
benchmarks/include
56
.vscode/
67
cmake-build-debug

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ if (NOT PLATFORM STREQUAL "ZEPHYR")
7878
endif()
7979

8080
# Add compile definitions for platform and network channel specifics.
81-
target_compile_definitions(reactor-uc PRIVATE "PLATFORM_${PLATFORM}")
81+
target_compile_definitions(reactor-uc PUBLIC "PLATFORM_${PLATFORM}")
8282

8383
# Add compile definition for scheduler used
8484
target_compile_definitions(reactor-uc PRIVATE "SCHEDULER_${SCHEDULER}")

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,4 @@ format-check:
4949
ci: clean test coverage format-check
5050

5151
clean:
52-
rm -rf build
52+
rm -rf build test/lf/src-gen test/lf/bin

examples/posix/federated/receiver.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,18 +50,19 @@ LF_REACTOR_CTOR_SIGNATURE_WITH_PARAMETERS(Receiver, InputExternalCtorArgs *in_ex
5050
LF_PORT_REGISTER_EFFECT(self->in, self->r, 1);
5151
}
5252

53-
LF_DEFINE_FEDERATED_INPUT_CONNECTION(Receiver, in, msg_t, 5, MSEC(100), false);
53+
LF_DEFINE_FEDERATED_INPUT_CONNECTION_STRUCT(Receiver, in, msg_t, 5);
54+
LF_DEFINE_FEDERATED_INPUT_CONNECTION_CTOR(Receiver, in, msg_t, 5, MSEC(100), false);
5455

5556
typedef struct {
5657
FederatedConnectionBundle super;
5758
TcpIpChannel channel;
5859
LF_FEDERATED_INPUT_CONNECTION_INSTANCE(Receiver, in);
5960
LF_FEDERATED_CONNECTION_BUNDLE_BOOKKEEPING_INSTANCES(1, 0)
60-
} LF_FEDERATED_CONNECTION_BUNDLE_NAME(Receiver, Sender);
61+
} LF_FEDERATED_CONNECTION_BUNDLE_TYPE(Receiver, Sender);
6162

6263
LF_FEDERATED_CONNECTION_BUNDLE_CTOR_SIGNATURE(Receiver, Sender) {
6364
LF_FEDERATED_CONNECTION_BUNDLE_CTOR_PREAMBLE();
64-
TcpIpChannel_ctor(&self->channel, parent->env, "127.0.0.1", PORT_NUM, AF_INET, false);
65+
TcpIpChannel_ctor(&self->channel, "127.0.0.1", PORT_NUM, AF_INET, false);
6566
LF_FEDERATED_CONNECTION_BUNDLE_CALL_CTOR();
6667
LF_INITIALIZE_FEDERATED_INPUT_CONNECTION(Receiver, in, deserialize_msg_t);
6768
}
@@ -80,7 +81,7 @@ LF_REACTOR_CTOR_SIGNATURE(MainRecv) {
8081
LF_DEFINE_CHILD_INPUT_ARGS(receiver, in, 1, 1);
8182
LF_INITIALIZE_CHILD_REACTOR_WITH_PARAMETERS(Receiver, receiver, 1, _receiver_in_args[i]);
8283
LF_INITIALIZE_FEDERATED_CONNECTION_BUNDLE(Receiver, Sender);
83-
LF_BUNDLE_REGISTER_DOWNSTREAM(Receiver, Sender, receiver, in);
84+
lf_connect_federated_input(&self->Receiver_Sender_bundle.inputs[0]->super, &self->receiver->in[0].super);
8485
}
8586

8687
LF_ENTRY_POINT_FEDERATED(MainRecv, SEC(1), true, true, 1, false)

examples/posix/federated/sender.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,18 +59,19 @@ LF_REACTOR_CTOR_SIGNATURE_WITH_PARAMETERS(Sender, OutputExternalCtorArgs *out_ex
5959
LF_PORT_REGISTER_SOURCE(self->out, self->r, 1);
6060
}
6161

62-
LF_DEFINE_FEDERATED_OUTPUT_CONNECTION(Sender, out, msg_t, 1)
62+
LF_DEFINE_FEDERATED_OUTPUT_CONNECTION_STRUCT(Sender, out, msg_t)
63+
LF_DEFINE_FEDERATED_OUTPUT_CONNECTION_CTOR(Sender, out, msg_t)
6364

6465
typedef struct {
6566
FederatedConnectionBundle super;
6667
TcpIpChannel channel;
6768
LF_FEDERATED_OUTPUT_CONNECTION_INSTANCE(Sender, out);
6869
LF_FEDERATED_CONNECTION_BUNDLE_BOOKKEEPING_INSTANCES(0, 1);
69-
} LF_FEDERATED_CONNECTION_BUNDLE_NAME(Sender, Receiver);
70+
} LF_FEDERATED_CONNECTION_BUNDLE_TYPE(Sender, Receiver);
7071

7172
LF_FEDERATED_CONNECTION_BUNDLE_CTOR_SIGNATURE(Sender, Receiver) {
7273
LF_FEDERATED_CONNECTION_BUNDLE_CTOR_PREAMBLE();
73-
TcpIpChannel_ctor(&self->channel, parent->env, "127.0.0.1", PORT_NUM, AF_INET, true);
74+
TcpIpChannel_ctor(&self->channel, "127.0.0.1", PORT_NUM, AF_INET, true);
7475

7576
LF_FEDERATED_CONNECTION_BUNDLE_CALL_CTOR();
7677

@@ -94,8 +95,9 @@ LF_REACTOR_CTOR_SIGNATURE(MainSender) {
9495
LF_DEFINE_CHILD_OUTPUT_ARGS(sender, out, 1, 1);
9596
LF_INITIALIZE_CHILD_REACTOR_WITH_PARAMETERS(Sender, sender, 1, _sender_out_args[i]);
9697
LF_INITIALIZE_FEDERATED_CONNECTION_BUNDLE(Sender, Receiver);
97-
LF_BUNDLE_REGISTER_UPSTREAM(Sender, Receiver, sender, out);
98+
lf_connect_federated_output(self->Sender_Receiver_bundle.outputs[0], self->sender->out);
9899
}
100+
99101
LF_ENTRY_POINT_FEDERATED(MainSender, SEC(1), true, false, 1, true)
100102

101103
int main() {

examples/posix/hello/hello.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
LF_DEFINE_REACTION_BODY(TimerSource, r) {
55
LF_SCOPE_SELF(TimerSource);
66
LF_SCOPE_ENV();
7-
printf("TimerSource World @ %lld\n", env->get_elapsed_logical_time(env));
7+
printf("TimerSource World @ %"PRId64"\n", env->get_elapsed_logical_time(env));
88
}
99

1010
int main() {

examples/riot/coap_federated/receiver/main.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,18 +53,19 @@ LF_REACTOR_CTOR_SIGNATURE_WITH_PARAMETERS(Receiver, InputExternalCtorArgs *in_ex
5353
LF_PORT_REGISTER_EFFECT(self->in, self->r, 1);
5454
}
5555

56-
LF_DEFINE_FEDERATED_INPUT_CONNECTION(Receiver, in, lf_msg_t, 5, MSEC(100), false)
56+
LF_DEFINE_FEDERATED_INPUT_CONNECTION_STRUCT(Receiver, in, msg_t, 5);
57+
LF_DEFINE_FEDERATED_INPUT_CONNECTION_CTOR(Receiver, in, msg_t, 5, MSEC(100), false);
5758

5859
typedef struct {
5960
FederatedConnectionBundle super;
6061
CoapUdpIpChannel channel;
6162
LF_FEDERATED_INPUT_CONNECTION_INSTANCE(Receiver, in);
6263
LF_FEDERATED_CONNECTION_BUNDLE_BOOKKEEPING_INSTANCES(1, 0)
63-
} LF_FEDERATED_CONNECTION_BUNDLE_NAME(Receiver, Sender);
64+
} LF_FEDERATED_CONNECTION_BUNDLE_TYPE(Receiver, Sender);
6465

6566
LF_FEDERATED_CONNECTION_BUNDLE_CTOR_SIGNATURE(Receiver, Sender) {
6667
LF_FEDERATED_CONNECTION_BUNDLE_CTOR_PREAMBLE();
67-
CoapUdpIpChannel_ctor(&self->channel, parent->env, REMOTE_ADDRESS, REMOTE_PROTOCOL_FAMILY);
68+
CoapUdpIpChannel_ctor(&self->channel, REMOTE_ADDRESS, REMOTE_PROTOCOL_FAMILY);
6869
LF_FEDERATED_CONNECTION_BUNDLE_CALL_CTOR();
6970
LF_INITIALIZE_FEDERATED_INPUT_CONNECTION(Receiver, in, deserialize_msg_t);
7071
}
@@ -83,7 +84,7 @@ LF_REACTOR_CTOR_SIGNATURE(MainRecv) {
8384
LF_DEFINE_CHILD_INPUT_ARGS(receiver, in, 1, 1);
8485
LF_INITIALIZE_CHILD_REACTOR_WITH_PARAMETERS(Receiver, receiver, 1, _receiver_in_args[i]);
8586
LF_INITIALIZE_FEDERATED_CONNECTION_BUNDLE(Receiver, Sender);
86-
LF_BUNDLE_REGISTER_DOWNSTREAM(Receiver, Sender, receiver, in);
87+
lf_connect_federated_input(&self->Receiver_Sender_bundle.inputs[0]->super, &self->receiver->in[0].super);
8788
}
8889

8990
LF_ENTRY_POINT_FEDERATED(MainRecv, SEC(1), true, true, 1, false)

examples/riot/coap_federated/sender/main.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,18 +60,19 @@ LF_REACTOR_CTOR_SIGNATURE_WITH_PARAMETERS(Sender, OutputExternalCtorArgs *out_ex
6060
LF_PORT_REGISTER_SOURCE(self->out, self->r, 1);
6161
}
6262

63-
LF_DEFINE_FEDERATED_OUTPUT_CONNECTION(Sender, out, lf_msg_t, 1)
63+
LF_DEFINE_FEDERATED_OUTPUT_CONNECTION_STRUCT(Sender, out, msg_t)
64+
LF_DEFINE_FEDERATED_OUTPUT_CONNECTION_CTOR(Sender, out, msg_t)
6465

6566
typedef struct {
6667
FederatedConnectionBundle super;
6768
CoapUdpIpChannel channel;
6869
LF_FEDERATED_OUTPUT_CONNECTION_INSTANCE(Sender, out);
6970
LF_FEDERATED_CONNECTION_BUNDLE_BOOKKEEPING_INSTANCES(0, 1);
70-
} LF_FEDERATED_CONNECTION_BUNDLE_NAME(Sender, Receiver);
71+
} LF_FEDERATED_CONNECTION_BUNDLE_TYPE(Sender, Receiver);
7172

7273
LF_FEDERATED_CONNECTION_BUNDLE_CTOR_SIGNATURE(Sender, Receiver) {
7374
LF_FEDERATED_CONNECTION_BUNDLE_CTOR_PREAMBLE();
74-
CoapUdpIpChannel_ctor(&self->channel, parent->env, REMOTE_ADDRESS, REMOTE_PROTOCOL_FAMILY);
75+
CoapUdpIpChannel_ctor(&self->channel, REMOTE_ADDRESS, REMOTE_PROTOCOL_FAMILY);
7576
LF_FEDERATED_CONNECTION_BUNDLE_CALL_CTOR();
7677
LF_INITIALIZE_FEDERATED_OUTPUT_CONNECTION(Sender, out, serialize_msg_t);
7778
}
@@ -93,7 +94,7 @@ LF_REACTOR_CTOR_SIGNATURE(MainSender) {
9394
LF_DEFINE_CHILD_OUTPUT_ARGS(sender, out, 1, 1);
9495
LF_INITIALIZE_CHILD_REACTOR_WITH_PARAMETERS(Sender, sender, 1, _sender_out_args[i]);
9596
LF_INITIALIZE_FEDERATED_CONNECTION_BUNDLE(Sender, Receiver);
96-
LF_BUNDLE_REGISTER_UPSTREAM(Sender, Receiver, sender, out);
97+
lf_connect_federated_output((Connection *)self->Sender_Receiver_bundle.outputs[0], (Port *)self->sender->out);
9798
}
9899

99100
LF_ENTRY_POINT_FEDERATED(MainSender, SEC(1), true, false, 1, true)

examples/riot/hello/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
LF_DEFINE_REACTION_BODY(TimerSource, r) {
66
LF_SCOPE_SELF(TimerSource);
77
LF_SCOPE_ENV();
8-
printf("TimerSource World @ %lld\n", env->get_elapsed_logical_time(env));
8+
printf("Hello World @ %lld\n", env->get_elapsed_logical_time(env));
99
}
1010

1111
int main() {

examples/zephyr/basic_federated/common/receiver.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,18 +64,19 @@ LF_REACTOR_CTOR_SIGNATURE_WITH_PARAMETERS(Receiver, InputExternalCtorArgs *in_ex
6464
LF_PORT_REGISTER_EFFECT(self->in, self->r, 1);
6565
}
6666

67-
LF_DEFINE_FEDERATED_INPUT_CONNECTION(Receiver, in, msg_t, 5, MSEC(100), false);
67+
LF_DEFINE_FEDERATED_INPUT_CONNECTION_STRUCT(Receiver, in, msg_t, 5);
68+
LF_DEFINE_FEDERATED_INPUT_CONNECTION_CTOR(Receiver, in, msg_t, 5, MSEC(100), false);
6869

6970
typedef struct {
7071
FederatedConnectionBundle super;
7172
TcpIpChannel channel;
7273
LF_FEDERATED_INPUT_CONNECTION_INSTANCE(Receiver, in);
7374
LF_FEDERATED_CONNECTION_BUNDLE_BOOKKEEPING_INSTANCES(1, 0)
74-
} LF_FEDERATED_CONNECTION_BUNDLE_NAME(Receiver, Sender);
75+
} LF_FEDERATED_CONNECTION_BUNDLE_TYPE(Receiver, Sender);
7576

7677
LF_FEDERATED_CONNECTION_BUNDLE_CTOR_SIGNATURE(Receiver, Sender) {
7778
LF_FEDERATED_CONNECTION_BUNDLE_CTOR_PREAMBLE();
78-
TcpIpChannel_ctor(&self->channel, parent->env, IP_ADDR, PORT_NUM, AF_INET, false);
79+
TcpIpChannel_ctor(&self->channel, IP_ADDR, PORT_NUM, AF_INET, false);
7980
LF_FEDERATED_CONNECTION_BUNDLE_CALL_CTOR();
8081
LF_INITIALIZE_FEDERATED_INPUT_CONNECTION(Receiver, in, deserialize_payload_default);
8182
}
@@ -94,6 +95,6 @@ LF_REACTOR_CTOR_SIGNATURE(MainRecv) {
9495
LF_DEFINE_CHILD_INPUT_ARGS(receiver, in, 1, 1);
9596
LF_INITIALIZE_CHILD_REACTOR_WITH_PARAMETERS(Receiver, receiver, 1, _receiver_in_args[i]);
9697
LF_INITIALIZE_FEDERATED_CONNECTION_BUNDLE(Receiver, Sender);
97-
LF_BUNDLE_REGISTER_DOWNSTREAM(Receiver, Sender, receiver, in);
98+
lf_connect_federated_input(&self->Receiver_Sender_bundle.inputs[0]->super, &self->receiver->in[0].super);
9899
}
99100
LF_ENTRY_POINT_FEDERATED(MainRecv, FOREVER, true, true, 1, false)

0 commit comments

Comments
 (0)