From 8459aa58ac1370a6e78e87a474c46d8fb2e4d2df Mon Sep 17 00:00:00 2001 From: cfif Date: Wed, 4 Dec 2024 13:10:49 +0300 Subject: [PATCH] Init --- Inc/CliCmd/SerialBridge.h | 33 ++++++++++++++++ Src/CliCmd/SerialBridge.c | 83 +++++++++++++++++++++++++++++++++++++++ modular.json | 23 +++++++++++ 3 files changed, 139 insertions(+) create mode 100644 Inc/CliCmd/SerialBridge.h create mode 100644 Src/CliCmd/SerialBridge.c create mode 100644 modular.json diff --git a/Inc/CliCmd/SerialBridge.h b/Inc/CliCmd/SerialBridge.h new file mode 100644 index 0000000..a598daa --- /dev/null +++ b/Inc/CliCmd/SerialBridge.h @@ -0,0 +1,33 @@ +// +// Created by zemon on 17.11.22. +// + +#ifndef UVEOS_ON_NATION_CLISERIALBRIDGE_H +#define UVEOS_ON_NATION_CLISERIALBRIDGE_H + +#include "CliCmd.h" +#include "CmsisRtosThreadUtils.h" + + +typedef struct { + tSerialPortIO *serialCommandPort; + tSerialPortIO *serialSnifferPort; + + struct { + osThreadId_t id; + uint32_t stack[182]; + StaticTask_t controlBlock; + osThreadAttr_t attr; + } thread; + +} tCliCmdSerialBridge; + +void CliCmdSerialBridge_Help(void *env, tCliCmd *cli); + +//инифиализация обработчика +void CliCmdSerialBridge_Init(tCliCmdSerialBridge *env, tSerialPortIO *serialSnifferPort); + +//обработка команды +int32_t CliCmdSerialBridge_Process(tCliCmdSerialBridge *env, tCliCmd *cliCmd); + +#endif //UVEOS_ON_NATION_CLISERIALBRIDGE_H diff --git a/Src/CliCmd/SerialBridge.c b/Src/CliCmd/SerialBridge.c new file mode 100644 index 0000000..111834b --- /dev/null +++ b/Src/CliCmd/SerialBridge.c @@ -0,0 +1,83 @@ +// +// Created by zemon on 18.11.22. +// + + +#include "CliCmd/SerialBridge.h" +#include "SystemDelayInterface.h" + +static _Noreturn void CliCmdSerialBridge_SniffToCmdThread(tCliCmdSerialBridge *env) { + uint8_t data; + for (;;) { + SerialPortReceive(env->serialSnifferPort, &data, 1, SystemWaitForever); + SerialPortTransmit(env->serialCommandPort, &data, 1, SystemWaitForever); + } +} + +static void CliCmdSerialBridge_StartThread(tCliCmdSerialBridge *env) { + if (!env->thread.id) { + env->thread.id = osThreadNew( + (osThreadFunc_t) (CliCmdSerialBridge_SniffToCmdThread), + (void *) (env), + &env->thread.attr + ); + } else { + osThreadResume(env->thread.id); + } +} + +static void CliCmdSerialBridge_StopThread(tCliCmdSerialBridge *env) { + if (!env->thread.id) { + osThreadSuspend(env->thread.id); + } +} + +void CliCmdSerialBridge_Help(void *env, tCliCmd *cli) { + CliCmd_PrintLnStatic(cli, " access sub commands:"); + CliCmd_PrintLnStatic(cli, " access all AT command for gnss devices..."); + CliCmd_PrintLnStatic(cli, " command [ help ] - help this as sub mode"); + CliCmd_PrintLnStatic(cli, " command [ exit ] - exit as this sub mode"); + CliCmd_PrintLnStatic(cli, ""); +} + +int32_t CliCmdSerialBridge_Process(tCliCmdSerialBridge *env, tCliCmd *cliCmd) { + CliCmd_PrintLnStatic(cliCmd, "THIS MODE GNSS AT COMMAND"); + + env->serialCommandPort = cliCmd->serialCommandPort; + CliCmdSerialBridge_StartThread(env); + + for (;;) { + CliCmd_WaitLine(cliCmd); + + SerialPortTransmit( + env->serialSnifferPort, + (uint8_t *) cliCmd->rxLine.data, + cliCmd->rxLine.length, + SystemWaitForever + ); + + if (CliCmd_RxStartsWithStatic(cliCmd, "exit")) { + CliCmd_PrintLnStatic(cliCmd, "exiting as gnss mode"); + CliCmdSerialBridge_StopThread(env); + return 0; + } + if (CliCmd_RxStartsWithStatic(cliCmd, "help")) { + CliCmdSerialBridge_Help(NULL, cliCmd); + } + } +} + +void CliCmdSerialBridge_Init(tCliCmdSerialBridge *env, tSerialPortIO *serialSnifferPort) { + InitThreadAtrStatic( + &env->thread.attr, + "CliSeBrSniff", + env->thread.controlBlock, + env->thread.stack, + osPriorityNormal + ); + env->thread.id = 0; + + + env->serialSnifferPort = serialSnifferPort; + env->serialCommandPort = NULL; +} diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..a4a48c0 --- /dev/null +++ b/modular.json @@ -0,0 +1,23 @@ +{ + "dep": [ + { + "type": "git", + "provider": "NAVIGATOR_UVEOS_NATION_TELIT", + "repo": "CmsisCore5" + }, + { + "type": "git", + "provider": "NAVIGATOR_UVEOS_NATION_TELIT", + "repo": "CliCmd" + } + ], + "cmake": { + "inc_dirs": [ + "Inc" + ], + "srcs": [ + "Src/**.c" + ] + } + +} \ No newline at end of file