source: svn/newcon3bcm2_21bu/dst/app/src/Function/App_Fnc_SignalMonitor.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: 49.3 KB
Line 
1/****************************************************************************
2* NAME: App_Fnc_SignalMonitor.c
3*----------------------------------------------------------------------------
4* Copyright (c) DIGITAL STREAM Technology Inc.
5*----------------------------------------------------------------------------
6* CREATED_BY: Chan Hun Jeon
7* CREATION_DATE: 2009/08/27
8* $Author: chjeon $
9* $Revision: 1.1 $
10* $Date: 2009/07/08 15:08:26 $
11*----------------------------------------------------------------------------
12* PURPOSE:
13*       - Implement signal monitor module
14*****************************************************************************/
15
16/*_____ I N C L U D E __________________________________________*/
17
18#include "App_Main.h"
19
20#if SUPPORT_SIGMON
21
22#include "App_Fnc_Common.h"
23
24#include "App_Fnc_SignalMonitor.h"
25#include "App_Fnc_Audio.h"
26#include "App_Fnc_Video.h"
27#include "App_Fnc_ChTune.h"
28
29#include "App_Res_Resources.h"
30
31
32
33
34
35/*_____ D E F I N I T I O N ____________________________________*/
36
37#if COMMENT
38____DbgPrint____(){}
39#endif
40
41DHL_MODULE("@f_sim", 0);
42
43
44
45
46
47#if COMMENT
48____Config____(){}
49#endif
50
51#define SIG_COMMENT 0
52
53
54#define USE_AV_MUTE 1
55        // Stop/Start ´ë½Å mute/unmute·Î Á¦¾îÇÏ´Â ¹æ¹ý.
56        // ¾ÆÁ÷±îÁö ÇØ°áÇØ¾ß ÇÒ ¹®Á¦°¡ Á» ÀÖÀ½. ÀÏ´Ü hold..
57        //
58        // cafrii 101208 change.
59        // ÀÏ´Ü No Program ºÎºÐ¿¡ ÇÑÇÏ¿© ½ÃÇèÀûÀ¸·Î 1·Î ¼³Á¤.
60        // AV Mute ±â´ÉÀ» »ç¿ëÇÒ °æ¿ì AV decodingÀº ¿©ÀüÈ÷ ÁøÇà ÁßÀ̹ǷÎ
61        // NOPGM »óÅ¿¡¼­ retry¸¦ ¼öÇàÇÒ Çʿ䰡 ¾ø´Ù. µû¶ó¼­ ÀÌ ºÎºÐ Á¦°ÅÇÔ.
62
63       
64
65#define USE_SER 0
66
67
68#define SM_SIGNAL_SAMPLES_MAX 20
69
70int SM_SIGNAL_SAMPLES = 1;
71        // SNRÀ» »ùÇøµÇϴ ȸ¼ö
72        // ÇØ´çȸ¼ö¸¸Å­ ¹Ýº¹ÇÏ¿© Æò±Õ°ªÀ» ±¸ÇÑÈÄ ³·À¸¸é ºñµð¿À¿Í ¿Àµð¿À¸¦ ³»¸°´Ù.
73        // cafrii comment
74        //  ¿¬¼Ó counter °³³äÀ» µµÀÔÇϸ鼭 Æò±Õ °è»êÀº ÇÏÁö ¾ÊÀ½.
75
76
77
78// unit : millisecond
79//
80#define SM_LOOP_BASE_MS 200
81
82#define SM_PERIOD(ms) ((ms)/SM_LOOP_BASE_MS)
83
84// ¾Æ·¡ °ªµéÀº constant·Î ÇØµµ µÇ´Âµ¥,
85// ½ÇÇàÁß¿¡ º¯°æÇØ °¡¸é¼­ Å×½ºÆ® Çϱâ À§ÇØ ÀÏ´Ü º¯¼ö·Î..
86// ¸ðµÎ LOOP_BASE ÀÇ ¹è¼ö·Î ÇØ¾ß ÇÑ´Ù.
87
88
89#define NEO_REGISTER_DEBUG_SYMBOL 0
90
91#define USE_FORCE_TUNE_RETRY_IN_LOW_SIG 1
92        // ½ÅÈ£°¡ ³·¾Æµµ °­Á¦·Î retryÇÔ
93
94
95
96#if COMMENT
97____Types____(){}
98#endif
99
100#if 0 // to header file
101//
102// Signal Monitor State machineÀÇ ³»ºÎ »óÅÂ.
103//
104typedef enum
105{
106        APP_SM_STAT_DISABLED,
107        APP_SM_STAT_STOP,
108        APP_SM_STAT_HIGH,
109        APP_SM_STAT_LOW,
110        APP_SM_STAT_AUDIO,
111        APP_SM_STAT_NOPGM,
112       
113} APP_SIGMON_STAT;
114#endif // 0
115
116//
117// SM task°¡ ¹Þ´Â command
118//
119typedef enum 
120{
121        APP_SM_CMD_START,
122        APP_SM_CMD_STOP,
123
124        APP_SM_CMD_ENABLE,  // enable µÇ¾ú´Ù°í ¹Ù·Î StartµÇÁö´Â ¾Ê´Â´Ù.
125        APP_SM_CMD_DISABLE,
126
127        APP_SM_CMD_TOKEN_AVAIL,    // ¿¹¾à ÇØ ³õ¾Ò´ø ÅäÅ«ÀÌ ¹ÝȯµÇ¾úÀ½. ÀÌÈÄ OSD »ç¿ë °¡´É.
128        APP_SM_CMD_TOKEN_REMOVAL,  // »ç¿ëÁßÀÌµÈ ÅäÅ«ÀÌ °­Á¦·Î Ÿ °³Ã¼·Î ÀÌÀüµÇ¾úÀ½. OSD »ç¿ë ±ÝÁö
129
130        APP_SM_CMD_CHANGE_PARAM,
131
132        APP_SM_CMD_TEST_MODE,
133
134} APP_SIGMON_CMD;
135
136
137//
138// SigMon task·Î Àü´ÞµÇ´Â message ±¸Á¶Ã¼
139//
140typedef struct
141{
142        APP_SIGMON_CMD cmd;
143
144        UINT32 param; // °¢ command º°·Î Àǹ̰¡ ´Ù¸§.
145        UINT32 param2; 
146
147        DHL_OS_SEMA_ID sem; // wait sema4
148
149} APP_SIGMON_MSG;
150
151
152
153
154
155#if COMMENT
156____Variables____(){}
157#endif
158
159int SM_CHECK_PERIOD_LO_SIGNAL = SM_PERIOD(200);   // 0.2 sec
160//int SM_CHECK_PERIOD_HI_SIGNAL = SM_PERIOD(1000);  // 1 sec
161int SM_CHECK_PERIOD_HI_SIGNAL = SM_PERIOD(200);
162        // °¢ ½ÅÈ£ »óÅ¿¡¼­ Signal check period.
163        // Lo signal¿¡¼­´Â »¡¸® »óŸ¦ Å»ÃâÇϱâ À§Çؼ­ ¾ÆÁÖ ºó¹øÇÏ°Ô Ã¼Å©¸¦ ÇÑ´Ù.
164
165
166int SM_BANNER_SHOW_PERIOD = SM_PERIOD(1800);  // 1.8 sec
167        // banner°¡ À̵¿ÇÏ´Â ÁÖ±â.
168        // ¸ðµç À¯ÇüÀÇ banner¿¡ µ¿ÀÏÇÏ°Ô Àû¿ëµÈ´Ù.
169
170int SM_BANNER_AUDONLY_SHOW_PERIOD = SM_PERIOD(1800);
171
172       
173int SM_RETRY_TUNE_PERIOD = SM_PERIOD(10000); // 6 sec
174        // Low signal, No Program »óÅ¿¡¼­ tune retryÇÏ´Â ÁÖ±â..
175        // Çѹø retry¸¦ ½ÃµµÇÏ¸é ±× retry°¡ ¿ÏÀüÈ÷ Á¾·áÇÏ°í ³ª¼­ ´Ù½Ã ½Ã°£ count¸¦ ÇÑ´Ù.
176        // µû¶ó¼­ tuning ½Ãµµ¿¡ °É¸®´Â ½Ã°£À» Æ÷ÇÔÇϸé À̺¸´Ù ´õ ±æ¾îÁú ¼ö ÀÖ´Ù.
177
178int SM_KEEP_STAT_MAX_COUNT = SM_PERIOD(15000); // 15 sec
179        // tuningÀ» ½ÃÀÛ ÇÏ°í ³ª¸é ÀÏÁ¤ ½Ã°£µ¿¾È keep mode·Î µé¾î°£´Ù.
180        // Á¤»óÀûÀ̶ó¸é tune callback¿¡ ÀÇÇØ keep mode¸¦ Å»ÃâÇÏ°Ô µÇ´Âµ¥,
181        // ºñÁ¤»óÀûÀÎ »óȲ¿¡¼­ ÀÚµ¿À¸·Î keep mode¸¦ ¹þ¾î³ª°Ô µÇ´Â ÃÖ´ë ½Ã°£..
182
183int SM_KEEP_PERIOD_NO_PROGRAM = SM_PERIOD(3000); // 3;
184#if 0
185int SM_KEEP_PERIOD_AUDIO_ONLY = SM_PERIOD(3000); // 1.5;
186#else
187int SM_KEEP_PERIOD_AUDIO_ONLY = SM_PERIOD(4000); // 0.5;
188#endif
189        // °¢ ¸ðµå·Î ÁøÀÔÇϱâ À§ÇØ ÇÊ¿äÇÑ À¯Áö ±â°£.
190        // ¿¬¼ÓÀ¸·Î ÀÌ È½¼ö ¸¸Å­ detect µÇ¾î¾ß state change¸¦ ÇÑ´Ù.
191
192int SM_INITIAL_DELAY_MS = 0;
193        // cafrii 060728 add
194        // SigMonÀÌ ³Ê¹« »¡¸® µ¿ÀÛÇØ¼­ È­¸éÀÌ Çѹø¾¿ ±ô¹ÚÀÌ´Â ¹®Á¦ ¹ß°ßµÊ.
195        // Oren API°¡ ¹ÝÀÀÀÌ ´Ê±â ¶§¹®¿¡ Æ©´× ¼º°ø ÀÌÈÄ¿¡ SER°ªÀÌ Á¤»ó
196        // µ¿ÀÛÇϴµ¥±îÁö ½Ã°£ÀÌ ¾à°£ °É¸². ´ë·« 1ÃÊ ³»¿Ü·Î ÃßÁ¤.
197        // ¿¹Àü¿¡´Â ¹«Á¶°Ç 1Ãʸ¦ ½¬¾ú´Âµ¥ º¯¼ö·Î ¼³Á¤ °¡´ÉÇÏ°Ô º¯°æÇÔ.
198        //
199        // CB2¿¡¼­ 1ÃÊ·Î ´ÜÃà..
200        //
201        // cafrii 070912, 1000 -> 0
202        //  ¿¬¼Ó packet error count·Î º¯°æÇÏ¿´À¸¹Ç·Î ´ë±â ½Ã°£ ºÒÇÊ¿ä.
203
204
205#if USE_SER
206        int SM_SIGNAL_LO_LIMIT = 200;
207        int SM_SIGNAL_HI_LIMIT = 200;
208                // Ã¥»ó¿¡¼­ ´«À¸·Î Å×½ºÆ®¿¡ ±Ù°ÅÇÏ¿© °áÁ¤µÈ °ª.
209                // ³ªÁß¿¡ Àåºñ·Î ´õ Æ©´×ÇØ¾ß ÇÔ.
210
211#else
212        //#define SIGNAL_LOWLIMIT     16    //17.5
213        //#define SIGNAL_RESETLIMIT   16.2   //17.6
214
215        // cafrii 101208, float ŸÀÔ »ç¿ë ¾ÈÇÔ.
216        // printf ¿¡¼­ %dµµ »ç¿ëÇϰí ÀÖ°í GetParamµî¿¡¼­ intÇü º¯¼ö·Î µ¥ÀÌÅ͸¦ ¹Þ°í ÀÖÀ¸¹Ç·Î..
217        int SM_SIGNAL_LO_LIMIT = 29;//33;
218        int SM_SIGNAL_HI_LIMIT = 30;//34;
219#endif
220
221
222//#define SignalCheckCount 5    // 5¹ø ¿¬¼ÓÀ¸·Î High ¶Ç´Â Low·Î »óŰ¡ À¯ÁöµÇ¸é Signal Status º¯°æ (High->Low or Low->High)
223// cafrii 070912 change
224//  high->low, low->high »óÅÂÀÇ Á¶°ÇÀ» ´Ù¸£°Ô ÇÔ.
225int SM_SIGNAL_CHECK_COUNT_THRESHOLD_H2L = SM_PERIOD(10000); // 10ÃÊ
226int SM_SIGNAL_CHECK_COUNT_THRESHOLD_L2H = SM_PERIOD(1000); // 1ÃÊ
227
228
229
230#if COMMENT
231____Variables____(){}
232#endif
233
234BOOLEAN sm_debug = 0;
235
236
237UINT8 sm_nBannerPosition = 0;
238int sm_nBannerShowCount;
239
240
241APP_SIGMON_STAT sm_stat = APP_SM_STAT_STOP;
242
243
244UINT32 sm_msSigMonStart;
245
246
247int sm_nLowSignalCheckWaitCount;
248int sm_nHighSignalCheckWaitCount;
249
250int sm_nRetryTuneWaitCount;
251
252
253int sm_nKeepStateCount;
254
255
256int sm_nNoProgramRepeatCount;
257        //
258        // ÀÌ È½¼ö ÀÌ»ó ¿¬¼ÓÀ¸·Î NoProgramÀÎ °æ¿ì¿¡ µ¿ÀÛÇÑ´Ù.
259
260int sm_nAudioOnlyRepeatCount;
261
262
263BOOLEAN sm_bDisplayBanner = FALSE;
264        // ÇöÀç ¹è³ÊÀÇ Ç¥½Ã »óÅ keep..
265
266
267BOOLEAN sm_bStartSignalMonitor = FALSE;
268        // signal monitor¸¦ enable ÇØÁÜ. False À̸é signal monitor°¡ µ¿ÀÛÇÏÁö ¾Ê´Â´Ù.
269        // »ç¿ëÀÚ°¡ ´Ù¸¥ ä³Î·Î Æ©´×À» ÇÏ´øÁö ¾Æ´Ï¸é EPG³ª info banner °¡ µ¿ÀÛ ÇÒ ¶§ FALSEÇØµÎ¸é µÈ´Ù.
270        // ´Ü, FALSEÇÑ ÈÄ Banner ¸¦ Áö¿î´ÙµçÁö ÇÏ´Â °ÍÀº »ç¿ëÀÚÀÇ ¸ò.
271        // µÇµµ·ÏÀ̸é ÀÌ·± °æ¿ì ¾Æ·¡ Á¤ÀÇµÈ Refresh ÇÔ¼ö¸¦ ¾²µµ·Ï ÇÑ´Ù.
272
273
274DHL_OS_MSGQ_ID sm_msg_q;
275DHL_OS_TASK_ID sm_task_id;
276
277BOOL sm_bOsdTokenGet;
278
279
280// signal data°¡ ÀúÀåµÇ´Â °ø°£
281int sm_SignalData[SM_SIGNAL_SAMPLES_MAX];
282int sm_SignalAverage;
283
284int sm_idxSample;
285int sm_numSamples;
286
287
288int sm_nAnalogUnlockCount;
289
290BOOL sm_bNoSignalChannelStop = 1;
291        // cafrii 070417 add
292        // Áö±Ý±îÁö´Â weak signal »óŰ¡ µÇ¸é channel stopÀ» Çߴµ¥
293        // philipsÀÇ ¿ä±¸¿¡ ÀÇÇØ¼­ ±×³É white noise »óÅ·ΠµÎ´Â ¿É¼ÇÀÌ »ý°åÀ½.
294        // ´Ü ÀÌ ±â´ÉÀº analog channel ¿¡¸¸ ÇØ´çµÈ´Ù.
295        // µðÆúÆ®´Â 1, channel stopÀ̰í, 0À̸é audio mute¸¸ ¼öÇàÇÑ´Ù.
296
297
298BOOL sm_bSkipLowSigMode;
299        // cafrii 070613 add
300        // TRUEÀ̸é low signal mode·Î ÁøÀÔÇÏÁö ¾Ê´Â´Ù.
301        // ÁÖ·Î tuner Ư¼º üũ¸¦ ÇÒ ¶§ »ç¿ë.
302
303
304// Updated by Chan Hun Jeon 2007.07.11
305//#define SignalCheckCount 5    // 5¹ø ¿¬¼ÓÀ¸·Î High ¶Ç´Â Low·Î »óŰ¡ À¯ÁöµÇ¸é Signal Status º¯°æ (High->Low or Low->High)
306// --> config sectionÀ¸·Î À̵¿.
307
308UINT32 sm_LowSignalCounts;              // LowSignalÀÌ ¿¬¼ÓÀ¸·Î ¹ß»ýÇÑ È½¼ö
309UINT32 sm_HighSignalCounts;             // HighSignalÀÌ ¿¬¼ÓÀ¸·Î ¹ß»ýÇÑ È½¼ö
310
311
312/* neverdai add 091106 */
313UINT32 sm_status_last_change_ms;
314
315int sm_resume_ms=0; //sm resumeµÈ ½Ã°¢.
316
317#define SM_GET_PAST_MS_AFTER_RESUME() (DHL_OS_GetMsCount()-sm_resume_ms)
318#define SM_MS_DONOT_VIDEO_STOP 3000
319
320/*_____ F U N C T I O N ________________________________________*/
321
322#if COMMENT
323____Func____(){}
324#endif
325
326void SigMon_DrawLogo(int nMode, UINT8 sm_nBannerPosition);
327void SigMon_EraseLogo(UINT8 sm_nBannerPosition);
328
329void SigMon_StartTV(void);
330void SigMon_StopTV(void);
331
332int SigMon_GetStrength(void);
333int SigMon_GetSNR100(void);
334
335void App_HideSigBanner(void) {}
336
337
338char *SigMon_StatString(APP_SIGMON_STAT stat)
339{
340        return 
341                stat == APP_SM_STAT_DISABLED ? "Disabled" :
342                stat == APP_SM_STAT_STOP ? "Stop" :
343                stat == APP_SM_STAT_HIGH ? "Good" :
344                stat == APP_SM_STAT_LOW ? "Low" :
345                stat == APP_SM_STAT_AUDIO ? "Aud" :
346                stat == APP_SM_STAT_NOPGM ? "NoP" :
347                stat == APP_SM_STAT_HIGH_ANALOG ? "A_High" :
348                stat == APP_SM_STAT_LOW_ANALOG ? "A_Low" :
349                "?";
350}
351
352
353char *SigMon_ParamString(APP_SIGMON_PARAM param)
354{
355        return APP_SIGMON_PARAM_STR(param);
356}
357
358
359int SigMon_GetParam(APP_SIGMON_PARAM param)
360{
361        int val = 0;
362
363        if (param == APP_SM_PARAM_NUM_SAMPLES)
364                val = SM_SIGNAL_SAMPLES;
365        else if (param == APP_SM_PARAM_CHECK_PERIOD_LO)
366                val = SM_CHECK_PERIOD_LO_SIGNAL;
367        else if (param == APP_SM_PARAM_CHECK_PERIOD_HI)
368                val = SM_CHECK_PERIOD_HI_SIGNAL;
369        else if (param == APP_SM_PARAM_BANNER_SHOW_PERIOD)
370                val = SM_BANNER_SHOW_PERIOD;
371        else if (param == APP_SM_PARAM_RETRY_TUNE_PERIOD)
372                val = SM_RETRY_TUNE_PERIOD;
373        else if (param == APP_SM_PARAM_KEEP_PERIOD_NOPGM)
374                val = SM_KEEP_PERIOD_NO_PROGRAM;
375        else if (param == APP_SM_PARAM_KEEP_PERIOD_AUDIO)
376                val = SM_KEEP_PERIOD_AUDIO_ONLY;
377        else if (param == APP_SM_PARAM_INITIAL_DELAY_MS)
378                val = SM_INITIAL_DELAY_MS;
379        else if (param == APP_SM_PARAM_SIGNAL_LO_LIMIT)
380                val = SM_SIGNAL_LO_LIMIT;
381        else if (param == APP_SM_PARAM_SIGNAL_HI_LIMIT)
382                val = SM_SIGNAL_HI_LIMIT;
383
384        else if (param == APP_SM_PARAM_SKIP_LOW_SIG_MODE) // cafrii 070613 add
385                val = sm_bSkipLowSigMode;
386
387        else if (param == APP_SM_PARAM_CHECK_COUNT_THRESHOLD_H2L) // cafrii 070712 add
388                val = SM_SIGNAL_CHECK_COUNT_THRESHOLD_H2L;
389        else if (param == APP_SM_PARAM_CHECK_COUNT_THRESHOLD_L2H) // cafrii 070712 add
390                val = SM_SIGNAL_CHECK_COUNT_THRESHOLD_L2H;
391
392        return val;
393}
394
395void SigMon_ChangeParam(APP_SIGMON_PARAM param, int value)
396{
397        if (param == APP_SM_PARAM_NUM_SAMPLES)
398                SM_SIGNAL_SAMPLES = value;
399        else if (param == APP_SM_PARAM_CHECK_PERIOD_LO)
400                SM_CHECK_PERIOD_LO_SIGNAL = value;
401        else if (param == APP_SM_PARAM_CHECK_PERIOD_HI)
402                SM_CHECK_PERIOD_HI_SIGNAL = value;
403        else if (param == APP_SM_PARAM_BANNER_SHOW_PERIOD)
404                SM_BANNER_SHOW_PERIOD = value;
405        else if (param == APP_SM_PARAM_RETRY_TUNE_PERIOD)
406                SM_RETRY_TUNE_PERIOD = value;
407        else if (param == APP_SM_PARAM_KEEP_PERIOD_NOPGM)
408                SM_KEEP_PERIOD_NO_PROGRAM = value;
409        else if (param == APP_SM_PARAM_KEEP_PERIOD_AUDIO)
410                SM_KEEP_PERIOD_AUDIO_ONLY = value;
411        else if (param == APP_SM_PARAM_INITIAL_DELAY_MS)
412                SM_INITIAL_DELAY_MS = value;
413        else if (param == APP_SM_PARAM_SIGNAL_LO_LIMIT)
414                SM_SIGNAL_LO_LIMIT = value;
415        else if (param == APP_SM_PARAM_SIGNAL_HI_LIMIT)
416                SM_SIGNAL_HI_LIMIT = value;
417
418        else if (param == APP_SM_PARAM_SKIP_LOW_SIG_MODE) {  // cafrii 070613 add
419                sm_bSkipLowSigMode = value;
420                // TODO:       
421                //App_WriteEEPROMByte(OFFSET_SYSFILE_SIGMON_TESTMODE, value ? 1 : 0);
422        }
423
424        // cafrii 070912 add
425        else if (param == APP_SM_PARAM_CHECK_COUNT_THRESHOLD_H2L)
426                SM_SIGNAL_CHECK_COUNT_THRESHOLD_H2L = value;
427        else if (param == APP_SM_PARAM_CHECK_COUNT_THRESHOLD_L2H)
428                SM_SIGNAL_CHECK_COUNT_THRESHOLD_L2H = value;   
429}
430
431
432/*
433        SigMon_DrawLogo
434
435        nMode:
436                0 - No signal banner
437                1 - No program banner
438                2 - Audio only banner
439        nBannerPosition:
440                0 ~ 4, 0 is center position
441*/
442void SigMon_DrawLogo(int nMode, UINT8 nBannerPosition)
443{
444        if (sm_debug)
445                dprint(0, "[SM] draw logo, pos %d, token %d\n", nBannerPosition, sm_bOsdTokenGet);
446
447#if 0
448        if (sm_bOsdTokenGet == 0)
449                return;
450#endif
451        // cafrii 070206 add for exception control
452        // TODO: OSD   
453//      if (AppGrp_CheckOsdExist(APP_OSD_SIGMON) == 0)
454        {
455                //dprint(0, "[SM] !! token variable set, but no token\n");
456                if (sm_bDisplayBanner)
457                        SigMon_EraseLogo(sm_nBannerPosition);
458#if 0
459                sm_bOsdTokenGet = 0;
460                return;
461#endif
462        }
463#if 1
464        DMG_SetUserDefined(UD_ID_SIG_MON, nMode+3, nBannerPosition);
465#endif
466
467#if 0
468        App_OSD_DrawWeakSignal(nBannerPosition);
469#endif
470       
471        if (!sm_bDisplayBanner)
472                sm_bDisplayBanner = TRUE;
473}
474
475
476/*
477        SigMon_EraseLogo
478*/
479void SigMon_EraseLogo(UINT8 nBannerPosition)
480{
481        if (sm_debug)
482                dprint(0, "[SM] erase logo, token %d\n", sm_bOsdTokenGet);
483
484#if     0
485        if (sm_bOsdTokenGet == 0)
486                return;
487
488        App_HideSigBanner();
489#else
490        DMG_SetUserDefined(UD_ID_SIG_MON, UD_PARAM_SIG_MON_ERASE_BANNER, nBannerPosition);
491#endif 
492        if (sm_bDisplayBanner)
493                sm_bDisplayBanner = FALSE;
494}
495
496void SigMon_AudioOnlyMuteTV(BOOL bMute)
497{
498        static BOOL bMuteOld = FALSE;
499        if (bMute == bMuteOld) return;
500        bMuteOld = bMute;
501        dprint(0, "[%s] %s TV\n", __func__, bMute ? "mute" : "unmute");
502        App_VideoSetBlank(bMute, APP_VIDEO_MUTE_AUDIOONLY);
503}
504
505void SigMon_MuteTV(BOOL bMute)
506{
507        dprint(0, "[SM] %s TV\n", bMute ? "mute" : "unmute");
508       
509        if (bMute)
510        {
511                App_VideoSetBlank(TRUE, APP_VIDEO_MUTE_SIGMON);
512                App_AudioMute(TRUE, APP_AUDIO_MUTE_SIGMON);
513        }
514        else
515        {
516                App_VideoSetBlank(FALSE, APP_VIDEO_MUTE_SIGMON);
517                App_AudioMute(FALSE, APP_AUDIO_MUTE_SIGMON);
518        }
519}
520
521
522/*****************************************************************************************
523        SigMon_StartTV
524       
525        - Signal Strength MonitorÀÇ µ¿ÀÛ¿¡ ÀÇÇØ¼­ ÇöÀç ä³Î¼³Á¤´ë·Î ÀçÆ©´×ÈÄ
526                Main Video,Audio¸¦ Enable.
527*****************************************************************************************/
528void SigMon_StartTV(void)
529{
530        DST_CURCHANNEL ChannelInfo;
531        App_Ucm_GetCurChInfo(&ChannelInfo);
532       
533        if (ChannelInfo.nUid > 0)
534        {
535                dprint(0, "[SM] start tv, uid %d\n", ChannelInfo.nUid);
536                //App_TuneChannelByUidEx(ChannelInfo.nUid, APP_UID_TUNE_FROM_SIGMON);
537                App_ChTuneQuickScanAndTune(ChannelInfo.nRF, ChannelInfo.nProgramNumber, APP_QUICKSCAN_SIGMON);
538        }
539#if 0 // No analog tune function in CB
540        else if (APP_CUR_CH.bAnalog)
541        {
542                dprint(0, "[SM] start tv, analog scan rf %d\n", APP_CUR_CH.nRF);
543                App_ChTuneAnalogScanAndTune(APP_CUR_CH.nRF, APP_QUICKSCAN_SIGMON);
544        }
545#endif
546        else 
547        {
548                dprint(0, "[SM] start tv, quickscan rf %d\n", ChannelInfo.nRF);
549                // cafrii 070426
550                //  program number ±îÁö ÁöÁ¤Çؼ­ Æ©´×Çϵµ·Ï ÇÏÀÚ.
551                App_ChTuneQuickScanAndTune(ChannelInfo.nRF, ChannelInfo.nProgramNumber, APP_QUICKSCAN_SIGMON);
552        }       
553}
554
555
556/*****************************************************************************************
557        SigMon_StopTV
558               
559        - Signal Strength MonitorÀÇ µ¿ÀÛ¿¡ ÀÇÇØ¼­ ÇöÀç MainÀ» Á¤Áö½ÃŲ´Ù.
560*****************************************************************************************/
561void SigMon_StopTV(void)
562{
563        dprint(0, "[SM] Stop TV\n");
564       
565#if 1
566        App_ChTuneStopTVEx(TRUE);
567
568        #if USE_AV_MUTE
569                // TV Unmute ÇÏ¸é ¾ÈµÈ´Ù! ¸¶Áö¸· Á¤Áö ¿µ»óÀÇ ÀÜ»óÀÌ ³ªÅ¸³ª¹ö¸². »õ·Ó°Ô ä³Î Æ©´× Çϸ鼭 Æ©´×¿¡ ¼º°ø ÇÒ ¶§ Ç®¾îÁà¾ß ÇÔ.
570                // ¿Àµð¿À´Â Ç®¾îÁ൵ µÊ.
571                App_AudioMute(FALSE, APP_AUDIO_MUTE_SIGMON);
572        #else
573                // Ȥ½Ã °É·Á ÀÖÀ» ¼ö ÀÖ´Â mute¸¦ Ç®¾îÁÜ.
574                SigMon_MuteTV(FALSE);
575        #endif
576
577#else // original code..
578        App_CC_Stop();
579       
580        App_CancelSyncSTT();
581        App_EpgUpdateCancel();
582
583        Dmc_StopVideo();
584
585        // todo
586        // sigmon start/stop ÇÒ ¶§¸¶´Ù EA start/stop ÇØ¾ß Çϴ°¡?
587        //
588#if 1 //EA Áö¿ø
589        AppEA_ExitExec();
590        AppEA_MonitorStop(TRUE);
591#endif
592#endif // #if 1
593}
594
595
596/*
597        digital lock / unlock »óÅÂ
598*/
599BOOL SigMon_GetLockState(void)
600{
601        DHL_RESULT dhlResult;
602        UINT32 value;
603
604        dhlResult = DHL_FE_GetSignalStatus(DEFAULT_TUNER_ID, eDHL_SIGNAL_LOCK, &value);
605       
606        if (dhlResult == DHL_OK)
607                return value ? 1 : 0;
608        else
609                return 0;
610}
611
612
613int SigMon_GetSNR100(void)
614{
615        DHL_RESULT dhlResult;
616        UINT32 value;
617
618        // SIGNAL_SNRÀº SNR x 1000 °ªÀ» µÇµ¹·Á ÁØ´Ù.
619        dhlResult = DHL_FE_GetSignalStatus(DEFAULT_TUNER_ID, eDHL_SIGNAL_SNR, &value);
620        if (dhlResult == DHL_OK)
621                return value / 10; // SNR x 100 °ªÀ¸·Î Àüȯ..
622        else
623                return 0;
624}
625
626
627#if 0
628BOOL SigMon_IsAnalog(void)
629{
630        if (DHL_CAP_IsAnalogContext())
631                return TRUE;
632        else
633                return FALSE;
634}
635#endif // #if 0
636
637
638int SigMon_GetStrength(void)
639{
640        DHL_RESULT dhlResult;
641        UINT32 value = 0;
642
643        // chjeon 090911
644        // eDHL_SIGNAL_QUALITY -> eDHL_SIGNAL_STRENGTH ¼öÁ¤
645        // HAL¿¡¼­ Áö¿øÇÏ´Â ÆÄ¶ó¹ÌÅÍ·Î »ç¿ë
646        dhlResult = DHL_FE_GetSignalStatus(DEFAULT_TUNER_ID, eDHL_SIGNAL_STRENGTH, &value);
647
648        if (dhlResult == DHL_OK)
649                return value;
650        else
651                return 0;
652}
653
654
655int SigMon_Get1SecSER(void)
656{
657        DHL_RESULT dhlResult;
658        UINT32 value;
659       
660        dhlResult = DHL_FE_GetSignalStatus(DEFAULT_TUNER_ID, eDHL_SIGNAL_SER_1SEC, &value);
661        if (dhlResult == DHL_OK)
662                return (255 - (value&0xff));
663        else
664                return 0;
665}
666
667
668int SigMon_GetSignalMeter(void)
669{
670        DHL_RESULT dhlResult;
671        UINT32 value;
672       
673        dhlResult = DHL_FE_GetSignalStatus(DEFAULT_TUNER_ID, eDHL_SIGNAL_METER, &value);
674        if (dhlResult == DHL_OK)
675                return value/1000;
676        else
677                return 0;
678}
679
680/* MW ·¹º§¿¡¼­ ÇöÀç AV decodingÀÌ µ¿ÀÛ ÁßÀÎÁö üũ.
681        ´õ Àû´çÇÑ api°¡ ÀÖÀ¸¸é ±×°É »ç¿ëÇÒ °Í..
682*/
683BOOL SigMon_CheckDecodeRun(void)
684{
685        extern STATUS g_App_LastTuneResult;
686
687        if (g_App_LastTuneResult == statusOK) return TRUE;
688        else return FALSE;
689}
690
691
692void SigMon_ResetVariables(void)
693{
694        // cafrii 060725 change
695        // Start ½ÃÀÛÇϰí, initial period ±â´Ù¸®°í, sample make upÀ» ÇÏ°í ³ª¸é
696        // ¹Ù·Î check¸¦ 1ȸ ½ÃÀÛÇÒ ¼ö ÀÖµµ·Ï ¼öÁ¤.
697        // Hi signal »óÅ·Π½ÃÀÛÇÑ °æ¿ì Weak º¸´Ù No°¡ ¸ÕÀú ¶°¹ö¸®´Â °ÍÀ» ¸·±â À§ÇØ.
698        //
699        sm_nLowSignalCheckWaitCount = SM_CHECK_PERIOD_LO_SIGNAL;
700        sm_nHighSignalCheckWaitCount = SM_CHECK_PERIOD_HI_SIGNAL;
701       
702        //sm_nBannerShowCount = 0;
703        // cafrii 060725 remove
704        // µ¹¾Æ´Ù´Ï´ø banner´Â °è¼Ó ±×´ë·Î ¿òÁ÷À̵µ·Ï. Áß°£¿¡ ¸ØÄ©ÇÏÁö ¾Êµµ·Ï ÇÑ´Ù.
705       
706        sm_nRetryTuneWaitCount = 0;
707
708        // sm_nBannerPosition Àº Àý´ë resetÇÏÁö ¾Ê´Â´Ù.
709        //  drawing ÀÛ¾÷ Çϸ鼭 ¼öÁ¤..
710
711        sm_nNoProgramRepeatCount = 0;
712        sm_nAudioOnlyRepeatCount = 0;
713
714        sm_nKeepStateCount = 0;
715
716        sm_nAnalogUnlockCount = 0;
717}
718
719
720void SigMon_ResetSignalData(void)
721{
722        sm_idxSample = 0;
723        sm_numSamples = 0;
724        sm_SignalAverage= 0;
725}
726
727
728/*
729        OSD È­¸é »ó¿¡ SM debug message Ãâ·Â.
730*/
731void SigMon_ShowDebugOnScreen(const char *fmt, ...)
732{
733        if (sm_debug >= 3)
734        {
735                va_list v;
736                char buf[256];
737
738                va_start(v, fmt);
739                if (fmt)
740                        vsprintf(buf, fmt, v);
741                else
742                        strcpy(buf, "NULL");
743                va_end(v);
744
745                //DHL_OS_Printf("#### %s\n", buf);
746
747                // Menu token Áß¿¡¼­´Â Service Menu ÁøÀÔ ÅäÅ«ÀÎ °æ¿ì°¡ Àִµ¥,
748                // ±×·² °æ¿ì ÇØ»óµµ°¡ 720x480 ÀÌ µÇ¾î¼­ Ç¥½ÃºÒ°¡ÇÔ. µû¶ó¼­ Menu¿¡¼­´Â Á¦¿ÜÇÔ.
749
750                // TODO: OSD   
751                /*
752                if (AppGrp_CheckOsdExist(APP_OSD_DBG1) &&
753                        !AppGrp_CheckOsdExist(APP_OSD_MENU)) {
754                        App_ShowSignalStatus(buf);
755                }               
756                */
757        }
758}
759
760
761void SigMon_CheckSignal(void)
762{
763        int i;
764        int dataTemp, dataAverage;
765
766        int snr100, strength, ser, lock;
767        char buf[80];
768
769        lock = SigMon_GetLockState();
770        snr100 = SigMon_GetSNR100();
771        strength = SigMon_GetStrength();
772        ser = SigMon_Get1SecSER();
773
774        // µ¥ÀÌÅÍ »ðÀÔ..
775#if USE_SER
776        sm_SignalData[sm_idxSample] = ser;
777#else
778        sm_SignalData[sm_idxSample] = strength ;
779#endif
780
781        // count Á¶Á¤..
782        sm_numSamples = (sm_numSamples+1)>=SM_SIGNAL_SAMPLES ? SM_SIGNAL_SAMPLES : sm_numSamples+1;
783
784        /*
785                +---+---+---+---+---+---+---+---+
786                | D |   |   |   |   | D | D | D |
787                +---+---+---+---+---+---+---+---+
788                      ^
789                      idxSample
790        */
791       
792        // average °è»ê..
793        dataAverage = 0;
794        buf[0] = 0;
795        for (i=0; i<sm_numSamples; i++) {
796                // sm_idxSampleÀ» ½ÃÀÛÀ¸·Î Çϳª¾¿ ¾ÕÀ¸·Î °¡¸é¼­ Ç¥½Ã..
797                dataTemp = sm_SignalData[(sm_idxSample+SM_SIGNAL_SAMPLES-i)%SM_SIGNAL_SAMPLES];
798                dataAverage += dataTemp;
799                if (i<5)  // only print recent 5 data
800                        sprintf(buf + strlen(buf), " %d", dataTemp);
801        }
802        // index Á¶Á¤.
803        sm_idxSample = (sm_idxSample+1) % SM_SIGNAL_SAMPLES;
804
805        // Æò±Õ °è»ê
806        dataAverage = dataAverage / sm_numSamples;
807        sm_SignalAverage = dataAverage;
808
809        if (sm_debug)
810                dprint(0, "[SM] snr %d, str %d, ser %d, lck %d --> %d spl, avg %d\n", 
811                        snr100/100, strength, ser, lock,
812                        sm_numSamples, dataAverage);
813
814        // cafrii 070912 add
815        if (sm_stat == APP_SM_STAT_LOW) 
816        {
817                sprintf(buf, "Sig:[%s] %s T%2d %2d.%d p%02X +%d ", 
818                        SigMon_StatString(sm_stat),
819                        lock?"Lk":"--", strength, snr100/100, snr100/10%10,
820                        ser, sm_HighSignalCounts);
821        }
822        else //if (sm_stat == APP_SM_STAT_HIGH)
823        {
824                sprintf(buf, "Sig:[%s] %s T%2d %2d.%d p%02X -%d ", 
825                        SigMon_StatString(sm_stat),
826                        lock?"Lk":"--", strength, snr100/100, snr100/10%10,
827                        ser, sm_LowSignalCounts);
828        }
829        SigMon_ShowDebugOnScreen(buf);
830}
831
832
833void SigMon_SendCommand(APP_SIGMON_CMD cmd, UINT32 param, UINT32 param2, BOOL bWait)
834{
835        APP_SIGMON_MSG mesg;
836        int err;
837
838        if (Dmc_GetCurrentTaskID() == sm_task_id && bWait) {
839                dprint(0, "!! SigMon wait mode cmd in SigMon task!!\n");
840                bWait = FALSE;
841        }
842       
843        memset(&mesg, 0, sizeof(mesg));
844       
845        mesg.cmd = cmd;
846        mesg.param = param;
847        mesg.param2 = param2; // cafrii 060825 bugfix.
848       
849        if (bWait)
850                // cafrii 070416 use reusable semaphore
851                //mesg.sem = OS_CreateReuseSemaphore("", OS_SEM_FIFO, FALSE);
852                mesg.sem = DHL_OS_CreateBinarySemaphore("", OS_SEM_FIFO, FALSE);
853
854        err = DHL_OS_SendMessage(sm_msg_q, &mesg, sizeof(mesg));
855
856        if (err == 0 && mesg.sem) {
857                DHL_OS_TakeSemaphore(mesg.sem, DHL_TIMEOUT_FOREVER);
858                dprint(0, "[SM] Pause SM end\n");
859        }
860
861        if (mesg.sem)
862                DHL_OS_DeleteSemaphore(mesg.sem);
863}
864
865
866void SigMon_TakeToken(BOOL bTake)
867{
868        if (bTake)
869        {
870                // ÅäÅ« ¿äû.. Áö±Ý ´çÀå ÅäÅ«À» ¹ÞÁö ¸øÇÒ ¼öµµ ÀÖÀ½.
871
872                // ÀÌ¹Ì ÅäÅ« ¹Þ°í ÀÖ´Â »óÅÂÀÌ¸é ¹«½Ã..
873                //if (sm_bOsdTokenGet)  // ³»ºÎ »óÅ º¯¼ö¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ý
874                // TODO: OSD
875                /*
876                if (!AppGrp_CheckOsdPend(APP_OSD_SIGMON))  // GrpMan ÀÌ¿ëÇÏ´Â ¹æ¹ý
877                {
878                        if (AppGrp_GetToken(APP_OSD_SIGMON))
879                                sm_bOsdTokenGet = 1;
880                }
881                */
882               
883                // banner ±×¸®±â´Â ¾ÈÇÑ´Ù.
884        }
885        else
886        {
887                // ¹è³Ê°¡ ÀÖÀ¸¸é Áö¿î´Ù.
888                if (sm_bDisplayBanner)
889                        SigMon_EraseLogo(sm_nBannerPosition);
890
891#if 0
892                // ÅäÅ« ¹Ýȯ..
893                if (sm_bOsdTokenGet) {
894                        AppGrp_ReleaseToken(APP_OSD_SIGMON);
895                        sm_bOsdTokenGet = 0;
896                }
897#else
898                // cafrii 060928 bugfix!!
899                // variable üũ´Â ¾ÈµÈ´Ù. token pending list¿¡ µé¾î ÀÖÀ» ¼öµµ ÀÖÀ¸¹Ç·Î.
900
901                // TODO: OSD
902                /*
903                if (AppGrp_CheckOsdPend(APP_OSD_SIGMON)) { // GrpMan ÀÌ¿ëÇÏ´Â ¹æ¹ý
904                        AppGrp_ReleaseToken(APP_OSD_SIGMON);
905                }
906                */
907                sm_bOsdTokenGet = 0;
908#endif // #if 0
909        }
910}
911
912
913void SigMon_SetDbgLevel(int debug_level)
914{
915        sm_debug = debug_level;
916
917        // TODO: OSD
918        /*
919        if (sm_debug >= 3)
920                AppGrp_GetToken(APP_OSD_DBG1);
921        else
922                AppGrp_ReleaseToken(APP_OSD_DBG1);
923        */
924}
925
926
927int SigMon_GetDbgLevel(void)
928{
929        return sm_debug;
930}
931
932
933void SigMon_ChangeState(APP_SIGMON_STAT new_stat)
934{
935        dprint(0, "[SM] change state: %s(%d) -> %s(%d)\n",
936                        SigMon_StatString(sm_stat), sm_stat,
937                        SigMon_StatString(new_stat), new_stat);
938
939        sm_stat = new_stat;
940
941#if 1
942        if(sm_stat==APP_SM_STAT_HIGH) {
943                DMG_MenuExit(MID_SIG_MON);
944        }
945        else if(sm_stat==APP_SM_STAT_LOW || sm_stat==APP_SM_STAT_AUDIO || 
946                sm_stat==APP_SM_STAT_NOPGM) {
947                DMG_MenuStart(MID_SIG_MON);
948        }
949       
950        sm_status_last_change_ms=DHL_OS_GetMsCount();
951#endif // #if 1
952}
953
954
955
956
957
958#if COMMENT
959____Action____(){}
960#endif
961
962void SigMon_DoAction_LowSignal(void)
963{
964        // banner move
965        if (++sm_nBannerShowCount >= SM_BANNER_SHOW_PERIOD)
966        {
967                sm_nBannerShowCount = 0;
968                SigMon_EraseLogo(sm_nBannerPosition);
969                sm_nBannerPosition = (sm_nBannerPosition+1)%5;
970                SigMon_DrawLogo(0, sm_nBannerPosition);
971        }
972
973        if (sm_nKeepStateCount)
974                return;
975
976#if USE_FORCE_TUNE_RETRY_IN_LOW_SIG
977        // cafrii 101208 comment
978        // 'USE_AV_MUTE' ¿É¼ÇÀ» »ç¿ëÇÑ °æ¿ì¶ó¸é ½ÅÈ£°¡ ´Ù½Ã ÁÁ¾ÆÁö¸é ½º½º·Î hi signal »óŰ¡ µÇ±âµµ ÇÑ´Ù.
979        // ±×·¯³ª óÀ½ºÎÅÍ tuning fail µÇ¾î low signal µÈ °æ¿ì´Â ½º½º·Î ´Ù½Ã ÁÁ¾ÆÁö´õ¶óµµ
980        // av°¡ ½ÃÀÛµÇÁöµµ ¾Ê¾ÒÀ¸´Ï no pgm »óÅ·Π³²À» °ÍÀ̹ǷΠtune retry¸¦ ÇØÁÖ¾î¾ß ÇÒ °Í °°À½.
981        // ¶Ç Àå½Ã°£ °è¼Ó low signal »óÅÂÀ̸é tune retry°¡ ÀÇ¹Ì ÀÖÀ½.
982        //
983        if (++sm_nRetryTuneWaitCount >= SM_RETRY_TUNE_PERIOD)
984        {
985                sm_nRetryTuneWaitCount = 0;
986                dprint(0, "[SM] !! weak signal retry tuning..\n");
987
988                SigMon_ShowDebugOnScreen("Sig:[%s] Retry..", SigMon_StatString(sm_stat));
989
990        #if USE_AV_MUTE
991                // low signal ÁøÀÔ ÇÒ ¶§ stopÀ» ¾È ÇßÀ¸¹Ç·Î ¿©±â¼­ stopÀ» ÇØÁØ´Ù.
992                SigMon_StopTV();
993        #endif
994       
995                sm_nKeepStateCount = 1; // now, keep state until tuning completed..
996                SigMon_StartTV();
997                //
998                // ¹è³Ê´Â À¯ÁöÇÑ Ã¤·Î TV restart ½ÃµµÇÑ´Ù.
999                // Æ©´×ÀÌ ³¡³¯¶§ ±îÁö´Â count¸¦ ¼¼Áö ¾Ê´Â°Ô ÁÁÀºµ¥,
1000                // Æ©´× ÁøÇà »óȲÀ» ¾Ë ¹æ¹ýÀº ¾ø´Ù...
1001                // µû¶ó¼­ Àû´çÇÑ ½Ã°£µ¿¾È signal check¸¦ ÇÏÁö ¾Êµµ·Ï ÇÑ´Ù.
1002        }
1003#endif
1004
1005}
1006
1007               
1008void SigMon_DoAction_NoProgram(void)
1009{
1010        // banner move
1011        if (++sm_nBannerShowCount >= SM_BANNER_SHOW_PERIOD)
1012        {
1013                sm_nBannerShowCount = 0;
1014
1015                if (sm_bDisplayBanner)
1016                        SigMon_EraseLogo(sm_nBannerPosition);
1017                sm_nBannerPosition = (sm_nBannerPosition+1)%5;
1018                SigMon_DrawLogo(1, sm_nBannerPosition);
1019                if (sm_debug)
1020                        dprint(0, "[SM] No Program banner, pos %d\n", sm_nBannerPosition);
1021        }
1022
1023        if (sm_nKeepStateCount)
1024                return;
1025
1026        // retry tune in no program..
1027        if (++sm_nRetryTuneWaitCount >= SM_RETRY_TUNE_PERIOD)
1028        {
1029                SigMon_ShowDebugOnScreen("Sig:[%s] Retry..", SigMon_StatString(sm_stat));
1030       
1031                sm_nRetryTuneWaitCount = 0;
1032
1033#if USE_AV_MUTE
1034                // cafrii 101208
1035                // no program »óÅ¿¡¼­´Â retry ÇÏÁö ¾Ê¾Æµµ µÇ´Â °æ¿ì°¡ ÀÖ´Ù.
1036                // TV StopÀ» ÇÑ°Ô ¾Æ´Ï°í AV Mute¸¸ Çß´Ù¸é, ³ªÁß¿¡ video pes, audio pes°¡ ´Ù½Ã ±¦Âú¾ÆÁö¸é
1037                // AV Ãâ·ÂÀÌ ³ª¿À°Ô µÉ °ÍÀ̹ǷÎ..
1038                //
1039                // ´Ü, tuning fail¿¡ ÀÇÇÑ no program À̶ó¸é ½ÅÈ£°¡ ÁÁ¾ÆÁ³´Ù ÇÏ´õ¶óµµ
1040                // decoding ÀÚü°¡ ½ÃÀÛÇÏÁö ¾Ê¾ÒÀ¸¹Ç·Î restart ¸¦ ÇØÁà¾ß ÇÔ.
1041
1042                if (SigMon_CheckDecodeRun())
1043                {
1044                        // tv restart¸¦ ÇÒ ÇÊ¿ä ¾øÀ½. ±×³É ±â´Ù¸®¸é µÉ µí..
1045                        dprint(0, "[SM] nopgm but decode running. wait..\n");
1046                }
1047                else
1048#endif // USE_AV_MUTE
1049                {
1050                        dprint(0, "[SM] !! no program retry tuning..\n");
1051
1052                        SigMon_StopTV();
1053
1054                        sm_nKeepStateCount = 1; // now, keep state until tuning completed..
1055                        SigMon_StartTV();
1056                }
1057        }
1058}
1059
1060
1061void SigMon_DoAction_AudioOnly(void)
1062{
1063        // banner move
1064        if (++sm_nBannerShowCount >= SM_BANNER_AUDONLY_SHOW_PERIOD)
1065        {
1066                sm_nBannerShowCount = 0;
1067
1068                if (sm_bDisplayBanner)
1069                        SigMon_EraseLogo(sm_nBannerPosition);
1070                sm_nBannerPosition = (sm_nBannerPosition+1)%5;
1071                SigMon_DrawLogo(2, sm_nBannerPosition);
1072                if (sm_debug)
1073                        dprint(0, "[SM] Audio only banner, pos %d\n", sm_nBannerPosition);
1074        }
1075}
1076
1077
1078/*
1079        °¢ »óÅ¿¡ ¸Â´Â idle actionÀ» ¼öÇà.
1080*/
1081void SigMon_DoIdleAction(void)
1082{
1083        if (sm_stat == APP_SM_STAT_LOW)
1084                SigMon_DoAction_LowSignal();
1085               
1086        else if (sm_stat == APP_SM_STAT_NOPGM)
1087                SigMon_DoAction_NoProgram();
1088
1089        else if (sm_stat == APP_SM_STAT_AUDIO)
1090                SigMon_DoAction_AudioOnly();
1091}
1092
1093
1094
1095
1096
1097#if COMMENT
1098____Check____(){}
1099#endif
1100
1101void SigMon_Check_LowSignal(UINT32 CheckCount)  //    CheckCount : ¿¬¼ÓÀ¸·Î High signalÀÌ Áö¼ÓµÇ´ÂÁö üũÇÒ È½ ¼ö
1102{
1103        BOOL bHiSignalMode = FALSE;
1104       
1105        if (sm_stat != APP_SM_STAT_LOW)
1106                return;
1107
1108        // check period control
1109        if (++sm_nLowSignalCheckWaitCount < SM_CHECK_PERIOD_LO_SIGNAL)
1110        {
1111                // not yet.. wait more..
1112                if (sm_debug >= 2)
1113                        dprint(0, "[SM] wait.. low signal check wait count %d\n", sm_nLowSignalCheckWaitCount);
1114                return;
1115        }
1116        sm_nLowSignalCheckWaitCount = 0;
1117
1118#if 1
1119        SigMon_CheckSignal(); // ÀÌ ³»ºÎ¿¡¼­ unlock¿¡ µû¸¥ ºÎÀÛ¿ëÀ» °í·ÁÇØ¾ß ÇÔ.
1120
1121        if (SigMon_GetLockState() && sm_SignalAverage >= SM_SIGNAL_HI_LIMIT)
1122        {
1123                // ¿¬¼ÓÀ¸·Î HighSignalÀÌ ¹ß»ýÇÑ °æ¿ì
1124                if(++sm_HighSignalCounts >= CheckCount) {
1125                        SigMon_ShowDebugOnScreen("Sig:[%s] Good", SigMon_StatString(sm_stat));
1126                        bHiSignalMode = TRUE;
1127                        sm_HighSignalCounts = 0; // cafrii 070712 add
1128                }
1129        }
1130        else 
1131                sm_HighSignalCounts = 0;
1132               
1133#else
1134        if (SigMon_GetLockState())
1135        {       
1136                // check signal at low state
1137                SigMon_CheckSignal();
1138               
1139                // check threshold at low state
1140                if (sm_SignalAverage >= SM_SIGNAL_HI_LIMIT)
1141                        bHiSignalMode = TRUE;
1142        }
1143#endif // #if 1
1144       
1145        if (bHiSignalMode)
1146        {
1147#if SIG_COMMENT
1148                printf("\n+++++++Check Low Signal+++++++\n");
1149                printf("sm_SignalAverage: %d\n", sm_SignalAverage);
1150                printf("signal average percentage: %d\n", sm_SignalAverage*100/0xff);
1151                printf("\n\n");
1152#endif
1153                SigMon_ChangeState(APP_SM_STAT_HIGH);
1154
1155                if (sm_bDisplayBanner)
1156                        SigMon_EraseLogo(sm_nBannerPosition);
1157
1158                SigMon_TakeToken(FALSE);
1159                SigMon_ResetVariables();
1160
1161#if USE_AV_MUTE
1162                if (SigMon_CheckDecodeRun())
1163                {
1164                        SigMon_MuteTV(FALSE);
1165                        // cafrii 101208 remove
1166                        // ±×³É unmute¸¸ ÇÏ´Â °æ¿ì¶ó¸é keep ±¸°£ÀÌ ÇÊ¿ä ¾øÀ» µí.
1167                        // °è¼Ó ½ÅÈ£ üũ ÁøÇà..
1168                        // sm_nKeepStateCount = ...
1169                }
1170                else
1171#endif
1172                {
1173                        sm_nKeepStateCount = 1; // now, keep state until tuning completed..
1174                        SigMon_StartTV();
1175                }               
1176                return;
1177        }
1178       
1179        SigMon_DoAction_LowSignal();
1180}
1181
1182
1183void SigMon_Check_HighSignal(UINT32 CheckCount) // CheckCount : ¿¬¼ÓÀ¸·Î Low signalÀÌ Áö¼ÓµÇ´ÂÁö üũÇÒ È½ ¼ö
1184{
1185        // allowed state:  High, NoP, Aud
1186        BOOL bLowSignalMode = FALSE;
1187       
1188        if (sm_stat != APP_SM_STAT_HIGH &&
1189                sm_stat != APP_SM_STAT_NOPGM&&
1190                sm_stat != APP_SM_STAT_AUDIO)
1191                return;
1192       
1193        if (++sm_nHighSignalCheckWaitCount < SM_CHECK_PERIOD_HI_SIGNAL)
1194        {
1195                // not yet.. wait more..
1196                if (sm_debug >= 2)
1197                        dprint(0, "[SM] wait.. hi signal check wait count %d\n", sm_nHighSignalCheckWaitCount);
1198                return;
1199        }
1200        sm_nHighSignalCheckWaitCount = 0;
1201
1202        // cafrii 070608 add, unlock »óŸé signal data ÀÚü°¡ ¹«ÀÇ¹Ì ÇϹǷΠÁ¶°Ç Ãß°¡.
1203        // cafrii 070912 remove, lock °ª »ç¿ëÇÏÁö ¾Ê±â·Î ÇÔ.
1204        if (0) // (!SigMon_GetLockState())
1205        {
1206                if (sm_debug)
1207                        dprint(0, "[SM] signal unlock!\n");
1208                bLowSignalMode = TRUE;
1209        }
1210        else 
1211        {
1212                // check signal at high state
1213                SigMon_CheckSignal();
1214                if (sm_SignalAverage <= SM_SIGNAL_LO_LIMIT)
1215                {
1216                                if (sm_debug)
1217                                        dprint(0, "[SM] low signal (avg < %d) repeat count %d \n",
1218                                                SM_SIGNAL_LO_LIMIT, sm_LowSignalCounts);
1219
1220                        if(++sm_LowSignalCounts >= CheckCount)
1221                        {
1222                                SigMon_ShowDebugOnScreen("Sig:[%s] Enter Low", SigMon_StatString(sm_stat));
1223
1224                                // ¿¬¼ÓÀ¸·Î LowSignalÀÌ ¹ß»ýÇÑ °æ¿ì
1225                                sm_LowSignalCounts = 0;
1226                                bLowSignalMode = TRUE;
1227                        }
1228                }
1229                else
1230                        sm_LowSignalCounts = 0;
1231                       
1232        }
1233
1234        // cafrii 070613 add sig chk mode.
1235        // sig chk mode¿¡¼­´Â weak signal »óŰ¡ ¾ø´Ù.
1236        //
1237        if (sm_bSkipLowSigMode == 0 && bLowSignalMode)
1238        {
1239#if SIG_COMMENT
1240                printf("\n+++++++Check High Signal+++++++\n");
1241                printf("sm_SignalAverage: %d\n", sm_SignalAverage);
1242                printf("signal average percentage: %d\n", sm_SignalAverage*100/0xff);
1243                printf("\n\n");
1244#endif
1245                SigMon_ChangeState(APP_SM_STAT_LOW);
1246               
1247                SigMon_ResetVariables();
1248
1249#if USE_AV_MUTE
1250                SigMon_MuteTV(TRUE);
1251#else
1252                SigMon_StopTV();
1253#endif
1254       
1255                SigMon_TakeToken(TRUE);
1256               
1257                if (sm_bDisplayBanner) // No Program, AudioOnly »óÅ¿´´Ù¸é banner°¡ ÀÖÀ½.
1258                        SigMon_EraseLogo(sm_nBannerPosition);
1259
1260                SigMon_DrawLogo(0, sm_nBannerPosition);
1261
1262                return;
1263        }       
1264}
1265
1266
1267void SigMon_Check_NoProgram(BOOL bVideoOut, BOOL bAudioOut)
1268{
1269        // allowed state:  High, NoP, Aud
1270        if (sm_stat != APP_SM_STAT_HIGH &&
1271                sm_stat != APP_SM_STAT_NOPGM&&
1272                sm_stat != APP_SM_STAT_AUDIO)
1273                return; 
1274
1275        // check no program
1276        if (bVideoOut == FALSE && bAudioOut == FALSE)
1277        {
1278                // check repeat count..
1279                if (++sm_nNoProgramRepeatCount < SM_KEEP_PERIOD_NO_PROGRAM)
1280                {
1281                        // not yet.. wait more..
1282                        if (sm_debug >= 2)
1283                                dprint(0, "[SM] no program repeat count %d\n", sm_nNoProgramRepeatCount);
1284                        return;
1285                }
1286               
1287                if (sm_stat != APP_SM_STAT_NOPGM)
1288                {
1289                        SigMon_ChangeState(APP_SM_STAT_NOPGM);
1290                       
1291                        if(SM_GET_PAST_MS_AFTER_RESUME()>SM_MS_DONOT_VIDEO_STOP) {
1292                                // neverdai add 100802 noprogramÀÏ ¶§µµ ¹Ýµå½Ã stop tv¸¦ ÇØÁÜ
1293                                #if USE_AV_MUTE
1294                                                SigMon_MuteTV(TRUE);
1295                                #else
1296                                                SigMon_StopTV();
1297                                #endif
1298                        }
1299                        SigMon_TakeToken(TRUE); // audio only »óÅ¿´´Ù¸é ÀÌ¹Ì token Á¸Àç.
1300
1301                        sm_nBannerShowCount = SM_BANNER_SHOW_PERIOD;
1302                        // banner¸¦ ¹Ù·Î º¸¿©ÁÖ±â À§Çؼ­..
1303                }
1304                SigMon_DoAction_NoProgram();   
1305        }
1306        else 
1307        {
1308                if (sm_stat == APP_SM_STAT_NOPGM)
1309                {
1310                        SigMon_ChangeState(APP_SM_STAT_HIGH);
1311
1312                        // cafrii 101208 add
1313                        // nopgm ¸ðµå¸¦ ºüÁ® ³ª¿ÔÀ¸¹Ç·Î mute¸¦ Ç®¾îÁà¾ß ÇÔ.
1314                        #if USE_AV_MUTE
1315                                SigMon_MuteTV(FALSE);
1316                        #endif
1317
1318                        SigMon_TakeToken(FALSE);
1319                }
1320                sm_nNoProgramRepeatCount = 0;
1321                sm_nRetryTuneWaitCount = 0;
1322        }
1323}
1324
1325
1326void SigMon_Check_AudioOnly(BOOL bVideoOut, BOOL bAudioOut)
1327{
1328        // allowed state:  High, NoP, Aud
1329        if (sm_stat != APP_SM_STAT_HIGH &&
1330                sm_stat != APP_SM_STAT_AUDIO)
1331                return; 
1332       
1333        // check audio only..
1334        if (bVideoOut == FALSE && bAudioOut == TRUE)
1335        {
1336                // check repeat count..
1337                if (++sm_nAudioOnlyRepeatCount < SM_KEEP_PERIOD_AUDIO_ONLY)
1338                {
1339                        // not yet.. wait more..
1340                        if (sm_debug >= 2)
1341                                dprint(0, "[SM] audio only repeat count %d\n", sm_nAudioOnlyRepeatCount);
1342                        return;
1343                }
1344
1345                if (sm_stat != APP_SM_STAT_AUDIO)
1346                {
1347                        SigMon_ChangeState(APP_SM_STAT_AUDIO);
1348                               
1349                        SigMon_TakeToken(TRUE);
1350                       
1351                        sm_nBannerShowCount = SM_BANNER_SHOW_PERIOD;
1352                        // banner¸¦ ¹Ù·Î º¸¿©ÁÖ±â À§Çؼ­..
1353                }
1354                SigMon_DoAction_AudioOnly();
1355        }
1356        else 
1357        {
1358                if (sm_stat == APP_SM_STAT_AUDIO)
1359                {
1360                        SigMon_ChangeState(APP_SM_STAT_HIGH);
1361                        SigMon_TakeToken(FALSE);
1362                }
1363                sm_nAudioOnlyRepeatCount = 0;
1364        }
1365}
1366
1367
1368void SigMon_Check_AnalogSignal()
1369{
1370#if 0
1371        // allowed state: A_High, A_Low
1372        DHL_RESULT dhlResult;
1373        BOOL bVideoRunning = FALSE;
1374       
1375        if (sm_stat != APP_SM_STAT_HIGH_ANALOG &&
1376                sm_stat != APP_SM_STAT_LOW_ANALOG)
1377        {
1378                dprint(0, "[SM] !! strange state %d (%s) in analog context\n",
1379                                sm_stat, SigMon_StatString(sm_stat));
1380                sm_stat = APP_SM_STAT_HIGH_ANALOG;
1381        }
1382
1383        // check period control
1384        // for analog, do not wait.. always check signal..
1385
1386        // ¸¸¾à video°¡ start µÇÁö ¾ÊÀº »óŶó¸é start¸¦ ½ÃÄÑ¾ß ÇÔ.
1387        //
1388        if (DHL_CAP_IsAnalogContext() == FALSE)
1389        {
1390                dhlResult = DHL_CAP_StartVideoCheck();
1391
1392                if (dhlResult == DHL_WARN_ALREADY_ACTIVE) {
1393                        // ÀÌ¹Ì ¾Æ³¯·Î±× TV¸¦ ½ÃûÁßÀÎ °æ¿ì..
1394                        // ¾Õ¿¡¼­ °Ë»ç¸¦ ÇÞÀ½¿¡µµ ºÒ±¸Çϰí ÀÌ·± ¹®Á¦°¡ »ý±æ ¼öµµ ÀÖ´Ù.
1395                }
1396                else if (dhlResult) {
1397                        if (sm_debug >= 2)
1398                                dprint(0, "[SM] !! AnalogVideoCheck err %d\n", dhlResult);
1399                }
1400                else {
1401                        bVideoRunning = TRUE;
1402                        DHL_OS_Delay(100);
1403                }
1404        }
1405       
1406        // check signal
1407        if (DHL_CAP_GetLockStatus() == FALSE)
1408        {
1409                // check repeat count..
1410                if (++sm_nAnalogUnlockCount < 3) {
1411                        // not yet.. wait more..
1412                        if (sm_debug >= 2)
1413                                dprint(0, "[SM] analog unlock repeat count %d\n", sm_nAnalogUnlockCount);
1414                        return;
1415                }
1416
1417                if (sm_stat != APP_SM_STAT_LOW_ANALOG)
1418                {
1419                        SigMon_ChangeState(APP_SM_STAT_LOW_ANALOG);
1420                        SigMon_ResetVariables();
1421
1422                        SigMon_MuteAudio(TRUE); // cafrii 070418 add
1423
1424                        // cafrii 070418 add
1425                        //
1426                        if (sm_bNoSignalChannelStop)
1427                                SigMon_StopTV();
1428
1429                        // high -> low·Î º¯°æµÇ¾úÀ¸¹Ç·Î
1430                        // host·Î Content formatÀ» º¸³»ÁØ´Ù.
1431                        App_SendContentFormatToHCS(TRUE); // cafrii 070223 add
1432
1433                        SigMon_TakeToken(TRUE);
1434
1435                        sm_nBannerShowCount = SM_BANNER_SHOW_PERIOD;
1436                        // banner¸¦ ¹Ù·Î º¸¿©ÁÖ±â À§Çؼ­..
1437                }
1438
1439                // banner move
1440                if (++sm_nBannerShowCount >= SM_BANNER_SHOW_PERIOD)
1441                {
1442                        sm_nBannerShowCount = 0;
1443                        SigMon_EraseLogo(sm_nBannerPosition);
1444                        sm_nBannerPosition = (sm_nBannerPosition+1)%5;
1445                        SigMon_DrawLogo(0, sm_nBannerPosition);
1446                }
1447        }
1448        else
1449        {
1450                // exit low signal state
1451                if (sm_stat == APP_SM_STAT_LOW_ANALOG)
1452                {
1453                        if (sm_debug)
1454                                dprint(0, "[SM] analog good signal\n");
1455                               
1456                        SigMon_ChangeState(APP_SM_STAT_HIGH_ANALOG);
1457
1458                        if (sm_bDisplayBanner)
1459                                SigMon_EraseLogo(sm_nBannerPosition);
1460
1461                        SigMon_TakeToken(FALSE);
1462                        SigMon_ResetVariables();
1463
1464                        sm_nKeepStateCount = 1; // now, keep state until tuning completed..
1465                        SigMon_StartTV();
1466
1467                        SigMon_MuteAudio(FALSE); // cafrii 070418 add
1468
1469                }
1470                sm_nAnalogUnlockCount = 0;
1471        }
1472       
1473        if (bVideoRunning)
1474                DHL_CAP_StopVideoCheck();
1475
1476#endif // #if 0
1477}
1478
1479
1480
1481
1482
1483#if COMMENT
1484____Task____(){}
1485#endif
1486
1487void tApp_SignalMonitor(void* arg)
1488{
1489        int err, msgLen;
1490        APP_SIGMON_MSG msg;
1491        BOOL bVideoOut, bAudioOut;
1492
1493        UINT32 msNext, msLast;
1494        INT32 msWait;
1495       
1496        //UINT32 nVideoCount =0; // iskang add
1497
1498        msLast = DHL_OS_GetMsCount();
1499
1500label_begin:
1501
1502        //---------------------------------------
1503        //  Message Processing
1504        //
1505
1506        msNext = msLast + SM_LOOP_BASE_MS;
1507        msWait = (INT32)(msNext - DHL_OS_GetMsCount()); // may be negative!!
1508       
1509        err = DHL_OS_ReceiveMessage(sm_msg_q, &msg, max(msWait, 1));
1510
1511        msLast = DHL_OS_GetMsCount();
1512
1513        if (err == 0)
1514        {
1515                switch (msg.cmd)
1516                {
1517                case APP_SM_CMD_CHANGE_PARAM:
1518                        dprint(0, "[SM] change param %s to %d\n", 
1519                                SigMon_ParamString((APP_SIGMON_PARAM)msg.param), msg.param2);
1520                        SigMon_ChangeParam((APP_SIGMON_PARAM)msg.param, msg.param2);
1521                        SigMon_ResetVariables();
1522                        break;
1523               
1524                case APP_SM_CMD_ENABLE:
1525                        dprint(0, "[SM] enable sigmon, stat %s\n", SigMon_StatString(sm_stat));
1526
1527                        if (sm_stat == APP_SM_STAT_DISABLED)
1528                                SigMon_ChangeState(APP_SM_STAT_STOP);
1529                        break;
1530                       
1531                case APP_SM_CMD_DISABLE:
1532                        dprint(0, "[SM] disable sigmon, stat %s\n", SigMon_StatString(sm_stat));
1533
1534                        if (sm_stat != APP_SM_STAT_DISABLED) {
1535                                // ¹è³Ê°¡ ÀÖÀ¸¸é Áö¿î´Ù.
1536                                if (sm_bDisplayBanner)
1537                                        SigMon_EraseLogo(sm_nBannerPosition);
1538
1539                                SigMon_TakeToken(FALSE);
1540                                SigMon_ChangeState(APP_SM_STAT_DISABLED);
1541                        }
1542                        break;
1543
1544                case APP_SM_CMD_TEST_MODE:
1545                        dprint(0, "[SM] sigmon test mode set to %d\n", msg.param);
1546                        if (msg.param)
1547                                SigMon_ChangeState(APP_SM_STAT_TEST);
1548                        else
1549                                SigMon_ChangeState(APP_SM_STAT_STOP);                           
1550                        break;
1551               
1552                case APP_SM_CMD_STOP:
1553                        dprint(0, "[SM] stop sigmon, stat %s\n", SigMon_StatString(sm_stat));
1554                       
1555                        if (sm_stat == APP_SM_STAT_DISABLED)
1556                                break;
1557
1558                        // ¹è³Ê°¡ ÀÖÀ¸¸é Áö¿î´Ù.
1559                        if (sm_bDisplayBanner)
1560                                SigMon_EraseLogo(sm_nBannerPosition);
1561
1562#if USE_AV_MUTE
1563                        // cafrii 101208 remove video unmute. ¸¶Áö¸· ÀÜ»óÀÌ º¸ÀÏ ¼ö ÀÖÀ½.
1564                        App_AudioMute(FALSE, APP_AUDIO_MUTE_SIGMON);
1565#else
1566                        SigMon_MuteTV(FALSE);
1567#endif
1568
1569                        SigMon_TakeToken(FALSE);
1570                        SigMon_ChangeState(APP_SM_STAT_STOP);
1571                       
1572                        break;
1573
1574                case APP_SM_CMD_START:
1575                        dprint(0, "[SM] start sigmon, stat %s\n", SigMon_StatString(sm_stat));
1576
1577                        if (sm_stat == APP_SM_STAT_DISABLED)
1578                                break;
1579
1580                        if (sm_stat == APP_SM_STAT_STOP) 
1581                        {
1582                                if (msg.param) // this is analog channel
1583                                { 
1584                                        //if (msg.param2) // tuning ¼º°ø..
1585                                                SigMon_ChangeState(APP_SM_STAT_HIGH_ANALOG);
1586                                        //else
1587                                        //      SigMon_ChangeState(APP_SM_STAT_LOW_ANALOG);
1588                                }
1589                                else // this is digital channel
1590                                {
1591                                        SigMon_ChangeState(APP_SM_STAT_HIGH);
1592                                }
1593                                SigMon_TakeToken(FALSE);
1594                                SigMon_ResetVariables();
1595                        }
1596                        else 
1597                        {
1598                                // ÀÌ¹Ì SMÀÌ ÁøÇà ÁßÀε¥ ´Ù½Ã start°¡ µÈ °æ¿ìÀÌ´Ù.
1599                                //  LoSignal, NoProgram¿¡¼­ tune retry ÀÎ °æ¿ì..
1600                                //  caller°¡ SigMon stopµµ ¾ÈÇϰí startÇÑ °æ¿ì..
1601                                //
1602                                dprint(0, "[SM] start command in non-stop state!!\n");
1603
1604                                if (msg.param) // analog channel
1605                                {
1606                                        if (msg.param2) // tuning ¼º°ø..
1607                                        {
1608                                                SigMon_ChangeState(APP_SM_STAT_HIGH_ANALOG);
1609                                                SigMon_TakeToken(FALSE);
1610                                                SigMon_ResetVariables();
1611                                        }
1612                                        else // tuning failed.
1613                                        {
1614                                                SigMon_ResetVariables();
1615                                        }
1616                                }
1617                                else
1618                                {
1619                                        if (msg.param2) // tuning ¼º°ø..
1620                                        {
1621                                                // ÀÏ´Ü banner¸¦ Áö¿ì°í ¹Ýµå½Ã reset variable ÇÊ¿ä.
1622                                                SigMon_ChangeState(APP_SM_STAT_HIGH);
1623                                                SigMon_TakeToken(FALSE);
1624                                                SigMon_ResetVariables();
1625                                        }
1626                                        else // tuning failed.
1627                                        {
1628                                                // ¾î¶² ÀÌÀ¯·Î tuningÀÌ ½ÇÆÐÇÑ °ÍÀÎÁö´Â ¾Ë ¼ö ¾ø´Ù.
1629                                                // ÇöÀç »óŸ¦ ±×´ë·Î À¯ÁöÇÑ´Ù.
1630                                                //  LowSignal, NoProgram, µî..
1631                                                //  NoProgram ¿¡¼­ retry tuneÇÑ °æ¿ì µî..
1632                                                SigMon_ResetVariables();
1633                                        }
1634                                }
1635                        }
1636
1637                        // ²À ÇØÁà¾ß ÇÏ´Â ÀÛ¾÷µé..
1638                        SigMon_ResetSignalData();
1639                        sm_msSigMonStart = DHL_OS_GetMsCount();
1640                        break;
1641
1642                case APP_SM_CMD_TOKEN_AVAIL:
1643                        sm_bOsdTokenGet = 1;
1644                        // ÀÌÈÄ ±×·ÁÁö´Â banner´Â Ç¥½Ã°¡ °¡´ÉÇÏ´Ù.
1645                        break;
1646                       
1647                case APP_SM_CMD_TOKEN_REMOVAL:
1648                        if (sm_bDisplayBanner)
1649                                SigMon_EraseLogo(sm_nBannerPosition);
1650                        sm_bOsdTokenGet = 0;
1651                        break;
1652                       
1653                }
1654               
1655                if (msg.sem)
1656                        DHL_OS_GiveSemaphore(msg.sem);
1657               
1658        }
1659
1660        if (sm_stat == APP_SM_STAT_TEST) 
1661        {
1662                // test mode. ±×³É signal check¸¸ ÇÏ°í ·çÇÎ..
1663                SigMon_CheckSignal();
1664                goto label_begin;
1665        }
1666       
1667        if (sm_stat == APP_SM_STAT_DISABLED || sm_stat == APP_SM_STAT_STOP)
1668                goto label_begin;
1669
1670
1671        //---------------------------------------
1672        //  Initial period and Sample makeup
1673
1674        if (sm_stat == APP_SM_STAT_LOW_ANALOG ||
1675                sm_stat == APP_SM_STAT_HIGH_ANALOG)
1676        {
1677                // analog ä³ÎÀÇ °æ¿ì initial period ºÒÇÊ¿äÇÔ.
1678        }
1679        else
1680        {
1681                // cafrii 060728 change
1682                // smÀÌ startµÇ°í ³­ ÈÄ¿¡´Â ¾ó¸¶ µ¿¾ÈÀº tuner »óŰ¡ unstable ÇϹǷÎ
1683                // ÈÞÁö±â°¡ ÇÊ¿äÇÔ.
1684                //
1685                if (DHL_OS_GetMsCount() - sm_msSigMonStart < 
1686                                SM_INITIAL_DELAY_MS) {
1687                        if (sm_debug >= 2)
1688                                dprint(0, "[SM] initial wait period..\n");
1689
1690                        SigMon_DoIdleAction();
1691                        goto label_begin;
1692                }
1693
1694                if (sm_numSamples < SM_SIGNAL_SAMPLES)
1695                {
1696                        if (sm_debug >= 2)
1697                                dprint(0, "sample (%d) not enough. makeup..\n", sm_numSamples);
1698                       
1699                        SigMon_CheckSignal();
1700
1701                        SigMon_DoIdleAction();
1702                        goto label_begin;   // sample is not enough..
1703                }
1704        }
1705
1706        //---------------------------------------
1707        //  Banner action without signal checking
1708
1709        if (sm_nKeepStateCount)
1710        {
1711                // ÇöÀç »óÅ À¯Áö...
1712
1713                if (sm_nKeepStateCount == 1 || sm_debug >= 2) {
1714                        dprint(0, "[SM] keep mode, stat(%s %d), cnt %d\n",
1715                                SigMon_StatString(sm_stat), sm_stat,
1716                                sm_nKeepStateCount);
1717
1718                        // wait ¹Ù·Î Á÷ÀüÀÇ ¸Þ½ÃÁö¸¦ º¸Áö ¸øÇÏ´Â °æ¿ì°¡ »ý°Ü¼­ 1,2,3 ´Â º¸¿©ÁÖÁö ¸»ÀÚ.
1719                        if (sm_nKeepStateCount >= 4) {
1720                                SigMon_ShowDebugOnScreen("Sig:[%s] Wait.. %d", 
1721                                        SigMon_StatString(sm_stat), sm_nKeepStateCount);
1722                        }
1723                }
1724                sm_nKeepStateCount++;
1725
1726                SigMon_DoIdleAction();
1727
1728                if (sm_nKeepStateCount > SM_KEEP_STAT_MAX_COUNT) {
1729                        dprint(0, "[SM] exit keep mode\n");
1730                        sm_nKeepStateCount = 0;  // stop..
1731                }
1732                goto label_begin;
1733        }
1734
1735
1736        //---------------------------------------
1737        //  Analog channel monitor
1738        //
1739        if (sm_stat == APP_SM_STAT_LOW_ANALOG ||
1740                sm_stat == APP_SM_STAT_HIGH_ANALOG)
1741        {
1742                SigMon_Check_AnalogSignal();
1743                goto label_begin;
1744        }
1745
1746        //---------------------------------------
1747        //  Digital Channel Monitoring
1748        //
1749
1750        // digital channel monitor
1751        if (sm_stat == APP_SM_STAT_LOW)
1752                SigMon_Check_LowSignal(SM_SIGNAL_CHECK_COUNT_THRESHOLD_L2H);
1753        else
1754                SigMon_Check_HighSignal(SM_SIGNAL_CHECK_COUNT_THRESHOLD_H2L);
1755
1756        // ¾Æ·¡ µÎ Check ÇÔ¼ö¿¡¼­ °øÅëÀûÀ¸·Î ÇÊ¿äÇÑ DHL callÀº
1757        // ¹Ì¸® ¼öÇàÇÏ¿© ÀÎÀÚ·Î Àü´Þ.
1758        //
1759       
1760        {
1761                DHL_RESULT result;
1762                tDHL_VideoStatus vstatus;
1763                tDHL_AudioStatus astatus;
1764               
1765                result=DHL_AV_VideoGetStatus(0, &vstatus);
1766                bVideoOut=(result==DHL_OK) && (vstatus.bOutputExist);
1767               
1768                result=DHL_AV_AudioGetStatus(&astatus);
1769                bAudioOut=(result==DHL_OK) && (astatus.bOutputExist);
1770        }
1771               
1772       
1773       
1774#if 0
1775        //iskang 080929.
1776        //LG work around code»èÁ¦..
1777        //½ÅÈ£°¡ ÁÁ´Ù°¡ Áß°£¿¡ ½ÅÈ£°¡ Àá±ñ ¾ø¾îÁö´Â °æ¿ì°¡ »ý±â¸é
1778        //½ÅÈ£ÀÇ ¼¼±â°¡ ÃæºÐÇÏ¿©µµ No program»óÅ·Π°è¼Ó À¯ÁöµÊ.
1779        //DHL_VideoStart¿¡¼­ sequence header¸¦ Çѹø ¸¸µé¸é video°¡ °è¼Ó Æ©´×µÇ°í ÀÖ´Ù´Â ¿À·ù.
1780        //Áß°£¿¡ video¶Ç´Â audio¸¸ ÀְԵǴ °æ¿ì¿¡ ÀÖ¾î ÁÖ±âÀûÀ¸·Î üũÇϰÔÇÔ.
1781       
1782        // todo
1783        // QAMÀ» Áö¿øÇϰԵǸé Signal LockÀ» ¼º°øÇÏ´Â ½Ã°£ÀÌ ±æ¾îÁú ¼ö ÀÖ´Ù. ´Ù¾çÇÑ demodulation ¹æ¹ý Á¸Àç
1784        // ¾Æ·¡ ÄÚµåÀÇ °ËÅä°¡ ÇÊ¿ä (Chjeon)
1785
1786        // Updated by Chjeon 2007.09.06
1787        // Sync µ¿ÀÛ¿¡ ÀÇÇØ¼­ ÇÔ¼ö µ¿ÀÛ µ¿¾È ´Ù¸¥ µ¿ÀÛÀ» ÇÒ ¼ö°¡ ¾øÀ½ (Remote Control ÀԷ ó¸® Áö¿¬)
1788        // Async ÇÏ°Ô µ¿ÀÛÇϵµ·Ï ¼öÁ¤
1789       
1790        // no program, weak signalÀÌ ¾Æ´Ï¸é..
1791        //  Áï  HIGH or AUDIO ÀÎ °æ¿ì..
1792        if(   sm_stat == APP_SM_STAT_AUDIO // Audio¸¸ ÀÖ´Â °æ¿ì
1793        || (sm_stat == APP_SM_STAT_HIGH && !bAudioOut) ) // Video¸¸ ÀÖ´Â °æ¿ì
1794        {
1795                // ¾à 6ÃÊ.. (Recovery ¿ëµµÀ̹ǷΠÀÌÁ¤µµ ½Ã°£À¸·Î Ã¼Å©ÇØµµ ¹«¹æÇÏ´Ù°í ÆÇ´Ü)
1796                if(nVideoCount > SM_PERIOD(6000))
1797                {       
1798                        int i;
1799                        STATUS status;
1800                        UINT16 nVidPid = 0, nPcrPid = 0, nAudPid = 0;
1801                       
1802                        nVideoCount =0;
1803
1804                        DMW_MSC_LockUcm();
1805                        for(i=0;i<g_UCM_number;i++)
1806                        {
1807                                if(g_UCM[i].Uid == APP_CUR_CH.nUid)
1808                                {
1809                                        nVidPid = g_UCM[i].Video_pid;
1810                                        nPcrPid = g_UCM[i].Pcr_pid;
1811                                        nAudPid = g_UCM[i].Audio_pid;
1812                                        break;
1813                                }
1814                        }
1815                        DMW_MSC_UnlockUcm();
1816
1817                        // Channel DB¿¡¼­ ÇØ´ç ä³ÎÀÌ °Ë»öÀÌ ¾ÈµÇ¸é ¾î¶»°Ô ÇÒ °ÍÀΰ¡?
1818                        // üũ Á¶°Ç Ãß°¡ÇÔ.
1819
1820                        // video pid´Â Àִµ¥, bVideoOut ÀÌ FALSEÀÎ °æ¿ì..
1821                        // todo.. audio only ä³Î¿¡¼­ ºÎÀÛ¿ëÀÌ ¾ø´ÂÁö ¹Ýµå½Ã Å×½ºÆ® ¿ä¸Á!!             
1822
1823                        // Comment Chjeon
1824                        // ºÎÀÛ¿ë ÀÖÀ½... À̰æ¿ì¿¡ ¸®¸ðÄÜ Å° ÀԷ¿¡ ´ëÇÑ ¹ÝÀÀÀÌ ´À¸² Dmc_ChangeVideoStream (Wait Func)
1825                        if( sm_stat == APP_SM_STAT_AUDIO && !bVideoOut && nVidPid && nPcrPid)//check video only..
1826                        {
1827                                dprint(0, "Video Retry, vid %x, pcr %x\n", nVidPid, nPcrPid);
1828                                status = Dmc_ChangeVideoStream(nVidPid, nPcrPid);       // Wait Function
1829                                if(status)                                             
1830                                        dprint(0, " !! ChangeVideo Stream Try Again... Error:%d\n", status);
1831
1832                                // Updated by Chjeon 2007.09.06
1833                                // Dmc_ChangeVideoStream ÇÔ¼ö°¡ Async·Î µ¿ÀÛÇϹǷΠVideo OutputÀ» ´Ù½Ã üũÇÏ´Â °ÍÀÌ Àǹ̰¡ ¾ø´Ù.
1834                                // Audioµµ ¸¶Âù°¡ÁöÀÓ.
1835                               
1836                                //video retryÇß´Ù¸é ´Ù½Ã Çѹø »óŸ¦ üũÇÑ´Ù.
1837                                // synchronous ÇÔ¼öÀ̹ǷΠ°á°ú°¡ ¹Ù·Î ³ª¿È.
1838                                //bVideoOut = DHL_AV_VideoOutputExist();
1839                        }
1840                        else if( sm_stat == APP_SM_STAT_HIGH && !bAudioOut && nAudPid && nPcrPid)//highÀ̸鼭 audio°¡ ¾øÀ¸¸é...
1841                        {
1842                                dprint(0, "Audio Retry \n");
1843                                status = Dmc_ChangeAudioStream(nAudPid, nPcrPid, eDHL_AUDIO_TYPE_AC3);
1844                                if(status)
1845                                        dprint(0, " !! ChangeAudio Stream Try Again... Error:%d\n", status);
1846                       
1847                                //audio retryÇß´Ù¸é ´Ù½Ã Çѹø audio¸¦ üũÇÑ´Ù.
1848                                //bAudioOut = DHL_AV_AudioOutputExist();
1849                        }
1850                }
1851                nVideoCount ++;
1852        }
1853#endif // #if 0 // iskang 080929. out.
1854
1855        SigMon_Check_NoProgram(bVideoOut, bAudioOut);
1856        SigMon_Check_AudioOnly(bVideoOut, bAudioOut);
1857        SigMon_AudioOnlyMuteTV(!bVideoOut);
1858        goto label_begin;
1859}
1860
1861
1862
1863
1864
1865#if COMMENT
1866____API____(){}
1867#endif
1868
1869// note!
1870// Ç×»ó Pause¸¦ ¸ÕÀú Çϰí Stop Video¸¦ ÇØ¾ß ÇÑ´Ù.
1871// SigMon¿¡¼­ EnableTV¸¦ ÇÏ´Â request°¡ DMC queue¿¡ ³²¾Æ ÀÖÀ» ¼ö ÀÖÀ¸¹Ç·Î..
1872//
1873void App_Pause_SMTask(void)
1874{
1875        dprint(0, "[SM] Pause SignalMonitor\n");
1876
1877        SigMon_SendCommand(APP_SM_CMD_STOP, 0, 0, TRUE);
1878}
1879
1880void App_Resume_SMTask(void)
1881{
1882/*
1883        // cafrii 070712, ´õÀÌ»ó ÀÌ·± Ư¼ö ¸ðµå Áö¿øÇÏÁö ¾ÊÀ½.
1884       
1885        if (g_App_SW_Mode == APP_SW_MODE_DOLBY_TEST ||
1886                        g_App_SW_Mode == APP_SW_MODE_HDMI_TEST) {
1887                dprint(0, "!! ignore SigMon resume\n");
1888                return;
1889        }
1890*/
1891        dprint(0, "[SM] Restart SignalMonitor\n");
1892
1893        SigMon_SendCommand(APP_SM_CMD_START, 0, TRUE, FALSE);
1894        sm_resume_ms=DHL_OS_GetMsCount();
1895}
1896
1897
1898void App_Restart_SMTask(BOOL bAnalog, BOOL bTuneSuccess)
1899{
1900/*
1901        // cafrii 070712, ´õÀÌ»ó ÀÌ·± Ư¼ö ¸ðµå Áö¿øÇÏÁö ¾ÊÀ½.
1902
1903        if (g_App_SW_Mode == APP_SW_MODE_DOLBY_TEST ||
1904                        g_App_SW_Mode == APP_SW_MODE_HDMI_TEST) {
1905                dprint(0, "!! ignore SigMon resume\n");
1906                return;
1907        }
1908*/
1909        dprint(0, "[SM] Restart SignalMonitor, state %d\n", bTuneSuccess);
1910
1911        SigMon_SendCommand(APP_SM_CMD_START, bAnalog, bTuneSuccess, FALSE);
1912        sm_resume_ms=DHL_OS_GetMsCount();
1913}
1914
1915
1916void App_NotifySigMonBannerToken(BOOL bAvailable)
1917{
1918/*
1919        // cafrii 070712, ´õÀÌ»ó ÀÌ·± Ư¼ö ¸ðµå Áö¿øÇÏÁö ¾ÊÀ½.
1920
1921        if (g_App_SW_Mode == APP_SW_MODE_DOLBY_TEST ||
1922                        g_App_SW_Mode == APP_SW_MODE_HDMI_TEST) {
1923                dprint(0, "!! ignore SigMon wakeup\n");
1924                return;
1925        }
1926*/
1927        if (bAvailable)
1928                SigMon_SendCommand(APP_SM_CMD_TOKEN_AVAIL, 0, 0, FALSE);
1929        else
1930                SigMon_SendCommand(APP_SM_CMD_TOKEN_REMOVAL, 0, 0, TRUE);
1931}
1932
1933
1934void App_DisableSigMon(BOOL bDisable)
1935{
1936/*
1937        // cafrii 070712, ´õÀÌ»ó ÀÌ·± Ư¼ö ¸ðµå Áö¿øÇÏÁö ¾ÊÀ½.
1938
1939        if (g_App_SW_Mode == APP_SW_MODE_DOLBY_TEST ||
1940                        g_App_SW_Mode == APP_SW_MODE_HDMI_TEST) {
1941                dprint(0, "!! ignore SigMon control\n");
1942                return;
1943        }
1944*/
1945        if (bDisable)
1946                SigMon_SendCommand(APP_SM_CMD_DISABLE, 0, 0, TRUE);
1947        else
1948                SigMon_SendCommand(APP_SM_CMD_ENABLE, 0, 0, TRUE);
1949}
1950
1951
1952void App_SetSigMonTestMode(BOOL bTest)
1953{
1954        SigMon_SendCommand(APP_SM_CMD_TEST_MODE, bTest, 0, TRUE);
1955}
1956
1957
1958UINT32 App_GetSigMonParam(APP_SIGMON_PARAM param)
1959{
1960        return SigMon_GetParam(param); 
1961}
1962
1963
1964void App_ChangeSigMonParam(APP_SIGMON_PARAM param, int value)
1965{
1966        SigMon_SendCommand(APP_SM_CMD_CHANGE_PARAM, param, value, TRUE);
1967}
1968
1969
1970void App_GetSigMonInfo(APP_SIGMON_INFO *pinfo)
1971{
1972        pinfo->status=sm_stat;
1973        pinfo->status_period_ms=DHL_OS_GetMsCount()-sm_status_last_change_ms;
1974}
1975
1976
1977
1978
1979
1980#if COMMENT
1981____Symbol____(){}
1982#endif
1983
1984#if NEO_REGISTER_DEBUG_SYMBOL
1985
1986static DHL_SymbolTable _SigmSymbolx[] =
1987{
1988        /* not recommend to add function symbol with same function name.
1989           they are already supported in build symbol table made by makefile
1990        */
1991        //DHL_FNC_SYM_ENTRY(module_stop),
1992        //DHL_FNC_SYM_ENTRY(module_restart),
1993       
1994        /* however, if you want typing short-cut, it is good usage. */
1995        DHL_FNC_SYM_ENTRY2("sm_pause", App_Pause_SMTask),
1996        DHL_FNC_SYM_ENTRY2("sm_resume", App_Resume_SMTask),
1997        DHL_FNC_SYM_ENTRY2("sm_test", App_SetSigMonTestMode),
1998        DHL_FNC_SYM_ENTRY2("sm_disable", App_DisableSigMon),
1999        DHL_FNC_SYM_ENTRY2("sm_debug", SigMon_SetDbgLevel),
2000        DHL_FNC_SYM_ENTRY2("sm_set_param", App_ChangeSigMonParam),
2001        DHL_FNC_SYM_ENTRY2("sm_get_param", App_GetSigMonParam),
2002       
2003        //DHL_VAR_SYM_ENTRY(g_Trace_Xxxx),
2004};
2005
2006static void RegisterSymbols(void)
2007{
2008        DHL_DBG_RegisterSymbols(_SigmSymbolx, DHL_NUMSYMBOLS(_SigmSymbolx));
2009}
2010
2011#else
2012static void RegisterSymbols(void) { }
2013#endif  /* NEO_REGISTER_DEBUG_SYMBOL */
2014
2015
2016
2017
2018
2019#if COMMENT
2020____Init____(){}
2021#endif
2022
2023void App_SMInit(void)
2024{
2025        UINT8 data;
2026
2027        RegisterSymbols();
2028
2029        // sm config
2030        // TODO:               
2031        // App_ReadEEPROMByte(OFFSET_SYSFILE_SIGMON_TESTMODE, &data);
2032        //sm_bSkipLowSigMode = data ? 1 : 0;
2033        sm_bSkipLowSigMode = 0; // ÀÏ´Ü Àӽ÷Î
2034       
2035        if (sm_bSkipLowSigMode) {
2036                dprint(0, "[SM] !! Signal test mode !!\n");
2037        }
2038
2039        sm_msg_q = DHL_OS_CreateMessageQueue("SmQ", 0, 10, sizeof(APP_SIGMON_MSG));
2040        if(!sm_msg_q)
2041        {
2042                printf("FATAL: msgQ create error\n");
2043        }
2044        sm_task_id = DHL_OS_CreateTask((DHL_OS_TASKFUNCTION)tApp_SignalMonitor,
2045                                "SigMon", TASK_PRI_SIGMON/*255-158*/, SZ_16K, 0);
2046
2047        if (sm_msg_q == (DHL_OS_MSGQ_ID)NULL || sm_task_id == (DHL_OS_MSGQ_ID)NULL)
2048        {
2049                dprint(0, "!! SigMon init err\n");
2050                return;
2051        }
2052
2053        dprint(0, "[SM] Signal Monitor init\n");
2054}
2055
2056#endif /* SUPPORT_SIGMON */
2057
2058
2059
2060/* end of file */
Note: See TracBrowser for help on using the repository browser.