From 3593d1099aa45f3044acace142ab9a0562ee9b96 Mon Sep 17 00:00:00 2001 From: cfif Date: Tue, 23 Sep 2025 17:12:44 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Inc/CliCmd.h | 58 +++++++++++++++++++++++ Src/CliCmd.c | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++ modular.json | 27 +++++++++++ 3 files changed, 212 insertions(+) create mode 100644 Inc/CliCmd.h create mode 100644 Src/CliCmd.c create mode 100644 modular.json diff --git a/Inc/CliCmd.h b/Inc/CliCmd.h new file mode 100644 index 0000000..2f38db5 --- /dev/null +++ b/Inc/CliCmd.h @@ -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 diff --git a/Src/CliCmd.c b/Src/CliCmd.c new file mode 100644 index 0000000..bc86ded --- /dev/null +++ b/Src/CliCmd.c @@ -0,0 +1,127 @@ +// +// Created by xemon 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) {} +} diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..7706be2 --- /dev/null +++ b/modular.json @@ -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" + ] + } +} \ No newline at end of file