mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2025-09-08 16:18:01 -04:00
Internal frequency locking support
This commit is contained in:
parent
6471287045
commit
1699c50676
@ -449,6 +449,25 @@ long long CubicSDR::getFrequency() {
|
|||||||
return frequency;
|
return frequency;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CubicSDR::lockFrequency(long long freq) {
|
||||||
|
frequency_locked.store(true);
|
||||||
|
lock_freq.store(freq);
|
||||||
|
|
||||||
|
if (sdrThread && !sdrThread->isTerminated()) {
|
||||||
|
sdrThread->lockFrequency(freq);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CubicSDR::isFrequencyLocked() {
|
||||||
|
return frequency_locked.load();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CubicSDR::unlockFrequency() {
|
||||||
|
frequency_locked.store(false);
|
||||||
|
sdrThread->unlockFrequency();
|
||||||
|
}
|
||||||
|
|
||||||
void CubicSDR::setSampleRate(long long rate_in) {
|
void CubicSDR::setSampleRate(long long rate_in) {
|
||||||
sampleRate = rate_in;
|
sampleRate = rate_in;
|
||||||
sdrThread->setSampleRate(sampleRate);
|
sdrThread->setSampleRate(sampleRate);
|
||||||
|
@ -84,6 +84,10 @@ public:
|
|||||||
|
|
||||||
void setFrequency(long long freq);
|
void setFrequency(long long freq);
|
||||||
long long getFrequency();
|
long long getFrequency();
|
||||||
|
|
||||||
|
void lockFrequency(long long freq);
|
||||||
|
bool isFrequencyLocked();
|
||||||
|
void unlockFrequency();
|
||||||
|
|
||||||
void setOffset(long long ofs);
|
void setOffset(long long ofs);
|
||||||
long long getOffset();
|
long long getOffset();
|
||||||
@ -195,6 +199,8 @@ private:
|
|||||||
std::string notifyMessage;
|
std::string notifyMessage;
|
||||||
std::string modulePath;
|
std::string modulePath;
|
||||||
std::mutex notify_busy;
|
std::mutex notify_busy;
|
||||||
|
std::atomic_bool frequency_locked;
|
||||||
|
std::atomic_llong lock_freq;
|
||||||
#ifdef USE_HAMLIB
|
#ifdef USE_HAMLIB
|
||||||
RigThread *rigThread;
|
RigThread *rigThread;
|
||||||
std::thread *t_Rig;
|
std::thread *t_Rig;
|
||||||
|
@ -33,6 +33,9 @@ SDRThread::SDRThread() : IOThread(), buffers("SDRThreadBuffers") {
|
|||||||
agc_mode_changed.store(false);
|
agc_mode_changed.store(false);
|
||||||
gain_value_changed.store(false);
|
gain_value_changed.store(false);
|
||||||
setting_value_changed.store(false);
|
setting_value_changed.store(false);
|
||||||
|
frequency_lock_init.store(false);
|
||||||
|
frequency_locked.store(false);
|
||||||
|
lock_freq.store(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
SDRThread::~SDRThread() {
|
SDRThread::~SDRThread() {
|
||||||
@ -241,7 +244,12 @@ void SDRThread::updateSettings() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (freq_changed.load()) {
|
if (freq_changed.load()) {
|
||||||
device->setFrequency(SOAPY_SDR_RX,0,"RF",frequency.load() - offset.load());
|
if (frequency_locked.load() && !frequency_lock_init.load()) {
|
||||||
|
device->setFrequency(SOAPY_SDR_RX,0,"RF",lock_freq.load());
|
||||||
|
frequency_lock_init.store(true);
|
||||||
|
} else if (!frequency_locked.load()) {
|
||||||
|
device->setFrequency(SOAPY_SDR_RX,0,"RF",frequency.load() - offset.load());
|
||||||
|
}
|
||||||
freq_changed.store(false);
|
freq_changed.store(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -372,6 +380,23 @@ long long SDRThread::getFrequency() {
|
|||||||
return frequency.load();
|
return frequency.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SDRThread::lockFrequency(long long freq) {
|
||||||
|
lock_freq.store(freq);
|
||||||
|
frequency_locked.store(true);
|
||||||
|
frequency_lock_init.store(false);
|
||||||
|
setFrequency(freq);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SDRThread::isFrequencyLocked() {
|
||||||
|
return frequency_locked.load();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDRThread::unlockFrequency() {
|
||||||
|
frequency_locked.store(false);
|
||||||
|
frequency_lock_init.store(false);
|
||||||
|
freq_changed.store(true);
|
||||||
|
}
|
||||||
|
|
||||||
void SDRThread::setOffset(long long ofs) {
|
void SDRThread::setOffset(long long ofs) {
|
||||||
offset.store(ofs);
|
offset.store(ofs);
|
||||||
offset_changed.store(true);
|
offset_changed.store(true);
|
||||||
|
@ -60,6 +60,10 @@ public:
|
|||||||
void setFrequency(long long freq);
|
void setFrequency(long long freq);
|
||||||
long long getFrequency();
|
long long getFrequency();
|
||||||
|
|
||||||
|
void lockFrequency(long long freq);
|
||||||
|
bool isFrequencyLocked();
|
||||||
|
void unlockFrequency();
|
||||||
|
|
||||||
void setOffset(long long ofs);
|
void setOffset(long long ofs);
|
||||||
long long getOffset();
|
long long getOffset();
|
||||||
|
|
||||||
@ -98,11 +102,11 @@ protected:
|
|||||||
std::map<std::string, bool> settingChanged;
|
std::map<std::string, bool> settingChanged;
|
||||||
|
|
||||||
std::atomic<uint32_t> sampleRate;
|
std::atomic<uint32_t> sampleRate;
|
||||||
std::atomic_llong frequency, offset;
|
std::atomic_llong frequency, offset, lock_freq;
|
||||||
std::atomic_int ppm, numElems, numChannels;
|
std::atomic_int ppm, numElems, numChannels;
|
||||||
std::atomic_bool hasPPM, hasHardwareDC;
|
std::atomic_bool hasPPM, hasHardwareDC;
|
||||||
std::atomic_bool agc_mode, rate_changed, freq_changed, offset_changed,
|
std::atomic_bool agc_mode, rate_changed, freq_changed, offset_changed,
|
||||||
ppm_changed, device_changed, agc_mode_changed, gain_value_changed, setting_value_changed;
|
ppm_changed, device_changed, agc_mode_changed, gain_value_changed, setting_value_changed, frequency_locked, frequency_lock_init;
|
||||||
|
|
||||||
std::mutex gain_busy;
|
std::mutex gain_busy;
|
||||||
std::map<std::string, float> gainValues;
|
std::map<std::string, float> gainValues;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user