77
77
//| :param pixel_format: The pixel format of the captured image
78
78
//| :param frame_size: The size of captured image
79
79
//| :param jpeg_quality: For `PixelFormat.JPEG`, the quality. Higher numbers increase quality. If the quality is too high, the JPEG data will be larger than the availalble buffer size and the image will be unusable or truncated. The exact range of appropriate values depends on the sensor and must be determined empirically.
80
- //| :param framebuffer_count: The number of framebuffers
80
+ //| :param framebuffer_count: The number of framebuffers (1 for single-buffered and 2 for double-buffered)
81
81
//| :param grab_mode: When to grab a new frame
82
82
//| """
83
83
//|
@@ -175,16 +175,17 @@ STATIC void check_for_deinit(esp32_camera_camera_obj_t *self) {
175
175
//|
176
176
STATIC mp_obj_t esp32_camera_camera_obj___exit__ (size_t n_args , const mp_obj_t * args ) {
177
177
(void )n_args ;
178
- common_hal_esp32_camera_camera_deinit (args [0 ]);
179
- return mp_const_none ;
178
+ return esp32_camera_camera_deinit (args [0 ]);
180
179
}
181
180
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (esp32_camera_camera___exit___obj , 4 , 4 , esp32_camera_camera_obj___exit__ );
182
181
183
182
//| frame_available: bool
184
183
//| """True if a frame is available, False otherwise"""
185
184
186
185
STATIC mp_obj_t esp32_camera_camera_frame_available_get (const mp_obj_t self_in ) {
187
- return mp_obj_new_bool (false);
186
+ esp32_camera_camera_obj_t * self = MP_OBJ_TO_PTR (self_in );
187
+ check_for_deinit (self );
188
+ return mp_obj_new_bool (esp_camera_fb_available ());
188
189
}
189
190
STATIC MP_DEFINE_CONST_FUN_OBJ_1 (esp32_camera_camera_frame_available_get_obj , esp32_camera_camera_frame_available_get );
190
191
@@ -215,14 +216,66 @@ STATIC mp_obj_t esp32_camera_camera_take(size_t n_args, const mp_obj_t *args) {
215
216
int height = common_hal_esp32_camera_camera_get_height (self );
216
217
displayio_bitmap_t * bitmap = m_new_obj (displayio_bitmap_t );
217
218
bitmap -> base .type = & displayio_bitmap_type ;
218
- mp_printf (& mp_plat_print , "construct bitmap %dx%d @%p\n" , width , height , result -> buf );
219
219
common_hal_displayio_bitmap_construct_from_buffer (bitmap , width , height , (format == PIXFORMAT_RGB565 ) ? 16 : 8 , (uint32_t * )(void * )result -> buf , true);
220
220
return bitmap ;
221
221
}
222
222
}
223
223
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (esp32_camera_camera_take_obj , 1 , 2 , esp32_camera_camera_take );
224
224
225
225
226
+ //| def reconfigure(
227
+ //| self,
228
+ //| frame_size: Optional[FrameSize] = None,
229
+ //| pixel_format: Optional[PixelFormat] = None,
230
+ //| grab_mode: Optional[GrabMode] = None,
231
+ //| framebuffer_count: Optional[int] = None,
232
+ //| ) -> None:
233
+ //| """Set the frame size and pixel format
234
+ //|
235
+ //| Because these settings interact in complex ways, and take longer than
236
+ //| the other properties to set, they are set together in a single function call.
237
+ //|
238
+ //| If an argument is unspecified or None, then the setting is unchanged."""
239
+ //|
240
+
241
+ STATIC mp_obj_t esp32_camera_camera_reconfigure (mp_uint_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
242
+ esp32_camera_camera_obj_t * self = MP_OBJ_TO_PTR (pos_args [0 ]);
243
+ check_for_deinit (self );
244
+
245
+ enum { ARG_frame_size , ARG_pixel_format , ARG_grab_mode , ARG_framebuffer_count };
246
+ static const mp_arg_t allowed_args [] = {
247
+ { MP_QSTR_frame_size , MP_ARG_OBJ , {.u_obj = MP_ROM_NONE } },
248
+ { MP_QSTR_pixel_format , MP_ARG_OBJ , {.u_obj = MP_ROM_NONE } },
249
+ { MP_QSTR_grab_mode , MP_ARG_OBJ , {.u_obj = MP_ROM_NONE } },
250
+ { MP_QSTR_framebuffer_count , MP_ARG_OBJ , {.u_obj = MP_ROM_NONE } },
251
+ };
252
+
253
+ mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
254
+ mp_arg_parse_all (n_args - 1 , pos_args + 1 , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
255
+
256
+ framesize_t frame_size =
257
+ args [ARG_frame_size ].u_obj != MP_ROM_NONE
258
+ ? validate_frame_size (args [ARG_frame_size ].u_obj , MP_QSTR_frame_size )
259
+ : common_hal_esp32_camera_camera_get_frame_size (self );
260
+ pixformat_t pixel_format =
261
+ args [ARG_pixel_format ].u_obj != MP_ROM_NONE
262
+ ? validate_pixel_format (args [ARG_pixel_format ].u_obj , MP_QSTR_pixel_format )
263
+ : common_hal_esp32_camera_camera_get_pixel_format (self );
264
+ camera_grab_mode_t grab_mode =
265
+ args [ARG_grab_mode ].u_obj != MP_ROM_NONE
266
+ ? validate_grab_mode (args [ARG_grab_mode ].u_obj , MP_QSTR_grab_mode )
267
+ : common_hal_esp32_camera_camera_get_grab_mode (self );
268
+ bool framebuffer_count =
269
+ args [ARG_framebuffer_count ].u_obj != MP_ROM_NONE
270
+ ? mp_obj_get_int (args [ARG_framebuffer_count ].u_obj )
271
+ : common_hal_esp32_camera_camera_get_framebuffer_count (self );
272
+
273
+ common_hal_esp32_camera_camera_reconfigure (self , frame_size , pixel_format , grab_mode , framebuffer_count );
274
+
275
+ return mp_const_none ;
276
+ }
277
+ MP_DEFINE_CONST_FUN_OBJ_KW (esp32_camera_camera_reconfigure_obj , 1 , esp32_camera_camera_reconfigure );
278
+
226
279
//| pixel_format: PixelFormat
227
280
//| """The pixel format of captured frames"""
228
281
@@ -233,16 +286,8 @@ STATIC mp_obj_t esp32_camera_camera_get_pixel_format(const mp_obj_t self_in) {
233
286
}
234
287
STATIC MP_DEFINE_CONST_FUN_OBJ_1 (esp32_camera_camera_get_pixel_format_obj , esp32_camera_camera_get_pixel_format );
235
288
236
- STATIC mp_obj_t esp32_camera_camera_set_pixel_format (const mp_obj_t self_in , const mp_obj_t arg ) {
237
- esp32_camera_camera_obj_t * self = MP_OBJ_TO_PTR (self_in );
238
- check_for_deinit (self );
239
- common_hal_esp32_camera_camera_set_pixel_format (self , validate_pixel_format (arg , MP_QSTR_pixel_format ));
240
- return mp_const_none ;
241
- }
242
- STATIC MP_DEFINE_CONST_FUN_OBJ_2 (esp32_camera_camera_set_pixel_format_obj , esp32_camera_camera_set_pixel_format );
243
- MP_PROPERTY_GETSET (esp32_camera_camera_pixel_format_obj ,
244
- (mp_obj_t )& esp32_camera_camera_get_pixel_format_obj ,
245
- (mp_obj_t )& esp32_camera_camera_set_pixel_format_obj );
289
+ MP_PROPERTY_GETTER (esp32_camera_camera_pixel_format_obj ,
290
+ (mp_obj_t )& esp32_camera_camera_get_pixel_format_obj );
246
291
247
292
248
293
//| frame_size: FrameSize
@@ -255,16 +300,8 @@ STATIC mp_obj_t esp32_camera_camera_get_frame_size(const mp_obj_t self_in) {
255
300
}
256
301
STATIC MP_DEFINE_CONST_FUN_OBJ_1 (esp32_camera_camera_get_frame_size_obj , esp32_camera_camera_get_frame_size );
257
302
258
- STATIC mp_obj_t esp32_camera_camera_set_frame_size (const mp_obj_t self_in , const mp_obj_t arg ) {
259
- esp32_camera_camera_obj_t * self = MP_OBJ_TO_PTR (self_in );
260
- check_for_deinit (self );
261
- common_hal_esp32_camera_camera_set_frame_size (self , validate_frame_size (arg , MP_QSTR_frame_size ));
262
- return mp_const_none ;
263
- }
264
- STATIC MP_DEFINE_CONST_FUN_OBJ_2 (esp32_camera_camera_set_frame_size_obj , esp32_camera_camera_set_frame_size );
265
- MP_PROPERTY_GETSET (esp32_camera_camera_frame_size_obj ,
266
- (mp_obj_t )& esp32_camera_camera_get_frame_size_obj ,
267
- (mp_obj_t )& esp32_camera_camera_set_frame_size_obj );
303
+ MP_PROPERTY_GETTER (esp32_camera_camera_frame_size_obj ,
304
+ (mp_obj_t )& esp32_camera_camera_get_frame_size_obj );
268
305
269
306
//| contrast: int
270
307
//| """Access the contrast property of the camera sensor"""
@@ -898,6 +935,33 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(esp32_camera_camera_get_width_obj, esp32_camera
898
935
MP_PROPERTY_GETTER (esp32_camera_camera_width_obj ,
899
936
(mp_obj_t )& esp32_camera_camera_get_width_obj );
900
937
938
+ //| grab_mode: GrabMode
939
+ //| """The grab mode of the camera"""
940
+ //|
941
+ STATIC mp_obj_t esp32_camera_camera_get_grab_mode (const mp_obj_t self_in ) {
942
+ esp32_camera_camera_obj_t * self = MP_OBJ_TO_PTR (self_in );
943
+ check_for_deinit (self );
944
+ return cp_enum_find (& esp32_camera_grab_mode_type , common_hal_esp32_camera_camera_get_grab_mode (self ));
945
+ }
946
+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (esp32_camera_camera_get_grab_mode_obj , esp32_camera_camera_get_grab_mode );
947
+
948
+ MP_PROPERTY_GETTER (esp32_camera_camera_grab_mode_obj ,
949
+ (mp_obj_t )& esp32_camera_camera_get_grab_mode_obj );
950
+
951
+
952
+ //| framebuffer_count: int
953
+ //| """True if double buffering is used"""
954
+ //|
955
+ STATIC mp_obj_t esp32_camera_camera_get_framebuffer_count (const mp_obj_t self_in ) {
956
+ esp32_camera_camera_obj_t * self = MP_OBJ_TO_PTR (self_in );
957
+ check_for_deinit (self );
958
+ return MP_OBJ_NEW_SMALL_INT (common_hal_esp32_camera_camera_get_framebuffer_count (self ));
959
+ }
960
+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (esp32_camera_camera_get_framebuffer_count_obj , esp32_camera_camera_get_framebuffer_count );
961
+
962
+ MP_PROPERTY_GETTER (esp32_camera_camera_framebuffer_count_obj ,
963
+ (mp_obj_t )& esp32_camera_camera_get_framebuffer_count_obj );
964
+
901
965
902
966
STATIC const mp_rom_map_elem_t esp32_camera_camera_locals_table [] = {
903
967
{ MP_ROM_QSTR (MP_QSTR_address ), MP_ROM_PTR (& esp32_camera_camera_address_obj ) },
@@ -913,20 +977,23 @@ STATIC const mp_rom_map_elem_t esp32_camera_camera_locals_table[] = {
913
977
{ MP_ROM_QSTR (MP_QSTR_dcw ), MP_ROM_PTR (& esp32_camera_camera_dcw_obj ) },
914
978
{ MP_ROM_QSTR (MP_QSTR_deinit ), MP_ROM_PTR (& esp32_camera_camera_deinit_obj ) },
915
979
{ MP_ROM_QSTR (MP_QSTR_denoise ), MP_ROM_PTR (& esp32_camera_camera_denoise_obj ) },
980
+ { MP_ROM_QSTR (MP_QSTR_framebuffer_count ), MP_ROM_PTR (& esp32_camera_camera_framebuffer_count_obj ) },
916
981
{ MP_ROM_QSTR (MP_QSTR___enter__ ), MP_ROM_PTR (& mp_identity_obj ) },
917
982
{ MP_ROM_QSTR (MP_QSTR___exit__ ), MP_ROM_PTR (& esp32_camera_camera___exit___obj ) },
918
983
{ MP_ROM_QSTR (MP_QSTR_exposure_ctrl ), MP_ROM_PTR (& esp32_camera_camera_exposure_ctrl_obj ) },
919
984
{ MP_ROM_QSTR (MP_QSTR_frame_available ), MP_ROM_PTR (& esp32_camera_camera_frame_available_obj ) },
920
985
{ MP_ROM_QSTR (MP_QSTR_frame_size ), MP_ROM_PTR (& esp32_camera_camera_frame_size_obj ) },
921
986
{ MP_ROM_QSTR (MP_QSTR_gain_ceiling ), MP_ROM_PTR (& esp32_camera_camera_gain_ceiling_obj ) },
922
987
{ MP_ROM_QSTR (MP_QSTR_gain_ctrl ), MP_ROM_PTR (& esp32_camera_camera_gain_ctrl_obj ) },
988
+ { MP_ROM_QSTR (MP_QSTR_grab_mode ), MP_ROM_PTR (& esp32_camera_camera_grab_mode_obj ) },
923
989
{ MP_ROM_QSTR (MP_QSTR_height ), MP_ROM_PTR (& esp32_camera_camera_height_obj ) },
924
990
{ MP_ROM_QSTR (MP_QSTR_hmirror ), MP_ROM_PTR (& esp32_camera_camera_hmirror_obj ) },
925
991
{ MP_ROM_QSTR (MP_QSTR_lenc ), MP_ROM_PTR (& esp32_camera_camera_lenc_obj ) },
926
992
{ MP_ROM_QSTR (MP_QSTR_max_frame_size ), MP_ROM_PTR (& esp32_camera_camera_max_frame_size_obj ) },
927
993
{ MP_ROM_QSTR (MP_QSTR_pixel_format ), MP_ROM_PTR (& esp32_camera_camera_pixel_format_obj ) },
928
994
{ MP_ROM_QSTR (MP_QSTR_quality ), MP_ROM_PTR (& esp32_camera_camera_quality_obj ) },
929
995
{ MP_ROM_QSTR (MP_QSTR_raw_gma ), MP_ROM_PTR (& esp32_camera_camera_raw_gma_obj ) },
996
+ { MP_ROM_QSTR (MP_QSTR_reconfigure ), MP_ROM_PTR (& esp32_camera_camera_reconfigure_obj ) },
930
997
{ MP_ROM_QSTR (MP_QSTR_saturation ), MP_ROM_PTR (& esp32_camera_camera_saturation_obj ) },
931
998
{ MP_ROM_QSTR (MP_QSTR_sensor_name ), MP_ROM_PTR (& esp32_camera_camera_sensor_name_obj ) },
932
999
{ MP_ROM_QSTR (MP_QSTR_sharpness ), MP_ROM_PTR (& esp32_camera_camera_sharpness_obj ) },
@@ -935,8 +1002,8 @@ STATIC const mp_rom_map_elem_t esp32_camera_camera_locals_table[] = {
935
1002
{ MP_ROM_QSTR (MP_QSTR_take ), MP_ROM_PTR (& esp32_camera_camera_take_obj ) },
936
1003
{ MP_ROM_QSTR (MP_QSTR_vflip ), MP_ROM_PTR (& esp32_camera_camera_vflip_obj ) },
937
1004
{ MP_ROM_QSTR (MP_QSTR_wb_mode ), MP_ROM_PTR (& esp32_camera_camera_wb_mode_obj ) },
938
- { MP_ROM_QSTR (MP_QSTR_width ), MP_ROM_PTR (& esp32_camera_camera_width_obj ) },
939
1005
{ MP_ROM_QSTR (MP_QSTR_whitebal ), MP_ROM_PTR (& esp32_camera_camera_whitebal_obj ) },
1006
+ { MP_ROM_QSTR (MP_QSTR_width ), MP_ROM_PTR (& esp32_camera_camera_width_obj ) },
940
1007
{ MP_ROM_QSTR (MP_QSTR_wpc ), MP_ROM_PTR (& esp32_camera_camera_wpc_obj ) },
941
1008
};
942
1009
0 commit comments