#include "AdapterCommunication.h"
#include "CECProcessor.h"
-#include "platform/serialport.h"
-#include "util/StdString.h"
-#include "platform/timeutils.h"
+#include "platform/serialport/serialport.h"
using namespace std;
using namespace CEC;
+using namespace PLATFORM;
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
case MSGCODE_HIGH_ERROR:
case MSGCODE_LOW_ERROR:
{
- int iLine = (size() >= 3) ? (at(1) << 8) | at(2) : 0;
+ uint32_t iLine = (size() >= 3) ? (at(1) << 8) | at(2) : 0;
uint32_t iTime = (size() >= 7) ? (at(3) << 24) | (at(4) << 16) | (at(5) << 8) | at(6) : 0;
- strMsg.AppendFormat(" line:%i", iLine);
+ strMsg.AppendFormat(" line:%u", iLine);
strMsg.AppendFormat(" time:%u", iTime);
}
break;
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);
}
m_processor(processor),
m_iLineTimeout(0)
{
- m_port = new CSerialPort;
+ m_port = new PLATFORM::CSerialPort;
}
CAdapterCommunication::~CAdapterCommunication(void)
bool CAdapterCommunication::Open(const char *strPort, uint16_t iBaudRate /* = 38400 */, uint32_t iTimeoutMs /* = 10000 */)
{
- CLockObject lock(&m_mutex);
+ 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;
}
if (CreateThread())
{
- m_startCondition.Wait(&m_mutex);
+ m_startCondition.Wait(m_mutex);
m_processor->AddLog(CEC_LOG_DEBUG, "communication thread started");
return true;
}
void CAdapterCommunication::Close(void)
{
- CLockObject lock(&m_mutex);
+ CLockObject lock(m_mutex);
m_startCondition.Broadcast();
m_rcvCondition.Broadcast();
StopThread();
void *CAdapterCommunication::Process(void)
{
{
- CLockObject lock(&m_mutex);
+ CLockObject lock(m_mutex);
m_startCondition.Signal();
}
WriteNextCommand();
}
+ CCECAdapterMessage *msg;
+ if (m_outBuffer.Pop(msg))
+ msg->condition.Broadcast();
+
return NULL;
}
void CAdapterCommunication::AddData(uint8_t *data, uint8_t iLen)
{
- CLockObject lock(&m_mutex);
- for (unsigned int iPtr = 0; iPtr < iLen; iPtr++)
+ CLockObject lock(m_mutex);
+ for (uint8_t iPtr = 0; iPtr < iLen; iPtr++)
m_inBuffer.Push(data[iPtr]);
m_rcvCondition.Signal();
void CAdapterCommunication::SendMessageToAdapter(CCECAdapterMessage *msg)
{
- CLockObject lock(&msg->mutex);
- if (m_port->Write(msg) != (int32_t) msg->size())
+ CLockObject lock(msg->mutex);
+ if (m_port->Write(msg->packet.data, msg->size()) != (int32_t) msg->size())
{
CStdString strError;
strError.Format("error writing to serial port: %s", m_port->GetError().c_str());
bool CAdapterCommunication::Read(CCECAdapterMessage &msg, uint32_t iTimeout)
{
- CLockObject lock(&m_mutex);
+ CLockObject lock(m_mutex);
msg.clear();
uint64_t iNow = GetTimeMs();
uint8_t buf = 0;
if (!m_inBuffer.Pop(buf))
{
- if (!m_rcvCondition.Wait(&m_mutex, (uint32_t) (iTarget - iNow)))
+ if (!m_rcvCondition.Wait(m_mutex, (uint32_t) (iTarget - iNow)))
return false;
}
output->push_escaped(MSGCODE_START_BOOTLOADER);
output->push_back(MSGEND);
- CLockObject lock(&output->mutex);
+ CLockObject lock(output->mutex);
if (Write(output))
- output->condition.Wait(&output->mutex);
+ output->condition.Wait(output->mutex);
bReturn = output->state == ADAPTER_MESSAGE_STATE_SENT;
delete output;
output->push_escaped(MSGCODE_PING);
output->push_back(MSGEND);
- CLockObject lock(&output->mutex);
+ CLockObject lock(output->mutex);
if (Write(output))
- output->condition.Wait(&output->mutex);
+ output->condition.Wait(output->mutex);
bReturn = output->state == ADAPTER_MESSAGE_STATE_SENT;
delete output;
return bReturn;
}
-bool CAdapterCommunication::IsOpen(void) const
+bool CAdapterCommunication::IsOpen(void)
{
return !IsStopped() && m_port->IsOpen() && IsRunning();
}