CCECAdapterMessage::CCECAdapterMessage(const cec_command &command)
{
clear();
- maxTries = command.retries + 1;
//set ack polarity to high when transmitting to the broadcast address
//set ack polarity low when transmitting to any other address
code == MSGCODE_LOW_ERROR ||
code == MSGCODE_RECEIVE_FAILED ||
code == MSGCODE_COMMAND_REJECTED ||
- code == MSGCODE_TRANSMIT_LINE_TIMEOUT ||
+ code == MSGCODE_TRANSMIT_LINE_TIMEOUT ||
code == MSGCODE_TRANSMIT_FAILED_LINE ||
- code == MSGCODE_TRANSMIT_FAILED_ACK ||
+ code == MSGCODE_TRANSMIT_FAILED_ACK ||
code == MSGCODE_TRANSMIT_FAILED_TIMEOUT_DATA ||
code == MSGCODE_TRANSMIT_FAILED_TIMEOUT_LINE);
}
bool CAdapterCommunication::Open(const char *strPort, uint16_t iBaudRate /* = 38400 */, uint32_t iTimeoutMs /* = 10000 */)
{
+ uint64_t iNow = GetTimeMs();
+ uint64_t iTimeout = iNow + iTimeoutMs;
+
CLockObject lock(&m_mutex);
+
if (!m_port)
{
m_processor->AddLog(CEC_LOG_ERROR, "port is NULL");
if (IsOpen())
{
m_processor->AddLog(CEC_LOG_ERROR, "port is already open");
+ return true;
}
- if (!m_port->Open(strPort, iBaudRate))
+ CStdString strError;
+ bool bConnected(false);
+ while (!bConnected && iNow < iTimeout)
+ {
+ if ((bConnected = m_port->Open(strPort, iBaudRate)) == false)
+ {
+ strError.Format("error opening serial port '%s': %s", strPort, m_port->GetError().c_str());
+ Sleep(250);
+ iNow = GetTimeMs();
+ }
+ }
+
+ if (!bConnected)
{
- CStdString strError;
- strError.Format("error opening serial port '%s': %s", strPort, m_port->GetError().c_str());
m_processor->AddLog(CEC_LOG_ERROR, strError);
return false;
}
m_processor->AddLog(CEC_LOG_DEBUG, "connection opened");
//clear any input bytes
- uint8_t buff[1024];
- while (m_port->Read(buff, sizeof(buff), 1000) > 0) {}
+ uint8_t buff[1];
+ while (m_port->Read(buff, 1, 5) == 1) {}
if (CreateThread())
{
WriteNextCommand();
}
+ CCECAdapterMessage *msg;
+ if (m_outBuffer.Pop(msg))
+ msg->condition.Broadcast();
+
return NULL;
}