cec: added SetDeckControlMode() and SetDeckInfo(). handle deck related opcodes. proba...
authorLars Op den Kamp <lars@opdenkamp.eu>
Fri, 11 Nov 2011 00:45:57 +0000 (01:45 +0100)
committerLars Op den Kamp <lars@opdenkamp.eu>
Fri, 11 Nov 2011 00:54:42 +0000 (01:54 +0100)
include/cec.h
include/cectypes.h
src/lib/CECProcessor.cpp
src/lib/CECProcessor.h
src/lib/LibCEC.cpp
src/lib/LibCEC.h
src/lib/devices/CECPlaybackDevice.cpp
src/lib/devices/CECPlaybackDevice.h
src/lib/implementations/CECCommandHandler.cpp
src/lib/implementations/CECCommandHandler.h

index 8212f17c877accd56ab44b5c7fe516989b32483d..6a8996d4ceb06ee060aebeb424aa80781680335f 100644 (file)
@@ -163,6 +163,20 @@ namespace CEC
      */
     virtual bool SetActiveView(void) = 0;
 
+    /*!
+     * @brief Change the deck control mode, if this adapter is registered as playback device.
+     * @param mode The new control mode.
+     * @return True if set, false otherwise.
+     */
+    virtual bool SetDeckControlMode(cec_deck_control_mode mode) = 0;
+
+    /*!
+     * @brief Change the deck info, if this adapter is a playback device.
+     * @param info The new deck info.
+     * @return True if set, false otherwise.
+     */
+    virtual bool SetDeckInfo(cec_deck_info info) = 0;
+
     /*!
      * @brief Broadcast a message that notifies connected CEC capable devices that this device is no longer the active source.
      * @return True when the command was sent succesfully, false otherwise.
index 65225b8b8bfdc47f778e3004a9792262dee9dc87..4e5413e46506aba88634be84d0f12a3faca322f4 100644 (file)
@@ -117,10 +117,10 @@ typedef enum cec_channel_identifier
 
 typedef enum cec_deck_control_mode
 {
-  CEC_DESK_CONTROL_MODE_SKIP_FORWARD_WIND = 1,
-  CEC_DESK_CONTROL_MODE_SKIP_REVERSE_REWIND = 2,
-  CEC_DESK_CONTROL_MODE_STOP = 3,
-  CEC_DESK_CONTROL_MODE_EJECT = 4
+  CEC_DECK_CONTROL_MODE_SKIP_FORWARD_WIND = 1,
+  CEC_DECK_CONTROL_MODE_SKIP_REVERSE_REWIND = 2,
+  CEC_DECK_CONTROL_MODE_STOP = 3,
+  CEC_DECK_CONTROL_MODE_EJECT = 4
 } cec_deck_control_mode;
 
 typedef enum cec_deck_info
index dce52acdde66b35c7df84bd7407b570980960e81..d094be1341b943d967fd7d598191b5247407642a 100644 (file)
@@ -319,6 +319,34 @@ bool CCECProcessor::SetActiveView(void)
   return SetActiveSource();
 }
 
+bool CCECProcessor::SetDeckControlMode(cec_deck_control_mode mode)
+{
+  bool bReturn(false);
+
+  CCECBusDevice *device = GetDeviceByType(CEC_DEVICE_TYPE_PLAYBACK_DEVICE);
+  if (device)
+  {
+    ((CCECPlaybackDevice *) device)->SetDeckControlMode(mode);
+    bReturn = true;
+  }
+
+  return bReturn;
+}
+
+bool CCECProcessor::SetDeckInfo(cec_deck_info info)
+{
+  bool bReturn(false);
+
+  CCECBusDevice *device = GetDeviceByType(CEC_DEVICE_TYPE_PLAYBACK_DEVICE);
+  if (device)
+  {
+    ((CCECPlaybackDevice *) device)->SetDeckStatus(info);
+    bReturn = true;
+  }
+
+  return bReturn;
+}
+
 bool CCECProcessor::SetStreamPath(uint16_t iStreamPath)
 {
   bool bReturn(false);
@@ -408,7 +436,6 @@ bool CCECProcessor::PollDevice(cec_logical_address iAddress)
   return false;
 }
 
-
 CCECBusDevice *CCECProcessor::GetDeviceByPhysicalAddress(uint16_t iPhysicalAddress) const
 {
   CCECBusDevice *device = NULL;
@@ -425,6 +452,22 @@ CCECBusDevice *CCECProcessor::GetDeviceByPhysicalAddress(uint16_t iPhysicalAddre
   return device;
 }
 
+CCECBusDevice *CCECProcessor::GetDeviceByType(cec_device_type type) const
+{
+  CCECBusDevice *device = NULL;
+
+  for (unsigned int iPtr = 0; iPtr < 16; iPtr++)
+  {
+    if (m_busDevices[iPtr]->m_type == type)
+    {
+      device = m_busDevices[iPtr];
+      break;
+    }
+  }
+
+  return device;
+}
+
 cec_version CCECProcessor::GetDeviceCecVersion(cec_logical_address iAddress)
 {
   return m_busDevices[iAddress]->GetCecVersion();
index b166b5f55879f9fb680526cc686e0352d83d0bce..a0192f24d451c9b39c03d5ad4fd76a3ad91ccf9b 100644 (file)
@@ -58,6 +58,7 @@ namespace CEC
 
       virtual bool                  IsMonitoring(void) const { return m_bMonitor; }
       virtual CCECBusDevice *       GetDeviceByPhysicalAddress(uint16_t iPhysicalAddress) const;
+      virtual CCECBusDevice *       GetDeviceByType(cec_device_type type) const;
       virtual cec_version           GetDeviceCecVersion(cec_logical_address iAddress);
       virtual bool                  GetDeviceMenuLanguage(cec_logical_address iAddress, cec_menu_language *language);
       virtual const std::string &   GetDeviceName(void) { return m_strDeviceName; }
@@ -70,6 +71,8 @@ namespace CEC
 
       virtual bool SetActiveView(void);
       virtual bool SetActiveSource(cec_device_type type = CEC_DEVICE_TYPE_RESERVED);
+      virtual bool SetDeckControlMode(cec_deck_control_mode mode);
+      virtual bool SetDeckInfo(cec_deck_info info);
       virtual bool SetInactiveView(void);
       virtual bool SetLogicalAddress(cec_logical_address iLogicalAddress);
       virtual bool SetPhysicalAddress(uint16_t iPhysicalAddress);
index 0959beb57ec98adc3801769e8b56da4fa33b26fa..a226d41e1ddf8263feac02dc9c406dba9a601cbb 100644 (file)
@@ -186,6 +186,16 @@ bool CLibCEC::SetActiveView(void)
   return m_cec ? m_cec->SetActiveView() : false;
 }
 
+bool CLibCEC::SetDeckControlMode(cec_deck_control_mode mode)
+{
+  return m_cec ? m_cec->SetDeckControlMode(mode) : false;
+}
+
+bool CLibCEC::SetDeckInfo(cec_deck_info info)
+{
+  return m_cec ? m_cec->SetDeckInfo(info) : false;
+}
+
 bool CLibCEC::SetInactiveView(void)
 {
   return m_cec ? m_cec->SetInactiveView() : false;
index b3477e1068d166c648be485aed6a6aeec9f2ccc8..3982420f9d92f9213930acf232aedc5a1ee912e1 100644 (file)
@@ -73,6 +73,8 @@ namespace CEC
       virtual bool StandbyDevices(cec_logical_address address = CECDEVICE_BROADCAST);
       virtual bool SetActiveView(void);
       virtual bool SetActiveSource(cec_device_type type = CEC_DEVICE_TYPE_RESERVED);
+      virtual bool SetDeckControlMode(cec_deck_control_mode mode);
+      virtual bool SetDeckInfo(cec_deck_info info);
       virtual bool SetInactiveView(void);
       virtual bool SetOSDString(cec_logical_address iLogicalAddress, cec_display_control duration, const char *strMessage);
       virtual bool SwitchMonitoring(bool bEnable);
index ef6f00b382c41876b7287179b0ec202365f5dc2a..cee7c492e72f4c4f5c6b976ae7c508f1989d2767 100644 (file)
@@ -38,7 +38,8 @@ using namespace CEC;
 
 CCECPlaybackDevice::CCECPlaybackDevice(CCECProcessor *processor, cec_logical_address address, uint16_t iPhysicalAddress /* = 0 */) :
     CCECBusDevice(processor, address, iPhysicalAddress),
-    m_deckStatus(CEC_DECK_INFO_NO_MEDIA)
+    m_deckStatus(CEC_DECK_INFO_STOP),
+    m_deckControlMode(CEC_DECK_CONTROL_MODE_STOP)
 {
   m_type = CEC_DEVICE_TYPE_PLAYBACK_DEVICE;
 }
@@ -55,13 +56,27 @@ void CCECPlaybackDevice::SetDeckStatus(cec_deck_info deckStatus)
   }
 }
 
+void CCECPlaybackDevice::SetDeckControlMode(cec_deck_control_mode mode)
+{
+  if (m_deckControlMode != mode)
+  {
+    CStdString strLog;
+    strLog.Format(">> %s (%X): deck control mode changed from '%s' to '%s'", GetLogicalAddressName(), m_iLogicalAddress, CCECCommandHandler::ToString(m_deckControlMode), CCECCommandHandler::ToString(mode));
+    AddLog(CEC_LOG_DEBUG, strLog.c_str());
+
+    m_deckControlMode = mode;
+  }
+}
+
 bool CCECPlaybackDevice::TransmitDeckStatus(cec_logical_address dest)
 {
-  // need to support opcodes play and deck control before doing anything with this
   CStdString strLog;
-  strLog.Format("<< %s (%X) -> %s (%X): deck status feature abort", GetLogicalAddressName(), m_iLogicalAddress, CCECCommandHandler::ToString(dest), dest);
+  strLog.Format("<< %s (%X) -> %s (%X): deck status '%s'", GetLogicalAddressName(), m_iLogicalAddress, CCECCommandHandler::ToString(dest), dest, CCECCommandHandler::ToString(m_deckStatus));
   AddLog(CEC_LOG_NOTICE, strLog);
 
-  m_processor->TransmitAbort(dest, CEC_OPCODE_GIVE_DECK_STATUS);
-  return false;
+  cec_command command;
+  cec_command::format(command, m_iLogicalAddress, dest, CEC_OPCODE_GIVE_DECK_STATUS);
+  command.push_back((uint8_t)m_deckStatus);
+
+  return m_processor->Transmit(command);
 }
index 24ce072af0e423fba722c7b5b3f393bbe1624724..db504f7c6d673318568f5a82ec68289eb182f16d 100644 (file)
@@ -42,12 +42,15 @@ namespace CEC
     virtual ~CCECPlaybackDevice(void) {};
 
     virtual cec_deck_info GetDeckStatus(void) const { return m_deckStatus; };
+    virtual cec_deck_control_mode GetDeckControlMode(void) const { return m_deckControlMode; };
 
     virtual void SetDeckStatus(cec_deck_info deckStatus);
+    virtual void SetDeckControlMode(cec_deck_control_mode mode);
 
     virtual bool TransmitDeckStatus(cec_logical_address dest);
 
   protected:
-    cec_deck_info m_deckStatus;
+    cec_deck_info         m_deckStatus;
+    cec_deck_control_mode m_deckControlMode;
   };
 }
index b52b8aa95fe774bc86bc7f56ed20e97f986e41f8..7785ef64091670b0da52fd78c45e76dfb1a3801e 100644 (file)
@@ -85,6 +85,9 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command)
     case CEC_OPCODE_GIVE_DECK_STATUS:
       HandleGiveDeckStatus(command);
       break;
+    case CEC_OPCODE_DECK_CONTROL:
+      HandleDeckControl(command);
+      break;
     case CEC_OPCODE_MENU_REQUEST:
       HandleMenuRequest(command);
       break;
@@ -182,6 +185,18 @@ bool CCECCommandHandler::HandleActiveSource(const cec_command &command)
   return true;
 }
 
+bool CCECCommandHandler::HandleDeckControl(const cec_command &command)
+{
+  CCECBusDevice *device = GetDevice(command.destination);
+  if (device && device->GetType() == CEC_DEVICE_TYPE_PLAYBACK_DEVICE && command.parameters.size > 0)
+  {
+    ((CCECPlaybackDevice *) device)->SetDeckControlMode((cec_deck_control_mode) command.parameters[0]);
+    return true;
+  }
+
+  return false;
+}
+
 bool CCECCommandHandler::HandleDeviceCecVersion(const cec_command &command)
 {
   if (command.parameters.size == 1)
@@ -540,6 +555,23 @@ const char *CCECCommandHandler::ToString(const cec_logical_address address)
   }
 }
 
+const char *CCECCommandHandler::ToString(const cec_deck_control_mode mode)
+{
+  switch (mode)
+  {
+  case CEC_DECK_CONTROL_MODE_SKIP_FORWARD_WIND:
+    return "skip forward wind";
+  case CEC_DECK_CONTROL_MODE_EJECT:
+    return "eject";
+  case CEC_DECK_CONTROL_MODE_SKIP_REVERSE_REWIND:
+    return "reverse rewind";
+  case CEC_DECK_CONTROL_MODE_STOP:
+    return "stop";
+  default:
+    return "unknown";
+  }
+}
+
 const char *CCECCommandHandler::ToString(const cec_deck_info status)
 {
   switch (status)
index 7185ede9a30eee2a014dcb6d78070ffa4cd54346..16095f649dd8ff0e10bbfee10d5686d64999a6c4 100644 (file)
@@ -47,6 +47,7 @@ namespace CEC
     virtual bool HandleCommand(const cec_command &command);
     virtual cec_vendor_id GetVendorId(void) { return CEC_VENDOR_UNKNOWN; };
 
+    static const char *ToString(const cec_deck_control_mode mode);
     static const char *ToString(const cec_version version);
     static const char *ToString(const cec_power_status status);
     static const char *ToString(const cec_deck_info status);
@@ -55,6 +56,7 @@ namespace CEC
 
   protected:
     virtual bool HandleActiveSource(const cec_command &command);
+    virtual bool HandleDeckControl(const cec_command &command);
     virtual bool HandleDeviceCecVersion(const cec_command &command);
     virtual bool HandleDeviceVendorCommandWithId(const cec_command &command);
     virtual bool HandleDeviceVendorId(const cec_command &command);