#include "fr30xx.h" #include "driver_display.h" #include "driver_touchpad.h" #include "driver_psram.h" /* FreeRTOS kernel includes. */ #include "FreeRTOS.h" #include "task.h" #include "queue.h" #include "co_util.h" /* little file system */ #include "lfs_port.h" /* LVGL includes */ #include "demos/lv_demos.h" #include "app_config.h" #include "app_lvgl.h" #include "app_hw.h" #include "fr_device_rtc.h" #include "fr_device_encode.h" #include "fr_device_vbat.h" //task queue #define GUI_TASK_QUEUE_LENGTH ( 64 ) #define SYS_TASK_QUEUE_LENGTH ( 64 ) //lvgl define #if BOARD_SEL == BOARD_EVB_FR5090 #define LCD_HOR_SIZE (466) #define LCD_VER_SIZE (466) #elif BOARD_SEL == BOARD_EVB_FR3092E #if 0 //DISPLAY_TYPE_ICNA3310 #define LCD_HOR_SIZE (466) #define LCD_VER_SIZE (466) #else #define LCD_HOR_SIZE LV_HOR_RES_MAX #define LCD_VER_SIZE LV_VER_RES_MAX #endif #elif BOARD_SEL == BOARD_EVB_FR3092E_CM #define LCD_HOR_SIZE (368) #define LCD_VER_SIZE (448) #elif BOARD_SEL == BOARD_EVB_FR3092E_RGB #define LCD_HOR_SIZE LV_HOR_RES_MAX #define LCD_VER_SIZE LV_VER_RES_MAX #else #error "choose correct board" #endif #if (((LCD_HOR_SIZE - LV_HOR_RES_MAX) / 2 ) & 0x01) #define HOR_OFFSET (((LCD_HOR_SIZE - LV_HOR_RES_MAX) / 2 ) + 0x01) #else #define HOR_OFFSET (((LCD_HOR_SIZE - LV_HOR_RES_MAX) / 2 ) + 0x00) #endif #if (((LCD_VER_SIZE - LV_VER_RES_MAX) / 2 ) & 0x01) #define VER_OFFSET (((LCD_VER_SIZE - LV_VER_RES_MAX) / 2 ) + 0x01) #else #define VER_OFFSET (((LCD_VER_SIZE - LV_VER_RES_MAX) / 2 ) + 0x00) #endif #define LV_HOR_RES_MAX_ZOOM 258 #define LV_VER_RES_MAX_ZOOM 314 //#define IMG_BUFFER_VER 262 //#define DISPLAY_BUFFER_SIZE LV_HOR_RES_MAX*IMG_BUFFER_VER*LV_COLOR_DEPTH/8/sizeof(uint32_t) #define DISPLAY_BUFFER_SIZE LV_HOR_RES_MAX*LV_VER_RES_MAX*LV_COLOR_DEPTH/8/sizeof(uint32_t) #define DISPLAY_PSRAM_SIZE LV_HOR_RES_MAX*LV_VER_RES_MAX*LV_COLOR_DEPTH/8 #define DISPLAY_BLOCK_LINE DECODE_LINE_NUMBER #define DISPLAY_BUFFER_20_LINE LV_HOR_RES_MAX*DISPLAY_BLOCK_LINE*LV_COLOR_DEPTH/8/sizeof(uint32_t) DMA_HandleTypeDef dma_psram_handle; /* used for DMA display */ static volatile bool display_dma_ongoing = false; /* LVGL display buf enviroment */ static lv_disp_draw_buf_t disp_buf; static lv_disp_drv_t * last_disp; lv_indev_t * indev_keypad; uint8_t key_code; uint32_t display_framebuffer_block[DISPLAY_BUFFER_20_LINE+16]; uint32_t framebuffer_block_len = (DISPLAY_BUFFER_20_LINE+16) << 2; //uint32_t display_framebuffer_bk[LV_HOR_RES_MAX*LV_VER_RES_MAX/2]; uint32_t display_framebuffer[DISPLAY_BUFFER_SIZE]; uint32_t display_framebuffer1[DISPLAY_BUFFER_SIZE]; //#define display_framebuffer1 display_framebuffer #define LOAD_ORIG_FRAMEBUFFER (void *)PSRAM_DAC_BASE #define LOAD_LEFT_FRAMEBUFFER (void *)(PSRAM_DAC_BASE + DISPLAY_PSRAM_SIZE) #define LOAD_RIGHT_FRAMEBUFFER (void *)(PSRAM_DAC_BASE + DISPLAY_PSRAM_SIZE*2) static QueueHandle_t gui_queue_handle; static QueueHandle_t app_queue_handle; static TaskHandle_t gui_task_Handle = NULL; //过场特效的背景对�? const lv_img_dsc_t fetch_orig_img = { .header.always_zero = 0, .header.w = LV_HOR_RES_MAX, .header.h = LV_VER_RES_MAX, .data_size = LV_HOR_RES_MAX * LV_VER_RES_MAX * LV_COLOR_SIZE / 8, .header.cf = LV_IMG_CF_TRUE_COLOR, .header.reserved = 0, .data = (const uint8_t *)display_framebuffer1,//(void *)PSRAM_DAC_BASE, }; const lv_img_dsc_t fetch_orig_zoom_img = { .header.always_zero = 0, .header.w = LV_HOR_RES_MAX_ZOOM, .header.h = LV_VER_RES_MAX_ZOOM, .data_size = LV_HOR_RES_MAX_ZOOM * LV_VER_RES_MAX_ZOOM * LV_COLOR_SIZE / 8, .header.cf = LV_IMG_CF_TRUE_COLOR, .header.reserved = 0, .data = (const uint8_t *)display_framebuffer1,//(void *)PSRAM_DAC_BASE, }; const lv_img_dsc_t fetch_left_img = { .header.always_zero = 0, .header.w = LV_HOR_RES_MAX, .header.h = LV_VER_RES_MAX, .data_size = LV_HOR_RES_MAX * LV_VER_RES_MAX * LV_COLOR_SIZE / 8, .header.cf = LV_IMG_CF_TRUE_COLOR, .header.reserved = 0, .data = LOAD_LEFT_FRAMEBUFFER, }; const lv_img_dsc_t fetch_right_img = { .header.always_zero = 0, .header.w = LV_HOR_RES_MAX, .header.h = LV_VER_RES_MAX, .data_size = LV_HOR_RES_MAX * LV_VER_RES_MAX * LV_COLOR_SIZE / 8, .header.cf = LV_IMG_CF_TRUE_COLOR, .header.reserved = 0, .data = LOAD_RIGHT_FRAMEBUFFER, }; const lv_img_dsc_t fetch_disp_buf_img = { .header.always_zero = 0, .header.w = LV_HOR_RES_MAX, .header.h = LV_VER_RES_MAX, .data_size = LV_HOR_RES_MAX * LV_VER_RES_MAX * LV_COLOR_SIZE / 8, .header.cf = LV_IMG_CF_TRUE_COLOR, .header.reserved = 0, .data = (const uint8_t *)display_framebuffer, }; const lv_img_dsc_t fetch_disp_buf_zoom_img = { .header.always_zero = 0, .header.w = LV_HOR_RES_MAX_ZOOM, .header.h = LV_VER_RES_MAX_ZOOM, .data_size = LV_HOR_RES_MAX_ZOOM * LV_VER_RES_MAX_ZOOM * LV_COLOR_SIZE / 8, .header.cf = LV_IMG_CF_TRUE_COLOR, .header.reserved = 0, .data = (const uint8_t *)display_framebuffer1 + (LV_HOR_RES_MAX * LV_VER_RES_MAX) }; extern bool fetch_orig_buffer_flag; extern bool fetch_orig_buffer_zoom_flag; extern bool exit_disp_flush_flag; extern bool fetch_disp_buffer_flag; extern bool fetch_disp_buffer_zoom_flag; void fr_app_mainUI0_func(lv_obj_t *parent); void lv_prj_main(void); static void setup_gui_running(void); //---------------------------------------------------- //lvgl function //---------------------------------------------------- // this function is when frame data is flushed static void my_disp_flush_done(void) { lv_disp_flush_ready(last_disp); } void lv_disp_draw_buf_sw(bool sw) { lv_disp_t *disp = lv_disp_get_default(); if(disp == NULL) return; disp->driver->full_refresh = 1; if(sw) { lv_disp_draw_buf_init(&disp_buf, (void *)display_framebuffer, NULL, LV_HOR_RES_MAX * LV_VER_RES_MAX); //printf("display_framebuffer \n"); } else { lv_disp_draw_buf_init(&disp_buf, (void *)display_framebuffer_block, NULL, LV_HOR_RES_MAX * DISPLAY_BLOCK_LINE); //printf("display_framebuffer_block \n"); } lv_disp_drv_update(disp, disp->driver); } void lv_disp_buffer_copy(void) { //fputc('<', NULL); volatile uint32_t * dst = display_framebuffer1; volatile uint32_t * src = display_framebuffer; for (uint32_t i=0; i', NULL); } bool lv_fetch_disp_buffer_func(const lv_area_t * area) { volatile uint32_t *dst ; volatile uint32_t *src ; // uint8_t * b_dst; // uint8_t * b_src; uint32_t i,j; if(fetch_orig_buffer_zoom_flag) { //printf("disp w:%d,x:%d, h:%d,y:%d \n",(area->x2-area->x1+1),area->x1,(area->y2 - area->y1+1),area->y1); //fputc('[', NULL); // b_dst = (uint8_t *)display_framebuffer1; // b_src = (uint8_t *)display_framebuffer; // b_src += (LV_HOR_RES_MAX * ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2) + ((LV_HOR_RES_MAX - LV_HOR_RES_MAX_ZOOM)/ 2)) * 2; // for (i = 0; i < LV_VER_RES_MAX_ZOOM; i++) // { // memcpy(b_dst, b_src, LV_HOR_RES_MAX_ZOOM * 2); // b_src += LV_HOR_RES_MAX * 2; // b_dst += LV_HOR_RES_MAX_ZOOM * 2; // } dst = display_framebuffer1; src = display_framebuffer; src += (LV_HOR_RES_MAX * ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2) + ((LV_HOR_RES_MAX - LV_HOR_RES_MAX_ZOOM)/ 2)) / 2; for (i = 0; i < LV_VER_RES_MAX_ZOOM; i++) { for (j=0; j < LV_HOR_RES_MAX_ZOOM / 2; j++) { *dst++ = *src++; } src += (LV_HOR_RES_MAX - LV_HOR_RES_MAX_ZOOM) / 2; } //fputc(']', NULL); } if(fetch_disp_buffer_flag) { //printf("disp w:%d,x:%d, h:%d,y:%d \n",(area->x2-area->x1+1),area->x1,(area->y2 - area->y1+1),area->y1); //printf("load disp buffer \n"); // dst = LOAD_LEFT_FRAMEBUFFER; // src = display_framebuffer; // for (i=0; iy2 - area->y1 + 1); // // printf("1 addr :%x \n",b_src); // if(area->y1 <= ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2)) // { // b_src += (LV_HOR_RES_MAX * ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2) + ((LV_HOR_RES_MAX - LV_HOR_RES_MAX_ZOOM)/ 2)) * 2; // h -= ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2); // } // else // { // // printf("dst height :%d \n",(area->y1 - ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2))); // b_dst += (LV_HOR_RES_MAX_ZOOM * (area->y1 - ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2)) * 2); // b_src += (LV_HOR_RES_MAX - LV_HOR_RES_MAX_ZOOM); // if((area->y2 - ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2)) >= LV_VER_RES_MAX_ZOOM) // { // if(h >= ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2)) // { // h -= ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2); // } // else // { // h = 0; // } // } // } // // printf("next w:%d,x:%d, h:%d,y1:%d y2:%d, h:%d\n",(area->x2-area->x1+1),area->x1,(area->y2 - area->y1+1),area->y1,area->y2, h); // // printf("2 addr :%x d addr %d\n",b_src, b_dst); // for (i = 0; i < h; i++) // { // memcpy(b_dst, b_src, LV_HOR_RES_MAX_ZOOM * 2); // b_src += LV_HOR_RES_MAX * 2; // b_dst += LV_HOR_RES_MAX_ZOOM * 2; // } dst = display_framebuffer1; dst += (LV_HOR_RES_MAX * LV_VER_RES_MAX) / 4; src = display_framebuffer_block; int16_t h = (area->y2 - area->y1 + 1); // printf("1 addr :%x \n",b_src); if(area->y1 <= ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2)) { src += (LV_HOR_RES_MAX * ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2) + ((LV_HOR_RES_MAX - LV_HOR_RES_MAX_ZOOM)/ 2)) / 2; h -= ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2); } else { // printf("dst height :%d \n",(area->y1 - ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2))); dst += (LV_HOR_RES_MAX_ZOOM * (area->y1 - ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2)) / 2); src += (LV_HOR_RES_MAX - LV_HOR_RES_MAX_ZOOM) / 4; if((area->y2 - ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2)) >= LV_VER_RES_MAX_ZOOM) { if(h >= ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2)) { h -= ((LV_VER_RES_MAX - LV_VER_RES_MAX_ZOOM)/ 2); } else { h = 0; } } } // printf("next w:%d,x:%d, h:%d,y1:%d y2:%d, h:%d\n",(area->x2-area->x1+1),area->x1,(area->y2 - area->y1+1),area->y1,area->y2, h); // printf("2 addr :%x d addr %d\n",b_src, b_dst); for (i = 0; i < h; i++) { for (j=0; j < LV_HOR_RES_MAX_ZOOM / 2; j++) { *dst++ = *src++; } src += (LV_HOR_RES_MAX - LV_HOR_RES_MAX_ZOOM) / 2; } //fputc(')', NULL); } if(fetch_disp_buffer_flag || fetch_orig_buffer_flag ||fetch_orig_buffer_zoom_flag ||fetch_disp_buffer_zoom_flag) { if(fetch_disp_buffer_flag) { lv_disp_draw_buf_sw(0); } else if(fetch_disp_buffer_zoom_flag) { if(area->y2 + 1 != LV_VER_RES_MAX) { return false; } else { lv_disp_draw_buf_sw(1); } } fetch_disp_buffer_flag = false; fetch_orig_buffer_flag = false; fetch_orig_buffer_zoom_flag = false; fetch_disp_buffer_zoom_flag = false; return false; } if(exit_disp_flush_flag) { return false; } return true; } void* get_display_buffer1(void) { return display_framebuffer1; } extern bool display_te_status(void); extern uint8_t volatile te_sign; #include __RAM_CODE void convert_rgb565_to_bgr565(const uint16_t* rgb565_data, uint16_t* bgr565_data, uint32_t num_pixels) { for (uint32_t i = 0; i < num_pixels; i++) { uint16_t pixel = rgb565_data[i]; uint16_t bgr_pixel = ((pixel & 0x001F) << 11) | ((pixel & 0x07E0)) | ((pixel & 0xF800) >> 11); bgr565_data[i] = bgr_pixel; } } uint32_t last_time=0; extern void uart_transmit_byte(uint8_t *buf,uint32_t len); extern uint32_t get_system_dwt_value(void); static void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p) { static uint32_t flush_last_time=0; static uint8_t flags=0; #if 1 //printf("disp:%d\r\n",(get_system_dwt_value()-flush_last_time)/192); #if BOARD_SEL == BOARD_EVB_FR3092E_RGB if(area->y1 == 0) { while(!te_sign) { // vTaskDelay(1); } } uint32_t time1 = get_system_dwt_value(); #if 0 for(int i=area->y1; i<= area->y2; i++) //19ms { uint16_t *pColor = &(((uint16_t*)display_framebuffer1)[i*480]); for(int j=area->x1; j<= area->x2; j++) { pColor[j] = rgb565_to_bgr(color_p[(i-area->y1)*(area->x2-area->x1+1)+(j-area->x1)].full); //pColor[j] =(color_p[(i-area->y1)*(area->x2-area->x1+1)+(j-area->x1)].full); } } #else memcpy((uint8_t*)display_framebuffer1,(uint8_t*)color_p,(area->x2+1-area->x1)*(area->y2+1-area->y1)*2); //3ms //convert_rgb565_to_bgr565((uint16_t*)color_p,(uint16_t*)display_framebuffer1,(area->x2+1-area->x1)*(area->y2+1-area->y1));//9ms uint32_t time2 = get_system_dwt_value(); //printf("time:%d\r\n",(time2-time1)/192); #endif // lv_disp_flush_ready(disp); //last_time = get_system_dwt_value(); #else // if(!lv_fetch_disp_buffer_func(area)) // { // lv_disp_flush_ready(disp); // return; // } while(display_dma_ongoing); system_prevent_sleep_set(SYSTEM_PREVENT_SLEEP_DISPLAY_ONGOING); display_dma_ongoing = true; last_disp = disp; //while(!display_te_status()); display_set_window(area->x1, area->x2, area->y1, area->y2); #if LV_COLOR_DEPTH == 16 //last_time = get_system_dwt_value(); display_update_dma((area->x2+1-area->x1)*(area->y2+1-area->y1), 16, (void *)color_p); flush_last_time = get_system_dwt_value(); //display_update((area->x2+1-area->x1)*(area->y2+1-area->y1), 16, (void *)color_p); lv_disp_flush_ready(disp); #elif LV_COLOR_DEPTH == 32 display_update_dma((area->x2+1-area->x1)*(area->y2+1-area->y1), 32, (void *)color_p); #endif #endif #else display_set_window(HOR_OFFSET+area->x1, HOR_OFFSET+area->x2, VER_OFFSET+area->y1, VER_OFFSET+area->y2); #if LV_COLOR_DEPTH == 16 display_update((area->x2+1-area->x1)*(area->y2+1-area->y1), 16, (void *)color_p); #elif LV_COLOR_DEPTH == 32 display_update((area->x2+1-area->x1)*(area->y2+1-area->y1), 32, (void *)color_p); #endif lv_disp_flush_ready(disp); #endif } static void my_touchpad_read(struct _lv_indev_drv_t * indev, lv_indev_data_t * data) { // uint8_t buffer[8]; // // touchpad_read_data_raw(buffer, 8); // data->state = (buffer[2] != 0) ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL; // if(data->state == LV_INDEV_STATE_PR) { // data->point.x = ((buffer[3]&0x0f)<<8) | buffer[4]; // data->point.y = ((buffer[5]&0x0f)<<8) | buffer[6]; // } int16_t x, y; bool pressed; pressed = touchpad_read(&x, &y); if (pressed) { if ((x < HOR_OFFSET) || (x >= HOR_OFFSET + LV_HOR_RES_MAX) || (y < VER_OFFSET) || (y >= (VER_OFFSET + LV_VER_RES_MAX))) { data->state = LV_INDEV_STATE_REL; } else { data->state = LV_INDEV_STATE_PR; data->point.x = x - HOR_OFFSET; data->point.y = y - VER_OFFSET; //printf("x:%d,y:%d\n",data->point.x,data->point.y); } setup_gui_running(); } else { data->state = LV_INDEV_STATE_REL; } } static uint32_t keypad_get_key(void) { /*Your code comes here*/ return key_code; } /*Will be called by the library to read the mouse*/ static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data) { static uint32_t last_key = 0; /*Get the current x and y coordinates*/ //mouse_get_xy(&data->point.x, &data->point.y); /*Get whether the a key is pressed and save the pressed key*/ uint32_t act_key = keypad_get_key(); if(act_key != 0) { data->state = LV_INDEV_STATE_PR; /*Translate the keys to LVGL control characters according to your key definitions*/ switch(act_key) { case 1: act_key = LV_KEY_NEXT; break; case 2: act_key = LV_KEY_PREV; break; case 3: act_key = LV_KEY_LEFT; break; case 4: act_key = LV_KEY_RIGHT; break; case 5: act_key = LV_KEY_ENTER; break; } last_key = act_key; //printf("keypad_read =================act_key =%d ,last_key %d keydown \r\n",act_key,last_key); } else { data->state = LV_INDEV_STATE_REL; } data->key = last_key; } bool touchpad_state(void) { int16_t x, y; return touchpad_read(&x, &y); } lv_group_t *keypad_group; //按键组 static void lvgl_init(void) { lv_init(); lv_disp_draw_buf_init(&disp_buf, (void *)display_framebuffer, display_framebuffer1, LV_HOR_RES_MAX * LV_VER_RES_MAX); /*Initialize the display buffer*/ /* Implement and register a function which can copy the rendered image to an area of your display */ static lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ lv_disp_drv_init(&disp_drv); /*Basic initialization*/ disp_drv.flush_cb = my_disp_flush; /*Set your driver function*/ disp_drv.draw_buf = &disp_buf; /*Assign the buffer to the display*/ disp_drv.hor_res = LV_HOR_RES_MAX; disp_drv.ver_res = LV_VER_RES_MAX; disp_drv.physical_hor_res = -1; disp_drv.physical_ver_res = -1; disp_drv.offset_x = 0; disp_drv.offset_y = 0; disp_drv.full_refresh = 1; lv_disp_drv_register(&disp_drv); /*Finally register the driver*/ /* Implement and register a function which can read an input device. E.g. for a touch pad */ #if 0 static lv_indev_drv_t indev_drv; /*Descriptor of a input device driver*/ lv_indev_drv_init(&indev_drv); /*Basic initialization*/ indev_drv.type = LV_INDEV_TYPE_POINTER; /*Touch pad is a pointer-like device*/ indev_drv.read_cb = my_touchpad_read; /*Set your driver function*/ lv_indev_drv_register(&indev_drv); /*Finally register the driver*/ #endif #if 1 /*------------------ * Keypad * -----------------*/ static lv_indev_drv_t indev_drv1; /*Initialize your keypad or keyboard if you have*/ /*Register a keypad input device*/ lv_indev_drv_init(&indev_drv1); indev_drv1.type = LV_INDEV_TYPE_KEYPAD; indev_drv1.read_cb = keypad_read; indev_keypad = lv_indev_drv_register(&indev_drv1); //lv_group_t *keypad_group = NULL; //按键组 keypad_group = lv_group_create(); lv_indev_set_group(indev_keypad, keypad_group); /*Later you should create group(s) with `lv_group_t * group = lv_group_create()`, *add objects to the group with `lv_group_add_obj(group, obj)` *and assign this input device to group to navigate in it: *`lv_indev_set_group(indev_keypad, group);`*/ #endif // lv_demo_benchmark(); // lv_demo_stress(); // lv_demo_widgets(); // lv_demo_music(); //lv_demo_benchmark(); lv_prj_main(); } //---------------------------------------------------- //end //---------------------------------------------------- lv_group_t * lv_get_keypad_group(void) { return keypad_group; } int gui_task_msg_send(uint16_t msg_type, void *header, uint16_t header_length, uint8_t *payload, uint16_t payload_length, ipc_tx_callback callback) { gui_task_msg_t queue_event; queue_event.msg_type = msg_type; queue_event.param_len = header_length+payload_length; memcpy(queue_event.param, header, header_length); memcpy(queue_event.param+header_length, payload, payload_length); //if (portNVIC_INT_CTRL_REG & 0xff) if(xPortIsInsideInterrupt()) { BaseType_t xTaskWokenByPost = pdFALSE; if (xQueueSendFromISR(gui_queue_handle, &queue_event, &xTaskWokenByPost) == errQUEUE_FULL ) { return -1; } else { portYIELD_FROM_ISR(xTaskWokenByPost); } } else { if (xQueueSend(gui_queue_handle, &queue_event, ( TickType_t ) 0) != pdPASS) { return -1; } } return 0; } int sync_task_msg_send(uint16_t msg_type, void *header, uint16_t header_length, uint8_t *payload, uint16_t payload_length, ipc_tx_callback callback) { gui_task_msg_t queue_event; queue_event.msg_type = msg_type; queue_event.param_len = header_length+payload_length; memcpy(queue_event.param, header, header_length); memcpy(queue_event.param+header_length, payload, payload_length); //if (portNVIC_INT_CTRL_REG & 0xff) if(xPortIsInsideInterrupt()) { BaseType_t xTaskWokenByPost = pdFALSE; if (xQueueSendFromISR(app_queue_handle, &queue_event, &xTaskWokenByPost) == errQUEUE_FULL ) { return -1; } else { portYIELD_FROM_ISR(xTaskWokenByPost); } } else { if (xQueueSend(app_queue_handle, &queue_event, ( TickType_t ) 0) != pdPASS) { return -1; } } return 0; } uint32_t gui_running_last_time; bool gui_task_resume_flag = false; bool gui_task_suspend_flag = false; static void setup_gui_running(void) { gui_running_last_time = portGET_RUN_TIME_COUNTER_VALUE(); } static uint32_t get_gui_running_basetime(void) { uint32_t cur_base_time = portGET_RUN_TIME_COUNTER_VALUE(); uint32_t diff; if(cur_base_time >= gui_running_last_time) diff = cur_base_time - gui_running_last_time; else diff = (((uint32_t)0xFFFFFFFF) - gui_running_last_time) + cur_base_time + 1; return diff; } bool screensaver_lock_flags = false; static void gui_task_auto_suspend(void) { if(get_gui_running_basetime() > (10 * 1000) || gui_task_suspend_flag) { lv_obj_add_flag(lv_scr_act(),LV_OBJ_FLAG_HIDDEN); while(display_dma_ongoing) { vTaskDelay(1); } setup_gui_running(); display_power_off(); touchpad_sleep(); vTaskSuspend(gui_task_Handle); gui_task_suspend_flag = false; } if(gui_task_resume_flag) { gui_task_resume_flag = false; lv_obj_clear_flag(lv_scr_act(),LV_OBJ_FLAG_HIDDEN); } } bool gui_task_suspend_state(void) { return gui_task_suspend_flag; } void gui_task_suspend(void) { //vTaskSuspend(gui_task_Handle); gui_task_suspend_flag = true; } void * gui_task_handle_is_active(void) { return gui_task_Handle; } bool gui_task_resume(void) { setup_gui_running(); if( eTaskGetState( gui_task_Handle ) == eSuspended) { touchpad_init(); display_power_on(); vTaskResume(gui_task_Handle); gui_task_resume_flag = true; return true; } return false; } extern void InitSysDateTime(void); extern char * GetCurTimeString(); extern void UpdateSysTime(); lv_timer_t * lvgl_main_task_timer; uint8_t lvgl_start = 0; //gui task static void gui_task(void *arg) { gui_task_msg_t queue_event; printf("gui_task \r\n"); /* lfs init */ lfs_custom_init(); //lfs_custom_test_write_file(); //dev_rtc_time_init(); vTaskDelay(200); lvgl_init(); // Create queue for gui task gui_queue_handle = xQueueCreate(GUI_TASK_QUEUE_LENGTH, sizeof(gui_task_msg_t)); //battery detect // adc_vbat_start_detect(); setup_gui_running(); InitSysDateTime(); GetCurTimeString(); lvgl_main_task_timer = lv_timer_create(UpdateSysTime, 1000, NULL); printf("gui_task run\r\n"); lvgl_start =1; while(1) { vTaskDelay(1); lv_timer_handler(); // rtc_running(); //encode_key_release(); if (xQueueReceive(gui_queue_handle, &queue_event, 0) == pdPASS) { gui_task_queue_callback(&queue_event); } if(lv_tick_get()%5000==0) { printf("lvgl tick\r\n"); } // gui_task_auto_suspend(); } } static void sync_task(void *arg) { uint32_t sync_counter = 0; gui_task_msg_t queue_event; printf("sync_task \r\n"); // Create queue for sync task app_queue_handle = xQueueCreate(SYS_TASK_QUEUE_LENGTH, sizeof(gui_task_msg_t)); while(1) { if (xQueueReceive(app_queue_handle, &queue_event, 0) == pdPASS) { } } } void app_lvgl_init(void) { memset((uint8_t*)display_framebuffer1,0xff,480*272*2); #if (BOARD_SEL == BOARD_EVB_FR3092E_RGB) display_init(); #else hw_display_init(false); // hw_touchpad_init(false); #endif #if ENABLE_PSRAM hw_psram_init(false); printf("PSRAM ID is 0x%08x.\r\n", psram_read_id()); #endif /* create gui relative task. */ xTaskCreate( gui_task, "gui_task", GUI_TASK_STACK_SIZE, NULL, GUI_TASK_PRIORITY, &gui_task_Handle ); //xTaskCreate( sync_task, "sync_task", SYNC_TASK_STACK_SIZE, NULL, SYNC_TASK_PRIORITY, NULL ); } //void dma1_irq(void) //{ // printf("dma1_irq\r\n"); // if (dma_get_tfr_Status(&dma_display_handle)) { // display_update_dma_isr(); // // display_dma_ongoing = false; // my_disp_flush_done(); // system_prevent_sleep_clear(SYSTEM_PREVENT_SLEEP_DISPLAY_ONGOING); // } //} void dma1_irq(void) { //printf("dma t:%d\r\n",(get_system_dwt_value()-last_time)/192); //printf("dma1_irq\r\n"); if (dma_get_tfr_Status(&dma_display_handle)) { display_update_dma_isr(); display_dma_ongoing = false; my_disp_flush_done(); system_prevent_sleep_clear(SYSTEM_PREVENT_SLEEP_DISPLAY_ONGOING); } } void gpiob_irq(void) { printf("this is gpiob irq\r\n"); // if(exti_get_LineStatus(GPIOB,0xFFFF)) // { // exti_clear_LineStatus(GPIOB,0xFFFF); // } if(exti_get_LineStatus(GPIOB,EXTI_LINE_14)) { exti_clear_LineStatus(GPIOB,EXTI_LINE_14); //printf("this is portb exti line 14 \r\n"); // int16_t x, y; // touchpad_read(&x, &y); // printf("tp x:%d,y%d\n",x,y) } } uint32_t *user_get_display_framebuffer(void) { memset((void*)display_framebuffer1,0,DISPLAY_BUFFER_SIZE); return (uint32_t *)display_framebuffer1; }