// Copyright (c) FIRST and other WPILib contributors. // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. #pragma once #include #include #include #include #include #include "Frame.hpp" #include "SinkImpl.hpp" #include "wpi/cs/cscore_raw.h" #include "wpi/util/condition_variable.hpp" namespace wpi::cs { class SourceImpl; class RawSinkImpl : public SinkImpl { public: RawSinkImpl(std::string_view name, wpi::util::Logger& logger, Notifier& notifier, Telemetry& telemetry); RawSinkImpl(std::string_view name, wpi::util::Logger& logger, Notifier& notifier, Telemetry& telemetry, std::function processFrame); ~RawSinkImpl() override; void Stop(); uint64_t GrabFrame(WPI_RawFrame& frame); uint64_t GrabFrame(WPI_RawFrame& frame, double timeout); // Wait for a frame with a time other than lastFrameTime uint64_t GrabFrame(WPI_RawFrame& frame, double timeout, uint64_t lastFrameTime); private: void ThreadMain(); // Copies the image from incomingFrame into rawFrame, converting where // necessary to the resolution of rawFrame uint64_t GrabFrameImpl(WPI_RawFrame& rawFrame, Frame& incomingFrame); std::atomic_bool m_active; // set to false to terminate threads std::thread m_thread; std::function m_processFrame; }; } // namespace wpi::cs