UveosOnNation_VEGA_CLI/ComandLineInterface.c

99 lines
3.4 KiB
C

//
// Created by zemon on 24.10.22.
//
#include "CliPrivate.h"
#include "SystemDelayInterface.h"
#include "AsciiStringParsingUtils.h"
#include "stream.h"
#include "EraGlonassUveos.h"
#include "CliCmd/NetGsmUpDown.h"
#include "PowerManagement.h"
void Cli_Init(
tCli *env,
tSerialPortIO *serial,
tSerialPortIO *serialSniffer,
tVariablesTable *extTable,
tCarFlipDetection *tFlip,
tEraGlonassMsdTable *msdTable,
tUveosEmergencySimulationInterface *uvEmrgSimInter,
tUserInputButtonWatcher *userIntButtWatch,
tEraGlonassUveosDumperInterface *dumperInterface,
tPowerManagement *power,
tGsmWithGnss *gsmWithGnss,
tEraGlonassUveos *uveos
) {
env->serialCommandPort = serial;
env->serialSnifferPort = serialSniffer;
env->externTable = extTable;
CliCmd_InitStatic(&env->cmd, serial, env->mem.cmdRxLine);
CliRedirectionTable_InitStatic(&env->redirectTable, env->mem.commandPrefixes);
CliCmdMsdTable_Init(&env->sub.msdTab, msdTable, dumperInterface);
CliCmd_FlipSettingInit(&env->sub.flipSet, tFlip, extTable);
CliCmd_AddInfoInit(&env->sub.addFunc, gsmWithGnss, uveos, power);
CliCmd_EcoolSimulationInit(
&env->sub.uvEmrgSimInter,
uvEmrgSimInter,
userIntButtWatch,
msdTable->items->msd.MSD_Data.additionalData.asi15,
tFlip->current.angleCos,
gsmWithGnss
);
if (serialSniffer != NULL) {
CliCmdSerialBridge_Init(&env->sub.serialBridge, serialSniffer);
CliRedirectionTable_RecAddStatic(
&env->redirectTable,
"gnss_mode",
(cliCall) CliCmdSerialBridge_Process,
&env->sub.serialBridge
);
}
CliRedirectionTable_RecAddStatic(
&env->redirectTable,
"msd_info", (cliCall)
CliCmdMsdTable_Process,
&env->sub.msdTab
);
CliRedirectionTable_RecAddStatic(&env->redirectTable, "help", (cliCall) CliCmd_baseCommandHelp, NULL);
CliRedirectionTable_RecAddStatic(&env->redirectTable, "set_flip", (cliCall) CliCmd_FlipSetting, &env->sub.flipSet);
CliRedirectionTable_RecAddStatic(&env->redirectTable, "addFun", (cliCall) CliCmd_AddInfo, &env->sub.addFunc);
// CliRedirectionTable_RecAddStatic(&env->redirectTable, "setting", (cliCall) CliCmd_ChangeListVar, extTable);
CliRedirectionTable_RecAddStatic(&env->redirectTable, "reboot", (cliCall) CliCmd_CmsisReboot, NULL);
CliRedirectionTable_RecAddStatic(&env->redirectTable, "emerTest", (cliCall) CliCmd_EcoolSimulation,
&env->sub.uvEmrgSimInter);
//Инициализируем поток
InitThreadBlock(env->thread, "Cli", osPriorityNormal);
}
void ListenCLICommand(tCli *env) {
CliCmd_WaitLine(&env->cmd);
if (CliRedirectionTable_ProcessCmd(&env->redirectTable, &env->cmd) != 0) {
CliCmd_PrintStatic(&env->cmd, "COMMAND NOT FOUND!");
CliCmd_PrintStatic(&env->cmd, " EXECUTE COMMAND [ help ] OF MORE INFORMATION ");
}
}
static _Noreturn void Cli_Thread(tCli *env) {
for (;;) {
ListenCLICommand(env);
SystemDelayMs(10);
}
}
void Cli_StartThread(tCli *env) {
if (!env->thread.id) {
env->thread.id = osThreadNew((osThreadFunc_t) (Cli_Thread), (void *) (env), &env->thread.attr);
} else {
osThreadResume(env->thread.id);
}
}