diff --git a/Makefile b/Makefile
index fb3a5d3fb7ecfd5db405e71cb52969a518762fe7..29cca0ceae155821927de8e086213afef27ee6af 100755
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,7 @@ LDFLAGS  :=
 BUILD    := ./build
 OBJ_DIR  := $(BUILD)
 TARGET   := mavdecoder
-INCLUDE  := 
+INCLUDE  := -Imavlink_skyward_lib/
 SRC      := src/mavdecoder.cpp src/decoders.cpp
 
 OBJECTS := $(SRC:%.cpp=$(OBJ_DIR)/%.o)
diff --git a/generate.py b/generate.py
index ddf539d13a5cce1759eee484a23c73d70ebdac21..79a3bc1776ca78ceb5988d039a4de006d98cb9c8 100755
--- a/generate.py
+++ b/generate.py
@@ -89,7 +89,7 @@ def parseMessages(filename):
 
         struct = mav_source[start:end]
 
-        rgx = re.compile(r'(?P<type>[\w\d_]+)\s(?P<name>[\w\d_]+);')
+        rgx = re.compile(r'(?P<type>[\w\d_]+)\s(?P<name>[\w\d_]+)(\[(?P<mult>\d+)\]){0,1};')
         has_match = True
         i = 0
         out['vars'] = []
@@ -99,6 +99,7 @@ def parseMessages(filename):
                 i = vars_match.end()
                 vartype = vars_match.group('type')
                 varname = vars_match.group('name')
+                #varmult = int(vars_match.groupdict().get('mult', 0))
                 out['vars'] += [(vartype, varname)]
             else:
                 has_match = False
diff --git a/mavlink_skyward_lib b/mavlink_skyward_lib
index 0aad2a6c74962d19ae744c9ed1b389fcd4ae19bf..a87afcaba8d6644b2078c6b6b45bce871cc71a05 160000
--- a/mavlink_skyward_lib
+++ b/mavlink_skyward_lib
@@ -1 +1 @@
-Subproject commit 0aad2a6c74962d19ae744c9ed1b389fcd4ae19bf
+Subproject commit a87afcaba8d6644b2078c6b6b45bce871cc71a05
diff --git a/src/decoders.cpp b/src/decoders.cpp
index 28ee8071a18f9aaf1451ad433edfae9d5b96d106..b6472c8d1839d6c7e68177635e74c62487594243 100755
--- a/src/decoders.cpp
+++ b/src/decoders.cpp
@@ -1,4 +1,4 @@
-/*
+/* 
  * Copyright (c) 2019 Skyward Experimental Rocketry
  * Author: Erbetta Luca
  *
@@ -27,62 +27,60 @@
  ******************************************************************************
  */
 
-// Generation date: 2019-09-11 16:12:10.827357
+// Generation date: 2019-11-06 01:44:05.542490
+
 
 #include "decoders.h"
 
 void instantiate_decoders(vector<TelemetryDecoderBase*>& vec)
 {
-    vec.push_back(
-        new TelemetryDecoder<MavAckTmData, mavlink_ack_tm_t>(130, "ack_tm"));
-    vec.push_back(
-        new TelemetryDecoder<MavAdaTmData, mavlink_ada_tm_t>(167, "ada_tm"));
-    vec.push_back(
-        new TelemetryDecoder<MavAdcTmData, mavlink_adc_tm_t>(169, "adc_tm"));
-    vec.push_back(
-        new TelemetryDecoder<MavAdisTmData, mavlink_adis_tm_t>(170, "adis_tm"));
-    vec.push_back(
-        new TelemetryDecoder<MavCanTmData, mavlink_can_tm_t>(168, "can_tm"));
-    vec.push_back(
-        new TelemetryDecoder<MavDplTmData, mavlink_dpl_tm_t>(166, "dpl_tm"));
-    vec.push_back(
-        new TelemetryDecoder<MavFmmTmData, mavlink_fmm_tm_t>(161, "fmm_tm"));
-    vec.push_back(
-        new TelemetryDecoder<MavGpsTmData, mavlink_gps_tm_t>(172, "gps_tm"));
-    vec.push_back(
-        new TelemetryDecoder<MavHrTmData, mavlink_hr_tm_t>(180, "hr_tm"));
-    vec.push_back(
-        new TelemetryDecoder<MavIgnTmData, mavlink_ign_tm_t>(165, "ign_tm"));
-    vec.push_back(new TelemetryDecoder<MavLoggerTmData, mavlink_logger_tm_t>(
-        162, "logger_tm"));
-    vec.push_back(
-        new TelemetryDecoder<MavLrTmData, mavlink_lr_tm_t>(181, "lr_tm"));
-    vec.push_back(
-        new TelemetryDecoder<MavMpuTmData, mavlink_mpu_tm_t>(171, "mpu_tm"));
-    vec.push_back(
-        new TelemetryDecoder<MavNackTmData, mavlink_nack_tm_t>(131, "nack_tm"));
-    vec.push_back(new TelemetryDecoder<MavNoargTcData, mavlink_noarg_tc_t>(
-        10, "noarg_tc"));
-    vec.push_back(
-        new TelemetryDecoder<MavPingTcData, mavlink_ping_tc_t>(1, "ping_tc"));
-    vec.push_back(
-        new TelemetryDecoder<MavRawEventTcData, mavlink_raw_event_tc_t>(
-            80, "raw_event_tc"));
-    vec.push_back(
-        new TelemetryDecoder<MavSmTmData, mavlink_sm_tm_t>(164, "sm_tm"));
-    vec.push_back(
-        new TelemetryDecoder<MavStartLaunchTcData, mavlink_start_launch_tc_t>(
-            20, "start_launch_tc"));
-    vec.push_back(
-        new TelemetryDecoder<MavSysTmData, mavlink_sys_tm_t>(160, "sys_tm"));
-    vec.push_back(new TelemetryDecoder<MavTelemetryRequestTcData,
-                                       mavlink_telemetry_request_tc_t>(
-        30, "telemetry_request_tc"));
-    vec.push_back(
-        new TelemetryDecoder<MavTestTmData, mavlink_test_tm_t>(182, "test_tm"));
-    vec.push_back(
-        new TelemetryDecoder<MavTmtcTmData, mavlink_tmtc_tm_t>(163, "tmtc_tm"));
-    vec.push_back(new TelemetryDecoder<MavUploadSettingTcData,
-                                       mavlink_upload_setting_tc_t>(
-        21, "upload_setting_tc"));
+	vec.push_back(
+		new TelemetryDecoder<MavLoggerTmData, mavlink_logger_tm_t>(162, "logger_tm"));
+	vec.push_back(
+		new TelemetryDecoder<MavAckTmData, mavlink_ack_tm_t>(130, "ack_tm"));
+	vec.push_back(
+		new TelemetryDecoder<MavNoargTcData, mavlink_noarg_tc_t>(10, "noarg_tc"));
+	vec.push_back(
+		new TelemetryDecoder<MavSysTmData, mavlink_sys_tm_t>(160, "sys_tm"));
+	vec.push_back(
+		new TelemetryDecoder<MavAdaTmData, mavlink_ada_tm_t>(167, "ada_tm"));
+	vec.push_back(
+		new TelemetryDecoder<MavPingTcData, mavlink_ping_tc_t>(1, "ping_tc"));
+	vec.push_back(
+		new TelemetryDecoder<MavRawEventTcData, mavlink_raw_event_tc_t>(80, "raw_event_tc"));
+	vec.push_back(
+		new TelemetryDecoder<MavFmmTmData, mavlink_fmm_tm_t>(161, "fmm_tm"));
+	vec.push_back(
+		new TelemetryDecoder<MavLrTmData, mavlink_lr_tm_t>(181, "lr_tm"));
+	vec.push_back(
+		new TelemetryDecoder<MavHrTmData, mavlink_hr_tm_t>(180, "hr_tm"));
+	vec.push_back(
+		new TelemetryDecoder<MavCanTmData, mavlink_can_tm_t>(168, "can_tm"));
+	vec.push_back(
+		new TelemetryDecoder<MavAdcTmData, mavlink_adc_tm_t>(169, "adc_tm"));
+	vec.push_back(
+		new TelemetryDecoder<MavTmtcTmData, mavlink_tmtc_tm_t>(163, "tmtc_tm"));
+	vec.push_back(
+		new TelemetryDecoder<MavNackTmData, mavlink_nack_tm_t>(131, "nack_tm"));
+	vec.push_back(
+		new TelemetryDecoder<MavAdisTmData, mavlink_adis_tm_t>(170, "adis_tm"));
+	vec.push_back(
+		new TelemetryDecoder<MavMpuTmData, mavlink_mpu_tm_t>(171, "mpu_tm"));
+	vec.push_back(
+		new TelemetryDecoder<MavTestTmData, mavlink_test_tm_t>(182, "test_tm"));
+	vec.push_back(
+		new TelemetryDecoder<MavTelemetryRequestTcData, mavlink_telemetry_request_tc_t>(30, "telemetry_request_tc"));
+	vec.push_back(
+		new TelemetryDecoder<MavDplTmData, mavlink_dpl_tm_t>(166, "dpl_tm"));
+	vec.push_back(
+		new TelemetryDecoder<MavIgnTmData, mavlink_ign_tm_t>(165, "ign_tm"));
+	vec.push_back(
+		new TelemetryDecoder<MavSmTmData, mavlink_sm_tm_t>(164, "sm_tm"));
+	vec.push_back(
+		new TelemetryDecoder<MavUploadSettingTcData, mavlink_upload_setting_tc_t>(21, "upload_setting_tc"));
+	vec.push_back(
+		new TelemetryDecoder<MavGpsTmData, mavlink_gps_tm_t>(172, "gps_tm"));
+	vec.push_back(
+		new TelemetryDecoder<MavStartLaunchTcData, mavlink_start_launch_tc_t>(20, "start_launch_tc"));
+
 }
\ No newline at end of file
diff --git a/src/decoders.h b/src/decoders.h
index 9c93be3df6871b68289d990585803f48f3f3d48c..20de1a5e520a39e3ceaedcb82bd09c2ea55e0a9d 100755
--- a/src/decoders.h
+++ b/src/decoders.h
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright (c) 2019 Skyward Experimental Rocketry
  * Author: Erbetta Luca
  *
@@ -25,10 +25,11 @@
 
 #include "messages.h"
 
+#include <fstream>
 #include <iostream>
 #include <string>
 #include <vector>
-#include <fstream>
+#include "../mavlink_skyward_lib/mavlink_lib/hermes/mavlink.h"
 
 using std::ofstream;
 using std::string;
@@ -50,13 +51,11 @@ public:
         file.close();
     }
 
-    virtual void writeHeader() = 0;
+    virtual void writeHeader()                                   = 0;
     virtual void decode(MavData packet_data, uint8_t* msg_start) = 0;
 
-    int msgId()
-    {
-        return id;
-    }
+    int msgId() { return id; }
+
 protected:
     ofstream file;
     int id;
@@ -66,11 +65,7 @@ template <class MavDataT, class mav_packet_t>
 class TelemetryDecoder : public TelemetryDecoderBase
 {
 public:
-    TelemetryDecoder(int id, string name) 
-        : TelemetryDecoderBase(id, name)
-    {
-
-    }
+    TelemetryDecoder(int id, string name) : TelemetryDecoderBase(id, name) {}
 
     void writeHeader() override
     {
@@ -81,13 +76,16 @@ public:
 
     void decode(MavData packet_data, uint8_t* msg_start) override
     {
-        packet_data.print(file);
-        file << ",";
-        
         MavDataT data;
         memcpy(&data.mav_pkt, msg_start, sizeof(mav_packet_t));
 
-        data.print(file);
+        for (unsigned int i = 0; i < MavDataT::messagesPerPacket(); i++)
+        {
+            packet_data.print(file);
+            file << ",";
+
+            data.print(file, i);
+        }
     }
 };
 
diff --git a/src/mavdecoder.cpp b/src/mavdecoder.cpp
index b7ec41a9a0199828e6538bbab3d9c2b390f73f7d..977ee294db86a5f3afb6715f0375dfe92902f366 100755
--- a/src/mavdecoder.cpp
+++ b/src/mavdecoder.cpp
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright (c) 2019 Skyward Experimental Rocketry
  * Author: Erbetta Luca
  *
@@ -34,6 +34,8 @@
 
 using namespace std;
 
+static constexpr bool USE_MAVLINK_PARSER = true;
+
 int main(int argc, char** argv)
 {
     if (argc < 2)
@@ -52,12 +54,12 @@ int main(int argc, char** argv)
     instantiate_decoders(decoders);
 
     vector<uint8_t> buf;
-    
+
     string logfile{argv[1]};
 
-    struct stat buffer;   
+    struct stat buffer;
     // Check file existance
-    if(stat(logfile.c_str(), &buffer) != 0)
+    if (stat(logfile.c_str(), &buffer) != 0)
     {
         cout << "File " << logfile << " does not exist!\n";
         return 1;
@@ -86,31 +88,65 @@ int main(int argc, char** argv)
 
     fclose(f);
 
-    // Manually decode mavlink messages skipping CRC verification
+    mavlink_message_t msg;
+    mavlink_status_t status;
+
     unsigned int i = 0;
-    do
+
+    while (i < buf.size())
     {
-        if (buf.at(i) == 0xFE)  // Mavlink start delimiter
+        if (USE_MAVLINK_PARSER)
         {
-            MavData d;
-            // Read packet header
-            memcpy(&d, buf.data() + i, sizeof(MavData));
+            uint8_t parse_result =
+                mavlink_parse_char(MAVLINK_COMM_0, buf.at(i), &msg, &status);
 
-            bool decoded = false;
-            for (TelemetryDecoderBase* td : decoders)
+            if (parse_result == 1)
             {
-                if (td->msgId() == d.msg_id)
+                MavData d;
+                d.comp_id = msg.compid;
+                d.len     = msg.len;
+                d.msg_id  = msg.msgid;
+                d.seq     = msg.seq;
+                d.start   = msg.magic;
+                d.sys_id  = msg.sysid;
+
+                for (TelemetryDecoderBase* td : decoders)
                 {
-                    td->decode(d, buf.data() + i + sizeof(MavData));
-                    decoded = true;
+                    if (td->msgId() == msg.msgid)
+                    {
+                        // uint8_t payload[33*8];
+                        
+                        // memcpy(payload, msg.payload64, 33*8);
+
+                        td->decode(d, (uint8_t*)msg.payload64);
+                    }
                 }
             }
+        }
+        else
+        {
+            if (buf.at(i) == 0xFE)  // Mavlink start delimiter
+            {
+                MavData d;
+                // Read packet header
+                memcpy(&d, buf.data() + i, sizeof(MavData));
+
+                // bool decoded = false;
+                for (TelemetryDecoderBase* td : decoders)
+                {
+                    if (td->msgId() == d.msg_id)
+                    {
+                        td->decode(d, buf.data() + i + sizeof(MavData));
+                        // decoded = true;
+                    }
+                }
 
-            // if (!decoded)
-            //     printf("Unknown message id (%d) @ %X\n", d.msg_id, i);
+                // if (!decoded)
+                //     printf("Unknown message id (%d) @ %X\n", d.msg_id, i);
+            }
         }
         i++;
-    } while (i < buf.size());
+    } 
 
     printf(".\n.\n.\nMessages decoded successfully!\n");
 
diff --git a/src/messages.h b/src/messages.h
index db97206144c67446e4834ee5621343a878979dba..23eae2076931c9ece2681a8bb8795e4eef323a7d 100755
--- a/src/messages.h
+++ b/src/messages.h
@@ -1,4 +1,4 @@
-/*
+/* 
  * Copyright (c) 2019 Skyward Experimental Rocketry
  * Author: Erbetta Luca
  *
@@ -21,11 +21,20 @@
  * THE SOFTWARE.
  */
 
-// Generation date: 2019-09-11 16:12:10.827357
+/*
+ ******************************************************************************
+ *                  THIS FILE IS AUTOGENERATED. DO NOT EDIT.                  *
+ *         You should copy the content of this file in messages.h and         *
+ *                        perform eventual edits there.                       *
+ ******************************************************************************
+ */
+
+// Generation date: 2019-11-06 01:40:14.848380
 
 #pragma once
 
 #include "../mavlink_skyward_lib/mavlink_lib/hermes/mavlink.h"
+#include "../mavlink_skyward_lib/bitpacking/hermes/HermesPackets.h"
 
 #include <iostream>
 #include <string>
@@ -50,124 +59,162 @@ struct MavData
 
     void print(ostream &os)
     {
-        os << (int)start << "," << (int)len << "," << (int)seq << ","
+        os << (int)start << "," << (int)len << "," << (int)seq << "," 
            << (int)sys_id << "," << (int)comp_id << "," << (int)msg_id;
     }
 };
 
+struct MavLoggerTmData
+{
+    mavlink_logger_tm_t mav_pkt;
+
+    static void header(ostream &os)
+    {
+        os << "timestamp,statTooLargeSamples,statDroppedSamples,statQueuedSamples,statBufferFilled,statBufferWritten,statWriteFailed,statWriteError,statWriteTime,statMaxWriteTime,statLogNumber\n";
+    }
+
+    void print(ostream &os, unsigned int index = 0)
+    {
+        (void)index; // Avoid unused warnings
+        
+        os << mav_pkt.timestamp << "," << mav_pkt.statTooLargeSamples << "," << mav_pkt.statDroppedSamples << "," << mav_pkt.statQueuedSamples << "," << mav_pkt.statBufferFilled << "," << mav_pkt.statBufferWritten << "," << mav_pkt.statWriteFailed << "," << mav_pkt.statWriteError << "," << mav_pkt.statWriteTime << "," << mav_pkt.statMaxWriteTime << "," << mav_pkt.statLogNumber << "\n";
+    }
+
+    static unsigned int messagesPerPacket()
+    {
+        return 1;
+    }
+};
+
 struct MavAckTmData
 {
     mavlink_ack_tm_t mav_pkt;
 
-    static void header(ostream &os) { os << "recv_msgid,seq_ack\n"; }
+    static void header(ostream &os)
+    {
+        os << "recv_msgid,seq_ack\n";
+    }
 
-    void print(ostream &os)
+    void print(ostream &os, unsigned int index = 0)
     {
+        (void)index; // Avoid unused warnings
+        
         os << (int)mav_pkt.recv_msgid << "," << (int)mav_pkt.seq_ack << "\n";
     }
+
+    static unsigned int messagesPerPacket()
+    {
+        return 1;
+    }
 };
 
-struct MavAdaTmData
+struct MavNoargTcData
 {
-    mavlink_ada_tm_t mav_pkt;
+    mavlink_noarg_tc_t mav_pkt;
 
     static void header(ostream &os)
     {
-        os << "timestamp,target_dpl_altitude,kalman_x0,kalman_x1,kalman_x2,ref_"
-              "pressure,msl_pressure,ref_pressure_mean,ref_pressure_stddev,ref_"
-              "pressure_nsamples,ref_altitude,ref_temperature,msl_temperature,"
-              "state\n";
+        os << "command_id\n";
     }
 
-    void print(ostream &os)
+    void print(ostream &os, unsigned int index = 0)
+    {
+        (void)index; // Avoid unused warnings
+        
+        os << (int)mav_pkt.command_id << "\n";
+    }
+
+    static unsigned int messagesPerPacket()
     {
-        os << mav_pkt.timestamp << "," << mav_pkt.target_dpl_altitude << ","
-           << mav_pkt.kalman_x0 << "," << mav_pkt.kalman_x1 << ","
-           << mav_pkt.kalman_x2 << "," << mav_pkt.ref_pressure << ","
-           << mav_pkt.msl_pressure << "," << mav_pkt.ref_pressure_mean << ","
-           << mav_pkt.ref_pressure_stddev << ","
-           << mav_pkt.ref_pressure_nsamples << "," << mav_pkt.ref_altitude
-           << "," << mav_pkt.ref_temperature << "," << mav_pkt.msl_temperature
-           << "," << (int)mav_pkt.state << "\n";
+        return 1;
     }
 };
 
-struct MavAdcTmData
+struct MavSysTmData
 {
-    mavlink_adc_tm_t mav_pkt;
+    mavlink_sys_tm_t mav_pkt;
 
     static void header(ostream &os)
     {
-        os << "timestamp,hw_baro_volt,nxp_baro_volt,hw_baro_pressure,nxp_baro_"
-              "pressure,battery_voltage,current_sense_1,current_sense_2,hw_"
-              "baro_flag,nxp_baro_flag\n";
+        os << "timestamp,death_stack,logger,ev_broker,pin_obs,fmm,sensor_manager,ada,tmtc,ign,dpl\n";
     }
 
-    void print(ostream &os)
+    void print(ostream &os, unsigned int index = 0)
     {
-        os << mav_pkt.timestamp << "," << mav_pkt.hw_baro_volt << ","
-           << mav_pkt.nxp_baro_volt << "," << mav_pkt.hw_baro_pressure << ","
-           << mav_pkt.nxp_baro_pressure << "," << mav_pkt.battery_voltage << ","
-           << mav_pkt.current_sense_1 << "," << mav_pkt.current_sense_2 << ","
-           << (int)mav_pkt.hw_baro_flag << "," << (int)mav_pkt.nxp_baro_flag
-           << "\n";
+        (void)index; // Avoid unused warnings
+        
+        os << mav_pkt.timestamp << "," << (int)mav_pkt.death_stack << "," << (int)mav_pkt.logger << "," << (int)mav_pkt.ev_broker << "," << (int)mav_pkt.pin_obs << "," << (int)mav_pkt.fmm << "," << (int)mav_pkt.sensor_manager << "," << (int)mav_pkt.ada << "," << (int)mav_pkt.tmtc << "," << (int)mav_pkt.ign << "," << (int)mav_pkt.dpl << "\n";
+    }
+
+    static unsigned int messagesPerPacket()
+    {
+        return 1;
     }
 };
 
-struct MavAdisTmData
+struct MavAdaTmData
 {
-    mavlink_adis_tm_t mav_pkt;
+    mavlink_ada_tm_t mav_pkt;
 
     static void header(ostream &os)
     {
-        os << "timestamp,acc_x,acc_y,acc_z,gyro_x,gyro_y,gyro_z,compass_x,"
-              "compass_y,compass_z,temp,supply_out,aux_adc\n";
+        os << "timestamp,target_dpl_altitude,kalman_x0,kalman_x1,kalman_x2,kalman_acc_x0,kalman_acc_x1,kalman_acc_x2,ref_pressure,msl_pressure,ref_pressure_mean,ref_pressure_stddev,ref_pressure_nsamples,ref_altitude,ref_temperature,msl_temperature,state\n";
     }
 
-    void print(ostream &os)
+    void print(ostream &os, unsigned int index = 0)
     {
-        os << mav_pkt.timestamp << "," << mav_pkt.acc_x << "," << mav_pkt.acc_y
-           << "," << mav_pkt.acc_z << "," << mav_pkt.gyro_x << ","
-           << mav_pkt.gyro_y << "," << mav_pkt.gyro_z << ","
-           << mav_pkt.compass_x << "," << mav_pkt.compass_y << ","
-           << mav_pkt.compass_z << "," << mav_pkt.temp << ","
-           << mav_pkt.supply_out << "," << mav_pkt.aux_adc << "\n";
+        (void)index; // Avoid unused warnings
+        
+        os << mav_pkt.timestamp << "," << mav_pkt.target_dpl_altitude << "," << mav_pkt.kalman_x0 << "," << mav_pkt.kalman_x1 << "," << mav_pkt.kalman_x2 << "," << mav_pkt.kalman_acc_x0 << "," << mav_pkt.kalman_acc_x1 << "," << mav_pkt.kalman_acc_x2 << "," << mav_pkt.ref_pressure << "," << mav_pkt.msl_pressure << "," << mav_pkt.ref_pressure_mean << "," << mav_pkt.ref_pressure_stddev << "," << mav_pkt.ref_pressure_nsamples << "," << mav_pkt.ref_altitude << "," << mav_pkt.ref_temperature << "," << mav_pkt.msl_temperature << "," << (int)mav_pkt.state << "\n";
+    }
+
+    static unsigned int messagesPerPacket()
+    {
+        return 1;
     }
 };
 
-struct MavCanTmData
+struct MavPingTcData
 {
-    mavlink_can_tm_t mav_pkt;
+    mavlink_ping_tc_t mav_pkt;
 
     static void header(ostream &os)
     {
-        os << "last_sent_ts,last_rcv_ts,n_sent,n_rcv,last_sent,last_rcv\n";
+        os << "timestamp\n";
     }
 
-    void print(ostream &os)
+    void print(ostream &os, unsigned int index = 0)
     {
-        os << mav_pkt.last_sent_ts << "," << mav_pkt.last_rcv_ts << ","
-           << mav_pkt.n_sent << "," << mav_pkt.n_rcv << ","
-           << (int)mav_pkt.last_sent << "," << (int)mav_pkt.last_rcv << "\n";
+        (void)index; // Avoid unused warnings
+        
+        os << mav_pkt.timestamp << "\n";
+    }
+
+    static unsigned int messagesPerPacket()
+    {
+        return 1;
     }
 };
 
-struct MavDplTmData
+struct MavRawEventTcData
 {
-    mavlink_dpl_tm_t mav_pkt;
+    mavlink_raw_event_tc_t mav_pkt;
 
     static void header(ostream &os)
     {
-        os << "timestamp,fsm_state,motor_active,motor_last_direction,cutter_"
-              "state\n";
+        os << "Event_id,Topic_id\n";
     }
 
-    void print(ostream &os)
+    void print(ostream &os, unsigned int index = 0)
     {
-        os << mav_pkt.timestamp << "," << (int)mav_pkt.fsm_state << ","
-           << (int)mav_pkt.motor_active << ","
-           << (int)mav_pkt.motor_last_direction << ","
-           << (int)mav_pkt.cutter_state << "\n";
+        (void)index; // Avoid unused warnings
+        
+        os << (int)mav_pkt.Event_id << "," << (int)mav_pkt.Topic_id << "\n";
+    }
+
+    static unsigned int messagesPerPacket()
+    {
+        return 1;
     }
 };
 
@@ -177,138 +224,268 @@ struct MavFmmTmData
 
     static void header(ostream &os)
     {
-        os << "timestamp,pin_launch_last_change,pin_nosecone_last_change,state,"
-              "pin_launch_num_changes,pin_launch_state,pin_nosecone_num_"
-              "changes,pin_nosecone_state\n";
+        os << "timestamp,pin_launch_last_change,pin_nosecone_last_change,state,pin_launch_num_changes,pin_launch_state,pin_nosecone_num_changes,pin_nosecone_state\n";
     }
 
-    void print(ostream &os)
+    void print(ostream &os, unsigned int index = 0)
     {
-        os << mav_pkt.timestamp << "," << mav_pkt.pin_launch_last_change << ","
-           << mav_pkt.pin_nosecone_last_change << "," << (int)mav_pkt.state
-           << "," << (int)mav_pkt.pin_launch_num_changes << ","
-           << (int)mav_pkt.pin_launch_state << ","
-           << (int)mav_pkt.pin_nosecone_num_changes << ","
-           << (int)mav_pkt.pin_nosecone_state << "\n";
+        (void)index; // Avoid unused warnings
+        
+        os << mav_pkt.timestamp << "," << mav_pkt.pin_launch_last_change << "," << mav_pkt.pin_nosecone_last_change << "," << (int)mav_pkt.state << "," << (int)mav_pkt.pin_launch_num_changes << "," << (int)mav_pkt.pin_launch_state << "," << (int)mav_pkt.pin_nosecone_num_changes << "," << (int)mav_pkt.pin_nosecone_state << "\n";
+    }
+
+    static unsigned int messagesPerPacket()
+    {
+        return 1;
     }
 };
 
-struct MavGpsTmData
+struct MavLrTmData
 {
-    mavlink_gps_tm_t mav_pkt;
+    mavlink_lr_tm_t mav_pkt;
+    LowRateTMPacker p{mav_pkt.payload};
+
+    static void header(ostream &os)
+    {
+        os << "liftoff_ts,liftoff_max_acc_ts,liftoff_max_acc,max_zspeed_ts,max_"
+              "zspeed,max_speed_altitude,apogee_ts,nxp_min_pressure,hw_min_"
+              "pressure,kalman_min_pressure,digital_min_pressure,baro_max_"
+              "altitutde "
+              ",gps_max_altitude,apogee_lat,apogee_lon,drogue_dpl_ts,drogue_"
+              "dpl_max_acc,main_dpl_ts,main_dpl_altitude,main_dpl_zspeed,main_"
+              "dpl_acc\n";
+    }
+
+    void print(ostream &os, unsigned int index = 0)
+    {
+        (void)index;
+
+        long long t;
+        float f;
+
+        p.unpackLiftoffTs(&t, 0);
+        os << t << ",";
+        p.unpackLiftoffMaxAccTs(&t, 0);
+        os << t << ",";
+        p.unpackLiftoffMaxAcc(&f, 0);
+        os << f << ",";
+        p.unpackMaxZspeedTs(&t, 0);
+        os << t << ",";
+        p.unpackMaxZspeed(&f, 0);
+        os << f << ",";
+        p.unpackMaxSpeedAltitude(&f, 0);
+        os << f << ",";
+        p.unpackApogeeTs(&t, 0);
+        os << t << ",";
+        p.unpackNxpMinPressure(&f, 0);
+        os << f << ",";
+        p.unpackHwMinPressure(&f, 0);
+        os << f << ",";
+        p.unpackKalmanMinPressure(&f, 0);
+        os << f << ",";
+        p.unpackDigitalMinPressure(&f, 0);
+        os << f << ",";
+        p.unpackBaroMaxAltitutde(&f, 0);
+        os << f << ",";
+        p.unpackGpsMaxAltitude(&f, 0);
+        os << f << ",";
+        p.unpackApogeeLat(&f, 0);
+        os << f << ",";
+        p.unpackApogeeLon(&f, 0);
+        os << f << ",";
+        p.unpackDrogueDplTs(&t, 0);
+        os << t << ",";
+        p.unpackDrogueDplMaxAcc(&f, 0);
+        os << f << ",";
+        p.unpackMainDplTs(&t, 0);
+        os << t << ",";
+        p.unpackMainDplAltitude(&f, 0);
+        os << f << ",";
+        p.unpackMainDplZspeed(&f, 0);
+        os << f << ",";
+        p.unpackMainDplAcc(&f, 0);
+        os << f << "\n";
+    }
+
+    static unsigned int messagesPerPacket() { return 1; }
+};
+
+struct MavHrTmData
+{
+    mavlink_hr_tm_t mav_pkt;
+    HighRateTMPacker p{mav_pkt.payload};
 
     static void header(ostream &os)
     {
-        os << "timestamp,lat,lon,altitude,vel_north,vel_east,vel_down,vel_mag,"
-              "n_satellites,fix\n";
+        os << "timestamp,pressure_ada,pressure_digi,msl_altitude,agl_altitude,"
+              "vert_speed,vert_speed_2,acc_x,acc_y,acc_z,gyro_x,gyro_y,gyro_z,"
+              "gps_lat,gps_lon,gps_alt,temperature,fmm_state,dpl_state,pin_"
+              "launch,pin_nosecone,gps_fix\n";
+    }
+
+    void print(ostream &os, unsigned int i = 0)
+    {
+        long long t;
+        float f;
+        double d;
+        uint8_t b;
+
+        p.unpackTimestamp(&t, i);
+        os << t << ",";
+        p.unpackPressureAda(&f, i);
+        os << f << ",";
+        p.unpackPressureDigi(&f, i);
+        os << f << ",";
+        p.unpackMslAltitude(&f, i);
+        os << f << ",";
+        p.unpackAglAltitude(&f, i);
+        os << f << ",";
+        p.unpackVertSpeed(&f, i);
+        os << f << ",";
+        p.unpackVertSpeed2(&f, i);
+        os << f << ",";
+        p.unpackAccX(&f, i);
+        os << f << ",";
+        p.unpackAccY(&f, i);
+        os << f << ",";
+        p.unpackAccZ(&f, i);
+        os << f << ",";
+        p.unpackGyroX(&f, i);
+        os << f << ",";
+        p.unpackGyroY(&f, i);
+        os << f << ",";
+        p.unpackGyroZ(&f, i);
+        os << f << ",";
+        p.unpackGpsLat(&d, i);
+        os << d << ",";
+        p.unpackGpsLon(&d, i);
+        os << d << ",";
+        p.unpackGpsAlt(&f, i);
+        os << f << ",";
+        p.unpackTemperature(&f, i);
+        os << f << ",";
+        p.unpackFmmState(&b, i);
+        os << (int)b << ",";
+        p.unpackDplState(&b, i);
+        os << (int)b << ",";
+        p.unpackPinLaunch(&b, i);
+        os << (int)b << ",";
+        p.unpackPinNosecone(&b, i);
+        os << (int)b << ",";
+        p.unpackGpsFix(&b, i);
+        os << (int)b << "\n";
+    }
+
+    static unsigned int messagesPerPacket() { return 4; }
+};
+
+struct MavCanTmData
+{
+    mavlink_can_tm_t mav_pkt;
+
+    static void header(ostream &os)
+    {
+        os << "last_sent_ts,last_rcv_ts,n_sent,n_rcv,last_sent,last_rcv\n";
     }
 
-    void print(ostream &os)
+    void print(ostream &os, unsigned int index = 0)
     {
-        os << mav_pkt.timestamp << "," << mav_pkt.lat << "," << mav_pkt.lon
-           << "," << mav_pkt.altitude << "," << mav_pkt.vel_north << ","
-           << mav_pkt.vel_east << "," << mav_pkt.vel_down << ","
-           << mav_pkt.vel_mag << "," << mav_pkt.n_satellites << ","
-           << (int)mav_pkt.fix << "\n";
+        (void)index; // Avoid unused warnings
+        
+        os << mav_pkt.last_sent_ts << "," << mav_pkt.last_rcv_ts << "," << mav_pkt.n_sent << "," << mav_pkt.n_rcv << "," << (int)mav_pkt.last_sent << "," << (int)mav_pkt.last_rcv << "\n";
+    }
+
+    static unsigned int messagesPerPacket()
+    {
+        return 1;
     }
 };
 
-struct MavHrTmData
+struct MavAdcTmData
 {
-    mavlink_hr_tm_t mav_pkt;
+    mavlink_adc_tm_t mav_pkt;
 
     static void header(ostream &os)
     {
-        os << "timestamp,pressure,z_acc,gps_lat,gps_lon,kal_alt,kal_v_speed,"
-              "temperature,fmm_state,dpl_state,gps_fix,nc_pin,launch_pin\n";
+        os << "timestamp,hw_baro_volt,nxp_baro_volt,hw_baro_pressure,nxp_baro_pressure,battery_voltage,current_sense_1,current_sense_2,hw_baro_flag,nxp_baro_flag\n";
     }
 
-    void print(ostream &os)
+    void print(ostream &os, unsigned int index = 0)
     {
-        // Manually edited to decode bitfields
-        uint8_t fmm_state = (mav_pkt.bitfield_1 & 0xF0) >> 4;
-        uint8_t dpl_state = (mav_pkt.bitfield_1 & 0x0F);
-
-        uint8_t launch = mav_pkt.bitfield_2 & 0x1;
-        uint8_t nc     = (mav_pkt.bitfield_2 & 0x2) >> 1;
-        uint8_t fix    = (mav_pkt.bitfield_2 & 0x4) >> 2;
+        (void)index; // Avoid unused warnings
+        
+        os << mav_pkt.timestamp << "," << mav_pkt.hw_baro_volt << "," << mav_pkt.nxp_baro_volt << "," << mav_pkt.hw_baro_pressure << "," << mav_pkt.nxp_baro_pressure << "," << mav_pkt.battery_voltage << "," << mav_pkt.current_sense_1 << "," << mav_pkt.current_sense_2 << "," << (int)mav_pkt.hw_baro_flag << "," << (int)mav_pkt.nxp_baro_flag << "\n";
+    }
 
-        os << mav_pkt.timestamp << "," << mav_pkt.pressure << ","
-           << mav_pkt.z_acc << "," << mav_pkt.gps_lat << "," << mav_pkt.gps_lon
-           << "," << mav_pkt.kal_alt << "," << mav_pkt.kal_v_speed << ","
-           << (int)mav_pkt.temperature << "," << (int)fmm_state << ","
-           << (int)dpl_state << "," << (int)fix << "," << (int)nc << ","
-           << (int)launch << "\n";
+    static unsigned int messagesPerPacket()
+    {
+        return 1;
     }
 };
 
-struct MavIgnTmData
+struct MavTmtcTmData
 {
-    mavlink_ign_tm_t mav_pkt;
+    mavlink_tmtc_tm_t mav_pkt;
 
     static void header(ostream &os)
     {
-        os << "timestamp,n_sent_messages,n_rcv_message,fsm_state,last_event,"
-              "cmd_bitfield,stm32_bitfield,avr_bitfield\n";
+        os << "timestamp,parse_state,n_send_queue,max_send_queue,n_send_errors,packet_rx_success_count,packet_rx_drop_count,msg_received,buffer_overrun,parse_error,packet_idx,current_rx_seq,current_tx_seq\n";
     }
 
-    void print(ostream &os)
+    void print(ostream &os, unsigned int index = 0)
     {
-        os << mav_pkt.timestamp << "," << mav_pkt.n_sent_messages << ","
-           << mav_pkt.n_rcv_message << "," << (int)mav_pkt.fsm_state << ","
-           << (int)mav_pkt.last_event << "," << (int)mav_pkt.cmd_bitfield << ","
-           << (int)mav_pkt.stm32_bitfield << "," << (int)mav_pkt.avr_bitfield
-           << "\n";
+        (void)index; // Avoid unused warnings
+        
+        os << mav_pkt.timestamp << "," << mav_pkt.parse_state << "," << mav_pkt.n_send_queue << "," << mav_pkt.max_send_queue << "," << mav_pkt.n_send_errors << "," << mav_pkt.packet_rx_success_count << "," << mav_pkt.packet_rx_drop_count << "," << (int)mav_pkt.msg_received << "," << (int)mav_pkt.buffer_overrun << "," << (int)mav_pkt.parse_error << "," << (int)mav_pkt.packet_idx << "," << (int)mav_pkt.current_rx_seq << "," << (int)mav_pkt.current_tx_seq << "\n";
+    }
+
+    static unsigned int messagesPerPacket()
+    {
+        return 1;
     }
 };
 
-struct MavLoggerTmData
+struct MavNackTmData
 {
-    mavlink_logger_tm_t mav_pkt;
+    mavlink_nack_tm_t mav_pkt;
 
     static void header(ostream &os)
     {
-        os << "timestamp,statTooLargeSamples,statDroppedSamples,"
-              "statQueuedSamples,statBufferFilled,statBufferWritten,"
-              "statWriteFailed,statWriteError,statWriteTime,statMaxWriteTime,"
-              "statLogNumber\n";
+        os << "recv_msgid,seq_ack\n";
     }
 
-    void print(ostream &os)
+    void print(ostream &os, unsigned int index = 0)
+    {
+        (void)index; // Avoid unused warnings
+        
+        os << (int)mav_pkt.recv_msgid << "," << (int)mav_pkt.seq_ack << "\n";
+    }
+
+    static unsigned int messagesPerPacket()
     {
-        os << mav_pkt.timestamp << "," << mav_pkt.statTooLargeSamples << ","
-           << mav_pkt.statDroppedSamples << "," << mav_pkt.statQueuedSamples
-           << "," << mav_pkt.statBufferFilled << ","
-           << mav_pkt.statBufferWritten << "," << mav_pkt.statWriteFailed << ","
-           << mav_pkt.statWriteError << "," << mav_pkt.statWriteTime << ","
-           << mav_pkt.statMaxWriteTime << "," << mav_pkt.statLogNumber << "\n";
+        return 1;
     }
 };
 
-struct MavLrTmData
+struct MavAdisTmData
 {
-    mavlink_lr_tm_t mav_pkt;
+    mavlink_adis_tm_t mav_pkt;
 
     static void header(ostream &os)
     {
-        os << "t_liftoff,t_max_acc,acc_pf,t_max_speed,v_speed_max,alt_max_"
-              "speed,t_apogee,hw_min_press,nxp_min_press,kal_min_press,kal_max_"
-              "alt,gps_max_alt,lat_apogee,lon_apogee,t_drogue_dpl,max_drogue_"
-              "acc,t_main_dpl,alt_main_dpl,v_speed_main_dpl,max_main_acc\n";
+        os << "timestamp,acc_x,acc_y,acc_z,gyro_x,gyro_y,gyro_z,compass_x,compass_y,compass_z,temp,supply_out,aux_adc\n";
     }
 
-    void print(ostream &os)
+    void print(ostream &os, unsigned int index = 0)
+    {
+        (void)index; // Avoid unused warnings
+        
+        os << mav_pkt.timestamp << "," << mav_pkt.acc_x << "," << mav_pkt.acc_y << "," << mav_pkt.acc_z << "," << mav_pkt.gyro_x << "," << mav_pkt.gyro_y << "," << mav_pkt.gyro_z << "," << mav_pkt.compass_x << "," << mav_pkt.compass_y << "," << mav_pkt.compass_z << "," << mav_pkt.temp << "," << mav_pkt.supply_out << "," << mav_pkt.aux_adc << "\n";
+    }
+
+    static unsigned int messagesPerPacket()
     {
-        os << mav_pkt.t_liftoff << "," << mav_pkt.t_max_acc << ","
-           << mav_pkt.acc_pf << "," << mav_pkt.t_max_speed << ","
-           << mav_pkt.v_speed_max << "," << mav_pkt.alt_max_speed << ","
-           << mav_pkt.t_apogee << "," << mav_pkt.hw_min_press << ","
-           << mav_pkt.nxp_min_press << "," << mav_pkt.kal_min_press << ","
-           << mav_pkt.kal_max_alt << "," << mav_pkt.gps_max_alt << ","
-           << mav_pkt.lat_apogee << "," << mav_pkt.lon_apogee << ","
-           << mav_pkt.t_drogue_dpl << "," << mav_pkt.max_drogue_acc << ","
-           << mav_pkt.t_main_dpl << "," << mav_pkt.alt_main_dpl << ","
-           << mav_pkt.v_speed_main_dpl << "," << mav_pkt.max_main_acc << "\n";
+        return 1;
     }
 };
 
@@ -318,59 +495,107 @@ struct MavMpuTmData
 
     static void header(ostream &os)
     {
-        os << "timestamp,acc_x,acc_y,acc_z,gyro_x,gyro_y,gyro_z,compass_x,"
-              "compass_y,compass_z,temp\n";
+        os << "timestamp,acc_x,acc_y,acc_z,gyro_x,gyro_y,gyro_z,compass_x,compass_y,compass_z,temp\n";
     }
 
-    void print(ostream &os)
+    void print(ostream &os, unsigned int index = 0)
+    {
+        (void)index; // Avoid unused warnings
+        
+        os << mav_pkt.timestamp << "," << mav_pkt.acc_x << "," << mav_pkt.acc_y << "," << mav_pkt.acc_z << "," << mav_pkt.gyro_x << "," << mav_pkt.gyro_y << "," << mav_pkt.gyro_z << "," << mav_pkt.compass_x << "," << mav_pkt.compass_y << "," << mav_pkt.compass_z << "," << mav_pkt.temp << "\n";
+    }
+
+    static unsigned int messagesPerPacket()
     {
-        os << mav_pkt.timestamp << "," << mav_pkt.acc_x << "," << mav_pkt.acc_y
-           << "," << mav_pkt.acc_z << "," << mav_pkt.gyro_x << ","
-           << mav_pkt.gyro_y << "," << mav_pkt.gyro_z << ","
-           << mav_pkt.compass_x << "," << mav_pkt.compass_y << ","
-           << mav_pkt.compass_z << "," << mav_pkt.temp << "\n";
+        return 1;
     }
 };
 
-struct MavNackTmData
+struct MavTestTmData
 {
-    mavlink_nack_tm_t mav_pkt;
+    mavlink_test_tm_t mav_pkt;
 
-    static void header(ostream &os) { os << "recv_msgid,seq_ack\n"; }
+    static void header(ostream &os)
+    {
+        os << "timestamp,pressure_hw,temp_analog,temp_imu,battery_volt,th_cut_1,th_cut_2,gps_nsats\n";
+    }
 
-    void print(ostream &os)
+    void print(ostream &os, unsigned int index = 0)
     {
-        os << (int)mav_pkt.recv_msgid << "," << (int)mav_pkt.seq_ack << "\n";
+        (void)index; // Avoid unused warnings
+        
+        os << mav_pkt.timestamp << "," << mav_pkt.pressure_hw << "," << mav_pkt.temp_analog << "," << mav_pkt.temp_imu << "," << mav_pkt.battery_volt << "," << mav_pkt.th_cut_1 << "," << mav_pkt.th_cut_2 << "," << (int)mav_pkt.gps_nsats << "\n";
+    }
+
+    static unsigned int messagesPerPacket()
+    {
+        return 1;
     }
 };
 
-struct MavNoargTcData
+struct MavTelemetryRequestTcData
 {
-    mavlink_noarg_tc_t mav_pkt;
+    mavlink_telemetry_request_tc_t mav_pkt;
+
+    static void header(ostream &os)
+    {
+        os << "board_id\n";
+    }
 
-    static void header(ostream &os) { os << "command_id\n"; }
+    void print(ostream &os, unsigned int index = 0)
+    {
+        (void)index; // Avoid unused warnings
+        
+        os << (int)mav_pkt.board_id << "\n";
+    }
 
-    void print(ostream &os) { os << (int)mav_pkt.command_id << "\n"; }
+    static unsigned int messagesPerPacket()
+    {
+        return 1;
+    }
 };
 
-struct MavPingTcData
+struct MavDplTmData
 {
-    mavlink_ping_tc_t mav_pkt;
+    mavlink_dpl_tm_t mav_pkt;
+
+    static void header(ostream &os)
+    {
+        os << "timestamp,cutter_1_test_current,cutter_2_test_current,fsm_state,cutter_state\n";
+    }
 
-    static void header(ostream &os) { os << "timestamp\n"; }
+    void print(ostream &os, unsigned int index = 0)
+    {
+        (void)index; // Avoid unused warnings
+        
+        os << mav_pkt.timestamp << "," << mav_pkt.cutter_1_test_current << "," << mav_pkt.cutter_2_test_current << "," << (int)mav_pkt.fsm_state << "," << (int)mav_pkt.cutter_state << "\n";
+    }
 
-    void print(ostream &os) { os << mav_pkt.timestamp << "\n"; }
+    static unsigned int messagesPerPacket()
+    {
+        return 1;
+    }
 };
 
-struct MavRawEventTcData
+struct MavIgnTmData
 {
-    mavlink_raw_event_tc_t mav_pkt;
+    mavlink_ign_tm_t mav_pkt;
 
-    static void header(ostream &os) { os << "Event_id,Topic_id\n"; }
+    static void header(ostream &os)
+    {
+        os << "timestamp,n_sent_messages,n_rcv_message,fsm_state,last_event,cmd_bitfield,stm32_bitfield,avr_bitfield\n";
+    }
 
-    void print(ostream &os)
+    void print(ostream &os, unsigned int index = 0)
     {
-        os << (int)mav_pkt.Event_id << "," << (int)mav_pkt.Topic_id << "\n";
+        (void)index; // Avoid unused warnings
+        
+        os << mav_pkt.timestamp << "," << mav_pkt.n_sent_messages << "," << mav_pkt.n_rcv_message << "," << (int)mav_pkt.fsm_state << "," << (int)mav_pkt.last_event << "," << (int)mav_pkt.cmd_bitfield << "," << (int)mav_pkt.stm32_bitfield << "," << (int)mav_pkt.avr_bitfield << "\n";
+    }
+
+    static unsigned int messagesPerPacket()
+    {
+        return 1;
     }
 };
 
@@ -380,124 +605,89 @@ struct MavSmTmData
 
     static void header(ostream &os)
     {
-        os << "timestamp,task_10hz_min,task_10hz_max,task_10hz_mean,task_10hz_"
-              "stddev,task_20hz_min,task_20hz_max,task_20hz_mean,task_20hz_"
-              "stddev,task_250hz_min,task_250hz_max,task_250hz_mean,task_250hz_"
-              "stddev,sensor_state,state\n";
+        os << "timestamp,task_10hz_min,task_10hz_max,task_10hz_mean,task_10hz_stddev,task_20hz_min,task_20hz_max,task_20hz_mean,task_20hz_stddev,task_250hz_min,task_250hz_max,task_250hz_mean,task_250hz_stddev,sensor_state,state\n";
     }
 
-    void print(ostream &os)
+    void print(ostream &os, unsigned int index = 0)
     {
-        os << mav_pkt.timestamp << "," << mav_pkt.task_10hz_min << ","
-           << mav_pkt.task_10hz_max << "," << mav_pkt.task_10hz_mean << ","
-           << mav_pkt.task_10hz_stddev << "," << mav_pkt.task_20hz_min << ","
-           << mav_pkt.task_20hz_max << "," << mav_pkt.task_20hz_mean << ","
-           << mav_pkt.task_20hz_stddev << "," << mav_pkt.task_250hz_min << ","
-           << mav_pkt.task_250hz_max << "," << mav_pkt.task_250hz_mean << ","
-           << mav_pkt.task_250hz_stddev << "," << mav_pkt.sensor_state << ","
-           << (int)mav_pkt.state << "\n";
+        (void)index; // Avoid unused warnings
+        
+        os << mav_pkt.timestamp << "," << mav_pkt.task_10hz_min << "," << mav_pkt.task_10hz_max << "," << mav_pkt.task_10hz_mean << "," << mav_pkt.task_10hz_stddev << "," << mav_pkt.task_20hz_min << "," << mav_pkt.task_20hz_max << "," << mav_pkt.task_20hz_mean << "," << mav_pkt.task_20hz_stddev << "," << mav_pkt.task_250hz_min << "," << mav_pkt.task_250hz_max << "," << mav_pkt.task_250hz_mean << "," << mav_pkt.task_250hz_stddev << "," << mav_pkt.sensor_state << "," << (int)mav_pkt.state << "\n";
     }
-};
 
-struct MavStartLaunchTcData
-{
-    mavlink_start_launch_tc_t mav_pkt;
-
-    static void header(ostream &os) { os << "launch_code\n"; }
-
-    void print(ostream &os) { os << mav_pkt.launch_code << "\n"; }
+    static unsigned int messagesPerPacket()
+    {
+        return 1;
+    }
 };
 
-struct MavSysTmData
+struct MavUploadSettingTcData
 {
-    mavlink_sys_tm_t mav_pkt;
+    mavlink_upload_setting_tc_t mav_pkt;
 
     static void header(ostream &os)
     {
-        os << "timestamp,death_stack,logger,ev_broker,pin_obs,fmm,sensor_"
-              "manager,ada,tmtc,ign,dpl\n";
+        os << "setting,setting_id\n";
     }
 
-    void print(ostream &os)
+    void print(ostream &os, unsigned int index = 0)
     {
-        os << mav_pkt.timestamp << "," << (int)mav_pkt.death_stack << ","
-           << (int)mav_pkt.logger << "," << (int)mav_pkt.ev_broker << ","
-           << (int)mav_pkt.pin_obs << "," << (int)mav_pkt.fmm << ","
-           << (int)mav_pkt.sensor_manager << "," << (int)mav_pkt.ada << ","
-           << (int)mav_pkt.tmtc << "," << (int)mav_pkt.ign << ","
-           << (int)mav_pkt.dpl << "\n";
+        (void)index; // Avoid unused warnings
+        
+        os << mav_pkt.setting << "," << (int)mav_pkt.setting_id << "\n";
     }
-};
 
-struct MavTelemetryRequestTcData
-{
-    mavlink_telemetry_request_tc_t mav_pkt;
-
-    static void header(ostream &os) { os << "board_id\n"; }
-
-    void print(ostream &os) { os << (int)mav_pkt.board_id << "\n"; }
+    static unsigned int messagesPerPacket()
+    {
+        return 1;
+    }
 };
 
-struct MavTestTmData
+struct MavGpsTmData
 {
-    mavlink_test_tm_t mav_pkt;
+    mavlink_gps_tm_t mav_pkt;
 
     static void header(ostream &os)
     {
-        os << "timestamp,pressure_nxp,pressure_hw,x_acc,z_acc,gps_lat,gps_lon,"
-              "gps_altitude,temp_analog,temp_imu,battery_volt,th_cut_1,th_cut_"
-              "2,gps_fix,gps_nsats,pin_nosecone,pin_launch\n";
+        os << "timestamp,lat,lon,altitude,vel_north,vel_east,vel_down,vel_mag,n_satellites,fix\n";
     }
 
-    void print(ostream &os)
+    void print(ostream &os, unsigned int index = 0)
     {
-        os << mav_pkt.timestamp << "," << mav_pkt.pressure_nxp << ","
-           << mav_pkt.pressure_hw << "," << mav_pkt.x_acc << ","
-           << mav_pkt.z_acc << "," << mav_pkt.gps_lat << "," << mav_pkt.gps_lon
-           << "," << mav_pkt.gps_altitude << "," << mav_pkt.temp_analog << ","
-           << mav_pkt.temp_imu << "," << mav_pkt.battery_volt << ","
-           << mav_pkt.th_cut_1 << "," << mav_pkt.th_cut_2 << ","
-           << (int)mav_pkt.gps_fix << "," << (int)mav_pkt.gps_nsats << ","
-           << (int)mav_pkt.pin_nosecone << "," << (int)mav_pkt.pin_launch
-           << "\n";
+        (void)index; // Avoid unused warnings
+        
+        os << mav_pkt.timestamp << "," << mav_pkt.lat << "," << mav_pkt.lon << "," << mav_pkt.altitude << "," << mav_pkt.vel_north << "," << mav_pkt.vel_east << "," << mav_pkt.vel_down << "," << mav_pkt.vel_mag << "," << mav_pkt.n_satellites << "," << (int)mav_pkt.fix << "\n";
+    }
+
+    static unsigned int messagesPerPacket()
+    {
+        return 1;
     }
 };
 
-struct MavTmtcTmData
+struct MavStartLaunchTcData
 {
-    mavlink_tmtc_tm_t mav_pkt;
+    mavlink_start_launch_tc_t mav_pkt;
 
     static void header(ostream &os)
     {
-        os << "timestamp,parse_state,n_send_queue,max_send_queue,n_send_errors,"
-              "packet_rx_success_count,packet_rx_drop_count,msg_received,"
-              "buffer_overrun,parse_error,packet_idx,current_rx_seq,current_tx_"
-              "seq\n";
+        os << "launch_code\n";
     }
 
-    void print(ostream &os)
+    void print(ostream &os, unsigned int index = 0)
     {
-        os << mav_pkt.timestamp << "," << mav_pkt.parse_state << ","
-           << mav_pkt.n_send_queue << "," << mav_pkt.max_send_queue << ","
-           << mav_pkt.n_send_errors << "," << mav_pkt.packet_rx_success_count
-           << "," << mav_pkt.packet_rx_drop_count << ","
-           << (int)mav_pkt.msg_received << "," << (int)mav_pkt.buffer_overrun
-           << "," << (int)mav_pkt.parse_error << "," << (int)mav_pkt.packet_idx
-           << "," << (int)mav_pkt.current_rx_seq << ","
-           << (int)mav_pkt.current_tx_seq << "\n";
+        (void)index; // Avoid unused warnings
+        
+        os << mav_pkt.launch_code << "\n";
     }
-};
-
-struct MavUploadSettingTcData
-{
-    mavlink_upload_setting_tc_t mav_pkt;
-
-    static void header(ostream &os) { os << "setting,setting_id\n"; }
 
-    void print(ostream &os)
+    static unsigned int messagesPerPacket()
     {
-        os << mav_pkt.setting << "," << (int)mav_pkt.setting_id << "\n";
+        return 1;
     }
 };
 
+
+
 #pragma pack(pop)
+
diff --git a/src/msg_data_struct.template b/src/msg_data_struct.template
index a987fd70488b0cfbd95ccfd119e4e86deab3b75b..df7dc27bcca5728b94ff0d30ed66aa11b3b32abc 100755
--- a/src/msg_data_struct.template
+++ b/src/msg_data_struct.template
@@ -7,9 +7,16 @@ struct $classname
         os << "$headers\n";
     }
 
-    void print(ostream &os)
+    void print(ostream &os, unsigned int index = 0)
     {
+        (void)index; // Avoid unused warnings
+        
         os << $ostream << "\n";
     }
+
+    static unsigned int messagesPerPacket()
+    {
+        return 1;
+    }
 };