Обновление
This commit is contained in:
commit
1a282b63a4
|
|
@ -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
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue