push_back(MSGEND);
}
+
+ // set timeout
+ transmit_timeout = command.transmit_timeout;
}
CCECAdapterMessage &CCECAdapterMessage::operator =(const CCECAdapterMessage &msg)
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;
- }
-
- return true;
-}
-
bool CAdapterCommunication::PingAdapter(void)
{
if (!IsRunning())
uint8_t operator[](uint8_t pos) const { return packet[pos]; }
uint8_t at(uint8_t pos) const { return packet[pos]; }
uint8_t size(void) const { return packet.size; }
- void clear(void) { state = ADAPTER_MESSAGE_STATE_UNKNOWN; packet.clear(); }
+ void clear(void) { state = ADAPTER_MESSAGE_STATE_UNKNOWN; transmit_timeout = 0; packet.clear(); }
void shift(uint8_t iShiftBy) { packet.shift(iShiftBy); }
void push_back(uint8_t add) { packet.push_back(add); }
cec_adapter_messagecode message(void) const { return packet.size >= 1 ? (cec_adapter_messagecode) (packet.at(0) & ~(MSGCODE_FRAME_EOM | MSGCODE_FRAME_ACK)) : MSGCODE_NOTHING; }
cec_datapacket packet;
cec_adapter_message_state state;
+ int32_t transmit_timeout;
CMutex mutex;
CCondition condition;
};
void *Process(void);
bool StartBootloader(void);
- bool SetAckMask(uint16_t iMask);
private:
void WriteNextCommand(void);
m_strDeviceName(strDeviceName),
m_communication(serComm),
m_controller(controller),
- m_bMonitor(false),
- m_bLogicalAddressSet(false)
+ m_bMonitor(false)
{
for (int iPtr = 0; iPtr < 16; iPtr++)
m_busDevices[iPtr] = new CCECBusDevice(this, (cec_logical_address) iPtr, iPtr == iLogicalAddress ? iPhysicalAddress : 0);
return false;
}
- if (!SetLogicalAddress(m_iLogicalAddress))
- {
- m_controller->AddLog(CEC_LOG_ERROR, "could not set the logical address");
- return false;
- }
-
if (CreateThread())
{
if (!m_startCondition.Wait(&m_mutex))
cec_command command;
CCECAdapterMessage msg;
- m_communication->SetAckMask(0x1 << (uint8_t)m_iLogicalAddress);
+ SetAckMask(0x1 << (uint8_t)m_iLogicalAddress);
while (!IsStopped())
{
m_controller->AddLog(CEC_LOG_TRAFFIC, strTx.c_str());
}
-bool CCECProcessor::SetLogicalAddress(cec_logical_address iLogicalAddress /* = CECDEVICE_UNKNOWN */)
+bool CCECProcessor::SetLogicalAddress(cec_logical_address iLogicalAddress)
{
- if (iLogicalAddress != CECDEVICE_UNKNOWN)
+ if (m_iLogicalAddress != iLogicalAddress)
{
CStdString strLog;
strLog.Format("<< setting logical address to %1x", iLogicalAddress);
m_controller->AddLog(CEC_LOG_NOTICE, strLog.c_str());
m_iLogicalAddress = iLogicalAddress;
- m_bLogicalAddressSet = false;
+ return SetAckMask(0x1 << (uint8_t)m_iLogicalAddress);
}
- if (!m_bLogicalAddressSet && m_iLogicalAddress != CECDEVICE_UNKNOWN)
- m_bLogicalAddressSet = m_communication && m_communication->SetAckMask(0x1 << (uint8_t)m_iLogicalAddress);
-
- return m_bLogicalAddressSet;
+ return true;
}
bool CCECProcessor::SetPhysicalAddress(uint16_t iPhysicalAddress)
m_bMonitor = bEnable;
if (bEnable)
- return m_communication && m_communication->SetAckMask(0);
+ return SetAckMask(0);
else
- return m_communication && m_communication->SetAckMask(0x1 << (uint8_t)m_iLogicalAddress);
+ return SetAckMask(0x1 << (uint8_t)m_iLogicalAddress);
}
cec_version CCECProcessor::GetDeviceCecVersion(cec_logical_address iAddress)
bool CCECProcessor::Transmit(const cec_command &data)
{
- SetLogicalAddress();
-
- bool bReturn(false);
LogOutput(data);
CCECAdapterMessagePtr output(new CCECAdapterMessage(data));
+ return Transmit(output);
+}
+bool CCECProcessor::Transmit(CCECAdapterMessagePtr output)
+{
+ bool bReturn(false);
CLockObject lock(&m_mutex);
{
CLockObject msgLock(&output->mutex);
}
}
- if (data.transmit_timeout > 0)
+ if (output->transmit_timeout > 0)
{
- if ((bReturn = WaitForTransmitSucceeded(output->size(), data.transmit_timeout)) == false)
+ if ((bReturn = WaitForTransmitSucceeded(output->size(), output->transmit_timeout)) == false)
m_controller->AddLog(CEC_LOG_ERROR, "did not receive ack");
}
else
switch(msg.message())
{
case MSGCODE_COMMAND_ACCEPTED:
- iPacketsLeft--;
+ if (iPacketsLeft > 0)
+ iPacketsLeft--;
break;
case MSGCODE_TRANSMIT_SUCCEEDED:
bTransmitSucceeded = (iPacketsLeft == 0);
{
m_controller->AddLog(level, strMessage);
}
+
+bool CCECProcessor::SetAckMask(uint16_t iMask)
+{
+ 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 (!Transmit(output))
+ {
+ m_controller->AddLog(CEC_LOG_ERROR, "could not set the ackmask");
+ return false;
+ }
+
+ return true;
+}
virtual bool SetActiveView(void);
virtual bool SetInactiveView(void);
- virtual bool SetLogicalAddress(cec_logical_address iLogicalAddress = CECDEVICE_UNKNOWN);
+ virtual bool SetLogicalAddress(cec_logical_address iLogicalAddress);
virtual bool SetPhysicalAddress(uint16_t iPhysicalAddress);
virtual bool SwitchMonitoring(bool bEnable);
- virtual bool Transmit(const cec_command &data);
+ virtual bool Transmit(const cec_command &data);
+ virtual bool Transmit(CCECAdapterMessagePtr output);
virtual void TransmitAbort(cec_logical_address address, cec_opcode opcode, ECecAbortReason reason = CEC_ABORT_REASON_UNRECOGNIZED_OPCODE);
virtual void SetCurrentButton(cec_user_control_code iButtonCode);
CCECBusDevice *m_busDevices[16];
private:
+ bool SetAckMask(uint16_t iMask);
void LogOutput(const cec_command &data);
bool WaitForTransmitSucceeded(uint8_t iLength, uint32_t iTimeout = 1000);
bool ParseMessage(const CCECAdapterMessage &msg);
CAdapterCommunication *m_communication;
CLibCEC *m_controller;
bool m_bMonitor;
- bool m_bLogicalAddressSet;
};
};