Добавлены интерфейсы и драйверы
This commit is contained in:
commit
1eabde691f
|
|
@ -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
|
||||||
|
|
@ -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) {}
|
||||||
|
}
|
||||||
|
|
@ -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"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue