From: p15692025051 <846603105@qq.com> Date: Thu, 11 Jul 2024 03:37:04 +0000 (+0800) Subject: 摄像头buf调整 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=39695389a65ebabe9db90810f976ade66a0d09bc;p=mirrors%2FASR1603_G5.git 摄像头buf调整 --- diff --git a/2.sdk-ZY/Helios_SDK/services/microPython/ports/quectel/core/lcd_k5.py b/2.sdk-ZY/Helios_SDK/services/microPython/ports/quectel/core/lcd_k5.py deleted file mode 100644 index e27ab6e4..00000000 --- a/2.sdk-ZY/Helios_SDK/services/microPython/ports/quectel/core/lcd_k5.py +++ /dev/null @@ -1,249 +0,0 @@ -import lvgl as lv -from machine import LCD, Pin -from tp import cst816 -import _thread -import utime -import EventMesh -from misc import PWM - - -init_data = ( - - 0, 0, 0x11, - 2, 0, 120, - - 0, 1, 0x36, - 1, 1, 0x00, - - 0, 1, 0x35, - 1, 1, 0x00, - - 0, 1, 0x3a, - 1, 1, 0x05, - - 0, 5, 0xB2, - 1, 1, 0x0c, - 1, 1, 0x0c, - 1, 1, 0x00, - 1, 1, 0x33, - 1, 1, 0x33, - - 0, 1, 0xB7, - 1, 1, 0x77, - - 0, 1, 0xBB, - 1, 1, 0x2c, - - 0, 1, 0xC0, - 1, 1, 0x2C, - - 0, 1, 0xC2, - 1, 1, 0x01, - - 0, 1, 0xC3, - 1, 1, 0x21, - - 0, 1, 0xC4, - 1, 1, 0x20, - - 0, 1, 0xC6, - 1, 1, 0x10, - - 0, 2, 0xD0, - 1, 1, 0xA4, - 1, 1, 0xA1, - - 0, 14, 0xE0, - 1, 1, 0xd0, - 1, 1, 0x03, - 1, 1, 0x08, - 1, 1, 0x0e, - 1, 1, 0x12, - 1, 1, 0x2d, - 1, 1, 0x42, - 1, 1, 0x45, - 1, 1, 0x53, - 1, 1, 0x29, - 1, 1, 0x16, - 1, 1, 0x15, - 1, 1, 0x22, - 1, 1, 0x24, - - 0, 14, 0xE1, - 1, 1, 0xd0, - 1, 1, 0x03, - 1, 1, 0x08, - 1, 1, 0x0e, - 1, 1, 0x13, - 1, 1, 0x2c, - 1, 1, 0x42, - 1, 1, 0x54, - 1, 1, 0x50, - 1, 1, 0x2c, - 1, 1, 0x16, - 1, 1, 0x16, - 1, 1, 0x20, - 1, 1, 0x27, - #0, 0, 0x11, - 0, 0, 0x21, - 0, 0, 0x29, - #0, 1, 0xe7, - #1, 1, 0x11, -) - -XSTART_H = 0xf0 -XSTART_L = 0xf1 -YSTART_H = 0xf2 -YSTART_L = 0xf3 -XEND_H = 0xE0 -XEND_L = 0xE1 -YEND_H = 0xE2 -YEND_L = 0xE3 - -XSTART = 0xD0 -XEND = 0xD1 -YSTART = 0xD2 -YEND = 0xD3 - -lcd = LCD() - -init_buf = bytearray(init_data) - -init_data2 = ( - 0, 4, 0x2a, - 1, 1, XSTART_H, - 1, 1, XSTART_L, - 1, 1, XEND_H, - 1, 1, XEND_L, - 0, 4, 0x2b, - 1, 1, YSTART_H, - 1, 1, YSTART_L, - 1, 1, YEND_H, - 1, 1, YEND_L, - 0, 0, 0x2c, -) -invalid = bytearray(init_data2) - -init_data3 = ( - 0, 0, 0x28, - 2, 0, 120, - 0, 0, 0x10, -) -displayoff = bytearray(init_data3) - -init_data4 = ( - 0, 0, 0x11, - 2, 0, 20, - 0, 0, 0x29, -) -displayon = bytearray(init_data4) -# CST816初始化 -import initTP -initTP.HYN_Initial() -tp_cst816 = cst816(i2c_no = 2,irq=33, reset=32) -tp_cst816.activate() -tp_cst816.init() - -print("cst816 init...") -from btn_device_ec800m import BtnDevice -btn_device = BtnDevice(tp_cst816) -btn_device.start() - -lcd_ctrl = Pin(Pin.GPIO18, Pin.OUT, Pin.PULL_DISABLE, 1) -lcd.lcd_init(init_buf, 240, 320, 52000, 1, 4, 0, invalid, displayon, displayoff, None,TESel = True,TEPin = 17) -# gpio_backlight = Pin(Pin.GPIO37, Pin.OUT, Pin.PULL_DISABLE, 0) -# gpio_backlight.write(1) -PWM_backlight = PWM(PWM.PWM0, PWM.ABOVE_MS, 0, 1) -PWM_backlight.open() - -LCD_SIZE_W = 240 -LCD_SIZE_H = 320 -# pwm.close() -# 初始化lvgl -lv.init() - -# Register SDL display driver. -disp_buf1 = lv.disp_draw_buf_t() -buf1_1 = bytearray(LCD_SIZE_W * LCD_SIZE_H * 2) -#buf1_2= bytearray(LCD_SIZE_W * LCD_SIZE_H * 2) - -disp_buf1.init(buf1_1, None, len(buf1_1)) -disp_drv = lv.disp_drv_t() -disp_drv.init() -disp_drv.draw_buf = disp_buf1 -disp_drv.flush_cb = lcd.lcd_write -disp_drv.hor_res = LCD_SIZE_W -disp_drv.ver_res = LCD_SIZE_H -disp_drv.register() - - -# LVGL触摸注册 -indev_drv = lv.indev_drv_t() -indev_drv.init() -indev_drv.type = lv.INDEV_TYPE.POINTER -indev_drv.read_cb = tp_cst816.read -indev_drv.long_press_time = 400 -indev_drv.register() -gpio4 = Pin(Pin.GPIO33, Pin.OUT, Pin.PULL_PU, 0) - -# def indev_task(): -# while 1: -# pos_s = tp_cst816.read_xy() -# # import _thread -# # x = _thread.get_heap_size() -# # print('heap:',x) -# if pos_s: -# if 100 == pos_s[0] and 400 == pos_s[1]: -# EventMesh.publish("done_return") -# print("return") -# utime.sleep_ms(200) -# else: -# utime.sleep_ms(200) - -# _thread.start_new_thread(indev_task,()) - -# 启动lvgv线程 -lv.tick_inc(5) -lv.task_handler() -style_screen = lv.style_t() -style_screen.init() -style_screen.set_radius(0) -style_screen.set_bg_color(lv.color_make(0x00, 0x00, 0x00)) -style_screen.set_bg_opa(255) -style_screen.set_border_width(0) -style_screen.set_pad_left(0) -style_screen.set_pad_right(0) -style_screen.set_pad_top(0) -style_screen.set_pad_bottom(0) -#开机画面 -style_font_youyuan_40 = lv.style_t() -style_font_youyuan_40.init() -style_font_youyuan_40.set_text_color(lv.color_make(0xff, 0xff, 0xff)) -style_font_youyuan_40.set_text_font_v2("font_40.bin",40,0) - -style_font_youyuan_black_40 = lv.style_t() -style_font_youyuan_black_40.init() -style_font_youyuan_black_40.set_text_color(lv.color_make(0x00, 0x00, 0x00)) -style_font_youyuan_black_40.set_text_font_v2("font_40.bin",40,0) - -style_font_youyuan_20_op = lv.style_t() -style_font_youyuan_20_op.init() -style_font_youyuan_20_op.set_text_color(lv.color_make(0xff, 0xff, 0xff)) -style_font_youyuan_20_op.set_text_font(lv.K01_font_16_ALL) - -power_on_screen = lv.obj() -print("power_on_screen") -power_on_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -power_on_label = lv.label(power_on_screen) -power_on_label.set_pos(0, 150) -power_on_label.set_size(240, 40) -power_on_label.set_text("系统初始化中") -power_on_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -power_on_label.add_style(style_font_youyuan_20_op, lv.PART.MAIN | lv.STATE.DEFAULT) -print("power_on_screen init...") -lv.scr_load(power_on_screen) -utime.sleep_ms(200) -print("power_on_screen end...") -PWM_backlight = PWM(PWM.PWM0, PWM.ABOVE_MS, 6, 10) -PWM_backlight.open() diff --git a/2.sdk-ZY/Helios_SDK/services/microPython/ports/quectel/core/source/camera_capture.c b/2.sdk-ZY/Helios_SDK/services/microPython/ports/quectel/core/source/camera_capture.c index df56e15a..2a21dbad 100644 --- a/2.sdk-ZY/Helios_SDK/services/microPython/ports/quectel/core/source/camera_capture.c +++ b/2.sdk-ZY/Helios_SDK/services/microPython/ports/quectel/core/source/camera_capture.c @@ -39,6 +39,7 @@ WHEN WHO WHAT,WHERE,WHY **************************************************************************/ #include #include "runtime.h" +#include "helios_rtc.h" #if MICROPY_QPY_CAMERA_CAMCAPTURE @@ -54,6 +55,26 @@ WHEN WHO WHAT,WHERE,WHY #define CAPTURE_LOG(msg, ...) custom_log("capture", msg, ##__VA_ARGS__) +typedef enum{ + CAP_TYPE_FILE, + CAP_TYPE_MEM +} _camera_cap_type; + +typedef struct img_info_struct{ + int img_width; + int img_height; + unsigned char image_name[128]; +}img_info_s; + + +typedef struct{ + _camera_cap_type type; + mp_buffer_info_t recv_mem_data; + img_info_s image_info; +} _camera_cap_save_s; + + +static _camera_cap_save_s cap_image_enc_s = {0}; #define OPEN_PREVIEW_AND_DECODE 1 @@ -96,33 +117,37 @@ static unsigned short *g_lcd_buffer = NULL; #define CAMERA_PREVIEW_TASK_PRIORITY 218 #define CAMERA_DECODE_TASK_PRIORITY 227 -typedef struct img_info_struct{ - int img_width; - int img_height; - unsigned char image_name[128]; -}img_info_s; -static img_info_s image_info = {0}; +static int64_t tick_count = 0; void Helios_SaveImage(unsigned char* pBuffer, int width, int height) { int result = -1; char name[256] = {0}; + int cap_result = -1; + unsigned long jpeg_outsize = 0; - sprintf(name, "U:/%s.jpg",image_info.image_name); - CAPTURE_LOG("SaveImage %d %d %d %d %x\n", width, height, image_info.img_width, image_info.img_height, pBuffer); + sprintf(name, "%s",cap_image_enc_s.image_info.image_name); + CAPTURE_LOG("SaveImage %d %d %d %d %x\n", width, height, cap_image_enc_s.image_info.img_width, cap_image_enc_s.image_info.img_height, pBuffer); + + tick_count = Helios_RTC_GetTicks(); - if(image_info.img_width <= width && image_info.img_height <= height && pBuffer != NULL) { + if(cap_image_enc_s.image_info.img_width <= width && cap_image_enc_s.image_info.img_height <= height && pBuffer != NULL) { #if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602) #if MICROPY_QPY_CAMERA_LVGL_PREVIEW if(0 != rgb565_to_jpeg(name, width, height, (uint16_t*)pBuffer)) #else - if(0 != yuv420_NV12_to_jpg(name, image_info.img_width, image_info.img_height, pBuffer, width, height)) + if(cap_image_enc_s.type == CAP_TYPE_FILE) { + cap_result = yuv420_NV12_to_jpg(name, cap_image_enc_s.image_info.img_width, cap_image_enc_s.image_info.img_height, pBuffer, width, height); + } else if(cap_image_enc_s.type == CAP_TYPE_MEM) { + cap_result = yuv420_NV12_to_jpg_mem(cap_image_enc_s.recv_mem_data.buf, cap_image_enc_s.recv_mem_data.len, &jpeg_outsize, cap_image_enc_s.image_info.img_width, cap_image_enc_s.image_info.img_height, pBuffer, width, height); + } + if(0 != cap_result) #endif -#elif defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) - if(0 != yuv422_UYVY_to_jpg(name, image_info.img_width, image_info.img_height, pBuffer, width, height)) +#elif defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06) + if(0 != yuv422_UYVY_to_jpg(name, cap_image_enc_s.image_info.img_width, cap_image_enc_s.image_info.img_height, pBuffer, width, height)) #else CAPTURE_LOG("Helios_SaveImage:Uncertain picture format\n"); #endif @@ -138,13 +163,19 @@ void Helios_SaveImage(unsigned char* pBuffer, int width, int height) { GC_STACKTOP_SET(); mp_obj_t save_cb[2] = { mp_obj_new_int(result), - mp_obj_new_str((char*)name,strlen((char*)name)), + mp_obj_new_int(jpeg_outsize), }; + + if(cap_image_enc_s.type == CAP_TYPE_FILE) { + save_cb[1] = mp_obj_new_str((char*)name,strlen((char*)name)); + } + mp_sched_schedule_ex(callback_cur, MP_OBJ_FROM_PTR(mp_obj_new_list(2, save_cb))); GC_STACKTOP_CLEAR(); } + CAPTURE_LOG("use tick [%d]\n", (int)(Helios_RTC_GetTicks() - tick_count)); } STATIC mp_obj_t caputre_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) @@ -214,10 +245,6 @@ STATIC mp_obj_t caputre_make_new(const mp_obj_type_t *type, size_t n_args, size_ if(camconfig.prebufcnt == 0) { camconfig.preview = 0; } - -#if MICROPY_QPY_CAMERA_LVGL_PREVIEW - Helios_camera_scandecode_start(); -#endif return MP_OBJ_FROM_PTR(self); } @@ -227,20 +254,14 @@ STATIC mp_obj_t caputre_make_new(const mp_obj_type_t *type, size_t n_args, size_ static Helios_MsgQ_t get_picture_q = 0; static Helios_Thread_t rgb565_decode_task_id = 0; -uint16_t rgb_buffer[128*128] = {0}; + #if MICROPY_QPY_CAMERA_LVGL_PREVIEW +uint16_t rgb_buffer[240*320] = {0}; lv_obj_t *camera_img = NULL; int open_capture = 0; lv_img_dsc_t camera_img_dsc; #endif -char CAM_rotate = 1; -STATIC mp_obj_t camera_set_rotate(mp_obj_t self_in,mp_obj_t val1) -{ - preview_obj_t *self = MP_OBJ_TO_PTR(self_in); - CAM_rotate = mp_obj_get_int(val1); - return mp_obj_new_int(1); -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(camera_set_rotate_obj, camera_set_rotate); + typedef struct __picture_info { uint8_t *buff_addr; int width; @@ -263,35 +284,20 @@ void rgb565_decode_handle(void * argv) { } #if MICROPY_QPY_CAMERA_LVGL_PREVIEW - rgb_buffer_tmp = (uint8_t *)malloc(128*128*2); + rgb_buffer_tmp = (uint8_t *)malloc(camconfig.lcdprewidth*camconfig.lcdpreheight*2); if (rgb_buffer_tmp == NULL) { CAPTURE_LOG("rgb_buffer_tmp malloc fail\n"); continue; } yuv420_nv12_to_rgb565_zoom_out((uint16_t*)rgb_buffer_tmp, camconfig.lcdprewidth, camconfig.lcdpreheight, (unsigned char *)pic_info.buff_addr, pic_info.width, pic_info.height); - if( CAM_rotate == 0) - { - CamSWRgb565Rotate((uint8_t*)rgb_buffer, rgb_buffer_tmp, 128, 128, CAM_SW_ROTATE_0); - }else if( CAM_rotate == 1) - { - CamSWRgb565Rotate((uint8_t*)rgb_buffer, rgb_buffer_tmp, 128, 128, CAM_SW_ROTATE_90); - }else if( CAM_rotate == 2) - { - CamSWRgb565Rotate((uint8_t*)rgb_buffer, rgb_buffer_tmp, 128, 128, CAM_SW_ROTATE_180); - }else if( CAM_rotate == 3) - { - CamSWRgb565Rotate((uint8_t*)rgb_buffer, rgb_buffer_tmp, 128, 128, CAM_SW_ROTATE_270); - } - else - { - // 旋转90° - CamSWRgb565Rotate((uint8_t*)rgb_buffer, rgb_buffer_tmp, 128, 128, CAM_SW_ROTATE_90); - } + // 旋转90° + CamSWRgb565Rotate((uint8_t*)rgb_buffer, rgb_buffer_tmp, camconfig.lcdprewidth, camconfig.lcdpreheight, camera_angle); + free(rgb_buffer_tmp); rgb_buffer_tmp = NULL; if (open_capture) { - Helios_SaveImage((uint8_t*)rgb_buffer, 128, 128); + Helios_SaveImage((uint8_t*)rgb_buffer, camconfig.lcdprewidth, camconfig.lcdpreheight); open_capture = 0; } @@ -465,11 +471,21 @@ STATIC mp_obj_t camera_capture_start(size_t n_args, const mp_obj_t *pos_args, mp if (mp_obj_is_str(args[ARG_picture_name].u_obj)) { picname = (char*)mp_obj_str_get_str(args[ARG_picture_name].u_obj); - } + cap_image_enc_s.type = CAP_TYPE_FILE; + } else { + mp_get_buffer_raise(args[ARG_picture_name].u_obj, &cap_image_enc_s.recv_mem_data, MP_BUFFER_RW); + if (cap_image_enc_s.recv_mem_data.len <= 0 || cap_image_enc_s.recv_mem_data.buf == NULL) + { + mp_raise_ValueError("buff failed"); + } + memset(cap_image_enc_s.recv_mem_data.buf, 0, cap_image_enc_s.recv_mem_data.len); + cap_image_enc_s.type = CAP_TYPE_MEM; + } + int image_w = (int)args[ARG_image_w].u_int; int image_h = (int)args[ARG_image_h].u_int; - if(picname == NULL) { + if(picname == NULL && cap_image_enc_s.type == CAP_TYPE_FILE) { mp_raise_ValueError("image nane is error"); } @@ -482,12 +498,14 @@ STATIC mp_obj_t camera_capture_start(size_t n_args, const mp_obj_t *pos_args, mp mp_raise_ValueError("image_h is less tha cam_h"); } - memset(&image_info, 0, sizeof(img_info_s)); - image_info.img_height = image_h; - image_info.img_width = image_w; - memcpy(image_info.image_name, picname, strlen(picname)); + memset(&cap_image_enc_s.image_info, 0, sizeof(img_info_s)); + cap_image_enc_s.image_info.img_height = image_h; + cap_image_enc_s.image_info.img_width = image_w; + if(picname) { + memcpy(cap_image_enc_s.image_info.image_name, picname, strlen(picname)); + } - CAPTURE_LOG("capture para %d,%d,%s\n",image_w,image_h,picname); + CAPTURE_LOG("capture para %d,%d\n",image_w,image_h); #if MICROPY_QPY_CAMERA_LVGL_PREVIEW open_capture = 1; return mp_obj_new_int(1); @@ -532,8 +550,6 @@ 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) }, - { MP_ROM_QSTR(MP_QSTR_set_rotate), MP_ROM_PTR(&camera_set_rotate_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)},