@@ -7,10 +7,12 @@ static const char FRONTPAGE[] = R"EOT(
77<body>
88<h1>esp32cam AsyncCam example</h1>
99<form id="update"><p>
10- <select name="resolution" required >%resolution%</select>
10+ <select name="resolution">%resolution%</select>
1111%brightness%
1212%contrast%
1313%saturation%
14+ <select name="lightMode" title="light mode">%lightMode%</select>
15+ <select name="specialEffect" title="special effect">%specialEffect%</select>
1416%hmirror%
1517%vflip%
1618<input type="submit" value="update">
@@ -38,7 +40,7 @@ const $display = document.querySelector("#display");
3840 try {
3941 await fetchText("/update.cgi", {
4042 method: "POST",
41- body: new URLSearchParams(new FormData($update) ),
43+ body: new FormData($update),
4244 });
4345 } catch (err) {
4446 $display.textContent = err.toString();
@@ -79,30 +81,52 @@ rewriteFrontpage(const esp32cam::Settings& s, const String& var) {
7981 b.print (r);
8082 b.print (" </option>" );
8183 }
84+ } else if (var == " lightMode" ) {
85+ #define SHOW_LM (MODE, SYMBOL ) \
86+ b.printf (" <option value=\" %d\" title=\" %s\" %s>%s</option>" , \
87+ static_cast <int >(esp32cam::LightMode::MODE), #MODE, \
88+ s.lightMode == esp32cam::LightMode::MODE ? " selected" : " " , SYMBOL)
89+ SHOW_LM (AUTO, " ⭕" );
90+ SHOW_LM (SUNNY, " ☀️" );
91+ SHOW_LM (CLOUDY, " ☁️" );
92+ SHOW_LM (OFFICE, " 🏢" );
93+ SHOW_LM (HOME, " 🏠" );
94+ #undef SHOW_LM
95+ } else if (var == " specialEffect" ) {
96+ #define SHOW_SE (MODE, SYMBOL ) \
97+ b.printf (" <option value=\" %d\" title=\" %s\" %s>%s</option>" , \
98+ static_cast <int >(esp32cam::SpecialEffect::MODE), #MODE, \
99+ s.specialEffect == esp32cam::SpecialEffect::MODE ? " selected" : " " , SYMBOL)
100+ SHOW_SE (NONE, " 🚫" );
101+ SHOW_SE (NEGATIVE, " ⬜" );
102+ SHOW_SE (BLACKWHITE, " ⬛" );
103+ SHOW_SE (REDDISH, " 🟥" );
104+ SHOW_SE (GREENISH, " 🟩" );
105+ SHOW_SE (BLUISH, " 🟦" );
106+ SHOW_SE (ANTIQUE, " 🖼️" );
107+ #undef SHOW_SE
82108 }
83109
84- #define SETTING_INT (MEM, MIN, MAX ) \
110+ #define SHOW_INT (MEM, MIN, MAX ) \
85111 else if (var == #MEM) { \
86112 b.printf (" <label>" #MEM " =<input type=\" number\" name=\" " #MEM \
87113 " \" value=\" %d\" min=\" %d\" max=\" %d\" ></label>" , \
88114 s.MEM , MIN, MAX); \
89115 }
90116
91- #define SETTING_BOOL (MEM ) \
117+ #define SHOW_BOOL (MEM ) \
92118 else if (var == #MEM) { \
93119 b.printf (" <label><input type=\" checkbox\" name=\" " #MEM " \" value=\" 1\" %s>" #MEM " </label>" , \
94120 s.MEM ? " checked" : " " ); \
95121 }
96122
97- SETTING_INT (brightness, -2 , 2 )
98- SETTING_INT (contrast, -2 , 2 )
99- SETTING_INT (saturation, -2 , 2 )
100- SETTING_BOOL (hmirror)
101- SETTING_BOOL (vflip)
102-
103- #undef SETTING_INT
104- #undef SETTING_BOOL
105-
123+ SHOW_INT (brightness, -2 , 2 )
124+ SHOW_INT (contrast, -2 , 2 )
125+ SHOW_INT (saturation, -2 , 2 )
126+ SHOW_BOOL (hmirror)
127+ SHOW_BOOL (vflip)
128+ #undef SHOW_INT
129+ #undef SHOW_BOOL
106130 return b;
107131}
108132
@@ -116,22 +140,18 @@ handleFrontpage(AsyncWebServerRequest* req) {
116140static void
117141handleUpdate (AsyncWebServerRequest* req) {
118142 bool ok = esp32cam::Camera.update ([=](esp32cam::Settings& s) {
119- #define UPDATE (MEM ) \
120- do { \
121- if constexpr (std::is_same_v<decltype (s.MEM ), bool >) { \
122- s.MEM = req->hasArg (#MEM); \
123- } else { \
124- s.MEM = static_cast <decltype (s.MEM )>(req->arg (#MEM).toInt ()); \
125- } \
126- } while (false )
127- s.resolution = esp32cam::Resolution (static_cast <int >(req->arg (" resolution" ).toInt ()));
128- UPDATE (brightness);
129- UPDATE (contrast);
130- UPDATE (saturation);
131- UPDATE (hmirror);
132- UPDATE (vflip);
133-
134- #undef UPDATE
143+ #define SAVE_BOOL (MEM ) s.MEM = req->hasArg (#MEM)
144+ #define SAVE_INT (MEM ) s.MEM = decltype (s.MEM)(req->arg (#MEM).toInt())
145+ SAVE_INT(resolution);
146+ SAVE_INT (brightness);
147+ SAVE_INT (contrast);
148+ SAVE_INT (saturation);
149+ SAVE_INT (lightMode);
150+ SAVE_INT (specialEffect);
151+ SAVE_BOOL (hmirror);
152+ SAVE_BOOL (vflip);
153+ #undef SAVE_BOOL
154+ #undef SAVE_INT
135155 });
136156
137157 if (!ok) {
0 commit comments