From 45ec67a82093792d5654bfe89bd8bc91ae976193 Mon Sep 17 00:00:00 2001
From: Michael Morgan <84428382+aa5sh@users.noreply.github.com>
Date: Mon, 27 Oct 2025 19:49:59 -0500
Subject: [PATCH] Add RTS and DTR control to rig profiles
Introduces RTS and DTR fields to RigProfile, updates serialization, database schema, and UI to support these options. Hamlib driver now sets serial RTS/DTR states based on profile settings. Migration 035 adds the new columns to the database.
---
core/Migration.h | 2 +-
data/RigProfile.cpp | 19 +++++++++---
data/RigProfile.h | 2 ++
res/res.qrc | 1 +
res/sql/migration_035.sql | 2 ++
rig/drivers/HamlibRigDrv.cpp | 17 +++++++++++
rig/drivers/HamlibRigDrv.h | 1 +
ui/SettingsDialog.cpp | 13 ++++++++
ui/SettingsDialog.ui | 59 ++++++++++++++++++++++++++++++++++++
9 files changed, 111 insertions(+), 5 deletions(-)
create mode 100644 res/sql/migration_035.sql
diff --git a/core/Migration.h b/core/Migration.h
index 2addb2eb..652dc3ea 100644
--- a/core/Migration.h
+++ b/core/Migration.h
@@ -42,7 +42,7 @@ class Migration : public QObject
QString fixIntlField(QSqlQuery &query, const QString &columName, const QString &columnNameIntl);
bool refreshUploadStatusTrigger();
- static const int latestVersion = 34;
+ static const int latestVersion = 35;
};
#endif // QLOG_CORE_MIGRATION_H
diff --git a/data/RigProfile.cpp b/data/RigProfile.cpp
index 23b5bed8..ddfe401e 100644
--- a/data/RigProfile.cpp
+++ b/data/RigProfile.cpp
@@ -19,7 +19,8 @@ QDataStream& operator<<(QDataStream& out, const RigProfile& v)
<< v.xitOffset << v.getRITInfo << v.getXITInfo
<< v.defaultPWR << v.getPTTInfo << v.QSYWiping
<< v.getKeySpeed << v.assignedCWKey << v.keySpeedSync
- << v.driver << v.dxSpot2Rig << v.pttType << v.pttPortPath;
+ << v.driver << v.dxSpot2Rig << v.pttType << v.pttPortPath
+ << v.rts << v.dtr;
return out;
}
@@ -57,6 +58,8 @@ QDataStream& operator>>(QDataStream& in, RigProfile& v)
in >> v.dxSpot2Rig;
in >> v.pttType;
in >> v.pttPortPath;
+ in >> v.rts;
+ in >> v.dtr;
return in;
}
@@ -73,7 +76,8 @@ RigProfilesManager::RigProfilesManager() :
"pollinterval, txfreq_start, txfreq_end, get_freq, get_mode, "
"get_vfo, get_pwr, rit_offset, xit_offset, get_rit, get_xit, "
"default_pwr, get_ptt, qsy_wiping, get_key_speed, assigned_cw_key, "
- "key_speed_sync, driver, dxspot2rig, ptt_type, ptt_port_pathname "
+ "key_speed_sync, driver, dxspot2rig, ptt_type, ptt_port_pathname, "
+ "rts, dtr "
"FROM rig_profiles") )
{
qWarning()<< "Cannot prepare select";
@@ -115,6 +119,8 @@ RigProfilesManager::RigProfilesManager() :
profileDB.dxSpot2Rig = profileQuery.value(28).toBool();
profileDB.pttType = profileQuery.value(29).toString();
profileDB.pttPortPath = profileQuery.value(30).toString();
+ profileDB.rts = profileQuery.value(31).toString();
+ profileDB.dtr = profileQuery.value(32).toString();
addProfile(profileDB.profileName, profileDB);
}
@@ -142,12 +148,12 @@ void RigProfilesManager::save()
"baudrate, databits, stopbits, flowcontrol, parity, pollinterval, txfreq_start, "
"txfreq_end, get_freq, get_mode, get_vfo, get_pwr, rit_offset, xit_offset, get_rit, "
"get_xit, default_pwr, get_ptt, qsy_wiping, get_key_speed, assigned_cw_key, key_speed_sync, "
- "driver, dxSpot2Rig, ptt_type, ptt_port_pathname ) "
+ "driver, dxSpot2Rig, ptt_type, ptt_port_pathname, rts, dtr ) "
"VALUES (:profile_name, :model, :port_pathname, :hostname, :netport, "
":baudrate, :databits, :stopbits, :flowcontrol, :parity, :pollinterval, :txfreq_start, "
":txfreq_end, :get_freq, :get_mode, :get_vfo, :get_pwr, :rit_offset, :xit_offset, :get_rit, "
":get_xit, :default_pwr, :get_ptt, :qsy_wiping, :get_key_speed, :assigned_cw_key, :key_speed_sync, "
- ":driver, :dxSpot2Rig, :ptt_type, :ptt_port_pathname)") )
+ ":driver, :dxSpot2Rig, :ptt_type, :ptt_port_pathname, :rts, :dtr )") )
{
qWarning() << "cannot prepare Insert statement";
return;
@@ -191,6 +197,9 @@ void RigProfilesManager::save()
insertQuery.bindValue(":dxSpot2Rig", rigProfile.dxSpot2Rig);
insertQuery.bindValue(":ptt_type", rigProfile.pttType);
insertQuery.bindValue(":ptt_port_pathname", rigProfile.pttPortPath);
+ insertQuery.bindValue(":rts", rigProfile.rts);
+ insertQuery.bindValue(":dtr", rigProfile.dtr);
+
if ( ! insertQuery.exec() )
{
@@ -239,6 +248,8 @@ bool RigProfile::operator==(const RigProfile &profile)
&& profile.dxSpot2Rig == this->dxSpot2Rig
&& profile.pttType == this->pttType
&& profile.pttPortPath == this->pttPortPath
+ && profile.rts == this->rts
+ && profile.dtr == this->dtr
);
}
diff --git a/data/RigProfile.h b/data/RigProfile.h
index 7f5c0e99..6fb42ecd 100644
--- a/data/RigProfile.h
+++ b/data/RigProfile.h
@@ -63,6 +63,8 @@ class RigProfile
bool dxSpot2Rig;
QString pttType;
QString pttPortPath;
+ QString rts;
+ QString dtr;
bool operator== (const RigProfile &profile);
bool operator!= (const RigProfile &profile);
diff --git a/res/res.qrc b/res/res.qrc
index f961a7da..2bd2a3c5 100644
--- a/res/res.qrc
+++ b/res/res.qrc
@@ -47,5 +47,6 @@
sql/migration_032.sql
sql/migration_033.sql
sql/migration_034.sql
+ sql/migration_035.sql
diff --git a/res/sql/migration_035.sql b/res/sql/migration_035.sql
new file mode 100644
index 00000000..6d7254a3
--- /dev/null
+++ b/res/sql/migration_035.sql
@@ -0,0 +1,2 @@
+ALTER TABLE rig_profiles ADD COLUMN rts TEXT DEFAULT '';
+ALTER TABLE rig_profiles ADD COLUMN dtr TEXT DEFAULT '';
diff --git a/rig/drivers/HamlibRigDrv.cpp b/rig/drivers/HamlibRigDrv.cpp
index 557be33f..c0455d0f 100644
--- a/rig/drivers/HamlibRigDrv.cpp
+++ b/rig/drivers/HamlibRigDrv.cpp
@@ -217,6 +217,8 @@ bool HamlibRigDrv::open()
rig->state.rigport.parm.serial.stop_bits = rigProfile.stopbits;
rig->state.rigport.parm.serial.handshake = stringToHamlibFlowControl(rigProfile.flowcontrol);
rig->state.rigport.parm.serial.parity = stringToHamlibParity(rigProfile.parity);
+ rig->state.rigport.parm.serial.dtr_state = stringToHamlibForceFlowControl(rigProfile.dtr);
+ rig->state.rigport.parm.serial.rts_state = stringToHamlibForceFlowControl(rigProfile.rts);
qCDebug(runtime) << "Using PTT Type" << rigProfile.pttType.toLocal8Bit().constData()
<< "PTT Path" << rigProfile.pttPortPath;
@@ -1149,6 +1151,21 @@ serial_parity_e HamlibRigDrv::stringToHamlibParity(const QString &in_parity)
return RIG_PARITY_NONE;
}
+serial_control_state_e HamlibRigDrv::stringToHamlibForceFlowControl(const QString &flowcontrol)
+{
+ FCT_IDENTIFICATION;
+
+ qCDebug(function_parameters) << flowcontrol;
+
+ if (flowcontrol == "HIGH")
+ return RIG_SIGNAL_ON;
+ if (flowcontrol == "LOW")
+ return RIG_SIGNAL_OFF;
+
+ return RIG_SIGNAL_UNSET;
+}
+
+
QString HamlibRigDrv::hamlibErrorString(int errorCode)
{
FCT_IDENTIFICATION;
diff --git a/rig/drivers/HamlibRigDrv.h b/rig/drivers/HamlibRigDrv.h
index 152f81ff..0c5d8d14 100644
--- a/rig/drivers/HamlibRigDrv.h
+++ b/rig/drivers/HamlibRigDrv.h
@@ -76,6 +76,7 @@ private slots:
const QString hamlibVFO2String(const vfo_t vfo) const;
serial_handshake_e stringToHamlibFlowControl(const QString &in_flowcontrol);
serial_parity_e stringToHamlibParity(const QString &in_parity);
+ serial_control_state_e stringToHamlibForceFlowControl(const QString &flowcontrol);
QString hamlibErrorString(int);
RIG* rig;
QTimer timer;
diff --git a/ui/SettingsDialog.cpp b/ui/SettingsDialog.cpp
index ae83bea6..e29bf723 100644
--- a/ui/SettingsDialog.cpp
+++ b/ui/SettingsDialog.cpp
@@ -470,6 +470,8 @@ void SettingsDialog::addRigProfile()
profile.parity = ui->rigParitySelect->currentData().toString();
profile.pttType = ui->rigPTTTypeCombo->currentData().toString();
profile.pttPortPath = ui->rigPTTPortEdit->text();
+ profile.rts = ui->cmbRigRTS->currentText();
+ profile.dtr = ui->cmbRigDTR->currentText();
}
if ( ui->rigPollIntervalSpinBox->isEnabled() )
@@ -582,6 +584,12 @@ void SettingsDialog::doubleClickRigProfile(QModelIndex i)
ui->rigPTTTypeCombo->setCurrentIndex(( pttIndex < 0 ) ? PTT_TYPE_CAT_INDEX : pttIndex);
ui->rigPTTPortEdit->setText(profile.pttPortPath);
+ int rtsIndex = ui->cmbRigRTS->findText(profile.rts);
+ ui->cmbRigRTS->setCurrentIndex(( rtsIndex < 0 ) ? PTT_TYPE_CAT_INDEX : rtsIndex);
+
+ int dtrIndex = ui->cmbRigDTR->findText(profile.dtr);
+ ui->cmbRigDTR->setCurrentIndex(( dtrIndex < 0 ) ? PTT_TYPE_CAT_INDEX : dtrIndex);
+
setUIBasedOnRigCaps(caps);
ui->rigAddProfileButton->setText(tr("Modify"));
@@ -726,12 +734,17 @@ void SettingsDialog::rigInterfaceChanged(int)
ui->rigModelSelect->setCurrentIndex(( driverID == Rig::HAMLIB_DRIVER ) ? ui->rigModelSelect->findData(DEFAULT_HAMLIB_RIG_MODEL)
: 0 );
ui->rigPTTTypeCombo->clear();
+ ui->cmbRigRTS->setCurrentIndex(0);
+ ui->cmbRigDTR->setCurrentIndex(0);
const QList> &pttTypes = Rig::instance()->getPTTTypeList(static_cast(driverID));
for ( const QPair &type : pttTypes )
ui->rigPTTTypeCombo->addItem(type.second, type.first);
+ ui->cmbRigRTS->setVisible((driverID == Rig::HAMLIB_DRIVER));
+ ui->cmbRigDTR->setVisible((driverID == Rig::HAMLIB_DRIVER));
+
ui->rigPTTTypeCombo->setVisible(( driverID == Rig::HAMLIB_DRIVER ));
ui->rigPTTTypeLabel->setVisible(( driverID == Rig::HAMLIB_DRIVER ));
ui->rigPTTPortEdit->setVisible(( driverID == Rig::HAMLIB_DRIVER ));
diff --git a/ui/SettingsDialog.ui b/ui/SettingsDialog.ui
index d7610d4c..82f049ce 100644
--- a/ui/SettingsDialog.ui
+++ b/ui/SettingsDialog.ui
@@ -2257,6 +2257,65 @@
+ -
+
+
+ DTR
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+
+ -
+
+ High
+
+
+ -
+
+ Low
+
+
+
+
+ -
+
+
+ RTS
+
+
+ Qt::AlignRight|Qt::AlignVCenter
+
+
+
+ -
+
+
-
+
+
+
+
+ -
+
+ High
+
+
+ -
+
+ Low
+
+
+
+
+
+