repositories
/
deb_libcec.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
cec: ensure that the ackmask is always set to 0 when closing the connection and that...
[deb_libcec.git]
/
src
/
lib
/
adapter
/
USBCECAdapterCommunication.cpp
diff --git
a/src/lib/adapter/USBCECAdapterCommunication.cpp
b/src/lib/adapter/USBCECAdapterCommunication.cpp
index 01bf303b45f9a65b16601dd9be9f03aa3b46775c..2d8597205214408c5f9f8ba72aa6255dc550c3c3 100644
(file)
--- a/
src/lib/adapter/USBCECAdapterCommunication.cpp
+++ b/
src/lib/adapter/USBCECAdapterCommunication.cpp
@@
-43,6
+43,7
@@
using namespace PLATFORM;
CUSBCECAdapterCommunication::CUSBCECAdapterCommunication(CCECProcessor *processor, const char *strPort, uint16_t iBaudRate /* = 38400 */) :
m_port(NULL),
m_processor(processor),
CUSBCECAdapterCommunication::CUSBCECAdapterCommunication(CCECProcessor *processor, const char *strPort, uint16_t iBaudRate /* = 38400 */) :
m_port(NULL),
m_processor(processor),
+ m_bHasData(false),
m_iLineTimeout(0),
m_iFirmwareVersion(CEC_FW_VERSION_UNKNOWN),
m_lastInitiator(CECDEVICE_UNKNOWN),
m_iLineTimeout(0),
m_iFirmwareVersion(CEC_FW_VERSION_UNKNOWN),
m_lastInitiator(CECDEVICE_UNKNOWN),
@@
-172,8
+173,6
@@
bool CUSBCECAdapterCommunication::Open(IAdapterCommunicationCallback *cb, uint32
void CUSBCECAdapterCommunication::Close(void)
{
void CUSBCECAdapterCommunication::Close(void)
{
- CLockObject lock(m_mutex);
- m_rcvCondition.Broadcast();
StopThread();
}
StopThread();
}
@@
-200,9
+199,13
@@
void *CUSBCECAdapterCommunication::Process(void)
}
}
}
}
+ /* notify all threads that are waiting on messages to be sent */
CCECAdapterMessage *msg(NULL);
CCECAdapterMessage *msg(NULL);
- if (m_outBuffer.Pop(msg))
- msg->condition.Broadcast();
+ while (m_outBuffer.Pop(msg))
+ msg->event.Broadcast();
+
+ /* set the ackmask to 0 before closing the connection */
+ SetAckMaskInternal(0, true);
if (m_port)
{
if (m_port)
{
@@
-216,6
+219,8
@@
void *CUSBCECAdapterCommunication::Process(void)
cec_adapter_message_state CUSBCECAdapterCommunication::Write(const cec_command &data, uint8_t iMaxTries, uint8_t iLineTimeout /* = 3 */, uint8_t iRetryLineTimeout /* = 3 */)
{
cec_adapter_message_state retVal(ADAPTER_MESSAGE_STATE_UNKNOWN);
cec_adapter_message_state CUSBCECAdapterCommunication::Write(const cec_command &data, uint8_t iMaxTries, uint8_t iLineTimeout /* = 3 */, uint8_t iRetryLineTimeout /* = 3 */)
{
cec_adapter_message_state retVal(ADAPTER_MESSAGE_STATE_UNKNOWN);
+ if (!IsRunning())
+ return retVal;
CCECAdapterMessage *output = new CCECAdapterMessage(data);
CCECAdapterMessage *output = new CCECAdapterMessage(data);
@@
-244,10
+249,9
@@
cec_adapter_message_state CUSBCECAdapterCommunication::Write(const cec_command &
bool CUSBCECAdapterCommunication::Write(CCECAdapterMessage *data)
{
bool CUSBCECAdapterCommunication::Write(CCECAdapterMessage *data)
{
- CLockObject lock(data->mutex);
data->state = ADAPTER_MESSAGE_STATE_WAITING_TO_BE_SENT;
m_outBuffer.Push(data);
data->state = ADAPTER_MESSAGE_STATE_WAITING_TO_BE_SENT;
m_outBuffer.Push(data);
- data->
condition.Wait(data->mutex
);
+ data->
event.Wait(5000
);
if ((data->expectControllerAck && data->state != ADAPTER_MESSAGE_STATE_SENT_ACKED) ||
(!data->expectControllerAck && data->state != ADAPTER_MESSAGE_STATE_SENT))
if ((data->expectControllerAck && data->state != ADAPTER_MESSAGE_STATE_SENT_ACKED) ||
(!data->expectControllerAck && data->state != ADAPTER_MESSAGE_STATE_SENT))
@@
-261,6
+265,9
@@
bool CUSBCECAdapterCommunication::Write(CCECAdapterMessage *data)
bool CUSBCECAdapterCommunication::Read(cec_command &command, uint32_t iTimeout)
{
bool CUSBCECAdapterCommunication::Read(cec_command &command, uint32_t iTimeout)
{
+ if (!IsRunning())
+ return false;
+
CCECAdapterMessage msg;
if (Read(msg, iTimeout))
{
CCECAdapterMessage msg;
if (Read(msg, iTimeout))
{
@@
-283,15
+290,16
@@
bool CUSBCECAdapterCommunication::Read(CCECAdapterMessage &msg, uint32_t iTimeou
if (!m_inBuffer.Pop(buf))
{
if (!m_inBuffer.Pop(buf))
{
- if (iTimeout == 0 || !m_rcvCondition.Wait(m_mutex, iTimeout))
+ if (iTimeout == 0 || !m_rcvCondition.Wait(m_mutex,
m_bHasData,
iTimeout))
return false;
m_inBuffer.Pop(buf);
return false;
m_inBuffer.Pop(buf);
+ m_bHasData = m_inBuffer.Size() > 0;
}
if (buf)
{
msg.packet = buf->packet;
}
if (buf)
{
msg.packet = buf->packet;
- msg.state =
msg.state =
ADAPTER_MESSAGE_STATE_INCOMING;
+ msg.state = ADAPTER_MESSAGE_STATE_INCOMING;
delete buf;
return true;
}
delete buf;
return true;
}
@@
-402,13
+410,13
@@
bool CUSBCECAdapterCommunication::ParseMessage(const CCECAdapterMessage &msg)
uint16_t CUSBCECAdapterCommunication::GetFirmwareVersion(void)
{
uint16_t CUSBCECAdapterCommunication::GetFirmwareVersion(void)
{
- CLockObject lock(m_mutex);
uint16_t iReturn(m_iFirmwareVersion);
if (!IsRunning())
return iReturn;
if (iReturn == CEC_FW_VERSION_UNKNOWN)
{
uint16_t iReturn(m_iFirmwareVersion);
if (!IsRunning())
return iReturn;
if (iReturn == CEC_FW_VERSION_UNKNOWN)
{
+ CLockObject lock(m_mutex);
CLibCEC::AddLog(CEC_LOG_DEBUG, "requesting the firmware version");
CCECAdapterMessage *output = new CCECAdapterMessage;
CLibCEC::AddLog(CEC_LOG_DEBUG, "requesting the firmware version");
CCECAdapterMessage *output = new CCECAdapterMessage;
@@
-475,6
+483,11
@@
bool CUSBCECAdapterCommunication::SetLineTimeout(uint8_t iTimeout)
}
bool CUSBCECAdapterCommunication::SetAckMask(uint16_t iMask)
}
bool CUSBCECAdapterCommunication::SetAckMask(uint16_t iMask)
+{
+ return SetAckMaskInternal(iMask, false);
+}
+
+bool CUSBCECAdapterCommunication::SetAckMaskInternal(uint16_t iMask, bool bWriteDirectly /* = false */)
{
bool bReturn(false);
CLibCEC::AddLog(CEC_LOG_DEBUG, "setting ackmask to %2x", iMask);
{
bool bReturn(false);
CLibCEC::AddLog(CEC_LOG_DEBUG, "setting ackmask to %2x", iMask);
@@
-488,7
+501,9
@@
bool CUSBCECAdapterCommunication::SetAckMask(uint16_t iMask)
output->PushBack(MSGEND);
output->isTransmission = false;
output->PushBack(MSGEND);
output->isTransmission = false;
- if ((bReturn = Write(output)) == false)
+ if (bWriteDirectly)
+ SendMessageToAdapter(output);
+ else if ((bReturn = Write(output)) == false)
CLibCEC::AddLog(CEC_LOG_ERROR, "could not set the ackmask");
delete output;
CLibCEC::AddLog(CEC_LOG_ERROR, "could not set the ackmask");
delete output;
@@
-620,6
+635,7
@@
void CUSBCECAdapterCommunication::AddData(uint8_t *data, size_t iLen)
m_currentAdapterMessage.Clear();
m_bGotStart = false;
m_bNextIsEscaped = false;
m_currentAdapterMessage.Clear();
m_bGotStart = false;
m_bNextIsEscaped = false;
+ m_bHasData = true;
m_rcvCondition.Signal();
}
else if (m_bNextIsEscaped)
m_rcvCondition.Signal();
}
else if (m_bNextIsEscaped)
@@
-652,6
+668,7
@@
bool CUSBCECAdapterCommunication::ReadFromDevice(uint32_t iTimeout, size_t iSize
if (iBytesRead < 0 || iBytesRead > 256)
{
CLibCEC::AddLog(CEC_LOG_ERROR, "error reading from serial port: %s", m_port->GetError().c_str());
if (iBytesRead < 0 || iBytesRead > 256)
{
CLibCEC::AddLog(CEC_LOG_ERROR, "error reading from serial port: %s", m_port->GetError().c_str());
+ StopThread(false);
return false;
}
else if (iBytesRead > 0)
return false;
}
else if (iBytesRead > 0)
@@
-665,7
+682,13
@@
bool CUSBCECAdapterCommunication::ReadFromDevice(uint32_t iTimeout, size_t iSize
void CUSBCECAdapterCommunication::SendMessageToAdapter(CCECAdapterMessage *msg)
{
CLockObject adapterLock(m_mutex);
void CUSBCECAdapterCommunication::SendMessageToAdapter(CCECAdapterMessage *msg)
{
CLockObject adapterLock(m_mutex);
- CLockObject lock(msg->mutex);
+ if (!m_port->IsOpen())
+ {
+ CLibCEC::AddLog(CEC_LOG_ERROR, "error writing to serial port: the connection is closed");
+ msg->state = ADAPTER_MESSAGE_STATE_ERROR;
+ return;
+ }
+
if (msg->tries == 1)
SetLineTimeout(msg->lineTimeout);
else
if (msg->tries == 1)
SetLineTimeout(msg->lineTimeout);
else
@@
-687,7
+710,7
@@
void CUSBCECAdapterCommunication::SendMessageToAdapter(CCECAdapterMessage *msg)
CLibCEC::AddLog(CEC_LOG_DEBUG, "did not receive ack");
}
}
CLibCEC::AddLog(CEC_LOG_DEBUG, "did not receive ack");
}
}
- msg->
condition
.Signal();
+ msg->
event
.Signal();
}
void CUSBCECAdapterCommunication::WriteNextCommand(void)
}
void CUSBCECAdapterCommunication::WriteNextCommand(void)
@@
-696,3
+719,10
@@
void CUSBCECAdapterCommunication::WriteNextCommand(void)
if (m_outBuffer.Pop(msg))
SendMessageToAdapter(msg);
}
if (m_outBuffer.Pop(msg))
SendMessageToAdapter(msg);
}
+
+CStdString CUSBCECAdapterCommunication::GetPortName(void)
+{
+ CStdString strName;
+ strName = m_port->GetName();
+ return strName;
+}