This commit is contained in:
cfif 2024-12-04 13:10:49 +03:00
commit 8459aa58ac
3 changed files with 139 additions and 0 deletions

33
Inc/CliCmd/SerialBridge.h Normal file
View File

@ -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

83
Src/CliCmd/SerialBridge.c Normal file
View File

@ -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;
}

23
modular.json Normal file
View File

@ -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"
]
}
}