@@ -5,8 +5,6 @@ CANInterface::CANInterface(const Config &config)
55 m_CANBus2(config.can2_RX, config.can2_TX, config.frequency_hz),
66 m_activeCANBus(&m_CANBus1),
77 m_rxPostmanThread(RX_POSTMAN_THREAD_PRIORITY),
8- m_rxClientThread(RX_CLIENT_THREAD_PRIORITY),
9- m_txProcessorThread(TX_PROCESSOR_THREAD_PRIORITY),
108 m_rxMsgMap(config.rxMsgMap),
119 m_txMsgMap(config.txMsgMap),
1210 m_rxOneShotMsgHandler(config.rxOneShotMsgHandler),
@@ -22,8 +20,6 @@ CANInterface::CANInterface(const Config &config)
2220
2321 // Processing threads
2422 m_rxPostmanThread.start (callback (&m_rxEventQueue, &EventQueue::dispatch_forever));
25- m_rxClientThread.start (callback (this , &CANInterface::rxClient));
26- m_txProcessorThread.start (callback (this , &CANInterface::txProcessor));
2723
2824 // RX ISR
2925 m_CANBus1.attach (callback (this , &CANInterface::rxISR), CAN::RxIrq);
@@ -52,63 +48,60 @@ void CANInterface::rxPostman(void) {
5248 can_irq_set (m_activeCANBus->getHandle (), IRQ_RX, true );
5349}
5450
55- void CANInterface::rxClient (void ) {
56- while (true ) {
57- CANMsg *mail = nullptr ;
58- // Check if a message has arrived:
59- mail = m_rxMailbox.try_get ();
51+ void CANInterface::rxClientPeriodic (void ) {
52+ CANMsg *mail = nullptr ;
53+ // Check if a message has arrived:
54+ mail = m_rxMailbox.try_get ();
55+
56+ MBED_ASSERT (mail != nullptr );
6057
61- MBED_ASSERT (mail != nullptr );
58+ // Extract message
59+ CANMsg msg = *mail;
60+ MBED_ASSERT (m_rxMailbox.free (mail) == osOK);
6261
63- // Extract message
64- CANMsg msg = *mail;
65- MBED_ASSERT (m_rxMailbox.free (mail) == osOK);
62+ // Check if message is intended to be received by this node
63+ m_rxMutex.lock ();
64+ bool validMsgReceived = (m_rxMsgMap != nullptr ) && m_rxMsgMap->contains (msg.getID ());
65+ m_rxMutex.unlock ();
6666
67- // Check if message is intended to be received by this node
67+ if (validMsgReceived) {
68+ HWBRIDGE::CANMsgData_t msgData;
69+ msg.getPayload (msgData);
70+
71+ // Extract message signals and put into RX message map
6872 m_rxMutex.lock ();
69- bool validMsgReceived = (m_rxMsgMap != nullptr ) && m_rxMsgMap-> contains ( msg.getID ());
73+ bool msgUnpacked = HWBRIDGE::unpackCANMsg (msgData. raw , msg.getID (), m_rxMsgMap );
7074 m_rxMutex.unlock ();
7175
72- if (validMsgReceived) {
73- HWBRIDGE::CANMsgData_t msgData;
74- msg.getPayload (msgData);
75-
76- // Extract message signals and put into RX message map
77- m_rxMutex.lock ();
78- bool msgUnpacked = HWBRIDGE::unpackCANMsg (msgData.raw , msg.getID (), m_rxMsgMap);
79- m_rxMutex.unlock ();
80-
81- if (msgUnpacked) {
82- // If message is one-shot, process message
83- if ((m_rxOneShotMsgHandler != nullptr ) && m_rxOneShotMsgHandler->contains (msg.getID ())) {
84- if (m_rxOneShotMsgHandler->at (msg.getID ())() != MBED_SUCCESS) {
85- MBED_WARNING (MBED_MAKE_ERROR (MBED_MODULE_PLATFORM, MBED_ERROR_CODE_FAILED_OPERATION),
86- " Failed to process CAN message" );
87- }
88- m_numOneShotMsgsReceived++;
89- }
90- // Otherwise message is streamed
91- else {
92- m_numStreamedMsgsReceived++;
76+ if (msgUnpacked) {
77+ // If message is one-shot, process message
78+ if ((m_rxOneShotMsgHandler != nullptr ) && m_rxOneShotMsgHandler->contains (msg.getID ())) {
79+ if (m_rxOneShotMsgHandler->at (msg.getID ())() != MBED_SUCCESS) {
80+ MBED_WARNING (MBED_MAKE_ERROR (MBED_MODULE_PLATFORM, MBED_ERROR_CODE_FAILED_OPERATION),
81+ " Failed to process CAN message" );
9382 }
94- } else {
95- MBED_WARNING (MBED_MAKE_ERROR (MBED_MODULE_PLATFORM, MBED_ERROR_CODE_INVALID_DATA_DETECTED),
96- " CAN RX message unpacking failed" );
97- m_numCANRXFaults++;
83+ m_numOneShotMsgsReceived++;
9884 }
99- }
100-
101- // Otherwise invalid message was received
102- else {
85+ // Otherwise message is streamed
86+ else {
87+ m_numStreamedMsgsReceived++;
88+ }
89+ } else {
10390 MBED_WARNING (MBED_MAKE_ERROR (MBED_MODULE_PLATFORM, MBED_ERROR_CODE_INVALID_DATA_DETECTED),
104- " Invalid CAN message received " );
91+ " CAN RX message unpacking failed " );
10592 m_numCANRXFaults++;
10693 }
10794 }
95+
96+ // Otherwise invalid message was received
97+ else {
98+ MBED_WARNING (MBED_MAKE_ERROR (MBED_MODULE_PLATFORM, MBED_ERROR_CODE_INVALID_DATA_DETECTED),
99+ " Invalid CAN message received" );
100+ m_numCANRXFaults++;
101+ }
108102}
109103
110- void CANInterface::txProcessor (void ) {
111- auto startTime = Kernel::Clock::now ();
104+ void CANInterface::txProcessorPeriodic (void ) {
112105
113106 CANMsg *mail = nullptr ;
114107
@@ -119,7 +112,6 @@ void CANInterface::txProcessor(void) {
119112 m_numCANTXFaults++;
120113 }
121114 MBED_ASSERT (m_txMailboxOneShot.free (mail) == osOK);
122- ThisThread::sleep_for (TX_INTERDELAY);
123115 }
124116
125117 // Send all streamed messages
@@ -142,7 +134,6 @@ void CANInterface::txProcessor(void) {
142134
143135 m_numStreamedMsgsSent++;
144136
145- ThisThread::sleep_for (TX_INTERDELAY);
146137 } else {
147138 MBED_WARNING (MBED_MAKE_ERROR (MBED_MODULE_PLATFORM, MBED_ERROR_CODE_INVALID_DATA_DETECTED),
148139 " CAN TX message packing failed" );
0 commit comments