m_bHasData(false),
m_iLineTimeout(0),
m_iFirmwareVersion(CEC_FW_VERSION_UNKNOWN),
- m_lastInitiator(CECDEVICE_UNKNOWN),
+ m_lastDestination(CECDEVICE_UNKNOWN),
m_bNextIsEscaped(false),
m_bGotStart(false),
m_messageProcessor(NULL),
m_bInitialised(false)
{
+ for (unsigned int iPtr = 0; iPtr < 15; iPtr++)
+ m_bWaitingForAck[iPtr] = false;
m_port = new CSerialPort(strPort, iBaudRate);
}
{
//clear any input bytes
uint8_t buff[1024];
- while (m_port->Read(buff, 1024, 100) > 0)
+ ssize_t iBytesRead(0);
+ bool bGotMsgStart(false), bGotMsgEnd(false);
+ while ((iBytesRead = m_port->Read(buff, 1024, 100)) > 0 || (bGotMsgStart && !bGotMsgEnd))
{
- CLibCEC::AddLog(CEC_LOG_DEBUG, "data received, clearing it");
+ if (!bGotMsgStart)
+ CLibCEC::AddLog(CEC_LOG_DEBUG, "data received, clearing it");
+ // if something was received, wait for MSGEND
+ for (ssize_t iPtr = 0; iPtr < iBytesRead; iPtr++)
+ {
+ if (buff[iPtr] == MSGSTART)
+ bGotMsgStart = true;
+ else if (buff[iPtr] == MSGEND)
+ bGotMsgEnd = true;
+ }
Sleep(250);
}
}
output->retryTimeout = iRetryLineTimeout;
output->tries = 0;
+ {
+ CLockObject lock(m_mutex);
+ m_bWaitingForAck[data.destination] = true;
+ }
+
bool bRetry(true);
while (bRetry && ++output->tries < output->maxTries)
{
}
if (m_currentframe.ack == 0x1)
{
- m_lastInitiator = m_currentframe.initiator;
- m_processor->HandlePoll(m_currentframe.initiator, m_currentframe.destination);
+ m_lastDestination = m_currentframe.destination;
+ if (!m_bWaitingForAck[m_currentframe.destination])
+ m_processor->HandlePoll(m_currentframe.initiator, m_currentframe.destination);
+ else
+ m_bWaitingForAck[m_currentframe.destination] = false;
}
}
break;
case MSGCODE_RECEIVE_FAILED:
{
m_currentframe.Clear();
- if (m_lastInitiator != CECDEVICE_UNKNOWN)
- bIsError = m_processor->HandleReceiveFailed(m_lastInitiator);
+ if (m_lastDestination != CECDEVICE_UNKNOWN)
+ bIsError = m_processor->HandleReceiveFailed(m_lastDestination);
}
break;
case MSGCODE_FRAME_DATA:
bool CUSBCECAdapterCommunication::SetLineTimeout(uint8_t iTimeout)
{
- m_iLineTimeout = iTimeout;
- bool bReturn(m_iLineTimeout != iTimeout);
+ bool bReturn(true);
- if (!bReturn)
+ if (m_iLineTimeout != iTimeout)
{
CLibCEC::AddLog(CEC_LOG_DEBUG, "setting the line timeout to %d", iTimeout);
CCECAdapterMessage params;
params.PushEscaped(iTimeout);
bReturn = SendCommand(MSGCODE_TRANSMIT_IDLETIME, params);
+ if (bReturn)
+ m_iLineTimeout = iTimeout;
}
return bReturn;
if (msg.Message() == MSGCODE_FRAME_START && msg.IsACK())
{
- m_processor->HandlePoll(msg.Initiator(), msg.Destination());
- m_lastInitiator = msg.Initiator();
+ if (m_bWaitingForAck[msg.Initiator()])
+ m_bWaitingForAck[msg.Initiator()] = false;
+ else
+ {
+ m_processor->HandlePoll(msg.Initiator(), msg.Destination());
+ m_lastDestination = msg.Initiator();
+ }
iNow = GetTimeMs();
continue;
}
if (msg.Message() == MSGCODE_RECEIVE_FAILED &&
- m_lastInitiator != CECDEVICE_UNKNOWN &&
- m_processor->HandleReceiveFailed(m_lastInitiator))
+ m_lastDestination != CECDEVICE_UNKNOWN &&
+ m_processor->HandleReceiveFailed(m_lastDestination))
{
iNow = GetTimeMs();
continue;