// // Created by zemon on 18.11.22. // #include #include #include "CliCmd/MsdTable.h" #include "SystemDelayInterface.h" #include "AsciiStringAssmeblingUtils.h" #include "stream.h" void CliCmdMsdTable_Init(tCliCmdMsdTable *env, tEraGlonassMsdTable *msdTable, tEraGlonassUveosDumperInterface *dumperInterface) { env->msdTable = msdTable; env->dumperInterface = dumperInterface; } void CliCmdMsdTable_Help(tCliCmd *cli) { CliCmd_PrintLnStatic(cli, " access sub commands:"); CliCmd_PrintLnStatic(cli, " command [ exit ] exit as this sub mode"); CliCmd_PrintLnStatic(cli, " command [ ls ] exit as this sub mode"); CliCmd_PrintLnStatic(cli, " command [ clear ]- listing all access variable and values"); CliCmd_PrintLnStatic(cli, " syntaxis: [ command ]"); CliCmd_PrintLnStatic(cli, ""); } void PrintTime(time_t rawtime, tSerialPortIO *serialPort) { struct tm ts; char buf[80]; ts = *localtime(&rawtime); strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", &ts); debug_printf(serialPort, "%s\n", buf ); } void CliCmdMsdTable_List(tCliCmdMsdTable *env, tCliCmd *cliCmd) { bool emerg = false; for (uint32_t id = 0; id < EraGlonassMsdTable_GetSize(); ++id) { if (env->msdTable->items[id].msd.MSD_Data.msgId != 0) { emerg = true; CliCmd_PrintLnStatic(cliCmd, "======================= EMERGENCY INFORMATION ======================="); CliCmd_PrintLnStatic(cliCmd, ""); CliCmd_PrintStatic(cliCmd, "VIN = "); for (uint16_t vinCharInd = 0; vinCharInd < 18; ++vinCharInd) { debug_printf(cliCmd->serialCommandPort, "%u", (uint16_t) env->msdTable->items[id].msd.MSD_Data.vin[vinCharInd]); } CliCmd_PrintLnStatic(cliCmd, ""); CliCmd_PrintStatic(cliCmd, "LAST MSG ID = "); debug_printf(cliCmd->serialCommandPort, "%u", (uint16_t) env->msdTable->items[id].msd.MSD_Data.msgId ); CliCmd_PrintLnStatic(cliCmd, ""); CliCmd_PrintStatic(cliCmd, "DIRECTION = "); debug_printf(cliCmd->serialCommandPort, "%u", (uint8_t) env->msdTable->items[id].msd.MSD_Data.direction ); CliCmd_PrintLnStatic(cliCmd, ""); CliCmd_PrintStatic(cliCmd, "ASI 15 = "); debug_printf(cliCmd->serialCommandPort, "%u", (uint16_t) env->msdTable->items[id].msd.MSD_Data.additionalData.asi15 ); CliCmd_PrintLnStatic(cliCmd, ""); CliCmd_PrintStatic(cliCmd, "LATITUDE = "); debug_printf(cliCmd->serialCommandPort, "%u", (uint32_t) env->msdTable->items[id].msd.MSD_Data.pos.lat ); CliCmd_PrintLnStatic(cliCmd, ""); CliCmd_PrintStatic(cliCmd, "LONGITUDE = "); debug_printf(cliCmd->serialCommandPort, "%u", (uint32_t) env->msdTable->items[id].msd.MSD_Data.pos.lon ); CliCmd_PrintLnStatic(cliCmd, ""); CliCmd_PrintStatic(cliCmd, "ATTEMPS LEFT = "); debug_printf(cliCmd->serialCommandPort, "%u", (uint32_t) env->msdTable->items[id].attemptsLeft ); CliCmd_PrintLnStatic(cliCmd, ""); CliCmd_PrintStatic(cliCmd, "TIME STAMP = "); PrintTime((uint32_t) env->msdTable->items[id].msd.MSD_Data.timestamp, cliCmd->serialCommandPort); CliCmd_PrintLnStatic(cliCmd, ""); //--------------------------------------------- MND BILD ---------------------------------------------- tEraGlonassMsd *msd = &env->msdTable->items[id].msd; struct { uint8_t data[ERA_GLONASS_MSD_ENCODED_BUFFER_LENGTH]; uint32_t len; }msdEncoded; msdEncoded.len = EraGlonassMsdEncode(msd, MSD_V_2, msdEncoded.data); char asciiMsd[msdEncoded.len * 2]; size_t asciiMsdLen = 0; vAsciiStringAddBytesAsHex(asciiMsd, &asciiMsdLen, msdEncoded.data, msdEncoded.len); CliCmd_PrintStatic(cliCmd, "MND INFO = "); CliCmd_Print(cliCmd,asciiMsd,asciiMsdLen); CliCmd_PrintLnStatic(cliCmd, ""); //----------------------------------------------------------------------------------------------------- CliCmd_PrintLnStatic(cliCmd, "====================================================================="); } } if(emerg == false) { CliCmd_PrintLnStatic(cliCmd, "======================== INFORMATION IS NONE ========================"); } } void CliCmdMsdTable_Clear(tCliCmdMsdTable *env, tCliCmd *cliCmd) { EraGlonassMsdTable_Init(env->msdTable); EraGlonassUveosDumper_ForceDump(env->dumperInterface); CliCmd_PrintLnStatic(cliCmd, "================== EMERGENCY INFORMATION IS CLEAR ==================="); } uint32_t CliCmdMsdTable_ProcessSub(tCliCmdMsdTable *env, tCliCmd *cliCmd) { if (CliCmd_RxStartsWithStatic(cliCmd, "ls")) { CliCmdMsdTable_List(env, cliCmd); return 0; } else if (CliCmd_RxStartsWithStatic(cliCmd, "clear")) { CliCmdMsdTable_Clear(env, cliCmd); return 0; } return -1; } int32_t CliCmdMsdTable_Process(tCliCmdMsdTable *env, tCliCmd *cliCmd) { CliCmd_PrintStatic(cliCmd, "SWITCH TO MST TABLE MODE"); CliCmdMsdTable_Help(cliCmd); CliCmd_RxSkipSpace(cliCmd); if (CliCmd_RxLineLength(cliCmd) != 0) { for (;;) { CliCmd_WaitLine(cliCmd); if (CliCmd_RxStartsWithStatic(cliCmd, "exit")) { CliCmd_PrintStatic(cliCmd, "SWITCH TO BASE MODE"); return 0; } if (CliCmd_RxStartsWithStatic(cliCmd, "help")) { CliCmdMsdTable_Help(cliCmd); } uint32_t result = CliCmdMsdTable_ProcessSub(env, cliCmd); if (!result) { //CliCmdMsdTable_Help(cliCmd); } } } else { return CliCmdMsdTable_ProcessSub(env, cliCmd); } }