modules/py_sensor: Refactor arg parsing.

This commit is contained in:
iabdalkader 2023-11-12 15:13:26 +01:00
parent 555e67ecd6
commit 9e6e03eca4

View File

@ -78,45 +78,50 @@ static mp_obj_t py_sensor__init__() {
}
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor__init__obj, py_sensor__init__);
static mp_obj_t py_sensor_reset() {
int error = sensor_reset();
if (error != 0) {
sensor_raise_error(error);
}
#if MICROPY_PY_IMU
#if MICROPY_PY_IMU
// +-10 degree dead-zone around pitch 90/270.
// +-45 degree active-zone around roll 0/90/180/270/360.
do_auto_rotation(10, 45);
// We're setting the dead-zone on pitch because roll readings are invalid there.
// We're setting the full range on roll to set the initial state.
#endif // MICROPY_PY_IMU
#endif // MICROPY_PY_IMU
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_reset_obj, py_sensor_reset);
static mp_obj_t py_sensor_sleep(mp_obj_t enable) {
PY_ASSERT_FALSE_MSG(sensor_sleep(mp_obj_is_true(enable)) != 0, "Sleep Failed");
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_sleep_obj, py_sensor_sleep);
static mp_obj_t py_sensor_shutdown(mp_obj_t enable) {
PY_ASSERT_FALSE_MSG(sensor_shutdown(mp_obj_is_true(enable)) != 0, "Shutdown Failed");
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_shutdown_obj, py_sensor_shutdown);
static mp_obj_t py_sensor_flush() {
framebuffer_update_jpeg_buffer();
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_flush_obj, py_sensor_flush);
static mp_obj_t py_sensor_snapshot(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
#if MICROPY_PY_IMU
#if MICROPY_PY_IMU
// +-10 degree dead-zone around pitch 90/270.
// +-35 degree active-zone around roll 0/90/180/270/360.
do_auto_rotation(10, 35);
// We're setting the dead-zone on pitch because roll readings are invalid there.
// We're not setting the full range on roll to prevent oscillation.
#endif // MICROPY_PY_IMU
#endif // MICROPY_PY_IMU
mp_obj_t image = py_image(0, 0, 0, 0, 0);
int error = sensor.snapshot(&sensor, (image_t *) py_image_cobj(image), 0);
@ -125,9 +130,10 @@ static mp_obj_t py_sensor_snapshot(uint n_args, const mp_obj_t *args, mp_map_t *
}
return image;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_sensor_snapshot_obj, 0, py_sensor_snapshot);
static mp_obj_t py_sensor_skip_frames(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
mp_map_elem_t *kw_arg = mp_map_lookup(kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_time), MP_MAP_LOOKUP);
mp_map_elem_t *kw_arg = mp_map_lookup(kw_args, MP_ROM_QSTR(MP_QSTR_time), MP_MAP_LOOKUP);
mp_int_t time = 300; // OV Recommended.
if (kw_arg != NULL) {
@ -153,14 +159,17 @@ static mp_obj_t py_sensor_skip_frames(uint n_args, const mp_obj_t *args, mp_map_
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_sensor_skip_frames_obj, 0, py_sensor_skip_frames);
static mp_obj_t py_sensor_width() {
return mp_obj_new_int(resolution[sensor.framesize][0]);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_width_obj, py_sensor_width);
static mp_obj_t py_sensor_height() {
return mp_obj_new_int(resolution[sensor.framesize][1]);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_height_obj, py_sensor_height);
static mp_obj_t py_sensor_get_fb() {
if (framebuffer_get_depth() < 0) {
@ -171,14 +180,17 @@ static mp_obj_t py_sensor_get_fb() {
framebuffer_init_image(&image);
return py_image_from_struct(&image);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_fb_obj, py_sensor_get_fb);
static mp_obj_t py_sensor_get_id() {
return mp_obj_new_int(sensor_get_id());
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_id_obj, py_sensor_get_id);
static mp_obj_t py_sensor_get_frame_available() {
return mp_obj_new_bool(framebuffer->tail != framebuffer->head);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_frame_available_obj, py_sensor_get_frame_available);
static mp_obj_t py_sensor_alloc_extra_fb(mp_obj_t w_obj, mp_obj_t h_obj, mp_obj_t pixfmt_obj) {
int w = mp_obj_get_int(w_obj);
@ -200,11 +212,13 @@ static mp_obj_t py_sensor_alloc_extra_fb(mp_obj_t w_obj, mp_obj_t h_obj, mp_obj_
fb_alloc_mark_permanent(); // pixels will not be popped on exception
return r;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_3(py_sensor_alloc_extra_fb_obj, py_sensor_alloc_extra_fb);
static mp_obj_t py_sensor_dealloc_extra_fb() {
fb_alloc_free_till_mark_past_mark_permanent();
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_dealloc_extra_fb_obj, py_sensor_dealloc_extra_fb);
static mp_obj_t py_sensor_set_pixformat(mp_obj_t pixformat) {
int error = sensor_set_pixformat(mp_obj_get_int(pixformat));
@ -213,6 +227,7 @@ static mp_obj_t py_sensor_set_pixformat(mp_obj_t pixformat) {
}
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_pixformat_obj, py_sensor_set_pixformat);
static mp_obj_t py_sensor_get_pixformat() {
if (sensor.pixformat == PIXFORMAT_INVALID) {
@ -220,6 +235,7 @@ static mp_obj_t py_sensor_get_pixformat() {
}
return mp_obj_new_int(sensor.pixformat);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_pixformat_obj, py_sensor_get_pixformat);
static mp_obj_t py_sensor_set_framesize(mp_obj_t framesize) {
int error = sensor_set_framesize(mp_obj_get_int(framesize));
@ -228,6 +244,7 @@ static mp_obj_t py_sensor_set_framesize(mp_obj_t framesize) {
}
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_framesize_obj, py_sensor_set_framesize);
static mp_obj_t py_sensor_get_framesize() {
if (sensor.framesize == FRAMESIZE_INVALID) {
@ -235,6 +252,7 @@ static mp_obj_t py_sensor_get_framesize() {
}
return mp_obj_new_int(sensor.framesize);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_framesize_obj, py_sensor_get_framesize);
static mp_obj_t py_sensor_set_framerate(mp_obj_t framerate) {
int error = sensor_set_framerate(mp_obj_get_int(framerate));
@ -243,6 +261,7 @@ static mp_obj_t py_sensor_set_framerate(mp_obj_t framerate) {
}
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_framerate_obj, py_sensor_set_framerate);
static mp_obj_t py_sensor_get_framerate() {
if (sensor.framerate == 0) {
@ -250,6 +269,7 @@ static mp_obj_t py_sensor_get_framerate() {
}
return mp_obj_new_int(sensor.framerate);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_framerate_obj, py_sensor_get_framerate);
static mp_obj_t py_sensor_set_windowing(uint n_args, const mp_obj_t *args) {
if (sensor.framesize == FRAMESIZE_INVALID) {
@ -302,6 +322,7 @@ static mp_obj_t py_sensor_set_windowing(uint n_args, const mp_obj_t *args) {
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(py_sensor_set_windowing_obj, 1, 4, py_sensor_set_windowing);
static mp_obj_t py_sensor_get_windowing() {
if (sensor.framesize == FRAMESIZE_INVALID) {
@ -313,6 +334,7 @@ static mp_obj_t py_sensor_get_windowing() {
mp_obj_new_int(framebuffer_get_u()),
mp_obj_new_int(framebuffer_get_v())});
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_windowing_obj, py_sensor_get_windowing);
static mp_obj_t py_sensor_set_gainceiling(mp_obj_t gainceiling) {
gainceiling_t gain;
@ -348,6 +370,7 @@ static mp_obj_t py_sensor_set_gainceiling(mp_obj_t gainceiling) {
}
return mp_const_true;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_gainceiling_obj, py_sensor_set_gainceiling);
static mp_obj_t py_sensor_set_brightness(mp_obj_t brightness) {
if (sensor_set_brightness(mp_obj_get_int(brightness)) != 0) {
@ -355,6 +378,7 @@ static mp_obj_t py_sensor_set_brightness(mp_obj_t brightness) {
}
return mp_const_true;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_brightness_obj, py_sensor_set_brightness);
static mp_obj_t py_sensor_set_contrast(mp_obj_t contrast) {
if (sensor_set_contrast(mp_obj_get_int(contrast)) != 0) {
@ -362,6 +386,7 @@ static mp_obj_t py_sensor_set_contrast(mp_obj_t contrast) {
}
return mp_const_true;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_contrast_obj, py_sensor_set_contrast);
static mp_obj_t py_sensor_set_saturation(mp_obj_t saturation) {
if (sensor_set_saturation(mp_obj_get_int(saturation)) != 0) {
@ -369,6 +394,7 @@ static mp_obj_t py_sensor_set_saturation(mp_obj_t saturation) {
}
return mp_const_true;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_saturation_obj, py_sensor_set_saturation);
static mp_obj_t py_sensor_set_quality(mp_obj_t qs) {
int q = mp_obj_get_int(qs);
@ -381,6 +407,7 @@ static mp_obj_t py_sensor_set_quality(mp_obj_t qs) {
}
return mp_const_true;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_quality_obj, py_sensor_set_quality);
static mp_obj_t py_sensor_set_colorbar(mp_obj_t enable) {
if (sensor_set_colorbar(mp_obj_is_true(enable)) != 0) {
@ -388,11 +415,22 @@ static mp_obj_t py_sensor_set_colorbar(mp_obj_t enable) {
}
return mp_const_true;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_colorbar_obj, py_sensor_set_colorbar);
static mp_obj_t py_sensor_set_auto_gain(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
int enable = mp_obj_get_int(args[0]);
float gain_db = py_helper_keyword_float(n_args, args, 1, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_gain_db), NAN);
float gain_db_ceiling = py_helper_keyword_float(n_args, args, 2, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_gain_db_ceiling), NAN);
static mp_obj_t py_sensor_set_auto_gain(uint n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
enum { ARG_gain_db, ARG_gain_db_ceiling };
static const mp_arg_t allowed_args[] = {
{ MP_QSTR_gain_db, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_rom_obj = MP_ROM_NONE} },
{ MP_QSTR_gain_db_ceiling, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_rom_obj = MP_ROM_NONE} },
};
// Parse args.
int enable = mp_obj_get_int(pos_args[0]);
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
float gain_db = py_helper_arg_to_float(args[ARG_gain_db].u_obj, NAN);
float gain_db_ceiling = py_helper_arg_to_float(args[ARG_gain_db_ceiling].u_obj, NAN);
int error = sensor_set_auto_gain(enable, gain_db, gain_db_ceiling);
if (error != 0) {
@ -403,6 +441,7 @@ static mp_obj_t py_sensor_set_auto_gain(uint n_args, const mp_obj_t *args, mp_ma
}
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_sensor_set_auto_gain_obj, 1, py_sensor_set_auto_gain);
static mp_obj_t py_sensor_get_gain_db() {
float gain_db;
@ -412,10 +451,20 @@ static mp_obj_t py_sensor_get_gain_db() {
}
return mp_obj_new_float(gain_db);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_gain_db_obj, py_sensor_get_gain_db);
static mp_obj_t py_sensor_set_auto_exposure(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
int exposure_us = py_helper_keyword_int(n_args, args, 1, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_exposure_us), -1);
int error = sensor_set_auto_exposure(mp_obj_get_int(args[0]), exposure_us);
static mp_obj_t py_sensor_set_auto_exposure(uint n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
enum { ARG_exposure_us };
static const mp_arg_t allowed_args[] = {
{ MP_QSTR_exposure_us, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = -1} },
};
// Parse args.
int enable = mp_obj_get_int(pos_args[0]);
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
int error = sensor_set_auto_exposure(enable, args[ARG_exposure_us].u_int);
if (error != 0) {
if (error != SENSOR_ERROR_CTL_UNSUPPORTED) {
sensor_raise_error(error);
@ -424,6 +473,7 @@ static mp_obj_t py_sensor_set_auto_exposure(uint n_args, const mp_obj_t *args, m
}
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_sensor_set_auto_exposure_obj, 1, py_sensor_set_auto_exposure);
static mp_obj_t py_sensor_get_exposure_us() {
int exposure_us;
@ -433,11 +483,21 @@ static mp_obj_t py_sensor_get_exposure_us() {
}
return mp_obj_new_int(exposure_us);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_exposure_us_obj, py_sensor_get_exposure_us);
static mp_obj_t py_sensor_set_auto_whitebal(uint n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
enum { ARG_rgb_gain_db };
static const mp_arg_t allowed_args[] = {
{ MP_QSTR_rgb_gain_db, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_rom_obj = MP_ROM_NONE} },
};
// Parse args.
int enable = mp_obj_get_int(pos_args[0]);
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
static mp_obj_t py_sensor_set_auto_whitebal(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
int enable = mp_obj_get_int(args[0]);
float rgb_gain_db[3] = {NAN, NAN, NAN};
py_helper_keyword_float_array(n_args, args, 1, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_rgb_gain_db), rgb_gain_db, 3);
py_helper_arg_to_float_array(args[ARG_rgb_gain_db].u_obj, rgb_gain_db, 3);
int error = sensor_set_auto_whitebal(enable, rgb_gain_db[0], rgb_gain_db[1], rgb_gain_db[2]);
if (error != 0) {
@ -448,6 +508,7 @@ static mp_obj_t py_sensor_set_auto_whitebal(uint n_args, const mp_obj_t *args, m
}
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_sensor_set_auto_whitebal_obj, 1, py_sensor_set_auto_whitebal);
static mp_obj_t py_sensor_get_rgb_gain_db() {
float r_gain_db = 0.0, g_gain_db = 0.0, b_gain_db = 0.0;
@ -461,6 +522,7 @@ static mp_obj_t py_sensor_get_rgb_gain_db() {
mp_obj_new_float(b_gain_db)
});
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_rgb_gain_db_obj, py_sensor_get_rgb_gain_db);
static mp_obj_t py_sensor_set_auto_blc(uint n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
enum { ARG_enable, ARG_regs };
@ -492,6 +554,7 @@ static mp_obj_t py_sensor_set_auto_blc(uint n_args, const mp_obj_t *pos_args, mp
}
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_sensor_set_auto_blc_obj, 1, py_sensor_set_auto_blc);
static mp_obj_t py_sensor_get_blc_regs() {
int regs[sensor.hw_flags.blc_size];
@ -506,6 +569,7 @@ static mp_obj_t py_sensor_get_blc_regs() {
}
return l;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_blc_regs_obj, py_sensor_get_blc_regs);
static mp_obj_t py_sensor_set_hmirror(mp_obj_t enable) {
int error = sensor_set_hmirror(mp_obj_is_true(enable));
@ -514,10 +578,12 @@ static mp_obj_t py_sensor_set_hmirror(mp_obj_t enable) {
}
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_hmirror_obj, py_sensor_set_hmirror);
static mp_obj_t py_sensor_get_hmirror() {
return mp_obj_new_bool(sensor_get_hmirror());
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_hmirror_obj, py_sensor_get_hmirror);
static mp_obj_t py_sensor_set_vflip(mp_obj_t enable) {
int error = sensor_set_vflip(mp_obj_is_true(enable));
@ -526,10 +592,12 @@ static mp_obj_t py_sensor_set_vflip(mp_obj_t enable) {
}
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_vflip_obj, py_sensor_set_vflip);
static mp_obj_t py_sensor_get_vflip() {
return mp_obj_new_bool(sensor_get_vflip());
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_vflip_obj, py_sensor_get_vflip);
static mp_obj_t py_sensor_set_transpose(mp_obj_t enable) {
int error = sensor_set_transpose(mp_obj_is_true(enable));
@ -538,10 +606,12 @@ static mp_obj_t py_sensor_set_transpose(mp_obj_t enable) {
}
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_transpose_obj, py_sensor_set_transpose);
static mp_obj_t py_sensor_get_transpose() {
return mp_obj_new_bool(sensor_get_transpose());
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_transpose_obj, py_sensor_get_transpose);
static mp_obj_t py_sensor_set_auto_rotation(mp_obj_t enable) {
int error = sensor_set_auto_rotation(mp_obj_is_true(enable));
@ -550,10 +620,12 @@ static mp_obj_t py_sensor_set_auto_rotation(mp_obj_t enable) {
}
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_auto_rotation_obj, py_sensor_set_auto_rotation);
static mp_obj_t py_sensor_get_auto_rotation() {
return mp_obj_new_bool(sensor_get_auto_rotation());
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_auto_rotation_obj, py_sensor_get_auto_rotation);
static mp_obj_t py_sensor_set_framebuffers(mp_obj_t count) {
mp_int_t c = mp_obj_get_int(count);
@ -573,10 +645,12 @@ static mp_obj_t py_sensor_set_framebuffers(mp_obj_t count) {
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_framebuffers_obj, py_sensor_set_framebuffers);
static mp_obj_t py_sensor_get_framebuffers() {
return mp_obj_new_int(framebuffer->n_buffers);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_framebuffers_obj, py_sensor_get_framebuffers);
static mp_obj_t py_sensor_disable_delays(uint n_args, const mp_obj_t *args) {
if (!n_args) {
@ -586,6 +660,7 @@ static mp_obj_t py_sensor_disable_delays(uint n_args, const mp_obj_t *args) {
sensor.disable_delays = mp_obj_get_int(args[0]);
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(py_sensor_disable_delays_obj, 0, 1, py_sensor_disable_delays);
static mp_obj_t py_sensor_disable_full_flush(uint n_args, const mp_obj_t *args) {
if (!n_args) {
@ -595,6 +670,7 @@ static mp_obj_t py_sensor_disable_full_flush(uint n_args, const mp_obj_t *args)
sensor.disable_full_flush = mp_obj_get_int(args[0]);
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(py_sensor_disable_full_flush_obj, 0, 1, py_sensor_disable_full_flush);
static mp_obj_t py_sensor_set_special_effect(mp_obj_t sde) {
if (sensor_set_special_effect(mp_obj_get_int(sde)) != 0) {
@ -602,6 +678,7 @@ static mp_obj_t py_sensor_set_special_effect(mp_obj_t sde) {
}
return mp_const_true;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_special_effect_obj, py_sensor_set_special_effect);
static mp_obj_t py_sensor_set_lens_correction(mp_obj_t enable, mp_obj_t radi, mp_obj_t coef) {
if (sensor_set_lens_correction(mp_obj_is_true(enable),
@ -610,6 +687,7 @@ static mp_obj_t py_sensor_set_lens_correction(mp_obj_t enable, mp_obj_t radi, mp
}
return mp_const_true;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_3(py_sensor_set_lens_correction_obj, py_sensor_set_lens_correction);
static void sensor_vsync_callback(uint32_t vsync) {
if (mp_obj_is_callable(vsync_callback)) {
@ -628,6 +706,7 @@ static mp_obj_t py_sensor_set_vsync_callback(mp_obj_t vsync_callback_obj) {
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_vsync_callback_obj, py_sensor_set_vsync_callback);
static void sensor_frame_callback() {
if (mp_obj_is_callable(frame_callback)) {
@ -646,6 +725,7 @@ static mp_obj_t py_sensor_set_frame_callback(mp_obj_t frame_callback_obj) {
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_frame_callback_obj, py_sensor_set_frame_callback);
static mp_obj_t py_sensor_ioctl(uint n_args, const mp_obj_t *args) {
mp_obj_t ret_obj = mp_const_none;
@ -899,7 +979,6 @@ static mp_obj_t py_sensor_ioctl(uint n_args, const mp_obj_t *args) {
}
break;
}
#endif // (OMV_ENABLE_HM01B0 == 1)
default: {
@ -914,6 +993,7 @@ static mp_obj_t py_sensor_ioctl(uint n_args, const mp_obj_t *args) {
return ret_obj;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(py_sensor_ioctl_obj, 1, 5, py_sensor_ioctl);
static mp_obj_t py_sensor_set_color_palette(mp_obj_t palette_obj) {
int palette = mp_obj_get_int(palette_obj);
@ -930,6 +1010,7 @@ static mp_obj_t py_sensor_set_color_palette(mp_obj_t palette_obj) {
}
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_color_palette_obj, py_sensor_set_color_palette);
static mp_obj_t py_sensor_get_color_palette() {
const uint16_t *palette = sensor_get_color_palette();
@ -940,254 +1021,198 @@ static mp_obj_t py_sensor_get_color_palette() {
}
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_color_palette_obj, py_sensor_get_color_palette);
static mp_obj_t py_sensor_write_reg(mp_obj_t addr, mp_obj_t val) {
sensor_write_reg(mp_obj_get_int(addr), mp_obj_get_int(val));
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_2(py_sensor_write_reg_obj, py_sensor_write_reg);
static mp_obj_t py_sensor_read_reg(mp_obj_t addr) {
return mp_obj_new_int(sensor_read_reg(mp_obj_get_int(addr)));
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_read_reg_obj, py_sensor_read_reg);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor__init__obj, py_sensor__init__);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_reset_obj, py_sensor_reset);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_sleep_obj, py_sensor_sleep);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_shutdown_obj, py_sensor_shutdown);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_flush_obj, py_sensor_flush);
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_sensor_snapshot_obj, 0, py_sensor_snapshot);
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_sensor_skip_frames_obj, 0, py_sensor_skip_frames);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_width_obj, py_sensor_width);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_height_obj, py_sensor_height);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_fb_obj, py_sensor_get_fb);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_id_obj, py_sensor_get_id);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_frame_available_obj, py_sensor_get_frame_available);
STATIC MP_DEFINE_CONST_FUN_OBJ_3(py_sensor_alloc_extra_fb_obj, py_sensor_alloc_extra_fb);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_dealloc_extra_fb_obj, py_sensor_dealloc_extra_fb);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_pixformat_obj, py_sensor_set_pixformat);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_pixformat_obj, py_sensor_get_pixformat);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_framesize_obj, py_sensor_set_framesize);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_framesize_obj, py_sensor_get_framesize);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_framerate_obj, py_sensor_set_framerate);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_framerate_obj, py_sensor_get_framerate);
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(py_sensor_set_windowing_obj, 1, 4, py_sensor_set_windowing);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_windowing_obj, py_sensor_get_windowing);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_gainceiling_obj, py_sensor_set_gainceiling);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_contrast_obj, py_sensor_set_contrast);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_brightness_obj, py_sensor_set_brightness);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_saturation_obj, py_sensor_set_saturation);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_quality_obj, py_sensor_set_quality);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_colorbar_obj, py_sensor_set_colorbar);
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_sensor_set_auto_gain_obj, 1, py_sensor_set_auto_gain);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_gain_db_obj, py_sensor_get_gain_db);
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_sensor_set_auto_exposure_obj, 1, py_sensor_set_auto_exposure);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_exposure_us_obj, py_sensor_get_exposure_us);
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_sensor_set_auto_whitebal_obj, 1, py_sensor_set_auto_whitebal);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_rgb_gain_db_obj, py_sensor_get_rgb_gain_db);
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_sensor_set_auto_blc_obj, 1, py_sensor_set_auto_blc);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_blc_regs_obj, py_sensor_get_blc_regs);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_hmirror_obj, py_sensor_set_hmirror);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_hmirror_obj, py_sensor_get_hmirror);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_vflip_obj, py_sensor_set_vflip);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_vflip_obj, py_sensor_get_vflip);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_transpose_obj, py_sensor_set_transpose);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_transpose_obj, py_sensor_get_transpose);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_auto_rotation_obj, py_sensor_set_auto_rotation);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_auto_rotation_obj, py_sensor_get_auto_rotation);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_framebuffers_obj, py_sensor_set_framebuffers);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_framebuffers_obj, py_sensor_get_framebuffers);
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(py_sensor_disable_delays_obj, 0, 1, py_sensor_disable_delays);
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(py_sensor_disable_full_flush_obj, 0, 1, py_sensor_disable_full_flush);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_special_effect_obj, py_sensor_set_special_effect);
STATIC MP_DEFINE_CONST_FUN_OBJ_3(py_sensor_set_lens_correction_obj, py_sensor_set_lens_correction);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_vsync_callback_obj, py_sensor_set_vsync_callback);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_frame_callback_obj, py_sensor_set_frame_callback);
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(py_sensor_ioctl_obj, 1, 5, py_sensor_ioctl);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_color_palette_obj, py_sensor_set_color_palette);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_color_palette_obj, py_sensor_get_color_palette);
STATIC MP_DEFINE_CONST_FUN_OBJ_2(py_sensor_write_reg_obj, py_sensor_write_reg);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_read_reg_obj, py_sensor_read_reg);
STATIC const mp_map_elem_t globals_dict_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_sensor)},
STATIC const mp_rom_map_elem_t globals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_sensor)},
// Pixel Formats
{ MP_OBJ_NEW_QSTR(MP_QSTR_BINARY), MP_OBJ_NEW_SMALL_INT(PIXFORMAT_BINARY)}, /* 1BPP/BINARY*/
{ MP_OBJ_NEW_QSTR(MP_QSTR_GRAYSCALE), MP_OBJ_NEW_SMALL_INT(PIXFORMAT_GRAYSCALE)},/* 1BPP/GRAYSCALE*/
{ MP_OBJ_NEW_QSTR(MP_QSTR_RGB565), MP_OBJ_NEW_SMALL_INT(PIXFORMAT_RGB565)}, /* 2BPP/RGB565*/
{ MP_OBJ_NEW_QSTR(MP_QSTR_BAYER), MP_OBJ_NEW_SMALL_INT(PIXFORMAT_BAYER)}, /* 1BPP/RAW*/
{ MP_OBJ_NEW_QSTR(MP_QSTR_YUV422), MP_OBJ_NEW_SMALL_INT(PIXFORMAT_YUV422)}, /* 2BPP/YUV422*/
{ MP_OBJ_NEW_QSTR(MP_QSTR_JPEG), MP_OBJ_NEW_SMALL_INT(PIXFORMAT_JPEG)}, /* JPEG/COMPRESSED*/
{ MP_ROM_QSTR(MP_QSTR_BINARY), MP_ROM_INT(PIXFORMAT_BINARY)}, /* 1BPP/BINARY*/
{ MP_ROM_QSTR(MP_QSTR_GRAYSCALE), MP_ROM_INT(PIXFORMAT_GRAYSCALE)}, /* 1BPP/GRAYSCALE*/
{ MP_ROM_QSTR(MP_QSTR_RGB565), MP_ROM_INT(PIXFORMAT_RGB565)}, /* 2BPP/RGB565*/
{ MP_ROM_QSTR(MP_QSTR_BAYER), MP_ROM_INT(PIXFORMAT_BAYER)}, /* 1BPP/RAW*/
{ MP_ROM_QSTR(MP_QSTR_YUV422), MP_ROM_INT(PIXFORMAT_YUV422)}, /* 2BPP/YUV422*/
{ MP_ROM_QSTR(MP_QSTR_JPEG), MP_ROM_INT(PIXFORMAT_JPEG)}, /* JPEG/COMPRESSED*/
// Image Sensors
{ MP_OBJ_NEW_QSTR(MP_QSTR_OV2640), MP_OBJ_NEW_SMALL_INT(OV2640_ID)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_OV5640), MP_OBJ_NEW_SMALL_INT(OV5640_ID)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_OV7670), MP_OBJ_NEW_SMALL_INT(OV7670_ID)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_OV7690), MP_OBJ_NEW_SMALL_INT(OV7690_ID)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_OV7725), MP_OBJ_NEW_SMALL_INT(OV7725_ID)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_OV9650), MP_OBJ_NEW_SMALL_INT(OV9650_ID)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_MT9V022), MP_OBJ_NEW_SMALL_INT(MT9V0X2_ID)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_MT9V024), MP_OBJ_NEW_SMALL_INT(MT9V0X4_ID)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_MT9V032), MP_OBJ_NEW_SMALL_INT(MT9V0X2_ID)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_MT9V034), MP_OBJ_NEW_SMALL_INT(MT9V0X4_ID)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_MT9M114), MP_OBJ_NEW_SMALL_INT(MT9M114_ID)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_LEPTON), MP_OBJ_NEW_SMALL_INT(LEPTON_ID)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_HM01B0), MP_OBJ_NEW_SMALL_INT(HM01B0_ID)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_GC2145), MP_OBJ_NEW_SMALL_INT(GC2145_ID)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_PAJ6100), MP_OBJ_NEW_SMALL_INT(PAJ6100_ID)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_FROGEYE2020), MP_OBJ_NEW_SMALL_INT(FROGEYE2020_ID)},
{ MP_ROM_QSTR(MP_QSTR_OV2640), MP_ROM_INT(OV2640_ID)},
{ MP_ROM_QSTR(MP_QSTR_OV5640), MP_ROM_INT(OV5640_ID)},
{ MP_ROM_QSTR(MP_QSTR_OV7670), MP_ROM_INT(OV7670_ID)},
{ MP_ROM_QSTR(MP_QSTR_OV7690), MP_ROM_INT(OV7690_ID)},
{ MP_ROM_QSTR(MP_QSTR_OV7725), MP_ROM_INT(OV7725_ID)},
{ MP_ROM_QSTR(MP_QSTR_OV9650), MP_ROM_INT(OV9650_ID)},
{ MP_ROM_QSTR(MP_QSTR_MT9V022), MP_ROM_INT(MT9V0X2_ID)},
{ MP_ROM_QSTR(MP_QSTR_MT9V024), MP_ROM_INT(MT9V0X4_ID)},
{ MP_ROM_QSTR(MP_QSTR_MT9V032), MP_ROM_INT(MT9V0X2_ID)},
{ MP_ROM_QSTR(MP_QSTR_MT9V034), MP_ROM_INT(MT9V0X4_ID)},
{ MP_ROM_QSTR(MP_QSTR_MT9M114), MP_ROM_INT(MT9M114_ID)},
{ MP_ROM_QSTR(MP_QSTR_LEPTON), MP_ROM_INT(LEPTON_ID)},
{ MP_ROM_QSTR(MP_QSTR_HM01B0), MP_ROM_INT(HM01B0_ID)},
{ MP_ROM_QSTR(MP_QSTR_GC2145), MP_ROM_INT(GC2145_ID)},
{ MP_ROM_QSTR(MP_QSTR_PAJ6100), MP_ROM_INT(PAJ6100_ID)},
{ MP_ROM_QSTR(MP_QSTR_FROGEYE2020), MP_ROM_INT(FROGEYE2020_ID)},
// Special effects
{ MP_OBJ_NEW_QSTR(MP_QSTR_NORMAL), MP_OBJ_NEW_SMALL_INT(SDE_NORMAL)}, /* Normal/No SDE */
{ MP_OBJ_NEW_QSTR(MP_QSTR_NEGATIVE), MP_OBJ_NEW_SMALL_INT(SDE_NEGATIVE)}, /* Negative image */
{ MP_ROM_QSTR(MP_QSTR_NORMAL), MP_ROM_INT(SDE_NORMAL)}, /* Normal/No SDE */
{ MP_ROM_QSTR(MP_QSTR_NEGATIVE), MP_ROM_INT(SDE_NEGATIVE)}, /* Negative image */
// C/SIF Resolutions
{ MP_OBJ_NEW_QSTR(MP_QSTR_QQCIF), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_QQCIF)}, /* 88x72 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_QCIF), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_QCIF)}, /* 176x144 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_CIF), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_CIF)}, /* 352x288 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_QQSIF), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_QQSIF)}, /* 88x60 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_QSIF), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_QSIF)}, /* 176x120 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_SIF), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_SIF)}, /* 352x240 */
{ MP_ROM_QSTR(MP_QSTR_QQCIF), MP_ROM_INT(FRAMESIZE_QQCIF)}, /* 88x72 */
{ MP_ROM_QSTR(MP_QSTR_QCIF), MP_ROM_INT(FRAMESIZE_QCIF)}, /* 176x144 */
{ MP_ROM_QSTR(MP_QSTR_CIF), MP_ROM_INT(FRAMESIZE_CIF)}, /* 352x288 */
{ MP_ROM_QSTR(MP_QSTR_QQSIF), MP_ROM_INT(FRAMESIZE_QQSIF)}, /* 88x60 */
{ MP_ROM_QSTR(MP_QSTR_QSIF), MP_ROM_INT(FRAMESIZE_QSIF)}, /* 176x120 */
{ MP_ROM_QSTR(MP_QSTR_SIF), MP_ROM_INT(FRAMESIZE_SIF)}, /* 352x240 */
// VGA Resolutions
{ MP_OBJ_NEW_QSTR(MP_QSTR_QQQQVGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_QQQQVGA)}, /* 40x30 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_QQQVGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_QQQVGA)}, /* 80x60 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_QQVGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_QQVGA)}, /* 160x120 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_QVGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_QVGA)}, /* 320x240 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_VGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_VGA)}, /* 640x480 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_HQQQQVGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_HQQQQVGA)}, /* 40x20 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_HQQQVGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_HQQQVGA)}, /* 80x40 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_HQQVGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_HQQVGA)}, /* 160x80 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_HQVGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_HQVGA)}, /* 240x160 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_HVGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_HVGA)}, /* 480x320 */
{ MP_ROM_QSTR(MP_QSTR_QQQQVGA), MP_ROM_INT(FRAMESIZE_QQQQVGA)}, /* 40x30 */
{ MP_ROM_QSTR(MP_QSTR_QQQVGA), MP_ROM_INT(FRAMESIZE_QQQVGA)}, /* 80x60 */
{ MP_ROM_QSTR(MP_QSTR_QQVGA), MP_ROM_INT(FRAMESIZE_QQVGA)}, /* 160x120 */
{ MP_ROM_QSTR(MP_QSTR_QVGA), MP_ROM_INT(FRAMESIZE_QVGA)}, /* 320x240 */
{ MP_ROM_QSTR(MP_QSTR_VGA), MP_ROM_INT(FRAMESIZE_VGA)}, /* 640x480 */
{ MP_ROM_QSTR(MP_QSTR_HQQQQVGA), MP_ROM_INT(FRAMESIZE_HQQQQVGA)}, /* 40x20 */
{ MP_ROM_QSTR(MP_QSTR_HQQQVGA), MP_ROM_INT(FRAMESIZE_HQQQVGA)}, /* 80x40 */
{ MP_ROM_QSTR(MP_QSTR_HQQVGA), MP_ROM_INT(FRAMESIZE_HQQVGA)}, /* 160x80 */
{ MP_ROM_QSTR(MP_QSTR_HQVGA), MP_ROM_INT(FRAMESIZE_HQVGA)}, /* 240x160 */
{ MP_ROM_QSTR(MP_QSTR_HVGA), MP_ROM_INT(FRAMESIZE_HVGA)}, /* 480x320 */
// FFT Resolutions
{ MP_OBJ_NEW_QSTR(MP_QSTR_B64X32), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_64X32)}, /* 64x32 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_B64X64), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_64X64)}, /* 64x64 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_B128X64), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_128X64)}, /* 128x64 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_B128X128), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_128X128)}, /* 128x128 */
{ MP_ROM_QSTR(MP_QSTR_B64X32), MP_ROM_INT(FRAMESIZE_64X32)}, /* 64x32 */
{ MP_ROM_QSTR(MP_QSTR_B64X64), MP_ROM_INT(FRAMESIZE_64X64)}, /* 64x64 */
{ MP_ROM_QSTR(MP_QSTR_B128X64), MP_ROM_INT(FRAMESIZE_128X64)}, /* 128x64 */
{ MP_ROM_QSTR(MP_QSTR_B128X128), MP_ROM_INT(FRAMESIZE_128X128)}, /* 128x128 */
// Himax Resolutions
{ MP_OBJ_NEW_QSTR(MP_QSTR_B160X160), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_160X160)}, /* 160x160 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_B320X320), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_320X320)}, /* 320x320 */
// Other
{ MP_OBJ_NEW_QSTR(MP_QSTR_LCD), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_LCD)}, /* 128x160 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_QQVGA2), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_QQVGA2)}, /* 128x160 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_WVGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_WVGA)}, /* 720x480 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_WVGA2), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_WVGA2)}, /* 752x480 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_SVGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_SVGA)}, /* 800x600 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_XGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_XGA)}, /* 1024x768 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_WXGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_WXGA)}, /* 1280x768 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_SXGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_SXGA)}, /* 1280x1024 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_SXGAM), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_SXGAM)}, /* 1280x960 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_UXGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_UXGA)}, /* 1600x1200 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_HD), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_HD)}, /* 1280x720 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_FHD), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_FHD)}, /* 1920x1080 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_QHD), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_QHD)}, /* 2560x1440 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_QXGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_QXGA)}, /* 2048x1536 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_WQXGA), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_WQXGA)}, /* 2560x1600 */
{ MP_OBJ_NEW_QSTR(MP_QSTR_WQXGA2), MP_OBJ_NEW_SMALL_INT(FRAMESIZE_WQXGA2)}, /* 2592x1944 */
// IOCTLs
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_SET_READOUT_WINDOW), MP_OBJ_NEW_SMALL_INT(IOCTL_SET_READOUT_WINDOW)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_GET_READOUT_WINDOW), MP_OBJ_NEW_SMALL_INT(IOCTL_GET_READOUT_WINDOW)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_SET_TRIGGERED_MODE), MP_OBJ_NEW_SMALL_INT(IOCTL_SET_TRIGGERED_MODE)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_GET_TRIGGERED_MODE), MP_OBJ_NEW_SMALL_INT(IOCTL_GET_TRIGGERED_MODE)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_SET_FOV_WIDE), MP_OBJ_NEW_SMALL_INT(IOCTL_SET_FOV_WIDE)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_GET_FOV_WIDE), MP_OBJ_NEW_SMALL_INT(IOCTL_GET_FOV_WIDE)},
#if (OMV_ENABLE_OV5640_AF == 1)
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_TRIGGER_AUTO_FOCUS), MP_OBJ_NEW_SMALL_INT(IOCTL_TRIGGER_AUTO_FOCUS)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_PAUSE_AUTO_FOCUS), MP_OBJ_NEW_SMALL_INT(IOCTL_PAUSE_AUTO_FOCUS)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_RESET_AUTO_FOCUS), MP_OBJ_NEW_SMALL_INT(IOCTL_RESET_AUTO_FOCUS)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_WAIT_ON_AUTO_FOCUS), MP_OBJ_NEW_SMALL_INT(IOCTL_WAIT_ON_AUTO_FOCUS)},
#endif
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_SET_NIGHT_MODE), MP_OBJ_NEW_SMALL_INT(IOCTL_SET_NIGHT_MODE)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_GET_NIGHT_MODE), MP_OBJ_NEW_SMALL_INT(IOCTL_GET_NIGHT_MODE)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_LEPTON_GET_WIDTH), MP_OBJ_NEW_SMALL_INT(IOCTL_LEPTON_GET_WIDTH)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_LEPTON_GET_HEIGHT), MP_OBJ_NEW_SMALL_INT(IOCTL_LEPTON_GET_HEIGHT)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_LEPTON_GET_RADIOMETRY), MP_OBJ_NEW_SMALL_INT(IOCTL_LEPTON_GET_RADIOMETRY)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_LEPTON_GET_REFRESH), MP_OBJ_NEW_SMALL_INT(IOCTL_LEPTON_GET_REFRESH)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_LEPTON_GET_RESOLUTION), MP_OBJ_NEW_SMALL_INT(IOCTL_LEPTON_GET_RESOLUTION)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_LEPTON_RUN_COMMAND), MP_OBJ_NEW_SMALL_INT(IOCTL_LEPTON_RUN_COMMAND)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_LEPTON_SET_ATTRIBUTE), MP_OBJ_NEW_SMALL_INT(IOCTL_LEPTON_SET_ATTRIBUTE)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_LEPTON_GET_ATTRIBUTE), MP_OBJ_NEW_SMALL_INT(IOCTL_LEPTON_GET_ATTRIBUTE)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_LEPTON_GET_FPA_TEMPERATURE), MP_OBJ_NEW_SMALL_INT(IOCTL_LEPTON_GET_FPA_TEMPERATURE)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_LEPTON_GET_AUX_TEMPERATURE), MP_OBJ_NEW_SMALL_INT(IOCTL_LEPTON_GET_AUX_TEMPERATURE)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_LEPTON_SET_MEASUREMENT_MODE), MP_OBJ_NEW_SMALL_INT(IOCTL_LEPTON_SET_MEASUREMENT_MODE)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_LEPTON_GET_MEASUREMENT_MODE), MP_OBJ_NEW_SMALL_INT(IOCTL_LEPTON_GET_MEASUREMENT_MODE)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_LEPTON_SET_MEASUREMENT_RANGE), MP_OBJ_NEW_SMALL_INT(IOCTL_LEPTON_SET_MEASUREMENT_RANGE)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_LEPTON_GET_MEASUREMENT_RANGE), MP_OBJ_NEW_SMALL_INT(IOCTL_LEPTON_GET_MEASUREMENT_RANGE)},
#if (OMV_ENABLE_HM01B0 == 1)
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_HIMAX_MD_ENABLE), MP_OBJ_NEW_SMALL_INT(IOCTL_HIMAX_MD_ENABLE)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_HIMAX_MD_WINDOW), MP_OBJ_NEW_SMALL_INT(IOCTL_HIMAX_MD_WINDOW)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_HIMAX_MD_THRESHOLD), MP_OBJ_NEW_SMALL_INT(IOCTL_HIMAX_MD_THRESHOLD)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_HIMAX_MD_CLEAR), MP_OBJ_NEW_SMALL_INT(IOCTL_HIMAX_MD_CLEAR)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_IOCTL_HIMAX_OSC_ENABLE), MP_OBJ_NEW_SMALL_INT(IOCTL_HIMAX_OSC_ENABLE)},
#endif
{ MP_ROM_QSTR(MP_QSTR_B160X160), MP_ROM_INT(FRAMESIZE_160X160)}, /* 160x160 */
{ MP_ROM_QSTR(MP_QSTR_B320X320), MP_ROM_INT(FRAMESIZE_320X320)}, /* 320x320 */
// Other Resolutions
{ MP_ROM_QSTR(MP_QSTR_LCD), MP_ROM_INT(FRAMESIZE_LCD)}, /* 128x160 */
{ MP_ROM_QSTR(MP_QSTR_QQVGA2), MP_ROM_INT(FRAMESIZE_QQVGA2)}, /* 128x160 */
{ MP_ROM_QSTR(MP_QSTR_WVGA), MP_ROM_INT(FRAMESIZE_WVGA)}, /* 720x480 */
{ MP_ROM_QSTR(MP_QSTR_WVGA2), MP_ROM_INT(FRAMESIZE_WVGA2)}, /* 752x480 */
{ MP_ROM_QSTR(MP_QSTR_SVGA), MP_ROM_INT(FRAMESIZE_SVGA)}, /* 800x600 */
{ MP_ROM_QSTR(MP_QSTR_XGA), MP_ROM_INT(FRAMESIZE_XGA)}, /* 1024x768 */
{ MP_ROM_QSTR(MP_QSTR_WXGA), MP_ROM_INT(FRAMESIZE_WXGA)}, /* 1280x768 */
{ MP_ROM_QSTR(MP_QSTR_SXGA), MP_ROM_INT(FRAMESIZE_SXGA)}, /* 1280x1024 */
{ MP_ROM_QSTR(MP_QSTR_SXGAM), MP_ROM_INT(FRAMESIZE_SXGAM)}, /* 1280x960 */
{ MP_ROM_QSTR(MP_QSTR_UXGA), MP_ROM_INT(FRAMESIZE_UXGA)}, /* 1600x1200 */
{ MP_ROM_QSTR(MP_QSTR_HD), MP_ROM_INT(FRAMESIZE_HD)}, /* 1280x720 */
{ MP_ROM_QSTR(MP_QSTR_FHD), MP_ROM_INT(FRAMESIZE_FHD)}, /* 1920x1080 */
{ MP_ROM_QSTR(MP_QSTR_QHD), MP_ROM_INT(FRAMESIZE_QHD)}, /* 2560x1440 */
{ MP_ROM_QSTR(MP_QSTR_QXGA), MP_ROM_INT(FRAMESIZE_QXGA)}, /* 2048x1536 */
{ MP_ROM_QSTR(MP_QSTR_WQXGA), MP_ROM_INT(FRAMESIZE_WQXGA)}, /* 2560x1600 */
{ MP_ROM_QSTR(MP_QSTR_WQXGA2), MP_ROM_INT(FRAMESIZE_WQXGA2)}, /* 2592x1944 */
// Framebuffer Sizes
{ MP_OBJ_NEW_QSTR(MP_QSTR_SINGLE_BUFFER), MP_OBJ_NEW_SMALL_INT(1)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_DOUBLE_BUFFER), MP_OBJ_NEW_SMALL_INT(2)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_TRIPLE_BUFFER), MP_OBJ_NEW_SMALL_INT(3)},
{ MP_OBJ_NEW_QSTR(MP_QSTR_VIDEO_FIFO), MP_OBJ_NEW_SMALL_INT(4)},
{ MP_ROM_QSTR(MP_QSTR_SINGLE_BUFFER), MP_ROM_INT(1)},
{ MP_ROM_QSTR(MP_QSTR_DOUBLE_BUFFER), MP_ROM_INT(2)},
{ MP_ROM_QSTR(MP_QSTR_TRIPLE_BUFFER), MP_ROM_INT(3)},
{ MP_ROM_QSTR(MP_QSTR_VIDEO_FIFO), MP_ROM_INT(4)},
// IOCTLs
{ MP_ROM_QSTR(MP_QSTR_IOCTL_SET_READOUT_WINDOW), MP_ROM_INT(IOCTL_SET_READOUT_WINDOW)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_GET_READOUT_WINDOW), MP_ROM_INT(IOCTL_GET_READOUT_WINDOW)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_SET_TRIGGERED_MODE), MP_ROM_INT(IOCTL_SET_TRIGGERED_MODE)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_GET_TRIGGERED_MODE), MP_ROM_INT(IOCTL_GET_TRIGGERED_MODE)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_SET_FOV_WIDE), MP_ROM_INT(IOCTL_SET_FOV_WIDE)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_GET_FOV_WIDE), MP_ROM_INT(IOCTL_GET_FOV_WIDE)},
#if (OMV_ENABLE_OV5640_AF == 1)
{ MP_ROM_QSTR(MP_QSTR_IOCTL_TRIGGER_AUTO_FOCUS), MP_ROM_INT(IOCTL_TRIGGER_AUTO_FOCUS)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_PAUSE_AUTO_FOCUS), MP_ROM_INT(IOCTL_PAUSE_AUTO_FOCUS)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_RESET_AUTO_FOCUS), MP_ROM_INT(IOCTL_RESET_AUTO_FOCUS)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_WAIT_ON_AUTO_FOCUS), MP_ROM_INT(IOCTL_WAIT_ON_AUTO_FOCUS)},
#endif
{ MP_ROM_QSTR(MP_QSTR_IOCTL_SET_NIGHT_MODE), MP_ROM_INT(IOCTL_SET_NIGHT_MODE)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_GET_NIGHT_MODE), MP_ROM_INT(IOCTL_GET_NIGHT_MODE)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_LEPTON_GET_WIDTH), MP_ROM_INT(IOCTL_LEPTON_GET_WIDTH)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_LEPTON_GET_HEIGHT), MP_ROM_INT(IOCTL_LEPTON_GET_HEIGHT)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_LEPTON_GET_RADIOMETRY), MP_ROM_INT(IOCTL_LEPTON_GET_RADIOMETRY)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_LEPTON_GET_REFRESH), MP_ROM_INT(IOCTL_LEPTON_GET_REFRESH)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_LEPTON_GET_RESOLUTION), MP_ROM_INT(IOCTL_LEPTON_GET_RESOLUTION)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_LEPTON_RUN_COMMAND), MP_ROM_INT(IOCTL_LEPTON_RUN_COMMAND)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_LEPTON_SET_ATTRIBUTE), MP_ROM_INT(IOCTL_LEPTON_SET_ATTRIBUTE)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_LEPTON_GET_ATTRIBUTE), MP_ROM_INT(IOCTL_LEPTON_GET_ATTRIBUTE)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_LEPTON_GET_FPA_TEMPERATURE), MP_ROM_INT(IOCTL_LEPTON_GET_FPA_TEMPERATURE)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_LEPTON_GET_AUX_TEMPERATURE), MP_ROM_INT(IOCTL_LEPTON_GET_AUX_TEMPERATURE)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_LEPTON_SET_MEASUREMENT_MODE), MP_ROM_INT(IOCTL_LEPTON_SET_MEASUREMENT_MODE)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_LEPTON_GET_MEASUREMENT_MODE), MP_ROM_INT(IOCTL_LEPTON_GET_MEASUREMENT_MODE)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_LEPTON_SET_MEASUREMENT_RANGE), MP_ROM_INT(IOCTL_LEPTON_SET_MEASUREMENT_RANGE)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_LEPTON_GET_MEASUREMENT_RANGE), MP_ROM_INT(IOCTL_LEPTON_GET_MEASUREMENT_RANGE)},
#if (OMV_ENABLE_HM01B0 == 1)
{ MP_ROM_QSTR(MP_QSTR_IOCTL_HIMAX_MD_ENABLE), MP_ROM_INT(IOCTL_HIMAX_MD_ENABLE)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_HIMAX_MD_WINDOW), MP_ROM_INT(IOCTL_HIMAX_MD_WINDOW)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_HIMAX_MD_THRESHOLD), MP_ROM_INT(IOCTL_HIMAX_MD_THRESHOLD)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_HIMAX_MD_CLEAR), MP_ROM_INT(IOCTL_HIMAX_MD_CLEAR)},
{ MP_ROM_QSTR(MP_QSTR_IOCTL_HIMAX_OSC_ENABLE), MP_ROM_INT(IOCTL_HIMAX_OSC_ENABLE)},
#endif
// Sensor functions
{ MP_OBJ_NEW_QSTR(MP_QSTR___init__), (mp_obj_t) &py_sensor__init__obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_reset), (mp_obj_t) &py_sensor_reset_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_sleep), (mp_obj_t) &py_sensor_sleep_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_shutdown), (mp_obj_t) &py_sensor_shutdown_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_flush), (mp_obj_t) &py_sensor_flush_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_snapshot), (mp_obj_t) &py_sensor_snapshot_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_skip_frames), (mp_obj_t) &py_sensor_skip_frames_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_width), (mp_obj_t) &py_sensor_width_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_height), (mp_obj_t) &py_sensor_height_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_fb), (mp_obj_t) &py_sensor_get_fb_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_id), (mp_obj_t) &py_sensor_get_id_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_frame_available), (mp_obj_t) &py_sensor_get_frame_available_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_alloc_extra_fb), (mp_obj_t) &py_sensor_alloc_extra_fb_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_dealloc_extra_fb), (mp_obj_t) &py_sensor_dealloc_extra_fb_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_pixformat), (mp_obj_t) &py_sensor_set_pixformat_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_pixformat), (mp_obj_t) &py_sensor_get_pixformat_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_framesize), (mp_obj_t) &py_sensor_set_framesize_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_framesize), (mp_obj_t) &py_sensor_get_framesize_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_framerate), (mp_obj_t) &py_sensor_set_framerate_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_framerate), (mp_obj_t) &py_sensor_get_framerate_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_windowing), (mp_obj_t) &py_sensor_set_windowing_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_windowing), (mp_obj_t) &py_sensor_get_windowing_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_gainceiling), (mp_obj_t) &py_sensor_set_gainceiling_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_contrast), (mp_obj_t) &py_sensor_set_contrast_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_brightness), (mp_obj_t) &py_sensor_set_brightness_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_saturation), (mp_obj_t) &py_sensor_set_saturation_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_quality), (mp_obj_t) &py_sensor_set_quality_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_colorbar), (mp_obj_t) &py_sensor_set_colorbar_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_auto_gain), (mp_obj_t) &py_sensor_set_auto_gain_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_gain_db), (mp_obj_t) &py_sensor_get_gain_db_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_auto_exposure), (mp_obj_t) &py_sensor_set_auto_exposure_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_exposure_us), (mp_obj_t) &py_sensor_get_exposure_us_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_auto_whitebal), (mp_obj_t) &py_sensor_set_auto_whitebal_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_rgb_gain_db), (mp_obj_t) &py_sensor_get_rgb_gain_db_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_auto_blc), (mp_obj_t) &py_sensor_set_auto_blc_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_blc_regs), (mp_obj_t) &py_sensor_get_blc_regs_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_hmirror), (mp_obj_t) &py_sensor_set_hmirror_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_hmirror), (mp_obj_t) &py_sensor_get_hmirror_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_vflip), (mp_obj_t) &py_sensor_set_vflip_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_vflip), (mp_obj_t) &py_sensor_get_vflip_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_transpose), (mp_obj_t) &py_sensor_set_transpose_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_transpose), (mp_obj_t) &py_sensor_get_transpose_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_auto_rotation), (mp_obj_t) &py_sensor_set_auto_rotation_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_auto_rotation), (mp_obj_t) &py_sensor_get_auto_rotation_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_framebuffers), (mp_obj_t) &py_sensor_set_framebuffers_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_framebuffers), (mp_obj_t) &py_sensor_get_framebuffers_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_disable_delays), (mp_obj_t) &py_sensor_disable_delays_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_disable_full_flush), (mp_obj_t) &py_sensor_disable_full_flush_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_special_effect), (mp_obj_t) &py_sensor_set_special_effect_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_lens_correction), (mp_obj_t) &py_sensor_set_lens_correction_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_vsync_callback), (mp_obj_t) &py_sensor_set_vsync_callback_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_frame_callback), (mp_obj_t) &py_sensor_set_frame_callback_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_ioctl), (mp_obj_t) &py_sensor_ioctl_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_color_palette), (mp_obj_t) &py_sensor_set_color_palette_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_color_palette), (mp_obj_t) &py_sensor_get_color_palette_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR___write_reg), (mp_obj_t) &py_sensor_write_reg_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR___read_reg), (mp_obj_t) &py_sensor_read_reg_obj },
{ MP_ROM_QSTR(MP_QSTR___init__), MP_ROM_PTR(&py_sensor__init__obj) },
{ MP_ROM_QSTR(MP_QSTR_reset), MP_ROM_PTR(&py_sensor_reset_obj) },
{ MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&py_sensor_sleep_obj) },
{ MP_ROM_QSTR(MP_QSTR_shutdown), MP_ROM_PTR(&py_sensor_shutdown_obj) },
{ MP_ROM_QSTR(MP_QSTR_flush), MP_ROM_PTR(&py_sensor_flush_obj) },
{ MP_ROM_QSTR(MP_QSTR_snapshot), MP_ROM_PTR(&py_sensor_snapshot_obj) },
{ MP_ROM_QSTR(MP_QSTR_skip_frames), MP_ROM_PTR(&py_sensor_skip_frames_obj) },
{ MP_ROM_QSTR(MP_QSTR_width), MP_ROM_PTR(&py_sensor_width_obj) },
{ MP_ROM_QSTR(MP_QSTR_height), MP_ROM_PTR(&py_sensor_height_obj) },
{ MP_ROM_QSTR(MP_QSTR_get_fb), MP_ROM_PTR(&py_sensor_get_fb_obj) },
{ MP_ROM_QSTR(MP_QSTR_get_id), MP_ROM_PTR(&py_sensor_get_id_obj) },
{ MP_ROM_QSTR(MP_QSTR_get_frame_available), MP_ROM_PTR(&py_sensor_get_frame_available_obj) },
{ MP_ROM_QSTR(MP_QSTR_alloc_extra_fb), MP_ROM_PTR(&py_sensor_alloc_extra_fb_obj) },
{ MP_ROM_QSTR(MP_QSTR_dealloc_extra_fb), MP_ROM_PTR(&py_sensor_dealloc_extra_fb_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_pixformat), MP_ROM_PTR(&py_sensor_set_pixformat_obj) },
{ MP_ROM_QSTR(MP_QSTR_get_pixformat), MP_ROM_PTR(&py_sensor_get_pixformat_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_framesize), MP_ROM_PTR(&py_sensor_set_framesize_obj) },
{ MP_ROM_QSTR(MP_QSTR_get_framesize), MP_ROM_PTR(&py_sensor_get_framesize_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_framerate), MP_ROM_PTR(&py_sensor_set_framerate_obj) },
{ MP_ROM_QSTR(MP_QSTR_get_framerate), MP_ROM_PTR(&py_sensor_get_framerate_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_windowing), MP_ROM_PTR(&py_sensor_set_windowing_obj) },
{ MP_ROM_QSTR(MP_QSTR_get_windowing), MP_ROM_PTR(&py_sensor_get_windowing_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_gainceiling), MP_ROM_PTR(&py_sensor_set_gainceiling_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_contrast), MP_ROM_PTR(&py_sensor_set_contrast_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_brightness), MP_ROM_PTR(&py_sensor_set_brightness_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_saturation), MP_ROM_PTR(&py_sensor_set_saturation_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_quality), MP_ROM_PTR(&py_sensor_set_quality_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_colorbar), MP_ROM_PTR(&py_sensor_set_colorbar_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_auto_gain), MP_ROM_PTR(&py_sensor_set_auto_gain_obj) },
{ MP_ROM_QSTR(MP_QSTR_get_gain_db), MP_ROM_PTR(&py_sensor_get_gain_db_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_auto_exposure), MP_ROM_PTR(&py_sensor_set_auto_exposure_obj) },
{ MP_ROM_QSTR(MP_QSTR_get_exposure_us), MP_ROM_PTR(&py_sensor_get_exposure_us_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_auto_whitebal), MP_ROM_PTR(&py_sensor_set_auto_whitebal_obj) },
{ MP_ROM_QSTR(MP_QSTR_get_rgb_gain_db), MP_ROM_PTR(&py_sensor_get_rgb_gain_db_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_auto_blc), MP_ROM_PTR(&py_sensor_set_auto_blc_obj) },
{ MP_ROM_QSTR(MP_QSTR_get_blc_regs), MP_ROM_PTR(&py_sensor_get_blc_regs_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_hmirror), MP_ROM_PTR(&py_sensor_set_hmirror_obj) },
{ MP_ROM_QSTR(MP_QSTR_get_hmirror), MP_ROM_PTR(&py_sensor_get_hmirror_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_vflip), MP_ROM_PTR(&py_sensor_set_vflip_obj) },
{ MP_ROM_QSTR(MP_QSTR_get_vflip), MP_ROM_PTR(&py_sensor_get_vflip_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_transpose), MP_ROM_PTR(&py_sensor_set_transpose_obj) },
{ MP_ROM_QSTR(MP_QSTR_get_transpose), MP_ROM_PTR(&py_sensor_get_transpose_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_auto_rotation), MP_ROM_PTR(&py_sensor_set_auto_rotation_obj) },
{ MP_ROM_QSTR(MP_QSTR_get_auto_rotation), MP_ROM_PTR(&py_sensor_get_auto_rotation_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_framebuffers), MP_ROM_PTR(&py_sensor_set_framebuffers_obj) },
{ MP_ROM_QSTR(MP_QSTR_get_framebuffers), MP_ROM_PTR(&py_sensor_get_framebuffers_obj) },
{ MP_ROM_QSTR(MP_QSTR_disable_delays), MP_ROM_PTR(&py_sensor_disable_delays_obj) },
{ MP_ROM_QSTR(MP_QSTR_disable_full_flush), MP_ROM_PTR(&py_sensor_disable_full_flush_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_special_effect), MP_ROM_PTR(&py_sensor_set_special_effect_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_lens_correction), MP_ROM_PTR(&py_sensor_set_lens_correction_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_vsync_callback), MP_ROM_PTR(&py_sensor_set_vsync_callback_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_frame_callback), MP_ROM_PTR(&py_sensor_set_frame_callback_obj) },
{ MP_ROM_QSTR(MP_QSTR_ioctl), MP_ROM_PTR(&py_sensor_ioctl_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_color_palette), MP_ROM_PTR(&py_sensor_set_color_palette_obj) },
{ MP_ROM_QSTR(MP_QSTR_get_color_palette), MP_ROM_PTR(&py_sensor_get_color_palette_obj) },
{ MP_ROM_QSTR(MP_QSTR___write_reg), MP_ROM_PTR(&py_sensor_write_reg_obj) },
{ MP_ROM_QSTR(MP_QSTR___read_reg), MP_ROM_PTR(&py_sensor_read_reg_obj) },
};
STATIC MP_DEFINE_CONST_DICT(globals_dict, globals_dict_table);
const mp_obj_module_t sensor_module = {