Добавлены интерфейсы и драйверы

This commit is contained in:
cfif 2025-09-29 11:21:51 +03:00
commit c624928b78
3 changed files with 151 additions and 0 deletions

23
Inc/SerialPortP2p.h Normal file
View File

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

101
Src/SerialPortP2p.c Normal file
View File

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

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