Merge pull request #2015 from kwagyeman/kwabena/add_ioctl_for_fov_over_fps

sensors/gc2145: Add support for a wider FoV.
This commit is contained in:
Ibrahim Abdelkader 2023-11-17 19:52:09 +02:00 committed by GitHub
commit 25359054e7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 19 deletions

View File

@ -137,6 +137,8 @@ typedef enum {
IOCTL_GET_READOUT_WINDOW,
IOCTL_SET_TRIGGERED_MODE,
IOCTL_GET_TRIGGERED_MODE,
IOCTL_SET_FOV_WIDE,
IOCTL_GET_FOV_WIDE,
IOCTL_TRIGGER_AUTO_FOCUS,
IOCTL_PAUSE_AUTO_FOCUS,
IOCTL_RESET_AUTO_FOCUS,

View File

@ -692,14 +692,18 @@ static mp_obj_t py_sensor_ioctl(uint n_args, const mp_obj_t *args) {
break;
}
case IOCTL_SET_TRIGGERED_MODE: {
case IOCTL_SET_TRIGGERED_MODE:
case IOCTL_SET_FOV_WIDE:
case IOCTL_SET_NIGHT_MODE: {
if (n_args >= 2) {
error = sensor_ioctl(request, mp_obj_get_int(args[1]));
}
break;
}
case IOCTL_GET_TRIGGERED_MODE: {
case IOCTL_GET_TRIGGERED_MODE:
case IOCTL_GET_FOV_WIDE:
case IOCTL_GET_NIGHT_MODE: {
int enabled;
error = sensor_ioctl(request, &enabled);
if (error == 0) {
@ -721,22 +725,6 @@ static mp_obj_t py_sensor_ioctl(uint n_args, const mp_obj_t *args) {
}
#endif
case IOCTL_SET_NIGHT_MODE: {
if (n_args >= 2) {
error = sensor_ioctl(request, mp_obj_get_int(args[1]));
}
break;
}
case IOCTL_GET_NIGHT_MODE: {
int enabled;
error = sensor_ioctl(request, &enabled);
if (error == 0) {
ret_obj = mp_obj_new_bool(enabled);
}
break;
}
case IOCTL_LEPTON_GET_WIDTH: {
int width;
error = sensor_ioctl(request, &width);
@ -1102,6 +1090,8 @@ STATIC const mp_map_elem_t globals_dict_table[] = {
{ 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)},

View File

@ -42,6 +42,8 @@ static int16_t readout_y = 0;
static uint16_t readout_w = ACTIVE_SENSOR_WIDTH;
static uint16_t readout_h = ACTIVE_SENSOR_HEIGHT;
static bool fov_wide = false;
// SLAVE ADDR 0x78
static const uint8_t default_regs[][2] = {
{0xfe, 0xf0},
@ -726,6 +728,8 @@ static int reset(sensor_t *sensor) {
readout_w = ACTIVE_SENSOR_WIDTH;
readout_h = ACTIVE_SENSOR_HEIGHT;
fov_wide = false;
// Write default registers
for (int i = 0; default_regs[i][0]; i++) {
ret |= omv_i2c_writeb(&sensor->i2c_bus, sensor->slv_addr, default_regs[i][0], default_regs[i][1]);
@ -847,7 +851,7 @@ static int set_framesize(sensor_t *sensor, framesize_t framesize) {
uint16_t ratio = fast_floorf(IM_MIN(readout_w / ((float) w), readout_h / ((float) h)));
// Limit the maximum amount of scaling allowed to keep the frame rate up.
ratio = IM_MIN(ratio, 3);
ratio = IM_MIN(ratio, (fov_wide ? 5 : 3));
if (!(ratio % 2)) {
// camera outputs messed up bayer images at even ratios for some reason...
@ -959,6 +963,14 @@ static int ioctl(sensor_t *sensor, int request, va_list ap) {
*va_arg(ap, int *) = readout_h;
break;
}
case IOCTL_SET_FOV_WIDE: {
fov_wide = va_arg(ap, int);
break;
}
case IOCTL_GET_FOV_WIDE: {
*va_arg(ap, int *) = fov_wide;
break;
}
default: {
ret = -1;
break;