source: svn/newcon3bcm2_21bu/dst/app/src/Function/App_Fnc_AutoScan.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: 32.4 KB
Line 
1/****************************************************************************
2* NAME: App_Fnc_AutoScan.c
3*----------------------------------------------------------------------------
4* Copyright (c) DIGITAL STREAM Technology Inc.
5*----------------------------------------------------------------------------
6* CREATED_BY: Chan Hun Jeon
7* CREATION_DATE: 2009/09/08
8* $Author: chjeon $
9* $Revision: 1.1 $
10* $Date: 2009/07/08 15:08:26 $
11*----------------------------------------------------------------------------
12* PURPOSE:
13*       - implement autoscan API
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_Audio.h"
22#include "App_Fnc_Video.h"
23#include "App_Fnc_ChTune.h"
24#include "App_Fnc_EPG.h"
25
26#include "DMG_Menu.h"
27#include "App_Res_Resources.h"
28
29
30/*_____ D E F I N I T I O N ____________________________________*/
31
32#if COMMENT
33_____DbgPrint_____(){}
34#endif
35
36DHL_MODULE("@f_scn", 0);
37
38
39
40
41
42#if COMMENT
43____Config____(){}
44#endif
45
46#define TIMER_DELAYED_UID_TUNE 3199
47
48#define  CS_DETECT_THRESHOLD    5 
49        // Cable System Score Threshold for Detection
50        // ÀÛ¾÷Áß, Standard °£¿¡ ÀÌ Á¡¼ö ÀÌ»ó Â÷À̳ª¸é °Ë»ö Á¾·á.
51        //
52
53#define N_AIR_DEMOD 1
54
55#define MAX_CABLE_DEMOD 3
56
57#define NEO_REGISTER_DEBUG_SYMBOL 0
58
59
60// ¾Æ·¡ ¿É¼ÇµéÀº DHL FE API¿¡¼­ auto ¸ðµå Æ©´×À» Áö¿øÇÒ °æ¿ì ÇØ´ç ±â´ÉÀ» »ç¿ëÇÒ °ÍÀÎÁö ¼³Á¤ÇÑ´Ù.
61// ÀÌ ±â´ÉµéÀº FE platform¿¡ µû¶ó¼­ Áö¿øÇÒ ¼öµµ, Áö¿øÇÏÁö ¾ÊÀ» ¼öµµ Àִµ¥,
62// ¼³·É ¿©±â¼­ prefer ON ÇÏ´õ¶óµµ platform¿¡¼­ Áö¿øÇÏÁö ¾ÊÀ¸¸é ¾Æ¹«·± Àǹ̰¡ ¾ø´Ù.
63//
64#define PREFER_DEMOD_CABLE_AUTO 1
65#define PREFER_DEMOD_QAM_AUTO 1
66
67
68
69
70
71#if COMMENT
72____Types____(){}
73#endif
74
75typedef struct
76{
77        char *name;        // demodulation name for debug
78       
79        tDHL_Demod mod;  // µå¶óÀ̹ö¿¡¼­ »ç¿ëÇÏ´Â Demod »ó¼ö °ª
80       
81        int timeout_in_ms; //
82       
83} DemodDescriptor;
84
85
86#define MAX_SUPPORTED_DEMOD 5
87
88
89// Cable systemÀ» detect Çϱâ À§ÇØ ÇÊ¿äÇÑ ÀÚ·áµé.
90// ÀÌ °ªµéÀº °¢ ScanTune ÇÒ ¶§¸¶´Ù ±× °á°ú¿¡ µû¶ó ÀûÀýÈ÷ °»½ÅµÈ´Ù.
91//
92typedef struct 
93{
94        int score_std, score_hrc, score_irc;
95
96        int last_successful_mod;
97
98        DemodDescriptor demod[MAX_SUPPORTED_DEMOD];
99        int n_demod;
100} AppScanContext;
101
102
103
104
105
106#if COMMENT
107____Variables____(){}
108#endif
109
110static AppScanContext g_AppScanContext;
111
112int g_Timeout_AutoscanLock;
113        // cafrii 060714 add
114        // timeout override only for autoscan..
115        // if 0, default timeout will be used.
116
117
118static BOOL b_stt_gathering;
119static BOOL b_stt_set;
120
121/*_____ F U N C T I O N ________________________________________*/
122
123#if COMMENT
124____Function____(){}
125#endif
126
127void App_Autoscan_RecoverLastChannel(void);
128
129/*
130        FE¿¡¼­ VSB¸¸ Áö¿øÇÏ´ÂÁö, QamAuto¸¦ Áö¿øÇÏ´ÂÁö µîÀº platform¿¡ µû¶ó ´Þ¶óÁø´Ù.
131       
132        °ú°Å¿¡´Â °¢ platform¿¡ ¸Â°Ô °íÁ¤µÈ Å×À̺íÀ» »ç¿ëÇߴµ¥,
133        ÀÌÁ¦´Â DHLÀÇ capability query±â´ÉÀ» ÀÌ¿ëÇÏ¿© µ¿ÀûÀ¸·Î »ý¼ºÇϵµ·Ï ÇÑ´Ù.
134
135        ´ÜÀÏ tuner¸¸À» °¡Á¤ÇÑ´Ù.
136*/
137
138
139#define APPEND_DEMOD_TABLE(tbl, vname, vmode, timeout) do { \
140                DemodDescriptor *p = tbl; \
141                p->name = (vname); \
142                p->mod = (vmode); \
143                p->timeout_in_ms = (timeout); \
144        } while(0)
145
146       
147static void AppScan_GenerateDemodTable(AppScanContext *ctx, BOOL bCable)
148{
149        DHL_RESULT dhr;
150        UINT32 cap;
151        int i;
152       
153        DemodDescriptor ddt[MAX_SUPPORTED_DEMOD];
154        int n_dd = 0;
155
156        dprint(2, "generating demod table for %s mode..\n", bCable ? "cable" : "air");
157
158       
159        dhr = DHL_FE_GetDeviceInfo(DEFAULT_TUNER_ID, eDHL_FE_DEV_CAPABILITY_1, &cap);
160        if (dhr != DHL_OK) {
161                dprint(0, "!! dev cap query err %d\n", dhr);
162                DHL_ASSERT(FALSE, "");
163        }
164       
165        dprint(2, "   fe_cap info from dhl: 0x%x\n", cap);
166
167        //------- terrestral vsb and ntsc
168        if (!bCable) 
169        {
170                //------- vsb
171                if (cap & eDHL_TUCAP_VSB) {
172                        APPEND_DEMOD_TABLE(&ddt[n_dd], "8VSB", eDHL_DEMOD_8VSB, DEMOD_TIMEOUT_AIR_VSB);
173                        n_dd++;
174                }
175                //------- ntsc
176                if (cap & eDHL_TUCAP_ANALOG) {
177                        APPEND_DEMOD_TABLE(&ddt[n_dd], "NTSC", eDHL_DEMOD_NTSC, DEMOD_TIMEOUT_AIR_NTSC);
178                        n_dd++;
179                }
180                goto gen_end;
181        }
182
183
184        if(App_GetEnableCableQam()) {//when support cable qam
185               
186                //------- cable auto
187#if PREFER_DEMOD_CABLE_AUTO
188                // tDHL_TuerCapBits ºñÆ® üũ.
189                // °¡Àå ¹üÀ§°¡ Å« °ÍºÎÅÍ..
190                if (cap & eDHL_TUCAP_CABLEAUTO) {
191                        APPEND_DEMOD_TABLE(&ddt[n_dd], "CableAuto", eDHL_DEMOD_AUTODETECT, DEMOD_TIMEOUT_CABLE_AUTO);
192                        n_dd++;
193                        goto gen_end;
194                }
195#endif
196
197                // ÄÉÀÌºí¿¡¼­´Â ¾Æ¹«·¡µµ QAM ±â´ÉÀÌ VSB ±â´Éº¸´Ù ´õ Áß¿äÇϹǷÎ,
198                // Cable demod¸¦ ¾Õ¿¡ À§Ä¡½ÃŲ´Ù. »ç½Ç Å« ¼º´É Â÷ÀÌ´Â ¾ø´Ù.
199
200                //------- cable qam
201#if PREFER_DEMOD_QAM_AUTO
202                if (cap & eDHL_TUCAP_QAMAUTO) {
203                        APPEND_DEMOD_TABLE(&ddt[n_dd], "QamAuto", eDHL_DEMOD_QAM_AUTO, DEMOD_TIMEOUT_QAM_AUTO);
204                        n_dd++;
205                }
206                else 
207#endif
208                if (cap & eDHL_TUCAP_QAM) {
209                        // ¸¹Àº ¼öÀÇ cable ȯ°æ¿¡¼­ 256 qam ÀÌ ¿ì¼± »ç¿ëµÇ°í ÀÖÀ¸¹Ç·Î ¾Õ¿¡ µÒ.
210                        // autoscan ÇÒ ¶§¿¡´Â ¸¶Áö¸· ¼º°øÇÑ demod¸¦ ±â¾ïÇϹǷΠ¼ø¼­°¡ º° »ó°ü ¾øÀ¸³ª,
211                        // manual scan ÇÏ´Â °æ¿ì¿¡ ½Ã°£À» Á» ´õ ´ÜÃà ÇÒ ¼ö ÀÖ´Ù.
212                        APPEND_DEMOD_TABLE(&ddt[n_dd], "Qam256", eDHL_DEMOD_256QAM, DEMOD_TIMEOUT_256QAM);
213                        n_dd++;
214                        APPEND_DEMOD_TABLE(&ddt[n_dd], "Qam64", eDHL_DEMOD_64QAM, DEMOD_TIMEOUT_64QAM);
215                        n_dd++;
216                }
217        }
218
219        //------- vsb
220        if (cap & eDHL_TUCAP_VSB) {
221                APPEND_DEMOD_TABLE(&ddt[n_dd], "8VSB", eDHL_DEMOD_8VSB, DEMOD_TIMEOUT_CABLE_VSB);
222                n_dd++;         
223        }
224
225        //------- ntsc
226        // ntsc ´Â º°µµÀÇ pass·Î ºÐ¸®ÇÒ ¼öµµ ÀÖ°í, ¾Æ´Ï¸é digital °ú ÅëÇÕÇÏ¿© ¼öÇàÇÒ ¼öµµ ÀÖ´Ù.
227        if (cap & eDHL_TUCAP_ANALOG) {
228                APPEND_DEMOD_TABLE(&ddt[n_dd], "NTSC", eDHL_DEMOD_NTSC, DEMOD_TIMEOUT_CABLE_NTSC);
229                n_dd++;         
230        }
231
232gen_end:
233        dprint(2, "total %d demods in tables..\n", n_dd);
234        for (i=0; i<n_dd; i++) {
235                dprint(2, "  (%d) '%s', %d ms timeout\n", i, ddt[i].name, ddt[i].timeout_in_ms);
236        }
237
238        // vsb, ntsc ±â´ÉÀ» Áö¿øÇÏÁö ¾Ê´Â platform¿¡¼­ air ¸ðµå°¡ ¼³Á¤µÈ °æ¿ì ¿©±â¼­ °æ°í¼º assert.
239        // ±×·² °æ¿ì ½Ã³ª¸®¿À ÀÚü¸¦ °ËÅäÇϱ⠹ٶ÷..
240        DHL_ASSERT(n_dd != 0, "!! no possible demod?\n");
241
242        memcpy(ctx->demod, ddt, sizeof(ddt[0])*n_dd);
243        ctx->n_demod = n_dd;
244}
245
246
247static BOOL AppScan_GetDigitalLockStatus()
248{
249        DHL_RESULT dhlResult;
250        UINT32 lock;
251        dhlResult = DHL_FE_GetSignalStatus(DEFAULT_TUNER_ID, eDHL_SIGNAL_LOCK, &lock);
252       
253        if (dhlResult==DHL_OK && lock)
254                return TRUE;
255        else
256                return FALSE;
257}
258
259
260static BOOL AppScan_GetAnalogLockStatus()
261{
262        DHL_RESULT dhlResult;
263        UINT32 lock;
264        dhlResult = DHL_FE_GetSignalStatus(DEFAULT_TUNER_ID, eDHL_SIGNAL_NTSC_LOCK, &lock);
265       
266       
267        if (dhlResult==DHL_OK && lock)
268                return TRUE;
269        else
270                return FALSE;
271}
272
273
274// lockÀÌ µÈ »óÅ¿¡¼­¸¸ ÀÌ ÇÔ¼ö°¡ Á¦´ë·Î µ¿ÀÛÇÑ´Ù°í ÇÔ.
275//
276tDHL_Demod AppScan_GetModulationMode()
277{
278        DHL_RESULT dhlResult;
279        tDHL_Demod mode;
280       
281        dhlResult = DHL_FE_GetModFormat(DEFAULT_TUNER_ID, &mode);
282       
283        if(dhlResult) return eDHL_DEMOD_INVALID;
284       
285        return mode;
286}
287
288
289// ÇØ´ç Á֯ļö·Î Æ©´×ÇÏ¿© signalÀÌ ÀÖ´ÂÁö °Ë»çÇÑ´Ù.
290//
291// °¨ÁöµÈ modulation mode °ªÀ» ¸®ÅÏ.
292//
293STATUS AppScan_CheckSignalLock(UINT32 freqInKHz, 
294                                        ChannelScanCancelCheckFn fnCheck, 
295                                        DemodDescriptor *pDemodDesc, int nDemod, int *piModIdxStart,
296                                        tDHL_Demod *pModType)
297{
298        int i, mod_idx = 0, timeout, err;
299        UINT32 msStart;
300        BOOL bCheckNtscAlso;
301        tDHL_Demod mod;
302        DHL_RESULT dhr;
303
304        if (nDemod <= 0) {
305                dprint(0, "!! %s: n_demod %d invalid\n", __func__, nDemod);
306                return statusInvalidArgument;
307        }
308       
309        if (pModType) 
310                *pModType = (tDHL_Demod)-1;
311       
312        //
313        // ÇØ´ç Á֯ļö·Î ¼¼°¡Áö demodulation mode·Î ¸ðµÎ try¸¦ ÇØº»´Ù.
314        //
315        // °Ë»ö ½Ã°£À» ÁÙÀ̱â À§ÇØ ¸¶Áö¸·À¸·Î lock µÈ demod ¹æ½ÄÀ» ±â¾ïÇϰí ÀÖ´Ù°¡
316        // ±× ¹æ½ÄÀ¸·Î ¸ÕÀú try¸¦ ÇÑ´Ù.
317        // ÀÎÁ¢ ä³ÎÀÇ °æ¿ì °°Àº modulation ¹æ½ÄÀ» »ç¿ëÇÒ È®·üÀÌ ³ô±â ¶§¹®.
318        //
319        if (*piModIdxStart >= 0)
320                mod_idx = *piModIdxStart % nDemod; // Ȥ½Ã idx°ªÀÌ À߸øµÇ¾úÀ» ¼öµµ ÀÖÀ¸¹Ç·Î..
321                //
322                // check¸¦ ½ÃÀÛÇÒ modulation index.
323
324        for (i=0; i<nDemod; i++) 
325        {
326                // wait time until signal lock with timeout
327                //
328                timeout = pDemodDesc[mod_idx].timeout_in_ms;
329                if (g_Timeout_AutoscanLock)
330                        timeout = g_Timeout_AutoscanLock;
331       
332                dprint(0, "\t  freq %u KHz, '%s' modulation, timeout %d ms\n", 
333                                                freqInKHz, pDemodDesc[mod_idx].name, timeout);
334               
335                // tuner ¼³Á¤ÇÏ´Â ½Ã°£±îÁö Æ÷ÇÔÇØ¼­ ¾ó¸¶ °É¸®´ÂÁö ÃøÁ¤Çغ¸ÀÚ.
336                msStart = DHL_OS_GetMsCount();
337               
338                //DMW_HAL_TunerSetFrequency(freqInKHz, pDemodDesc[mod_idx].mod, fnCheck);
339                dhr = DHL_FE_Start(DEFAULT_TUNER_ID, freqInKHz, 
340                                        pDemodDesc[mod_idx].mod, NULL);
341                                       
342                if(dhr) {
343                        dprint(0, "\t DHL_FE_Start returns error(err code : %d)\n", dhr);
344                        continue;
345                }
346
347                // Oren Demodulator´Â VSB Æ©´×À» ½ÃµµÇÏ¸é µ¿½Ã¿¡ NTSC À¯¹«¸¦ °Ë»çÇÒ ¼ö ÀÖ´Ù.
348                // Á¦Ç°ÀÌ NTSC¸¦ Áö¿øÇÏÁö ¾Ê´õ¶óµµ ÀÌ ±â´ÉÀ» »ç¿ëÇϸé scan ¼Óµµ¸¦ ³ôÀÏ ¼ö ÀÖ´Ù.
349                //
350                if (pDemodDesc[mod_idx].mod == eDHL_DEMOD_8VSB)
351                        bCheckNtscAlso = TRUE;
352                else
353                        bCheckNtscAlso = FALSE;
354
355                // Á» ´õ ÀÇ¹Ì ÀÖ´Â ½Ã°£ ÃøÁ¤À» À§ÇØ ¾ÕÀ¸·Î À̵¿.
356                //msStart = DHL_OS_GetMsCount();
357
358                dprint(0, "\t  waiting lock...\n"); 
359
360                // cafrii 081023
361                // ¸ÕÀú lock üũ¸¦ ÇÑ ´ÙÀ½¿¡ timeout check¸¦ Çϵµ·Ï ÇÑ´Ù.
362                // ÀÌ¹Ì lockÀÌ ´Ù µÇ¾ú´Âµ¥ timeoutÀ» ÀÌÀ¯·Î fail ½Ãų ÀÌÀ¯´Â ¾ø´Ù.
363                //
364                while (1)
365                {
366
367                        if (AppScan_GetDigitalLockStatus()) 
368                        {
369                                mod = AppScan_GetModulationMode();
370
371                                // cafrii 060628, add more check..
372                                if (mod !=      eDHL_DEMOD_8VSB &&
373                                        mod != eDHL_DEMOD_64QAM && 
374                                        mod != eDHL_DEMOD_256QAM)
375                                        mod = eDHL_DEMOD_8VSB;  // adjust!
376
377                                *piModIdxStart = mod_idx;
378                                goto label_done;
379                        }
380
381                        if (bCheckNtscAlso && AppScan_GetAnalogLockStatus()) 
382                        {
383                                mod = eDHL_DEMOD_NTSC;
384                                *piModIdxStart = mod_idx;
385                                goto label_done;
386                        }
387                       
388                        if (fnCheck && fnCheck())
389                                return statusCancelled;
390
391                        if (DHL_OS_GetMsCount() - msStart > timeout)
392                                break;
393                       
394                        DHL_OS_Delay(50); // ±â´Ù·È´Ù°¡ ´Ù½Ã ½Ãµµ..
395                       
396                }
397               
398                mod_idx = (mod_idx + 1) % nDemod;  // ´ÙÀ½ modulation ¹æ½ÄÀ¸·Î retry..
399        }
400       
401        return statusNotFound;
402       
403label_done:
404
405        if (pModType)
406                *pModType = mod;
407
408        dprint(0, "\t signal locked with demod[%d] %d, '%s', %d ms\n", 
409                                        mod_idx, mod, ServiceTypeString(mod),
410                                        DHL_OS_GetMsCount()-msStart);
411       
412        return statusOK;
413}
414
415
416#if 0
417static DemodDescriptor s_AirDemodDesc[N_AIR_DEMOD] =
418{
419        {"8VSB",    eDHL_DEMOD_8VSB,  1400,}
420        // cafrii 060711, 500->800
421        //  PR DS031 ½ÅÈ£¸¦ Á¾Á¾ ¸øÀâ´Â °æ¿ì ¹ß»ýÀ» ÃÖ¼ÒÈ­Çϱâ À§ÇÑ Á¶Ä¡.
422        // cafrii 070713, 800->1100
423        //  ÀϺΠ½ºÆ®¸²¿¡¼­´Â ä³ÎÀ» ¸ø Àâ´Â ¹®Á¦ ¹ß»ýÇÑ´Ù°í ÇØ¼­ Áõ°¡.
424        // cafrii 081023, 1100->1400
425        //  CB3¿¡¼­ broadcom chipÀº vsb lock ½Ã°£ÀÌ ´õ °É¸°´Ù.
426        //  1400ms´Â ref sw¿¡¼­ »ç¿ëÇÏ´Â °ªÀÌ´Ù.
427};
428#endif
429
430
431void AppScan_SetTunerAir(ScanTunerSetCbParam *csdp)
432{
433        UINT32 freq;
434        tDHL_Demod mode;
435        STATUS status;
436        int mod_idx = 0; // ¾îÂ¥ÇÇ 0¹ø VSB Çϳª¹Û¿¡ ¾ø°í 0¹øºÎÅÍ °Ë»ö ½ÃÀÛ.
437
438        AppScanContext *ctx = &g_AppScanContext;
439
440        if (csdp == NULL) {
441                dprint(0, "!! critical context param NULL\n");
442                csdp->return_value = statusInvalidArgument;
443                return;
444        }
445
446        // quick scanÀÇ °æ¿ì scan start callback µîÀÌ ºÒ¸®Áö ¾Ê´Â´Ù.
447        // µû¶ó¼­ demod tableÀ» ¹Ù·Î Áö±Ý »ý¼ºÇÑ´Ù.
448        if (csdp->one_channel_scan)
449                AppScan_GenerateDemodTable(ctx, FALSE);
450
451        freq = FindCenterFrequency(csdp->channel, 0, eDHL_FREQ_AIR);
452
453        status = AppScan_CheckSignalLock(freq/1000, csdp->chkfn, 
454                                                ctx->demod, ctx->n_demod, &mod_idx, &mode);
455                        // mode´Â tuning ÈÄ¿¡ ½ÇÁ¦·Î ¾ò¾îÁø modulation.
456
457        if (status == statusCancelled) {
458                csdp->return_value = statusCancelled;
459                return;
460        }
461       
462        if (status == statusNotFound) {
463                csdp->locked = FALSE;
464                csdp->return_value = statusOK;
465                return;
466        }
467
468        if (mode == eDHL_DEMOD_NTSC) {
469                csdp->locked = FALSE;
470                csdp->return_value = statusOK;
471                return;
472        }
473
474        //if locked, and strength is zero, wait.
475        {
476                #define STRENGTH_WAIT_SEC 3
477                UINT32 ms_start=DHL_OS_GetMsCount();
478               
479                while(DHL_OS_GetMsCount()-ms_start<STRENGTH_WAIT_SEC*1000)
480                {
481                        if(DMW_HAL_GetSignalStrength()>0) break;
482                        DHL_OS_Delay(10);
483                }
484        }
485
486        csdp->locked = TRUE;
487        csdp->mode = DMW_HAL_TunerDemod2Modulation(mode);
488        csdp->strength = DMW_HAL_GetSignalStrength();
489        csdp->freq_offset = 0;
490        csdp->return_value = statusOK;
491}
492
493
494//----------------------------------------------------------------
495//  Cable
496//
497
498
499
500
501void AppScan_SetTunerCable(ScanTunerSetCbParam *csdp)
502{
503        UINT32 freq_STD, freq_HRC, freq_IRC;  // °¢ system ¿¡¼­ÀÇ center frequency
504        BOOL bSTD_IRC_Dominant = FALSE, bHRC_Dominant = FALSE;
505                // ÁøÇà Áß¿¡ ÇÑ ±×·ìÀÌ Dominant ÇØÁö¸é ÇØ´ç flag°¡ TRUE°¡ µÈ´Ù.
506                // ±× ÀÌÈÄ¿¡´Â dominant ÇÑ ¸ðµå·Î¸¸ Æ©´×À» ½ÃµµÇÑ´Ù.
507               
508        BOOL bChannel_5_6;
509        tDHL_Demod mode;
510        STATUS status;
511
512        AppScanContext *ctx = &g_AppScanContext;
513
514        // cafrii 060828 add
515        // ¾Æ·¡´Â ¿¹Àü¿¡´Â macro ¶Ç´Â global º¯¼ö¿´´Âµ¥,
516        // local º¯¼ö·Î º¯°æÇÔ.
517        int N_CABLE_DEMOD;
518        DemodDescriptor *CableDemodDesc;
519       
520        if (csdp == NULL) {
521                dprint(0, "!! critical context param NULL\n");
522                csdp->return_value = statusInvalidArgument;
523                return;
524        }
525
526        // quick scanÀÇ °æ¿ì scan start callback µîÀÌ ºÒ¸®Áö ¾Ê´Â´Ù.
527        // µû¶ó¼­ demod tableÀ» ¹Ù·Î Áö±Ý »ý¼ºÇÑ´Ù.
528        if (csdp->one_channel_scan)
529                AppScan_GenerateDemodTable(ctx, TRUE);
530
531        csdp->locked = FALSE;
532        csdp->freq_offset = 0;
533       
534        if (ctx->score_std >= ctx->score_hrc + CS_DETECT_THRESHOLD)
535                bSTD_IRC_Dominant = TRUE;
536        else if (ctx->score_hrc >= ctx->score_std + CS_DETECT_THRESHOLD)
537                bHRC_Dominant = TRUE;
538       
539        freq_STD = FindCenterFrequency(csdp->channel, 0, eDHL_FREQ_STD);
540        freq_HRC = FindCenterFrequency(csdp->channel, 0, eDHL_FREQ_HRC);
541        freq_IRC = FindCenterFrequency(csdp->channel, 0, eDHL_FREQ_IRC);
542
543        // ÇÊ¿äÇÑ ÃʱâÈ­ ¼öÇà..
544       
545        if (csdp->channel == 5 || csdp->channel == 6)
546                bChannel_5_6 = TRUE;
547        else
548                bChannel_5_6 = FALSE;
549
550#if 1
551        N_CABLE_DEMOD = ctx->n_demod;
552        CableDemodDesc = ctx->demod;
553#else
554        if (1) {
555                // lockÀÌ µÈ »óÅ¿¡¼­ °¡Á®¿Í¾ß ¾ÈÀüÇÔ.. ¾ðÁ¦ º¯°æµÉ Áö ¸ð¸£¹Ç·Î.
556                UINT32 mask;
557                mask = OS_LockTask();
558                N_CABLE_DEMOD = N_CABLE_DEMOD_EX;
559                CableDemodDesc = s_CableDemodDesc_EX;
560                OS_UnlockTask(mask);
561        }
562#endif
563
564        //------------------------
565        //  STD
566       
567        if (!bHRC_Dominant)
568        {
569                dprint(0, "\t$$ try Cable %s..\n", bChannel_5_6 ? "STD" : "STD/IRC");
570               
571                status = AppScan_CheckSignalLock(freq_STD/1000, csdp->chkfn, 
572                                                CableDemodDesc, N_CABLE_DEMOD, 
573                                                &(ctx->last_successful_mod), &mode);
574
575                if (status == statusCancelled) goto label_cancelled;
576
577                if (mode == eDHL_DEMOD_NTSC) {
578                        ctx->score_std++;   // Cable system ¼±Åÿ¡´Â µµ¿òÀÌ µÇµµ·Ï..
579                        csdp->locked = FALSE;
580                        goto label_end;
581                }
582
583                if (status == statusOK) {
584                        ctx->score_std++;
585                        csdp->freq_offset = 0; // freq_STD - freq_STD;
586                        csdp->locked = TRUE;
587                        csdp->mode = DMW_HAL_TunerDemod2Modulation(mode);
588                        goto label_end;
589                }
590               
591                //------------------------
592                //  IRC
593               
594                // 5¹ø 6¹ø ä³ÎÀ» Á¦¿ÜÇÑ ´Ù¸¥ ä³Î¿¡¼­´Â STD¿Í IRC´Â ±¸ºÐÀÌ µÇÁö ¾Ê´Â´Ù.
595                // 5, 6¹ø ¿¡¼­¸¸ µû·Î IRC¸¦ üũÇÑ´Ù.
596                //
597                if (bChannel_5_6)
598                {
599                        dprint(0, "\t$$ try Cable IRC..\n");
600                        status = AppScan_CheckSignalLock(freq_IRC/1000, csdp->chkfn, 
601                                                        CableDemodDesc, N_CABLE_DEMOD, 
602                                                        &(ctx->last_successful_mod), &mode);
603       
604                        if (status == statusCancelled) goto label_cancelled;
605       
606                        if (mode == eDHL_DEMOD_NTSC) {
607                                ctx->score_irc++;
608                                csdp->locked = FALSE;
609                                goto label_end;
610                        }
611                       
612                        if (status == statusOK) {
613                                ctx->score_irc++;
614                                csdp->freq_offset = freq_IRC - freq_STD;
615                                csdp->locked = TRUE;
616                                csdp->mode = DMW_HAL_TunerDemod2Modulation(mode);
617                                goto label_end;
618                        }
619                }
620        }
621
622        //------------------------
623        //  HRC
624       
625        if (!bSTD_IRC_Dominant)
626        {
627                dprint(0, "\t$$ try Cable HRC..\n");
628                status = AppScan_CheckSignalLock(freq_HRC/1000, csdp->chkfn, 
629                                                CableDemodDesc, N_CABLE_DEMOD, 
630                                                &(ctx->last_successful_mod), &mode);
631
632                if (status == statusCancelled) goto label_cancelled;
633
634                if (mode == eDHL_DEMOD_NTSC) {
635                        ctx->score_hrc++;
636                        csdp->locked = FALSE;
637                        goto label_end;
638                }
639
640                if (status == statusOK) {
641                        ctx->score_hrc++;
642                        csdp->freq_offset = freq_HRC - freq_STD;
643                        csdp->locked = TRUE;
644                        csdp->mode = DMW_HAL_TunerDemod2Modulation(mode);
645                        goto label_end;
646                }
647        }
648
649
650label_end:
651
652        dprint(0, "\t$$ lock %d, current score:  STD %d,  HRC %d,  IRC %d\n", 
653                                csdp->locked, ctx->score_std, ctx->score_hrc, ctx->score_irc);
654
655        // ¾î´À Çϳª°¡ ¿ì¼¼ÇØ Áö´Â ÃÖÃÊÀÇ ¼ø°£¿¡ ¸Þ½ÃÁö¸¦ Ç¥½Ã.
656        // ÀÌÁ¦ºÎÅʹ ƯÁ¤ system¸¸ °Ë»öÀ» ¼öÇàÇÒ °ÍÀÌ´Ù.
657        //
658        if (ctx->score_std == ctx->score_hrc + CS_DETECT_THRESHOLD)
659                dprint(0, "\t#### STD/IRC is now dominant ####\n");
660               
661        else if (ctx->score_hrc == ctx->score_std + CS_DETECT_THRESHOLD)
662                dprint(0, "\t#### HRC is now dominant ####\n");
663
664        if (csdp->locked) {
665                //if locked, and strength is zero, wait.
666                #define STRENGTH_WAIT_SEC 3
667                UINT32 ms_start=DHL_OS_GetMsCount();
668               
669                while(DHL_OS_GetMsCount()-ms_start<STRENGTH_WAIT_SEC*1000)
670                {
671                        if(DMW_HAL_GetSignalStrength()>0) break;
672                        DHL_OS_Delay(10);
673                }
674               
675                csdp->strength = DMW_HAL_GetSignalStrength();
676        }
677       
678        csdp->return_value = statusOK;
679        return;
680       
681label_cancelled:
682        csdp->return_value = statusCancelled;
683        return;
684}
685
686
687void AppScan_ScanStart(ScanStartedCbParam *param)
688{
689        AppScanContext *ctx = &g_AppScanContext;
690       
691        dprint(2, "\t[SCB] scan start\n");
692       
693        memset(ctx, 0, sizeof(AppScanContext));
694       
695        if ((param->flag & CBTF_ChannelTypeMask) == CBTF_Air) {
696                // nothing to do..
697        }
698        else {
699                dprint(0, "\t[SCB] set to STD..\n");
700                DMW_HAL_SetChannelStandard(eDHL_FREQ_STD);
701        }
702       
703        // scan óÀ½ ½ÃÀÛÇÒ ¶§, FE ¿¡¼­ Áö¿øÇÏ´Â ±â´ÉÀ» ¹ÙÅÁÀ¸·Î demod tableÀ» ÀÛ¼ºÇÑ´Ù.
704        //
705        AppScan_GenerateDemodTable(ctx, param->flag & CBTF_Cable ? 1 : 0);
706}
707
708
709void AppScan_ScanEnd(ScanCompleteCbParam *param)
710{
711        AppScanContext *ctx = &g_AppScanContext;
712       
713        dprint(0, "\t[SCB] autoscan end\n");
714
715        if ((param->flag & CBTF_ChannelTypeMask) == CBTF_Air)
716                return;
717
718        dprint(0, "\t std %d, irc %d, hrc %d\n", 
719                                ctx->score_std, ctx->score_irc, ctx->score_hrc);
720       
721        if (ctx->score_hrc > (ctx->score_std + ctx->score_irc))
722        {
723                dprint(0, "\t --> CableSystem is HRC\n");
724        }
725        else if (ctx->score_irc > 0)
726        {
727                // irc´Â 5,6¹ø¿¡¼­¸¸ countµÇ´Âµ¥, irc°¡ Çϳª ÀÌ»ó Á¸ÀçÇϸé ÀÌ systemÀº irc·Î ºÁµµ µÈ´Ù.
728                //
729                dprint(0, "\t --> CableSystem is IRC\n");
730        }
731        else
732        {
733                dprint(0, "\t --> CableSystem is STD\n");
734        }
735}
736
737
738// Scan event procÀÇ ¸ðµç callbackµéÀÇ naming ±ÔÄ¢À» ÅëÀÏ ½Ã۱â À§ÇØ
739// API¿Í ºÐ¸®ÇÑ´Ù.
740//
741//old: void App_Autoscan_TunerSet(ScanTunerSetCbParam *param)
742void AppScan_TunerSet(ScanTunerSetCbParam *param)
743{
744        dprint(0, "\t[SCB] tuner set rf %d\n", param->channel);
745       
746        if ((param->flag & CBTF_ChannelTypeMask) == CBTF_Air)
747                AppScan_SetTunerAir(param);
748        else
749                AppScan_SetTunerCable(param);
750
751        // ¿©±â¼­´Â Á÷Á¢ DHLÀ» ºÎ¸£¹Ç·Î DMW HAL ¿¡¼­ÀÇ ÃÖÁ¾ RF Æ©´× »óÅ Á¤º¸¿Í sync°¡ ¾È¸Â°Ô µÊ.
752        DMW_HAL_ResetLastRF();
753}
754
755
756void AppScan_UpdateResolutionInfo(UCM_DB_T *m)
757{
758        //sequence Á¤º¸¸¦ ¾ò¾î¾ß ÇÔ
759        do {
760                #define MAX_SEQ_WAIT 5000 // ÃÖ´ë 5Ãʸ¦ ±â´Ù¸²
761               
762                tDHL_VideoSeqHdr seq;
763                tDHL_DispFormat disp=eDHL_DISP_720x480i;
764                UINT32 ms_start;
765               
766                if(m->Video_pid==0) break;
767               
768                DHL_AV_VideoHide(0, TRUE);
769                DMC_RegisterVideoCallback(FALSE);
770                DHL_AV_VideoStart(0, m->Video_pid, m->Pcr_pid, m->Video_type);
771               
772                for(ms_start=DHL_OS_GetMsCount();
773                        DHL_AV_VideoSeqInfo(0, &seq)!=DHL_OK && DHL_OS_GetMsCount()-ms_start < MAX_SEQ_WAIT;
774                        DHL_OS_Delay(100));
775               
776                if(DHL_OS_GetMsCount()-ms_start >=MAX_SEQ_WAIT) { //timeout
777                        ;
778                }
779                else {
780                        if(seq.vertical_size>=1080)     disp=eDHL_DISP_1920x1080i;
781                        else if(seq.vertical_size>=720) disp=eDHL_DISP_1280x720p;
782                        else                            disp=eDHL_DISP_720x480i;
783                }
784               
785                DHL_AV_VideoStop(0);
786                DMC_RegisterVideoCallback(TRUE);
787               
788                m->video_format=disp;
789        } while(0);
790}
791
792
793#if COMMENT
794____API____(){}
795#endif
796
797BOOL s_bAutoScanOnGoing;
798        // autoscan ÀÌ ½ÃÀ۵Ǹé TRUE. ¿ÏÀü Á¾·áµÇ¸é FALSE.
799        // callback¿¡¼­ ÀÌ º¯¼ö¸¦ °ü¸®ÇÑ´Ù.
800static int s_scan_progress_percent;
801
802// cafrii 070712
803// Draw_AutoScan_Bar µîÀÇ ÇÔ¼ö ¼±¾ðµé ¸ðµÎ OSD_API ·Î À̵¿.
804//
805
806
807static BOOL p_stt_check()
808{
809        return FALSE; //»ç¿ëÀÚÀÇ Å° Á¶ÀÛÀÌ ´À·ÁÁú ¼ö ÀÖÀ»±î?
810}
811
812
813// AppAutoScanEventProc
814//
815// Autoscan callbackÀ¸·Î µî·ÏµÇ´Â ÇÔ¼ö.
816// scan °úÁ¤¿¡¼­ °¢Á¾ À¯¿ëÇÑ Á¤º¸°¡ ÀÌ callbackÀ» ÅëÇØ Àü´ÞµÈ´Ù.
817//
818STATUS _AppAutoScanEventProc(ChannelScanEventType evt, UINT32 evparam)
819{
820        static int   sNumNewChannelInThisRf = 0; // ÇöÀç rf¿¡¼­ °Ë»öµÈ subchannel °¹¼ö.
821       
822        if (s_bAutoScanOnGoing == FALSE && evt != evtScanStarted) 
823        {
824                // ÀÌ¹Ì Á¾·áµÈ »óÅ¿¡¼­ ¿Â À̺¥Æ®? À߸øµÈ °æ¿ìÀÓ.
825                dprint(0, "!! AutoscanEvent comes in Stopped State.. ignored\n");
826                return statusError;
827        }
828               
829        if (evt == evtScanStarted)
830        {
831                ScanStartedCbParam *param = (ScanStartedCbParam *)evparam;
832               
833                dprint(0, "\t$$ ScanTask : TaskStarted \n");
834               
835                s_bAutoScanOnGoing = TRUE; // ÀÌÁ¦ autoscan ½ÃÀÛ µÈ °ÍÀ¸·Î ÆÇ´Ü..
836                sNumNewChannelInThisRf = 0;
837               
838                AppScan_ScanStart(param);
839        }
840        else if (evt == evtScanTunerSet)
841        {
842                ScanTunerSetCbParam *param = (ScanTunerSetCbParam *)evparam;
843
844                AppScan_TunerSet(param);
845        }
846        else if (evt == evtOnProgress)
847        {
848                ScanProgressCbParam *param = (ScanProgressCbParam *)evparam;
849                // ÁøÇà »óȲ Á¤µµ
850                int percentage = (param->channel_idx+1) * 100 / param->total_channel;
851               
852                if (param->after_scan == 0) {
853                        dprint(0, "\t$$ rf %d,  %d percent progress..\n", param->current_rf, percentage);       
854                }
855                else {
856                        if (sNumNewChannelInThisRf == 0)
857                                dprint(0, "\t$$    no channel info in rf %d\n", param->current_rf);
858                       
859                        // App_Proc_Scan¿¡ ÇöÀç ÁøÇà ÁßÀÎ RF & percentage ¼öÄ¡¸¦ Àü´Þ
860                        DMG_SetUserDefined(UD_ID_SCAN_PROGRESS, DMG_MAKEWORD(param->current_rf, percentage), 0);
861
862                        sNumNewChannelInThisRf = 0;
863                       
864                       
865                }
866               
867                s_scan_progress_percent=percentage;
868        }
869        else if (evt == evtNewChannel)
870        {
871                // »õ·Î¿î ä³ÎÀÌ °Ë»öµÇ¾ú´Ù. ÀÌ Ã¤³ÎÀº Minor ´ÜÀ§ÀÌ´Ù.
872                //
873                ScanNewChannelCbParam *p_param = (ScanNewChannelCbParam *)evparam;
874                UCM_DB_T *ucm = (UCM_DB_T *)(p_param->ucm);
875                // cafrii 081104 bugfix. we should use p_param->ucm.
876                // we assume ucm is non-NULL and valid.
877               
878                if (ucm)
879                {
880                        AppScan_UpdateResolutionInfo(ucm);
881                       
882                        dprint(0, "\t$$ New channel RF %d, %d-%d, (res:%x) %s %s\n", 
883                                ucm->RF, 
884                                ucm->Major, 
885                                ucm->Minor, 
886                                ucm->video_format,
887                                ServiceTypeString(ucm->Service_type), ucm->scrambled ? "scrambled" : "");
888
889                        sNumNewChannelInThisRf++;
890
891                        DMG_SetUserDefined(UD_ID_SCAN_UPDATE_CH, DMG_MAKEWORD(sNumNewChannelInThisRf, ucm->RF), 
892                                DMG_MAKEWORD(ucm->Major, ucm->Minor));
893                               
894                        if(b_stt_gathering) {
895                                if(!b_stt_set) {
896                                        STATUS status;
897                                        tDHL_TSD *tsd = DHL_DMX_GetTsd();
898                                        sttSectionPtr_t stt=NULL;
899                                        status = Dmc_GetSttSection(tsd, &stt, 1200, NULL);
900                               
901                                        if(status==statusOK && stt) {
902                                                if(App_SetTimebySTTAtSetupWizard()==0)
903                                                        b_stt_set=TRUE;
904                                        }
905                                }
906                        }
907                }
908               
909                /* 2010.03.25 foxhunt
910                 * Shell or MenuÀÇ autoscanÀ» ÅëÇØ new channelÀ» ¹ß°ßÇßÀ» ¶§, guide¸¦ ¾ø¾ÖÁØ´Ù. */
911                DMG_SetUserDefined(UD_ID_NO_CH_GUIDE, 0, 0);
912        }
913        else if (evt == evtScanComplete) // Á¤»ó Á¾·á ¶Ç´Â Cancel Á¾·á.
914        {
915                ScanCompleteCbParam *param = (ScanCompleteCbParam *)evparam;
916                AudioDecodeStopParam adsp;
917               
918                AppScan_ScanEnd(param);
919
920                // autoscan Áß¿¡ audio selection µÈ °á°úµéÀÌ ½ÇÁ¦ Æ©´×¿¡ ¿µÇâÀ»
921                // ¹ÌÄ¡Áö ¾Êµµ·Ï Çϱâ À§ÇØ.
922                memset(&adsp, 0, sizeof(adsp));
923                App_AudioNotifyStop(&adsp);
924               
925                dprint(0, "\t$$ ScanTask : Task Completed!!! \n\n");
926               
927                sNumNewChannelInThisRf = 0;
928
929                App_NVM_SaveUcm();
930                App_NVM_PrintUcm(0); // cafrii 060724, print ucm before invalidate pids..
931
932                // cafrii 060630 add
933                // autoscan ÈÄ Ã¤³Î º¹±¸ Æ©´×..
934                // gui ¸Þ´º¿¡¼­ È£ÃâÇÒ °æ¿ì¿¡´Â menu task¿¡¼­ ¸¶¹«¸® ÇÒ ¼ö ÀÖÁö¸¸,
935                // shell¿¡¼­ ½ÇÇàÇÒ °æ¿ì¿¡´Â ÀÌ task¿¡¼­ ¸¶¹«¸® Äڵ带 ºÒ·¯Áà¾ß ÇÑ´Ù.
936                //
937                // --> cafrii 100315, shell ½ÇÇàÀº ¾îÂ¥ÇÇ test ¿ëµµÀ̹ǷÎ, ä³Î º¹±¸ ÄÚµå´Â ¼öÇàÇÏÁö ¸»ÀÚ.
938
939                DMG_SetUserDefined(UD_ID_SCAN_PROGRESS, 0, 1);
940
941                s_bAutoScanOnGoing = FALSE;
942               
943                /* 2010.03.25 foxhunt
944                 * autoscanÀÇ Á¤»óÁ¾·á or StopÀ» ÅëÇØ ³ª¿ÔÀ» °æ¿ì ucmÀ» üũÇÏ¿© guideÀÇ Á¸¼Ó¿©ºÎ °áÁ¤ */
945                DMG_SetUserDefined(UD_ID_NO_CH_GUIDE, 0, 0);
946               
947        }
948       
949        return statusOK;
950}
951
952
953//
954//   Autoscan ÀÌ ÁøÇà ÁßÀÎÁö üũÇÏ´Â ÇÔ¼ö.
955//
956BOOL App_Autoscan_CheckAutoscanOnGoing(void)
957{
958        return s_bAutoScanOnGoing;
959}
960
961
962void App_Autoscan_ChBackupBeforeScan(void)
963{
964        DST_CURCHANNEL ChannelInfo;
965        App_Ucm_GetCurChInfo(&ChannelInfo);
966
967        if (g_App_LastTuneResult == statusOK)
968        {
969                // ÇöÀç ½ÃûÁßÀΠä³ÎÀÇ rf, pn °ªÀº ÀÌ¹Ì Æ©´× ´Ü°è¿¡¼­ ±â·ÏµÇ¾î ÀÖÀ» °ÍÀÓ.
970                //dprint(0, "before autoscan: last rf %d, pn %d\n",
971                //              ChannelInfo.nRF, ChannelInfo.nProgramNumber);
972                // À§ debug Äڵ带 ³ÖÀ¸¸é Á×´Â ¹®Á¦ ÀÖÀ½. ¾ÆÁ÷ ¿øÀÎÀ» ¸ð¸§
973        }
974        else
975        {
976                dprint(0, "before autoscan: current ch invalid (%d)\n", g_App_LastTuneResult);
977               
978                // ¹«È¿È­..     ´ÙÀ½ º¹±¸ ¶§¿¡ ÇöÀç ä³Î »ç¿ëÇÏÁö ¸øÇϵµ·Ï..
979                App_SaveLastChannelInfo(0, 0, 0);
980        }
981}
982
983
984/*************************************************************************
985        Function : AppScan_GetValidChannelUID
986       
987        Author : Chan Hun Jeon
988
989        Date : 2007.05.22
990
991        Description :
992        -non-hidden, non-scrambled, non-skipped µÈ ä³Î Uid ¸®ÅÏ
993        -°Ë»öµÈ ä³ÎÀÌ ¾ø´Â °æ¿ì -1 ¸®ÅÏ
994**************************************************************************/
995int AppScan_GetValidChannelUID(void)
996{
997        UINT16 i;
998        //UINT16 Uid = -1; // bugbug!! À̰ÍÀº 0xFFFF·Î ÀúÀåµÊ.
999        int Uid = -1;
1000       
1001        DMW_MSC_LockUcm();
1002       
1003        // non-hidden, non-scrambled, non-skipped µÈ ä³ÎÀ» ã´Â´Ù.
1004        for (i=0 ; g_UCM && i<g_UCM_number ; i++)
1005        {
1006                if (g_UCM[i].hidden == 0 &&
1007                   g_UCM[i].scrambled == 0 &&
1008                   g_UCM[i].Skipped == 0 )
1009                {
1010                        Uid = g_UCM[i].Uid;
1011                        break;
1012                }
1013        }
1014
1015        DMW_MSC_UnlockUcm();
1016
1017        return Uid;
1018
1019}
1020
1021
1022//  _AppScan_RecoverChannelHandler
1023//
1024//  AutoscanÀÌ Á¾·áµÇ°í Æ©´×À» ÇÏ´Â timer handler
1025//  Æ©´×À» ÇÒ rf, uid¸¦ paramÀ¸·Î ³Ñ°ÜÁØ´Ù.
1026//
1027static void _AppScan_RecoverChannelHandler(UINT32 nIDTimer)
1028{
1029        int uid;
1030
1031        if (nIDTimer != TIMER_ID_TUNE_AFTER_SCAN)
1032                return;
1033
1034        uid = AppScan_GetValidChannelUID();
1035
1036        if(uid != -1)
1037        {
1038                // Updated by Chan Hun Jeon 2007.05.22
1039                // UCM¿¡ À¯È¿ÇÑ Ã¤³Î(non-hidden, non-scrambled, non-skiped) ÀÖ´Â °æ¿ì
1040                // ÀÓÀÇÀÇ À¯È¿ ä³ÎÀ» Æ©´×
1041                App_TuneChannelByUid(uid);
1042        }       
1043        else
1044        {
1045                // À¯È¿ÇÑ Ã¤³ÎÀÌ ¾ø´Ù¸é ¸¶Áö¸· Æ©´× ä³Î·Î º¹¿ø         
1046                App_ChTuneRecoverLastChannel();
1047        }
1048}
1049
1050
1051//  App_Autoscan_RecoverLastChannel
1052//
1053//  autoscan ³¡³ª°í ³ª¼­ Æ©´×À» ÇÑ´Ù.
1054//  setup wizard ÀÏ ¼öµµ ÀÖÀ½. ÀÌ °æ¿ì´Â APP_CUR_CH Á¤º¸°¡ ¾øÀ» °ÍÀÓ.
1055//  ÀÌ ÇÔ¼ö°¡ ºÒ¸®´Â task°¡ ¾î¶² °ÍÀÎÁö À¯³äÇØ¾ß ÇÔ.
1056//
1057void App_Autoscan_RecoverLastChannel(void)
1058{
1059        int status;
1060       
1061        // cafrii 060701 add case called in non-DMC task
1062        //
1063        if (Dmc_IsDmcTask()) 
1064        {
1065                // dmc task¿¡¼­ dmc task·Î command¸¦ º¸³¾ ¼ö ¾øÀ¸¹Ç·Î deferred call ¼öÇà..
1066                //
1067                DMW_SYS_KillTimer(TIMER_ID_TUNE_AFTER_SCAN);
1068                status = DMW_SYS_SetTimer(TIMER_ID_TUNE_AFTER_SCAN, 0, 
1069                                        (DMW_TIMER_PROC)_AppScan_RecoverChannelHandler, 0, TRUE);
1070
1071                if (status)
1072                        dprint(0, "!! cannot auto tune after scan\n");
1073        }
1074        else 
1075        {
1076                _AppScan_RecoverChannelHandler(TIMER_ID_TUNE_AFTER_SCAN);
1077        }
1078}
1079
1080
1081//
1082// ÅëÀÏµÈ Auto scan ½ÃÀÛ ÇÔ¼ö.
1083//  Á÷Á¢ task id Á¤º¸¸¦ Àо, ¸Þ´º¿¡¼­ ½ÇÇàµÈ °ÍÀÎÁö ¾Æ´Ï¸é
1084//  shell¿¡¼­ ½ÇÇàµÈ °ÍÀÎÁö ÆÇ´ÜÇÑ´Ù.
1085//  MENU_OSD_TOKENÀ» Ȱ¿ëÇØµµ ¹«¹æÇÒ µí..
1086//
1087void App_AutoScan_StartScan(int nStart, int nEnd, BOOL bAddOnMode)
1088{
1089        STATUS status;
1090        int nScanFlags;
1091       
1092        DHL_AV_VideoHide(0, TRUE); //mute off when ch tuning automatically
1093
1094        // autoscan °æ¿ì¿¡´Â Ưº°È÷ ä³Î º¹±¸ ÀÛ¾÷¿¡ ¾à°£ÀÇ º¯µ¿ÀÌ ÀÖ´Ù.
1095        // ÇöÀç Á¤»ó ½Ãû »óÅÂÀÏ °æ¿ì autoscan ÈÄ¿¡ Çö ä³ÎÀ» À¯ÁöÇϰí,
1096        // ÇöÀç »óŰ¡ Á¤»óÀÌ ¾Æ´Ï¶ó¸é autoscan ÈÄ¿¡ ÀÓÀÇ À¯È¿ ä³ÎÀ» Æ©´×ÇÑ´Ù.
1097
1098        App_Autoscan_ChBackupBeforeScan(); // cafrii 060814
1099
1100        // note
1101        // setup wizard°¡ ½ÇÇàµÇ´Â °æ¿ì¶ó¸é ÇöÀç ä³Î Á¤º¸´Â invalidÇÒ °ÍÀÓ.
1102
1103        App_ChTuneStopTV();
1104
1105        // cafrii 070713 bugfix.
1106        // autoscan ÈÄ¿¡´Â prev ch µ¿ÀÛ ¾ÈÇØ¾ß ÇÔ.
1107        // ÇöÀç´Â Stop TV ³»ºÎ¿¡ prev ch backup ÇÏ´Â Äڵ尡 À־ ¹®Á¦°¡ µÊ.
1108        App_ResetPrevChannelInfo();
1109
1110        // ¾îÂ¥ÇÇ channel banner osd´Â priority¿¡ ÀÇÇØ Áö¿öÁ³Áö¸¸
1111        // ºÒÇÊ¿äÇÑ timer°¡ ³²¾ÆÀÖÀ»Áö ¸ð¸£¹Ç·Î cancel ½ÃŲ´Ù.
1112        // ¾ø¾îµµ Ưº°È÷ ¹®Á¦µÇ´Â ÄÚµå´Â ¾Æ´Ô.
1113
1114        // TODO: After porting banner
1115        //App_CancelChBanner();  // cafrii 060919 add
1116
1117        App_EpgDeleteAll(); // ±âÁ¸ÀÇ epg dbµµ ¸ðµÎ Áö¿ì´Â°Ô ¾ÈÀüÇÔ.
1118       
1119       
1120        if (!bAddOnMode)//rescan mode
1121        {
1122                DMW_CDB_ClearAll();
1123
1124                App_NVM_EraseUcm();
1125        }
1126
1127        if (nStart == 0 && nEnd == 0) { // rf number not specified
1128                if (g_CurChannelType == ChannelType_Air) {
1129                        nStart = 2;
1130                        nEnd = 69;
1131                }
1132                else {
1133                        nStart = 1;
1134                        nEnd = 135;                     
1135                }
1136        }
1137
1138        if (g_CurChannelType == ChannelType_Air)
1139#if SUPPORT_NEWBY
1140                nScanFlags = CBTF_Air | CBTF_8VSB | CBTF_IgnoreNtscInVct |
1141                                        CBTF_ForcePSI; 
1142#else
1143                nScanFlags = CBTF_Air | CBTF_8VSB | CBTF_IgnoreNtscInVct |
1144                                        CBTF_ForcePSI |
1145                                        CBTF_DontSelectMaxChannel;
1146#endif
1147        else {
1148                if(App_GetEnableCableQam()) {
1149                nScanFlags = CBTF_Cable | CBTF_8VSB | 
1150                                        CBTF_IgnoreNtscInVct |
1151                                        CBTF_ForcePSI;
1152                }
1153                else {
1154                nScanFlags = CBTF_Cable | CBTF_8VSB | CBTF_QAM | 
1155                                        CBTF_IgnoreNtscInVct |
1156                                        CBTF_ForcePSI | 
1157                                        CBTF_DontSelectMaxChannel;
1158                }
1159        }
1160       
1161        nScanFlags |= SET_SCAN_POLICY;
1162       
1163        status = DMW_ASC_StartScan(nScanFlags, _AppAutoScanEventProc, nStart, nEnd);
1164       
1165        if(status) {
1166                dprint(0, "error : DMW_ASC_StartScan(err code : %d\n", status);
1167        }
1168       
1169        while(1)
1170        {
1171                if (s_bAutoScanOnGoing) //AutoScan ÀÌ ½ÃÀ۵ɶ§±îÁö waitÇÑ´Ù.
1172                        break;
1173                DHL_OS_Delay(100);     
1174        }
1175       
1176        return;
1177}
1178
1179
1180/*
1181        ½ÅÈ£°¡ ÀâÇô ÀÖ´Â rfµé¸¸ ´Ù½Ã scanÇÑ´Ù.
1182*/
1183void App_AutoScan_RestartScan(BOOL bAddOnMode)
1184{
1185#if 0 //not supported
1186        STATUS status;
1187        int nScanFlags;
1188        int i, idx, start, end;
1189        UINT8 rfMap[135];
1190
1191        // autoscan °æ¿ì¿¡´Â Ưº°È÷ ä³Î º¹±¸ ÀÛ¾÷¿¡ ¾à°£ÀÇ º¯µ¿ÀÌ ÀÖ´Ù.
1192        // ÇöÀç Á¤»ó ½Ãû »óÅÂÀÏ °æ¿ì autoscan ÈÄ¿¡ Çö ä³ÎÀ» À¯ÁöÇϰí,
1193        // ÇöÀç »óŰ¡ Á¤»óÀÌ ¾Æ´Ï¶ó¸é autoscan ÈÄ¿¡ ÀÓÀÇ À¯È¿ ä³ÎÀ» Æ©´×ÇÑ´Ù.
1194
1195        App_Autoscan_ChBackupBeforeScan(); // cafrii 060814
1196
1197        // note
1198        // setup wizard°¡ ½ÇÇàµÇ´Â °æ¿ì¶ó¸é ÇöÀç ä³Î Á¤º¸´Â invalidÇÒ °ÍÀÓ.
1199
1200        App_ChTuneStopTV();
1201
1202        // cafrii 070713 bugfix.
1203        // autoscan ÈÄ¿¡´Â prev ch µ¿ÀÛ ¾ÈÇØ¾ß ÇÔ.
1204        // ÇöÀç´Â Stop TV ³»ºÎ¿¡ prev ch backup ÇÏ´Â Äڵ尡 À־ ¹®Á¦°¡ µÊ.
1205        App_ResetPrevChannelInfo();
1206
1207        // ¾îÂ¥ÇÇ channel banner osd´Â priority¿¡ ÀÇÇØ Áö¿öÁ³Áö¸¸
1208        // ºÒÇÊ¿äÇÑ timer°¡ ³²¾ÆÀÖÀ»Áö ¸ð¸£¹Ç·Î cancel ½ÃŲ´Ù.
1209        // ¾ø¾îµµ Ưº°È÷ ¹®Á¦µÇ´Â ÄÚµå´Â ¾Æ´Ô.
1210
1211        // TODO: After porting banner
1212        //App_CancelChBanner();  // cafrii 060919 add
1213
1214        App_EpgDeleteAll(); // ±âÁ¸ÀÇ epg dbµµ ¸ðµÎ Áö¿ì´Â°Ô ¾ÈÀüÇÔ.
1215       
1216       
1217        if (!bAddOnMode)//rescan mode
1218        {
1219                DMW_CDB_ClearAll();
1220
1221                App_NVM_EraseUcm();
1222        }
1223       
1224        if(g_CurChannelType == ChannelType_Air) {
1225                start=2, end=69;
1226        }
1227        else {
1228                start=1, end=135;
1229        }
1230       
1231        for(i=start, idx=0; i<=end; i++) {
1232                if(App_Ucm_FindChannelByRF(i, 1, NULL)!=-1) {
1233                        rfMap[idx++]=i;
1234                }
1235        }
1236
1237        if (g_CurChannelType == ChannelType_Air)
1238#if SUPPORT_NEWBY
1239                nScanFlags = CBTF_Air | CBTF_8VSB | CBTF_IgnoreNtscInVct |
1240                                        CBTF_ForcePSI;
1241#else
1242                nScanFlags = CBTF_Air | CBTF_8VSB | CBTF_IgnoreNtscInVct |
1243                                        CBTF_ForcePSI |
1244                                        CBTF_DontSelectMaxChannel;
1245#endif
1246        else
1247#if SUPPORT_NEWBY
1248                nScanFlags = CBTF_Cable | CBTF_8VSB | 
1249                                        CBTF_IgnoreNtscInVct |
1250                                        CBTF_ForcePSI;
1251#else
1252                nScanFlags = CBTF_Cable | CBTF_8VSB | CBTF_QAM | 
1253                                        CBTF_IgnoreNtscInVct |
1254                                        CBTF_ForcePSI | 
1255                                        CBTF_DontSelectMaxChannel;
1256#endif
1257       
1258        nScanFlags |= SET_SCAN_POLICY;
1259       
1260        status = DMW_ASC_StartScanEx(nScanFlags, _AppAutoScanEventProc, rfMap, idx);
1261       
1262        if(status) {
1263                dprint(0, "error : DMW_ASC_StartScan(err code : %d\n", status);
1264        }
1265       
1266        while(1)
1267        {
1268                if (s_bAutoScanOnGoing) //AutoScan ÀÌ ½ÃÀ۵ɶ§±îÁö waitÇÑ´Ù.
1269                        break;
1270                DHL_OS_Delay(100);     
1271        }
1272       
1273        return;
1274       
1275#endif
1276}
1277
1278
1279
1280
1281
1282void App_AutoScan_TunerSet(ScanTunerSetCbParam *param)
1283{
1284        AppScan_TunerSet(param);
1285}
1286
1287
1288int App_Autoscan_GetProgressPercent()
1289{
1290        if(!s_bAutoScanOnGoing) return 0;
1291       
1292        return s_scan_progress_percent;
1293}
1294
1295void App_Autoscan_SetSTTCheck(BOOL bset)
1296{
1297        //scan Áß¿¡ STT ¼ö½ÅÀ» üũÇÔ.
1298        //°¡Àå ¸ÕÀú °Ë»öµÇ´Â STT¸¦ »ç¿ëÇÔ.
1299        b_stt_gathering=bset;
1300        b_stt_set=FALSE;
1301}
1302
1303BOOL App_Autoscan_IsSttChecked()
1304{
1305        printf("-----stt...(%d)\n", b_stt_set);
1306        return b_stt_set;
1307}
1308
1309
1310#if COMMENT
1311____Symbol____(){}
1312#endif
1313
1314#if NEO_REGISTER_DEBUG_SYMBOL
1315
1316static DHL_SymbolTable _AutoscanSymbolx[] =
1317{
1318        //DHL_FNC_SYM_ENTRY2("siglock_3pass", siglock_3pass),
1319        DHL_FNC_SYM_ENTRY2("autoscan", App_AutoScan_StartScan),
1320
1321        DHL_VAR_SYM_ENTRY(g_Timeout_AutoscanLock),
1322};
1323
1324static void RegisterSymbols(void)
1325{
1326        DHL_DBG_RegisterSymbols(_AutoscanSymbolx, DHL_NUMSYMBOLS(_AutoscanSymbolx));
1327}
1328
1329#else
1330static void RegisterSymbols(void) { }
1331
1332#endif  /* NEO_REGISTER_DEBUG_SYMBOL */
1333
1334
1335
1336
1337
1338#if COMMENT
1339____Init____(){}
1340#endif
1341
1342// cafrii 060714 add
1343void App_AutoScanInit(void)
1344{
1345        RegisterSymbols();
1346}
1347
1348
1349
1350
1351
1352/* end of file */
Note: See TracBrowser for help on using the repository browser.