commit 1a282b63a40f1a14ab577b7dcbc3bc2d47b7fe72 Author: cfif Date: Tue Dec 9 17:09:13 2025 +0300 Обновление 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