X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fadapter%2FUSBCECAdapterCommunication.cpp;h=801ebc509550fda47fe1b80dff0dce9cca77befc;hb=ae0f8fe4a09c5a4a3bb8fef267c6146d6df9d1e0;hp=680918d3f427e9098487e81912164ef5ea9ea7fb;hpb=c30acafa9bab18c07d0f27e2935c9df3d95de4ec;p=deb_libcec.git diff --git a/src/lib/adapter/USBCECAdapterCommunication.cpp b/src/lib/adapter/USBCECAdapterCommunication.cpp index 680918d..801ebc5 100644 --- a/src/lib/adapter/USBCECAdapterCommunication.cpp +++ b/src/lib/adapter/USBCECAdapterCommunication.cpp @@ -122,6 +122,21 @@ bool CUSBCECAdapterCommunication::Open(uint32_t iTimeoutMs /* = CEC_DEFAULT_CONN if (!bConnectionOpened) { LIB_CEC->AddLog(CEC_LOG_ERROR, strError); + + if (m_port->GetErrorNumber() == EACCES) + { + libcec_parameter param; + param.paramType = CEC_PARAMETER_TYPE_STRING; + param.paramData = (void*)"No permission to open the device"; + LIB_CEC->Alert(CEC_ALERT_PERMISSION_ERROR, param); + } + else if (m_port->GetErrorNumber() == EBUSY) + { + libcec_parameter param; + param.paramType = CEC_PARAMETER_TYPE_STRING; + param.paramData = (void*)"The serial port is busy. Only one program can access the device directly."; + LIB_CEC->Alert(CEC_ALERT_PORT_BUSY, param); + } return false; } @@ -169,7 +184,7 @@ void CUSBCECAdapterCommunication::Close(void) CLockObject lock(m_mutex); /* set the ackmask to 0 before closing the connection */ - if (IsRunning() && m_port->IsOpen() && m_port->GetErrorNumber() == 0) + if (IsOpen() && m_port->GetErrorNumber() == 0) { LIB_CEC->AddLog(CEC_LOG_DEBUG, "%s - closing the connection", __FUNCTION__); SetAckMask(0); @@ -188,10 +203,6 @@ void CUSBCECAdapterCommunication::Close(void) /* close and delete the com port connection */ if (m_port) m_port->Close(); - - libcec_parameter param; - param.paramData = NULL; param.paramType = CEC_PARAMETER_TYPE_UNKOWN; - LIB_CEC->Alert(CEC_ALERT_CONNECTION_LOST, param); } cec_adapter_message_state CUSBCECAdapterCommunication::Write(const cec_command &data, bool &bRetry, uint8_t iLineTimeout) @@ -224,7 +235,13 @@ void *CUSBCECAdapterCommunication::Process(void) { /* read from the serial port */ if (!ReadFromDevice(50, 5)) + { + libcec_parameter param; + param.paramData = NULL; param.paramType = CEC_PARAMETER_TYPE_UNKOWN; + LIB_CEC->Alert(CEC_ALERT_CONNECTION_LOST, param); + break; + } /* TODO sleep 5 ms so other threads can get a lock */ Sleep(5); @@ -312,7 +329,7 @@ bool CUSBCECAdapterCommunication::SetLineTimeout(uint8_t iTimeout) bool CUSBCECAdapterCommunication::WriteToDevice(CCECAdapterMessage *message) { CLockObject adapterLock(m_mutex); - if (!m_port->IsOpen()) + if (!IsOpen()) { LIB_CEC->AddLog(CEC_LOG_DEBUG, "error writing command '%s' to serial port '%s': the connection is closed", CCECAdapterMessage::ToString(message->Message()), m_port->GetName().c_str()); message->state = ADAPTER_MESSAGE_STATE_ERROR; @@ -324,7 +341,8 @@ bool CUSBCECAdapterCommunication::WriteToDevice(CCECAdapterMessage *message) { LIB_CEC->AddLog(CEC_LOG_DEBUG, "error writing command '%s' to serial port '%s': %s", CCECAdapterMessage::ToString(message->Message()), m_port->GetName().c_str(), m_port->GetError().c_str()); message->state = ADAPTER_MESSAGE_STATE_ERROR; - Close(); + // this will trigger an alert in the reader thread + m_port->Close(); return false; } @@ -343,7 +361,7 @@ bool CUSBCECAdapterCommunication::ReadFromDevice(uint32_t iTimeout, size_t iSize /* read from the serial port */ { CLockObject lock(m_mutex); - if (!m_port || !m_port->IsOpen()) + if (!IsOpen()) return false; iBytesRead = m_port->Read(buff, sizeof(uint8_t) * iSize, iTimeout); @@ -369,8 +387,7 @@ bool CUSBCECAdapterCommunication::ReadFromDevice(uint32_t iTimeout, size_t iSize CCECAdapterMessage *CUSBCECAdapterCommunication::SendCommand(cec_adapter_messagecode msgCode, CCECAdapterMessage ¶ms, bool bIsRetry /* = false */) { - if (!m_port || !m_port->IsOpen() || - !m_adapterMessageQueue) + if (!IsOpen() || !m_adapterMessageQueue) return NULL; /* create the adapter message for this command */ @@ -383,8 +400,9 @@ CCECAdapterMessage *CUSBCECAdapterCommunication::SendCommand(cec_adapter_message /* write the command */ if (!m_adapterMessageQueue->Write(output)) { + // this will trigger an alert in the reader thread if (output->state == ADAPTER_MESSAGE_STATE_ERROR) - Close(); + m_port->Close(); return output; } else @@ -469,7 +487,7 @@ bool CUSBCECAdapterCommunication::StartBootloader(void) { if (m_port->IsOpen() && m_commands->StartBootloader()) { - Close(); + m_port->Close(); return true; } return false; @@ -480,12 +498,13 @@ bool CUSBCECAdapterCommunication::SetAckMask(uint16_t iMask) if (m_iAckMask == iMask) return true; - if (m_port && m_port->IsOpen() && m_commands->SetAckMask(iMask)) + if (IsOpen() && m_commands->SetAckMask(iMask)) { m_iAckMask = iMask; return true; } + LIB_CEC->AddLog(CEC_LOG_ERROR, "couldn't change the ackmask: the connection is closed"); return false; } @@ -496,17 +515,17 @@ uint16_t CUSBCECAdapterCommunication::GetAckMask(void) bool CUSBCECAdapterCommunication::PingAdapter(void) { - return m_port->IsOpen() ? m_commands->PingAdapter() : false; + return IsOpen() ? m_commands->PingAdapter() : false; } uint16_t CUSBCECAdapterCommunication::GetFirmwareVersion(void) { - return m_commands->GetFirmwareVersion(); + return IsOpen() ? m_commands->GetFirmwareVersion() : CEC_FW_VERSION_UNKNOWN; } uint32_t CUSBCECAdapterCommunication::GetFirmwareBuildDate(void) { - return m_commands->RequestBuildDate(); + return IsOpen() ? m_commands->RequestBuildDate() : 0; } bool CUSBCECAdapterCommunication::IsRunningLatestFirmware(void) @@ -515,14 +534,14 @@ bool CUSBCECAdapterCommunication::IsRunningLatestFirmware(void) GetFirmwareBuildDate() >= CEC_LATEST_ADAPTER_FW_DATE; } -bool CUSBCECAdapterCommunication::PersistConfiguration(libcec_configuration *configuration) +bool CUSBCECAdapterCommunication::PersistConfiguration(const libcec_configuration &configuration) { - return m_port->IsOpen() ? m_commands->PersistConfiguration(configuration) : false; + return IsOpen() ? m_commands->PersistConfiguration(configuration) : false; } -bool CUSBCECAdapterCommunication::GetConfiguration(libcec_configuration *configuration) +bool CUSBCECAdapterCommunication::GetConfiguration(libcec_configuration &configuration) { - return m_port->IsOpen() ? m_commands->GetConfiguration(configuration) : false; + return IsOpen() ? m_commands->GetConfiguration(configuration) : false; } CStdString CUSBCECAdapterCommunication::GetPortName(void) @@ -532,7 +551,7 @@ CStdString CUSBCECAdapterCommunication::GetPortName(void) bool CUSBCECAdapterCommunication::SetControlledMode(bool controlled) { - return m_port->IsOpen() ? m_commands->SetControlledMode(controlled) : false; + return IsOpen() ? m_commands->SetControlledMode(controlled) : false; } void *CAdapterPingThread::Process(void)