diff --git a/src/shared/drivers/canbus/CanDriver/CanDriver.h b/src/shared/drivers/canbus/CanDriver/CanDriver.h
index f9d9b493268bd321000865bcfa0e05692ccc51f4..ed845f5f52b5f4748e0f2247d876783c8801eb63 100644
--- a/src/shared/drivers/canbus/CanDriver/CanDriver.h
+++ b/src/shared/drivers/canbus/CanDriver/CanDriver.h
@@ -140,6 +140,7 @@ public:
     /**
      * @brief Adds a new filter to the bus, or returns false if there are no
      * more filter banks available.
+     *
      * @warning Can only be called before init().
      *
      * @param filter Filter to be added
diff --git a/src/shared/drivers/canbus/CanProtocol/CanProtocol.cpp b/src/shared/drivers/canbus/CanProtocol/CanProtocol.cpp
index f8454775b2842f3feb099b0d088397d50832149d..64c6a27bdaaf0cc92de58915d63f46ac21503ff6 100644
--- a/src/shared/drivers/canbus/CanProtocol/CanProtocol.cpp
+++ b/src/shared/drivers/canbus/CanProtocol/CanProtocol.cpp
@@ -39,6 +39,9 @@ bool CanProtocol::start()
 {
     stopFlag = false;
 
+    if (can == nullptr)
+        return false;
+
     // Start sender (joinable thread)
     if (!sndStarted)
     {
@@ -109,7 +112,10 @@ bool CanProtocol::addFilter(uint8_t src, uint64_t dst)
 
     Mask32FilterBank filterBank(id, mask, 1, 1, 0, 0, 0);
 
-    return can->addFilter(filterBank);
+    if (can == nullptr)
+        return false;
+    else
+        return can->addFilter(filterBank);
 }
 
 void CanProtocol::sendMessage(const CanMessage& msg)
@@ -153,6 +159,33 @@ void CanProtocol::sendMessage(const CanMessage& msg)
     }
 }
 
+bool CanProtocol::enqueueEvent(uint8_t priority, uint8_t primaryType,
+                               uint8_t source, uint8_t destination,
+                               uint8_t secondaryType)
+{
+    if (priority > 0xF || primaryType > 0x3F || source > 0xF ||
+        destination > 0xF || secondaryType > 0xF)
+        return false;
+
+    CanMessage msg{};
+
+    // Length set to a minumum of 1 even if there is no payload
+    msg.length     = 1;
+    msg.payload[0] = 0xFF;
+
+    // clang-format off
+    msg.id =  priority      << static_cast<uint32_t>(CanProtocolShiftInformation::PRIORITY);
+    msg.id |= primaryType   << static_cast<uint32_t>(CanProtocolShiftInformation::PRIMARY_TYPE);
+    msg.id |= source        << static_cast<uint32_t>(CanProtocolShiftInformation::SOURCE);
+    msg.id |= destination   << static_cast<uint32_t>(CanProtocolShiftInformation::DESTINATION);
+    msg.id |= secondaryType << static_cast<uint32_t>(CanProtocolShiftInformation::SECONDARY_TYPE);
+    // clang-format off
+
+    LOG_DEBUG(logger, "Sending message with id: {:x}", msg.id);
+
+    return enqueueMsg(msg);
+}
+
 void CanProtocol::runReceiver()
 {
     CanMessage msg;
@@ -216,6 +249,8 @@ void CanProtocol::runReceiver()
             // reset the message
             if (nReceived == msg.length && nReceived != 0)
             {
+                LOG_DEBUG(logger, "Message ready with id: {:x}", msg.id);
+
                 onReceive(msg);
 
                 // Reset the packet
diff --git a/src/shared/drivers/canbus/CanProtocol/CanProtocol.h b/src/shared/drivers/canbus/CanProtocol/CanProtocol.h
index a8792d7c08016fbbd3f9192d2bd3927bb1a4b962..fc79de55e28f26e80d359a7f1d875f807c6a02dc 100644
--- a/src/shared/drivers/canbus/CanProtocol/CanProtocol.h
+++ b/src/shared/drivers/canbus/CanProtocol/CanProtocol.h
@@ -93,6 +93,13 @@ public:
      */
     bool enqueueMsg(const CanMessage& msg);
 
+    /**
+     * @brief Non-blocking send function for an event (a message without
+     * payload).
+     */
+    bool enqueueEvent(uint8_t priority, uint8_t primaryType, uint8_t source,
+                      uint8_t destination, uint8_t secondaryType);
+
     /**
      * @brief Non-blocking send function for a generic data type.
      *
diff --git a/src/shared/drivers/canbus/CanProtocol/CanProtocolData.h b/src/shared/drivers/canbus/CanProtocol/CanProtocolData.h
index ce602864c7f3b14bc1a5021ff7872fd55113688c..b73b40ca8535cf0f5bfacffc48d703ede106ed66 100644
--- a/src/shared/drivers/canbus/CanProtocol/CanProtocolData.h
+++ b/src/shared/drivers/canbus/CanProtocol/CanProtocolData.h
@@ -85,7 +85,7 @@ enum class CanProtocolIdMask : uint32_t
     PRIORITY       = 0x1E000000,
     PRIMARY_TYPE   = 0x01F80000,
     SOURCE         = 0x00078000,
-    DESTINATION    = 0x00003800,
+    DESTINATION    = 0x00007800,
     SECONDARY_TYPE = 0x00000780,
 
     MESSAGE_INFORMATION = 0x1FFFFF80,
@@ -138,27 +138,28 @@ struct CanMessage
 
     uint8_t getPrimaryType() const
     {
-        return (id | static_cast<uint32_t>(CanProtocolIdMask::PRIMARY_TYPE)) >>
+        return (id & static_cast<uint32_t>(CanProtocolIdMask::PRIMARY_TYPE)) >>
                static_cast<uint8_t>(CanProtocolShiftInformation::PRIMARY_TYPE);
     }
 
     uint8_t getSource() const
     {
-        return (id | static_cast<uint32_t>(CanProtocolIdMask::SOURCE)) >>
+        return (id & static_cast<uint32_t>(CanProtocolIdMask::SOURCE)) >>
                static_cast<uint8_t>(CanProtocolShiftInformation::SOURCE);
     }
 
     uint8_t getDestination() const
     {
-        return (id | static_cast<uint32_t>(CanProtocolIdMask::DESTINATION)) >>
+        return (id & static_cast<uint32_t>(CanProtocolIdMask::DESTINATION)) >>
                static_cast<uint8_t>(CanProtocolShiftInformation::DESTINATION);
     }
 
     uint8_t getSecondaryType() const
     {
-        return (id |
+        return (id &
                 static_cast<uint32_t>(CanProtocolIdMask::SECONDARY_TYPE)) >>
-               static_cast<uint8_t>(CanProtocolShiftInformation::PRIMARY_TYPE);
+               static_cast<uint8_t>(
+                   CanProtocolShiftInformation::SECONDARY_TYPE);
     }
 };