m_controller(controller),
m_bMonitor(false)
{
- m_logicalAddresses.clear();
- m_logicalAddresses.set(iLogicalAddress);
+ m_logicalAddresses.Clear();
+ m_logicalAddresses.Set(iLogicalAddress);
m_types.clear();
- for (int iPtr = 0; iPtr < 16; iPtr++)
+ for (int iPtr = 0; iPtr <= 16; iPtr++)
m_busDevices[iPtr] = new CCECBusDevice(this, (cec_logical_address) iPtr, iPtr == iLogicalAddress ? iPhysicalAddress : 0);
}
m_controller(controller),
m_bMonitor(false)
{
- m_logicalAddresses.clear();
+ m_logicalAddresses.Clear();
for (int iPtr = 0; iPtr < 16; iPtr++)
{
switch(iPtr)
AddLog(CEC_LOG_NOTICE, strLog);
/* only set our OSD name and active source for the primary device */
- if (m_logicalAddresses.empty())
+ if (m_logicalAddresses.IsEmpty())
{
m_busDevices[address]->m_strDeviceName = m_strDeviceName;
m_busDevices[address]->m_bActiveSource = true;
}
m_busDevices[address]->m_powerStatus = CEC_POWER_STATUS_STANDBY;
- m_busDevices[address]->m_cecVersion = CEC_VERSION_1_3A;
- m_logicalAddresses.set(address);
+ m_busDevices[address]->m_cecVersion = CEC_VERSION_1_3A;
+
+ m_logicalAddresses.Set(address);
// TODO
m_busDevices[address]->SetPhysicalAddress((uint16_t)CEC_DEFAULT_PHYSICAL_ADDRESS + ((uint16_t)iIndex * 0x100));
bool CCECProcessor::FindLogicalAddresses(void)
{
bool bReturn(true);
- m_logicalAddresses.clear();
+ m_logicalAddresses.Clear();
CStdString strLog;
for (unsigned int iPtr = 0; iPtr < 5; iPtr++)
CCECAdapterMessage msg;
{
- if (m_logicalAddresses.empty() && !FindLogicalAddresses())
+ if (m_logicalAddresses.IsEmpty() && !FindLogicalAddresses())
{
CLockObject lock(&m_mutex);
m_controller->AddLog(CEC_LOG_ERROR, "could not detect our logical addressed");
return NULL;
}
- SetAckMask(m_logicalAddresses.ackmask());
+ SetAckMask(m_logicalAddresses.AckMask());
{
CLockObject lock(&m_mutex);
while (!IsStopped())
{
- command.clear();
+ command.Clear();
msg.clear();
{
}
}
- return SetStreamPath(m_busDevices[addr]->GetPhysicalAddress());
+ return SetStreamPath(m_busDevices[addr]->GetPhysicalAddress()) &&
+ m_busDevices[addr]->TransmitActiveSource();
}
bool CCECProcessor::SetActiveView(void)
{
- return SetActiveSource();
+ return SetActiveSource(m_types.IsEmpty() ? CEC_DEVICE_TYPE_RESERVED : m_types[0]);
+}
+
+bool CCECProcessor::SetDeckControlMode(cec_deck_control_mode mode, bool bSendUpdate /* = true */)
+{
+ bool bReturn(false);
+
+ CCECBusDevice *device = GetDeviceByType(CEC_DEVICE_TYPE_PLAYBACK_DEVICE);
+ if (device)
+ {
+ ((CCECPlaybackDevice *) device)->SetDeckControlMode(mode);
+ if (bSendUpdate)
+ ((CCECPlaybackDevice *) device)->TransmitDeckStatus(CECDEVICE_TV);
+ bReturn = true;
+ }
+
+ return bReturn;
+}
+
+bool CCECProcessor::SetDeckInfo(cec_deck_info info, bool bSendUpdate /* = true */)
+{
+ bool bReturn(false);
+
+ CCECBusDevice *device = GetDeviceByType(CEC_DEVICE_TYPE_PLAYBACK_DEVICE);
+ if (device)
+ {
+ ((CCECPlaybackDevice *) device)->SetDeckStatus(info);
+ if (bSendUpdate)
+ ((CCECPlaybackDevice *) device)->TransmitDeckStatus(CECDEVICE_TV);
+ bReturn = true;
+ }
+
+ return bReturn;
}
bool CCECProcessor::SetStreamPath(uint16_t iStreamPath)
device->m_bActiveSource = true;
device->m_powerStatus = CEC_POWER_STATUS_ON;
- if (m_logicalAddresses.isset(device->m_iLogicalAddress))
- bReturn = device->TransmitActiveSource();
- else
- bReturn = true;
+ bReturn = true;
}
return bReturn;
if (!IsRunning())
return false;
- if (!m_logicalAddresses.empty() && m_busDevices[m_logicalAddresses.primary])
+ if (!m_logicalAddresses.IsEmpty() && m_busDevices[m_logicalAddresses.primary])
return m_busDevices[m_logicalAddresses.primary]->TransmitInactiveView();
return false;
}
strLog.Format("<< setting primary logical address to %1x", iLogicalAddress);
m_controller->AddLog(CEC_LOG_NOTICE, strLog.c_str());
m_logicalAddresses.primary = iLogicalAddress;
- m_logicalAddresses.set(iLogicalAddress);
- return SetAckMask(m_logicalAddresses.ackmask());
+ m_logicalAddresses.Set(iLogicalAddress);
+ return SetAckMask(m_logicalAddresses.AckMask());
}
return true;
}
+bool CCECProcessor::SetMenuState(cec_menu_state state, bool bSendUpdate /* = true */)
+{
+ for (uint8_t iPtr = 0; iPtr < 16; iPtr++)
+ {
+ if (m_logicalAddresses[iPtr])
+ m_busDevices[iPtr]->SetMenuState(state);
+ }
+
+ if (bSendUpdate)
+ m_busDevices[m_logicalAddresses.primary]->TransmitMenuState(CECDEVICE_TV);
+
+ return true;
+}
+
bool CCECProcessor::SetPhysicalAddress(uint16_t iPhysicalAddress)
{
- if (!m_logicalAddresses.empty() && m_busDevices[m_logicalAddresses.primary])
+ if (!m_logicalAddresses.IsEmpty() && m_busDevices[m_logicalAddresses.primary])
{
m_busDevices[m_logicalAddresses.primary]->SetPhysicalAddress(iPhysicalAddress);
return SetActiveView();
if (bEnable)
return SetAckMask(0);
else
- return SetAckMask(m_logicalAddresses.ackmask());
+ return SetAckMask(m_logicalAddresses.AckMask());
}
bool CCECProcessor::PollDevice(cec_logical_address iAddress)
return false;
}
-
CCECBusDevice *CCECProcessor::GetDeviceByPhysicalAddress(uint16_t iPhysicalAddress) const
{
CCECBusDevice *device = NULL;
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();
cec_command command;
// TODO
- cec_command::format(command, m_logicalAddresses.primary, address, CEC_OPCODE_FEATURE_ABORT);
- command.parameters.push_back((uint8_t)opcode);
- command.parameters.push_back((uint8_t)reason);
+ cec_command::Format(command, m_logicalAddresses.primary, address, CEC_OPCODE_FEATURE_ABORT);
+ command.parameters.PushBack((uint8_t)opcode);
+ command.parameters.PushBack((uint8_t)reason);
Transmit(command);
}
{
case MSGCODE_FRAME_START:
{
- m_currentframe.clear();
+ m_currentframe.Clear();
if (msg.size() >= 2)
{
m_currentframe.initiator = msg.initiator();
{
if (msg.size() >= 2)
{
- m_currentframe.push_back(msg[1]);
+ m_currentframe.PushBack(msg[1]);
m_currentframe.eom = msg.eom();
}
bEom = msg.eom();
dataStr.AppendFormat(":%02x", (unsigned int)command.parameters[iPtr]);
m_controller->AddLog(CEC_LOG_TRAFFIC, dataStr.c_str());
- if (!m_bMonitor)
+ if (!m_bMonitor && command.initiator >= CECDEVICE_TV && command.initiator <= CECDEVICE_BROADCAST)
m_busDevices[(uint8_t)command.initiator]->HandleCommand(command);
}
uint16_t CCECProcessor::GetPhysicalAddress(void) const
{
- if (!m_logicalAddresses.empty() && m_busDevices[m_logicalAddresses.primary])
+ if (!m_logicalAddresses.IsEmpty() && m_busDevices[m_logicalAddresses.primary])
return m_busDevices[m_logicalAddresses.primary]->GetPhysicalAddress();
return false;
}