From 1a282b63a40f1a14ab577b7dcbc3bc2d47b7fe72 Mon Sep 17 00:00:00 2001 From: cfif Date: Tue, 9 Dec 2025 17:09:13 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Inc/SerialPortVirt.h | 20 +++++++++++ Src/SerialPortVirt.c | 83 ++++++++++++++++++++++++++++++++++++++++++++ modular.json | 27 ++++++++++++++ 3 files changed, 130 insertions(+) create mode 100644 Inc/SerialPortVirt.h create mode 100644 Src/SerialPortVirt.c create mode 100644 modular.json diff --git a/Inc/SerialPortVirt.h b/Inc/SerialPortVirt.h new file mode 100644 index 0000000..927e723 --- /dev/null +++ b/Inc/SerialPortVirt.h @@ -0,0 +1,20 @@ +// +// Created by CFIF on 13.11.22. +// + +#ifndef UVEOS_ON_NATION_SERIALPORTVIRT_H +#define UVEOS_ON_NATION_SERIALPORTVIRT_H + +#include +#include +#include + +typedef struct { + osMessageQueueId_t queue; +} tSerialPortVirt; + +void SerialPortVirt_Init(tSerialPortVirt *env, uint16_t queueBufferLen); + +tSerialPortIO SerialPortVirt_GetIo(tSerialPortVirt *env); + +#endif //UVEOS_ON_NATION_SERIALPORTVIRT_H diff --git a/Src/SerialPortVirt.c b/Src/SerialPortVirt.c new file mode 100644 index 0000000..f7c6381 --- /dev/null +++ b/Src/SerialPortVirt.c @@ -0,0 +1,83 @@ +// +// Created by CFIF on 13.11.22. +// +#include "SerialPortVirt.h" + +void SerialPortVirt_Init(tSerialPortVirt *env, uint16_t queueBufferLen) { + env->queue = osMessageQueueNew(queueBufferLen, 1, NULL); +} + +static uint16_t vSerialPortReceiveQueue(uint8_t *data, uint16_t size, uint32_t timeout, osMessageQueueId_t queueId) { + uint16_t received = 0; + + uint32_t endMs = SystemGetMs() + timeout; + uint32_t leftMs; + + uint16_t granted = 0; + + if (!timeout) { + granted = osMessageQueueGetCount(queueId); + } + + while (size && (((timeout == SystemWaitForever) || (endMs > SystemGetMs())) || (received < granted))) { + leftMs = endMs - SystemGetMs(); + if (osMessageQueueGet(queueId, data, NULL, leftMs) == osOK) { + --size; + ++received; + ++data; + } else if (timeout == 0) { + return received; + } + } + + return received; +} + +static uint16_t vSerialPortReceive(tSerialPortVirt *env, uint8_t *data, uint16_t size, uint32_t timeout) { + return vSerialPortReceiveQueue(data, size, timeout, env->queue); +} + +static uint16_t vSerialPortTransmitQueue(uint8_t *data, uint16_t size, uint32_t timeout, osMessageQueueId_t queueId) { + uint16_t sent = 0; + + uint32_t endMs = SystemGetMs() + timeout; + uint32_t leftMs; + + uint16_t granted = 0; + + if (!timeout) { + granted = osMessageQueueGetSpace(queueId); + } + + while (size && (((timeout == SystemWaitForever) || (endMs > SystemGetMs())) || (sent < granted))) { + + if (timeout == SystemWaitForever) { + leftMs = SystemWaitForever; + } else { + leftMs = endMs - SystemGetMs(); + } + + if (osMessageQueuePut(queueId, data, 0x00, leftMs) == osOK) { + --size; + ++sent; + ++data; + } else if (timeout == 0) { + return sent; + } + } + return sent; +} + + +static uint16_t vSerialPortTransmit(tSerialPortVirt *env, uint8_t *data, uint16_t size, uint32_t timeout) { + return vSerialPortTransmitQueue(data, size, timeout, env->queue); +} + +tSerialPortIO SerialPortVirt_GetIo(tSerialPortVirt *env) { + tSerialPortIO io = { + .env = env, + .receive = (SerialPortIOTransaction) vSerialPortReceive, + .transmit = (SerialPortIOTransaction) vSerialPortTransmit + }; + return io; +} diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..2f8ada0 --- /dev/null +++ b/modular.json @@ -0,0 +1,27 @@ +{ + "dep": [ + { + "type": "git", + "provider": "HVAC_M7", + "repo": "CmsisRtosInterface" + }, + { + "type": "git", + "provider": "HVAC_M7", + "repo": "SerialPortInterface" + }, + { + "type": "git", + "provider": "HVAC_M7", + "repo": "SystemDelayInterface" + } + ], + "cmake": { + "inc_dirs": [ + "Inc/" + ], + "srcs": [ + "Src/**.c" + ] + } +} \ No newline at end of file