James Kuszmaul | 910fbe4 | 2023-04-09 16:18:40 -0700 | [diff] [blame] | 1 | #include "y2023/vision/camera_monitor_lib.h" |
| 2 | namespace y2023::vision { |
| 3 | namespace { |
| 4 | // This needs to include the amount of time that it will take for the |
| 5 | // camera_reader to start. |
| 6 | constexpr std::chrono::seconds kImageTimeout{5}; |
| 7 | } // namespace |
| 8 | CameraMonitor::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 | |
| 33 | void CameraMonitor::SetImageTimeout() { |
Philipp Schrader | a671252 | 2023-07-05 20:25:11 -0700 | [diff] [blame^] | 34 | image_timeout_->Schedule(event_loop_->context().monotonic_event_time + |
| 35 | kImageTimeout); |
James Kuszmaul | 910fbe4 | 2023-04-09 16:18:40 -0700 | [diff] [blame] | 36 | } |
| 37 | } // namespace y2023::vision |