void CubicSDR::setDevice(SDRDeviceInfo *dev) { if (!sdrThread->isTerminated()) { sdrThread->terminate(); if (t_SDR) { t_SDR->join(); delete t_SDR; } } for (SoapySDR::Kwargs::const_iterator i = settingArgs.begin(); i != settingArgs.end(); i++) { sdrThread->writeSetting(i->first, i->second); } sdrThread->setStreamArgs(streamArgs); sdrThread->setDevice(dev); DeviceConfig *devConfig = config.getDevice(dev->getDeviceId()); SoapySDR::Device *soapyDev = dev->getSoapyDevice(); if (soapyDev) { if (long devSampleRate = devConfig->getSampleRate()) { sampleRate = dev->getSampleRateNear(SOAPY_SDR_RX, 0, devSampleRate); sampleRateInitialized.store(true); } if (!sampleRateInitialized.load()) { sampleRate = dev->getSampleRateNear(SOAPY_SDR_RX, 0, DEFAULT_SAMPLE_RATE); sampleRateInitialized.store(true); } else { sampleRate = dev->getSampleRateNear(SOAPY_SDR_RX, 0, sampleRate); } if (frequency < sampleRate/2) { frequency = sampleRate/2; } setFrequency(frequency); setSampleRate(sampleRate); setPPM(devConfig->getPPM()); setOffset(devConfig->getOffset()); if (devConfig->getAGCMode()) { setAGCMode(true); } else { setAGCMode(false); } t_SDR = new std::thread(&SDRThread::threadMain, sdrThread); } stoppedDev = nullptr; }
void initReceiveChannel() { setRXMode(modeAM); SetRXABandpassFreqs(CHANNEL_RX, (double)filterLow, (double)filterHigh); setFilter(filterLow, filterHigh); setAGCMode(AGC_MEDIUM); SetRXAAMDSBMode(CHANNEL_RX, 0); SetRXAShiftRun(CHANNEL_RX, 0); SetRXAEMNRPosition(CHANNEL_RX, nr_agc); SetRXAEMNRgainMethod(CHANNEL_RX, nr2_gain_method); SetRXAEMNRnpeMethod(CHANNEL_RX, nr2_npe_method); SetRXAEMNRRun(CHANNEL_RX, nr2); SetRXAEMNRaeRun(CHANNEL_RX, nr2_ae); SetRXAANRVals(CHANNEL_RX, 64, 16, 16e-4, 10e-7); // defaults SetRXAANRRun(CHANNEL_RX, nr); SetRXAANFRun(CHANNEL_RX, anf); SetRXASNBARun(CHANNEL_RX, snb); SetRXAPanelGain1(CHANNEL_RX, 0.9);//volume SetRXAShiftFreq(CHANNEL_RX, 0.0); SetRXAShiftRun(CHANNEL_RX, 0); SetChannelState(CHANNEL_RX,1,0); }
void DeviceConfig::load(DataNode *node) { std::lock_guard < std::mutex > lock(busy_lock); if (node->hasAnother("name")) { deviceName = node->getNext("name")->element()->toString(); } if (node->hasAnother("ppm")) { DataNode *ppm_node = node->getNext("ppm"); int ppmValue = 0; ppm_node->element()->get(ppmValue); setPPM(ppmValue); } if (node->hasAnother("offset")) { DataNode *offset_node = node->getNext("offset"); long long offsetValue = 0; offset_node->element()->get(offsetValue); setOffset(offsetValue); } if (node->hasAnother("agc_mode")) { DataNode *agc_node = node->getNext("agc_mode"); int agcModeValue = 0; agc_node->element()->get(agcModeValue); setAGCMode(agcModeValue?true:false); } if (node->hasAnother("sample_rate")) { DataNode *sample_rate_node = node->getNext("sample_rate"); long sampleRateValue = 0; sample_rate_node->element()->get(sampleRateValue); setSampleRate(sampleRateValue); } if (node->hasAnother("antenna")) { DataNode *antenna_node = node->getNext("antenna"); std::string antennaNameValue; antenna_node->element()->get(antennaNameValue); setAntennaName(antennaNameValue); } if (node->hasAnother("streamOpts")) { DataNode *streamOptsNode = node->getNext("streamOpts"); for (int i = 0, iMax = streamOptsNode->numChildren(); i<iMax; i++) { DataNode *streamOptNode = streamOptsNode->child(i); std::string keyName = streamOptNode->getName(); std::string strSettingValue = streamOptNode->element()->toString(); if (keyName != "") { setStreamOpt(keyName, strSettingValue); } } } if (node->hasAnother("settings")) { DataNode *settingsNode = node->getNext("settings"); for (int i = 0, iMax = settingsNode->numChildren(); i<iMax; i++) { DataNode *settingNode = settingsNode->child(i); std::string keyName = settingNode->getName(); std::string strSettingValue = settingNode->element()->toString(); if (keyName != "") { setSetting(keyName, strSettingValue); } } } if (node->hasAnother("rig_ifs")) { DataNode *rigIFNodes = node->getNext("rig_ifs"); while (rigIFNodes->hasAnother("rig_if")) { DataNode *rigIFNode = rigIFNodes->getNext("rig_if"); if (rigIFNode->hasAnother("model") && rigIFNode->hasAnother("sdr_if")) { int load_model; long long load_freq; rigIFNode->getNext("model")->element()->get(load_model); rigIFNode->getNext("sdr_if")->element()->get(load_freq); rigIF[load_model] = load_freq; } } } if (node->hasAnother("gains")) { DataNode *gainsNode = node->getNext("gains"); while (gainsNode->hasAnother("gain")) { DataNode *gainNode = gainsNode->getNext("gain"); std::string keyName; float fltSettingValue; gainNode->getNext("id")->element()->get(keyName); gainNode->getNext("value")->element()->get(fltSettingValue); if (keyName != "" && !(fltSettingValue!=fltSettingValue)) { setGain(keyName, fltSettingValue); } } } }