mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2025-05-18 08:18:56 -04:00
Merge pull request #291 from cjcliffe/rig_follow
Toggle rig control/follow, rigthread fixes, save rig control state
This commit is contained in:
commit
be68c7eac7
@ -205,9 +205,12 @@ AppConfig::AppConfig() : configName("") {
|
|||||||
waterfallLinesPerSec.store(DEFAULT_WATERFALL_LPS);
|
waterfallLinesPerSec.store(DEFAULT_WATERFALL_LPS);
|
||||||
spectrumAvgSpeed.store(0.65f);
|
spectrumAvgSpeed.store(0.65f);
|
||||||
#ifdef USE_HAMLIB
|
#ifdef USE_HAMLIB
|
||||||
|
rigEnabled.store(false);
|
||||||
rigModel.store(1);
|
rigModel.store(1);
|
||||||
rigRate.store(57600);
|
rigRate.store(57600);
|
||||||
rigPort = "/dev/ttyUSB0";
|
rigPort = "/dev/ttyUSB0";
|
||||||
|
rigControlMode.store(true);
|
||||||
|
rigFollowMode.store(true);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -383,9 +386,12 @@ bool AppConfig::save() {
|
|||||||
|
|
||||||
#ifdef USE_HAMLIB
|
#ifdef USE_HAMLIB
|
||||||
DataNode *rig_node = cfg.rootNode()->newChild("rig");
|
DataNode *rig_node = cfg.rootNode()->newChild("rig");
|
||||||
|
*rig_node->newChild("enabled") = rigEnabled.load()?1:0;
|
||||||
*rig_node->newChild("model") = rigModel.load();
|
*rig_node->newChild("model") = rigModel.load();
|
||||||
*rig_node->newChild("rate") = rigRate.load();
|
*rig_node->newChild("rate") = rigRate.load();
|
||||||
*rig_node->newChild("port") = rigPort;
|
*rig_node->newChild("port") = rigPort;
|
||||||
|
*rig_node->newChild("control") = rigControlMode.load()?1:0;
|
||||||
|
*rig_node->newChild("follow") = rigFollowMode.load()?1:0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
std::string cfgFileName = getConfigFileName();
|
std::string cfgFileName = getConfigFileName();
|
||||||
@ -526,6 +532,11 @@ bool AppConfig::load() {
|
|||||||
if (cfg.rootNode()->hasAnother("rig")) {
|
if (cfg.rootNode()->hasAnother("rig")) {
|
||||||
DataNode *rig_node = cfg.rootNode()->getNext("rig");
|
DataNode *rig_node = cfg.rootNode()->getNext("rig");
|
||||||
|
|
||||||
|
if (rig_node->hasAnother("enabled")) {
|
||||||
|
int loadEnabled;
|
||||||
|
rig_node->getNext("enabled")->element()->get(loadEnabled);
|
||||||
|
rigEnabled.store(loadEnabled?true:false);
|
||||||
|
}
|
||||||
if (rig_node->hasAnother("model")) {
|
if (rig_node->hasAnother("model")) {
|
||||||
int loadModel;
|
int loadModel;
|
||||||
rig_node->getNext("model")->element()->get(loadModel);
|
rig_node->getNext("model")->element()->get(loadModel);
|
||||||
@ -539,6 +550,16 @@ bool AppConfig::load() {
|
|||||||
if (rig_node->hasAnother("port")) {
|
if (rig_node->hasAnother("port")) {
|
||||||
rigPort = rig_node->getNext("port")->element()->toString();
|
rigPort = rig_node->getNext("port")->element()->toString();
|
||||||
}
|
}
|
||||||
|
if (rig_node->hasAnother("control")) {
|
||||||
|
int loadControl;
|
||||||
|
rig_node->getNext("control")->element()->get(loadControl);
|
||||||
|
rigControlMode.store(loadControl?true:false);
|
||||||
|
}
|
||||||
|
if (rig_node->hasAnother("follow")) {
|
||||||
|
int loadFollow;
|
||||||
|
rig_node->getNext("follow")->element()->get(loadFollow);
|
||||||
|
rigFollowMode.store(loadFollow?true:false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -578,4 +599,28 @@ void AppConfig::setRigPort(std::string rigPort) {
|
|||||||
this->rigPort = rigPort;
|
this->rigPort = rigPort;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AppConfig::setRigControlMode(bool cMode) {
|
||||||
|
rigControlMode.store(cMode);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AppConfig::getRigControlMode() {
|
||||||
|
return rigControlMode.load();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppConfig::setRigFollowMode(bool fMode) {
|
||||||
|
rigFollowMode.store(fMode);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AppConfig::getRigFollowMode() {
|
||||||
|
return rigFollowMode.load();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppConfig::setRigEnabled(bool enabled) {
|
||||||
|
rigEnabled.store(enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AppConfig::getRigEnabled() {
|
||||||
|
return rigEnabled.load();
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -100,6 +100,15 @@ public:
|
|||||||
|
|
||||||
std::string getRigPort();
|
std::string getRigPort();
|
||||||
void setRigPort(std::string rigPort);
|
void setRigPort(std::string rigPort);
|
||||||
|
|
||||||
|
void setRigControlMode(bool cMode);
|
||||||
|
bool getRigControlMode();
|
||||||
|
|
||||||
|
void setRigFollowMode(bool fMode);
|
||||||
|
bool getRigFollowMode();
|
||||||
|
|
||||||
|
void setRigEnabled(bool enabled);
|
||||||
|
bool getRigEnabled();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void setConfigName(std::string configName);
|
void setConfigName(std::string configName);
|
||||||
@ -122,5 +131,6 @@ private:
|
|||||||
#if USE_HAMLIB
|
#if USE_HAMLIB
|
||||||
std::atomic_int rigModel, rigRate;
|
std::atomic_int rigModel, rigRate;
|
||||||
std::string rigPort;
|
std::string rigPort;
|
||||||
|
std::atomic_bool rigEnabled, rigFollowMode, rigControlMode;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
@ -447,6 +447,12 @@ AppFrame::AppFrame() :
|
|||||||
|
|
||||||
rigMenu->Append(wxID_RIG_SDR_IF, wxT("SDR-IF"));
|
rigMenu->Append(wxID_RIG_SDR_IF, wxT("SDR-IF"));
|
||||||
|
|
||||||
|
rigControlMenuItem = rigMenu->AppendCheckItem(wxID_RIG_CONTROL, wxT("Control Rig"));
|
||||||
|
rigControlMenuItem->Check(wxGetApp().getConfig()->getRigControlMode());
|
||||||
|
|
||||||
|
rigFollowMenuItem = rigMenu->AppendCheckItem(wxID_RIG_FOLLOW, wxT("Follow Rig"));
|
||||||
|
rigFollowMenuItem->Check(wxGetApp().getConfig()->getRigFollowMode());
|
||||||
|
|
||||||
wxMenu *rigModelMenu = new wxMenu;
|
wxMenu *rigModelMenu = new wxMenu;
|
||||||
RigList &rl = RigThread::enumerate();
|
RigList &rl = RigThread::enumerate();
|
||||||
numRigs = rl.size();
|
numRigs = rl.size();
|
||||||
@ -685,6 +691,11 @@ void AppFrame::updateDeviceParams() {
|
|||||||
|
|
||||||
|
|
||||||
#if USE_HAMLIB
|
#if USE_HAMLIB
|
||||||
|
if (wxGetApp().getConfig()->getRigEnabled() && !wxGetApp().rigIsActive()) {
|
||||||
|
enableRig();
|
||||||
|
rigEnableMenuItem->Check(true);
|
||||||
|
}
|
||||||
|
|
||||||
std::string deviceId = devInfo->getDeviceId();
|
std::string deviceId = devInfo->getDeviceId();
|
||||||
DeviceConfig *devConfig = wxGetApp().getConfig()->getDevice(deviceId);
|
DeviceConfig *devConfig = wxGetApp().getConfig()->getDevice(deviceId);
|
||||||
|
|
||||||
@ -701,6 +712,33 @@ void AppFrame::updateDeviceParams() {
|
|||||||
deviceChanged.store(false);
|
deviceChanged.store(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_HAMLIB
|
||||||
|
void AppFrame::enableRig() {
|
||||||
|
wxGetApp().stopRig();
|
||||||
|
wxGetApp().initRig(rigModel, rigPort, rigSerialRate);
|
||||||
|
|
||||||
|
if (devInfo != nullptr) {
|
||||||
|
std::string deviceId = devInfo->getDeviceId();
|
||||||
|
DeviceConfig *devConfig = wxGetApp().getConfig()->getDevice(deviceId);
|
||||||
|
rigSDRIF = devConfig->getRigIF(rigModel);
|
||||||
|
if (rigSDRIF) {
|
||||||
|
wxGetApp().lockFrequency(rigSDRIF);
|
||||||
|
} else {
|
||||||
|
wxGetApp().unlockFrequency();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
wxGetApp().unlockFrequency();
|
||||||
|
}
|
||||||
|
|
||||||
|
wxGetApp().getConfig()->setRigEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppFrame::disableRig() {
|
||||||
|
wxGetApp().stopRig();
|
||||||
|
wxGetApp().unlockFrequency();
|
||||||
|
wxGetApp().getConfig()->setRigEnabled(false);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void AppFrame::OnMenu(wxCommandEvent& event) {
|
void AppFrame::OnMenu(wxCommandEvent& event) {
|
||||||
if (event.GetId() >= wxID_RT_AUDIO_DEVICE && event.GetId() < wxID_RT_AUDIO_DEVICE + (int)devices.size()) {
|
if (event.GetId() >= wxID_RT_AUDIO_DEVICE && event.GetId() < wxID_RT_AUDIO_DEVICE + (int)devices.size()) {
|
||||||
@ -972,24 +1010,9 @@ void AppFrame::OnMenu(wxCommandEvent& event) {
|
|||||||
if (event.GetId() == wxID_RIG_TOGGLE) {
|
if (event.GetId() == wxID_RIG_TOGGLE) {
|
||||||
resetRig = false;
|
resetRig = false;
|
||||||
if (!wxGetApp().rigIsActive()) {
|
if (!wxGetApp().rigIsActive()) {
|
||||||
wxGetApp().stopRig();
|
enableRig();
|
||||||
wxGetApp().initRig(rigModel, rigPort, rigSerialRate);
|
|
||||||
|
|
||||||
if (devInfo != nullptr) {
|
|
||||||
std::string deviceId = devInfo->getDeviceId();
|
|
||||||
DeviceConfig *devConfig = wxGetApp().getConfig()->getDevice(deviceId);
|
|
||||||
rigSDRIF = devConfig->getRigIF(rigModel);
|
|
||||||
if (rigSDRIF) {
|
|
||||||
wxGetApp().lockFrequency(rigSDRIF);
|
|
||||||
} else {
|
|
||||||
wxGetApp().unlockFrequency();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
wxGetApp().unlockFrequency();
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
wxGetApp().stopRig();
|
disableRig();
|
||||||
wxGetApp().unlockFrequency();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1010,6 +1033,28 @@ void AppFrame::OnMenu(wxCommandEvent& event) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (event.GetId() == wxID_RIG_CONTROL) {
|
||||||
|
if (wxGetApp().rigIsActive()) {
|
||||||
|
RigThread *rt = wxGetApp().getRigThread();
|
||||||
|
rt->setControlMode(!rt->getControlMode());
|
||||||
|
rigControlMenuItem->Check(rt->getControlMode());
|
||||||
|
wxGetApp().getConfig()->setRigControlMode(rt->getControlMode());
|
||||||
|
} else {
|
||||||
|
wxGetApp().getConfig()->setRigControlMode(rigControlMenuItem->IsChecked());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.GetId() == wxID_RIG_FOLLOW) {
|
||||||
|
if (wxGetApp().rigIsActive()) {
|
||||||
|
RigThread *rt = wxGetApp().getRigThread();
|
||||||
|
rt->setFollowMode(!rt->getFollowMode());
|
||||||
|
rigFollowMenuItem->Check(rt->getFollowMode());
|
||||||
|
wxGetApp().getConfig()->setRigFollowMode(rt->getFollowMode());
|
||||||
|
} else {
|
||||||
|
wxGetApp().getConfig()->setRigFollowMode(rigFollowMenuItem->IsChecked());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (wxGetApp().rigIsActive() && resetRig) {
|
if (wxGetApp().rigIsActive() && resetRig) {
|
||||||
wxGetApp().stopRig();
|
wxGetApp().stopRig();
|
||||||
wxGetApp().initRig(rigModel, rigPort, rigSerialRate);
|
wxGetApp().initRig(rigModel, rigPort, rigSerialRate);
|
||||||
@ -1034,9 +1079,12 @@ void AppFrame::OnClose(wxCloseEvent& event) {
|
|||||||
wxGetApp().getConfig()->setWaterfallLinesPerSec(waterfallDataThread->getLinesPerSecond());
|
wxGetApp().getConfig()->setWaterfallLinesPerSec(waterfallDataThread->getLinesPerSecond());
|
||||||
wxGetApp().getConfig()->setManualDevices(SDREnumerator::getManuals());
|
wxGetApp().getConfig()->setManualDevices(SDREnumerator::getManuals());
|
||||||
#ifdef USE_HAMLIB
|
#ifdef USE_HAMLIB
|
||||||
|
wxGetApp().getConfig()->setRigEnabled(rigEnableMenuItem->IsChecked());
|
||||||
wxGetApp().getConfig()->setRigModel(rigModel);
|
wxGetApp().getConfig()->setRigModel(rigModel);
|
||||||
wxGetApp().getConfig()->setRigRate(rigSerialRate);
|
wxGetApp().getConfig()->setRigRate(rigSerialRate);
|
||||||
wxGetApp().getConfig()->setRigPort(rigPort);
|
wxGetApp().getConfig()->setRigPort(rigPort);
|
||||||
|
wxGetApp().getConfig()->setRigFollowMode(rigFollowMenuItem->IsChecked());
|
||||||
|
wxGetApp().getConfig()->setRigControlMode(rigControlMenuItem->IsChecked());
|
||||||
#endif
|
#endif
|
||||||
wxGetApp().getConfig()->save();
|
wxGetApp().getConfig()->save();
|
||||||
event.Skip();
|
event.Skip();
|
||||||
@ -1348,6 +1396,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) {
|
|||||||
if (rigEnableMenuItem->IsChecked()) {
|
if (rigEnableMenuItem->IsChecked()) {
|
||||||
if (!wxGetApp().rigIsActive()) {
|
if (!wxGetApp().rigIsActive()) {
|
||||||
rigEnableMenuItem->Check(false);
|
rigEnableMenuItem->Check(false);
|
||||||
|
wxGetApp().getConfig()->setRigEnabled(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -56,6 +56,8 @@
|
|||||||
#define wxID_RIG_TOGGLE 11900
|
#define wxID_RIG_TOGGLE 11900
|
||||||
#define wxID_RIG_PORT 11901
|
#define wxID_RIG_PORT 11901
|
||||||
#define wxID_RIG_SDR_IF 11902
|
#define wxID_RIG_SDR_IF 11902
|
||||||
|
#define wxID_RIG_CONTROL 11903
|
||||||
|
#define wxID_RIG_FOLLOW 11904
|
||||||
#define wxID_RIG_SERIAL_BASE 11950
|
#define wxID_RIG_SERIAL_BASE 11950
|
||||||
#define wxID_RIG_MODEL_BASE 12000
|
#define wxID_RIG_MODEL_BASE 12000
|
||||||
#endif
|
#endif
|
||||||
@ -148,9 +150,14 @@ private:
|
|||||||
wxMenuItem *showTipMenuItem;
|
wxMenuItem *showTipMenuItem;
|
||||||
|
|
||||||
#ifdef USE_HAMLIB
|
#ifdef USE_HAMLIB
|
||||||
|
void enableRig();
|
||||||
|
void disableRig();
|
||||||
|
|
||||||
wxMenu *rigMenu;
|
wxMenu *rigMenu;
|
||||||
wxMenuItem *rigEnableMenuItem;
|
wxMenuItem *rigEnableMenuItem;
|
||||||
wxMenuItem *rigPortMenuItem;
|
wxMenuItem *rigPortMenuItem;
|
||||||
|
wxMenuItem *rigControlMenuItem;
|
||||||
|
wxMenuItem *rigFollowMenuItem;
|
||||||
wxMenuItem *sdrIFMenuItem;
|
wxMenuItem *sdrIFMenuItem;
|
||||||
std::map<int, wxMenuItem *> rigSerialMenuItems;
|
std::map<int, wxMenuItem *> rigSerialMenuItems;
|
||||||
std::map<int, wxMenuItem *> rigModelMenuItems;
|
std::map<int, wxMenuItem *> rigModelMenuItems;
|
||||||
@ -160,6 +167,7 @@ private:
|
|||||||
std::vector<int> rigSerialRates;
|
std::vector<int> rigSerialRates;
|
||||||
std::string rigPort;
|
std::string rigPort;
|
||||||
int numRigs;
|
int numRigs;
|
||||||
|
bool rigInit;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
wxDECLARE_EVENT_TABLE();
|
wxDECLARE_EVENT_TABLE();
|
||||||
|
@ -269,6 +269,13 @@ bool CubicSDR::OnInit() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int CubicSDR::OnExit() {
|
int CubicSDR::OnExit() {
|
||||||
|
#if USE_HAMLIB
|
||||||
|
if (rigIsActive()) {
|
||||||
|
std::cout << "Terminating Rig thread.." << std::endl;
|
||||||
|
stopRig();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
demodMgr.terminateAll();
|
demodMgr.terminateAll();
|
||||||
|
|
||||||
std::cout << "Terminating SDR thread.." << std::endl;
|
std::cout << "Terminating SDR thread.." << std::endl;
|
||||||
@ -817,6 +824,9 @@ void CubicSDR::initRig(int rigModel, std::string rigPort, int rigSerialRate) {
|
|||||||
}
|
}
|
||||||
rigThread = new RigThread();
|
rigThread = new RigThread();
|
||||||
rigThread->initRig(rigModel, rigPort, rigSerialRate);
|
rigThread->initRig(rigModel, rigPort, rigSerialRate);
|
||||||
|
rigThread->setControlMode(wxGetApp().getConfig()->getRigControlMode());
|
||||||
|
rigThread->setFollowMode(wxGetApp().getConfig()->getRigFollowMode());
|
||||||
|
|
||||||
t_Rig = new std::thread(&RigThread::threadMain, rigThread);
|
t_Rig = new std::thread(&RigThread::threadMain, rigThread);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,8 @@ RigThread::RigThread() {
|
|||||||
newFreq = freq;
|
newFreq = freq;
|
||||||
freqChanged.store(true);
|
freqChanged.store(true);
|
||||||
termStatus = 0;
|
termStatus = 0;
|
||||||
|
controlMode.store(true);
|
||||||
|
followMode.store(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
RigThread::~RigThread() {
|
RigThread::~RigThread() {
|
||||||
@ -42,6 +44,7 @@ void RigThread::run() {
|
|||||||
int retcode, status;
|
int retcode, status;
|
||||||
|
|
||||||
termStatus = 0;
|
termStatus = 0;
|
||||||
|
terminated.store(false);
|
||||||
|
|
||||||
std::cout << "Rig thread starting." << std::endl;
|
std::cout << "Rig thread starting." << std::endl;
|
||||||
|
|
||||||
@ -66,9 +69,9 @@ void RigThread::run() {
|
|||||||
|
|
||||||
while (!terminated.load()) {
|
while (!terminated.load()) {
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(150));
|
std::this_thread::sleep_for(std::chrono::milliseconds(150));
|
||||||
if (freqChanged.load()) {
|
if (freqChanged.load() && (controlMode.load() || setOneShot.load())) {
|
||||||
status = rig_get_freq(rig, RIG_VFO_CURR, &freq);
|
status = rig_get_freq(rig, RIG_VFO_CURR, &freq);
|
||||||
if (status == 0) {
|
if (status == 0 && !terminated.load()) {
|
||||||
if (freq != newFreq) {
|
if (freq != newFreq) {
|
||||||
freq = newFreq;
|
freq = newFreq;
|
||||||
rig_set_freq(rig, RIG_VFO_CURR, freq);
|
rig_set_freq(rig, RIG_VFO_CURR, freq);
|
||||||
@ -76,26 +79,27 @@ void RigThread::run() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
freqChanged.store(false);
|
freqChanged.store(false);
|
||||||
|
setOneShot.store(false);
|
||||||
} else {
|
} else {
|
||||||
termStatus = 0;
|
termStatus = 0;
|
||||||
terminate();
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
freq_t checkFreq;
|
freq_t checkFreq;
|
||||||
|
|
||||||
status = rig_get_freq(rig, RIG_VFO_CURR, &checkFreq);
|
status = rig_get_freq(rig, RIG_VFO_CURR, &checkFreq);
|
||||||
|
|
||||||
if (status == 0) {
|
if (status == 0 && !terminated.load()) {
|
||||||
if (checkFreq != freq) {
|
if (checkFreq != freq && followMode.load()) {
|
||||||
freq = checkFreq;
|
freq = checkFreq;
|
||||||
wxGetApp().setFrequency((long long)checkFreq);
|
wxGetApp().setFrequency((long long)checkFreq);
|
||||||
} else if (wxGetApp().getFrequency() != freq) {
|
} else if (wxGetApp().getFrequency() != freq && controlMode.load()) {
|
||||||
freq = wxGetApp().getFrequency();
|
freq = wxGetApp().getFrequency();
|
||||||
rig_set_freq(rig, RIG_VFO_CURR, freq);
|
rig_set_freq(rig, RIG_VFO_CURR, freq);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
termStatus = 0;
|
termStatus = 0;
|
||||||
terminate();
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,15 +113,31 @@ void RigThread::run() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
freq_t RigThread::getFrequency() {
|
freq_t RigThread::getFrequency() {
|
||||||
if (freqChanged.load()) {
|
if (freqChanged.load() && (setOneShot.load() || controlMode.load())) {
|
||||||
return newFreq;
|
return newFreq;
|
||||||
} else {
|
} else {
|
||||||
return freq;
|
return freq;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RigThread::setFrequency(freq_t new_freq) {
|
void RigThread::setFrequency(freq_t new_freq, bool oneShot) {
|
||||||
newFreq = new_freq;
|
newFreq = new_freq;
|
||||||
freqChanged.store(true);
|
freqChanged.store(true);
|
||||||
|
setOneShot.store(oneShot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RigThread::setControlMode(bool cMode) {
|
||||||
|
controlMode.store(cMode);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RigThread::getControlMode() {
|
||||||
|
return controlMode.load();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RigThread::setFollowMode(bool fMode) {
|
||||||
|
followMode.store(fMode);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RigThread::getFollowMode() {
|
||||||
|
return followMode.load();
|
||||||
|
}
|
||||||
|
@ -27,7 +27,12 @@ public:
|
|||||||
int terminationStatus();
|
int terminationStatus();
|
||||||
|
|
||||||
freq_t getFrequency();
|
freq_t getFrequency();
|
||||||
void setFrequency(freq_t new_freq);
|
void setFrequency(freq_t new_freq, bool oneShot);
|
||||||
|
|
||||||
|
void setControlMode(bool cMode);
|
||||||
|
bool getControlMode();
|
||||||
|
void setFollowMode(bool fMode);
|
||||||
|
bool getFollowMode();
|
||||||
|
|
||||||
static RigList &enumerate();
|
static RigList &enumerate();
|
||||||
static int add_hamlib_rig(const struct rig_caps *rc, void* f);
|
static int add_hamlib_rig(const struct rig_caps *rc, void* f);
|
||||||
@ -40,6 +45,7 @@ private:
|
|||||||
int termStatus;
|
int termStatus;
|
||||||
freq_t freq;
|
freq_t freq;
|
||||||
freq_t newFreq;
|
freq_t newFreq;
|
||||||
std::atomic_bool freqChanged;
|
std::atomic_bool freqChanged, setOneShot;
|
||||||
|
std::atomic_bool controlMode, followMode;
|
||||||
static RigList rigCaps;
|
static RigList rigCaps;
|
||||||
};
|
};
|
@ -15,6 +15,10 @@
|
|||||||
#include "AppFrame.h"
|
#include "AppFrame.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
#ifdef USE_HAMLIB
|
||||||
|
#include "RigThread.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <wx/numformatter.h>
|
#include <wx/numformatter.h>
|
||||||
|
|
||||||
wxBEGIN_EVENT_TABLE(WaterfallCanvas, wxGLCanvas)
|
wxBEGIN_EVENT_TABLE(WaterfallCanvas, wxGLCanvas)
|
||||||
@ -449,6 +453,11 @@ void WaterfallCanvas::OnKeyDown(wxKeyEvent& event) {
|
|||||||
|
|
||||||
wxGetApp().setFrequency(freq);
|
wxGetApp().setFrequency(freq);
|
||||||
}
|
}
|
||||||
|
#ifdef USE_HAMLIB
|
||||||
|
if (wxGetApp().rigIsActive() && !wxGetApp().getRigThread()->getControlMode()) {
|
||||||
|
wxGetApp().getRigThread()->setFrequency(wxGetApp().getFrequency(),true);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
event.Skip();
|
event.Skip();
|
||||||
|
Loading…
Reference in New Issue
Block a user