mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
sensors: Add stubs for controlling sensor blc.
This commit is contained in:
parent
16c9faa179
commit
3fde9542a8
@ -219,6 +219,7 @@ typedef struct _sensor {
|
|||||||
uint32_t yuv_swap : 1; // Byte-swap 2BPP YUV formats after capture.
|
uint32_t yuv_swap : 1; // Byte-swap 2BPP YUV formats after capture.
|
||||||
uint32_t bayer : 3; // Bayer/CFA pattern.
|
uint32_t bayer : 3; // Bayer/CFA pattern.
|
||||||
uint32_t yuv_order : 1; // YUV/YVU order.
|
uint32_t yuv_order : 1; // YUV/YVU order.
|
||||||
|
uint32_t blc_size : 4; // Number of black level calibration registers.
|
||||||
} hw_flags;
|
} hw_flags;
|
||||||
|
|
||||||
const uint16_t *color_palette; // Color palette used for color lookup.
|
const uint16_t *color_palette; // Color palette used for color lookup.
|
||||||
@ -266,6 +267,8 @@ typedef struct _sensor {
|
|||||||
int (*get_exposure_us) (sensor_t *sensor, int *exposure_us);
|
int (*get_exposure_us) (sensor_t *sensor, int *exposure_us);
|
||||||
int (*set_auto_whitebal) (sensor_t *sensor, int enable, float r_gain_db, float g_gain_db, float b_gain_db);
|
int (*set_auto_whitebal) (sensor_t *sensor, int enable, float r_gain_db, float g_gain_db, float b_gain_db);
|
||||||
int (*get_rgb_gain_db) (sensor_t *sensor, float *r_gain_db, float *g_gain_db, float *b_gain_db);
|
int (*get_rgb_gain_db) (sensor_t *sensor, float *r_gain_db, float *g_gain_db, float *b_gain_db);
|
||||||
|
int (*set_auto_blc) (sensor_t *sensor, int enable, int *regs);
|
||||||
|
int (*get_blc_regs) (sensor_t *sensor, int *regs);
|
||||||
int (*set_hmirror) (sensor_t *sensor, int enable);
|
int (*set_hmirror) (sensor_t *sensor, int enable);
|
||||||
int (*set_vflip) (sensor_t *sensor, int enable);
|
int (*set_vflip) (sensor_t *sensor, int enable);
|
||||||
int (*set_special_effect) (sensor_t *sensor, sde_t sde);
|
int (*set_special_effect) (sensor_t *sensor, sde_t sde);
|
||||||
@ -379,6 +382,12 @@ int sensor_set_auto_whitebal(int enable, float r_gain_db, float g_gain_db, float
|
|||||||
// Get the rgb gain values.
|
// Get the rgb gain values.
|
||||||
int sensor_get_rgb_gain_db(float *r_gain_db, float *g_gain_db, float *b_gain_db);
|
int sensor_get_rgb_gain_db(float *r_gain_db, float *g_gain_db, float *b_gain_db);
|
||||||
|
|
||||||
|
// Enable auto blc (black level calibration) or set from previous calibration.
|
||||||
|
int sensor_set_auto_blc(int enable, int *regs);
|
||||||
|
|
||||||
|
// Get black level valibration register values.
|
||||||
|
int sensor_get_blc_regs(int *regs);
|
||||||
|
|
||||||
// Enable/disable the hmirror mode.
|
// Enable/disable the hmirror mode.
|
||||||
int sensor_set_hmirror(int enable);
|
int sensor_set_hmirror(int enable);
|
||||||
|
|
||||||
|
|||||||
@ -921,6 +921,34 @@ __weak int sensor_get_rgb_gain_db(float *r_gain_db, float *g_gain_db, float *b_g
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__weak int sensor_set_auto_blc(int enable, int *regs) {
|
||||||
|
// Check if the control is supported.
|
||||||
|
if (sensor.set_auto_blc == NULL) {
|
||||||
|
return SENSOR_ERROR_CTL_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call the sensor specific function.
|
||||||
|
if (sensor.set_auto_blc(&sensor, enable, regs) != 0) {
|
||||||
|
return SENSOR_ERROR_CTL_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
__weak int sensor_get_blc_regs(int *regs) {
|
||||||
|
// Check if the control is supported.
|
||||||
|
if (sensor.get_blc_regs == NULL) {
|
||||||
|
return SENSOR_ERROR_CTL_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call the sensor specific function.
|
||||||
|
if (sensor.get_blc_regs(&sensor, regs) != 0) {
|
||||||
|
return SENSOR_ERROR_CTL_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
__weak int sensor_set_hmirror(int enable) {
|
__weak int sensor_set_hmirror(int enable) {
|
||||||
// Check if the value has changed.
|
// Check if the value has changed.
|
||||||
if (sensor.hmirror == ((bool) enable)) {
|
if (sensor.hmirror == ((bool) enable)) {
|
||||||
|
|||||||
@ -451,6 +451,48 @@ static mp_obj_t 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 };
|
||||||
|
static const mp_arg_t allowed_args[] = {
|
||||||
|
{ MP_QSTR_enable, MP_ARG_REQUIRED | MP_ARG_INT },
|
||||||
|
{ MP_QSTR_regs, MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
|
||||||
|
};
|
||||||
|
|
||||||
|
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||||
|
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||||
|
|
||||||
|
int enable = args[ARG_enable].u_int;
|
||||||
|
int regs[sensor.hw_flags.blc_size];
|
||||||
|
bool regs_present = args[ARG_regs].u_obj != mp_const_none;
|
||||||
|
if (regs_present) {
|
||||||
|
mp_obj_t *arg_array;
|
||||||
|
mp_obj_get_array_fixed_n(args[ARG_regs].u_obj, sensor.hw_flags.blc_size, &arg_array);
|
||||||
|
for (uint32_t i = 0; i < sensor.hw_flags.blc_size; i++) {
|
||||||
|
regs[i] = mp_obj_get_int(arg_array[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int error = sensor_set_auto_blc(enable, regs_present ? regs : NULL);
|
||||||
|
if (error != 0) {
|
||||||
|
sensor_raise_error(error);
|
||||||
|
}
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
|
||||||
|
static mp_obj_t py_sensor_get_blc_regs() {
|
||||||
|
int regs[sensor.hw_flags.blc_size];
|
||||||
|
int error = sensor_get_blc_regs(regs);
|
||||||
|
if (error != 0) {
|
||||||
|
sensor_raise_error(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
mp_obj_list_t *l = mp_obj_new_list(sensor.hw_flags.blc_size, NULL);
|
||||||
|
for (uint32_t i = 0; i < sensor.hw_flags.blc_size; i++) {
|
||||||
|
l->items[i] = mp_obj_new_int(regs[i]);
|
||||||
|
}
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
static mp_obj_t py_sensor_set_hmirror(mp_obj_t enable) {
|
static mp_obj_t py_sensor_set_hmirror(mp_obj_t enable) {
|
||||||
int error = sensor_set_hmirror(mp_obj_is_true(enable));
|
int error = sensor_set_hmirror(mp_obj_is_true(enable));
|
||||||
if (error != 0) {
|
if (error != 0) {
|
||||||
@ -924,6 +966,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_sensor_set_auto_exposure_obj, 1, py_sensor_
|
|||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_0(py_sensor_get_exposure_us_obj, py_sensor_get_exposure_us);
|
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_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_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_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_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_1(py_sensor_set_vflip_obj, py_sensor_set_vflip);
|
||||||
@ -1101,6 +1145,8 @@ STATIC const mp_map_elem_t globals_dict_table[] = {
|
|||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_get_exposure_us), (mp_obj_t) &py_sensor_get_exposure_us_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_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_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_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_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_set_vflip), (mp_obj_t) &py_sensor_set_vflip_obj },
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user