[Hamlib-commits] Hamlib -- Ham radio control libraries branch master updated. ba9a1006e8fd905f3c166
Library to control radio transceivers and receivers
Brought to you by:
n0nb
From: n0nb <n0...@us...> - 2023-07-08 10:23:03
|
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 ba9a1006e8fd905f3c16679649ddbc8226e4a5ea (commit) via bcad19d563a6eb79f5c3f2f064b5df488d655212 (commit) via af506f8e1537a7ac8103220e953d95f5dca5b848 (commit) via fda5b984e708bf1086cff8806b2301d2dcfda5a3 (commit) via 8ebe2300292d151420d996c17261a00446325502 (commit) via 4b43c755a68b254f6066415b68fcdcfbc6c419a0 (commit) via 4f3bdbdffe9ac56f969302d4330dd85a12633fae (commit) via ce052db3a290fd5f00050d79541f969ba9195d79 (commit) via 3cc6b7614c5ce836c86787eb255e59fba989a49a (commit) from 3bda269494f4719fa49a996dd62ab0429f81e9d4 (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 ba9a1006e8fd905f3c16679649ddbc8226e4a5ea Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Jul 7 22:39:05 2023 -0500 Fix rig.c diff --git a/src/rig.c b/src/rig.c index 21cec3a13..50835b118 100644 --- a/src/rig.c +++ b/src/rig.c @@ -1,4 +1,3 @@ -Add current_vfo to cache debug statementy /* * Hamlib Interface - main file * Copyright (c) 2021 by Mikael Nousiainen commit bcad19d563a6eb79f5c3f2f064b5df488d655212 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Jul 7 22:34:45 2023 -0500 Add morse_data items diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 490bab24b..20eb6466a 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -2680,6 +2680,8 @@ struct rig_state { freq_t spectrum_spans[HAMLIB_MAX_SPECTRUM_SPANS]; /*!< Supported spectrum scope frequency spans in Hz in center mode. Last entry must be 0. */ struct rig_spectrum_avg_mode spectrum_avg_modes[HAMLIB_MAX_SPECTRUM_AVG_MODES]; /*!< Supported spectrum scope averaging modes. Last entry must have NULL name. */ int spectrum_attenuator[HAMLIB_MAXDBLSTSIZ]; /*!< Spectrum attenuator list in dB, 0 terminated */ + volatile int morse_data_handler_thread_run; + void *morse_data_handler_priv_data; }; /** commit af506f8e1537a7ac8103220e953d95f5dca5b848 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Jul 7 22:23:28 2023 -0500 Implement next phase of threaded rig_send_morse diff --git a/src/fifo.c b/src/fifo.c index 44b00c8a9..3272188e0 100644 --- a/src/fifo.c +++ b/src/fifo.c @@ -48,6 +48,7 @@ int main() // Popping and printing one character at a time int c; + while ((c = pop(&fifo)) != -1) { printf("%c", c); diff --git a/src/iofunc.c b/src/iofunc.c index 42942b3f6..0fc8551d2 100644 --- a/src/iofunc.c +++ b/src/iofunc.c @@ -1337,7 +1337,10 @@ static int read_string_generic(hamlib_port_t *p, { ssize_t rd_count = 0; int result; + int timeout_save = p->timeout; + p->timeout = 2; result = port_wait_for_data(p, direct); + p->timeout = timeout_save; if (result == -RIG_ETIMEOUT) { diff --git a/src/rig.c b/src/rig.c index 7bc854191..21cec3a13 100644 --- a/src/rig.c +++ b/src/rig.c @@ -1,3 +1,4 @@ +Add current_vfo to cache debug statementy /* * Hamlib Interface - main file * Copyright (c) 2021 by Mikael Nousiainen @@ -51,6 +52,7 @@ #include "hamlib/rig.h" #include "hamlib/config.h" +#include "fifo.h" #include <stdlib.h> #include <string.h> @@ -240,6 +242,22 @@ static int async_data_handler_stop(RIG *rig); void *async_data_handler(void *arg); #endif +typedef struct morse_data_handler_args_s +{ + RIG *rig; +} morse_data_handler_args; + +typedef struct morse_data_handler_priv_data_s +{ + pthread_t thread_id; + morse_data_handler_args args; + FIFO fifo; +} morse_data_handler_priv_data; + +static int morse_data_handler_start(RIG *rig); +static int morse_data_handler_stop(RIG *rig); +void *morse_data_handler(void *arg); + /* * track which rig is opened (with rig_open) * needed at least for transceive mode @@ -563,7 +581,7 @@ RIG *HAMLIB_API rig_init(rig_model_t rig_model) rs->rig_model = caps->rig_model; rs->priv = NULL; - rs->async_data_enabled = 1; +// rs->async_data_enabled = 1; rs->rigport.fd = -1; rs->pttport.fd = -1; rs->comm_state = 0; @@ -1303,6 +1321,16 @@ int HAMLIB_API rig_open(RIG *rig) rs->comm_state); hl_usleep(100 * 1000); // wait a bit after opening to give some serial ports time + status = morse_data_handler_start(rig); + + if (status < 0) + { + rig_debug(RIG_DEBUG_ERR, "%s: cw_data_handler_start failed: %s\n", __func__, rigerror(status)); + port_close(&rs->rigport, rs->rigport.type.rig); + RETURNFUNC2(status); + } + + /* * Maybe the backend has something to initialize * In case of failure, just close down and report error code. @@ -1344,6 +1372,7 @@ int HAMLIB_API rig_open(RIG *rig) { remove_opened_rig(rig); async_data_handler_stop(rig); + morse_data_handler_stop(rig); port_close(&rs->rigport, rs->rigport.type.rig); memcpy(&rs->rigport_deprecated, &rs->rigport, sizeof(hamlib_port_t_deprecated)); rs->comm_state = 0; @@ -1494,6 +1523,7 @@ int HAMLIB_API rig_close(RIG *rig) caps->rig_close(rig); } + morse_data_handler_stop(rig); async_data_handler_stop(rig); /* @@ -7741,6 +7771,39 @@ static int async_data_handler_start(RIG *rig) RETURNFUNC(RIG_OK); } +static int morse_data_handler_start(RIG *rig) +{ + struct rig_state *rs = &rig->state; + morse_data_handler_priv_data *morse_data_handler_priv; + + ENTERFUNC; + + rs->morse_data_handler_thread_run = 1; + rs->morse_data_handler_priv_data = calloc(1, + sizeof(morse_data_handler_priv_data)); + + if (rs->morse_data_handler_priv_data == NULL) + { + RETURNFUNC(-RIG_ENOMEM); + } + + morse_data_handler_priv = (morse_data_handler_priv_data *) + rs->morse_data_handler_priv_data; + morse_data_handler_priv->args.rig = rig; + int err = pthread_create(&morse_data_handler_priv->thread_id, NULL, + morse_data_handler, &morse_data_handler_priv->args); + + if (err) + { + rig_debug(RIG_DEBUG_ERR, "%s: pthread_create error: %s\n", __func__, + strerror(errno)); + RETURNFUNC(-RIG_EINTERNAL); + } + + RETURNFUNC(RIG_OK); +} + + static int async_data_handler_stop(RIG *rig) { struct rig_state *rs = &rig->state; @@ -7782,6 +7845,45 @@ static int async_data_handler_stop(RIG *rig) RETURNFUNC(RIG_OK); } +static int morse_data_handler_stop(RIG *rig) +{ + struct rig_state *rs = &rig->state; + morse_data_handler_priv_data *morse_data_handler_priv; + + ENTERFUNC; + + rs->morse_data_handler_thread_run = 0; + + morse_data_handler_priv = (morse_data_handler_priv_data *) + rs->morse_data_handler_priv_data; + + if (morse_data_handler_priv != NULL) + { + if (morse_data_handler_priv->thread_id != 0) + { + // all cleanup is done in this function so we can kill thread + // Windows was taking 30 seconds to stop without this + pthread_cancel(morse_data_handler_priv->thread_id); + int err = pthread_join(morse_data_handler_priv->thread_id, NULL); + + if (err) + { + rig_debug(RIG_DEBUG_ERR, "%s: pthread_join error: %s\n", __func__, + strerror(errno)); + // just ignore the error + } + + morse_data_handler_priv->thread_id = 0; + } + + free(rs->morse_data_handler_priv_data); + rs->morse_data_handler_priv_data = NULL; + } + + RETURNFUNC(RIG_OK); +} + + void *async_data_handler(void *arg) { struct async_data_handler_args_s *args = (struct async_data_handler_args_s *) @@ -7822,7 +7924,7 @@ void *async_data_handler(void *arg) __func__, result); hl_usleep(500 * 1000); } - + hl_usleep(10*1000); continue; } @@ -7867,6 +7969,40 @@ void *async_data_handler(void *arg) } #endif +void *morse_data_handler(void *arg) +{ + struct morse_data_handler_args_s *args = (struct morse_data_handler_args_s *) + arg; + RIG *rig = args->rig; + struct rig_state *rs = &rig->state; + int result; + FIFO fifo; + + rig_debug(RIG_DEBUG_VERBOSE, "%s: Starting morse data handler thread\n", + __func__); + + initFIFO(&fifo); + while (rs->morse_data_handler_thread_run) + { + char c[2]; + c[1] = 0; + while((c[0]=pop(&fifo)!=-1)) + { + result = rig_send_morse(rig, RIG_VFO_CURR, c); + if (result != RIG_OK) + { + rig_debug(RIG_DEBUG_ERR, "%s: error: %s\n", __func__, rigerror(result)); + push(&fifo, c); + hl_usleep(20*1000); + } + } + hl_usleep(20*1000); + } + pthread_exit(NULL); + return NULL; +} + + HAMLIB_EXPORT(int) rig_password(RIG *rig, const char *key1) { int retval = -RIG_EPROTO; @@ -8034,3 +8170,5 @@ HAMLIB_EXPORT(int) rig_is_model(RIG *rig, rig_model_t model) return (is_rig); // RETURN is too verbose here } + + commit fda5b984e708bf1086cff8806b2301d2dcfda5a3 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Jul 7 22:22:57 2023 -0500 Add current_vfo to cache debug statement diff --git a/src/cache.c b/src/cache.c index 355707b7b..cf257a3d8 100644 --- a/src/cache.c +++ b/src/cache.c @@ -323,8 +323,8 @@ int rig_get_cache(RIG *rig, vfo_t vfo, freq_t *freq, int *cache_ms_freq, break; default: - rig_debug(RIG_DEBUG_WARN, "%s(%d): unknown vfo=%s\n", __func__, __LINE__, - rig_strvfo(vfo)); + rig_debug(RIG_DEBUG_WARN, "%s(%d): unknown vfo=%s, curr_vfo=%s\n", __func__, __LINE__, + rig_strvfo(vfo), rig_strvfo(rig->state.current_vfo)); } } commit 8ebe2300292d151420d996c17261a00446325502 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Jul 7 22:12:55 2023 -0500 Comment out unused var diff --git a/src/multicast.c b/src/multicast.c index de834c7e1..a79a78863 100644 --- a/src/multicast.c +++ b/src/multicast.c @@ -214,9 +214,8 @@ void json_add_vfoB(RIG *rig, char *msg) { strcat(msg, ",\n{\n"); json_add_string(msg, "Name", "VFOB", 1); - json_add_int(msg, "Freq", rig->state.cache.freqMainB, 0); + json_add_int(msg, "Freq", rig->state.cache.freqMainB, 1); -#if 0 if (strlen(rig_strrmode(rig->state.cache.modeMainB)) > 0) { json_add_string(msg, "Mode", rig_strrmode(rig->state.cache.modeMainB), 1); @@ -226,7 +225,6 @@ void json_add_vfoB(RIG *rig, char *msg) { json_add_int(msg, "Width", rig->state.cache.widthMainB, 0); } -#endif #if 0 // not working yet if (rig->state.rx_vfo != rig->state.tx_vfo && rig->state.cache.split) @@ -291,14 +289,12 @@ void *multicast_thread(void *vrig) // do the 1st packet all the time multicast_status_changed(rig); multicast_send_json(rig); - int loopcount = 4; + int loopcount = 8; + freq_t freqA, freqAsave = 0; + freq_t freqB, freqBsave = 0; while (rig->state.multicast->runflag) { - hl_usleep(100 * 1000); - freq_t freqA, freqAsave = 0; - freq_t freqB, freqBsave = 0; - if ((retval = rig_get_freq(rig, RIG_VFO_A, &freqA)) != RIG_OK) { rig_debug(RIG_DEBUG_ERR, "%s: rig_get_freqA:%s\n", __func__, rigerror(retval)); @@ -314,14 +310,19 @@ void *multicast_thread(void *vrig) freqB = rig->state.cache.freqMainB; } - if (freqA != freqAsave || freqB != freqBsave || loopcount-- == 0) + if (freqA != freqAsave || freqB != freqBsave || loopcount-- <= 0) { multicast_status_changed(rig); multicast_send_json(rig); - loopcount = 4; + loopcount = 8; freqAsave = freqA; freqBsave = freqB; } + else + { + hl_usleep(100 * 1000); + } + } @@ -379,7 +380,7 @@ int multicast_init(RIG *rig, char *addr, int port) if (port == 0) { port = RIG_MULTICAST_PORT; } // Create a UDP socket - rig->state.multicast->sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + rig->state.multicast->sock = socket(AF_INET, SOCK_DGRAM, 0); if (rig->state.multicast->sock < 0) { @@ -392,6 +393,7 @@ int multicast_init(RIG *rig, char *addr, int port) return -RIG_EIO; } +#if 0 // Set the SO_REUSEADDR option to allow multiple processes to use the same address int optval = 1; @@ -402,19 +404,22 @@ int multicast_init(RIG *rig, char *addr, int port) rig_debug(RIG_DEBUG_ERR, "%s: setsockopt: %s\n", __func__, strerror(errno)); return -RIG_EIO; } +#endif // Bind the socket to any available local address and the specified port - struct sockaddr_in saddr = {0}; - saddr.sin_family = AF_INET; - saddr.sin_addr.s_addr = htonl(INADDR_ANY); - saddr.sin_port = htons(port); + //struct sockaddr_in saddr = {0}; + //saddr.sin_family = AF_INET; + //saddr.sin_addr.s_addr = inet_addr(addr); + //saddr.sin_port = htons(port); +#if 0 if (bind(rig->state.multicast->sock, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) { rig_debug(RIG_DEBUG_ERR, "%s: bind: %s\n", __func__, strerror(errno)); return -RIG_EIO; } +#endif // Construct the multicast group address // struct ip_mreq mreq = {0}; @@ -431,26 +436,30 @@ int multicast_init(RIG *rig, char *addr, int port) return -RIG_EIO; } +#if 0 +// look like we need to implement the client in a separate thread? // Join the multicast group if (setsockopt(rig->state.multicast->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&rig->state.multicast->mreq, sizeof(rig->state.multicast->mreq)) < 0) { rig_debug(RIG_DEBUG_ERR, "%s: setsockopt: %s\n", __func__, strerror(errno)); - return -RIG_EIO; + //return -RIG_EIO; } +#endif // prime the dest_addr for the send routine + memset(&rig->state.multicast->dest_addr,0,sizeof(rig->state.multicast->dest_addr)); rig->state.multicast->dest_addr.sin_family = AF_INET; rig->state.multicast->dest_addr.sin_addr.s_addr = inet_addr(addr); rig->state.multicast->dest_addr.sin_port = htons(port); - printf("starting thread\n"); - +#if 0 rig->state.multicast->runflag = 1; pthread_create(&rig->state.multicast->threadid, NULL, multicast_thread, (void *)rig); //printf("threadid=%ld\n", rig->state.multicast->threadid); rig->state.multicast->multicast_running = 1; +#endif return RIG_OK; } @@ -479,11 +488,17 @@ int multicast_send(RIG *rig, const char *msg, int msglen) { // Construct the message to send if (msglen == 0) { msglen = strlen((char *)msg); } + struct sockaddr_in addr; + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = inet_addr("224.0.0.1"); + addr.sin_port = htons(4532); + // Send the message to the multicast group ssize_t num_bytes = sendto(rig->state.multicast->sock, msg, msglen, 0, - (struct sockaddr *)&rig->state.multicast->dest_addr, - sizeof(rig->state.multicast->dest_addr)); + (struct sockaddr *)&addr, + sizeof(addr)); if (num_bytes < 0) { commit 4b43c755a68b254f6066415b68fcdcfbc6c419a0 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Jul 7 15:37:06 2023 -0500 Add fifo.h to Makefile.am diff --git a/src/Makefile.am b/src/Makefile.am index 31fe4b9fe..6da17e185 100755 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -10,7 +10,7 @@ RIGSRC = hamlibdatetime.h rig.c serial.c serial.h misc.c misc.h register.c regis network.c network.h cm108.c cm108.h gpio.c gpio.h idx_builtin.h token.h \ par_nt.h microham.c microham.h amplifier.c amp_reg.c amp_conf.c \ amp_conf.h amp_settings.c extamp.c sleep.c sleep.h sprintflst.c \ - sprintflst.h cache.c cache.h snapshot_data.c snapshot_data.h multicast.c fifo.c + sprintflst.h cache.c cache.h snapshot_data.c snapshot_data.h multicast.c fifo.c fifo.h if VERSIONDLL RIGSRC += \ commit 4f3bdbdffe9ac56f969302d4330dd85a12633fae Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Jul 7 15:26:36 2023 -0500 Add fifo routine to be used for CW queueing diff --git a/src/Makefile.am b/src/Makefile.am index 17d5a2701..31fe4b9fe 100755 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -10,7 +10,7 @@ RIGSRC = hamlibdatetime.h rig.c serial.c serial.h misc.c misc.h register.c regis network.c network.h cm108.c cm108.h gpio.c gpio.h idx_builtin.h token.h \ par_nt.h microham.c microham.h amplifier.c amp_reg.c amp_conf.c \ amp_conf.h amp_settings.c extamp.c sleep.c sleep.h sprintflst.c \ - sprintflst.h cache.c cache.h snapshot_data.c snapshot_data.h multicast.c + sprintflst.h cache.c cache.h snapshot_data.c snapshot_data.h multicast.c fifo.c if VERSIONDLL RIGSRC += \ diff --git a/src/fifo.c b/src/fifo.c new file mode 100644 index 000000000..44b00c8a9 --- /dev/null +++ b/src/fifo.c @@ -0,0 +1,58 @@ +#include <hamlib/rig.h> +#include <stdio.h> +#include "fifo.h" + + +void initFIFO(FIFO *fifo) +{ + fifo->head = 0; + fifo->tail = 0; +} + +// returns RIG_OK if added +// return -RIG error if overflow +int push(FIFO *fifo, const char *msg) +{ + int len = strlen(msg); + + for (int i = 0; i < len; ++i) + { + fifo->data[fifo->tail] = msg[i]; + fifo->tail = (fifo->tail + 1) % FIFO_SIZE; + + if (fifo->tail == fifo->head) { return -RIG_EDOM; } + } + + return RIG_OK; +} + +char pop(FIFO *fifo) +{ + if (fifo->tail == fifo->head) { return -1; } + + char c = fifo->data[fifo->head]; + fifo->head = (fifo->head + 1) % FIFO_SIZE; + return c; +} + +#ifdef TEST +int main() +{ + FIFO fifo; + initFIFO(&fifo); + + const char *str = "Hello, World!\n"; + + // Pushing the string onto the FIFO + push(&fifo, str); + + // Popping and printing one character at a time + int c; + while ((c = pop(&fifo)) != -1) + { + printf("%c", c); + } + + return 0; +} +#endif diff --git a/src/fifo.h b/src/fifo.h new file mode 100644 index 000000000..0eeaedb99 --- /dev/null +++ b/src/fifo.h @@ -0,0 +1,12 @@ +#define FIFO_SIZE 1024 + +typedef struct +{ + char data[FIFO_SIZE]; + int head; + int tail; +} FIFO; + +void initFIFO(FIFO *fifo); +int push(FIFO *fifo, const char *msg); +char pop(FIFO *fifo); commit ce052db3a290fd5f00050d79541f969ba9195d79 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Jul 7 12:06:38 2023 -0500 Remove get_vfo from ic9700 ic7610 and ic785x diff --git a/rigs/icom/ic7300.c b/rigs/icom/ic7300.c index 4623e638e..16e6bb8a5 100644 --- a/rigs/icom/ic7300.c +++ b/rigs/icom/ic7300.c @@ -910,7 +910,7 @@ struct rig_caps ic9700_caps = RIG_MODEL(RIG_MODEL_IC9700), .model_name = "IC-9700", .mfg_name = "Icom", - .version = BACKEND_VER ".13", + .version = BACKEND_VER ".14", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -1169,7 +1169,7 @@ struct rig_caps ic9700_caps = .get_freq = icom_get_freq, .set_mode = icom_set_mode_with_data, .get_mode = icom_get_mode_with_data, - .get_vfo = icom_get_vfo, +// .get_vfo = icom_get_vfo, .set_vfo = ic9700_set_vfo, .set_ant = NULL, .get_ant = NULL, diff --git a/rigs/icom/ic7610.c b/rigs/icom/ic7610.c index 34ed54aaa..26e4e8961 100644 --- a/rigs/icom/ic7610.c +++ b/rigs/icom/ic7610.c @@ -545,7 +545,7 @@ struct rig_caps ic7610_caps = .set_mode = icom_set_mode_with_data, .get_mode = icom_get_mode_with_data, .set_vfo = icom_set_vfo, - .get_vfo = icom_get_vfo, +// .get_vfo = icom_get_vfo, .set_ant = icom_set_ant, .get_ant = icom_get_ant, diff --git a/rigs/icom/ic785x.c b/rigs/icom/ic785x.c index 0bb1e6a59..46e180617 100644 --- a/rigs/icom/ic785x.c +++ b/rigs/icom/ic785x.c @@ -242,7 +242,7 @@ const struct rig_caps ic785x_caps = RIG_MODEL(RIG_MODEL_IC785x), .model_name = "IC-7850/7851", .mfg_name = "Icom", - .version = BACKEND_VER ".7", + .version = BACKEND_VER ".8", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -438,7 +438,7 @@ const struct rig_caps ic785x_caps = .set_mode = icom_set_mode_with_data, .get_mode = icom_get_mode_with_data, .set_vfo = icom_set_vfo, - .get_vfo = icom_get_vfo, +// .get_vfo = icom_get_vfo, .set_ant = icom_set_ant, .get_ant = icom_get_ant, commit 3cc6b7614c5ce836c86787eb255e59fba989a49a Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Jul 7 11:47:59 2023 -0500 Fix IC7610 caps structure for new firmware test diff --git a/rigs/icom/ic7610.c b/rigs/icom/ic7610.c index 71957e762..34ed54aaa 100644 --- a/rigs/icom/ic7610.c +++ b/rigs/icom/ic7610.c @@ -345,12 +345,12 @@ int ic7610_get_clock(RIG *rig, int *year, int *month, int *day, int *hour, return retval; } -const struct rig_caps ic7610_caps = +struct rig_caps ic7610_caps = { RIG_MODEL(RIG_MODEL_IC7610), .model_name = "IC-7610", .mfg_name = "Icom", - .version = BACKEND_VER ".14", + .version = BACKEND_VER ".15", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index 4b9a691b5..bbe377b2c 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -1666,12 +1666,16 @@ int icom_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) // Rigs like IC-7600 new firmware has 0x25 and 0x26 // So if this succeeds we'll assume all such rigs are targetable freq & mode - rig_debug(RIG_DEBUG_VERBOSE, "%s: TARGETABLE_FREQ and TARGETABLE_MODE enabled\n", __func__); - if (RIG_IS_IC7600 || RIG_IS_IC7610) + int targetable_vfo_save = rig->caps->targetable_vfo; + if ((RIG_IS_IC7600 || RIG_IS_IC7610) && priv->x25cmdfails <= 0) { // the 7600/7610 do it different 0=Main, 1=Sub -- maybe other Icoms will start doing this too - rig->caps->targetable_vfo = rig->state.targetable_vfo |= RIG_TARGETABLE_FREQ | RIG_TARGETABLE_MODE; subcmd2 = 0; if (vfo & RIG_VFO_B || vfo & RIG_VFO_SUB) subcmd2 = 1; + if (priv->x25cmdfails < 0) + { // we'll test this once to support the newer firmware + rig_debug(RIG_DEBUG_VERBOSE, "%s: TARGETABLE_FREQ and TARGETABLE_MODE enabled for testing\n", __func__); + rig->caps->targetable_vfo = rig->state.targetable_vfo |= RIG_TARGETABLE_FREQ | RIG_TARGETABLE_MODE; + } } retval = icom_transaction(rig, cmd2, subcmd2, NULL, 0, freqbuf, &freq_len); @@ -1685,6 +1689,11 @@ int icom_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) if (priv->x25cmdfails < 0) { priv->x25cmdfails = 1; + if (RIG_IS_IC7600 || RIG_IS_IC7610) + { + rig->caps->targetable_vfo = targetable_vfo_save; + rig_debug(RIG_DEBUG_VERBOSE, "%s: TARGETABLE_FREQ and TARGETABLE_MODE disabled -- older firmare likely\n", __func__); + } } rig_debug(RIG_DEBUG_TRACE, diff --git a/rigs/icom/icom.h b/rigs/icom/icom.h index e5a00cf20..6ff4ea050 100644 --- a/rigs/icom/icom.h +++ b/rigs/icom/icom.h @@ -35,7 +35,7 @@ #include <sys/time.h> #endif -#define BACKEND_VER "20230627" +#define BACKEND_VER "20230707" #define ICOM_IS_ID31 rig_is_model(rig, RIG_MODEL_ID31) #define ICOM_IS_ID51 rig_is_model(rig, RIG_MODEL_ID51) @@ -444,7 +444,7 @@ extern const struct rig_caps ic756pro2_caps; extern const struct rig_caps ic756pro3_caps; extern const struct rig_caps ic751_caps; extern struct rig_caps ic7600_caps; // need to modify targetable_vfo depending on response to 0x25 cmd -extern const struct rig_caps ic7610_caps; +extern struct rig_caps ic7610_caps; extern const struct rig_caps ic761_caps; extern const struct rig_caps ic765_caps; extern const struct rig_caps ic7700_caps; ----------------------------------------------------------------------- Summary of changes: include/hamlib/rig.h | 2 + rigs/icom/ic7300.c | 4 +- rigs/icom/ic7610.c | 6 +-- rigs/icom/ic785x.c | 4 +- rigs/icom/icom.c | 15 ++++-- rigs/icom/icom.h | 4 +- src/Makefile.am | 2 +- src/cache.c | 4 +- src/fifo.c | 59 +++++++++++++++++++++ src/fifo.h | 12 +++++ src/iofunc.c | 3 ++ src/multicast.c | 55 ++++++++++++-------- src/rig.c | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++- 13 files changed, 274 insertions(+), 37 deletions(-) create mode 100644 src/fifo.c create mode 100644 src/fifo.h hooks/post-receive -- Hamlib -- Ham radio control libraries |