void SignalMonitor::RemoveFlags(uint64_t _flags) { DBG_SM("RemoveFlags", sm_flags_to_string(_flags)); flags &= ~_flags; }
/** * \brief Initializes signal lock and signal values. * * Start() must be called to actually begin continuous * signal monitoring. The timeout is set to 3 seconds, * and the signal threshold is initialized to 0%. * * \param db_cardnum Recorder number to monitor, * if this is less than 0, SIGNAL events will not be * sent to the frontend even if SetNotifyFrontend(true) * is called. * \param _channel DVBChannel for card * \param _flags Flags to start with */ DVBSignalMonitor::DVBSignalMonitor(int db_cardnum, DVBChannel* _channel, uint64_t _flags) : DTVSignalMonitor(db_cardnum, _channel, _flags), // This snr setup is incorrect for API 3.x but works better // than int16_t range in practice, however this is correct // for the 4.0 DVB API which uses a uint16_t for the snr signalToNoise (QObject::tr("Signal To Noise"), "snr", 0, true, 0, 65535, 0), bitErrorRate (QObject::tr("Bit Error Rate"), "ber", 65535, false, 0, 65535, 0), uncorrectedBlocks(QObject::tr("Uncorrected Blocks"), "ucb", 65535, false, 0, 65535, 0), rotorPosition (QObject::tr("Rotor Progress"), "pos", 100, true, 0, 100, 0), streamHandlerStarted(false), streamHandler(NULL) { // These two values should probably come from the database... int wait = 3000; // timeout when waiting on signal int threshold = 0; // signal strength threshold signalLock.SetTimeout(wait); signalStrength.SetTimeout(wait); signalStrength.SetThreshold(threshold); // This is incorrect for API 3.x but works better than int16_t range // in practice, however this is correct for the 4.0 DVB API signalStrength.SetRange(0, 65535); bool ok; _channel->HasLock(&ok); if (!ok) VERBOSE(VB_IMPORTANT, LOC_ERR + "Cannot read DVB status" + ENO); uint64_t rmflags = 0; #define DVB_IO(FLAG, METHOD, MSG) \ do { if (HasFlags(FLAG)) { bool ok; _channel->METHOD(&ok); \ if (!ok) { \ VERBOSE(VB_IMPORTANT, LOC_WARN+"Cannot "+MSG+ENO); \ rmflags |= FLAG; } \ else { \ VERBOSE(VB_CHANNEL, LOC + "Can " + MSG); } } } while (false) DVB_IO(kSigMon_WaitForSig, GetSignalStrength, "measure Signal Strength"); DVB_IO(kDVBSigMon_WaitForSNR, GetSNR, "measure S/N"); DVB_IO(kDVBSigMon_WaitForBER, GetBitErrorRate, "measure Bit Error Rate"); DVB_IO(kDVBSigMon_WaitForUB, GetUncorrectedBlockCount, "count Uncorrected Blocks"); #undef DVB_IO RemoveFlags(rmflags); VERBOSE(VB_CHANNEL, LOC + "DVBSignalMonitor::ctor " + QString("initial flags %1").arg(sm_flags_to_string(flags))); minimum_update_rate = _channel->GetMinSignalMonitorDelay(); if (minimum_update_rate > 30) usleep(minimum_update_rate * 1000); streamHandler = DVBStreamHandler::Get(_channel->GetCardNum()); }
void SignalMonitor::AddFlags(uint64_t _flags) { DBG_SM("AddFlags", sm_flags_to_string(_flags)); flags |= _flags; }