diff --git a/src/shared/drivers/canbus/CanProtocol/CanProtocolTypes.h b/src/shared/drivers/canbus/CanProtocol/CanProtocolTypes.h
index cd867af3461bb1b7d8e4c6c4222491bc6aeb77dc..5ba21104f759841ec4d1d5a4eb84fb166e33795b 100644
--- a/src/shared/drivers/canbus/CanProtocol/CanProtocolTypes.h
+++ b/src/shared/drivers/canbus/CanProtocol/CanProtocolTypes.h
@@ -34,6 +34,134 @@
 namespace Boardcore
 {
 
+struct CanPitotData : PitotData
+{
+    uint8_t secondaryType = 0;
+    uint8_t source        = 0;
+
+    static std::string header()
+    {
+        return "timestamp,deltaP,airspeed,secondaryType,source\n";
+    }
+
+    void print(std::ostream& os) const
+    {
+        os << timestamp << "," << deltaP << "," << airspeed << ","
+           << static_cast<int>(secondaryType) << "," << static_cast<int>(source)
+           << "\n";
+    }
+};
+
+struct CanPressureData : PressureData
+{
+    uint8_t secondaryType = 0;
+    uint8_t source        = 0;
+
+    static std::string header()
+    {
+        return "timestamp,pressure,secondaryType,source\n";
+    }
+
+    void print(std::ostream& os) const
+    {
+        os << pressureTimestamp << "," << pressure
+           << static_cast<int>(secondaryType) << "," << static_cast<int>(source)
+           << "\n";
+    }
+};
+
+struct CanTemperatureData : TemperatureData
+{
+    uint8_t secondaryType = 0;
+    uint8_t source        = 0;
+
+    static std::string header()
+    {
+        return "timestamp,temperature,secondaryType,source\n";
+    }
+
+    void print(std::ostream& os) const
+    {
+        os << temperatureTimestamp << "," << temperature
+           << static_cast<int>(secondaryType) << "," << static_cast<int>(source)
+           << "\n";
+    }
+};
+
+struct CanCurrentData : CurrentData
+{
+    uint8_t secondaryType = 0;
+    uint8_t source        = 0;
+
+    static std::string header()
+    {
+        return "timestamp,current,secondaryType,source\n";
+    }
+
+    void print(std::ostream& os) const
+    {
+        os << currentTimestamp << "," << current
+           << static_cast<int>(secondaryType) << "," << static_cast<int>(source)
+           << "\n";
+    }
+};
+
+struct CanServoData : ServoData
+{
+    uint8_t secondaryType = 0;
+    uint8_t source        = 0;
+
+    static std::string header()
+    {
+        return "timestamp,timer,channel,position,secondaryType,source\n";
+    }
+
+    void print(std::ostream& os) const
+    {
+        os << timestamp << "," << static_cast<int>(timer) << ","
+           << static_cast<int>(channel) << "," << position
+           << static_cast<int>(secondaryType) << "," << static_cast<int>(source)
+           << "\n";
+    }
+};
+
+struct CanBatteryVoltageSensorData : BatteryVoltageSensorData
+{
+    uint8_t secondaryType = 0;
+    uint8_t source        = 0;
+
+    static std::string header()
+    {
+        return "voltageTimestamp,channelId,voltage,batVoltage,secondaryType,"
+               "source\n";
+    }
+
+    void print(std::ostream& os) const
+    {
+        os << voltageTimestamp << "," << static_cast<int>(channelId) << ","
+           << voltage << "," << batVoltage << static_cast<int>(secondaryType)
+           << "," << static_cast<int>(source) << "\n";
+    }
+};
+
+struct CanVoltageData : VoltageData
+{
+    uint8_t secondaryType = 0;
+    uint8_t source        = 0;
+
+    static std::string header()
+    {
+        return "timestamp,voltage,secondaryType,source\n";
+    }
+
+    void print(std::ostream& os) const
+    {
+        os << voltageTimestamp << "," << voltage
+           << static_cast<int>(secondaryType) << "," << static_cast<int>(source)
+           << "\n";
+    }
+};
+
 inline Canbus::CanMessage toCanMessage(const PitotData& data)
 {
     Canbus::CanMessage message;
@@ -142,90 +270,103 @@ inline Canbus::CanMessage toCanMessage(const VoltageData& data)
     return message;
 }
 
-inline PitotData pitotDataFromCanMessage(const Canbus::CanMessage& msg)
+inline CanPitotData pitotDataFromCanMessage(const Canbus::CanMessage& msg)
 {
-    PitotData data;
+    CanPitotData data;
 
     uint32_t airspeed = msg.payload[0];
     memcpy(&(data.airspeed), &airspeed, sizeof(data.airspeed));
 
-    data.deltaP = 0.0;  // put to 0 to avoid undefined behaviour
-
-    data.timestamp = (msg.payload[0] >> 30) & ~0x3;
+    data.deltaP        = 0.0;  // put to 0 to avoid undefined behaviour
+    data.timestamp     = (msg.payload[0] >> 30) & ~0x3;
+    data.secondaryType = msg.getSecondaryType();
+    data.source        = msg.getSource();
 
     return data;
 }
 
-inline PressureData pressureDataFromCanMessage(const Canbus::CanMessage& msg)
+inline CanPressureData pressureDataFromCanMessage(const Canbus::CanMessage& msg)
 {
-    PressureData data;
+    CanPressureData data;
 
     uint32_t pressure = msg.payload[0];
     memcpy(&(data.pressure), &pressure, sizeof(data.pressure));
 
     data.pressureTimestamp = (msg.payload[0] >> 30) & ~0x3;
+    data.secondaryType     = msg.getSecondaryType();
+    data.source            = msg.getSource();
 
     return data;
 }
 
-inline TemperatureData temperatureDataFromCanMessage(
+inline CanTemperatureData temperatureDataFromCanMessage(
     const Canbus::CanMessage& msg)
 {
-    TemperatureData data;
+    CanTemperatureData data;
 
     uint32_t temperature = msg.payload[0];
     memcpy(&(data.temperature), &temperature, sizeof(data.temperature));
 
     data.temperatureTimestamp = (msg.payload[0] >> 30) & ~0x3;
+    data.secondaryType        = msg.getSecondaryType();
+    data.source               = msg.getSource();
 
     return data;
 }
 
-inline CurrentData currentDataFromCanMessage(const Canbus::CanMessage& msg)
+inline CanCurrentData currentDataFromCanMessage(const Canbus::CanMessage& msg)
 {
-    CurrentData data;
+    CanCurrentData data;
 
     uint32_t current = msg.payload[0];
     memcpy(&(data.current), &current, sizeof(data.current));
 
     data.currentTimestamp = (msg.payload[0] >> 30) & ~0x3;
+    data.secondaryType    = msg.getSecondaryType();
+    data.source           = msg.getSource();
 
     return data;
 }
 
-inline ServoData servoDataFromCanMessage(const Canbus::CanMessage& msg)
+inline CanServoData servoDataFromCanMessage(const Canbus::CanMessage& msg)
 {
-    ServoData data;
+    CanServoData data;
 
-    data.timestamp = (msg.payload[0] >> 30) & ~0x3;
-    data.position  = static_cast<uint16_t>(msg.payload[0] >> 16) / 65535.f;
-    data.channel   = static_cast<uint8_t>(msg.payload[0] >> 8);
-    data.timer     = static_cast<uint8_t>(msg.payload[0]);
+    data.timestamp     = (msg.payload[0] >> 30) & ~0x3;
+    data.position      = static_cast<uint16_t>(msg.payload[0] >> 16) / 65535.f;
+    data.channel       = static_cast<uint8_t>(msg.payload[0] >> 8);
+    data.timer         = static_cast<uint8_t>(msg.payload[0]);
+    data.secondaryType = msg.getSecondaryType();
+    data.source        = msg.getSource();
 
     return data;
 }
 
-inline BatteryVoltageSensorData batteryVoltageDataFromCanMessage(
+inline CanBatteryVoltageSensorData batteryVoltageDataFromCanMessage(
     const Canbus::CanMessage& msg)
 {
-    BatteryVoltageSensorData data;
+    CanBatteryVoltageSensorData data;
 
     uint32_t voltage = msg.payload[0];
     memcpy(&(data.batVoltage), &voltage, sizeof(data.batVoltage));
 
     data.voltageTimestamp = (msg.payload[0] >> 30) & ~0x3;
+    data.secondaryType    = msg.getSecondaryType();
+    data.source           = msg.getSource();
 
     return data;
 }
 
-inline VoltageData voltageDataFromCanMessage(const Canbus::CanMessage& msg)
+inline CanVoltageData voltageDataFromCanMessage(const Canbus::CanMessage& msg)
 {
-    VoltageData data;
+    CanVoltageData data;
 
     uint32_t voltage = msg.payload[0];
     memcpy(&(data.voltage), &voltage, sizeof(data.voltage));
 
     data.voltageTimestamp = (msg.payload[0] >> 30) & ~0x3;
+    data.secondaryType    = msg.getSecondaryType();
+    data.source           = msg.getSource();
 
     return data;
 }
diff --git a/src/shared/logger/LogTypes.h b/src/shared/logger/LogTypes.h
index 07868d2566c1a747eba4e20f5f886220fd3b7a5c..d7b770c6ec423c5735aacde7330e266525c48ba7 100644
--- a/src/shared/logger/LogTypes.h
+++ b/src/shared/logger/LogTypes.h
@@ -30,6 +30,7 @@
 #include <diagnostic/PrintLoggerData.h>
 #include <diagnostic/StackData.h>
 #include <drivers/adc/InternalADCData.h>
+#include <drivers/canbus/CanProtocol/CanProtocolTypes.h>
 #include <events/EventData.h>
 #include <logger/Deserializer.h>
 #include <logger/LoggerStats.h>
@@ -140,6 +141,13 @@ void registerTypes(Deserializer& ds)
     ds.registerType<HSCMRNN015PAData>();
     ds.registerType<SSCMRNN030PAData>();
     ds.registerType<PitotData>();
+    ds.registerType<CanPitotData>();
+    ds.registerType<CanPressureData>();
+    ds.registerType<CanTemperatureData>();
+    ds.registerType<CanCurrentData>();
+    ds.registerType<CanServoData>();
+    ds.registerType<CanBatteryVoltageSensorData>();
+    ds.registerType<CanVoltageData>();
 }
 
 }  // namespace LogTypes