source: svn/newcon3bcm2_21bu/dst/dmw/src/grp/DMG_Menu.c

Last change on this file was 76, checked in by megakiss, 10 years ago

1W 대기전력을 만족시키기 위하여 POWEROFF시 튜너를 Standby 상태로 함

  • Property svn:executable set to *
File size: 34.4 KB
Line 
1
2#include "DHL_OSAL.h"
3#include "DHL_OSAL_Config.h"
4#include "DHL_DBG.h"
5
6#define __DEFINE_DMG_STR__
7#include "DMG_Menu.h"
8#undef __DEFINE_DMG_STR__
9
10//#include <string.h>
11//#include <string.h>
12
13
14DHL_MODULE("GRP_M", 1);
15
16#define TIMER_NOUSE ((UINT32)-1)
17
18#define TIMER_ID_TIMEOUT MAX_NUM_TIMER
19
20#define NUM_MSGQ 16
21
22#define MENU_TASK_PRIO TASK_PRI_MENU
23#define MENU_STACK_SIZE 16384
24
25#define USE_OLNY_ONE_INPUT_KEY 1
26        //¿ÀÁ÷ ÇϳªÀÇ ÀԷ Ű¸¸À» ÀνÄÇÔ -> Ű ó¸®°¡ ´Ê¾î¼­ ¹öÆÛ¿¡ ½×ÀÌÁö ¾ÊÀ½
27
28
29#if COMMENT
30__Local_Var__(){}
31#endif
32
33static DHL_OS_TASK_ID p_menu_task_id;
34
35static DHL_OS_MSGQ_ID p_msgq_id;
36static DHL_OS_SEMA_ID p_mtx;
37static DHL_OS_SEMA_ID p_sem_sync;
38
39static tDMG_Menu *p_pmenu_list[MAX_NUM_MENU]; /* ¸ðµç menu¿¡ ´ëÇÑ list */
40static tDMG_Menu *p_pcur_menu;
41
42static tDMG_MenuManageProc p_menu_manage_proc;
43
44static tDMG_MenuInfo p_menu_info;
45
46/* Menu initµµ µÇ±â Àü¿¡ SendMessage°¡ È£ÃâµÉ ¼ö ÀÖ´Â °æ¿ìÀÇ ¹®Á¦
47        msgq_id üũ ¸¸À¸·Î´Â ÃæºÐÇÏÁö ¾Ê¾Æ¼­ º°µµÀÇ º¸È£ ÄÚµå Ãß°¡
48*/
49static BOOL p_menu_task_running;
50
51/* timer ¼³Á¤ */
52static struct {
53        UINT32 start_ms;
54        UINT32 prev_ms;
55        UINT32 dur_ms; /* ms ´ÜÀ§ */ 
56        UINT32 opt;
57} p_timer_list[MAX_NUM_TIMER+1]; /* ¸¶Áö¸· slotÀº timout¿ëÀ¸·Î »ç¿ëÇÔ.*/
58
59
60
61#if COMMENT
62__Debug_Trace__() {}
63#endif
64
65/*
66        ƯÁ¤ ¸Þ´º¿¡ °üÇÑ command ¸¸ trace Çϱâ À§ÇÑ ±â´É.
67        »ç¿ë¹ýÀº trace_menu_by_id() µîÀ» Âü°í..
68*/
69static int s_trace_menu_id;
70static char s_trace_menu_name[100];
71
72void p_trace_menu_cmd(tDMG_Menu *pmenu, tDMG_CMD cmd, UINT32 opt, UINT32 param1, UINT32 param2)
73{
74        if (!pmenu) return;
75        if ( (pmenu->id == s_trace_menu_id) || 
76                (s_trace_menu_name[0] && strstr(pmenu->name, s_trace_menu_name)!=0) )
77                DHL_OS_Printf("==== menu trace: %x(%s), cmd %x(%s) opt %x, param %x %x\n",
78                        pmenu->id, pmenu->name,
79                        cmd, DMG_CMD_STR(cmd), opt, param1, param2);
80}
81
82void p_trace_menu_cmd2(tDMG_Menu *pmenu, tDMG_Message *pmsg)
83{
84        if (!pmsg) return;
85        p_trace_menu_cmd(pmenu, pmsg->cmd, pmsg->opt, pmsg->param1, pmsg->param2);
86}
87
88
89#if COMMENT
90__Local_Func__() {}
91#endif
92
93
94static tDMG_Menu *p_get_menu(tDMG_MenuId menu_id)
95{
96        int i;
97       
98        for(i=0; i<MAX_NUM_MENU && p_pmenu_list[i]; i++) {
99                if(p_pmenu_list[i]->id==menu_id) return p_pmenu_list[i];
100        }
101       
102        return NULL;
103}
104
105
106static void p_insert_menu(tDMG_Menu *pmenu)
107{
108        int i;
109       
110        for(i=0; i<MAX_NUM_MENU && p_pmenu_list[i]; i++);
111       
112        if(i==MAX_NUM_MENU) {
113                dprint(0, "!! %s : menu slot is empty\n", __FUNCTION__);
114                return;
115        }
116       
117        p_pmenu_list[i]=pmenu;
118}
119
120
121
122static tDMG_Frame *p_get_frame(tDMG_Menu *pmenu, tDMG_FrameId frame_id)
123{
124        int i;
125       
126        if(!pmenu) return NULL;
127               
128        for(i=0; i<MAX_NUM_FRAME && pmenu->pframe_list[i]; i++) {
129                if(pmenu->pframe_list[i]->id==frame_id) return pmenu->pframe_list[i];
130        }
131       
132        return NULL;
133}
134
135
136static void p_msg_generator(tDMG_Menu *pmenu, tDMG_CMD cmd, UINT32 opt, UINT32 param1, UINT32 param2)
137{
138        int i;
139       
140        if(!pmenu) return;
141
142        p_trace_menu_cmd(pmenu, cmd, opt, param1, param2);
143       
144        switch(cmd) 
145        {
146                case eDMG_CMD_ON_MENU_ACTIVE :
147                       
148                        if(pmenu->user_proc(cmd, opt, param1, param2)) break; /* ÀÌ¹Ì Ã³¸®µÇ¾úÀ½ */
149                       
150                        if(pmenu->pcur_frame)
151                                pmenu->pcur_frame->user_proc(eDMG_CMD_ON_FRAME_ACTIVE, 0, 
152                                                             (UINT32)pmenu->pcur_frame, (UINT32)DMG_FRAME_ID_NONE);
153                        break;
154               
155                case eDMG_CMD_ON_MENU_INACTIVE :
156                        if(pmenu->pcur_frame)
157                                pmenu->pcur_frame->user_proc(eDMG_CMD_ON_FRAME_INACTIVE, 0, 
158                                                             (UINT32)pmenu->pcur_frame, (UINT32)DMG_FRAME_ID_NONE);
159                                                             
160                        pmenu->user_proc(cmd, opt, param1, param2);
161                       
162                        for(i=0; i<MAX_NUM_TIMER; i++) {
163                                if(p_timer_list[i].opt&eDMG_CMD_OPT_TIMER_LOCAL1 ||
164                                        p_timer_list[i].opt&eDMG_CMD_OPT_TIMER_LOCAL2)
165                                        p_timer_list[i].dur_ms=TIMER_NOUSE;
166                        }
167                       
168                        break;
169               
170                case eDMG_CMD_ON_MENU_EXIT :
171                        if(pmenu->pcur_frame)
172                                pmenu->pcur_frame->user_proc(eDMG_CMD_ON_FRAME_EXIT, 0, 
173                                                             (UINT32)pmenu, (UINT32)pmenu->pcur_frame);
174                        pmenu->user_proc(cmd, opt, param1, param2);
175                       
176                        for(i=0; i<MAX_NUM_TIMER; i++) {
177                                if(p_timer_list[i].opt&eDMG_CMD_OPT_TIMER_LOCAL1 ||
178                                        p_timer_list[i].opt&eDMG_CMD_OPT_TIMER_LOCAL2)
179                                        p_timer_list[i].dur_ms=TIMER_NOUSE;
180                        }
181                       
182                        break;
183                       
184                case eDMG_CMD_ON_MENU_INVISIBLE :
185                        if(pmenu->pcur_frame)
186                                pmenu->pcur_frame->user_proc(eDMG_CMD_ON_FRAME_INVISIBLE, 0, 
187                                                             (UINT32)pmenu, (UINT32)pmenu->pcur_frame);
188                        pmenu->user_proc(cmd, opt, param1, param2);
189                       
190                        for(i=0; i<MAX_NUM_TIMER; i++) {
191                                if(p_timer_list[i].opt&eDMG_CMD_OPT_TIMER_LOCAL1 ||
192                                        p_timer_list[i].opt&eDMG_CMD_OPT_TIMER_LOCAL2)
193                                        p_timer_list[i].dur_ms=TIMER_NOUSE;
194                        }
195                       
196                        break;
197                       
198                case eDMG_CMD_ON_REDRAW :
199                        {
200                                int i;
201                                tDMG_Menu *ptemp;
202                                tDMG_Menu *pmenu_list[MAX_NUM_MENU];
203                               
204                                for(i=0, ptemp=pmenu; ptemp; i++, ptemp=(tDMG_Menu *)ptemp->pbelow)
205                                        pmenu_list[i]=ptemp;
206                               
207                                for(i--; i>=0; i--) {
208                                        if(!pmenu_list[i]->user_proc(cmd, 0, (UINT32)pmenu_list[i], 0)) {
209#if 0 /* redraw´Â menu´Ü¿¡¼­ ´Ù ó¸®ÇÔ */
210                                                if(pmenu_list[i]->pcur_frame)
211                                                        pmenu_list[i]->pcur_frame->user_proc(cmd, 0, (UINT32)pmenu_list[i],
212                                                                                             (UINT32)pmenu_list[i]->pcur_frame);
213#endif
214                                        }
215                                }
216                        }
217                        break;
218                       
219                case eDMG_CMD_ON_TIME :
220                        {
221                                BOOL is_done;
222                                tDMG_Menu *pm_temp;
223                                int i;
224                               
225                                for(is_done=FALSE, pm_temp=pmenu; !is_done && pm_temp; pm_temp=(tDMG_Menu *)pm_temp->pbelow) {
226                                       
227                                        is_done=pm_temp->user_proc(cmd, opt, param1, param2);
228                                               
229                                        for(i=0; !is_done && pm_temp->pframe_list[i]; i++) {
230                                                is_done=pm_temp->pframe_list[i]->user_proc(cmd, opt, param1, param2);
231                                        }
232                                       
233                                }
234                               
235                        }
236                        break;
237               
238                case eDMG_CMD_ON_TIMEOUT :
239                       
240                        if(!pmenu->user_proc(cmd, opt, param1, param2)) {
241                                if(pmenu->pcur_frame)
242                                        pmenu->pcur_frame->user_proc(cmd, opt, param1, param2);
243                        }
244                        break;
245                       
246                case eDMG_CMD_ON_KEY :
247                        /* active menuÀÇ active frame¿¡¸¸ key¸¦ Àü´ÞÇÔ */
248                        if(!pmenu->user_proc(cmd, opt, param1, param2)) {
249                                if(pmenu->pcur_frame) 
250                                        pmenu->pcur_frame->user_proc(eDMG_CMD_ON_KEY, opt, param1, param2);
251                        }
252                        break;
253                       
254                case eDMG_CMD_ON_USER_DEFINED :
255                        /* active menuÀÇ active frame¿¡¸¸ key¸¦ Àü´ÞÇÔ */
256                        {
257                                BOOL is_done;
258                                tDMG_Menu *pm_temp;
259                                int i;
260                               
261                                for(is_done=FALSE, pm_temp=pmenu; !is_done && pm_temp; pm_temp=(tDMG_Menu *)pm_temp->pbelow) {
262                                       
263                                        is_done=pm_temp->user_proc(cmd, opt, param1, param2);
264                                               
265                                        for(i=0; !is_done && pm_temp->pframe_list[i]; i++) {
266                                                is_done=pm_temp->pframe_list[i]->user_proc(cmd, opt, param1, param2);
267                                        }
268                                       
269                                }
270                               
271                        }
272                        break;
273               
274               
275                default :
276                        pmenu->user_proc(cmd, opt, param1, param2);
277        }
278                       
279}
280
281
282static tDMG_MenuManange p_default_menu_manage_proc(tDMG_MenuManageParam *pmanage_param)
283{
284        if(pmanage_param->is_start)
285                return eDMG_MENU_MANAGE_INACTIVE_AND_DRAW;
286       
287        return eDMG_MENU_MANAGE_EXIT;
288}
289
290
291static BOOL p_default_user_proc(tDMG_CMD cmd, UINT32 opt, UINT32 param1, UINT32 param2)
292{
293        dprint(0, "%s : cmd(%s:0x%x), opt(0x%x), param1(0x%x), param2(0x%x)\n",
294                __FUNCTION__, DMG_CMD_STR(cmd), cmd, opt, param1, param2);
295       
296        return FALSE;
297}
298
299
300static void p_insert_inactive_menu_list(tDMG_Menu *pmenu)
301{
302        tDMG_Menu *ptemp;
303       
304        if(!p_pcur_menu) {
305                dprint(2, "!! %s : cur active menu is not exist\n", __FUNCTION__);
306                return;
307        }
308       
309        for(ptemp=p_pcur_menu; ptemp->pbelow; ptemp=ptemp->pbelow);
310       
311        ptemp->pbelow=pmenu;
312       
313        pmenu->pbelow=NULL;
314}
315
316
317static void p_delete_inactive_menu_list(tDMG_MenuId menu_id)
318{
319        tDMG_Menu *ptemp;
320       
321        if(!p_pcur_menu) {
322                dprint(2, "!! %s : cur active menu is not exist\n", __FUNCTION__);
323                return;
324        }
325       
326        for(ptemp=p_pcur_menu; ptemp->pbelow; ptemp=ptemp->pbelow) {
327                if(ptemp->pbelow->id==menu_id) {
328                        ptemp->pbelow=ptemp->pbelow->pbelow;
329                        break;
330                }
331        }
332}
333
334
335static tDMG_MenuList p_get_inactive_menu_list()
336{
337        int i;
338        UINT32 menu_list;
339       
340        for(i=0, menu_list=0; i<MAX_NUM_MENU; i++) {
341                if(p_pmenu_list[i] && p_pmenu_list[i]->status==eDMG_STATUS_INACTIVE)
342                        menu_list|=(1<<p_pmenu_list[i]->id);
343        }
344       
345        return menu_list;
346}
347
348static tDMG_MenuList p_get_invisible_menu_list()
349{
350        int i;
351        UINT32 menu_list;
352       
353        for(i=0, menu_list=0; i<MAX_NUM_MENU; i++) {
354                if(p_pmenu_list[i] && p_pmenu_list[i]->status==eDMG_STATUS_INVISIBLE)
355                        menu_list|=(1<<p_pmenu_list[i]->id);
356        }
357       
358        return menu_list;
359}
360
361static tDMG_Menu *p_get_max_prio_invisible_menu()
362{
363        int i;
364        int min_prio=0xff;
365        tDMG_Menu *pmin_prio_menu=NULL;
366       
367        for(i=0; i<MAX_NUM_MENU; i++) {
368                if(p_pmenu_list[i] && p_pmenu_list[i]->status==eDMG_STATUS_INVISIBLE) {
369                        if(p_pmenu_list[i]->id<min_prio) {
370                                min_prio=p_pmenu_list[i]->id;
371                                pmin_prio_menu=p_pmenu_list[i];
372                        }
373                }
374        }
375       
376        return pmin_prio_menu;
377}
378
379
380
381#if COMMENT
382__Task_Func__() {}
383#endif
384
385
386
387
388
389
390static void p_menu_task(void* arg)
391{
392        int i;
393        DHL_RESULT result;
394        tDMG_Message rcv_msg;
395        int rcv_len;
396       
397        p_menu_task_id=DHL_OS_GetTaskID();
398       
399        for(i=0; i<MAX_NUM_TIMER+1; i++)
400                p_timer_list[i].dur_ms=TIMER_NOUSE;
401
402        p_menu_task_running = TRUE;
403
404        while(1)
405        {
406                UINT32 min_ms=0xffffffff;
407                UINT32 cur_ms=DHL_OS_GetMsCount();
408               
409                result=DHL_OS_ReceiveMessage(p_msgq_id, &rcv_msg, 0);
410               
411                if(result!=DHL_OK) {
412                        /* ±ú¾î³¯ ½Ã°¢ °è»ê */         
413                        for(i=0; i<MAX_NUM_TIMER+1; i++) { 
414                                if(p_timer_list[i].dur_ms==TIMER_NOUSE) continue;
415                               
416                                if(p_timer_list[i].prev_ms+p_timer_list[i].dur_ms<(UINT32)min_ms) {
417                                        min_ms=p_timer_list[i].prev_ms+p_timer_list[i].dur_ms;
418                                }
419                        }
420                       
421                        if(min_ms==0xffffffff) {
422                                /* timer°¡ µî·ÏµÇÁö ¾ÊÀ½ */
423                                result=DHL_OS_ReceiveMessage(p_msgq_id, &rcv_msg, DHL_TIMEOUT_FOREVER);
424                        }
425                        else {
426                               
427                                if(min_ms>cur_ms) min_ms-=cur_ms;
428                                else if(cur_ms-min_ms<10000) { //10Ãʺ¸´Ù ÀÛ´Ù¸é 0À¸·Î º¸Á¤ÇÔ
429                                        min_ms=0;
430                                }
431                                else { //turn aroundµÈ °æ¿ì.
432                                        min_ms=0xffffffff-(cur_ms-min_ms)+1;
433                                }
434                               
435                                result=DHL_OS_ReceiveMessage(p_msgq_id, &rcv_msg, min_ms);
436                        }
437                }
438
439               
440                if(result==DHL_OK) { /* Á¤»ó ¼ö½Å */
441                       
442                        //dprint(1, "--MSG RECEIVED(%s:0x%x), opt(0x%x), param1(0x%x), param2(0x%x)\n",
443                         //      DMG_CMD_STR(rcv_msg.cmd), rcv_msg.cmd, rcv_msg.opt, rcv_msg.param1, rcv_msg.param2);
444                               
445                        switch(rcv_msg.cmd) 
446                        {
447                                case eDMG_CMD_SET_MENU_START :
448                                {
449                                        tDMG_Menu *pmenu=(tDMG_Menu *)rcv_msg.param1, *ptemp;
450                                        tDMG_MenuManange menu_manage;
451                                        tDMG_MenuManageParam manage_param;
452                                       
453                                        if(!pmenu) {
454                                                /* ¸Þ´º¸¦ ÃʱâÈ­ÇÏÁö ¾Ê¾ÒÀ¸¸é¼­ menu exit¸¦ ÇÏ´Â °æ¿ì ÀÖÀ½ */
455                                                dprint(0, "menu was not inited !!\n");
456                                                continue;
457                                        }
458
459                                        p_trace_menu_cmd2(pmenu, &rcv_msg);
460                                       
461                                        manage_param.is_start=TRUE;
462                                        manage_param.active_id=p_pcur_menu?p_pcur_menu->id:DMG_MENU_ID_NONE;
463                                        manage_param.action_id=pmenu->id;
464                                       
465                                        /* menu update : ±âÁ¸ ¸Þ´º°¡ ¶° ÀÖÀ» °æ¿ì update ¸Þ½ÃÁö¸¦ Àü´ÞÇÔ, ±×·¸Áö ¾ÊÀ¸¸é ¸Þ´º¸¦ ¶ç¿ò */
466                                        if(rcv_msg.opt&eDMG_CMD_OPT_MENU_UPDATE) {
467                                                if(manage_param.active_id==pmenu->id) {
468                                                        p_msg_generator(pmenu, eDMG_CMD_ON_MENU_UPDATE, rcv_msg.opt, (UINT32)p_pcur_menu, rcv_msg.param2);
469                                                        continue;
470                                                }
471                                        }
472                                       
473                                        manage_param.inactive_list=p_get_inactive_menu_list();
474                                        manage_param.invisible_list=p_get_invisible_menu_list();
475                                       
476                                        menu_manage=p_menu_manage_proc(&manage_param);
477                                       
478                                        /*±âÁ¸ ¸Þ´º¿¡ ´ëÇÑ Ã³¸® */
479                                        if(!p_pcur_menu); /* ±âÁ¸ ¸Þ´º°¡ ¾øÀ¸¸é ¾Æ¹« 󸮵µ ¾ÈÇÔ */
480                                        else {
481                                               
482                                                switch(menu_manage) {
483                                                       
484                                                        case eDMG_MENU_MANAGE_DENY:
485                                                                dprint(2, "cur menu(id:%d) is denied\n");
486                                                                continue; /* ±×³É ¹«½ÃÇÔ */
487                                                       
488                                                        case eDMG_MENU_MANAGE_DENY_BUT_INACTIVE:
489                                                                pmenu->status=eDMG_STATUS_INACTIVE;
490                                                                p_insert_inactive_menu_list(pmenu);
491                                                               
492                                                                p_msg_generator(pmenu, eDMG_CMD_ON_MENU_ENTER, 0, (UINT32)p_pcur_menu, 0);
493                                                               
494                                                                continue; /* inactive »óÅ·Π¹Ù²Ù°í ¹«½Ã */
495                                                               
496                                                        case eDMG_MENU_MANAGE_DENY_BUT_HIDE:
497                                                                pmenu->status=eDMG_STATUS_INVISIBLE;
498                                                                                                                               
499                                                                p_msg_generator(pmenu, eDMG_CMD_ON_MENU_ENTER, 0, (UINT32)p_pcur_menu, 0);
500                                                               
501                                                                continue; /* invisible »óÅ·Π¹Ù²Ù°í ¹«½Ã */
502                                                               
503                                                        case eDMG_MENU_MANAGE_INACTIVE_AND_DRAW:
504                                                                p_pcur_menu->status=eDMG_STATUS_INACTIVE;
505                                                                p_msg_generator(p_pcur_menu, eDMG_CMD_ON_MENU_INACTIVE, 0, (UINT32)p_pcur_menu, 
506                                                                        pmenu?pmenu->id:DMG_MENU_ID_NONE);
507                                                               
508                                                                break;
509                                                       
510                                                        case eDMG_MENU_MANAGE_HIDE_PREV_AND_DRAW:
511                                                                p_pcur_menu->status=eDMG_STATUS_INVISIBLE;
512                                                                p_msg_generator(p_pcur_menu, eDMG_CMD_ON_MENU_INVISIBLE, 0, (UINT32)p_pcur_menu, 
513                                                                        pmenu?pmenu->id:DMG_MENU_ID_NONE);
514                                                               
515                                                                p_pcur_menu=p_pcur_menu->pbelow;
516                                                               
517                                                                break;
518                                                               
519                                                        case eDMG_MENU_MANAGE_HIDE_ALL_AND_DRAW:
520                                                                       
521                                                                for(ptemp=p_pcur_menu; ptemp; ptemp=ptemp->pbelow) {
522                                                                        ptemp->status=eDMG_STATUS_INVISIBLE;
523                                                                        p_msg_generator(ptemp, eDMG_CMD_ON_MENU_INVISIBLE, 0, (UINT32)p_pcur_menu, 
524                                                                                pmenu?pmenu->id:DMG_MENU_ID_NONE);
525                                                                }
526                                                               
527                                                                p_pcur_menu=NULL; /* inactive list°¡ ¸ðµÎ »ç¶óÁü */
528                                                                       
529                                                                break;
530                                                       
531                                                        case eDMG_MENU_MANAGE_EXIT_PREV_AND_DRAW:
532                                                               
533                                                                p_pcur_menu->status=eDMG_STATUS_EXIT;
534                                                                p_msg_generator(p_pcur_menu, eDMG_CMD_ON_MENU_EXIT, 0, (UINT32)p_pcur_menu, 
535                                                                        pmenu?pmenu->id:DMG_MENU_ID_NONE);
536                                                               
537                                                                p_pcur_menu=p_pcur_menu->pbelow;
538                                                               
539                                                                break;
540                                                               
541                                                        case eDMG_MENU_MANAGE_EXIT_ALL_AND_DRAW:
542                                                               
543                                                                for(i=0; i<MAX_NUM_MENU; i++) {
544                                                                        if(p_pmenu_list[i] && p_pmenu_list[i]->status!=eDMG_STATUS_EXIT) {
545                                                                                p_pcur_menu->status=eDMG_STATUS_EXIT;
546                                                                                p_msg_generator(p_pcur_menu, eDMG_CMD_ON_MENU_EXIT, 0, (UINT32)p_pcur_menu, 
547                                                                                        pmenu?pmenu->id:DMG_MENU_ID_NONE);
548                                                                        }
549                                                                }
550                                                               
551                                                                p_pcur_menu=NULL;
552                                                               
553                                                                break;
554                                                               
555                                                        /* TODO: exit enumerate handle */
556                                                        case eDMG_MENU_MANAGE_EXIT:
557                                                        case eDMG_MENU_MANAGE_EXIT_SILENT:
558                                                        default:
559                                                               
560                                                                break;
561                                                }
562                                        }
563                                       
564                                        dprint(2, " -- %s : new menu is draw\n", __FUNCTION__);
565                                       
566                                        pmenu->pbelow=p_pcur_menu;
567
568                                        /* menu info ¼öÁý */
569                                        p_menu_info.pcur_menu=pmenu;
570                                        p_menu_info.pprev_menu=p_pcur_menu;
571                                        p_menu_info.pcur_frame=pmenu->pcur_frame;
572                                        p_menu_info.pprev_frame=NULL;
573                                       
574                                        p_pcur_menu=pmenu;
575                                       
576                                        p_pcur_menu->status=eDMG_STATUS_ACTIVE;
577                                       
578                                        p_msg_generator(p_pcur_menu, eDMG_CMD_ON_MENU_ENTER, 0, (UINT32)p_pcur_menu, 0);
579                                       
580                                        p_msg_generator(p_pcur_menu, eDMG_CMD_ON_MENU_ACTIVE, 0, (UINT32)p_pcur_menu, 
581                                                p_menu_info.pprev_menu?p_menu_info.pprev_menu->id:DMG_MENU_ID_NONE);
582                                       
583                                        DMG_SetTimer(TIMER_ID_TIMEOUT, p_pcur_menu->timeout_ms, eDMG_CMD_OPT_TIMER_ONESHOT);
584                                       
585                                        break;
586                                       
587                                }
588                               
589                                case eDMG_CMD_SET_MENU_EXIT :
590                                {
591                                        tDMG_Menu *pmenu=DMG_GetMenu((tDMG_MenuId)rcv_msg.param1), *ptemp;
592                                        tDMG_MenuManange menu_manage;
593                                        tDMG_MenuManageParam manage_param;
594                                       
595                                        if(!pmenu) {
596                                                /* ¸Þ´º¸¦ »ý¼ºÇÏÁö ¾Ê¾ÒÀ¸¸é¼­ menu exit¸¦ ÇÏ´Â °æ¿ì ÀÖÀ½ */
597                                                dprint(0, "menu was not started !!\n");
598                                                continue;
599                                        }
600
601                                        p_trace_menu_cmd2(pmenu, &rcv_msg);
602
603                                        manage_param.is_start=FALSE;
604                                        manage_param.active_id=p_pcur_menu?p_pcur_menu->id:DMG_MENU_ID_NONE;
605                                        manage_param.action_id=pmenu->id;
606                                       
607                                        manage_param.inactive_list=p_get_inactive_menu_list();
608                                        manage_param.invisible_list=p_get_invisible_menu_list();
609                                       
610                                        manage_param.new_active_id=DMG_MENU_ID_DEFAULT;
611                                       
612                                        menu_manage=p_menu_manage_proc(&manage_param);
613                                       
614                                        if(menu_manage==eDMG_MENU_MANAGE_EXIT) {
615                                                pmenu->status=eDMG_STATUS_EXIT;
616                                                if(p_pcur_menu==pmenu)
617                                                        p_msg_generator(pmenu, eDMG_CMD_ON_MENU_EXIT, 0, (UINT32)pmenu, pmenu?pmenu->id:DMG_MENU_ID_NONE);
618                                        }
619                                        else if(menu_manage==eDMG_MENU_MANAGE_EXIT_SILENT) {
620                                                pmenu->status=eDMG_STATUS_EXIT;
621                                        }
622                                        else {
623                                                dprint(0, "!! %s(LINE:%d) : bad return value of manage proc\n", __FUNCTION__, __LINE__);
624                                                break;
625                                        }
626                                       
627                                        p_menu_info.pprev_menu=p_pcur_menu;
628                                        p_menu_info.pcur_menu=NULL;
629                                        p_menu_info.pcur_frame=NULL;
630                                        p_menu_info.pprev_frame=NULL;
631                                       
632                                        if(p_pcur_menu==pmenu) { /* ÇöÀç menu¸¦ Áö¿ò */
633                                                /* ÇöÀç menu°¡ Áö¿öÁú ¶§ ¸»°í´Â ACTIVE menu¸¦ º¯°æÇÏÁö ¾ÊÀ½ */
634                                               
635                                                if(manage_param.new_active_id==DMG_MENU_ID_NONE) {
636                                                        p_pcur_menu=NULL; /* ÇöÀç Ȱ¼ºÈ­µÇ¾îÀÖ´Â menu´Â ¾øÀ½? */
637                                                }
638                                                else {
639                                                       
640                                                        if(manage_param.new_active_id==DMG_MENU_ID_DEFAULT) {
641                                                                ptemp=p_pcur_menu->pbelow;
642                                                               
643                                                                if(!ptemp) { /* invisible menu Áß¿¡¼­ ãÀ½ */
644                                                                        ptemp=p_get_max_prio_invisible_menu();
645                                                                }
646                                                        }
647                                                        else
648                                                                ptemp=p_get_menu(manage_param.new_active_id);
649
650#if 0   //½ÇÁ¦ ÇÏÀ§¿¡ ¾î¶² ¸Þ´ºµµ ¾øÀ» ¼ö ÀÖÀ½                                         
651                                                        if(!ptemp) {
652                                                                dprint(0, "!! %s(LINE:%d) : bad menu_active_id\n", __FUNCTION__, __LINE__);
653                                                                break;
654                                                        }
655#endif                         
656                                                        if(ptemp && ptemp->status==eDMG_STATUS_EXIT) {
657                                                                dprint(0, "!! %s(LINE:%d) : bad menu_active_id\n", __FUNCTION__, __LINE__);
658                                                                break;
659                                                        }
660                                                       
661                                                        p_pcur_menu=ptemp;
662                                                       
663                                                        if(p_pcur_menu) {
664                                                                p_pcur_menu->status=eDMG_STATUS_ACTIVE;
665                                                                p_msg_generator(p_pcur_menu, eDMG_CMD_ON_MENU_ACTIVE, 0, (UINT32)p_pcur_menu, 
666                                                                        p_menu_info.pprev_menu?p_menu_info.pprev_menu->id:DMG_MENU_ID_NONE);
667                                                        }
668                                                }
669                                        }
670                                       
671                                        /* Åë°è */                                     
672                                        p_menu_info.pcur_menu=p_pcur_menu;
673                                       
674                                        break;
675                                }
676                               
677                               
678                                case eDMG_CMD_SET_TIMER :
679                                        /* param1 : id, param2 : duration, opt : opt */
680                                        p_timer_list[rcv_msg.param1].dur_ms=rcv_msg.param2;
681                                        p_timer_list[rcv_msg.param1].opt=rcv_msg.opt;
682                                        p_timer_list[rcv_msg.param1].start_ms=DHL_OS_GetMsCount();
683                                        p_timer_list[rcv_msg.param1].prev_ms=DHL_OS_GetMsCount();
684                                        break;
685                               
686                                case eDMG_CMD_SET_FRAME_ACTIVE :
687                                       
688                                        DMG_SetFrame(eDMG_CMD_SET_FRAME_ACTIVE, rcv_msg.param1, rcv_msg.param2, FALSE);
689                                        break;
690                               
691                                case eDMG_CMD_SET_REDRAW :
692                                        DMG_SetRedraw(FALSE);
693                                        break;
694                               
695                                case eDMG_CMD_SET_KEY :
696                                       
697                                        //message queue¸¦ ´Ù ¿­¾îºÁ¼­ Áߺ¹µÇ´Â ۰¡ ÀÖÀ¸¸é »èÁ¦ÇÔ
698#if USE_OLNY_ONE_INPUT_KEY
699                                        {
700                                                tDMG_Message tmsg[NUM_MSGQ];
701                                                int num_msgq;
702                                               
703                                                for(i=0; 
704                                                        i<NUM_MSGQ && DHL_OK==DHL_OS_ReceiveMessage(p_msgq_id, &tmsg[i], 0);
705                                                        i++) 
706                                                {
707                                                       
708                                                        if(tmsg[i].cmd==eDMG_CMD_SET_KEY && tmsg[i].param1==rcv_msg.param1) {
709                                                                //¹ö¸²
710                                                                tmsg[i].cmd=eDMG_CMD_NONE;
711                                                        }
712                                                }
713                                               
714                                                num_msgq=i;
715                                               
716                                                for(i=0; i<num_msgq; i++) {
717                                                        if(tmsg[i].cmd==eDMG_CMD_NONE) continue;
718                                                       
719                                                        DHL_OS_SendMessage(p_msgq_id, &tmsg[i], sizeof(tmsg));
720                                                }
721                                        }
722#endif
723                                       
724                                        if((rcv_msg.opt&eDMG_CMD_OPT_USER_KEY)==0) {
725                                               
726                                                if(p_pcur_menu) {
727                                                        DMG_SetTimer(TIMER_ID_TIMEOUT, p_timer_list[TIMER_ID_TIMEOUT].dur_ms, 
728                                                               eDMG_CMD_OPT_TIMER_ONESHOT);
729                                                  p_menu_info.ms_last_key=DHL_OS_GetMsCount();
730                                                }
731                                        }
732                                        p_trace_menu_cmd2(p_pcur_menu, &rcv_msg);
733                                        p_msg_generator(p_pcur_menu, eDMG_CMD_ON_KEY, 0, (UINT32)p_pcur_menu, rcv_msg.param1);
734                                        break;
735                                       
736                                       
737                                case eDMG_CMD_SET_USER_DEFINE    :
738                                        p_trace_menu_cmd2(p_pcur_menu, &rcv_msg);
739                                        p_msg_generator(p_pcur_menu, eDMG_CMD_ON_USER_DEFINED, rcv_msg.opt, rcv_msg.param1, rcv_msg.param2);
740                                        break;
741                                       
742                                case eDMG_CMD_SET_SYNC :
743                                        DHL_OS_GiveSemaphore((DHL_OS_SEMA_ID)rcv_msg.param1);
744                                        break;
745
746                                case eDMG_CMD_SET_MENU_PARAM1 :
747                                case eDMG_CMD_SET_MENU_PARAM2 :
748                                {
749                                        tDMG_Menu *pmenu=DMG_GetMenu((tDMG_MenuId)rcv_msg.param1);
750                                        if(!pmenu) {
751                                                dprint(0, "!! %s menu id invalid\n", DMG_CMD_STR(rcv_msg.cmd));
752                                                break;
753                                        }
754                                        p_trace_menu_cmd2(pmenu, &rcv_msg);
755                                        dprint(2, "  -- %s, menu 0x%x, param %x\n", DMG_CMD_STR(rcv_msg.cmd), pmenu->id, rcv_msg.param2);
756                                        if (rcv_msg.cmd==eDMG_CMD_SET_MENU_PARAM1) pmenu->param1 = rcv_msg.param2;
757                                        else pmenu->param2 = rcv_msg.param2;
758                                        break;
759                                }
760                               
761                                default :
762                                        ;
763                               
764                        }
765                       
766                        continue;
767                                /* comment : msg°¡ ÀÖÀ» ¶§´Â timer 󸮸¦ ÇÏÁö ¾Ê´Â´Ù. */
768                }
769               
770                /* timer ó¸® */
771                for(i=0; i<MAX_NUM_TIMER+1; i++) { 
772                        if(p_timer_list[i].dur_ms==TIMER_NOUSE) continue;
773                       
774                        if(DHL_OS_GetMsCount()-p_timer_list[i].prev_ms>=p_timer_list[i].dur_ms) {
775                               
776                                p_timer_list[i].prev_ms=DHL_OS_GetMsCount();
777                               
778                                if(p_timer_list[i].opt & eDMG_CMD_OPT_TIMER_ONESHOT)
779                                        p_timer_list[i].dur_ms=TIMER_NOUSE;
780                               
781                                if(i==TIMER_ID_TIMEOUT) { /* timeout */
782                                        p_msg_generator(p_pcur_menu, eDMG_CMD_ON_TIMEOUT, 0, 
783                                                DHL_OS_GetMsCount()-p_timer_list[i].start_ms, 0);
784                                }
785                                else {
786                                        p_msg_generator(p_pcur_menu, eDMG_CMD_ON_TIME, 0, i, 
787                                                DHL_OS_GetMsCount()-p_timer_list[i].start_ms);
788                                }
789                        }
790                }
791                DHL_OS_Delay(50);       //BK 10->50
792        }
793        DHL_OS_SelfDeleteTask();
794}
795
796
797
798#if COMMNET
799__APIs__(){}
800#endif
801
802// arzhna, 100409
803// ÁöÁ¤µÈ ¸Þ´ºÀÇ status¸¦ ¹Ýȯ
804// FALSE : exit »óÅÂ
805// TRUE : exit ÀÌ¿ÜÀÇ »óÅ (active µî)
806BOOL DMG_GetMenuStatus(tDMG_MenuId menu_id)
807{
808        tDMG_Menu *menu;
809
810        menu = p_get_menu(menu_id);
811
812        if(menu==NULL)
813                return FALSE;
814        else{
815                if(menu->status==eDMG_STATUS_EXIT)
816                        return FALSE;
817                else
818                        return TRUE;
819        }
820}
821
822
823void DMG_SendMessage(tDMG_CMD cmd, UINT32 opt, UINT32 param1, UINT32 param2)
824{
825        tDMG_Message send_msg;
826       
827        if(!p_msgq_id || !p_menu_task_running)
828                return;
829       
830        send_msg.cmd=cmd;
831        send_msg.opt=opt;
832        send_msg.param1=param1;
833        send_msg.param2=param2;
834       
835        if(opt&eDMG_CMD_OPT_SYNC) {
836                /* È£ÃâÇÏ´Â task¿Í µ¿±â¸¦ ¸ÂÃç¾ß ÇÔ */
837               
838                dprint(0, "!! Command Sync mode\n");
839               
840                DHL_OS_TakeSemaphore(p_mtx, DHL_TIMEOUT_FOREVER);
841               
842                DHL_OS_SendMessage(p_msgq_id, &send_msg, sizeof(send_msg));
843               
844                send_msg.cmd=eDMG_CMD_SET_SYNC;
845                send_msg.param1=(UINT32)p_sem_sync;
846               
847                DHL_OS_SendMessage(p_msgq_id, &send_msg, sizeof(send_msg)); 
848               
849                DHL_OS_TakeSemaphore(p_sem_sync, DHL_TIMEOUT_FOREVER);
850       
851                DHL_OS_GiveSemaphore(p_mtx);
852        }
853        else {
854                DHL_OS_SendMessage(p_msgq_id, &send_msg, sizeof(send_msg));
855        }
856}
857
858
859tDMG_Menu *DMG_CreateMenu(tDMG_MenuId id, char *name, UINT32 timeout_ms, tDMG_UserProc user_proc)
860{
861       
862        int i;
863        tDMG_Menu *pmenu;
864               
865        if(id==0 || id>=MAX_NUM_MENU) {
866                dprint(0, "!! %s : bad menu id\n", __FUNCTION__);
867                return NULL;
868        }
869       
870        if(p_get_menu(id)) {
871                dprint(0, "!! %s : menu(id:%d) is already created\n");
872                return NULL;
873        }
874       
875        pmenu=(tDMG_Menu *)DHL_OS_Malloc(sizeof(*pmenu));
876       
877        if(!pmenu) {
878                dprint(0, "!! %s : malloc failed\n", __FUNCTION__);
879                return NULL;
880        }
881       
882        pmenu->id=id;
883        pmenu->name=name;
884       
885        pmenu->status=eDMG_STATUS_EXIT;
886       
887        pmenu->priority=0;
888       
889        pmenu->timeout_ms=timeout_ms;
890       
891        if(user_proc)
892                pmenu->user_proc=user_proc;
893        else
894                pmenu->user_proc=p_default_user_proc;
895       
896        pmenu->pcur_frame=NULL;
897       
898        memset(&pmenu->pframe_list, 0, sizeof(pmenu->pframe_list));
899       
900        pmenu->pbelow=NULL;
901       
902        p_insert_menu(pmenu);
903       
904        return pmenu;
905}
906
907
908tDMG_Frame *DMG_CreateFrame(tDMG_Menu *pmenu, tDMG_FrameId id, char *name, 
909                            UINT32 num_item, tDMG_UserProc user_proc)
910{
911        int i;
912       
913        tDMG_Frame *pframe;
914       
915        pframe=(tDMG_Frame *)DHL_OS_Malloc(sizeof(*pframe));
916       
917        if(!pframe) {
918                dprint(0, "!! %s : malloc failed\n", __FUNCTION__);
919                return NULL;
920        }
921       
922        pframe->id=id;
923        pframe->name=name;
924        pframe->num_item=num_item;
925       
926        if(pmenu)
927                pframe->timeout_ms=pmenu->timeout_ms;
928        else
929                pframe->timeout_ms=DMG_TIME_FOREVER;
930       
931        if(user_proc)
932                pframe->user_proc=user_proc;
933        else if(pmenu)
934                pframe->user_proc=pmenu->user_proc;
935       
936        pframe->cur_item_id=0;
937        pframe->param1=0;
938        pframe->param2=0;
939       
940        if(!pmenu) return pframe;
941               
942        return DMG_AttachFrame(pmenu, pframe);
943}
944
945
946tDMG_Frame *DMG_AttachFrame(tDMG_Menu *pmenu, tDMG_Frame *pframe)
947{
948        int i;
949       
950        for(i=0; i<MAX_NUM_FRAME; i++) {
951                if(!pmenu->pframe_list[i]) {
952                        pmenu->pframe_list[i]=pframe;
953                       
954                        if(i==0) { /* óÀ½ µî·ÏµÇ´Â °ÍÀ̶ó¸é ÀÌ frameÀÌ cur frameÀÌ µÈ´Ù. */
955                                pmenu->pcur_frame=pmenu->pframe_list[i];
956                        }
957                       
958                        break;
959                }
960        }
961       
962        if(i==MAX_NUM_FRAME) {
963                dprint(0, "!! %s : frame slot in menu is empty\n", __FUNCTION__);
964        }
965       
966        return pframe;
967}
968
969
970
971tDMG_Menu *DMG_GetMenu(tDMG_MenuId menu_id)
972{
973        return p_get_menu(menu_id);
974}
975
976tDMG_Frame *DMG_GetFrame(tDMG_MenuId menu_id, tDMG_FrameId frame_id)
977{
978        tDMG_Menu *pmenu;
979       
980        if(menu_id==DMG_MENU_ID_DEFAULT) {
981                if(!p_pcur_menu) return NULL;
982                menu_id=p_pcur_menu->id;
983        }
984       
985        pmenu=p_get_menu(menu_id);
986       
987        if(!pmenu) return NULL;
988               
989        return p_get_frame(pmenu, frame_id);
990}
991
992tDMG_Menu *DMG_GetCurMenu()
993{
994        return p_pcur_menu;     
995}
996
997
998tDMG_Frame *DMG_GetCurFrame()
999{
1000        if(!p_pcur_menu) return NULL;
1001               
1002        return p_pcur_menu->pcur_frame;
1003}
1004
1005
1006void DMG_SetFrame(tDMG_CMD cmd, tDMG_MenuId menu_id, tDMG_FrameId frame_id, BOOL buse_msgq)
1007{
1008        int i;
1009        tDMG_Menu *pmenu;
1010        tDMG_Frame *pframe;
1011       
1012        if(menu_id==DMG_MENU_ID_DEFAULT) {
1013                if(!p_pcur_menu) return;
1014                menu_id=p_pcur_menu->id;
1015        }
1016       
1017        pmenu=p_get_menu(menu_id);
1018       
1019        dprint(1, "%s : menu id(%d), frame id(%d)\n", __FUNCTION__, menu_id, frame_id);
1020       
1021        if(cmd<eDMG_CMD_SET_FRAME_ACTIVE || cmd>eDMG_CMD_SET_FRAME_INACTIVE) return;
1022               
1023        if(!pmenu) {
1024                dprint(0, "!! %s : menu(id:%d,0x%x) is not exist\n", __FUNCTION__, menu_id, menu_id);
1025                return;
1026        }
1027       
1028        pframe=p_get_frame(pmenu, frame_id);
1029       
1030        if(!pframe) {
1031                dprint(0, "!! %s : frame(id:%d, 0x%x) is not exist in menu %d\n", 
1032                        __FUNCTION__, frame_id, frame_id, menu_id);
1033                return;
1034        }
1035       
1036        if(buse_msgq || p_menu_task_id!=DHL_OS_GetTaskID()) {
1037                /* buse_msgqÀÎ °æ¿ì¿Í task°¡ ´Ù¸¥ °æ¿ì´Â ¹«Á¶°Ç msgq¸¦ »ç¿ëÇÑ´Ù. */
1038                DMG_SendMessage(cmd, 0, menu_id, frame_id);
1039                return;
1040        }
1041       
1042        //DHL_OS_Printf("---- pass0\n");
1043        /* neverdai À§ÀÇ DHL_OS_Printf¹®À» »èÁ¦Çϸé Á״´Ù...¿øÀÎ ¸ð¸§ ³ªÁß¿¡ ÇØ°á ¿ä¸Á..091021 */
1044       
1045        if(cmd==eDMG_CMD_SET_FRAME_ACTIVE) {
1046       
1047                p_menu_info.pprev_frame=pmenu->pcur_frame;
1048                p_menu_info.pcur_frame=pframe;
1049       
1050                if(p_pcur_menu && p_pcur_menu->id==menu_id) { /* activeµÈ menu */
1051                        if(pmenu->pcur_frame)
1052                                pmenu->pcur_frame->user_proc(eDMG_CMD_ON_FRAME_INACTIVE, 0, 
1053                                        (UINT32)pmenu->pcur_frame, 
1054                                        pframe?(UINT32)pframe->id:DMG_FRAME_ID_NONE);
1055                               
1056                        pmenu->pcur_frame=pframe;
1057                       
1058                        for(i=0; i<MAX_NUM_TIMER; i++) {
1059                                if(p_timer_list[i].opt&eDMG_CMD_OPT_TIMER_LOCAL2)
1060                                        p_timer_list[i].dur_ms=TIMER_NOUSE;
1061                        }
1062                       
1063                        /* timeout ¼³Á¤ */
1064                        if(pframe->timeout_ms==DMG_TIME_DEFAULT)
1065                                DMG_SetTimer(TIMER_ID_TIMEOUT, pmenu->timeout_ms, eDMG_CMD_OPT_TIMER_ONESHOT);
1066                        else
1067                                DMG_SetTimer(TIMER_ID_TIMEOUT, pframe->timeout_ms, eDMG_CMD_OPT_TIMER_ONESHOT);
1068                       
1069                        if(pmenu->pcur_frame)
1070                                pmenu->pcur_frame->user_proc(eDMG_CMD_ON_FRAME_ACTIVE, 0, 
1071                                        (UINT32)pmenu->pcur_frame, 
1072                                        p_menu_info.pprev_frame?(UINT32)p_menu_info.pprev_frame->id:DMG_FRAME_ID_NONE);
1073                       
1074                }
1075                else {
1076                        pmenu->pcur_frame=pframe;
1077                }
1078        }
1079        else {
1080               
1081                if(pmenu->pcur_frame->id!=pframe->id) {
1082                        /* ÇöÀç activeµÇ¾îÀÖ´Â frameÀ» inactive, delete½Ãų ¼ö ¾øÀ½ */
1083                       
1084                }
1085                else {
1086                        pmenu->pcur_frame->user_proc(eDMG_CMD_ON_FRAME_INACTIVE, 0, (UINT32)pmenu->pcur_frame, 
1087                                (UINT32)DMG_FRAME_ID_NONE);
1088                       
1089                        for(i=0; i<MAX_NUM_TIMER; i++) {
1090                                if(p_timer_list[i].opt&eDMG_CMD_OPT_TIMER_LOCAL2)
1091                                        p_timer_list[i].dur_ms=TIMER_NOUSE;
1092                        }
1093                }
1094               
1095        }
1096}
1097
1098
1099
1100void DMG_SetRedraw(BOOL buse_msgq)
1101{
1102        if(!p_pcur_menu) return;
1103               
1104        p_msg_generator(p_pcur_menu, eDMG_CMD_ON_REDRAW, 0, 0, 0);
1105}
1106
1107
1108
1109void DMG_SetTimer(UINT32 timer_id, UINT32 duration, UINT32 opt)
1110{
1111        if(p_menu_task_id!=DHL_OS_GetTaskID())
1112                DMG_SendMessage(eDMG_CMD_SET_TIMER, opt, timer_id, duration);
1113        else {
1114                p_timer_list[timer_id].dur_ms=duration;
1115                p_timer_list[timer_id].opt=opt;
1116                p_timer_list[timer_id].start_ms=DHL_OS_GetMsCount();
1117                p_timer_list[timer_id].prev_ms=DHL_OS_GetMsCount();
1118        }
1119}
1120
1121void DMG_KillTimer(UINT32 timer_id)
1122{
1123        if(p_menu_task_id!=DHL_OS_GetTaskID())
1124                DMG_SendMessage(eDMG_CMD_SET_TIMER, 0, timer_id, TIMER_NOUSE);
1125        else {
1126                p_timer_list[timer_id].dur_ms=TIMER_NOUSE;
1127                p_timer_list[timer_id].opt=0;
1128                p_timer_list[timer_id].start_ms=0;
1129                p_timer_list[timer_id].prev_ms=0;
1130        }
1131}
1132
1133
1134void DMG_SetKeyInput(UINT32 key_code)
1135{
1136        DMG_SendMessage(eDMG_CMD_SET_KEY, 0, key_code, 0);
1137}
1138
1139void DMG_SetUserKeyInput(UINT32 key_code)
1140{
1141        DMG_SendMessage(eDMG_CMD_SET_KEY, eDMG_CMD_OPT_USER_KEY, key_code, 0); 
1142}
1143
1144
1145void DMG_SetUserDefined(UINT32 id, UINT32 param1, UINT32 param2)
1146{
1147        DMG_SendMessage(eDMG_CMD_SET_USER_DEFINE, id, param1, param2); 
1148}
1149
1150void DMG_SetMenuTimeout(tDMG_MenuId id, UINT32 timeout)
1151{
1152        tDMG_Menu *pmenu=DMG_GetMenu(id);
1153       
1154        if(!pmenu) {
1155               
1156                dprint(0, "!! %s : menu id is incorrect\n", __FUNCTION__);
1157                return;
1158        }
1159       
1160        pmenu->timeout_ms=timeout;
1161        DMG_SetTimer(TIMER_ID_TIMEOUT, timeout, eDMG_CMD_OPT_TIMER_ONESHOT);
1162}
1163
1164void DMG_SetFrameTimeout(tDMG_MenuId menu_id, tDMG_FrameId frame_id, UINT32 timeout)
1165{
1166        tDMG_Frame *pframe=DMG_GetFrame(menu_id, frame_id);
1167       
1168        if(!pframe) {
1169               
1170                dprint(0, "!! %s : menu or frame id is incorrect\n", __FUNCTION__);
1171                return;
1172        }
1173       
1174        pframe->timeout_ms=timeout;
1175}
1176
1177
1178void DMG_SetMenuParam1(tDMG_MenuId id, UINT32 param)
1179{
1180#if 1
1181        DMG_SendMessage(eDMG_CMD_SET_MENU_PARAM1, 0, id, param);
1182
1183#else
1184        tDMG_Menu *pmenu=DMG_GetMenu(id);
1185       
1186        if(!pmenu) {
1187               
1188                dprint(0, "!! %s : menu id is incorrect\n", __FUNCTION__);
1189                return;
1190        }
1191       
1192        pmenu->param1=param;           
1193#endif
1194}
1195
1196void DMG_SetMenuParam2(tDMG_MenuId id, UINT32 param)
1197{
1198#if 1
1199        DMG_SendMessage(eDMG_CMD_SET_MENU_PARAM2, 0, id, param);
1200
1201#else
1202        tDMG_Menu *pmenu=DMG_GetMenu(id);
1203       
1204        if(!pmenu) {
1205               
1206                dprint(0, "!! %s : menu id is incorrect\n", __FUNCTION__);
1207                return;
1208        }
1209       
1210        pmenu->param2=param;           
1211#endif
1212}
1213
1214
1215void DMG_SetFrameParam1(tDMG_MenuId menu_id, tDMG_FrameId frame_id, UINT32 param)
1216{
1217        tDMG_Frame *pframe=DMG_GetFrame(menu_id, frame_id);
1218       
1219        if(!pframe) {
1220               
1221                dprint(0, "!! %s : menu or frame id is incorrect\n", __FUNCTION__);
1222                return;
1223        }
1224       
1225        pframe->param1=param;   
1226}       
1227
1228
1229void DMG_SetFrameParam2(tDMG_MenuId menu_id, tDMG_FrameId frame_id, UINT32 param)
1230{
1231        tDMG_Frame *pframe=DMG_GetFrame(menu_id, frame_id);
1232       
1233        if(!pframe) {
1234               
1235                dprint(0, "!! %s : menu or frame id is incorrect\n", __FUNCTION__);
1236                return;
1237        }
1238       
1239        pframe->param2=param;   
1240}
1241
1242
1243
1244UINT32 DMG_GetKeyInput(UINT32 time_ms)
1245{
1246        DHL_RESULT res;
1247        tDMG_Message rcv_msg;
1248        int rcv_len;
1249       
1250        if(!p_msgq_id) return DMG_KEY_NONE;
1251       
1252        if(time_ms==DMG_TIME_FOREVER)
1253                res=DHL_OS_ReceiveMessage(p_msgq_id, &rcv_msg, DHL_TIMEOUT_FOREVER);
1254        else if(time_ms==0)
1255                res=DHL_OS_ReceiveMessage(p_msgq_id, &rcv_msg, 0);
1256        else
1257                res=DHL_OS_ReceiveMessage(p_msgq_id, &rcv_msg, time_ms);
1258       
1259        if(res!=DHL_OK)
1260                return DMG_KEY_NONE;
1261       
1262        if(rcv_msg.cmd!=eDMG_CMD_SET_KEY) return DMG_KEY_NONE;
1263       
1264        return rcv_msg.param1;
1265}
1266
1267
1268void DMG_GetMenuInfo(tDMG_MenuInfo *pinfo)
1269{
1270        *pinfo=p_menu_info;
1271}
1272
1273
1274BOOL DMG_IsMenuOn(tDMG_MenuId menu_id)
1275{
1276        int i;
1277       
1278        for(i=0; i<MAX_NUM_MENU; i++) {
1279                if(p_pmenu_list[i] && p_pmenu_list[i]->id==menu_id) {
1280                        if(p_pmenu_list[i]->status!=eDMG_STATUS_EXIT)
1281                                return TRUE;
1282                        else 
1283                                return FALSE;
1284                }
1285        }
1286       
1287        return FALSE;
1288}
1289
1290
1291
1292void DMG_MenuStart(tDMG_MenuId menu_id)
1293{
1294        tDMG_Menu *pmenu=p_get_menu(menu_id);
1295       
1296        dprint(1, "%s : menu id(%d)\n", __FUNCTION__, menu_id);
1297       
1298        if(!pmenu) return;
1299       
1300        DMG_SendMessage(eDMG_CMD_SET_MENU_START, 0, (UINT32)pmenu, 0);
1301
1302}
1303
1304
1305void DMG_MenuUpdate(tDMG_MenuId menu_id, UINT32 param)
1306{
1307        tDMG_Menu *pmenu=p_get_menu(menu_id);
1308       
1309        dprint(1, "%s : menu id(%d)\n", __FUNCTION__, menu_id);
1310       
1311        if(!pmenu) return;
1312       
1313        DMG_SendMessage(eDMG_CMD_SET_MENU_START, eDMG_CMD_OPT_MENU_UPDATE, (UINT32)pmenu, param);
1314}
1315
1316
1317void DMG_MenuExit(tDMG_MenuId menu_id)
1318{
1319        dprint(1, "%s \n", __FUNCTION__);
1320       
1321        if(menu_id==DMG_MENU_ID_DEFAULT) {
1322                if(!p_pcur_menu) return;
1323                menu_id=p_pcur_menu->id;
1324        }
1325       
1326        DMG_SendMessage(eDMG_CMD_SET_MENU_EXIT, 0, (UINT32)menu_id, 0);
1327}
1328
1329
1330void DMG_MenuExit_ActiveAll()
1331{
1332        int i;
1333       
1334        dprint(1, "--------------------------------------\n");
1335        for(i=0; i<MAX_NUM_MENU; i++) {
1336                if(!p_pmenu_list[i]) continue;
1337                if(p_pmenu_list[i]->status==eDMG_STATUS_EXIT) continue;
1338               
1339                /* idle°ú °°ÀÌ ExitÇÏÁö ¸»¾Æ¾ß ÇÏ´Â Áß¿äÇÑ menu id´Â ¿¹¿Ü½Ã۵µ·Ï ÇÑ´Ù. */
1340                //if(p_pmenu_list[i]->id==0x0 || p_pmenu_list[i]->id == 0x1f) {
1341                if(p_pmenu_list[i]->id != 0x1f) { // idleÀº exitÇÏÁö ¾Ê´Â´Ù!!
1342                        dprint(1, "Exit menu id(0x%02x), menu_name(%s)\n", p_pmenu_list[i]->id, p_pmenu_list[i]->name);
1343                        DMG_MenuExit(p_pmenu_list[i]->id);
1344                }
1345        }
1346        dprint(1, "--------------------------------------\n");
1347}
1348
1349
1350void DMG_MenuInit(tDMG_MenuManageProc menu_manage_proc)
1351{
1352        static BOOL bmenu_inited=FALSE;
1353       
1354        if(bmenu_inited) return;
1355       
1356        bmenu_inited=TRUE;
1357       
1358        p_msgq_id=DHL_OS_CreateMessageQueue("menuq", 0, NUM_MSGQ, sizeof(tDMG_Message));
1359        p_mtx=DHL_OS_CreateMutexSemaphore("menu mtx");
1360        p_sem_sync=DHL_OS_CreateBinarySemaphore("menu sem", 0, FALSE);
1361       
1362        if(menu_manage_proc)
1363                p_menu_manage_proc=menu_manage_proc;
1364        else
1365                p_menu_manage_proc=p_default_menu_manage_proc;
1366       
1367        DHL_OS_CreateTask((DHL_OS_TASKFUNCTION)p_menu_task, "t_menu", MENU_TASK_PRIO, MENU_STACK_SIZE, 0);
1368}
1369
1370
1371
1372
1373
1374#if COMMENT
1375__Debug__() {}
1376#endif
1377
1378void show_menu(int level)
1379{
1380        int i;
1381
1382        DHL_OS_Printf("---------------------------------\n");
1383        for(i=0; i<MAX_NUM_MENU; i++) {
1384                if(!p_pmenu_list[i]) continue;
1385                if(level==0 && p_pmenu_list[i]->status==eDMG_STATUS_EXIT) continue;
1386               
1387                DHL_OS_Printf("  id(0x%02x), Status(%s), below 0x%x, %s\n", p_pmenu_list[i]->id, 
1388                        p_pmenu_list[i]->status==eDMG_STATUS_ACTIVE?"A":p_pmenu_list[i]->status==eDMG_STATUS_INACTIVE?"I":
1389                        p_pmenu_list[i]->status==eDMG_STATUS_INVISIBLE?"H":"-",
1390                        p_pmenu_list[i]->pbelow ? p_pmenu_list[i]->pbelow->id : 0xff,
1391                        p_pmenu_list[i]->name);
1392               
1393        }
1394        if (s_trace_menu_id >= 0) 
1395                DHL_OS_Printf("menu trace: id %x\n", s_trace_menu_id);
1396        if (s_trace_menu_name[0])
1397                DHL_OS_Printf("menu trace keyword: '%s'\n", s_trace_menu_name);
1398        DHL_OS_Printf("---------------------------------\n");
1399}
1400
1401/* id¸¦ ÁöÁ¤ÇÏ¿© ƯÁ¤ menu¸¦ trace ÇÑ´Ù. */
1402void trace_menu_by_id(int id)
1403{
1404        s_trace_menu_id = id;
1405}
1406
1407/* ¸Þ´º À̸§ÀÇ ÀϺκРÀ» ÁöÁ¤ÇÏ¿© trace ÇÑ´Ù. */
1408void trace_menu_by_name(char *name)
1409{
1410        if (name && name[0] && strlen(name)<sizeof(s_trace_menu_name))
1411                strcpy(s_trace_menu_name, name);
1412        else
1413                s_trace_menu_name[0] = 0;
1414}
1415
1416
1417
1418
1419
1420/* end of file */
Note: See TracBrowser for help on using the repository browser.