Пример #1
0
/*description	: autoscan nim api callback function.*/
static INT32 dvbs_as_callback(UINT8 signal, UINT8 polar, UINT32 freq, UINT32 sym, 
	UINT8 fec)
{
    static INT16 crnum;
    T_NODE *tp;
    UINT16 sat_id;
    as_update_event_t handle = as_info->param.as_handler;
    
    if (NULL == as_info)
    {
        AS_PRINTF("%s: wrong status!\n", __FUNCTION__);
        return 2;
    }
	
    tp = &as_info->xp;
    if (as_info->stop_scan_signal)
    {
        return 2;
    }
    else if ((signal==AS_SGN_UNLOCKED)||(signal==AS_SGN_LOCKED))
    {
        /* patches for lib_nim out-band xponder mis-report*/
        if ((crnum<0)&&((freq<as_info->param.as_from)||(freq>as_info->param.as_to)))
            return 0;
        else if ((as_info->param.as_method == AS_METHOD_BLIND)
            ||(as_info->param.as_method == AS_METHOD_MULTI_FFT))
        {
            handle(ASM_TYPE_PROGRESS,(UINT8)dvbs_calculate_progress(as_info, freq, 
            polar, crnum));
        }
    }
	
    switch(signal)
    {
    case AS_SGN_LOCKED:  
        if (dvbs_tp_duplicate_check(freq, sym, polar) == FALSE)
            break;

        MEMSET(tp, 0, sizeof(T_NODE));
        dvbs_convert_freq(as_info, tp, freq);
        tp->sym = sym;
        tp->sat_id = sat_id = as_info->cur_sat.sat_id;
        AS_DUMP_SAT(&as_info->cur_sat);
        AS_DUMP_TP(tp);
        if(db_search_lookup_node(TYPE_SEARCH_TP_NODE, tp)!=SUCCESS)
        {
            INT32 ret;
            ret = add_node(TYPE_SEARCH_TP_NODE, tp->sat_id, tp);
            if ((DBERR_FLASH_FULL==ret) || (DBERR_MAX_LIMIT)==ret)
                return 1;
        }

        handle(ASM_TYPE_ADD_TRANSPONDER, tp->tp_id);
#ifdef BASE_TP_HALF_SCAN_SUPPORT

        psi_module_init(as_info->dmx, as_info->nim,(void *)__MM_PSI_START_ADDR, 280*1024);
#else
        psi_module_init(as_info->dmx, as_info->nim,(void *)__MM_PSI_START_ADDR, 180*1024);
#endif
        if (SI_STOFULL == psi_search_start(sat_id,tp->tp_id, as_info->param.as_prog_attr,
            as_info->param.as_p_add_cfg, psi_callback,NULL, NULL))
        {
            return 1;
        }
    break;
    
    case AS_SGN_STOP:
        AS_PRINTF(">>>>>>>>>>>>>>STOP!!!<<<<<<<<<<<<<<<<<<\n");
        as_info->stop_scan_signal=1;
    break;
    
    case AS_SGN_CRNUM:
        crnum = freq;
    break;
    
    case AS_SGN_INIT:
        crnum = -1;			
        dvbs_tp_duplicate_check(0, 0, 0);
        break;
//>>> Unicable begin
	case AS_SET_UNICABLE:
		dvbs_convert_freq(as_info, tp, freq);
		as_info->xponder.frq = tp->frq;
		as_info->xponder.pol = as_info->antenna.pol;
		//libc_printf("pol: %d\n",as_info->antenna.pol);
		set_unicable(&as_info->antenna, &as_info->xponder);
		wait_nim_ready();
//			wait_nim_ready();
		break;
//<<< Unicable end
    default:
        break;
    }

    return (as_info->stop_scan_signal)? 2: 0;
}
Пример #2
0
static INT32 as_enum_scan(UINT16 sat_id, UINT16 type, psi_tuning_t tuning_fn)
{
    BOOL db_ret = TRUE;
    INT32 ret = 0;
    INT32 func_ret = 0;
    UINT32 search_scheme;
    UINT8 lock_stat;
    struct as_tuning_param *atp = &as_info->atp;
    as_update_event_t update_event = as_info->param.as_handler;

    AS_PRINTF("start at %d\n", osal_get_tick());
    	
    	if(update_event != NULL)
    	{
        	update_event(ASM_TYPE_PROGRESS, AS_PROGRESS_SCANSTART+1);
    	}

	//Set First TP Info
    	if(tuning_fn != NULL)
    	{
        	tuning_fn(atp);
    	}

	//TP Scan Loop
    	while((atp->finish == FALSE) && (ret == 0))
    	{
    		//Set Search Scheme, that is whether Search NIT or not
        	search_scheme = as_info->param.as_prog_attr;
        	if (atp->nit_enable)
        	{            		
                     if (atp->si_enable)
                     {
                        search_scheme |= P_SEARCH_NIT;
                     }
                     else
                     {
                        search_scheme = P_SEARCH_NIT;
                     }
        	}

        	AS_PRINTF("id=%d, t_nr=%d\n",atp->tp_id, as_info->tp_nr);
        	lock_stat = 0;

		//Show New TP for DVB-S by Upper Layer
       	if ((tuning_fn == as_dvbs_preset_tuning) && (update_event))
        	{
            		update_event(ASM_TYPE_ADD_TRANSPONDER, atp->tp_id);
        	}

		//Try to Lock Signal
       	do
       	{
            		nim_get_lock(as_info->nim, &lock_stat);
            		if((lock_stat) || (as_info->stop_scan_signal))
            		{
                		break;
            		}
            		osal_task_sleep(1);
        	} while((INT32)osal_get_tick() < (INT32)atp->timeout);

        	AS_PRINTF("lock stat = %d\n", lock_stat);
        	if (!as_info->stop_scan_signal)
        	{
        		//If Lock Signal, then Search Prog in this TP
            		if (lock_stat)
            		{
                		//Scan from Start Frq to End Frq for DVB-C and DVB-T
                		if (type == ATP_TYPE_STEP)
                		{
                			//For DVB-C, Set TP Info according to as_info
                    			if(as_info->param.as_frontend_type == FRONTEND_TYPE_C)
                    			{
                        			db_ret = dvbc_alloc_transponder(as_info, atp, &as_info->xp, sat_id);
                    			}
								if (db_ret != TRUE)
                    			{
                        			ret = 1;
                        			break;
                    			}
					//Show New TP for DVB-C and DVB-T by Upper Layer
                    			if(update_event)
                    			{
                        			update_event(ASM_TYPE_ADD_TRANSPONDER, atp->tp_id);//notify ap show tp
                    			}
                		}

				//Prog Search in this TP
#if (defined(SUPPORT_MTILINGUAL_SERVICE_NAME))
                		psi_module_init(as_info->dmx, as_info->nim, (void *)__MM_PSI_START_ADDR, 400*1024);
#else
                		psi_module_init(as_info->dmx, as_info->nim, (void *)__MM_PSI_START_ADDR, 180*1024);
#endif
				func_ret = psi_search_start(sat_id, atp->tp_id, search_scheme, as_info->param.as_p_add_cfg, psi_callback, tuning_fn, atp);
                		if (SI_STOFULL == func_ret)
                		{
                    			ret= 1;
                		}
            		}
			//Not Lock Signal, then Switch to next TP
            		else
            		{
						#ifdef NIT_AUTO_SEARCH_SUPPORT
						if(tuning_fn== as_dvbc_blind_tuning && b_found_nit_tp)
						{// because doing auto scan,so atp->pos must > AS_MIN_CAB_FREQUENCY and we need to change to nit search.
							if(atp->pos > AS_MIN_CAB_FREQUENCY)
								atp->pos = 0;
							tuning_fn = as_dvbs_preset_tuning;
						}
						#endif
                		tuning_fn(atp);
            		}
        	}
			
        	if (as_info->stop_scan_signal || ret)
        	{
            		break;
        	}

		//Show Scan Progress by Upper Layer
        	if ((!as_info->tp_nit[0]) && (type == ATP_TYPE_DBASE) && (update_event))
        	{
            		update_event(ASM_TYPE_PROGRESS, atp->pos*99/(as_info->tp_nr+2));
        	}
    }
#ifdef NIT_AUTO_SEARCH_SUPPORT		
	b_found_nit_tp = FALSE; // nit search done
#endif	
    AS_PRINTF("end at %d\n", osal_get_tick());
    return ret;
}