repositories
/
deb_libcec.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fixed: cleaned up configure, trying to once again recombine AC_MSG_WARN into single...
[deb_libcec.git]
/
src
/
lib
/
implementations
/
SLCommandHandler.cpp
diff --git
a/src/lib/implementations/SLCommandHandler.cpp
b/src/lib/implementations/SLCommandHandler.cpp
index 83fc268e6fa1b95bf1b009d8f9b0d5a66a489f30..692a5fd824b51f722e1f89b728660bfa65c8eb9b 100644
(file)
--- a/
src/lib/implementations/SLCommandHandler.cpp
+++ b/
src/lib/implementations/SLCommandHandler.cpp
@@
-41,7
+41,12
@@
using namespace PLATFORM;
#define SL_COMMAND_UNKNOWN_01 0x01
#define SL_COMMAND_UNKNOWN_02 0x02
#define SL_COMMAND_UNKNOWN_01 0x01
#define SL_COMMAND_UNKNOWN_02 0x02
-#define SL_COMMAND_UNKNOWN_03 0x05
+
+#define SL_COMMAND_TYPE_HDDRECORDER_DISC 0x01
+#define SL_COMMAND_TYPE_VCR 0x02
+#define SL_COMMAND_TYPE_DVDPLAYER 0x03
+#define SL_COMMAND_TYPE_HDDRECORDER_DISC2 0x04
+#define SL_COMMAND_TYPE_HDDRECORDER 0x05
#define SL_COMMAND_REQUEST_POWER_STATUS 0xa0
#define SL_COMMAND_POWER_ON 0x03
#define SL_COMMAND_REQUEST_POWER_STATUS 0xa0
#define SL_COMMAND_POWER_ON 0x03
@@
-63,9
+68,8
@@
CSLCommandHandler::CSLCommandHandler(CCECBusDevice *busDevice) :
primary->ReplaceHandler(false);
}
primary->ReplaceHandler(false);
}
- /* LG TVs don't always reply to CEC version requests, so just set it to 1.3a */
- if (m_busDevice->GetLogicalAddress() == CECDEVICE_TV)
- m_busDevice->SetCecVersion(CEC_VERSION_1_3A);
+ /* LG devices don't always reply to CEC version requests, so just set it to 1.3a */
+ m_busDevice->SetCecVersion(CEC_VERSION_1_3A);
/* LG devices always return "korean" as language */
cec_menu_language lang;
/* LG devices always return "korean" as language */
cec_menu_language lang;
@@
-97,21
+101,22
@@
bool CSLCommandHandler::InitHandler(void)
bool CSLCommandHandler::ActivateSource(void)
{
bool CSLCommandHandler::ActivateSource(void)
{
- if (!
SLInitialised
())
+ if (!
m_processor->GetPrimaryDevice()->IsActiveSource
())
{
{
- CLibCEC::AddLog(CEC_LOG_NOTICE, "not activating the source
until SL has been initialised
");
+ CLibCEC::AddLog(CEC_LOG_NOTICE, "not activating the source
because we're not marked as active
");
return true;
}
{
CLockObject lock(m_SLMutex);
return true;
}
{
CLockObject lock(m_SLMutex);
- if (m_bActiveSourceSent)
- return true;
m_bActiveSourceSent = true;
}
CCECBusDevice *primary = m_processor->GetPrimaryDevice();
primary->SetActiveSource();
m_bActiveSourceSent = true;
}
CCECBusDevice *primary = m_processor->GetPrimaryDevice();
primary->SetActiveSource();
+ primary->SetPowerStatus(CEC_POWER_STATUS_ON);
+ primary->TransmitPowerState(CECDEVICE_TV);
+ primary->TransmitImageViewOn();
primary->TransmitActiveSource();
return true;
}
primary->TransmitActiveSource();
return true;
}
@@
-121,14
+126,22
@@
bool CSLCommandHandler::HandleActiveSource(const cec_command &command)
if (command.parameters.size == 2)
{
uint16_t iAddress = ((uint16_t)command.parameters[0] << 8) | ((uint16_t)command.parameters[1]);
if (command.parameters.size == 2)
{
uint16_t iAddress = ((uint16_t)command.parameters[0] << 8) | ((uint16_t)command.parameters[1]);
- if (iAddress != m_busDevice->GetPhysicalAddress(false))
+ CCECBusDevice *primary = m_processor->GetPrimaryDevice();
+ bool bSendPowerOffState(iAddress != primary->GetPhysicalAddress(false) && primary->IsActiveSource());
+
+ m_processor->SetActiveSource(iAddress);
+ if (bSendPowerOffState)
{
{
- ResetSLState();
+ {
+ CLockObject lock(m_SLMutex);
+ m_bActiveSourceSent = false;
+ }
+ primary->TransmitPowerState(CECDEVICE_TV);
}
}
- return m_processor->SetActiveSource(iAddress);
}
return true;
}
return true;
+
}
bool CSLCommandHandler::HandleDeviceVendorId(const cec_command &command)
}
bool CSLCommandHandler::HandleDeviceVendorId(const cec_command &command)
@@
-158,6
+171,9
@@
bool CSLCommandHandler::HandleGivePhysicalAddress(const cec_command &command)
bool CSLCommandHandler::HandleVendorCommand(const cec_command &command)
{
bool CSLCommandHandler::HandleVendorCommand(const cec_command &command)
{
+ if (!m_busDevice->MyLogicalAddressContains(command.destination))
+ return true;
+
if (command.parameters.size == 1 &&
command.parameters[0] == SL_COMMAND_UNKNOWN_01)
{
if (command.parameters.size == 1 &&
command.parameters[0] == SL_COMMAND_UNKNOWN_01)
{
@@
-197,7
+213,7
@@
void CSLCommandHandler::TransmitVendorCommand0205(const cec_logical_address iSou
cec_command response;
cec_command::Format(response, iSource, iDestination, CEC_OPCODE_VENDOR_COMMAND);
response.PushBack(SL_COMMAND_UNKNOWN_02);
cec_command response;
cec_command::Format(response, iSource, iDestination, CEC_OPCODE_VENDOR_COMMAND);
response.PushBack(SL_COMMAND_UNKNOWN_02);
- response.PushBack(SL_COMMAND_
UNKNOWN_03
);
+ response.PushBack(SL_COMMAND_
TYPE_HDDRECORDER
);
Transmit(response, false);
}
Transmit(response, false);
}
@@
-211,13
+227,18
@@
void CSLCommandHandler::HandleVendorCommandPowerOn(const cec_command &command)
if (device)
{
SetSLInitialised();
if (device)
{
SetSLInitialised();
-
- device->SetPowerStatus(CEC_POWER_STATUS_IN_TRANSITION_STANDBY_TO_ON);
//XXX
+ device->SetActiveSource();
+ device->SetPowerStatus(CEC_POWER_STATUS_IN_TRANSITION_STANDBY_TO_ON);
device->TransmitPowerState(command.initiator);
device->TransmitPowerState(command.initiator);
- device->SetPowerStatus(CEC_POWER_STATUS_ON);
- device->SetActiveSource();
- TransmitImageViewOn(device->GetLogicalAddress(), command.initiator);
+ CEvent::Sleep(2000);
+ device->SetPowerStatus(CEC_POWER_STATUS_ON);
+ device->TransmitPowerState(command.initiator);
+ device->TransmitPhysicalAddress();
+ {
+ CLockObject lock(m_SLMutex);
+ m_bActiveSourceSent = false;
+ }
}
}
void CSLCommandHandler::HandleVendorCommandPowerOnStatus(const cec_command &command)
}
}
void CSLCommandHandler::HandleVendorCommandPowerOnStatus(const cec_command &command)
@@
-257,16
+278,16
@@
bool CSLCommandHandler::HandleGiveDeckStatus(const cec_command &command)
{
if (command.parameters.size > 0)
{
{
if (command.parameters.size > 0)
{
+ ((CCECPlaybackDevice *) device)->SetDeckStatus(!device->IsActiveSource() ? CEC_DECK_INFO_OTHER_STATUS : CEC_DECK_INFO_OTHER_STATUS_LG);
if (command.parameters[0] == CEC_STATUS_REQUEST_ON)
{
if (command.parameters[0] == CEC_STATUS_REQUEST_ON)
{
-
((CCECPlaybackDevice *) device)->SetDeckStatus(CEC_DECK_INFO_STOP
);
- return ((CCECPlaybackDevice *) device)->TransmitDeckStatus(command.initiator) &&
- device->TransmitImageViewOn() &&
-
device->TransmitPhysicalAddress()
;
+
bool bReturn = ((CCECPlaybackDevice *) device)->TransmitDeckStatus(command.initiator
);
+ if (!ActiveSourceSent())
+ ActivateSource();
+
return bReturn
;
}
else if (command.parameters[0] == CEC_STATUS_REQUEST_ONCE)
{
}
else if (command.parameters[0] == CEC_STATUS_REQUEST_ONCE)
{
- ((CCECPlaybackDevice *) device)->SetDeckStatus(CEC_DECK_INFO_OTHER_STATUS_LG);
return ((CCECPlaybackDevice *) device)->TransmitDeckStatus(command.initiator);
}
}
return ((CCECPlaybackDevice *) device)->TransmitDeckStatus(command.initiator);
}
}
@@
-298,8
+319,8
@@
bool CSLCommandHandler::HandleGiveDevicePowerStatus(const cec_command &command)
}
else if (m_resetPowerState.IsSet() && m_resetPowerState.TimeLeft() > 0)
{
}
else if (m_resetPowerState.IsSet() && m_resetPowerState.TimeLeft() > 0)
{
- /*
assume that we've bugged out
*/
- CLibCEC::AddLog(CEC_LOG_
NOTICE, "LG seems to have bugged out. resetting to 'in transition standby to on'
");
+ /*
TODO assume that we've bugged out. the return button no longer works after this
*/
+ CLibCEC::AddLog(CEC_LOG_
WARNING, "FIXME: LG seems to have bugged out. resetting to 'in transition standby to on'. the return button will not work
");
{
CLockObject lock(m_SLMutex);
m_bActiveSourceSent = false;
{
CLockObject lock(m_SLMutex);
m_bActiveSourceSent = false;
@@
-324,7
+345,10
@@
bool CSLCommandHandler::HandleRequestActiveSource(const cec_command &command)
{
if (m_processor->IsRunning())
{
{
if (m_processor->IsRunning())
{
- CLibCEC::AddLog(CEC_LOG_DEBUG, ">> %i requests active source, ignored", (uint8_t) command.initiator);
+ if (ActiveSourceSent())
+ CLibCEC::AddLog(CEC_LOG_DEBUG, ">> %i requests active source, ignored", (uint8_t) command.initiator);
+ else
+ ActivateSource();
return true;
}
return false;
return true;
}
return false;
@@
-345,7
+369,10
@@
bool CSLCommandHandler::HandleFeatureAbort(const cec_command &command)
bool CSLCommandHandler::HandleStandby(const cec_command &command)
{
if (command.initiator == CECDEVICE_TV)
bool CSLCommandHandler::HandleStandby(const cec_command &command)
{
if (command.initiator == CECDEVICE_TV)
- ResetSLState();
+ {
+ CLockObject lock(m_SLMutex);
+ m_bActiveSourceSent = false;
+ }
return CCECCommandHandler::HandleStandby(command);
}
return CCECCommandHandler::HandleStandby(command);
}
@@
-382,6
+409,7
@@
bool CSLCommandHandler::PowerOn(const cec_logical_address iInitiator, const cec_
{
if (iDestination != CECDEVICE_TV)
{
{
if (iDestination != CECDEVICE_TV)
{
+ /* LG devices only allow themselves to be woken up by the TV with a vendor command */
cec_command command;
cec_command::Format(command, CECDEVICE_TV, iDestination, CEC_OPCODE_VENDOR_COMMAND);
command.PushBack(SL_COMMAND_POWER_ON);
cec_command command;
cec_command::Format(command, CECDEVICE_TV, iDestination, CEC_OPCODE_VENDOR_COMMAND);
command.PushBack(SL_COMMAND_POWER_ON);