/*************************************************************************** * Copyright (c) 2003-2006, Broadcom Corporation * All Rights Reserved * Confidential Property of Broadcom Corporation * * THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE * AGREEMENT BETWEEN THE USER AND BROADCOM. YOU HAVE NO RIGHT TO USE OR * EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT. * * $brcm_Workfile: $ * $brcm_Revision: $ * $brcm_Date: $ * * Module Description: * * Revision History: * * $brcm_Log: $ * ***************************************************************************/ #include "bapp.h" #include "bapp_util.h" #include "bapp_palette.h" #include "bgfx.h" #include "chan_mgr.h" #include "bscreen_status_str.c" #include "si_nit_mms.h" BDBG_MODULE(bscreen_status); /* Register software module with debug interface */ static float power_level = 0.0; int get_fraction(float val, bool *minus) { int i; *minus = 0; if (val >= 0.0) { i = (val - (int)val) * 100; } else if (val >= -1.0) { i = 100 - ((1.0 - (int)val) + val) * 100; *minus = 1; } else { i = 100 - ((1.0 - (int)val) + val) * 100; } return i; } #define MAX_TSTR_LEN 128 #define eINFO_X (eSCREEN_ACTION_SAFE_X) #define eINFO_STATUS_X (eSCREEN_ACTION_SAFE_X + 20) #define eINFO_STATUS_Y (eSCREEN_ACTION_SAFE_Y) #define eINFO_COL_WIDTH (eSCREEN_ACTION_SAFE_WIDTH/2) #define eINFO_COL_LABEL_WIDTH (eINFO_COL_WIDTH) #define eINFO_ROW_HEIGHT (24) #define eINFO_HELP_Y ((eSCREEN_ACTION_SAFE_HEIGHT + eSCREEN_ACTION_SAFE_Y - eINFO_ROW_HEIGHT)) #define eCH_MAP_START_X (eSCREEN_ACTION_SAFE_X) #define eCH_MAP_START_Y (eSCREEN_ACTION_SAFE_Y) #define eCH_MAP_HDR_Y ((eSCREEN_ACTION_SAFE_Y + eINFO_ROW_HEIGHT)) #define eCH_MAP_ROW_Y (eCH_MAP_HDR_Y) #define eCH_MAP_COL_WIDTH ((eSCREEN_ACTION_SAFE_WIDTH/6)) #define eCH_MAP_ROW_HEIGHT (24) #define eCH_MAP_NUM_ROW ((((eSCREEN_ACTION_SAFE_HEIGHT - 3*eINFO_ROW_HEIGHT)/eCH_MAP_ROW_HEIGHT) - 1)) #define eDIAG_ROW_HEIGHT (24) #define eDIAG_START_X (eSCREEN_ACTION_SAFE_X) #define eDIAG_MENU_X ((eDIAG_START_X + 20)) #define eDIAG_START_Y (eSCREEN_ACTION_SAFE_Y) #define eDIAG_HELP_Y ((eSCREEN_ACTION_SAFE_Y + eSCREEN_ACTION_SAFE_HEIGHT - eDIAG_ROW_HEIGHT)) #define eDIAG_COL_WIDTH ((eSCREEN_ACTION_SAFE_WIDTH)) typedef enum sys_info_state_t { eSYS_CODE_0, eSYS_CODE_1, eSYS_CODE_2, eSYS_CODE_MAX, }sys_info_state_t; typedef struct sys_info_t { sys_info_state_t state; unsigned int code; }sys_info_t; static sys_info_t s_sys_info = { eSYS_CODE_0, 0}; static char ts_str[MAX_TSTR_LEN + 1]; typedef void (*get_str_t)(bapp_t *p_app, bscreen_t *p_screen, int text_id, /* Text id */ unsigned int *p_uni_str, /* Buffer to put UNI string into */ unsigned int *str_len, /* On input the max length in words on output the actual size in characters. */ void *data /* User data */ ); static char* get_qam_mode_str(int mode) { switch (mode) { default: case MOD_QAM16: break; case MOD_QAM64: return "QAM 64"; case MOD_QAM256: return "QAM 256"; } return "?"; } /* Summary: Handle special debug commands for test purposes or diagnostics. */ static void bscreen_sys_info_handler(bapp_t *p_app,bscreen_t *p_screen, bIR_codes_t code) { static unsigned int s_timeout = 0; static chm_event_t evt; BDBG_WRN(("%s 0x%08x %d\n",__FUNCTION__,s_sys_info.code,s_sys_info.state)); if (s_timeout < bapp_task_getticks()) { s_sys_info.code = 0; s_sys_info.state = 0; } s_sys_info.code |= (code & 0xFF) << (8 * s_sys_info.state); s_sys_info.state++; BDBG_WRN(("%s 0x%08x %d\n",__FUNCTION__,s_sys_info.code,s_sys_info.state)); s_timeout = bapp_task_getticks() + MS_TO_TICKS(BANNER_10_KEY_TIMEOUT); if (s_sys_info.state == eSYS_CODE_MAX) { switch (s_sys_info.code) { case 0x00030303: /* JPF TODO */ break; case 0x00010203: bapp_reset_settings(p_app); /* JPF TODO */ break; case 0x00040506: bapp_reset_settings(p_app); /* JPF TODO */ break; case 0x00070809: bapp_reset_settings(p_app); p_app->settings.psi_scan = 1; /* JPF TODO */ break; case 0x00010101: evt.id = 1; evt.type = eCHM_EVT_ACTIVATION; bapp_task_post_event(p_app->msg_queue,(bapp_task_event_t)&evt); break; case 0x00020101: evt.id = 0; evt.type = eCHM_EVT_ACTIVATION; bapp_task_post_event(p_app->msg_queue,(bapp_task_event_t)&evt); break; case 0x00010102: evt.id = 0x1F; evt.type = eCHM_EVT_LOCATION; bapp_task_post_event(p_app->msg_queue,(bapp_task_event_t)&evt); break; case 0x00020102: evt.id = 0x2E; evt.type = eCHM_EVT_LOCATION; bapp_task_post_event(p_app->msg_queue,(bapp_task_event_t)&evt); break; case 0x00010103: case 0x00020103: case 0x00030103: case 0x00040103: evt.id = (s_sys_info.code >> 16) & 0xFF; evt.type = eCHM_EVT_RESET; bapp_task_post_event(p_app->msg_queue,(bapp_task_event_t)&evt); break; case 0x00010104: evt.id = 0; evt.type = eCHM_EVT_PHONENUMBER; strcpy(evt.data,"9228188"); bapp_task_post_event(p_app->msg_queue,(bapp_task_event_t)&evt); break; #ifdef CONFIG_DYNAMIC_RFM_MODE case 0x00010006: /* 601 */ chm_toggle_comp_mode(&p_app->chm, true); break; #endif case 0x00060606: evt.id = 0; evt.type = eCHM_EVT_DOWNLOAD; bapp_task_post_event(p_app->msg_queue,(bapp_task_event_t)&evt); break; default: break; } s_sys_info.state = eSYS_CODE_0; s_sys_info.code = 0; } } /* Summary: Return the current DTA mode string. */ static void bscreen_get_dta_mode_str(bapp_t *p_app, char *p_str /* On input the max length in words on output the actual size in characters. */ ) { switch (p_app->state) { case eAPP_STATE_HUNT: strcpy(p_str,"Hunting"); break; case eAPP_STATE_PENDING: strcpy(p_str,"Pending"); break; case eAPP_STATE_NORMAL: strcpy(p_str,"Normal"); break; case eAPP_STATE_DOWNLOAD: strcpy(p_str,"Downloading"); break; case eAPP_STATE_FACTORY: strcpy(p_str,"Factory"); break; case eAPP_STATE_DEFAULT: case eAPP_STATE_DONE: strcpy(p_str,"Default"); break; } if (p_app->settings.av_mute) { strcpy(&(p_str[bapp_util_strlen(p_str)]),"(Standby)"); } } /* Summary: Return status strings. */ static void bscreen_general_info_str(bapp_t *p_app, bscreen_t *p_screen, int text_id, /* Text id */ unsigned int *p_uni_str, /* Buffer to put UNI string into */ unsigned int *str_len, /* On input the max length in words on output the actual size in characters. */ void *data /* User data */ ) { vch_t vch; st_t st; freq_t freq; bool valid; unsigned char hw_address[5]; unsigned char mac_address[6]; valid = ch_map_get_current(bapp_cur_ch_map(p_app),&vch,&st,&freq); get_hw_address(hw_address); get_mac_address(mac_address); *str_len = 0; switch (text_id) { case 0: strcpy(ts_str,DEF_VENDOR_NAME); *str_len = bapp_util_strlen(ts_str); break; case 1: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"0x%08X",DEF_VENDOR_ID); break; case 2: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"0x%08X",DEF_HARDWARE_ID); break; case 3: if (p_app->settings.CA_System_ID == 0x4749) *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%s",get_unit_address_str()); else *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%02X:%02X:%02X:%02X:%02X",hw_address[4], hw_address[3],hw_address[2],hw_address[1],hw_address[0]); printf("UNIT ADDR: %s\n",get_unit_address_str()); break; case 4: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%02X:%02X:%02X:%02X:%02X:%02X",mac_address[5],mac_address[4], mac_address[3],mac_address[2],mac_address[1],mac_address[0]); break; } if (*str_len) { *str_len = c_to_uni_str((unsigned char*)ts_str,p_uni_str,*str_len); } } /* Summary: Return status strings. */ static void bscreen_msg_status_str(bapp_t *p_app, bscreen_t *p_screen, int text_id, /* Text id */ unsigned int *p_uni_str, /* Buffer to put UNI string into */ unsigned int *str_len, /* On input the max length in words on output the actual size in characters. */ void *data /* User data */ ) { *str_len = 0; switch (text_id) { case 0: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"Count"); break; case 1: *str_len = snprintf(ts_str,MAX_TSTR_LEN," %d",p_app->chm.cds_cnt); break; case 2: *str_len = snprintf(ts_str,MAX_TSTR_LEN," %d",p_app->chm.mms_cnt); break; case 3: *str_len = snprintf(ts_str,MAX_TSTR_LEN," %d",p_app->chm.sns_cnt); break; case 4: *str_len = snprintf(ts_str,MAX_TSTR_LEN," %d",p_app->chm.dcm_cnt); break; case 5: *str_len = snprintf(ts_str,MAX_TSTR_LEN," %d",p_app->chm.vcm_cnt); break; case 6: *str_len = snprintf(ts_str,MAX_TSTR_LEN," %d",p_app->chm.stt_cnt); break; case 7: *str_len = snprintf(ts_str,MAX_TSTR_LEN," %d",p_app->chm.ops_cnt); break; case 8: *str_len = snprintf(ts_str,MAX_TSTR_LEN," %d",p_app->chm.cfg_cnt); break; case 9: *str_len = snprintf(ts_str,MAX_TSTR_LEN," %d",p_app->chm.eas_cnt); break; case 10: *str_len = snprintf(ts_str,MAX_TSTR_LEN," %d",p_app->chm.em_cnt); break; case 11: *str_len = snprintf(ts_str,MAX_TSTR_LEN," %d/%d",p_app->chm.cat_cnt,p_app->chm.system_id_errors); break; default: *str_len = 0; break; } if (*str_len) { *str_len = c_to_uni_str((unsigned char*)ts_str,p_uni_str,*str_len); } } /* Summary: Return status strings. */ static void bscreen_code_objects_str(bapp_t *p_app, bscreen_t *p_screen, int text_id, /* Text id */ unsigned int *p_uni_str, /* Buffer to put UNI string into */ unsigned int *str_len, /* On input the max length in words on output the actual size in characters. */ void *data /* User data */ ) { *str_len = 0; switch (text_id) { case 0: default: *str_len = 0; break; } if (*str_len) { *str_len = c_to_uni_str((unsigned char*)ts_str,p_uni_str,*str_len); } } /* Summary: Return status strings. */ static void bscreen_code_download_str(bapp_t *p_app, bscreen_t *p_screen, int text_id, /* Text id */ unsigned int *p_uni_str, /* Buffer to put UNI string into */ unsigned int *str_len, /* On input the max length in words on output the actual size in characters. */ void *data /* User data */ ) { *str_len = 0; switch (text_id) { case 0: default: *str_len = 0; break; } if (*str_len) { *str_len = c_to_uni_str((unsigned char*)ts_str,p_uni_str,*str_len); } } /* Summary: Return status strings. */ static void bscreen_tuner_status_str(bapp_t *p_app, bscreen_t *p_screen, int text_id, /* Text id */ unsigned int *p_uni_str, /* Buffer to put UNI string into */ unsigned int *str_len, /* On input the max length in words on output the actual size in characters. */ void *data /* User data */ ) { unsigned int freq_mhz; unsigned int frac_freq_mhz; vch_t vch; st_t st; freq_t freq; bool valid, minus; int fraction; *str_len = 0; power_level = p_app->power; fraction = get_fraction(power_level, &minus); valid = ch_map_get_current(bapp_cur_ch_map(p_app),&vch,&st,&freq); freq_mhz = freq.freq_khz/1000; frac_freq_mhz = freq.freq_khz - (freq_mhz * 1000); switch (text_id) { case 0: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%d.%d",freq_mhz,frac_freq_mhz); break; case 1: if (p_app->snr) *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%d dBmV", (int)power_level); else *str_len = snprintf(ts_str,MAX_TSTR_LEN,"Not locked"); break; case 2: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%d",p_app->snr); break; case 3: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%s",(p_app->settings.has_CAT ? "Yes" : "No")); break; case 4: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"0x%04X",p_app->settings.CA_System_ID); break; case 5: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"0x%04X",p_app->settings.EMM_PID); break; case 6: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"0x%04X",p_app->settings.EMM_Provider_ID); break; case 7: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%s",(p_app->has_PAT ? "Yes" : "No")); break; case 8: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"0x%04X",p_app->settings.network_PID); break; default: *str_len = 0; break; } if (*str_len) { *str_len = c_to_uni_str((unsigned char*)ts_str,p_uni_str,*str_len); } } /* Summary: Return status strings. */ static void bscreen_ch_status_str(bapp_t *p_app, bscreen_t *p_screen, int text_id, /* Text id */ unsigned int *p_uni_str, /* Buffer to put UNI string into */ unsigned int *str_len, /* On input the max length in words on output the actual size in characters. */ void *data /* User data */ ) { unsigned int freq_mhz; unsigned int frac_freq_mhz; vch_t vch; st_t st; freq_t freq; mms_t mms; bool valid; *str_len = 0; valid = ch_map_get_current(bapp_cur_ch_map(p_app),&vch,&st,&freq); freq_mhz = freq.freq_khz/1000; frac_freq_mhz = freq.freq_khz - (freq_mhz * 1000); if ((!valid) && (text_id < 8)) return; ch_map_get_mms(bapp_cur_ch_map(p_app),vch.mms_idx,&mms); switch (text_id) { case 0: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%d",vch.ch_num); break; case 1: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%d.%d",freq_mhz,frac_freq_mhz); break; case 2: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%s",get_qam_mode_str(mms.modulation)); break; case 3: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%d",vch.program_num); break; case 4: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"0x%04X",vch.video_pid); break; case 5: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"0x%04X%s",vch.audio_pid[0],(vch.cur_audio == 0) ? "*" : " "); break; case 6: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"0x%04X%s",vch.audio_pid[1],(vch.cur_audio == 1) ? "*" : " "); break; case 7: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"0x%04X%s",vch.audio_pid[2],(vch.cur_audio == 2) ? "*" : " "); break; case 8: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%s",(p_app->audio_mute ? "Yes" : "No")); break; default: *str_len = 0; break; } if (*str_len) { *str_len = c_to_uni_str((unsigned char*)ts_str,p_uni_str,*str_len); } } /* Summary: Return status strings. */ static const char *s_mon_str[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", }; static void bscreen_dta_status_str(bapp_t *p_app, bscreen_t *p_screen, int text_id, /* Text id */ unsigned int *p_uni_str, /* Buffer to put UNI string into */ unsigned int *str_len, /* On input the max length in words on output the actual size in characters. */ void *data /* User data */ ) { unsigned int turn_on_freq_mhz; unsigned int frac_turn_on_freq_mhz; int time_offset = p_app->settings.utc_offset; struct tm utc_time; *str_len = 0; turn_on_freq_mhz = p_app->settings.turn_on_freq_khz/1000; frac_turn_on_freq_mhz = p_app->settings.turn_on_freq_khz - (turn_on_freq_mhz * 1000); if ((p_app->system_time > p_app->settings.dst_entry) && (p_app->system_time < p_app->settings.dst_exit)) { /* TODO Check p_app->settings.dst_delta per spec */ time_offset += 3600; } utctime(p_app->system_time + time_offset,&utc_time); switch (text_id) { case 0: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%s",p_app->settings.activated ? "Yes" : "No"); break; case 1: *str_len = MAX_TSTR_LEN; bscreen_get_dta_mode_str(p_app,ts_str); *str_len = bapp_util_strlen(ts_str); break; case 2: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%d.%d",turn_on_freq_mhz,frac_turn_on_freq_mhz); break; case 3: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%d",p_app->settings.timeout); break; case 4: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%d",p_app->settings.timeout_cnt); break; case 5: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%d",p_app->settings.location_errors); break; case 6: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"0x%08X",p_app->settings.location); break; case 7: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"0x%08X",p_app->location); break; case 8: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%2d %s %4d %2d:%2d:%2d", utc_time.tm_mday,s_mon_str[utc_time.tm_mon],utc_time.tm_year + 1980, utc_time.tm_hour,utc_time.tm_min,utc_time.tm_sec); break; case 9: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%d",(int)p_app->settings.utc_offset/3600); break; case 10: utctime(p_app->settings.dst_entry,&utc_time); *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%2d %s %4d %2d:%2d:%2d", utc_time.tm_mday,s_mon_str[utc_time.tm_mon],utc_time.tm_year + 1980, utc_time.tm_hour,utc_time.tm_min,utc_time.tm_sec); break; case 11: utctime(p_app->settings.dst_exit,&utc_time); *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%2d %s %4d %2d:%2d:%2d", utc_time.tm_mday,s_mon_str[utc_time.tm_mon],utc_time.tm_year + 1980, utc_time.tm_hour,utc_time.tm_min,utc_time.tm_sec); break; case 12: utctime(p_app->settings.addressable_time + time_offset,&utc_time); *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%2d %s %4d %2d:%2d:%2d", utc_time.tm_mday,s_mon_str[utc_time.tm_mon],utc_time.tm_year + 1980, utc_time.tm_hour,utc_time.tm_min,utc_time.tm_sec); break; default: *str_len = 0; break; } if (*str_len) { *str_len = c_to_uni_str((unsigned char*)ts_str,p_uni_str,*str_len); } } /* Summary: Use the this function to get a UNI string. */ #if defined(RAM_BUILD) extern unsigned int g_acquire_ticks; extern unsigned int g_tune_ticks; #else unsigned int g_acquire_ticks = 0; unsigned int g_tune_ticks = 0; #endif static void bscreen_decoder_status_str(bapp_t *p_app, bscreen_t *p_screen, int text_id, /* Text id */ unsigned int *p_uni_str, /* Buffer to put UNI string into */ unsigned int *str_len, /* On input the max length in words on output the actual size in characters. */ void *data) { bool valid; vch_t vch; st_t st; freq_t freq; valid = ch_map_get_current(bapp_cur_ch_map(p_app),&vch,&st,&freq); switch (text_id) { #if 0 case 0: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"0x%04X, 0x%04X, 0x%04X",status.vPID,status.aPID,status.pcrPID); break; case 1: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"0x%08X/0x%08X",status.video_stc,status.video_pts); break; case 2: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"0x%08X/0x%08X",status.audio_stc,status.audio_pts); break; case 3: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%d",(int)status.audio_pts - (int)status.video_pts); break; case 4: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%d,%d,%d",(int)status.audio_stc-(int)status.audio_pts); break; case 5: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%d,%d,%d",(int)status.video_stc-(int)status.video_pts); break; case 6: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%d/%d,%d/%d",status.audio_fifo_depth,status.audio_fifo_size,status.video_fifo_depth,status.video_fifo_size); break; case 7: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%d:%d(%s,%d)",status.source_width,status.source_height,(status.bStreamProgressive ? "P" : "I"),status.video_aspect_ratio); break; case 8: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%d",p_app->tune_ms); break; case 9: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%d,%d",TICKS_TO_MS(g_tune_ticks),TICKS_TO_MS(g_acquire_ticks)); break; case 10: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%d/%d/%d",p_app->si_ms,status.seq_header_ms,status.first_pts_ms); break; case 11: *str_len = snprintf(ts_str,MAX_TSTR_LEN,"%s%s, cm=%d", aud_config.tone != 0xffffffff ? "tone, " : "", aud_config.mono ? "mono" : "stereo", aud_config.comp_mode); break; #endif default: *str_len = 0; break; } if (*str_len) { *str_len = c_to_uni_str((unsigned char*)ts_str,p_uni_str,*str_len); } } /* Summary: Status screen drawing function. */ static void bscreen_diag_list_draw(bapp_t *p_app, bscreen_t *p_screen, const char *p_title_str, const char *p_label_str[], get_str_t get_str_fcn ) { uint16_t x,y,y_off; unsigned int num_chars = 0; int i; x = eINFO_STATUS_X; y = eINFO_STATUS_Y; i = 0; y += eINFO_ROW_HEIGHT + 6; while (*(p_label_str[i]) != '\0') { y_off = y + (i * eINFO_ROW_HEIGHT); if ((y_off + eINFO_ROW_HEIGHT) >= eHEIGHT) { BDBG_WRN(("%s too many rows %d, y = %d\n",__FUNCTION__,i,y_off)); break; } bgfx_fill_rect(&p_app->surf,x,y_off,eWIDTH - x,eINFO_ROW_HEIGHT,eCOLOR_BLACK); num_chars = bapp_util_strlen((char*)p_label_str[i]); num_chars = c_to_uni_str((unsigned char*)p_label_str[i],p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], x, y_off, eINFO_COL_LABEL_WIDTH, eINFO_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); num_chars = SCREEN_MAX_STR_WIDTH; get_str_fcn(p_app,p_screen,i,p_app->tmp_str, &num_chars,NULL); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], x + eINFO_COL_LABEL_WIDTH, y_off, eWIDTH - x - eINFO_COL_WIDTH, eINFO_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); i++; } } /* Summary: Status screen drawing function. */ static void bscreen_diag_draw(bapp_t *p_app, bscreen_t *p_screen, const char *p_title_str, const char *p_help_str, const char *p_label_str[], get_str_t get_str_fcn ) { uint16_t x,y; unsigned int num_chars = 0; int i,page; page = p_screen->local_state; x = eINFO_X; y = eINFO_STATUS_Y; i = 0; bgfx_fill_rect(&p_app->surf,x,y,eWIDTH - x,eINFO_ROW_HEIGHT,eCOLOR_BLACK); num_chars = bapp_util_strlen(p_title_str); num_chars = c_to_uni_str((unsigned char*)p_title_str,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_MED], x, y, eSCREEN_ACTION_SAFE_WIDTH, eINFO_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); bscreen_diag_list_draw(p_app,p_screen,p_title_str,p_label_str,get_str_fcn); num_chars = bapp_util_strlen(p_help_str); num_chars = c_to_uni_str((unsigned char*)p_help_str,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], x, eINFO_HELP_Y, eSCREEN_ACTION_SAFE_WIDTH, eINFO_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); } int bscreen_diag_event(bapp_t *p_app, bscreen_t *p_screen, bscreen_event_t *p_event, void (*draw_fcn)(void *v_app, void *v_screen), int refresh) { int result = 0; static int cnt = 0; switch (p_event->type) { case eS_EVENT_SETUP: p_screen->local_state = 0; bgfx_fill_rect(&p_app->surf,0,0,eWIDTH,eHEIGHT,eCOLOR_BLACK); bapp_enable_cc(p_app, 0); break; case eS_EVENT_IDLE: if (refresh <= 0) break; if (cnt++ == 10) { cnt = 0; bgfx_fill_rect(&p_app->surf,0,0,eWIDTH,eHEIGHT,eCOLOR_BLACK); draw_fcn(p_app,p_screen); result = 1; } break; case eS_EVENT_IR: { BDBG_WRN(("%s:%d 0x%02x(%s)\n",__FUNCTION__,__LINE__,p_event->id,(p_event->id & 0x40000000) ? "up" : "down")); switch (p_event->id) { case eIR_INFO: bapp_set_current_screen(p_app, eSCREEN_BANNER, eSCREEN_MAX); result = 1; break; case eIR_PRECH: case eIR_DOT: bapp_set_current_screen(p_app, eSCREEN_DIAG_MENU, eSCREEN_MAX); result = 1; break; default: break; } break; } break; default: result = bscreen_default_event(p_app,p_screen,p_event); break; } return result; /* always handle event */ } /* Summary: Status screen drawing function. */ void bscreen_sys_info_draw(void *v_app, void *v_screen) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; bscreen_diag_draw(p_app,p_screen,s_main_menu[eMM_IDX_GENERAL_INFO], s_diag_help_simple,s_general_info_str, bscreen_general_info_str); } /* Summary: Status screen event handling function. */ int bscreen_sys_info_event(void *v_app, void *v_screen, bscreen_event_t *p_event) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; return bscreen_diag_event(p_app,p_screen,p_event,bscreen_sys_info_draw,-1); } /* Summary: Status screen drawing function. */ void bscreen_dta_status_draw(void *v_app, void *v_screen) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; bscreen_diag_draw(p_app,p_screen,s_main_menu[eMM_IDX_DTA_STATUS], s_diag_help_simple,s_dta_status_str, bscreen_dta_status_str); } /* Summary: Status screen event handling function. */ int bscreen_dta_status_event(void *v_app, void *v_screen, bscreen_event_t *p_event) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; return bscreen_diag_event(p_app,p_screen,p_event,bscreen_dta_status_draw,1); } /* Summary: Status screen drawing function. */ void bscreen_tuner_status_draw(void *v_app, void *v_screen) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; bscreen_diag_draw(p_app,p_screen,s_main_menu[eMM_IDX_TUNER_STATUS], s_diag_help_default,s_tuner_status_str, bscreen_tuner_status_str); } /* Summary: Status screen event handling function. */ int bscreen_tuner_status_event(void *v_app, void *v_screen, bscreen_event_t *p_event) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; return bscreen_diag_event(p_app,p_screen,p_event,bscreen_tuner_status_draw,1); } /* Summary: Status screen drawing function. */ void bscreen_decoder_status_draw(void *v_app, void *v_screen) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; bscreen_diag_draw(p_app,p_screen,s_main_menu[eMM_IDX_DECODER_STATUS], s_diag_help_simple,s_decoder_status_str, bscreen_decoder_status_str); } /* Summary: Status screen event handling function. */ int bscreen_decoder_status_event(void *v_app, void *v_screen, bscreen_event_t *p_event) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; return bscreen_diag_event(p_app,p_screen,p_event,bscreen_decoder_status_draw,1); } /* Summary: Status screen drawing function. */ void bscreen_ch_status_draw(void *v_app, void *v_screen) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; bscreen_diag_draw(p_app,p_screen,s_main_menu[eMM_IDX_CH_STATUS], s_diag_help_in_use,s_ch_status_str, bscreen_ch_status_str); } /* Summary: Status screen event handling function. */ int bscreen_ch_status_event(void *v_app, void *v_screen, bscreen_event_t *p_event) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; return bscreen_diag_event(p_app,p_screen,p_event,bscreen_ch_status_draw,1); } int bscreen_diag_menu_event(void *v_app, void *v_screen, bscreen_event_t *p_event) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; int result = 0; switch (p_event->type) { case eS_EVENT_SETUP: /* Don't reset so we return with same item selectd p_screen->local_state = 0; */ bgfx_fill_rect(&p_app->surf,0,0,eWIDTH,eHEIGHT,eCOLOR_BLACK); s_sys_info.state = eSYS_CODE_0; bapp_enable_cc(p_app, 0); break; case eS_EVENT_IDLE: { /* Do anything that requires periodic action here */ } break; case eS_EVENT_IR: { BDBG_WRN(("%s:%d 0x%02x(%s)\n",__FUNCTION__,__LINE__,p_event->id,(p_event->id & 0x40000000) ? "up" : "down")); switch (p_event->id) { case eIR_CH_UP: case eIR_UP: p_screen->local_state -= 1; if ((int)p_screen->local_state <= 0) p_screen->local_state = 0; result = 1; break; case eIR_CH_DOWN: case eIR_DOWN: p_screen->local_state += 1; if (p_screen->local_state >= eMM_IDX_NUM) p_screen->local_state = eMM_IDX_NUM - 1; result = 1; break; case eIR_SELECT: switch (p_screen->local_state) { case 0: bapp_set_current_screen(p_app, eSCREEN_SYS_INFO, eSCREEN_MAX); result = 1; break; case 1: bapp_set_current_screen(p_app, eSCREEN_DTA_STATUS, eSCREEN_MAX); result = 1; break; case 2: bapp_set_current_screen(p_app, eSCREEN_MSO_INFO, eSCREEN_MAX); result = 1; break; case 3: bapp_set_current_screen(p_app, eSCREEN_TUNER_STATUS, eSCREEN_MAX); result = 1; break; case 4: bapp_set_current_screen(p_app, eSCREEN_CH_STATUS, eSCREEN_MAX); result = 1; break; case 5: bapp_set_current_screen(p_app, eSCREEN_CH_MAP_STATUS, eSCREEN_MAX); result = 1; break; case 6: bapp_set_current_screen(p_app, eSCREEN_MSG_STATUS, eSCREEN_MAX); result = 1; break; case 7: bapp_set_current_screen(p_app, eSCREEN_CODE_OBJECTS, eSCREEN_MAX); result = 1; break; case 8: bapp_set_current_screen(p_app, eSCREEN_CODE_DOWNLOAD, eSCREEN_MAX); result = 1; break; case 9: bapp_set_current_screen(p_app, eSCREEN_DECODER_STATUS, eSCREEN_MAX); result = 1; break; } break; case eIR_INFO: bapp_set_current_screen(p_app, eSCREEN_BANNER, eSCREEN_MAX); result = 1; break; case eIR_0: case eIR_1: case eIR_2: case eIR_3: case eIR_4: case eIR_5: case eIR_6: case eIR_7: case eIR_8: case eIR_9: bscreen_sys_info_handler(p_app,p_screen,p_event->id); break; } } break; default: result = bscreen_default_event(v_app,v_screen,p_event); break; } return result; /* always handle event */ } /* Summary: Diag menu screen drawing function */ void bscreen_diag_menu_draw(void *v_app, void *v_screen) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; unsigned int num_chars; int yoff,row; bgfx_fill_rect(&p_app->surf,0,0,eWIDTH,eHEIGHT,eCOLOR_BLACK); num_chars = bapp_util_strlen(s_menu_title); num_chars = c_to_uni_str((unsigned char*)s_menu_title,p_app->tmp_str,num_chars); yoff = eDIAG_START_Y; text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_MED], eDIAG_START_X, yoff, eDIAG_COL_WIDTH, eDIAG_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); yoff += 6; for (row = 0; row < eMM_IDX_NUM; ++row) { yoff += eDIAG_ROW_HEIGHT; if (row == p_screen->local_state) { num_chars = bapp_util_strlen(s_arrow); num_chars = c_to_uni_str((unsigned char*)s_arrow,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eDIAG_START_X, yoff, eDIAG_COL_WIDTH, eDIAG_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); } num_chars = bapp_util_strlen(s_main_menu[row]); num_chars = c_to_uni_str((unsigned char*)s_main_menu[row],p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eDIAG_MENU_X, yoff, eDIAG_COL_WIDTH, eDIAG_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); } num_chars = bapp_util_strlen(s_menu_help); num_chars = c_to_uni_str((unsigned char*)s_menu_help,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eDIAG_START_X, eDIAG_HELP_Y, eDIAG_COL_WIDTH, eDIAG_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); } /* Summary: Diag menu screen drawing function */ void bscreen_mso_info_draw(void *v_app, void *v_screen) { uint16_t x,y; unsigned int num_chars = 0; int i; bapp_t *p_app = (bapp_t*)v_app; unsigned char *p_str; x = eINFO_X; y = eINFO_STATUS_Y; i = 0; bgfx_fill_rect(&p_app->surf,x,y,eWIDTH - x,eINFO_ROW_HEIGHT,eCOLOR_BLACK); num_chars = bapp_util_strlen(s_main_menu[eMM_IDX_MSO_INFO]); num_chars = c_to_uni_str((unsigned char*)s_main_menu[eMM_IDX_MSO_INFO],p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_MED], x, y, eSCREEN_ACTION_SAFE_WIDTH, eINFO_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); x = eINFO_STATUS_X; y += eDIAG_ROW_HEIGHT + 6; num_chars = bapp_util_strlen(s_mso_info_str); num_chars = c_to_uni_str((unsigned char*)s_mso_info_str,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], x, y, eSCREEN_ACTION_SAFE_WIDTH, eINFO_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); y += eDIAG_ROW_HEIGHT; p_str = p_app->settings.phonenumber; num_chars = bapp_util_strlen(p_str); if (num_chars == 0) p_str = (unsigned char *)s_800_comcast; num_chars = bapp_util_strlen(p_str); num_chars = c_to_uni_str((unsigned char*)p_str,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], x, y, eSCREEN_ACTION_SAFE_WIDTH, eSCREEN_ACTION_SAFE_HEIGHT - y - eINFO_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); x = eINFO_X; num_chars = bapp_util_strlen(s_diag_help_default); num_chars = c_to_uni_str((unsigned char*)s_diag_help_default,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], x, eINFO_HELP_Y, eSCREEN_ACTION_SAFE_WIDTH, eINFO_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); } /* Summary: Code download event handler */ int bscreen_mso_info_event(void *v_app, void *v_screen, bscreen_event_t *p_event) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; return bscreen_diag_event(p_app,p_screen,p_event,bscreen_mso_info_draw,1); } /* Summary: Diag menu screen drawing function */ void bscreen_msg_status_draw(void *v_app, void *v_screen) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; unsigned int num_chars = 0; int time_offset = p_app->settings.utc_offset; struct tm utc_time; if ((p_app->system_time > p_app->settings.dst_entry) && (p_app->system_time < p_app->settings.dst_exit)) { /* TODO Check p_app->settings.dst_delta per spec */ time_offset += 3600; } bscreen_diag_draw(p_app,p_screen,s_main_menu[eMM_IDX_MSG_STATUS], s_diag_help_simple,s_msg_status_str, bscreen_msg_status_str); num_chars = bapp_util_strlen(s_msg_last_addr); num_chars = c_to_uni_str((unsigned char*)s_msg_last_addr,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eINFO_X, eINFO_HELP_Y-(2*eDIAG_ROW_HEIGHT)+8, eSCREEN_ACTION_SAFE_WIDTH/2, eINFO_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); utctime(p_app->settings.addressable_time + time_offset,&utc_time); num_chars = snprintf(ts_str,MAX_TSTR_LEN,"%2d %s %4d %2d:%2d:%2d", utc_time.tm_mday,s_mon_str[utc_time.tm_mon],utc_time.tm_year + 1980, utc_time.tm_hour,utc_time.tm_min,utc_time.tm_sec); num_chars = c_to_uni_str((unsigned char*)ts_str,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eINFO_X + 300, eINFO_HELP_Y-(2*eDIAG_ROW_HEIGHT)+8, eSCREEN_ACTION_SAFE_WIDTH/2, eINFO_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); num_chars = bapp_util_strlen(s_diag_help_msg_1); num_chars = c_to_uni_str((unsigned char*)s_diag_help_msg_1,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eINFO_X, eINFO_HELP_Y-eDIAG_ROW_HEIGHT+4, eSCREEN_ACTION_SAFE_WIDTH, eINFO_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); } /* Summary: Code download event handler */ int bscreen_msg_status_event(void *v_app, void *v_screen, bscreen_event_t *p_event) { int result = 0; bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; switch (p_event->type) { case eS_EVENT_IR: { switch (p_event->id) { case eIR_0: p_app->chm.cds_cnt = p_app->chm.mms_cnt = p_app->chm.sns_cnt = 0; p_app->chm.dcm_cnt = p_app->chm.vcm_cnt = p_app->chm.stt_cnt = 0; p_app->chm.ops_cnt = p_app->chm.cfg_cnt = p_app->chm.eas_cnt = 0; p_app->chm.em_cnt = p_app->chm.cat_cnt = p_app->chm.system_id_errors = 0; default: result = bscreen_diag_event(p_app,p_screen,p_event,bscreen_msg_status_draw,1); break; } break; } break; default: result = bscreen_diag_event(p_app,p_screen,p_event,bscreen_msg_status_draw,1); break; } return result; /* always handle event */ } /* Summary: Status screen drawing function. */ void bscreen_code_objects_draw(void *v_app, void *v_screen) { bapp_t *p_app = (bapp_t*)v_app; unsigned int num_chars; int y; bgfx_fill_rect(&p_app->surf,0,0,eWIDTH,eHEIGHT,eCOLOR_BLACK); y = eCH_MAP_START_Y; num_chars = bapp_util_strlen(s_main_menu[eMM_IDX_CODE_OBJECTS]); num_chars = c_to_uni_str((unsigned char*)s_main_menu[eMM_IDX_CODE_OBJECTS],p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_MED], eINFO_X, eCH_MAP_START_Y, eSCREEN_ACTION_SAFE_WIDTH, eINFO_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); y += eDIAG_ROW_HEIGHT + 6; num_chars = bapp_util_strlen(s_code_objects_str); num_chars = c_to_uni_str((unsigned char*)s_code_objects_str,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eINFO_X, y, eSCREEN_ACTION_SAFE_WIDTH, eINFO_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); y += eDIAG_ROW_HEIGHT; num_chars = bapp_util_strlen(s_bankA_str); num_chars = c_to_uni_str((unsigned char*)s_bankA_str,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eINFO_X, y, eSCREEN_ACTION_SAFE_WIDTH, eINFO_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); y += eDIAG_ROW_HEIGHT; num_chars = bapp_util_strlen(s_bankB_str); num_chars = c_to_uni_str((unsigned char*)s_bankB_str,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eINFO_X, y, eSCREEN_ACTION_SAFE_WIDTH, eINFO_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); num_chars = bapp_util_strlen(s_diag_help_simple); num_chars = c_to_uni_str((unsigned char*)s_diag_help_simple,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eINFO_X, eINFO_HELP_Y-eDIAG_ROW_HEIGHT, eSCREEN_ACTION_SAFE_WIDTH, eINFO_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); } /* Summary: Status screen event handling function. */ int bscreen_code_objects_event(void *v_app, void *v_screen, bscreen_event_t *p_event) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; return bscreen_diag_event(p_app,p_screen,p_event,bscreen_code_objects_draw,-1); } /* Summary: Status screen drawing function. */ void bscreen_code_download_draw(void *v_app, void *v_screen) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; bscreen_diag_draw(p_app,p_screen,s_main_menu[eMM_IDX_CODE_DOWNLOAD], s_diag_help_simple,s_code_download_str, bscreen_code_download_str); } /* Summary: Status screen event handling function. */ int bscreen_code_download_event(void *v_app, void *v_screen, bscreen_event_t *p_event) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; return bscreen_diag_event(p_app,p_screen,p_event,bscreen_code_download_draw,1); } int bscreen_ch_map_status_event(void *v_app, void *v_screen, bscreen_event_t *p_event) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; int result = 0; switch (p_event->type) { case eS_EVENT_SETUP: p_screen->local_state = 0; bgfx_fill_rect(&p_app->surf,0,0,eWIDTH,eHEIGHT,eCOLOR_BLACK); break; case eS_EVENT_IDLE: { /* Do anything that requires periodic action here */ } break; case eS_EVENT_IR: { BDBG_WRN(("%s:%d 0x%02x(%s)\n",__FUNCTION__,__LINE__,p_event->id,(p_event->id & 0x40000000) ? "up" : "down")); switch (p_event->id) { case eIR_CH_UP: case eIR_UP: p_screen->local_state -= eCH_MAP_NUM_ROW; if ((int)p_screen->local_state < 0) p_screen->local_state = 0; result = 1; break; case eIR_CH_DOWN: case eIR_DOWN: { unsigned short num_vch; ch_map_get_vch_num(bapp_cur_ch_map(p_app),&num_vch); if ((p_screen->local_state + eCH_MAP_NUM_ROW) < num_vch) { p_screen->local_state += eCH_MAP_NUM_ROW; } result = 1; } break; case eIR_INFO: bapp_set_current_screen(p_app, eSCREEN_BANNER, eSCREEN_MAX); result = 1; break; case eIR_PRECH: case eIR_DOT: bapp_set_current_screen(p_app, eSCREEN_DIAG_MENU, eSCREEN_MAX); result = 1; break; } } break; default: result = bscreen_default_event(v_app,v_screen,p_event); break; } return result; /* always handle event */ } /* Summary: Draw the header row . */ void bscreen_ch_map_header(bapp_t *p_app, bscreen_t *p_screen) { unsigned int num_chars; /* draw titles */ num_chars = c_to_uni_str((unsigned char*)s_ch_map_status_header[0],p_app->tmp_str,bapp_util_strlen(s_ch_map_status_header[0])); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eCH_MAP_START_X+ (0*eCH_MAP_COL_WIDTH), eCH_MAP_HDR_Y, eCH_MAP_COL_WIDTH -30, eCH_MAP_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); num_chars = c_to_uni_str((unsigned char*)s_ch_map_status_header[1],p_app->tmp_str,bapp_util_strlen(s_ch_map_status_header[1])); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eCH_MAP_START_X + (1*eCH_MAP_COL_WIDTH) -30, eCH_MAP_HDR_Y, eCH_MAP_COL_WIDTH, eCH_MAP_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); num_chars = c_to_uni_str((unsigned char*)s_ch_map_status_header[2],p_app->tmp_str,bapp_util_strlen(s_ch_map_status_header[2])); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eCH_MAP_START_X + (2*eCH_MAP_COL_WIDTH) -30, eCH_MAP_HDR_Y, eCH_MAP_COL_WIDTH + 30, eCH_MAP_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); num_chars = c_to_uni_str((unsigned char*)s_ch_map_status_header[3],p_app->tmp_str,bapp_util_strlen(s_ch_map_status_header[3])); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eCH_MAP_START_X + (3*eCH_MAP_COL_WIDTH), eCH_MAP_HDR_Y, eCH_MAP_COL_WIDTH, eCH_MAP_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); num_chars = c_to_uni_str((unsigned char*)s_ch_map_status_header[4],p_app->tmp_str,bapp_util_strlen(s_ch_map_status_header[4])); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eCH_MAP_START_X + (4*eCH_MAP_COL_WIDTH), eCH_MAP_HDR_Y, eCH_MAP_COL_WIDTH, eCH_MAP_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); num_chars = c_to_uni_str((unsigned char*)s_ch_map_status_header[5],p_app->tmp_str,bapp_util_strlen(s_ch_map_status_header[5])); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eCH_MAP_START_X + (5*eCH_MAP_COL_WIDTH), eCH_MAP_HDR_Y, eCH_MAP_COL_WIDTH, eCH_MAP_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); } /* Summary: Draw the row . */ void bscreen_ch_map_row(bapp_t *p_app, bscreen_t *p_screen, vch_t *p_vch, st_t *p_st, freq_t *p_freq, int y) { unsigned int num_chars; static char tmp_buf[64]; unsigned int freq_mhz,frac_freq_mhz; mms_t mms; freq_mhz = p_freq->freq_khz/1000; frac_freq_mhz = p_freq->freq_khz - (freq_mhz * 1000); /* draw row */ num_chars = snprintf(tmp_buf,64,"%d",p_vch->ch_num); num_chars = c_to_uni_str(tmp_buf,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eCH_MAP_START_X+ (0*eCH_MAP_COL_WIDTH), y, eCH_MAP_COL_WIDTH - 30, eCH_MAP_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); num_chars = snprintf(tmp_buf,64,"%d",p_vch->source_id); num_chars = c_to_uni_str(tmp_buf,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eCH_MAP_START_X+ (1*eCH_MAP_COL_WIDTH) - 30, y, eCH_MAP_COL_WIDTH, eCH_MAP_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); num_chars = snprintf(tmp_buf,64,"%11s",p_st->name); num_chars = c_to_uni_str(tmp_buf,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eCH_MAP_START_X+ (2*eCH_MAP_COL_WIDTH) - 30, y, eCH_MAP_COL_WIDTH + 30, eCH_MAP_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); num_chars = snprintf(tmp_buf,64,"%d.%d",freq_mhz,frac_freq_mhz); num_chars = c_to_uni_str(tmp_buf,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eCH_MAP_START_X+ (3*eCH_MAP_COL_WIDTH), y, eCH_MAP_COL_WIDTH, eCH_MAP_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); if (ch_map_get_mms(bapp_cur_ch_map(p_app),p_vch->mms_idx,&mms)) { num_chars = snprintf(tmp_buf,64,"%s",(mms.modulation == MOD_QAM64) ? "64" : (mms.modulation == MOD_QAM256) ? "256" : "N/A" ); num_chars = c_to_uni_str(tmp_buf,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eCH_MAP_START_X+ (4*eCH_MAP_COL_WIDTH), y, eCH_MAP_COL_WIDTH, eCH_MAP_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); } num_chars = snprintf(tmp_buf,64,"%d",p_vch->program_num); num_chars = c_to_uni_str(tmp_buf,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eCH_MAP_START_X+ (5*eCH_MAP_COL_WIDTH), y, eCH_MAP_COL_WIDTH, eCH_MAP_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); } /* Summary: Test screen drawing function . */ void bscreen_ch_map_status_draw(void *v_app, void *v_screen) { bapp_t *p_app = (bapp_t*)v_app; bscreen_t *p_screen = (bscreen_t*)v_screen; unsigned int num_chars; unsigned short num_vch; unsigned char cur_ch; int idx,yoff,row,page,pages; vch_t vch; st_t st; freq_t freq; ch_map_t *p_ch_map = bapp_cur_ch_map(p_app); bgfx_fill_rect(&p_app->surf,0,0,eWIDTH,eHEIGHT,eCOLOR_BLACK); ch_map_get_vch_num(bapp_cur_ch_map(p_app),&num_vch); pages = num_vch/eCH_MAP_NUM_ROW + 1; page = p_screen->local_state/eCH_MAP_NUM_ROW + 1; num_chars = snprintf(ts_str,MAX_TSTR_LEN,s_ch_map_status_info,p_app->settings.VCT_ID,num_vch,page,pages); num_chars = c_to_uni_str((unsigned char*)ts_str,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eINFO_X, eCH_MAP_START_Y, eSCREEN_ACTION_SAFE_WIDTH, eINFO_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); bscreen_ch_map_header(p_app,p_screen); if (!ch_map_get_current(p_ch_map,&vch,&st,&freq)) return; cur_ch = vch.ch_num; /* save current channel number */ p_ch_map->cur_ch = p_screen->local_state; idx = p_screen->local_state; yoff = eCH_MAP_ROW_Y; for (row = 0; row < eCH_MAP_NUM_ROW; ++row) { if (!ch_map_get_current(p_ch_map,&vch,&st,&freq)) break; yoff += eCH_MAP_ROW_HEIGHT; if (idx < num_vch) { bscreen_ch_map_row(p_app,p_screen,&vch,&st,&freq,yoff); } idx++; ch_map_set_next(p_ch_map); } num_chars = bapp_util_strlen(s_diag_help_ch_map); num_chars = c_to_uni_str((unsigned char*)s_diag_help_ch_map,p_app->tmp_str,num_chars); text_box(&p_app->surf, p_app->p_font[eLANG_ENGLISH][eFONT_SIZE_SMALL], eINFO_X, eINFO_HELP_Y, eSCREEN_ACTION_SAFE_WIDTH, eINFO_ROW_HEIGHT, p_app->tmp_str, num_chars, eCOLOR_WHITE,0); if (!ch_map_set_ch(p_ch_map,cur_ch)) return; }