318 lines
7.0 KiB
C
318 lines
7.0 KiB
C
|
#include "app_config.h"
|
|||
|
#include "includes.h"
|
|||
|
#include "ui/ui_api.h"
|
|||
|
#include "ui/ui.h"
|
|||
|
#include "typedef.h"
|
|||
|
#include "ui/ui_simple/ui_res.h"
|
|||
|
#include "font/font_textout.h"
|
|||
|
#include "ui/lcd_simple/ui_mainmenu.h"
|
|||
|
|
|||
|
|
|||
|
#if (TCFG_UI_ENABLE&&(CONFIG_UI_STYLE == STYLE_UI_SIMPLE))
|
|||
|
#include "key_event_deal.h"
|
|||
|
#include "app_task.h"
|
|||
|
#include "font/language_list.h"
|
|||
|
|
|||
|
extern u8 LCDBuff[8][128];
|
|||
|
|
|||
|
#define UI_TASK_NAME "ui"
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/* static const struct ui_dis_api *ui_dis_main[] = { */
|
|||
|
/* #if TCFG_APP_BT_EN */
|
|||
|
/* #endif */
|
|||
|
/* #if TCFG_APP_MUSIC_EN */
|
|||
|
/* #endif */
|
|||
|
/* #if TCFG_APP_FM_EN */
|
|||
|
/* #endif */
|
|||
|
/* #if TCFG_APP_RECORD_EN */
|
|||
|
/* #endif */
|
|||
|
/* #if TCFG_APP_LINEIN_EN */
|
|||
|
/* #endif */
|
|||
|
/* #if TCFG_APP_RTC_EN */
|
|||
|
/* #endif */
|
|||
|
/* #if TCFG_APP_PC_EN */
|
|||
|
/* #endif */
|
|||
|
/* #if TCFG_APP_SPDIF_EN */
|
|||
|
/* #endif */
|
|||
|
/* }; */
|
|||
|
/* */
|
|||
|
|
|||
|
|
|||
|
struct ui_display_env {
|
|||
|
u8 init;
|
|||
|
OS_SEM sem;//用来做模式初始化的信号量
|
|||
|
struct lcd_interface *lcd;
|
|||
|
int main_menu;//当前主页
|
|||
|
int this_menu;//当前子页面
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
static struct ui_display_env __ui_display_env = {0};
|
|||
|
|
|||
|
#define __ui_display (&__ui_display_env)
|
|||
|
#define __this (__ui_display)
|
|||
|
|
|||
|
static int post_ui_msg(int *msg, u8 len)
|
|||
|
{
|
|||
|
int count = 0;
|
|||
|
int err = 0;
|
|||
|
if (!__ui_display->init) {
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
__retry:
|
|||
|
err = os_taskq_post_type(UI_TASK_NAME, msg[0], len - 1, &msg[1]);
|
|||
|
if (cpu_in_irq() || cpu_irq_disabled()) {
|
|||
|
return err;
|
|||
|
}
|
|||
|
if (err) {
|
|||
|
|
|||
|
if (!strcmp(os_current_task(), UI_TASK_NAME)) {
|
|||
|
return err;
|
|||
|
}
|
|||
|
|
|||
|
if (count > 10) {
|
|||
|
return -1;
|
|||
|
}
|
|||
|
count++;
|
|||
|
os_time_dly(1);
|
|||
|
goto __retry;
|
|||
|
}
|
|||
|
return err;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// @brief: 应用往ui发送key消息,由ui控件分配
|
|||
|
//=================================================================================//
|
|||
|
int ui_simple_key_msg_post(int key, int value)
|
|||
|
{
|
|||
|
int msg[8];
|
|||
|
|
|||
|
/* if (key >= 0x80) { */
|
|||
|
/* return -1; */
|
|||
|
/* } */
|
|||
|
/* */
|
|||
|
msg[0] = Q_EVENT | SYS_KEY_EVENT;
|
|||
|
msg[1] = key;
|
|||
|
msg[2] = value;
|
|||
|
return post_ui_msg(msg, 3);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void clear_lcd()
|
|||
|
{
|
|||
|
if (!__this->init) {
|
|||
|
return;
|
|||
|
}
|
|||
|
__this->lcd->clear_screen(0);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void draw_lcd(u8 start_page, u8 page_len)
|
|||
|
{
|
|||
|
if (!__this->init) {
|
|||
|
return;
|
|||
|
}
|
|||
|
__this->lcd->draw_page(&(LCDBuff[start_page][0]), start_page, page_len);
|
|||
|
}
|
|||
|
|
|||
|
void clear_lcd_area(u8 start_page, u8 end_page)
|
|||
|
{
|
|||
|
if (end_page > 8) {
|
|||
|
end_page = 8;
|
|||
|
}
|
|||
|
for (; start_page < end_page; start_page++) {
|
|||
|
memset(&LCDBuff[start_page][0], 0x00, 128);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
extern u8 app_get_curr_task();
|
|||
|
|
|||
|
extern void demo_simple_ui_mode();
|
|||
|
|
|||
|
static void ui_task_loop()
|
|||
|
{
|
|||
|
while (1) {
|
|||
|
#if APP_CASE_EARPHONE
|
|||
|
demo_simple_ui_mode();
|
|||
|
#else
|
|||
|
switch (app_get_curr_task()) {
|
|||
|
case APP_POWERON_TASK:
|
|||
|
case APP_POWEROFF_TASK:
|
|||
|
case APP_BT_TASK:
|
|||
|
case APP_MUSIC_TASK:
|
|||
|
case APP_FM_TASK:
|
|||
|
case APP_RECORD_TASK:
|
|||
|
case APP_LINEIN_TASK:
|
|||
|
case APP_RTC_TASK:
|
|||
|
case APP_PC_TASK:
|
|||
|
case APP_SPDIF_TASK:
|
|||
|
case APP_IDLE_TASK:
|
|||
|
case APP_SLEEP_TASK:
|
|||
|
case APP_SMARTBOX_ACTION_TASK:
|
|||
|
demo_simple_ui_mode();
|
|||
|
break;
|
|||
|
default:
|
|||
|
printf(" no task \n");
|
|||
|
os_time_dly(100);
|
|||
|
break;
|
|||
|
}
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
static void test_ui()
|
|||
|
{
|
|||
|
/* ResShowPic(2,0,0); */
|
|||
|
/* ResShowPic(2,0,16); */
|
|||
|
/* ResShowMultiString(0,0,7); */
|
|||
|
struct font_info *info = font_open(NULL, Chinese_Simplified);
|
|||
|
info->flags = FONT_SHOW_PIXEL;//显示
|
|||
|
info->text_height = 16;
|
|||
|
info->text_width = 128;//设置显示窗口大小
|
|||
|
font_textout_utf8(info, "杰理科技", strlen("杰理科技"), 24, 0);
|
|||
|
font_textout_utf8(info, "按ok按键开始", strlen("按ok按键开始"), 0, 16);
|
|||
|
font_textout_utf8(info, "测试", strlen("测试"), 24, 32);
|
|||
|
font_close(info);
|
|||
|
ResShowPic(2, 0, 48);
|
|||
|
ResShowPic(2, 110, 48);
|
|||
|
draw_lcd(0, 8);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
static void __font_pix_copy(u8 *pix, struct rect *draw, int x, int y,
|
|||
|
int height, int width, u8 color)
|
|||
|
{
|
|||
|
|
|||
|
int i, j, h;
|
|||
|
for (j = 0; j < (height + 7) / 8; j++) { /* 纵向8像素为1字节 */
|
|||
|
for (i = 0; i < width; i++) {
|
|||
|
if (((i + x) >= draw->left)
|
|||
|
&& ((i + x) <= (draw->left + draw->width - 1))) { /* x在绘制区域,要绘制 */
|
|||
|
u8 pixel = pix[j * width + i];
|
|||
|
int hh = height - (j * 8);
|
|||
|
if (hh > 8) {
|
|||
|
hh = 8;
|
|||
|
}
|
|||
|
for (h = 0; h < hh; h++) {
|
|||
|
if (((y + j * 8 + h) >= draw->top)
|
|||
|
&& ((y + j * 8 + h) <= (draw->top + draw->height - 1))) { /* y在绘制区域,要绘制 */
|
|||
|
u16 clr = pixel & BIT(h) ? color : !color;
|
|||
|
if (clr) {
|
|||
|
LCDBuff[j + (y + h) / 8][x + i] |= (BIT(h));
|
|||
|
} else {
|
|||
|
LCDBuff[j + (y + h)][x + i] &= ~(BIT(h));
|
|||
|
}
|
|||
|
}
|
|||
|
} /* endof for h */
|
|||
|
|
|||
|
}
|
|||
|
}/* endof for i */
|
|||
|
}/* endof for j */
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void ui_simple_putchar(struct font_info *info, u8 *pixel, u16 width, u16 height, u16 x, u16 y)
|
|||
|
{
|
|||
|
struct rect draw;
|
|||
|
u8 color = 1;
|
|||
|
draw.left = x;
|
|||
|
draw.top = y;
|
|||
|
draw.width = info->text_width;
|
|||
|
draw.height = info->text_height;
|
|||
|
__font_pix_copy(pixel,
|
|||
|
(struct rect *)&draw,
|
|||
|
(s16)x,
|
|||
|
(s16)y,
|
|||
|
height,
|
|||
|
width,
|
|||
|
color);
|
|||
|
}
|
|||
|
|
|||
|
static void half_second_tick()
|
|||
|
{
|
|||
|
ui_simple_key_msg_post(MSG_HALF_SECOND, 0);
|
|||
|
//半秒的事件
|
|||
|
}
|
|||
|
|
|||
|
static void ui_task(void *p)
|
|||
|
{
|
|||
|
__ui_display->init = 1;
|
|||
|
|
|||
|
struct lcd_info info = {0};
|
|||
|
__this->lcd = lcd_get_hdl();
|
|||
|
printf("ui_task_run_Check ...\n");
|
|||
|
ASSERT(__this->lcd);
|
|||
|
ASSERT(__this->lcd->init);
|
|||
|
ASSERT(__this->lcd->get_screen_info);
|
|||
|
ASSERT(__this->lcd->draw);
|
|||
|
ASSERT(__this->lcd->set_draw_area);
|
|||
|
ASSERT(__this->lcd->backlight_ctrl);
|
|||
|
ASSERT(__this->lcd->clear_screen);
|
|||
|
ASSERT(__this->lcd->draw_page);
|
|||
|
|
|||
|
if (__this->lcd->init) {
|
|||
|
__this->lcd->init(p);
|
|||
|
}
|
|||
|
|
|||
|
if (__this->lcd->backlight_ctrl) {
|
|||
|
__this->lcd->backlight_ctrl(true);
|
|||
|
}
|
|||
|
|
|||
|
if (__this->lcd->get_screen_info) {
|
|||
|
__this->lcd->get_screen_info(&info);
|
|||
|
}
|
|||
|
|
|||
|
printf("ui_platform_init :: [%d,%d,%d,%d]\n", 0, 0, info.width, info.height);
|
|||
|
os_sem_post(&__ui_display->sem);
|
|||
|
#if APP_CASE_EARPHONE
|
|||
|
findtaskexist(3);
|
|||
|
#else
|
|||
|
findtaskexist(APP_TASK_MAX_INDEX);
|
|||
|
#endif
|
|||
|
ResOpen("mnt/sdfile/res/menu.res");
|
|||
|
test_ui();
|
|||
|
sys_timer_add(NULL, half_second_tick, 500); //制作半秒的时机
|
|||
|
while (1) {
|
|||
|
ui_task_loop();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
int lcd_ui_init(void *arg)
|
|||
|
{
|
|||
|
int err = 0;
|
|||
|
os_sem_create(&__ui_display->sem, 0);
|
|||
|
err = task_create(ui_task, arg, UI_TASK_NAME);
|
|||
|
os_sem_pend(&__ui_display->sem, 0);
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
int ui_simple_key_msg_post(int key, int value)
|
|||
|
{
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
#endif
|