This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git


The following commit(s) were added to refs/heads/master by this push:
     new 89dd0c29e Zig & D examples clean & refactor
89dd0c29e is described below

commit 89dd0c29e2e3c5dba42240b08ff4ca407b5848c6
Author: Matheus Catarino <matheus-catar...@hotmail.com>
AuthorDate: Fri Aug 23 14:57:27 2024 -0300

    Zig & D examples clean & refactor
    
    dlang: use importC to get NuttX include
    zig: leds_zig added
---
 examples/hello_d/Makefile                          |   8 +-
 examples/hello_d/hello_d_main.d                    | 130 ++++++++-----
 examples/hello_d/nuttx_std.c                       |  39 ++++
 examples/hello_zig/Makefile                        |   2 +-
 examples/hello_zig/hello_zig.zig                   |  30 ++-
 examples/hello_zig/hello_zig_main.zig              |  40 ----
 examples/leds_zig/Kconfig                          |  30 +++
 .../{hello_zig/Makefile => leds_zig/Make.defs}     |  19 +-
 examples/{hello_d => leds_zig}/Makefile            |  19 +-
 examples/leds_zig/leds_zig.zig                     | 211 +++++++++++++++++++++
 10 files changed, 409 insertions(+), 119 deletions(-)

diff --git a/examples/hello_d/Makefile b/examples/hello_d/Makefile
index a66e165c6..805edea85 100644
--- a/examples/hello_d/Makefile
+++ b/examples/hello_d/Makefile
@@ -26,7 +26,13 @@ MAINSRC = hello_d_main.d
 
 # hello_d built-in application info
 
-DFLAGS += -oq -betterC
+# no garbage collection
+DFLAGS += -betterC
+# better informations
+DFLAGS += -vtls -verrors=context
+# like #ifdef/#define NuttX_ImportC
+# importC: need $(CC) to compile C file and -P-I to import C includes
+DFLAGS += -P-I$(TOPDIR)/include --d-version=NuttX_ImportC --gcc=$(CC)
 PROGNAME  = $(CONFIG_EXAMPLES_HELLO_D_PROGNAME)
 PRIORITY  = $(CONFIG_EXAMPLES_HELLO_D_PRIORITY)
 STACKSIZE = $(CONFIG_EXAMPLES_HELLO_D_STACKSIZE)
diff --git a/examples/hello_d/hello_d_main.d b/examples/hello_d/hello_d_main.d
index b679c4b30..47dd4e885 100644
--- a/examples/hello_d/hello_d_main.d
+++ b/examples/hello_d/hello_d_main.d
@@ -26,16 +26,39 @@ module examples.hello_d_main;
 // import core.stdc.stdio : printf;
 // import core.stdc.stdlib : malloc, free;
 
-///
-pragma(printf)
-extern (C) int printf(scope const(char)* fmt, scope...) @nogc nothrow @trusted;
-///
-extern (C) void* malloc(size_t size) @nogc nothrow @trusted;
-///
-extern (C) void free(void* ptr) @nogc nothrow @trusted;
+version (D_BetterC) // no DRT
+{
+    /// if betterC and LDC, disable moduleinfo and typeinfo
+    version (LDC)
+    {
+        pragma(LDC_no_moduleinfo);
+        pragma(LDC_no_typeinfo);
+    }
+}
+
+/// use --d-version=NuttX_ImportC to define
+version (NuttX_ImportC)
+{
+    /// D compiler will not import C++ symbols
+    /// so we need to import them manually
+    /// @nogc, @trusted, @safe, nothrow - not allowed
+    /// https://issues.dlang.org/show_bug.cgi?id=23812
+    import nuttx_std : malloc, free, printf; // by default: @system (unsafe)
+}
+else
+{
+    /// Correctly FFI-import C/C++ symbols (@safe compatibility)
+    ///
+    pragma(printf)
+    extern (C) int printf(scope const(char)* fmt, scope...) @nogc nothrow 
@trusted;
+    ///
+    extern (C) void* malloc(size_t size) @nogc nothrow @trusted;
+    ///
+    extern (C) void free(scope void* ptr) @nogc nothrow @trusted;
+}
 
 //***************************************************************************
-// Private module content
+// Private module content (default is public)
 //***************************************************************************
 private:
 
@@ -43,62 +66,76 @@ private:
 extern (C++,class)
 struct DHelloWorld
 {
-@nogc nothrow:
-
     @disable this();
     @disable this(this);
-    this(int secret) @safe pure
-    {
-        mSecret = secret;
-        debug printf("Constructor\n");
-    }
 
-    ~this() @safe pure
+    /// use --d-version=NuttX_ImportC to define
+    version (NuttX_ImportC)
     {
-        debug printf("Destructor\n");
-    }
-
-    bool HelloWorld() @safe
-    {
-        debug printf("HelloWorld: mSecret=%d\n", mSecret);
+        this(int secret)
+        {
+            mSecret = secret;
+            printf("Constructor\n");
+        }
 
-        if (mSecret != 42)
+        ~this()
         {
-            printf("DHelloWorld.HelloWorld: CONSTRUCTION FAILED!\n");
-            return false;
+            printf("Destructor\n");
         }
-        else
+
+        bool HelloWorld()
         {
-            printf("DHelloWorld.HelloWorld: Hello, World!!\n");
-            return true;
+            printf("HelloWorld: mSecret=%d\n", mSecret);
+
+            if (mSecret != 42)
+            {
+                printf("DHelloWorld.HelloWorld: CONSTRUCTION FAILED!\n");
+                return false;
+            }
+            else
+            {
+                printf("DHelloWorld.HelloWorld: Hello, World!!\n");
+                return true;
+            }
         }
     }
+    else
+    {
+        this(int secret) @safe nothrow @nogc
+        {
+            mSecret = secret;
+            printf("Constructor\n");
+        }
 
-    private int mSecret;
-}
-
-//***************************************************************************
-// Private Data
-//***************************************************************************
+        ~this() @safe nothrow @nogc
+        {
+            printf("Destructor\n");
+        }
 
-// Define a statically constructed DHellowWorld instance if D static
-// initializers are supported by the platform
-// --d-version=D_Initialize
-version (D_Initialize)
-{
-    static DHelloWorld g_HelloWorld;
+        bool HelloWorld() @safe nothrow @nogc
+        {
+            printf("HelloWorld: mSecret=%d\n", mSecret);
+
+            if (mSecret != 42)
+            {
+                printf("DHelloWorld.HelloWorld: CONSTRUCTION FAILED!\n");
+                return false;
+            }
+            else
+            {
+                printf("DHelloWorld.HelloWorld: Hello, World!!\n");
+                return true;
+            }
+        }
+    }
+    private int mSecret = 0;
 }
 
-//***************************************************************************
-// Public Functions
-//***************************************************************************
-
 /****************************************************************************
  * Name: hello_d_main
  ****************************************************************************/
 // betterC need main function no-mangle.
-extern (C)
-int hello_d_main(int argc, char*[] argv) nothrow @nogc
+extern (C) int hello_d_main(int argc, char*[] argv)
 {
     version (LDC)
     {
@@ -118,5 +155,6 @@ int hello_d_main(int argc, char*[] argv) nothrow @nogc
 
     printf("hello_d_main: Saying hello from the instance constructed on the 
stack\n");
     HelloWorld.HelloWorld();
+
     return 0;
 }
diff --git a/examples/hello_d/nuttx_std.c b/examples/hello_d/nuttx_std.c
new file mode 100644
index 000000000..f8585c47f
--- /dev/null
+++ b/examples/hello_d/nuttx_std.c
@@ -0,0 +1,39 @@
+/****************************************************************************
+ * apps/examples/hello_d/nuttx_std.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+/****************************************************************************
+ * This is imported to d source using importC
+ * https://dlang.org/spec/importc.html
+ ****************************************************************************/
+#include <nuttx/config.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * hello_d_main
+ ****************************************************************************/
\ No newline at end of file
diff --git a/examples/hello_zig/Makefile b/examples/hello_zig/Makefile
index 5413dc580..90b9de590 100644
--- a/examples/hello_zig/Makefile
+++ b/examples/hello_zig/Makefile
@@ -25,7 +25,7 @@ include $(APPDIR)/Make.defs
 MAINSRC = hello_zig.zig
 
 # Hello, Zig! built-in application info
-
+ZIGFLAGS += -lc -I$(TOPDIR)/include
 PROGNAME  = $(CONFIG_EXAMPLES_HELLO_ZIG_PROGNAME)
 PRIORITY  = $(CONFIG_EXAMPLES_HELLO_ZIG_PRIORITY)
 STACKSIZE = $(CONFIG_EXAMPLES_HELLO_ZIG_STACKSIZE)
diff --git a/examples/hello_zig/hello_zig.zig b/examples/hello_zig/hello_zig.zig
index 6d7f271eb..4c8fbcbca 100644
--- a/examples/hello_zig/hello_zig.zig
+++ b/examples/hello_zig/hello_zig.zig
@@ -24,17 +24,35 @@
 const std = @import("std");
 
 //****************************************************************************
-//* Externs
+//* C API - need libc linking (freestanding libc is stubs only)
 //****************************************************************************
+// NuttX namespace
+const NuttX = struct {
+    pub const c = @cImport({
+        @cInclude("nuttx/config.h");
+        @cInclude("stdio.h");
+    });
+    pub fn print(comptime fmt: [*:0]const u8, args: anytype) void {
+        _ = printf(std.fmt.comptimePrint(std.mem.span(fmt), args));
+    }
+};
 
-pub extern fn printf(_format: [*:0]const u8) c_int;
+// or (optional) const c = std.c; // from std library (non-full libc)
 
+// typedef alias
+const printf = NuttX.c.printf;
 //****************************************************************************
 //* hello_zig_main
 //****************************************************************************
-pub export fn main(_argc: c_int, _argv: [*]const [*]const u8) u8 {
-    _ = _argc;
-    _ = _argv;
-    _ = printf("Hello, Zig!\n");
+comptime {
+    // rename to hello_zig_main entry point for nuttx
+    @export(hello_zig, .{
+        .name = "hello_zig_main",
+        .linkage = .weak,
+    });
+}
+
+fn hello_zig(_: c_int, _: ?[*]const [*]const u8) callconv(.C) c_int {
+    NuttX.print("[{s}]: Hello, Zig!\n", .{NuttX.c.CONFIG_ARCH_BOARD});
     return 0;
 }
diff --git a/examples/hello_zig/hello_zig_main.zig 
b/examples/hello_zig/hello_zig_main.zig
deleted file mode 100644
index 146e2668a..000000000
--- a/examples/hello_zig/hello_zig_main.zig
+++ /dev/null
@@ -1,40 +0,0 @@
-//***************************************************************************
-// examples/hello_zig/hello_zig_main.zig
-//
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.  The
-// ASF licenses this file to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance with the
-// License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
-// License for the specific language governing permissions and limitations
-// under the License.
-//
-//***************************************************************************
-
-//***************************************************************************
-// Included Files
-//***************************************************************************
-const std = @import("std");
-
-//****************************************************************************
-//* Externs
-//****************************************************************************
-
-pub extern fn printf(_format: [*:0]const u8) c_int;
-
-//****************************************************************************
-//* hello_zig_main
-//****************************************************************************
-pub export fn hello_zig_main(_argc: c_int, _argv: [*]const [*]const u8) c_int {
-    _ = _argc;
-    _ = _argv;
-    _ = printf("Hello, Zig!\n");
-    return 0;
-}
diff --git a/examples/leds_zig/Kconfig b/examples/leds_zig/Kconfig
new file mode 100644
index 000000000..59ea600ca
--- /dev/null
+++ b/examples/leds_zig/Kconfig
@@ -0,0 +1,30 @@
+#
+# For a description of the syntax of this configuration file,
+# see the file kconfig-language.txt in the NuttX tools repository.
+#
+
+config EXAMPLES_LEDS_ZIG
+       tristate "\"LEDs Zig\" example"
+       default n
+       depends on USERLED
+       ---help---
+               Enable the \"LEDs Zig\" example
+
+if EXAMPLES_LEDS_ZIG
+
+config EXAMPLES_LEDS_ZIG_PROGNAME
+       string "Program name"
+       default "leds_zig"
+       ---help---
+               This is the name of the program that will be used when the
+               program is installed.
+
+config EXAMPLES_LEDS_ZIG_PRIORITY
+       int "LEDs Zig task priority"
+       default 100
+
+config EXAMPLES_LEDS_ZIG_STACKSIZE
+       int "LEDs Zig stack size"
+       default DEFAULT_TASK_STACKSIZE
+
+endif
diff --git a/examples/hello_zig/Makefile b/examples/leds_zig/Make.defs
similarity index 71%
copy from examples/hello_zig/Makefile
copy to examples/leds_zig/Make.defs
index 5413dc580..9f5fb809e 100644
--- a/examples/hello_zig/Makefile
+++ b/examples/leds_zig/Make.defs
@@ -1,5 +1,5 @@
 ############################################################################
-# apps/examples/hello_zig/Makefile
+# apps/examples/leds_zig/Make.defs
 #
 # Licensed to the Apache Software Foundation (ASF) under one or more
 # contributor license agreements.  See the NOTICE file distributed with
@@ -18,17 +18,6 @@
 #
 ############################################################################
 
-include $(APPDIR)/Make.defs
-
-# Hello, Zig! Example
-
-MAINSRC = hello_zig.zig
-
-# Hello, Zig! built-in application info
-
-PROGNAME  = $(CONFIG_EXAMPLES_HELLO_ZIG_PROGNAME)
-PRIORITY  = $(CONFIG_EXAMPLES_HELLO_ZIG_PRIORITY)
-STACKSIZE = $(CONFIG_EXAMPLES_HELLO_ZIG_STACKSIZE)
-MODULE    = $(CONFIG_EXAMPLES_HELLO_ZIG)
-
-include $(APPDIR)/Application.mk
+ifneq ($(CONFIG_EXAMPLES_LEDS_ZIG),)
+CONFIGURED_APPS += $(APPDIR)/examples/leds_zig
+endif
diff --git a/examples/hello_d/Makefile b/examples/leds_zig/Makefile
similarity index 73%
copy from examples/hello_d/Makefile
copy to examples/leds_zig/Makefile
index a66e165c6..4da5a8908 100644
--- a/examples/hello_d/Makefile
+++ b/examples/leds_zig/Makefile
@@ -1,5 +1,5 @@
 ############################################################################
-# apps/examples/hello_d/Makefile
+# apps/examples/leds_zig/Makefile
 #
 # Licensed to the Apache Software Foundation (ASF) under one or more
 # contributor license agreements.  See the NOTICE file distributed with
@@ -20,16 +20,15 @@
 
 include $(APPDIR)/Make.defs
 
-# Hello, World! D Example
+# LEDS in Zig Example
 
-MAINSRC = hello_d_main.d
+MAINSRC = leds_zig.zig
 
-# hello_d built-in application info
-
-DFLAGS += -oq -betterC
-PROGNAME  = $(CONFIG_EXAMPLES_HELLO_D_PROGNAME)
-PRIORITY  = $(CONFIG_EXAMPLES_HELLO_D_PRIORITY)
-STACKSIZE = $(CONFIG_EXAMPLES_HELLO_D_STACKSIZE)
-MODULE    = $(CONFIG_EXAMPLES_HELLO_D)
+# LEDS_zig built-in application info
+ZIGFLAGS += -O ReleaseSmall -lc -I$(TOPDIR)/include
+PROGNAME  = $(CONFIG_EXAMPLES_LEDS_ZIG_PROGNAME)
+PRIORITY  = $(CONFIG_EXAMPLES_LEDS_ZIG_PRIORITY)
+STACKSIZE = $(CONFIG_EXAMPLES_LEDS_ZIG_STACKSIZE)
+MODULE    = $(CONFIG_EXAMPLES_LEDS_ZIG)
 
 include $(APPDIR)/Application.mk
diff --git a/examples/leds_zig/leds_zig.zig b/examples/leds_zig/leds_zig.zig
new file mode 100644
index 000000000..ad1b3f435
--- /dev/null
+++ b/examples/leds_zig/leds_zig.zig
@@ -0,0 +1,211 @@
+///**************************************************************************
+// examples/leds_zig/leds_zig.zig
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.  The
+// ASF licenses this file to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance with the
+// License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+// License for the specific language governing permissions and limitations
+// under the License.
+//
+///**************************************************************************
+///**************************************************************************
+// Included Files
+///**************************************************************************
+const std = @import("std");
+
+// C types not working with Zig comptime, need allocation
+const Allocator = std.mem.Allocator;
+
+/// NuttX namespace
+const NuttX = struct {
+    // public constant
+    pub const c = @cImport({
+        @cInclude("nuttx/config.h");
+        @cInclude("sys/ioctl.h");
+        @cInclude("stdbool.h");
+        @cInclude("stdlib.h");
+        @cInclude("stdio.h");
+        @cInclude("fcntl.h");
+        @cInclude("sched.h");
+        @cInclude("errno.h");
+        @cInclude("signal.h");
+        @cInclude("unistd.h");
+
+        @cInclude("nuttx/leds/userled.h");
+    });
+
+    var g_led_daemon_started: bool = false;
+
+    pub fn print(allocator: Allocator, comptime fmt: [*:0]const u8, args: 
anytype) void {
+        // comptime buffer[count(fmt, args)] or runtime allocation
+        const output = if (isComptime(args))
+            std.fmt.comptimePrint(std.mem.span(fmt), args)
+        else
+            std.fmt.allocPrintZ(allocator, std.mem.span(fmt), args) catch 
@panic("Out of Memory!!");
+
+        _ = c.printf(output);
+    }
+
+    pub const exit_t = enum(c_int) {
+        success = c.EXIT_SUCCESS,
+        failure = c.EXIT_FAILURE,
+    };
+
+    // private function
+
+    // check if value is comptime
+    inline fn isComptime(val: anytype) bool {
+        return @typeInfo(@TypeOf(.{val})).Struct.fields[0].is_comptime;
+    }
+
+    export fn led_daemon(_: c_int, _: [*c][*c]u8) callconv(.C) c_int {
+        var supported: NuttX.c.userled_set_t = 0;
+        var ledset: NuttX.c.userled_set_t = 0;
+        var incrementing: bool = true;
+
+        // SIGTERM handler
+        const sigaction_t = NuttX.c.struct_sigaction;
+        var act: sigaction_t = .{
+            .sa_flags = NuttX.c.SA_SIGINFO,
+            .sa_u = .{
+                ._sa_sigaction = sigterm_action,
+            },
+        };
+
+        _ = NuttX.c.sigemptyset(&act.sa_mask);
+        _ = NuttX.c.sigaddset(&act.sa_mask, NuttX.c.SIGTERM);
+
+        const sig = NuttX.c.sigaction(NuttX.c.SIGTERM, &act, null);
+        if (sig != 0) {
+            NuttX.print(global_allocator, "Failed to install SIGTERM handler, 
errno={}\n", .{sig});
+            return @intFromEnum(NuttX.exit_t.failure);
+        }
+
+        // Indicate that we are running
+        const mypid = NuttX.c.getpid();
+        g_led_daemon_started = true;
+        NuttX.print(global_allocator, "\nled_daemon (pid# {}): Running\n", 
.{mypid});
+
+        // Open the LED driver
+        NuttX.print(global_allocator, "led_daemon: Opening {s}\n", 
.{NuttX.c.CONFIG_EXAMPLES_LEDS_DEVPATH});
+        const fd = NuttX.c.open(NuttX.c.CONFIG_EXAMPLES_LEDS_DEVPATH, 
NuttX.c.O_WRONLY);
+        if (fd < 0) {
+            NuttX.print(global_allocator, "led_daemon: ERROR: Failed to open 
{s}: {}\n", .{
+                NuttX.c.CONFIG_EXAMPLES_LEDS_DEVPATH,
+                fd,
+            });
+            g_led_daemon_started = false;
+            return @intFromEnum(NuttX.exit_t.failure);
+        }
+
+        // Get the set of LEDs supported
+        var ret = NuttX.c.ioctl(fd, NuttX.c.ULEDIOC_SUPPORTED, &supported);
+        if (ret < 0) {
+            NuttX.print(global_allocator, "led_daemon: ERROR: 
ioctl(ULEDIOC_SUPPORTED) failed: {}\n", .{ret});
+            _ = NuttX.c.close(fd);
+            g_led_daemon_started = false;
+            return @intFromEnum(NuttX.exit_t.failure);
+        }
+
+        NuttX.print(global_allocator, "led_daemon: Supported LEDs {x}\n", 
.{supported});
+        supported &= NuttX.c.CONFIG_EXAMPLES_LEDS_LEDSET;
+
+        // Main loop
+        while (g_led_daemon_started) {
+            var newset: NuttX.c.userled_set_t = 0;
+            var tmp: NuttX.c.userled_set_t = 0;
+
+            if (incrementing) {
+                tmp = ledset;
+                while (newset == ledset) {
+                    tmp += 1;
+                    newset = tmp & supported;
+                }
+
+                if (newset == 0) {
+                    incrementing = false;
+                    continue;
+                }
+            } else {
+                if (ledset == 0) {
+                    incrementing = true;
+                    continue;
+                }
+
+                tmp = ledset;
+                while (newset == ledset) {
+                    tmp -= 1;
+                    newset = tmp & supported;
+                }
+            }
+
+            ledset = newset;
+            NuttX.print(global_allocator, "led_daemon: LED set {x}\n", 
.{ledset});
+
+            ret = NuttX.c.ioctl(fd, NuttX.c.ULEDIOC_SETALL, ledset);
+            if (ret < 0) {
+                NuttX.print(global_allocator, "led_daemon: ERROR: 
ioctl(ULEDIOC_SETALL) failed: {}\n", .{ret});
+                _ = NuttX.c.close(fd);
+                g_led_daemon_started = false;
+                return @intFromEnum(NuttX.exit_t.failure);
+            }
+
+            _ = NuttX.c.usleep(500 * 1000);
+        }
+
+        _ = NuttX.c.close(fd);
+        return @intFromEnum(NuttX.exit_t.success);
+    }
+
+    export fn sigterm_action(signo: c_int, siginfo: [*c]NuttX.c.siginfo_t, 
arg: ?*anyopaque) void {
+        if (signo == NuttX.c.SIGTERM) {
+            NuttX.print(global_allocator, "SIGTERM received\n", .{});
+            g_led_daemon_started = false;
+            NuttX.print(global_allocator, "led_daemon: Terminated.\n", .{});
+        } else {
+            NuttX.print(global_allocator, "\nsigterm_action: Received signo={} 
siginfo={*} arg={*}\n", .{
+                signo,
+                siginfo,
+                arg,
+            });
+        }
+    }
+};
+
+// Global allocator
+var arena = std.heap.ArenaAllocator.init(std.heap.raw_c_allocator);
+const global_allocator = arena.allocator();
+
+export fn leds_zig_main(_: c_int, _: [*][*:0]u8) NuttX.exit_t {
+    defer arena.deinit();
+
+    NuttX.print(global_allocator, "leds_main: Starting the led_daemon\n", .{});
+    if (NuttX.g_led_daemon_started) {
+        NuttX.print(global_allocator, "leds_main: led_daemon already 
running\n", .{});
+        return .success;
+    }
+
+    const ret = NuttX.c.task_create(
+        "led_daemon",
+        NuttX.c.CONFIG_EXAMPLES_LEDS_PRIORITY,
+        NuttX.c.CONFIG_EXAMPLES_LEDS_STACKSIZE,
+        NuttX.led_daemon,
+        null,
+    );
+    if (ret < 0) {
+        NuttX.print(global_allocator, "leds_main: ERROR: Failed to start 
led_daemon: {}\n", .{ret});
+        return .failure;
+    }
+
+    NuttX.print(global_allocator, "leds_main: led_daemon started\n", .{});
+    return .success;
+}

Reply via email to