@@ -642,7 +642,7 @@ void writeDfuToBin(const Napi::CallbackInfo& info) {
642
642
cb.Call (info.Env ().Global (), {info.Env ().Null (), Napi::Number::New (info.Env (), status)});
643
643
}
644
644
645
- void heartbeatWatchdog () {
645
+ void heartbeatsWatchdog () {
646
646
while (true ) {
647
647
std::this_thread::sleep_for (std::chrono::seconds (1 ));
648
648
@@ -653,20 +653,52 @@ void heartbeatWatchdog() {
653
653
auto now = std::chrono::system_clock::now ();
654
654
std::chrono::duration<double > elapsed_seconds = now-latestHeartbeatAck;
655
655
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 };
657
658
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 );
659
661
}
660
662
heartbeatsRunning.clear ();
661
663
}
662
664
}
663
665
}
664
666
665
- void ackSparkMaxHeartbeat (const Napi::CallbackInfo& info) {
667
+ void ackHeartbeats (const Napi::CallbackInfo& info) {
666
668
std::scoped_lock lock{watchdogMtx};
667
669
latestHeartbeatAck = std::chrono::system_clock::now ();
668
670
}
669
671
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
+
670
702
// Params:
671
703
// descriptor: string
672
704
// heartbeatData: Number[]
@@ -694,12 +726,6 @@ void setSparkMaxHeartbeatData(const Napi::CallbackInfo& info) {
694
726
695
727
if (sum == 0 ) {
696
728
_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
- }
703
729
}
704
730
else {
705
731
_sendCANMessage (descriptor, 0x2052C80 , heartbeat, 8 , 10 );
@@ -709,7 +735,7 @@ void setSparkMaxHeartbeatData(const Napi::CallbackInfo& info) {
709
735
if (heartbeatsRunning.size () == 0 ) {
710
736
heartbeatsRunning.push_back (descriptor);
711
737
latestHeartbeatAck = std::chrono::system_clock::now ();
712
- std::thread hb (heartbeatWatchdog );
738
+ std::thread hb (heartbeatsWatchdog );
713
739
hb.detach ();
714
740
} else {
715
741
for (int i = 0 ; i < heartbeatsRunning.size (); i++) {
0 commit comments