diff --git a/.vscode/settings.json b/.vscode/settings.json index caa4ff15bf38b4658d34a4bf0af6745b62d54e44..ba530265aee5551604bf78df79042eaae66e1dba 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -118,19 +118,28 @@ "specialfunctions": "cpp" }, "cSpell.words": [ + "abom", "ADCPRE", + "addfilter", "ADON", "aelf", "airbrakes", "Airbrakes", + "Alain", "Alessandro", + "ALST", "AMSL", + "apbclk", "atthr", "AVDD", + "awum", "Baro", + "bittiming", "boardcore", "Boardcorev", "boudrate", + "Canbus", + "Carlucci", "Corigliano", "CORTEXM", "cpitch", @@ -153,6 +162,8 @@ "Fatttr", "fedetft's", "fiprintf", + "FMPIE", + "FOVR", "Gatttr", "getdetahstate", "GNSS", @@ -169,10 +180,15 @@ "Hatt", "HIFCR", "HISR", + "hppw", "HSCMAND", "HSCMRNN", "HWMAPPING", "IDLEIE", + "Impli", + "Implii", + "INAK", + "INRQ", "irqn", "irqv", "JEOC", @@ -182,6 +198,7 @@ "Kalman", "Katt", "kbps", + "LBKM", "ldrex", "leds", "LIFCR", @@ -198,6 +215,7 @@ "mosi", "MPXHZ", "Musso", + "nart", "NATT", "NBAR", "NDTR", @@ -213,13 +231,21 @@ "PINC", "Pitot", "Plin", + "prescaler", "Qgbw", "Qget", "Qhandle", "Qput", "Qwait", "Qwakeup", + "RDHR", + "RDLR", + "RDTR", + "rflm", + "RFOM", "Riccardo", + "RQCP", + "RXIRQ", "RXNE", "RXNEIE", "sats", @@ -239,11 +265,19 @@ "syaw", "TCIE", "TCIF", + "TDHR", + "TDLR", + "TDTR", "TEIE", "Terraneo", "testsuite", + "TMEIE", "TSCPP", "TSVREFE", + "txfp", + "TXIRQ", + "TXOK", + "TXRQ", "Ublox", "UBXACK", "UBXGPS", diff --git a/cmake/boardcore.cmake b/cmake/boardcore.cmake index b853f0628a71eb8045e1dc9c036fcd5e25d394dc..3453618b78c814bded59867f2d416255aad4744b 100644 --- a/cmake/boardcore.cmake +++ b/cmake/boardcore.cmake @@ -45,9 +45,9 @@ foreach(OPT_BOARD ${BOARDS}) # Drivers ${SBS_BASE}/src/shared/drivers/adc/InternalTemp.cpp ${SBS_BASE}/src/shared/drivers/adc/InternalADC.cpp - ${SBS_BASE}/src/shared/drivers/canbus/Canbus.cpp - ${SBS_BASE}/src/shared/drivers/canbus/CanInterrupt.cpp - ${SBS_BASE}/src/shared/drivers/canbus/CanProtocol.cpp + ${SBS_BASE}/src/shared/drivers/canbus/CanDriver/CanDriver.cpp + ${SBS_BASE}/src/shared/drivers/canbus/CanDriver/CanInterrupt.cpp + ${SBS_BASE}/src/shared/drivers/canbus/CanProtocol/CanProtocol.cpp ${SBS_BASE}/src/shared/drivers/i2c/stm32f2_f4_i2c.cpp ${SBS_BASE}/src/shared/drivers/interrupt/external_interrupts.cpp ${SBS_BASE}/src/shared/drivers/timer/PWM.cpp diff --git a/src/shared/drivers/canbus/BusLoadEstimation.h b/src/shared/drivers/canbus/CanDriver/BusLoadEstimation.h similarity index 100% rename from src/shared/drivers/canbus/BusLoadEstimation.h rename to src/shared/drivers/canbus/CanDriver/BusLoadEstimation.h diff --git a/src/shared/drivers/canbus/CanData.h b/src/shared/drivers/canbus/CanDriver/CanData.h similarity index 100% rename from src/shared/drivers/canbus/CanData.h rename to src/shared/drivers/canbus/CanDriver/CanData.h diff --git a/src/shared/drivers/canbus/Canbus.cpp b/src/shared/drivers/canbus/CanDriver/CanDriver.cpp similarity index 94% rename from src/shared/drivers/canbus/Canbus.cpp rename to src/shared/drivers/canbus/CanDriver/CanDriver.cpp index b7d70591a2b90d79f7ba675bd98c6858e89192ad..dc9469bddda098bdeac1b050a113bc04e734128c 100644 --- a/src/shared/drivers/canbus/Canbus.cpp +++ b/src/shared/drivers/canbus/CanDriver/CanDriver.cpp @@ -20,7 +20,7 @@ * THE SOFTWARE. */ -#include "Canbus.h" +#include "CanDriver.h" #include <kernel/scheduler/scheduler.h> #include <utils/ClockUtils.h> @@ -53,26 +53,23 @@ CanbusDriver::CanbusDriver(CAN_TypeDef* can, CanbusConfig config, ClockUtils::enablePeripheralClock(can); // Enter init mode - can->MCR &= (~CAN_MCR_SLEEP); + can->MCR &= ~CAN_MCR_SLEEP; can->MCR |= CAN_MCR_INRQ; while ((can->MSR & CAN_MSR_INAK) == 0) ; + // Automatic wakeup when a new packet is available if (config.awum) - { - can->MCR |= - CAN_MCR_AWUM; // Automatic wakeup when a new packet is available - } + can->MCR |= CAN_MCR_AWUM; + // Automatically recover from Bus-Off mode if (config.abom) - { - can->MCR |= CAN_MCR_ABOM; // Automatically recover from Bus-Off mode - } + can->MCR |= CAN_MCR_ABOM; + + // Disable automatic retransmission if (config.nart) - { - can->MCR |= CAN_MCR_NART; // Disable automatic retransmission - } + can->MCR |= CAN_MCR_NART; // Bit timing configuration can->BTR &= ~CAN_BTR_BRP; @@ -86,21 +83,15 @@ CanbusDriver::CanbusDriver(CAN_TypeDef* can, CanbusConfig config, can->BTR |= ((bitTiming.SJW - 1) & 0x3) << 24; if (config.loopback) - { can->BTR |= CAN_BTR_LBKM; - } // Enter filter initialization mode can->FMR |= CAN_FMR_FINIT; if (can == CAN1) - { canDrivers[0] = this; - } else - { canDrivers[1] = this; - } // Enable interrupts can->IER |= CAN_IER_FMPIE0 | CAN_IER_FMPIE1 | CAN_IER_TMEIE; @@ -139,7 +130,7 @@ CanbusDriver::BitTiming CanbusDriver::calcBitTiming(AutoBitTiming autoBt) 1 << 10), 1); - // Given N, calculate BS1 and BS2 that statusult in a sample time as + // Given N, calculate BS1 and BS2 that result in a sample time as // close as possible to the target one cfgIter.BS1 = std::min(std::max((int)roundf(autoBt.samplePoint * N - 1), 1), @@ -190,9 +181,7 @@ CanbusDriver::BitTiming CanbusDriver::calcBitTiming(AutoBitTiming autoBt) void CanbusDriver::init() { if (isInit) - { return; - } PrintLogger ls = l.getChild("init"); @@ -203,9 +192,7 @@ void CanbusDriver::init() LOG_DEBUG(ls, "Waiting for canbus synchronization..."); while ((can->MSR & CAN_MSR_INAK) > 0) - { Thread::sleep(1); - } LOG_INFO(ls, "Canbus synchronized! Init done!"); @@ -221,6 +208,7 @@ bool CanbusDriver::addFilter(FilterBank filter) LOG_ERR(ls, "Cannot add filter: canbus already initialized"); return false; } + if (filterIndex == NUM_FILTER_BANKS) { LOG_ERR(ls, "Cannot add filter: no more filter banks available"); @@ -256,6 +244,7 @@ uint32_t CanbusDriver::send(CanPacket packet) { miosix::FastInterruptDisableLock d; + // Wait until there is an empty mailbox available to use while ((can->TSR & CAN_TSR_TME) == 0) { @@ -312,13 +301,9 @@ uint32_t CanbusDriver::send(CanPacket packet) for (uint8_t i = 0; i < packet.length; ++i) { if (i < 4) - { mailbox->TDLR |= packet.data[i] << i * 8; - } else - { mailbox->TDHR |= packet.data[i] << (i - 4) * 8; - } } // Finally send the packet @@ -336,13 +321,9 @@ void CanbusDriver::handleRXInterrupt(int fifo) mailbox = &can->sFIFOMailBox[fifo]; if (fifo == 0) - { RFR = &can->RF0R; - } else - { RFR = &can->RF1R; - } status.fifoOverrun = (*RFR & CAN_RF0R_FOVR0) > 0; status.fifoFull = (*RFR & CAN_RF0R_FULL0) > 0; @@ -365,25 +346,18 @@ void CanbusDriver::handleRXInterrupt(int fifo) p.rtr = (mailbox->RIR & CAN_RI0R_RTR) > 0; if (p.ext) - { p.id = (mailbox->RIR >> 3) & 0x1FFFFFFF; - } else - { p.id = (mailbox->RIR >> 21) & 0x7FF; - } + p.length = mailbox->RDTR & CAN_RDT0R_DLC; for (uint8_t i = 0; i < p.length; i++) { if (i < 4) // Low register - { p.data[i] = (mailbox->RDLR >> (i * 8)) & 0xFF; - } else // High register - { p.data[i] = (mailbox->RDHR >> ((i - 4) * 8)) & 0xFF; - } } *RFR |= CAN_RF0R_RFOM0; diff --git a/src/shared/drivers/canbus/Canbus.h b/src/shared/drivers/canbus/CanDriver/CanDriver.h similarity index 94% rename from src/shared/drivers/canbus/Canbus.h rename to src/shared/drivers/canbus/CanDriver/CanDriver.h index b841096f29ade3f3ec47fb8af18198709075e4bf..07006aa3752021ebad17d7fe3a25ff13d19562da 100644 --- a/src/shared/drivers/canbus/Canbus.h +++ b/src/shared/drivers/canbus/CanDriver/CanDriver.h @@ -38,8 +38,8 @@ namespace Canbus { /** - * @brief Low level canbus driver, with support for both peripherals (CAN1 and - * CAN2) on stm32f4 micros. + * @brief Low level CanBus driver, with support for both peripherals (CAN1 and + * CAN2) on stm32f4 microcontrollers. */ class CanbusDriver { @@ -56,7 +56,7 @@ class CanbusDriver public: /** - * @brief Configuration struct for basic canbus operation. + * @brief Configuration struct for basic CanBus operation. */ struct CanbusConfig { @@ -81,7 +81,7 @@ public: { /** * @brief Canbus baud rate in bps (BITS PER SECOND). CANOpen standard - * values are preferred but not mandatory: 1000 kpbs, 500 kbps, 250 + * values are preferred but not mandatory: 1000 kbps, 500 kbps, 250 * kbps, 125 kbps, 100 kbps, 83.333 kbps, 50 kbps, 25 kbps and 10 kbps. */ uint32_t baudRate; @@ -93,7 +93,7 @@ public: }; /** - * @brief Struct specifing exact bit timing registers values. + * @brief Struct specifying exact bit timing registers values. */ struct BitTiming { @@ -133,7 +133,7 @@ public: ~CanbusDriver(); /** - * @brief Exits initialization mode and starts canbus operation. + * @brief Exits initialization mode and starts CanBus operation. */ void init(); @@ -173,7 +173,7 @@ public: } /** - * @brief Returns the canbus peripheral assigned to this instance. + * @brief Returns the CanBus peripheral assigned to this instance. */ CAN_TypeDef* getCAN() { return can; } diff --git a/src/shared/drivers/canbus/CanInterrupt.cpp b/src/shared/drivers/canbus/CanDriver/CanInterrupt.cpp similarity index 99% rename from src/shared/drivers/canbus/CanInterrupt.cpp rename to src/shared/drivers/canbus/CanDriver/CanInterrupt.cpp index e0312b326dc917837e84f4faca875d6f22fa62c8..4ed47a191f8c8afa1a0716b7f1b0bfc08642cf47 100644 --- a/src/shared/drivers/canbus/CanInterrupt.cpp +++ b/src/shared/drivers/canbus/CanDriver/CanInterrupt.cpp @@ -26,7 +26,7 @@ #include <kernel/scheduler/scheduler.h> #include <miosix.h> -#include "Canbus.h" +#include "CanDriver.h" namespace Boardcore { @@ -98,9 +98,7 @@ void __attribute__((used)) CAN_RXIRQHandlerImpl(int canDev, int fifo) (void)canDev; if (canDrivers[canDev]) - { canDrivers[canDev]->handleRXInterrupt(fifo); - } } void __attribute__((used)) CAN_TXIRQHandlerImpl(int canDev) diff --git a/src/shared/drivers/canbus/CanInterrupt.h b/src/shared/drivers/canbus/CanDriver/CanInterrupt.h similarity index 100% rename from src/shared/drivers/canbus/CanInterrupt.h rename to src/shared/drivers/canbus/CanDriver/CanInterrupt.h diff --git a/src/shared/drivers/canbus/Filters.h b/src/shared/drivers/canbus/CanDriver/Filters.h similarity index 100% rename from src/shared/drivers/canbus/Filters.h rename to src/shared/drivers/canbus/CanDriver/Filters.h diff --git a/src/shared/drivers/canbus/CanProtocol.cpp b/src/shared/drivers/canbus/CanProtocol/CanProtocol.cpp similarity index 100% rename from src/shared/drivers/canbus/CanProtocol.cpp rename to src/shared/drivers/canbus/CanProtocol/CanProtocol.cpp diff --git a/src/shared/drivers/canbus/CanProtocol.h b/src/shared/drivers/canbus/CanProtocol/CanProtocol.h similarity index 99% rename from src/shared/drivers/canbus/CanProtocol.h rename to src/shared/drivers/canbus/CanProtocol/CanProtocol.h index d2be1c2efe69dc3fba64068530dd3e6e8b4d5a5e..88316ffad940f4884fa1a000f5a02e10dee9a732 100644 --- a/src/shared/drivers/canbus/CanProtocol.h +++ b/src/shared/drivers/canbus/CanProtocol/CanProtocol.h @@ -23,13 +23,12 @@ #pragma once #include <ActiveObject.h> +#include <drivers/canbus/CanDriver/CanDriver.h> #include <utils/Debug.h> #include <utils/collections/IRQCircularBuffer.h> #include <thread> -#include "Canbus.h" - #define N_BOARDS 3 ///< Number of boards on the bus. namespace Boardcore diff --git a/src/tests/drivers/canbus/SimpleCanManager.h b/src/tests/drivers/canbus/SimpleCanManager.h index f7ff5a59d5c65a83500948b128f2f0714c344701..141c5a60e2fe12c72607cd171f35231313874559 100644 --- a/src/tests/drivers/canbus/SimpleCanManager.h +++ b/src/tests/drivers/canbus/SimpleCanManager.h @@ -21,16 +21,16 @@ */ #pragma once + +#include <ActiveObject.h> +#include <drivers/canbus/CanDriver/BusLoadEstimation.h> +#include <drivers/canbus/CanDriver/CanDriver.h> #include <miosix.h> +#include <utils/collections/SyncCircularBuffer.h> #include <cstdlib> #include <functional> -#include "ActiveObject.h" -#include "drivers/canbus/BusLoadEstimation.h" -#include "drivers/canbus/Canbus.h" -#include "utils/collections/SyncCircularBuffer.h" - using std::function; class SimpleCanManager diff --git a/src/tests/drivers/canbus/test-can-protocol.cpp b/src/tests/drivers/canbus/test-can-protocol.cpp index 04b1fae84d928f8b93fb18d67fbea7f78c3a15f6..01b8a5f271fbaa49bc0834ca788c8a164f7edae1 100644 --- a/src/tests/drivers/canbus/test-can-protocol.cpp +++ b/src/tests/drivers/canbus/test-can-protocol.cpp @@ -22,13 +22,13 @@ * THE SOFTWARE. */ -#include <drivers/canbus/CanProtocol.h> +#include <drivers/canbus/CanDriver/BusLoadEstimation.h> +#include <drivers/canbus/CanDriver/CanDriver.h> +#include <drivers/canbus/CanProtocol/CanProtocol.h> #include <functional> #include <thread> -#include "drivers/canbus/BusLoadEstimation.h" -#include "drivers/canbus/Canbus.h" #include "utils/collections/CircularBuffer.h" constexpr uint32_t BAUD_RATE = 500 * 1000; diff --git a/src/tests/drivers/canbus/test-canbus-2way.cpp b/src/tests/drivers/canbus/test-canbus-2way.cpp index 91b69f5c2b9589fc67bfe5c843f0ed3eadad35b9..1a22bdfc874f306cfa4222838a19cd6b7ac02628 100644 --- a/src/tests/drivers/canbus/test-canbus-2way.cpp +++ b/src/tests/drivers/canbus/test-canbus-2way.cpp @@ -25,17 +25,17 @@ // considered lost. It may also receive requests from other canbus devices, to // which it will respond +#include <ActiveObject.h> +#include <diagnostic/PrintLogger.h> +#include <drivers/canbus/CanDriver/BusLoadEstimation.h> +#include <drivers/canbus/CanDriver/CanDriver.h> #include <utils/Debug.h> #include <utils/Stats/Stats.h> +#include <utils/collections/CircularBuffer.h> #include <string> -#include "ActiveObject.h" #include "SimpleCanManager.h" -#include "diagnostic/PrintLogger.h" -#include "drivers/canbus/BusLoadEstimation.h" -#include "drivers/canbus/Canbus.h" -#include "utils/collections/CircularBuffer.h" constexpr uint32_t BAUD_RATE = 500 * 1000; constexpr float SAMPLE_POINT = 87.5f / 100.0f; diff --git a/src/tests/drivers/canbus/test-canbus-filters.cpp b/src/tests/drivers/canbus/test-canbus-filters.cpp index 64c8868840454afd28abcb7506592713ceb08095..c56e948c238fa50528df5466e64290f296fa2914 100644 --- a/src/tests/drivers/canbus/test-canbus-filters.cpp +++ b/src/tests/drivers/canbus/test-canbus-filters.cpp @@ -23,7 +23,7 @@ #include <ActiveObject.h> #include <diagnostic/PrintLogger.h> #include <drivers/canbus/BusLoadEstimation.h> -#include <drivers/canbus/Canbus.h> +#include <drivers/canbus/CanDriver.h> #include <string> diff --git a/src/tests/drivers/canbus/test-canbus-loopback.cpp b/src/tests/drivers/canbus/test-canbus-loopback.cpp index d01ac89a1eee286837069dde8cbd8c8eef46e28e..06559020e6eaee2e933d2ce66696ec2a1c5baf44 100644 --- a/src/tests/drivers/canbus/test-canbus-loopback.cpp +++ b/src/tests/drivers/canbus/test-canbus-loopback.cpp @@ -20,12 +20,12 @@ * THE SOFTWARE. */ -#include <string> +#include <ActiveObject.h> +#include <diagnostic/PrintLogger.h> +#include <drivers/canbus/CanDriver/BusLoadEstimation.h> +#include <drivers/canbus/CanDriver/CanDriver.h> -#include "ActiveObject.h" -#include "diagnostic/PrintLogger.h" -#include "drivers/canbus/BusLoadEstimation.h" -#include "drivers/canbus/Canbus.h" +#include <string> using std::string; using namespace Boardcore;