diff --git a/src/blackbox_decode.c b/src/blackbox_decode.c index ab52359..798cf44 100644 --- a/src/blackbox_decode.c +++ b/src/blackbox_decode.c @@ -460,6 +460,11 @@ void outputGPSFrame(flightLog_t *log, int32_t *frame) void outputSlowFrameFields(flightLog_t *log, int32_t *frame) { + enum { + BUFFER_LEN = 1024 + }; + char buffer[BUFFER_LEN]; + bool needComma = false; for (int i = 0; i < log->frameDefs['S'].fieldCount; i++) { @@ -471,10 +476,6 @@ void outputSlowFrameFields(flightLog_t *log, int32_t *frame) if ((i == log->slowFieldIndexes.flightModeFlags || i == log->slowFieldIndexes.stateFlags) && options.unitFlags == UNIT_FLAGS) { - enum { - BUFFER_LEN = 1024 - }; - char buffer[BUFFER_LEN]; if (i == log->slowFieldIndexes.flightModeFlags) { flightlogFlightModeToString(frame[i], buffer, BUFFER_LEN); @@ -482,6 +483,10 @@ void outputSlowFrameFields(flightLog_t *log, int32_t *frame) flightlogFlightStateToString(frame[i], buffer, BUFFER_LEN); } + fprintf(csvFile, "%s", buffer); + } else if (i == log->slowFieldIndexes.failsafePhase && options.unitFlags == UNIT_FLAGS) { + flightlogFailsafePhaseToString(frame[i], buffer, BUFFER_LEN); + fprintf(csvFile, "%s", buffer); } else { //Print raw @@ -769,10 +774,17 @@ void applyFieldUnits(flightLog_t *log) } } + // Slow frame fields: if (log->slowFieldIndexes.flightModeFlags > -1) { slowFieldUnit[log->slowFieldIndexes.flightModeFlags] = options.unitFlags; + } + if (log->slowFieldIndexes.stateFlags > -1) { slowFieldUnit[log->slowFieldIndexes.stateFlags] = options.unitFlags; } + if (log->slowFieldIndexes.failsafePhase > -1) { + slowFieldUnit[log->slowFieldIndexes.failsafePhase] = options.unitFlags; + } + } void writeMainCSVHeader(flightLog_t *log) diff --git a/src/blackbox_fielddefs.c b/src/blackbox_fielddefs.c index 8afcf89..1657e0f 100644 --- a/src/blackbox_fielddefs.c +++ b/src/blackbox_fielddefs.c @@ -20,3 +20,10 @@ const char * const FLIGHT_LOG_FLIGHT_STATE_NAME[] = { "SMALL_ANGLE", "FIXED_WING" }; + +const char * const FLIGHT_LOG_FAILSAFE_PHASE_NAME[] = { + "IDLE", + "RX_LOSS_DETECTED", + "LANDING", + "LANDED" +}; diff --git a/src/blackbox_fielddefs.h b/src/blackbox_fielddefs.h index 20a9e89..5f74545 100644 --- a/src/blackbox_fielddefs.h +++ b/src/blackbox_fielddefs.h @@ -115,6 +115,17 @@ extern const char * const FLIGHT_LOG_FLIGHT_STATE_NAME[]; #define FLIGHT_LOG_FLIGHT_STATE_COUNT 5 +typedef enum { + FAILSAFE_IDLE = 0, + FAILSAFE_RX_LOSS_DETECTED, + FAILSAFE_LANDING, + FAILSAFE_LANDED +} failsafePhase_e; + +extern const char * const FLIGHT_LOG_FAILSAFE_PHASE_NAME[]; + +#define FLIGHT_LOG_FAILSAFE_PHASE_COUNT 4 + typedef enum FlightLogEvent { FLIGHT_LOG_EVENT_SYNC_BEEP = 0, FLIGHT_LOG_EVENT_AUTOTUNE_CYCLE_START = 10, diff --git a/src/parser.c b/src/parser.c index 5c3830b..748a459 100644 --- a/src/parser.c +++ b/src/parser.c @@ -17,6 +17,7 @@ #include #include #include +#include #include "platform.h" #include "parser.h" @@ -296,6 +297,8 @@ static void identifySlowFields(flightLog_t *log, flightLogFrameDef_t *frameDef) log->slowFieldIndexes.flightModeFlags = i; } else if (strcmp(fieldName, "stateFlags") == 0) { log->slowFieldIndexes.stateFlags = i; + } else if (strcmp(fieldName, "failsafePhase") == 0) { + log->slowFieldIndexes.failsafePhase = i; } } } @@ -895,6 +898,25 @@ static void flightlogDecodeFlagsToString(uint32_t flags, int numFlags, const cha } } +void flightlogDecodeEnumToString(uint32_t value, unsigned numEnums, const char * const *enumNames, char *dest, unsigned destLen) +{ + assert(destLen > 1); + + if (value < numEnums) { + const char *name = enumNames[value]; + + if (strlen(name) < destLen) { + strcpy(dest, name); + } else { + dest[0] = '\0'; + } + } else { + // Since we don't have a name for this value, print it as a raw integer instead + + snprintf(dest, destLen, "%u", value); + } +} + void flightlogFlightModeToString(uint32_t flightMode, char *dest, int destLen) { flightlogDecodeFlagsToString(flightMode, FLIGHT_LOG_FLIGHT_MODE_COUNT, FLIGHT_LOG_FLIGHT_MODE_NAME, dest, destLen); @@ -905,6 +927,11 @@ void flightlogFlightStateToString(uint32_t flightState, char *dest, int destLen) flightlogDecodeFlagsToString(flightState, FLIGHT_LOG_FLIGHT_STATE_COUNT, FLIGHT_LOG_FLIGHT_STATE_NAME, dest, destLen); } +void flightlogFailsafePhaseToString(uint8_t failsafePhase, char *dest, int destLen) +{ + flightlogDecodeEnumToString(failsafePhase, FLIGHT_LOG_FAILSAFE_PHASE_COUNT, FLIGHT_LOG_FAILSAFE_PHASE_NAME, dest, destLen); +} + flightLog_t * flightLogCreate(int fd) { const char *logSearchStart; diff --git a/src/parser.h b/src/parser.h index 58a8159..d573fec 100644 --- a/src/parser.h +++ b/src/parser.h @@ -77,6 +77,7 @@ typedef struct gpsHFieldIndexes_t { typedef struct slowFieldIndexes_t { int flightModeFlags; int stateFlags; + int failsafePhase; } slowFieldIndexes_t; typedef struct mainFieldIndexes_t { @@ -171,6 +172,7 @@ double flightlogGyroToRadiansPerSecond(flightLog_t *log, int32_t gyroRaw); double flightlogAccelerationRawToGs(flightLog_t *log, int32_t accRaw); void flightlogFlightModeToString(uint32_t flightMode, char *dest, int destLen); void flightlogFlightStateToString(uint32_t flightState, char *dest, int destLen); +void flightlogFailsafePhaseToString(uint8_t failsafePhase, char *dest, int destLen); bool flightLogParse(flightLog_t *log, int logIndex, FlightLogMetadataReady onMetadataReady, FlightLogFrameReady onFrameReady, FlightLogEventReady onEvent, bool raw); void flightLogDestroy(flightLog_t *log); diff --git a/visual-studio/blackbox_decode/blackbox_decode.vcxproj b/visual-studio/blackbox_decode/blackbox_decode.vcxproj index b4d4358..0986fde 100644 --- a/visual-studio/blackbox_decode/blackbox_decode.vcxproj +++ b/visual-studio/blackbox_decode/blackbox_decode.vcxproj @@ -53,7 +53,9 @@ + + @@ -65,6 +67,7 @@ + diff --git a/visual-studio/blackbox_decode/blackbox_decode.vcxproj.filters b/visual-studio/blackbox_decode/blackbox_decode.vcxproj.filters index 269cd3f..ad46cee 100644 --- a/visual-studio/blackbox_decode/blackbox_decode.vcxproj.filters +++ b/visual-studio/blackbox_decode/blackbox_decode.vcxproj.filters @@ -45,6 +45,12 @@ Source Files + + Source Files + + + Source Files + @@ -74,5 +80,8 @@ Header Files + + Header Files + \ No newline at end of file diff --git a/visual-studio/blackbox_render/blackbox_render.vcxproj b/visual-studio/blackbox_render/blackbox_render.vcxproj index c4c6ed3..c45581e 100644 --- a/visual-studio/blackbox_render/blackbox_render.vcxproj +++ b/visual-studio/blackbox_render/blackbox_render.vcxproj @@ -66,6 +66,7 @@ + diff --git a/visual-studio/blackbox_render/blackbox_render.vcxproj.filters b/visual-studio/blackbox_render/blackbox_render.vcxproj.filters index 11a53aa..d3b3c60 100644 --- a/visual-studio/blackbox_render/blackbox_render.vcxproj.filters +++ b/visual-studio/blackbox_render/blackbox_render.vcxproj.filters @@ -80,5 +80,8 @@ Source Files + + Source Files + \ No newline at end of file