From 7b0179aaa34da45a9cc60d1c2c79a0dca1132e20 Mon Sep 17 00:00:00 2001 From: rusefillc Date: Tue, 21 Dec 2021 00:48:13 -0500 Subject: [PATCH] Second CAN #3687 --- firmware/console/status_loop.cpp | 2 +- firmware/controllers/can/can.h | 2 +- firmware/controllers/can/can_rx.cpp | 2 +- firmware/hw_layer/drivers/can/can_hw.cpp | 29 ++++++++++++-------- firmware/hw_layer/drivers/can/can_hw.h | 2 +- firmware/hw_layer/drivers/can/can_msg_tx.cpp | 18 ++++++------ firmware/hw_layer/drivers/can/can_msg_tx.h | 4 +-- 7 files changed, 33 insertions(+), 26 deletions(-) diff --git a/firmware/console/status_loop.cpp b/firmware/console/status_loop.cpp index 11bb3d9006..d541df7585 100644 --- a/firmware/console/status_loop.cpp +++ b/firmware/console/status_loop.cpp @@ -777,7 +777,7 @@ void updateTunerStudioState() { tsOutputChannels->revolutionCounterSinceStart = engine->rpmCalculator.getRevolutionCounterSinceStart(); #if EFI_CAN_SUPPORT - postCanState(tsOutputChannels); + postCanState(); #endif /* EFI_CAN_SUPPORT */ #if EFI_CLOCK_LOCKS diff --git a/firmware/controllers/can/can.h b/firmware/controllers/can/can.h index 028c74f4de..f16077534f 100644 --- a/firmware/controllers/can/can.h +++ b/firmware/controllers/can/can.h @@ -46,7 +46,7 @@ class CanListener; class CanSensorBase; #if EFI_CAN_SUPPORT -void processCanRxMessage(const CANRxFrame& msg, efitick_t nowNt); +void processCanRxMessage(const size_t busIndex, const CANRxFrame& msg, efitick_t nowNt); #endif // EFI_CAN_SUPPORT void registerCanListener(CanListener& listener); diff --git a/firmware/controllers/can/can_rx.cpp b/firmware/controllers/can/can_rx.cpp index 59168f0c02..4b26f26aeb 100644 --- a/firmware/controllers/can/can_rx.cpp +++ b/firmware/controllers/can/can_rx.cpp @@ -158,7 +158,7 @@ static void processCanRxImu(const CANRxFrame& frame, efitick_t nowNt) { } } -void processCanRxMessage(const CANRxFrame &frame, efitick_t nowNt) { +void processCanRxMessage(const size_t busIndex, const CANRxFrame &frame, efitick_t nowNt) { if (engineConfiguration->verboseCan) { printPacket(frame); } diff --git a/firmware/hw_layer/drivers/can/can_hw.cpp b/firmware/hw_layer/drivers/can/can_hw.cpp index e99af1e923..88d2bd01c7 100644 --- a/firmware/hw_layer/drivers/can/can_hw.cpp +++ b/firmware/hw_layer/drivers/can/can_hw.cpp @@ -22,9 +22,6 @@ #include "string.h" #include "mpu_util.h" -static int canReadCounter = 0; -int canWriteOk = 0; -int canWriteNotOk = 0; static bool isCanEnabled = false; // Values below calculated with http://www.bittiming.can-wiki.info/ @@ -150,9 +147,9 @@ public: } // Process the message - canReadCounter++; + engine->outputChannels.canReadCounter++; - processCanRxMessage(m_buffer, getTimeNowNt()); + processCanRxMessage(m_index, m_buffer, getTimeNowNt()); } } @@ -177,7 +174,10 @@ static void canInfo() { boolToString(engineConfiguration->canReadEnabled), boolToString(engineConfiguration->canWriteEnabled), engineConfiguration->canSleepPeriodMs); - efiPrintf("CAN rx_cnt=%d/tx_ok=%d/tx_not_ok=%d", canReadCounter, canWriteOk, canWriteNotOk); + efiPrintf("CAN rx_cnt=%d/tx_ok=%d/tx_not_ok=%d", + engine->outputChannels.canReadCounter, + engine->outputChannels.canWriteOk, + engine->outputChannels.canWriteNotOk); } void setCanType(int type) { @@ -186,10 +186,12 @@ void setCanType(int type) { } #if EFI_TUNER_STUDIO -void postCanState(TunerStudioOutputChannels *tsOutputChannels) { - tsOutputChannels->canReadCounter = isCanEnabled ? canReadCounter : -1; - tsOutputChannels->canWriteOk = isCanEnabled ? canWriteOk : -1; - tsOutputChannels->canWriteNotOk = isCanEnabled ? canWriteNotOk : -1; +void postCanState() { + if (!isCanEnabled) { + engine->outputChannels.canReadCounter = -1; + engine->outputChannels.canWriteOk = -1; + engine->outputChannels.canWriteNotOk = -1; + } } #endif /* EFI_TUNER_STUDIO */ @@ -202,6 +204,8 @@ void enableFrankensoCan() { void stopCanPins() { efiSetPadUnusedIfConfigurationChanged(canTxPin); efiSetPadUnusedIfConfigurationChanged(canRxPin); + efiSetPadUnusedIfConfigurationChanged(can2TxPin); + efiSetPadUnusedIfConfigurationChanged(can2RxPin); } // at the moment we support only very limited runtime configuration change, still not supporting online CAN toggle @@ -232,6 +236,9 @@ void startCanPins() { efiSetPadModeIfConfigurationChanged("CAN TX", canTxPin, PAL_MODE_ALTERNATE(EFI_CAN_TX_AF)); efiSetPadModeIfConfigurationChanged("CAN RX", canRxPin, PAL_MODE_ALTERNATE(EFI_CAN_RX_AF)); + + efiSetPadModeIfConfigurationChanged("CAN2 TX", can2TxPin, PAL_MODE_ALTERNATE(EFI_CAN_TX_AF)); + efiSetPadModeIfConfigurationChanged("CAN2 RX", can2RxPin, PAL_MODE_ALTERNATE(EFI_CAN_RX_AF)); } void initCan(void) { @@ -281,7 +288,7 @@ void initCan(void) { } // Plumb CAN device to tx system - CanTxMessage::setDevice(detectCanDevice(0)); + CanTxMessage::setDevice(detectCanDevice(0), detectCanDevice(1)); // fire up threads, as necessary if (engineConfiguration->canWriteEnabled) { diff --git a/firmware/hw_layer/drivers/can/can_hw.h b/firmware/hw_layer/drivers/can/can_hw.h index 165f1be346..5042254f43 100644 --- a/firmware/hw_layer/drivers/can/can_hw.h +++ b/firmware/hw_layer/drivers/can/can_hw.h @@ -21,6 +21,6 @@ void startCanPins(); void enableFrankensoCan(); bool getIsCanEnabled(void); #if EFI_TUNER_STUDIO -void postCanState(TunerStudioOutputChannels *tsOutputChannels); +void postCanState(); #endif /* EFI_TUNER_STUDIO */ #endif /* EFI_CAN_SUPPORT */ diff --git a/firmware/hw_layer/drivers/can/can_msg_tx.cpp b/firmware/hw_layer/drivers/can/can_msg_tx.cpp index 79b9124921..dfa532caae 100644 --- a/firmware/hw_layer/drivers/can/can_msg_tx.cpp +++ b/firmware/hw_layer/drivers/can/can_msg_tx.cpp @@ -13,14 +13,12 @@ #include "can.h" -extern int canWriteOk; -extern int canWriteNotOk; - #if EFI_CAN_SUPPORT -/*static*/ CANDriver* CanTxMessage::s_device = nullptr; +/*static*/ CANDriver* CanTxMessage::s_devices[2] = {nullptr, nullptr}; -/*static*/ void CanTxMessage::setDevice(CANDriver* device) { - s_device = device; +/*static*/ void CanTxMessage::setDevice(CANDriver* device1, CANDriver* device2) { + s_devices[0] = device1; + s_devices[1] = device2; } #endif // EFI_CAN_SUPPORT @@ -50,7 +48,7 @@ CanTxMessage::CanTxMessage(uint32_t eid, uint8_t dlc, bool isExtended) { CanTxMessage::~CanTxMessage() { #if EFI_CAN_SUPPORT - auto device = s_device; + auto device = s_devices[0]; if (!device) { warning(CUSTOM_ERR_CAN_CONFIGURATION, "CAN configuration issue"); @@ -71,11 +69,13 @@ CanTxMessage::~CanTxMessage() { // 100 ms timeout msg_t msg = canTransmit(device, CAN_ANY_MAILBOX, &m_frame, TIME_MS2I(100)); +#if EFI_TUNER_STUDIO if (msg == MSG_OK) { - canWriteOk++; + engine->outputChannels.canWriteOk++; } else { - canWriteNotOk++; + engine->outputChannels.canWriteNotOk++; } +#endif // EFI_TUNER_STUDIO #endif /* EFI_CAN_SUPPORT */ } diff --git a/firmware/hw_layer/drivers/can/can_msg_tx.h b/firmware/hw_layer/drivers/can/can_msg_tx.h index 437a39be5e..c6ca6278eb 100644 --- a/firmware/hw_layer/drivers/can/can_msg_tx.h +++ b/firmware/hw_layer/drivers/can/can_msg_tx.h @@ -40,7 +40,7 @@ public: /** * Configures the device for all messages to transmit from. */ - static void setDevice(CANDriver* device); + static void setDevice(CANDriver* device1, CANDriver* device2); #endif // EFI_CAN_SUPPORT /** * @brief Read & write the raw underlying 8-byte buffer. @@ -72,7 +72,7 @@ protected: private: #if EFI_CAN_SUPPORT - static CANDriver* s_device; + static CANDriver* s_devices[2]; #endif // EFI_CAN_SUPPORT };