CliCmd/Src/CliCmd.c

128 lines
3.7 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 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) {}
}