Files
AC707N/loader/update_ui/cpu/br35/ui_entry.c
T
2025-12-03 11:12:34 +08:00

412 lines
14 KiB
C

#include "typedef.h"
#include "app_config.h"
#include "ui.h"
#include "generic/gpio.h"
#include "ui/lcd_spi/lcd_drive.h"
#include "update_status.h"
struct _user_api_param_t {
u8 version; //版本号:0
u8 progress_bar; //等待中的循环进度,可用于ui显示
u8 addr[6]; //蓝牙地址
} user_api_param;
extern int _bss_begin[];
extern int _bss_size[];
extern void draw_ring(int center_x, int center_y, int radius, u16 color, int percent);
extern void ui_buffer_init(u8 * buf, u32 len);
ex_api_t *p_ex_api = NULL;
static void (*my_irq_enable)(void) = NULL;
static void (*my_irq_disable)(void) = NULL;
static void (*my_mdelay)(u32) = NULL;
typedef struct _user_api_t {
char magic[8];
void (*ex_api_reg_hdl)(ex_api_t *api);
void (*ui_disp_hdl)(UPDATA_STATUS st, u32 param);
} user_api_t;
struct ui_display {
struct lcd_interface *lcd;
};
static struct ui_display display = {0};
#define __this (&display)
enum ui_devices_type {
LED_7,
LCD_SEG3X9,
TFT_LCD,//²ÊÆÁ
DOT_LCD,//µãÕóÆÁ
};
//°å¼¶ÅäÖÃÊý¾Ý½á¹¹
struct ui_devices_cfg {
enum ui_devices_type type;
void *private_data;
};
LCD_SPI_PLATFORM_DATA_BEGIN(lcd_spi_data)
.pin_reset = TCFG_LCD_PIN_RESET,
.pin_cs = TCFG_LCD_PIN_CS,
.pin_bl = TCFG_LCD_PIN_BL,
.pin_dc = TCFG_LCD_PIN_DC,
.pin_en = TCFG_LCD_PIN_EN,
.pin_en_ex = TCFG_LCD_PIN_EN_EX,
.pin_te = TCFG_LCD_PIN_TE,
LCD_SPI_PLATFORM_DATA_END()
const struct ui_devices_cfg ui_cfg_data = {
.type = TFT_LCD,
.private_data = (void *) &lcd_spi_data,
};
void my_irq_enable_func(void)
{
if (my_irq_enable) {
my_irq_enable();
}
}
void my_irq_disable_func(void)
{
if (my_irq_disable) {
my_irq_disable();
}
}
int printf(const char *format, ...){
#if LOG_DEBUG_ENABLE
if(p_ex_api && p_ex_api->print){
va_list args;
va_start(args, format);
int ret = p_ex_api->print(0,format, args);
va_end(args);
return ret;
}
#endif//LOG_DEBUG_ENABLE
return 0;
}
void put_buf(const u8 *buf, u32 len)
{
int i;
for (i = 0; i < len; i++) {
if (i && (i % 0x10 == 0)) {
printf(" \n");
}
printf("%02x ", buf[i]);
}
printf(" \n");
}
int puts(const char *out){
return 0;
}
int sprintf(char *out, const char *format, ...){
if(p_ex_api && p_ex_api->print){
va_list args;
va_start(args, format);
int ret = p_ex_api->print(&out,format, args);
va_end(args);
return ret;
}
return 0;
}
void delay_2ms(int cnt)
{
int count;
for (int i = 0; i < cnt; i++) {
if (my_mdelay) {
my_mdelay(2);
} else {
count = 110 * 50;
while (count--) {
__asm__ volatile("nop");
__asm__ volatile("nop");
__asm__ volatile("nop");
}
}
}
}
static void delay_nop(int cnt)
{
while (cnt--) {
__asm__ volatile("nop");
}
}
static void ui_flash_handler(void)
{
if (p_ex_api && p_ex_api->printf) {
p_ex_api->printf("@");
}
}
/***************************************************
ÆÁ³õʼ»¯
***************************************************/
void lcd_screen_init(void *arg)
{
printf("%s now!!!\n",__func__);
struct lcd_info info = {0};
//»ñÈ¡lcd²Ù×÷¾ä±ú
__this->lcd = lcd_get_hdl();
ASSERT(__this->lcd);
//ÖØÐ³õʼ»¯ÆÁÄ»
if (__this->lcd->power_ctrl) {
__this->lcd->power_ctrl(true);
}
//³õʼ»¯Ó²¼þ¡¢ÆÁÄ»
if (__this->lcd->init) {
__this->lcd->init(arg);
}
if (__this->lcd->get_screen_info) {
__this->lcd->get_screen_info(&info);
}
//ÇåÆÁÄ»
if (__this->lcd->clear_screen) {
__this->lcd->clear_screen(0x000000,0,info.width-1,0,info.height-1);
}
//µ÷ÁÁ¶È
if (__this->lcd->backlight_ctrl) {
__this->lcd->backlight_ctrl(100);
}
//ÉêÇëÆÁÄ»buf
if (__this->lcd->buffer_malloc) {
u8 *buf = NULL;
u32 len;
__this->lcd->buffer_malloc(&buf, &len);
//Ìí¼Óbuffer¹ÜÀí
ui_buffer_init(buf, len);
}
printf("%s succ!!!\n",__func__);
}
extern u8 update_text_buf[10][20];
#define DRAW_POINT_MAX 10
static void ui_disp(UPDATA_STATUS st, u32 param)
{
printf("[%s] st : %d, param : %d\n", __FUNCTION__, st, param);
struct lcd_info info = {0};
__this->lcd = lcd_get_hdl();
if (__this->lcd && __this->lcd->get_screen_info) {
__this->lcd->get_screen_info(&info);
ASSERT(info.width*info.height);
}
static u8 last_status = 0;
int text_x,text_y,text_width,text_height;
u8 str_buf[32] = {0};
int i = 0;
switch (st) {
case UPDATE_PROCESS:
printf("UPDATE_PROCESS.\n");
draw_ring(info.width/2, info.height/2, info.width/2, 0x07e0, param / 100);
break;
case UPDATE_START:
printf("UPDATE_START.param:%d\n",param);
if(param == 0){
ui_draw_rect(0,0,info.width,info.height,0);
draw_ring(info.width/2, info.height/2, info.width/2, 0x07e0, 0);
}else if(param == 1){
ui_draw_rect(0,0,info.width,info.height,0);
get_text_rect(&update_text_buf[7][0],strlen(&update_text_buf[7][0]), &text_width, &text_height);
text_x = info.width/2 - text_width/2;
text_x = (text_x<0) ? 0:text_x;
text_y = info.height/2 - text_height/2;
ui_draw_text(text_x,text_y,text_width,text_height,0xffff,&update_text_buf[7][0],strlen(&update_text_buf[7][0]));
}else if(param == 2){
ui_draw_rect(0,0,info.width,info.height,0);
get_text_rect(&update_text_buf[8][0],strlen(&update_text_buf[8][0]), &text_width, &text_height);
text_x = info.width/2 - text_width/2;
text_x = (text_x<0) ? 0:text_x;
text_y = info.height/2 - text_height/2;
ui_draw_text(text_x,text_y,text_width,text_height,0xffff,&update_text_buf[8][0],strlen(&update_text_buf[8][0]));
}
break;
case UPDATE_STOP:
printf("UPDATE_STOP.\n");
if (param == UPDATE_ERR_NONE) {
} else {
printf("error code:0x%x\n", param);
}
break;
case EX_API_UPDATE_TIPS_WAIT_CONN:
if((!user_api_param.progress_bar)||(last_status!=st))
{
ui_draw_rect(0,0,info.width,info.height,0);
}
printf("EX_API_UPDATE_TIPS_WAIT_CONN\n");
printf("ADDR:%X:%X:%X:%X:%X:%X",user_api_param.addr[0],user_api_param.addr[1],user_api_param.addr[2],user_api_param.addr[3],user_api_param.addr[4],user_api_param.addr[5]);
memcpy(&user_api_param,param,sizeof(struct _user_api_param_t));
get_text_rect(&update_text_buf[0][0],strlen(&update_text_buf[0][0]), &text_width, &text_height);
text_x = info.width/2 - text_width/2;
ui_draw_text(text_x,100,text_width,text_height,0xffff,&update_text_buf[0][0],strlen(&update_text_buf[0][0]));
memcpy(str_buf, &update_text_buf[4][0],strlen(&update_text_buf[4][0]));
bt_addr_to_str(&str_buf[strlen(str_buf)],user_api_param.addr);
// printf("str_buf[%d]",strlen(str_buf));
// put_buf(str_buf,strlen(str_buf));
get_text_rect(str_buf,strlen(str_buf), &text_width, &text_height);
text_x = info.width/2 - text_width/2;
ui_draw_text(text_x,160,text_width,text_height,0xffff,str_buf,strlen(str_buf));
for(i = 0;i < user_api_param.progress_bar;i++){
get_text_rect(&update_text_buf[6][0],strlen(&update_text_buf[6][0]), &text_width, &text_height);
ui_draw_text(50 + (text_width+5) * i,220,text_width,text_height,0xffff,&update_text_buf[6][0],strlen(&update_text_buf[6][0]));
}
break;
case EX_API_UPDATE_TIPS_WAIT_UPDATE:
if((!user_api_param.progress_bar)||(last_status!=st))
{
ui_draw_rect(0,0,info.width,info.height);
}
printf("EX_API_UPDATE_TIPS_WAIT_UPDATE\n");
memcpy(&user_api_param,param,sizeof(struct _user_api_param_t));
get_text_rect(&update_text_buf[1][0],strlen(&update_text_buf[1][0]), &text_width, &text_height);
text_x = info.width/2 - text_width/2;
ui_draw_text(text_x,100,text_width,text_height,0xffff,&update_text_buf[1][0],strlen(&update_text_buf[1][0]));
memcpy(str_buf, &update_text_buf[4][0],strlen(&update_text_buf[4][0]));
bt_addr_to_str(&str_buf[strlen(str_buf)],user_api_param.addr);
get_text_rect(str_buf,strlen(str_buf), &text_width, &text_height);
text_x = info.width/2 - text_width/2;
ui_draw_text(text_x,160,text_width,text_height,0xffff,str_buf,strlen(str_buf));
for(i = 0;i < user_api_param.progress_bar;i++){
get_text_rect(&update_text_buf[6][0],strlen(&update_text_buf[6][0]), &text_width, &text_height);
ui_draw_text(50 + (text_width+5) * i,220,text_width,text_height,0xffff,&update_text_buf[6][0],strlen(&update_text_buf[6][0]));
}
break;
case EX_API_UPDATE_TIPS_WAIT_START_UPDATE:
if((!user_api_param.progress_bar)||(last_status!=st))
{
ui_draw_rect(0,0,info.width,info.height);
}
printf("EX_API_UPDATE_TIPS_WAIT_START_UPDATE\n");
memcpy(&user_api_param,param,sizeof(struct _user_api_param_t));
get_text_rect(&update_text_buf[2][0],strlen(&update_text_buf[2][0]), &text_width, &text_height);
text_x = info.width/2 - text_width/2;
ui_draw_text(text_x,80,text_width,text_height,0xffff,&update_text_buf[2][0],strlen(&update_text_buf[2][0]));
get_text_rect(&update_text_buf[3][0],strlen(&update_text_buf[3][0]), &text_width, &text_height);
text_x = info.width/2 - text_width/2;
ui_draw_text(text_x,140,text_width,text_height,0xffff,&update_text_buf[3][0],strlen(&update_text_buf[3][0]));
memcpy(str_buf, &update_text_buf[4][0],strlen(&update_text_buf[4][0]));
bt_addr_to_str(&str_buf[strlen(str_buf)],user_api_param.addr);
//put_buf(str_buf,strlen(str_buf));
get_text_rect(str_buf,strlen(str_buf), &text_width, &text_height);
text_x = info.width/2 - text_width/2;
ui_draw_text(text_x,200,text_width,text_height,0xffff,str_buf,strlen(str_buf));
for(i = 0;i < user_api_param.progress_bar;i++){
get_text_rect(&update_text_buf[6][0],strlen(&update_text_buf[6][0]), &text_width, &text_height);
ui_draw_text(50 + (text_width+5) * i,260,text_width,text_height,0xffff,&update_text_buf[6][0],strlen(&update_text_buf[6][0]));
}
break;
case EX_API_UPDATE_TIPS_UPDATEING:
printf("EX_API_UPDATE_TIPS_UPDATEING\n");
memcpy(&user_api_param,param,sizeof(struct _user_api_param_t));
if((last_status!=st))
{
ui_draw_rect(0,0,info.width,info.height,0);
get_text_rect(&update_text_buf[9][0],strlen(&update_text_buf[9][0]), &text_width, &text_height);
text_x = info.width/2 - text_width/2;
ui_draw_text(text_x,100,text_width,text_height,0xffff,&update_text_buf[9][0],strlen(&update_text_buf[9][0]));
memcpy(str_buf, &update_text_buf[4][0],strlen(&update_text_buf[4][0]));
bt_addr_to_str(&str_buf[strlen(str_buf)],user_api_param.addr);
put_buf(str_buf,strlen(str_buf));
get_text_rect(str_buf,strlen(str_buf), &text_width, &text_height);
text_x = info.width/2 - text_width/2;
ui_draw_text(text_x,160,text_width,text_height,0xffff,str_buf,strlen(str_buf));
// get_text_rect(&update_text_buf[6][0],strlen(&update_text_buf[6][0]), &text_width, &text_height);
// for(int point = 0;point<DRAW_POINT_MAX;point++){
// ui_draw_text(100 + (text_width+4) * point,320,text_width,text_height,0xffff,&update_text_buf[6][0],strlen(&update_text_buf[6][0]));
// }
}
//printf("%x %x %x %x",update_text_buf[9][0],update_text_buf[9][1],update_text_buf[9][2],update_text_buf[9][3]);
int count = user_api_param.progress_bar % (2*DRAW_POINT_MAX);
get_text_rect(&update_text_buf[6][0],strlen(&update_text_buf[6][0]), &text_width, &text_height);
if(count%2 == 1){
ui_draw_text(50 + (text_width+5) * count/2,220,text_width,text_height,0xffff,&update_text_buf[6][0],strlen(&update_text_buf[6][0]));
}else{
ui_draw_rect(50 + (text_width+5) * count/2,220,text_width,text_height,0);
}
default:
break;
}
last_status = st;
}
//ÓÉota loaderµ÷Óã¬Íê³É½Ó¿ÚºÍÆÁÄ»³õʼ»¯
static void ex_api_register(ex_api_t *api)
{
p_ex_api = api;
printf("bss_begin :0x%x, bss_size : 0x%x\n", _bss_begin, _bss_size);
//p_ex_api->printf("bss_begin :0x%x, bss_size : 0x%x\n", _bss_begin, _bss_size);
//memset((void *)_bss_begin, 0, (int)_bss_size);
//printf("[%s] 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", __FUNCTION__, api->printf, api->put_buf, api->sys_timer_add, api->sys_timeout_add, api->sys_timer_del, api->irq_disable, api->irq_enable, api->mdelay, api->request_irq_func);
if (api->irq_disable) {
my_irq_disable = api->irq_disable;
}
if (api->irq_enable) {
my_irq_enable = api->irq_enable;
}
if (api->mdelay) {
my_mdelay = api->mdelay;
}
lcd_screen_init(&ui_cfg_data);
//printf("%s %d\n", __func__, __LINE__);
//draw_ring(160, 160, 160, 0x07e0, 100);//²ÎÊý ÊäÈ룺x×ø±ê ¡¢y×ø±ê¡¢°ë¾¶¡¢ÑÕÉ«¡¢°Ù·Ö°Ù(0~100)
//printf("%s %d\n", __func__, __LINE__);
};
__attribute__((section(".api_tab"), used))
static const user_api_t user_api_ins = {
.magic = {'E', 'X', 'A', 'P',},
.ex_api_reg_hdl = ex_api_register,
.ui_disp_hdl = ui_disp,
};