From 959ee196d339d84b9b8039c1258356e5fdd50c28 Mon Sep 17 00:00:00 2001 From: Alberto Nidasio <alberto.nidasio@skywarder.eu> Date: Mon, 25 Jul 2022 11:15:43 +0000 Subject: [PATCH] [CanProtocol] Added enqueueEvent and fixed bugs --- .../drivers/canbus/CanDriver/CanDriver.h | 1 + .../canbus/CanProtocol/CanProtocol.cpp | 37 ++++++++++++++++++- .../drivers/canbus/CanProtocol/CanProtocol.h | 7 ++++ .../canbus/CanProtocol/CanProtocolData.h | 13 ++++--- 4 files changed, 51 insertions(+), 7 deletions(-) diff --git a/src/shared/drivers/canbus/CanDriver/CanDriver.h b/src/shared/drivers/canbus/CanDriver/CanDriver.h index f9d9b4932..ed845f5f5 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 f8454775b..64c6a27bd 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 a8792d7c0..fc79de55e 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 ce602864c..b73b40ca8 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); } }; -- GitLab