cec: include the ack timeout in the cec_command struct
authorLars Op den Kamp <lars@opdenkamp.eu>
Sun, 30 Oct 2011 09:44:17 +0000 (10:44 +0100)
committerLars Op den Kamp <lars@opdenkamp.eu>
Sun, 30 Oct 2011 09:44:17 +0000 (10:44 +0100)
include/cec.h
include/cecc.h
include/cectypes.h
src/lib/CECProcessor.cpp
src/lib/CECProcessor.h
src/lib/LibCEC.cpp
src/lib/LibCEC.h
src/lib/LibCECC.cpp
src/lib/devices/CECBusDevice.cpp
src/testclient/main.cpp

index 63564555564dfb46bbf64f8efc280c38d2a00d1e..69f1941e8fdb77cd208cc8e68506f1d96b8dd397 100644 (file)
@@ -98,7 +98,7 @@ namespace CEC
     /*!
      * @see cec_transmit
      */
-    virtual bool Transmit(const cec_command &data, bool bWaitForAck = true) = 0;
+    virtual bool Transmit(const cec_command &data) = 0;
 
     /*!
      * @see cec_set_logical_address
index 1c9a987ac56d08f12e07ef287a7e7aa6b675a0fa..c069b140dbd75da2d65d9fbec2f6c5d8c44e581e 100644 (file)
@@ -175,13 +175,12 @@ extern DECLSPEC int cec_get_next_command(cec_command *command);
 /*!
  * @brief Transmit a frame on the CEC line.
  * @param data The frame to send.
- * @param bWaitForAck Wait for an ACK message for 1 second after this frame has been sent.
  * @return True when the data was sent and acked, false otherwise.
  */
 #ifdef __cplusplus
-extern DECLSPEC int cec_transmit(const CEC::cec_command &data, int bWaitForAck = 1);
+extern DECLSPEC int cec_transmit(const CEC::cec_command &data);
 #else
-extern DECLSPEC int cec_transmit(const cec_command &data, int bWaitForAck = 1);
+extern DECLSPEC int cec_transmit(const cec_command &data);
 #endif
 
 /*!
index c08c64d4d4bdcb2d462a1083f4fc13b86e866856..7fa70c7897034c3a8a5fcab34f5825c314c32644 100644 (file)
@@ -634,6 +634,7 @@ typedef struct cec_command
   cec_opcode          opcode;
   cec_datapacket      parameters;
   int8_t              opcode_set;
+  int32_t             ack_timeout;
 
 #ifdef __cplusplus
   static void format(cec_command &command, cec_logical_address initiator, cec_logical_address destination, cec_opcode opcode)
@@ -643,6 +644,7 @@ typedef struct cec_command
     command.destination = destination;
     command.opcode      = opcode;
     command.opcode_set  = 1;
+    command.ack_timeout = 1000;
   }
 
   void push_back(uint8_t data)
@@ -669,6 +671,7 @@ typedef struct cec_command
     eom         = 0;
     opcode_set  = 0;
     opcode      = CEC_OPCODE_FEATURE_ABORT;
+    ack_timeout = 1000;
     parameters.clear();
   };
 #endif
index 1bc4c597854ad6475dc6557a67429445fa5a1813..f7634512e3b6d10636023bb68019f956aba4b033 100644 (file)
@@ -187,7 +187,7 @@ bool CCECProcessor::SwitchMonitoring(bool bEnable)
     return m_communication && m_communication->SetAckMask(0x1 << (uint8_t)m_iLogicalAddress);
 }
 
-bool CCECProcessor::Transmit(const cec_command &data, bool bWaitForAck /* = true */)
+bool CCECProcessor::Transmit(const cec_command &data)
 {
   bool bReturn(false);
   LogOutput(data);
@@ -210,10 +210,10 @@ bool CCECProcessor::Transmit(const cec_command &data, bool bWaitForAck /* = true
     }
   }
 
-  if (bWaitForAck)
+  if (data.ack_timeout > 0)
   {
     bool bError(false);
-    if ((bReturn = WaitForAck(&bError, output->size(), 1000)) == false)
+    if ((bReturn = WaitForAck(&bError, output->size(), data.ack_timeout)) == false)
       m_controller->AddLog(CEC_LOG_ERROR, "did not receive ack");
   }
   else
index bd616df6edb598b48e0fd62b6319e8679c606941..0d8a21f188e9b961960eaf73956c1bae0bd81022 100644 (file)
@@ -57,7 +57,7 @@ namespace CEC
 
       virtual bool SetActiveView(void);
       virtual bool SetInactiveView(void);
-      virtual bool Transmit(const cec_command &data, bool bWaitForAck = true);
+      virtual bool Transmit(const cec_command &data);
       virtual bool SetLogicalAddress(cec_logical_address iLogicalAddress);
       virtual bool SetPhysicalAddress(uint16_t iPhysicalAddress);
       virtual bool SwitchMonitoring(bool bEnable);
index ab252906686d020538e98649a29561e67f7316ae..bf5de8a9e969b0c06730290c022ff4bd39f63fe0 100644 (file)
@@ -159,9 +159,9 @@ bool CLibCEC::GetNextCommand(cec_command *command)
   return m_commandBuffer.Pop(*command);
 }
 
-bool CLibCEC::Transmit(const cec_command &data, bool bWaitForAck /* = true */)
+bool CLibCEC::Transmit(const cec_command &data)
 {
-  return m_cec ? m_cec->Transmit(data, bWaitForAck) : false;
+  return m_cec ? m_cec->Transmit(data) : false;
 }
 
 bool CLibCEC::SetLogicalAddress(cec_logical_address iLogicalAddress)
index d0147d8e4f2a762b60f4938d207116f4bdc88a10..8873ff94b3898399572b0296c4dcc6b8df51b9a8 100644 (file)
@@ -63,7 +63,7 @@ namespace CEC
       virtual bool GetNextKeypress(cec_keypress *key);
       virtual bool GetNextCommand(cec_command *command);
 
-      virtual bool Transmit(const cec_command &data, bool bWaitForAck = true);
+      virtual bool Transmit(const cec_command &data);
       virtual bool SetLogicalAddress(cec_logical_address iLogicalAddress = CECDEVICE_PLAYBACKDEVICE1);
       virtual bool SetPhysicalAddress(uint16_t iPhysicalAddress = CEC_DEFAULT_PHYSICAL_ADDRESS);
 
index 79157658df088d7231b6a0e4ad838bea45746f6c..1f8416b0d573064c7811171ef75800be2307528b 100644 (file)
@@ -124,10 +124,10 @@ int cec_get_next_command(cec_command *command)
   return -1;
 }
 
-int cec_transmit(const CEC::cec_command &data, int bWaitForAck /* = true */)
+int cec_transmit(const CEC::cec_command &data)
 {
   if (cec_parser)
-    return cec_parser->Transmit(data, bWaitForAck == 1) ? 1 : 0;
+    return cec_parser->Transmit(data) ? 1 : 0;
   return -1;
 }
 
index 5086e8b36f55240c4b5a764a972c7eb6a7d014de..75862b702179f2ad0314c9d348e8e15db8dfcfdc 100644 (file)
@@ -139,7 +139,8 @@ void CCECBusDevice::PollVendorId(void)
 
     cec_command command;
     cec_command::format(command, GetMyLogicalAddress(), GetLogicalAddress(), CEC_OPCODE_GIVE_DEVICE_VENDOR_ID);
-    m_processor->Transmit(command, false);
+    command.ack_timeout = 0;
+    m_processor->Transmit(command);
   }
 }
 
index 867501d55041f1e68ecc4e28bc9cb6d4c8ccf2cb..9cb32bf167849d06a829aa5256a421a8ff31629b 100644 (file)
@@ -404,7 +404,10 @@ int main (int argc, char *argv[])
           while (GetWord(input, strvalue) && HexStrToInt(strvalue, ivalue))
             bytes.push_back(ivalue);
 
-          parser->Transmit(bytes, command == "tx");
+          if (command == "txn")
+            bytes.ack_timeout = 0;
+
+          parser->Transmit(bytes);
         }
         else if (command == "on")
         {