Начало
This commit is contained in:
commit
3593d1099a
|
|
@ -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_DEV",
|
||||
"repo": "SerialPort"
|
||||
},
|
||||
{
|
||||
"type": "git",
|
||||
"provider": "HVAC_DEV",
|
||||
"repo": "AsciiStringParsingUtils"
|
||||
},
|
||||
{
|
||||
"type": "git",
|
||||
"provider": "HVAC_DEV",
|
||||
"repo": "AsciiStringAssemblingUtils"
|
||||
}
|
||||
],
|
||||
"cmake": {
|
||||
"inc_dirs": [
|
||||
"Inc"
|
||||
],
|
||||
"srcs": [
|
||||
"Src/**.c"
|
||||
]
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue