#include <sstream>
#include "../lib/platform/threads.h"
#include "../lib/util/StdString.h"
+#include "../lib/implementations/CECCommandHandler.h"
using namespace CEC;
using namespace std;
" -h --help Shows this help text" << endl <<
" -l --list-devices List all devices on this system" << endl <<
" -t --type {p|r|t|a} The device type to use. More than one is possible." << endl <<
- " -p --physical {hex-address} The physical address to use for the primary logical device." << endl <<
+ " -p --port {int} The HDMI port to use as active source." << endl <<
" -f --log-file {file} Writes all libCEC log message to a file" << endl <<
" -sf --short-log-file {file} Writes all libCEC log message without timestamps" << endl <<
" and log levels to a file." << endl <<
"================================================================================" << endl <<
"Available commands:" << endl <<
endl <<
- "tx {bytes} transfer bytes over the CEC line." << endl <<
- "txn {bytes} transfer bytes but don't wait for transmission ACK." << endl <<
- "[tx 40 00 FF 11 22 33] sends bytes 0x40 0x00 0xFF 0x11 0x22 0x33" << endl <<
- endl <<
- "on {address} power on the device with the given logical address." << endl <<
- "[on 5] power on a connected audio system" << endl <<
- endl <<
- "standby {address} put the device with the given address in standby mode." << endl <<
- "[standby 0] powers off the TV" << endl <<
- endl <<
- "la {logical_address} change the logical address of the CEC adapter." << endl <<
- "[la 4] logical address 4" << endl <<
- endl <<
- "pa {physical_address} change the physical address of the CEC adapter." << endl <<
- "[pa 10 00] physical address 1.0.0.0" << endl <<
- endl <<
- "osd {addr} {string} set OSD message on the specified device." << endl <<
- "[osd 0 Test Message] displays 'Test Message' on the TV" << endl <<
- endl <<
- "ver {addr} get the CEC version of the specified device." << endl <<
- "[ver 0] get the CEC version of the TV" << endl <<
- endl <<
- "ven {addr} get the vendor ID of the specified device." << endl <<
- "[ven 0] get the vendor ID of the TV" << endl <<
- endl <<
- "lang {addr} get the menu language of the specified device." << endl <<
- "[lang 0] get the menu language of the TV" << endl <<
- endl <<
- "pow {addr} get the power status of the specified device." << endl <<
- "[pow 0] get the power status of the TV" << endl <<
- endl <<
- "poll {addr} poll the specified device." << endl <<
- "[poll 0] sends a poll message to the TV" << endl <<
- endl <<
+ "[tx] {bytes} transfer bytes over the CEC line." << endl <<
+ "[txn] {bytes} transfer bytes but don't wait for transmission ACK." << endl <<
+ "[on] {address} power on the device with the given logical address." << endl <<
+ "[standby] {address} put the device with the given address in standby mode." << endl <<
+ "[la] {logical address} change the logical address of the CEC adapter." << endl <<
+ "[p] {port number} change the HDMI port number of the CEC adapter." << endl <<
+ "[pa] {physical address} change the physical address of the CEC adapter." << endl <<
+ "[osd] {addr} {string} set OSD message on the specified device." << endl <<
+ "[ver] {addr} get the CEC version of the specified device." << endl <<
+ "[ven] {addr} get the vendor ID of the specified device." << endl <<
+ "[lang] {addr} get the menu language of the specified device." << endl <<
+ "[pow] {addr} get the power status of the specified device." << endl <<
+ "[name] {addr} get the OSD name of the specified device." << endl <<
+ "[poll] {addr} poll the specified device." << endl <<
+ "[lad] lists active devices on the bus" << endl <<
+ "[ad] {addr} checks whether the specified device is active." << endl <<
+ "[at] {type} checks whether the specified device type is active." << endl <<
+ "[volup] send a volume up command to the amp if present" << endl <<
+ "[voldown] send a volume down command to the amp if present" << endl <<
+ "[mute] send a mute/unmute command to the amp if present" << endl <<
+ "[scan] scan the CEC bus and display device info" << endl <<
"[mon] {1|0} enable or disable CEC bus monitoring." << endl <<
"[log] {1 - 31} change the log level. see cectypes.h for values." << endl <<
"[ping] send a ping command to the CEC adapter." << endl <<
int main (int argc, char *argv[])
{
- int iPhysicalAddress = -1;
+ int8_t iHDMIPort(-1);
cec_device_type_list typeList;
- typeList.Clear();
+ typeList.clear();
int iArgPtr = 1;
bool bSingleCommand(false);
{
if (!bSingleCommand)
cout << "== using device type 'playback device'" << endl;
- typeList.Add(CEC_DEVICE_TYPE_PLAYBACK_DEVICE);
+ typeList.add(CEC_DEVICE_TYPE_PLAYBACK_DEVICE);
}
else if (!strcmp(argv[iArgPtr + 1], "r"))
{
if (!bSingleCommand)
cout << "== using device type 'recording device'" << endl;
- typeList.Add(CEC_DEVICE_TYPE_RECORDING_DEVICE);
+ typeList.add(CEC_DEVICE_TYPE_RECORDING_DEVICE);
}
else if (!strcmp(argv[iArgPtr + 1], "t"))
{
if (!bSingleCommand)
cout << "== using device type 'tuner'" << endl;
- typeList.Add(CEC_DEVICE_TYPE_TUNER);
+ typeList.add(CEC_DEVICE_TYPE_TUNER);
}
else if (!strcmp(argv[iArgPtr + 1], "a"))
{
if (!bSingleCommand)
cout << "== using device type 'audio system'" << endl;
- typeList.Add(CEC_DEVICE_TYPE_AUDIO_SYSTEM);
+ typeList.add(CEC_DEVICE_TYPE_AUDIO_SYSTEM);
}
else
{
return 0;
}
else if (!strcmp(argv[iArgPtr], "-p") ||
- !strcmp(argv[iArgPtr], "--physical"))
+ !strcmp(argv[iArgPtr], "--port"))
{
if (argc >= iArgPtr + 2)
{
- if (sscanf(argv[iArgPtr + 1], "%x", &iPhysicalAddress))
- cout << "using physical address '" << std::hex << iPhysicalAddress << "'" << endl;
- else
- cout << "== skipped physical address parameter: invalid physical address '" << argv[iArgPtr + 1] << "' ==" << endl;
+ iHDMIPort = (int8_t)atoi(argv[iArgPtr + 1]);
+ cout << "using HDMI port '" << iHDMIPort << "'" << endl;
++iArgPtr;
}
++iArgPtr;
if (typeList.IsEmpty())
{
if (!bSingleCommand)
- cout << "No device type given. Using 'playback device'" << endl;
- typeList.Add(CEC_DEVICE_TYPE_PLAYBACK_DEVICE);
+ cout << "No device type given. Using 'recording device'" << endl;
+ typeList.add(CEC_DEVICE_TYPE_RECORDING_DEVICE);
}
ICECAdapter *parser = LibCecInit("CECTester", typeList);
}
}
+ if (iHDMIPort > 0)
+ {
+ parser->SetHDMIPort((uint8_t)iHDMIPort);
+ FlushLog(parser);
+ }
+
+ cout << "scanning the CEC bus..." << endl;
+
if (!parser->Open(g_strPort.c_str()))
{
cout << "unable to open the device on port " << g_strPort << endl;
{
cout << "cec device opened" << endl;
- if (-1 != iPhysicalAddress)
- {
- parser->SetPhysicalAddress(iPhysicalAddress);
- FlushLog(parser);
- }
-
parser->PowerOnDevices(CECDEVICE_TV);
FlushLog(parser);
parser->SetLogicalAddress((cec_logical_address) atoi(strvalue.c_str()));
}
}
+ else if (command == "p")
+ {
+ string strvalue;
+ if (GetWord(input, strvalue))
+ {
+ parser->SetHDMIPort((uint8_t)atoi(strvalue.c_str()));
+ }
+ }
else if (command == "pa")
{
string strB1, strB2;
{
parser->PingAdapter();
}
+ else if (command == "volup")
+ {
+ CStdString strLog;
+ strLog.Format("volume up: %2X", parser->VolumeUp());
+ cout << strLog.c_str() << endl;
+ }
+ else if (command == "voldown")
+ {
+ CStdString strLog;
+ strLog.Format("volume up: %2X", parser->VolumeDown());
+ cout << strLog.c_str() << endl;
+ }
+ else if (command == "mute")
+ {
+ CStdString strLog;
+ strLog.Format("mute: %2X", parser->MuteAudio());
+ cout << strLog.c_str() << endl;
+ }
else if (command == "mon")
{
CStdString strEnable;
}
}
}
+ else if (command == "name")
+ {
+ CStdString strDev;
+ if (GetWord(input, strDev))
+ {
+ int iDev = atoi(strDev);
+ if (iDev >= 0 && iDev < 15)
+ {
+ cec_osd_name name = parser->GetOSDName((cec_logical_address)iDev);
+ cout << "OSD name of device " << iDev << " is '" << name.name << "'" << endl;
+ }
+ }
+ }
+ else if (command == "lad")
+ {
+ cout << "listing active devices:" << endl;
+ cec_logical_addresses addresses = parser->GetActiveDevices();
+ for (uint8_t iPtr = 0; iPtr < 16; iPtr++)
+ if (addresses[iPtr])
+ cout << "logical address " << (int)iPtr << endl;
+ }
+ else if (command == "scan")
+ {
+ cout << "CEC bus information" << endl;
+ cout << "===================" << endl;
+ cec_logical_addresses addresses = parser->GetActiveDevices();
+ for (uint8_t iPtr = 0; iPtr < 16; iPtr++)
+ if (addresses[iPtr])
+ {
+ uint64_t iVendorId = parser->GetDeviceVendorId((cec_logical_address)iPtr);
+ cec_version iCecVersion = parser->GetDeviceCecVersion((cec_logical_address)iPtr);
+ cec_power_status power = parser->GetDevicePowerStatus((cec_logical_address)iPtr);
+ cec_osd_name osdName = parser->GetOSDName((cec_logical_address)iPtr);
+ cec_menu_language lang;
+ lang.device = CECDEVICE_UNKNOWN;
+ parser->GetDeviceMenuLanguage((cec_logical_address)iPtr, &lang);
+
+ cout << "device #" << (int)iPtr << ": " << parser->ToString((cec_logical_address)iPtr) << endl;
+ cout << "vendor: " << parser->ToString((cec_vendor_id)iVendorId) << endl;
+ cout << "osd string: " << osdName.name << endl;
+ cout << "CEC version: " << parser->ToString(iCecVersion) << endl;
+ cout << "power status: " << parser->ToString(power) << endl;
+ if ((uint8_t)lang.device == iPtr)
+ cout << "language: " << lang.language << endl;
+ cout << endl;
+ }
+ }
+ else if (command == "ad")
+ {
+ CStdString strDev;
+ if (GetWord(input, strDev))
+ {
+ int iDev = atoi(strDev);
+ if (iDev >= 0 && iDev < 15)
+ cout << "logical address " << iDev << " is " << (parser->IsActiveDevice((cec_logical_address)iDev) ? "active" : "not active") << endl;
+ }
+ }
+ else if (command == "at")
+ {
+ CStdString strType;
+ if (GetWord(input, strType))
+ {
+ cec_device_type type = CEC_DEVICE_TYPE_TV;
+ if (strType.Equals("a"))
+ type = CEC_DEVICE_TYPE_AUDIO_SYSTEM;
+ else if (strType.Equals("p"))
+ type = CEC_DEVICE_TYPE_PLAYBACK_DEVICE;
+ else if (strType.Equals("r"))
+ type = CEC_DEVICE_TYPE_RECORDING_DEVICE;
+ else if (strType.Equals("t"))
+ type = CEC_DEVICE_TYPE_TUNER;
+ cout << "device " << type << " is " << (parser->IsActiveDeviceType(type) ? "active" : "not active") << endl;
+ }
+ }
else if (command == "r")
{
cout << "closing the connection" << endl;