From: Lars Op den Kamp Date: Sat, 29 Oct 2011 14:34:38 +0000 (+0200) Subject: cec: use CecBuffer as input buffer in CAdapterCommunication X-Git-Tag: upstream/2.2.0~1^2~191 X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=50aa01e6895383ff8e96af9b9d0b4641cc3b61f2;p=deb_libcec.git cec: use CecBuffer as input buffer in CAdapterCommunication --- diff --git a/src/lib/AdapterCommunication.cpp b/src/lib/AdapterCommunication.cpp index 6b0e262..50d1c88 100644 --- a/src/lib/AdapterCommunication.cpp +++ b/src/lib/AdapterCommunication.cpp @@ -35,16 +35,14 @@ #include "LibCEC.h" #include "platform/serialport.h" #include "util/StdString.h" +#include "platform/timeutils.h" using namespace std; using namespace CEC; CAdapterCommunication::CAdapterCommunication(CLibCEC *controller) : m_port(NULL), - m_controller(controller), - m_inbuf(NULL), - m_iInbufSize(0), - m_iInbufUsed(0) + m_controller(controller) { m_port = new CSerialPort; } @@ -58,9 +56,6 @@ CAdapterCommunication::~CAdapterCommunication(void) delete m_port; m_port = NULL; } - - if (m_inbuf) - free(m_inbuf); } bool CAdapterCommunication::Open(const char *strPort, uint16_t iBaudRate /* = 38400 */, uint32_t iTimeoutMs /* = 10000 */) @@ -109,14 +104,6 @@ void CAdapterCommunication::Close(void) CLockObject lock(&m_commMutex); StopThread(); - if (m_inbuf) - { - free(m_inbuf); - m_inbuf = NULL; - m_iInbufSize = 0; - m_iInbufUsed = 0; - } - m_rcvCondition.Broadcast(); } @@ -162,14 +149,8 @@ bool CAdapterCommunication::ReadFromDevice(uint32_t iTimeout) void CAdapterCommunication::AddData(uint8_t *data, uint8_t iLen) { CLockObject lock(&m_bufferMutex); - if (m_iInbufUsed + iLen > m_iInbufSize) - { - m_iInbufSize = m_iInbufUsed + iLen; - m_inbuf = (uint8_t*)realloc(m_inbuf, m_iInbufSize); - } - - memcpy(m_inbuf + m_iInbufUsed, data, iLen); - m_iInbufUsed += iLen; + for (unsigned int iPtr = 0; iPtr < iLen; iPtr++) + m_inBuffer.Push(data[iPtr]); m_rcvCondition.Signal(); } @@ -195,94 +176,51 @@ bool CAdapterCommunication::Read(cec_adapter_message &msg, uint32_t iTimeout) { CLockObject lock(&m_bufferMutex); - if (m_iInbufUsed < 1) - { - if (!m_rcvCondition.Wait(&m_bufferMutex, iTimeout)) - return false; - } + msg.clear(); + uint64_t iNow = GetTimeMs(); + uint64_t iTarget = iNow + iTimeout; + bool bGotFullMessage(false); + bool bNextIsEscaped(false); + bool bGotStart(false); - if (m_iInbufUsed < 1 || IsStopped()) - return false; - - //search for first start of message - int16_t startpos = -1; - for (int16_t iPtr = 0; iPtr < m_iInbufUsed; iPtr++) + while(!bGotFullMessage && iNow < iTarget) { - if (m_inbuf[iPtr] == MSGSTART) + uint8_t buf = 0; + if (!m_inBuffer.Pop(buf)) { - startpos = iPtr; - break; + if (!m_rcvCondition.Wait(&m_bufferMutex, iTarget - iNow)) + return false; } - } - - if (startpos == -1) - return false; - - //move anything from the first start of message to the beginning of the buffer - if (startpos > 0) - { - memmove(m_inbuf, m_inbuf + startpos, m_iInbufUsed - startpos); - m_iInbufUsed -= startpos; - } - if (m_iInbufUsed < 2) - return false; - - //look for end of message - startpos = -1; - int16_t endpos = -1; - for (int16_t iPtr = 1; iPtr < m_iInbufUsed; iPtr++) - { - if (m_inbuf[iPtr] == MSGEND) + if (!bGotStart) { - endpos = iPtr; - break; + if (buf == MSGSTART) + bGotStart = true; + continue; } - else if (m_inbuf[iPtr] == MSGSTART) + else if (buf == MSGSTART) //we found a msgstart before msgend, this is not right, remove { - startpos = iPtr; - break; + m_controller->AddLog(CEC_LOG_ERROR, "received MSGSTART before MSGEND"); + msg.clear(); + bGotStart = true; } - } - if (startpos > 0) //we found a msgstart before msgend, this is not right, remove - { - m_controller->AddLog(CEC_LOG_ERROR, "received MSGSTART before MSGEND"); - memmove(m_inbuf, m_inbuf + startpos, m_iInbufUsed - startpos); - m_iInbufUsed -= startpos; - return false; - } - - if (endpos > 0) //found a MSGEND - { - msg.clear(); - bool isesc = false; - for (int16_t iPtr = 1; iPtr < endpos; iPtr++) + if (buf == MSGEND) { - if (isesc) - { - msg.push_back(m_inbuf[iPtr] + (uint8_t)ESCOFFSET); - isesc = false; - } - else if (m_inbuf[iPtr] == MSGESC) - { - isesc = true; - } - else - { - msg.push_back(m_inbuf[iPtr]); - } + bGotFullMessage = true; } - - if (endpos + 1 < m_iInbufUsed) - memmove(m_inbuf, m_inbuf + endpos + 1, m_iInbufUsed - endpos - 1); - - m_iInbufUsed -= endpos + 1; - - return true; + else if (bNextIsEscaped) + { + msg.push_back(buf + (uint8_t)ESCOFFSET); + bNextIsEscaped = false; + } + else if (buf == MSGESC) + bNextIsEscaped = true; + else + msg.push_back(buf); } - return false; + return bGotFullMessage; } std::string CAdapterCommunication::GetError(void) const diff --git a/src/lib/AdapterCommunication.h b/src/lib/AdapterCommunication.h index fcb2817..badeae9 100644 --- a/src/lib/AdapterCommunication.h +++ b/src/lib/AdapterCommunication.h @@ -33,6 +33,7 @@ #include #include "platform/threads.h" +#include "util/buffer.h" #include namespace CEC @@ -67,9 +68,7 @@ namespace CEC CSerialPort * m_port; CLibCEC * m_controller; - uint8_t* m_inbuf; - int16_t m_iInbufSize; - int16_t m_iInbufUsed; + CecBuffer m_inBuffer; CMutex m_bufferMutex; CMutex m_commMutex; CCondition m_rcvCondition;