128 lines
3.7 KiB
C
128 lines
3.7 KiB
C
//
|
||
// Created by CFIF 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) {}
|
||
}
|