#include "DHL_OSAL.h" #include "DHL_OSAL_Config.h" #include "DHL_DBG.h" #define __DEFINE_DMG_STR__ #include "DMG_Menu.h" #undef __DEFINE_DMG_STR__ //#include //#include DHL_MODULE("GRP_M", 1); #define TIMER_NOUSE ((UINT32)-1) #define TIMER_ID_TIMEOUT MAX_NUM_TIMER #define NUM_MSGQ 16 #define MENU_TASK_PRIO TASK_PRI_MENU #define MENU_STACK_SIZE 16384 #define USE_OLNY_ONE_INPUT_KEY 1 //¿ÀÁ÷ ÇϳªÀÇ ÀԷ Ű¸¸À» ÀνÄÇÔ -> Ű ó¸®°¡ ´Ê¾î¼­ ¹öÆÛ¿¡ ½×ÀÌÁö ¾ÊÀ½ #if COMMENT __Local_Var__(){} #endif static DHL_OS_TASK_ID p_menu_task_id; static DHL_OS_MSGQ_ID p_msgq_id; static DHL_OS_SEMA_ID p_mtx; static DHL_OS_SEMA_ID p_sem_sync; static tDMG_Menu *p_pmenu_list[MAX_NUM_MENU]; /* ¸ðµç menu¿¡ ´ëÇÑ list */ static tDMG_Menu *p_pcur_menu; static tDMG_MenuManageProc p_menu_manage_proc; static tDMG_MenuInfo p_menu_info; /* Menu initµµ µÇ±â Àü¿¡ SendMessage°¡ È£ÃâµÉ ¼ö ÀÖ´Â °æ¿ìÀÇ ¹®Á¦ msgq_id üũ ¸¸À¸·Î´Â ÃæºÐÇÏÁö ¾Ê¾Æ¼­ º°µµÀÇ º¸È£ ÄÚµå Ãß°¡ */ static BOOL p_menu_task_running; /* timer ¼³Á¤ */ static struct { UINT32 start_ms; UINT32 prev_ms; UINT32 dur_ms; /* ms ´ÜÀ§ */ UINT32 opt; } p_timer_list[MAX_NUM_TIMER+1]; /* ¸¶Áö¸· slotÀº timout¿ëÀ¸·Î »ç¿ëÇÔ.*/ #if COMMENT __Debug_Trace__() {} #endif /* ƯÁ¤ ¸Þ´º¿¡ °üÇÑ command ¸¸ trace Çϱâ À§ÇÑ ±â´É. »ç¿ë¹ýÀº trace_menu_by_id() µîÀ» Âü°í.. */ static int s_trace_menu_id; static char s_trace_menu_name[100]; void p_trace_menu_cmd(tDMG_Menu *pmenu, tDMG_CMD cmd, UINT32 opt, UINT32 param1, UINT32 param2) { if (!pmenu) return; if ( (pmenu->id == s_trace_menu_id) || (s_trace_menu_name[0] && strstr(pmenu->name, s_trace_menu_name)!=0) ) DHL_OS_Printf("==== menu trace: %x(%s), cmd %x(%s) opt %x, param %x %x\n", pmenu->id, pmenu->name, cmd, DMG_CMD_STR(cmd), opt, param1, param2); } void p_trace_menu_cmd2(tDMG_Menu *pmenu, tDMG_Message *pmsg) { if (!pmsg) return; p_trace_menu_cmd(pmenu, pmsg->cmd, pmsg->opt, pmsg->param1, pmsg->param2); } #if COMMENT __Local_Func__() {} #endif static tDMG_Menu *p_get_menu(tDMG_MenuId menu_id) { int i; for(i=0; iid==menu_id) return p_pmenu_list[i]; } return NULL; } static void p_insert_menu(tDMG_Menu *pmenu) { int i; for(i=0; ipframe_list[i]; i++) { if(pmenu->pframe_list[i]->id==frame_id) return pmenu->pframe_list[i]; } return NULL; } static void p_msg_generator(tDMG_Menu *pmenu, tDMG_CMD cmd, UINT32 opt, UINT32 param1, UINT32 param2) { int i; if(!pmenu) return; p_trace_menu_cmd(pmenu, cmd, opt, param1, param2); switch(cmd) { case eDMG_CMD_ON_MENU_ACTIVE : if(pmenu->user_proc(cmd, opt, param1, param2)) break; /* ÀÌ¹Ì Ã³¸®µÇ¾úÀ½ */ if(pmenu->pcur_frame) pmenu->pcur_frame->user_proc(eDMG_CMD_ON_FRAME_ACTIVE, 0, (UINT32)pmenu->pcur_frame, (UINT32)DMG_FRAME_ID_NONE); break; case eDMG_CMD_ON_MENU_INACTIVE : if(pmenu->pcur_frame) pmenu->pcur_frame->user_proc(eDMG_CMD_ON_FRAME_INACTIVE, 0, (UINT32)pmenu->pcur_frame, (UINT32)DMG_FRAME_ID_NONE); pmenu->user_proc(cmd, opt, param1, param2); for(i=0; ipcur_frame) pmenu->pcur_frame->user_proc(eDMG_CMD_ON_FRAME_EXIT, 0, (UINT32)pmenu, (UINT32)pmenu->pcur_frame); pmenu->user_proc(cmd, opt, param1, param2); for(i=0; ipcur_frame) pmenu->pcur_frame->user_proc(eDMG_CMD_ON_FRAME_INVISIBLE, 0, (UINT32)pmenu, (UINT32)pmenu->pcur_frame); pmenu->user_proc(cmd, opt, param1, param2); for(i=0; ipbelow) pmenu_list[i]=ptemp; for(i--; i>=0; i--) { if(!pmenu_list[i]->user_proc(cmd, 0, (UINT32)pmenu_list[i], 0)) { #if 0 /* redraw´Â menu´Ü¿¡¼­ ´Ù ó¸®ÇÔ */ if(pmenu_list[i]->pcur_frame) pmenu_list[i]->pcur_frame->user_proc(cmd, 0, (UINT32)pmenu_list[i], (UINT32)pmenu_list[i]->pcur_frame); #endif } } } break; case eDMG_CMD_ON_TIME : { BOOL is_done; tDMG_Menu *pm_temp; int i; for(is_done=FALSE, pm_temp=pmenu; !is_done && pm_temp; pm_temp=(tDMG_Menu *)pm_temp->pbelow) { is_done=pm_temp->user_proc(cmd, opt, param1, param2); for(i=0; !is_done && pm_temp->pframe_list[i]; i++) { is_done=pm_temp->pframe_list[i]->user_proc(cmd, opt, param1, param2); } } } break; case eDMG_CMD_ON_TIMEOUT : if(!pmenu->user_proc(cmd, opt, param1, param2)) { if(pmenu->pcur_frame) pmenu->pcur_frame->user_proc(cmd, opt, param1, param2); } break; case eDMG_CMD_ON_KEY : /* active menuÀÇ active frame¿¡¸¸ key¸¦ Àü´ÞÇÔ */ if(!pmenu->user_proc(cmd, opt, param1, param2)) { if(pmenu->pcur_frame) pmenu->pcur_frame->user_proc(eDMG_CMD_ON_KEY, opt, param1, param2); } break; case eDMG_CMD_ON_USER_DEFINED : /* active menuÀÇ active frame¿¡¸¸ key¸¦ Àü´ÞÇÔ */ { BOOL is_done; tDMG_Menu *pm_temp; int i; for(is_done=FALSE, pm_temp=pmenu; !is_done && pm_temp; pm_temp=(tDMG_Menu *)pm_temp->pbelow) { is_done=pm_temp->user_proc(cmd, opt, param1, param2); for(i=0; !is_done && pm_temp->pframe_list[i]; i++) { is_done=pm_temp->pframe_list[i]->user_proc(cmd, opt, param1, param2); } } } break; default : pmenu->user_proc(cmd, opt, param1, param2); } } static tDMG_MenuManange p_default_menu_manage_proc(tDMG_MenuManageParam *pmanage_param) { if(pmanage_param->is_start) return eDMG_MENU_MANAGE_INACTIVE_AND_DRAW; return eDMG_MENU_MANAGE_EXIT; } static BOOL p_default_user_proc(tDMG_CMD cmd, UINT32 opt, UINT32 param1, UINT32 param2) { dprint(0, "%s : cmd(%s:0x%x), opt(0x%x), param1(0x%x), param2(0x%x)\n", __FUNCTION__, DMG_CMD_STR(cmd), cmd, opt, param1, param2); return FALSE; } static void p_insert_inactive_menu_list(tDMG_Menu *pmenu) { tDMG_Menu *ptemp; if(!p_pcur_menu) { dprint(2, "!! %s : cur active menu is not exist\n", __FUNCTION__); return; } for(ptemp=p_pcur_menu; ptemp->pbelow; ptemp=ptemp->pbelow); ptemp->pbelow=pmenu; pmenu->pbelow=NULL; } static void p_delete_inactive_menu_list(tDMG_MenuId menu_id) { tDMG_Menu *ptemp; if(!p_pcur_menu) { dprint(2, "!! %s : cur active menu is not exist\n", __FUNCTION__); return; } for(ptemp=p_pcur_menu; ptemp->pbelow; ptemp=ptemp->pbelow) { if(ptemp->pbelow->id==menu_id) { ptemp->pbelow=ptemp->pbelow->pbelow; break; } } } static tDMG_MenuList p_get_inactive_menu_list() { int i; UINT32 menu_list; for(i=0, menu_list=0; istatus==eDMG_STATUS_INACTIVE) menu_list|=(1<id); } return menu_list; } static tDMG_MenuList p_get_invisible_menu_list() { int i; UINT32 menu_list; for(i=0, menu_list=0; istatus==eDMG_STATUS_INVISIBLE) menu_list|=(1<id); } return menu_list; } static tDMG_Menu *p_get_max_prio_invisible_menu() { int i; int min_prio=0xff; tDMG_Menu *pmin_prio_menu=NULL; for(i=0; istatus==eDMG_STATUS_INVISIBLE) { if(p_pmenu_list[i]->idid; pmin_prio_menu=p_pmenu_list[i]; } } } return pmin_prio_menu; } #if COMMENT __Task_Func__() {} #endif static void p_menu_task(void* arg) { int i; DHL_RESULT result; tDMG_Message rcv_msg; int rcv_len; p_menu_task_id=DHL_OS_GetTaskID(); for(i=0; icur_ms) min_ms-=cur_ms; else if(cur_ms-min_ms<10000) { //10Ãʺ¸´Ù ÀÛ´Ù¸é 0À¸·Î º¸Á¤ÇÔ min_ms=0; } else { //turn aroundµÈ °æ¿ì. min_ms=0xffffffff-(cur_ms-min_ms)+1; } result=DHL_OS_ReceiveMessage(p_msgq_id, &rcv_msg, min_ms); } } if(result==DHL_OK) { /* Á¤»ó ¼ö½Å */ //dprint(1, "--MSG RECEIVED(%s:0x%x), opt(0x%x), param1(0x%x), param2(0x%x)\n", // DMG_CMD_STR(rcv_msg.cmd), rcv_msg.cmd, rcv_msg.opt, rcv_msg.param1, rcv_msg.param2); switch(rcv_msg.cmd) { case eDMG_CMD_SET_MENU_START : { tDMG_Menu *pmenu=(tDMG_Menu *)rcv_msg.param1, *ptemp; tDMG_MenuManange menu_manage; tDMG_MenuManageParam manage_param; if(!pmenu) { /* ¸Þ´º¸¦ ÃʱâÈ­ÇÏÁö ¾Ê¾ÒÀ¸¸é¼­ menu exit¸¦ ÇÏ´Â °æ¿ì ÀÖÀ½ */ dprint(0, "menu was not inited !!\n"); continue; } p_trace_menu_cmd2(pmenu, &rcv_msg); manage_param.is_start=TRUE; manage_param.active_id=p_pcur_menu?p_pcur_menu->id:DMG_MENU_ID_NONE; manage_param.action_id=pmenu->id; /* menu update : ±âÁ¸ ¸Þ´º°¡ ¶° ÀÖÀ» °æ¿ì update ¸Þ½ÃÁö¸¦ Àü´ÞÇÔ, ±×·¸Áö ¾ÊÀ¸¸é ¸Þ´º¸¦ ¶ç¿ò */ if(rcv_msg.opt&eDMG_CMD_OPT_MENU_UPDATE) { if(manage_param.active_id==pmenu->id) { p_msg_generator(pmenu, eDMG_CMD_ON_MENU_UPDATE, rcv_msg.opt, (UINT32)p_pcur_menu, rcv_msg.param2); continue; } } manage_param.inactive_list=p_get_inactive_menu_list(); manage_param.invisible_list=p_get_invisible_menu_list(); menu_manage=p_menu_manage_proc(&manage_param); /*±âÁ¸ ¸Þ´º¿¡ ´ëÇÑ Ã³¸® */ if(!p_pcur_menu); /* ±âÁ¸ ¸Þ´º°¡ ¾øÀ¸¸é ¾Æ¹« 󸮵µ ¾ÈÇÔ */ else { switch(menu_manage) { case eDMG_MENU_MANAGE_DENY: dprint(2, "cur menu(id:%d) is denied\n"); continue; /* ±×³É ¹«½ÃÇÔ */ case eDMG_MENU_MANAGE_DENY_BUT_INACTIVE: pmenu->status=eDMG_STATUS_INACTIVE; p_insert_inactive_menu_list(pmenu); p_msg_generator(pmenu, eDMG_CMD_ON_MENU_ENTER, 0, (UINT32)p_pcur_menu, 0); continue; /* inactive »óÅ·Π¹Ù²Ù°í ¹«½Ã */ case eDMG_MENU_MANAGE_DENY_BUT_HIDE: pmenu->status=eDMG_STATUS_INVISIBLE; p_msg_generator(pmenu, eDMG_CMD_ON_MENU_ENTER, 0, (UINT32)p_pcur_menu, 0); continue; /* invisible »óÅ·Π¹Ù²Ù°í ¹«½Ã */ case eDMG_MENU_MANAGE_INACTIVE_AND_DRAW: p_pcur_menu->status=eDMG_STATUS_INACTIVE; p_msg_generator(p_pcur_menu, eDMG_CMD_ON_MENU_INACTIVE, 0, (UINT32)p_pcur_menu, pmenu?pmenu->id:DMG_MENU_ID_NONE); break; case eDMG_MENU_MANAGE_HIDE_PREV_AND_DRAW: p_pcur_menu->status=eDMG_STATUS_INVISIBLE; p_msg_generator(p_pcur_menu, eDMG_CMD_ON_MENU_INVISIBLE, 0, (UINT32)p_pcur_menu, pmenu?pmenu->id:DMG_MENU_ID_NONE); p_pcur_menu=p_pcur_menu->pbelow; break; case eDMG_MENU_MANAGE_HIDE_ALL_AND_DRAW: for(ptemp=p_pcur_menu; ptemp; ptemp=ptemp->pbelow) { ptemp->status=eDMG_STATUS_INVISIBLE; p_msg_generator(ptemp, eDMG_CMD_ON_MENU_INVISIBLE, 0, (UINT32)p_pcur_menu, pmenu?pmenu->id:DMG_MENU_ID_NONE); } p_pcur_menu=NULL; /* inactive list°¡ ¸ðµÎ »ç¶óÁü */ break; case eDMG_MENU_MANAGE_EXIT_PREV_AND_DRAW: p_pcur_menu->status=eDMG_STATUS_EXIT; p_msg_generator(p_pcur_menu, eDMG_CMD_ON_MENU_EXIT, 0, (UINT32)p_pcur_menu, pmenu?pmenu->id:DMG_MENU_ID_NONE); p_pcur_menu=p_pcur_menu->pbelow; break; case eDMG_MENU_MANAGE_EXIT_ALL_AND_DRAW: for(i=0; istatus!=eDMG_STATUS_EXIT) { p_pcur_menu->status=eDMG_STATUS_EXIT; p_msg_generator(p_pcur_menu, eDMG_CMD_ON_MENU_EXIT, 0, (UINT32)p_pcur_menu, pmenu?pmenu->id:DMG_MENU_ID_NONE); } } p_pcur_menu=NULL; break; /* TODO: exit enumerate handle */ case eDMG_MENU_MANAGE_EXIT: case eDMG_MENU_MANAGE_EXIT_SILENT: default: break; } } dprint(2, " -- %s : new menu is draw\n", __FUNCTION__); pmenu->pbelow=p_pcur_menu; /* menu info ¼öÁý */ p_menu_info.pcur_menu=pmenu; p_menu_info.pprev_menu=p_pcur_menu; p_menu_info.pcur_frame=pmenu->pcur_frame; p_menu_info.pprev_frame=NULL; p_pcur_menu=pmenu; p_pcur_menu->status=eDMG_STATUS_ACTIVE; p_msg_generator(p_pcur_menu, eDMG_CMD_ON_MENU_ENTER, 0, (UINT32)p_pcur_menu, 0); p_msg_generator(p_pcur_menu, eDMG_CMD_ON_MENU_ACTIVE, 0, (UINT32)p_pcur_menu, p_menu_info.pprev_menu?p_menu_info.pprev_menu->id:DMG_MENU_ID_NONE); DMG_SetTimer(TIMER_ID_TIMEOUT, p_pcur_menu->timeout_ms, eDMG_CMD_OPT_TIMER_ONESHOT); break; } case eDMG_CMD_SET_MENU_EXIT : { tDMG_Menu *pmenu=DMG_GetMenu((tDMG_MenuId)rcv_msg.param1), *ptemp; tDMG_MenuManange menu_manage; tDMG_MenuManageParam manage_param; if(!pmenu) { /* ¸Þ´º¸¦ »ý¼ºÇÏÁö ¾Ê¾ÒÀ¸¸é¼­ menu exit¸¦ ÇÏ´Â °æ¿ì ÀÖÀ½ */ dprint(0, "menu was not started !!\n"); continue; } p_trace_menu_cmd2(pmenu, &rcv_msg); manage_param.is_start=FALSE; manage_param.active_id=p_pcur_menu?p_pcur_menu->id:DMG_MENU_ID_NONE; manage_param.action_id=pmenu->id; manage_param.inactive_list=p_get_inactive_menu_list(); manage_param.invisible_list=p_get_invisible_menu_list(); manage_param.new_active_id=DMG_MENU_ID_DEFAULT; menu_manage=p_menu_manage_proc(&manage_param); if(menu_manage==eDMG_MENU_MANAGE_EXIT) { pmenu->status=eDMG_STATUS_EXIT; if(p_pcur_menu==pmenu) p_msg_generator(pmenu, eDMG_CMD_ON_MENU_EXIT, 0, (UINT32)pmenu, pmenu?pmenu->id:DMG_MENU_ID_NONE); } else if(menu_manage==eDMG_MENU_MANAGE_EXIT_SILENT) { pmenu->status=eDMG_STATUS_EXIT; } else { dprint(0, "!! %s(LINE:%d) : bad return value of manage proc\n", __FUNCTION__, __LINE__); break; } p_menu_info.pprev_menu=p_pcur_menu; p_menu_info.pcur_menu=NULL; p_menu_info.pcur_frame=NULL; p_menu_info.pprev_frame=NULL; if(p_pcur_menu==pmenu) { /* ÇöÀç menu¸¦ Áö¿ò */ /* ÇöÀç menu°¡ Áö¿öÁú ¶§ ¸»°í´Â ACTIVE menu¸¦ º¯°æÇÏÁö ¾ÊÀ½ */ if(manage_param.new_active_id==DMG_MENU_ID_NONE) { p_pcur_menu=NULL; /* ÇöÀç Ȱ¼ºÈ­µÇ¾îÀÖ´Â menu´Â ¾øÀ½? */ } else { if(manage_param.new_active_id==DMG_MENU_ID_DEFAULT) { ptemp=p_pcur_menu->pbelow; if(!ptemp) { /* invisible menu Áß¿¡¼­ ãÀ½ */ ptemp=p_get_max_prio_invisible_menu(); } } else ptemp=p_get_menu(manage_param.new_active_id); #if 0 //½ÇÁ¦ ÇÏÀ§¿¡ ¾î¶² ¸Þ´ºµµ ¾øÀ» ¼ö ÀÖÀ½ if(!ptemp) { dprint(0, "!! %s(LINE:%d) : bad menu_active_id\n", __FUNCTION__, __LINE__); break; } #endif if(ptemp && ptemp->status==eDMG_STATUS_EXIT) { dprint(0, "!! %s(LINE:%d) : bad menu_active_id\n", __FUNCTION__, __LINE__); break; } p_pcur_menu=ptemp; if(p_pcur_menu) { p_pcur_menu->status=eDMG_STATUS_ACTIVE; p_msg_generator(p_pcur_menu, eDMG_CMD_ON_MENU_ACTIVE, 0, (UINT32)p_pcur_menu, p_menu_info.pprev_menu?p_menu_info.pprev_menu->id:DMG_MENU_ID_NONE); } } } /* Åë°è */ p_menu_info.pcur_menu=p_pcur_menu; break; } case eDMG_CMD_SET_TIMER : /* param1 : id, param2 : duration, opt : opt */ p_timer_list[rcv_msg.param1].dur_ms=rcv_msg.param2; p_timer_list[rcv_msg.param1].opt=rcv_msg.opt; p_timer_list[rcv_msg.param1].start_ms=DHL_OS_GetMsCount(); p_timer_list[rcv_msg.param1].prev_ms=DHL_OS_GetMsCount(); break; case eDMG_CMD_SET_FRAME_ACTIVE : DMG_SetFrame(eDMG_CMD_SET_FRAME_ACTIVE, rcv_msg.param1, rcv_msg.param2, FALSE); break; case eDMG_CMD_SET_REDRAW : DMG_SetRedraw(FALSE); break; case eDMG_CMD_SET_KEY : //message queue¸¦ ´Ù ¿­¾îºÁ¼­ Áߺ¹µÇ´Â ۰¡ ÀÖÀ¸¸é »èÁ¦ÇÔ #if USE_OLNY_ONE_INPUT_KEY { tDMG_Message tmsg[NUM_MSGQ]; int num_msgq; for(i=0; iid, rcv_msg.param2); if (rcv_msg.cmd==eDMG_CMD_SET_MENU_PARAM1) pmenu->param1 = rcv_msg.param2; else pmenu->param2 = rcv_msg.param2; break; } default : ; } continue; /* comment : msg°¡ ÀÖÀ» ¶§´Â timer 󸮸¦ ÇÏÁö ¾Ê´Â´Ù. */ } /* timer ó¸® */ for(i=0; i=p_timer_list[i].dur_ms) { p_timer_list[i].prev_ms=DHL_OS_GetMsCount(); if(p_timer_list[i].opt & eDMG_CMD_OPT_TIMER_ONESHOT) p_timer_list[i].dur_ms=TIMER_NOUSE; if(i==TIMER_ID_TIMEOUT) { /* timeout */ p_msg_generator(p_pcur_menu, eDMG_CMD_ON_TIMEOUT, 0, DHL_OS_GetMsCount()-p_timer_list[i].start_ms, 0); } else { p_msg_generator(p_pcur_menu, eDMG_CMD_ON_TIME, 0, i, DHL_OS_GetMsCount()-p_timer_list[i].start_ms); } } } DHL_OS_Delay(50); //BK 10->50 } DHL_OS_SelfDeleteTask(); } #if COMMNET __APIs__(){} #endif // arzhna, 100409 // ÁöÁ¤µÈ ¸Þ´ºÀÇ status¸¦ ¹Ýȯ // FALSE : exit »óÅ // TRUE : exit ÀÌ¿ÜÀÇ »óÅ (active µî) BOOL DMG_GetMenuStatus(tDMG_MenuId menu_id) { tDMG_Menu *menu; menu = p_get_menu(menu_id); if(menu==NULL) return FALSE; else{ if(menu->status==eDMG_STATUS_EXIT) return FALSE; else return TRUE; } } void DMG_SendMessage(tDMG_CMD cmd, UINT32 opt, UINT32 param1, UINT32 param2) { tDMG_Message send_msg; if(!p_msgq_id || !p_menu_task_running) return; send_msg.cmd=cmd; send_msg.opt=opt; send_msg.param1=param1; send_msg.param2=param2; if(opt&eDMG_CMD_OPT_SYNC) { /* È£ÃâÇÏ´Â task¿Í µ¿±â¸¦ ¸ÂÃç¾ß ÇÔ */ dprint(0, "!! Command Sync mode\n"); DHL_OS_TakeSemaphore(p_mtx, DHL_TIMEOUT_FOREVER); DHL_OS_SendMessage(p_msgq_id, &send_msg, sizeof(send_msg)); send_msg.cmd=eDMG_CMD_SET_SYNC; send_msg.param1=(UINT32)p_sem_sync; DHL_OS_SendMessage(p_msgq_id, &send_msg, sizeof(send_msg)); DHL_OS_TakeSemaphore(p_sem_sync, DHL_TIMEOUT_FOREVER); DHL_OS_GiveSemaphore(p_mtx); } else { DHL_OS_SendMessage(p_msgq_id, &send_msg, sizeof(send_msg)); } } tDMG_Menu *DMG_CreateMenu(tDMG_MenuId id, char *name, UINT32 timeout_ms, tDMG_UserProc user_proc) { int i; tDMG_Menu *pmenu; if(id==0 || id>=MAX_NUM_MENU) { dprint(0, "!! %s : bad menu id\n", __FUNCTION__); return NULL; } if(p_get_menu(id)) { dprint(0, "!! %s : menu(id:%d) is already created\n"); return NULL; } pmenu=(tDMG_Menu *)DHL_OS_Malloc(sizeof(*pmenu)); if(!pmenu) { dprint(0, "!! %s : malloc failed\n", __FUNCTION__); return NULL; } pmenu->id=id; pmenu->name=name; pmenu->status=eDMG_STATUS_EXIT; pmenu->priority=0; pmenu->timeout_ms=timeout_ms; if(user_proc) pmenu->user_proc=user_proc; else pmenu->user_proc=p_default_user_proc; pmenu->pcur_frame=NULL; memset(&pmenu->pframe_list, 0, sizeof(pmenu->pframe_list)); pmenu->pbelow=NULL; p_insert_menu(pmenu); return pmenu; } tDMG_Frame *DMG_CreateFrame(tDMG_Menu *pmenu, tDMG_FrameId id, char *name, UINT32 num_item, tDMG_UserProc user_proc) { int i; tDMG_Frame *pframe; pframe=(tDMG_Frame *)DHL_OS_Malloc(sizeof(*pframe)); if(!pframe) { dprint(0, "!! %s : malloc failed\n", __FUNCTION__); return NULL; } pframe->id=id; pframe->name=name; pframe->num_item=num_item; if(pmenu) pframe->timeout_ms=pmenu->timeout_ms; else pframe->timeout_ms=DMG_TIME_FOREVER; if(user_proc) pframe->user_proc=user_proc; else if(pmenu) pframe->user_proc=pmenu->user_proc; pframe->cur_item_id=0; pframe->param1=0; pframe->param2=0; if(!pmenu) return pframe; return DMG_AttachFrame(pmenu, pframe); } tDMG_Frame *DMG_AttachFrame(tDMG_Menu *pmenu, tDMG_Frame *pframe) { int i; for(i=0; ipframe_list[i]) { pmenu->pframe_list[i]=pframe; if(i==0) { /* óÀ½ µî·ÏµÇ´Â °ÍÀ̶ó¸é ÀÌ frameÀÌ cur frameÀÌ µÈ´Ù. */ pmenu->pcur_frame=pmenu->pframe_list[i]; } break; } } if(i==MAX_NUM_FRAME) { dprint(0, "!! %s : frame slot in menu is empty\n", __FUNCTION__); } return pframe; } tDMG_Menu *DMG_GetMenu(tDMG_MenuId menu_id) { return p_get_menu(menu_id); } tDMG_Frame *DMG_GetFrame(tDMG_MenuId menu_id, tDMG_FrameId frame_id) { tDMG_Menu *pmenu; if(menu_id==DMG_MENU_ID_DEFAULT) { if(!p_pcur_menu) return NULL; menu_id=p_pcur_menu->id; } pmenu=p_get_menu(menu_id); if(!pmenu) return NULL; return p_get_frame(pmenu, frame_id); } tDMG_Menu *DMG_GetCurMenu() { return p_pcur_menu; } tDMG_Frame *DMG_GetCurFrame() { if(!p_pcur_menu) return NULL; return p_pcur_menu->pcur_frame; } void DMG_SetFrame(tDMG_CMD cmd, tDMG_MenuId menu_id, tDMG_FrameId frame_id, BOOL buse_msgq) { int i; tDMG_Menu *pmenu; tDMG_Frame *pframe; if(menu_id==DMG_MENU_ID_DEFAULT) { if(!p_pcur_menu) return; menu_id=p_pcur_menu->id; } pmenu=p_get_menu(menu_id); dprint(1, "%s : menu id(%d), frame id(%d)\n", __FUNCTION__, menu_id, frame_id); if(cmdeDMG_CMD_SET_FRAME_INACTIVE) return; if(!pmenu) { dprint(0, "!! %s : menu(id:%d,0x%x) is not exist\n", __FUNCTION__, menu_id, menu_id); return; } pframe=p_get_frame(pmenu, frame_id); if(!pframe) { dprint(0, "!! %s : frame(id:%d, 0x%x) is not exist in menu %d\n", __FUNCTION__, frame_id, frame_id, menu_id); return; } if(buse_msgq || p_menu_task_id!=DHL_OS_GetTaskID()) { /* buse_msgqÀÎ °æ¿ì¿Í task°¡ ´Ù¸¥ °æ¿ì´Â ¹«Á¶°Ç msgq¸¦ »ç¿ëÇÑ´Ù. */ DMG_SendMessage(cmd, 0, menu_id, frame_id); return; } //DHL_OS_Printf("---- pass0\n"); /* neverdai À§ÀÇ DHL_OS_Printf¹®À» »èÁ¦Çϸé Á״´Ù...¿øÀÎ ¸ð¸§ ³ªÁß¿¡ ÇØ°á ¿ä¸Á..091021 */ if(cmd==eDMG_CMD_SET_FRAME_ACTIVE) { p_menu_info.pprev_frame=pmenu->pcur_frame; p_menu_info.pcur_frame=pframe; if(p_pcur_menu && p_pcur_menu->id==menu_id) { /* activeµÈ menu */ if(pmenu->pcur_frame) pmenu->pcur_frame->user_proc(eDMG_CMD_ON_FRAME_INACTIVE, 0, (UINT32)pmenu->pcur_frame, pframe?(UINT32)pframe->id:DMG_FRAME_ID_NONE); pmenu->pcur_frame=pframe; for(i=0; itimeout_ms==DMG_TIME_DEFAULT) DMG_SetTimer(TIMER_ID_TIMEOUT, pmenu->timeout_ms, eDMG_CMD_OPT_TIMER_ONESHOT); else DMG_SetTimer(TIMER_ID_TIMEOUT, pframe->timeout_ms, eDMG_CMD_OPT_TIMER_ONESHOT); if(pmenu->pcur_frame) pmenu->pcur_frame->user_proc(eDMG_CMD_ON_FRAME_ACTIVE, 0, (UINT32)pmenu->pcur_frame, p_menu_info.pprev_frame?(UINT32)p_menu_info.pprev_frame->id:DMG_FRAME_ID_NONE); } else { pmenu->pcur_frame=pframe; } } else { if(pmenu->pcur_frame->id!=pframe->id) { /* ÇöÀç activeµÇ¾îÀÖ´Â frameÀ» inactive, delete½Ãų ¼ö ¾øÀ½ */ } else { pmenu->pcur_frame->user_proc(eDMG_CMD_ON_FRAME_INACTIVE, 0, (UINT32)pmenu->pcur_frame, (UINT32)DMG_FRAME_ID_NONE); for(i=0; itimeout_ms=timeout; DMG_SetTimer(TIMER_ID_TIMEOUT, timeout, eDMG_CMD_OPT_TIMER_ONESHOT); } void DMG_SetFrameTimeout(tDMG_MenuId menu_id, tDMG_FrameId frame_id, UINT32 timeout) { tDMG_Frame *pframe=DMG_GetFrame(menu_id, frame_id); if(!pframe) { dprint(0, "!! %s : menu or frame id is incorrect\n", __FUNCTION__); return; } pframe->timeout_ms=timeout; } void DMG_SetMenuParam1(tDMG_MenuId id, UINT32 param) { #if 1 DMG_SendMessage(eDMG_CMD_SET_MENU_PARAM1, 0, id, param); #else tDMG_Menu *pmenu=DMG_GetMenu(id); if(!pmenu) { dprint(0, "!! %s : menu id is incorrect\n", __FUNCTION__); return; } pmenu->param1=param; #endif } void DMG_SetMenuParam2(tDMG_MenuId id, UINT32 param) { #if 1 DMG_SendMessage(eDMG_CMD_SET_MENU_PARAM2, 0, id, param); #else tDMG_Menu *pmenu=DMG_GetMenu(id); if(!pmenu) { dprint(0, "!! %s : menu id is incorrect\n", __FUNCTION__); return; } pmenu->param2=param; #endif } void DMG_SetFrameParam1(tDMG_MenuId menu_id, tDMG_FrameId frame_id, UINT32 param) { tDMG_Frame *pframe=DMG_GetFrame(menu_id, frame_id); if(!pframe) { dprint(0, "!! %s : menu or frame id is incorrect\n", __FUNCTION__); return; } pframe->param1=param; } void DMG_SetFrameParam2(tDMG_MenuId menu_id, tDMG_FrameId frame_id, UINT32 param) { tDMG_Frame *pframe=DMG_GetFrame(menu_id, frame_id); if(!pframe) { dprint(0, "!! %s : menu or frame id is incorrect\n", __FUNCTION__); return; } pframe->param2=param; } UINT32 DMG_GetKeyInput(UINT32 time_ms) { DHL_RESULT res; tDMG_Message rcv_msg; int rcv_len; if(!p_msgq_id) return DMG_KEY_NONE; if(time_ms==DMG_TIME_FOREVER) res=DHL_OS_ReceiveMessage(p_msgq_id, &rcv_msg, DHL_TIMEOUT_FOREVER); else if(time_ms==0) res=DHL_OS_ReceiveMessage(p_msgq_id, &rcv_msg, 0); else res=DHL_OS_ReceiveMessage(p_msgq_id, &rcv_msg, time_ms); if(res!=DHL_OK) return DMG_KEY_NONE; if(rcv_msg.cmd!=eDMG_CMD_SET_KEY) return DMG_KEY_NONE; return rcv_msg.param1; } void DMG_GetMenuInfo(tDMG_MenuInfo *pinfo) { *pinfo=p_menu_info; } BOOL DMG_IsMenuOn(tDMG_MenuId menu_id) { int i; for(i=0; iid==menu_id) { if(p_pmenu_list[i]->status!=eDMG_STATUS_EXIT) return TRUE; else return FALSE; } } return FALSE; } void DMG_MenuStart(tDMG_MenuId menu_id) { tDMG_Menu *pmenu=p_get_menu(menu_id); dprint(1, "%s : menu id(%d)\n", __FUNCTION__, menu_id); if(!pmenu) return; DMG_SendMessage(eDMG_CMD_SET_MENU_START, 0, (UINT32)pmenu, 0); } void DMG_MenuUpdate(tDMG_MenuId menu_id, UINT32 param) { tDMG_Menu *pmenu=p_get_menu(menu_id); dprint(1, "%s : menu id(%d)\n", __FUNCTION__, menu_id); if(!pmenu) return; DMG_SendMessage(eDMG_CMD_SET_MENU_START, eDMG_CMD_OPT_MENU_UPDATE, (UINT32)pmenu, param); } void DMG_MenuExit(tDMG_MenuId menu_id) { dprint(1, "%s \n", __FUNCTION__); if(menu_id==DMG_MENU_ID_DEFAULT) { if(!p_pcur_menu) return; menu_id=p_pcur_menu->id; } DMG_SendMessage(eDMG_CMD_SET_MENU_EXIT, 0, (UINT32)menu_id, 0); } void DMG_MenuExit_ActiveAll() { int i; dprint(1, "--------------------------------------\n"); for(i=0; istatus==eDMG_STATUS_EXIT) continue; /* idle°ú °°ÀÌ ExitÇÏÁö ¸»¾Æ¾ß ÇÏ´Â Áß¿äÇÑ menu id´Â ¿¹¿Ü½Ã۵µ·Ï ÇÑ´Ù. */ //if(p_pmenu_list[i]->id==0x0 || p_pmenu_list[i]->id == 0x1f) { if(p_pmenu_list[i]->id != 0x1f) { // idleÀº exitÇÏÁö ¾Ê´Â´Ù!! dprint(1, "Exit menu id(0x%02x), menu_name(%s)\n", p_pmenu_list[i]->id, p_pmenu_list[i]->name); DMG_MenuExit(p_pmenu_list[i]->id); } } dprint(1, "--------------------------------------\n"); } void DMG_MenuInit(tDMG_MenuManageProc menu_manage_proc) { static BOOL bmenu_inited=FALSE; if(bmenu_inited) return; bmenu_inited=TRUE; p_msgq_id=DHL_OS_CreateMessageQueue("menuq", 0, NUM_MSGQ, sizeof(tDMG_Message)); p_mtx=DHL_OS_CreateMutexSemaphore("menu mtx"); p_sem_sync=DHL_OS_CreateBinarySemaphore("menu sem", 0, FALSE); if(menu_manage_proc) p_menu_manage_proc=menu_manage_proc; else p_menu_manage_proc=p_default_menu_manage_proc; DHL_OS_CreateTask((DHL_OS_TASKFUNCTION)p_menu_task, "t_menu", MENU_TASK_PRIO, MENU_STACK_SIZE, 0); } #if COMMENT __Debug__() {} #endif void show_menu(int level) { int i; DHL_OS_Printf("---------------------------------\n"); for(i=0; istatus==eDMG_STATUS_EXIT) continue; DHL_OS_Printf(" id(0x%02x), Status(%s), below 0x%x, %s\n", p_pmenu_list[i]->id, p_pmenu_list[i]->status==eDMG_STATUS_ACTIVE?"A":p_pmenu_list[i]->status==eDMG_STATUS_INACTIVE?"I": p_pmenu_list[i]->status==eDMG_STATUS_INVISIBLE?"H":"-", p_pmenu_list[i]->pbelow ? p_pmenu_list[i]->pbelow->id : 0xff, p_pmenu_list[i]->name); } if (s_trace_menu_id >= 0) DHL_OS_Printf("menu trace: id %x\n", s_trace_menu_id); if (s_trace_menu_name[0]) DHL_OS_Printf("menu trace keyword: '%s'\n", s_trace_menu_name); DHL_OS_Printf("---------------------------------\n"); } /* id¸¦ ÁöÁ¤ÇÏ¿© ƯÁ¤ menu¸¦ trace ÇÑ´Ù. */ void trace_menu_by_id(int id) { s_trace_menu_id = id; } /* ¸Þ´º À̸§ÀÇ ÀϺκРÀ» ÁöÁ¤ÇÏ¿© trace ÇÑ´Ù. */ void trace_menu_by_name(char *name) { if (name && name[0] && strlen(name)