#include "CECProcessor.h"
-#include "AdapterCommunication.h"
+#include "adapter/AdapterMessage.h"
#include "devices/CECBusDevice.h"
#include "devices/CECAudioSystem.h"
#include "devices/CECPlaybackDevice.h"
{
ReplaceHandlers();
command.Clear();
- msg.clear();
+ msg.Clear();
{
CLockObject lock(m_mutex);
bReturn = Transmit(output);
/* set to "not present" on failed ack */
- if (output->is_error() && output->reply == MSGCODE_TRANSMIT_FAILED_ACK &&
- output->destination() != CECDEVICE_BROADCAST)
- m_busDevices[output->destination()]->SetDeviceStatus(CEC_DEVICE_STATUS_NOT_PRESENT);
+ if (output->IsError() && output->reply == MSGCODE_TRANSMIT_FAILED_ACK &&
+ output->Destination() != CECDEVICE_BROADCAST)
+ m_busDevices[output->Destination()]->SetDeviceStatus(CEC_DEVICE_STATUS_NOT_PRESENT);
delete output;
return bReturn;
bool bReturn(false);
CLockObject lock(m_mutex);
{
+ if (!m_communication)
+ return bReturn;
+
m_iLastTransmission = GetTimeMs();
m_communication->SetLineTimeout(m_iStandardLineTimeout);
- output->tries = 1;
+ output->tries = 0;
do
{
if (output->tries > 0)
m_communication->SetLineTimeout(m_iRetryLineTimeout);
-
- CLockObject msgLock(output->mutex);
- if (!m_communication || !m_communication->Write(output))
- return bReturn;
- else
- {
- output->condition.Wait(output->mutex);
- if (output->state != ADAPTER_MESSAGE_STATE_SENT)
- {
- m_controller->AddLog(CEC_LOG_ERROR, "command was not sent");
- return bReturn;
- }
- }
-
- if (output->transmit_timeout > 0)
- {
- if ((bReturn = WaitForTransmitSucceeded(output)) == false)
- m_controller->AddLog(CEC_LOG_DEBUG, "did not receive ack");
- }
- else
- bReturn = true;
- }while (output->transmit_timeout > 0 && output->needs_retry() && ++output->tries < output->maxTries);
+ bReturn = m_communication->Write(output);
+ }while (!bReturn && output->transmit_timeout > 0 && output->NeedsRetry() && ++output->tries < output->maxTries);
}
m_communication->SetLineTimeout(m_iStandardLineTimeout);
Transmit(command);
}
-bool CCECProcessor::WaitForTransmitSucceeded(CCECAdapterMessage *message)
-{
- bool bError(false);
- bool bTransmitSucceeded(false);
- uint8_t iPacketsLeft(message->size() / 4);
-
- int64_t iNow = GetTimeMs();
- int64_t iTargetTime = iNow + message->transmit_timeout;
-
- while (!bTransmitSucceeded && !bError && (message->transmit_timeout == 0 || iNow < iTargetTime))
- {
- CCECAdapterMessage msg;
-
- if (!m_communication->Read(msg, message->transmit_timeout > 0 ? (int32_t)(iTargetTime - iNow) : 1000))
- {
- iNow = GetTimeMs();
- continue;
- }
-
- if (msg.message() == MSGCODE_FRAME_START && msg.ack())
- {
- m_busDevices[msg.initiator()]->GetHandler()->HandlePoll(msg.initiator(), msg.destination());
- m_lastInitiator = msg.initiator();
- iNow = GetTimeMs();
- continue;
- }
-
- bError = msg.is_error();
- if (msg.message() == MSGCODE_RECEIVE_FAILED &&
- m_lastInitiator != CECDEVICE_UNKNOWN &&
- !m_busDevices[m_lastInitiator]->GetHandler()->HandleReceiveFailed())
- {
- iNow = GetTimeMs();
- continue;
- }
-
- if (bError)
- {
- message->reply = msg.message();
- m_controller->AddLog(CEC_LOG_DEBUG, msg.ToString());
- }
- else
- {
- switch(msg.message())
- {
- case MSGCODE_COMMAND_ACCEPTED:
- m_controller->AddLog(CEC_LOG_DEBUG, msg.ToString());
- if (iPacketsLeft > 0)
- iPacketsLeft--;
- break;
- case MSGCODE_TRANSMIT_SUCCEEDED:
- m_controller->AddLog(CEC_LOG_DEBUG, msg.ToString());
- bTransmitSucceeded = (iPacketsLeft == 0);
- bError = !bTransmitSucceeded;
- message->reply = MSGCODE_TRANSMIT_SUCCEEDED;
- break;
- default:
- // ignore other data while waiting
- break;
- }
-
- iNow = GetTimeMs();
- }
- }
-
- return bTransmitSucceeded && !bError;
-}
-
bool CCECProcessor::ParseMessage(const CCECAdapterMessage &msg)
{
bool bEom(false);
- bool bIsError(msg.is_error());
+ bool bIsError(msg.IsError());
- if (msg.empty())
+ if (msg.IsEmpty())
return bEom;
- switch(msg.message())
+ switch(msg.Message())
{
case MSGCODE_FRAME_START:
{
m_currentframe.Clear();
- if (msg.size() >= 2)
+ if (msg.Size() >= 2)
{
- m_currentframe.initiator = msg.initiator();
- m_currentframe.destination = msg.destination();
- m_currentframe.ack = msg.ack();
- m_currentframe.eom = msg.eom();
+ m_currentframe.initiator = msg.Initiator();
+ m_currentframe.destination = msg.Destination();
+ m_currentframe.ack = msg.IsACK();
+ m_currentframe.eom = msg.IsEOM();
}
if (m_currentframe.ack == 0x1)
{
break;
case MSGCODE_FRAME_DATA:
{
- if (msg.size() >= 2)
+ if (msg.Size() >= 2)
{
m_currentframe.PushBack(msg[1]);
- m_currentframe.eom = msg.eom();
+ m_currentframe.eom = msg.IsEOM();
}
- bEom = msg.eom();
+ bEom = msg.IsEOM();
}
break;
default:
bool CCECProcessor::SetAckMask(uint16_t iMask)
{
- bool bReturn(false);
- CStdString strLog;
- strLog.Format("setting ackmask to %2x", iMask);
- m_controller->AddLog(CEC_LOG_DEBUG, strLog.c_str());
-
- CCECAdapterMessage *output = new CCECAdapterMessage;
-
- output->push_back(MSGSTART);
- output->push_escaped(MSGCODE_SET_ACK_MASK);
- output->push_escaped(iMask >> 8);
- output->push_escaped((uint8_t)iMask);
- output->push_back(MSGEND);
-
- if ((bReturn = Transmit(output)) == false)
- m_controller->AddLog(CEC_LOG_ERROR, "could not set the ackmask");
-
- delete output;
-
- return bReturn;
+ return m_communication->SetAckMask(iMask);
}
bool CCECProcessor::TransmitKeypress(cec_logical_address iDestination, cec_user_control_code key, bool bWait /* = true */)
{
return m_communication->PingAdapter();
}
+
+void CCECProcessor::HandlePoll(cec_logical_address initiator, cec_logical_address destination)
+{
+ m_busDevices[initiator]->GetHandler()->HandlePoll(initiator, destination);
+ m_lastInitiator = initiator;
+}
+
+bool CCECProcessor::HandleReceiveFailed(void)
+{
+ return m_lastInitiator != CECDEVICE_UNKNOWN &&
+ !m_busDevices[m_lastInitiator]->GetHandler()->HandleReceiveFailed();
+}