X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fadapter%2FRPi%2FRPiCECAdapterCommunication.cpp;h=e1fcae6af7cd5caf561afe94e918ca6b78f23b06;hb=ecc633c51b6c69bebaff4932e90245665ca06373;hp=a89ebf6e79bac7d7a84dc8b08c861504138fc133;hpb=f60ee8b35a31f8795658407a6863425a2c5c84d7;p=deb_libcec.git diff --git a/src/lib/adapter/RPi/RPiCECAdapterCommunication.cpp b/src/lib/adapter/RPi/RPiCECAdapterCommunication.cpp index a89ebf6..e1fcae6 100644 --- a/src/lib/adapter/RPi/RPiCECAdapterCommunication.cpp +++ b/src/lib/adapter/RPi/RPiCECAdapterCommunication.cpp @@ -58,42 +58,17 @@ void rpi_cec_callback(void *callback_data, uint32_t p0, uint32_t p1, uint32_t p2 static_cast(callback_data)->OnDataReceived(p0, p1, p2, p3, p4); } -CRPiCECAdapterFindNewLogicalAddress::CRPiCECAdapterFindNewLogicalAddress(CRPiCECAdapterCommunication* communication, const cec_logical_address address) : - m_communication(communication), - m_address(address) { } - -void *CRPiCECAdapterFindNewLogicalAddress::Process(void) -{ - cec_logical_address newAddress(CECDEVICE_UNKNOWN); - for (unsigned int iLA = CECDEVICE_RECORDINGDEVICE1; newAddress == CECDEVICE_UNKNOWN && iLA < CECDEVICE_BROADCAST; iLA++) - { - if (CCECTypeUtils::GetType((cec_logical_address)iLA) == CCECTypeUtils::GetType(m_address) && - m_communication->SupportsSourceLogicalAddress((cec_logical_address)iLA) && - m_communication->RegisterLogicalAddress((cec_logical_address)iLA)) - newAddress = (cec_logical_address)iLA; - } - - m_communication->m_callback->HandleLogicalAddressLost(m_address, newAddress); - return NULL; -} - CRPiCECAdapterCommunication::CRPiCECAdapterCommunication(IAdapterCommunicationCallback *callback) : IAdapterCommunication(callback), m_logicalAddress(CECDEVICE_UNKNOWN), m_bLogicalAddressChanged(false), - m_laLost(NULL) + m_previousLogicalAddress(CECDEVICE_FREEUSE) { m_queue = new CRPiCECAdapterMessageQueue(this); } CRPiCECAdapterCommunication::~CRPiCECAdapterCommunication(void) { - if (m_laLost) - { - m_laLost->StopThread(); - delete m_laLost; - m_laLost = NULL; - } delete(m_queue); Close(); } @@ -135,7 +110,9 @@ void CRPiCECAdapterCommunication::OnDataReceived(uint32_t header, uint32_t p0, u { VC_CEC_NOTIFY_T reason = (VC_CEC_NOTIFY_T)CEC_CB_REASON(header); +#ifdef CEC_DEBUGGING LIB_CEC->AddLog(CEC_LOG_DEBUG, "received data: header:%08X p0:%08X p1:%08X p2:%08X p3:%08X reason:%x", header, p0, p1, p2, p3, reason); +#endif switch (reason) { @@ -168,10 +145,14 @@ void CRPiCECAdapterCommunication::OnDataReceived(uint32_t header, uint32_t p0, u } break; case VC_CEC_BUTTON_PRESSED: + case VC_CEC_REMOTE_PRESSED: { // translate into a cec_command cec_command command; - cec_command::Format(command, (cec_logical_address)CEC_CB_INITIATOR(p0), (cec_logical_address)CEC_CB_FOLLOWER(p0), CEC_OPCODE_USER_CONTROL_PRESSED); + cec_command::Format(command, + (cec_logical_address)CEC_CB_INITIATOR(p0), + (cec_logical_address)CEC_CB_FOLLOWER(p0), + reason == VC_CEC_BUTTON_PRESSED ? CEC_OPCODE_USER_CONTROL_PRESSED : CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN); command.parameters.PushBack((uint8_t)CEC_CB_OPERAND1(p0)); // send to libCEC @@ -179,10 +160,14 @@ void CRPiCECAdapterCommunication::OnDataReceived(uint32_t header, uint32_t p0, u } break; case VC_CEC_BUTTON_RELEASE: + case VC_CEC_REMOTE_RELEASE: { // translate into a cec_command cec_command command; - cec_command::Format(command, (cec_logical_address)CEC_CB_INITIATOR(p0), (cec_logical_address)CEC_CB_FOLLOWER(p0), CEC_OPCODE_USER_CONTROL_RELEASE); + cec_command::Format(command, + (cec_logical_address)CEC_CB_INITIATOR(p0), + (cec_logical_address)CEC_CB_FOLLOWER(p0), + reason == VC_CEC_BUTTON_PRESSED ? CEC_OPCODE_USER_CONTROL_RELEASE : CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP); command.parameters.PushBack((uint8_t)CEC_CB_OPERAND1(p0)); // send to libCEC @@ -192,6 +177,7 @@ void CRPiCECAdapterCommunication::OnDataReceived(uint32_t header, uint32_t p0, u case VC_CEC_LOGICAL_ADDR: { CLockObject lock(m_mutex); + m_previousLogicalAddress = m_logicalAddress; if (CEC_CB_RC(header) == VCHIQ_SUCCESS) { m_bLogicalAddressChanged = true; @@ -200,7 +186,7 @@ void CRPiCECAdapterCommunication::OnDataReceived(uint32_t header, uint32_t p0, u } else { - m_logicalAddress = CECDEVICE_BROADCAST; + m_logicalAddress = CECDEVICE_FREEUSE; LIB_CEC->AddLog(CEC_LOG_DEBUG, "failed to change the logical address, reset to %s (%x)", LIB_CEC->ToString(m_logicalAddress), m_logicalAddress); } m_logicalAddressCondition.Signal(); @@ -209,19 +195,15 @@ void CRPiCECAdapterCommunication::OnDataReceived(uint32_t header, uint32_t p0, u case VC_CEC_LOGICAL_ADDR_LOST: { // the logical address was taken by another device - cec_logical_address previousAddress = m_logicalAddress; + cec_logical_address previousAddress = m_logicalAddress == CECDEVICE_BROADCAST ? m_previousLogicalAddress : m_logicalAddress; m_logicalAddress = CECDEVICE_UNKNOWN; - if (m_laLost && !m_laLost->IsRunning()) - delete m_laLost; - m_laLost = new CRPiCECAdapterFindNewLogicalAddress(this, previousAddress); - if (m_laLost) - m_laLost->CreateThread(); + // notify libCEC that we lost our LA when the connection was initialised + if (m_bInitialised) + m_callback->HandleLogicalAddressLost(previousAddress); } break; case VC_CEC_TOPOLOGY: - case VC_CEC_REMOTE_PRESSED: - case VC_CEC_REMOTE_RELEASE: break; default: LIB_CEC->AddLog(CEC_LOG_DEBUG, "ignoring unknown reason %x", reason);