blob: 61fd6edf3d0a491f30657912c11ac6165d589d00 [file] [log] [blame]
#include "y2023/vision/camera_monitor_lib.h"
namespace y2023::vision {
namespace {
// This needs to include the amount of time that it will take for the
// camera_reader to start.
constexpr std::chrono::seconds kImageTimeout{5};
} // namespace
CameraMonitor::CameraMonitor(aos::EventLoop *event_loop)
: event_loop_(event_loop), starter_(event_loop_) {
event_loop_->MakeNoArgWatcher<frc971::vision::CameraImage>(
"/camera", [this]() { SetImageTimeout(); });
starter_.SetTimeoutHandler([this]() {
LOG(WARNING) << "Failed to restart camera_reader when images timed out.";
SetImageTimeout();
});
starter_.SetSuccessHandler([this]() {
LOG(INFO) << "Finished restarting camera_reader.";
SetImageTimeout();
});
image_timeout_ = event_loop_->AddTimer([this]() {
LOG(INFO) << "Restarting camera_reader due to stale images.";
starter_.SendCommands({{aos::starter::Command::RESTART,
"camera_reader",
{event_loop_->node()}}},
/*timeout=*/std::chrono::seconds(3));
});
// If for some reason camera_reader fails to start up at all, we want to
// end up restarting things.
event_loop_->OnRun([this]() { SetImageTimeout(); });
}
void CameraMonitor::SetImageTimeout() {
image_timeout_->Schedule(event_loop_->context().monotonic_event_time +
kImageTimeout);
}
} // namespace y2023::vision