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); } };