esp32cam
OV2640 camera on ESP32-CAM
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
asyncweb.hpp
Go to the documentation of this file.
1 #ifndef ESP32CAM_ASYNCWEB_HPP
2 #define ESP32CAM_ASYNCWEB_HPP
3 
4 #if __has_include(<ESPAsyncWebServer.h>)
5 #include "camera.hpp"
6 #include <ESPAsyncWebServer.h>
7 
8 namespace esp32cam {
9 namespace detail {
10 
11 class CaptureTask {
12 public:
13  explicit CaptureTask(uint32_t queueLength, uint32_t priority = 1);
14 
15  ~CaptureTask();
16 
17  explicit operator bool() const {
18  return m_queue != nullptr && m_task != nullptr;
19  }
20 
21  void request(bool continuous = false);
22 
23  std::unique_ptr<Frame> retrieve();
24 
25 private:
26  static void run(void* ctx);
27 
28 private:
29  void* m_queue = nullptr;
30  void* m_task = nullptr;
31  bool m_continuous = false;
32 };
33 
34 } // namespace detail
35 
40 namespace asyncweb {
41 
52 class StillResponse : public AsyncAbstractResponse {
53 public:
54  explicit StillResponse();
55 
56  ~StillResponse() override;
57 
58  bool _sourceValid() const override {
59  return true;
60  }
61 
62  size_t _fillBuffer(uint8_t* buf, size_t buflen) override;
63 
64 private:
65  detail::CaptureTask m_task;
66  std::unique_ptr<Frame> m_frame;
67  size_t m_index = 0;
68 };
69 
71 inline void
72 handleStill(AsyncWebServerRequest* request) {
73  request->send(new StillResponse());
74 }
75 
92 class MjpegResponse : public AsyncAbstractResponse {
93 public:
94  explicit MjpegResponse(const MjpegConfig& cfg = MjpegConfig());
95 
96  ~MjpegResponse() override;
97 
98  bool _sourceValid() const override {
99  return true;
100  }
101 
102  size_t _fillBuffer(uint8_t* buf, size_t buflen) override;
103 
104 private:
105  size_t sendPart(uint8_t* buf, size_t buflen);
106 
107 private:
108  detail::CaptureTask m_task;
109  using Ctrl = detail::MjpegController;
110  Ctrl m_ctrl;
111  detail::MjpegHeader m_hdr;
112 
113  enum SendItem {
114  SINone,
115  SIPartHeader,
116  SIFrame,
117  SIPartTrailer,
118  };
119  SendItem m_sendNext = SINone;
120  const uint8_t* m_sendBuf = nullptr;
121  size_t m_sendRemain = 0;
122  unsigned long m_createTime = millis();
123  unsigned long m_sendSince = 0;
124 };
125 
127 inline void
128 handleMjpeg(AsyncWebServerRequest* request) {
129  request->send(new MjpegResponse());
130 }
131 
132 } // namespace asyncweb
133 } // namespace esp32cam
134 
135 #endif // __has_include(<ESPAsyncWebServer.h>)
136 #endif // ESP32CAM_ASYNCWEB_HPP
Definition: camera.cpp:6