@@ -280,17 +280,231 @@ static mp_obj_t mp_camera_obj___exit__(size_t n_args, const mp_obj_t *args) {
280280}
281281static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (mp_camera___exit___obj , 4 , 4 , mp_camera_obj___exit__ ) ;
282282
283+ // Property handler
284+ static void camera_obj_property (mp_obj_t self_in , qstr attr , mp_obj_t * dest ) {
285+ mp_camera_obj_t * self = MP_OBJ_TO_PTR (self_in );
286+
287+ if (dest [0 ] == MP_OBJ_NULL ) {
288+ // Load (reading)
289+ switch (attr ) {
290+ // Read-only properties
291+ case MP_QSTR_pixel_format :
292+ dest [0 ] = mp_obj_new_int (mp_camera_hal_get_pixel_format (self ));
293+ break ;
294+ case MP_QSTR_grab_mode :
295+ dest [0 ] = mp_obj_new_int (mp_camera_hal_get_grab_mode (self ));
296+ break ;
297+ case MP_QSTR_fb_count :
298+ dest [0 ] = mp_obj_new_int (mp_camera_hal_get_fb_count (self ));
299+ break ;
300+ case MP_QSTR_pixel_width :
301+ dest [0 ] = mp_obj_new_int (mp_camera_hal_get_pixel_width (self ));
302+ break ;
303+ case MP_QSTR_pixel_height :
304+ dest [0 ] = mp_obj_new_int (mp_camera_hal_get_pixel_height (self ));
305+ break ;
306+ case MP_QSTR_max_frame_size :
307+ dest [0 ] = mp_obj_new_int (mp_camera_hal_get_max_frame_size (self ));
308+ break ;
309+ case MP_QSTR_sensor_name :
310+ dest [0 ] = mp_obj_new_str_from_cstr (mp_camera_hal_get_sensor_name (self ));
311+ break ;
312+
313+ // Read-write properties
314+ case MP_QSTR_frame_size :
315+ dest [0 ] = MP_OBJ_NEW_SMALL_INT (mp_camera_hal_get_frame_size (self ));
316+ break ;
317+ case MP_QSTR_contrast :
318+ dest [0 ] = MP_OBJ_NEW_SMALL_INT (mp_camera_hal_get_contrast (self ));
319+ break ;
320+ case MP_QSTR_brightness :
321+ dest [0 ] = MP_OBJ_NEW_SMALL_INT (mp_camera_hal_get_brightness (self ));
322+ break ;
323+ case MP_QSTR_saturation :
324+ dest [0 ] = MP_OBJ_NEW_SMALL_INT (mp_camera_hal_get_saturation (self ));
325+ break ;
326+ case MP_QSTR_sharpness :
327+ dest [0 ] = MP_OBJ_NEW_SMALL_INT (mp_camera_hal_get_sharpness (self ));
328+ break ;
329+ case MP_QSTR_denoise :
330+ dest [0 ] = MP_OBJ_NEW_SMALL_INT (mp_camera_hal_get_denoise (self ));
331+ break ;
332+ case MP_QSTR_gainceiling :
333+ dest [0 ] = MP_OBJ_NEW_SMALL_INT (mp_camera_hal_get_gainceiling (self ));
334+ break ;
335+ case MP_QSTR_quality :
336+ dest [0 ] = MP_OBJ_NEW_SMALL_INT (mp_camera_hal_get_quality (self ));
337+ break ;
338+ case MP_QSTR_colorbar :
339+ dest [0 ] = mp_obj_new_bool (mp_camera_hal_get_colorbar (self ));
340+ break ;
341+ case MP_QSTR_whitebal :
342+ dest [0 ] = mp_obj_new_bool (mp_camera_hal_get_whitebal (self ));
343+ break ;
344+ case MP_QSTR_gain_ctrl :
345+ dest [0 ] = mp_obj_new_bool (mp_camera_hal_get_gain_ctrl (self ));
346+ break ;
347+ case MP_QSTR_exposure_ctrl :
348+ dest [0 ] = mp_obj_new_bool (mp_camera_hal_get_exposure_ctrl (self ));
349+ break ;
350+ case MP_QSTR_hmirror :
351+ dest [0 ] = mp_obj_new_bool (mp_camera_hal_get_hmirror (self ));
352+ break ;
353+ case MP_QSTR_vflip :
354+ dest [0 ] = mp_obj_new_bool (mp_camera_hal_get_vflip (self ));
355+ break ;
356+ case MP_QSTR_aec2 :
357+ dest [0 ] = mp_obj_new_bool (mp_camera_hal_get_aec2 (self ));
358+ break ;
359+ case MP_QSTR_awb_gain :
360+ dest [0 ] = mp_obj_new_bool (mp_camera_hal_get_awb_gain (self ));
361+ break ;
362+ case MP_QSTR_agc_gain :
363+ dest [0 ] = MP_OBJ_NEW_SMALL_INT (mp_camera_hal_get_agc_gain (self ));
364+ break ;
365+ case MP_QSTR_aec_value :
366+ dest [0 ] = MP_OBJ_NEW_SMALL_INT (mp_camera_hal_get_aec_value (self ));
367+ break ;
368+ case MP_QSTR_special_effect :
369+ dest [0 ] = MP_OBJ_NEW_SMALL_INT (mp_camera_hal_get_special_effect (self ));
370+ break ;
371+ case MP_QSTR_wb_mode :
372+ dest [0 ] = MP_OBJ_NEW_SMALL_INT (mp_camera_hal_get_wb_mode (self ));
373+ break ;
374+ case MP_QSTR_ae_level :
375+ dest [0 ] = MP_OBJ_NEW_SMALL_INT (mp_camera_hal_get_ae_level (self ));
376+ break ;
377+ case MP_QSTR_dcw :
378+ dest [0 ] = mp_obj_new_bool (mp_camera_hal_get_dcw (self ));
379+ break ;
380+ case MP_QSTR_bpc :
381+ dest [0 ] = mp_obj_new_bool (mp_camera_hal_get_bpc (self ));
382+ break ;
383+ case MP_QSTR_wpc :
384+ dest [0 ] = mp_obj_new_bool (mp_camera_hal_get_wpc (self ));
385+ break ;
386+ case MP_QSTR_raw_gma :
387+ dest [0 ] = mp_obj_new_bool (mp_camera_hal_get_raw_gma (self ));
388+ break ;
389+ case MP_QSTR_lenc :
390+ dest [0 ] = mp_obj_new_bool (mp_camera_hal_get_lenc (self ));
391+ break ;
392+ default :
393+ dest [1 ] = MP_OBJ_SENTINEL ;
394+ }
395+ } else if (dest [1 ] != MP_OBJ_NULL ) {
396+ // Store (writing)
397+ switch (attr ) {
398+ // Read-only properties
399+ case MP_QSTR_pixel_format :
400+ case MP_QSTR_grab_mode :
401+ case MP_QSTR_fb_count :
402+ case MP_QSTR_pixel_width :
403+ case MP_QSTR_pixel_height :
404+ case MP_QSTR_max_frame_size :
405+ case MP_QSTR_sensor_name :
406+ mp_raise_AttributeError (MP_ERROR_TEXT ("read-only property" ));
407+ break ;
408+
409+ // Read-write properties
410+ case MP_QSTR_frame_size :
411+ mp_camera_hal_set_frame_size (self , mp_obj_get_int (dest [1 ]));
412+ break ;
413+ case MP_QSTR_contrast :
414+ mp_camera_hal_set_contrast (self , mp_obj_get_int (dest [1 ]));
415+ break ;
416+ case MP_QSTR_brightness :
417+ mp_camera_hal_set_brightness (self , mp_obj_get_int (dest [1 ]));
418+ break ;
419+ case MP_QSTR_saturation :
420+ mp_camera_hal_set_saturation (self , mp_obj_get_int (dest [1 ]));
421+ break ;
422+ case MP_QSTR_sharpness :
423+ mp_camera_hal_set_sharpness (self , mp_obj_get_int (dest [1 ]));
424+ break ;
425+ case MP_QSTR_denoise :
426+ mp_camera_hal_set_denoise (self , mp_obj_get_int (dest [1 ]));
427+ break ;
428+ case MP_QSTR_gainceiling :
429+ mp_camera_hal_set_gainceiling (self , mp_obj_get_int (dest [1 ]));
430+ break ;
431+ case MP_QSTR_quality :
432+ mp_camera_hal_set_quality (self , mp_obj_get_int (dest [1 ]));
433+ break ;
434+ case MP_QSTR_colorbar :
435+ mp_camera_hal_set_colorbar (self , mp_obj_is_true (dest [1 ]));
436+ break ;
437+ case MP_QSTR_whitebal :
438+ mp_camera_hal_set_whitebal (self , mp_obj_is_true (dest [1 ]));
439+ break ;
440+ case MP_QSTR_gain_ctrl :
441+ mp_camera_hal_set_gain_ctrl (self , mp_obj_is_true (dest [1 ]));
442+ break ;
443+ case MP_QSTR_exposure_ctrl :
444+ mp_camera_hal_set_exposure_ctrl (self , mp_obj_is_true (dest [1 ]));
445+ break ;
446+ case MP_QSTR_hmirror :
447+ mp_camera_hal_set_hmirror (self , mp_obj_is_true (dest [1 ]));
448+ break ;
449+ case MP_QSTR_vflip :
450+ mp_camera_hal_set_vflip (self , mp_obj_is_true (dest [1 ]));
451+ break ;
452+ case MP_QSTR_aec2 :
453+ mp_camera_hal_set_aec2 (self , mp_obj_is_true (dest [1 ]));
454+ break ;
455+ case MP_QSTR_awb_gain :
456+ mp_camera_hal_set_awb_gain (self , mp_obj_is_true (dest [1 ]));
457+ break ;
458+ case MP_QSTR_agc_gain :
459+ mp_camera_hal_set_agc_gain (self , mp_obj_get_int (dest [1 ]));
460+ break ;
461+ case MP_QSTR_aec_value :
462+ mp_camera_hal_set_aec_value (self , mp_obj_get_int (dest [1 ]));
463+ break ;
464+ case MP_QSTR_special_effect :
465+ mp_camera_hal_set_special_effect (self , mp_obj_get_int (dest [1 ]));
466+ break ;
467+ case MP_QSTR_wb_mode :
468+ mp_camera_hal_set_wb_mode (self , mp_obj_get_int (dest [1 ]));
469+ break ;
470+ case MP_QSTR_ae_level :
471+ mp_camera_hal_set_ae_level (self , mp_obj_get_int (dest [1 ]));
472+ break ;
473+ case MP_QSTR_dcw :
474+ mp_camera_hal_set_dcw (self , mp_obj_is_true (dest [1 ]));
475+ break ;
476+ case MP_QSTR_bpc :
477+ mp_camera_hal_set_bpc (self , mp_obj_is_true (dest [1 ]));
478+ break ;
479+ case MP_QSTR_wpc :
480+ mp_camera_hal_set_wpc (self , mp_obj_is_true (dest [1 ]));
481+ break ;
482+ case MP_QSTR_raw_gma :
483+ mp_camera_hal_set_raw_gma (self , mp_obj_is_true (dest [1 ]));
484+ break ;
485+ case MP_QSTR_lenc :
486+ mp_camera_hal_set_lenc (self , mp_obj_is_true (dest [1 ]));
487+ break ;
488+ default :
489+ return ;
490+ }
491+ dest [0 ] = MP_OBJ_NULL ;
492+ }
493+ }
494+
283495// Camera property functions
284496// Camera sensor property functions
285497#define CREATE_GETTER (property , get_function ) \
286498 static mp_obj_t camera_get_##property(const mp_obj_t self_in) { \
499+ mp_warning(NULL, "get_" #property "() is deprecated. Use the " #property " property instead."); \
287500 mp_camera_obj_t *self = MP_OBJ_TO_PTR(self_in); \
288501 return get_function(mp_camera_hal_get_##property(self)); \
289502 } \
290503 static MP_DEFINE_CONST_FUN_OBJ_1(camera_get_##property##_obj, camera_get_##property);
291504
292505#define CREATE_SETTER (property , set_conversion ) \
293506 static mp_obj_t camera_set_##property(const mp_obj_t self_in, const mp_obj_t arg) { \
507+ mp_warning(NULL, "set_" #property "() is deprecated. Use the " #property " property instead."); \
294508 mp_camera_obj_t *self = MP_OBJ_TO_PTR(self_in); \
295509 mp_camera_hal_set_##property(self, set_conversion(arg)); \
296510 if (mp_camera_hal_get_##property(self) != set_conversion(arg)) { \
@@ -447,6 +661,7 @@ MP_DEFINE_CONST_OBJ_TYPE(
447661 MP_TYPE_FLAG_NONE ,
448662 make_new , mp_camera_make_new ,
449663 print , mp_camera_hal_print ,
664+ attr , camera_obj_property ,
450665 locals_dict , & camera_camera_locals_dict
451666);
452667
0 commit comments