// // 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; }