diff --git a/src/manifest.py b/src/manifest.py index ff69f76..929ff84 100644 --- a/src/manifest.py +++ b/src/manifest.py @@ -1,4 +1,5 @@ # Include the board's default manifest. include("$(PORT_DIR)/boards/manifest.py") # Add custom driver -module("acamera.py") \ No newline at end of file +module("acamera.py") +include("/home/user/projects/MicroPythonOS/claude/MicroPythonOS/lvgl_micropython/build/manifest.py") # workaround to prevent micropython-camera-API from overriding the lvgl_micropython manifest... diff --git a/src/modcamera.c b/src/modcamera.c index 5a0bd05..c84f09d 100644 --- a/src/modcamera.c +++ b/src/modcamera.c @@ -252,7 +252,7 @@ const mp_rom_map_elem_t mp_camera_hal_pixel_format_table[] = { const mp_rom_map_elem_t mp_camera_hal_frame_size_table[] = { { MP_ROM_QSTR(MP_QSTR_R96X96), MP_ROM_INT((mp_uint_t)FRAMESIZE_96X96) }, { MP_ROM_QSTR(MP_QSTR_QQVGA), MP_ROM_INT((mp_uint_t)FRAMESIZE_QQVGA) }, - { MP_ROM_QSTR(MP_QSTR_R128x128), MP_ROM_INT((mp_uint_t)FRAMESIZE_128X128) }, + { MP_ROM_QSTR(MP_QSTR_R128X128), MP_ROM_INT((mp_uint_t)FRAMESIZE_128X128) }, { MP_ROM_QSTR(MP_QSTR_QCIF), MP_ROM_INT((mp_uint_t)FRAMESIZE_QCIF) }, { MP_ROM_QSTR(MP_QSTR_HQVGA), MP_ROM_INT((mp_uint_t)FRAMESIZE_HQVGA) }, { MP_ROM_QSTR(MP_QSTR_R240X240), MP_ROM_INT((mp_uint_t)FRAMESIZE_240X240) }, @@ -260,10 +260,17 @@ const mp_rom_map_elem_t mp_camera_hal_frame_size_table[] = { { MP_ROM_QSTR(MP_QSTR_R320X320), MP_ROM_INT((mp_uint_t)FRAMESIZE_320X320) }, { MP_ROM_QSTR(MP_QSTR_CIF), MP_ROM_INT((mp_uint_t)FRAMESIZE_CIF) }, { MP_ROM_QSTR(MP_QSTR_HVGA), MP_ROM_INT((mp_uint_t)FRAMESIZE_HVGA) }, + { MP_ROM_QSTR(MP_QSTR_R480X480), MP_ROM_INT((mp_uint_t)FRAMESIZE_480X480) }, { MP_ROM_QSTR(MP_QSTR_VGA), MP_ROM_INT((mp_uint_t)FRAMESIZE_VGA) }, + { MP_ROM_QSTR(MP_QSTR_R640X640), MP_ROM_INT((mp_uint_t)FRAMESIZE_640X640) }, + { MP_ROM_QSTR(MP_QSTR_R720X720), MP_ROM_INT((mp_uint_t)FRAMESIZE_720X720) }, { MP_ROM_QSTR(MP_QSTR_SVGA), MP_ROM_INT((mp_uint_t)FRAMESIZE_SVGA) }, + { MP_ROM_QSTR(MP_QSTR_R800X800), MP_ROM_INT((mp_uint_t)FRAMESIZE_800X800) }, + { MP_ROM_QSTR(MP_QSTR_R960X960), MP_ROM_INT((mp_uint_t)FRAMESIZE_960X960) }, { MP_ROM_QSTR(MP_QSTR_XGA), MP_ROM_INT((mp_uint_t)FRAMESIZE_XGA) }, + { MP_ROM_QSTR(MP_QSTR_R1024X1024),MP_ROM_INT((mp_uint_t)FRAMESIZE_1024X1024) }, { MP_ROM_QSTR(MP_QSTR_HD), MP_ROM_INT((mp_uint_t)FRAMESIZE_HD) }, + { MP_ROM_QSTR(MP_QSTR_R1280X1280),MP_ROM_INT((mp_uint_t)FRAMESIZE_1280X1280) }, { MP_ROM_QSTR(MP_QSTR_SXGA), MP_ROM_INT((mp_uint_t)FRAMESIZE_SXGA) }, { MP_ROM_QSTR(MP_QSTR_UXGA), MP_ROM_INT((mp_uint_t)FRAMESIZE_UXGA) }, { MP_ROM_QSTR(MP_QSTR_FHD), MP_ROM_INT((mp_uint_t)FRAMESIZE_FHD) }, @@ -435,3 +442,22 @@ int mp_camera_hal_get_pixel_height(mp_camera_obj_t *self) { framesize_t framesize = sensor->status.framesize; return resolution[framesize].height; } + +int mp_camera_hal_set_res_raw(mp_camera_obj_t *self, int startX, int startY, int endX, int endY, int offsetX, int offsetY, int totalX, int totalY, int outputX, int outputY, bool scale, bool binning) { + check_init(self); + sensor_t *sensor = esp_camera_sensor_get(); + if (!sensor->set_res_raw) { + mp_raise_ValueError(MP_ERROR_TEXT("Sensor does not support set_res_raw")); + } + + if (self->captured_buffer) { + esp_camera_return_all(); + self->captured_buffer = NULL; + } + + int ret = sensor->set_res_raw(sensor, startX, startY, endX, endY, offsetX, offsetY, totalX, totalY, outputX, outputY, scale, binning); + if (ret < 0) { + mp_raise_ValueError(MP_ERROR_TEXT("Failed to set raw resolution")); + } + return ret; +} diff --git a/src/modcamera.h b/src/modcamera.h index a3ce749..a8771bd 100644 --- a/src/modcamera.h +++ b/src/modcamera.h @@ -211,7 +211,7 @@ extern const mp_rom_map_elem_t mp_camera_hal_pixel_format_table[9]; * @brief Table mapping frame sizes API to their corresponding values at HAL. * @details Needs to be defined in the port-specific implementation. */ -extern const mp_rom_map_elem_t mp_camera_hal_frame_size_table[24]; +extern const mp_rom_map_elem_t mp_camera_hal_frame_size_table[31]; /** * @brief Table mapping gainceiling API to their corresponding values at HAL. @@ -278,4 +278,24 @@ DECLARE_CAMERA_HAL_GET(int, pixel_width) DECLARE_CAMERA_HAL_GET(const char *, sensor_name) DECLARE_CAMERA_HAL_GET(bool, supports_jpeg) -#endif // MICROPY_INCLUDED_MODCAMERA_H \ No newline at end of file +/** + * @brief Sets the raw resolution parameters including ROI (Region of Interest). + * + * @param self Pointer to the camera object. + * @param startX X start position. + * @param startY Y start position. + * @param endX X end position. + * @param endY Y end position. + * @param offsetX X offset. + * @param offsetY Y offset. + * @param totalX Total X size. + * @param totalY Total Y size. + * @param outputX Output X size. + * @param outputY Output Y size. + * @param scale Enable scaling. + * @param binning Enable binning. + * @return 0 on success, negative value on error. + */ +extern int mp_camera_hal_set_res_raw(mp_camera_obj_t *self, int startX, int startY, int endX, int endY, int offsetX, int offsetY, int totalX, int totalY, int outputX, int outputY, bool scale, bool binning); + +#endif // MICROPY_INCLUDED_MODCAMERA_H diff --git a/src/modcamera_api.c b/src/modcamera_api.c index 39afa71..8f888ca 100644 --- a/src/modcamera_api.c +++ b/src/modcamera_api.c @@ -285,6 +285,48 @@ CREATE_GETSET_FUNCTIONS(wpc, mp_obj_new_bool, mp_obj_is_true); CREATE_GETSET_FUNCTIONS(raw_gma, mp_obj_new_bool, mp_obj_is_true); CREATE_GETSET_FUNCTIONS(lenc, mp_obj_new_bool, mp_obj_is_true); +// set_res_raw function for ROI (Region of Interest) / digital zoom +static mp_obj_t camera_set_res_raw(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + mp_camera_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); + enum { ARG_startX, ARG_startY, ARG_endX, ARG_endY, ARG_offsetX, ARG_offsetY, ARG_totalX, ARG_totalY, ARG_outputX, ARG_outputY, ARG_scale, ARG_binning }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_startX, MP_ARG_INT | MP_ARG_REQUIRED }, + { MP_QSTR_startY, MP_ARG_INT | MP_ARG_REQUIRED }, + { MP_QSTR_endX, MP_ARG_INT | MP_ARG_REQUIRED }, + { MP_QSTR_endY, MP_ARG_INT | MP_ARG_REQUIRED }, + { MP_QSTR_offsetX, MP_ARG_INT | MP_ARG_REQUIRED }, + { MP_QSTR_offsetY, MP_ARG_INT | MP_ARG_REQUIRED }, + { MP_QSTR_totalX, MP_ARG_INT | MP_ARG_REQUIRED }, + { MP_QSTR_totalY, MP_ARG_INT | MP_ARG_REQUIRED }, + { MP_QSTR_outputX, MP_ARG_INT | MP_ARG_REQUIRED }, + { MP_QSTR_outputY, MP_ARG_INT | MP_ARG_REQUIRED }, + { MP_QSTR_scale, MP_ARG_BOOL, {.u_bool = false} }, + { MP_QSTR_binning, MP_ARG_BOOL, {.u_bool = false} }, + }; + + 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 ret = mp_camera_hal_set_res_raw( + self, + args[ARG_startX].u_int, + args[ARG_startY].u_int, + args[ARG_endX].u_int, + args[ARG_endY].u_int, + args[ARG_offsetX].u_int, + args[ARG_offsetY].u_int, + args[ARG_totalX].u_int, + args[ARG_totalY].u_int, + args[ARG_outputX].u_int, + args[ARG_outputY].u_int, + args[ARG_scale].u_bool, + args[ARG_binning].u_bool + ); + + return mp_obj_new_int(ret); +} +static MP_DEFINE_CONST_FUN_OBJ_KW(camera_set_res_raw_obj, 1, camera_set_res_raw); + //API-Tables static const mp_rom_map_elem_t camera_camera_locals_table[] = { { MP_ROM_QSTR(MP_QSTR_reconfigure), MP_ROM_PTR(&camera_reconfigure_obj) }, @@ -293,6 +335,7 @@ static const mp_rom_map_elem_t camera_camera_locals_table[] = { { MP_ROM_QSTR(MP_QSTR_free_buffer), MP_ROM_PTR(&camera_free_buf_obj) }, { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&camera_init_obj) }, { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&mp_camera_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR_set_res_raw), MP_ROM_PTR(&camera_set_res_raw_obj) }, { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&mp_camera_deinit_obj) }, { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&mp_identity_obj) }, { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&mp_camera___exit___obj) },