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

This commit is contained in:
cfif 2025-09-30 15:52:33 +03:00
commit 1eabde691f
3 changed files with 212 additions and 0 deletions

58
Inc/CliCmd.h Normal file
View File

@ -0,0 +1,58 @@
//
// Created by xemon on 14.11.22.
//
#ifndef UVEOS_ON_NATION_CLICMD_H
#define UVEOS_ON_NATION_CLICMD_H
#include "SerialPort.h"
#include "stdbool.h"
#include "stddef.h"
typedef struct {
struct {
char *data;
size_t limit;
char *begin;
size_t length;
} rxLine;
tSerialPortIO *serialCommandPort;
} tCliCmd;
void CliCmd_Init(tCliCmd *env, tSerialPortIO *io, uint8_t *data, size_t dataLen);
#define CliCmd_InitStatic(ENV, IO, DATA) CliCmd_Init(ENV,IO,DATA,sizeof(DATA));
void CliCmd_WaitLine(tCliCmd *env);
void CliCmd_Print(tCliCmd *cli, char *text, uint16_t len);
void CliCmd_PrintHex(tCliCmd *cli, uint8_t *data, uint16_t byteLen);
char *CliCmd_RxLineBegin(tCliCmd *cli);
char *CliCmd_RxLineEnd(tCliCmd *cli);
size_t CliCmd_RxLineLength(tCliCmd *cli);
char *CliCmd_RxStartsWith(tCliCmd *cli, char *text, uint16_t len);
void CliCmd_RxSkipSpace(tCliCmd *cli);
void CliCmd_RxSkipTo(tCliCmd *cli, char *next);
void CliCmd_WaitLineDelay(tCliCmd *env, uint32_t delay);
void CliCmd_RxSkip(tCliCmd *cli, size_t len);
#define CliCmd_PrintStatic(CLI, STR) CliCmd_Print(CLI,STR,sizeof(STR)-1)
#define CliCmd_PrintLnStatic(CLI, STR) CliCmd_PrintStatic(CLI,(STR "\r\n"))
#define CliCmd_PrintSpStatic(CLI, STR) CliCmd_PrintStatic(CLI,(STR " "))
// 1 если STR присутствует первым блоком в cli->data
#define CliCmd_RxStartsWithStatic(CLI, STR) CliCmd_RxStartsWith(CLI,(STR),sizeof(STR) - 1)
#endif //UVEOS_ON_NATION_CLICMD_H

127
Src/CliCmd.c Normal file
View File

@ -0,0 +1,127 @@
//
// Created by xemon on 14.11.22.
//
#include <string.h>
#include "CliCmd.h"
#include "AsciiStringParsingUtils.h"
#include "AsciiStringAssmeblingUtils.h"
#include "SystemDelayInterface.h"
void CliCmd_Init(tCliCmd *env, tSerialPortIO *io, uint8_t *data, size_t dataLen) {
env->serialCommandPort = io;
env->rxLine.limit = dataLen;
env->rxLine.data = (char *) data;
vAsciiStringInit(env->rxLine.data, &env->rxLine.length, env->rxLine.limit);
env->rxLine.begin = env->rxLine.data;
}
void CliCmd_WaitLine(tCliCmd *env) {
//чистим буфер
//получаем строку
//печатаем ее в ответ
SerialPortClearRxBuffer(env->serialCommandPort);
vAsciiStringClean(env->rxLine.data, &env->rxLine.length);
env->rxLine.length = SerialPortReceiveTo(
env->serialCommandPort,
(uint8_t *) env->rxLine.data,
env->rxLine.limit,
'\n',
SystemWaitForever
);
env->rxLine.begin = env->rxLine.data;
if (env->rxLine.length && (*(CliCmd_RxLineEnd(env) - 2) == '\n')) {
--env->rxLine.length;
}
CliCmd_Print(env, CliCmd_RxLineBegin(env), CliCmd_RxLineLength(env));
}
void CliCmd_WaitLineDelay(tCliCmd *env, uint32_t delay) {
//чистим буфер
//получаем строку
//печатаем ее в ответ
SerialPortClearRxBuffer(env->serialCommandPort);
vAsciiStringClean(env->rxLine.data, &env->rxLine.length);
env->rxLine.length = SerialPortReceiveTo(
env->serialCommandPort,
(uint8_t *) env->rxLine.data,
env->rxLine.limit,
'\n',
delay
);
env->rxLine.begin = env->rxLine.data;
if (env->rxLine.length && (*(CliCmd_RxLineEnd(env) - 2) == '\n')) {
--env->rxLine.length;
}
CliCmd_Print(env, CliCmd_RxLineBegin(env), CliCmd_RxLineLength(env));
}
void CliCmd_ClearRx(tCliCmd *env) {
SerialPortClearRxBuffer(env->serialCommandPort);
vAsciiStringClean(env->rxLine.data, &env->rxLine.length);
}
bool CliCmd_HasCompleteLine(tCliCmd *env) {
env->rxLine.length = SerialPortReceiveTo(
env->serialCommandPort,
(uint8_t *) env->rxLine.begin,
env->rxLine.limit,
'\n',
0
);
env->rxLine.begin = env->rxLine.data;
if (env->rxLine.length && (*(CliCmd_RxLineEnd(env) - 2) == '\n')) {
--env->rxLine.length;
}
CliCmd_Print(env, CliCmd_RxLineBegin(env), CliCmd_RxLineLength(env));
}
void CliCmd_Print(tCliCmd *cli, char *text, uint16_t len) {
SerialPortTransmit(cli->serialCommandPort, (uint8_t *) text, len, SystemWaitForever);
}
void CliCmd_PrintHex(tCliCmd *cli, uint8_t *data, uint16_t byteLen) {
char hexString[byteLen * 2];
size_t len = 0;
vAsciiStringAddBytesAsHex(hexString, &len, data, byteLen);
CliCmd_Print(cli, hexString, len);
}
char *CliCmd_RxLineBegin(tCliCmd *cli) {
return cli->rxLine.begin;
}
char *CliCmd_RxLineEnd(tCliCmd *cli) {
return cli->rxLine.data + cli->rxLine.length;
}
size_t CliCmd_RxLineLength(tCliCmd *cli) {
return CliCmd_RxLineEnd(cli) - CliCmd_RxLineBegin(cli);
}
char *CliCmd_RxStartsWith(tCliCmd *cli, char *text, uint16_t len) {
//смотрим что у нас в начале буфера
return strnstr(CliCmd_RxLineBegin(cli), text, len);
}
void CliCmd_RxSkipTo(tCliCmd *cli, char *next) {
if ((next < CliCmd_RxLineEnd(cli)) && (next > CliCmd_RxLineBegin(cli))) {
cli->rxLine.begin = next;
}
}
void CliCmd_RxSkip(tCliCmd *cli, size_t len) {
cli->rxLine.begin += len;
}
void CliCmd_RxSkipSpace(tCliCmd *cli) {
char *end = CliCmd_RxLineEnd(cli);
for (; cli->rxLine.begin < end && *cli->rxLine.begin == ' '; ++cli->rxLine.begin) {}
}

27
modular.json Normal file
View File

@ -0,0 +1,27 @@
{
"dep": [
{
"type": "git",
"provider": "HVAC_M7",
"repo": "SerialPort"
},
{
"type": "git",
"provider": "HVAC_M7",
"repo": "AsciiStringParsingUtils"
},
{
"type": "git",
"provider": "HVAC_M7",
"repo": "AsciiStringAssemblingUtils"
}
],
"cmake": {
"inc_dirs": [
"Inc"
],
"srcs": [
"Src/**.c"
]
}
}