diff --git a/.gitignore b/.gitignore index 0dbe996a90b2c7e8146bd9aa672f18d74708430b..1889ec5e83c828376ce0f7b1048ac40d0df64562 100644 --- a/.gitignore +++ b/.gitignore @@ -36,5 +36,5 @@ __pycache__ **/generated **/scxmls -src/scripts/logdecoder + diff --git a/src/scripts/logdecoder/Makefile b/src/scripts/logdecoder/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..9e8cbfb4462344c5a4a105609b0e564f6b0c2c06 --- /dev/null +++ b/src/scripts/logdecoder/Makefile @@ -0,0 +1,16 @@ +BOARDCORE := ../../../skyward-boardcore/ +OBSW := ../../../src/boards/ + +all: + g++ -std=c++17 -O2 -o logdecoder logdecoder.cpp \ + -DCOMPILE_FOR_X86 \ + -DCOMPILE_FOR_HOST \ + $(BOARDCORE)libs/tscpp/tscpp/stream.cpp \ + -I$(BOARDCORE)libs/miosix-host \ + -I$(BOARDCORE)libs/mavlink-skyward-lib \ + -I$(BOARDCORE)libs/eigen \ + -I$(BOARDCORE)libs/tscpp \ + -I$(BOARDCORE)src/shared \ + -I$(OBSW) +clean: + rm logdecoder diff --git a/src/scripts/logdecoder/logdecoder.cpp b/src/scripts/logdecoder/logdecoder.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ac43ed5464639997968f8c8f8c6023b38e1e2552 --- /dev/null +++ b/src/scripts/logdecoder/logdecoder.cpp @@ -0,0 +1,145 @@ +/* Copyright (c) 2018-2022 Skyward Experimental Rocketry + * Author: Federico Terraneo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include <Parafoil/StateMachines/FlightModeManager/FlightModeManagerData.h> +#include <Parafoil/StateMachines/NASController/NASControllerData.h> +#include <Parafoil/StateMachines/WingController/WingControllerData.h> +#include <Parafoil/Configs/WingConfig.h> +#include <Parafoil/Wing/WingTargetPositionData.h> +#include <Parafoil/Wing/WingAlgorithmData.h> +#include <Parafoil/WindEstimationScheme/WindEstimationData.h> +#include <logger/Deserializer.h> +#include <logger/LogTypes.h> +#include <radio/Xbee/APIFramesLog.h> +#include <tscpp/stream.h> + +#include <fstream> +#include <iostream> +#include <stdexcept> +#include <string> + +/** + * @brief Binary log files decoder. + * + * This program is to compile for you computer and decodes binary log files + * through the tscpp library. + * + * In LogTypes.h there should be included all the classes you want to + * deserialize. + */ + +using namespace tscpp; +using namespace Boardcore; +using namespace Parafoil; +using namespace Xbee; +using namespace WingConfig; + +void registerTypes(Deserializer& ds) +{ + // Register all Boardcore types + LogTypes::registerTypes(ds); + + // Custom types + ds.registerType<FlightModeManagerStatus>(); + ds.registerType<NASControllerStatus>(); + ds.registerType<LoadCellData>(); + ds.registerType<PitotData>(); + ds.registerType<APIFrameLog>(); + ds.registerType<ATCommandFrameLog>(); + ds.registerType<TXRequestFrameLog>(); + ds.registerType<ATCommandResponseFrameLog>(); + ds.registerType<ModemStatusFrameLog>(); + ds.registerType<TXStatusFrameLog>(); + ds.registerType<RXPacketFrameLog>(); + ds.registerType<WingControllerStatus>(); + ds.registerType<WingConfigStruct>(); + ds.registerType<WingTargetPositionData>(); + ds.registerType<WingAlgorithmData>(); + ds.registerType<WindLogging>(); + +} + +void showUsage(const string& cmdName) +{ + std::cerr << "Usage: " << cmdName << " {-a | <log_file_name> | -h}" + << "Options:\n" + << "\t-h,--help\t\tShow help message\n" + << "\t-a,--all Deserialize all logs in the current directory\n" + << std::endl; +} + +bool deserialize(string logName) +{ + std::cout << "Deserializing " << logName << "...\n"; + Deserializer d(logName); + registerTypes(d); + + return d.deserialize(); +} + +bool deserializeAll() +{ + for (int i = 0; i < 100; i++) + { + char nextName[11]; + sprintf(nextName, "log%02d.dat", i); + struct stat st; + if (stat(nextName, &st) != 0) + continue; // File not found + // File found + if (!deserialize(string(nextName))) + return false; + } + return true; +} + +int main(int argc, char* argv[]) +{ + if (argc < 2) + { + showUsage(string(argv[0])); + return 1; // Error + } + + bool success = false; + string arg1 = string(argv[1]); + + // Help message + if (arg1 == "-h" || arg1 == "--help") + { + showUsage(string(argv[0])); + return 0; + } + + // File deserialization + if (arg1 == "-a" || arg1 == "--all") + success = deserializeAll(); + else + success = deserialize(arg1); + + // End + if (success) + std::cout << "Deserialization completed successfully\n"; + else + std::cout << "Deserialization ended with errors\n"; + return 0; +}