repositories
/
deb_libcec.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master' into release
[deb_libcec.git]
/
src
/
lib
/
adapter
/
USBCECAdapterCommunication.cpp
diff --git
a/src/lib/adapter/USBCECAdapterCommunication.cpp
b/src/lib/adapter/USBCECAdapterCommunication.cpp
index 80670e42f5c981f01bb2b1aff2c2d6c0fec345f6..2fe62fedcc134cab6cfb6ce3894ba16f93cd3735 100644
(file)
--- a/
src/lib/adapter/USBCECAdapterCommunication.cpp
+++ b/
src/lib/adapter/USBCECAdapterCommunication.cpp
@@
-67,7
+67,8
@@
CUSBCECAdapterCommunication::CUSBCECAdapterCommunication(CCECProcessor *processo
m_lastInitiator(CECDEVICE_UNKNOWN),
m_bNextIsEscaped(false),
m_bGotStart(false),
m_lastInitiator(CECDEVICE_UNKNOWN),
m_bNextIsEscaped(false),
m_bGotStart(false),
- m_messageProcessor(NULL)
+ m_messageProcessor(NULL),
+ m_bInitialised(false)
{
m_port = new PLATFORM::CSerialPort(strPort, iBaudRate);
}
{
m_port = new PLATFORM::CSerialPort(strPort, iBaudRate);
}
@@
-89,7
+90,7
@@
bool CUSBCECAdapterCommunication::CheckAdapter(uint32_t iTimeoutMs /* = 10000 */
while (iNow < iTarget && (bPinged = PingAdapter()) == false)
{
CLibCEC::AddLog(CEC_LOG_ERROR, "the adapter did not respond correctly to a ping (try %d)", ++iPingTry);
while (iNow < iTarget && (bPinged = PingAdapter()) == false)
{
CLibCEC::AddLog(CEC_LOG_ERROR, "the adapter did not respond correctly to a ping (try %d)", ++iPingTry);
- Sleep(500);
+
CEvent::
Sleep(500);
iNow = GetTimeMs();
}
iNow = GetTimeMs();
}
@@
-99,7
+100,7
@@
bool CUSBCECAdapterCommunication::CheckAdapter(uint32_t iTimeoutMs /* = 10000 */
while (bPinged && iNow < iTarget && (m_iFirmwareVersion = GetFirmwareVersion()) == CEC_FW_VERSION_UNKNOWN)
{
CLibCEC::AddLog(CEC_LOG_ERROR, "the adapter did not respond with a correct firmware version (try %d)", ++iFwVersionTry);
while (bPinged && iNow < iTarget && (m_iFirmwareVersion = GetFirmwareVersion()) == CEC_FW_VERSION_UNKNOWN)
{
CLibCEC::AddLog(CEC_LOG_ERROR, "the adapter did not respond with a correct firmware version (try %d)", ++iFwVersionTry);
- Sleep(500);
+
CEvent::
Sleep(500);
iNow = GetTimeMs();
}
iNow = GetTimeMs();
}
@@
-111,7
+112,7
@@
bool CUSBCECAdapterCommunication::CheckAdapter(uint32_t iTimeoutMs /* = 10000 */
while (iNow < iTarget && (bControlled = SetControlledMode(true)) == false)
{
CLibCEC::AddLog(CEC_LOG_ERROR, "the adapter did not respond correctly to setting controlled mode (try %d)", ++iControlledTry);
while (iNow < iTarget && (bControlled = SetControlledMode(true)) == false)
{
CLibCEC::AddLog(CEC_LOG_ERROR, "the adapter did not respond correctly to setting controlled mode (try %d)", ++iControlledTry);
- Sleep(500);
+
CEvent::
Sleep(500);
iNow = GetTimeMs();
}
bReturn = bControlled;
iNow = GetTimeMs();
}
bReturn = bControlled;
@@
-119,10
+120,15
@@
bool CUSBCECAdapterCommunication::CheckAdapter(uint32_t iTimeoutMs /* = 10000 */
else
bReturn = true;
else
bReturn = true;
+ {
+ CLockObject lock(m_mutex);
+ m_bInitialised = bReturn;
+ }
+
return bReturn;
}
return bReturn;
}
-bool CUSBCECAdapterCommunication::Open(IAdapterCommunicationCallback *cb, uint32_t iTimeoutMs /* = 10000 */)
+bool CUSBCECAdapterCommunication::Open(IAdapterCommunicationCallback *cb, uint32_t iTimeoutMs /* = 10000 */
, bool bSkipChecks /* = false */
)
{
uint64_t iNow = GetTimeMs();
uint64_t iTimeout = iNow + iTimeoutMs;
{
uint64_t iNow = GetTimeMs();
uint64_t iTimeout = iNow + iTimeoutMs;
@@
-163,29
+169,35
@@
bool CUSBCECAdapterCommunication::Open(IAdapterCommunicationCallback *cb, uint32
CLibCEC::AddLog(CEC_LOG_DEBUG, "connection opened, clearing any previous input and waiting for active transmissions to end before starting");
CLibCEC::AddLog(CEC_LOG_DEBUG, "connection opened, clearing any previous input and waiting for active transmissions to end before starting");
- //clear any input bytes
- uint8_t buff[1024];
- while (m_port->Read(buff, 1024, 100) > 0)
+ if (!bSkipChecks)
{
{
- CLibCEC::AddLog(CEC_LOG_DEBUG, "data received, clearing it");
- Sleep(250);
+ //clear any input bytes
+ uint8_t buff[1024];
+ while (m_port->Read(buff, 1024, 100) > 0)
+ {
+ CLibCEC::AddLog(CEC_LOG_DEBUG, "data received, clearing it");
+ Sleep(250);
+ }
}
}
}
}
- if (CreateThread())
+ if (!bSkipChecks && !CheckAdapter())
+ {
+ CLibCEC::AddLog(CEC_LOG_ERROR, "the adapter failed to pass basic checks");
+ return false;
+ }
+ else
{
{
- if (
!CheckAdapter
())
+ if (
CreateThread
())
{
{
-
StopThread(
);
-
CLibCEC::AddLog(CEC_LOG_ERROR, "the adapter failed to pass basic checks")
;
+
CLibCEC::AddLog(CEC_LOG_DEBUG, "communication thread started"
);
+
return true
;
}
else
{
}
else
{
- CLibCEC::AddLog(CEC_LOG_DEBUG, "communication thread started");
- return true;
+ CLibCEC::AddLog(CEC_LOG_ERROR, "could not create a communication thread");
}
}
}
}
- CLibCEC::AddLog(CEC_LOG_ERROR, "could not create a communication thread");
return false;
}
return false;
}
@@
-208,7
+220,7
@@
void *CUSBCECAdapterCommunication::Process(void)
{
CLockObject lock(m_mutex);
ReadFromDevice(50);
{
CLockObject lock(m_mutex);
ReadFromDevice(50);
- bCommandReceived = m_callback && Read(command, 0);
+ bCommandReceived = m_callback && Read(command, 0)
&& m_bInitialised
;
}
/* push the next command to the callback method if there is one */
}
/* push the next command to the callback method if there is one */
@@
-320,7
+332,7
@@
bool CUSBCECAdapterCommunication::Read(CCECAdapterMessage &msg, uint32_t iTimeou
if (iTimeout == 0 || !m_rcvCondition.Wait(m_mutex, m_bHasData, iTimeout))
return false;
m_inBuffer.Pop(buf);
if (iTimeout == 0 || !m_rcvCondition.Wait(m_mutex, m_bHasData, iTimeout))
return false;
m_inBuffer.Pop(buf);
- m_bHasData =
m_inBuffer.Size() > 0
;
+ m_bHasData =
!m_inBuffer.IsEmpty()
;
}
if (buf)
}
if (buf)
@@
-364,11
+376,9
@@
bool CUSBCECAdapterCommunication::StartBootloader(void)
bool CUSBCECAdapterCommunication::PingAdapter(void)
{
bool CUSBCECAdapterCommunication::PingAdapter(void)
{
- bool bReturn(false);
- if (!IsRunning())
- return bReturn;
-
+ CLockObject lock(m_mutex);
CLibCEC::AddLog(CEC_LOG_DEBUG, "sending ping");
CLibCEC::AddLog(CEC_LOG_DEBUG, "sending ping");
+
CCECAdapterMessage *output = new CCECAdapterMessage;
output->PushBack(MSGSTART);
CCECAdapterMessage *output = new CCECAdapterMessage;
output->PushBack(MSGSTART);
@@
-376,11
+386,16
@@
bool CUSBCECAdapterCommunication::PingAdapter(void)
output->PushBack(MSGEND);
output->isTransmission = false;
output->PushBack(MSGEND);
output->isTransmission = false;
- if ((bReturn = Write(output)) == false)
-
CLibCEC::AddLog(CEC_LOG_ERROR, "could not ping the adapter")
;
+ SendMessageToAdapter(output);
+
bool bWriteOk = output->state == ADAPTER_MESSAGE_STATE_SENT_ACKED
;
delete output;
delete output;
+ if (!bWriteOk)
+ {
+ CLibCEC::AddLog(CEC_LOG_ERROR, "could not ping the adapter");
+ return false;
+ }
- return
bReturn
;
+ return
true
;
}
bool CUSBCECAdapterCommunication::ParseMessage(const CCECAdapterMessage &msg)
}
bool CUSBCECAdapterCommunication::ParseMessage(const CCECAdapterMessage &msg)
@@
-425,7
+440,6
@@
bool CUSBCECAdapterCommunication::ParseMessage(const CCECAdapterMessage &msg)
m_currentframe.PushBack(msg[1]);
m_currentframe.eom = msg.IsEOM();
}
m_currentframe.PushBack(msg[1]);
m_currentframe.eom = msg.IsEOM();
}
- bEom = msg.IsEOM();
}
break;
default:
}
break;
default:
@@
-433,14
+447,12
@@
bool CUSBCECAdapterCommunication::ParseMessage(const CCECAdapterMessage &msg)
}
CLibCEC::AddLog(bIsError ? CEC_LOG_WARNING : CEC_LOG_DEBUG, msg.ToString());
}
CLibCEC::AddLog(bIsError ? CEC_LOG_WARNING : CEC_LOG_DEBUG, msg.ToString());
- return
bEom
;
+ return
msg.IsEOM()
;
}
uint16_t CUSBCECAdapterCommunication::GetFirmwareVersion(void)
{
uint16_t iReturn(m_iFirmwareVersion);
}
uint16_t CUSBCECAdapterCommunication::GetFirmwareVersion(void)
{
uint16_t iReturn(m_iFirmwareVersion);
- if (!IsRunning())
- return iReturn;
if (iReturn == CEC_FW_VERSION_UNKNOWN)
{
if (iReturn == CEC_FW_VERSION_UNKNOWN)
{
@@
-541,7
+553,7
@@
bool CUSBCECAdapterCommunication::SetAckMaskInternal(uint16_t iMask, bool bWrite
bool CUSBCECAdapterCommunication::SetControlledMode(bool controlled)
{
bool CUSBCECAdapterCommunication::SetControlledMode(bool controlled)
{
-
bool bReturn(false
);
+
CLockObject lock(m_mutex
);
CLibCEC::AddLog(CEC_LOG_DEBUG, "turning controlled mode %s", controlled ? "on" : "off");
CCECAdapterMessage *output = new CCECAdapterMessage;
CLibCEC::AddLog(CEC_LOG_DEBUG, "turning controlled mode %s", controlled ? "on" : "off");
CCECAdapterMessage *output = new CCECAdapterMessage;
@@
-552,11
+564,16
@@
bool CUSBCECAdapterCommunication::SetControlledMode(bool controlled)
output->PushBack(MSGEND);
output->isTransmission = false;
output->PushBack(MSGEND);
output->isTransmission = false;
- if ((bReturn = Write(output)) == false)
-
CLibCEC::AddLog(CEC_LOG_ERROR, "could not set controlled mode")
;
+ SendMessageToAdapter(output);
+
bool bWriteOk = output->state == ADAPTER_MESSAGE_STATE_SENT
;
delete output;
delete output;
+ if (!bWriteOk)
+ {
+ CLibCEC::AddLog(CEC_LOG_ERROR, "could not set controlled mode");
+ return false;
+ }
- return
bReturn
;
+ return
true
;
}
bool CUSBCECAdapterCommunication::IsOpen(void)
}
bool CUSBCECAdapterCommunication::IsOpen(void)
@@
-610,11
+627,11
@@
bool CUSBCECAdapterCommunication::WaitForAck(CCECAdapterMessage &message)
switch(msg.Message())
{
case MSGCODE_COMMAND_ACCEPTED:
switch(msg.Message())
{
case MSGCODE_COMMAND_ACCEPTED:
- CLibCEC::AddLog(CEC_LOG_DEBUG, msg.ToString());
if (iPacketsLeft > 0)
iPacketsLeft--;
if (!message.isTransmission && iPacketsLeft == 0)
bTransmitSucceeded = true;
if (iPacketsLeft > 0)
iPacketsLeft--;
if (!message.isTransmission && iPacketsLeft == 0)
bTransmitSucceeded = true;
+ CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - waiting for %d more", msg.ToString().c_str(), iPacketsLeft);
break;
case MSGCODE_TRANSMIT_SUCCEEDED:
CLibCEC::AddLog(CEC_LOG_DEBUG, msg.ToString());
break;
case MSGCODE_TRANSMIT_SUCCEEDED:
CLibCEC::AddLog(CEC_LOG_DEBUG, msg.ToString());