+++ /dev/null
-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()
**************************************************************************/
#include <stdio.h>
#include "runtime.h"
+#include "helios_rtc.h"
#if MICROPY_QPY_CAMERA_CAMCAPTURE
#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
#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
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)
if(camconfig.prebufcnt == 0) {
camconfig.preview = 0;
}
-
-#if MICROPY_QPY_CAMERA_LVGL_PREVIEW
- Helios_camera_scandecode_start();
-#endif
return MP_OBJ_FROM_PTR(self);
}
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;
}
#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;
}
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");
}
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);
{ 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)},