K01相机预览加lvgl控件修改
authorp15692025051 <846603105@qq.com>
Mon, 27 Nov 2023 07:15:44 +0000 (15:15 +0800)
committerp15692025051 <846603105@qq.com>
Mon, 27 Nov 2023 07:15:44 +0000 (15:15 +0800)
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/camera_capture.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/camera_preview.c
2.sdk/Helios_SDK/services/microPython/py/scheduler.c

index 0523717..6ce1f54 100644 (file)
@@ -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);
 
index e42e971..0fb9096 100644 (file)
@@ -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);
 
index d387ae9..aa9e943 100644 (file)
@@ -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;