source: svn/trunk/zasc/app/DST_WinManagerTask.cpp

Last change on this file was 2, checked in by phkim, 11 years ago

1.phkim

  1. revision copy newcon3sk r27
File size: 14.4 KB
Line 
1#include "DST_WinList.h"
2#include "DST_Window.h"
3#include "DST_WinManager.h"
4#include "DST_OSDImage.h"
5#include "DST_CommonAPI.h"
6#include "DST_SignalMonitor.h"
7
8static int gWinEventMsgQ = 0;
9static int gWinEventMsgQ_Count = 0;
10
11void DST_CreateBaseSystemWindow(SWinEventMsg event);
12
13void DST_CreateTestOSDWin(SWinEventMsg event);
14void DST_CreateEAWindow(SWinEventMsg event);
15
16void DST_CreateCaptionWin(SWinEventMsg event);
17void DST_CreateSuperImposeWin(SWinEventMsg event);
18// Muon2 Àü¿ë OSD
19void DST_CreateSignalMeterWin(SWinEventMsg event);
20void DST_CreateChannelEditWin(SWinEventMsg event);
21void DST_CreateLowBatteryWindow(SWinEventMsg event);
22void DST_CreateSplashScreenWindow(SWinEventMsg event);
23
24// Maya Àü¿ë
25void DST_CreateFMWin(SWinEventMsg event);
26void DST_CreateMayaMain(SWinEventMsg event);
27void DST_CreateMayaSub(SWinEventMsg event);
28void DST_CreateSetUpWizard(SWinEventMsg event);
29
30// miru
31void DST_CreateErrorWin(SWinEventMsg event);
32void DST_CreateAudioWindow(SWinEventMsg event);
33void DST_CreateEWSWin(SWinEventMsg event);
34void DST_CreateFactoryResetWin(SWinEventMsg event);
35void DST_CreateFactoryResetAskWin(SWinEventMsg event);
36
37void DST_CreateStationSearchWin(SWinEventMsg event);
38void DST_CreateLowBattery(SWinEventMsg event);
39void DST_CreateSplashWindow(SWinEventMsg event);
40
41void DST_CreateWinPasswordCheck(SWinEventMsg event);
42void DST_CreateWinPasswordChange(SWinEventMsg event);
43void DST_CreateWinPasswordConfirm(SWinEventMsg event);
44void DST_CreateAgeRating(SWinEventMsg event);
45void DST_CreateMainMenu(SWinEventMsg event);
46void DST_CreateMenu2Depth(SWinEventMsg event);
47void DST_CreateMenu3Depth(SWinEventMsg event);
48void DST_CreateMenu4Depth(SWinEventMsg event);
49void DST_CreateVolumeMuteWindow(SWinEventMsg event);
50void DST_CreateDirectTuneWindow(SWinEventMsg event);
51void DST_CreateSignalMeterWindow(SWinEventMsg event);
52void DST_CreateClosedCaptionHotWindow(SWinEventMsg event);
53void DST_CreatePowerDownCautionWin(SWinEventMsg event);
54void DST_CreateRFUpdateWindow(SWinEventMsg event);
55void DST_CreateDebugSQLWin(SWinEventMsg event);
56void DST_CreateDebugSQLSubWin(SWinEventMsg event);
57void DST_CreateFactoryWin(SWinEventMsg event);
58void DST_CreateDisplayModeWindow(SWinEventMsg event);;
59void DST_CreateEngineerMenuWin(SWinEventMsg event);
60void DST_CreateManualSearchWin(SWinEventMsg event);
61void DST_CreateCC708Win(SWinEventMsg event);
62void DST_CreateOTCDownloadFailResetWin(SWinEventMsg event);
63void DST_CreateOTCDownLoadingWin(SWinEventMsg event);
64void DST_CreateUpdateResetWin(SWinEventMsg event);
65void DST_CreateUpdateWin(SWinEventMsg event);
66
67DS_U8 DST_GetKeyCode();
68void DST_ResetKeyCode();
69
70// CC¿Í µ¿ÀÏ PlaneÀ» »ç¿ëÇϱâ À§ÇØ Àӽ÷ΠstaticÀ» Ç®¾î³õÀ½
71// ŽºÅ© ÅëÇÕÈÄ ´Ù½Ã staticÀ¸·Î µ¿ÀÛÇØ¾ß ÇÔ
72
73static void DST_BlockCopy(OSD_PIXEL_T *src, int x, int y, int w, int h)
74{
75        static bool bInit = false;
76        if (bInit == false)
77        {
78                DHL_GFX_Open();
79                bInit = true;
80        }
81        DHL_GFX_Draw(src,x,y,w,h);
82}
83
84// µÎ ¹Ú½ºÀÇ °øÅë ¿µ¿ªÀ» ±¸ÇÑ´Ù.
85static bool MakeCommonRect(DST_RECT A, DST_RECT B, DST_RECT *C)
86{
87        C->x= (A.x > B.x) ? A.x : B.x;
88        C->y= (A.y > B.y) ? A.y : B.y;
89        C->w= (A.x + A.w < B.x + B.w) ? (A.x + A.w - C->x) : (B.x + B.w - C->x);
90        C->h= (A.y + A.h < B.y + B.h) ? (A.y + A.h - C->y) : (B.y + B.h - C->y);
91        if (C->w <= 0 || C->h <= 0) return false;
92        return true;
93}
94static void WinMgrWinCreate(SWinEventMsg event)
95{
96        switch (event.data[0])
97        {
98                case WIN_ENGINEER_MODE:
99                        DST_CreateEngineerMenuWin(event);
100                        break;
101                       
102                case WIN_FACTORY_MODE:
103                        DST_CreateFactoryWin(event);
104                        break;
105                       
106                case WIN_DEBUG_SQL_SUB:
107                        DST_CreateDebugSQLSubWin(event);
108                        break;
109                       
110                case WIN_DEBUG_SQL:
111                        DST_CreateDebugSQLWin(event);
112                        break;
113
114                case WIN_RF_UPDATE:
115                        DST_CreateRFUpdateWindow(event);
116                        break;
117                       
118                case WIN_CLOSED_CAPTION_HOT:
119                        DST_CreateClosedCaptionHotWindow(event);
120                        break;
121                       
122                case WIN_SIGNAL_METER:
123                        DST_CreateSignalMeterWindow(event);
124                        break;
125                       
126                case WIN_MAIN_MENU:
127                        DST_CreateMainMenu(event);
128                        break;
129
130                case WIN_POWER_DOWN_CAUTION:
131                        DST_CreatePowerDownCautionWin(event);
132                        break;
133
134                case WIN_SUB_MENU_2DEPTH:
135                        DST_CreateMenu2Depth(event);
136                        break;
137
138                case WIN_SUB_MENU_3DEPTH:
139                        DST_CreateMenu3Depth(event);
140                        break;
141
142                case WIN_OTC_DOWNLOAD:
143                        DST_CreateOTCDownLoadingWin(event);
144                        break;
145
146                case WIN_OTC_DOWNLOAD_FAIL:
147                        DST_CreateOTCDownloadFailResetWin(event);
148                        break;
149                       
150                case WIN_UPDATE:
151                        DST_CreateUpdateWin(event);
152                        break;
153                case WIN_UPDATE_RESET:
154                        DST_CreateUpdateResetWin(event);
155                        break;
156
157                case WIN_BASIC:
158                        DST_CreateBaseSystemWindow(event);
159                        break;
160
161                case WIN_AUTO_SEARCH:
162                        DST_CreateAutoSearchWin(event);
163                        break;
164
165                case WIN_MANUAL_SEARCH:
166                        DST_CreateManualSearchWin(event);
167                        break;
168                       
169                case WIN_PROGRAM_GUIDE:
170                        DST_CreateProgramGuideWin(event);
171                        break;
172
173                case WIN_CHANNEL_LIST:
174                        DST_CreateChannelEditWin(event);
175                        break;
176
177                case WIN_CHANNEL_BANNER:
178                        DST_CloseWin(WIN_VOLUME);
179                        DST_CreateChannelBannerWindow(event);
180                        break;
181               
182                case WIN_DIRECT_TUNE:
183                        DST_CreateDirectTuneWindow(event);
184                        break;
185
186                case WIN_INFOR_BANNER:
187                        DST_CreateInforbannerWindow(event);
188                        break;
189
190                case WIN_FACTORY_RESET:
191                        DST_CreateFactoryResetWin(event);
192                        break;
193
194                case WIN_FACTORY_RESET_ASK:
195                        DST_CreateFactoryResetAskWin(event);
196                        break;
197
198                case WIN_VOLUME:
199                        DST_CreateVolumeWindow(event);
200                        break;
201
202                case WIN_VOLUME_MUTE:
203                        DST_CreateVolumeMuteWindow(event);
204                        break;
205
206                case WIN_AUDIO_HOT:
207                        DST_CreateAudioWindow(event);
208                        break;
209
210                case WIN_DISPLAY_MODE_HOT:
211                        DST_CreateDisplayModeWindow(event);
212                        break;
213                       
214                case WIN_CAPTION:
215                        DST_CreateCC708Win(event);
216                        break;
217
218                case WIN_ERROR:
219                        DST_CreateErrorWin(event);
220                        break;
221                       
222        }
223}
224
225static void WinMgrKeyProcess()
226{
227        static CWindow *pPrevWin = 0;
228        static DS_U8 ucPrevKey = 0;
229        static DS_U32 nPrevKeyTime = 0;
230        static bool bRepeat = false;
231        DS_U8 nKeyCode = DST_GetKeyCode();
232
233        if (nKeyCode == 0)  //۰¡ ¸±¸®Áî µÇ¸é 0ÀÌ µÈ´Ù.
234        {
235                pPrevWin = 0;
236                ucPrevKey = 0;
237                nPrevKeyTime = 0;
238                bRepeat = false;
239                return;
240        }
241
242        for (int i = 1; i < WIN_ID_MAX; i++)
243        {
244                CWindow *pWin = DST_GetWin((WinID)i);
245                if (pWin == 0) continue;
246                if (pWin->IsRegisterKey(nKeyCode) == false) continue;
247                pWin->ResetTimer(0);
248                // Repeat ۰¡ ¾Æ´Ñ ۵é
249                if (pWin->GetKeyDelay(nKeyCode)==0 || pWin->GetKeyRepeat(nKeyCode)==0)
250                {
251                        DST_ResetKeyCode();
252                        pWin->KeyInput(nKeyCode, false);
253                        nKeyCode = 0;
254                        break;
255                }
256                // Repeat ŰÀÇ Ã³À½ µ¿ÀÛ ½ÇÇà
257                if (pPrevWin != pWin || ucPrevKey != nKeyCode)
258                {
259                        pWin->KeyInput(nKeyCode, false);
260                        pPrevWin = pWin;
261                        ucPrevKey = nKeyCode;
262                        nPrevKeyTime = DST_OS_GetTickCount();
263                        bRepeat = false;
264                        break;
265                }
266                if (bRepeat == false)
267                {
268                        // Repeat ŰÀÇ µÎ¹øÂ° µ¿ÀÛ ½ÇÇà
269                        if (nPrevKeyTime > DST_OS_GetTickCount()) nPrevKeyTime = DST_OS_GetTickCount();
270                        if (DST_OS_GetTickCount() - nPrevKeyTime < pWin->GetKeyDelay(nKeyCode)) break;
271                        pWin->KeyInput(nKeyCode, true);
272                        nPrevKeyTime = DST_OS_GetTickCount();
273                        bRepeat = true;
274                }
275                else
276                {
277                        // Repeat ŰÀÇ ¼¼¹øÂ° ºÎÅÍ µ¿ÀÛ ½ÇÇà
278                        if (nPrevKeyTime > DST_OS_GetTickCount()) nPrevKeyTime = DST_OS_GetTickCount();
279                        if (DST_OS_GetTickCount() - nPrevKeyTime < pWin->GetKeyRepeat(nKeyCode)) break;
280                        nPrevKeyTime = DST_OS_GetTickCount();
281                        pWin->KeyInput(nKeyCode, true);
282                }
283                break;
284        }
285}
286
287static void WinMgrMessageProcess(SWinEventMsg event)
288{
289        switch (event.cmd)
290        {
291                case WM_WIN_CREATE:
292                        WinMgrWinCreate(event);
293                        break;
294
295                case WM_WIN_DELETE:
296                        {
297                                CWindow *pWin = DST_GetWin((WinID)event.data[0]);
298                                if (pWin) pWin->Close();
299                        }
300                        break;
301
302                default:
303                        for (int i= 1; i < WIN_ID_MAX; i++)
304                        {
305                                CWindow *pWin = DST_GetWin((WinID)i);
306                                if (pWin) pWin->DoOnMessage(event);
307                                }
308                        break;
309        }
310}
311static bool WinMgrSub()
312{
313        SWinEventMsg event;
314        DS_U32 retLen;
315        if (DST_OS_ReceiveMessage_Wait(gWinEventMsgQ, (DS_U32*)&event, sizeof(SWinEventMsg), &retLen, DST_OS_GetTicksPerSecond()/25) == noError) // ¸Þ½ÃÁö¸¦ ¹ÞÀº °æ¿ì ¸Þ½ÃÁö ó¸®
316        {
317                gWinEventMsgQ_Count--;
318                if (event.cmd == WM_MANAGER_CLOSE) return false;
319                WinMgrMessageProcess(event);
320        }
321        WinMgrKeyProcess();
322
323        for (int i= 1; i < WIN_ID_MAX; i++)
324        {
325                CWindow *pWin = DST_GetWin((WinID)i);
326                if (pWin == 0) continue;
327                switch (pWin->GetState())
328                {
329                        case 0: // Before Create
330                                pWin->DoShow();
331                                pWin->SetState(1);
332                                for (int j= 1; j < WIN_ID_MAX; j++)
333                                {
334                                        CWindow *pWin1 = DST_GetWin((WinID)j);
335                                        if (pWin1) pWin1->Show((WinID)i);
336                                }
337                                break;
338
339                        case 2: // Before Close
340                                pWin->UpdateScreen();
341                                for (int j= 1; j < WIN_ID_MAX; j++)
342                                {
343                                        CWindow *pWin1 = DST_GetWin((WinID)j);
344                                        if (pWin1) pWin1->Hide((WinID)i);
345                                }
346                                DST_RemoveWin((WinID)i);
347                                break;
348                }
349        }
350        // ŸÀÌ¸Ó Ã³¸®
351        for (int i= 1; i < WIN_ID_MAX; i++)
352        {
353                CWindow *pWin = DST_GetWin((WinID)i);
354                if (pWin == 0) continue;
355                // ŸÀÌ¸Ó Ã³¸®¿Í ±×¸®±âÀÇ µ¿±âÈ­?
356                if (pWin->ProcessTimer() == true) continue;
357        }
358
359        DST_RECT rectTemp =     DST_GetUpdateRegion();
360        if (rectTemp.w != 0 && rectTemp.h != 0)
361        {
362                static int imgBuffSize = 0;
363                static OSD_PIXEL_T *imgBuff = 0;
364                if (rectTemp.w * rectTemp.h > imgBuffSize)
365                {
366                        DST_OS_Free(&imgBuff);
367                        imgBuffSize = rectTemp.w * rectTemp.h;
368                        imgBuff = (OSD_PIXEL_T*)DST_OS_Malloc(imgBuffSize*sizeof(OSD_PIXEL_T));
369                }
370                memset(imgBuff,0, rectTemp.w * rectTemp.h*sizeof(OSD_PIXEL_T));
371                for (int i= WIN_ID_MAX - 2; i >=0 ; i--)
372                {
373                        CWindow *pWin = DST_GetWin((WinID)i);
374                        if (pWin== 0) continue;
375                        if (pWin->GetVisible() == false) continue;
376                        OSD_PIXEL_T *srcBuff = pWin->GetImgBuff();
377                        if (srcBuff == 0) continue;
378                        DST_RECT rectCommon;
379                        DST_RECT rectSrc = pWin->GetSize();
380                        if (MakeCommonRect(rectTemp, rectSrc, &rectCommon ) == false) continue;
381                        int srcStartX = rectCommon.x - rectSrc.x;
382                        if (srcStartX < 0) srcStartX = 0;
383                        int srcStartY = rectCommon.y - rectSrc.y;
384                        if (srcStartY < 0) srcStartY = 0;
385                        int desStartX = rectCommon.x - rectTemp.x;
386                        if (desStartX < 0) desStartX = 0;
387                        int desStartY = rectCommon.y - rectTemp.y;
388                        if (desStartY < 0) desStartY = 0;
389
390                        OSD_PIXEL_T *des = imgBuff + desStartY * rectTemp.w + desStartX;
391                        OSD_PIXEL_T *src = srcBuff + srcStartY * rectSrc.w + srcStartX;
392                        if (pWin->GetTransparent())
393                                {
394                                        for (int y = 0; y <     rectCommon.h; y++)
395                                        {
396                                                OSD_PIXEL_T* des1 = des;
397                                                OSD_PIXEL_T* src1 = src;
398                                                for (int x = 0; x < rectCommon.w; x++)
399                                                {
400                                                        OSD_PIXEL_T max = (sizeof(OSD_PIXEL_T) == 2) ? 0x0F : 0xFF;
401                                                        OSD_PIXEL_T sa,sr,sg,sb;
402                                                        DST_GetColor(*src1, &sa, &sr, &sg, &sb);
403                                                        OSD_PIXEL_T da,dr,dg,db;
404                                                        DST_GetColor(*des1, &da, &dr, &dg, &db);
405                                                        if (sa != 0) // Åõ¸íÀÌ ¾Æ´Ñ °æ¿ì¸¸ ±×¸°´Ù.
406                                                        {
407                                                                if (sa == max || da == 0) // ¼Ò½º°¡ ¿ÏÀüºÒÅõ¸íÀ̰ųª ¹è°æÀÌ Åõ¸íÀΰæ¿ì
408                                                                {
409                                                                        *des1 = *src1;
410                                                                }
411                                                                else // ¹ÝÅõ¸í
412                                                                {
413                                                                        // http://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending
414                                                                        OSD_PIXEL_T t = (da * (max-sa) + (max/2)) / max;
415                                                                        OSD_PIXEL_T a = sa + t;
416                                                                        if (a > max) a = max;
417                                                                        OSD_PIXEL_T r = ((sr * sa + dr * t) + (a/2)) / a;
418                                                                        OSD_PIXEL_T g = ((sg * sa + dg * t) + (a/2)) / a;
419                                                                        OSD_PIXEL_T b = ((sb * sa + db * t) + (a/2)) / a;
420                                                                        *des1 = DST_SetColor(a, r, g, b);
421                                                                }
422                                                        }
423                                                        des1++;
424                                                        src1++;
425                                                }
426                                                des += rectTemp.w;
427                                                src += rectSrc.w;
428                                        }
429                                }
430                        else
431                        {
432                                int yy = rectCommon.h;
433                                int nDataLength = rectCommon.w*sizeof(OSD_PIXEL_T);
434                                if (rectTemp.w == rectSrc.w)
435                                {
436                                        memcpy(des, src, nDataLength * yy);
437                                }
438                                else
439                                {
440                                        while (yy--)
441                                        {
442                                                memcpy(des, src, nDataLength);
443                                                des += rectTemp.w;
444                                                src += rectSrc.w;
445                                        }
446                                }
447                        }
448                }
449                DST_BlockCopy(imgBuff, rectTemp.x, rectTemp.y, rectTemp.w, rectTemp.h);
450                DST_ResetUpdateRegion();
451        }
452        return true;
453}
454
455
456bool bWinManagerReady = false;
457bool DST_IsWinManagerReady()
458{
459        return bWinManagerReady;
460}
461
462static void tWinMgr()
463{
464        OSD_PIXEL_T tmp=0;
465        DST_BlockCopy(&tmp, 0,0,1,1);
466        DST_CreateWin(WIN_BASIC);
467        bWinManagerReady = true;
468        while (1) WinMgrSub();
469}
470
471// À©µµ¿ì ¸Å´ÏÀú µð¹ö±× ÇÔ¼ö
472static void PrintWindowMsg(SWinEventMsg event)
473{
474#if 0
475        switch (event.cmd)
476        {
477                case WM_WIN_CREATE: DST_Printf("WM_WIN_CREATE\n"); break;
478                case WM_WIN_DELETE: DST_Printf("WM_WIN_DELETE\n"); break;
479                case WM_POWER_DOWN_ENTER: DST_Printf("WM_POWER_DOWN_ENTER\n"); break;
480                case WM_SOURCE_FORMAT_DONE: DST_Printf("WM_SOURCE_FORMAT_DONE\n"); break;
481                case WM_MANAGER_CLOSE: DST_Printf("WM_MANAGER_CLOSE\n"); break;
482                case WM_SIGNAL_STATE: DST_Printf("WM_SIGNAL_STATE\n"); break;
483                case WM_MTS_UPDATE: DST_Printf("WM_MTS_UPDATE\n"); break;
484                case WM_MENU_LANGUAGE_CHANGE: DST_Printf("WM_MENU_LANGUAGE_CHANGE\n"); break;
485                case WM_CT_MSG: DST_Printf("WM_CT_MSG\n"); break;
486                case WM_FACTORY_KEYPAD: DST_Printf("WM_FACTORY_KEYPAD\n"); break;
487        }
488#endif
489}
490
491void DST_SendWindowEventWithOnlyCmd(int command)
492{
493        SWinEventMsg event;
494        memset(&event, 0, sizeof(SWinEventMsg));
495        event.cmd=command;
496        DST_SendWindowEvent(event);
497}
498
499void DST_SendWindowEvent(SWinEventMsg event)
500{
501        if (!gWinEventMsgQ) return;
502        PrintWindowMsg(event);
503        if (gWinEventMsgQ_Count > 100)
504        {
505                DST_Printf("gWinEventMsgQ_Count = %d\n", gWinEventMsgQ_Count);
506                return;
507        }
508        gWinEventMsgQ_Count++;
509
510#if 0
511        if (gWinEventMsgQ_Count > 100)
512        {
513                DST_Printf("DST_SendWindowEvent - event.cmd = %ld gWinEventMsg Q_Count = %d\n", event.cmd, gWinEventMsgQ_Count);
514                DST_Reset((char*)__func__);
515        }
516#endif
517
518        DST_OS_SendMessage(gWinEventMsgQ, (DS_U32 *)&event, sizeof(SWinEventMsg));
519}
520
521void DST_CreateWin(WinID nID, WinID nParentID, unsigned char nParameter1 , unsigned char nParameter2, unsigned char nParameter3, unsigned char nParameter4)
522{
523        if (nID == WIN_NULL) return;
524        SWinEventMsg event;
525        memset(&event, 0, sizeof(SWinEventMsg));
526        event.cmd = WM_WIN_CREATE;
527        event.data[0] = nID;
528        event.data[1] = nParentID;
529        event.data[2] = nParameter1;
530        event.data[3] = nParameter2;
531        event.data[4] = nParameter3;
532        event.data[5] = nParameter4;
533        DST_SendWindowEvent(event);
534}
535
536void DST_CreateWin2(WinID nID, WinID nParentID, unsigned long nParameter1)
537{
538        SWinEventMsg event;
539        memset(&event, 0, sizeof(SWinEventMsg));
540        event.cmd = WM_WIN_CREATE;
541        event.data[0] = nID;
542        event.data[1] = nParentID;
543        event.data32[1] = nParameter1;
544        DST_SendWindowEvent(event);
545}
546
547void DST_CloseWin(WinID nID)
548{
549        SWinEventMsg event;
550        memset(&event, 0, sizeof(SWinEventMsg));
551        event.cmd = WM_WIN_DELETE;
552        event.data[0] = nID;
553        DST_SendWindowEvent(event);
554}
555
556void DST_WinManagerInit(void)
557{
558        static int WinMngTaskID = 0;
559        if (WinMngTaskID != 0) return;
560        DST_RemoveAllWindows();
561        DST_ResetUpdateRegion();
562        gWinEventMsgQ = DST_OS_CreateMessageQueue("gWinEventMsgQ", 0/*OS_MSGQ_FIFO*/, 300/*100*/, sizeof(SWinEventMsg));
563        WinMngTaskID = DST_OS_SpawnTask((void(*)(void *))tWinMgr, (char*)"tWinMgr", APP_TASK_PRIO_WIN_MGR, WIN_MGR_TASK_STACKSIZE,  0);
564        T();
565}
Note: See TracBrowser for help on using the repository browser.