/** \fn ExternalSignalMonitor::UpdateValues(void) * \brief Fills in frontend stats and emits status Qt signals. * * This is automatically called by run(), after Start() * has been used to start the signal monitoring thread. */ void ExternalSignalMonitor::UpdateValues(void) { if (!running || exit) return; if (m_stream_handler_started) { if (!m_stream_handler->IsRunning()) { error = QObject::tr("Error: stream handler died"); LOG(VB_CHANNEL, LOG_ERR, LOC + error); update_done = true; return; } EmitStatus(); if (IsAllGood()) SendMessageAllGood(); update_done = true; return; } AddFlags(kSigMon_WaitForSig); int strength = GetSignalStrengthPercent(); bool is_locked = HasLock(); // Set SignalMonitorValues { QMutexLocker locker(&statusLock); signalStrength.SetValue(strength); signalLock.SetValue(is_locked); } EmitStatus(); if (IsAllGood()) SendMessageAllGood(); // Start table monitoring if we are waiting on any table // and we have a lock. if (is_locked && GetStreamData() && HasAnyFlag(kDTVSigMon_WaitForPAT | kDTVSigMon_WaitForPMT | kDTVSigMon_WaitForMGT | kDTVSigMon_WaitForVCT | kDTVSigMon_WaitForNIT | kDTVSigMon_WaitForSDT)) { if (!m_stream_handler_started) { m_stream_handler->AddListener(GetStreamData()); m_stream_handler->StartStreaming(false); m_stream_handler_started = true; } } update_done = true; }
/** \fn CetonSignalMonitor::UpdateValues(void) * \brief Fills in frontend stats and emits status Qt signals. * * This is automatically called by MonitorLoop(), after Start() * has been used to start the signal monitoring thread. */ void CetonSignalMonitor::UpdateValues(void) { if (!running || exit) return; if (streamHandlerStarted) { EmitStatus(); if (IsAllGood()) SendMessageAllGood(); // TODO dtv signals... update_done = true; return; } uint sig = 100; // TODO find some way to actually monitor signal level // Set SignalMonitorValues from info from card. bool isLocked = false; { QMutexLocker locker(&statusLock); signalStrength.SetValue(sig); signalLock.SetValue(true); // TODO add some way to indicate if there is actually a lock isLocked = signalLock.IsGood(); } EmitStatus(); if (IsAllGood()) SendMessageAllGood(); // Start table monitoring if we are waiting on any table // and we have a lock. if (isLocked && GetStreamData() && HasAnyFlag(kDTVSigMon_WaitForPAT | kDTVSigMon_WaitForPMT | kDTVSigMon_WaitForMGT | kDTVSigMon_WaitForVCT | kDTVSigMon_WaitForNIT | kDTVSigMon_WaitForSDT)) { streamHandler->AddListener(GetStreamData()); streamHandlerStarted = true; } update_done = true; }
/** \fn ASISignalMonitor::UpdateValues(void) * \brief Fills in frontend stats and emits status Qt signals. * * This is automatically called by MonitorLoop(), after Start() * has been used to start the signal monitoring thread. */ void ASISignalMonitor::UpdateValues(void) { if (!running || exit) return; if (streamHandlerStarted) { EmitStatus(); if (IsAllGood()) SendMessageAllGood(); // TODO dtv signals... update_done = true; return; } // Set SignalMonitorValues from info from card. bool isLocked = true; { QMutexLocker locker(&statusLock); signalStrength.SetValue(100); signalLock.SetValue(1); } EmitStatus(); if (IsAllGood()) SendMessageAllGood(); // Start table monitoring if we are waiting on any table // and we have a lock. if (isLocked && GetStreamData() && HasAnyFlag(kDTVSigMon_WaitForPAT | kDTVSigMon_WaitForPMT | kDTVSigMon_WaitForMGT | kDTVSigMon_WaitForVCT | kDTVSigMon_WaitForNIT | kDTVSigMon_WaitForSDT)) { streamHandler->AddListener(GetStreamData()); streamHandlerStarted = true; } update_done = true; }
/** \fn IPTVSignalMonitor::UpdateValues(void) * \brief Fills in frontend stats and emits status Qt signals. * * This is automatically called by run(), after Start() * has been used to start the signal monitoring thread. */ void IPTVSignalMonitor::UpdateValues(void) { if (!running || exit) return; if (dtvMonitorRunning) { EmitStatus(); if (IsAllGood()) SendMessageAllGood(); // TODO dtv signals... update_done = true; return; } bool isLocked = false; { QMutexLocker locker(&statusLock); isLocked = signalLock.IsGood(); } EmitStatus(); if (IsAllGood()) SendMessageAllGood(); // Start table monitoring if we are waiting on any table // and we have a lock. if (isLocked && GetStreamData() && HasAnyFlag(kDTVSigMon_WaitForPAT | kDTVSigMon_WaitForPMT | kDTVSigMon_WaitForMGT | kDTVSigMon_WaitForVCT | kDTVSigMon_WaitForNIT | kDTVSigMon_WaitForSDT)) { tableMonitorThread = new IPTVTableMonitorThread(this); DBG_SM("UpdateValues", "Waiting for table monitor to start"); while (!dtvMonitorRunning) usleep(5000); DBG_SM("UpdateValues", "Table monitor started"); } update_done = true; }
/** \fn IPTVSignalMonitor::UpdateValues(void) * \brief Fills in frontend stats and emits status Qt signals. * * This is automatically called by run(), after Start() * has been used to start the signal monitoring thread. */ void IPTVSignalMonitor::UpdateValues(void) { if (lock_timer.elapsed() > m_lock_timeout) error = "Timed out."; if (!running || exit) return; if (m_streamHandlerStarted) { EmitStatus(); if (IsAllGood()) SendMessageAllGood(); // TODO dtv signals... update_done = true; return; } bool isLocked = false; { QMutexLocker locker(&statusLock); isLocked = signalLock.IsGood(); } EmitStatus(); if (IsAllGood()) SendMessageAllGood(); // Start table monitoring if we are waiting on any table // and we have a lock. if (isLocked && GetStreamData() && HasAnyFlag(kDTVSigMon_WaitForPAT | kDTVSigMon_WaitForPMT | kDTVSigMon_WaitForMGT | kDTVSigMon_WaitForVCT | kDTVSigMon_WaitForNIT | kDTVSigMon_WaitForSDT)) { GetChannel()->SetStreamData(GetStreamData()); m_streamHandlerStarted = true; } update_done = true; }
bool SignalMonitor::IsChannelTuned(void) { if (is_tuned) return true; ChannelBase::Status status = channel->GetStatus(); QMutexLocker locker(&statusLock); switch (status) { case ChannelBase::changePending: if (HasFlags(SignalMonitor::kDVBSigMon_WaitForPos)) { // Still waiting on rotor m_channelTimer.start(); channelTuned.SetValue(1); } else if (m_channelTimer.elapsed() > m_channelTimeout) { // channel change is taking too long VERBOSE(VB_IMPORTANT, "SignalMonitor: channel change timed-out"); error = QObject::tr("Error: channel change failed"); channelTuned.SetValue(2); } else channelTuned.SetValue(1); break; case ChannelBase::changeFailed: VERBOSE(VB_IMPORTANT, "SignalMonitor: channel change failed"); channelTuned.SetValue(2); error = QObject::tr("Error: channel change failed"); break; case ChannelBase::changeSuccess: channelTuned.SetValue(3); break; } EmitStatus(); if (status == ChannelBase::changeSuccess) { if (tablemon) pParent->SetupDTVSignalMonitor(eit_scan); is_tuned = true; return true; } return false; }
void ChannelChangeMonitor::UpdateValues(void) { if (!running || exit) return; if (!IsChannelTuned()) return; { QMutexLocker locker(&statusLock); signalLock.SetValue(true); signalStrength.SetValue(100); } EmitStatus(); SendMessageAllGood(); }
/** \fn DVBSignalMonitor::UpdateValues() * \brief Fills in frontend stats and emits status Qt signals. * * This is automatically called by MonitorLoop(), after Start() * has been used to start the signal monitoring thread. */ void DVBSignalMonitor::UpdateValues(void) { if (!running || exit) return; if (streamHandlerStarted) { if (!streamHandler->IsRunning()) { error = QObject::tr("Error: stream handler died"); update_done = true; return; } EmitStatus(); if (IsAllGood()) SendMessageAllGood(); // TODO dtv signals... update_done = true; return; } AddFlags(kSigMon_WaitForSig); DVBChannel *dvbchannel = GetDVBChannel(); if (!dvbchannel) return; // Handle retuning after rotor has turned if (HasFlags(SignalMonitor::kDVBSigMon_WaitForPos)) { if (dvbchannel->GetRotor()) { if (!streamHandler->IsRetuneAllowed()) streamHandler->SetRetuneAllowed(true, this, dvbchannel); streamHandler->RetuneMonitor(); } else RemoveFlags(SignalMonitor::kDVBSigMon_WaitForPos); } bool wasLocked = false, isLocked = false; uint sig = 0, snr = 0, ber = 0, ublocks = 0; // Get info from card bool has_lock = dvbchannel->HasLock(); if (HasFlags(kSigMon_WaitForSig)) sig = (uint) (dvbchannel->GetSignalStrength() * 65535); if (HasFlags(kDVBSigMon_WaitForSNR)) snr = (uint) (dvbchannel->GetSNR() * 65535); if (HasFlags(kDVBSigMon_WaitForBER)) ber = (uint) dvbchannel->GetBitErrorRate(); if (HasFlags(kDVBSigMon_WaitForUB)) ublocks = (uint) dvbchannel->GetUncorrectedBlockCount(); has_lock |= streamHandler->IsRunning(); // Set SignalMonitorValues from info from card. { QMutexLocker locker(&statusLock); // BER and UB are actually uint32 values, but we // clamp them at 64K. This is because these values // are acutally cumulative, but we don't try to // normalize these to a time period. wasLocked = signalLock.IsGood(); signalLock.SetValue((has_lock) ? 1 : 0); isLocked = signalLock.IsGood(); if (HasFlags(kSigMon_WaitForSig)) signalStrength.SetValue(sig); if (HasFlags(kDVBSigMon_WaitForSNR)) signalToNoise.SetValue(snr); if (HasFlags(kDVBSigMon_WaitForBER)) bitErrorRate.SetValue(ber); if (HasFlags(kDVBSigMon_WaitForUB)) uncorrectedBlocks.SetValue(ublocks); } // Debug output if (wasLocked != isLocked) { VERBOSE(VB_CHANNEL, LOC + "UpdateValues -- Signal " <<(isLocked ? "Locked" : "Lost")); } EmitStatus(); if (IsAllGood()) SendMessageAllGood(); // Start table monitoring if we are waiting on any table // and we have a lock. if (isLocked && GetStreamData() && (!HasFlags(kDVBSigMon_WaitForPos) || rotorPosition.IsGood()) && HasAnyFlag(kDTVSigMon_WaitForPAT | kDTVSigMon_WaitForPMT | kDTVSigMon_WaitForMGT | kDTVSigMon_WaitForVCT | kDTVSigMon_WaitForNIT | kDTVSigMon_WaitForSDT)) { GetStreamData()->AddListeningPID(MPEG_PAT_PID); streamHandler->AddListener(GetStreamData(), true, false); streamHandlerStarted = true; } update_done = true; }
/** \fn FirewireSignalMonitor::UpdateValues(void) * \brief Fills in frontend stats and emits status Qt signals. * * This function uses five ioctl's FE_READ_SNR, FE_READ_SIGNAL_STRENGTH * FE_READ_BER, FE_READ_UNCORRECTED_BLOCKS, and FE_READ_STATUS to obtain * statistics from the frontend. * * This is automatically called by MonitorLoop(), after Start() * has been used to start the signal monitoring thread. */ void FirewireSignalMonitor::UpdateValues(void) { if (!running || exit) return; if (dtvMonitorRunning) { EmitStatus(); if (IsAllGood()) SendMessageAllGood(); // TODO dtv signals... update_done = true; return; } if (stb_needs_to_wait_for_power && (stb_wait_for_power_timer.elapsed() < (int)kPowerTimeout)) { return; } stb_needs_to_wait_for_power = false; FirewireChannel *fwchan = dynamic_cast<FirewireChannel*>(channel); if (!fwchan) return; if (HasFlags(kFWSigMon_WaitForPower) && !HasFlags(kFWSigMon_PowerMatch)) { bool retried = false; while (true) { FirewireDevice::PowerState power = fwchan->GetPowerState(); if (FirewireDevice::kAVCPowerOn == power) { AddFlags(kFWSigMon_PowerSeen | kFWSigMon_PowerMatch); } else if (FirewireDevice::kAVCPowerOff == power) { AddFlags(kFWSigMon_PowerSeen); fwchan->SetPowerState(true); stb_wait_for_power_timer.start(); stb_needs_to_wait_for_power = true; } else { bool qfailed = (FirewireDevice::kAVCPowerQueryFailed == power); if (qfailed && !retried) { retried = true; continue; } LOG(VB_RECORD, LOG_WARNING, "Can't determine if STB is power on, assuming it is..."); AddFlags(kFWSigMon_PowerSeen | kFWSigMon_PowerMatch); } break; } } bool isLocked = !HasFlags(kFWSigMon_WaitForPower) || HasFlags(kFWSigMon_WaitForPower | kFWSigMon_PowerMatch); if (isLocked && stb_needs_retune) { fwchan->Retune(); isLocked = stb_needs_retune = false; } SignalMonitor::UpdateValues(); { QMutexLocker locker(&statusLock); if (!scriptStatus.IsGood()) return; } // Set SignalMonitorValues from info from card. { QMutexLocker locker(&statusLock); signalStrength.SetValue(isLocked ? 100 : 0); signalLock.SetValue(isLocked ? 1 : 0); } EmitStatus(); if (IsAllGood()) SendMessageAllGood(); // Start table monitoring if we are waiting on any table // and we have a lock. if (isLocked && GetStreamData() && HasAnyFlag(kDTVSigMon_WaitForPAT | kDTVSigMon_WaitForPMT | kDTVSigMon_WaitForMGT | kDTVSigMon_WaitForVCT | kDTVSigMon_WaitForNIT | kDTVSigMon_WaitForSDT)) { tableMonitorThread = new FirewireTableMonitorThread(this); LOG(VB_CHANNEL, LOG_INFO, LOC + "UpdateValues() -- " "Waiting for table monitor to start"); while (!dtvMonitorRunning) usleep(5000); LOG(VB_CHANNEL, LOG_INFO, LOC + "UpdateValues() -- " "Table monitor started"); } update_done = true; }
void AnalogSignalMonitor::UpdateValues(void) { SignalMonitor::UpdateValues(); { QMutexLocker locker(&statusLock); if (!scriptStatus.IsGood()) return; } if (lock_timer.elapsed() > m_lock_timeout) error = "Timed out."; if (!running || exit) return; int videofd = channel->GetFd(); if (videofd < 0) return; bool isLocked = false; if (m_usingv4l2) { if (m_driver == "hdpvr") isLocked = handleHDPVR(videofd); else { struct v4l2_tuner tuner; memset(&tuner, 0, sizeof(tuner)); if (ioctl(videofd, VIDIOC_G_TUNER, &tuner, 0) < 0) { LOG(VB_GENERAL, LOG_ERR, "Failed to probe signal (v4l2)" + ENO); } else { isLocked = tuner.signal; } } } #ifdef USING_V4L1 else { struct video_tuner tuner; memset(&tuner, 0, sizeof(tuner)); if (ioctl(videofd, VIDIOCGTUNER, &tuner, 0) < 0) { LOG(VB_GENERAL, LOG_ERR, "Failed to probe signal (v4l1)" + ENO); } else { isLocked = tuner.signal; } } #endif // USING_V4L1 { QMutexLocker locker(&statusLock); signalLock.SetValue(isLocked); if (isLocked) signalStrength.SetValue(100); } EmitStatus(); if (IsAllGood()) SendMessageAllGood(); }