164 lines
4.7 KiB
C++
164 lines
4.7 KiB
C++
//////////////////////////////////////////////////////////////////////////////
|
|
// (C) Philips Semiconductors-CSU 1999
|
|
// All rights are reserved. Reproduction in whole or in part is prohibited
|
|
// without the written consent of the copyright owner.
|
|
//
|
|
// Philips reserves the right to make changes without notice at any time.
|
|
// Philips makes no warranty, expressed, implied or statutory, including but
|
|
// not limited to any implied warranty of merchantibility or fitness for any
|
|
// particular purpose, or that the use will not infringe any third party
|
|
// patent, copyright or trademark. Philips must not be liable for any loss
|
|
// or damage arising from its use.
|
|
//
|
|
// ARI.CPP
|
|
// CDevice class : ARI function implementations.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
#include "philtune.h"
|
|
|
|
//void STREAMAPI FEQualityCheckThread(IN PVOID Context);
|
|
void FEQualityCheckThread(IN PVOID Context);
|
|
|
|
|
|
/*
|
|
* CreateQualityCheckThread()
|
|
* Input :
|
|
* Output: TRUE - if thread creation and timer creation succeeds
|
|
* FALSE - if thread creation or timer creation does not succeed
|
|
* Description: Creates a new thread to check the VSB hang condition and quality of the signal
|
|
* and take necessary actions. Also Initializes a timer, which will wake up this
|
|
* thread at regular intervals to do the check.
|
|
*/
|
|
BOOL CDevice::CreateQualityCheckThread()
|
|
{
|
|
BOOL bStatus;
|
|
HANDLE hHandle;
|
|
|
|
// Enable QCM
|
|
m_uiQualityCheckMode = QCM_ENABLE;
|
|
|
|
// Create new thread
|
|
if(StartThread( &hHandle, FEQualityCheckThread, this) == TRUE)
|
|
{
|
|
_DbgPrintF( DEBUGLVL_VERBOSE,("CDevice::CreateQualityCheckThread: Thread Created Success\n"));
|
|
}
|
|
else
|
|
{
|
|
_DbgPrintF( DEBUGLVL_ERROR,("CDevice::CreateQualityCheckThread: Thread Created Fail\n"));
|
|
return FALSE;
|
|
}
|
|
m_bQualityCheckActiveFlag = TRUE;
|
|
m_QualityCheckTimer.Set(100000);
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
* QualityCheckThread()
|
|
* Input : Context
|
|
* Output:
|
|
* Description: Thread which checks signal quality
|
|
*/
|
|
//void STREAMAPI FEQualityCheckThread(IN PVOID Context)
|
|
void FEQualityCheckThread(IN PVOID Context)
|
|
{
|
|
CDevice *p_FE = (CDevice *)Context;
|
|
p_FE->QualityCheckThread();
|
|
}
|
|
|
|
/*
|
|
* QualityCheckThread()
|
|
* Input : Context
|
|
* Output:
|
|
* Description: Thread which checks signal quality
|
|
*/
|
|
void CDevice::QualityCheckThread()
|
|
{
|
|
|
|
_DbgPrintF( DEBUGLVL_VERBOSE,("CDevice::QualityCheckThread: In Quality Check Thread\n"));
|
|
|
|
UINT i, k;
|
|
|
|
Delay(10000);
|
|
// Infinite loop
|
|
while(1)
|
|
{
|
|
// Wait for timer to signal. Timeout = 200ms
|
|
if(!m_QualityCheckTimer.Wait(200000))
|
|
{
|
|
_DbgPrintF( DEBUGLVL_VERBOSE,("QualityCheckThread: QCT Timed Out"));
|
|
}
|
|
else
|
|
{
|
|
// Wait for mutex
|
|
m_QualityCheckMutex.Lock();
|
|
UINT uiQcm;
|
|
// if signalled , read Quality check mode (QCM). Release mutex
|
|
uiQcm = m_uiQualityCheckMode;
|
|
m_QualityCheckMutex.Unlock();
|
|
|
|
// if QCM = ENABLE , check signal quality
|
|
if (uiQcm == QCM_ENABLE)
|
|
{
|
|
m_uiQualityCheckModeAck = QCM_ENABLE;
|
|
TimerRoutine();
|
|
}
|
|
// if QCM = DISABLE, do nothing
|
|
else if (uiQcm == QCM_DISABLE)
|
|
{
|
|
// Reset all counters
|
|
((CVSB1Demod *)(m_pDemod))->ResetHangCounter();
|
|
m_uiQualityCheckModeAck = QCM_DISABLE;
|
|
// _DbgPrintF( DEBUGLVL_VERBOSE,("QualityCheckThread: Inside Disable\n"));
|
|
}
|
|
// if QCM = RESET. Reset all counters
|
|
else if (uiQcm == QCM_RESET)
|
|
{
|
|
m_uiQualityCheckModeAck = QCM_RESET;
|
|
_DbgPrintF( DEBUGLVL_VERBOSE,("QualityCheckThread: Inside Reset\n"));
|
|
}
|
|
// if QCM = TERMINATE, Cancel timer and end thread
|
|
else if (uiQcm == QCM_TERMINATE)
|
|
{
|
|
m_uiQualityCheckModeAck = QCM_TERMINATE;
|
|
break;
|
|
}
|
|
// if QCM = none of the above, do nothing
|
|
else
|
|
{
|
|
}
|
|
} // Wait for timer
|
|
|
|
}// infinite while loop
|
|
|
|
// Cancel timer
|
|
m_QualityCheckTimer.Cancel();
|
|
|
|
_DbgPrintF( DEBUGLVL_VERBOSE,("QualityCheckThread: Terminating Thread\n"));
|
|
// End thread
|
|
StopThread();
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* TimerRoutine()
|
|
* Input :
|
|
* Output:
|
|
* Description: Timer routine which periodically checks for a chip hang
|
|
* Called only when QCM is Enabled
|
|
*/
|
|
//void STREAMAPI CDevice::TimerRoutine()
|
|
void CDevice::TimerRoutine()
|
|
{
|
|
if(m_bHangCheckFlag == TRUE)
|
|
((CVSB1Demod *)(m_pDemod))->CheckHang();
|
|
else
|
|
((CVSB1Demod *)(m_pDemod))->ResetHangCounter();
|
|
}
|
|
|
|
|
|
|