#include "include.h" #include "func.h" #include "app_variable.h" #if defined(TJD_GUI_COMPASS_SHOW) #include "MMC5603.h" #if TRACE_EN #define TRACE(...) printf(__VA_ARGS__) #else #define TRACE(...) #endif #define GUI_PAGE_TIME_WIDTH (GUI_SCREEN_WIDTH * 2 / 5 - 8) enum { COMPASS_PAGE_CALIBRATION = 1, COMPASS_PAGE_COMPASS_MAIN, COMPASS_PAGE_OPTION, }; //组件ID enum { COMPO_ID_BTN_OPTION= 1, // 大秒钟模拟时钟 COMPO_ID_PIC_COMPASS, // 指南针背景 COMPO_ID_TXT_DIRECTION, // 指南针方位 COMPO_ID_TXT_ANGLE, // 指南针角度 COMPO_ID_TXT_OPTION_DIRECTION, // 指南针方位 COMPO_ID_TXT_OPTION_ANGLE, // 指南针角度 COMPO_ID_TXT_OPTION_SLOPE, // 指南针角度 COMPO_ID_PIC_OPTION_ANGLE, // 指南针角度 }; typedef struct f_compass_t_ { u32 anim_tick; u16 last_angle; u8 page_sta ; } f_compass_t; //创建指南针窗体 compo_form_t * func_compass_create_by_page(u8 page_sta); compo_form_t *func_compass_calibration_form_create(void) { //新建窗体 compo_form_t *frm = compo_form_create(true); // compo_form_set_mode(frm, COMPO_FORM_MODE_SHOW_TIME); compo_picturebox_t *target_pic = compo_picturebox_create(frm, UI_BUF_COMPASS_PROOFREAD_BIN);//分钟圆盘 compo_picturebox_set_pos(target_pic, GUI_SCREEN_CENTER_X, 111); compo_textbox_t * txt = compo_textbox_create(frm, 100); // compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_BIN); compo_textbox_set_multiline(txt, true); compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, 200, 206, 70); compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_BIN); compo_textbox_set(txt, i18n[STR_COMPASS_CALIBRATION]); // 消息详情 return frm; } compo_form_t *func_compass_main_form_create(void) { //新建窗体 compo_form_t *frm = compo_form_create(true); // compo_form_set_mode(frm, COMPO_FORM_MODE_SHOW_TIME); compo_textbox_t *time = compo_textbox_create(frm, 12); //时间 compo_bonddata(time, COMPO_BOND_TIME); compo_textbox_set_location(time, GUI_SCREEN_WIDTH - GUI_PAGE_TIME_WIDTH + 16, GUI_SCREEN_HEIGHT / 8 - FORM_TITLE_HEIGHT + 10, GUI_PAGE_TIME_WIDTH, FORM_TITLE_HEIGHT); compo_textbox_set_font(time, UI_BUF_FONT_FORM_TIME); compo_textbox_set_forecolor(time, COLOR_WHITE); compo_textbox_set_right_align(time, true); //新建按钮 compo_button_t *btn; btn = compo_button_create_by_image(frm, UI_BUF_COMPASS_LIST_BIN); compo_setid(btn, COMPO_ID_BTN_OPTION); compo_button_set_pos(btn, 36, 36); compo_picturebox_t *pic = compo_picturebox_create(frm, UI_BUF_COMPASS_BJ_BIN);//分钟圆盘 compo_setid(pic, COMPO_ID_PIC_COMPASS); compo_picturebox_set_pos(pic, GUI_SCREEN_CENTER_X, 172); pic = compo_picturebox_create(frm, UI_BUF_COMPASS_TRIANGLE_BIN);//分钟圆盘 compo_picturebox_set_pos(pic, GUI_SCREEN_CENTER_X, 52); compo_textbox_t *txt = compo_textbox_create(frm, 100); // compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_BIN); compo_setid(txt, COMPO_ID_TXT_DIRECTION); compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, 148, 206, 26); compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_BIN); compo_textbox_set_forecolor(txt, COLOR_BLACK); compo_textbox_set(txt, i18n[Determine_orientation() + STR_COMPASS_EAST]); // 消息详情 char buf[16] = {0}; txt = compo_textbox_create(frm, 100); // compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_BIN); compo_setid(txt, COMPO_ID_TXT_ANGLE); compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, 172, 206, 26); compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_BIN); compo_textbox_set_forecolor(txt, COLOR_BLACK); snprintf(buf, sizeof(buf), "~%d°", SysVariable.mCompass.fAzimuth); compo_textbox_set(txt, buf); return frm; } compo_form_t *func_compass_option_form_create(void) { //新建窗体 compo_form_t *frm = compo_form_create(true); //设置标题栏 compo_form_set_mode(frm, COMPO_FORM_MODE_SHOW_TITLE | COMPO_FORM_MODE_SHOW_TIME); compo_form_set_title(frm, i18n[STR_COMPLETE]); compo_picturebox_t *pic = compo_picturebox_create(frm, UI_BUF_COMPASS_COMPASS_SCALE_BIN);//分钟圆盘 compo_picturebox_set_pos(pic, 166, 185); pic = compo_picturebox_create(frm, UI_BUF_COMPASS_DIRECTION_BIN);//分钟圆盘 compo_setid(pic, COMPO_ID_PIC_OPTION_ANGLE); compo_picturebox_set_pos(pic, 166, 185); compo_textbox_t *txt = compo_textbox_create(frm, 100); // compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_BIN); compo_setid(txt, COMPO_ID_TXT_OPTION_DIRECTION); compo_textbox_set_location(txt, 57, 65, 78, 26); compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_BIN); compo_textbox_set_forecolor(txt, COLOR_RED); compo_textbox_set(txt, i18n[Determine_orientation() + STR_COMPASS_EAST]); // 消息详情 char buf[16] = {0}; txt = compo_textbox_create(frm, 100); // compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_BIN); compo_setid(txt, COMPO_ID_TXT_OPTION_ANGLE); compo_textbox_set_location(txt, 57, 120, 78, 26); compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_BIN); compo_textbox_set_forecolor(txt, COLOR_WHITE); snprintf(buf, sizeof(buf), "~%d°", SysVariable.mCompass.fAzimuth); compo_textbox_set(txt, buf); txt = compo_textbox_create(frm, 100); compo_setid(txt, COMPO_ID_TXT_OPTION_DIRECTION); compo_textbox_set_location(txt, 57, 191, 78, 26); compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_BIN); compo_textbox_set_forecolor(txt, COLOR_RED); compo_textbox_set(txt, i18n[STR_COMPASS_SLOPE]); // 消息详情 char buf2[16] = {0}; txt = compo_textbox_create(frm, 100); // compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_BIN); compo_setid(txt, COMPO_ID_TXT_OPTION_SLOPE); compo_textbox_set_location(txt, 57, 228, 78, 26); compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_BIN); compo_textbox_set_forecolor(txt, COLOR_WHITE); snprintf(buf2, sizeof(buf2), "%02d°", SysVariable.mCompass.fPitch); compo_textbox_set(txt, buf2); // compo_picturebox_t *target_pic = compo_picturebox_create(frm, UI_BUF_COMPASS_PROOFREAD_BIN);//分钟圆盘 // compo_picturebox_set_pos(target_pic, GUI_SCREEN_CENTER_X, 111); // compo_picturebox_set_visible(target_pic,false); // txt = compo_textbox_create(frm, 100); // // compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_BIN); // compo_textbox_set_multiline(txt, true); // compo_textbox_set_location(txt, GUI_SCREEN_CENTER_X, 200, 206, 70); // compo_textbox_set_font(txt, UI_BUF_0FONT_FONT_BIN); // compo_textbox_set(txt, i18n[STR_COMPASS_CALIBRATION]); // 消息详情 // compo_textbox_set_visible(txt,false); return frm; } compo_form_t *func_compass_form_create(void) { return func_compass_create_by_page(COMPASS_PAGE_COMPASS_MAIN); } static void func_compass_anim_refresh(void) { f_compass_t *f_compass = (f_compass_t *)func_cb.f_cb; char buf[16] = {0}; compo_picturebox_t *pic = compo_getobj_byid(COMPO_ID_PIC_COMPASS); compo_textbox_t *dir_txt = compo_getobj_byid(COMPO_ID_TXT_DIRECTION); compo_textbox_t *angle_txt = compo_getobj_byid(COMPO_ID_TXT_ANGLE); compo_textbox_t *option_dir_txt = compo_getobj_byid(COMPO_ID_TXT_OPTION_DIRECTION); compo_textbox_t *option_angle_txt = compo_getobj_byid(COMPO_ID_TXT_OPTION_ANGLE); compo_textbox_t *option_slope_txt = compo_getobj_byid(COMPO_ID_TXT_OPTION_SLOPE); compo_textbox_t *option_angle = compo_getobj_byid(COMPO_ID_PIC_OPTION_ANGLE); if((f_compass->page_sta == COMPASS_PAGE_CALIBRATION) && (SysVariable.mCompass.iAccuracy >= 3))//校准完毕 { f_compass->page_sta = COMPASS_PAGE_COMPASS_MAIN; compo_form_t *frm = func_cb.frm_main; if (frm != NULL) { compo_form_destroy(frm); frm = NULL; } func_compass_create_by_page(COMPASS_PAGE_COMPASS_MAIN); } if (tick_check_expire(f_compass->anim_tick, 30)) { f_compass->anim_tick = tick_get(); MMC5603_Factory_Test_Mode(); } // printf("func_compass_anim_refresh[%d,%d]\n",f_compass->last_angle,SysVariable.mCompass.fAzimuth); if (f_compass->last_angle != SysVariable.mCompass.fAzimuth) { switch (f_compass->page_sta) { case COMPASS_PAGE_COMPASS_MAIN: compo_picturebox_set_rotation(pic, SysVariable.mCompass.fAzimuth*10); snprintf(buf, sizeof(buf), "~%d°", SysVariable.mCompass.fAzimuth); compo_textbox_set(angle_txt, buf); // 消息详情 compo_textbox_set(dir_txt, i18n[Determine_orientation() + STR_COMPASS_EAST]); // 消息详情 break; case COMPASS_PAGE_OPTION: compo_picturebox_set_rotation(option_angle, SysVariable.mCompass.fAzimuth*10); snprintf(buf, sizeof(buf), "~%d°", SysVariable.mCompass.fAzimuth); compo_textbox_set(option_angle_txt, buf); // 消息详情 snprintf(buf, sizeof(buf), "%d°", SysVariable.mCompass.fPitch); compo_textbox_set(option_slope_txt, buf); // 消息详情 compo_textbox_set(option_dir_txt, i18n[Determine_orientation() + STR_COMPASS_EAST]); // 消息详情 break; } f_compass->last_angle = SysVariable.mCompass.fAzimuth; } } //指南针功能事件处理 static void func_compass_process(void) { func_compass_anim_refresh(); func_process(); } //单击按钮 static void func_compass_button_click(void) { f_compass_t *f_compass = (f_compass_t *)func_cb.f_cb; int id = compo_get_button_id(); switch (id) { case COMPO_ID_BTN_OPTION: if(f_compass->page_sta == COMPASS_PAGE_COMPASS_MAIN)//校准完毕 { f_compass->page_sta = COMPASS_PAGE_OPTION; compo_form_t *frm = func_cb.frm_main; if (frm != NULL) { compo_form_destroy(frm); frm = NULL; } func_compass_create_by_page(COMPASS_PAGE_OPTION); } break; } } //指南针功能消息处理 static void func_compass_message(size_msg_t msg) { f_compass_t *f_compass = (f_compass_t *)func_cb.f_cb; switch (msg) { case MSG_CTP_CLICK: func_compass_button_click(); break; case MSG_CTP_SHORT_UP: break; case MSG_CTP_SHORT_RIGHT: printf("func_compass_message[%d]\n",f_compass->page_sta); if(f_compass->page_sta == COMPASS_PAGE_OPTION) { f_compass->page_sta = COMPASS_PAGE_COMPASS_MAIN; compo_form_t *frm = func_cb.frm_main; if (frm != NULL) { compo_form_destroy(frm); frm = NULL; } func_compass_create_by_page(COMPASS_PAGE_COMPASS_MAIN); }else { func_back_to(); } break; case MSG_CTP_SHORT_DOWN: break; case MSG_CTP_LONG: break; default: func_message(msg); break; } } // 创建指定页面的窗体(销毁&创建) compo_form_t * func_compass_create_by_page(u8 page_sta) { compo_form_t *frm; switch (page_sta) { case COMPASS_PAGE_CALIBRATION: frm = func_compass_calibration_form_create(); break; case COMPASS_PAGE_COMPASS_MAIN: frm = func_compass_main_form_create(); break; case COMPASS_PAGE_OPTION: frm = func_compass_option_form_create(); break; } return frm; } //进入指南针功能 static void func_compass_enter(void) { MMC5603_Enable(); u8 iAccuracy = SysVariable.mCompass.iAccuracy; func_cb.f_cb = func_zalloc(sizeof(f_compass_t)); f_compass_t *f_compass = (f_compass_t *)func_cb.f_cb; f_compass->page_sta = iAccuracy >= 3 ? COMPASS_PAGE_COMPASS_MAIN:COMPASS_PAGE_COMPASS_MAIN; func_cb.frm_main = func_compass_create_by_page(f_compass->page_sta); } //退出指南针功能 static void func_compass_exit(void) { MMC5603_Disable(); func_cb.last = FUNC_COMPASS; } //指南针功能 void func_compass(void) { printf("%s\n", __func__); func_compass_enter(); while (func_cb.sta == FUNC_COMPASS) { func_compass_process(); func_compass_message(msg_dequeue()); } func_compass_exit(); } #endif/*TJD_GUI_COMPASS_SHOW*/