Skip to content

Commit 51987f9

Browse files
committed
implemented most changes as requested by Melvion and Cindy
1 parent 32ce389 commit 51987f9

File tree

5 files changed

+46
-57
lines changed

5 files changed

+46
-57
lines changed

libs/can/include/CANInterface.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,14 @@ class CANInterface {
6060

6161
void rxISR(void);
6262
void rxPostman(void);
63-
void rxClient(void);
64-
void txProcessor(void);
63+
void rxClientPeriodic(void);
64+
void txProcessorPeriodic(void);
6565

6666
CANBus m_CANBus1;
6767
CANBus m_CANBus2;
6868
CANBus *m_activeCANBus;
6969

7070
Thread m_rxPostmanThread;
71-
Thread m_rxClientThread;
72-
Thread m_txProcessorThread;
7371

7472
Mutex m_rxMutex;
7573
Mutex m_txMutex;

libs/can/src/CANInterface.cpp

Lines changed: 40 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -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");

rover-apps/common/CMakeLists.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ target_link_libraries(WatchdogModule
77
mbed-os
88
)
99

10-
add_library(CANModule)
11-
target_sources(CANModule PRIVATE src/CANModule.cpp)
12-
target_include_directories(CANModule PUBLIC include)
13-
target_link_libraries(CANModule
10+
add_library(CANDriverModule)
11+
target_sources(CANDriverModule PRIVATE src/CANDriverModule.cpp)
12+
target_include_directories(CANDriverModule PUBLIC include)
13+
target_link_libraries(CANDriverModule
1414
PRIVATE
1515
CANInterface
1616
mbed-os
File renamed without changes.

0 commit comments

Comments
 (0)