@@ -33,6 +33,7 @@ constexpr uint32_t revPhAnyPacketMask = 0x09050000;
3333constexpr uint32_t revPdhVersionPacketMask = 0x08052600 ;
3434
3535struct CanState {
36+ wpi::mutex sendVersionsMutex;
3637 int socketHandle{-1 };
3738 nt::IntegerPublisher deviceIdPublisher;
3839 std::array<nt::RawPublisher, 4 > framePublishers;
@@ -49,6 +50,7 @@ struct CanState {
4950 void maybeSendVersionRequest (uint32_t canId);
5051
5152 void handleRevVersionFrame (const canfd_frame& frame);
53+ void sendVersions ();
5254
5355 void handleCanFrame (const canfd_frame& frame);
5456 void handlePowerFrame (const canfd_frame& frame);
@@ -57,6 +59,29 @@ struct CanState {
5759 wpi::uv::Loop& loop);
5860};
5961
62+ void CanState::sendVersions () {
63+ std::scoped_lock lock{sendVersionsMutex};
64+
65+ for (auto && versions : sentVersions) {
66+ if (versions.first == 0 || versions.second .empty ()) {
67+ continue ;
68+ }
69+
70+ uint32_t frameId = versions.first ;
71+
72+ std::array<std::string, 3 > sendData;
73+ sendData[0 ] = std::to_string (frameId);
74+ sendData[1 ] = ((frameId & deviceTypeMask) == pneumaticsFilter)
75+ ? " Rev PH"
76+ : " Rev PDH" ;
77+ sendData[2 ] = versions.second ;
78+
79+ fmt::print (" Setting {:x} {} {}\n " , frameId, sendData[1 ], sendData[2 ]);
80+
81+ versionPublisher.Set (sendData);
82+ }
83+ }
84+
6085void CanState::maybeSendVersionRequest (uint32_t canId) {
6186 auto & sent = sentVersions[canId];
6287 if (!sent.empty ()) {
@@ -87,17 +112,7 @@ void CanState::handleRevVersionFrame(const canfd_frame& frame) {
87112 char buf[32 ];
88113 snprintf (buf, sizeof (buf), " %u.%u.%u" , year, minor, fix);
89114
90- std::array<std::string, 3 > sendData;
91- sendData[0 ] = std::to_string (frameId);
92- sendData[1 ] = ((frame.can_id & deviceTypeMask) == pneumaticsFilter)
93- ? " Rev PH"
94- : " Rev PDH" ;
95- sendData[2 ] = buf;
96-
97- fmt::print (" Setting {:x} {} {}\n " , frameId, sendData[1 ], sendData[2 ]);
98-
99- versionPublisher.Set (sendData);
100-
115+ std::scoped_lock lock{sendVersionsMutex};
101116 sentVersions[frameId] = buf;
102117}
103118
@@ -297,6 +312,10 @@ int main() {
297312 ntInst.SetServer ({" localhost" }, 6810 );
298313 ntInst.StartClient (" KitCanDaemon" );
299314
315+ nt::IntegerSubscriber requestSubscriber =
316+ ntInst.GetIntegerTopic (" /Netcomm/Reporting/RequestVersions" )
317+ .Subscribe (0 );
318+
300319 wpi::EventLoopRunner loopRunner;
301320
302321 bool success = false ;
@@ -309,6 +328,14 @@ int main() {
309328 }
310329 });
311330
331+ NT_Listener requestListener =
332+ ntInst.AddListener (requestSubscriber, NT_EVENT_VALUE_REMOTE,
333+ [&states, &loopRunner](const nt::Event& event) {
334+ for (size_t i = 0 ; i < states.size (); i++) {
335+ states[i].sendVersions ();
336+ }
337+ });
338+
312339 if (!success) {
313340 loopRunner.Stop ();
314341 return -1 ;
@@ -322,6 +349,7 @@ int main() {
322349 (void )getchar ();
323350#endif
324351 }
352+ ntInst.RemoveListener (requestListener);
325353 ntInst.StopClient ();
326354 nt::NetworkTableInstance::Destroy (ntInst);
327355
0 commit comments