diff --git a/app/backplane/deployment_module/src/main.cpp b/app/backplane/deployment_module/src/main.cpp index 5743f5af3..67d46925f 100644 --- a/app/backplane/deployment_module/src/main.cpp +++ b/app/backplane/deployment_module/src/main.cpp @@ -6,9 +6,19 @@ #include "c_deployment_module.h" #include +#ifdef CONFIG_ARCH_POSIX +#include +#include +#endif LOG_MODULE_REGISTER(main); +#ifdef CONFIG_ARCH_POSIX +static volatile sig_atomic_t shutdownRequested = 0; + +static void NativeSimSignalHandler(int) { shutdownRequested = 1; } +#endif + int main() { static CDeploymentModule deploymentModule{}; @@ -19,9 +29,16 @@ int main() { NRtos::StartRtos(); #ifdef CONFIG_ARCH_POSIX - k_sleep(K_SECONDS(900)); + signal(SIGINT, NativeSimSignalHandler); + signal(SIGTERM, NativeSimSignalHandler); + + while (!shutdownRequested) { + k_sleep(K_MSEC(100)); + } + NRtos::StopRtos(); deploymentModule.Cleanup(); + nsi_exit(0); #endif return 0; diff --git a/app/backplane/power_module/src/main.cpp b/app/backplane/power_module/src/main.cpp index 2bcc0d29c..23bdaffda 100644 --- a/app/backplane/power_module/src/main.cpp +++ b/app/backplane/power_module/src/main.cpp @@ -9,9 +9,19 @@ #include #include #include +#ifdef CONFIG_ARCH_POSIX +#include +#include +#endif LOG_MODULE_REGISTER(main); +#ifdef CONFIG_ARCH_POSIX +static volatile sig_atomic_t shutdownRequested = 0; + +static void NativeSimSignalHandler(int) { shutdownRequested = 1; } +#endif + int main() { static CPowerModule powerModule{}; @@ -22,10 +32,16 @@ int main() { NRtos::StartRtos(); #ifdef CONFIG_ARCH_POSIX - k_sleep(K_SECONDS(300)); + signal(SIGINT, NativeSimSignalHandler); + signal(SIGTERM, NativeSimSignalHandler); + + while (!shutdownRequested) { + k_sleep(K_MSEC(100)); + } + NRtos::StopRtos(); powerModule.Cleanup(); - k_sleep(K_FOREVER); + nsi_exit(0); #endif return 0; diff --git a/app/backplane/radio_module/src/main.cpp b/app/backplane/radio_module/src/main.cpp index 6c90df8a1..1f16a55cb 100644 --- a/app/backplane/radio_module/src/main.cpp +++ b/app/backplane/radio_module/src/main.cpp @@ -8,9 +8,19 @@ #include #include +#ifdef CONFIG_ARCH_POSIX +#include +#include +#endif LOG_MODULE_REGISTER(main); +#ifdef CONFIG_ARCH_POSIX +static volatile sig_atomic_t shutdownRequested = 0; + +static void NativeSimSignalHandler(int) { shutdownRequested = 1; } +#endif + int main() { #ifdef CONFIG_LICENSED_FREQUENCY LOG_INF("Radio module boot: 433 MHz build, callsign=%s", CONFIG_RADIO_MODULE_CALLSIGN); @@ -28,8 +38,15 @@ int main() { NRtos::StartRtos(); #ifdef CONFIG_ARCH_POSIX - k_sleep(K_SECONDS(300)); + signal(SIGINT, NativeSimSignalHandler); + signal(SIGTERM, NativeSimSignalHandler); + + while (!shutdownRequested) { + k_sleep(K_MSEC(100)); + } + NRtos::StopRtos(); + nsi_exit(0); #endif return 0; diff --git a/app/backplane/sensor_module/boards/sensor_hw_sim.conf b/app/backplane/sensor_module/boards/sensor_hw_sim.conf index 3a5088e8f..857f9ed97 100644 --- a/app/backplane/sensor_module/boards/sensor_hw_sim.conf +++ b/app/backplane/sensor_module/boards/sensor_hw_sim.conf @@ -6,6 +6,13 @@ CONFIG_OPENROCKET_SENSORS=y CONFIG_OPENROCKET_DATA_FILE="../../../data/orksim_csv/l1.csv" CONFIG_OPENROCKET_MS_BEFORE_LAUNCH=10000 CONFIG_OPENROCKET_SCALAR_TYPE_DOUBLE=y -CONFIG_OPENROCKET_EVENT_LOG=n +CONFIG_OPENROCKET_EVENT_LOG=y CONFIG_OPENROCKET_IMU=y CONFIG_OPENROCKET_BAROMETER=y +CONFIG_OPENROCKET_MANUAL_LAUNCH_TRIGGER=y + +CONFIG_CONSOLE=y +CONFIG_CONSOLE_SUBSYS=y +CONFIG_SERIAL=y +CONFIG_UART_CONSOLE=y + diff --git a/app/backplane/sensor_module/core.conf b/app/backplane/sensor_module/core.conf index 545475b4f..3b516ef65 100644 --- a/app/backplane/sensor_module/core.conf +++ b/app/backplane/sensor_module/core.conf @@ -31,4 +31,3 @@ CONFIG_EVENTS=y CONFIG_I2C=y CONFIG_SPI=y CONFIG_SENSOR=y -CONFIG_LSM6DSL_ACCEL_FS=16 \ No newline at end of file diff --git a/app/backplane/sensor_module/include/c_ork_toggle_tenant.h b/app/backplane/sensor_module/include/c_ork_toggle_tenant.h new file mode 100644 index 000000000..24d330a7d --- /dev/null +++ b/app/backplane/sensor_module/include/c_ork_toggle_tenant.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include +#include + +class COrkToggleTenant : public CRunnableTenant { + public: + /** + * @param name Tenant name + * @param ipStr IP address to bind the UDP socket to + * @param port UDP port used to receive launch trigger packets + */ + COrkToggleTenant(const char* name, const char* ipStr, int port); + + /** + * See parent docs + */ + void Run() override; + + private: + CUdpSocket udp; + int port; +}; diff --git a/app/backplane/sensor_module/include/c_sensor_module.h b/app/backplane/sensor_module/include/c_sensor_module.h index 25fc13248..2da8544e3 100644 --- a/app/backplane/sensor_module/include/c_sensor_module.h +++ b/app/backplane/sensor_module/include/c_sensor_module.h @@ -2,6 +2,9 @@ #include "c_sensing_tenant.h" #include "flight.hpp" +#ifdef CONFIG_OPENROCKET_MANUAL_LAUNCH_TRIGGER +#include "c_ork_toggle_tenant.h" +#endif // F-Core Includes #include @@ -50,6 +53,9 @@ class CSensorModule : public CProjectConfiguration { static constexpr int telemetryBroadcastPort = NNetworkDefs::SENSOR_MODULE_TELEMETRY_PORT; static constexpr int telemetryDownlinkPort = NNetworkDefs::SENSOR_MODULE_DOWNLINK_DATA_PORT; static constexpr int alertPort = NNetworkDefs::ALERT_PORT; +#ifdef CONFIG_OPENROCKET_MANUAL_LAUNCH_TRIGGER + static constexpr int orkLaunchTriggerPort = NNetworkDefs::SENSOR_MODULE_ORK_LAUNCH_TRIGGER_PORT; +#endif // Devices CRtc rtc{*DEVICE_DT_GET(DT_ALIAS(rtc))}; @@ -82,6 +88,9 @@ class CSensorModule : public CProjectConfiguration { sensorDataLogMessagePort, K_SECONDS(3), 64}; +#ifdef CONFIG_OPENROCKET_MANUAL_LAUNCH_TRIGGER + COrkToggleTenant orkLaunchTriggerTenant{"Ork Toggle Tenant", ipAddrStr.c_str(), orkLaunchTriggerPort}; +#endif // Tasks CTask networkTask{"Networking Task", 15, 3072, 10}; diff --git a/app/backplane/sensor_module/sim.conf b/app/backplane/sensor_module/sim.conf index 995de3af1..70ecf64cf 100644 --- a/app/backplane/sensor_module/sim.conf +++ b/app/backplane/sensor_module/sim.conf @@ -1,11 +1,11 @@ # Sensors CONFIG_OPENROCKET_SENSORS=y CONFIG_OPENROCKET_DATA_FILE="../../../data/orksim_csv/l1.csv" -CONFIG_OPENROCKET_MS_BEFORE_LAUNCH=10000 CONFIG_OPENROCKET_SCALAR_TYPE_DOUBLE=y CONFIG_OPENROCKET_EVENT_LOG=y CONFIG_OPENROCKET_IMU=y CONFIG_OPENROCKET_BAROMETER=y +CONFIG_OPENROCKET_MANUAL_LAUNCH_TRIGGER=y CONFIG_RTC=y CONFIG_RTC_EMUL=y diff --git a/app/backplane/sensor_module/src/c_ork_toggle_tenant.cpp b/app/backplane/sensor_module/src/c_ork_toggle_tenant.cpp new file mode 100644 index 000000000..ad09b7837 --- /dev/null +++ b/app/backplane/sensor_module/src/c_ork_toggle_tenant.cpp @@ -0,0 +1,28 @@ +#include "c_ork_toggle_tenant.h" + +#include + +#include +#include + +LOG_MODULE_REGISTER(COrkToggleTenant); + +COrkToggleTenant::COrkToggleTenant(const char* name, const char* ipStr, const int port) + : CRunnableTenant(name), udp(CIPv4(ipStr), port, port), port(port) {} + +void COrkToggleTenant::Run() { + uint8_t trigger = 0; + const int ret = udp.ReceiveAsynchronous(&trigger, sizeof(trigger)); + if (ret <= 0) { + return; + } + + const int err = ork_trigger_launch(); + if (err == 0) { + LOG_INF("Received OpenRocket launch trigger on UDP port %d", port); + } else if (err == -EALREADY) { + LOG_WRN("Ignoring duplicate OpenRocket launch trigger on UDP port %d", port); + } else { + LOG_ERR("Failed to trigger OpenRocket launch (%d)", err); + } +} diff --git a/app/backplane/sensor_module/src/c_sensor_module.cpp b/app/backplane/sensor_module/src/c_sensor_module.cpp index 6ec72e16c..78ee35734 100644 --- a/app/backplane/sensor_module/src/c_sensor_module.cpp +++ b/app/backplane/sensor_module/src/c_sensor_module.cpp @@ -26,6 +26,9 @@ void CSensorModule::AddTenantsToTasks() { networkTask.AddTenant(broadcastTenant); networkTask.AddTenant(downlinkTelemTenant); networkTask.AddTenant(udpAlertTenant); +#ifdef CONFIG_OPENROCKET_MANUAL_LAUNCH_TRIGGER + networkTask.AddTenant(orkLaunchTriggerTenant); +#endif // Sensing sensingTask.AddTenant(sensingTenant); diff --git a/app/backplane/sensor_module/src/main.cpp b/app/backplane/sensor_module/src/main.cpp index 86e78d1ad..ff4f7ff42 100644 --- a/app/backplane/sensor_module/src/main.cpp +++ b/app/backplane/sensor_module/src/main.cpp @@ -6,6 +6,16 @@ #include "c_sensor_module.h" #include +#ifdef CONFIG_ARCH_POSIX +#include +#include +#endif + +#ifdef CONFIG_ARCH_POSIX +static volatile sig_atomic_t shutdownRequested = 0; + +static void NativeSimSignalHandler(int) { shutdownRequested = 1; } +#endif int main() { static CSensorModule sensorModule{}; @@ -17,9 +27,16 @@ int main() { NRtos::StartRtos(); #ifdef CONFIG_ARCH_POSIX - k_sleep(K_SECONDS(900)); + signal(SIGINT, NativeSimSignalHandler); + signal(SIGTERM, NativeSimSignalHandler); + + while (!shutdownRequested) { + k_sleep(K_MSEC(100)); + } + NRtos::StopRtos(); sensorModule.Cleanup(); + nsi_exit(0); #endif return 0; diff --git a/app/ground/receiver_module/src/main.cpp b/app/ground/receiver_module/src/main.cpp index 0377ec0c7..d9306baf4 100644 --- a/app/ground/receiver_module/src/main.cpp +++ b/app/ground/receiver_module/src/main.cpp @@ -10,9 +10,19 @@ #include #include #include +#ifdef CONFIG_ARCH_POSIX +#include +#include +#endif LOG_MODULE_REGISTER(main); +#ifdef CONFIG_ARCH_POSIX +static volatile sig_atomic_t shutdownRequested = 0; + +static void NativeSimSignalHandler(int) { shutdownRequested = 1; } +#endif + int main() { LOG_INF("Receiver starting"); static CReceiverModule receiverModule{}; @@ -25,8 +35,15 @@ int main() { NRtos::StartRtos(); #ifdef CONFIG_ARCH_POSIX - k_sleep(K_SECONDS(300)); + signal(SIGINT, NativeSimSignalHandler); + signal(SIGTERM, NativeSimSignalHandler); + + while (!shutdownRequested) { + k_sleep(K_MSEC(100)); + } + NRtos::StopRtos(); + nsi_exit(0); #endif return 0; diff --git a/app/payload/control_freak/flight-software/sample.yaml b/app/payload/control_freak/flight-software/sample.yaml index fc0619683..80f39d1b4 100644 --- a/app/payload/control_freak/flight-software/sample.yaml +++ b/app/payload/control_freak/flight-software/sample.yaml @@ -1,5 +1,5 @@ sample: - description: control_freak + description: Control Freak flight software name: control_freak common: build_only: true diff --git a/data/autocoder_inputs/network_defs.yaml b/data/autocoder_inputs/network_defs.yaml index 02fdd065f..a3cf11329 100644 --- a/data/autocoder_inputs/network_defs.yaml +++ b/data/autocoder_inputs/network_defs.yaml @@ -37,6 +37,8 @@ modules: id: 3 base_port: 13000 port_offsets: + ork_launch_trigger: + port_number: 999 downlink_data: port_number: 20 telemetry: diff --git a/drivers/sensor/openrocket/Kconfig b/drivers/sensor/openrocket/Kconfig index fabbcc155..f75178e0e 100644 --- a/drivers/sensor/openrocket/Kconfig +++ b/drivers/sensor/openrocket/Kconfig @@ -35,11 +35,21 @@ if OPENROCKET_SENSORS config OPENROCKET_MS_BEFORE_LAUNCH int "OpenRocket ms before launch" - depends on OPENROCKET_SENSORS + depends on OPENROCKET_SENSORS && !OPENROCKET_MANUAL_LAUNCH_TRIGGER default 1000 help Milliseconds to delay the launch from the device booting. + config OPENROCKET_MANUAL_LAUNCH_TRIGGER + bool "OpenRocket Manual Launch Trigger" + depends on OPENROCKET_SENSORS + default n + help + When enabled, the simulation does not start on a fixed delay after boot. + Instead, sensor reads return pad values until or_trigger_launch() is called + (e.g. from a ground station command). The event log thread also waits for + the trigger before beginning. + config OPENROCKET_NOISE bool "OpenRocket Sensor Noise" depends on OPENROCKET_SENSORS diff --git a/drivers/sensor/openrocket/openrocket_sensors.c b/drivers/sensor/openrocket/openrocket_sensors.c index 93a9750eb..e624d6078 100644 --- a/drivers/sensor/openrocket/openrocket_sensors.c +++ b/drivers/sensor/openrocket/openrocket_sensors.c @@ -1,6 +1,7 @@ #include "openrocket_sensors.h" #include +#include #include #include @@ -28,9 +29,29 @@ static const char* event_to_str(enum or_event_t e); static void or_event_thread_handler(void); +#ifdef CONFIG_OPENROCKET_MANUAL_LAUNCH_TRIGGER +K_THREAD_DEFINE(or_event_thread, 1024, or_event_thread_handler, NULL, NULL, NULL, 0, 0, 0); +#else K_THREAD_DEFINE(or_event_thread, 1024, or_event_thread_handler, NULL, NULL, NULL, 0, 0, CONFIG_OPENROCKET_MS_BEFORE_LAUNCH); #endif +#endif + +#ifdef CONFIG_OPENROCKET_MANUAL_LAUNCH_TRIGGER +K_SEM_DEFINE(or_launch_sem, 0, 1); +static volatile int64_t or_launch_time_us = -1; + +int or_trigger_launch(void) { + if (or_launch_time_us >= 0) { + return -EALREADY; + } + + or_launch_time_us = k_ticks_to_us_near64(k_uptime_ticks()); + LOG_INF("OpenRocket launch triggered at uptime %lld us", or_launch_time_us); + k_sem_give(&or_launch_sem); + return 0; +} +#endif int sensor_value_from_or_scalar(struct sensor_value* val, or_scalar_t inp) { #ifdef CONFIG_OPENROCKET_SCALAR_TYPE_DOUBLE @@ -51,7 +72,15 @@ or_scalar_t or_get_time(const struct or_common_params* cfg) { us = (us / cfg->sampling_period_us) * cfg->sampling_period_us; } us -= cfg->lag_time_us; +#ifdef CONFIG_OPENROCKET_MANUAL_LAUNCH_TRIGGER + int64_t launch_us = or_launch_time_us; + if (launch_us < 0) { + return -1.0; + } + us -= launch_us; +#else us -= CONFIG_OPENROCKET_MS_BEFORE_LAUNCH * 1000; +#endif return ((or_scalar_t) (us)) / 1000000.0; } @@ -113,7 +142,11 @@ static const char* event_to_str(enum or_event_t e) { return names[e]; } static void or_event_thread_handler(void) { - // This thread starts at T=0 via the zephyr thread startup time +#ifdef CONFIG_OPENROCKET_MANUAL_LAUNCH_TRIGGER + LOG_INF("OpenRocket event thread waiting for launch trigger..."); + k_sem_take(&or_launch_sem, K_FOREVER); + LOG_INF("OpenRocket launch triggered, starting event log"); +#endif or_scalar_t time = 0; unsigned int i = 0; while (i < or_events_size - 1) { diff --git a/drivers/sensor/openrocket/openrocket_sensors.h b/drivers/sensor/openrocket/openrocket_sensors.h index 13779b4ae..3b0959441 100644 --- a/drivers/sensor/openrocket/openrocket_sensors.h +++ b/drivers/sensor/openrocket/openrocket_sensors.h @@ -127,10 +127,19 @@ struct or_event_occurance_t { */ void or_get_presim(struct or_data_t* packet); +#ifdef CONFIG_OPENROCKET_MANUAL_LAUNCH_TRIGGER +/** + * @brief Trigger the start of the OpenRocket simulation. + * Records the current uptime as t=0 for sensor interpolation and unblocks + * the event log thread. Safe to call from any context. + */ +int or_trigger_launch(void); +#endif + /** * @brief fill a packet with values after the simulation * @param packet the packet of data to fill in */ void or_get_postsim(struct or_data_t* packet); -#endif \ No newline at end of file +#endif diff --git a/include/f_core/device/openrocket_launch.h b/include/f_core/device/openrocket_launch.h new file mode 100644 index 000000000..617877245 --- /dev/null +++ b/include/f_core/device/openrocket_launch.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Trigger the OpenRocket simulation launch in kernel space. + * + * This is exposed as a syscall so application/user code does not call the + * OpenRocket driver implementation directly. + * + * @retval 0 Launch trigger accepted + * @retval -EALREADY Launch was already triggered + * @retval -ENOTSUP Manual launch triggering is not enabled + */ +__syscall int ork_trigger_launch(void); + +#ifdef __cplusplus +} +#endif + +#include diff --git a/lib/f_core/device/CMakeLists.txt b/lib/f_core/device/CMakeLists.txt index 7ef6af7b3..834e50188 100644 --- a/lib/f_core/device/CMakeLists.txt +++ b/lib/f_core/device/CMakeLists.txt @@ -2,6 +2,5 @@ # SPDX-License-Identifier: Apache-2.0 zephyr_library() -FILE(GLOB sources *.cpp) +FILE(GLOB sources *.c *.cpp) zephyr_library_sources(${sources}) - diff --git a/lib/f_core/device/openrocket_launch.c b/lib/f_core/device/openrocket_launch.c new file mode 100644 index 000000000..05c73419a --- /dev/null +++ b/lib/f_core/device/openrocket_launch.c @@ -0,0 +1,18 @@ +#include + +#include +#include + +int z_impl_ork_trigger_launch(void) { +#ifdef CONFIG_OPENROCKET_MANUAL_LAUNCH_TRIGGER + return or_trigger_launch(); +#else + return -ENOTSUP; +#endif +} + +#ifdef CONFIG_USERSPACE +static inline int z_vrfy_ork_trigger_launch(void) { return z_impl_ork_trigger_launch(); } + +#include +#endif diff --git a/lib/f_core/net/transport/c_udp_socket.cpp b/lib/f_core/net/transport/c_udp_socket.cpp index b7d923de3..81c0f304d 100644 --- a/lib/f_core/net/transport/c_udp_socket.cpp +++ b/lib/f_core/net/transport/c_udp_socket.cpp @@ -20,7 +20,14 @@ CUdpSocket::CUdpSocket(const CIPv4& ipv4, uint16_t srcPort, uint16_t dstPort) : return; } -#if !defined(CONFIG_ARCH_POSIX) && !defined(CONFIG_NET_NATIVE_OFFLOADED_SOCKETS) + const int reuse = 1; + if (zsock_setsockopt(sockfd.fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) { + LOG_WRN("Failed to enable SO_REUSEADDR: %d", errno); + } + if (zsock_setsockopt(sockfd.fd, SOL_SOCKET, SO_REUSEPORT, &reuse, sizeof(reuse)) < 0) { + LOG_WRN("Failed to enable SO_REUSEPORT: %d", errno); + } + sockaddr_in addr{ .sin_family = AF_INET, .sin_port = htons(srcPort), @@ -33,9 +40,6 @@ CUdpSocket::CUdpSocket(const CIPv4& ipv4, uint16_t srcPort, uint16_t dstPort) : sockfd.fd = -1; return; } -#else - LOG_WRN("Skipping bind. Using native_sim loopback"); -#endif // Link takes around 2 seconds to come up. Wait to avoid errors when tx/rxing const uint32_t uptime = k_uptime_get_32(); @@ -53,7 +57,11 @@ CUdpSocket::~CUdpSocket() { } int CUdpSocket::TransmitSynchronous(const void* data, size_t len) { - sockaddr_in addr{ + if (sockfd.fd < 0) { + return -EBADF; + } + + const sockaddr_in addr{ .sin_family = AF_INET, .sin_port = htons(dstPort), }; @@ -68,14 +76,22 @@ int CUdpSocket::TransmitSynchronous(const void* data, size_t len) { return ret; } -int CUdpSocket::ReceiveSynchronous(void* data, size_t len, struct sockaddr* srcAddr, socklen_t* srcAddrLen) { +int CUdpSocket::ReceiveSynchronous(void* data, size_t len, sockaddr* srcAddr, socklen_t* srcAddrLen) { + if (sockfd.fd < 0) { + return -EBADF; + } + return zsock_recvfrom(sockfd.fd, data, len, 0, srcAddr, srcAddrLen); } int CUdpSocket::TransmitAsynchronous(const void* data, size_t len) { return TransmitAsynchronous(data, len, dstPort); } int CUdpSocket::TransmitAsynchronous(const void* data, size_t len, uint16_t dstPort) { - sockaddr_in addr{ + if (sockfd.fd < 0) { + return -EBADF; + } + + const sockaddr_in addr{ .sin_family = AF_INET, .sin_port = htons(dstPort), }; @@ -102,7 +118,11 @@ int CUdpSocket::TransmitAsynchronous(const void* data, size_t len, uint16_t dstP return ret; } -int CUdpSocket::ReceiveAsynchronous(void* data, size_t len, struct sockaddr* srcAddr, socklen_t* srcAddrLen) { +int CUdpSocket::ReceiveAsynchronous(void* data, size_t len, sockaddr* srcAddr, socklen_t* srcAddrLen) { + if (sockfd.fd < 0) { + return -EBADF; + } + int flags = zsock_fcntl(sockfd.fd, F_GETFL, 0); if (flags < 0) { LOG_ERR("Failed to get socket flags (%d)", flags); @@ -159,9 +179,17 @@ int CUdpSocket::RegisterSocketService(net_socket_service_desc* desc, void* userD } int CUdpSocket::SetTxTimeout(const int timeoutMillis) { + if (sockfd.fd < 0) { + return -EBADF; + } + return zsock_setsockopt(sockfd.fd, SOL_SOCKET, SO_SNDTIMEO, &timeoutMillis, sizeof(timeoutMillis)); } int CUdpSocket::SetRxTimeout(const int timeoutMillis) { + if (sockfd.fd < 0) { + return -EBADF; + } + return zsock_setsockopt(sockfd.fd, SOL_SOCKET, SO_RCVTIMEO, &timeoutMillis, sizeof(timeoutMillis)); } diff --git a/lib/f_core/os/n_rtos.cpp b/lib/f_core/os/n_rtos.cpp index 355842538..fa1ef1e43 100644 --- a/lib/f_core/os/n_rtos.cpp +++ b/lib/f_core/os/n_rtos.cpp @@ -6,14 +6,21 @@ #include "f_core/os/n_rtos.h" -#include "f_core/utils/c_hashmap.h" - #include #include LOG_MODULE_REGISTER(NRtos); std::vector tasks; -CHashMap taskNameIdMap; + +static CTask* FindTaskByName(const std::string& taskName) { + for (CTask* task : tasks) { + if (taskName == task->GetName()) { + return task; + } + } + + return nullptr; +} void NRtos::AddTask(CTask& task) { tasks.push_back(&task); } @@ -21,8 +28,6 @@ void NRtos::StartRtos() { for (CTask* task : tasks) { LOG_INF("Starting task %s", task->GetName()); task->Initialize(); - k_tid_t taskId = task->GetTaskId(); - taskNameIdMap.Insert(std::string(k_thread_name_get(taskId)), taskId); } LOG_INF("RTOS Started!"); @@ -41,8 +46,8 @@ void NRtos::StopRtos() { void NRtos::ResumeTask(k_tid_t taskId) { k_thread_resume(taskId); } void NRtos::ResumeTask(const std::string& taskName) { - if (taskNameIdMap.Contains(taskName)) { - k_thread_resume(taskNameIdMap.Get(taskName).value()); + if (CTask* task = FindTaskByName(taskName)) { + k_thread_resume(task->GetTaskId()); } else { LOG_WRN("Cannot resume %s, because task was not found in map!", taskName.c_str()); } @@ -51,8 +56,8 @@ void NRtos::ResumeTask(const std::string& taskName) { void NRtos::SuspendTask(k_tid_t taskId) { k_thread_suspend(taskId); } void NRtos::SuspendTask(const std::string& taskName) { - if (taskNameIdMap.Contains(taskName)) { - k_thread_suspend(taskNameIdMap.Get(taskName).value()); + if (CTask* task = FindTaskByName(taskName)) { + k_thread_suspend(task->GetTaskId()); } else { LOG_WRN("Cannot suspend %s, because task was not found in map!", taskName.c_str()); } diff --git a/snippets/sim-periph/sim-periph.conf b/snippets/sim-periph/sim-periph.conf index d477cbc3d..7a120a0c9 100644 --- a/snippets/sim-periph/sim-periph.conf +++ b/snippets/sim-periph/sim-periph.conf @@ -6,7 +6,6 @@ CONFIG_FUSE_LIBRARY_V3=y CONFIG_RTC_EMUL=y # Networking -CONFIG_ETH_NATIVE_POSIX=n CONFIG_NET_SOCKETS_OFFLOAD=y CONFIG_NET_NATIVE_OFFLOADED_SOCKETS=y CONFIG_HEAP_MEM_POOL_SIZE=1024