[Hamlib-commits] Hamlib -- Ham radio control libraries branch master updated. 9e816e37ff87c4a6b4340
Library to control radio transceivers and receivers
Brought to you by:
n0nb
|
From: n0nb <n0...@us...> - 2024-05-13 20:27:15
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Hamlib -- Ham radio control libraries".
The branch, master has been updated
via 9e816e37ff87c4a6b434014b49dc2d8d7a6d60a3 (commit)
via efbe36570148bb17da5f44af6c1482d77166d8ba (commit)
via c06255d364574b312858200fd11d3710708edf5b (commit)
via 1988b7cf4fa901687635f4463f2bf959e288b493 (commit)
via ee6b89d45bd2f0e42d40cd974d79d6ae697e50bc (commit)
via 3c4b1a83f8f5afa5af2c838bc5a3bb4c4ebb1d3e (commit)
via 37df9e93bd0267b2dd967ccb40741154430476cf (commit)
via 2d30291caa23b17b1177b3f219e5ba37d3be5f25 (commit)
via 64a119367d1fd156088e865c7108ba8d85e600ad (commit)
via d71f7a93857a2eb1b551b13b5b6add03cbbe0b4e (commit)
via 09fbc4cb64895925e3a00ec8d314f6b3e275ad7f (commit)
via cf91e96333979368a0bde89d5c31b7ed4f39bce5 (commit)
from 8221961de2e24121482e72959c77c27edaa74740 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 9e816e37ff87c4a6b434014b49dc2d8d7a6d60a3
Merge: c06255d36 efbe36570
Author: Michael Black <mdb...@ya...>
Date: Sun May 12 14:37:50 2024 -0500
Merge pull request #1551 from Hamlib/revert-1539-libgpiod
Revert "Refactoring GPIO push-to-talk logic to use libgpiod rather than the d…"
commit efbe36570148bb17da5f44af6c1482d77166d8ba
Author: Michael Black <mdb...@ya...>
Date: Sun May 12 14:37:23 2024 -0500
Revert "Refactoring GPIO push-to-talk logic to use libgpiod rather than the d…"
diff --git a/configure.ac b/configure.ac
index 77bb0cc4b..cfcd2eb1f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -529,9 +529,6 @@ AS_IF([test x"${cf_with_xml_support}" = "xyes"], [
AC_SUBST([LIBXML2_LIBS])
AC_SUBST([LIBXML2_CFLAGS])
-# TODO: I don't know how to use autoconf
-LIBS="$LIBS -lgpiod"
-
## ----------------- ##
## Language bindings ##
diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h
index a03890f8e..fc360c692 100644
--- a/include/hamlib/rig.h
+++ b/include/hamlib/rig.h
@@ -2340,7 +2340,6 @@ typedef struct hamlib_port {
int fd; /*!< File descriptor */
void *handle; /*!< handle for USB */
- void *gpio; /*!< handle for GPIO */
int write_delay; /*!< Delay between each byte sent out, in mS */
int post_write_delay; /*!< Delay between each commands send out, in mS */
diff --git a/src/gpio.c b/src/gpio.c
index 88bfd305f..e5fcfb597 100644
--- a/src/gpio.c
+++ b/src/gpio.c
@@ -19,91 +19,135 @@
*
*/
-#include "gpio.h"
-
-#include <errno.h>
-#include <fcntl.h>
#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
+#include <errno.h>
#include <unistd.h>
-#include <gpiod.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
-#ifndef GPIOD_PATH
-// This is what's used on the Raspberry Pi 4; I'm not sure about others
-#define GPIO_CHIP_NAME "gpiochip0"
-#endif
+#include "gpio.h"
-#define GPIO_CHIP_CONSUMER "Hamlib"
int gpio_open(hamlib_port_t *port, int output, int on_value)
{
- struct gpiod_chip *chip;
- struct gpiod_line *line;
+ char pathname[HAMLIB_FILPATHLEN * 2];
+ FILE *fexp, *fdir;
+ int fd;
+ char *dir;
port->parm.gpio.on_value = on_value;
- chip = gpiod_chip_open_by_name(GPIO_CHIP_NAME);
+ SNPRINTF(pathname, HAMLIB_FILPATHLEN, "/sys/class/gpio/export");
+ fexp = fopen(pathname, "w");
- if (!chip)
+ if (!fexp)
{
- rig_debug(RIG_DEBUG_ERR, "Failed to open GPIO chip %s: %s\n", GPIO_CHIP_NAME, strerror(errno));
+ rig_debug(RIG_DEBUG_ERR,
+ "Export GPIO%s (using %s): %s\n",
+ port->pathname,
+ pathname,
+ strerror(errno));
return -RIG_EIO;
}
- line = gpiod_chip_get_line(chip, atoi(port->pathname));
- if (!line)
+ fprintf(fexp, "%s\n", port->pathname);
+ fclose(fexp);
+
+ SNPRINTF(pathname,
+ sizeof(pathname),
+ "/sys/class/gpio/gpio%s/direction",
+ port->pathname);
+ fdir = fopen(pathname, "w");
+
+ if (!fdir)
{
- rig_debug(RIG_DEBUG_ERR, "Failed to acquire GPIO%s: %s\n", port->pathname, strerror(errno));
- gpiod_chip_close(chip);
+ rig_debug(RIG_DEBUG_ERR,
+ "GPIO%s direction (using %s): %s\n",
+ port->pathname,
+ pathname,
+ strerror(errno));
return -RIG_EIO;
}
- if ((output && gpiod_line_request_output(line, GPIO_CHIP_CONSUMER, 0) < 0) ||
- (!output && gpiod_line_request_input(line, GPIO_CHIP_CONSUMER) < 0))
+ dir = output ? "out" : "in";
+ rig_debug(RIG_DEBUG_VERBOSE, "Setting direction of GPIO%s to %s\n",
+ port->pathname, dir);
+ fprintf(fdir, "%s\n", dir);
+ fclose(fdir);
+
+ SNPRINTF(pathname,
+ sizeof(pathname),
+ "/sys/class/gpio/gpio%s/value",
+ port->pathname);
+ fd = open(pathname, O_RDWR);
+
+ if (fd < 0)
{
- rig_debug(RIG_DEBUG_ERR, "Failed to set GPIO%s to %s mode: %s\n",
- port->pathname, (output ? "OUTPUT" : "INPUT"), strerror(errno));
- gpiod_line_release(line);
- gpiod_chip_close(chip);
+ rig_debug(RIG_DEBUG_ERR,
+ "GPIO%s opening value file %s: %s\n",
+ port->pathname,
+ pathname,
+ strerror(errno));
return -RIG_EIO;
}
- port->gpio = line;
-
- return RIG_OK;
+ port->fd = fd;
+ return fd;
}
+
int gpio_close(hamlib_port_t *port)
{
- gpiod_line_close_chip((struct gpiod_line*)port->gpio);
- return RIG_OK;
+ int retval;
+ char pathname[HAMLIB_FILPATHLEN * 2];
+ FILE *fexp;
+
+ retval = close(port->fd);
+
+ SNPRINTF(pathname, HAMLIB_FILPATHLEN, "/sys/class/gpio/unexport");
+ fexp = fopen(pathname, "w");
+
+ if (!fexp)
+ {
+ rig_debug(RIG_DEBUG_ERR,
+ "Export GPIO%s (using %s): %s\n",
+ port->pathname,
+ pathname,
+ strerror(errno));
+ return -RIG_EIO;
+ }
+
+ fprintf(fexp, "%s\n", port->pathname);
+ fclose(fexp);
+ return retval;
}
+
int gpio_ptt_set(hamlib_port_t *port, ptt_t pttx)
{
- int result = 0;
+ char *val;
port->parm.gpio.value = pttx != RIG_PTT_OFF;
- if ((port->parm.gpio.value && port->parm.gpio.on_value) ||
- (!port->parm.gpio.value && !port->parm.gpio.on_value))
+ if ((port->parm.gpio.value && port->parm.gpio.on_value)
+ || (!port->parm.gpio.value && !port->parm.gpio.on_value))
{
- result = gpiod_line_set_value((struct gpiod_line*)port->gpio, 1);
+ val = "1\n";
}
else
{
- result = gpiod_line_set_value((struct gpiod_line*)port->gpio, 0);
+ val = "0\n";
}
- if (result)
+ if (write(port->fd, val, strlen(val)) <= 0)
{
- rig_debug(RIG_DEBUG_ERR, "Failed to set the value of GPIO%s: %s\n", port->pathname, strerror(errno));
return -RIG_EIO;
}
return RIG_OK;
}
+
int gpio_ptt_get(hamlib_port_t *port, ptt_t *pttx)
{
if (port->parm.gpio.value)
@@ -120,15 +164,21 @@ int gpio_ptt_get(hamlib_port_t *port, ptt_t *pttx)
int gpio_dcd_get(hamlib_port_t *port, dcd_t *dcdx)
{
- int val = gpiod_line_get_value((struct gpiod_line*)port->gpio);
- if (val < 0)
+ char val;
+ int port_value;
+
+ lseek(port->fd, 0, SEEK_SET);
+
+ if (read(port->fd, &val, sizeof(val)) <= 0)
{
- rig_debug(RIG_DEBUG_ERR, "Failed to read the value of GPIO%s: %s\n", port->pathname, strerror(errno));
+ return -RIG_EIO;
}
rig_debug(RIG_DEBUG_VERBOSE, "DCD GPIO pin value: %c\n", val);
- if (val == port->parm.gpio.on_value)
+ port_value = val - '0';
+
+ if (port_value == port->parm.gpio.on_value)
{
*dcdx = RIG_DCD_ON;
}
commit c06255d364574b312858200fd11d3710708edf5b
Merge: 1988b7cf4 cf91e9633
Author: Michael Black <mdb...@ya...>
Date: Sun May 12 11:41:31 2024 -0500
Merge pull request #1539 from aschuhardt/libgpiod
Refactoring GPIO push-to-talk logic to use libgpiod rather than the d…
commit 1988b7cf4fa901687635f4463f2bf959e288b493
Author: Mike Black W9MDB <mdb...@ya...>
Date: Sat May 11 17:31:38 2024 -0500
Update simelecraft.c
diff --git a/simulators/simelecraft.c b/simulators/simelecraft.c
index 10fbee1f2..3fe6d53a7 100644
--- a/simulators/simelecraft.c
+++ b/simulators/simelecraft.c
@@ -37,6 +37,7 @@ int ai = 0;
int dt = 0;
int modea = 2;
int modeb = 2;
+int ptt = 0;
// ID 0310 == 310, Must drop leading zero
typedef enum nc_rigid_e
@@ -162,8 +163,10 @@ int main(int argc, char *argv[])
printf("%s\n", buf);
hl_usleep(50 * 1000);
//pbuf = "IF059014200000+000000700000;";
- pbuf = "IF00007230000 -000000 0001000001 ;" ;
+ pbuf = strdup("IF00007230000 -000000 00?1000001 ;") ;
+ pbuf[28] = ptt == 0 ? '0' : '1';
WRITE(fd, pbuf, strlen(pbuf));
+ free(pbuf);
}
else if (strcmp(buf, "ID;") == 0)
{
@@ -312,9 +315,13 @@ int main(int argc, char *argv[])
{
WRITE(fd, "K30;", 4);
}
+ else if (strcmp(buf, "RVD;") == 0)
+ {
+ WRITE(fd, "RVD02.36;", 9);
+ }
else if (strcmp(buf, "RVM;") == 0)
{
- WRITE(fd, "RV02.37;", 8);
+ WRITE(fd, "RVM02.37;", 9);
}
else if (strcmp(buf, "MD;") == 0)
{
@@ -430,6 +437,14 @@ int main(int argc, char *argv[])
{
printf("Morse: %s\n", buf);
}
+ else if (strncmp(buf, "TX", 2) == 0)
+ {
+ ptt = 1;
+ }
+ else if (strncmp(buf, "RX", 2) == 0)
+ {
+ ptt = 0;
+ }
else if (strlen(buf) > 0)
{
fprintf(stderr, "Unknown command: %s\n", buf);
commit ee6b89d45bd2f0e42d40cd974d79d6ae697e50bc
Author: Mike Black W9MDB <mdb...@ya...>
Date: Sat May 11 17:30:10 2024 -0500
Fix currvfo warning message in kenwood.c
diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c
index e0f029721..4c6069c26 100644
--- a/rigs/kenwood/kenwood.c
+++ b/rigs/kenwood/kenwood.c
@@ -1745,6 +1745,7 @@ int kenwood_get_split_vfo_if(RIG *rig, vfo_t rxvfo, split_t *split,
switch (priv->info[30])
{
case '0':
+ rs->rx_vfo = STATE(rig)->current_vfo;
if (rs->rx_vfo == RIG_VFO_A)
{
HAMLIB_TRACE;
@@ -1757,6 +1758,12 @@ int kenwood_get_split_vfo_if(RIG *rig, vfo_t rxvfo, split_t *split,
*txvfo = rs->tx_vfo = priv->tx_vfo = (*split
&& !transmitting) ? RIG_VFO_B : RIG_VFO_A;
}
+ else if (rs->rx_vfo == RIG_VFO_CURR)
+ {
+ HAMLIB_TRACE;
+ *txvfo = rs->tx_vfo = priv->tx_vfo = (*split
+ && !transmitting) ? RIG_VFO_B : RIG_VFO_A;
+ }
else
{
rig_debug(RIG_DEBUG_WARN, "%s(%d): unknown rx_vfo=%s\n", __func__, __LINE__,
diff --git a/rigs/kenwood/kenwood.h b/rigs/kenwood/kenwood.h
index ec2331ab8..bbbeac31b 100644
--- a/rigs/kenwood/kenwood.h
+++ b/rigs/kenwood/kenwood.h
@@ -28,7 +28,7 @@
#include "token.h"
#include "idx_builtin.h"
-#define BACKEND_VER "20240505"
+#define BACKEND_VER "20240511"
#define EOM_KEN ';'
#define EOM_TH '\r'
commit 3c4b1a83f8f5afa5af2c838bc5a3bb4c4ebb1d3e
Author: Mike Black W9MDB <mdb...@ya...>
Date: Sat May 11 12:51:25 2024 -0500
Change IC7100 so x25x26 always and update icom.c to detect probably better
diff --git a/rigs/icom/ic7100.c b/rigs/icom/ic7100.c
index 4499bfd9d..a7ff0288e 100644
--- a/rigs/icom/ic7100.c
+++ b/rigs/icom/ic7100.c
@@ -201,8 +201,8 @@ static const struct icom_priv_caps ic7100_priv_caps =
.extcmds = ic7100_extcmds,
.antack_len = 2,
.ant_count = 2,
- .x25x26_always = 0,
- .x25x26_possibly = 1,
+ .x25x26_always = 1,
+ .x25x26_possibly = 0,
.x1cx03_always = 0,
.x1cx03_possibly = 1,
.x1ax03_supported = 1,
@@ -327,7 +327,7 @@ struct rig_caps ic7100_caps =
RIG_MODEL(RIG_MODEL_IC7100),
.model_name = "IC-7100",
.mfg_name = "Icom",
- .version = BACKEND_VER ".6",
+ .version = BACKEND_VER ".7",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rig_type = RIG_TYPE_TRANSCEIVER,
diff --git a/rigs/icom/icom.h b/rigs/icom/icom.h
index 212a35c2f..131db64b9 100644
--- a/rigs/icom/icom.h
+++ b/rigs/icom/icom.h
@@ -35,7 +35,7 @@
#include <sys/time.h>
#endif
-#define BACKEND_VER "20240504"
+#define BACKEND_VER "20240511"
#define ICOM_IS_ID31 rig_is_model(rig, RIG_MODEL_ID31)
#define ICOM_IS_ID51 rig_is_model(rig, RIG_MODEL_ID51)
commit 37df9e93bd0267b2dd967ccb40741154430476cf
Author: Mike Black W9MDB <mdb...@ya...>
Date: Sat May 11 07:55:32 2024 -0500
Add RIG_OP_TUNE to Elecraftc K2 -- update docs a bit
diff --git a/rigs/kenwood/k2.c b/rigs/kenwood/k2.c
index 7e2142d86..0ebf14d12 100644
--- a/rigs/kenwood/k2.c
+++ b/rigs/kenwood/k2.c
@@ -38,7 +38,7 @@
RIG_LEVEL_STRENGTH|RIG_LEVEL_RFPOWER|RIG_LEVEL_KEYSPD)
#define K2_VFO (RIG_VFO_A|RIG_VFO_B)
-#define K2_VFO_OP (RIG_OP_UP|RIG_OP_DOWN)
+#define K2_VFO_OP (RIG_OP_UP|RIG_OP_DOWN|RIG_OP_TUNE)
#define K2_ANTS (RIG_ANT_1|RIG_ANT_2)
@@ -99,6 +99,7 @@ int k2_open(RIG *rig);
int k2_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width);
int k2_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width);
int k2_get_ext_level(RIG *rig, vfo_t vfo, hamlib_token_t token, value_t *val);
+int k2_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op);
/* Private function declarations */
int k2_probe_mdfw(RIG *rig, struct kenwood_priv_data *priv);
@@ -118,7 +119,7 @@ struct rig_caps k2_caps =
RIG_MODEL(RIG_MODEL_K2),
.model_name = "K2",
.mfg_name = "Elecraft",
- .version = BACKEND_VER ".0",
+ .version = BACKEND_VER ".2",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rig_type = RIG_TYPE_TRANSCEIVER,
@@ -237,7 +238,7 @@ struct rig_caps k2_caps =
.set_level = kenwood_set_level,
.get_level = kenwood_get_level,
.get_ext_level = k2_get_ext_level,
- .vfo_op = kenwood_vfo_op,
+ .vfo_op = k2_vfo_op,
.set_trn = kenwood_set_trn,
.get_powerstat = kenwood_get_powerstat,
.get_trn = kenwood_get_trn,
@@ -804,3 +805,17 @@ int k2_pop_fw_lst(RIG *rig, const char *cmd)
return RIG_OK;
}
+int k2_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op)
+{
+ char buf[32];
+ switch (op)
+ {
+ case RIG_OP_TUNE: // K2
+ SNPRINTF(buf, sizeof(buf), "SWH20");
+ break;
+ default: return kenwood_vfo_op(rig, vfo, op);
+ }
+ return kenwood_transaction(rig, buf, NULL, 0);
+}
+
+
diff --git a/rigs/kenwood/k3.c b/rigs/kenwood/k3.c
index 03057d144..a0a6c33a3 100644
--- a/rigs/kenwood/k3.c
+++ b/rigs/kenwood/k3.c
@@ -2495,7 +2495,7 @@ int k3_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op)
char buf[32];
switch (op)
{
- case RIG_OP_TUNE: // K2 KX2 K3 KX3 K4
+ case RIG_OP_TUNE: // KX2 K3 KX3 K4 -- K2 needs SWH20 to it's in k2.c
SNPRINTF(buf, sizeof(buf), "SWH16");
break;
default: return kenwood_vfo_op(rig, vfo, op);
commit 2d30291caa23b17b1177b3f219e5ba37d3be5f25
Merge: 64a119367 d71f7a938
Author: Mike Black W9MDB <mdb...@ya...>
Date: Sat May 11 07:52:41 2024 -0500
Merge branch 'master' of https://github.com/Hamlib/Hamlib
commit 64a119367d1fd156088e865c7108ba8d85e600ad
Author: Mike Black W9MDB <mdb...@ya...>
Date: Sat May 11 07:42:20 2024 -0500
Add RIG_OP_TUNE to Elecraft KX2 K3 KX3 K4
diff --git a/rigs/kenwood/k3.c b/rigs/kenwood/k3.c
index 779fc504a..03057d144 100644
--- a/rigs/kenwood/k3.c
+++ b/rigs/kenwood/k3.c
@@ -52,7 +52,7 @@
RIG_LEVEL_NR|RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_RAWSTR|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_RFPOWER_METER_WATTS)
#define K3_VFO (RIG_VFO_A|RIG_VFO_B)
-#define K3_VFO_OP (RIG_OP_UP|RIG_OP_DOWN)
+#define K3_VFO_OP (RIG_OP_UP|RIG_OP_DOWN|RIG_OP_TUNE)
#define K3_ANTS (RIG_ANT_1|RIG_ANT_2)
#define K4_ANTS (RIG_ANT_1|RIG_ANT_2|RIG_ANT_3|RIG_ANT_4)
@@ -161,6 +161,7 @@ int kx3_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val);
int kx3_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val);
int k3_set_func(RIG *rig, vfo_t vfo, setting_t func, int status);
int k3_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status);
+int k3_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op);
int k3_power2mW(RIG *rig, unsigned int *mwpower, float power, freq_t freq,
rmode_t mode);
@@ -197,7 +198,7 @@ struct rig_caps k3_caps =
RIG_MODEL(RIG_MODEL_K3),
.model_name = "K3",
.mfg_name = "Elecraft",
- .version = BACKEND_VER ".27",
+ .version = BACKEND_VER ".28",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rig_type = RIG_TYPE_TRANSCEIVER,
@@ -334,7 +335,7 @@ struct rig_caps k3_caps =
.get_level = k3_get_level,
.set_ext_level = k3_set_ext_level,
.get_ext_level = k3_get_ext_level,
- .vfo_op = kenwood_vfo_op,
+ .vfo_op = k3_vfo_op,
.set_trn = kenwood_set_trn,
.get_trn = kenwood_get_trn,
.set_powerstat = kenwood_set_powerstat,
@@ -356,7 +357,7 @@ struct rig_caps k3s_caps =
RIG_MODEL(RIG_MODEL_K3S),
.model_name = "K3S",
.mfg_name = "Elecraft",
- .version = BACKEND_VER ".21",
+ .version = BACKEND_VER ".22",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rig_type = RIG_TYPE_TRANSCEIVER,
@@ -493,7 +494,7 @@ struct rig_caps k3s_caps =
.get_level = k3_get_level,
.set_ext_level = k3_set_ext_level,
.get_ext_level = k3_get_ext_level,
- .vfo_op = kenwood_vfo_op,
+ .vfo_op = k3_vfo_op,
.set_trn = kenwood_set_trn,
.get_trn = kenwood_get_trn,
.set_powerstat = kenwood_set_powerstat,
@@ -516,7 +517,7 @@ struct rig_caps k4_caps =
RIG_MODEL(RIG_MODEL_K4),
.model_name = "K4",
.mfg_name = "Elecraft",
- .version = BACKEND_VER ".28",
+ .version = BACKEND_VER ".29",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rig_type = RIG_TYPE_TRANSCEIVER,
@@ -658,7 +659,7 @@ struct rig_caps k4_caps =
.get_level = k3_get_level,
.set_ext_level = k3_set_ext_level,
.get_ext_level = k3_get_ext_level,
- .vfo_op = kenwood_vfo_op,
+ .vfo_op = k3_vfo_op,
.set_trn = kenwood_set_trn,
.get_trn = kenwood_get_trn,
.set_powerstat = kenwood_set_powerstat,
@@ -680,7 +681,7 @@ struct rig_caps kx3_caps =
RIG_MODEL(RIG_MODEL_KX3),
.model_name = "KX3",
.mfg_name = "Elecraft",
- .version = BACKEND_VER ".19",
+ .version = BACKEND_VER ".20",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rig_type = RIG_TYPE_TRANSCEIVER,
@@ -816,7 +817,7 @@ struct rig_caps kx3_caps =
.get_level = kx3_get_level,
.set_ext_level = k3_set_ext_level,
.get_ext_level = k3_get_ext_level,
- .vfo_op = kenwood_vfo_op,
+ .vfo_op = k3_vfo_op,
.set_trn = kenwood_set_trn,
.get_trn = kenwood_get_trn,
.set_powerstat = kenwood_set_powerstat,
@@ -838,7 +839,7 @@ struct rig_caps kx2_caps =
RIG_MODEL(RIG_MODEL_KX2),
.model_name = "KX2",
.mfg_name = "Elecraft",
- .version = BACKEND_VER ".18",
+ .version = BACKEND_VER ".19",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rig_type = RIG_TYPE_TRANSCEIVER,
@@ -973,7 +974,7 @@ struct rig_caps kx2_caps =
.get_level = kx3_get_level,
.set_ext_level = k3_set_ext_level,
.get_ext_level = k3_get_ext_level,
- .vfo_op = kenwood_vfo_op,
+ .vfo_op = k3_vfo_op,
.set_trn = kenwood_set_trn,
.get_trn = kenwood_get_trn,
.set_powerstat = kenwood_set_powerstat,
@@ -2478,6 +2479,10 @@ int k3_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
SNPRINTF(buf, sizeof(buf), "AG%c", (status == 0) ? '/' : '0');
break;
+ case RIG_FUNC_TUNER: // K2 KX2 K3 KX3 K4
+ SNPRINTF(buf, sizeof(buf), "SWH16");
+ break;
+
default:
return kenwood_set_func(rig, vfo, func, status);
}
@@ -2485,6 +2490,19 @@ int k3_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
return kenwood_transaction(rig, buf, NULL, 0);
}
+int k3_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op)
+{
+ char buf[32];
+ switch (op)
+ {
+ case RIG_OP_TUNE: // K2 KX2 K3 KX3 K4
+ SNPRINTF(buf, sizeof(buf), "SWH16");
+ break;
+ default: return kenwood_vfo_op(rig, vfo, op);
+ }
+ return kenwood_transaction(rig, buf, NULL, 0);
+}
+
/*
* Some functions, notably RIT and XIT On/Off status, can be queried
* on the K3. Those functions are handled here and others are passed
commit d71f7a93857a2eb1b551b13b5b6add03cbbe0b4e
Author: Mike Black W9MDB <mdb...@ya...>
Date: Sat May 11 07:42:20 2024 -0500
Add RIG_OP_TUNE to Elecraft K2 KX2 K3 KX3 K4
diff --git a/rigs/kenwood/k3.c b/rigs/kenwood/k3.c
index 779fc504a..03057d144 100644
--- a/rigs/kenwood/k3.c
+++ b/rigs/kenwood/k3.c
@@ -52,7 +52,7 @@
RIG_LEVEL_NR|RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_RAWSTR|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_RFPOWER_METER_WATTS)
#define K3_VFO (RIG_VFO_A|RIG_VFO_B)
-#define K3_VFO_OP (RIG_OP_UP|RIG_OP_DOWN)
+#define K3_VFO_OP (RIG_OP_UP|RIG_OP_DOWN|RIG_OP_TUNE)
#define K3_ANTS (RIG_ANT_1|RIG_ANT_2)
#define K4_ANTS (RIG_ANT_1|RIG_ANT_2|RIG_ANT_3|RIG_ANT_4)
@@ -161,6 +161,7 @@ int kx3_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val);
int kx3_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val);
int k3_set_func(RIG *rig, vfo_t vfo, setting_t func, int status);
int k3_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status);
+int k3_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op);
int k3_power2mW(RIG *rig, unsigned int *mwpower, float power, freq_t freq,
rmode_t mode);
@@ -197,7 +198,7 @@ struct rig_caps k3_caps =
RIG_MODEL(RIG_MODEL_K3),
.model_name = "K3",
.mfg_name = "Elecraft",
- .version = BACKEND_VER ".27",
+ .version = BACKEND_VER ".28",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rig_type = RIG_TYPE_TRANSCEIVER,
@@ -334,7 +335,7 @@ struct rig_caps k3_caps =
.get_level = k3_get_level,
.set_ext_level = k3_set_ext_level,
.get_ext_level = k3_get_ext_level,
- .vfo_op = kenwood_vfo_op,
+ .vfo_op = k3_vfo_op,
.set_trn = kenwood_set_trn,
.get_trn = kenwood_get_trn,
.set_powerstat = kenwood_set_powerstat,
@@ -356,7 +357,7 @@ struct rig_caps k3s_caps =
RIG_MODEL(RIG_MODEL_K3S),
.model_name = "K3S",
.mfg_name = "Elecraft",
- .version = BACKEND_VER ".21",
+ .version = BACKEND_VER ".22",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rig_type = RIG_TYPE_TRANSCEIVER,
@@ -493,7 +494,7 @@ struct rig_caps k3s_caps =
.get_level = k3_get_level,
.set_ext_level = k3_set_ext_level,
.get_ext_level = k3_get_ext_level,
- .vfo_op = kenwood_vfo_op,
+ .vfo_op = k3_vfo_op,
.set_trn = kenwood_set_trn,
.get_trn = kenwood_get_trn,
.set_powerstat = kenwood_set_powerstat,
@@ -516,7 +517,7 @@ struct rig_caps k4_caps =
RIG_MODEL(RIG_MODEL_K4),
.model_name = "K4",
.mfg_name = "Elecraft",
- .version = BACKEND_VER ".28",
+ .version = BACKEND_VER ".29",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rig_type = RIG_TYPE_TRANSCEIVER,
@@ -658,7 +659,7 @@ struct rig_caps k4_caps =
.get_level = k3_get_level,
.set_ext_level = k3_set_ext_level,
.get_ext_level = k3_get_ext_level,
- .vfo_op = kenwood_vfo_op,
+ .vfo_op = k3_vfo_op,
.set_trn = kenwood_set_trn,
.get_trn = kenwood_get_trn,
.set_powerstat = kenwood_set_powerstat,
@@ -680,7 +681,7 @@ struct rig_caps kx3_caps =
RIG_MODEL(RIG_MODEL_KX3),
.model_name = "KX3",
.mfg_name = "Elecraft",
- .version = BACKEND_VER ".19",
+ .version = BACKEND_VER ".20",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rig_type = RIG_TYPE_TRANSCEIVER,
@@ -816,7 +817,7 @@ struct rig_caps kx3_caps =
.get_level = kx3_get_level,
.set_ext_level = k3_set_ext_level,
.get_ext_level = k3_get_ext_level,
- .vfo_op = kenwood_vfo_op,
+ .vfo_op = k3_vfo_op,
.set_trn = kenwood_set_trn,
.get_trn = kenwood_get_trn,
.set_powerstat = kenwood_set_powerstat,
@@ -838,7 +839,7 @@ struct rig_caps kx2_caps =
RIG_MODEL(RIG_MODEL_KX2),
.model_name = "KX2",
.mfg_name = "Elecraft",
- .version = BACKEND_VER ".18",
+ .version = BACKEND_VER ".19",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rig_type = RIG_TYPE_TRANSCEIVER,
@@ -973,7 +974,7 @@ struct rig_caps kx2_caps =
.get_level = kx3_get_level,
.set_ext_level = k3_set_ext_level,
.get_ext_level = k3_get_ext_level,
- .vfo_op = kenwood_vfo_op,
+ .vfo_op = k3_vfo_op,
.set_trn = kenwood_set_trn,
.get_trn = kenwood_get_trn,
.set_powerstat = kenwood_set_powerstat,
@@ -2478,6 +2479,10 @@ int k3_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
SNPRINTF(buf, sizeof(buf), "AG%c", (status == 0) ? '/' : '0');
break;
+ case RIG_FUNC_TUNER: // K2 KX2 K3 KX3 K4
+ SNPRINTF(buf, sizeof(buf), "SWH16");
+ break;
+
default:
return kenwood_set_func(rig, vfo, func, status);
}
@@ -2485,6 +2490,19 @@ int k3_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
return kenwood_transaction(rig, buf, NULL, 0);
}
+int k3_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op)
+{
+ char buf[32];
+ switch (op)
+ {
+ case RIG_OP_TUNE: // K2 KX2 K3 KX3 K4
+ SNPRINTF(buf, sizeof(buf), "SWH16");
+ break;
+ default: return kenwood_vfo_op(rig, vfo, op);
+ }
+ return kenwood_transaction(rig, buf, NULL, 0);
+}
+
/*
* Some functions, notably RIT and XIT On/Off status, can be queried
* on the K3. Those functions are handled here and others are passed
commit 09fbc4cb64895925e3a00ec8d314f6b3e275ad7f
Author: Mike Black W9MDB <mdb...@ya...>
Date: Thu May 9 17:09:40 2024 -0500
Restore Xiegu G90 x25/x26 command detection. Works find on Base 1.79 App 1.80
https://github.com/Hamlib/Hamlib/issues/1547
diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c
index 5660a9823..7dd23c42e 100644
--- a/rigs/icom/icom.c
+++ b/rigs/icom/icom.c
@@ -9751,6 +9751,7 @@ static void icom_set_x25x26_ability(RIG *rig, int status)
if (!icom_is_x25x26_potentially_supported(rig))
{
// No change for rigs that don't support these commands anyway
+ rig_debug(RIG_DEBUG_VERBOSE, "%s: Hamlib thinks rig does not support x25/x26 command\n", __func__);
return;
}
diff --git a/rigs/icom/xiegu.c b/rigs/icom/xiegu.c
index 3fc04385b..fad83abdc 100644
--- a/rigs/icom/xiegu.c
+++ b/rigs/icom/xiegu.c
@@ -147,6 +147,7 @@ int xiegu_rig_open(RIG *rig)
if (retval == RIG_OK)
{
+ dump_hex(id,id_len);
iid = (((int)id[2]) << 8) + id[3];
rig_debug(RIG_DEBUG_VERBOSE, "%s: Xiegu Radio ID=0x%04x\n", __func__, iid);
switch(iid)
@@ -551,7 +552,7 @@ static struct icom_priv_caps g90_priv_caps =
0, /* no XCHG */
ic7200_ts_sc_list,
.x25x26_always = 0,
- .x25x26_possibly = 0, // Firmware G90 v20240504.8 doesn't work well -- see https://github.com/Hamlib/Hamlib/issues/1547
+ .x25x26_possibly = 1, // Firmware G90 v20240504.8 doesn't work well -- see https://github.com/Hamlib/Hamlib/issues/1547
.x1cx03_always = 0,
.x1cx03_possibly = 0,
.x1ax03_supported = 0,
@@ -564,7 +565,7 @@ struct rig_caps g90_caps =
RIG_MODEL(RIG_MODEL_G90),
.model_name = "G90",
.mfg_name = "Xiegu",
- .version = BACKEND_VER ".9",
+ .version = BACKEND_VER ".10",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rig_type = RIG_TYPE_TRANSCEIVER,
@@ -599,8 +600,7 @@ struct rig_caps g90_caps =
.max_xit = Hz(9999),
.max_ifshift = Hz(0), /* TODO */
.vfo_ops = X108G_VFO_OPS,
-// Disabling targetable_vfo as G90 firmare update has brokne it see https://github.com/Hamlib/Hamlib/issues/1547
-// .targetable_vfo = RIG_TARGETABLE_FREQ | RIG_TARGETABLE_MODE,
+ .targetable_vfo = RIG_TARGETABLE_FREQ | RIG_TARGETABLE_MODE,
.scan_ops = X108G_SCAN_OPS,
.transceive = RIG_TRN_RIG,
.bank_qty = 5,
commit cf91e96333979368a0bde89d5c31b7ed4f39bce5
Author: Addison Schuhardt <ad...@sc...>
Date: Thu Apr 11 00:17:06 2024 -0700
Refactoring GPIO push-to-talk logic to use libgpiod rather than the deprecated/broken sysfs method.
TODO: I'm not familiar with autoconf to set up linking to libgpiod correctly, so I'd like to ask someone else to do that.
Fixes #1538
diff --git a/configure.ac b/configure.ac
index d07ec9b9a..3a6af4e55 100644
--- a/configure.ac
+++ b/configure.ac
@@ -529,6 +529,9 @@ AS_IF([test x"${cf_with_xml_support}" = "xyes"], [
AC_SUBST([LIBXML2_LIBS])
AC_SUBST([LIBXML2_CFLAGS])
+# TODO: I don't know how to use autoconf
+LIBS="$LIBS -lgpiod"
+
## ----------------- ##
## Language bindings ##
diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h
index fc360c692..a03890f8e 100644
--- a/include/hamlib/rig.h
+++ b/include/hamlib/rig.h
@@ -2340,6 +2340,7 @@ typedef struct hamlib_port {
int fd; /*!< File descriptor */
void *handle; /*!< handle for USB */
+ void *gpio; /*!< handle for GPIO */
int write_delay; /*!< Delay between each byte sent out, in mS */
int post_write_delay; /*!< Delay between each commands send out, in mS */
diff --git a/src/gpio.c b/src/gpio.c
index e5fcfb597..88bfd305f 100644
--- a/src/gpio.c
+++ b/src/gpio.c
@@ -19,135 +19,91 @@
*
*/
-#include <string.h>
+#include "gpio.h"
+
#include <errno.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
#include <fcntl.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <gpiod.h>
-#include "gpio.h"
+#ifndef GPIOD_PATH
+// This is what's used on the Raspberry Pi 4; I'm not sure about others
+#define GPIO_CHIP_NAME "gpiochip0"
+#endif
+#define GPIO_CHIP_CONSUMER "Hamlib"
int gpio_open(hamlib_port_t *port, int output, int on_value)
{
- char pathname[HAMLIB_FILPATHLEN * 2];
- FILE *fexp, *fdir;
- int fd;
- char *dir;
+ struct gpiod_chip *chip;
+ struct gpiod_line *line;
port->parm.gpio.on_value = on_value;
- SNPRINTF(pathname, HAMLIB_FILPATHLEN, "/sys/class/gpio/export");
- fexp = fopen(pathname, "w");
+ chip = gpiod_chip_open_by_name(GPIO_CHIP_NAME);
- if (!fexp)
+ if (!chip)
{
- rig_debug(RIG_DEBUG_ERR,
- "Export GPIO%s (using %s): %s\n",
- port->pathname,
- pathname,
- strerror(errno));
+ rig_debug(RIG_DEBUG_ERR, "Failed to open GPIO chip %s: %s\n", GPIO_CHIP_NAME, strerror(errno));
return -RIG_EIO;
}
- fprintf(fexp, "%s\n", port->pathname);
- fclose(fexp);
-
- SNPRINTF(pathname,
- sizeof(pathname),
- "/sys/class/gpio/gpio%s/direction",
- port->pathname);
- fdir = fopen(pathname, "w");
-
- if (!fdir)
+ line = gpiod_chip_get_line(chip, atoi(port->pathname));
+ if (!line)
{
- rig_debug(RIG_DEBUG_ERR,
- "GPIO%s direction (using %s): %s\n",
- port->pathname,
- pathname,
- strerror(errno));
+ rig_debug(RIG_DEBUG_ERR, "Failed to acquire GPIO%s: %s\n", port->pathname, strerror(errno));
+ gpiod_chip_close(chip);
return -RIG_EIO;
}
- dir = output ? "out" : "in";
- rig_debug(RIG_DEBUG_VERBOSE, "Setting direction of GPIO%s to %s\n",
- port->pathname, dir);
- fprintf(fdir, "%s\n", dir);
- fclose(fdir);
-
- SNPRINTF(pathname,
- sizeof(pathname),
- "/sys/class/gpio/gpio%s/value",
- port->pathname);
- fd = open(pathname, O_RDWR);
-
- if (fd < 0)
+ if ((output && gpiod_line_request_output(line, GPIO_CHIP_CONSUMER, 0) < 0) ||
+ (!output && gpiod_line_request_input(line, GPIO_CHIP_CONSUMER) < 0))
{
- rig_debug(RIG_DEBUG_ERR,
- "GPIO%s opening value file %s: %s\n",
- port->pathname,
- pathname,
- strerror(errno));
+ rig_debug(RIG_DEBUG_ERR, "Failed to set GPIO%s to %s mode: %s\n",
+ port->pathname, (output ? "OUTPUT" : "INPUT"), strerror(errno));
+ gpiod_line_release(line);
+ gpiod_chip_close(chip);
return -RIG_EIO;
}
- port->fd = fd;
- return fd;
-}
+ port->gpio = line;
+ return RIG_OK;
+}
int gpio_close(hamlib_port_t *port)
{
- int retval;
- char pathname[HAMLIB_FILPATHLEN * 2];
- FILE *fexp;
-
- retval = close(port->fd);
-
- SNPRINTF(pathname, HAMLIB_FILPATHLEN, "/sys/class/gpio/unexport");
- fexp = fopen(pathname, "w");
-
- if (!fexp)
- {
- rig_debug(RIG_DEBUG_ERR,
- "Export GPIO%s (using %s): %s\n",
- port->pathname,
- pathname,
- strerror(errno));
- return -RIG_EIO;
- }
-
- fprintf(fexp, "%s\n", port->pathname);
- fclose(fexp);
- return retval;
+ gpiod_line_close_chip((struct gpiod_line*)port->gpio);
+ return RIG_OK;
}
-
int gpio_ptt_set(hamlib_port_t *port, ptt_t pttx)
{
- char *val;
+ int result = 0;
port->parm.gpio.value = pttx != RIG_PTT_OFF;
- if ((port->parm.gpio.value && port->parm.gpio.on_value)
- || (!port->parm.gpio.value && !port->parm.gpio.on_value))
+ if ((port->parm.gpio.value && port->parm.gpio.on_value) ||
+ (!port->parm.gpio.value && !port->parm.gpio.on_value))
{
- val = "1\n";
+ result = gpiod_line_set_value((struct gpiod_line*)port->gpio, 1);
}
else
{
- val = "0\n";
+ result = gpiod_line_set_value((struct gpiod_line*)port->gpio, 0);
}
- if (write(port->fd, val, strlen(val)) <= 0)
+ if (result)
{
+ rig_debug(RIG_DEBUG_ERR, "Failed to set the value of GPIO%s: %s\n", port->pathname, strerror(errno));
return -RIG_EIO;
}
return RIG_OK;
}
-
int gpio_ptt_get(hamlib_port_t *port, ptt_t *pttx)
{
if (port->parm.gpio.value)
@@ -164,21 +120,15 @@ int gpio_ptt_get(hamlib_port_t *port, ptt_t *pttx)
int gpio_dcd_get(hamlib_port_t *port, dcd_t *dcdx)
{
- char val;
- int port_value;
-
- lseek(port->fd, 0, SEEK_SET);
-
- if (read(port->fd, &val, sizeof(val)) <= 0)
+ int val = gpiod_line_get_value((struct gpiod_line*)port->gpio);
+ if (val < 0)
{
- return -RIG_EIO;
+ rig_debug(RIG_DEBUG_ERR, "Failed to read the value of GPIO%s: %s\n", port->pathname, strerror(errno));
}
rig_debug(RIG_DEBUG_VERBOSE, "DCD GPIO pin value: %c\n", val);
- port_value = val - '0';
-
- if (port_value == port->parm.gpio.on_value)
+ if (val == port->parm.gpio.on_value)
{
*dcdx = RIG_DCD_ON;
}
-----------------------------------------------------------------------
Summary of changes:
rigs/icom/ic7100.c | 6 +++---
rigs/icom/icom.c | 1 +
rigs/icom/icom.h | 2 +-
rigs/icom/xiegu.c | 8 ++++----
rigs/kenwood/k2.c | 21 ++++++++++++++++++---
rigs/kenwood/k3.c | 40 +++++++++++++++++++++++++++++-----------
rigs/kenwood/kenwood.c | 7 +++++++
rigs/kenwood/kenwood.h | 2 +-
simulators/simelecraft.c | 19 +++++++++++++++++--
9 files changed, 81 insertions(+), 25 deletions(-)
hooks/post-receive
--
Hamlib -- Ham radio control libraries
|