From: p15692025051 <846603105@qq.com> Date: Mon, 27 Nov 2023 07:15:44 +0000 (+0800) Subject: K01相机预览加lvgl控件修改 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=26904cafc8d708aacfb364bc606367358f3fa938;p=mirrors%2FASR1603_G5.git K01相机预览加lvgl控件修改 --- diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/camera_capture.c b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/camera_capture.c index 05237171..6ce1f549 100644 --- a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/camera_capture.c +++ b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/camera_capture.c @@ -47,7 +47,7 @@ WHEN WHO WHAT,WHERE,WHY #include "jpeglib.h" #include "jpeg_operation.h" - +#include "lvgl.h" #include "helios_debug.h" #define CAPTURE_LOG(msg, ...) custom_log("capture", msg, ##__VA_ARGS__) @@ -104,13 +104,13 @@ void Helios_SaveImage(unsigned char* pYUVBuffer, int width, int height) { int result = -1; char name[256] = {0}; - sprintf(name, "%s.jpg",image_info.image_name); - // sprintf(name, "U:/%s.jpeg",image_info.image_name); + + sprintf(name, "U:/%s.jpeg",image_info.image_name); CAPTURE_LOG("SaveImage %d %d %d %d\n", width, height, image_info.img_width, image_info.img_height); if(image_info.img_width <= width && image_info.img_height <= height && pYUVBuffer != NULL) { -#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) +#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602) if(0 != yuv420_NV12_to_jpg(name, image_info.img_width, image_info.img_height, pYUVBuffer, width, height)) #elif defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) if(0 != yuv422_UYVY_to_jpg(name, image_info.img_width, image_info.img_height, pYUVBuffer, width, height)) @@ -208,13 +208,114 @@ STATIC mp_obj_t caputre_make_new(const mp_obj_type_t *type, size_t n_args, size_ camconfig.preview = 0; } +#if MICROPY_QPY_CAMERA_LVGL_PREVIEW + Helios_camera_scandecode_start(); +#endif return MP_OBJ_FROM_PTR(self); } +/****************************add by elian.wang**************************/ +#if MICROPY_QPY_CAMERA_LVGL_PREVIEW +static Helios_MsgQ_t get_picture_q = 0; +static Helios_Thread_t rgb565_decode_task_id = 0; +uint16_t rgb_buffer[128*128] = {0}; +lv_obj_t *camera_img = NULL; + + + +lv_img_dsc_t camera_img_dsc; +void rgb565_decode_handle(void * argv) { + uint8_t *buff_addr = NULL; + int ret = -1; + + while (1) { + ret = Helios_MsgQ_Get(get_picture_q, (void *)&buff_addr, sizeof(uint32_t), HELIOS_WAIT_FOREVER); + if (ret != 0) + { + CAPTURE_LOG("interrupt handle thread failed to get queue\n"); + continue; + } + + if (camera_img == NULL) { + continue; + } + CAPTURE_LOG("get get_picture_q !!!\n"); + yuv420_nv12_to_rgb565_zoom_out((uint16_t*)rgb_buffer, camconfig.lcdprewidth, camconfig.lcdpreheight, (unsigned char *)buff_addr, camconfig.camwidth, camconfig.camheight); + + camera_img_dsc.header.always_zero = 0; + camera_img_dsc.header.w = camconfig.lcdprewidth; + camera_img_dsc.header.h = camconfig.lcdpreheight; + camera_img_dsc.data_size = camconfig.lcdprewidth * camconfig.lcdpreheight * 2; // RGB565格式是2字节/像素 + camera_img_dsc.header.cf = LV_IMG_CF_TRUE_COLOR; + camera_img_dsc.data = (uint8_t *)rgb_buffer; + lv_img_set_src(camera_img, &camera_img_dsc); + } +} + + void cam_decode(unsigned char* raw, int width, int height) { + Helios_MsgQ_Put(get_picture_q, (const void *)&raw, sizeof(uint32_t), HELIOS_NO_WAIT); + CAPTURE_LOG("send get_picture_q !!!\n"); + } + + + +typedef struct mp_lv_obj_t { + mp_obj_base_t base; + lv_obj_t *lv_obj; + lv_obj_t *callbacks; +} mp_lv_obj_t; +extern mp_int_t mp_lv_obj_get_buffer(mp_obj_t self_in, mp_buffer_info_t *bufinfo, mp_uint_t flags); +STATIC mp_obj_t get_native_obj(mp_obj_t *mp_obj) +{ + if (!MP_OBJ_IS_OBJ(mp_obj)) return mp_obj; + const mp_obj_type_t *native_type = ((mp_obj_base_t*)mp_obj)->type; + if (native_type == NULL) + return NULL; + if (native_type->parent == NULL || + (native_type->buffer_p.get_buffer == mp_lv_obj_get_buffer)) + return mp_obj; + while (native_type->parent) native_type = native_type->parent; + return mp_obj_cast_to_native_base(mp_obj, MP_OBJ_FROM_PTR(native_type)); +} +STATIC inline lv_obj_t *mp_to_lv(mp_obj_t *mp_obj) +{ + if (mp_obj == NULL || mp_obj == mp_const_none) return NULL; + mp_obj_t native_obj = get_native_obj(mp_obj); + if (mp_obj_get_type(native_obj)->buffer_p.get_buffer != mp_lv_obj_get_buffer) + return NULL; + mp_lv_obj_t *mp_lv_obj = MP_OBJ_TO_PTR(native_obj); + return mp_lv_obj->lv_obj; +} + + +STATIC mp_obj_t set_img(mp_obj_t self_in, mp_obj_t *mp_obj) { + lv_obj_t *obj = mp_to_lv(mp_obj); + + if (obj) { + camera_img = obj; + return mp_obj_new_int(1); + } else { + return mp_obj_new_int(0); + } +} +STATIC MP_DEFINE_CONST_FUN_OBJ_2(set_img_obj, set_img); + +STATIC mp_obj_t remove_img(mp_obj_t self_in) { + camera_img = NULL; + return mp_obj_new_int(1); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(remove_img_obj, remove_img); +#endif +/****************************end add********************************/ + STATIC mp_obj_t camera_open(mp_obj_t self_in) { +#if MICROPY_QPY_CAMERA_LVGL_PREVIEW + camconfig.preview = 0; + camconfig.decode_pro = cam_decode; +#endif preview_obj_t *self = MP_OBJ_TO_PTR(self_in); CAPTURE_LOG("open %d,%d,%d,%d,%d\n",camconfig.camheight,camconfig.camwidth,camconfig.lcdpreheight,camconfig.lcdprewidth,camconfig.prebufcnt); int error = Helios_camera_open(&camconfig);//ql_start_preview(data); @@ -222,6 +323,25 @@ STATIC mp_obj_t camera_open(mp_obj_t self_in) self->is_open = TRUE; } +#if MICROPY_QPY_CAMERA_LVGL_PREVIEW + Helios_ThreadAttr attr = {0}; + if (get_picture_q == 0) { + get_picture_q = Helios_MsgQ_Create(1, sizeof(uint8_t)); + } + if(rgb565_decode_task_id == 0) + { + attr.name = "rgb565_decode"; + attr.stack_size = 1024*4; + attr.priority = 90; + attr.entry = rgb565_decode_handle; + + rgb565_decode_task_id = Helios_Thread_Create(&attr); + if (0 == rgb565_decode_task_id) + { + mp_raise_ValueError("create interrupt handle task failed\n"); + } + } +#endif return mp_obj_new_int(error); } STATIC MP_DEFINE_CONST_FUN_OBJ_1(camera_capture_open_obj, camera_open); @@ -325,6 +445,10 @@ STATIC const mp_rom_map_elem_t Preview_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&camera_capture_close_obj) }, { MP_ROM_QSTR(MP_QSTR_start), MP_ROM_PTR(&camera_capture_start_obj) }, { MP_ROM_QSTR(MP_QSTR_callback), MP_ROM_PTR(&camera_capture_callback_obj) }, +#if MICROPY_QPY_CAMERA_LVGL_PREVIEW + {MP_ROM_QSTR(MP_QSTR_set_img), MP_ROM_PTR(&set_img_obj)}, + {MP_ROM_QSTR(MP_QSTR_remove_img), MP_ROM_PTR(&remove_img_obj)}, +#endif }; STATIC MP_DEFINE_CONST_DICT(camCapture_locals_dict, Preview_locals_dict_table); diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/camera_preview.c b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/camera_preview.c index e42e9717..0fb9096b 100644 --- a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/camera_preview.c +++ b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/camera_preview.c @@ -65,7 +65,6 @@ typedef struct _preview_obj_t { static Helios_CAMConfig camconfig = {0}; static preview_obj_t *preview_obj = NULL; -static void helios_uv_table_init(void); STATIC mp_obj_t preview_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { @@ -128,135 +127,14 @@ STATIC mp_obj_t preview_make_new(const mp_obj_type_t *type, size_t n_args, size_ camconfig.lcdprewidth = lcdprewidth; camconfig.prebufcnt = prebufcnt; camconfig.decbufcnt = 1; -#if MICROPY_QPY_CAMERA_LVGL_PREVIEW - Helios_camera_scandecode_start(); -#endif return MP_OBJ_FROM_PTR(self); } - -/****************************add by elian.wang**************************/ -#if MICROPY_QPY_CAMERA_LVGL_PREVIEW -static Helios_MsgQ_t get_picture_q = 0; -static Helios_Thread_t rgb565_decode_task_id = 0; -uint16_t rgb_buffer[128*128] = {0}; -lv_obj_t *camera_img = NULL; - - - -lv_img_dsc_t camera_img_dsc; -void rgb565_decode_handle(void * argv) { - uint8_t *buff_addr = NULL; - int ret = -1; - - while (1) { - ret = Helios_MsgQ_Get(get_picture_q, (void *)&buff_addr, sizeof(uint32_t), HELIOS_WAIT_FOREVER); - if (ret != 0) - { - HELIOS_CAMERA_LOG("interrupt handle thread failed to get queue\n"); - continue; - } - - if (camera_img == NULL) { - continue; - } - yuv420_nv12_to_rgb565_zoom_out((uint16_t*)rgb_buffer, camconfig.lcdprewidth, camconfig.lcdpreheight, (unsigned char *)buff_addr, camconfig.camwidth, camconfig.camheight); - - camera_img_dsc.header.always_zero = 0; - camera_img_dsc.header.w = camconfig.lcdprewidth; - camera_img_dsc.header.h = camconfig.lcdpreheight; - camera_img_dsc.data_size = camconfig.lcdprewidth * camconfig.lcdpreheight * 2; // RGB565格式是2字节/像素 - camera_img_dsc.header.cf = LV_IMG_CF_TRUE_COLOR; - camera_img_dsc.data = (uint8_t *)rgb_buffer; - lv_img_set_src(camera_img, &camera_img_dsc); - } -} - - void cam_decode(unsigned char* raw, int width, int height) { - Helios_MsgQ_Put(get_picture_q, (const void *)&raw, sizeof(uint32_t), HELIOS_NO_WAIT); - } - - -typedef struct mp_lv_obj_t { - mp_obj_base_t base; - lv_obj_t *lv_obj; - lv_obj_t *callbacks; -} mp_lv_obj_t; -extern mp_int_t mp_lv_obj_get_buffer(mp_obj_t self_in, mp_buffer_info_t *bufinfo, mp_uint_t flags); -STATIC mp_obj_t get_native_obj(mp_obj_t *mp_obj) -{ - if (!MP_OBJ_IS_OBJ(mp_obj)) return mp_obj; - const mp_obj_type_t *native_type = ((mp_obj_base_t*)mp_obj)->type; - if (native_type == NULL) - return NULL; - if (native_type->parent == NULL || - (native_type->buffer_p.get_buffer == mp_lv_obj_get_buffer)) - return mp_obj; - while (native_type->parent) native_type = native_type->parent; - return mp_obj_cast_to_native_base(mp_obj, MP_OBJ_FROM_PTR(native_type)); -} -STATIC inline lv_obj_t *mp_to_lv(mp_obj_t *mp_obj) -{ - if (mp_obj == NULL || mp_obj == mp_const_none) return NULL; - mp_obj_t native_obj = get_native_obj(mp_obj); - if (mp_obj_get_type(native_obj)->buffer_p.get_buffer != mp_lv_obj_get_buffer) - return NULL; - mp_lv_obj_t *mp_lv_obj = MP_OBJ_TO_PTR(native_obj); - return mp_lv_obj->lv_obj; -} - - -STATIC mp_obj_t set_img(mp_obj_t self_in, mp_obj_t *mp_obj) { - lv_obj_t *obj = mp_to_lv(mp_obj); - - if (obj) { - camera_img = obj; - return mp_obj_new_int(1); - } else { - return mp_obj_new_int(0); - } -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(set_img_obj, set_img); - -STATIC mp_obj_t remove_img(mp_obj_t self_in) { - camera_img = NULL; - return mp_obj_new_int(1); -} -STATIC MP_DEFINE_CONST_FUN_OBJ_1(remove_img_obj, remove_img); -#endif -/****************************end add********************************/ - STATIC mp_obj_t camera_open(mp_obj_t self_in) { -#if MICROPY_QPY_CAMERA_LVGL_PREVIEW - camconfig.preview = 0; - camconfig.decode_pro = cam_decode; -#else camconfig.preview = 1; -#endif printf("open %d,%d,%d,%d,%d\n",camconfig.camheight,camconfig.camwidth,camconfig.lcdpreheight,camconfig.lcdprewidth,camconfig.prebufcnt); int error = Helios_camera_open(&camconfig); - -#if MICROPY_QPY_CAMERA_LVGL_PREVIEW - Helios_ThreadAttr attr = {0}; - if (get_picture_q == 0) { - get_picture_q = Helios_MsgQ_Create(1, sizeof(uint8_t)); - } - if(rgb565_decode_task_id == 0) - { - attr.name = "rgb565_decode"; - attr.stack_size = 1024*4; - attr.priority = 90; - attr.entry = rgb565_decode_handle; - - rgb565_decode_task_id = Helios_Thread_Create(&attr); - if (0 == rgb565_decode_task_id) - { - mp_raise_ValueError("create interrupt handle task failed\n"); - } - } -#endif - return mp_obj_new_int(error); } STATIC MP_DEFINE_CONST_FUN_OBJ_1(camera_preview_open_obj, camera_open); @@ -284,10 +162,6 @@ STATIC const mp_rom_map_elem_t Preview_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&camera_preview__del__obj) }, { MP_ROM_QSTR(MP_QSTR_open), MP_ROM_PTR(&camera_preview_open_obj) }, { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&camera_preview_close_obj) }, -#if MICROPY_QPY_CAMERA_LVGL_PREVIEW - {MP_ROM_QSTR(MP_QSTR_set_img), MP_ROM_PTR(&set_img_obj)}, - {MP_ROM_QSTR(MP_QSTR_remove_img), MP_ROM_PTR(&remove_img_obj)}, -#endif }; STATIC MP_DEFINE_CONST_DICT(camPreview_locals_dict, Preview_locals_dict_table); diff --git a/2.sdk/Helios_SDK/services/microPython/py/scheduler.c b/2.sdk/Helios_SDK/services/microPython/py/scheduler.c index d387ae90..aa9e9435 100644 --- a/2.sdk/Helios_SDK/services/microPython/py/scheduler.c +++ b/2.sdk/Helios_SDK/services/microPython/py/scheduler.c @@ -200,6 +200,7 @@ bool mp_sched_schedule_ex(c_callback_t *callback, mp_obj_t arg) int ret = qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_LOAD_BOUNDMETH, loadboundmet_msg); if(ret != 0) { + qpy_callback_para_node_delete(loadboundmet_msg); free(loadboundmet_msg); } return true;