📄 driv0299.c
字号:
--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 + -