Skip to content

Commit b155c2c

Browse files
committed
Add last CAN error time
1 parent 574555b commit b155c2c

File tree

12 files changed

+32
-8
lines changed

12 files changed

+32
-8
lines changed

CANBridge/rev/CANDevice.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,12 @@ class CANDevice {
5959
virtual CANStatus ReadStreamSession(uint32_t sessionHandle, HAL_CANStreamMessage* msgs, uint32_t messagesToRead, uint32_t* messagesRead) = 0;
6060

6161
virtual CANStatus GetCANDetailStatus(float* percentBusUtilization, uint32_t* busOff, uint32_t* txFull, uint32_t* receiveErr, uint32_t* transmitErr) = 0;
62+
virtual CANStatus GetCANDetailStatus(float* percentBusUtilization, uint32_t* busOff, uint32_t* txFull, uint32_t* receiveErr, uint32_t* transmitErr, uint32_t* lastErrorTime) = 0;
6263

6364
virtual bool IsConnected() = 0;
6465
virtual void setThreadPriority(utils::ThreadPriority priority) {};
6566
virtual void stopRepeatedMessage(uint32_t messageId) {};
67+
virtual void ClearSendQueue() {};
6668
};
6769

6870
} // namespace usb

CANBridge/rev/Drivers/CandleWinUSB/CandleWinUSBDevice.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,11 @@ class CandleWinUSBDevice : public CANDevice {
6060
virtual CANStatus ReadStreamSession(uint32_t sessionHandle, HAL_CANStreamMessage* msgs, uint32_t messagesToRead, uint32_t* messagesRead) override;
6161

6262
virtual CANStatus GetCANDetailStatus(float* percentBusUtilization, uint32_t* busOff, uint32_t* txFull, uint32_t* receiveErr, uint32_t* transmitErr) override;
63-
63+
virtual CANStatus GetCANDetailStatus(float* percentBusUtilization, uint32_t* busOff, uint32_t* txFull, uint32_t* receiveErr, uint32_t* transmitErr, uint32_t* lastErrorTime) override;
6464
virtual bool IsConnected() override;
6565
virtual void setThreadPriority(utils::ThreadPriority priority);
6666
virtual void stopRepeatedMessage(uint32_t messageId);
67+
virtual void ClearSendQueue();
6768
private:
6869
candle_handle m_handle;
6970
CandleWinUSBDeviceThread m_thread;

CANBridge/rev/Drivers/CandleWinUSB/CandleWinUSBDeviceThread.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ class CandleWinUSBDeviceThread :public DriverDeviceThread {
8383
utils::SetThreadPriority(m_thread.get(), priority);
8484
}
8585

86+
void clearQueue() {
87+
std::cout << "Queue Size: " << m_sendQueue.size() << std::endl;
88+
bool empty = m_sendQueue.empty();
89+
}
90+
8691
void stopRepeatedMessage(uint32_t messageId) {
8792
for (int i = 0; i < m_sendQueue.size(); i++) {
8893
detail::CANThreadSendQueueElement el = m_sendQueue.front();
@@ -112,11 +117,11 @@ class CandleWinUSBDeviceThread :public DriverDeviceThread {
112117
candle_frame_t incomingFrame;
113118

114119
reading = candle_frame_read(m_device, &incomingFrame, 0);
115-
116120
// Received a new frame, store it
117121
if (reading) {
118122
candle_frametype_t frameType = candle_frame_type(&incomingFrame);
119123
if(frameType == CANDLE_FRAMETYPE_ERROR) {
124+
time(&lastErrorTime);
120125
// Parse error data
121126
if (incomingFrame.can_id & 0x00000040) {
122127
m_statusDetails.busOffCount++;
@@ -172,7 +177,7 @@ class CandleWinUSBDeviceThread :public DriverDeviceThread {
172177

173178
// TODO: Feed back an error
174179
if (candle_frame_send(m_device, 0, &frame, false, 20) == false) {
175-
// std::cout << "Failed to send message: " << std::hex << (int)el.m_msg.GetMessageId() << std::dec << " " << candle_error_text(candle_dev_last_error(m_device)) << std::endl;
180+
std::cout << "Failed to send message: " << std::hex << (int)el.m_msg.GetMessageId() << std::dec << " " << candle_error_text(candle_dev_last_error(m_device)) << std::endl;
176181
m_threadStatus = CANStatus::kDeviceWriteError;
177182
m_statusErrCount++;
178183
return false;

CANBridge/rev/Drivers/DriverDeviceThread.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include <map>
3838
#include <queue>
3939
#include <memory>
40+
#include <time.h>
4041

4142
#include <iostream>
4243

@@ -133,6 +134,14 @@ class DriverDeviceThread {
133134
details = &m_statusDetails;
134135
}
135136

137+
void GetCANStatusDetails(uint32_t* busOff, uint32_t* txFull, uint32_t* receiveErr, uint32_t* transmitErr, uint32_t* errorTime) {
138+
*busOff = m_statusDetails.busOffCount;
139+
*txFull = m_statusDetails.txFullCount;
140+
*receiveErr = m_statusDetails.receiveErrCount;
141+
*transmitErr = m_statusDetails.transmitErrCount;
142+
*errorTime = lastErrorTime;
143+
}
144+
136145
CANStatus GetLastThreadError() {
137146
CANStatus last = m_threadStatus;
138147
m_threadStatus = CANStatus::kOk;
@@ -156,6 +165,7 @@ class DriverDeviceThread {
156165
uint32_t m_counter;
157166

158167
CANStatusDetails m_statusDetails;
168+
time_t lastErrorTime;
159169
int m_statusErrCount = 0;
160170
CANStatus m_threadStatus = CANStatus::kOk;
161171

CANBridge/rev/Drivers/SerialPort/SerialDevice.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class SerialDevice : public CANDevice {
5858
virtual CANStatus ReadStreamSession(uint32_t sessionHandle, HAL_CANStreamMessage* msgs, uint32_t messagesToRead, uint32_t* messagesRead) override;
5959

6060
virtual CANStatus GetCANDetailStatus(float* percentBusUtilization, uint32_t* busOff, uint32_t* txFull, uint32_t* receiveErr, uint32_t* transmitErr) override;
61+
virtual CANStatus GetCANDetailStatus(float* percentBusUtilization, uint32_t* busOff, uint32_t* txFull, uint32_t* receiveErr, uint32_t* transmitErr, uint32_t* lastErrorTime) override;
6162

6263
virtual bool IsConnected() override;
6364
private:

CANBridge/static/CANBridge.lib

3.69 KB
Binary file not shown.

CANBridge/x86-64/CANBridge.lib

3.21 KB
Binary file not shown.

dist/binding.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export interface CanDeviceStatus {
1515
receiveErr: number;
1616
transmitErr: number;
1717
percentBusUtilization: number;
18+
lastErrorTime: number;
1819
}
1920
export declare enum ThreadPriority {
2021
Low = 0,

lib/binding.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export interface CanDeviceStatus {
2020
receiveErr: number;
2121
transmitErr: number;
2222
percentBusUtilization: number;
23+
lastErrorTime: number;
2324
}
2425

2526
export enum ThreadPriority {

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "node-can-bridge",
3-
"version": "1.0.10",
3+
"version": "1.0.11",
44
"author": "REV Robotics",
55
"description": "Get CAN Data",
66
"license": "MIT",

src/canWrapper.cc

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ Napi::Number closeStreamSession(const Napi::CallbackInfo& info) {
380380
// Params:
381381
// descriptor: String
382382
// Returns:
383-
// status: Object{percentBusUtilization:Number, busOff:Number, txFull:Number, receiveErr:Number, transmitError:Number}
383+
// status: Object{percentBusUtilization:Number, busOff:Number, txFull:Number, receiveErr:Number, transmitError:Number, lastErrorTime:Number}
384384
Napi::Object getCANDetailStatus(const Napi::CallbackInfo& info) {
385385
Napi::Env env = info.Env();
386386
std::string descriptor = info[0].As<Napi::String>().Utf8Value();
@@ -397,14 +397,16 @@ Napi::Object getCANDetailStatus(const Napi::CallbackInfo& info) {
397397
uint32_t txFull;
398398
uint32_t receiveErr;
399399
uint32_t transmitErr;
400-
deviceIterator->second->GetCANDetailStatus(&percentBusUtilization, &busOff, &txFull, &receiveErr, &transmitErr);
400+
uint32_t lastErrorTime;
401+
deviceIterator->second->GetCANDetailStatus(&percentBusUtilization, &busOff, &txFull, &receiveErr, &transmitErr, &lastErrorTime);
401402

402403
Napi::Object status = Napi::Object::New(env);
403404
status.Set("percentBusUtilization", percentBusUtilization);
404405
status.Set("busOff", busOff);
405406
status.Set("txFull", txFull);
406407
status.Set("receiveErr", receiveErr);
407408
status.Set("transmitErr", transmitErr);
409+
status.Set("lastErrorTime", lastErrorTime);
408410
return status;
409411
}
410412

@@ -640,7 +642,7 @@ void setSparkMaxHeartbeatData(const Napi::CallbackInfo& info) {
640642
}
641643
}
642644
else {
643-
_sendCANMessage(descriptor, 0x2052C80, heartbeat, 8, 1);
645+
_sendCANMessage(descriptor, 0x2052C80, heartbeat, 8, 10);
644646
if (heartbeatsRunning.size() == 0) {
645647
heartbeatsRunning.push_back(descriptor);
646648
latestHeartbeatAck = std::chrono::system_clock::now();

test/test_binding.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ async function testSendHALMessage() {
136136
try {
137137
if (devices.length === 0) return;
138138
// Send identify to SparkMax #1
139-
const status = addon.sendHALMessage(0x2051D81, [], 0);
139+
const status = addon.sendHALMessage(0x2051D81, [], 500);
140+
await new Promise(resolve => {setTimeout(resolve, 2000)});
140141
console.log("Status:", status);
141142
} catch(error) {
142143
assert.fail(error);

0 commit comments

Comments
 (0)