blob: 61fd6edf3d0a491f30657912c11ac6165d589d00 [file] [log] [blame]
James Kuszmaul910fbe42023-04-09 16:18:40 -07001#include "y2023/vision/camera_monitor_lib.h"
2namespace y2023::vision {
3namespace {
4// This needs to include the amount of time that it will take for the
5// camera_reader to start.
6constexpr std::chrono::seconds kImageTimeout{5};
7} // namespace
8CameraMonitor::CameraMonitor(aos::EventLoop *event_loop)
9 : event_loop_(event_loop), starter_(event_loop_) {
10 event_loop_->MakeNoArgWatcher<frc971::vision::CameraImage>(
11 "/camera", [this]() { SetImageTimeout(); });
12 starter_.SetTimeoutHandler([this]() {
13 LOG(WARNING) << "Failed to restart camera_reader when images timed out.";
14 SetImageTimeout();
15 });
16 starter_.SetSuccessHandler([this]() {
17 LOG(INFO) << "Finished restarting camera_reader.";
18 SetImageTimeout();
19 });
20
21 image_timeout_ = event_loop_->AddTimer([this]() {
22 LOG(INFO) << "Restarting camera_reader due to stale images.";
23 starter_.SendCommands({{aos::starter::Command::RESTART,
24 "camera_reader",
25 {event_loop_->node()}}},
26 /*timeout=*/std::chrono::seconds(3));
27 });
28 // If for some reason camera_reader fails to start up at all, we want to
29 // end up restarting things.
30 event_loop_->OnRun([this]() { SetImageTimeout(); });
31}
32
33void CameraMonitor::SetImageTimeout() {
Philipp Schradera6712522023-07-05 20:25:11 -070034 image_timeout_->Schedule(event_loop_->context().monotonic_event_time +
35 kImageTimeout);
James Kuszmaul910fbe42023-04-09 16:18:40 -070036}
37} // namespace y2023::vision