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