84 lines
2.4 KiB
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;
|
|
}
|