From ee5b62a14e339e058de58eab354fa626111b3b3d Mon Sep 17 00:00:00 2001 From: Kuba Kleczkowski Date: Wed, 5 May 2021 12:11:46 +0200 Subject: [PATCH] [EGD-6651] Fix communication with modem on Linux Fixed cellular bsp on Linux, so now emulator is able to comunicate with modem. Fixed memory leak in CellularResult struct. --- module-bsp/board/linux/cellular/linux_cellular.cpp | 12 +++++++++--- module-bsp/bsp/cellular/CellularResult.hpp | 6 +++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/module-bsp/board/linux/cellular/linux_cellular.cpp b/module-bsp/board/linux/cellular/linux_cellular.cpp index 5b1f0dccacf011ed2392a5e6814a05510a354a7b..b57887ddd95d83976594b744953ef2d7a5075bf0 100644 --- a/module-bsp/board/linux/cellular/linux_cellular.cpp +++ b/module-bsp/board/linux/cellular/linux_cellular.cpp @@ -2,6 +2,7 @@ // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "linux_cellular.hpp" +#include #include #include @@ -101,17 +102,22 @@ namespace bsp cpp_freertos::LockGuard lock(serOutMutex); + auto buffer = static_cast(buf); + int ret; for (;;) { - ret = ::read(fd, buf, nbytes); + ret = ::read(fd, buffer->data, nbytes); if (ret != -1 || errno != EINTR) break; } - + if (ret > 0) { + buffer->resultCode = bsp::cellular::CellularResultCode::ReceivedAndIdle; + buffer->dataSize = ret; + } #if _LINUX_UART_DEBUG if (ret > 0) { LOG_PRINTF("[RX] "); - uint8_t *ptr = (uint8_t *)buf; + uint8_t *ptr = (uint8_t *)buffer->data; for (size_t i = 0; i < ret; i++) LOG_PRINTF("%02X ", (uint8_t)*ptr++); LOG_PRINTF("\n"); diff --git a/module-bsp/bsp/cellular/CellularResult.hpp b/module-bsp/bsp/cellular/CellularResult.hpp index 849a9093064adf31693f992fc560966cd4d9bdae..e9ef77b19a78bdba160196b9e7eb29ed084b62aa 100644 --- a/module-bsp/bsp/cellular/CellularResult.hpp +++ b/module-bsp/bsp/cellular/CellularResult.hpp @@ -48,9 +48,9 @@ namespace bsp::cellular CellularResultCode resultCode = CellularResultCode::Uninitialized; std::vector data; - [[nodiscard]] auto serialize() const -> std::unique_ptr + [[nodiscard]] auto serialize() const -> std::unique_ptr { - auto serialized = std::unique_ptr(new uint8_t[data.size() + sizeof(resultCode)]); + auto serialized = std::make_unique< uint8_t[]>(data.size() + sizeof(resultCode)); serialized.get()[0] = static_cast(resultCode); if (data.size() > 0) { @@ -126,7 +126,7 @@ namespace bsp::cellular return &result; } - auto getSerialized() const -> std::unique_ptr + auto getSerialized() const -> std::unique_ptr { return result.serialize(); }