#include "jpeglib.h"
#include "jpeg_operation.h"
-
+#include "lvgl.h"
#include "helios_debug.h"
#define CAPTURE_LOG(msg, ...) custom_log("capture", msg, ##__VA_ARGS__)
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))
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);
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);
{ 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);
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)
{
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);
{ 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);