blob: 5b290700d01d15216339f8d1c4530b1b1efd1b53 [file] [log] [blame]
Brian Silverman58899fd2019-03-24 11:03:11 -07001#ifndef Y2019_JEVOIS_CAMERA_IMAGE_STREAM_H_
2#define Y2019_JEVOIS_CAMERA_IMAGE_STREAM_H_
Parker Schuh58b39e82019-02-22 22:32:46 -08003
Philipp Schrader790cb542023-07-05 21:06:52 -07004#include <memory>
5
Parker Schuh58b39e82019-02-22 22:32:46 -08006#include "aos/vision/events/epoll_events.h"
7#include "aos/vision/image/camera_params.pb.h"
8#include "y2019/jevois/camera/reader.h"
9
Stephan Pleinesd99b1ee2024-02-02 20:56:44 -080010namespace y2019::camera {
Parker Schuh58b39e82019-02-22 22:32:46 -080011
12// Converts a camera reader into a virtual base class that calls ProcessImage
13// on each new image.
14class ImageStreamEvent : public ::aos::events::EpollEvent {
15 public:
16 static std::unique_ptr<Reader> GetCamera(const std::string &fname,
17 ImageStreamEvent *obj,
18 aos::vision::CameraParams params) {
19 using namespace std::placeholders;
20 std::unique_ptr<Reader> camread(new Reader(
21 fname, std::bind(&ImageStreamEvent::ProcessHelper, obj, _1, _2),
22 params));
23 camread->StartAsync();
24 return camread;
25 }
26
27 explicit ImageStreamEvent(std::unique_ptr<Reader> reader)
28 : ::aos::events::EpollEvent(reader->fd()), reader_(std::move(reader)) {}
29
30 explicit ImageStreamEvent(const std::string &fname,
31 aos::vision::CameraParams params)
32 : ImageStreamEvent(GetCamera(fname, this, params)) {}
33
34 void ProcessHelper(aos::vision::DataRef data,
Brian Silverman58899fd2019-03-24 11:03:11 -070035 aos::monotonic_clock::time_point timestamp);
Parker Schuh58b39e82019-02-22 22:32:46 -080036 virtual void ProcessImage(aos::vision::DataRef data,
37 aos::monotonic_clock::time_point timestamp) = 0;
38
39 void ReadEvent() override { reader_->HandleFrame(); }
40
Alex Perry5b1e8e32019-04-07 13:25:31 -070041 bool SetExposure(int abs_exp) {
42 return reader_->SetCameraControl(V4L2_CID_EXPOSURE_ABSOLUTE,
43 "V4L2_CID_EXPOSURE_ABSOLUTE", abs_exp);
44 }
45
Parker Schuh58b39e82019-02-22 22:32:46 -080046 private:
47 std::unique_ptr<Reader> reader_;
48};
49
Stephan Pleinesd99b1ee2024-02-02 20:56:44 -080050} // namespace y2019::camera
Parker Schuh58b39e82019-02-22 22:32:46 -080051
Brian Silverman58899fd2019-03-24 11:03:11 -070052#endif // Y2019_JEVOIS_CAMERA_IMAGE_STREAM_H_