/*
* This file is part of the libCEC(R) library.
*
- * libCEC(R) is Copyright (C) 2011 Pulse-Eight Limited. All rights reserved.
+ * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited. All rights reserved.
* libCEC(R) is an original work, containing original code.
*
* libCEC(R) is a trademark of Pulse-Eight Limited.
#include "LibCEC.h"
-#include "adapter/AdapterCommunication.h"
-#include "adapter/AdapterDetection.h"
+#include "adapter/USBCECAdapterDetection.h"
#include "CECProcessor.h"
#include "devices/CECBusDevice.h"
-#include "platform/timeutils.h"
+#include "platform/util/timeutils.h"
+#include "platform/util/StdString.h"
using namespace std;
using namespace CEC;
strDebug.Format("trying to autodetect all CEC adapters");
AddLog(CEC_LOG_DEBUG, strDebug);
- return CAdapterDetection::FindAdapters(deviceList, iBufSize, strDevicePath);
+ return CUSBCECAdapterDetection::FindAdapters(deviceList, iBufSize, strDevicePath);
}
bool CLibCEC::PingAdapter(void)
void CLibCEC::AddKey(cec_keypress &key)
{
- CLockObject lock(m_mutex);
- if (m_callbacks)
- m_callbacks->CBCecKeyPress(m_cbParam, key);
+ CLibCEC *instance = CLibCEC::GetInstance();
+ CLockObject lock(instance->m_mutex);
+
+ AddLog(CEC_LOG_DEBUG, "key pressed: %1x", key.keycode);
+
+ if (instance->m_callbacks)
+ instance->m_callbacks->CBCecKeyPress(instance->m_cbParam, key);
else
- m_keyBuffer.Push(key);
- m_iCurrentButton = CEC_USER_CONTROL_CODE_UNKNOWN;
- m_buttontime = 0;
+ instance->m_keyBuffer.Push(key);
+
+ instance->m_iCurrentButton = key.duration > 0 ? CEC_USER_CONTROL_CODE_UNKNOWN : key.keycode;
+ instance->m_buttontime = key.duration > 0 ? 0 : GetTimeMs();
+}
+
+void CLibCEC::SetCurrentButton(cec_user_control_code iButtonCode)
+{
+ /* push keypress to the keybuffer with 0 duration.
+ push another press to the keybuffer with the duration set when the button is released */
+ cec_keypress key;
+ key.duration = 0;
+ key.keycode = iButtonCode;
+
+ AddKey(key);
}
void CLibCEC::AddKey(void)
{
- CLockObject lock(m_mutex);
- if (m_iCurrentButton != CEC_USER_CONTROL_CODE_UNKNOWN)
+ CLibCEC *instance = CLibCEC::GetInstance();
+ CLockObject lock(instance->m_mutex);
+
+ if (instance->m_iCurrentButton != CEC_USER_CONTROL_CODE_UNKNOWN)
{
cec_keypress key;
- key.duration = (unsigned int) (GetTimeMs() - m_buttontime);
- key.keycode = m_iCurrentButton;
+ key.duration = (unsigned int) (GetTimeMs() - instance->m_buttontime);
+ key.keycode = instance->m_iCurrentButton;
+ AddLog(CEC_LOG_DEBUG, "key released: %1x", key.keycode);
- if (m_callbacks)
- m_callbacks->CBCecKeyPress(m_cbParam, key);
+ if (instance->m_callbacks)
+ instance->m_callbacks->CBCecKeyPress(instance->m_cbParam, key);
else
- m_keyBuffer.Push(key);
- m_iCurrentButton = CEC_USER_CONTROL_CODE_UNKNOWN;
+ instance->m_keyBuffer.Push(key);
+ instance->m_iCurrentButton = CEC_USER_CONTROL_CODE_UNKNOWN;
}
- m_buttontime = 0;
+ instance->m_buttontime = 0;
}
void CLibCEC::AddCommand(const cec_command &command)
{
- CLockObject lock(m_mutex);
- if (m_callbacks)
- {
- m_callbacks->CBCecCommand(m_cbParam, command);
- }
- else if (m_commandBuffer.Push(command))
- {
- CStdString strDebug;
- strDebug.Format("stored command '%2x' in the command buffer. buffer size = %d", command.opcode, m_commandBuffer.Size());
- AddLog(CEC_LOG_DEBUG, strDebug);
- }
- else
- {
+ CLibCEC *instance = CLibCEC::GetInstance();
+ CLockObject lock(instance->m_mutex);
+
+ AddLog(CEC_LOG_NOTICE, ">> %s (%X) -> %s (%X): %s (%2X)", instance->m_cec->ToString(command.initiator), command.initiator, instance->m_cec->ToString(command.destination), command.destination, instance->m_cec->ToString(command.opcode), command.opcode);
+
+ if (instance->m_callbacks)
+ instance->m_callbacks->CBCecCommand(instance->m_cbParam, command);
+ else if (!instance->m_commandBuffer.Push(command))
AddLog(CEC_LOG_WARNING, "command buffer is full");
- }
}
void CLibCEC::CheckKeypressTimeout(void)
}
}
-void CLibCEC::SetCurrentButton(cec_user_control_code iButtonCode)
+bool CLibCEC::SetStreamPath(cec_logical_address iAddress)
{
- m_iCurrentButton = iButtonCode;
- m_buttontime = GetTimeMs();
+ uint16_t iPhysicalAddress = GetDevicePhysicalAddress(iAddress);
+ if (iPhysicalAddress != 0xFFFF)
+ return SetStreamPath(iPhysicalAddress);
+ return false;
+}
- /* push keypress to the keybuffer with 0 duration.
- push another press to the keybuffer with the duration set when the button is released */
- cec_keypress key;
- key.duration = 0;
- key.keycode = m_iCurrentButton;
- m_keyBuffer.Push(key);
+bool CLibCEC::SetStreamPath(uint16_t iPhysicalAddress)
+{
+ return m_cec->SetStreamPath(iPhysicalAddress);
}
static CLibCEC *g_libCEC_instance(NULL);