Skip to content

Commit 5cd6b4d

Browse files
authored
Merge pull request #4 from ThadHouse/requestversions
Send versions when requested by the DS
2 parents 2ed1914 + d97aeac commit 5cd6b4d

File tree

1 file changed

+39
-11
lines changed

1 file changed

+39
-11
lines changed

kitcan/main.cpp

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ constexpr uint32_t revPhAnyPacketMask = 0x09050000;
3333
constexpr uint32_t revPdhVersionPacketMask = 0x08052600;
3434

3535
struct 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+
6085
void 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

Comments
 (0)