# sudo make install
To install libCEC on Windows:
-* go to /project and execute download-deps.cmd to download Boost.
* open /project/libcec.sln with Visual C++ 2010 or Visual Studio 2010.
* build the project.
* copy libcec.dll and pthreadVC2.dll to your desired destination.
To build an installer on Windows:
* download and install the Windows DDK.
* download and install NSIS.
-* go to /project and execute download-deps.cmd to download Boost.
* go to /project and execute create-installer.cmd to create the installer.
* the installer is stored as /project/libCEC-installer.exe
-AC_INIT([libcec], 0:8:0)
+AC_INIT([libcec], 1:0:0)
AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
AC_PROG_CXX
AC_SUBST([LIBS_DL])
LIBS=$libs_pre_dl
-AC_LANG_PUSH([C++])
-AC_CHECK_HEADERS([boost/shared_ptr.hpp], [],
- [AC_MSG_ERROR(You need the Boost libraries.)])
-AC_CHECK_HEADERS([boost/enable_shared_from_this.hpp], [],
- [AC_MSG_ERROR(You need the Boost libraries.)])
-AC_LANG_POP([C++])
-
CXXFLAGS="-fPIC -Wall -Wextra $CXXFLAGS"
AC_SUBST(REQUIRES)
+libcec (1.0-2) unstable; urgency=low
+
+ * interface changes:
+ * set lib interface version back to 1.0 and rename GetLibVersion() to
+ GetLibVersionMajor() and GetMinVersion() to GetMinLibVersion()
+ * added GetLibVersionMinor()/cec_get_lib_version_minor() and set the minor
+ version number to 1
+ * fixed:
+ * samsung's vendor specific remote keypresses don't send key releases. added
+ call to AddKey() directly after the keypress
+ * always reset the button press time in CLibCEC::AddKey()
+ * always wait for a signal in CCECProcessor::Transmit()
+ * changed:
+ * drop shared_ptr and use a normal pointer. removed boost dependency
+
+ -- Pulse-Eight Packaging <packaging@pulse-eight.com> Fri, 04 Nov 2011 00:14:00 +0100
+
libcec (0.8-2) unstable; urgency=low
* added 'libboost-dev' to build deps
Section: video
Priority: extra
Maintainer: Lars Op den Kamp <lars.opdenkamp@pulse-eight.com>
-Build-Depends: debhelper (>= 7), libudev-dev, mime-support, locales, gawk, autotools-dev, autoconf, automake, pkg-config, libboost-dev
+Build-Depends: debhelper (>= 7), libudev-dev, mime-support, locales, gawk, autotools-dev, autoconf, automake, pkg-config
Standards-Version: 3.8.3
Homepage: http://www.pulse-eight.net/
//@}
/*!
- * @see cec_get_min_version
+ * @see cec_get_min_lib_version
*/
- virtual int8_t GetMinVersion(void) = 0;
+ virtual int8_t GetMinLibVersion(void) const = 0;
/*!
- * @see cec_get_lib_version
+ * @see cec_get_lib_version_major
*/
- virtual int8_t GetLibVersion(void) = 0;
+ virtual int8_t GetLibVersionMajor(void) const = 0;
+
+ /*!
+ * @see cec_get_lib_version_minor
+ */
+ virtual int8_t GetLibVersionMinor(void) const = 0;
/*!
* @see cec_get_next_log_message
/*!
* @return Get the minimal version of libcec that this version of libcec can interface with.
*/
-extern DECLSPEC int8_t cec_get_min_version(void);
+extern DECLSPEC int8_t cec_get_min_lib_version(void);
/*!
- * @return Get the version of libcec.
+ * @return Get the major version of libcec.
*/
-extern DECLSPEC int8_t cec_get_lib_version(void);
+extern DECLSPEC int8_t cec_get_lib_version_major(void);
+
+/*!
+ * @return Get the minor version of libcec.
+ */
+extern DECLSPEC int8_t cec_get_lib_version_minor(void);
/*!
* @brief Power on the connected CEC capable devices.
#define MSGEND 0xFE
#define MSGESC 0xFD
#define ESCOFFSET 3
-#define CEC_MIN_VERSION 8
-#define CEC_LIB_VERSION 8
#define CEC_BUTTON_TIMEOUT 500
+#define CEC_MIN_LIB_VERSION 1
+#define CEC_LIB_VERSION_MAJOR 1
+#define CEC_LIB_VERSION_MINOR 0
+
#ifdef __cplusplus
};
};
+++ /dev/null
-@echo off
-
-echo Downloading boost
-bin\wget.exe "http://mirrors.xbmc.org/build-deps/win32/boost-1_46_1-xbmc-win32.7z"
-
-echo Extracting boost
-bin\7za.exe x -y "boost-1_46_1-xbmc-win32.7z"
-
-echo Copying boost
-xcopy boost-1_46_1-xbmc-win32\include\* "..\include\" /E /Q /I /Y
-
-echo Cleaning up
-del boost-1_46_1-xbmc-win32.7z
<ClInclude Include="..\src\lib\platform\windows\os_windows.h" />
<ClInclude Include="..\src\lib\util\buffer.h" />
<ClInclude Include="..\src\lib\util\StdString.h" />
+ <ClInclude Include="resource.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\src\lib\AdapterCommunication.cpp" />
<ClCompile Include="..\src\lib\platform\windows\os_windows.cpp" />
<ClCompile Include="..\src\lib\platform\windows\serialport.cpp" />
</ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="libcec.rc" />
+ </ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{C04B0FB1-667D-4F1C-BDAE-A07CDFFAAAA0}</ProjectGuid>
<RootNamespace>libcec</RootNamespace>
<TargetExt>.dll</TargetExt>
<ExtensionsToDeleteOnClean>*.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.xml;*.dll</ExtensionsToDeleteOnClean>
<IncludePath>$(SolutionDir)..\include;$(IncludePath)</IncludePath>
+ <LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<OutputFile>$(SolutionDir)..\libcec.dll</OutputFile>
<AdditionalDependencies>%(AdditionalDependencies);setupapi.lib;$(SolutionDir)..\src\lib\platform\pthread_win32\pthreadVC2.lib</AdditionalDependencies>
<IgnoreSpecificDefaultLibraries>libcmtd</IgnoreSpecificDefaultLibraries>
- <Version>8</Version>
+ <Version>
+ </Version>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutputFile>$(SolutionDir)..\libcec.dll</OutputFile>
<AdditionalDependencies>%(AdditionalDependencies);setupapi.lib;$(SolutionDir)..\src\lib\platform\pthread_win32\pthreadVC2.lib</AdditionalDependencies>
<IgnoreSpecificDefaultLibraries>libcmt</IgnoreSpecificDefaultLibraries>
- <Version>8</Version>
+ <Version>
+ </Version>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ClInclude Include="..\src\lib\devices\CECBusDevice.h">
<Filter>devices</Filter>
</ClInclude>
+ <ClInclude Include="resource.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\src\lib\AdapterCommunication.cpp" />
<Filter>devices</Filter>
</ClCompile>
</ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="libcec.rc" />
+ </ItemGroup>
</Project>
\ No newline at end of file
<TargetName>cec-client</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <LinkIncremental>false</LinkIncremental>
+ <LinkIncremental>true</LinkIncremental>
<OutDir>$(SolutionDir)..\</OutDir>
<TargetName>cec-client</TargetName>
</PropertyGroup>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>$(ProjectDir)..\src\lib\platform\pthread_win32\pthreadVC2.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(SolutionDir)..\cec-client.exe</OutputFile>
- <Version>8</Version>
+ <Version>
+ </Version>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>$(ProjectDir)..\src\lib\platform\pthread_win32\pthreadVC2.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <Version>8</Version>
+ <Version>
+ </Version>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="..\src\lib\platform\threads.h" />
<ClInclude Include="..\src\lib\platform\windows\os_windows.h" />
<ClInclude Include="..\src\lib\util\StdString.h" />
+ <ClInclude Include="resource1.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\src\lib\platform\threads.cpp" />
<ClCompile Include="..\src\lib\platform\windows\os_windows.cpp" />
<ClCompile Include="..\src\testclient\main.cpp" />
</ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="testclient.rc" />
+ </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<ClInclude Include="..\include\cecloader.h">
<Filter>Header Files</Filter>
</ClInclude>
+ <ClInclude Include="resource1.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\src\testclient\main.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="testclient.rc">
+ <Filter>Resource Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
</Project>
\ No newline at end of file
ReadFromDevice(500);
Sleep(5);
WriteNextCommand();
- Sleep(5);
}
return NULL;
void CAdapterCommunication::WriteNextCommand(void)
{
- CCECAdapterMessagePtr msg;
+ CCECAdapterMessage *msg;
if (m_outBuffer.Pop(msg))
{
CLockObject lock(&msg->mutex);
}
}
-bool CAdapterCommunication::Write(CCECAdapterMessagePtr data)
+bool CAdapterCommunication::Write(CCECAdapterMessage *data)
{
data->state = ADAPTER_MESSAGE_STATE_WAITING;
m_outBuffer.Push(data);
bool CAdapterCommunication::StartBootloader(void)
{
+ bool bReturn(false);
if (!IsRunning())
- return false;
+ return bReturn;
m_controller->AddLog(CEC_LOG_DEBUG, "starting the bootloader");
- CCECAdapterMessagePtr output(new CCECAdapterMessage);
+ CCECAdapterMessage *output = new CCECAdapterMessage;
output->push_back(MSGSTART);
output->push_escaped(MSGCODE_START_BOOTLOADER);
output->push_back(MSGEND);
- if (!Write(output))
- {
+ if ((bReturn = Write(output)) == false)
m_controller->AddLog(CEC_LOG_ERROR, "could not start the bootloader");
- return false;
- }
- m_controller->AddLog(CEC_LOG_DEBUG, "bootloader start command transmitted");
- return true;
+
+ delete output;
+
+ return bReturn;
}
bool CAdapterCommunication::PingAdapter(void)
{
+ bool bReturn(false);
if (!IsRunning())
- return false;
+ return bReturn;
m_controller->AddLog(CEC_LOG_DEBUG, "sending ping");
- CCECAdapterMessagePtr output(new CCECAdapterMessage);
+ CCECAdapterMessage *output = new CCECAdapterMessage;
output->push_back(MSGSTART);
output->push_escaped(MSGCODE_PING);
output->push_back(MSGEND);
- if (!Write(output))
- {
+ if ((bReturn = Write(output)) == false)
m_controller->AddLog(CEC_LOG_ERROR, "could not send ping command");
- return false;
- }
-
- m_controller->AddLog(CEC_LOG_DEBUG, "ping tranmitted");
// TODO check for pong
- return true;
+ delete output;
+
+ return bReturn;
}
bool CAdapterCommunication::IsOpen(void) const
#include "util/buffer.h"
#include "util/StdString.h"
#include <string>
-#include <boost/enable_shared_from_this.hpp>
-#include <boost/shared_ptr.hpp>
namespace CEC
{
} cec_adapter_message_state;
- class CCECAdapterMessage : public boost::enable_shared_from_this<CCECAdapterMessage>
+ class CCECAdapterMessage
{
public:
CCECAdapterMessage(void) { clear(); }
CMutex mutex;
CCondition condition;
};
- typedef boost::shared_ptr<CCECAdapterMessage> CCECAdapterMessagePtr;
class CSerialPort;
class CLibCEC;
bool Open(const char *strPort, uint16_t iBaudRate = 38400, uint32_t iTimeoutMs = 10000);
bool Read(CCECAdapterMessage &msg, uint32_t iTimeout = 1000);
- bool Write(CCECAdapterMessagePtr data);
+ bool Write(CCECAdapterMessage *data);
bool PingAdapter(void);
void Close(void);
bool IsOpen(void) const;
CSerialPort * m_port;
CLibCEC * m_controller;
CecBuffer<uint8_t> m_inBuffer;
- CecBuffer<CCECAdapterMessagePtr> m_outBuffer;
+ CecBuffer<CCECAdapterMessage *> m_outBuffer;
CMutex m_mutex;
CCondition m_rcvCondition;
CCondition m_startCondition;
bool CCECProcessor::Transmit(const cec_command &data)
{
+ bool bReturn(false);
LogOutput(data);
- CCECAdapterMessagePtr output(new CCECAdapterMessage(data));
- return Transmit(output);
+ CCECAdapterMessage *output = new CCECAdapterMessage(data);
+ bReturn = Transmit(output);
+ delete output;
+
+ return bReturn;
}
-bool CCECProcessor::Transmit(CCECAdapterMessagePtr output)
+bool CCECProcessor::Transmit(CCECAdapterMessage *output)
{
bool bReturn(false);
CLockObject lock(&m_mutex);
return bReturn;
else
{
- output->condition.Wait(&output->mutex, 1000);
+ output->condition.Wait(&output->mutex);
if (output->state != ADAPTER_MESSAGE_STATE_SENT)
{
m_controller->AddLog(CEC_LOG_ERROR, "command was not sent");
m_controller->AddCommand(command);
}
+void CCECProcessor::AddKey(cec_keypress &key)
+{
+ m_controller->AddKey(key);
+}
+
void CCECProcessor::AddKey(void)
{
m_controller->AddKey();
bool CCECProcessor::SetAckMask(uint16_t iMask)
{
+ bool bReturn(false);
CStdString strLog;
strLog.Format("setting ackmask to %2x", iMask);
m_controller->AddLog(CEC_LOG_DEBUG, strLog.c_str());
- CCECAdapterMessagePtr output(new CCECAdapterMessage);
+ CCECAdapterMessage *output = new CCECAdapterMessage;
output->push_back(MSGSTART);
output->push_escaped(MSGCODE_SET_ACK_MASK);
output->push_escaped((uint8_t)iMask);
output->push_back(MSGEND);
- if (!Transmit(output))
- {
+ if ((bReturn = Transmit(output)) == false)
m_controller->AddLog(CEC_LOG_ERROR, "could not set the ackmask");
- return false;
- }
- return true;
+ delete output;
+
+ return bReturn;
}
virtual bool SwitchMonitoring(bool bEnable);
virtual bool Transmit(const cec_command &data);
- virtual bool Transmit(CCECAdapterMessagePtr output);
+ virtual bool Transmit(CCECAdapterMessage *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);
virtual void AddCommand(const cec_command &command);
+ virtual void AddKey(cec_keypress &key);
virtual void AddKey(void);
virtual void AddLog(cec_log_level level, const CStdString &strMessage);
{
Close();
delete m_cec;
- m_cec = NULL;
-
delete m_comm;
- m_comm = NULL;
-
- m_logBuffer.Clear();
- m_keyBuffer.Clear();
- m_commandBuffer.Clear();
}
bool CLibCEC::Open(const char *strPort, uint32_t iTimeoutMs /* = 10000 */)
return m_comm ? m_comm->StartBootloader() : false;
}
-int8_t CLibCEC::GetMinVersion(void)
-{
- return CEC_MIN_VERSION;
-}
-
-int8_t CLibCEC::GetLibVersion(void)
-{
- return CEC_LIB_VERSION;
-}
-
bool CLibCEC::GetNextLogMessage(cec_log_message *message)
{
return (m_logBuffer.Pop(*message));
}
}
+void CLibCEC::AddKey(cec_keypress &key)
+{
+ m_keyBuffer.Push(key);
+ m_iCurrentButton = CEC_USER_CONTROL_CODE_UNKNOWN;
+ m_buttontime = 0;
+}
+
void CLibCEC::AddKey(void)
{
if (m_iCurrentButton != CEC_USER_CONTROL_CODE_UNKNOWN)
key.keycode = m_iCurrentButton;
m_keyBuffer.Push(key);
m_iCurrentButton = CEC_USER_CONTROL_CODE_UNKNOWN;
- m_buttontime = 0;
}
+ m_buttontime = 0;
}
void CLibCEC::AddCommand(const cec_command &command)
virtual bool PingAdapter(void);
virtual bool StartBootloader(void);
- virtual int8_t GetMinVersion(void);
- virtual int8_t GetLibVersion(void);
+ virtual int8_t GetMinLibVersion(void) const{ return CEC_MIN_LIB_VERSION; };
+ virtual int8_t GetLibVersionMajor(void) const { return CEC_LIB_VERSION_MAJOR; };
+ virtual int8_t GetLibVersionMinor(void) const { return CEC_LIB_VERSION_MINOR; };
virtual bool GetNextLogMessage(cec_log_message *message);
virtual bool GetNextKeypress(cec_keypress *key);
virtual void AddLog(cec_log_level level, const std::string &strMessage);
virtual void AddKey(void);
+ virtual void AddKey(cec_keypress &key);
virtual void AddCommand(const cec_command &command);
virtual void CheckKeypressTimeout(void);
virtual void SetCurrentButton(cec_user_control_code iButtonCode);
int8_t cec_get_min_version(void)
{
if (cec_parser)
- return cec_parser->GetMinVersion();
+ return cec_parser->GetMinLibVersion();
return -1;
}
-int8_t cec_get_lib_version(void)
+int8_t cec_get_lib_version_major(void)
{
if (cec_parser)
- return cec_parser->GetLibVersion();
+ return cec_parser->GetLibVersionMajor();
+ return -1;
+}
+
+int8_t cec_get_lib_version_minor(void)
+{
+ if (cec_parser)
+ return cec_parser->GetLibVersionMinor();
return -1;
}
{
if (command.parameters.size > 0)
{
- m_busDevice->GetProcessor()->AddKey();
+ cec_keypress key;
+ key.duration = CEC_BUTTON_TIMEOUT;
+ key.keycode = CEC_USER_CONTROL_CODE_UNKNOWN;
- uint8_t iButton = 0;
switch (command.parameters[0])
{
case CEC_AN_USER_CONTROL_CODE_RETURN:
- iButton = CEC_USER_CONTROL_CODE_PREVIOUS_CHANNEL;
+ key.keycode = CEC_USER_CONTROL_CODE_EXIT;
break;
default:
break;
}
- if (iButton > 0 && iButton <= CEC_USER_CONTROL_CODE_MAX)
+ if (key.keycode != CEC_USER_CONTROL_CODE_UNKNOWN)
{
CStdString strLog;
- strLog.Format("key pressed: %1x", iButton);
+ strLog.Format("key pressed: %1x", key.keycode);
m_busDevice->AddLog(CEC_LOG_DEBUG, strLog);
- m_busDevice->GetProcessor()->SetCurrentButton((cec_user_control_code) command.parameters[0]);
+ m_busDevice->GetProcessor()->AddKey(key);
}
}
Close();
}
-int8_t CSerialPort::Write(CCECAdapterMessagePtr data)
+int8_t CSerialPort::Write(CCECAdapterMessage *data)
{
fd_set port;
bool IsOpen();
void Close();
- int8_t Write(CCECAdapterMessagePtr data);
+ int8_t Write(CCECAdapterMessage *data);
int32_t Read(uint8_t* data, uint32_t len, uint64_t iTimeoutMs = 0);
std::string GetError() { return m_error; }
}
}
-int8_t CSerialPort::Write(CCECAdapterMessagePtr data)
+int8_t CSerialPort::Write(CCECAdapterMessage *data)
{
CLockObject lock(&m_mutex);
DWORD iBytesWritten = 0;
using namespace CEC;
using namespace std;
-#define CEC_TEST_CLIENT_VERSION 8
+#define CEC_TEST_CLIENT_VERSION 1
#include <cecloader.h>
int main (int argc, char *argv[])
{
ICECAdapter *parser = LoadLibCec("CECTester");
- if (!parser || parser->GetMinVersion() > CEC_TEST_CLIENT_VERSION)
+ if (!parser || parser->GetMinLibVersion() > CEC_TEST_CLIENT_VERSION)
{
#ifdef __WINDOWS__
cout << "Cannot load libcec.dll" << endl;
return 1;
}
CStdString strLog;
- strLog.Format("CEC Parser created - libcec version %d", parser->GetLibVersion());
+ strLog.Format("CEC Parser created - libcec version %d.%d", parser->GetLibVersionMajor(), parser->GetLibVersionMinor());
cout << strLog.c_str() << endl;
//make stdin non-blocking