Обновление

This commit is contained in:
cfif 2025-12-09 17:09:13 +03:00
commit 1a282b63a4
3 changed files with 130 additions and 0 deletions

20
Inc/SerialPortVirt.h Normal file
View File

@ -0,0 +1,20 @@
//
// Created by CFIF on 13.11.22.
//
#ifndef UVEOS_ON_NATION_SERIALPORTVIRT_H
#define UVEOS_ON_NATION_SERIALPORTVIRT_H
#include <cmsis_os.h>
#include <SerialPortIO.h>
#include <SystemDelayInterface.h>
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

83
Src/SerialPortVirt.c Normal file
View File

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

27
modular.json Normal file
View File

@ -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"
]
}
}