Skip to content

feat: S08.03 slice 3b.2 SingleTask example with SolidSyslogUdpSender + interactive command channel#301

Merged
DavidCozens merged 2 commits into
mainfrom
feat/freertos-singletask-example
May 9, 2026
Merged

feat: S08.03 slice 3b.2 SingleTask example with SolidSyslogUdpSender + interactive command channel#301
DavidCozens merged 2 commits into
mainfrom
feat/freertos-singletask-example

Conversation

@DavidCozens

@DavidCozens DavidCozens commented May 9, 2026

Copy link
Copy Markdown
Owner

Summary

  • Wires SolidSyslogConfig + SolidSyslogUdpSender behind the slice-1 SolidSyslogFreeRtosDatagram and slice-3a SolidSyslogFreeRtosStaticResolver, with Example/Common/ExampleInteractive running over qemu -serial stdio (CmsdkUart RX path host-TDD'd in this slice; Syscalls.c::_read does the CR→LF + echo). send N / quit over the UART produce N RFC 5424 datagrams to {10.0.2.2, 5514} and a clean teardown.
  • Evolves Example/FreeRtos/Common/CmsdkUart.{h,c} rather than introducing a sibling UartRx.{c,h} — one CMSDK UART driver in Common/ consumed by both HelloWorld and SingleTask. CmsdkUart_Init now writes CTRL ← TX_EN | RX_EN; CmsdkUart_GetChar blocks on STATE.RXFULL with the same sleep(1) yield idiom as PutChar. Five ZOMBIES cycles drove this against an extended CmsdkUartFake that models RXFULL gating and DATA-read-clears-RXFULL.
  • Two correctness fixes that surfaced under live QEMU smoke: (a) Example/FreeRtos/cmake/arm-none-eabi.cmake now sets -mcpu=cortex-m3 -mthumb in CMAKE_C_FLAGS_INIT so libSolidSyslog.a is Thumb-2 (without this, the first cross-library call hard-faulted because arm-none-eabi-gcc defaulted to ARM mode); (b) the InteractiveTask runs at configMINIMAL_STACK_SIZE * 32 (16 KB) — overkill but safe, with a follow-up to characterise the real budget once CMake-driven memory scaling lands.

Detailed rationale in DEVLOG.md (2026-05-09 entry).

Closes #296

Test plan

  • clang-format --dry-run --Werror on every changed file
  • Tests/FreeRtos/CmsdkUartTest — 14 / 14 (5 new RX cycles)
  • Tests/FreeRtos/SolidSyslogFreeRtosDatagramTest — 21 / 21 (unchanged)
  • Tests/FreeRtos/SolidSyslogFreeRtosStaticResolverTest — 10 / 10 (unchanged)
  • Full host ctest --preset debug — green
  • cmake --build --preset freertos-cross — both ELFs link clean
  • HelloWorld QEMU smoke — banner prints (no toolchain regression)
  • SingleTask QEMU smoke — send 1 produces 1 datagram, send 3 produces 3, quit exits
  • CI: build-linux-gcc, build-linux-clang, sanitize-linux-gcc, coverage-linux-gcc, analyze-tidy, analyze-cppcheck, analyze-iwyu, analyze-format, build-windows-msvc, BDD, OpenSSL integration

🤖 Generated with Claude Code

Summary by CodeRabbit

Release Notes

  • New Features

    • Added UART character input capability for interactive serial communication
    • Created interactive SolidSyslog example demonstrating UDP datagram transmission with command-line control
  • Bug Fixes

    • Fixed ARM Cortex-M cross-compilation to properly use Thumb mode across all compiled sources
  • Tests

    • Enhanced UART testing infrastructure to validate receive functionality
  • Chores

    • Updated build configuration for conditional networking support with FreeRTOS integration

Review Change Stack

…+ interactive command channel

Replaces 3b.1's link-up "ping" smoke with a real SolidSyslog wiring:
NullBuffer + SolidSyslogUdpSender on the slice-1 SolidSyslogFreeRtosDatagram
and the slice-3a SolidSyslogFreeRtosStaticResolver, exposed via
Example/Common/ExampleInteractive over qemu -serial stdio. CmsdkUart grew
a host-TDD'd RX path (CmsdkUart_GetChar; Init now writes TX_EN | RX_EN);
Syscalls.c::_read calls into it with CR->LF translation and echo so fgets
behaves as a cooked-mode TTY. Toolchain file gained
-mcpu=cortex-m3 -mthumb in CMAKE_C_FLAGS_INIT so libSolidSyslog.a comes
back as Thumb-2 and links into the cross binary; without this the first
cross-library call hard-faulted on entry.

Closes #296

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented May 9, 2026

Copy link
Copy Markdown
Contributor

Warning

Rate limit exceeded

@DavidCozens has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 45 minutes and 18 seconds before requesting another review.

You’ve run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 82aa12bf-687f-43b7-be5c-b7c7bc36cf10

📥 Commits

Reviewing files that changed from the base of the PR and between 8339d9a and 6c12ab6.

📒 Files selected for processing (3)
  • Example/FreeRtos/SingleTask/main.c
  • Tests/FreeRtos/CmsdkUartFake.c
  • Tests/FreeRtos/CmsdkUartTest.cpp
📝 Walkthrough

Walkthrough

This pull request implements S08.03 slice 3b.2, evolving the FreeRTOS SingleTask example from a one-shot UDP smoke test to an interactive SolidSyslog-driven application. It adds UART receive support, integrates newlib _read for stdin, updates cross-compilation flags, and wires SolidSyslog formatters/senders to emit RFC 5424 datagrams driven by interactive UART commands.

Changes

Interactive SingleTask SolidSyslog Example with UART I/O

Layer / File(s) Summary
UART RX Interface Design
Example/FreeRtos/Common/CmsdkUart.h, Example/FreeRtos/Common/CmsdkUart.c
CMSDK UART driver gains RX capability with RX_ENABLE control bit, RX_FULL_BIT status flag, and new public API CmsdkUart_GetChar() that blocks until a byte is available, polling with task yield.
Newlib stdin Implementation
Example/FreeRtos/Common/Syscalls.c
Standard C _read syscall now reads bytes via CmsdkUart_GetChar(), normalizes CR to LF, echoes input back over UART, and returns actual byte count instead of unconditional zero.
Cross-Compilation Toolchain
Example/FreeRtos/cmake/arm-none-eabi.cmake
ARM Cortex-M cross-toolchain CMake initializes global CMAKE_C_FLAGS_INIT, CMAKE_CXX_FLAGS_INIT, and CMAKE_ASM_FLAGS_INIT with -mcpu=cortex-m3 -mthumb to ensure consistent Thumb-mode compilation.
SolidSyslog Address Adapter
Platform/FreeRtos/Source/SolidSyslogAddress.c
New FreeRTOS Platform adapter exports SolidSyslogAddress_FromStorage to safely cast address storage pointers for use by datagram senders and resolvers.
CMake Build Configuration
Core/Source/CMakeLists.txt, Example/FreeRtos/SingleTask/CMakeLists.txt
Core CMake conditionally includes resolver/datagram/UDP-sender sources when FREERTOS_KERNEL_PATH is set. SingleTask executable gains SolidSyslog source files, expanded include paths for Core/Platform headers, and explicit library linkage.
SingleTask Example Implementation
Example/FreeRtos/SingleTask/main.c
Module documentation and includes updated to describe SolidSyslog wiring; added RFC 5424 formatter callbacks (hostname, app name, process ID, timestamp, endpoint); new InteractiveTask constructs SolidSyslog sender pipeline (resolver, datagram, UDP sender, null buffer/store), runs ExampleInteractive_Run for stdin command loop, emits datagrams, and cleans up components on shutdown.
Test Infrastructure
Tests/FreeRtos/CmsdkUartFake.h, Tests/FreeRtos/CmsdkUartFake.c, Tests/FreeRtos/CmsdkUartTest.cpp
CmsdkUartFake extended with receivedByte storage and configurable RX-readiness delay counters; Fake_Read32 DATA/STATE register reads simulate RX behavior. New test helpers CmsdkUartFake_SetReceivedByte and CmsdkUartFake_SetReadsBeforeRxReady added. Unit tests added for receiver enable and GetChar polling/blocking/sleep behavior.
Documentation
DEVLOG.md
New top-of-file entry for 2026-05-09 documents S08.03 slice 3b.2 implementation, UART/newlib integration, captured debugging insights (Thumb-mode toolchain fix, stack sizing notes), follow-on items, and PR pre-check verification list.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Possibly related issues

  • DavidCozens/solid-syslog#268 — Directly addresses the CMake condition change to include resolver/datagram/UDP-sender sources under FreeRTOS.
  • DavidCozens/solid-syslog#296 — Covers the full S08.03 slice 3b.2 SingleTask example implementation with SolidSyslog wiring and UART integration.
  • DavidCozens/solid-syslog#299 — Relates to the incorporation of the SolidSyslogFreeRtosDatagram adapter in the SingleTask build.

Possibly related PRs

  • DavidCozens/solid-syslog#291 — Prior PR added initial CMSDK UART TX and newlib syscall retargeting; this PR extends it with RX support and CmsdkUart_GetChar, modifying the same driver and syscall interfaces.
  • DavidCozens/solid-syslog#297 — Adds the FreeRTOS Plus-TCP UDP smoke SingleTask target; this PR replaces and extends that example with SolidSyslog interactive wiring and networking source inclusion.
  • DavidCozens/solid-syslog#289 — Introduces the FreeRTOS datagram adapter and address helpers that this PR directly uses and wires into the interactive sender pipeline.

Poem

🐰 A rabbit reads from UART streams today,
Formatters craft datagrams on the way,
SolidSyslog sings in RFC's code,
Interactive tasks make the QEMU load,
Slice 3b.2 hops toward the goal!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 5.71% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: adding a SingleTask example that wires SolidSyslogUdpSender with an interactive command channel, matching the core objectives.
Description check ✅ Passed The description comprehensively covers purpose (closes #296), detailed change rationale, and test evidence with specific test counts and QEMU validation, well-structured and complete.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/freertos-singletask-example

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actions Bot commented May 9, 2026

Copy link
Copy Markdown
Contributor

☀️   Quality Summary

   🚦   build-linux-gcc: 100% successful (✔️ 1096 passed, 🙈 3 skipped)
   🚦   build-linux-clang: 100% successful (✔️ 1042 passed, 🙈 3 skipped)
   🚦   sanitize-linux-gcc: 100% successful (✔️ 1042 passed, 🙈 3 skipped)
   🚦   integration-linux-openssl: 100% successful (✔️ 9 passed)
   🚦   integration-windows-openssl: 100% successful (✔️ 9 passed)
   🚦   bdd-linux-syslog-ng: 100% successful (✔️ 46 passed)
   🚦   bdd-windows-otel: 96% successful (✔️ 44 passed, 🙈 2 skipped)
   🚦   build-windows-msvc: 100% successful (✔️ 954 passed, 🙈 1 skipped)
   ⚠️   Clang-Tidy: No warnings
   ⚠️   CPPCheck: No warnings


Created by Quality Monitor v1.14.0 (#f3859fd). More details are shown in the GitHub Checks Result.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Example/FreeRtos/SingleTask/main.c (1)

116-119: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Round sub-tick UART sleeps up to one tick.

Line 118 currently converts the driver's sleep(1) contract into vTaskDelay(0) whenever pdMS_TO_TICKS(1) truncates to zero on the configured 100 Hz tick rate. Since vTaskDelay(0) returns without yielding the CPU, the RX/TX wait loops busy-spin instead of blocking the task.

💡 Suggested fix
 static void RtosSleep(int milliseconds)
 {
-    vTaskDelay(pdMS_TO_TICKS((TickType_t) milliseconds));
+    TickType_t ticks = pdMS_TO_TICKS((TickType_t) milliseconds);
+    if ((milliseconds > 0) && (ticks == 0U))
+    {
+        ticks = 1U;
+    }
+    vTaskDelay(ticks);
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Example/FreeRtos/SingleTask/main.c` around lines 116 - 119, RtosSleep
currently calls vTaskDelay(pdMS_TO_TICKS((TickType_t) milliseconds)) which
truncates small non-zero millisecond values to 0 on low tick rates and causes
vTaskDelay(0) to return immediately; change RtosSleep to compute TickType_t
ticks = pdMS_TO_TICKS((TickType_t) milliseconds) and if milliseconds > 0 &&
ticks == 0 set ticks = 1 before calling vTaskDelay(ticks) so that any non-zero
millisecond sleep yields at least one tick and prevents busy-spin in RX/TX wait
loops.
🧹 Nitpick comments (1)
Example/FreeRtos/SingleTask/main.c (1)

145-156: ⚡ Quick win

Promote the placeholder timestamp to a named TEST_* default.

The other walking-skeleton defaults are all surfaced as named TEST_* fixtures, but this callback still embeds the RFC 5424 placeholder date as raw literals.

♻️ Suggested refactor
+static const struct SolidSyslogTimestamp TEST_TIMESTAMP = {
+    .year             = 2009U,
+    .month            = 3U,
+    .day              = 23U,
+    .hour             = 0U,
+    .minute           = 0U,
+    .second           = 0U,
+    .microsecond      = 0U,
+    .utcOffsetMinutes = 0,
+};
+
 /* RFC 5424 publication date — walking-skeleton placeholder until S08.03
  * slice 4+ injects a real RTC-backed clock callback. */
 static void GetTimestamp(struct SolidSyslogTimestamp* timestamp)
 {
-    timestamp->year             = 2009U;
-    timestamp->month            = 3U;
-    timestamp->day              = 23U;
-    timestamp->hour             = 0U;
-    timestamp->minute           = 0U;
-    timestamp->second           = 0U;
-    timestamp->microsecond      = 0U;
-    timestamp->utcOffsetMinutes = 0;
+    *timestamp = TEST_TIMESTAMP;
 }
As per coding guidelines "For walking skeleton stories, use hard-coded 'test default' values named `TEST_*` (e.g. `TestHost`, `42`, RFC 5424 date `2009-03-23T00:00:00.000Z`)."
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Example/FreeRtos/SingleTask/main.c` around lines 145 - 156, Replace the
hard-coded RFC5424 timestamp literals inside GetTimestamp with named TEST_*
defaults: declare constants (e.g. TEST_TIMESTAMP_YEAR, TEST_TIMESTAMP_MONTH,
TEST_TIMESTAMP_DAY, TEST_TIMESTAMP_HOUR, TEST_TIMESTAMP_MINUTE,
TEST_TIMESTAMP_SECOND, TEST_TIMESTAMP_MICROSECOND,
TEST_TIMESTAMP_UTCOFFSET_MINUTES) or a single TEST_TIMESTAMP fixture and assign
those constants in GetTimestamp instead of raw numbers so the walking-skeleton
timestamp is surfaced as a named test default.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Tests/FreeRtos/CmsdkUartFake.c`:
- Around line 173-183: CmsdkUartFake_SetReceivedByte currently leaves prior RX
readiness bits/countdown intact which can leak state between re-arms; modify the
function to clear prior RX readiness by clearing RX_FULL_BIT from fake.state and
resetting fake.readsRemainingBeforeRxReady to 0 before applying the new byte and
the readsBeforeRxReadyDefault logic (refer to CmsdkUartFake_SetReceivedByte,
fake.state, RX_FULL_BIT, and fake.readsRemainingBeforeRxReady).

---

Outside diff comments:
In `@Example/FreeRtos/SingleTask/main.c`:
- Around line 116-119: RtosSleep currently calls
vTaskDelay(pdMS_TO_TICKS((TickType_t) milliseconds)) which truncates small
non-zero millisecond values to 0 on low tick rates and causes vTaskDelay(0) to
return immediately; change RtosSleep to compute TickType_t ticks =
pdMS_TO_TICKS((TickType_t) milliseconds) and if milliseconds > 0 && ticks == 0
set ticks = 1 before calling vTaskDelay(ticks) so that any non-zero millisecond
sleep yields at least one tick and prevents busy-spin in RX/TX wait loops.

---

Nitpick comments:
In `@Example/FreeRtos/SingleTask/main.c`:
- Around line 145-156: Replace the hard-coded RFC5424 timestamp literals inside
GetTimestamp with named TEST_* defaults: declare constants (e.g.
TEST_TIMESTAMP_YEAR, TEST_TIMESTAMP_MONTH, TEST_TIMESTAMP_DAY,
TEST_TIMESTAMP_HOUR, TEST_TIMESTAMP_MINUTE, TEST_TIMESTAMP_SECOND,
TEST_TIMESTAMP_MICROSECOND, TEST_TIMESTAMP_UTCOFFSET_MINUTES) or a single
TEST_TIMESTAMP fixture and assign those constants in GetTimestamp instead of raw
numbers so the walking-skeleton timestamp is surfaced as a named test default.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 82873159-4581-4bd6-9f96-0bfb7d3033b6

📥 Commits

Reviewing files that changed from the base of the PR and between 463a49d and 8339d9a.

📒 Files selected for processing (12)
  • Core/Source/CMakeLists.txt
  • DEVLOG.md
  • Example/FreeRtos/Common/CmsdkUart.c
  • Example/FreeRtos/Common/CmsdkUart.h
  • Example/FreeRtos/Common/Syscalls.c
  • Example/FreeRtos/SingleTask/CMakeLists.txt
  • Example/FreeRtos/SingleTask/main.c
  • Example/FreeRtos/cmake/arm-none-eabi.cmake
  • Platform/FreeRtos/Source/SolidSyslogAddress.c
  • Tests/FreeRtos/CmsdkUartFake.c
  • Tests/FreeRtos/CmsdkUartFake.h
  • Tests/FreeRtos/CmsdkUartTest.cpp

Comment thread Tests/FreeRtos/CmsdkUartFake.c
Three findings, all valid:

1. CmsdkUartFake.c::SetReceivedByte didn't clear leftover RX_FULL_BIT or
   readsRemainingBeforeRxReady before applying the new mode, so
   back-to-back arms could carry stale state into the new arm. Added a
   regression test (SetReadsBeforeRxReady(0)+SetReceivedByte then
   SetReadsBeforeRxReady(2)+SetReceivedByte; the second GetChar must
   spin) which fails on the unfixed fake and passes once SetReceivedByte
   resets RX_FULL_BIT and the countdown up front.

2. main.c::RtosSleep called vTaskDelay(pdMS_TO_TICKS(milliseconds)) which
   truncates 1 ms to 0 ticks at configTICK_RATE_HZ=100. vTaskDelay(0)
   returns without yielding, so CmsdkUart's spin-with-sleep(1) loops
   would busy-spin instead of blocking the task. Latent on QEMU (TX spin
   never iterates; RX spin gets preempted by SysTick→IP task) but a real
   correctness bug on silicon. Floor non-zero requests at one tick.

3. main.c hardcoded the RFC 5424 publication-date timestamp inline,
   inconsistent with the other walking-skeleton TEST_* defaults
   (TEST_HOSTNAME, TEST_APP_NAME, etc.). Promoted to
   TEST_TIMESTAMP fixture; GetTimestamp now does *timestamp = TEST_TIMESTAMP.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@DavidCozens

Copy link
Copy Markdown
Owner Author

CodeRabbit review feedback addressed in 6c12ab6. The inline thread on CmsdkUartFake.c has its own reply; this comment closes the loop on the two outside-diff findings.

1. Example/FreeRtos/SingleTask/main.c:118 — RtosSleep one-tick floor. Taken. pdMS_TO_TICKS(1) truncates to 0 at configTICK_RATE_HZ=100, and vTaskDelay(0) returns without yielding — so CmsdkUart's spin-with-sleep(1) loops would busy-spin on silicon. Latent on QEMU because (a) the chardev backend drains synchronously so the TX spin never iterates, and (b) the RX spin gets preempted by SysTick → the higher-priority IP task. But it's a real correctness bug regardless. Floor non-zero millisecond requests at one tick.

2. Example/FreeRtos/SingleTask/main.c:145-156 — promote the timestamp to a TEST_TIMESTAMP fixture. Taken. Other walking-skeleton defaults (TEST_HOSTNAME, TEST_APP_NAME, TEST_PROCESS_ID, TEST_MESSAGE_ID, TEST_MESSAGE) are all named TEST_* constants; the timestamp is now consistent with that. GetTimestamp collapses to *timestamp = TEST_TIMESTAMP;.

Pre-PR re-checks after the fixup commit:

  • clang-format --dry-run --Werror on changed files — clean.
  • Tests/FreeRtos/CmsdkUartTest — 15 / 15 (regression test for the fake leak added).
  • cmake --build --preset freertos-cross — clean (HelloWorld + SingleTask both link).
  • SingleTask QEMU smoke (send 1 → 1 datagram → quit) — same RFC 5424 frame as before, quit exits cleanly.

@github-actions

github-actions Bot commented May 9, 2026

Copy link
Copy Markdown
Contributor

☀️   Quality Summary

   🚦   build-linux-gcc: 100% successful (✔️ 1096 passed, 🙈 3 skipped)
   🚦   build-linux-clang: 100% successful (✔️ 1042 passed, 🙈 3 skipped)
   🚦   sanitize-linux-gcc: 100% successful (✔️ 1042 passed, 🙈 3 skipped)
   🚦   integration-linux-openssl: 100% successful (✔️ 9 passed)
   🚦   integration-windows-openssl: 100% successful (✔️ 9 passed)
   🚦   bdd-linux-syslog-ng: 100% successful (✔️ 46 passed)
   🚦   bdd-windows-otel: 96% successful (✔️ 44 passed, 🙈 2 skipped)
   🚦   build-windows-msvc: 100% successful (✔️ 954 passed, 🙈 1 skipped)
   ⚠️   Clang-Tidy: No warnings
   ⚠️   CPPCheck: No warnings


Created by Quality Monitor v1.14.0 (#f3859fd). More details are shown in the GitHub Checks Result.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

S08.03 slice 3b.2: SingleTask example with SolidSyslogUdpSender + interactive command channel

1 participant