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
8namespace esp32cam {
9namespace detail {
10
11class CaptureTask {
12public:
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
25private:
26 static void run(void* ctx);
27
28private:
29 void* m_queue = nullptr;
30 void* m_task = nullptr;
31 bool m_continuous = false;
32};
33
34} // namespace detail
35
40namespace asyncweb {
41
52class StillResponse : public AsyncAbstractResponse {
53public:
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
64private:
65 detail::CaptureTask m_task;
66 std::unique_ptr<Frame> m_frame;
67 size_t m_index = 0;
68};
69
71inline void
72handleStill(AsyncWebServerRequest* request) {
73 request->send(new StillResponse());
74}
75
92class MjpegResponse : public AsyncAbstractResponse {
93public:
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
104private:
105 size_t sendPart(uint8_t* buf, size_t buflen);
106
107private:
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
127inline void
128handleMjpeg(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 esp32cam.h:14