cec: moved SetAckMask() back to CCECProcessor, so the result can be processed properly
authorLars Op den Kamp <lars@opdenkamp.eu>
Tue, 1 Nov 2011 19:38:28 +0000 (20:38 +0100)
committerLars Op den Kamp <lars@opdenkamp.eu>
Tue, 1 Nov 2011 19:38:28 +0000 (20:38 +0100)
src/lib/AdapterCommunication.cpp
src/lib/AdapterCommunication.h
src/lib/CECProcessor.cpp
src/lib/CECProcessor.h

index 8fc70cd65f2ef129e29b8b2abcd0bd47e7e6c180..e94e8c01b1880095887df982bc6b0c93fe046cab 100644 (file)
@@ -80,6 +80,9 @@ CCECAdapterMessage::CCECAdapterMessage(const cec_command &command)
 
     push_back(MSGEND);
   }
+
+  // set timeout
+  transmit_timeout = command.transmit_timeout;
 }
 
 CCECAdapterMessage &CCECAdapterMessage::operator =(const CCECAdapterMessage &msg)
@@ -458,32 +461,6 @@ bool CAdapterCommunication::StartBootloader(void)
   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())
index 21a775dbc6b8739b87f0982041fbdd168182b300..ef5e0aa7c2934c55649dcef5915b65130da3a52f 100644 (file)
@@ -64,7 +64,7 @@ namespace CEC
     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; }
@@ -77,6 +77,7 @@ namespace CEC
 
     cec_datapacket            packet;
     cec_adapter_message_state state;
+    int32_t                   transmit_timeout;
     CMutex                    mutex;
     CCondition                condition;
   };
@@ -102,7 +103,6 @@ namespace CEC
     void *Process(void);
 
     bool StartBootloader(void);
-    bool SetAckMask(uint16_t iMask);
 
   private:
     void WriteNextCommand(void);
index 35fb4aa03018772a9a6feb93fc9ae9d3663e24ea..09e1ce4e0231de8c49b1c61c6d54e666dabd773a 100644 (file)
@@ -46,8 +46,7 @@ CCECProcessor::CCECProcessor(CLibCEC *controller, CAdapterCommunication *serComm
     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);
@@ -72,12 +71,6 @@ bool CCECProcessor::Start(void)
     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))
@@ -104,7 +97,7 @@ void *CCECProcessor::Process(void)
   cec_command           command;
   CCECAdapterMessage    msg;
 
-  m_communication->SetAckMask(0x1 << (uint8_t)m_iLogicalAddress);
+  SetAckMask(0x1 << (uint8_t)m_iLogicalAddress);
 
   while (!IsStopped())
   {
@@ -170,21 +163,18 @@ void CCECProcessor::LogOutput(const cec_command &data)
   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)
@@ -205,9 +195,9 @@ bool CCECProcessor::SwitchMonitoring(bool bEnable)
 
   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)
@@ -241,13 +231,15 @@ cec_power_status CCECProcessor::GetDevicePowerStatus(cec_logical_address iAddres
 
 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);
@@ -263,9 +255,9 @@ bool CCECProcessor::Transmit(const cec_command &data)
       }
     }
 
-    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
@@ -312,7 +304,8 @@ bool CCECProcessor::WaitForTransmitSucceeded(uint8_t iLength, uint32_t iTimeout
     switch(msg.message())
     {
     case MSGCODE_COMMAND_ACCEPTED:
-      iPacketsLeft--;
+      if (iPacketsLeft > 0)
+        iPacketsLeft--;
       break;
     case MSGCODE_TRANSMIT_SUCCEEDED:
       bTransmitSucceeded = (iPacketsLeft == 0);
@@ -409,3 +402,26 @@ void CCECProcessor::AddLog(cec_log_level level, const CStdString &strMessage)
 {
   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;
+}
index 8569949cbf0b3805863421c05f3a45d234568260..e2793a3bbcb75621d9b5af0516e61b28038f257f 100644 (file)
@@ -65,11 +65,12 @@ namespace CEC
 
       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);
@@ -80,6 +81,7 @@ namespace CEC
       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);
@@ -93,6 +95,5 @@ namespace CEC
       CAdapterCommunication *m_communication;
       CLibCEC               *m_controller;
       bool                   m_bMonitor;
-      bool                   m_bLogicalAddressSet;
   };
 };