/* Summary: Callback function normally called when a complete message has * been received and passed the filter criteria. */ #ifdef DEBUG_RRT static void chm_output_rrt(chm_mgr_t *p_chm); #endif static void * chm_smessage_rrt_callback(void * context, size_t size) { chm_mgr_t * p_chm = (chm_mgr_t*)context; PSIP_RRT_header header; bapp_t *p_app = (bapp_t*)p_chm->p_app; p_chm->rrt_cnt++; PSIP_RRT_getHeader(p_chm->rrt_buf, &header); if ((header.rating_region == 1) || ((size == p_app->settings.rrt_settings.rrt_size) && (memcmp(p_chm->rrt_buf,p_app->settings.rrt_settings.rrt, size) == 0))) { BDBG_WRN(("RRTs region 1 or they match so don't update\n")); return(void*)p_chm->rrt_buf; } #ifdef DEBUG_RRT chm_output_rrt(p_chm); /* DEBUG ONLY */ #endif p_chm->rrt_evt.type = eCHM_EVT_RRT; p_chm->rrt_evt.size = size; memcpy(p_chm->rrt_evt.rrt,p_chm->rrt_buf,size); chm_post_app_event_cb(p_chm,(chm_event_t*)&p_chm->rrt_evt); return(void*)p_chm->rrt_buf; } /* Summary: Get the RRT. return non-zero on failure */ static int chm_rrt_start(chm_mgr_t *p_chm, /* Channel manager reference */ unsigned short network_pid) { int cerr; smessage_stream_params_t params; cerr = eCHM_ERR_OK; BDBG_MSG(("%s:%d (0x%04x)",__FUNCTION__, __LINE__,network_pid)); chm_rrt_stop(p_chm); p_chm->rrt_msg = smessage_open(smessage_format_psi); if (NULL == p_chm->rrt_msg) { BDBG_ERR(("%s:%d",__FILE__, __LINE__)); cerr = eCHM_ERR_FAILED; goto ExitFunc; } smessage_stream_params_init(¶ms, p_chm->rrt_msg); params.band = p_chm->band; params.pid = (uint16_t)network_pid; params.filter.coef[0] = 0xCA; params.filter.mask[0] = 0x00; params.buffer = p_chm->rrt_buf; params.buffer_size = RRT_BUF_LEN; /* processing is done in callback */ params.data_ready_callback = chm_smessage_rrt_callback; params.overflow = NULL; params.callback_context = (void *)p_chm; BDBG_WRN(("%s\n",__FUNCTION__)); if (b_ok != smessage_start(¶ms, p_chm->rrt_msg)) { BDBG_ERR(("%s:%d",__FILE__, __LINE__)); cerr = eCHM_ERR_FAILED; } ExitFunc: return cerr; } /* Summary: Stop the RRT. return non-zero on failure */ static void chm_rrt_stop(chm_mgr_t *p_chm) { if (NULL != p_chm->rrt_msg) { BDBG_WRN(("%s\n",__FUNCTION__)); if (b_ok != smessage_stop(p_chm->rrt_msg)) { BDBG_ERR(("%s:%d",__FUNCTION__, __LINE__)); return; } smessage_close(p_chm->rrt_msg); p_chm->rrt_msg = NULL; } } #ifdef DEBUG_RRT static void chm_output_rrt(chm_mgr_t *p_chm) { PSIP_RRT_header header; PSIP_RRT_dimension dim; PSIP_RRT_value val; int dim_idx,val_idx; char tmp_str[64]; if (p_chm->rrt_cnt <= 0) return; PSIP_RRT_getHeader(p_chm->rrt_buf, &header); if (chm_process_mss(p_chm,header.p_rating_region_name_text,tmp_str,64) == 0) { BDBG_WRN(("RRT %8s",tmp_str)); } for (dim_idx = 0; dim_idx < header.dimensions_defined; ++dim_idx) { if (PSIP_RRT_getDimension(p_chm->rrt_buf,dim_idx,&dim) != BERR_SUCCESS) continue; if (chm_process_mss(p_chm,dim.p_dimension_name_text,tmp_str,sizeof(tmp_str)) == 0) { BDBG_WRN((" RRT[%d] %8s(%d)",dim_idx,tmp_str,dim.graduated_scale)); } for (val_idx = 0; val_idx < dim.values_defined; ++val_idx) { if (PSIP_RRT_getValue(p_chm->rrt_buf,dim_idx,val_idx,&val) != BERR_SUCCESS) continue; if (chm_process_mss(p_chm,val.p_rating_value_text,tmp_str,sizeof(tmp_str)) == 0) { BDBG_WRN((" RRT[%d,%d] %8s",dim_idx,val_idx,tmp_str)); } if (chm_process_mss(p_chm,val.p_abbrev_rating_value_text,tmp_str,sizeof(tmp_str)) == 0) { BDBG_WRN((" RRT[%d,%d] %8s",dim_idx,val_idx,tmp_str)); } } } } #endif