[Hamlib-commits] Hamlib -- Ham radio control libraries branch master updated. 32f37d390ffeaa83f9480
Library to control radio transceivers and receivers
Brought to you by:
n0nb
From: n0nb <n0...@us...> - 2023-12-26 01:18:23
|
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 32f37d390ffeaa83f9480780cde15a2cad9b3592 (commit) via 3ba1bc2c19300d73f8883d828574331ba662b5c5 (commit) via b2850ff7a80719a669523a98b67143072a0969f7 (commit) via 675ed1c85ad8f7c416007823c95592aee947445e (commit) via a1b56bc3150709f4f36e53f91a27df8ef016e1cc (commit) via 8c8c20c2567de23c893e63d547590704f9d04574 (commit) via 37c0f07ecb340d32f3199d68754eb2b71fdb874a (commit) via bca0a6ee47459d3846e2f6f23e9dede966041782 (commit) via c3d489cca3ab288bcad7be505278240582b37009 (commit) via 70c35791ceee33876bc519d46e1ed3ca81b0d260 (commit) via cc81d7ecca8ee8d3f285289c1c0d0d4b5f0f31c4 (commit) via 7542f4cc71ab57f695098f641b98bafb00979175 (commit) via 633da3d7c67c8e885cbfbec283e1166e12831133 (commit) via 25596f4c79d7ee7be76258f6444e9b891d7bbda4 (commit) via 9ac55a9baa42c192424938863c27fe8a3e09ec5e (commit) via 74062c6aba1650f0f4f5f77883e2cc3d25dc4da7 (commit) via a5c273efe98deb09b0748e05623f68926dbc86f0 (commit) via 3061d5e208f2f2d6d234d1a2a31b9550b00e35ce (commit) via ea7ce78c6580b75ee471de825fefbe193cb1e8a8 (commit) via 576ed8266ae4cb9234b7d1582c15d4a173d5c559 (commit) via 7334da6d89a8a5451088746e508af8f5dc6d1dd7 (commit) via 935cebed6ee776473f9a8397754629a86c4be1dc (commit) via af5ea58350f34ba918685e6bd72b272a6bb1d9ad (commit) via 48b6b4910cafd62d885e16498780e95d24fd3b13 (commit) from 21cbd7704738d6e7da778c06145463e33f77b611 (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 32f37d390ffeaa83f9480780cde15a2cad9b3592 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Dec 25 16:13:43 2023 -0600 Allow mulitcast receiver to continue after error==0 https://github.com/Hamlib/Hamlib/issues/1418 diff --git a/src/network.c b/src/network.c index ebb301a75..56688787e 100644 --- a/src/network.c +++ b/src/network.c @@ -1056,6 +1056,8 @@ static int is_networked(char *address, int address_length) struct sockaddr_in *sa_in = (struct sockaddr_in *)pUnicast->Address.lpSockaddr; addr = &(sa_in->sin_addr); } + +#if 0 // going to skip IPV6 for now -- should never need it on a local network else if (pUnicast->Address.lpSockaddr->sa_family == AF_INET6) // IPv6 address { struct sockaddr_in6 *sa_in6 = (struct sockaddr_in6 *) @@ -1063,6 +1065,8 @@ static int is_networked(char *address, int address_length) addr = &(sa_in6->sin6_addr); } +#endif + // Convert IP address to string and ignore bad ones if (addr) { @@ -1156,6 +1160,46 @@ int is_wireless() #include <linux/wireless.h> #include <ifaddrs.h> +int is_networked(char *ipv4, int ipv4_length) +{ + struct ifaddrs *interfaces, *iface; + char addr_str[INET_ADDRSTRLEN]; + + // Get a list of all network interfaces + if (getifaddrs(&interfaces) == -1) + { + perror("getifaddrs"); + exit(EXIT_FAILURE); + } + + // Iterate through the list of interfaces + for (iface = interfaces; iface != NULL; iface = iface->ifa_next) + { + if (iface->ifa_addr + && iface->ifa_addr->sa_family == AF_INET) // Check it is IP4 + { + // Convert the linked list of interfaces to a human readable string + struct sockaddr_in *sa = (struct sockaddr_in *) iface->ifa_addr; + inet_ntop(AF_INET, &(sa->sin_addr), addr_str, INET_ADDRSTRLEN); + + if (strncmp(addr_str, "127", 3) == 0 && ipv4[0] == 0) + { + strncpy(ipv4, addr_str, ipv4_length); + rig_debug(RIG_DEBUG_VERBOSE, "%s: Can use %s\n", __func__, ipv4); + } + else if (strncmp(addr_str, "127", 3) != 0) + { + strncpy(ipv4, addr_str, ipv4_length); + rig_debug(RIG_DEBUG_VERBOSE, "%s: Will use %s\n", __func__, ipv4); + } + } + } + + freeifaddrs(interfaces); // Free the linked list + return strlen(ipv4) > 0 ; +} + + int is_wireless_linux(const char *ifname) { int sock = socket(AF_INET, SOCK_DGRAM, 0); @@ -1205,9 +1249,7 @@ int is_wireless() void *multicast_receiver(void *arg) { char data[4096]; -#ifdef __MINGW32__ char ip4[INET6_ADDRSTRLEN]; -#endif struct multicast_receiver_args_s *args = (struct multicast_receiver_args_s *) arg; @@ -1219,17 +1261,18 @@ void *multicast_receiver(void *arg) rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): Starting multicast receiver\n", __FILE__, __LINE__); - int optval = 1; - -#ifdef __MINGW32__ if (!is_networked(ip4, sizeof(ip4))) { - rig_debug(RIG_DEBUG_WARN, "%s: No network found...multicast disabled\n", - __func__); + rig_debug(RIG_DEBUG_WARN, + "%s: no network detected...disabling multicast receive\n", __func__); return NULL; } + int optval = 1; + +#ifdef __MINGW32__ + if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, (PCHAR)&optval, sizeof(optval)) < 0) #else @@ -1265,7 +1308,7 @@ void *multicast_receiver(void *arg) if (is_wireless()) { rig_debug(RIG_DEBUG_VERBOSE, - "%s: wireless detected so INADDR_ANY is being used\n", __func__); + "%s: wireless detected\n", __func__); // dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); } @@ -1276,6 +1319,7 @@ void *multicast_receiver(void *arg) } #else +// dest_addr.sin_addr.s_addr = inet_addr(args->multicast_addr); dest_addr.sin_addr.s_addr = inet_addr(args->multicast_addr); #endif dest_addr.sin_port = htons(args->multicast_port); @@ -1321,7 +1365,11 @@ void *multicast_receiver(void *arg) rig_debug(RIG_DEBUG_ERR, "%s: error joining multicast group %s:%d: %s\n", __func__, args->multicast_addr, args->multicast_port, strerror(errno)); - return NULL; + if (errno != 0) + { + return NULL; + } + rig_debug(RIG_DEBUG_VERBOSE, "%s: errno==0 so trying to continue\n", __func__); } rs->multicast_receiver_run = 1; commit 3ba1bc2c19300d73f8883d828574331ba662b5c5 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Dec 24 22:26:04 2023 -0600 Get the right variable name for checking the 169.x.x.x address https://github.com/Hamlib/Hamlib/issues/1461 diff --git a/src/network.c b/src/network.c index fa3336890..ebb301a75 100644 --- a/src/network.c +++ b/src/network.c @@ -1071,7 +1071,7 @@ static int is_networked(char *address, int address_length) sizeof(ipString)) != NULL) { // Use IP address if not 169.x.x.x - if (strncmp(address, "169", 3) != 0) + if (strncmp(ipString, "169", 3) != 0) { count++; commit b2850ff7a80719a669523a98b67143072a0969f7 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Dec 24 16:25:43 2023 -0600 Fix warning message on duplicate IP addresses to only when trying to use https://github.com/Hamlib/Hamlib/issues/1461 diff --git a/src/network.c b/src/network.c index c0d2834b5..fa3336890 100644 --- a/src/network.c +++ b/src/network.c @@ -1066,20 +1066,21 @@ static int is_networked(char *address, int address_length) // Convert IP address to string and ignore bad ones if (addr) { - count++; - - if (count > 1) - { - rig_debug(RIG_DEBUG_WARN, - "%s: more than 1 address found...multicast may not work\n", __func__); - } if (inet_ntop(pUnicast->Address.lpSockaddr->sa_family, addr, ipString, sizeof(ipString)) != NULL) { // Use IP address if not 169.x.x.x - if (strncmp(address,"169",3) != 0) + if (strncmp(address, "169", 3) != 0) { + count++; + + if (count > 1) + { + rig_debug(RIG_DEBUG_WARN, + "%s: more than 1 address found...multicast may not work\n", __func__); + } + rig_debug(RIG_DEBUG_VERBOSE, "%s: Address: %s\n", ipString, ipString); strncpy(address, ipString, address_length); } commit 675ed1c85ad8f7c416007823c95592aee947445e Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Dec 24 16:18:48 2023 -0600 Fix 169.x.x.x network detection https://github.com/Hamlib/Hamlib/issues/1461 diff --git a/src/network.c b/src/network.c index c093b148b..c0d2834b5 100644 --- a/src/network.c +++ b/src/network.c @@ -1064,7 +1064,7 @@ static int is_networked(char *address, int address_length) } // Convert IP address to string and ignore bad ones - if (addr && strncmp(addr, "169", 3) != 0) + if (addr) { count++; @@ -1077,8 +1077,12 @@ static int is_networked(char *address, int address_length) if (inet_ntop(pUnicast->Address.lpSockaddr->sa_family, addr, ipString, sizeof(ipString)) != NULL) { - rig_debug(RIG_DEBUG_VERBOSE, "%s: Address: %s\n", ipString, ipString); - strncpy(address, ipString, address_length); + // Use IP address if not 169.x.x.x + if (strncmp(address,"169",3) != 0) + { + rig_debug(RIG_DEBUG_VERBOSE, "%s: Address: %s\n", ipString, ipString); + strncpy(address, ipString, address_length); + } } } } commit a1b56bc3150709f4f36e53f91a27df8ef016e1cc Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Dec 24 14:52:37 2023 -0600 Prevent multicast from trying to use 169.x.x.x network https://github.com/Hamlib/Hamlib/issues/1461 diff --git a/src/network.c b/src/network.c index a5d631215..c093b148b 100644 --- a/src/network.c +++ b/src/network.c @@ -1063,8 +1063,8 @@ static int is_networked(char *address, int address_length) addr = &(sa_in6->sin6_addr); } - // Convert IP address to string - if (addr) + // Convert IP address to string and ignore bad ones + if (addr && strncmp(addr, "169", 3) != 0) { count++; @@ -1248,6 +1248,7 @@ void *multicast_receiver(void *arg) return NULL; } + #endif memset(&dest_addr, 0, sizeof(dest_addr)); commit 8c8c20c2567de23c893e63d547590704f9d04574 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Dec 24 11:39:30 2023 -0600 Make multicast bind the IPV4 address if available https://github.com/Hamlib/Hamlib/issues/1461 diff --git a/src/network.c b/src/network.c index f50652d4a..a5d631215 100644 --- a/src/network.c +++ b/src/network.c @@ -1288,9 +1288,23 @@ void *multicast_receiver(void *arg) mreq.imr_multiaddr.s_addr = inet_addr(args->multicast_addr); - mreq.imr_interface.s_addr = htonl(INADDR_ANY); +#ifdef __MINGW32__ + + // we're not worrying about IPV6 right now as that will likely never occur on home network + if (strlen(ip4) > 0) + { + rig_debug(RIG_DEBUG_VERBOSE, "%s: multicast binding to %s\n", __func__, ip4); + mreq.imr_interface.s_addr = inet_addr(ip4); + } + else +#endif + { + rig_debug(RIG_DEBUG_VERBOSE, "%s: multicast binding to INADDR_ANY\n", __func__); + mreq.imr_interface.s_addr = htonl(INADDR_ANY); + } #ifdef __MINGW32__ + if (setsockopt(socket_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (PCHAR)&mreq, sizeof(mreq)) < 0) #else commit 37c0f07ecb340d32f3199d68754eb2b71fdb874a Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Dec 23 00:01:56 2023 -0600 Add some debug for https://github.com/Hamlib/Hamlib/issues/1461 diff --git a/src/network.c b/src/network.c index 3f519348d..f50652d4a 100644 --- a/src/network.c +++ b/src/network.c @@ -85,7 +85,11 @@ #endif #ifdef __MINGW32__ +#include <winsock2.h> +#include <windows.h> +#include <iphlpapi.h> static int wsstarted; +static int is_networked(char *address, int address_length); #endif //! @cond Doxygen_Suppress @@ -910,6 +914,9 @@ void *multicast_publisher(void *arg) { unsigned char spectrum_data[HAMLIB_MAX_SPECTRUM_DATA]; char snapshot_buffer[HAMLIB_MAX_SNAPSHOT_PACKET_SIZE]; +#ifdef __MINGW32__ + char ip4[32]; +#endif struct multicast_publisher_args_s *args = (struct multicast_publisher_args_s *) arg; @@ -928,6 +935,17 @@ void *multicast_publisher(void *arg) rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): Starting multicast publisher\n", __FILE__, __LINE__); +#ifdef __MINGW32__ + + if (!is_networked(ip4, sizeof(ip4))) + { + rig_debug(RIG_DEBUG_WARN, "%s: no IPV4 network detected...multicast disabled\n", + __func__); + return NULL; + } + +#endif + snapshot_init(); memset(&dest_addr, 0, sizeof(dest_addr)); @@ -995,8 +1013,90 @@ void *multicast_publisher(void *arg) #ifdef __MINGW32__ -#include <winsock2.h> -#include <iphlpapi.h> + +static int is_networked(char *address, int address_length) +{ + int count = 0; + + DWORD dwSize = 0; + DWORD dwRetVal = 0; + ULONG flags = GAA_FLAG_INCLUDE_PREFIX; + PIP_ADAPTER_ADDRESSES pAddresses = NULL; + PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL; + PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL; + char ipString[INET6_ADDRSTRLEN]; // large enough for both IPv4 and IPv6 + address[0] = 0; + + // First call to determine actual memory size needed + GetAdaptersAddresses(AF_UNSPEC, flags, NULL, NULL, &dwSize); + pAddresses = (IP_ADAPTER_ADDRESSES *)malloc(dwSize); + + // Second call to get the actual data + dwRetVal = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, pAddresses, &dwSize); + + if (dwRetVal == NO_ERROR) + { + for (pCurrAddresses = pAddresses; pCurrAddresses != NULL; + pCurrAddresses = pCurrAddresses->Next) + { +// if (pCurrAddresses->IfType == IF_TYPE_IEEE80211) // Wireless adapter + { + char friendlyName[256]; + wcstombs(friendlyName, pCurrAddresses->FriendlyName, sizeof(friendlyName)); + rig_debug(RIG_DEBUG_VERBOSE, "%s: network IfType = %d, name=%s\n", __func__, + (int)pCurrAddresses->IfType, friendlyName); + + for (pUnicast = pCurrAddresses->FirstUnicastAddress; pUnicast != NULL; + pUnicast = pUnicast->Next) + { + void *addr = NULL; + + if (pUnicast->Address.lpSockaddr->sa_family == AF_INET) // IPv4 address + { + struct sockaddr_in *sa_in = (struct sockaddr_in *)pUnicast->Address.lpSockaddr; + addr = &(sa_in->sin_addr); + } + else if (pUnicast->Address.lpSockaddr->sa_family == AF_INET6) // IPv6 address + { + struct sockaddr_in6 *sa_in6 = (struct sockaddr_in6 *) + pUnicast->Address.lpSockaddr; + addr = &(sa_in6->sin6_addr); + } + + // Convert IP address to string + if (addr) + { + count++; + + if (count > 1) + { + rig_debug(RIG_DEBUG_WARN, + "%s: more than 1 address found...multicast may not work\n", __func__); + } + + if (inet_ntop(pUnicast->Address.lpSockaddr->sa_family, addr, ipString, + sizeof(ipString)) != NULL) + { + rig_debug(RIG_DEBUG_VERBOSE, "%s: Address: %s\n", ipString, ipString); + strncpy(address, ipString, address_length); + } + } + } + + free(pAddresses); + return 1; // Wireless and addresses printed + } + } + } + + if (pAddresses) + { + free(pAddresses); + } + + return 0; // Not wireless or no addresses found +} + int is_wireless() { DWORD dwSize = 0; @@ -1100,6 +1200,9 @@ int is_wireless() void *multicast_receiver(void *arg) { char data[4096]; +#ifdef __MINGW32__ + char ip4[INET6_ADDRSTRLEN]; +#endif struct multicast_receiver_args_s *args = (struct multicast_receiver_args_s *) arg; @@ -1111,10 +1214,17 @@ void *multicast_receiver(void *arg) rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): Starting multicast receiver\n", __FILE__, __LINE__); - int optval = 1; + #ifdef __MINGW32__ + if (!is_networked(ip4, sizeof(ip4))) + { + rig_debug(RIG_DEBUG_WARN, "%s: No network found...multicast disabled\n", + __func__); + return NULL; + } + if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, (PCHAR)&optval, sizeof(optval)) < 0) #else @@ -1145,16 +1255,18 @@ void *multicast_receiver(void *arg) #ifdef __MINGW32__ // Windows wireless cannot bind to multicast group addresses for some unknown reason + // Update: it's not wireless causing the error we see but we'll leave the detection in place if (is_wireless()) { rig_debug(RIG_DEBUG_VERBOSE, - "%s: wireless detected so localhost is being used\n", __func__); - dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); + "%s: wireless detected so INADDR_ANY is being used\n", __func__); + +// dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); } else { rig_debug(RIG_DEBUG_VERBOSE, - "%s: no wireless detect so INADDR_ANY is being used\n", __func__); + "%s: no wireless detected so INADDR_ANY is being used\n", __func__); } #else @@ -1296,6 +1408,9 @@ int network_multicast_publisher_start(RIG *rig, const char *multicast_addr, multicast_publisher_priv_data *mcast_publisher_priv; int socket_fd; int status; +#ifdef __MINGW32__ + char ip4[32]; +#endif ENTERFUNC; @@ -1304,6 +1419,17 @@ int network_multicast_publisher_start(RIG *rig, const char *multicast_addr, __LINE__, multicast_addr, multicast_port); +#ifdef __MINGW32__ + + if (!is_networked(ip4, sizeof(ip4))) + { + rig_debug(RIG_DEBUG_WARN, "%s: No network found...multicast disabled\n", + __func__); + return RIG_OK; + } + +#endif + if (multicast_addr == NULL || strcmp(multicast_addr, "0.0.0.0") == 0) { rig_debug(RIG_DEBUG_TRACE, "%s(%d): not starting multicast publisher\n", commit bca0a6ee47459d3846e2f6f23e9dede966041782 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Dec 22 16:00:40 2023 -0600 Make FLRig name simpler for rig list diff --git a/rigs/dummy/flrig.c b/rigs/dummy/flrig.c index f3c02ea3a..c7f6b3739 100644 --- a/rigs/dummy/flrig.c +++ b/rigs/dummy/flrig.c @@ -141,7 +141,7 @@ static const struct confparams flrig_ext_parms[] = struct rig_caps flrig_caps = { RIG_MODEL(RIG_MODEL_FLRIG), - .model_name = "FLRig", + .model_name = "", .mfg_name = "FLRig", .version = "20231216.0", .copyright = "LGPL", commit c3d489cca3ab288bcad7be505278240582b37009 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Dec 22 09:15:22 2023 -0600 Update Thetis entry for correct display in WSJT-X diff --git a/NEWS b/NEWS index 50b9d8521..aee9a7730 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,7 @@ Version 5.x -- future * Change FT1000MP Mark V model names to align with FT1000MP Version 4.6 + * Added Thetis entry -- derived from FlexRadio/Apache PowerSDR * Added VOICE/CW memory capability to many rigs -- thanks to David Balharrie M0DGB/G8FKH * Add -# --skip_init option to rigctl to skip rig initialization -- useful for executing commands quickly * rig_caps is no longer constant -- this may break some 3rd party relying on the "const" declaration. Here's an example of how to handle compatiblity. diff --git a/rigs/kenwood/flex6xxx.c b/rigs/kenwood/flex6xxx.c index fea17f68f..3186f7aad 100644 --- a/rigs/kenwood/flex6xxx.c +++ b/rigs/kenwood/flex6xxx.c @@ -1524,8 +1524,8 @@ struct rig_caps powersdr_caps = struct rig_caps thetis_caps = { RIG_MODEL(RIG_MODEL_THETIS), - .model_name = "Thetis", - .mfg_name = "Apache", + .model_name = "", + .mfg_name = "Thetis", .version = "20231222.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, commit 70c35791ceee33876bc519d46e1ed3ca81b0d260 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Dec 22 07:51:48 2023 -0600 Add rig entry for Thetis diff --git a/include/hamlib/riglist.h b/include/hamlib/riglist.h index b4adaf953..541ab43e0 100644 --- a/include/hamlib/riglist.h +++ b/include/hamlib/riglist.h @@ -201,6 +201,7 @@ #define RIG_MODEL_SDRUNO RIG_MAKE_MODEL(RIG_KENWOOD,51) #define RIG_MODEL_QRPLABS RIG_MAKE_MODEL(RIG_KENWOOD,52) #define RIG_MODEL_FX4 RIG_MAKE_MODEL(RIG_KENWOOD,53) +#define RIG_MODEL_THETIS RIG_MAKE_MODEL(RIG_KENWOOD, 54) /* * Icom diff --git a/rigs/kenwood/flex6xxx.c b/rigs/kenwood/flex6xxx.c index 50e21d15b..fea17f68f 100644 --- a/rigs/kenwood/flex6xxx.c +++ b/rigs/kenwood/flex6xxx.c @@ -1372,8 +1372,8 @@ struct rig_caps f6k_caps = struct rig_caps powersdr_caps = { RIG_MODEL(RIG_MODEL_POWERSDR), - .model_name = "PowerSDR/Thetis", - .mfg_name = "FlexRadio/ANAN", + .model_name = "PowerSDR", + .mfg_name = "FlexRadio/Apache", .version = "20231107.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, @@ -1518,3 +1518,155 @@ struct rig_caps powersdr_caps = .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS }; +/* + * Thetis rig capabilities. Same as PowerSDR for now but may get new functions + */ +struct rig_caps thetis_caps = +{ + RIG_MODEL(RIG_MODEL_THETIS), + .model_name = "Thetis", + .mfg_name = "Apache", + .version = "20231222.0", + .copyright = "LGPL", + .status = RIG_STATUS_STABLE, + .rig_type = RIG_TYPE_TRANSCEIVER, + .ptt_type = RIG_PTT_RIG, + .dcd_type = RIG_DCD_NONE, + .port_type = RIG_PORT_SERIAL, + .serial_rate_min = 300, + .serial_rate_max = 115200, + .serial_data_bits = 8, + .serial_stop_bits = 1, + .serial_parity = RIG_PARITY_NONE, + .serial_handshake = RIG_HANDSHAKE_NONE, + .write_delay = 0, + .post_write_delay = 0, + // The combination of timeout and retry is important + // We need at least 3 seconds to do profile switches + // Hitting the timeout is OK as long as we retry + // Previous note showed FA/FB may take up to 500ms on band change + // Flex 1500 needs about 6 seconds for a band change in PowerSDR + .timeout = 800, // some band transitions can take 600ms + .retry = 10, + + .has_get_func = POWERSDR_FUNC_ALL, + .has_set_func = POWERSDR_FUNC_ALL, + .has_get_level = POWERSDR_LEVEL_ALL, + .has_set_level = POWERSDR_LEVEL_SET, + .has_get_parm = RIG_PARM_BANDSELECT, + .has_set_parm = RIG_PARM_BANDSELECT, + .level_gran = { +#include "level_gran_kenwood.h" + [LVL_KEYSPD] = { .min = { .i = 5 }, .max = { .i = 60 }, .step = { .i = 1 } }, + }, /* FIXME: granularity */ + .parm_gran = { + // there are V00 thru V13 but we don't cover them as of yet -- what rig? + [PARM_BANDSELECT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.s = "BAND160M,BAND80M,BAND60M,BAND40M,BAND30M,BAND20M,BAND17M,BAND15M,BAND12M,BAND10M,BAND6M,BAND2M,BANDWWV,BANDGEN"}} + }, + + //.extlevels = elecraft_ext_levels, + //.extparms = kenwood_cfg_params, + .preamp = { RIG_DBLST_END, }, + .attenuator = { RIG_DBLST_END, }, + .max_rit = Hz(0), + .max_xit = Hz(0), + .max_ifshift = Hz(0), + .vfo_op = kenwood_vfo_op, + .vfo_ops = POWERSDR_VFO_OP, + .targetable_vfo = RIG_TARGETABLE_FREQ | RIG_TARGETABLE_MODE, + .transceive = RIG_TRN_RIG, + .agc_level_count = 6, + .agc_levels = { RIG_AGC_OFF, RIG_AGC_LONG, RIG_AGC_SLOW, RIG_AGC_MEDIUM, RIG_AGC_FAST, RIG_AGC_USER }, + .bank_qty = 0, + .chan_desc_sz = 0, + + .chan_list = { RIG_CHAN_END }, + + .rx_range_list1 = { + {kHz(30), MHz(77), POWERSDR_MODES, -1, -1, F6K_VFO, F6K_ANTS}, + {MHz(135), MHz(165), POWERSDR_MODES, -1, - 1, F6K_VFO, F6K_ANTS}, + RIG_FRNG_END, + }, /* rx range */ + .tx_range_list1 = { + FRQ_RNG_HF(1, POWERSDR_MODES, mW(10), W(100), F6K_VFO, F6K_ANTS), + FRQ_RNG_6m(1, POWERSDR_MODES, mW(10), W(100), F6K_VFO, F6K_ANTS), + FRQ_RNG_2m(1, POWERSDR_MODES, mW(10), W(100), F6K_VFO, F6K_ANTS), + RIG_FRNG_END, + }, /* tx range */ + + .rx_range_list2 = { + {kHz(30), MHz(77), POWERSDR_MODES, -1, -1, F6K_VFO, F6K_ANTS}, + { MHz(135), MHz(165), POWERSDR_MODES, -1, -1, F6K_VFO, F6K_ANTS}, + RIG_FRNG_END, + }, /* rx range */ + .tx_range_list2 = { + FRQ_RNG_HF(2, POWERSDR_MODES, mW(10), W(100), F6K_VFO, F6K_ANTS), + FRQ_RNG_6m(2, POWERSDR_MODES, mW(10), W(100), F6K_VFO, F6K_ANTS), + FRQ_RNG_2m(2, POWERSDR_MODES, mW(10), W(100), F6K_VFO, F6K_ANTS), + RIG_FRNG_END, + }, /* tx range */ + + .tuning_steps = { + {POWERSDR_MODES, 1}, + RIG_TS_END, + }, + + /* mode/filter list, remember: order matters! */ + .filters = { + {RIG_MODE_SSB, kHz(2.7)}, + {RIG_MODE_SSB, kHz(3.3)}, + {RIG_MODE_SSB, kHz(1.8)}, + {RIG_MODE_SSB, kHz(1.6)}, + {RIG_MODE_SSB, kHz(4.0)}, + {RIG_MODE_SSB, RIG_FLT_ANY}, + {RIG_MODE_CW, kHz(0.4)}, + {RIG_MODE_CW, kHz(1.5)}, + {RIG_MODE_CW, Hz(50)}, + {RIG_MODE_CW, kHz(3.0)}, + {RIG_MODE_CW, RIG_FLT_ANY}, + {RIG_MODE_PKTUSB | RIG_MODE_PKTLSB, kHz(1.5)}, + {RIG_MODE_PKTUSB | RIG_MODE_PKTLSB, kHz(3.0)}, + {RIG_MODE_PKTUSB | RIG_MODE_PKTLSB, kHz(0.1)}, + {RIG_MODE_PKTUSB | RIG_MODE_PKTLSB, RIG_FLT_ANY}, + {RIG_MODE_AM, kHz(6)}, + {RIG_MODE_AM, kHz(14)}, + {RIG_MODE_AM, kHz(5.6)}, + {RIG_MODE_AM, kHz(20.0)}, + {RIG_MODE_AM, RIG_FLT_ANY}, + {RIG_MODE_FM, kHz(13)}, /* TBC */ + RIG_FLT_END, + }, + .priv = (void *)& powersdr_priv_caps, + + .rig_init = kenwood_init, + .rig_cleanup = kenwood_cleanup, + .rig_open = flexradio_open, + .rig_close = kenwood_close, + .set_freq = kenwood_set_freq, + .get_freq = kenwood_get_freq, + .set_mode = powersdr_set_mode, + .get_mode = powersdr_get_mode, + .set_vfo = kenwood_set_vfo, + .get_vfo = kenwood_get_vfo_if, + .set_split_vfo = kenwood_set_split_vfo, + .get_split_vfo = kenwood_get_split_vfo_if, + .get_ptt = flex6k_get_ptt, + .set_ptt = flex6k_set_ptt, + .get_powerstat = kenwood_get_powerstat, + .set_powerstat = kenwood_set_powerstat, + // TODO copy over kenwood_[set|get]_level and modify to handle DSP filter values + // correctly - use actual values instead of indices + .set_level = powersdr_set_level, + .get_level = powersdr_get_level, + .get_func = powersdr_get_func, + .set_func = powersdr_set_func, + .get_parm = powersdr_get_parm, + .set_parm = powersdr_set_parm, + //.set_ant = kenwood_set_ant_no_ack, + //.get_ant = kenwood_get_ant, + .send_morse = kenwood_send_morse, + .stop_morse = kenwood_stop_morse, + .wait_morse = rig_wait_morse, + .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS +}; + diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index c234a1646..fe301968f 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -6187,6 +6187,7 @@ DECLARE_INITRIG_BACKEND(kenwood) rig_register(&sdruno_caps); rig_register(&qrplabs_caps); rig_register(&fx4_caps); + rig_register(&thetis_caps); return (RIG_OK); } diff --git a/rigs/kenwood/kenwood.h b/rigs/kenwood/kenwood.h index ec88254f8..338535b35 100644 --- a/rigs/kenwood/kenwood.h +++ b/rigs/kenwood/kenwood.h @@ -323,6 +323,7 @@ extern struct rig_caps tx500_caps; extern struct rig_caps sdruno_caps; extern struct rig_caps qrplabs_caps; extern struct rig_caps fx4_caps; +extern struct rig_caps thetis_caps; /* use when not interested in the answer, but want to check its len */ static int inline kenwood_simple_transaction(RIG *rig, const char *cmd, commit cc81d7ecca8ee8d3f285289c1c0d0d4b5f0f31c4 Merge: 7542f4cc7 a5c273efe Author: Michael Black <mdb...@ya...> Date: Thu Dec 21 08:39:12 2023 -0600 Merge pull request #1458 from DJ3CE/power_ic705905 Patch power reading of IC-705/-905 commit 7542f4cc71ab57f695098f641b98bafb00979175 Merge: 633da3d7c 25596f4c7 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Dec 21 08:17:19 2023 -0600 Merge branch 'master' of https://github.com/Hamlib/Hamlib commit 633da3d7c67c8e885cbfbec283e1166e12831133 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Dec 21 08:17:08 2023 -0600 Update NEWS diff --git a/NEWS b/NEWS index 9fadc11a2..50b9d8521 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,7 @@ Version 5.x -- future * Change FT1000MP Mark V model names to align with FT1000MP Version 4.6 + * Added VOICE/CW memory capability to many rigs -- thanks to David Balharrie M0DGB/G8FKH * Add -# --skip_init option to rigctl to skip rig initialization -- useful for executing commands quickly * rig_caps is no longer constant -- this may break some 3rd party relying on the "const" declaration. Here's an example of how to handle compatiblity. #ifdef RIGCAPS_NOT_CONST commit 25596f4c79d7ee7be76258f6444e9b891d7bbda4 Merge: 9ac55a9ba 74062c6ab Author: Michael Black <mdb...@ya...> Date: Thu Dec 21 08:14:44 2023 -0600 Merge pull request #1459 from dgbalharrie/master Add number of CW and Voice memories to supporting Icom, Yaesu, Kenwoo… commit 9ac55a9baa42c192424938863c27fe8a3e09ec5e Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Dec 21 08:13:41 2023 -0600 Add notes on voice memory for rigs diff --git a/rigs/hamlib_voice_cw_memory_4.6.0.xlsx b/rigs/hamlib_voice_cw_memory_4.6.0.xlsx new file mode 100755 index 000000000..bcaabccf7 Binary files /dev/null and b/rigs/hamlib_voice_cw_memory_4.6.0.xlsx differ commit 74062c6aba1650f0f4f5f77883e2cc3d25dc4da7 Merge: 3061d5e20 ea7ce78c6 Author: Michael Black <mdb...@ya...> Date: Thu Dec 21 07:53:27 2023 -0600 Merge branch 'master' into master diff --cc rigs/icom/ic7300.c index 4a8a332c7,653c15bc5..e8fbe287a --- a/rigs/icom/ic7300.c +++ b/rigs/icom/ic7300.c @@@ -755,10 -753,11 +753,10 @@@ struct rig_caps ic7300_caps .transceive = RIG_TRN_RIG, .bank_qty = 1, .chan_desc_sz = 0, - .chan_list = { { 1, 99, RIG_MTYPE_MEM }, - { 1, 8, RIG_MTYPE_VOICE }, - { 1, 8, RIG_MTYPE_MORSE }, - { 1, 8, RIG_MTYPE_VOICE }, - { 1, 8, RIG_MTYPE_MORSE }, ++ { 1, 8, RIG_MTYPE_VOICE }, ++ { 1, 8, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, @@@ -1323,10 -1318,11 +1317,10 @@@ struct rig_caps ic705_caps .transceive = RIG_TRN_RIG, .bank_qty = 5, .chan_desc_sz = 0, - .chan_list = { { 1, 99, RIG_MTYPE_MEM }, - { 1, 8, RIG_MTYPE_VOICE }, - { 1, 8, RIG_MTYPE_MORSE }, - { 1, 8, RIG_MTYPE_VOICE }, - { 1, 8, RIG_MTYPE_MORSE }, ++ { 1, 8, RIG_MTYPE_VOICE }, ++ { 1, 8, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, @@@ -1598,10 -1592,11 +1590,10 @@@ struct rig_caps ic905_caps .transceive = RIG_TRN_RIG, .bank_qty = 5, .chan_desc_sz = 0, - .chan_list = { { 1, 99, RIG_MTYPE_MEM }, - { 1, 8, RIG_MTYPE_VOICE }, - { 1, 8, RIG_MTYPE_MORSE }, - { 1, 8, RIG_MTYPE_VOICE }, - { 1, 8, RIG_MTYPE_MORSE }, ++ { 1, 8, RIG_MTYPE_VOICE }, ++ { 1, 8, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, commit a5c273efe98deb09b0748e05623f68926dbc86f0 Author: DJ3CE <se...@ma...> Date: Thu Dec 21 01:18:18 2023 +0100 Patch power reading of IC-705/-905 diff --git a/rigs/icom/ic7300.c b/rigs/icom/ic7300.c index 653c15bc5..f79a1d9b5 100644 --- a/rigs/icom/ic7300.c +++ b/rigs/icom/ic7300.c @@ -152,6 +152,23 @@ int ic9700_set_vfo(RIG *rig, vfo_t vfo); #define IC705_OTHER_TX_MODES (RIG_MODE_FM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_DSTAR) #define IC705_LEVELS (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|RIG_LEVEL_NR|RIG_LEVEL_PBT_IN|RIG_LEVEL_PBT_OUT|RIG_LEVEL_CWPITCH|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_NOTCHF_RAW|RIG_LEVEL_SQL|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_VOXDELAY|RIG_LEVEL_SWR|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_RFPOWER_METER_WATTS|RIG_LEVEL_COMP_METER|RIG_LEVEL_VD_METER|RIG_LEVEL_ID_METER|RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB|RIG_LEVEL_SPECTRUM_MODE|RIG_LEVEL_SPECTRUM_SPAN|RIG_LEVEL_SPECTRUM_SPEED|RIG_LEVEL_SPECTRUM_REF|RIG_LEVEL_SPECTRUM_AVG|RIG_LEVEL_SPECTRUM_EDGE_LOW|RIG_LEVEL_SPECTRUM_EDGE_HIGH) +#define IC705_RFPOWER_METER_CAL { 13, \ + { \ + { 0, 0.0f }, \ + { 21, 0.50f }, \ + { 43, 1.00f }, \ + { 65, 1.50f }, \ + { 83, 2.00f }, \ + { 95, 2.50f }, \ + { 105, 3.00f }, \ + { 114, 3.50f }, \ + { 124, 4.00f }, \ + { 143, 5.00f }, \ + { 183, 7.50f }, \ + { 213, 10.0f }, \ + { 255, 12.0f } \ + } } + /* * IC9700 items that differ from IC7300 */ @@ -1407,7 +1424,7 @@ struct rig_caps ic705_caps = .str_cal = IC7300_STR_CAL, .swr_cal = IC7300_SWR_CAL, .alc_cal = IC7300_ALC_CAL, - .rfpower_meter_cal = IC7300_RFPOWER_METER_CAL, + .rfpower_meter_cal = IC705_RFPOWER_METER_CAL, .comp_meter_cal = IC7300_COMP_METER_CAL, .vd_meter_cal = IC7300_VD_METER_CAL, .id_meter_cal = IC7300_ID_METER_CAL, @@ -1678,7 +1695,7 @@ struct rig_caps ic905_caps = .str_cal = IC7300_STR_CAL, .swr_cal = IC7300_SWR_CAL, .alc_cal = IC7300_ALC_CAL, - .rfpower_meter_cal = IC7300_RFPOWER_METER_CAL, + .rfpower_meter_cal = IC705_RFPOWER_METER_CAL, .comp_meter_cal = IC7300_COMP_METER_CAL, .vd_meter_cal = IC7300_VD_METER_CAL, .id_meter_cal = IC7300_ID_METER_CAL, diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index 949ed1d32..732e64c9e 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -9080,6 +9080,10 @@ int icom_power2mW(RIG *rig, unsigned int *mwpower, float power, freq_t freq, switch (rig_id) { + case RIG_MODEL_IC705: + case RIG_MODEL_IC905: + *mwpower = power * 10000; + break; default: /* Normal 100 Watts */ *mwpower = power * 100000; commit 3061d5e208f2f2d6d234d1a2a31b9550b00e35ce Author: davidg <da...@ba...> Date: Wed Dec 20 21:26:57 2023 +0000 Add number of CW and Voice memories to supporting Icom, Yaesu, Kenwood and Elecraft Radios. Added added .chanlist to TS890S diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 008b32eee..a4066cbf1 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -1663,11 +1663,10 @@ typedef enum { \endcode */ struct chan_list { - int startc; /*!< Starting memory channel \b number */ - int endc; /*!< Ending memory channel \b number */ - chan_type_t type; /*!< Memory type. see chan_type_t */ - channel_cap_t - mem_caps; /*!< Definition of attributes that can be stored/retrieved */ + int startc; /*!< Starting memory channel \b number */ + int endc; /*!< Ending memory channel \b number */ + chan_type_t type; /*!< Memory type. see chan_type_t */ + channel_cap_t mem_caps; /*!< Definition of attributes that can be stored/retrieved */ }; //! @cond Doxygen_Suppress diff --git a/rigs/icom/ic7100.c b/rigs/icom/ic7100.c index 16ed4d3fc..d6cc30453 100644 --- a/rigs/icom/ic7100.c +++ b/rigs/icom/ic7100.c @@ -382,6 +382,7 @@ const struct rig_caps ic7100_caps = { 1, 396, RIG_MTYPE_MEM }, { 397, 400, RIG_MTYPE_CALL }, { 401, 424, RIG_MTYPE_EDGE }, + { 1, 4, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/icom/ic7300.c b/rigs/icom/ic7300.c index 06679572f..4a8a332c7 100644 --- a/rigs/icom/ic7300.c +++ b/rigs/icom/ic7300.c @@ -755,11 +755,10 @@ const struct rig_caps ic7300_caps = .transceive = RIG_TRN_RIG, .bank_qty = 1, .chan_desc_sz = 0, - .chan_list = { { 1, 99, RIG_MTYPE_MEM }, - { 1, 8, RIG_MTYPE_VOICE }, - { 1, 8, RIG_MTYPE_MORSE }, + { 1, 8, RIG_MTYPE_VOICE }, + { 1, 8, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, @@ -1324,11 +1323,10 @@ const struct rig_caps ic705_caps = .transceive = RIG_TRN_RIG, .bank_qty = 5, .chan_desc_sz = 0, - .chan_list = { { 1, 99, RIG_MTYPE_MEM }, - { 1, 8, RIG_MTYPE_VOICE }, - { 1, 8, RIG_MTYPE_MORSE }, + { 1, 8, RIG_MTYPE_VOICE }, + { 1, 8, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, @@ -1600,11 +1598,10 @@ const struct rig_caps ic905_caps = .transceive = RIG_TRN_RIG, .bank_qty = 5, .chan_desc_sz = 0, - .chan_list = { { 1, 99, RIG_MTYPE_MEM }, - { 1, 8, RIG_MTYPE_VOICE }, - { 1, 8, RIG_MTYPE_MORSE }, + { 1, 8, RIG_MTYPE_VOICE }, + { 1, 8, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/icom/ic7410.c b/rigs/icom/ic7410.c index 1ebc4707c..bb9a0db00 100644 --- a/rigs/icom/ic7410.c +++ b/rigs/icom/ic7410.c @@ -179,6 +179,7 @@ const struct rig_caps ic7410_caps = .chan_list = { { 1, 99, RIG_MTYPE_MEM }, { 100, 101, RIG_MTYPE_EDGE }, /* two by two */ + { 1, 4, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/icom/ic7600.c b/rigs/icom/ic7600.c index 89c0328d1..1f3c612f5 100644 --- a/rigs/icom/ic7600.c +++ b/rigs/icom/ic7600.c @@ -341,6 +341,7 @@ struct rig_caps ic7600_caps = .chan_list = { { 1, 99, RIG_MTYPE_MEM }, { 100, 101, RIG_MTYPE_EDGE }, /* two by two */ + { 1, 4, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/icom/ic7610.c b/rigs/icom/ic7610.c index ce327e324..dfcbddccf 100644 --- a/rigs/icom/ic7610.c +++ b/rigs/icom/ic7610.c @@ -422,6 +422,8 @@ struct rig_caps ic7610_caps = .chan_list = { { 1, 99, RIG_MTYPE_MEM }, { 100, 101, RIG_MTYPE_EDGE }, /* two by two */ + { 1, 8, RIG_MTYPE_VOICE }, + { 1, 8, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/icom/ic7700.c b/rigs/icom/ic7700.c index debd3644f..61c49d861 100644 --- a/rigs/icom/ic7700.c +++ b/rigs/icom/ic7700.c @@ -316,6 +316,7 @@ const struct rig_caps ic7700_caps = .chan_list = { { 1, 99, RIG_MTYPE_MEM }, { 100, 101, RIG_MTYPE_EDGE }, /* two by two */ + { 1, 4, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/icom/ic7800.c b/rigs/icom/ic7800.c index 00af91d85..ad4266e94 100644 --- a/rigs/icom/ic7800.c +++ b/rigs/icom/ic7800.c @@ -215,6 +215,7 @@ const struct rig_caps ic7800_caps = .chan_list = { { 1, 99, RIG_MTYPE_MEM }, { 100, 101, RIG_MTYPE_EDGE }, /* two by two */ + { 1, 4, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/kenwood/k2.c b/rigs/kenwood/k2.c index bca431dde..c5359d015 100644 --- a/rigs/kenwood/k2.c +++ b/rigs/kenwood/k2.c @@ -160,7 +160,9 @@ const struct rig_caps k2_caps = .bank_qty = 0, .chan_desc_sz = 0, - .chan_list = { RIG_CHAN_END }, + .chan_list = { + { 1, 8, RIG_MTYPE_MORSE }, + RIG_CHAN_END }, .rx_range_list1 = { {kHz(500), MHz(30), K2_MODES, -1, -1, K2_VFO, K2_ANTS}, diff --git a/rigs/kenwood/k3.c b/rigs/kenwood/k3.c index c81c3550f..b863d5c8d 100644 --- a/rigs/kenwood/k3.c +++ b/rigs/kenwood/k3.c @@ -238,7 +238,10 @@ const struct rig_caps k3_caps = .bank_qty = 0, .chan_desc_sz = 0, - .chan_list = { RIG_CHAN_END }, + .chan_list = { + { 1, 4, RIG_MTYPE_VOICE }, + { 1, 4, RIG_MTYPE_MORSE }, + RIG_CHAN_END }, .rx_range_list1 = { {kHz(500), MHz(30), K3_MODES, -1, -1, K3_VFO, K3_ANTS}, @@ -394,7 +397,10 @@ const struct rig_caps k3s_caps = .bank_qty = 0, .chan_desc_sz = 0, - .chan_list = { RIG_CHAN_END }, + .chan_list = { + { 1, 4, RIG_MTYPE_VOICE }, + { 1, 4, RIG_MTYPE_MORSE }, + RIG_CHAN_END }, .rx_range_list1 = { {kHz(500), MHz(30), K3_MODES, -1, -1, K3_VFO, K3_ANTS}, @@ -556,7 +562,10 @@ const struct rig_caps k4_caps = .bank_qty = 0, .chan_desc_sz = 0, - .chan_list = { RIG_CHAN_END }, + .chan_list = { + { 1, 4, RIG_MTYPE_VOICE }, + { 1, 4, RIG_MTYPE_MORSE }, + RIG_CHAN_END }, .rx_range_list1 = { {kHz(500), MHz(30), K3_MODES, -1, -1, K3_VFO, K4_ANTS}, @@ -711,7 +720,10 @@ const struct rig_caps kx3_caps = .bank_qty = 0, .chan_desc_sz = 0, - .chan_list = { RIG_CHAN_END }, + .chan_list = { + { 1, 4, RIG_MTYPE_VOICE }, + { 1, 4, RIG_MTYPE_MORSE }, + RIG_CHAN_END }, .rx_range_list1 = { {kHz(500), MHz(30), K3_MODES, -1, -1, K3_VFO, K3_ANTS}, @@ -866,7 +878,9 @@ const struct rig_caps kx2_caps = .bank_qty = 0, .chan_desc_sz = 0, - .chan_list = { RIG_CHAN_END }, + .chan_list = { + { 1, 4, RIG_MTYPE_MORSE }, + RIG_CHAN_END }, .rx_range_list1 = { {kHz(500), MHz(30), K3_MODES, -1, -1, K3_VFO, K3_ANTS}, diff --git a/rigs/kenwood/ts2000.c b/rigs/kenwood/ts2000.c index 9e62a0817..1ca20d05a 100644 --- a/rigs/kenwood/ts2000.c +++ b/rigs/kenwood/ts2000.c @@ -1730,6 +1730,7 @@ const struct rig_caps ts2000_caps = .chan_list = { { 0, 299, RIG_MTYPE_MEM, TS2000_MEM_CAP }, + { 1, 3, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/kenwood/ts570.c b/rigs/kenwood/ts570.c index 772599269..8820b8278 100644 --- a/rigs/kenwood/ts570.c +++ b/rigs/kenwood/ts570.c @@ -1134,6 +1134,7 @@ const struct rig_caps ts570d_caps = .chan_list = { { 0, 89, RIG_MTYPE_MEM, TS570_MEM_CAP }, { 90, 99, RIG_MTYPE_EDGE, TS570_MEM_CAP }, + { 1, 3, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, .rx_range_list1 = { diff --git a/rigs/kenwood/ts590.c b/rigs/kenwood/ts590.c index 9a4c1dc48..dcec334e7 100644 --- a/rigs/kenwood/ts590.c +++ b/rigs/kenwood/ts590.c @@ -1994,6 +1994,7 @@ const struct rig_caps ts590sg_caps = .chan_list = { /* TBC */ { 0, 89, RIG_MTYPE_MEM, TS590_CHANNEL_CAPS }, { 90, 99, RIG_MTYPE_EDGE, TS590_CHANNEL_CAPS }, + { 1, 3, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/kenwood/ts870s.c b/rigs/kenwood/ts870s.c index da45bff2d..61b1a5436 100644 --- a/rigs/kenwood/ts870s.c +++ b/rigs/kenwood/ts870s.c @@ -586,6 +586,7 @@ const struct rig_caps ts870s_caps = .chan_list = { { 0, 89, RIG_MTYPE_MEM }, /* TBC */ { 90, 99, RIG_MTYPE_EDGE }, + { 1, 4, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/kenwood/ts890s.c b/rigs/kenwood/ts890s.c index f71d009fb..4abd36681 100644 --- a/rigs/kenwood/ts890s.c +++ b/rigs/kenwood/ts890s.c @@ -414,7 +414,11 @@ const struct rig_caps ts890s_caps = .transceive = RIG_TRN_RIG, .agc_level_count = 5, .agc_levels = { RIG_AGC_OFF, RIG_AGC_SLOW, RIG_AGC_MEDIUM, RIG_AGC_FAST, RIG_AGC_ON }, - + .chan_list = { + { 1, 6, RIG_MTYPE_VOICE }, + { 1, 8, RIG_MTYPE_MORSE }, + RIG_CHAN_END, + }, .rx_range_list1 = { {kHz(100), Hz(59999999), TS890_ALL_MODES, -1, -1, TS890_VFO}, RIG_FRNG_END, diff --git a/rigs/kenwood/ts990s.c b/rigs/kenwood/ts990s.c index 112c3cba3..74a973fc5 100644 --- a/rigs/kenwood/ts990s.c +++ b/rigs/kenwood/ts990s.c @@ -181,6 +181,8 @@ const struct rig_caps ts990s_caps = .chan_list = { { 0, 299, RIG_MTYPE_MEM, TS990S_MEM_CAP }, + { 1, 6, RIG_MTYPE_VOICE }, + { 1, 8, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/yaesu/ft1200.c b/rigs/yaesu/ft1200.c index eca6c098f..eb3b20acc 100644 --- a/rigs/yaesu/ft1200.c +++ b/rigs/yaesu/ft1200.c @@ -202,6 +202,7 @@ const struct rig_caps ftdx1200_caps = .chan_list = { { 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, { 100, 117, RIG_MTYPE_EDGE, NEWCAT_MEM_CAP }, /* two by two */ + { 1, 5, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/yaesu/ft2000.c b/rigs/yaesu/ft2000.c index c8fc41cbd..35c146a45 100644 --- a/rigs/yaesu/ft2000.c +++ b/rigs/yaesu/ft2000.c @@ -184,6 +184,7 @@ const struct rig_caps ft2000_caps = .chan_list = { { 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, { 100, 117, RIG_MTYPE_EDGE, NEWCAT_MEM_CAP }, /* two by two */ + { 1, 5, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/yaesu/ft3000.c b/rigs/yaesu/ft3000.c index 7774b7895..6c1f27edc 100644 --- a/rigs/yaesu/ft3000.c +++ b/rigs/yaesu/ft3000.c @@ -297,6 +297,7 @@ const struct rig_caps ftdx3000_caps = .chan_list = { { 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, { 100, 117, RIG_MTYPE_EDGE, NEWCAT_MEM_CAP }, /* two by two */ + { 1, 5, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/yaesu/ft450.c b/rigs/yaesu/ft450.c index 5377211b9..a6fa56ec3 100644 --- a/rigs/yaesu/ft450.c +++ b/rigs/yaesu/ft450.c @@ -94,7 +94,8 @@ const struct rig_caps ft450_caps = .chan_list = { { 1, 500, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, { 501, 504, RIG_MTYPE_EDGE, NEWCAT_MEM_CAP }, /* two by two */ - RIG_CHAN_END, + { 1, 1, RIG_MTYPE_MORSE }, + RIG_CHAN_END, }, .rx_range_list1 = { diff --git a/rigs/yaesu/ft5000.c b/rigs/yaesu/ft5000.c index d7421b280..284063a7e 100644 --- a/rigs/yaesu/ft5000.c +++ b/rigs/yaesu/ft5000.c @@ -192,6 +192,7 @@ const struct rig_caps ftdx5000_caps = .chan_list = { { 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, { 100, 117, RIG_MTYPE_EDGE, NEWCAT_MEM_CAP }, /* two by two */ + { 1, 5, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/yaesu/ft710.c b/rigs/yaesu/ft710.c index 792350806..10e8ae249 100644 --- a/rigs/yaesu/ft710.c +++ b/rigs/yaesu/ft710.c @@ -177,6 +177,7 @@ const struct rig_caps ft710_caps = .comp_meter_cal = FT710_COMP_CAL, .chan_list = { { 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, + { 1, 5, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/yaesu/ft891.c b/rigs/yaesu/ft891.c index 2d5309344..68a426145 100644 --- a/rigs/yaesu/ft891.c +++ b/rigs/yaesu/ft891.c @@ -185,6 +185,7 @@ const struct rig_caps ft891_caps = .str_cal = FT891_STR_CAL, .chan_list = { { 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, + { 1, 5, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/yaesu/ft9000.c b/rigs/yaesu/ft9000.c index 7f5b61f85..cbc7aa28e 100644 --- a/rigs/yaesu/ft9000.c +++ b/rigs/yaesu/ft9000.c @@ -98,6 +98,7 @@ const struct rig_caps ft9000_caps = /* TBC */ { 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, { 100, 117, RIG_MTYPE_EDGE, NEWCAT_MEM_CAP }, /* two by two */ + { 1, 5, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, @@ -274,6 +275,7 @@ const struct rig_caps ft9000Old_caps = /* TBC */ { 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, { 100, 117, RIG_MTYPE_EDGE, NEWCAT_MEM_CAP }, /* two by two */ + { 1, 5, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/yaesu/ft950.c b/rigs/yaesu/ft950.c index 2ee973d55..6c99924d3 100644 --- a/rigs/yaesu/ft950.c +++ b/rigs/yaesu/ft950.c @@ -141,7 +141,7 @@ const struct rig_caps ft950_caps = { 125, 128, RIG_MTYPE_BAND, NEWCAT_MEM_CAP }, /* 60M Channels U51-U54 or US1-US4, if available */ { 130, 130, RIG_MTYPE_BAND, NEWCAT_MEM_CAP }, /* 60M Channel U55 or US5, if available */ { 131, 131, RIG_MTYPE_BAND, NEWCAT_MEM_CAP }, /* EU5, 5167.5 KHz Alaska Emergency Freq, if available */ - + { 1, 5, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/yaesu/ft991.c b/rigs/yaesu/ft991.c index cd5ef0503..9449df4a3 100644 --- a/rigs/yaesu/ft991.c +++ b/rigs/yaesu/ft991.c @@ -233,7 +233,9 @@ const struct rig_caps ft991_caps = { 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, { 100, 117, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, // P1L-P9U PMS channels { 118, 127, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, // 5xx 5MHz band - RIG_CHAN_END, + { 1, 5, RIG_MTYPE_VOICE }, + { 1, 5, RIG_MTYPE_MORSE }, + RIG_CHAN_END, }, // Rig only has 1 model diff --git a/rigs/yaesu/ftdx10.c b/rigs/yaesu/ftdx10.c index 65e9dade9..11c486b42 100644 --- a/rigs/yaesu/ftdx10.c +++ b/rigs/yaesu/ftdx10.c @@ -190,6 +190,7 @@ const struct rig_caps ftdx10_caps = .chan_list = { { 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, { 501, 510, RIG_MTYPE_BAND, NEWCAT_MEM_CAP }, /* 60M Channels, 5-01 - 5-10, if available */ + { 1, 5, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/yaesu/ftdx101.c b/rigs/yaesu/ftdx101.c index 0473b7b85..e22527687 100644 --- a/rigs/yaesu/ftdx101.c +++ b/rigs/yaesu/ftdx101.c @@ -232,6 +232,7 @@ const struct rig_caps ftdx101d_caps = { 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, { 100, 117, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, // P1L-P9U PMS channels { 501, 510, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, // 5xx 5MHz band + { 1, 5, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, diff --git a/rigs/yaesu/ftdx101mp.c b/rigs/yaesu/ftdx101mp.c index bf0cd4a0a..6f2b59284 100644 --- a/rigs/yaesu/ftdx101mp.c +++ b/rigs/yaesu/ftdx101mp.c @@ -133,6 +133,7 @@ const struct rig_caps ftdx101mp_caps = { 1, 99, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, { 100, 117, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, // P1L-P9U PMS channels { 501, 510, RIG_MTYPE_MEM, NEWCAT_MEM_CAP }, // 5xx 5MHz band + { 1, 5, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, commit ea7ce78c6580b75ee471de825fefbe193cb1e8a8 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Dec 19 22:42:08 2023 -0600 Balance RETURNFUNC in id5100.c diff --git a/rigs/icom/id5100.c b/rigs/icom/id5100.c index b1e114843..006bcdce3 100644 --- a/rigs/icom/id5100.c +++ b/rigs/icom/id5100.c @@ -142,7 +142,7 @@ int id5100_set_vfo(RIG *rig, vfo_t vfo) RETURNFUNC2(retval); } - return retval; + RETURNFUNC(retval); } commit 576ed8266ae4cb9234b7d1582c15d4a173d5c559 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Dec 19 16:23:03 2023 -0600 Ignore scanfc Invalid argument for rotctld https://github.com/Hamlib/Hamlib/issues/1391 diff --git a/tests/rotctl_parse.c b/tests/rotctl_parse.c index 032284353..027f310a3 100644 --- a/tests/rotctl_parse.c +++ b/tests/rotctl_parse.c @@ -417,6 +417,10 @@ static int scanfc(FILE *fin, const char *format, void *p) } if (ferror(fin)) { rig_debug(RIG_DEBUG_ERR, "%s: errno=%d, %s\n", __func__, errno, strerror(errno)); clearerr(fin); } + if (errno == 22) // invalid arg we will continue + { + continue; + } return ret; } commit 7334da6d89a8a5451088746e508af8f5dc6d1dd7 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Dec 19 09:29:31 2023 -0600 Split AZ/EL request into two transactions for easycomm.c diff --git a/rotators/easycomm/easycomm.c b/rotators/easycomm/easycomm.c index 419c16fd8..99c3a64b6 100644 --- a/rotators/easycomm/easycomm.c +++ b/rotators/easycomm/easycomm.c @@ -135,7 +135,7 @@ easycomm_rot_get_position(ROT *rot, azimuth_t *az, elevation_t *el) rig_debug(RIG_DEBUG_TRACE, "%s called\n", __func__); - SNPRINTF(cmdstr, sizeof(cmdstr), "AZ EL \n"); + SNPRINTF(cmdstr, sizeof(cmdstr), "AZ\n"); retval = easycomm_transaction(rot, cmdstr, ackbuf, sizeof(ackbuf)); @@ -145,16 +145,37 @@ easycomm_rot_get_position(ROT *rot, azimuth_t *az, elevation_t *el) return retval; } - /* Parse parse string to extract AZ,EL values */ + /* Parse parse string to extract AZ values */ rig_debug(RIG_DEBUG_TRACE, "%s got response: %s\n", __func__, ackbuf); - retval = sscanf(ackbuf, "AZ%f EL%f", az, el); + retval = sscanf(ackbuf, "AZ%f", az); - if (retval != 2) + if (retval != 1) { rig_debug(RIG_DEBUG_ERR, "%s: unknown response (%s)\n", __func__, ackbuf); return -RIG_ERJCTED; } + SNPRINTF(cmdstr, sizeof(cmdstr), "EL\n"); + + retval = easycomm_transaction(rot, cmdstr, ackbuf, sizeof(ackbuf)); + + if (retval != RIG_OK) + { + rig_debug(RIG_DEBUG_TRACE, "%s got error: %d\n", __func__, retval); + return retval; + } + + /* Parse parse string to extract EL values */ + rig_debug(RIG_DEBUG_TRACE, "%s got response: %s\n", __func__, ackbuf); + retval = sscanf(ackbuf, "EL%f", el); + + if (retval != 1) + { + rig_debug(RIG_DEBUG_ERR, "%s: unknown response (%s)\n", __func__, ackbuf); + return -RIG_ERJCTED; + } + + return RIG_OK; } @@ -527,7 +548,7 @@ const struct rot_caps easycomm1_rot_caps = ROT_MODEL(ROT_MODEL_EASYCOMM1), .model_name = "EasycommI", .mfg_name = "Hamlib", - .version = "20231218.0", + .version = "20231219.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rot_type = ROT_TYPE_OTHER, commit 935cebed6ee776473f9a8397754629a86c4be1dc Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Dec 18 16:44:57 2023 -0600 Remove some debug and fix debug indendation diff --git a/src/misc.h b/src/misc.h index f2d135c94..98c130d45 100644 --- a/src/misc.h +++ b/src/misc.h @@ -166,8 +166,7 @@ void errmsg(int err, char *s, const char *func, const char *file, int line); // could be a function call #define RETURNFUNC(rc) {do { \ int rctmp = rc; \ - rig_debug(RIG_DEBUG_VERBOSE, "%.*s%d:%s(%d):%s returning(%ld) %s\n", rig->state.depth-1, spaces(), rig->state.depth, __FILENAME__, __LINE__, __func__, (long int) (rctmp), rctmp<0?rigerror2(rctmp):""); \ - if (rig->state.depth == 0) rig_debug(RIG_DEBUG_ERR, "%s(%d) depth=0 ******************\n", __func__, __LINE__); \ + rig_debug(RIG_DEBUG_VERBOSE, "%.*s%d:%s(%d):%s returning(%ld) %s\n", rig->state.depth, spaces(), rig->state.depth, __FILENAME__, __LINE__, __func__, (long int) (rctmp), rctmp<0?rigerror2(rctmp):""); \ --rig->state.depth; \ return (rctmp); \ } while(0);} commit af5ea58350f34ba918685e6bd72b272a6bb1d9ad Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Dec 18 15:26:46 2023 -0600 Add -# --skip_init option to rigctl diff --git a/NEWS b/NEWS index 644b7fd1a..9fadc11a2 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,7 @@ Version 5.x -- future * Change FT1000MP Mark V model names to align with FT1000MP Version 4.6 + * Add -# --skip_init option to rigctl to skip rig initialization -- useful for executing commands quickly * rig_caps is no longer constant -- this may break some 3rd party relying on the "const" declaration. Here's an example of how to handle compatiblity. #ifdef RIGCAPS_NOT_CONST static int add_to_list(struct rig_caps* rc, void*) diff --git a/doc/man1/rigctl.1 b/doc/man1/rigctl.1 index db4535e2e..baf5b8fa8 100644 --- a/doc/man1/rigctl.1 +++ b/doc/man1/rigctl.1 @@ -1424,6 +1424,11 @@ Can also use 1,2,3,4 Reads GPIO1, GPIO2, GPIO3, GPIO4 on the GPIO ptt port Can also use 1,2,3,4 . +.TP +.BR skip_init +.EX +Skips rig initialization -- useful when executing commands with rigctl to speed up things +. .SH READLINE . If diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 718e55d90..4428dab24 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -156,6 +156,7 @@ typedef struct // cookie is 26-char time code plus 10-char (2^31-1) random number #define HAMLIB_COOKIE_SIZE 37 extern int cookie_use; // this is global as once one client requests it everybody needs to honor it +extern int skip_init; // allow rigctl to skip any radio commands at startup //! @cond Doxygen_Suppress extern HAMLIB_EXPORT_VAR(const char) hamlib_version[]; diff --git a/src/rig.c b/src/rig.c index ce6a185ba..40051a2c8 100644 --- a/src/rig.c +++ b/src/rig.c @@ -100,6 +100,7 @@ const char hamlib_version[21] = "Hamlib " PACKAGE_VERSION; const char *hamlib_version2 = "Hamlib " PACKAGE_VERSION " " HAMLIBDATETIME " " ARCHBITS; HAMLIB_EXPORT_VAR(int) cookie_use; +HAMLIB_EXPORT_VAR(int) skip_init; HAMLIB_EXPORT_VAR(int) lock_mode; // for use by rigctld HAMLIB_EXPORT_VAR(powerstat_t) rig_powerstat; // for use by both rigctld and rigctl @@ -1326,6 +1327,8 @@ int HAMLIB_API rig_open(RIG *rig) } #if defined(HAVE_PTHREAD) + if (!skip_init) + { status = async_data_handler_start(rig); if (status < 0) @@ -1334,7 +1337,7 @@ int HAMLIB_API rig_open(RIG *rig) rig->state.comm_status = RIG_COMM_STATUS_ERROR; RETURNFUNC2(status); } - + } #endif rs->comm_state = 1; @@ -1354,7 +1357,7 @@ int HAMLIB_API rig_open(RIG *rig) if (caps->rig_open != NULL) { - if (caps->get_powerstat != NULL) + if (caps->get_powerstat != NULL && !skip_init) { powerstat_t powerflag; status = rig_get_powerstat(rig, &powerflag); @@ -1388,8 +1391,11 @@ int HAMLIB_API rig_open(RIG *rig) { remove_opened_rig(rig); #if d... [truncated message content] |