[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 |