⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 driv0299.c

📁 stv0299资料
💻 C
📖 第 1 页 / 共 4 页
字号:
--PARAMS OUT::	NONE
--RETURN	::	NOCARRIER if no carrier had been found, CARRIEROK otherwise 
--***************************************************/
SIGNALTYPE SearchCarrier(SEARCHPARAMS *pParams, SEARCHRESULT *pResult)
{
	short int	DerotFreq = 0,
				LastDerotFreq = 0, 
				DerotLimit,
				NextLoop = 3;
	int 	index = 0;
			
	pParams->State = NOCARRIER;
	
	DerotLimit = (pParams->SubRange/2L)/pParams->Mclk;
	DerotFreq = pParams->DerotFreq;
	
	RegSetField(CFD_ALGO,1);
	
	do
	{
		#if (HOST > 1000)  
			ReportInsertMessage(SEARCHOFFSET,DerotFreq,pParams->Mclk);  
		#endif
		
      REPORT_PRINT ( ( FE_MSG_CARRIER_SEARCH, DerotFreq, pParams -> DerotStep, DerotLimit ) );

		if(CheckCarrier(pParams)==NOCARRIER)
		{
			index++;
			LastDerotFreq = DerotFreq;
			DerotFreq += index*pParams->Direction*pParams->DerotStep;	/*	Compute the next derotator position for the zig zag	*/    
		
			if(ABS(DerotFreq) > DerotLimit)
				NextLoop--;
				
			if(NextLoop)
			{
				RegSetField(CFD_ALGO,1);
				FieldSetVal(DEROTATORFREQUENCYMSB,MSB(DerotFreq));
				FieldSetVal(DEROTATORFREQUENCYLSB,LSB(DerotFreq));   
				RegSetRegisters(R_CFRM,2); 							/*	Set the derotator frequency	*/
			}
		}
		else
		{
			pResult->SymbolRate = pParams->SymbolRate;
		}
		
		pParams->Direction = -pParams->Direction;			/*	Change the zigzag direction	*/    
	}
#ifdef   SYNCHRONISE_WITH_TUNER_TASK_STATE
    while(    (pParams->State!=CARRIEROK) && NextLoop && iCurTunerTaskState == iSavedTunerTaskState );

   if ( iCurTunerTaskState != iSavedTunerTaskState )
   {
      pParams -> State = NOCARRIER;
      do_report ( severity_info, "%s %d> How come? [%d] [%d]\n",
            __FILE__,
            __LINE__,
            iCurTunerTaskState,
            iSavedTunerTaskState );
      return   NOCARRIER;
   }
#else
    while(    (pParams->State!=CARRIEROK) && NextLoop );
#endif
	
	if(pParams->State == CARRIEROK)
	{
		RegGetRegisters(R_CFRM,2); 								/*	Get the derotator frequency	*/ 
		pParams->DerotFreq = (short int) MAKEWORD(FieldGetVal(DEROTATORFREQUENCYMSB),FieldGetVal(DEROTATORFREQUENCYLSB));
      REPORT_PRINT ( ( FE_MSG_CARRIER_FOUND, 
               pParams -> DerotFreq, 
               RegGetOneRegister ( R_VSTATUS ),
               0 ) );
	}
	else
	{
		pParams->DerotFreq = LastDerotFreq;	
      REPORT_PRINT ( ( FE_MSG_CARRIER_NOT_FOUND, 
               pParams -> DerotFreq, 
               RegGetOneRegister ( R_VSTATUS ),
               0 ) );
	}
	
	return pParams->State;
}


/*****************************************************
--FUNCTION	::	SearchFalseLock
--ACTION	::	Search a QPSK carrier with the derotator, if there is a false lock 
--PARAMS IN	::	
--PARAMS OUT::	NONE
--RETURN	::	NOCARRIER if no carrier had been found, CARRIEROK otherwise 
--***************************************************/
SIGNALTYPE SearchFalseLock(SEARCHPARAMS *pParams, SEARCHRESULT *pResult)
{
	short int	DerotFreq,
				DerotStep,
				DerotLimit,
				DerotOffset;
#if   1
   short int   NextLoop = 3;
#else
   short int   NextLoop = 1;
#endif
	int 	index = 1;

	long	CurrentFreq,tunspy;
			
	pParams->State = NOCARRIER;
	
	DerotStep = (pParams->SymbolRate/4L)/pParams->Mclk; 
	DerotLimit = (pParams->SubRange/2L)/pParams->Mclk;      
	DerotFreq = pParams->DerotFreq;

   REPORT_PRINT ( ( FE_MSG_SRCH_FALSE_LOCK, DerotStep, DerotFreq, DerotLimit ) );

	do
	{
      DerotFreq += index*pParams->Direction*DerotStep;		/*	Compute the next derotator position for the zig zag	*/ 
		CurrentFreq = pParams->Frequency + (DerotFreq*pParams->Mclk)/1000;

		if(ABS(DerotFreq) > DerotLimit)
			NextLoop--;
			
		if(NextLoop)
		{
			#if (HOST > 1000)  
				ReportInsertMessage(SEARCHOFFSET,DerotFreq,pParams->Mclk); 
			#endif
			
			/* if the False Lock is outside the derotator capture range	*/
			DerotOffset = ((CurrentFreq - (tunspy=TunerSetFrequency(CurrentFreq))) * pParams->Mclk )/1000;		/*	Move the tuner	*/ 
			WaitTuner(100);									/*	Is tuner Locked	?	*/     

         REPORT_PRINT ( ( FE_MSG_FALSE_LOCK, DerotFreq, CurrentFreq, DerotOffset ) );

			RegSetField ( CFD_ALGO, 1 );
			
			FieldSetVal(DEROTATORFREQUENCYMSB,MSB(DerotOffset));
			FieldSetVal(DEROTATORFREQUENCYLSB,LSB(DerotOffset)); 
			RegSetRegisters(R_CFRM,2); 						/*	Reset the derotator frequency	*/  
				
			CheckCarrier(pParams);
			RegSetField ( CFD_ALGO, 1 );

			if(pParams->State == CARRIEROK)
				CheckData(pParams);
         else
         {
#if   0
            printf ( "Nocarrier [%02X]\n", 
                  RegGetOneRegister ( R_VSTATUS ) );
#endif
         }
			
			index++;
		}

#if   0
      /* VICKY - 040400 - break the loop */
		break;
#endif

		pParams->Direction = -pParams->Direction;			/*	Change the zigzag direction	*/  
	}
#ifdef   SYNCHRONISE_WITH_TUNER_TASK_STATE
    while((pParams->State != DATAOK) && NextLoop && iCurTunerTaskState == iSavedTunerTaskState );

   if ( iCurTunerTaskState != iSavedTunerTaskState )
   {
      pParams -> State = NOCARRIER;
      do_report ( severity_info, "%s %d> How come? [%d] [%d]\n",
            __FILE__,
            __LINE__,
            iCurTunerTaskState,
            iSavedTunerTaskState );
      return   NOCARRIER;
   }
#else
   while((pParams->State != DATAOK) && NextLoop);
#endif
	
	if(pParams->State == DATAOK)
	{
		RegGetRegisters(R_CFRM,2); 								/*	Get the derotator frequency	*/ 
		pParams->DerotFreq = (short int) MAKEWORD(FieldGetVal(DEROTATORFREQUENCYMSB),FieldGetVal(DEROTATORFREQUENCYLSB));
		pParams->Frequency = CurrentFreq;
	}	
   else
   {
		TunerSetFrequency ( pParams -> Frequency );
		WaitTuner(100);									/*	Is tuner Locked	?	*/     
	   DerotOffset = pParams->DerotFreq;
		RegSetField ( CFD_ALGO, 1 );
		FieldSetVal(DEROTATORFREQUENCYMSB,MSB(DerotOffset));
		FieldSetVal(DEROTATORFREQUENCYLSB,LSB(DerotOffset)); 
   }
	
	return pParams->State;
}

/****************************************************
--FUNCTION	::	SearchData
--ACTION	::	Search for data
--PARAMS IN	::	pParams->Tdata	=>	Time to wait for data
--PARAMS OUT::	pParams->State	=>	Result of the search
--RETURN	::	NODATA if data not founded, DATAOK otherwise 
--**************************************************/
SIGNALTYPE SearchData(SEARCHPARAMS *pParams, SEARCHRESULT *pResult)
{
	if(CheckData(pParams)==NODATA)		/*	Check for data	*/   
	{
      int   iIqOriginal;

      iIqOriginal = RegGetField ( IQ );

		IQInvertion();					/*	Invert I and Q	*/

      REPORT_PRINT ( ( FE_MSG_INVERTING_IQ, iIqOriginal, RegGetField ( IQ ), 0 ) );

		if(CheckData(pParams) == NODATA)/*	Check for data	*/
		{
         iIqOriginal = RegGetField ( IQ );
			IQInvertion();				/*	Invert I and Q	*/ 

         REPORT_PRINT ( ( FE_MSG_BRINGING_IQ_NORMAL, iIqOriginal, RegGetField ( IQ ), 0 ) );

			#if (HOST > 1000)  
				ReportInsertMessage(SEARCHFALSELOCK,0,0);   
			#endif
			SearchFalseLock(pParams,pResult);	/*	we have found a false lock	*/
		}
	}
	
	return pParams->State;
}

/****************************************************
--FUNCTION	::	CheckRange
--ACTION	::	Check if the founded frequency is in the correct range
--PARAMS IN	::	pParams->BaseFreq =>	
--PARAMS OUT::	pParams->State	=>	Result of the check
--RETURN	::	RANGEOK if check success, OUTOFRANGE otherwise 
--***************************************************/
SIGNALTYPE CheckRange(SEARCHPARAMS *pParams, SEARCHRESULT *pResult) 
{
	int	RangeOffset,
		TransponderFrequency;
		
	RangeOffset = pParams->SearchRange/2000;  
	TransponderFrequency = pParams->Frequency + (pParams->DerotFreq * pParams->Mclk)/1000;

	if((TransponderFrequency >= pParams->BaseFreq - RangeOffset)
	&& (TransponderFrequency <= pParams->BaseFreq + RangeOffset))
		pParams->State = RANGEOK;
	else
		pParams->State = OUTOFRANGE;
		
	return pParams->State;
}

/*****************************************************
--FUNCTION  ::    CenterTimingLoop
--ACTION    ::    Timing loop centring
--PARAMS IN ::    SymbolRate    ->    Current symbol rate value
--                MasterClock    ->    Current master clock frequency
--PARAMS OUT::    NONE
--RETURN    ::    New symbol rate
--***************************************************/
long CenterTimingLoop(long SymbolRate, long MasterClock)
{
    long Correction    ;
    long NewSymbolRate;

#if   0
    /*    Read register    */
    RegGetField(RTF);

    /*    Centring the timing loop    */
    Correction    = (RegGetField(RTF)*(SymbolRate/8))/(MasterClock/2) ;
    /*    rounding    */
    Correction = (Correction >= 0) ? (Correction + 1)/2 : (Correction - 1)/2 ;
    NewSymbolRate = RegIncrSymbolRate(Correction) ;
#else
   int      iLoopCount;
   int      iTimingOffset;
   boolean  bBreakLoop;
   long     lCurSymbolRate,
            lCurOffset,
            lNewCalcSymbolRate;
   int      iLocFsOffset;

   bBreakLoop = false;

   iLoopCount = 4;
   while ( iLoopCount ) 
   {
      /*    Read register    */
      iTimingOffset = RegGetField ( RTF );

      lCurSymbolRate = RegGetSymbolRate ();
      lCurOffset = ( SymbolRate * iTimingOffset ) / 524288;  /* Fs(off) = ( TO * Fs ) / (2^19); */
      lNewCalcSymbolRate = lCurSymbolRate + lCurOffset;

      iLocFsOffset = ( int ) ( SymbolRate - lNewCalcSymbolRate );

         REPORT_PRINT ( ( FE_MSG_SYMBOL_CORRECTION, 
                  lCurSymbolRate,
                  lCurOffset,
                  ( long ) iTimingOffset ) );

      if ( iLocFsOffset != iCurFsRegOffset )
      {
         iCurFsRegOffset = iLocFsOffset;
         asSymbolRateOffset [ cTransponderIndex2bRetrieved ] = ( signed short int ) iCurFsRegOffset;

#if   1
         printf ( "ActSymb[%ld] Cur[%ld] Off[%ld] TiO[%d] Calc[%ld] Diff[%d]\n",
               SymbolRate,
               lCurSymbolRate,
               lCurOffset,
               iTimingOffset,
               lNewCalcSymbolRate,
               lCurSymbolRate - lNewCalcSymbolRate );
#endif

         RegSetSymbolRate ( lNewCalcSymbolRate );

#if   0
         printf ( "CurSymb [%ld] Calc[%ld]\n",
               RegGetSymbolRate (),
               lNewCalcSymbolRate );
#endif

         NewSymbolRate = lNewCalcSymbolRate;

         SystemWaitFor ( 3 );
         iTimingOffset = RegGetField ( RTF );
      }

      if ( ABS ( iTimingOffset ) < 60 )
         break;
      
      --iLoopCount;
   }
#endif

   return NewSymbolRate;
}

/****************************************************
--FUNCTION	::	CarrierNotCentered
--ACTION	::	Check if the carrier is correctly centered
--PARAMS IN	::		
--PARAMS OUT::	
--RETURN	::	1 if not centered, 0 otherwise
--***************************************************/
int CarrierNotCentered(SEARCHPARAMS *pParams,int AllowedOffset)
{
	int NotCentered = 0,
		DerotFreq,
		Fs;
	
	Fs = CarrierWidth(pParams->SymbolRate,pParams->RollOff);
	DerotFreq = ABS(pParams->DerotFreq * pParams->Mclk); 
	
	if((pParams->TunerIF == 0) && (Fs < 4000000))
		NotCentered = (pParams->TunerBW - Fs)/4 ;
	else
		NotCentered = ((pParams->TunerBW/2 - DerotFreq - Fs/2) < AllowedOffset) && (DerotFreq > pParams->TunerStep);
	
	return NotCentered;
}

/****************************************************
--FUNCTION	::	TunerCentering
--ACTION	::	Optimisation of the tuner position to allow frequency variations
--PARAMS IN	::	pParams	
				AllowedOffset
--PARAMS OUT::	pResult
--RETURN	::	DATAOK if success 
--**************************************************/
SIGNALTYPE TunerCentering(SEARCHPARAMS *pParams, SEARCHRESULT *pResult,int AllowedOffset)    
{
	int NotCentered = 0,
		DerotFreq,MinOffset,MaxOffset,
		CentringFrequency,
		TransponderFrequency,
		Fs,sign;
	
	Fs = CarrierWidth(pParams->SymbolRate,pParams->RollOff);
	DerotFreq = ABS(pParams->DerotFreq * pParams->Mclk); 
	
	if((pParams->TunerIF == 0) && (Fs < 4000000))
		MinOffset = 2000000;
	else
		MinOffset = 0;
	
	MaxOffset = MAX(pParams->TunerBW/2 - Fs/2 - AllowedOffset,MinOffset + pParams->TunerStep);   
	
	if(!INRANGE(MinOffset,DerotFreq,MaxOffset) || (CheckData(pParams)==NODATA))
	{
		sign = (pParams->DerotFreq > 0) ? 1:-1; 
		TransponderFrequency = pParams->Frequency + (pParams->DerotFreq * pParams->Mclk)/1000; 
		CentringFrequency = TransponderFrequency + (sign*MinOffset)/1000;
	
		CentringFrequency = TunerSetFrequency(CentringFrequency);	/*	Move the tuner	*/   
		WaitTuner(100);		/*	Is tuner Locked	? (wait 100 ms maxi)	*/     
	
      REPORT_PRINT ( ( FE_MSG_TUNER_CENTRING, pParams -> Frequency, CentringFrequency, 0 ) );

		#if (HOST > 1000)
			if(pParams->TunerIF == 0)
				ReportInsertMessage(TUNERZIFCENTERING,CentringFrequency,0); 
			else
				ReportInsertMessage(TUNERCENTERING,CentringFrequency,0);  
		#endif
	
		/* Reset Derotator	*/
		pParams->DerotFreq = ((TransponderFrequency - CentringFrequency)*1000)/pParams->Mclk;
		pParams->Frequency = CentringFrequency;
		pParams->Direction = 1;
		FieldSetVal(DEROTATORFREQUENCYMSB,MSB(pParams->DerotFreq));
		FieldSetVal(DEROTATORFREQUENCYLSB,LSB(pParams->DerotFreq));   
		RegSetRegisters(R_CFRM,2); 
		
		/*	Wait for agc1,agc2 and timing loop	*/ 
		SystemWaitFor(pParams->Tagc1 + pParams->Tagc2 + pParams->Ttiming);	
	
		if(SearchCarrier(pParams,pResult) == CARRIEROK)	/*	Search for carrier	*/  
			SearchData(pParams,pResult);				/*	Search for data	*/ 
	}			
	return pParams->State;
}



/****************************************************
--FUNCTION	::	FirstSubRange
--ACTION	::	Compute the first SubRange of the search 
--PARAMS IN	::	pParams->SearchRange
--PARAMS OUT::	pParams->SubRange
--RETURN	::	BWOK if bandwidth is ok, BWTOONARROW otherwise
--***************************************************/
SIGNALTYPE FirstSubRange(SEARCHPARAMS *pParams)
{
	TUNER_PROP Tnr;
	int maxsubrange;

	maxsubrange = pParams->TunerBW - CarrierWidth(pParams->SymbolRate,pParams->RollOff)/2;
	
	pParams->SubRange = MIN(pParams->SearchRange,maxsubrange);

   /* 
    * VICKY - 060200 - modified to start from the last registered tuner offset
    * for fast xpdr hopping
    */
#if   0
	pParams->Frequency = pParams->BaseFreq;
#else
	pParams->Frequency = pParams->BaseFreq + pParams -> TunerOffset;
#endif

	pParams->TunerOffset = 0L;
	pParams->SubDir = 1; 

#if   1
   do_report ( severity_info, "\n\nTunerBW => %d SubR[%d] SrchRange[%d] Max[%d] CW[%d]\n",
      pParams->TunerBW,
      pParams -> SubRange,
      pParams -> SearchRange,
      maxsubrange,
      CarrierWidth ( pParams -> SymbolRate, pParams -> RollOff ) / 2 );
#endif
	
	if(pParams->TunerBW > CarrierWidth(pParams->SymbolRate,pParams->RollOff/2))
		pParams->State = BWOK;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -