m_strDeviceName(strDeviceName),
m_communication(serComm),
m_controller(controller),
- m_bMonitor(false)
+ m_bMonitor(false),
+ m_busScan(NULL)
{
m_logicalAddresses.Clear();
m_logicalAddresses.Set(iLogicalAddress);
CCECProcessor::~CCECProcessor(void)
{
+ if (m_busScan)
+ {
+ m_busScan->StopThread();
+ delete m_busScan;
+ }
+
m_startCondition.Broadcast();
StopThread();
+
m_communication = NULL;
m_controller = NULL;
for (unsigned int iPtr = 0; iPtr < 16; iPtr++)
m_controller->AddLog(CEC_LOG_ERROR, "could not create a processor thread");
return false;
}
- return true;
+
+ lock.Leave();
+ if (SetAckMask(m_logicalAddresses.AckMask()) &&
+ SetHDMIPort(m_iHDMIPort, true))
+ {
+ m_busScan = new CCECBusScan(this);
+ m_busScan->CreateThread(true);
+ return true;
+ }
}
else
m_controller->AddLog(CEC_LOG_ERROR, "could not create a processor thread");
cec_command command;
CCECAdapterMessage msg;
+ if (m_logicalAddresses.IsEmpty() && !FindLogicalAddresses())
{
- if (m_logicalAddresses.IsEmpty() && !FindLogicalAddresses())
- {
- CLockObject lock(&m_mutex);
- m_controller->AddLog(CEC_LOG_ERROR, "could not detect our logical addresses");
- m_startCondition.Signal();
- return NULL;
- }
-
- SetAckMask(m_logicalAddresses.AckMask());
-
- ScanCECBus();
-
- {
- CLockObject lock(&m_mutex);
- m_bStarted = true;
- lock.Leave();
-
- SetHDMIPort(m_iHDMIPort);
-
- lock.Lock();
- m_controller->AddLog(CEC_LOG_DEBUG, "processor thread started");
- m_startCondition.Signal();
- }
+ CLockObject lock(&m_mutex);
+ m_controller->AddLog(CEC_LOG_ERROR, "could not detect our logical addresses");
+ m_startCondition.Signal();
+ return NULL;
+ }
+ else
+ {
+ CLockObject lock(&m_mutex);
+ m_bStarted = true;
+ m_controller->AddLog(CEC_LOG_DEBUG, "processor thread started");
+ m_startCondition.Signal();
}
while (!IsStopped())
Sleep(5);
m_controller->CheckKeypressTimeout();
-
- for (uint8_t iDevicePtr = 0; iDevicePtr < 16; iDevicePtr++)
- {
- if (!m_logicalAddresses[iDevicePtr])
- m_busDevices[iDevicePtr]->PollVendorId();
- }
-
- Sleep(5);
}
return NULL;
return bReturn;
}
-bool CCECProcessor::SetHDMIPort(uint8_t iPort)
+bool CCECProcessor::SetHDMIPort(uint8_t iPort, bool bForce /* = false */)
{
bool bReturn(false);
AddLog(CEC_LOG_DEBUG, strLog);
m_iHDMIPort = iPort;
- if (!m_bStarted)
+ if (!m_bStarted && !bForce)
return true;
uint16_t iPhysicalAddress(0);
return bReturn;
}
-void CCECProcessor::ScanCECBus(void)
-{
- CCECBusDevice *device(NULL);
- for (unsigned int iPtr = 0; iPtr < 16; iPtr++)
- {
- device = m_busDevices[iPtr];
- if (device && device->GetStatus() == CEC_DEVICE_STATUS_PRESENT)
- {
- device->GetPhysicalAddress();
- device->GetCecVersion();
- device->GetVendorId();
- }
- }
-}
-
bool CCECProcessor::CheckPhysicalAddress(uint16_t iPhysicalAddress)
{
- for (unsigned int iPtr = 0; iPtr < 16; iPtr++)
+ for (unsigned int iPtr = 0; iPtr < 15; iPtr++)
{
if (m_busDevices[iPtr]->GetPhysicalAddress(false) == iPhysicalAddress)
return true;
return bReturn;
}
-bool CCECProcessor::SetInactiveView(void)
+bool CCECProcessor::TransmitInactiveSource(void)
{
if (!IsRunning())
return false;
if (!m_logicalAddresses.IsEmpty() && m_busDevices[m_logicalAddresses.primary])
- return m_busDevices[m_logicalAddresses.primary]->TransmitInactiveView();
+ return m_busDevices[m_logicalAddresses.primary]->TransmitInactiveSource();
return false;
}
{
return m_busDevices[iDestination]->SendKeyRelease(bWait);
}
+
+void *CCECBusScan::Process(void)
+{
+ CCECBusDevice *device(NULL);
+ while (!IsStopped())
+ {
+ for (unsigned int iPtr = 0; iPtr < 15 && !IsStopped(); iPtr++)
+ {
+ device = m_processor->m_busDevices[iPtr];
+ if (device && device->GetStatus() == CEC_DEVICE_STATUS_PRESENT)
+ {
+ if (!IsStopped())
+ device->GetPhysicalAddress(false);
+ Sleep(5);
+
+ if (!IsStopped())
+ device->GetCecVersion();
+ Sleep(5);
+
+ if (!IsStopped())
+ device->GetVendorId();
+ Sleep(5);
+ }
+ }
+ Sleep(1000);
+ }
+ return NULL;
+}