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 = m_communication->WaitForTransmitSucceeded(output)) == false)
- m_controller->AddLog(CEC_LOG_DEBUG, "did not receive ack");
- }
- else
- bReturn = true;
- }while (output->transmit_timeout > 0 && output->NeedsRetry() && ++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);
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->PushBack(MSGSTART);
- output->PushEscaped(MSGCODE_SET_ACK_MASK);
- output->PushEscaped(iMask >> 8);
- output->PushEscaped((uint8_t)iMask);
- output->PushBack(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 */)
bool CAdapterCommunication::Write(CCECAdapterMessage *data)
{
- data->state = ADAPTER_MESSAGE_STATE_WAITING;
+ bool bReturn(false);
+
+ CLockObject lock(data->mutex);
+ data->state = ADAPTER_MESSAGE_STATE_WAITING_TO_BE_SENT;
m_outBuffer.Push(data);
- return true;
+ data->condition.Wait(data->mutex);
+
+ if (data->state != ADAPTER_MESSAGE_STATE_SENT)
+ {
+ m_processor->AddLog(CEC_LOG_ERROR, "command was not sent");
+ }
+ if (WaitForTransmitSucceeded(data))
+ {
+ if (data->isTransmission)
+ data->state = ADAPTER_MESSAGE_STATE_SENT_ACKED;
+ bReturn = true;
+ }
+ else
+ {
+ data->state = ADAPTER_MESSAGE_STATE_SENT_NOT_ACKED;
+ m_processor->AddLog(CEC_LOG_DEBUG, "did not receive ack");
+ }
+
+ return bReturn;
}
bool CAdapterCommunication::Read(CCECAdapterMessage &msg, uint32_t iTimeout)
}
if (bGotFullMessage)
- msg.state = ADAPTER_MESSAGE_STATE_RECEIVED;
+ msg.state = ADAPTER_MESSAGE_STATE_INCOMING;
return bGotFullMessage;
}
output->PushBack(MSGSTART);
output->PushEscaped(MSGCODE_START_BOOTLOADER);
output->PushBack(MSGEND);
+ output->isTransmission = false;
- CLockObject lock(output->mutex);
- if (Write(output))
- output->condition.Wait(output->mutex);
- bReturn = output->state == ADAPTER_MESSAGE_STATE_SENT;
+ if ((bReturn = Write(output)) == false)
+ m_processor->AddLog(CEC_LOG_ERROR, "could not start the bootloader");
delete output;
return bReturn;
output->PushBack(MSGSTART);
output->PushEscaped(MSGCODE_PING);
output->PushBack(MSGEND);
+ output->isTransmission = false;
- CLockObject lock(output->mutex);
- if (Write(output))
- output->condition.Wait(output->mutex);
- bReturn = output->state == ADAPTER_MESSAGE_STATE_SENT;
+ if ((bReturn = Write(output)) == false)
+ m_processor->AddLog(CEC_LOG_ERROR, "could not ping the adapter");
delete output;
return bReturn;
output->PushEscaped(MSGCODE_TRANSMIT_IDLETIME);
output->PushEscaped(iTimeout);
output->PushBack(MSGEND);
+ output->isTransmission = false;
if ((bReturn = Write(output)) == false)
m_processor->AddLog(CEC_LOG_ERROR, "could not set the idletime");
return bReturn;
}
+bool CAdapterCommunication::SetAckMask(uint16_t iMask)
+{
+ bool bReturn(false);
+ CStdString strLog;
+ strLog.Format("setting ackmask to %2x", iMask);
+ m_processor->AddLog(CEC_LOG_DEBUG, strLog.c_str());
+
+ CCECAdapterMessage *output = new CCECAdapterMessage;
+
+ output->PushBack(MSGSTART);
+ output->PushEscaped(MSGCODE_SET_ACK_MASK);
+ output->PushEscaped(iMask >> 8);
+ output->PushEscaped((uint8_t)iMask);
+ output->PushBack(MSGEND);
+ output->isTransmission = false;
+
+ if ((bReturn = Write(output)) == false)
+ m_processor->AddLog(CEC_LOG_ERROR, "could not set the ackmask");
+ delete output;
+
+ return bReturn;
+}
+
bool CAdapterCommunication::IsOpen(void)
{
return !IsStopped() && m_port->IsOpen() && IsRunning();
m_processor->AddLog(CEC_LOG_DEBUG, msg.ToString());
if (iPacketsLeft > 0)
iPacketsLeft--;
+ if (!message->isTransmission && iPacketsLeft == 0)
+ bTransmitSucceeded = true;
break;
case MSGCODE_TRANSMIT_SUCCEEDED:
m_processor->AddLog(CEC_LOG_DEBUG, msg.ToString());
typedef enum cec_adapter_message_state
{
ADAPTER_MESSAGE_STATE_UNKNOWN = 0,
- ADAPTER_MESSAGE_STATE_WAITING,
+ ADAPTER_MESSAGE_STATE_WAITING_TO_BE_SENT,
ADAPTER_MESSAGE_STATE_SENT,
- ADAPTER_MESSAGE_STATE_RECEIVED,
+ ADAPTER_MESSAGE_STATE_SENT_NOT_ACKED,
+ ADAPTER_MESSAGE_STATE_SENT_ACKED,
+ ADAPTER_MESSAGE_STATE_INCOMING,
ADAPTER_MESSAGE_STATE_ERROR
} cec_adapter_message_state;
// set timeout
transmit_timeout = command.transmit_timeout;
+ //TODO
}
CCECAdapterMessage &operator=(const CCECAdapterMessage &msg)
maxTries = CEC_DEFAULT_TRANSMIT_RETRIES + 1;
tries = 0;
reply = MSGCODE_NOTHING;
+ isTransmission = true;
}
void Shift(uint8_t iShiftBy)
cec_datapacket packet;
cec_adapter_message_state state;
int32_t transmit_timeout;
+ bool isTransmission;
PLATFORM::CMutex mutex;
PLATFORM::CCondition condition;
};