source: svn/newcon3bcm2_21bu/dst/app/src/Function/App_Fnc_DigitKeyProc.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: 9.9 KB
Line 
1/****************************************************************************
2* NAME: App_Fnc_DigitKeyProc.c
3*----------------------------------------------------------------------------
4* Copyright (c) DIGITAL STREAM Technology Inc.
5*----------------------------------------------------------------------------
6* CREATED_BY: Yong Dae Park
7* CREATION_DATE: 2009/09/08
8* $Author: x2silo $
9* $Revision: 1.1 $
10* $Date: 2009/07/08 15:08:26 $
11*----------------------------------------------------------------------------
12* PURPOSE:
13*       -
14*****************************************************************************/
15
16/*_____ I N C L U D E __________________________________________*/
17
18#include "App_Main.h"
19#include "App_Fnc_Common.h"
20
21#include "App_Fnc_DigitKeyProc.h"
22#include "App_Fnc_ChTune.h"
23#include "App_Fnc_Power.h"
24
25#include "DMG_Menu.h"
26#include "App_Res_Resources.h"
27
28
29
30
31
32/*_____ D E F I N I T I O N ____________________________________*/
33
34#if COMMENT
35_____DbgPrint_____(){}
36#endif
37
38DHL_MODULE("@f_dgk", 0);
39
40
41
42
43
44#if COMMENT
45____Config____(){}
46#endif
47
48#define SUPPORT_INTELLITUNE 0
49        // cafrii 060721 -> 0
50        // QIÀÇ ¿äûÀ¸·Î ÀÏ´Ü ¸·À½.
51
52        // ±â´É ¼³¸í:
53        // »ç¿ëÀÚÀÇ ¼ýÀÚ ÀÔ·ÂÀÌ ¾ÆÁ÷ ¿Ï·áµÇÁö´Â ¾Ê¾Ò´õ¶óµµ ÇöÀç ÀÔ·ÂµÈ ¼ýÀÚ Á¤º¸¸¸À¸·Î
54        // ÀÔ·Â Á¾·á°¡ È®½Ç½Ã µÇ´Â °æ¿ì ¹Ì¸® tuning¿¡ µé¾î°¡´Â ±â´É.
55        //
56        // ¿¹: ¼ýÀÚ 12¸¦ ´­·¶´Âµ¥ ä³Î DB¿¡ 12·Î ½ÃÀÛÇϴ ä³ÎÀÌ ´Ü Çϳª ¹Û¿¡ ¾ø´Ù¸é
57        //  timeout ¹× OK ۰¡ ´­¸®Áö ¾Ê¾Æµµ ±×³É Æ©´× ½ÃÀÛÇØ ¹ö¸°´Ù.
58
59
60
61
62
63#if COMMENT
64____Types____(){}
65#endif
66
67
68
69
70
71#if COMMENT
72____Variables____(){}
73#endif
74
75//int g_DigitKeyTimeoutMs = 3000;
76        // timeout µÇ´Â ½Ã°£.. ´ÜÀ§: millisec
77        // »õ·Î¿î ¹æ½Ä¿¡¼­´Â timeout üũ¸¦ caller°¡ ¼öÇàÇÑ´Ù.
78
79
80BOOL    g_DrfTunning;
81        // TRUE À̸é DRF Æ©´×À» À§ÇÑ ¼ýÀÚ ÀÔ·ÂÀÌ ÁøÇà ÁßÀÓ.
82        // »ç¿ëÀÚ°¡ DOT ۸¦ ¸ÕÀú ´©¸£¸é ÇØ´ç ä³Î¿¡ ´ëÇØ Manual ScanÀ» ¼öÇàÇÑ´Ù.
83        // ÀÌ·² °æ¿ì DOT۸¦ ´©¸£´Â ¼ø°£ manual scanÀÓÀ» ³ªÅ¸³»´Â OSD°¡ Ç¥½ÃµÇ°í,
84        // ÀÌ º¯¼ö°¡ set µÈ´Ù.
85        // ¼ýÀÚ Á¶ÇÕÀÌ ¿Ï·áµÇ¸é manual scanÀ» ÁøÇàÇÑ´Ù.
86
87
88// ¾ÆÁ÷ ÀÔ·ÂÀÌ ¾ÈµÇ¾î ÀÖ´Â »óŶó¸é -1ÀÇ °ªÀ» °¡Áö°í ÀÖÀ¸¸ç
89// ÀÔ·ÂÀÌ µÇ¸é 0 ÀÌ»óÀÇ °ªÀ» °®´Â´Ù.
90
91int g_DigitMajor = -1;
92int g_DigitMinor = -1;
93        // °¢°¢ major, minor ÀÔ·Â °ªÀ» ÀǹÌ.
94
95BOOL g_bDigitDot = FALSE;
96        // dot ۰¡ ÀԷµǸé TRUE°¡ µÈ´Ù.
97
98BOOL g_bDigitKeyReadyToTune;
99        // tune ÇÒ Áغñ°¡ µÇ¸é TRUE.
100        // ±âÁ¸ ¹æ½ÄÀº Á¶°ÇÀÌ µÇ¸é ¹Ù·Î tuning ÀÛ¾÷¿¡ µé¾î°¬À¸³ª,
101        // »õ ¹æ½Ä¿¡¼­´Â ä³Î ¹øÈ£°¡ ¿Ï¼ºÀÌ µÇ¾ú´Ù´Â »ç½Ç¸¸À» ¾Ë·ÁÁÖ°í ½ÇÁ¦ Æ©´×Àº UIÃøÀÇ expliciteÇÑ API call¿¡ ÀÇÇØ °³½ÃÇÔ.
102
103UINT32 g_DigitTickLastUpdated;
104        // ¸¶Áö¸·À¸·Î digit key°¡ ÀÔ·ÂµÈ ´ç½ÃÀÇ tick ½Ã°£.
105        // ÀÏÁ¤ ½Ã°£ÀÌ Áö³ª¸é timeoutÀÌ µÇ¾î tuningÀÌ ½ÃÀ۵ȴÙ.
106       
107
108
109
110
111/*_____ F U N C T I O N ________________________________________*/
112
113#if COMMENT
114____Functions____(){}
115#endif
116
117void p_print_drf(void)
118{
119        char str[40];
120       
121        str[0] = 0;
122
123        if (g_DrfTunning)
124                sprintf(str+strlen(str), "RF ");
125               
126        if (g_DigitMajor >= 0)
127        {
128                sprintf(str+strlen(str), "%d", g_DigitMajor);
129               
130                if (g_bDigitDot)
131                {
132                        strcat(str, ".");
133                       
134                        if (g_DigitMinor >= 0)
135                        {
136                                sprintf(str + strlen(str), "%d", g_DigitMinor);
137                        }
138                }
139        }
140
141        // µð¹ö±× â¿¡ Ç¥½ÃµÇ´Â ¸Þ½ÃÁö¿Í OSD banner¿¡ Ç¥½ÃµÇ´Â ¼ýÀÚ°¡ °°ÀºÁö È®ÀÎ ÇÒ °Í..
142        App_PrintTextMessageBox(str, 20);
143}       
144       
145
146void p_clear_ch_info(void)
147{
148        g_DigitMajor = -1;
149        g_DigitMinor = -1;
150       
151        g_bDigitDot = FALSE;
152        g_bDigitKeyReadyToTune = FALSE;
153        g_DrfTunning = FALSE;
154}
155
156
157static void p_digital_key_tune_start(void)
158{
159        // channel tune..
160        BOOL bDrfTunning = g_DrfTunning;
161       
162        int major = g_DigitMajor, minor = g_DigitMinor;
163                // ¾Æ·¡ banner clear ÇÒ ¶§ Áö¿öÁö¹Ç·Î ¹Ì¸® backup
164       
165        dprint(0, "$$$$$$$$ Digit Key tuning:  Major %d, dot %d, Minor %d, drf %d\n",
166                                        g_DigitMajor, g_bDigitDot, g_DigitMinor, g_DrfTunning);
167                //
168                // ÀÌ ÀüÀÇ channel tuningÀÌ ¾ÆÁ÷ ÁøÇàÁßÀε¥,
169                // tuningÀÌ ³Ê¹« ´À·Á¼­ ¾ÆÁ÷ banner°¡ ÀÖÀ» ¼öµµ ÀÖ´Ù.
170                // ÀÌ ¶§ »ç¿ëÀÚ°¡ digit key¸¦ ´©¸£¸é
171                // »ç¿ëÀÚÀÇ Àǵµ°¡ ¿ì¼±½Ã µÇ¾î ÀÌÀü ÀÛ¾÷À» cancel ÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù.
172
173        if (bDrfTunning)
174        {
175                //iskang 070830.
176                //drf tunning¿¡¼­ majorÀԷ¾øÀÌ tunningÀ» ½ÃµµÇÒ ¶§..
177                //ÇöÀç ä³ÎÀ» À¯ÁöÇÑ´Ù..
178                // --> ¹«½¼ ÀǹÌÀÎÁö ¸ð¸£°ÚÀ½.
179               
180                DST_CURCHANNEL cur_ch;
181               
182                App_Ucm_GetCurChInfo(&cur_ch);
183
184                if( (cur_ch.nChannelType == 0 && (major < APP_CHTUNE_AIR_RF_MIN || major > APP_CHTUNE_AIR_RF_MAX)) ||
185                        (cur_ch.nChannelType == 1 && (major < APP_CHTUNE_CABLE_RF_MIN || major > APP_CHTUNE_CABLE_RF_MAX))  )
186                {
187                        // chjeon 071116 add.
188                        // À߸øµÈ RF·Î Æ©´× ½ÃµµÇÏ´Â °æ¿ì return.
189                        dprint(0, "!! rf %d invalid\n", major);
190                        return;
191                }
192
193#if SUPPORT_UDCP
194                if (App_Op_IsOobMode())
195                {
196                        // OOB µ¿ÀÛ ¸ðµå¿¡¼­´Â RF ¹øÈ£¿Í match µÇ´Â ä³ÎÀ» DB¿¡¼­ °Ë»öÇÑ´Ù.
197                        // ÀÏÄ¡ÇÏ´Â °ÍÀÌ ¾øÀ¸¸é ¹«½ÃµÊ.
198                        //
199                        // todo.
200                        // À§ ÇÔ¼ö¸¦ OP_STATE üũ ÇÔ¼ö·Î º¯°æÇØ¾ß ÇÔ. ÇöÀç´Â °ü·Ã ÇÔ¼ö°¡ ¾ÆÁ÷ commit ¾ÈµÇ¾î¼­
201                        // ±âÁ¸ ÇÔ¼ö »ç¿ë..
202
203                        int uid = App_Ucm_FindChannelByRF(major);
204                        if (uid < 0) {
205                                dprint(0, "!! channel with rf %d not found\n", major);
206                                // »ç¿ëÀÚ°¡ À߸ø ÀÔ·Â Çß´Ù¸é ±×³É Á¶¿ëÈ÷ ¹«½ÃÇϵµ·Ï ÇÏÀÚ.
207                                // "NOT FOUND" °°Àº banner¸¦ ¶ç¿ì´Â °Ô ÁÁÀ»±î?
208
209                                DMG_SetMenuParam1(MID_CH_BANNER, DMG_MAKEWORD(MPARAM_CH_BANNER_CUSTOM, CUSTOM_CHB_MSG_NOT_FOUND));
210
211                                // DMG_MenuStart º¸´Ù´Â Á» ´õ È¿À²ÀûÀÌ´Ù. ÇØ´ç ºÎºÐ¸¸ update ÇϹǷÎ..
212                                DMG_MenuUpdate(MID_CH_BANNER, 0);
213                        }
214                        else {
215                                App_TuneChannelByUid(uid);
216                        }
217                }
218                else {
219                        // INB µ¿ÀÛ ¸ðµå¿¡¼­´Â ÁöÁ¤ÇÑ RF ¹øÈ£·Î ¼öµ¿ ä³Î °Ë»öÀ» ¼öÇàÇÑ´Ù.
220                        dprint(2, "manual scan, rf %d..\n", major);
221                        App_ChTuneManualScan(major);
222                }
223#else
224                        // RF Tune ¼öÁ¤
225                        // 2012.11.15 megakiss
226                        // ÇöÀç RF¸¦ ÁöÁ¤ÇÏ¸é ¹«½Ã
227                        // ½ºÄµµÈ RF¸¦ ÁöÁ¤Çϸé ù¹øÂ° ä³Î·Î Æ©´× (ÀÌ·¸°Ô ÇØ¾ß Skip Á¤º¸µîÀÌ À¯ÁöµÊ)
228                        // ½ºÄµ ¾È µÈ RF¸¦ ÁöÁ¤Çϸé RF Æ©´×
229                        if (cur_ch.nRF != major) // ÇöÀç RF¿Í ´Ù¸¥ °æ¿ì¿¡¸¸ µ¿ÀÛ
230                        {
231                                int i, uid = -1;
232                                DMW_MSC_LockUcm();
233                                for (i=0; i<g_UCM_number; i++) 
234                                {
235                                        if (g_UCM[i].RF != major) continue;
236                                        if (g_UCM[i].hidden != 0) continue;
237                                        if (g_UCM[i].scrambled != 0) continue;
238                                        if (g_UCM[i].disabled != 0) continue;
239                                        uid = g_UCM[i].Uid;
240                                        break;
241                                }
242                                DMW_MSC_UnlockUcm();
243                                if (uid < 0) // ½ºÄµ ¾ÈµÈ RF¶ó¸é RF Æ©´×
244                                {
245                                        App_ChTuneQuickScanAndTune(major, 0, APP_QUICKSCAN_DRF);
246                                }
247                                else // ÇØ´ç RFÀÇ Ã¹¹øÂ° ä³Î·Î Æ©´×
248                                {
249                                        App_TuneChannelByUid(uid);
250                                }
251                        }
252#endif // #if SUPPORT_UDCP
253
254        }       
255        else
256        {
257                App_ChTuneByDigitKey(major, minor);
258        }       
259        p_clear_ch_info();
260}
261
262
263static void p_digital_key_ready()
264{
265        // ±âÁ¸ ¹æ½Ä.. ÀÌ ¸ðµâ¿¡¼­ Á÷Á¢ Æ©´×..
266        //p_digital_key_tune_start();
267
268        // »õ ¹æ½Ä.. caller°¡ È®ÀÎ ÇÑ ÈÄ Á÷Á¢ tune start Çϵµ·Ï..
269        g_bDigitKeyReadyToTune = TRUE;
270}
271
272       
273//  p_digital_key_enqueue
274//
275//  ÀÔ·ÂµÈ key code¸¦ digit queue¿¡ ³Ö°í ó¸®ÇÑ´Ù.
276//  deterministic ÇÏ°Ô µÇ¸é ¹Ù·Î ½ÇÇà¿¡ ¿Å±ä´Ù.
277//
278static void p_digital_key_enqueue(APP_DIGITKEY_CODE key)
279{
280        BOOL bRefreshNeeded = FALSE;
281        int digit;
282       
283        // g_bDigitDot ÀÌ ÀԷµÇÁö ¾ÊÀº »óÅ¿¡¼­´Â °è¼Ó Major °ª¿¡ Ãß°¡µÈ´Ù.
284       
285        // DOT°¡ ÀÔ·ÂµÇ°í ³ª¸é Minor °ª¿¡ Ãß°¡µÈ´Ù.
286       
287        if (key == APP_DIGITKEY_DOT)  // DOT
288        {
289                if (g_DrfTunning)  // DRF ÀÔ·ÂÀÌ ÀÌ¹Ì ÁøÇà ÁßÀÎ °æ¿ì
290                {
291                        // major°¡ ´­·ÁÁ® ÀÖ´Ù¸é ¹Ù·Î tuning ½ÃÀÛÇÑ´Ù.
292                        if (g_DigitMajor > 0) {
293                                p_print_drf();
294                                p_digital_key_ready();
295                                return;
296                        }
297                        // major°¡ ¾ÆÁ÷ ÀÔ·Â ½ÃÀÛ ¾ÈµÇ¾ú°Å³ª, 0À̶ó¸é dot Ű ¹«½Ã.
298                        return;
299                }
300
301                if (g_DigitMajor < 0)
302                {
303                        // »õ·Ó°Ô DRF Æ©´× ½ÃÀÛ.
304                        g_DrfTunning = TRUE;
305                        bRefreshNeeded = TRUE;
306                }       
307                else
308                if (g_bDigitDot == FALSE) 
309                {
310                        g_bDigitDot = TRUE;
311                        bRefreshNeeded = TRUE;
312
313                        // rule:
314                        // 1008 º¸´Ù Å« ¼ýÀÚ´Â OnePartChannel ¹øÈ£·Î ÀνĵǹǷÎ
315                        // ÀÌ °æ¿ì minor ±¸ºÐ Ű(dot)´Â Àǹ̰¡ ¾øÀ¸¹Ç·Î SEL ¹öư°ú µ¿ÀÏÇÏ°Ô µ¿ÀÛÇÑ´Ù.
316                        // (Æ©´× ÀýÂ÷¸¦ ½ÃÀÛÇÑ´Ù.)
317                        //
318                        if (g_DigitMajor > 1008) {
319                                dprint(0, "$$ one part digits completed. tune now..\n");
320                                p_print_drf();
321                                p_digital_key_ready();
322                                return;
323                        }
324
325                        // rule:
326                        // 16383 º¸´Ù Å« ¼ýÀÚ´Â Two-part Major ¹øÈ£µµ,
327                        // One-part Major ¹øÈ£µµ ¾Æ´Ï¹Ç·Î ¹Ù·Î ¹«½ÃµÈ´Ù.
328                        //
329                        if (g_DigitMajor > 16383) {
330                                dprint(0, "$$ major exceed limit. cancelled\n");
331                                p_clear_ch_info();
332                                return;
333                        }
334                }
335               
336                // ÀÌ¹Ì DOT °¡ ÀԷµǾî ÀÖ´Â °æ¿ì´Â ±×³É Ű ¹«½Ã.. ´ÜÁö timeout ¸¸ ¿¬Àå
337               
338                g_DigitTickLastUpdated = DHL_OS_GetMsCount();
339               
340        }
341        else if (key >= APP_DIGITKEY_0 && key <= APP_DIGITKEY_9)
342        {
343                digit = (int)key;
344               
345                if (!g_bDigitDot)  // DOT°¡ ¾ÆÁ÷ ÀÔ·ÂÀÌ ¾ÈµÈ »óŶó¸é major ¼ýÀÚ¿¡ ´õÇØÁ®¾ß ÇÑ´Ù.
346                {
347                        if (g_DigitMajor < 0)  // óÀ½ ÀÔ·Â..
348                                g_DigitMajor = digit;
349                        else
350                                g_DigitMajor = g_DigitMajor * 10 + digit;
351
352                        bRefreshNeeded = TRUE;
353
354                        if (g_DigitMajor > 16383) {
355                                dprint(0, "$$ major exceed limit. cancelled\n");
356                                p_clear_ch_info();
357                                return;
358                        }
359
360                }
361                else // minor ¼ýÀÚ..
362                {
363                        if (g_DigitMinor < 0)
364                                g_DigitMinor = digit;
365                        else
366                        {
367                                g_DigitMinor = g_DigitMinor * 10 + digit;
368                        }
369                        bRefreshNeeded = TRUE;
370
371                        if (g_DigitMinor >= 100) {
372                                // ¼¼ÀÚ¸® ÀÌ»óÀº ¾îÂ¥ÇÇ ´õ Ãß°¡ ÀÔ·ÂÀÌ ¾ÈµÇ¹Ç·Î ¹Ù·Î Æ©´× ½ÃÀÛ..
373                                p_print_drf();
374                                p_digital_key_ready();
375                                return;
376                        }
377                }
378               
379                g_DigitTickLastUpdated = DHL_OS_GetMsCount();
380        }
381       
382        dprint(5, "info : bRefreshNeeded -> %d\n", bRefreshNeeded);
383        //if (bRefreshNeeded)
384        p_print_drf();
385}
386
387
388
389
390
391#if COMMENT
392____APIs____(){}
393#endif
394
395void App_DigitKeyProcess(APP_DIGITKEY_CODE code)
396{
397        if((code==APP_DIGITKEY_DOT) || (code>=APP_DIGITKEY_0 && code<=APP_DIGITKEY_9))
398                p_digital_key_enqueue(code);
399       
400        // key clear µ¿ÀÛ ¾ÈÇÏ´ø ¹ö±×.. ¼öÁ¤..
401        else if(code == APP_DIGITKEY_CLEAR)
402                p_clear_ch_info();
403}
404
405
406void App_DigitKeyGetInfo(App_DigitKeyParam *pparam)
407{
408        pparam->major=g_DigitMajor;
409        pparam->minor=g_DigitMinor;
410        pparam->is_dot=g_bDigitDot;
411        pparam->is_drf_tuning=g_DrfTunning;
412        pparam->last_updated=g_DigitTickLastUpdated;
413        pparam->is_ready=g_bDigitKeyReadyToTune;
414}
415
416
417void App_DigitKeyTuneStart(void)
418{
419        p_digital_key_tune_start();
420       
421}
422
423
424
425
426
427/* end of file */
Note: See TracBrowser for help on using the repository browser.