CliCmd_SerialBridge/Src/CliCmd/SerialBridge.c

84 lines
2.4 KiB
C

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