// add source and destination
push_back(MSGSTART);
- push_escaped(MSGCODE_TRANSMIT);
+ push_escaped(command.opcode_set == 0 ? (uint8_t)MSGCODE_TRANSMIT_EOM : (uint8_t)MSGCODE_TRANSMIT);
push_back(((uint8_t)command.initiator << 4) + (uint8_t)command.destination);
push_back(MSGEND);
// add opcode
- push_back(MSGSTART);
- push_escaped(command.parameters.empty() ? (uint8_t)MSGCODE_TRANSMIT_EOM : (uint8_t)MSGCODE_TRANSMIT);
- push_back((uint8_t) command.opcode);
- push_back(MSGEND);
-
- // add parameters
- for (int8_t iPtr = 0; iPtr < command.parameters.size; iPtr++)
+ if (command.opcode_set == 1)
{
push_back(MSGSTART);
+ push_escaped(command.parameters.empty() ? (uint8_t)MSGCODE_TRANSMIT_EOM : (uint8_t)MSGCODE_TRANSMIT);
+ push_back((uint8_t) command.opcode);
+ push_back(MSGEND);
- if (iPtr == command.parameters.size - 1)
- push_escaped( MSGCODE_TRANSMIT_EOM);
- else
- push_escaped(MSGCODE_TRANSMIT);
+ // add parameters
+ for (int8_t iPtr = 0; iPtr < command.parameters.size; iPtr++)
+ {
+ push_back(MSGSTART);
- push_escaped(command.parameters[iPtr]);
+ if (iPtr == command.parameters.size - 1)
+ push_escaped( MSGCODE_TRANSMIT_EOM);
+ else
+ push_escaped(MSGCODE_TRANSMIT);
- push_back(MSGEND);
+ push_escaped(command.parameters[iPtr]);
+
+ push_back(MSGEND);
+ }
}
+
+ // set timeout
+ transmit_timeout = command.transmit_timeout;
}
CCECAdapterMessage &CCECAdapterMessage::operator =(const CCECAdapterMessage &msg)
ReadFromDevice(500);
Sleep(5);
WriteNextCommand();
- Sleep(5);
}
return NULL;
void CAdapterCommunication::WriteNextCommand(void)
{
- CCECAdapterMessagePtr msg;
+ CCECAdapterMessage *msg;
if (m_outBuffer.Pop(msg))
{
CLockObject lock(&msg->mutex);
else
{
m_controller->AddLog(CEC_LOG_DEBUG, "command sent");
- CCondition::Sleep((uint32_t) msg->size() * (uint32_t)24 /*data*/ + (uint32_t)5 /*start bit (4.5 ms)*/);
+ CCondition::Sleep((uint32_t) msg->size() * 24 /*data*/ + 5 /*start bit (4.5 ms)*/ + 10);
msg->state = ADAPTER_MESSAGE_STATE_SENT;
}
msg->condition.Signal();
}
}
-bool CAdapterCommunication::Write(CCECAdapterMessagePtr data)
+bool CAdapterCommunication::Write(CCECAdapterMessage *data)
{
data->state = ADAPTER_MESSAGE_STATE_WAITING;
m_outBuffer.Push(data);
bool CAdapterCommunication::StartBootloader(void)
{
+ bool bReturn(false);
if (!IsRunning())
- return false;
+ return bReturn;
m_controller->AddLog(CEC_LOG_DEBUG, "starting the bootloader");
- CCECAdapterMessagePtr output(new CCECAdapterMessage);
+ CCECAdapterMessage *output = new CCECAdapterMessage;
output->push_back(MSGSTART);
output->push_escaped(MSGCODE_START_BOOTLOADER);
output->push_back(MSGEND);
- if (!Write(output))
- {
+ if ((bReturn = Write(output)) == false)
m_controller->AddLog(CEC_LOG_ERROR, "could not start the bootloader");
- return false;
- }
- m_controller->AddLog(CEC_LOG_DEBUG, "bootloader start command transmitted");
- return true;
-}
-bool CAdapterCommunication::SetAckMask(uint16_t iMask)
-{
- if (!IsRunning())
- return false;
-
- CStdString strLog;
- strLog.Format("setting ackmask to %2x", iMask);
- m_controller->AddLog(CEC_LOG_DEBUG, strLog.c_str());
-
- CCECAdapterMessagePtr 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 (!Write(output))
- {
- m_controller->AddLog(CEC_LOG_ERROR, "could not set the ackmask");
- return false;
- }
+ delete output;
- return true;
+ return bReturn;
}
bool CAdapterCommunication::PingAdapter(void)
{
+ bool bReturn(false);
if (!IsRunning())
- return false;
+ return bReturn;
m_controller->AddLog(CEC_LOG_DEBUG, "sending ping");
- CCECAdapterMessagePtr output(new CCECAdapterMessage);
+ CCECAdapterMessage *output = new CCECAdapterMessage;
output->push_back(MSGSTART);
output->push_escaped(MSGCODE_PING);
output->push_back(MSGEND);
- if (!Write(output))
- {
+ if ((bReturn = Write(output)) == false)
m_controller->AddLog(CEC_LOG_ERROR, "could not send ping command");
- return false;
- }
-
- m_controller->AddLog(CEC_LOG_DEBUG, "ping tranmitted");
// TODO check for pong
- return true;
+ delete output;
+
+ return bReturn;
}
bool CAdapterCommunication::IsOpen(void) const