using namespace std;
using namespace PLATFORM;
-CCECProcessor::CCECProcessor(CLibCEC *controller, const libcec_configuration *configuration) :
+CCECProcessor::CCECProcessor(CLibCEC *controller, libcec_configuration *configuration) :
+ m_bConnectionOpened(false),
m_bInitialised(false),
m_communication(NULL),
m_controller(controller),
m_logicalAddresses.Clear();
CreateBusDevices();
m_configuration.Clear();
-
+ m_configuration.serverVersion = CEC_SERVER_VERSION_1_5_0;
SetConfiguration(configuration);
if (m_configuration.tvVendor != CEC_VENDOR_UNKNOWN)
}
CCECProcessor::CCECProcessor(CLibCEC *controller, const char *strDeviceName, const cec_device_type_list &types, uint16_t iPhysicalAddress) :
+ m_bConnectionOpened(false),
m_bInitialised(false),
m_communication(NULL),
m_controller(controller),
m_iLastTransmission(0)
{
m_configuration.Clear();
+ m_configuration.serverVersion = CEC_SERVER_VERSION_1_5_0;
// client version < 1.5.0
- m_configuration.clientVersion = CEC_CLIENT_VERSION_PRE_1_5;
+ m_configuration.clientVersion = (uint32_t)CEC_CLIENT_VERSION_PRE_1_5;
snprintf(m_configuration.strDeviceName, 13, "%s", strDeviceName);
m_configuration.deviceTypes = types;
m_configuration.iPhysicalAddress = iPhysicalAddress;
SetInitialised(false);
StopThread();
- CLockObject lock(m_mutex);
- if (m_communication)
+ bool bClose(false);
+ {
+ CLockObject lock(m_mutex);
+ bClose = m_bConnectionOpened;
+ m_bConnectionOpened = false;
+ }
+
+ if (bClose && m_communication)
{
m_communication->Close();
delete m_communication;
bool CCECProcessor::OpenConnection(const char *strPort, uint16_t iBaudRate, uint32_t iTimeoutMs)
{
bool bReturn(false);
- CLockObject lock(m_mutex);
- if (m_communication)
+ Close();
+
{
- CLibCEC::AddLog(CEC_LOG_WARNING, "existing connection handler found, deleting it");
- m_communication->Close();
- delete m_communication;
+ CLockObject lock(m_mutex);
+ if (m_bConnectionOpened)
+ {
+ CLibCEC::AddLog(CEC_LOG_ERROR, "connection already opened");
+ return false;
+ }
+ m_communication = new CUSBCECAdapterCommunication(this, strPort, iBaudRate);
+ m_bConnectionOpened = (m_communication != NULL);
}
- m_communication = new CUSBCECAdapterCommunication(this, strPort, iBaudRate);
-
/* check for an already opened connection */
if (m_communication->IsOpen())
{
}
if (bReturn)
- CLibCEC::AddLog(CEC_LOG_NOTICE, "connected to the CEC adapter. firmware version = %d, client version = %s", m_communication->GetFirmwareVersion(), ToString(m_configuration.clientVersion));
+ CLibCEC::AddLog(CEC_LOG_NOTICE, "connected to the CEC adapter. firmware version = %d, client version = %s", m_communication->GetFirmwareVersion(), ToString((cec_client_version)m_configuration.clientVersion));
return bReturn;
}
/* only set our OSD name for the primary device */
m_busDevices[m_logicalAddresses.primary]->m_strDeviceName = m_configuration.strDeviceName;
+
+ /* make the primary device the active source if the option is set */
+ if (m_configuration.bActivateSource == 1)
+ m_busDevices[m_logicalAddresses.primary]->m_bActiveSource = true;
}
/* get the vendor id from the TV, so we are using the correct handler */
else if (m_configuration.iPhysicalAddress == 0 && (bReturn = SetHDMIPort(m_configuration.baseDevice, m_configuration.iHDMIPort, true)) == false)
CLibCEC::AddLog(CEC_LOG_ERROR, "unable to set HDMI port %d on %s (%x)", m_configuration.iHDMIPort, ToString(m_configuration.baseDevice), (uint8_t)m_configuration.baseDevice);
+ if (m_configuration.bActivateSource == 1)
+ m_busDevices[m_logicalAddresses.primary]->ActivateSource();
+
SetInitialised(bReturn);
- CLibCEC::ConfigurationChanged(m_configuration);
+ if (bReturn)
+ CLibCEC::ConfigurationChanged(m_configuration);
return bReturn;
}
bool CCECProcessor::OnCommandReceived(const cec_command &command)
{
- m_commandBuffer.Push(command);
+ ParseCommand(command);
return true;
}
void *CCECProcessor::Process(void)
{
- cec_command command;
CLibCEC::AddLog(CEC_LOG_DEBUG, "processor thread started");
while (!IsStopped() && m_communication->IsOpen())
if (IsInitialised())
{
ReplaceHandlers();
- if (m_commandBuffer.Pop(command))
- ParseCommand(command);
m_controller->CheckKeypressTimeout();
}
return false;
}
- cec_adapter_message_state retVal(ADAPTER_MESSAGE_STATE_UNKNOWN);
+ uint8_t iMaxTries(0);
{
CLockObject lock(m_mutex);
+ if (IsStopped())
+ return false;
LogOutput(data);
m_iLastTransmission = GetTimeMs();
- if (!m_communication || !IsInitialised())
+ if (!m_communication || !m_communication->IsOpen())
{
CLibCEC::AddLog(CEC_LOG_ERROR, "cannot transmit command: connection closed");
return false;
}
- uint8_t iMaxTries = m_busDevices[data.initiator]->GetHandler()->GetTransmitRetries() + 1;
- retVal = m_communication->Write(data, iMaxTries, m_iLineTimeout, m_iRetryLineTimeout);
+ iMaxTries = m_busDevices[data.initiator]->GetHandler()->GetTransmitRetries() + 1;
}
- /* set to "not present" on failed ack */
- if (retVal == ADAPTER_MESSAGE_STATE_SENT_NOT_ACKED &&
- data.destination != CECDEVICE_BROADCAST)
- m_busDevices[data.destination]->SetDeviceStatus(CEC_DEVICE_STATUS_NOT_PRESENT);
-
- return retVal == ADAPTER_MESSAGE_STATE_SENT_ACKED;
+ return m_communication->Write(data, iMaxTries, m_iLineTimeout, m_iRetryLineTimeout)
+ == ADAPTER_MESSAGE_STATE_SENT_ACKED;
}
void CCECProcessor::TransmitAbort(cec_logical_address address, cec_opcode opcode, cec_abort_reason reason /* = CEC_ABORT_REASON_UNRECOGNIZED_OPCODE */)
return "system audio mode status";
case CEC_OPCODE_SET_AUDIO_RATE:
return "set audio rate";
+ case CEC_OPCODE_NONE:
+ return "poll";
default:
return "UNKNOWN";
}
return "Philips";
case CEC_VENDOR_SONY:
return "Sony";
+ case CEC_VENDOR_TOSHIBA:
+ return "Toshiba";
default:
return "Unknown";
}
}
}
+const char *CCECProcessor::ToString(const cec_server_version version)
+{
+ switch (version)
+ {
+ case CEC_SERVER_VERSION_PRE_1_5:
+ return "pre-1.5";
+ case CEC_SERVER_VERSION_1_5_0:
+ return "1.5.0";
+ default:
+ return "Unknown";
+ }
+}
+
void *CCECBusScan::Process(void)
{
CCECBusDevice *device(NULL);
}
// just copy these
+ m_configuration.clientVersion = configuration->clientVersion;
+ m_configuration.bActivateSource = configuration->bActivateSource;
m_configuration.bGetSettingsFromROM = configuration->bGetSettingsFromROM;
m_configuration.powerOffDevices = configuration->powerOffDevices;
m_configuration.bPowerOffScreensaver = configuration->bPowerOffScreensaver;
if (bReinit)
{
- if (bDeviceTypeChanged)
- return ChangeDeviceType(oldPrimaryType, m_configuration.deviceTypes[0]);
- else if (bPhysicalAddressChanged)
- return SetPhysicalAddress(m_configuration.iPhysicalAddress);
+ if (bDeviceTypeChanged)
+ return ChangeDeviceType(oldPrimaryType, m_configuration.deviceTypes[0]);
+ else if (bPhysicalAddressChanged)
+ return SetPhysicalAddress(m_configuration.iPhysicalAddress);
else
return SetHDMIPort(m_configuration.baseDevice, m_configuration.iHDMIPort);
}
bool CCECProcessor::GetCurrentConfiguration(libcec_configuration *configuration)
{
// client version 1.5.0
- configuration->clientVersion = m_configuration.clientVersion;
snprintf(configuration->strDeviceName, 13, "%s", m_configuration.strDeviceName);
configuration->deviceTypes = m_configuration.deviceTypes;
configuration->bAutodetectAddress = m_configuration.bAutodetectAddress;
configuration->iPhysicalAddress = m_configuration.iPhysicalAddress;
configuration->baseDevice = m_configuration.baseDevice;
configuration->iHDMIPort = m_configuration.iHDMIPort;
+ configuration->clientVersion = m_configuration.clientVersion;
+ configuration->serverVersion = m_configuration.serverVersion;
configuration->tvVendor = m_configuration.tvVendor;
- configuration->wakeDevices = m_configuration.wakeDevices;
+
configuration->bGetSettingsFromROM = m_configuration.bGetSettingsFromROM;
+ configuration->bUseTVMenuLanguage = m_configuration.bUseTVMenuLanguage;
+ configuration->bActivateSource = m_configuration.bActivateSource;
+ configuration->wakeDevices = m_configuration.wakeDevices;
configuration->powerOffDevices = m_configuration.powerOffDevices;
configuration->bPowerOffScreensaver = m_configuration.bPowerOffScreensaver;
configuration->bPowerOffOnStandby = m_configuration.bPowerOffOnStandby;
{
return m_communication->PersistConfiguration(configuration);
}
+
+void CCECProcessor::RescanActiveDevices(void)
+{
+ for (unsigned int iPtr = 0; iPtr < 16; iPtr++)
+ m_busDevices[iPtr]->GetStatus(true);
+}