From 7d0ea2678a99509f979c1aaea2c500bb4bd5cae8 Mon Sep 17 00:00:00 2001 From: Edward Li Date: Sun, 8 Feb 2026 13:16:48 -0800 Subject: [PATCH 1/7] Add initial GPS test code --- firmware/CMakeLists.txt | 1 + firmware/src/gps/gps_thread.c | 92 +++++++++++++++++++++++++++++++++++ firmware/src/gps/gps_thread.h | 6 +++ firmware/src/main.c | 4 +- 4 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 firmware/src/gps/gps_thread.c create mode 100644 firmware/src/gps/gps_thread.h diff --git a/firmware/CMakeLists.txt b/firmware/CMakeLists.txt index d5207a4..2293dd8 100644 --- a/firmware/CMakeLists.txt +++ b/firmware/CMakeLists.txt @@ -51,6 +51,7 @@ target_sources(app PRIVATE src/state_machine/states/landed.c src/pyro/pyro_thread.c src/radio/radio_thread.c + src/gps/gps_thread.c ) target_include_directories(app PRIVATE diff --git a/firmware/src/gps/gps_thread.c b/firmware/src/gps/gps_thread.c new file mode 100644 index 0000000..f8a97c1 --- /dev/null +++ b/firmware/src/gps/gps_thread.c @@ -0,0 +1,92 @@ +#include +#include +#include +#include +#include + +LOG_MODULE_REGISTER(gps_thread, LOG_LEVEL_INF); + +#define GPS_THREAD_STACK_SIZE 2048 +#define GPS_THREAD_PRIORITY 6 +#define GPS_THREAD_PERIOD_MS 10000 + +/* SPI protocol constants (ulysses-gnss-radio spec) */ +#define SPI_CMD_GPS_RX 0x05 +#define SPI_DUMMY_SIZE 4 +#define SPI_HEADER_SIZE (1 + SPI_DUMMY_SIZE) /* 5: cmd + dummy bytes */ +#define GPS_PAYLOAD_SIZE 87 /* Max NMEA sentence length */ + +/* Total SPI transaction: [CMD:1][DUMMY:4][PAYLOAD:87] = 92 bytes */ +#define SPI_GPS_RX_SIZE (SPI_HEADER_SIZE + GPS_PAYLOAD_SIZE) /* 92 */ + +K_THREAD_STACK_DEFINE(gps_stack, GPS_THREAD_STACK_SIZE); +static struct k_thread gps_thread; + +static const struct spi_dt_spec gps_spi = + SPI_DT_SPEC_GET(DT_ALIAS(radio0), + SPI_OP_MODE_MASTER | SPI_TRANSFER_MSB | SPI_WORD_SET(8)); + +static int gps_spi_read(uint8_t *payload_out) +{ + uint8_t tx_buf[SPI_GPS_RX_SIZE] = {0}; + uint8_t rx_buf[SPI_GPS_RX_SIZE] = {0}; + + tx_buf[0] = SPI_CMD_GPS_RX; + /* bytes 1-4 are dummy, rest is zero (master clocks out zeros) */ + + const struct spi_buf spi_tx = { + .buf = tx_buf, + .len = sizeof(tx_buf), + }; + const struct spi_buf_set tx_set = { + .buffers = &spi_tx, + .count = 1, + }; + + const struct spi_buf spi_rx = { + .buf = rx_buf, + .len = sizeof(rx_buf), + }; + const struct spi_buf_set rx_set = { + .buffers = &spi_rx, + .count = 1, + }; + + int ret = spi_transceive_dt(&gps_spi, &tx_set, &rx_set); + if (ret < 0) { + return ret; + } + + /* Payload starts after header (cmd + dummy bytes) */ + memcpy(payload_out, &rx_buf[SPI_HEADER_SIZE], GPS_PAYLOAD_SIZE); + + return 0; +} + +static void gps_thread_fn(void *p1, void *p2, void *p3) +{ + if (!spi_is_ready_dt(&gps_spi)) { + LOG_ERR("GPS SPI device not ready"); + return; + } + LOG_INF("GPS SPI device ready"); + + while (1) { + uint8_t payload[GPS_PAYLOAD_SIZE]; + + int ret = gps_spi_read(payload); + if (ret < 0) { + LOG_ERR("GPS SPI read failed: %d", ret); + } else { + LOG_HEXDUMP_INF(payload, GPS_PAYLOAD_SIZE, "GPS RX"); + } + + k_sleep(K_MSEC(GPS_THREAD_PERIOD_MS)); + } +} + +void start_gps_thread(void) +{ + k_thread_create(&gps_thread, gps_stack, K_THREAD_STACK_SIZEOF(gps_stack), + gps_thread_fn, NULL, NULL, NULL, GPS_THREAD_PRIORITY, 0, K_NO_WAIT); +} diff --git a/firmware/src/gps/gps_thread.h b/firmware/src/gps/gps_thread.h new file mode 100644 index 0000000..4cf5cbe --- /dev/null +++ b/firmware/src/gps/gps_thread.h @@ -0,0 +1,6 @@ +#ifndef GPS_THREAD_H +#define GPS_THREAD_H + +void start_gps_thread(void); + +#endif diff --git a/firmware/src/main.c b/firmware/src/main.c index 31b12c1..e44afb6 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -9,6 +9,7 @@ #include "state_machine/state_machine.h" #include "pyro/pyro_thread.h" #include "radio/radio_thread.h" +#include "gps/gps_thread.h" #include "data.h" LOG_MODULE_REGISTER(falcon_main, LOG_LEVEL_INF); @@ -23,7 +24,8 @@ int main(void) start_baro_thread(); start_pyro_thread(); start_state_machine_thread(); - start_radio_thread(); + // start_radio_thread(); + start_gps_thread(); return 0; } From 9d75da1039811af943c5bb0d784d6816f0b37622 Mon Sep 17 00:00:00 2001 From: Edward Li Date: Sun, 8 Feb 2026 14:54:09 -0800 Subject: [PATCH 2/7] Add lwgps-based decode --- firmware/CMakeLists.txt | 6 ++++++ firmware/src/gps/gps_thread.c | 32 +++++++++++++++++++++++++++++--- firmware/src/gps/lwgps_opts.h | 10 ++++++++++ west.yml | 6 ++++++ 4 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 firmware/src/gps/lwgps_opts.h diff --git a/firmware/CMakeLists.txt b/firmware/CMakeLists.txt index 2293dd8..0ee5df1 100644 --- a/firmware/CMakeLists.txt +++ b/firmware/CMakeLists.txt @@ -35,6 +35,9 @@ set(FALCON_PROTOS_DIR ${CMAKE_CURRENT_LIST_DIR}/../../modules/falcon-protos) zephyr_nanopb_sources(app ${FALCON_PROTOS_DIR}/HelloWorldPacket.proto) zephyr_nanopb_sources(app ${FALCON_PROTOS_DIR}/TelemetryPacket.proto) +# LwGPS NMEA parser library +set(LWGPS_DIR ${CMAKE_CURRENT_LIST_DIR}/../../modules/lwgps) + target_sources(app PRIVATE src/main.c src/data.c @@ -52,11 +55,14 @@ target_sources(app PRIVATE src/pyro/pyro_thread.c src/radio/radio_thread.c src/gps/gps_thread.c + ${LWGPS_DIR}/lwgps/src/lwgps/lwgps.c ) target_include_directories(app PRIVATE src src/state_machine + src/gps + ${LWGPS_DIR}/lwgps/src/include ) if(DEFINED DATA_FILE) diff --git a/firmware/src/gps/gps_thread.c b/firmware/src/gps/gps_thread.c index f8a97c1..9bd4b48 100644 --- a/firmware/src/gps/gps_thread.c +++ b/firmware/src/gps/gps_thread.c @@ -3,12 +3,14 @@ #include #include #include +#include +#include LOG_MODULE_REGISTER(gps_thread, LOG_LEVEL_INF); #define GPS_THREAD_STACK_SIZE 2048 #define GPS_THREAD_PRIORITY 6 -#define GPS_THREAD_PERIOD_MS 10000 +#define GPS_THREAD_PERIOD_MS 1000 /* SPI protocol constants (ulysses-gnss-radio spec) */ #define SPI_CMD_GPS_RX 0x05 @@ -26,6 +28,8 @@ static const struct spi_dt_spec gps_spi = SPI_DT_SPEC_GET(DT_ALIAS(radio0), SPI_OP_MODE_MASTER | SPI_TRANSFER_MSB | SPI_WORD_SET(8)); +static lwgps_t gps; + static int gps_spi_read(uint8_t *payload_out) { uint8_t tx_buf[SPI_GPS_RX_SIZE] = {0}; @@ -71,16 +75,38 @@ static void gps_thread_fn(void *p1, void *p2, void *p3) } LOG_INF("GPS SPI device ready"); + lwgps_init(&gps); + while (1) { uint8_t payload[GPS_PAYLOAD_SIZE]; int ret = gps_spi_read(payload); if (ret < 0) { LOG_ERR("GPS SPI read failed: %d", ret); - } else { - LOG_HEXDUMP_INF(payload, GPS_PAYLOAD_SIZE, "GPS RX"); + k_sleep(K_MSEC(GPS_THREAD_PERIOD_MS)); + continue; } + /* Null-terminate and find actual sentence length */ + char nmea[GPS_PAYLOAD_SIZE + 1]; + memcpy(nmea, payload, GPS_PAYLOAD_SIZE); + nmea[GPS_PAYLOAD_SIZE] = '\0'; + size_t len = strlen(nmea); + + if (len == 0 || nmea[0] != '$') { + k_sleep(K_MSEC(GPS_THREAD_PERIOD_MS)); + continue; + } + + lwgps_process(&gps, nmea, len); + + LOG_INF("NMEA: %s", nmea); + LOG_INF("GPS: lat=%.6f, lon=%.6f, alt=%.1f m, " + "sats=%u, fix=%u, speed=%.1f kn", + (double)gps.latitude, (double)gps.longitude, + (double)gps.altitude, gps.sats_in_use, gps.fix, + (double)gps.speed); + k_sleep(K_MSEC(GPS_THREAD_PERIOD_MS)); } } diff --git a/firmware/src/gps/lwgps_opts.h b/firmware/src/gps/lwgps_opts.h new file mode 100644 index 0000000..75253c4 --- /dev/null +++ b/firmware/src/gps/lwgps_opts.h @@ -0,0 +1,10 @@ +#ifndef LWGPS_OPTS_H +#define LWGPS_OPTS_H + +/* Use float instead of double to save memory on Cortex-M4 */ +#define LWGPS_CFG_DOUBLE 0 + +/* We don't need satellite detail descriptors */ +#define LWGPS_CFG_STATEMENT_GPGSV_SAT_DET 0 + +#endif diff --git a/west.yml b/west.yml index 2b6cdaf..98def29 100644 --- a/west.yml +++ b/west.yml @@ -4,6 +4,8 @@ manifest: url-base: https://github.com/zephyrproject-rtos - name: ubc-rocket url-base: https://github.com/UBC-Rocket + - name: lwgps-remote + url-base: https://github.com/MaJerle projects: - name: zephyr @@ -14,6 +16,10 @@ manifest: remote: ubc-rocket revision: main path: modules/falcon-protos + - name: lwgps + remote: lwgps-remote + revision: main + path: modules/lwgps self: path: app From 59cda4af54c3070fe8dfd82a62baf8a3da13d24e Mon Sep 17 00:00:00 2001 From: Edward Li Date: Wed, 11 Feb 2026 21:30:31 -0800 Subject: [PATCH 3/7] Check for empty GPS messages --- firmware/src/gps/gps_thread.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/firmware/src/gps/gps_thread.c b/firmware/src/gps/gps_thread.c index 9bd4b48..424b02a 100644 --- a/firmware/src/gps/gps_thread.c +++ b/firmware/src/gps/gps_thread.c @@ -87,6 +87,20 @@ static void gps_thread_fn(void *p1, void *p2, void *p3) continue; } + /* Check for empty payload (all zero bytes from SPI) */ + bool payload_empty = true; + for (size_t i = 0; i < GPS_PAYLOAD_SIZE; i++) { + if (payload[i] != 0) { + payload_empty = false; + break; + } + } + if (payload_empty) { + LOG_WRN("GPS SPI payload is empty (all zeros)"); + k_sleep(K_MSEC(GPS_THREAD_PERIOD_MS)); + continue; + } + /* Null-terminate and find actual sentence length */ char nmea[GPS_PAYLOAD_SIZE + 1]; memcpy(nmea, payload, GPS_PAYLOAD_SIZE); From 5562312ad7cf9d34cc78112c6cb449d28bbc2847 Mon Sep 17 00:00:00 2001 From: Edward Li Date: Wed, 11 Feb 2026 21:35:10 -0800 Subject: [PATCH 4/7] Add data logging for GPS --- firmware/src/data.c | 16 ++++++++++++++++ firmware/src/data.h | 14 ++++++++++++++ firmware/src/gps/gps_thread.c | 12 ++++++++++++ firmware/src/log_format.h | 1 + firmware/src/logger_thread.c | 20 ++++++++++++++------ 5 files changed, 57 insertions(+), 6 deletions(-) diff --git a/firmware/src/data.c b/firmware/src/data.c index 1baeb32..15b5162 100644 --- a/firmware/src/data.c +++ b/firmware/src/data.c @@ -9,12 +9,14 @@ struct imu_data g_imu_data; struct baro_data g_baro_data; struct state_data g_state_data; struct pyro_data g_pyro_data; +struct gps_data g_gps_data; // Mutexes for thread safety K_MUTEX_DEFINE(imu_mutex); K_MUTEX_DEFINE(baro_mutex); K_MUTEX_DEFINE(state_mutex); K_MUTEX_DEFINE(pyro_data_mutex); +K_MUTEX_DEFINE(gps_mutex); // Setter functions void set_imu_data(const struct imu_data *src) @@ -106,3 +108,17 @@ void get_pyro_data(struct pyro_data *dst) *dst = g_pyro_data; k_mutex_unlock(&pyro_data_mutex); } + +void set_gps_data(const struct gps_data *src) +{ + k_mutex_lock(&gps_mutex, K_FOREVER); + g_gps_data = *src; + k_mutex_unlock(&gps_mutex); +} + +void get_gps_data(struct gps_data *dst) +{ + k_mutex_lock(&gps_mutex, K_FOREVER); + *dst = g_gps_data; + k_mutex_unlock(&gps_mutex); +} diff --git a/firmware/src/data.h b/firmware/src/data.h index 0531c3a..b46e81d 100644 --- a/firmware/src/data.h +++ b/firmware/src/data.h @@ -66,11 +66,22 @@ struct pyro_data { bool main_fire_requested; }; +struct gps_data { + float latitude; // Degrees + float longitude; // Degrees + float altitude; // Altitude in meters + float speed; // Speed in knots + uint8_t sats; // Satellites in use + uint8_t fix; // Fix quality + int64_t timestamp; +}; + // Global instances extern struct imu_data g_imu_data; extern struct baro_data g_baro_data; extern struct state_data g_state_data; extern struct pyro_data g_pyro_data; +extern struct gps_data g_gps_data; // Getters and setters void set_imu_data(const struct imu_data *src); @@ -85,4 +96,7 @@ void get_state_data(struct state_data *dst); void set_pyro_data(const struct pyro_data *src); void get_pyro_data(struct pyro_data *dst); +void set_gps_data(const struct gps_data *src); +void get_gps_data(struct gps_data *dst); + #endif diff --git a/firmware/src/gps/gps_thread.c b/firmware/src/gps/gps_thread.c index 424b02a..6c7a588 100644 --- a/firmware/src/gps/gps_thread.c +++ b/firmware/src/gps/gps_thread.c @@ -5,6 +5,7 @@ #include #include #include +#include "data.h" LOG_MODULE_REGISTER(gps_thread, LOG_LEVEL_INF); @@ -114,6 +115,17 @@ static void gps_thread_fn(void *p1, void *p2, void *p3) lwgps_process(&gps, nmea, len); + struct gps_data gps_out = { + .latitude = gps.latitude, + .longitude = gps.longitude, + .altitude = gps.altitude, + .speed = gps.speed, + .sats = gps.sats_in_use, + .fix = gps.fix, + .timestamp = k_uptime_get(), + }; + set_gps_data(&gps_out); + LOG_INF("NMEA: %s", nmea); LOG_INF("GPS: lat=%.6f, lon=%.6f, alt=%.1f m, " "sats=%u, fix=%u, speed=%.1f kn", diff --git a/firmware/src/log_format.h b/firmware/src/log_format.h index b531ae2..9c8e959 100644 --- a/firmware/src/log_format.h +++ b/firmware/src/log_format.h @@ -11,6 +11,7 @@ struct log_frame { struct baro_data baro; struct state_data state; struct pyro_data pyro; + struct gps_data gps; }; #endif diff --git a/firmware/src/logger_thread.c b/firmware/src/logger_thread.c index 8d30500..3279ea6 100644 --- a/firmware/src/logger_thread.c +++ b/firmware/src/logger_thread.c @@ -94,9 +94,10 @@ static int write_csv_header(void) "Pyro_Status,Pyro_Timestamp(ms)," "Drogue_Fired,Main_Fired,Drogue_Fail,Main_Fail," "Drogue_Cont_OK,Main_Cont_OK,Drogue_Fire_ACK,Main_Fire_ACK," - "Drogue_Fire_Requested,Main_Fire_Requested\n"; - -#ifdef CONFIG_BOARD_NATIVE_SIM + "Drogue_Fire_Requested,Main_Fire_Requested," + "GPS_Timestamp(ms),GPS_Lat(deg),GPS_Lon(deg)," + "GPS_Alt(m),GPS_Speed(kn),GPS_Sats,GPS_Fix\n"; + #ifdef CONFIG_BOARD_NATIVE_SIM size_t written = fwrite(header, 1, strlen(header), log_file_ptr); if (written != strlen(header)) { LOG_ERR("Failed to write header"); @@ -197,7 +198,8 @@ static int format_log_entry(const struct log_frame *frame, char *buffer, size_t "%.3f,%.3f,%.3f,%.3f,%u,%d," "%.3f,%.3f,%.3f,%.3f,%u,%d," "%.3f,%.3f,%.3f,%.3f,%.3f,%d,%.3f,%lld," - "%u,%lld,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", + "%u,%lld,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d," + "%lld,%.6f,%.6f,%.1f,%.1f,%u,%u\n", frame->log_timestamp, frame->imu.timestamp, (double)frame->imu.accel[0], (double)frame->imu.accel[1], (double)frame->imu.accel[2], @@ -207,7 +209,7 @@ static int format_log_entry(const struct log_frame *frame, char *buffer, size_t (double)frame->baro.baro0.altitude, (double)frame->baro.baro0.nis, (unsigned int)frame->baro.baro0.faults, frame->baro.baro0.healthy ? 1 : 0, (double)frame->baro.baro1.pressure, (double)frame->baro.baro1.temperature, - (double)frame->baro.baro1.altitude, (double)frame->baro.baro1.nis, + (double)frame->baro.baro1.altitude, (double)frame->baro.altitude_agl, (double)frame->baro.baro1.nis, (unsigned int)frame->baro.baro1.faults, frame->baro.baro1.healthy ? 1 : 0, (double)frame->baro.altitude, (double)frame->baro.altitude_agl, (double)frame->baro.alt_variance, @@ -218,7 +220,12 @@ static int format_log_entry(const struct log_frame *frame, char *buffer, size_t frame->pyro.drogue_fail ? 1 : 0, frame->pyro.main_fail ? 1 : 0, frame->pyro.drogue_cont_ok ? 1 : 0, frame->pyro.main_cont_ok ? 1 : 0, frame->pyro.drogue_fire_ack ? 1 : 0, frame->pyro.main_fire_ack ? 1 : 0, - frame->pyro.drogue_fire_requested ? 1 : 0, frame->pyro.main_fire_requested ? 1 : 0); + frame->pyro.drogue_fire_requested ? 1 : 0, frame->pyro.main_fire_requested ? 1 : 0), + frame->gps.timestamp, + (double)frame->gps.latitude, (double)frame->gps.longitude, + (double)frame->gps.altitude, (double)frame->gps.speed, + (unsigned int)frame->gps.sats, (unsigned int)frame->gps.fix);; + ); } static void write_log_frame_to_file(const struct log_frame *frame) @@ -267,6 +274,7 @@ static void logger_thread_fn(void *p1, void *p2, void *p3) get_baro_data(&frame.baro); get_state_data(&frame.state); get_pyro_data(&frame.pyro); + get_gps_data(&frame.gps); write_log_frame_to_file(&frame); From 21a7641ba1c50f6d74dbb101c91a499d8d06a923 Mon Sep 17 00:00:00 2001 From: Edward Li Date: Wed, 11 Feb 2026 22:38:19 -0800 Subject: [PATCH 5/7] Add GPS data to radio message --- firmware/src/main.c | 2 +- firmware/src/radio/radio_thread.c | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/firmware/src/main.c b/firmware/src/main.c index e44afb6..fb861e7 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -24,7 +24,7 @@ int main(void) start_baro_thread(); start_pyro_thread(); start_state_machine_thread(); - // start_radio_thread(); + start_radio_thread(); start_gps_thread(); return 0; diff --git a/firmware/src/radio/radio_thread.c b/firmware/src/radio/radio_thread.c index e732658..11518e8 100644 --- a/firmware/src/radio/radio_thread.c +++ b/firmware/src/radio/radio_thread.c @@ -81,10 +81,12 @@ static void radio_thread_fn(void *p1, void *p2, void *p3) struct imu_data imu; struct baro_data baro; struct state_data state; + struct gps_data gps; get_imu_data(&imu); get_baro_data(&baro); get_state_data(&state); + get_gps_data(&gps); message.counter = counter; message.timestamp_ms = (uint32_t)k_uptime_get(); @@ -105,6 +107,13 @@ static void radio_thread_fn(void *p1, void *p2, void *p3) message.ground_altitude = state.ground_altitude; + message.gps_latitude = gps.latitude; + message.gps_longitude = gps.longitude; + message.gps_altitude = gps.altitude; + message.gps_speed = gps.speed; + message.gps_sats = gps.sats; + message.gps_fix = gps.fix; + pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer)); bool status = pb_encode(&stream, TelemetryPacket_fields, &message); size_t message_length = stream.bytes_written; From 428486fd531c2b671693401dfeeab2faf4700fdf Mon Sep 17 00:00:00 2001 From: Jon Gilberg Date: Sun, 15 Feb 2026 13:02:20 -0800 Subject: [PATCH 6/7] Fixed parentheses --- firmware/src/logger_thread.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware/src/logger_thread.c b/firmware/src/logger_thread.c index 3279ea6..3146eaa 100644 --- a/firmware/src/logger_thread.c +++ b/firmware/src/logger_thread.c @@ -220,11 +220,11 @@ static int format_log_entry(const struct log_frame *frame, char *buffer, size_t frame->pyro.drogue_fail ? 1 : 0, frame->pyro.main_fail ? 1 : 0, frame->pyro.drogue_cont_ok ? 1 : 0, frame->pyro.main_cont_ok ? 1 : 0, frame->pyro.drogue_fire_ack ? 1 : 0, frame->pyro.main_fire_ack ? 1 : 0, - frame->pyro.drogue_fire_requested ? 1 : 0, frame->pyro.main_fire_requested ? 1 : 0), + frame->pyro.drogue_fire_requested ? 1 : 0, frame->pyro.main_fire_requested ? 1 : 0, frame->gps.timestamp, (double)frame->gps.latitude, (double)frame->gps.longitude, (double)frame->gps.altitude, (double)frame->gps.speed, - (unsigned int)frame->gps.sats, (unsigned int)frame->gps.fix);; + (unsigned int)frame->gps.sats, (unsigned int)frame->gps.fix ); } From e70923ce49353b7b1efca636da52cbd05f595dea Mon Sep 17 00:00:00 2001 From: Jon Gilberg Date: Sun, 15 Feb 2026 13:13:51 -0800 Subject: [PATCH 7/7] Fixed logger csv column misalignment --- firmware/src/logger_thread.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/firmware/src/logger_thread.c b/firmware/src/logger_thread.c index 3146eaa..64fc4a0 100644 --- a/firmware/src/logger_thread.c +++ b/firmware/src/logger_thread.c @@ -194,12 +194,12 @@ static int format_log_entry(const struct log_frame *frame, char *buffer, size_t { return snprintf( buffer, buffer_size, - "%lld,%lld,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%lld," - "%.3f,%.3f,%.3f,%.3f,%u,%d," - "%.3f,%.3f,%.3f,%.3f,%u,%d," - "%.3f,%.3f,%.3f,%.3f,%.3f,%d,%.3f,%lld," - "%u,%lld,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d," - "%lld,%.6f,%.6f,%.1f,%.1f,%u,%u\n", + "%lld,%lld,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%lld," // Log_Timestamp, IMU_Timestamp, Accel_X/Y/Z, Gyro_X/Y/Z, Baro_Timestamp + "%.3f,%.3f,%.3f,%.3f,%u,%d," // Baro0_Pressure, Baro0_Temperature, Baro0_Altitude, Baro0_NIS, Baro0_Faults, Baro0_Healthy + "%.3f,%.3f,%.3f,%.3f,%u,%d," // Baro1_Pressure, Baro1_Temperature, Baro1_Altitude, Baro1_NIS, Baro1_Faults, Baro1_Healthy + "%.3f,%.3f,%.3f,%.3f,%.3f,%d,%.3f,%lld," // KF_Altitude, KF_Altitude_AGL, KF_AltVar, KF_Velocity, KF_VelVar, State, State_Ground_Altitude, State_Timestamp + "%u,%lld,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d," // Pyro_Status, Pyro_Timestamp, Drogue_Fired, Main_Fired, Drogue_Fail, Main_Fail, Drogue_Cont_OK, Main_Cont_OK, Drogue_Fire_ACK, Main_Fire_ACK, Drogue_Fire_Requested, Main_Fire_Requested + "%lld,%.6f,%.6f,%.1f,%.1f,%u,%u\n", // GPS_Timestamp, GPS_Lat, GPS_Lon, GPS_Alt, GPS_Speed, GPS_Sats, GPS_Fix frame->log_timestamp, frame->imu.timestamp, (double)frame->imu.accel[0], (double)frame->imu.accel[1], (double)frame->imu.accel[2], @@ -209,7 +209,7 @@ static int format_log_entry(const struct log_frame *frame, char *buffer, size_t (double)frame->baro.baro0.altitude, (double)frame->baro.baro0.nis, (unsigned int)frame->baro.baro0.faults, frame->baro.baro0.healthy ? 1 : 0, (double)frame->baro.baro1.pressure, (double)frame->baro.baro1.temperature, - (double)frame->baro.baro1.altitude, (double)frame->baro.altitude_agl, (double)frame->baro.baro1.nis, + (double)frame->baro.baro1.altitude, (double)frame->baro.baro1.nis, (unsigned int)frame->baro.baro1.faults, frame->baro.baro1.healthy ? 1 : 0, (double)frame->baro.altitude, (double)frame->baro.altitude_agl, (double)frame->baro.alt_variance,