m_iCurrentButton(CEC_USER_CONTROL_CODE_UNKNOWN),
m_physicaladdress(iPhysicalAddress),
m_iLogicalAddress(iLogicalAddress),
- m_strDeviceName(strDeviceName),
- m_bRunning(false)
+ m_strDeviceName(strDeviceName)
{
m_communication = new CCommunication(this);
}
return false;
}
- if (pthread_create(&m_thread, NULL, (void *(*) (void *))&CCECParser::ThreadHandler, (void *)this) == 0)
- {
- m_bRunning = true;
- AddLog(CEC_LOG_DEBUG, "processor thread created");
- pthread_detach(m_thread);
+ if (CreateThread())
return true;
- }
else
- {
AddLog(CEC_LOG_ERROR, "could not create a processor thread");
- m_bRunning = false;
- }
return false;
}
void CCECParser::Close(void)
{
- m_bRunning = false;
- pthread_join(m_thread, NULL);
+ StopThread();
}
-void *CCECParser::ThreadHandler(CCECParser *parser)
+void *CCECParser::Process(void)
{
- if (parser)
- parser->Process();
- return 0;
-}
+ AddLog(CEC_LOG_DEBUG, "processor thread started");
-bool CCECParser::Process(void)
-{
int64_t now = GetTimeMs();
- while (m_bRunning)
+ while (!m_bStop)
{
- cec_frame msg;
- while (m_bRunning && m_communication->IsOpen() && m_communication->Read(msg, CEC_BUTTON_TIMEOUT))
- ParseMessage(msg);
+ bool bParseFrame(false);
+ {
+ CLockObject lock(&m_mutex);
+ cec_frame msg;
+ if (!m_bStop && m_communication->IsOpen() && m_communication->Read(msg, CEC_BUTTON_TIMEOUT))
+ bParseFrame = ParseMessage(msg);
+ }
+
+ if (bParseFrame)
+ ParseCurrentFrame();
now = GetTimeMs();
CheckKeypressTimeout(now);
}
AddLog(CEC_LOG_DEBUG, "processor thread terminated");
- m_bRunning = false;
- m_exitCondition.Signal();
- return true;
+ return NULL;
}
bool CCECParser::Ping(void)
{
- if (!m_bRunning)
+ if (!IsRunning())
return false;
AddLog(CEC_LOG_DEBUG, "sending ping");
bool CCECParser::StartBootloader(void)
{
- if (!m_bRunning)
+ if (!IsRunning())
return false;
AddLog(CEC_LOG_DEBUG, "starting the bootloader");
bool CCECParser::PowerOnDevices(cec_logical_address address /* = CECDEVICE_TV */)
{
- if (!m_bRunning)
+ if (!IsRunning())
return false;
CStdString strLog;
bool CCECParser::StandbyDevices(cec_logical_address address /* = CECDEVICE_BROADCAST */)
{
- if (!m_bRunning)
+ if (!IsRunning())
return false;
CStdString strLog;
bool CCECParser::SetActiveView(void)
{
- if (!m_bRunning)
+ if (!IsRunning())
return false;
AddLog(CEC_LOG_DEBUG, "setting active view");
bool CCECParser::SetInactiveView(void)
{
- if (!m_bRunning)
+ if (!IsRunning())
return false;
AddLog(CEC_LOG_DEBUG, "setting inactive view");
bool CCECParser::GetNextKeypress(cec_keypress *key)
{
- return m_bRunning ? m_keyBuffer.Pop(*key) : false;
+ return IsRunning() ? m_keyBuffer.Pop(*key) : false;
}
bool CCECParser::GetNextCommand(cec_command *command)
{
- return m_bRunning ? m_commandBuffer.Pop(*command) : false;
+ return IsRunning() ? m_commandBuffer.Pop(*command) : false;
}
//@}
bool CCECParser::TransmitFormatted(const cec_frame &data, bool bWaitForAck /* = true */)
{
+ CLockObject lock(&m_mutex);
if (!m_communication || !m_communication->Write(data))
+ {
return false;
+ }
CCondition::Sleep((int) data.size() * 24 /*data*/ + 5 /*start bit (4.5 ms)*/ + 50 /* to be on the safe side */);
if (bWaitForAck && !WaitForAck())
return bGotAck && !bError;
}
-void CCECParser::ParseMessage(cec_frame &msg)
+bool CCECParser::ParseMessage(cec_frame &msg)
{
+ bool bReturn(false);
+
if (msg.empty())
- return;
+ return bReturn;
CStdString logStr;
uint8_t iCode = msg[0] & ~(MSGCODE_FRAME_EOM | MSGCODE_FRAME_ACK);
AddLog(CEC_LOG_DEBUG, logStr.c_str());
}
if (bEom)
- ParseCurrentFrame();
+ bReturn = true;
break;
default:
break;
}
+
+ return bReturn;
}
void CCECParser::ParseCurrentFrame(void)