// // Created by CFIF on 14.11.22. // #include #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) {} }