source: svn/branches/kctv/newcon3bcm2_21bu/nexus/app/dta/bscreen.c @ 43

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

1.phkim

  1. revision copy newcon3sk r27
  • Property svn:executable set to *
File size: 52.3 KB
Line 
1/***************************************************************************
2 *     Copyright (c) 2003-2006, Broadcom Corporation
3 *     All Rights Reserved
4 *     Confidential Property of Broadcom Corporation
5 *
6 *  THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE
7 *  AGREEMENT  BETWEEN THE USER AND BROADCOM.  YOU HAVE NO RIGHT TO USE OR
8 *  EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT.
9 *
10 * $brcm_Workfile:  $
11 * $brcm_Revision:  $
12 * $brcm_Date: $
13 *
14 * Module Description:
15 *
16 * Revision History:
17 *
18 * $brcm_Log:  $
19 *
20 ***************************************************************************/
21
22#include "bapp.h"
23#include "bapp_palette.h"
24#include "bapp_util.h"
25#include "bgfx.h"
26#include "chan_mgr.h"
27
28#include "ts_psi.h"
29#include "ts_scte_18.h"
30#include "bapp_str_table.h"
31
32BDBG_MODULE(bscreen);      /* Register software module with debug interface */
33
34/* DIG defines 7 characters as max but for PSI channel scan it is useful to have more. */
35#define   MAX_NAME_CHARS        14
36
37/* local function declarations */
38static void banner_null_draw(void *v_app, void *v_screen);
39
40#define SCREEN_MIN(a,b) ((a)<(b) ? (a) : (b))   /* min macro */
41
42/* Local definitions */
43#ifndef CONFIG_CHINESE_FONTS_RAM
44static char * s_str_table[eTEXT_MAX] =
45{
46        /*eTEXT_ONE_MOMENT,                       */"One Moment Please",
47        /*eTEXT_TROUBLE_ERROR_1,                  */"Your service has been temporarily interrupted.",
48        /*eTEXT_TROUBLE_ERROR_2,                  */"It should be restored momentarily.",
49        /*eTEXT_TROUBLE_ERROR_3,                  */"",
50        /*eTEXT_MUTE_TITLE,                       */"Mute",
51        /*eTEXT_PENDING_1,                        */"We've detected an interruption in your service.",
52        /*eTEXT_PENDING_2,                        */"Please contact Comcast at 1-800-COMCAST",
53        /*eTEXT_PENDING_3,                        */"(1-800-266-2278) to restore service.",
54        /*eTEXT_PENDING_4,                        */"We're sorry for the inconvenience.",
55#ifdef BDBG_DEBUG_BUILD
56        /*eTEXT_SYS_INFO,                         */"Press INFO to exit        Vol- or Vol+ to change page",
57#else
58        /*eTEXT_SYS_INFO,                         */"Press INFO to exit        Press CH- or CH+ to change page",
59#endif
60        /*eTEXT_VENDOR,                           */DEF_VENDOR_NAME,
61        /*eTEXT_MUTE,                             */"Mute",
62        /*eTEXT_VOLUME,                           */"Volume",
63    /*eTEXT_DL_1,                             */"Please give us a moment to prepare your",
64    /*eTEXT_DL_2,                             */"adapter for new software - delivered",
65    /*eTEXT_DL_3,                             */"exclusively from Comcast.",
66    /*eTEXT_DL_4,                             */"This typically takes less than 20 minutes",
67    /*eTEXT_DL_5,                             */"but it'll be worth the wait. Your adapter may",
68    /*eTEXT_DL_6,                             */"automatically reset during this process.",
69    /*eTEXT_HUNT_TITLE,                       */"We're searching for cable services in your area.",
70    /*eTEXT_HUNT_PROGRESS,                    */"Total Progress:  ",
71};
72#else
73static char * s_str_table[eTEXT_MAX] =
74{
75        /*eTEXT_ONE_MOMENT,                       */"c7ebc9d4baf20000",
76        /*eTEXT_TROUBLE_ERROR_1,                  */"ced2c3c7d4ddcab1d6d0b6cfc4fab5c4b7fecef1a1a30000",
77        /*eTEXT_TROUBLE_ERROR_2,                  */"ced2c3c7c9d4baf2bdabbbd6b8b4c4fab5c4b7fe0000",
78        /*eTEXT_TROUBLE_ERROR_3,                  */"cef1a1a30000",
79        /*eTEXT_MUTE_TITLE,                       */"cffbd2f40000",
80        /*eTEXT_PENDING_1,                        */"c7ebb5e7b8e60031002e003800300030002e0043004f004d00430041005300540000",
81        /*eTEXT_PENDING_2,                        */"d2d4bbd6b8b4c4fab5c4b7fecef1a1a30000",
82        /*eTEXT_PENDING_3,                        */"d2d4bbd6b8b4c4fab5c4b7fecef1a1a30000",
83        /*eTEXT_PENDING_4,                        */"d2d4bbd6b8b4c4fab5c4b7fecef1a1a30000",
84#ifdef BDBG_DEBUG_BUILD
85        /*eTEXT_SYS_INFO,                         */"b0b40049004e0046004fbcfccdcbb3f60020002000200020b0b40056004f004c002dbbf20056004f004c002bbcfcd2d4bbbbd2b30000",
86#else
87        /*eTEXT_SYS_INFO,                         */"b0b40049004e0046004fbcfccdcbb3f60020002000200020b0b400430048002dbbf200430048002bbcfcd2d4bbbbd2b30000",
88#endif
89        /*eTEXT_VENDOR,                           */DEF_VENDOR_NAME,
90        /*eTEXT_MUTE,                             */"cffbd2f40000",
91        /*eTEXT_VOLUME,                           */"d2f4c1bf0000"
92};
93#endif
94
95screensaver_state_t g_screensaver_state = 
96{
97        0
98};
99
100banner_state_t g_banner_state = 
101{
102        { 0, 0, 0, 0},
103        0,
104        false,
105        eLS_BANNER_OFF,
106        { eS_EVENT_MAX, 0, 0},
107        0,
108        0,
109        0,
110        0,
111        0
112};
113
114/*
115Summary:
116        copy string and remove spaces.
117        .
118*/
119void strncpy_no_spaces(char* dst_str, char* src_str,int len)
120{
121        int idx = 0;
122        int dst_idx = 0;
123        while (src_str[idx] && (idx < len))
124        {
125                if (src_str[idx] != ' ')
126                {
127                        dst_str[dst_idx++] = src_str[idx];
128                }
129                idx++;
130        }
131        dst_str[dst_idx] = 0;
132}
133#define eEAS_TEXT_X (eSCREEN_ACTION_SAFE_X + 110)
134#define eEAS_TEXT_Y (eSCREEN_ACTION_SAFE_Y + 120)
135#define eEAS_TEXT_WIDTH (eSCREEN_ACTION_SAFE_WIDTH - eEAS_TEXT_X)
136#define eEAS_TEXT_HEIGHT (eSCREEN_ACTION_SAFE_HEIGHT  - eEAS_TEXT_Y - 60)
137#define eEAS_ROW_HEIGHT  (25)
138
139#define MAX_EAS_TEXT            128
140#define EAS_TEXT_LINE_MAX       4       /* 4 lines, including EAS event, one empty line and two text lines */
141#define MAX_TSTR_LINE           40      /* letters per line */
142#define EAS_BANNER_POPPED       0x8000  /* flag indicates that EAS text scrolling banner has been launched */
143
144typedef struct eas_pkt_info_t
145{
146        unsigned char *p_eas;                   /* pointer to eas packet buffer */
147        unsigned char eas_text[MAX_EAS_TEXT];   /* pinter to eas text to display */
148        unsigned int  eas_text_len;             /* eas test lenght */
149        unsigned int eas_current;               /* current offset to display */
150        TS_SCTE_18_header header;               /* header structure */
151} eas_pkt_into_t;
152
153static struct eas_pkt_info_t s_eas_text_scrolling_info = { NULL, "", 0, 0, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
154
155/*
156Summary:
157                process the MSS string
158                Returns non-zero on failure.
159*/
160int eas_process_mss(bapp_t *p_app,      /* [in] pointer to p_app */
161                                        PSIP_MSS_string p_mss,          /* [in] Pointer to MSS */
162                                        unsigned char *mss_buf,         /* [out] string buffer */
163                                        unsigned int mss_len)           /* [out] string buffer length */
164{
165        int str_idx,lsize;
166        char *p_code;
167        BERR_Code retcode;
168        int num_str;
169
170        if (!p_mss || !mss_buf || !mss_len)
171                return BERR_INVALID_PARAMETER;
172
173        num_str = PSIP_MSS_getNumStrings(p_mss);
174        memset(mss_buf,0,mss_len);
175        for (str_idx = 0; str_idx < num_str; ++str_idx)
176        {
177                if ((retcode = PSIP_MSS_getCode(p_mss,str_idx, &p_code)) != BERR_SUCCESS)
178                {
179                        BDBG_WRN(("PSIP_MSS_getCode:%d failed %d",__LINE__,retcode));
180                        memset(mss_buf,0,mss_len);
181                        continue;
182                }
183                /* to match language of string, TODO handle other language */
184                if (eLANG_ENGLISH == p_app->lang && (*p_code == 'e' && *(p_code + 1) == 'n'))
185                        goto LANG_CHECKED;
186                if (eLANG_FRENCH == p_app->lang && (*p_code == 'f' && *(p_code + 1) == 'r'))
187                        goto LANG_CHECKED;
188                if (eLANG_SPANISH == p_app->lang && 
189                        ((*p_code == 'e' && *(p_code + 1) == 's') || (*p_code == 'e' && *(p_code + 1) == 'p')))
190                        goto LANG_CHECKED;
191                else
192                {
193                        memset(mss_buf,0,mss_len);
194                        continue;
195                }
196
197                LANG_CHECKED:
198                lsize = mss_len;
199                if ((retcode = PSIP_MSS_getString(p_mss,str_idx,&lsize,(char*)mss_buf)) != BERR_SUCCESS)
200                {
201                        BDBG_ERR(("MSS invalid %d",retcode));
202                        return retcode;
203                }
204                BDBG_MSG(("%s:%d idx = %d, %d/%d-%s",__FUNCTION__,__LINE__,str_idx,lsize,mss_len,mss_buf));
205                return 0;
206        }
207
208        /* in case no valid language exists just use first string */
209        if (num_str > 0)
210        {
211                lsize = mss_len;
212                if ((retcode = PSIP_MSS_getString(p_mss,0,&lsize, (char*)mss_buf)) == BERR_SUCCESS)
213                {
214                        BDBG_WRN(("No language match using default"));
215                        return 0;
216                } else
217                {
218                        BDBG_WRN(("PSIP_MSS_getString failed %d",retcode));
219                }
220
221        }
222        BDBG_WRN(("%s:%d no valid string found, num_str = %d",__FUNCTION__,__LINE__,num_str));
223        return BERR_NOT_SUPPORTED;
224}
225
226/*
227Summary:
228        set EAS packet information
229Return:
230        0 if sucess
231        error code if failed
232*/
233int bscreen_eas_text_scrolling_info(bapp_t *p_app, unsigned char *eas_pkt, unsigned int size)
234{
235        if (!eas_pkt)
236        {
237                BDBG_WRN(("%s NULL pkt pointer",__FUNCTION__));
238                return BERR_INVALID_PARAMETER;
239        } else
240        {
241                unsigned char *p_mss = NULL;
242                unsigned int len;
243
244                if (TS_SCTE_18_getSectionHeader(eas_pkt, size, &s_eas_text_scrolling_info.header) != 0)
245                {
246                        goto FAILED;
247                }
248                if (s_eas_text_scrolling_info.header.alert_text_length)
249                {
250                        p_mss = TS_SCTE_18_getAlrtTextOffset((const unsigned char *)eas_pkt, &len);
251                }
252                if (!p_mss)
253                {
254                        goto FAILED;
255                }
256                /* we get EAS text if we are here */
257                if (eas_process_mss(p_app, p_mss, s_eas_text_scrolling_info.eas_text, len))
258                {
259                        goto FAILED;
260                }
261                s_eas_text_scrolling_info.p_eas = eas_pkt;
262                s_eas_text_scrolling_info.eas_current = 0;      /* set EAS Alert Text read pointer to beginning */
263                s_eas_text_scrolling_info.eas_text_len = strlen((const char*)s_eas_text_scrolling_info.eas_text);
264                return BERR_SUCCESS;
265        }
266
267        FAILED:
268        s_eas_text_scrolling_info.p_eas = NULL;     
269        s_eas_text_scrolling_info.eas_text_len = 0;     
270        BDBG_ERR(("#### get EAS Alert Text failed ####"));
271        return BERR_INVALID_PARAMETER;
272}
273
274
275static const unsigned char *get_eas_text_line(void)
276{
277        static char ts_str[MAX_TSTR_LINE + 1];
278
279        if (!s_eas_text_scrolling_info.p_eas || 
280                s_eas_text_scrolling_info.eas_current >= s_eas_text_scrolling_info.eas_text_len)
281        {
282                /* empty or no more text */
283                ts_str[0] = '\0';
284        } else
285        {
286                int i, cur;
287
288                cur = s_eas_text_scrolling_info.eas_current;
289                if ((cur + MAX_TSTR_LINE) < s_eas_text_scrolling_info.eas_text_len)
290                {
291                        memcpy(ts_str, &s_eas_text_scrolling_info.eas_text[cur], MAX_TSTR_LINE);
292                        ts_str[MAX_TSTR_LINE] = '\0';
293                        /* now back scan to find a place with white space, TODO unicode handling */
294                        for (i = strlen(ts_str); i > 0; i--)
295                        {
296                                if ((0x20 == ts_str[i] || '\t' == ts_str[i]))
297                                {
298                                        ts_str[i] = '\0';
299                                        break;
300                                }
301                        }
302                } else
303                {
304                        memcpy(ts_str, &s_eas_text_scrolling_info.eas_text[cur], 
305                                   s_eas_text_scrolling_info.eas_text_len - cur);
306                        ts_str[s_eas_text_scrolling_info.eas_text_len - cur] = '\0';
307                }
308                s_eas_text_scrolling_info.eas_current += strlen(ts_str);
309        }   
310        return (const unsigned char *)ts_str;
311}
312
313static void get_line_str(bapp_t *p_app,
314                                                 int line,                       /* line number */
315                                                 unsigned int *p_uni_str,        /* Buffer to put UNI string into */
316                                                 unsigned int *str_len)          /* On input the max length in words on output the actual size in characters. */
317{
318        static char ts_str[MAX_EAS_TEXT + 1];
319
320        if (!s_eas_text_scrolling_info.p_eas)
321        {
322                *str_len = 0;
323                return;
324        }
325
326        switch (line)
327        {
328        default:
329        case 0:
330        case 1:
331                *str_len = 0; break;
332                break;
333
334        case 2:
335                *str_len = snprintf(ts_str,MAX_EAS_TEXT,"%s", get_eas_text_line()); 
336                break;
337        case 3:
338                /* scrolling position */
339                *str_len = snprintf(ts_str,MAX_EAS_TEXT,"%s", get_eas_text_line()); 
340                break;
341        }
342
343        if (*str_len)
344        {
345                *str_len = c_to_uni_str((unsigned char*)ts_str,p_uni_str,*str_len);
346        }
347}
348
349/*
350Summary:
351        EAS alert text drawing function.
352*/
353void bscreen_eas_text_scrolling_info_draw(void *v_app, void *v_screen)
354{
355        bapp_t *p_app = (bapp_t*)v_app;
356        uint16_t x,y,y_off;
357        unsigned int num_chars = 0;
358        int i = 0,size;
359
360        x = eEAS_TEXT_X;
361        y = eEAS_TEXT_Y;
362
363        bgfx_fill_rect(&p_app->surf,x,y,eEAS_TEXT_WIDTH,eEAS_TEXT_HEIGHT,eCOLOR_BLACK);
364        y += eEAS_ROW_HEIGHT;
365
366        while (i < EAS_TEXT_LINE_MAX)
367        {
368                y_off = y + (i * eEAS_ROW_HEIGHT);
369                if ((y_off + eEAS_ROW_HEIGHT) >= eHEIGHT)
370                {
371                        BDBG_WRN(("%s too many rows %d, y = %d",__FUNCTION__,i,y_off));
372                        break;
373                }
374                bgfx_fill_rect(&p_app->surf,x,y_off,eEAS_TEXT_WIDTH,eEAS_ROW_HEIGHT,eCOLOR_BLACK);
375                num_chars = SCREEN_MAX_STR_WIDTH;
376                if (0 == i)
377                {
378                        char *p = NULL, event[30];
379
380                        if (s_eas_text_scrolling_info.header.nature_of_activation_text_length)
381                        {
382                                p = (char *)TS_SCTE_18_getActivationTextOffset((const unsigned  char *)s_eas_text_scrolling_info.p_eas,(size_t*) &size);
383                                if (p)
384                                {
385                                        if (eas_process_mss(p_app, (unsigned char*)p, (unsigned char*)event, sizeof(event) - 1))
386                                        {
387                                                p = NULL;
388                                        }
389                                } else
390                                {
391                                        BDBG_WRN(("TS_SCTE_18_getActivationTextOffset failed"));
392                                }
393                        }
394                        if (!p)
395                        {
396                                strcpy(event, "EAS Alert\n");
397                        }
398                        num_chars = c_to_uni_str((unsigned char*)event, p_app->tmp_str, strlen(event));
399                        text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL],
400                                         x + 10, y_off, eEAS_TEXT_WIDTH - 10, eEAS_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_DK_YELLOW, 0);
401                } else
402                {
403                        num_chars = SCREEN_MAX_STR_WIDTH;
404                        get_line_str(p_app,i,p_app->tmp_str,&num_chars);
405                        if (num_chars)
406                        {
407                                text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL],
408                                                 x + 10, y_off, eEAS_TEXT_WIDTH - 10, eEAS_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0);
409                        }
410                }
411                i++;
412        }
413}
414
415/*
416Summary:
417        Use the this function to get a UNI string.
418*/
419
420void bscreen_get_string(
421                                           bapp_lang_t e_lang,             /* Language enum */
422                                           btext_id_t e_text_id,           /* Text enum */
423                                           unsigned int *p_uni_str,        /* Buffer to put UNI string into */
424                                           unsigned int *str_len           /* On input the max length in words on output the actual size in characters. */
425                                           )
426{
427        char *p_str;
428
429        if ((e_text_id >= eTEXT_MAX) || (e_lang >= eLANG_MAX))
430        {
431                BDBG_ERR(("bscreen_get_string(%d,%d)(%d,%d) failed\n", e_lang, e_text_id,eTEXT_MAX,eLANG_MAX));
432                *str_len = 0;
433                return;
434        }
435
436        p_str = (char*)s_str_table[e_text_id];
437       
438#if 0
439        BDBG_ERR(("get text id: %d - %s\n", e_text_id, p_str));
440#endif
441        *str_len = c_to_uni_str((unsigned char*)p_str,p_uni_str,*str_len);
442}
443
444/*
445Summary:
446        Default screen idle handler
447Description:
448        Default screen idle handler.
449        .
450*/
451int bscreen_default_idle(void *v_app, void *v_screen)
452{
453        bapp_t *p_app         = (bapp_t*)v_app;
454        bscreen_t *p_screen   = (bscreen_t*)v_screen;
455        uint32_t current_tick = bapp_task_getticks();
456        bool show_screensaver = false;
457
458        /* check for screen timeout when 'no signal' popup is displayed */
459        if (current_tick >= (p_app->last_keypress_tick + MS_TO_TICKS(SCREEN_DEFAULT_TIMEOUT)))
460        {
461                if (p_app->screen_id == eSCREEN_BANNER)
462                {
463                        banner_state_t *p_bs = (banner_state_t*)p_screen->local_state;
464                        if ( p_bs->mode == eLS_BANNER_INFO )
465                        {
466                                show_screensaver = true;
467                        }
468                } else if (p_app->screen_id != eSCREEN_SCREENSAVER)
469                {
470                        show_screensaver = true;
471                }
472        }
473
474#ifndef CONFIG_SCREENSAVER
475        if (show_screensaver)
476        {
477                return 0; /* don't cause screen redraw */
478        }
479#else
480        if (show_screensaver)
481        {
482                bapp_set_current_screen(p_app, eSCREEN_SCREENSAVER, eSCREEN_MAX);
483                p_app->last_keypress_tick = current_tick;
484                BDBG_WRN(("#### %s:%d 0x%08x ####\n",__FUNCTION__,__LINE__,TICKS_TO_MS(p_app->last_keypress_tick)));
485                return 1; /* cause screen redraw */
486        }
487#endif
488        return 0;
489}
490
491#ifdef BDBG_DEBUG_BUILD
492        #define bscreen_set_banner_state(app,screen,mode) bscreen_set_banner_state_dbg(app,screen,mode,__FUNCTION__,__LINE__)
493static int bscreen_set_banner_state_dbg(void *v_app, void *v_screen, banner_mode_t new_mode, const char* func, int line)
494#else
495static int bscreen_set_banner_state(void *v_app, void *v_screen, banner_mode_t new_mode)
496#endif
497{
498        bapp_t *p_app = (bapp_t*)v_app;
499        bscreen_t *p_screen = (bscreen_t*)v_screen;
500        banner_state_t *p_bs = (banner_state_t*)p_screen->local_state;
501        BDBG_ASSERT(p_bs);
502
503        if (p_app->screen_id != eSCREEN_BANNER)
504                return 0;
505
506    /* Allow closed caption to pass through when we get a banner i.e. PIG */
507                bapp_enable_cc(p_app, 1);
508
509        p_bs->mode = new_mode;
510        switch (p_bs->mode)
511        {
512        case eLS_BANNER_SMALL:
513                p_bs->timeout = bapp_task_getticks() + MS_TO_TICKS(BANNER_SMALL_TIMEOUT);
514                banner_null_draw(v_app,v_screen);
515                break;
516        case eLS_BANNER_VOLUME:
517                p_bs->timeout = bapp_task_getticks() + MS_TO_TICKS(BANNER_VOLUME_TIMEOUT);
518                banner_null_draw(v_app,v_screen);
519                break;
520        case eLS_BANNER_SAP:
521                p_bs->timeout = bapp_task_getticks() + MS_TO_TICKS(BANNER_SAP_TIMEOUT);
522                banner_null_draw(v_app,v_screen);
523                break;
524        case eLS_BANNER_INFO:
525                p_bs->timeout = bapp_task_getticks() + MS_TO_TICKS(SCREEN_DEFAULT_TIMEOUT);
526                banner_null_draw(v_app,v_screen);
527                break;
528        case eLS_BANNER_EAS_TEXT_SCROLLING:
529                p_bs->timeout = bapp_task_getticks() + MS_TO_TICKS(SCREEN_DEFAULT_TIMEOUT);
530                banner_null_draw(v_app,v_screen);
531                break;
532        default:
533                break;
534        }
535
536#ifdef BDBG_DEBUG_BUILD
537        BDBG_WRN(("banner state new mode %d called from %s:%d(%d)\n",new_mode, func,line,p_bs->timeout));
538#endif
539        return 1;
540}
541
542
543static void reset_10_key_timeout(bscreen_t *p_screen)
544{
545        banner_state_t *p_bs = (banner_state_t*)p_screen->local_state;
546
547        if (p_bs->majorChIndex > 0)
548        {
549                p_bs->ten_key_timeout = bapp_task_getticks() + MS_TO_TICKS(BANNER_10_KEY_TIMEOUT);
550                p_bs->timeout = bapp_task_getticks() + MS_TO_TICKS(BANNER_SMALL_TIMEOUT);
551        } else
552                p_bs->ten_key_timeout = 0;
553}
554
555static void reset_10_key(bscreen_t *p_screen)
556{
557        banner_state_t *p_bs = (banner_state_t*)p_screen->local_state;
558
559        BDBG_ASSERT(p_bs);
560
561        memset(p_bs->majorCh, 0, sizeof(p_bs->majorCh));
562        p_bs->majorChIndex  = 0;
563        p_bs->enter         = false;
564
565        reset_10_key_timeout(p_screen);
566}
567
568static int my_atoi(const char *s)
569{
570        int i=0;
571
572        while ((*s >= '0') && (*s <='9'))
573                i = i*10 + *(s++) - '0';
574
575        return i;
576}
577
578/*
579Summary:
580        Banner screen event handler
581Description:
582        Banner screen event handler.
583        .
584*/
585int screen_banner_event(void *v_app, void *v_screen, 
586                                                bscreen_event_t *p_event)
587{
588        bapp_t *p_app = (bapp_t*)v_app;
589        bscreen_t *p_screen = (bscreen_t*)v_screen;
590        banner_state_t *p_bs;
591        int result = 0;
592        bool muted;
593        static int last_mode = -1;
594
595        p_bs = (banner_state_t*)p_screen->local_state;
596
597        BDBG_ASSERT(p_bs);
598
599        switch (p_event->type)
600        {
601        case eS_EVENT_REDRAW:
602
603                result = 1;
604                break;
605
606        case eS_EVENT_SETUP:
607                {
608                        result = 1;     /* always handle event */
609                        /* if showing banner because of 10key, do not reset value */
610                        if (!((p_event->id >= eIR_0) && (p_event->id <= eIR_9)))
611                                reset_10_key(p_screen);
612
613                        /* reset key repeat timeout */
614                        p_bs->repeat_rate = 1;
615                        p_bs->repeat_timeout = bapp_task_getticks() + DEFAULT_REPEAT_TIMEOUT/p_bs->repeat_rate;
616
617                        reset_10_key_timeout(p_screen);
618                }
619                break;
620        case eS_EVENT_SETUP_DONE:
621                if (p_app->state == eAPP_STATE_NORMAL)
622                        result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_SMALL);
623                else if ((p_app->state == eAPP_STATE_PENDING) || (p_app->state == eAPP_STATE_DOWNLOAD) || (p_app->state == eAPP_STATE_HUNT))
624                        result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_INFO);
625                else
626                        result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_OFF);
627                break;
628        case eS_EVENT_IDLE:
629                {
630                        uint32_t current_tick = bapp_task_getticks();
631
632                        /* Check for change in the applications state */
633                        switch (p_app->state)
634                        {
635                        case eAPP_STATE_NORMAL:
636                                /* determine whether banner needs to be brought up or torn down */
637                                /* based on signal status */
638                                if (bapp_get_signal_status(p_app))
639                                {                /* if signal present */
640                                        if (p_bs->mode == eLS_BANNER_INFO)
641                                        {        /* if banner is currently up */
642                                                result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_OFF); /* take it down */
643                                                p_bs->timeout = 0;                                      /* clear time out just in case */
644                                        }
645                                } 
646                                else
647                                {                                                                        /* if no signal present */
648                                        if (p_bs->mode == eLS_BANNER_OFF)
649                                        {         /* if on video */
650                                                result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_INFO);     /* put up banner */
651                                                p_app->last_keypress_tick = current_tick; /* reset timer for screensaver entry */
652                                                p_bs->timeout = 0;                                      /* this screen doesn't time out */
653                                        }
654                                }
655                                break;
656                        case eAPP_STATE_HUNT:
657                        case eAPP_STATE_PENDING:
658                        case eAPP_STATE_DOWNLOAD:
659                                {
660                                        static chm_cmd_t last_cmd_id = eCHM_CANCEL;
661
662                                        p_bs->event.type = eS_EVENT_MAX; /* Prevent repeat key when not in normal state */
663                                        if ((p_bs->mode != eLS_BANNER_INFO) || (p_bs->timeout == 0) || (last_cmd_id != p_app->chm.cmd))
664                                        {
665                                                last_cmd_id = p_app->chm.cmd;
666                                                result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_INFO);
667                                        }
668                                        if (p_app->state == eAPP_STATE_HUNT)
669                                        {
670                                                static int s_local_progress = 0;
671                                                int progress = chm_get_hunt_progress(&p_app->chm);
672                                                result = (s_local_progress != progress) ? 1 : result;
673                                                s_local_progress = progress;
674                                        }
675                                        else if (p_app->state == eAPP_STATE_PENDING)
676                                        {
677                                                static unsigned short s_local_num_vch = 0;
678                                                static bool s_local_activated = false;
679                                                unsigned short num_vch, num_st;
680                                                unsigned char num_freq ;
681                                                ch_map_get_counts(bapp_cur_ch_map(p_app),&num_vch,&num_st,&num_freq);
682                                                if ((s_local_activated != p_app->settings.activated) || (num_vch != s_local_num_vch))
683                                                {
684                                                        result = 1;
685                                                }
686                                                s_local_activated = p_app->settings.activated;
687                                                s_local_num_vch = num_vch;
688                                        }
689                                }
690                                break;
691                        default:
692                                break;
693                        }
694
695                        if (p_bs->mode == eLS_BANNER_INFO)
696                        {
697                                if ((p_app->state == eAPP_STATE_NORMAL) && bapp_get_signal_status(p_app))
698                                {
699                                        result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_SMALL);
700                                }
701                        }
702
703                        /* if eas alert is fired */
704                        if (p_app->eas_text && p_app->eas_timeout)
705                        {
706                                if (eAPP_STATE_NORMAL == p_app->state)
707                                {
708                                        static int cnt = 0;
709
710                                        /* to bring up EAS text scrolling if not yet */
711                                        if (eLS_BANNER_EAS_TEXT_SCROLLING != p_bs->mode && !(p_app->eas_text & EAS_BANNER_POPPED))
712                                        {
713                                                cnt = 0;
714                                                result = bscreen_set_banner_state(v_app, v_screen, eLS_BANNER_EAS_TEXT_SCROLLING);
715                                                p_app->eas_text |= EAS_BANNER_POPPED;
716                                        }
717
718                                        if (eLS_BANNER_EAS_TEXT_SCROLLING == p_bs->mode)
719                                        {
720                                                if (cnt++ == 50)
721                                                {
722                                                        cnt = 0;
723                                                        /* if no more text to draw, redraw from beginning */
724                                                        if (s_eas_text_scrolling_info.eas_current >= s_eas_text_scrolling_info.eas_text_len)
725                                                                s_eas_text_scrolling_info.eas_current = 0;
726                                                        result = 1;
727                                                }
728                                        }
729                                }
730                        }
731
732                        /* Handle repeating when key is held down */
733                        if (p_bs->repeat_timeout < current_tick)
734                        {
735                                /* BDBG_MSG(("%s repeat %d\n",__FUNCTION__,p_bs->event.id)); */
736                                if (p_bs->event.type == eS_EVENT_IR)
737                                {
738                                        switch (p_bs->event.id)
739                                        {
740                                        case eIR_UP:
741                                        case eIR_CH_UP:
742                                                bapp_change_channel(p_app,1,1);
743                                                result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_SMALL);
744                                                break;
745                                        case eIR_DOWN:
746                                        case eIR_CH_DOWN:
747                                                bapp_change_channel(p_app,0,1);
748                                                result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_SMALL);
749                                                break;
750                                        case eIR_VOL_UP:
751                                                bapp_set_audio_volume(p_app, p_app->audio_vol - VOLUME_INCREMENT);
752                                                result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_VOLUME);
753                                                break;
754                                        case eIR_VOL_DOWN:
755                                                bapp_set_audio_volume(p_app, p_app->audio_vol + VOLUME_INCREMENT);
756                                                result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_VOLUME);
757                                                break;
758                                        default: break;
759                                        }
760                                }
761
762                                if (p_bs->repeat_rate < MAX_REPEAT_ACCEL)
763                                {
764                                        p_bs->repeat_rate += REPEAT_INC;
765                                }
766                                p_bs->repeat_timeout = current_tick + (DEFAULT_REPEAT_TIMEOUT/p_bs->repeat_rate);
767                        }
768
769                        /* handle timeout */
770                        if (p_bs->timeout && (current_tick >= p_bs->timeout))
771                        {
772                                BDBG_WRN(("banner timeout %d >= %d\n",current_tick,p_bs->timeout));
773                                p_bs->timeout = 0;
774                                if (p_app->eas_text && p_app->eas_timeout)
775                                {
776                                        result = bscreen_set_banner_state(v_app, v_screen, eLS_BANNER_EAS_TEXT_SCROLLING);
777                                } else
778                                        result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_OFF);
779                        }
780
781                        /* handle 10key timeout */
782                        if ((p_bs->ten_key_timeout) && (current_tick >= p_bs->ten_key_timeout))
783                        {
784                                /* user has entered some 10key so attempt tune */
785
786                                /* force drawing of last digit indicator */
787                                p_bs->enter = true;
788
789                                bapp_set_channel(p_app, my_atoi(p_bs->majorCh));
790                                reset_10_key(p_screen);
791                                result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_SMALL);
792                        }
793
794                        result |= bscreen_default_idle(v_app, v_screen);
795
796                        if (last_mode != p_bs->mode)
797                        {
798                                result = 1;
799                                last_mode = p_bs->mode;
800                        }
801                }
802                break;
803        case eS_EVENT_IR:
804                {
805                        /* cancel partial 10key entry if user presses any invalid key */
806                        if ((p_bs->majorChIndex > 0) &&
807                                ((p_event->id & KEY_UP) == 0))
808                        {
809                                if ((p_event->id != eIR_0)     &&
810                                        (p_event->id != eIR_1)     &&
811                                        (p_event->id != eIR_2)     &&
812                                        (p_event->id != eIR_3)     &&
813                                        (p_event->id != eIR_4)     &&
814                                        (p_event->id != eIR_5)     &&
815                                        (p_event->id != eIR_6)     &&
816                                        (p_event->id != eIR_7)     &&
817                                        (p_event->id != eIR_8)     &&
818                                        (p_event->id != eIR_9)     &&
819                                        (p_event->id != eIR_DOT)   &&
820                                        (p_event->id != eIR_SELECT) &&
821                                        (p_event->id != eIR_ENTER))
822                                {
823                                        reset_10_key(p_screen);
824                                        result = 1;
825                                }
826                        }
827
828                        switch (p_event->id)
829                        {
830                        case eIR_VOL_UP:
831                                muted = p_app->is_muted;
832                                if (muted)
833                                {
834                                        p_app->audio_mute = !p_app->audio_mute;
835                                        bapp_audio_mute(p_app, p_app->audio_mute);
836                                        /* reset screensaver timeout if we will show mute popup */
837                                        result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_VOLUME);
838                                } else
839                                {
840                                        p_app->audio_mute = 0;
841                                        bapp_set_audio_volume(p_app, p_app->audio_vol - VOLUME_INCREMENT);
842                                        result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_VOLUME);
843                                        if (muted && !result)
844                                                result = 1;
845                                }
846                                break;
847                        case eIR_VOL_DOWN:
848                                muted = p_app->is_muted;
849                                if (muted)
850                                {
851                                        p_app->audio_mute = !p_app->audio_mute;
852                                        bapp_audio_mute(p_app, p_app->audio_mute);
853                                        /* reset screensaver timeout if we will show mute popup */
854                                        result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_VOLUME);
855                                } else
856                                {
857                                        p_app->audio_mute = 0;
858                                        bapp_set_audio_volume(p_app, p_app->audio_vol + VOLUME_INCREMENT);
859                                        result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_VOLUME);
860                                        if (muted && !result)
861                                                result = 1;
862                                }
863                                break;
864                        case eIR_VOL_OPT:
865                                muted = p_app->is_muted;
866                                p_app->audio_mute = 0;  /* umute audio */
867
868                                /* set volume to max    */
869                                bapp_set_audio_volume(p_app, DEFAULT_VOLUME_LEVEL);
870                                /* wlh, CR 0811-0621 - don't put up the volume banner  */
871                                if ( muted )
872                                        result = 1;
873                                break;
874                        case eIR_LEFT:
875                                break;
876                        case eIR_MENU:
877                                break;
878
879                        case eIR_INFO:
880                                result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_SMALL);
881                                break;
882                        case eIR_GUIDE:
883                                break;
884                        case eIR_UP:
885                        case eIR_CH_UP:
886                                bapp_change_channel(p_app,1,1);
887                                result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_SMALL);
888                                break;
889                        case eIR_DOWN:
890                        case eIR_CH_DOWN:
891                                bapp_change_channel(p_app,0,1);
892                                result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_SMALL);
893                                break;
894                        case eIR_DOT:
895                                break;
896                        case eIR_0:
897                        case eIR_1:
898                        case eIR_2:
899                        case eIR_3:
900                        case eIR_4:
901                        case eIR_5:
902                        case eIR_6:
903                        case eIR_7:
904                        case eIR_8:
905                        case eIR_9:
906                                if (p_bs->majorChIndex >= MAJOR_CH_CHARS)
907                                {
908                                        /* max number of major channel digits have been entered
909                                           so skip to minor channel digit entry */
910                                        p_bs->enter = true;
911                                }
912
913                                if (!p_bs->enter)
914                                {
915                                        /* major channel number digit entered */
916                                        p_bs->majorCh[p_bs->majorChIndex] = '0' + (p_event->id - eIR_0);
917                                        p_bs->majorChIndex++;
918                                        reset_10_key_timeout(p_screen);
919                                }
920
921                                result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_SMALL);
922                                if (p_bs->majorChIndex < MAJOR_CH_CHARS)
923                                        break;
924
925                        case eIR_ENTER:
926                                if (p_bs->majorChIndex > 0)
927                                {
928                                        /* force drawing of channel without '_' */
929                                        p_bs->enter = true;
930
931                                        bapp_set_channel(p_app, my_atoi(p_bs->majorCh));
932                                        reset_10_key(p_screen);
933                                }
934
935                                result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_SMALL);
936                                break;
937                                /* Avoid doing previous channel on key down to handle diag screen entry on prech > 5sec */
938                        case (eIR_PRECH | KEY_UP):
939                                {
940                                        bapp_tune_prev(p_app);
941                                        result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_SMALL);
942                                }
943                                break;
944                        case eIR_MUTE:
945                                p_app->audio_mute = !p_app->audio_mute;
946                                bapp_audio_mute(p_app, p_app->audio_mute);
947                                /* reset screensaver timeout if we will show mute popup */
948                                result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_VOLUME);
949                                break;
950                        case eIR_SELECT:
951                                if (p_bs->majorChIndex > 0)
952                                {
953                                        /* force drawing of channel without '_' */
954                                        p_bs->enter = true;
955
956                                        bapp_set_channel(p_app, my_atoi(p_bs->majorCh));
957                                        reset_10_key(p_screen);
958                                        result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_SMALL);
959                                } else
960                                {
961                                        if (p_bs->mode == eLS_BANNER_SAP)
962                                        {
963                                                bapp_rotate_audio_sap(p_app);
964                                        }
965
966                                        /* reset screensaver timeout since we will show SAP popup */
967                                        result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_SAP);
968                                }
969                                break;
970                        case eIR_LANG:
971                                if ( ( p_bs->mode == eLS_BANNER_SAP ) || ( p_bs->mode == eLS_BANNER_OFF) )
972                                {
973                                        bapp_rotate_audio_sap(p_app);
974                                }
975
976                                /* reset screensaver timeout since we will show SAP popup */
977                                result = bscreen_set_banner_state(v_app, v_screen,eLS_BANNER_SAP);
978                                break;
979                        }
980                }
981                p_bs->event = *p_event;
982
983                /* reset key repeat timeout */
984                p_bs->repeat_rate = 1;
985                p_bs->repeat_timeout = bapp_task_getticks() + (DEFAULT_REPEAT_TIMEOUT/p_bs->repeat_rate);
986
987                /* Since the tuning time can be greater than the repeat timeout increase it to handle these cases */
988                switch (p_event->id)
989                {
990                case eIR_UP:
991                case eIR_CH_UP:
992                case eIR_DOWN:
993                case eIR_CH_DOWN:
994                        p_bs->repeat_timeout += (DEFAULT_REPEAT_TIMEOUT/p_bs->repeat_rate); 
995                        break;
996                default: break;
997                }
998                break;
999
1000        default:
1001        case eS_EVENT_SELECTED:
1002        case eS_EVENT_CHECKED:
1003                {
1004                        result = bscreen_default_event(v_app,v_screen,p_event);
1005                }
1006                break;
1007        }
1008
1009        return result;
1010}
1011/*
1012Summary:
1013        screensaver screen event handler
1014Description:
1015        screensaver screen event handler.
1016        .
1017*/
1018int screen_screensaver_event(void *v_app, void *v_screen, 
1019                                                         bscreen_event_t *p_event)
1020{
1021        bapp_t *p_app = (bapp_t*)v_app;
1022        bscreen_t *p_screen = (bscreen_t*)v_screen;
1023        int result = 0;
1024        screensaver_state_t *p_ss = (screensaver_state_t*)p_screen->local_state;
1025        BDBG_ASSERT(p_ss);
1026
1027        switch (p_event->type)
1028        {
1029        case eS_EVENT_IDLE:
1030                if (bapp_task_getticks() >= p_ss->image_swap_timeout)
1031                {
1032                        /* redraw window */
1033                        result = 1;
1034
1035                        p_ss->image_swap_timeout = bapp_task_getticks() + MS_TO_TICKS(SCREENSAVER_IMAGE_TIMEOUT);
1036                }
1037
1038                if (!result)
1039                        result = bscreen_default_idle(v_app, v_screen);
1040
1041                if ((p_screen->last_screen_id == eSCREEN_BANNER) && bapp_get_signal_status(p_app))
1042                {
1043                        bapp_goto_last_screen(p_app);
1044                }
1045                break;
1046        case eS_EVENT_SETUP:
1047                {
1048                        p_ss->image_swap_timeout = bapp_task_getticks() + MS_TO_TICKS(SCREENSAVER_IMAGE_TIMEOUT);
1049                        bapp_set_palette(p_app, ePALETTE_SCREENSAVER);
1050                }
1051                break;
1052        case eS_EVENT_IR:
1053                if ((p_event->id & KEY_UP) == 0)
1054                {
1055                        screen_null_draw(v_app, v_screen);
1056                        bapp_goto_last_screen(p_app);
1057                        /* recheck ratings block status which may have changed while in screensaver */
1058                        result = 1;
1059                }
1060                break;
1061        default:
1062                break;
1063        }
1064        return result; /* always handle event */
1065}
1066
1067/*
1068Summary:
1069        Power off screen event handler
1070Description:
1071        Power off screen event handler.
1072        .
1073*/
1074int screen_power_off_event(void *v_app, void *v_screen, 
1075                                                   bscreen_event_t *p_event)
1076{
1077#ifdef CONFIG_SCREENSAVER
1078        bapp_t *p_app = (bapp_t*)v_app;
1079#endif
1080        int result = 0;
1081
1082        switch (p_event->type)
1083        {
1084        case eS_EVENT_SETUP:
1085#ifdef CONFIG_SCREENSAVER
1086                p_app->last_keypress_tick = bapp_task_getticks();
1087                BDBG_WRN(("#### %s:%d 0x%08x ####\n",__FUNCTION__,__LINE__,TICKS_TO_MS(p_app->last_keypress_tick)));
1088                bapp_enable_cc(p_app, 0);
1089#endif
1090                result = 1;
1091                break;
1092        default:
1093                break;
1094        }
1095        return result; /* always handle event */
1096}
1097
1098/*
1099Summary:
1100        Screensaver screen event handler
1101        .
1102*/
1103int bscreen_screensaver_event(void *v_app, void *v_screen, 
1104                                                          bscreen_event_t *p_event)
1105{
1106        int result = 0;
1107        bapp_t *p_app = (bapp_t*)v_app;
1108        switch (p_event->type)
1109        {
1110       
1111        case eS_EVENT_SETUP:
1112                bapp_enable_cc(p_app, 0);
1113                result = 1;
1114                break;
1115        default:
1116                result = bscreen_default_event(v_app,v_screen,p_event);
1117        }
1118        return result;
1119}
1120/*
1121Summary:
1122        Default screen event handler
1123Description:
1124        Default screen event handler.
1125        .
1126*/
1127int bscreen_default_event(void *v_app, void *v_screen, 
1128                                                  bscreen_event_t *p_event)
1129{
1130        bapp_t *p_app = (bapp_t*)v_app;
1131        bscreen_t *p_screen = (bscreen_t*)v_screen;
1132        int result = 0;
1133        switch (p_event->type)
1134        {
1135        default:
1136        case eS_EVENT_IDLE:
1137                result = bscreen_default_idle(v_app,v_screen);
1138                break;
1139
1140        case eS_EVENT_REDRAW:
1141                result = 1;
1142                break;
1143
1144        case eS_EVENT_SETUP:
1145                bscreen_default_setup(v_app,v_screen);
1146                result = 1;
1147                break;
1148
1149        case eS_EVENT_SELECTED:
1150                result = (p_screen->button_selection == p_event->id) ? 1 : 0;
1151                break;
1152
1153        case eS_EVENT_CHECKED:
1154                result = (p_screen->button_checked == p_event->id) ? 1 : 0;
1155                break;
1156
1157        case eS_EVENT_IR:
1158                switch (p_event->id)
1159                {
1160                case eIR_INFO:
1161                        break;
1162                case eIR_LEFT:
1163                case eIR_MENU:
1164                        break;
1165                case eIR_RIGHT:
1166                case eIR_SELECT:
1167                        break;
1168                case eIR_UP:
1169                        break;
1170                case eIR_DOWN:
1171                        break;
1172                case eIR_1:
1173                case eIR_2:
1174                case eIR_3:
1175                case eIR_4:
1176                case eIR_5:
1177                case eIR_6:
1178                case eIR_7:
1179                case eIR_8:
1180                case eIR_9:
1181                        if ((p_event->id - 1)  < p_screen->num_buttons)
1182                        {
1183                                bscreen_event_t event;
1184                                p_screen->button_selection = p_event->id - 1;
1185
1186                                event.id = eIR_SELECT;
1187                                event.type = eS_EVENT_IR;
1188                                result = p_screen->handle_event(p_app,p_screen,&event);
1189                        }
1190                        break;
1191                default:
1192                        /* Do nothing */
1193                        break;
1194                }
1195                break;
1196        }
1197        return result; /* always handle event */
1198}
1199/*
1200Summary:
1201        NULL screen drawing function
1202Description:
1203        NULL screen drawing function.
1204        .
1205*/
1206void screen_null_draw(void *v_app, void *v_screen)
1207{
1208        bapp_t *p_app = (bapp_t*)v_app;
1209        bgfx_fill_rect(&p_app->surf,0,0,eWIDTH,eHEIGHT,eCOLOR_CLEAR);
1210}
1211
1212/*
1213Summary:
1214        NULL screen drawing function for banner
1215Description:
1216        NULL screen drawing function for banner
1217        .
1218*/
1219static void banner_null_draw(void *v_app, void *v_screen)
1220{
1221        bapp_t *p_app = (bapp_t*)v_app;
1222        bgfx_fill_rect(&p_app->surf,0,0,eWIDTH,eHEIGHT,eCOLOR_CLEAR);
1223}
1224
1225
1226/*
1227Summary:
1228        Default screen setup function
1229Description:
1230        Default screen setup function used to set initial state before drawing.
1231*/
1232void bscreen_default_setup(void *v_app, void *v_screen)
1233{
1234        bscreen_t *p_screen = (bscreen_t*)v_screen;
1235
1236        if ((p_screen->button_selection + 1) > p_screen->num_buttons)
1237                p_screen->button_selection = 0;
1238
1239        p_screen->button_checked = 0;
1240}
1241
1242/*
1243Summary:
1244        Default screen drawing function
1245Description:
1246        Default screen drawing function.
1247        .
1248*/
1249void bscreen_default_draw(void *v_app, void *v_screen)
1250{
1251        bapp_t *p_app = (bapp_t*)v_app;
1252        bgfx_fill_rect(&p_app->surf,0,0,eWIDTH,eHEIGHT,eCOLOR_BLACK);
1253}
1254
1255
1256
1257/*
1258Summary:
1259        Channel Banner Draw.
1260*/
1261#define TMP_BUF_CHAR_MAX        16
1262
1263static void bscreen_ch_banner_draw(void *v_app, void *v_screen)
1264{
1265        bapp_t *p_app = (bapp_t*)v_app;
1266        bscreen_t *p_screen = (bscreen_t*)v_screen;
1267        unsigned int num_chars;
1268        unsigned char *p_str;
1269        int i;
1270        char tmp_buf[TMP_BUF_CHAR_MAX];
1271        banner_state_t *p_bs = (banner_state_t*)p_screen->local_state;
1272        vch_t vch;
1273        st_t st;
1274        freq_t freq;
1275
1276        /* draw small banner with semi-transparent background */
1277        bgfx_fill_rect(&p_app->surf,eBANNER_X,eBANNER_Y,
1278                                   eBANNER_WIDTH,eBANNER_HEIGHT,eCOLOR_BLACK);
1279
1280        for (i = 0; i < 4; i++)
1281        {
1282                bgfx_h_draw_line(&p_app->surf,eBANNER_X+i,eBANNER_X+eBANNER_WIDTH-i,
1283                                                 eBANNER_Y+i,eCOLOR_BLACK);
1284                bgfx_h_draw_line(&p_app->surf,eBANNER_X+i,eBANNER_X+eBANNER_WIDTH-i,
1285                                                 eBANNER_Y+eBANNER_HEIGHT-1-i,eCOLOR_BLACK);
1286        }
1287
1288        if (!ch_map_get_current(bapp_cur_ch_map(p_app),&vch,&st,&freq))
1289        {
1290                BDBG_MSG(("Invalid current channel or map.\n"));
1291                return;
1292        }
1293
1294        /* draw channel num */
1295        num_chars = SCREEN_MAX_STR_WIDTH;
1296        if (p_bs->enter)
1297        {
1298                /* user has finish 10keying in a new channel num */
1299                snprintf(tmp_buf,9,"%s",p_bs->majorCh);
1300        } else if (p_bs->majorChIndex > 0)
1301        {
1302                snprintf(tmp_buf,9,"%s", p_bs->majorCh);
1303        } else
1304        {
1305                /* display current channel */
1306                snprintf(tmp_buf,9,"%d", vch.ch_num);
1307        }
1308
1309        num_chars = c_to_uni_str((unsigned char*)tmp_buf,p_app->tmp_str,num_chars);
1310        text_box_shadow(&p_app->surf, p_app->p_font[p_app->lang][eFONT_SIZE_MED],
1311                                        eBANNER_CH_NUM_X, eBANNER_CH_NUM_Y, eBANNER_CH_NUM_WIDTH, eBANNER_CH_NUM_HEIGHT, 
1312                                        p_app->tmp_str, num_chars, eCOLOR_LT_BLUE,eCOLOR_BLACK, eMENU_TEXT_DROPSHADOW ,0);
1313
1314        /* draw channel name */
1315        if (p_bs->enter)
1316        {
1317                /* user has finished 10keying in a new channel num */
1318                p_str = (unsigned char*)st.name;
1319        } else if (p_bs->majorChIndex > 0)
1320        {
1321                p_str = (unsigned char*)" ";
1322        } else
1323        {
1324                /* display current channel name */
1325                p_str = (unsigned char*)st.name;
1326        }
1327        if (p_str)
1328        {
1329                num_chars = c_to_uni_str(p_str,p_app->tmp_str,SCREEN_MAX_STR_WIDTH);
1330                if (num_chars > 0)
1331                {
1332                        if (num_chars > MAX_NAME_CHARS)
1333                                num_chars = MAX_NAME_CHARS;
1334                        text_box_shadow(&p_app->surf, p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],
1335                                                        eBANNER_TITLE_X, eBANNER_TITLE_Y, eBANNER_TITLE_WIDTH, eBANNER_TITLE_HEIGHT, 
1336                                                        p_app->tmp_str, num_chars, eCOLOR_WHITE,eCOLOR_BLACK, eMENU_TEXT_DROPSHADOW ,100);
1337                }
1338        }
1339}
1340
1341/*
1342Summary:
1343        Volume Banner Draw.
1344*/
1345extern const int s_volume_num;
1346static void bscreen_vol_banner_draw(void *v_app, void *v_screen)
1347{
1348        bapp_t *p_app = (bapp_t*)v_app;
1349        unsigned int num_chars;
1350        int i,w,h;
1351        int x;
1352        static int last_vol = 0;
1353        static int vol_minimized = 0;
1354        /* erase last language text */
1355
1356        /* Creates Volume Black Box */
1357        bgfx_fill_rect(&p_app->surf,eBANNER_POPUP_VOL_X,eBANNER_POPUP_VOL_Y,
1358                                   eBANNER_POPUP_VOL_WIDTH, eBANNER_POPUP_VOL_HEIGHT, eCOLOR_BLACK);
1359
1360        /* Highlights Top & Bottom of Box */
1361        for (i = 0; i < 4; i++)
1362        {
1363                bgfx_h_draw_line(&p_app->surf,eBANNER_POPUP_VOL_X+i,eBANNER_POPUP_VOL_X+eBANNER_POPUP_VOL_WIDTH-i,
1364                                                 eBANNER_POPUP_VOL_Y+i,eCOLOR_BLACK);
1365                bgfx_h_draw_line(&p_app->surf,eBANNER_POPUP_VOL_X+i,eBANNER_POPUP_VOL_X+eBANNER_POPUP_VOL_WIDTH-i,
1366                                                 eBANNER_POPUP_VOL_Y+eBANNER_POPUP_VOL_HEIGHT-1-i,eCOLOR_BLACK);
1367        }
1368
1369        /* Paints either Volume or Mute on screen */
1370        num_chars = SCREEN_MAX_STR_WIDTH;
1371        if (p_app->audio_mute)
1372                bscreen_get_string(p_app->lang,eTEXT_MUTE, p_app->tmp_str, &num_chars);
1373        else
1374                bscreen_get_string(p_app->lang,eTEXT_VOLUME, p_app->tmp_str, &num_chars);
1375
1376        bgfx_string_info(p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],(const unsigned long *)p_app->tmp_str,num_chars,&w,&h);
1377        text_box_shadow(&p_app->surf, p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],
1378                                        eBANNER_POPUP_VOL_TITLE_X, eBANNER_POPUP_VOL_TITLE_Y, 
1379                                        eBANNER_POPUP_VOL_WIDTH, eBANNER_POPUP_VOL_HEIGHT, 
1380                                        p_app->tmp_str, num_chars, eCOLOR_WHITE,eCOLOR_BLACK, eMENU_TEXT_DROPSHADOW ,0);
1381
1382
1383
1384        if ((last_vol == 31) && (p_app->audio_vol==31))
1385        {
1386                vol_minimized = 1;/*tells the drawing routine to show no bars */
1387        }
1388        last_vol = p_app->audio_vol;
1389
1390        if ((vol_minimized == 1) && (p_app->audio_vol == 30))
1391        {
1392                vol_minimized = 0;/*exit the minimized state */
1393                p_app->audio_vol = 31;/*revert to 31 to illuminate one bar */
1394        }
1395        for (x=s_volume_num, i = 0; i < eBANNER_POPUP_VOL_BAR_WIDTH; i += (eBANNER_POPUP_VOL_TICK_WIDTH * 2), x--)
1396        {
1397/*              bgfx_pixel color = eCOLOR_BLUE_TICK; */
1398                bgfx_pixel color = eCOLOR_DIM_BLUE;
1399
1400/*              else if ((i >= (((s_volume_num - p_app->audio_vol - 1) * eBANNER_POPUP_VOL_BAR_WIDTH)/s_volume_num))) */
1401                if (x > p_app->audio_vol)
1402/*                      color = eCOLOR_DIM_BLUE; */
1403                        color = eCOLOR_BLUE_TICK;
1404                if (vol_minimized == 1)
1405                {
1406                        color = eCOLOR_DIM_BLUE;
1407                }
1408                if (p_app->audio_vol == 0)
1409                {
1410                        color = eCOLOR_BLUE_TICK;
1411                }
1412
1413                /* last, check for mute and change the volume bar to red if muted */
1414                if (p_app->audio_mute)
1415                        color = eCOLOR_RED_TICK;
1416
1417                BDBG_MSG(("tick(%d,%d,%d,%d- %d,%d %d %d %d)\n",
1418                                  eBANNER_POPUP_VOL_TICK_X + i,
1419                                  eBANNER_POPUP_VOL_TICK_Y,
1420                                  eBANNER_POPUP_VOL_TICK_WIDTH,
1421                                  eBANNER_POPUP_VOL_TICK_HEIGHT,
1422                                  i,
1423                                  (((s_volume_num - p_app->audio_vol - 1) * eBANNER_POPUP_VOL_BAR_WIDTH)/s_volume_num),
1424                                  s_volume_num,
1425                                  p_app->audio_vol,
1426                                  x  ));
1427
1428                bgfx_fill_rect( &p_app->surf,
1429                                                eBANNER_POPUP_VOL_TICK_X + i,
1430                                                eBANNER_POPUP_VOL_TICK_Y,
1431                                                eBANNER_POPUP_VOL_TICK_WIDTH,
1432                                                eBANNER_POPUP_VOL_TICK_HEIGHT,
1433                                                color );
1434        }
1435
1436}
1437/*
1438Summary:
1439        Volume Banner Draw.
1440*/
1441
1442static bool languages_match(char *lang1,char *lang2)
1443{
1444        return (memcmp(lang1,lang2,3) == 0) ? true : false;
1445}
1446
1447/*
1448Summary:
1449        Determine language name and create on if some match or there is none.
1450*/
1451
1452static void get_lang_name(vch_t *p_vch, char *buf, int idx)
1453{
1454        if (p_vch->audio_lang[idx][0] == 0)
1455        {
1456                snprintf(buf,TMP_BUF_CHAR_MAX,"LANG-%2d",idx+1);
1457                return;
1458        }
1459    snprintf(buf,TMP_BUF_CHAR_MAX,"%c%c%c",p_vch->audio_lang[idx][0],
1460                        p_vch->audio_lang[idx][1],
1461                        p_vch->audio_lang[idx][2]);
1462   
1463    switch (idx)
1464    {
1465    case 0:
1466        if (languages_match(p_vch->audio_lang[idx],p_vch->audio_lang[1]) ||
1467            languages_match(p_vch->audio_lang[idx],p_vch->audio_lang[2]))
1468        {
1469            snprintf(buf,TMP_BUF_CHAR_MAX,"%c%c%c-1",p_vch->audio_lang[idx][0],
1470                                p_vch->audio_lang[idx][1],
1471                                p_vch->audio_lang[idx][2]);
1472        }
1473        break;
1474    case 1:
1475        if (languages_match(p_vch->audio_lang[idx],p_vch->audio_lang[0]))
1476        {
1477            snprintf(buf,TMP_BUF_CHAR_MAX,"%c%c%c-2",p_vch->audio_lang[idx][0],
1478                                p_vch->audio_lang[idx][1],
1479                                p_vch->audio_lang[idx][2]);
1480        }
1481        else if (languages_match(p_vch->audio_lang[idx],p_vch->audio_lang[2]))
1482        {
1483            snprintf(buf,TMP_BUF_CHAR_MAX,"%c%c%c-1",p_vch->audio_lang[idx][0],
1484                                p_vch->audio_lang[idx][1],
1485                                p_vch->audio_lang[idx][2]);
1486        }
1487        break;
1488    case 2:
1489        if (languages_match(p_vch->audio_lang[idx],p_vch->audio_lang[0]) &&
1490            languages_match(p_vch->audio_lang[idx],p_vch->audio_lang[1]))
1491        {
1492            snprintf(buf,TMP_BUF_CHAR_MAX,"%c%c%c-3",p_vch->audio_lang[idx][0],
1493                                p_vch->audio_lang[idx][1],
1494                                p_vch->audio_lang[idx][2]);
1495        }
1496        else if (languages_match(p_vch->audio_lang[idx],p_vch->audio_lang[1]))
1497        {
1498            snprintf(buf,TMP_BUF_CHAR_MAX,"%c%c%c-2",p_vch->audio_lang[idx][0],
1499                                p_vch->audio_lang[idx][1],
1500                                p_vch->audio_lang[idx][2]);
1501        }
1502        break;
1503    }
1504}
1505
1506
1507/*
1508Summary:
1509        Volume Banner Draw.
1510*/
1511
1512static void bscreen_sap_banner_draw(void *v_app, void *v_screen)
1513{
1514        bapp_t *p_app = (bapp_t*)v_app;
1515        unsigned int num_chars;
1516        int i,w,h;
1517        char tmp_buf[TMP_BUF_CHAR_MAX];
1518        vch_t vch;
1519        st_t st;
1520        freq_t freq;
1521       
1522        if (!ch_map_get_current(bapp_cur_ch_map(p_app),&vch,&st,&freq))
1523        {
1524                BDBG_MSG(("Invalid current channel or map.\n"));
1525                return;
1526        }
1527
1528        get_lang_name(&vch,tmp_buf,vch.cur_audio);
1529
1530        num_chars = c_to_uni_str((unsigned char*)tmp_buf, p_app->tmp_str, strlen(tmp_buf));
1531
1532        /* erase last language text */
1533        bgfx_fill_rect(&p_app->surf,eBANNER_POPUP_SAP_X,eBANNER_POPUP_SAP_Y,
1534                                   eBANNER_POPUP_SAP_WIDTH, eBANNER_POPUP_SAP_HEIGHT, eCOLOR_BLACK);
1535        for (i = 0; i < 4; i++)
1536        {
1537                bgfx_h_draw_line(&p_app->surf,eBANNER_POPUP_SAP_X+i,eBANNER_POPUP_SAP_X+eBANNER_POPUP_SAP_WIDTH-i,
1538                                                 eBANNER_POPUP_SAP_Y+i,eCOLOR_BLACK);
1539                bgfx_h_draw_line(&p_app->surf,eBANNER_POPUP_SAP_X+i,eBANNER_POPUP_SAP_X+eBANNER_POPUP_SAP_WIDTH-i,
1540                                                 eBANNER_POPUP_SAP_Y+eBANNER_POPUP_SAP_HEIGHT-1-i,eCOLOR_BLACK);
1541        }
1542
1543        bgfx_string_info(p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],(const unsigned long *)p_app->tmp_str,num_chars,&w,&h);
1544        text_box_shadow(&p_app->surf, p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],
1545                                        eBANNER_POPUP_SAP_WIDTH - w - eBANNER_POPUP_SAP_TITLE_MARGIN, eBANNER_POPUP_SAP_Y + (eBANNER_POPUP_SAP_HEIGHT - h)/2, 
1546                                        eBANNER_POPUP_SAP_WIDTH - w, eBANNER_POPUP_SAP_HEIGHT, 
1547                                        p_app->tmp_str, num_chars, eCOLOR_WHITE,eCOLOR_BLACK, eMENU_TEXT_DROPSHADOW ,0);
1548}
1549
1550/*
1551Summary:
1552        Info Banner Draw.
1553*/
1554
1555static void bscreen_calc_box(bapp_t *p_app, btext_id_t *titles, int num_titles,
1556                                                         bapp_lang_t lang, bapp_font_size_t font_size,
1557                                                         int line_space, int margin_h, int margin_v,
1558                                                         int *x, int *y, int *w, int *h)
1559{
1560        int i,str_w,str_h;
1561        unsigned int num_chars;
1562        *x = 0; *y = 0; *w = 0; *h = 0;
1563
1564        for (i = 0; i < num_titles; ++i)
1565        {
1566                num_chars = SCREEN_MAX_STR_WIDTH;
1567                bscreen_get_string(p_app->lang,titles[i], p_app->tmp_str, &num_chars);
1568                bgfx_string_info(p_app->p_font[lang][font_size],
1569                                                 (const unsigned long *)p_app->tmp_str,num_chars,&str_w,&str_h);
1570
1571                if (str_w > *w)
1572                        *w = str_w;
1573               
1574                *h += str_h;
1575                if ((i + 1) < num_titles)
1576                        *h += line_space;
1577        }
1578        *h += margin_v * 2;
1579        *w += margin_h * 2;
1580
1581        *x = (eWIDTH - *w)/2;
1582        if (*x < 0)
1583                *x = eSCREEN_ACTION_SAFE_X;
1584
1585        *y = (eHEIGHT - *h)/2;
1586        if (*y < 0)
1587                *y = eSCREEN_ACTION_SAFE_Y;
1588}
1589
1590/*
1591Summary:
1592        Draw progress bar
1593*/
1594
1595static void bscreen_progress_bar_draw(bapp_t *p_app, int start_x, int start_y,
1596                                                                           int width, int height, int percent)
1597{
1598        int x;
1599        BDBG_ASSERT(p_app);
1600        BDBG_ASSERT(width);
1601        BDBG_ASSERT(height);
1602        for (x = 0; x < width; x += 2 * eBANNER_POPUP_VOL_TICK_WIDTH )
1603        {
1604                bgfx_pixel color = eCOLOR_BLUE_TICK;
1605                if ((x * 100)/width > percent)
1606                        color = eCOLOR_DIM_BLUE;
1607
1608                bgfx_fill_rect( &p_app->surf,
1609                                                start_x + x,
1610                                                start_y,
1611                                                eBANNER_POPUP_VOL_TICK_WIDTH,
1612                                                height,
1613                                                color );
1614        }
1615}
1616/*
1617Summary:
1618        Info Banner Draw.
1619*/
1620#define MAX_PROGRESS_STR_LEN 64
1621static char s_progress_str[MAX_PROGRESS_STR_LEN];
1622static void bscreen_info_banner_draw(void *v_app, void *v_screen)
1623{
1624        bapp_t *p_app = (bapp_t*)v_app;
1625        unsigned int num_chars;
1626        int w,h,y, box_x,box_y,box_width,box_height,num_titles;
1627        btext_id_t title[6];
1628        unsigned short num_vch, num_st;
1629        unsigned char num_freq ;
1630        int pct_offset = 0;
1631        ch_map_get_counts(bapp_cur_ch_map(p_app),&num_vch,&num_st,&num_freq);
1632
1633       
1634        title[0] = eTEXT_ONE_MOMENT;
1635        title[1] = eTEXT_TROUBLE_ERROR_1; 
1636        title[2] = eTEXT_TROUBLE_ERROR_2; 
1637#ifndef CONFIG_CHINESE_FONTS_RAM
1638        num_titles = 3;
1639#else
1640        title[3] = eTEXT_TROUBLE_ERROR_3;
1641        num_titles = 4;
1642#endif
1643
1644        BDBG_WRN(("%s (%d)\n",__FUNCTION__,p_app->state));
1645        switch (p_app->state)
1646        {
1647        case eAPP_STATE_HUNT:
1648           
1649                title[0] = eTEXT_HUNT_TITLE;
1650                title[1] = eTEXT_HUNT_PROGRESS;
1651                num_titles = 2;
1652                break;
1653        case eAPP_STATE_PENDING:
1654                if (p_app->settings.deactivated)
1655                {
1656                        title[0] = eTEXT_PENDING_1;
1657                        title[1] = eTEXT_PENDING_2;
1658                        title[2] = eTEXT_PENDING_3;
1659                        title[3] = eTEXT_PENDING_4;
1660                        num_titles = 4;
1661                }
1662                break;
1663
1664        case eAPP_STATE_NORMAL:
1665                break;
1666        case eAPP_STATE_DOWNLOAD:
1667                title[0] = eTEXT_DL_1;
1668                title[1] = eTEXT_DL_2;
1669                title[2] = eTEXT_DL_3;
1670                title[3] = eTEXT_DL_4;
1671                title[4] = eTEXT_DL_5;
1672                title[5] = eTEXT_DL_6;
1673                num_titles = 6;
1674        default:
1675                break;
1676        }
1677       
1678        bscreen_calc_box(p_app,title, num_titles,p_app->lang,eFONT_SIZE_SMALL,
1679                                                         eMENU_TEXT_SPACING, 14, 14, &box_x, &box_y, &box_width, &box_height);
1680
1681        /* add extra space for title line */
1682        box_height += 8;
1683
1684        /* Add space for progress bar */
1685        if (p_app->state == eAPP_STATE_HUNT)
1686        {
1687                box_height += ((eBANNER_POPUP_VOL_TICK_HEIGHT + eMENU_TEXT_SPACING) * 2);
1688                pct_offset = 14;
1689        }
1690       
1691        /* draw popup background and border*/
1692        bgfx_fill_rect(&p_app->surf,box_x,box_y,
1693                                   box_width,box_height,eCOLOR_BORDER_BLUE);
1694        bgfx_fill_rect(&p_app->surf,box_x + 4,box_y + 4,
1695                                   box_width-8,box_height-8,eCOLOR_BLACK);
1696
1697        box_y += 14;
1698        num_chars = SCREEN_MAX_STR_WIDTH;
1699        bscreen_get_string(p_app->lang,title[0], p_app->tmp_str, &num_chars);
1700        bgfx_string_info(p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],
1701                                         (const unsigned long *)p_app->tmp_str,num_chars,&w,&h);
1702        text_box(&p_app->surf, p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],
1703                                        box_x + (box_width - w)/2, box_y, box_width, h,
1704                                        p_app->tmp_str, num_chars, eCOLOR_WHITE ,eMENU_TEXT_SPACING);
1705
1706        y = box_y  + h + eMENU_TEXT_SPACING;
1707
1708        if (p_app->state != eAPP_STATE_DOWNLOAD)
1709                y += 8;
1710
1711        /* draw popup text */
1712        num_chars = SCREEN_MAX_STR_WIDTH;
1713        bscreen_get_string(p_app->lang,title[1], p_app->tmp_str, &num_chars);
1714        bgfx_string_info(p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],
1715                                         (const unsigned long *)p_app->tmp_str,num_chars,&w,&h);
1716        text_box(&p_app->surf, p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],
1717                                        box_x - pct_offset + (box_width - w)/2, y,  box_width, h,
1718                                        p_app->tmp_str, num_chars, eCOLOR_WHITE ,eMENU_TEXT_SPACING);
1719
1720        /* In hunt mode draw a progress bar */
1721        if (p_app->state == eAPP_STATE_HUNT)
1722        {
1723                int progress = chm_get_hunt_progress(&p_app->chm);
1724                int prog_width = 50 * eBANNER_POPUP_VOL_TICK_WIDTH;
1725                int prog_x = box_x + (box_width - prog_width)/2;
1726                int prev_w = w;
1727                num_chars = snprintf((char*)s_progress_str,MAX_PROGRESS_STR_LEN,"%d",progress);
1728                num_chars = bapp_util_strlen(s_progress_str);
1729                s_progress_str[num_chars] = '%';
1730                num_chars += 1;
1731                s_progress_str[num_chars] = 0;
1732                num_chars = c_to_uni_str((unsigned char*)s_progress_str,p_app->tmp_str,num_chars);
1733                bgfx_string_info(p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],
1734                                                 (const unsigned long *)p_app->tmp_str,num_chars,&w,&h);
1735                text_box(&p_app->surf, p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],
1736                                                box_x - pct_offset + (box_width - prev_w)/2 + prev_w, y,  2*w, h,
1737                                                p_app->tmp_str, num_chars, eCOLOR_BLUE_TICK ,eMENU_TEXT_SPACING);               
1738                y += h + eMENU_TEXT_SPACING;
1739                bscreen_progress_bar_draw(p_app, prog_x, y,prog_width, eBANNER_POPUP_VOL_TICK_HEIGHT, progress);
1740                return;
1741        }
1742       
1743        y += h + eMENU_TEXT_SPACING;
1744
1745        num_chars = SCREEN_MAX_STR_WIDTH;
1746        bscreen_get_string(p_app->lang,title[2], p_app->tmp_str, &num_chars);
1747        bgfx_string_info(p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],
1748                                         (const unsigned long *)p_app->tmp_str,num_chars,&w,&h);
1749        text_box(&p_app->surf, p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],
1750                                        box_x + (box_width - w)/2, y, box_width, h,
1751                                        p_app->tmp_str, num_chars, eCOLOR_WHITE ,eMENU_TEXT_SPACING);
1752
1753        if (num_titles < 4)
1754                return;
1755       
1756        if (p_app->state == eAPP_STATE_DOWNLOAD)
1757                y += 8;
1758
1759        y += h + eMENU_TEXT_SPACING;
1760        num_chars = SCREEN_MAX_STR_WIDTH;
1761        bscreen_get_string(p_app->lang,title[3], p_app->tmp_str, &num_chars);
1762        bgfx_string_info(p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],
1763                                         (const unsigned long *)p_app->tmp_str,num_chars,&w,&h);
1764        text_box(&p_app->surf, p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],
1765                                        box_x + (box_width - w)/2, y, box_width, h,
1766                                        p_app->tmp_str, num_chars, eCOLOR_WHITE ,eMENU_TEXT_SPACING);
1767
1768        if (num_titles < 5)
1769                return;
1770
1771        y += h + eMENU_TEXT_SPACING;
1772        num_chars = SCREEN_MAX_STR_WIDTH;
1773        bscreen_get_string(p_app->lang,title[4], p_app->tmp_str, &num_chars);
1774        bgfx_string_info(p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],
1775                                         (const unsigned long *)p_app->tmp_str,num_chars,&w,&h);
1776        text_box(&p_app->surf, p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],
1777                                        box_x + (box_width - w)/2, y, box_width, h,
1778                                        p_app->tmp_str, num_chars, eCOLOR_WHITE ,eMENU_TEXT_SPACING);
1779       
1780        if (num_titles < 6)
1781                return;
1782
1783        y += h + eMENU_TEXT_SPACING;
1784        num_chars = SCREEN_MAX_STR_WIDTH;
1785        bscreen_get_string(p_app->lang,title[5], p_app->tmp_str, &num_chars);
1786        bgfx_string_info(p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],
1787                                         (const unsigned long *)p_app->tmp_str,num_chars,&w,&h);
1788        text_box(&p_app->surf, p_app->p_font[p_app->lang][eFONT_SIZE_SMALL],
1789                                        box_x + (box_width - w)/2, y, box_width, h,
1790                                        p_app->tmp_str, num_chars, eCOLOR_WHITE ,eMENU_TEXT_SPACING);
1791}
1792/*
1793Summary:
1794        Banner screen drawing function
1795Description:
1796        Banner screen drawing function.
1797        .
1798*/
1799void bscreen_banner_draw(void *v_app, void *v_screen)
1800{
1801        bscreen_t *p_screen = (bscreen_t*)v_screen;
1802        int i;
1803        banner_state_t *p_bs = (banner_state_t*)p_screen->local_state;
1804
1805        BDBG_ASSERT(p_bs);
1806
1807        BDBG_MSG(("%s:%d, mode = %d\n",__FUNCTION__,__LINE__,p_bs->mode));
1808        i = 0;
1809
1810        banner_null_draw(v_app,v_screen);
1811       
1812        switch (p_bs->mode)
1813        {
1814        default:
1815        case eLS_BANNER_OFF:
1816                break;
1817        case eLS_BANNER_SMALL:
1818                bscreen_ch_banner_draw(v_app,v_screen);
1819                break;
1820
1821        case eLS_BANNER_SAP:
1822                bscreen_sap_banner_draw(v_app,v_screen);
1823                break;
1824
1825        case eLS_BANNER_VOLUME:
1826                bscreen_vol_banner_draw(v_app,v_screen);
1827                break;
1828
1829        case eLS_BANNER_INFO:
1830                bscreen_info_banner_draw(v_app,v_screen);
1831                break;
1832
1833        case eLS_BANNER_EAS_TEXT_SCROLLING:
1834                bscreen_eas_text_scrolling_info_draw(v_app,v_screen);
1835                break;
1836        }
1837}
1838
1839
1840/*
1841Summary:
1842        Screensaver screen drawing function
1843Description:
1844        Screensaver screen drawing function. 
1845*/
1846void bscreen_screensaver_draw(void *v_app, void *v_screen)
1847{
1848#ifndef CONFIG_SCREENSAVER
1849        BDBG_ERR(("NO SCREENSAVER.\n"));
1850#else
1851        bapp_t *p_app = (bapp_t*)v_app;
1852        if (g_p_dsp->ui_comp.logo)
1853        {
1854                bin_read_t br;
1855                bcm_raw_8_t *p_header = (bcm_raw_8_t*)g_p_dsp->ui_comp.logo;
1856                br.cnt = 0;
1857                br.data = (void*)g_p_dsp->ui_comp.logo;
1858                br.size = g_p_dsp->ui_comp.logo_size;
1859
1860                screen_null_draw(v_app, v_screen);
1861                bgfx_render_file(&p_app->surf, 
1862                                                 eSCREEN_ACTION_SAFE_X + RAND_INT(eSCREEN_ACTION_SAFE_WIDTH-p_header->width), 
1863                                                 eSCREEN_ACTION_SAFE_Y + RAND_INT(eSCREEN_ACTION_SAFE_HEIGHT-p_header->height), 
1864                                                 &br, 0);
1865        } else
1866        {
1867                unsigned int num_chars;
1868                int w,h;
1869                num_chars = SCREEN_MAX_STR_WIDTH;
1870                bgfx_fill_rect(&p_app->surf,0,0,eWIDTH,eHEIGHT,eCOLOR_BLACK);
1871                bscreen_get_string(p_app->lang, eTEXT_VENDOR, p_app->tmp_str, &num_chars); 
1872                bgfx_string_info(p_app->p_font[p_app->lang][eFONT_SIZE_MED],
1873                                                 (const unsigned long *)p_app->tmp_str,num_chars,&w,&h);
1874                w += 16;
1875
1876                text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_MED],
1877                                 eSCREEN_ACTION_SAFE_X + RAND_INT(eSCREEN_ACTION_SAFE_WIDTH - w),
1878                                 eSCREEN_ACTION_SAFE_Y + RAND_INT(eSCREEN_ACTION_SAFE_HEIGHT - h),
1879                                 w, h, p_app->tmp_str, num_chars, eCOLOR_WHITE,0);
1880        }
1881#endif
1882}
1883
1884/*
1885Summary:
1886        Power off screen drawing function
1887Description:
1888        Power off screen drawing function. 
1889*/
1890void bscreen_power_off_draw(void *v_app, void *v_screen)
1891{
1892        screen_null_draw(v_app, v_screen);
1893}
1894
Note: See TracBrowser for help on using the repository browser.