From 69d3995653ae6d32d7ad2c65cc754d4a66207ffe Mon Sep 17 00:00:00 2001
From: PianetaRadio <78976006+PianetaRadio@users.noreply.github.com>
Date: Sun, 3 Mar 2024 00:13:00 +0100
Subject: [PATCH] Serial port configuration
#42
---
ChangeLog.txt | 1 +
dialogconfig.cpp | 108 +++++++++++++++++++++++++++++--
dialogconfig.h | 4 ++
dialogconfig.ui | 162 ++++++++++++++++++++++++++++++++++++++++++-----
mainwindow.cpp | 8 ++-
rigdata.h | 4 ++
6 files changed, 264 insertions(+), 23 deletions(-)
diff --git a/ChangeLog.txt b/ChangeLog.txt
index 438e922..1192dc9 100644
--- a/ChangeLog.txt
+++ b/ChangeLog.txt
@@ -8,6 +8,7 @@ CatRadio
+ High SWR indicator
+ Meter peak hold indicator
+ Debug mode
+ * Updated serial port configuration
* Bug fix: NR level
* Bug fix: Repeater shift
* Bug fix: Power status
diff --git a/dialogconfig.cpp b/dialogconfig.cpp
index dc0dbf2..2676152 100644
--- a/dialogconfig.cpp
+++ b/dialogconfig.cpp
@@ -105,6 +105,7 @@ DialogConfig::DialogConfig(QWidget *parent) :
ui->comboBox_comPort->setCurrentText(rigCom.rigPort);
ui->comboBox_serialSpeed->setCurrentText(QString::number(rigCom.serialSpeed));
if (rigCom.civAddr) ui->lineEdit_civAddr->setText(QString::number(rigCom.civAddr,16));
+ setDialogSerialConfig(rigCom.serialDataBits, rigCom.serialParity, rigCom.serialStopBits, rigCom.serialHandshake);
}
ui->spinBox_RefreshRate->setValue(rigCom.rigRefresh);
ui->checkBox_fullPoll->setChecked(rigCom.fullPoll);
@@ -117,6 +118,63 @@ DialogConfig::~DialogConfig()
delete ui;
}
+
+int DialogConfig::findRigModel(QString rigModel)
+{
+ QRegularExpression regexp("[0-9]+");
+ QRegularExpressionMatch rigNumber = regexp.match(rigModel);
+ return rigNumber.captured(0).toInt();
+}
+
+
+void DialogConfig::setDialogSerialConfig(int dataBits, int parity, int stopBits, int handshake)
+{
+ switch (dataBits)
+ {
+ case 7: ui->radioButton_dataBits7->setChecked(true); break;
+ case 8: ui->radioButton_dataBits8->setChecked(true); break;
+ }
+
+ switch (parity)
+ {
+ case 0: ui->radioButton_parityNone->setChecked(true); break;
+ case 1: ui->radioButton_parityOdd->setChecked(true); break;
+ case 2: ui->radioButton_parityEven->setChecked(true); break;
+ }
+
+ switch (stopBits)
+ {
+ case 1: ui->radioButton_stopBits1->setChecked(true); break;
+ case 2: ui->radioButton_stopBits2->setChecked(true); break;
+ }
+
+ switch (handshake)
+ {
+ case 0: ui->radioButton_handshakeNone->setChecked(true); break;
+ case 1: ui->radioButton_handshakeXonXoff->setChecked(true); break;
+ case 2: ui->radioButton_handshakeHardware->setChecked(true); break;
+ }
+}
+
+
+void DialogConfig::setRigSerialConfigFromDialog()
+{
+ if (ui->radioButton_dataBits7->isChecked()) rigCom.serialDataBits = 7;
+ else rigCom.serialDataBits = 8;
+
+ if (ui->radioButton_parityOdd->isChecked()) rigCom.serialParity = RIG_PARITY_ODD;
+ else if (ui->radioButton_parityEven->isChecked()) rigCom.serialParity = RIG_PARITY_EVEN;
+ else rigCom.serialParity = RIG_PARITY_NONE;
+
+ if (ui->radioButton_stopBits1->isChecked()) rigCom.serialStopBits = 1;
+ else rigCom.serialStopBits = 2;
+
+ if (ui->radioButton_handshakeXonXoff->isChecked()) rigCom.serialHandshake = RIG_HANDSHAKE_XONXOFF;
+ else if (ui->radioButton_handshakeHardware->isChecked()) rigCom.serialHandshake = RIG_HANDSHAKE_HARDWARE;
+ else rigCom.serialHandshake = RIG_HANDSHAKE_NONE;
+}
+
+
void DialogConfig::on_buttonBox_accepted()
{
bool civAddrConv;
@@ -134,9 +192,10 @@ void DialogConfig::on_buttonBox_accepted()
else
{
QString rigModel = ui->comboBox_rigModel->currentText();
- QRegularExpression regexp("[0-9]+");
- QRegularExpressionMatch rigNumber = regexp.match(rigModel);
- rigCom.rigModel = rigNumber.captured(0).toInt();
+ //QRegularExpression regexp("[0-9]+");
+ //QRegularExpressionMatch rigNumber = regexp.match(rigModel);
+ //rigCom.rigModel = rigNumber.captured(0).toInt();
+ rigCom.rigModel = findRigModel(rigModel);
if (ui->checkBox_netRigctl->isChecked()) //TCP port
{
@@ -159,6 +218,7 @@ void DialogConfig::on_buttonBox_accepted()
rigCom.rigPort = ui->comboBox_comPort->currentText();
rigCom.serialSpeed = ui->comboBox_serialSpeed->currentText().toInt();
rigCom.civAddr = ui->lineEdit_civAddr->text().toInt(&civAddrConv,16);
+ setRigSerialConfigFromDialog();
if (rigCom.rigPort == "" && rigCom.rigModel != 1 && rigCom.rigModel != 6)
{
@@ -183,6 +243,10 @@ void DialogConfig::on_buttonBox_accepted()
configFile.setValue("rigPort", rigCom.rigPort);
configFile.setValue("serialSpeed", ui->comboBox_serialSpeed->currentText());
configFile.setValue("civAddress", ui->lineEdit_civAddr->text().toInt(&civAddrConv,16));
+ configFile.setValue("serialDataBits", rigCom.serialDataBits);
+ configFile.setValue("serialParity", rigCom.serialParity);
+ configFile.setValue("serialStopBits", rigCom.serialStopBits);
+ configFile.setValue("serialHandshake", rigCom.serialHandshake);
configFile.setValue("netRigctl", ui->checkBox_netRigctl->isChecked());
configFile.setValue("rigRefresh", ui->spinBox_RefreshRate->value());
configFile.setValue("fullPolling", ui->checkBox_fullPoll->isChecked());
@@ -232,11 +296,43 @@ void DialogConfig::on_checkBox_netRigctl_toggled(bool checked)
void DialogConfig::on_comboBox_rigModel_currentIndexChanged(int index)
{
- if (index == 2 || index == 3 || index == 4)
+ int currentRig = 0;
+ RIG *rig;
+
+ if (index)
{
- ui->checkBox_netRigctl->setChecked(true);
- ui->tabWidget_Config->setCurrentIndex(1);
+ QString rigModel = ui->comboBox_rigModel->currentText();
+ currentRig = findRigModel(rigModel);
}
+
+ if (currentRig)
+ {
+ rig = rig_init(currentRig);
+ if (rig->caps->port_type == RIG_PORT_SERIAL)
+ {
+ ui->checkBox_netRigctl->setChecked(false);
+ ui->tabWidget_Config->setCurrentIndex(0);
+ setDialogSerialConfig(rig->caps->serial_data_bits, rig->caps->serial_parity, rig->caps->serial_stop_bits, rig->caps->serial_handshake);
+ //qDebug() << rig->caps->serial_data_bits << rig->caps->serial_parity << rig->caps->serial_stop_bits << rig->caps->serial_handshake;
+ }
+ else if (rig->caps->port_type == RIG_PORT_NETWORK)
+ {
+ ui->checkBox_netRigctl->setChecked(true);
+ ui->tabWidget_Config->setCurrentIndex(1);
+ }
+ else if (rig->caps->port_type == RIG_PORT_NONE)
+ {
+ ui->checkBox_netRigctl->setChecked(false);
+ ui->tabWidget_Config->setCurrentIndex(0);
+ ui->comboBox_comPort->clear();
+ }
+ }
+
+ //if (index == 2 || index == 3 || index == 4)
+ //{
+ // ui->checkBox_netRigctl->setChecked(true);
+ // ui->tabWidget_Config->setCurrentIndex(1);
+ //}
}
void DialogConfig::on_comboBox_comPort_currentIndexChanged(int index)
diff --git a/dialogconfig.h b/dialogconfig.h
index 702cfb6..7a9e81a 100644
--- a/dialogconfig.h
+++ b/dialogconfig.h
@@ -45,6 +45,10 @@ private slots:
private:
Ui::DialogConfig *ui;
+
+ int findRigModel(QString rigModel); //Find hamlib rig model from the rig selected in the comboBox_rigModel
+ void setDialogSerialConfig(int dataBits, int parity, int stopBits, int handshake); //Set the serial port configuration on the dialog
+ void setRigSerialConfigFromDialog(); //Set the rigConf serial config from dialog serial settings
};
int printRigList(const struct rig_caps *rigCaps, void *data); //Retrives rig list from Hamlib and write to file
diff --git a/dialogconfig.ui b/dialogconfig.ui
index ae5ffe5..adc355a 100644
--- a/dialogconfig.ui
+++ b/dialogconfig.ui
@@ -7,7 +7,7 @@
0
0
390
- 378
+ 700
@@ -118,6 +118,124 @@
+ -
+
+
+ Data Bits
+
+
+
-
+
+
+ 7
+
+
+
+ -
+
+
+ 8
+
+
+ true
+
+
+
+
+
+
+ -
+
+
+ Stop Bits
+
+
+
-
+
+
+ 1
+
+
+ true
+
+
+
+ -
+
+
+ 2
+
+
+
+
+
+
+ -
+
+
+ Handshake
+
+
+
-
+
+
+ XON/XOFF
+
+
+
+ -
+
+
+ Hardware
+
+
+
+ -
+
+
+ None
+
+
+ true
+
+
+
+
+
+
+ -
+
+
+ Parity
+
+
+
-
+
+
+ Odd
+
+
+
+ -
+
+
+ Even
+
+
+
+ -
+
+
+ None
+
+
+ true
+
+
+
+
+
+
@@ -215,16 +333,6 @@
- -
-
-
- Auto power-on on startup
-
-
- Auto power ON
-
-
-
-
@@ -235,6 +343,16 @@
+ -
+
+
+ Auto power-on on startup
+
+
+ Auto power ON
+
+
+
@@ -251,11 +369,25 @@
+ comboBox_rigModel
tabWidget_Config
comboBox_comPort
comboBox_serialSpeed
lineEdit_civAddr
+ radioButton_dataBits7
+ radioButton_dataBits8
+ radioButton_parityNone
+ radioButton_parityOdd
+ radioButton_parityEven
+ radioButton_stopBits1
+ radioButton_stopBits2
+ radioButton_handshakeNone
+ radioButton_handshakeXonXoff
+ radioButton_handshakeHardware
spinBox_RefreshRate
+ checkBox_fullPoll
+ checkBox_autoConnect
+ checkBox_autoPowerOn
checkBox_netRigctl
lineEdit_ip
@@ -268,8 +400,8 @@
accept()
- 259
- 324
+ 270
+ 688
157
@@ -284,8 +416,8 @@
reject()
- 327
- 324
+ 338
+ 688
286
diff --git a/mainwindow.cpp b/mainwindow.cpp
index a9d6da1..89e113d 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -106,10 +106,14 @@ MainWindow::MainWindow(QWidget *parent)
//* Load settings from catradio.ini
QSettings configFile(QString("catradio.ini"), QSettings::IniFormat);
- rigCom.rigModel = configFile.value("rigModel", 0).toInt();
+ rigCom.rigModel = configFile.value("rigModel", 0).toUInt();
rigCom.rigPort = configFile.value("rigPort").toString();
- rigCom.serialSpeed = configFile.value("serialSpeed", 9600).toInt();
+ rigCom.serialSpeed = configFile.value("serialSpeed", 9600).toUInt();
rigCom.civAddr = configFile.value("civAddress", 0).toInt();
+ rigCom.serialDataBits = configFile.value("serialDataBits", 8).toUInt();
+ rigCom.serialParity = configFile.value("serialParity", 0).toUInt();
+ rigCom.serialStopBits = configFile.value("serialStopBits", 2).toUInt();
+ rigCom.serialHandshake = configFile.value("serialHandshake", 0).toUInt();
rigCom.netRigctl = configFile.value("netRigctl", false).toBool();
rigCom.rigRefresh = configFile.value("rigRefresh", 100).toInt();
rigCom.fullPoll = configFile.value("fullPolling", true).toBool();
diff --git a/rigdata.h b/rigdata.h
index 4a2f792..6039552 100644
--- a/rigdata.h
+++ b/rigdata.h
@@ -30,6 +30,10 @@ typedef struct {
unsigned rigModel; //Hamlib rig model
QString rigPort; //COM port or IP address
unsigned serialSpeed; //Serial port baud rate
+ unsigned serialDataBits; //Serial port data bit
+ unsigned serialParity; //Serial port parity (serial_parity_e RIG_PARITY_NONE = 0, RIG_PARITY_ODD, RIG_PARITY_EVEN)
+ unsigned serialStopBits;
+ unsigned serialHandshake; //Serial port handshake (serial_handshake_e RIG_HANDSHAKE_NONE = 0, RIG_HANDSHAKE_XONXOFF, RIG_HANDSHAKE_HARDWARE)
int civAddr; //CI-V address (decimal, Icom radio)
bool netRigctl; //TCP NET Rigctl
unsigned rigRefresh; //GUI refresh interval (ms)