m_strDeviceName(strDeviceName),
m_communication(serComm),
m_controller(controller),
- m_bMonitor(false),
- m_bLogicalAddressSet(false)
+ m_bMonitor(false)
{
for (int iPtr = 0; iPtr < 16; iPtr++)
m_busDevices[iPtr] = new CCECBusDevice(this, (cec_logical_address) iPtr, iPtr == iLogicalAddress ? iPhysicalAddress : 0);
return false;
}
- if (!SetLogicalAddress(m_iLogicalAddress))
- {
- m_controller->AddLog(CEC_LOG_ERROR, "could not set the logical address");
- return false;
- }
-
if (CreateThread())
{
if (!m_startCondition.Wait(&m_mutex))
void *CCECProcessor::Process(void)
{
+ cec_command command;
+ CCECAdapterMessage msg;
+
+ SetAckMask(0x1 << (uint8_t)m_iLogicalAddress);
+
{
CLockObject lock(&m_mutex);
m_controller->AddLog(CEC_LOG_DEBUG, "processor thread started");
m_startCondition.Signal();
}
- cec_command command;
- CCECAdapterMessage msg;
-
- m_communication->SetAckMask(0x1 << (uint8_t)m_iLogicalAddress);
-
while (!IsStopped())
{
bool bParseFrame(false);
{
CLockObject lock(&m_mutex);
if (m_communication->IsOpen() && m_communication->Read(msg, 50))
+ {
+ m_controller->AddLog(msg.is_error() ? CEC_LOG_WARNING : CEC_LOG_DEBUG, msg.ToString());
bParseFrame = ParseMessage(msg) && !IsStopped();
+ }
if (bParseFrame)
command = m_currentframe;
if (bParseFrame)
ParseCommand(command);
+ Sleep(5);
+
m_controller->CheckKeypressTimeout();
for (unsigned int iDevicePtr = 0; iDevicePtr < 16; iDevicePtr++)
m_busDevices[iDevicePtr]->PollVendorId();
- if (!IsStopped())
- Sleep(5);
+ Sleep(5);
}
return NULL;
m_controller->AddLog(CEC_LOG_TRAFFIC, strTx.c_str());
}
-bool CCECProcessor::SetLogicalAddress(cec_logical_address iLogicalAddress /* = CECDEVICE_UNKNOWN */)
+bool CCECProcessor::SetLogicalAddress(cec_logical_address iLogicalAddress)
{
- if (iLogicalAddress != CECDEVICE_UNKNOWN)
+ if (m_iLogicalAddress != iLogicalAddress)
{
CStdString strLog;
strLog.Format("<< setting logical address to %1x", iLogicalAddress);
m_controller->AddLog(CEC_LOG_NOTICE, strLog.c_str());
m_iLogicalAddress = iLogicalAddress;
- m_bLogicalAddressSet = false;
+ return SetAckMask(0x1 << (uint8_t)m_iLogicalAddress);
}
- if (!m_bLogicalAddressSet && m_iLogicalAddress != CECDEVICE_UNKNOWN)
- m_bLogicalAddressSet = m_communication && m_communication->SetAckMask(0x1 << (uint8_t)m_iLogicalAddress);
-
- return m_bLogicalAddressSet;
+ return true;
}
bool CCECProcessor::SetPhysicalAddress(uint16_t iPhysicalAddress)
m_bMonitor = bEnable;
if (bEnable)
- return m_communication && m_communication->SetAckMask(0);
+ return SetAckMask(0);
else
- return m_communication && m_communication->SetAckMask(0x1 << (uint8_t)m_iLogicalAddress);
+ return SetAckMask(0x1 << (uint8_t)m_iLogicalAddress);
}
cec_version CCECProcessor::GetDeviceCecVersion(cec_logical_address iAddress)
if (m_busDevices[iAddress])
{
*language = m_busDevices[iAddress]->GetMenuLanguage();
- return (strcmp(language->language, "???") == 0);
+ return (strcmp(language->language, "???") != 0);
}
return false;
}
bool CCECProcessor::Transmit(const cec_command &data)
{
- SetLogicalAddress();
-
- bool bReturn(false);
LogOutput(data);
CCECAdapterMessagePtr output(new CCECAdapterMessage(data));
+ return Transmit(output);
+}
+bool CCECProcessor::Transmit(CCECAdapterMessagePtr output)
+{
+ bool bReturn(false);
CLockObject lock(&m_mutex);
{
CLockObject msgLock(&output->mutex);
}
}
- if (data.ack_timeout > 0)
+ if (output->transmit_timeout > 0)
{
- bool bError(false);
- if ((bReturn = WaitForAck(&bError, output->size(), data.ack_timeout)) == false)
+ if ((bReturn = WaitForTransmitSucceeded(output->size(), output->transmit_timeout)) == false)
m_controller->AddLog(CEC_LOG_ERROR, "did not receive ack");
}
else
- {
bReturn = true;
- }
}
return bReturn;
Transmit(command);
}
-bool CCECProcessor::WaitForAck(bool *bError, uint8_t iLength, uint32_t iTimeout /* = 1000 */)
+bool CCECProcessor::WaitForTransmitSucceeded(uint8_t iLength, uint32_t iTimeout /* = 1000 */)
{
- bool bTransmitSucceeded = false;
+ bool bError(false);
+ bool bTransmitSucceeded(false);
uint8_t iPacketsLeft(iLength / 4);
- *bError = false;
int64_t iNow = GetTimeMs();
int64_t iTargetTime = iNow + (uint64_t) iTimeout;
- while (!bTransmitSucceeded && !*bError && (iTimeout == 0 || iNow < iTargetTime))
+ while (!bTransmitSucceeded && !bError && (iTimeout == 0 || iNow < iTargetTime))
{
CCECAdapterMessage msg;
continue;
}
- *bError = msg.is_error();
+ bError = msg.is_error();
m_controller->AddLog(msg.is_error() ? CEC_LOG_WARNING : CEC_LOG_DEBUG, msg.ToString());
switch(msg.message())
{
case MSGCODE_COMMAND_ACCEPTED:
- iPacketsLeft--;
+ if (iPacketsLeft > 0)
+ iPacketsLeft--;
break;
case MSGCODE_TRANSMIT_SUCCEEDED:
bTransmitSucceeded = (iPacketsLeft == 0);
- *bError = !bTransmitSucceeded;
+ bError = !bTransmitSucceeded;
break;
default:
CStdString strLog;
- strLog.Format("received unexpected reply '%1x' instead of ack", msg.message());
+ strLog.Format("received unexpected reply '%s' instead of ack", msg.MessageCodeAsString().c_str());
m_controller->AddLog(CEC_LOG_WARNING, strLog);
- *bError = true;
+ ParseMessage(msg);
+ bError = true;
break;
}
iNow = GetTimeMs();
}
- return bTransmitSucceeded && !*bError;
+ return bTransmitSucceeded && !bError;
}
bool CCECProcessor::ParseMessage(const CCECAdapterMessage &msg)
if (msg.empty())
return bEom;
- m_controller->AddLog(msg.is_error() ? CEC_LOG_WARNING : CEC_LOG_DEBUG, msg.ToString());
-
switch(msg.message())
{
case MSGCODE_FRAME_START:
void CCECProcessor::AddCommand(const cec_command &command)
{
- m_controller->AddCommand(command);
+// m_controller->AddCommand(command);
}
void CCECProcessor::AddKey(void)
{
m_controller->AddLog(level, strMessage);
}
+
+bool CCECProcessor::SetAckMask(uint16_t iMask)
+{
+ CStdString strLog;
+ strLog.Format("setting ackmask to %2x", iMask);
+ m_controller->AddLog(CEC_LOG_DEBUG, strLog.c_str());
+
+ CCECAdapterMessagePtr output(new CCECAdapterMessage);
+
+ output->push_back(MSGSTART);
+ output->push_escaped(MSGCODE_SET_ACK_MASK);
+ output->push_escaped(iMask >> 8);
+ output->push_escaped((uint8_t)iMask);
+ output->push_back(MSGEND);
+
+ if (!Transmit(output))
+ {
+ m_controller->AddLog(CEC_LOG_ERROR, "could not set the ackmask");
+ return false;
+ }
+
+ return true;
+}