diff --git a/src/omv/common/sensor.h b/src/omv/common/sensor.h index 42b5d7e1f..654d9b7d9 100644 --- a/src/omv/common/sensor.h +++ b/src/omv/common/sensor.h @@ -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, diff --git a/src/omv/modules/py_sensor.c b/src/omv/modules/py_sensor.c index 096bb137c..3f2247f94 100644 --- a/src/omv/modules/py_sensor.c +++ b/src/omv/modules/py_sensor.c @@ -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)}, diff --git a/src/omv/sensors/gc2145.c b/src/omv/sensors/gc2145.c index 07f485c0f..857055f05 100644 --- a/src/omv/sensors/gc2145.c +++ b/src/omv/sensors/gc2145.c @@ -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;