// // 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 "PowerManagment.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, tAccelCoor *accelCoor, tCarCrashDetection *carCrashDetection ) { 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, accelCoor, carCrashDetection); 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, "reboot", (cliCall) CliCmd_CmsisReboot, NULL); CliRedirectionTable_RecAddStatic(&env->redirectTable, "emerTest", (cliCall) CliCmd_EcoolSimulation, &env->sub.uvEmrgSimInter); CliRedirectionTable_RecAddStatic(&env->redirectTable, "mem", (cliCall) vTaskGetRunTime, NULL); //Инициализируем поток 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); } }