Skip to content

Commit ebbd907

Browse files
committed
Add properties to API
1 parent 12a0801 commit ebbd907

File tree

1 file changed

+215
-0
lines changed

1 file changed

+215
-0
lines changed

src/modcamera_api.c

Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,17 +280,231 @@ static mp_obj_t mp_camera_obj___exit__(size_t n_args, const mp_obj_t *args) {
280280
}
281281
static 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

Comments
 (0)