Skip to content

Commit 29396db

Browse files
author
NoahAndrews
committed
Add support for REV common heartbeat
1 parent 024cd36 commit 29396db

File tree

4 files changed

+45
-15
lines changed

4 files changed

+45
-15
lines changed

lib/binding.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,5 @@ export const readHALStreamSession: (streamHandle:number, numMessages:number) =>
5555
export const closeHALStreamSession: (streamHandle:number) => void = addon.closeHALStreamSession;
5656
export const setThreadPriority: (descriptor: string, priority: ThreadPriority) => void = addon.setThreadPriority;
5757
export const setSparkMaxHeartbeatData: (descriptor: string, heartbeatData: number[]) => void = addon.setSparkMaxHeartbeatData;
58-
export const ackSparkMaxHeartbeat: () => void = addon.ackSparkMaxHeartbeat;
58+
export const startRevCommonHeartbeat: (descriptor: string) => void = addon.startRevCommonHeartbeat;
59+
export const ackHeartbeats: () => void = addon.ackHeartbeats;

src/addon.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@ Napi::Object Init(Napi::Env env, Napi::Object exports) {
4040
Napi::Function::New(env, setThreadPriority));
4141
exports.Set(Napi::String::New(env, "setSparkMaxHeartbeatData"),
4242
Napi::Function::New(env, setSparkMaxHeartbeatData));
43-
exports.Set(Napi::String::New(env, "ackSparkMaxHeartbeat"),
44-
Napi::Function::New(env, ackSparkMaxHeartbeat));
43+
exports.Set(Napi::String::New(env, "startRevCommonHeartbeat"),
44+
Napi::Function::New(env, startRevCommonHeartbeat));
45+
exports.Set(Napi::String::New(env, "ackHeartbeats"),
46+
Napi::Function::New(env, ackHeartbeats));
4547
return exports;
4648
}
4749

src/canWrapper.cc

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,7 @@ void writeDfuToBin(const Napi::CallbackInfo& info) {
642642
cb.Call(info.Env().Global(), {info.Env().Null(), Napi::Number::New(info.Env(), status)});
643643
}
644644

645-
void heartbeatWatchdog() {
645+
void heartbeatsWatchdog() {
646646
while (true) {
647647
std::this_thread::sleep_for (std::chrono::seconds(1));
648648

@@ -653,20 +653,52 @@ void heartbeatWatchdog() {
653653
auto now = std::chrono::system_clock::now();
654654
std::chrono::duration<double> elapsed_seconds = now-latestHeartbeatAck;
655655
if (elapsed_seconds.count() > 1) {
656-
uint8_t heartbeat[] = {0, 0, 0, 0, 0, 0, 0, 0};
656+
uint8_t sparkMaxHeartbeat[] = {0, 0, 0, 0, 0, 0, 0, 0};
657+
uint8_t revCommonHeartbeat[] = {0};
657658
for(int i = 0; i < heartbeatsRunning.size(); i++) {
658-
_sendCANMessage(heartbeatsRunning[i], 0x2052C80, heartbeat, 8, -1);
659+
_sendCANMessage(heartbeatsRunning[i], 0x2052C80, sparkMaxHeartbeat, 8, -1);
660+
_sendCANMessage(heartbeatsRunning[i], 0x00502C0, revCommonHeartbeat, 1, -1);
659661
}
660662
heartbeatsRunning.clear();
661663
}
662664
}
663665
}
664666

665-
void ackSparkMaxHeartbeat(const Napi::CallbackInfo& info) {
667+
void ackHeartbeats(const Napi::CallbackInfo& info) {
666668
std::scoped_lock lock{watchdogMtx};
667669
latestHeartbeatAck = std::chrono::system_clock::now();
668670
}
669671

672+
// Params:
673+
// descriptor: string
674+
void startRevCommonHeartbeat(const Napi::CallbackInfo& info) {
675+
Napi::Env env = info.Env();
676+
std::string descriptor = info[0].As<Napi::String>().Utf8Value();
677+
678+
{
679+
std::scoped_lock lock{canDevicesMtx};
680+
auto deviceIterator = canDeviceMap.find(descriptor);
681+
if (deviceIterator == canDeviceMap.end()) return;
682+
}
683+
684+
uint8_t payload[] = {1};
685+
_sendCANMessage(descriptor, 0x00502C0, payload, 1, 20);
686+
687+
std::scoped_lock lock{watchdogMtx};
688+
689+
if (heartbeatsRunning.size() == 0) {
690+
heartbeatsRunning.push_back(descriptor);
691+
latestHeartbeatAck = std::chrono::system_clock::now();
692+
std::thread hb(heartbeatsWatchdog);
693+
hb.detach();
694+
} else {
695+
for(int i = 0; i < heartbeatsRunning.size(); i++) {
696+
if (heartbeatsRunning[i].compare(descriptor) == 0) return;
697+
}
698+
heartbeatsRunning.push_back(descriptor);
699+
}
700+
}
701+
670702
// Params:
671703
// descriptor: string
672704
// heartbeatData: Number[]
@@ -694,12 +726,6 @@ void setSparkMaxHeartbeatData(const Napi::CallbackInfo& info) {
694726

695727
if (sum == 0) {
696728
_sendCANMessage(descriptor, 0x2052C80, heartbeat, 8, -1);
697-
for(int i = 0; i < heartbeatsRunning.size(); i++) {
698-
if (heartbeatsRunning[i].compare(descriptor) == 0) {
699-
heartbeatsRunning.erase(heartbeatsRunning.begin() + i);
700-
return;
701-
}
702-
}
703729
}
704730
else {
705731
_sendCANMessage(descriptor, 0x2052C80, heartbeat, 8, 10);
@@ -709,7 +735,7 @@ void setSparkMaxHeartbeatData(const Napi::CallbackInfo& info) {
709735
if (heartbeatsRunning.size() == 0) {
710736
heartbeatsRunning.push_back(descriptor);
711737
latestHeartbeatAck = std::chrono::system_clock::now();
712-
std::thread hb(heartbeatWatchdog);
738+
std::thread hb(heartbeatsWatchdog);
713739
hb.detach();
714740
} else {
715741
for(int i = 0; i < heartbeatsRunning.size(); i++) {

src/canWrapper.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,6 @@ Napi::Array readHALStreamSession(const Napi::CallbackInfo& info);
2323
void closeHALStreamSession(const Napi::CallbackInfo& info);
2424
void setThreadPriority(const Napi::CallbackInfo& info);
2525
void setSparkMaxHeartbeatData(const Napi::CallbackInfo& info);
26-
void ackSparkMaxHeartbeat(const Napi::CallbackInfo& info);
26+
void startRevCommonHeartbeat(const Napi::CallbackInfo& info);
27+
void ackHeartbeats(const Napi::CallbackInfo& info);
2728
#endif

0 commit comments

Comments
 (0)