commit 5231bed8de9536ab2b8503ee36331d77df935144 Author: cfif Date: Mon Jun 2 13:26:40 2025 +0300 Init diff --git a/Inc/SerialPortP2p.h b/Inc/SerialPortP2p.h new file mode 100644 index 0000000..0d41190 --- /dev/null +++ b/Inc/SerialPortP2p.h @@ -0,0 +1,23 @@ +// +// Created by xemon on 13.11.22. +// + +#ifndef UVEOS_ON_NATION_SERIALPORTP2P_H +#define UVEOS_ON_NATION_SERIALPORTP2P_H + +#include +#include +#include + +typedef struct { + osMessageQueueId_t firstToSecondQueue; + osMessageQueueId_t secondToFirstQueue; +} tSerialPortP2p; + +void SerialPortP2p_Init(tSerialPortP2p *env, uint16_t firstToSecondBufferLen, uint16_t secondToFirstBufferLen); + +tSerialPortIO SerialPortP2p_GetIoFirst(tSerialPortP2p *env); + +tSerialPortIO SerialPortP2p_GetIoSecond(tSerialPortP2p *env); + +#endif //UVEOS_ON_NATION_SERIALPORTP2P_H diff --git a/Src/SerialPortP2p.c b/Src/SerialPortP2p.c new file mode 100644 index 0000000..044c1c2 --- /dev/null +++ b/Src/SerialPortP2p.c @@ -0,0 +1,101 @@ +// +// Created by xemon on 13.11.22. +// +#include "SerialPortP2p.h" + +void SerialPortP2p_Init(tSerialPortP2p *env, uint16_t firstToSecondBufferLen, uint16_t secondToFirstBufferLen) { + env->firstToSecondQueue = osMessageQueueNew(firstToSecondBufferLen, 1, NULL); + env->secondToFirstQueue = osMessageQueueNew(secondToFirstBufferLen, 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 vSerialPortReceiveFirst(tSerialPortP2p *env, uint8_t *data, uint16_t size, uint32_t timeout) { + return vSerialPortReceiveQueue(data, size, timeout, env->secondToFirstQueue); +} + +static uint16_t vSerialPortReceiveSecond(tSerialPortP2p *env, uint8_t *data, uint16_t size, uint32_t timeout) { + return vSerialPortReceiveQueue(data, size, timeout, env->firstToSecondQueue); +} + +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 vSerialPortTransmitFirst(tSerialPortP2p *env, uint8_t *data, uint16_t size, uint32_t timeout) { + return vSerialPortTransmitQueue(data, size, timeout, env->firstToSecondQueue); +} + +static uint16_t vSerialPortTransmitSecond(tSerialPortP2p *env, uint8_t *data, uint16_t size, uint32_t timeout) { + return vSerialPortTransmitQueue(data, size, timeout, env->secondToFirstQueue); +} + +tSerialPortIO SerialPortP2p_GetIoFirst(tSerialPortP2p *env) { + tSerialPortIO io = { + .env = env, + .receive = (SerialPortIOTransaction) vSerialPortReceiveFirst, + .transmit = (SerialPortIOTransaction) vSerialPortTransmitFirst + }; + return io; +} + +tSerialPortIO SerialPortP2p_GetIoSecond(tSerialPortP2p *env) { + tSerialPortIO io = { + .env = env, + .receive = (SerialPortIOTransaction) vSerialPortReceiveSecond, + .transmit = (SerialPortIOTransaction) vSerialPortTransmitSecond + }; + return io; +} \ No newline at end of file diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..e9b2532 --- /dev/null +++ b/modular.json @@ -0,0 +1,27 @@ +{ + "dep": [ + { + "type": "git", + "provider": "Smart_Components_Aurus", + "repo": "CmsisRtosInterface" + }, + { + "type": "git", + "provider": "Smart_Components_Aurus", + "repo": "SerialPortInterface" + }, + { + "type": "git", + "provider": "Smart_Components_Aurus", + "repo": "SystemDelayInterface" + } + ], + "cmake": { + "inc_dirs": [ + "Inc/" + ], + "srcs": [ + "Src/**.c" + ] + } +} \ No newline at end of file