955 lines
27 KiB
C
955 lines
27 KiB
C
#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;
|
||
|
||
//过场特效的背景对<E699AF>?
|
||
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<DISPLAY_PSRAM_SIZE/sizeof(uint32_t); i++) {
|
||
*dst++ = *src++;
|
||
}
|
||
//fputc('>', 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; i<DISPLAY_PSRAM_SIZE/sizeof(uint32_t); i++) {
|
||
// *dst++ = *src++;
|
||
// }
|
||
}
|
||
|
||
|
||
if(fetch_disp_buffer_zoom_flag)
|
||
{
|
||
//fputc('(', NULL);
|
||
|
||
// //img 2 address offset
|
||
// b_dst = (uint8_t *)display_framebuffer1;
|
||
// b_dst += (LV_HOR_RES_MAX * LV_VER_RES_MAX);
|
||
|
||
// b_src = (uint8_t *)display_framebuffer_block;
|
||
// uint16_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))
|
||
// {
|
||
// 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 <stdio.h>
|
||
|
||
|
||
__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;
|
||
} |