static void *demod_thread_fn(void *ptr) { struct dab_state_t *dab = (struct dab_state_t*)ptr; struct sdr_state_t *sdr = (struct sdr_state_t*)dab->device_state; int i,j; while (!do_exit) { sem_wait(&data_ready); int ok = sdr_demod(&dab->tfs[dab->tfidx], sdr); if (ok) { dab_process_frame(dab); } //dab_fic_parser(dab->fib,&sinfo,&ana); // calculate error rates //dab_analyzer_calculate_error_rates(&ana,dab); int prev_freq = sdr->frequency; if (abs(sdr->coarse_freq_shift)>1) { if (sdr->coarse_freq_shift<0) sdr->frequency = sdr->frequency -1000; else sdr->frequency = sdr->frequency +1000; set_center_freq(dab, sdr->frequency); } if (abs(sdr->coarse_freq_shift) ==1) { if (sdr->coarse_freq_shift<0) sdr->frequency = sdr->frequency -rand() % 1000; else sdr->frequency = sdr->frequency +rand() % 1000; set_center_freq(dab, sdr->frequency); //fprintf(stderr,"new center freq : %i\n",rtlsdr_get_center_freq(dev)); } if (abs(sdr->coarse_freq_shift)<1 && (fabs(sdr->fine_freq_shift) > 50)) { sdr->frequency = sdr->frequency + (sdr->fine_freq_shift/3); set_center_freq(dab, sdr->frequency); //fprintf(stderr,"ffs : %f\n",sdr->fine_freq_shift); } //if (sdr->frequency != prev_freq) { // fprintf(stderr,"Adjusting centre-frequency to %dHz\n",sdr->frequency); //} ccount += 1; if (ccount == 10) { ccount = 0; //print_status(dab); } } return 0; }
void FCDInput::applySettings(const GeneralSettings& generalSettings, const Settings& settings, bool force) { bool freqChange; if((m_generalSettings.m_centerFrequency != generalSettings.m_centerFrequency)) freqChange = true; else freqChange = false; if(freqChange || force) { m_generalSettings.m_centerFrequency = generalSettings.m_centerFrequency; set_center_freq( (double)(generalSettings.m_centerFrequency) ); } if(!freqChange || force) { set_lna_gain(settings.gain); set_bias_t(settings.bias); } }
void V4LThread::OpenSource(const char *filename) { struct v4l2_format fmt; struct v4l2_buffer buf; struct v4l2_requestbuffers req; enum v4l2_buf_type type; unsigned int i; recebuf_len = 0; // fd = v4l2_open(filename, O_RDWR | O_NONBLOCK, 0); fd = open(filename, O_RDWR | O_NONBLOCK, 0); if (fd < 0) { qCritical("Cannot open /dev/swradio0 :%d", fd); return; } pixelformat = V4L2_PIX_FMT_SDR_U8; // RTLSDR has limited ioctls in 3.18, expect fail. qCritical("Want Pixelformat : CU08"); CLEAR(fmt); fmt.type = V4L2_BUF_TYPE_SDR_CAPTURE; fmt.fmt.sdr.pixelformat = pixelformat; xioctl(fd, VIDIOC_S_FMT, &fmt); qCritical("Got Pixelformat : %4.4s", (char *)&fmt.fmt.sdr.pixelformat); CLEAR(req); req.count = 8; req.type = V4L2_BUF_TYPE_SDR_CAPTURE; req.memory = V4L2_MEMORY_MMAP; xioctl(fd, VIDIOC_REQBUFS, &req); buffers = (struct v4l_buffer*) calloc(req.count, sizeof(*buffers)); for (n_buffers = 0; n_buffers < req.count; n_buffers++) { CLEAR(buf); buf.type = V4L2_BUF_TYPE_SDR_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; buf.index = n_buffers; xioctl(fd, VIDIOC_QUERYBUF, &buf); buffers[n_buffers].length = buf.length; buffers[n_buffers].start = v4l2_mmap(NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset); if (buffers[n_buffers].start == MAP_FAILED) { qCritical("V4L2 buffer mmap failed"); } } for (i = 0; i < n_buffers; i++) { CLEAR(buf); buf.type = V4L2_BUF_TYPE_SDR_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; buf.index = i; xioctl(fd, VIDIOC_QBUF, &buf); } set_sample_rate((double)SAMPLERATE); set_center_freq( centerFreq + (SAMPLERATE / 4) ); // start streaming type = V4L2_BUF_TYPE_SDR_CAPTURE; xioctl(fd, VIDIOC_STREAMON, &type); }
void FCDProInput::set_lo_ppm() { set_center_freq((double) m_settings.m_centerFrequency); }
void FCDProInput::applySettings(const FCDProSettings& settings, bool force) { bool forwardChange = false; QList<QString> reverseAPIKeys; if (force || (m_settings.m_centerFrequency != settings.m_centerFrequency)) { reverseAPIKeys.append("centerFrequency"); } if (force || (m_settings.m_transverterMode != settings.m_transverterMode)) { reverseAPIKeys.append("transverterMode"); } if (force || (m_settings.m_transverterDeltaFrequency != settings.m_transverterDeltaFrequency)) { reverseAPIKeys.append("transverterDeltaFrequency"); } if (force || (m_settings.m_centerFrequency != settings.m_centerFrequency) || (m_settings.m_transverterMode != settings.m_transverterMode) || (m_settings.m_transverterDeltaFrequency != settings.m_transverterDeltaFrequency)) { qint64 deviceCenterFrequency = settings.m_centerFrequency; deviceCenterFrequency -= settings.m_transverterMode ? settings.m_transverterDeltaFrequency : 0; deviceCenterFrequency = deviceCenterFrequency < 0 ? 0 : deviceCenterFrequency; if (m_dev != 0) { set_center_freq((double) deviceCenterFrequency); } qDebug() << "FCDProInput::applySettings: center freq: " << settings.m_centerFrequency << " Hz" << " device center freq: " << deviceCenterFrequency << " Hz"; forwardChange = (m_settings.m_centerFrequency != settings.m_centerFrequency) || force; m_settings.m_centerFrequency = settings.m_centerFrequency; } if ((m_settings.m_lnaGainIndex != settings.m_lnaGainIndex) || force) { reverseAPIKeys.append("lnaGainIndex"); if (m_dev != 0) { set_lnaGain(settings.m_lnaGainIndex); } } if ((m_settings.m_rfFilterIndex != settings.m_rfFilterIndex) || force) { reverseAPIKeys.append("rfFilterIndex"); if (m_dev != 0) { set_rfFilter(settings.m_rfFilterIndex); } } if ((m_settings.m_lnaEnhanceIndex != settings.m_lnaEnhanceIndex) || force) { reverseAPIKeys.append("lnaEnhanceIndex"); if (m_dev != 0) { set_lnaEnhance(settings.m_lnaEnhanceIndex); } } if ((m_settings.m_bandIndex != settings.m_bandIndex) || force) { reverseAPIKeys.append("bandIndex"); if (m_dev != 0) { set_band(settings.m_bandIndex); } } if ((m_settings.m_mixerGainIndex != settings.m_mixerGainIndex) || force) { reverseAPIKeys.append("mixerGainIndex"); if (m_dev != 0) { set_mixerGain(settings.m_mixerGainIndex); } } if ((m_settings.m_mixerFilterIndex != settings.m_mixerFilterIndex) || force) { reverseAPIKeys.append("mixerFilterIndex"); if (m_dev != 0) { set_mixerFilter(settings.m_mixerFilterIndex); } } if ((m_settings.m_biasCurrentIndex != settings.m_biasCurrentIndex) || force) { reverseAPIKeys.append("biasCurrentIndex"); if (m_dev != 0) { set_biasCurrent(settings.m_biasCurrentIndex); } } if ((m_settings.m_modeIndex != settings.m_modeIndex) || force) { reverseAPIKeys.append("modeIndex"); if (m_dev != 0) { set_mode(settings.m_modeIndex); } } if ((m_settings.m_gain1Index != settings.m_gain1Index) || force) { reverseAPIKeys.append("gain1Index"); if (m_dev != 0) { set_gain1(settings.m_gain1Index); } } if ((m_settings.m_rcFilterIndex != settings.m_rcFilterIndex) || force) { reverseAPIKeys.append("rcFilterIndex"); if (m_dev != 0) { set_rcFilter(settings.m_rcFilterIndex); } } if ((m_settings.m_gain2Index != settings.m_gain2Index) || force) { reverseAPIKeys.append("gain2Index"); if (m_dev != 0) { set_gain2(settings.m_gain2Index); } } if ((m_settings.m_gain3Index != settings.m_gain3Index) || force) { reverseAPIKeys.append("gain3Index"); if (m_dev != 0) { set_gain3(settings.m_gain3Index); } } if ((m_settings.m_gain4Index != settings.m_gain4Index) || force) { reverseAPIKeys.append("gain4Index"); if (m_dev != 0) { set_gain4(settings.m_gain4Index); } } if ((m_settings.m_ifFilterIndex != settings.m_ifFilterIndex) || force) { reverseAPIKeys.append("ifFilterIndex"); if (m_dev != 0) { set_ifFilter(settings.m_ifFilterIndex); } } if ((m_settings.m_gain5Index != settings.m_gain5Index) || force) { reverseAPIKeys.append("gain5Index"); if (m_dev != 0) { set_gain5(settings.m_gain5Index); } } if ((m_settings.m_gain6Index != settings.m_gain6Index) || force) { reverseAPIKeys.append("gain6Index"); if (m_dev != 0) { set_gain6(settings.m_gain6Index); } } if ((m_settings.m_LOppmTenths != settings.m_LOppmTenths) || force) { reverseAPIKeys.append("LOppmTenths"); m_settings.m_LOppmTenths = settings.m_LOppmTenths; if (m_dev != 0) { set_lo_ppm(); } } if ((m_settings.m_dcBlock != settings.m_dcBlock) || force) { reverseAPIKeys.append("dcBlock"); m_deviceAPI->configureCorrections(settings.m_dcBlock, settings.m_iqCorrection); } if ((m_settings.m_iqCorrection != settings.m_iqCorrection) || force) { reverseAPIKeys.append("iqCorrection"); m_deviceAPI->configureCorrections(settings.m_dcBlock, settings.m_iqCorrection); } if (settings.m_useReverseAPI) { bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex); webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); } m_settings = settings; if (forwardChange) { DSPSignalNotification *notif = new DSPSignalNotification(fcd_traits<Pro>::sampleRate, m_settings.m_centerFrequency); m_fileSink->handleMessage(*notif); // forward to file sink m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); } }
void FCDProPlusInput::applySettings(const FCDProPlusSettings& settings, bool force) { bool signalChange = false; if ((m_settings.m_centerFrequency != settings.m_centerFrequency) || force) { qDebug() << "FCDProPlusInput::applySettings: fc: " << settings.m_centerFrequency; m_settings.m_centerFrequency = settings.m_centerFrequency; if (m_dev != 0) { set_center_freq((double) m_settings.m_centerFrequency); } signalChange = true; } if ((m_settings.m_lnaGain != settings.m_lnaGain) || force) { m_settings.m_lnaGain = settings.m_lnaGain; if (m_dev != 0) { set_lna_gain(settings.m_lnaGain); } } if ((m_settings.m_biasT != settings.m_biasT) || force) { m_settings.m_biasT = settings.m_biasT; if (m_dev != 0) { set_bias_t(settings.m_biasT); } } if ((m_settings.m_mixGain != settings.m_mixGain) || force) { m_settings.m_mixGain = settings.m_mixGain; if (m_dev != 0) { set_mixer_gain(settings.m_mixGain); } } if ((m_settings.m_ifGain != settings.m_ifGain) || force) { m_settings.m_ifGain = settings.m_ifGain; if (m_dev != 0) { set_if_gain(settings.m_ifGain); } } if ((m_settings.m_ifFilterIndex != settings.m_ifFilterIndex) || force) { m_settings.m_ifFilterIndex = settings.m_ifFilterIndex; if (m_dev != 0) { set_if_filter(settings.m_ifFilterIndex); } } if ((m_settings.m_rfFilterIndex != settings.m_rfFilterIndex) || force) { m_settings.m_rfFilterIndex = settings.m_rfFilterIndex; if (m_dev != 0) { set_rf_filter(settings.m_rfFilterIndex); } } if ((m_settings.m_LOppmTenths != settings.m_LOppmTenths) || force) { m_settings.m_LOppmTenths = settings.m_LOppmTenths; if (m_dev != 0) { set_lo_ppm(); } } if ((m_settings.m_dcBlock != settings.m_dcBlock) || force) { m_settings.m_dcBlock = settings.m_dcBlock; m_deviceAPI->configureCorrections(m_settings.m_dcBlock, m_settings.m_iqImbalance); } if ((m_settings.m_iqImbalance != settings.m_iqImbalance) || force) { m_settings.m_iqImbalance = settings.m_iqImbalance; m_deviceAPI->configureCorrections(m_settings.m_dcBlock, m_settings.m_iqImbalance); } if (signalChange) { DSPSignalNotification *notif = new DSPSignalNotification(fcd_traits<ProPlus>::sampleRate, m_settings.m_centerFrequency); m_deviceAPI->getDeviceInputMessageQueue()->push(notif); } }