@@ -107,6 +107,11 @@ CameraClass::status() const {
107107 result.saturation = ss.saturation ;
108108 result.lightMode = ss.awb_gain ? static_cast <LightMode>(ss.wb_mode ) : LightMode::NONE;
109109 result.specialEffect = static_cast <SpecialEffect>(ss.special_effect );
110+ if (ss.agc ) {
111+ result.gain = (-2 ) << ss.gainceiling ;
112+ } else {
113+ result.gain = 1 + static_cast <int8_t >(ss.agc_gain );
114+ }
110115 result.hmirror = ss.hmirror != 0 ;
111116 result.vflip = ss.vflip != 0 ;
112117 return result;
@@ -128,44 +133,61 @@ CameraClass::update(const Settings& settings, int sleepFor) {
128133 } \
129134 } while (false )
130135
131- #define UPDATE (STATUS_MEM, value, SETTER_TYP ) \
136+ #define UPDATE4 (STATUS_MEM, value, SETTER_MEM, SETTER_TYP ) \
132137 do { \
133138 int prev = static_cast <int >(sensor->status .STATUS_MEM ); \
134139 int desired = static_cast <int >(value); \
135140 if (prev != desired) { \
136- int res = sensor->set_ ## STATUS_MEM (sensor, static_cast <SETTER_TYP>(desired)); \
141+ int res = sensor->SETTER_MEM (sensor, static_cast <SETTER_TYP>(desired)); \
137142 ESP32CAM_LOG (" update " #STATUS_MEM " %d => %d %s" , prev, desired, \
138143 res == 0 ? " success" : " failure" ); \
139144 if (res != 0 ) { \
140145 return false ; \
141146 } \
142147 } \
143148 } while (false )
144- #define UPDATE1 (MEM ) UPDATE(MEM, settings.MEM, int )
149+ #define UPDATE3 (STATUS_MEM, value, SETTER_TYP ) \
150+ UPDATE4 (STATUS_MEM, (value), set_##STATUS_MEM, SETTER_TYP)
151+ #define UPDATE2 (STATUS_MEM, value ) UPDATE3(STATUS_MEM, (value), int )
152+ #define UPDATE1 (MEM ) UPDATE2(MEM, settings.MEM)
145153
146154 CHECK_RANGE (brightness, -2 , 2 );
147155 CHECK_RANGE (contrast, -2 , 2 );
148156 CHECK_RANGE (saturation, -2 , 2 );
149157 CHECK_RANGE (lightMode, -1 , 4 );
150158 CHECK_RANGE (specialEffect, 0 , 6 );
159+ CHECK_RANGE (gain, -128 , 31 );
151160
152- UPDATE (framesize, settings.resolution .as <framesize_t >(), framesize_t );
161+ UPDATE3 (framesize, settings.resolution .as <framesize_t >(), framesize_t );
153162 UPDATE1 (brightness);
154163 UPDATE1 (contrast);
155164 UPDATE1 (saturation);
165+ UPDATE2 (special_effect, settings.specialEffect );
166+ UPDATE1 (hmirror);
167+ UPDATE1 (vflip);
168+
169+ if (settings.gain > 0 ) {
170+ UPDATE4 (agc, 0 , set_gain_ctrl, int );
171+ UPDATE2 (agc_gain, settings.gain - 1 );
172+ UPDATE3 (gainceiling, 0 , gainceiling_t );
173+ } else {
174+ UPDATE4 (agc, 1 , set_gain_ctrl, int );
175+ UPDATE2 (agc_gain, 0 );
176+ UPDATE3 (gainceiling, __builtin_ctz (static_cast <uint32_t >(-settings.gain )) - 1 , gainceiling_t );
177+ }
178+
156179 if (settings.lightMode == LightMode::NONE) {
157- UPDATE (awb_gain, 0 , int );
158- UPDATE (wb_mode, 0 , int );
180+ UPDATE2 (awb_gain, 0 );
181+ UPDATE2 (wb_mode, 0 );
159182 } else {
160- UPDATE (awb_gain, 1 , int );
161- UPDATE (wb_mode, settings.lightMode , int );
183+ UPDATE2 (awb_gain, 1 );
184+ UPDATE2 (wb_mode, settings.lightMode );
162185 }
163- UPDATE (special_effect, settings.specialEffect , int );
164- UPDATE1 (hmirror);
165- UPDATE1 (vflip);
166186
167187#undef CHECK_RANGE
168- #undef UPDATE
188+ #undef UPDATE4
189+ #undef UPDATE3
190+ #undef UPDATE2
169191#undef UPDATE1
170192
171193 if (sleepFor > 0 ) {
0 commit comments