You can subscribe to this list here.
2000 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(57) |
Nov
(27) |
Dec
(25) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2001 |
Jan
(41) |
Feb
(101) |
Mar
(60) |
Apr
(32) |
May
(32) |
Jun
(198) |
Jul
(95) |
Aug
(60) |
Sep
(48) |
Oct
(96) |
Nov
(27) |
Dec
(222) |
2002 |
Jan
(180) |
Feb
(46) |
Mar
(68) |
Apr
(11) |
May
(36) |
Jun
(34) |
Jul
(113) |
Aug
(42) |
Sep
(71) |
Oct
(65) |
Nov
(116) |
Dec
(40) |
2003 |
Jan
(32) |
Feb
(92) |
Mar
(29) |
Apr
(102) |
May
(21) |
Jun
(34) |
Jul
(3) |
Aug
(60) |
Sep
(30) |
Oct
(62) |
Nov
(57) |
Dec
(33) |
2004 |
Jan
(28) |
Feb
(46) |
Mar
(16) |
Apr
(14) |
May
(31) |
Jun
(21) |
Jul
(10) |
Aug
(80) |
Sep
(42) |
Oct
(11) |
Nov
(28) |
Dec
(13) |
2005 |
Jan
(35) |
Feb
(26) |
Mar
(20) |
Apr
(118) |
May
(2) |
Jun
(5) |
Jul
|
Aug
|
Sep
(5) |
Oct
(1) |
Nov
(13) |
Dec
(1) |
2006 |
Jan
(9) |
Feb
(25) |
Mar
(22) |
Apr
(6) |
May
|
Jun
|
Jul
(2) |
Aug
(1) |
Sep
(3) |
Oct
(46) |
Nov
(13) |
Dec
(7) |
2007 |
Jan
(9) |
Feb
(14) |
Mar
(3) |
Apr
|
May
(6) |
Jun
(1) |
Jul
|
Aug
(11) |
Sep
(7) |
Oct
(8) |
Nov
(41) |
Dec
(3) |
2008 |
Jan
(27) |
Feb
(16) |
Mar
(13) |
Apr
(23) |
May
(39) |
Jun
(4) |
Jul
(7) |
Aug
(1) |
Sep
(13) |
Oct
(52) |
Nov
(44) |
Dec
(55) |
2009 |
Jan
(72) |
Feb
(69) |
Mar
|
Apr
|
May
|
Jun
(13) |
Jul
(1) |
Aug
(6) |
Sep
(15) |
Oct
(11) |
Nov
(31) |
Dec
(20) |
2010 |
Jan
(24) |
Feb
(21) |
Mar
(22) |
Apr
(40) |
May
(38) |
Jun
(4) |
Jul
(2) |
Aug
(22) |
Sep
(19) |
Oct
(14) |
Nov
(5) |
Dec
(8) |
2011 |
Jan
(14) |
Feb
(36) |
Mar
(6) |
Apr
|
May
|
Jun
(23) |
Jul
(13) |
Aug
(8) |
Sep
(7) |
Oct
|
Nov
(3) |
Dec
(9) |
2012 |
Jan
(17) |
Feb
(13) |
Mar
(10) |
Apr
|
May
(1) |
Jun
(14) |
Jul
(4) |
Aug
(12) |
Sep
(2) |
Oct
(24) |
Nov
(14) |
Dec
(2) |
2013 |
Jan
(4) |
Feb
(3) |
Mar
(3) |
Apr
(3) |
May
(10) |
Jun
(4) |
Jul
(7) |
Aug
|
Sep
(15) |
Oct
(5) |
Nov
(1) |
Dec
(2) |
2014 |
Jan
|
Feb
(8) |
Mar
(1) |
Apr
(3) |
May
(1) |
Jun
|
Jul
|
Aug
(1) |
Sep
(3) |
Oct
(7) |
Nov
(6) |
Dec
(3) |
2015 |
Jan
(4) |
Feb
(5) |
Mar
(8) |
Apr
(8) |
May
(2) |
Jun
|
Jul
(4) |
Aug
(7) |
Sep
(8) |
Oct
|
Nov
(6) |
Dec
(4) |
2016 |
Jan
(6) |
Feb
(26) |
Mar
(3) |
Apr
(10) |
May
(6) |
Jun
(5) |
Jul
(1) |
Aug
(4) |
Sep
(3) |
Oct
(4) |
Nov
(3) |
Dec
(10) |
2017 |
Jan
(11) |
Feb
(11) |
Mar
(2) |
Apr
(1) |
May
(7) |
Jun
(2) |
Jul
(11) |
Aug
(9) |
Sep
(5) |
Oct
(5) |
Nov
(1) |
Dec
(2) |
2018 |
Jan
(5) |
Feb
(2) |
Mar
(19) |
Apr
(7) |
May
(11) |
Jun
(3) |
Jul
(4) |
Aug
(10) |
Sep
(2) |
Oct
(8) |
Nov
(6) |
Dec
(9) |
2019 |
Jan
(9) |
Feb
(6) |
Mar
(2) |
Apr
(4) |
May
(6) |
Jun
(9) |
Jul
(6) |
Aug
(3) |
Sep
(5) |
Oct
(2) |
Nov
(8) |
Dec
(9) |
2020 |
Jan
(15) |
Feb
(1) |
Mar
(18) |
Apr
(33) |
May
(43) |
Jun
(87) |
Jul
(45) |
Aug
(8) |
Sep
(43) |
Oct
(3) |
Nov
(5) |
Dec
(42) |
2021 |
Jan
(116) |
Feb
(40) |
Mar
(58) |
Apr
(48) |
May
(29) |
Jun
(2) |
Jul
|
Aug
(22) |
Sep
(18) |
Oct
(1) |
Nov
|
Dec
(3) |
2022 |
Jan
(1) |
Feb
(1) |
Mar
|
Apr
(1) |
May
(2) |
Jun
(1) |
Jul
|
Aug
(1) |
Sep
|
Oct
(6) |
Nov
(2) |
Dec
(9) |
2023 |
Jan
(10) |
Feb
|
Mar
|
Apr
(10) |
May
(3) |
Jun
(1) |
Jul
(2) |
Aug
(4) |
Sep
(1) |
Oct
|
Nov
(2) |
Dec
(3) |
2024 |
Jan
(4) |
Feb
(1) |
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: n0nb <n0...@us...> - 2024-03-17 16:02:46
|
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 1de9a5cede92b4847a32966c6b087ca91b74d113 (commit) via 0e572f631b8f4d75984f5b8f03b83ddce36eaf50 (commit) via 84d5f367f6b6631114e12fcf84e9b949411b1e55 (commit) via 6d257841a6e79dcb16b0e9efe1c1a9007904255f (commit) via 8449ac3c436065cbca6886a7ad469d1229268fdf (commit) via 1045620313669792c24f49df570d66a596faf95b (commit) via b9e59f205e029147c0e9fac12cc457c47582a954 (commit) via 6220da1eaf73d212b4d082035ef9de3ab8598522 (commit) via f119f5976aaa49fd7eca4997fbbd7b38796b49bf (commit) via 96ec37a276fd773b1a14f699bc033c4c2ef75a74 (commit) via 789d863f9779160ea6b204e84db1aaae29a702ae (commit) via c7665cb7d115acc12f57144c4f3431196241852f (commit) via aa0d83df959ec7dcd76546be45a72a17552db98f (commit) via 609065775c49da604d38b46b3fee601910d06e5d (commit) via 5ab1122139e4227fe124124fea6c4a8e9386db24 (commit) via 24135bd7d704dbf61c1f3cdf674cbb4159c59045 (commit) via b358cdbd2eb04ee89c6c6819775fb2adc8bbb039 (commit) via f3b8330331b145f893868a97420d5c6f428d2939 (commit) via 61211976872a798b709416a6671622cb93d4ed29 (commit) via 15a2b5a0dc3e40a57aac485b63499a1a06992255 (commit) via b9df1c7bda84092ab114838078b58a5133ef7eba (commit) via 4f3e40f3c6ec6b9a6e4dc72c31399f799f62e199 (commit) via bafb88432aced418aaaab73d70099eabbc0c6b1d (commit) via 2212c47ad7660f8228246ae4d8f72cf84e1cfc86 (commit) via f122f6422b86da02f8b101e55266acc253d0ae47 (commit) via 0868edbd659284f84290f2503680e52ec0342941 (commit) via dc38d19449a0a7e0c97298a46876887e484fb80c (commit) via c74b3c10c657aa14880eb860baf4cc540cc7e5eb (commit) via a96a97ae3ce24df355cf2cc774b8da4034bd2857 (commit) via 7831dfc311cec469e7d0dfc9af2574e05cd9fe88 (commit) via bb9b1f1783f23a415f22863de7b63611021f0c0a (commit) via 12404aa8a6498e871b664993a1320e433069f70e (commit) via cef2525d0f09ee6557736cdd7c98aeb6abf5924c (commit) via 728db84c0c1d0ec22a096ee1bcfba1182fed8df1 (commit) via 07f8023d17f96ffc2898d5713a33221ce494301c (commit) via 55db73894fb71b3fcb3a676dc421cd88a419806f (commit) via 0fdc78c6043ebb3f9dd0df9b2d913ddfabe9e02f (commit) via 0f74a23b142e8e3ec33ed0907fb9c0c1798baeb7 (commit) via 7f02c35562da9946c4ab398eeb781deaeac1b171 (commit) via a8f7da8fc4e325ac5a87ad7f665e43e54d00233b (commit) via c15f5b0da01ee8308d94d42bac71ecb501a3782b (commit) via c6371a14a1786f8ed2eb00e121efb200287cd2fd (commit) via 65d2023b95695e14493024246ceec7013c44fb32 (commit) via c68ef118e9cbb10807e9f1eebf0823e60624a7e1 (commit) via 25ee5d65d592e80f7471806c2959ded06ece1b69 (commit) via eaae02ef008e117d8ad5f2568776a6c2b393a193 (commit) via 45db5d32c3cb61cbf0ac0ffd0d482cf0f57df126 (commit) via 7bda13f0e0f7a257b9e36fe7b13dee3ceb3a42c7 (commit) via b65997a24929edfa4809e7912413ddb25ebfacac (commit) via 7ee8c358cd056ff5f5ccc965da605f3329f7d6c3 (commit) via 5f92b19ef4882da83bbbfcf30ea61384ca9b7791 (commit) via 5089949f100ed31f8e321d84221b90efbc2793af (commit) via 83f5655a9fec53811250e8d20d2c04342700b304 (commit) via 1b2f6a84f7a2b322593eead90f3f278008ee8464 (commit) via 9f87279b0b2b3e9dad4391f4daae657ed6b33806 (commit) via c1f8b091abe305dadbf9a08777532bd1b9ce23ad (commit) via 3967e41fcf2463a5b11fea12f4527b44d47d06d6 (commit) via 2849a756762fd73ced678de01958ed73b1c1eb4b (commit) via fff8e83c111ff7476c4accae27d99b849da39530 (commit) via c23948c8f4711e6d2dc8422bf904a912c2579d42 (commit) via 911692c715f658600d4c5c1a90aea3cc24b222f2 (commit) via db6dc9251330e953423cfeaba79825858f2bde41 (commit) via 8ff07c47f9d0c3cf13aaed05dfcc9607933ba014 (commit) via f247ee20888acb9dfb66f9e4455fbc14a2d41d36 (commit) via 878117ab1f342d0e04b7bbd9998accb30665bbee (commit) from 8cc6ce131926b49a2a6bd5e1b1268f98fa00fc78 (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 1de9a5cede92b4847a32966c6b087ca91b74d113 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Mar 17 09:01:58 2024 -0500 Fix compile warning on rig_debug messages https://github.com/Hamlib/Hamlib/issues/1525 diff --git a/rigs/kenwood/elecraft.c b/rigs/kenwood/elecraft.c index e349882cb..05b32835f 100644 --- a/rigs/kenwood/elecraft.c +++ b/rigs/kenwood/elecraft.c @@ -457,12 +457,12 @@ int verify_kenwood_id(RIG *rig, char *id) if (strcmp("017", idptr) != 0) { - rig_debug(RIG_DEBUG_VERBOSE, "%s: Rig (%s) is not a K2 or K3\n", __func__, id); + rig_debug(RIG_DEBUG_VERBOSE, "%s: Rig (%.4095s) is not a K2 or K3\n", __func__, id); // return -RIG_EPROTO; } else { - rig_debug(RIG_DEBUG_VERBOSE, "%s: Rig ID is %s\n", __func__, id); + rig_debug(RIG_DEBUG_VERBOSE, "%s: Rig ID is %.4095s\n", __func__, id); } return RIG_OK; diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index 41e21f89d..4ff44d1cb 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -270,7 +270,7 @@ int kenwood_transaction(RIG *rig, const char *cmdstr, char *data, if (datasize > 0 && datasize < (cmdstr ? strlen(cmdstr) : 0)) { rig_debug(RIG_DEBUG_WARN, - "%s called cmd=%s datasize=%d, datasize < cmd length?\n", __func__, + "%s called cmd=%.4095s datasize=%d, datasize < cmd length?\n", __func__, cmdstr ? cmdstr : "(NULL)", (int)datasize); } diff --git a/rigs/winradio/g313-posix.c b/rigs/winradio/g313-posix.c index 4ee963d7d..1fb7ac798 100644 --- a/rigs/winradio/g313-posix.c +++ b/rigs/winradio/g313-posix.c @@ -553,7 +553,7 @@ int g313_set_conf(RIG *rig, hamlib_token_t token, const char *val) case TOK_SHM_AUDIO: if (len > (FIFO_PATHNAME_SIZE - 1)) { - rig_debug(RIG_DEBUG_WARN, "%s: set audio_path %s is too long\n", __func__, val); + rig_debug(RIG_DEBUG_WARN, "%s: set audio_path %.4095s is too long\n", __func__, val); return -RIG_EINVAL; } @@ -566,7 +566,7 @@ int g313_set_conf(RIG *rig, hamlib_token_t token, const char *val) case TOK_SHM_IF: if (len > (FIFO_PATHNAME_SIZE - 1)) { - rig_debug(RIG_DEBUG_WARN, "%s: set if_path %s is too long\n", __func__, val); + rig_debug(RIG_DEBUG_WARN, "%s: set if_path %.4095s is too long\n", __func__, val); return -RIG_EINVAL; } @@ -579,7 +579,7 @@ int g313_set_conf(RIG *rig, hamlib_token_t token, const char *val) case TOK_SHM_SPECTRUM: if (len > (FIFO_PATHNAME_SIZE - 1)) { - rig_debug(RIG_DEBUG_WARN, "%s: set spectrum_path %s is too long\n", __func__, + rig_debug(RIG_DEBUG_WARN, "%s: set spectrum_path %.4095s is too long\n", __func__, val); return -RIG_EINVAL; } commit 0e572f631b8f4d75984f5b8f03b83ddce36eaf50 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Mar 17 08:53:53 2024 -0500 Update simft897.c diff --git a/simulators/simft897.c b/simulators/simft897.c index f473f96d9..892d39fde 100644 --- a/simulators/simft897.c +++ b/simulators/simft897.c @@ -129,7 +129,11 @@ again: case 0xF5: printf("FREQ\n"); break; - case 0x81: printf("VFO TOGGLE\n"); break; + case 0x81: + rx_vfo = rx_vfo == 0? 1: 0; + printf("VFO TOGGLE to %dE\n", rx_vfo); + break; + case 0x02: printf("SPLIT ON\n"); break; @@ -147,7 +151,14 @@ again: case 0xE7: printf("READ RX STATUS\n"); break; - case 0xF7: printf("READ TX STATUS\n"); break; + case 0xF7: + printf("READ TX STATUS\n"); + buf[0] = 0x01; + buf[1] = 0x40; + buf[2] = 0x74; + buf[3] = 0x00; + buf[4] = 0x03; n = write(fd, buf, 5); + break; case 0x03: printf("READ RX STATUS\n"); commit 84d5f367f6b6631114e12fcf84e9b949411b1e55 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Mar 15 22:51:19 2024 -0500 Fix compile warning on testrig.c diff --git a/tests/testrig.c b/tests/testrig.c index 212d356fa..e73a4cd79 100644 --- a/tests/testrig.c +++ b/tests/testrig.c @@ -80,7 +80,7 @@ int main(int argc, const char *argv[]) uint64_t levels = rig_get_caps_int(my_rig->caps->rig_model, RIG_CAPS_HAS_GET_LEVEL); - printf("HAS_GET_LEVEL=0x%8llx, SWR=%8llx,true=%d\n", levels, + printf("HAS_GET_LEVEL=0x%8lx, SWR=%8llx,true=%d\n", levels, levels & RIG_LEVEL_SWR, (levels & RIG_LEVEL_SWR) == RIG_LEVEL_SWR); char val[256]; commit 6d257841a6e79dcb16b0e9efe1c1a9007904255f Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Mar 15 16:46:14 2024 -0500 Fix some memory leaks in rigctl_parse.c diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index e92fb5660..5c6a24b76 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -1175,12 +1175,14 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, if (!input_line) { fprintf_flush(fout, "\n"); + free(rp_hist_buf); return (RIGCTL_PARSE_END); } /* Q or q to quit */ if (!(strncasecmp(input_line, "q", 1))) { + free(rp_hist_buf); return (RIGCTL_PARSE_END); } @@ -1189,12 +1191,14 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, { usage_rig(fout); fflush(fout); + free(rp_hist_buf); return (RIG_OK); } /* '#' for comment */ if (!(strncmp(input_line, "#", 1))) { + free(rp_hist_buf); return (RIG_OK); } @@ -1203,6 +1207,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, { fprintf(fout, "? for help, q to quit.\n"); fflush(fout); + free(rp_hist_buf); return (RIG_OK); } @@ -1227,6 +1232,7 @@ readline_repeat: { /* Oops! Invoke GDB!! */ fprintf_flush(fout, "\n"); + free(rp_hist_buf); return (RIGCTL_PARSE_END); } @@ -1286,6 +1292,7 @@ readline_repeat: { fprintf(stderr, "Valid multiple character command names contain alphanumeric characters plus '_'\n"); + free(rp_hist_buf); return (RIG_OK); } } @@ -1295,12 +1302,14 @@ readline_repeat: /* Single '\' entered, prompt again */ else if ((*parsed_input[0] == '\\') && (strlen(parsed_input[0]) == 1)) { + free(rp_hist_buf); return (RIG_OK); } /* Multiple characters but no leading '\' */ else { fprintf(stderr, "Precede multiple character command names with '\\'\n"); + free(rp_hist_buf); return (RIG_OK); } @@ -1317,6 +1326,7 @@ readline_repeat: fprintf(stderr, "Command '%c' not found!\n", cmd); } + free(rp_hist_buf); return (RIG_OK); } @@ -1342,6 +1352,7 @@ readline_repeat: if (!input_line) { fprintf_flush(fout, "\n"); + free(rp_hist_buf); return (RIGCTL_PARSE_END); } @@ -1350,6 +1361,7 @@ readline_repeat: { fprintf(fout, "? for help, q to quit.\n"); fflush(fout); + free(rp_hist_buf); return (RIG_OK); } @@ -1365,6 +1377,7 @@ readline_repeat: else { fprintf_flush(fout, "\n"); + free(rp_hist_buf); return (RIGCTL_PARSE_END); } } @@ -1444,6 +1457,7 @@ readline_repeat: { fprintf(fout, "? for help, q to quit.\n"); fflush(fout); + free(rp_hist_buf); return (RIG_OK); } @@ -1454,6 +1468,7 @@ readline_repeat: else { fprintf_flush(fout, "\n"); + free(rp_hist_buf); return (RIGCTL_PARSE_END); } } @@ -1506,6 +1521,7 @@ readline_repeat: { fprintf(fout, "? for help, q to quit.\n"); fflush(fout); + free(rp_hist_buf); return (RIG_OK); } @@ -1518,6 +1534,7 @@ readline_repeat: else { fprintf_flush(fout, "\n"); + free(rp_hist_buf); return (RIGCTL_PARSE_END); } } @@ -1572,6 +1589,7 @@ readline_repeat: { fprintf(fout, "? for help, q to quit.\n"); fflush(fout); + free(rp_hist_buf); return (RIG_OK); } @@ -1584,6 +1602,7 @@ readline_repeat: else { fprintf_flush(fout, "\n"); + free(rp_hist_buf); return (RIGCTL_PARSE_END); } } @@ -1638,6 +1657,7 @@ readline_repeat: { fprintf(fout, "? for help, q to quit.\n"); fflush(fout); + free(rp_hist_buf); return (RIG_OK); } @@ -1650,6 +1670,7 @@ readline_repeat: else { fprintf_flush(fout, "\n"); + free(rp_hist_buf); return (RIGCTL_PARSE_END); } } commit 8449ac3c436065cbca6886a7ad469d1229268fdf Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Mar 15 07:29:03 2024 -0500 Update simulators diff --git a/simulators/Makefile.am b/simulators/Makefile.am index 2ea8fee66..12c290686 100644 --- a/simulators/Makefile.am +++ b/simulators/Makefile.am @@ -8,7 +8,7 @@ DISTCLEANFILES = bin_PROGRAMS = -check_PROGRAMS = simelecraft simicgeneric simkenwood simyaesu simic9100 simic9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simic7300 simic7000 simic7100 simic7200 simatd578 simic905 simts450 simic7600 simic7610 simic705 simts950 simts990 simic7851 simftdx101 simxiegug90 simqrplabs simft818 simic275 simtrusdx simft1000 simtmd710 simts890 simxiegux108g simxiegux6100 simic910 simft450 +check_PROGRAMS = simelecraft simicgeneric simkenwood simyaesu simic9100 simic9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simic7300 simic7000 simic7100 simic7200 simatd578 simic905 simts450 simic7600 simic7610 simic705 simts950 simts990 simic7851 simftdx101 simxiegug90 simqrplabs simft818 simic275 simtrusdx simft1000 simtmd710 simts890 simxiegux108g simxiegux6100 simic910 simft450 simelecraftk4 simelecraft_SOURCES = simelecraft.c simkenwood_SOURCES = simkenwood.c diff --git a/simulators/simelecraft.c b/simulators/simelecraft.c index 9296d7dbc..10fbee1f2 100644 --- a/simulators/simelecraft.c +++ b/simulators/simelecraft.c @@ -35,6 +35,8 @@ int rxattenuatorB = 0; int keyspd = 20; int ai = 0; int dt = 0; +int modea = 2; +int modeb = 2; // ID 0310 == 310, Must drop leading zero typedef enum nc_rigid_e @@ -122,14 +124,13 @@ int main(int argc, char *argv[]) char *pbuf; int n; int fd = openPort(argv[1]); - int modea = 3, modeb = 3; int freqa = 14074000, freqb = 14073500; while (1) { buf[0] = 0; - if ((n = getmyline(fd, buf)) > 0) { printf("Cmd:%s, len=%d\n", buf, n); } + if ((n = getmyline(fd, buf)) > 0) { if (strstr(buf,"BW")) printf("Cmd:%s, len=%d\n", buf, n); } else {continue; } if (strcmp(buf, "RM5;") == 0) diff --git a/simulators/simelecraft.c b/simulators/simelecraftk4.c similarity index 93% copy from simulators/simelecraft.c copy to simulators/simelecraftk4.c index 9296d7dbc..1aa4cad2f 100644 --- a/simulators/simelecraft.c +++ b/simulators/simelecraftk4.c @@ -19,14 +19,14 @@ struct ip_mreq #define BUFSIZE 256 -float freqA = 14074000; -float freqB = 14074500; +int freqA = 14074000; +int freqB = 14074500; int afgain = 180; int rfgain = 190; int micgain = 30; int noiseblanker = 0; -int bandwidthA = 2200; -int bandwidthB = 2400; +int bandwidthA = 200; +int bandwidthB = 200; int ifshift = 0; int preampA = 0; int preampB = 0; @@ -35,6 +35,9 @@ int rxattenuatorB = 0; int keyspd = 20; int ai = 0; int dt = 0; +int modeA = 2; +int modeB = 2; +// int freqa = 14074000, freqb = 14073500; // ID 0310 == 310, Must drop leading zero typedef enum nc_rigid_e @@ -122,14 +125,12 @@ int main(int argc, char *argv[]) char *pbuf; int n; int fd = openPort(argv[1]); - int modea = 3, modeb = 3; - int freqa = 14074000, freqb = 14073500; while (1) { buf[0] = 0; - if ((n = getmyline(fd, buf)) > 0) { printf("Cmd:%s, len=%d\n", buf, n); } + if ((n = getmyline(fd, buf)) > 0) { if (strstr(buf,"BW0")) printf("Cmd:%s, len=%d\n", buf, n); } else {continue; } if (strcmp(buf, "RM5;") == 0) @@ -317,37 +318,37 @@ int main(int argc, char *argv[]) } else if (strcmp(buf, "MD;") == 0) { - SNPRINTF(buf, sizeof(buf), "MD%d;", modea); + SNPRINTF(buf, sizeof(buf), "MD%d;", modeA); WRITE(fd, buf, strlen(buf)); } else if (strcmp(buf, "MD$;") == 0) { - SNPRINTF(buf, sizeof(buf), "MD$%d;", modeb); + SNPRINTF(buf, sizeof(buf), "MD$%d;", modeB); WRITE(fd, buf, strlen(buf)); } else if (strncmp(buf, "MD", 2) == 0) { - if (buf[2] == '$') { sscanf(buf, "MD$%d;", &modeb); } - else { sscanf(buf, "MD%d;", &modea); } + if (buf[2] == '$') { sscanf(buf, "MD$%d;", &modeB); } + else { sscanf(buf, "MD%d;", &modeA); } } else if (strcmp(buf, "FA;") == 0) { - SNPRINTF(buf, sizeof(buf), "FA%011d;", freqa); + SNPRINTF(buf, sizeof(buf), "FA%011d;", freqA); WRITE(fd, buf, strlen(buf)); } else if (strcmp(buf, "FB;") == 0) { - SNPRINTF(buf, sizeof(buf), "FB%011d;", freqb); + SNPRINTF(buf, sizeof(buf), "FB%011d;", freqB); WRITE(fd, buf, strlen(buf)); } else if (strncmp(buf, "FA", 2) == 0) { - sscanf(buf, "FA%d", &freqa); + sscanf(buf, "FA%d", &freqA); } else if (strncmp(buf, "FB", 2) == 0) { - sscanf(buf, "FB%d", &freqb); + sscanf(buf, "FB%d", &freqB); } else if (strncmp(buf, "FR;", 3) == 0) { diff --git a/simulators/simic910.c b/simulators/simic910.c index 9038f09c8..4b539de50 100644 --- a/simulators/simic910.c +++ b/simulators/simic910.c @@ -28,7 +28,7 @@ struct ip_mreq #define BUFSIZE 256 -#define X25 +//#define X25 int civ_731_mode = 0; vfo_t current_vfo = RIG_VFO_A; commit 1045620313669792c24f49df570d66a596faf95b Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Mar 15 07:27:19 2024 -0500 Return error on bad read_icom_frame diff --git a/rigs/icom/frame.c b/rigs/icom/frame.c index 946040c73..5a4d58f60 100644 --- a/rigs/icom/frame.c +++ b/rigs/icom/frame.c @@ -301,6 +301,12 @@ again2: buf[0] = 0; frm_len = read_icom_frame(rp, buf, sizeof(buf)); + if (frm_len <= 0) + { + set_transaction_inactive(rig); + return frm_len; + } + if (frm_len > 4 && memcmp(buf, sendbuf, frm_len) == 0) { priv->serial_USB_echo_off = 0; commit b9e59f205e029147c0e9fac12cc457c47582a954 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Mar 14 22:43:10 2024 -0500 Fix compile error https://github.com/Hamlib/Hamlib/issues/1524 diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index 59c9b3663..e92fb5660 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -101,7 +101,7 @@ extern int read_history(); #define ARG_OUT (ARG_OUT1|ARG_OUT2|ARG_OUT3|ARG_OUT4|ARG_OUT5) static int chk_vfo_executed; -char rigctld_password[64]; +char rigctld_password[65]; int is_passwordOK; int is_rigctld; extern int lock_mode; // used by rigctld commit 6220da1eaf73d212b4d082035ef9de3ab8598522 Merge: f119f5976 96ec37a27 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Mar 14 17:10:39 2024 -0500 Merge branch 'master' of https://github.com/Hamlib/Hamlib commit f119f5976aaa49fd7eca4997fbbd7b38796b49bf Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Mar 14 17:09:36 2024 -0500 Fix build warning https://github.com/Hamlib/Hamlib/issues/1524 diff --git a/src/rig.c b/src/rig.c index f7bc8961f..3db6567e7 100644 --- a/src/rig.c +++ b/src/rig.c @@ -999,10 +999,10 @@ int HAMLIB_API rig_open(RIG *rig) { rig_debug(RIG_DEBUG_VERBOSE, "%s: cwd=%s\n", __func__, cwd); char *path = calloc(1, 4096); - extern char *settings_file; + extern char settings_file[4096]; const char *xdgpath = getenv("XDG_CONFIG_HOME"); - settings_file = "hamlib_settings"; + strcpy(settings_file,"hamlib_settings"); if (xdgpath) { commit 96ec37a276fd773b1a14f699bc033c4c2ef75a74 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Mar 14 17:09:36 2024 -0500 Fix build warning diff --git a/src/rig.c b/src/rig.c index f7bc8961f..3db6567e7 100644 --- a/src/rig.c +++ b/src/rig.c @@ -999,10 +999,10 @@ int HAMLIB_API rig_open(RIG *rig) { rig_debug(RIG_DEBUG_VERBOSE, "%s: cwd=%s\n", __func__, cwd); char *path = calloc(1, 4096); - extern char *settings_file; + extern char settings_file[4096]; const char *xdgpath = getenv("XDG_CONFIG_HOME"); - settings_file = "hamlib_settings"; + strcpy(settings_file,"hamlib_settings"); if (xdgpath) { commit 789d863f9779160ea6b204e84db1aaae29a702ae Merge: 5ab112213 c7665cb7d Author: Michael Black <mdb...@ya...> Date: Sun Mar 10 09:04:26 2024 -0500 Merge pull request #1523 from GeoBaltz/rp7 Convert all cache references to pointers commit c7665cb7d115acc12f57144c4f3431196241852f Author: George Baltz N3GB <Geo...@gm...> Date: Sat Mar 9 21:23:01 2024 -0500 All struct rig_cache referenced converted to pointers. diff --git a/tests/rigctlcom.c b/tests/rigctlcom.c index f1a285576..cadcb6904 100644 --- a/tests/rigctlcom.c +++ b/tests/rigctlcom.c @@ -665,7 +665,7 @@ static rmode_t ts2000_get_mode() { rmode_t mode; pbwidth_t width; - rig_get_mode(my_rig, vfo_fixup(my_rig, RIG_VFO_A, my_rig->state.cache.split), + rig_get_mode(my_rig, vfo_fixup(my_rig, RIG_VFO_A, CACHE(my_rig)->split), &mode, &width); kwidth = width; #if 0 @@ -802,8 +802,8 @@ static int handle_ts2000(void *arg) int p13 = 0; // P13(1) Tone dummy value for now int p14 = 0; // P14(2) Tone Freq dummy value for now int p15 = 0; // P15(1) Shift status dummy value for now - int retval = rig_get_freq(my_rig, vfo_fixup(my_rig, RIG_VFO_A, - my_rig->state.cache.split), &freq); + int retval = rig_get_freq(my_rig, vfo_fixup(my_rig, RIG_VFO_A, CACHE(my_rig)->split), + &freq); char response[64]; char *fmt = // cppcheck-suppress * @@ -815,8 +815,8 @@ static int handle_ts2000(void *arg) } mode = ts2000_get_mode(); - retval = rig_get_ptt(my_rig, vfo_fixup(my_rig, RIG_VFO_A, - my_rig->state.cache.split), &ptt); + retval = rig_get_ptt(my_rig, vfo_fixup(my_rig, RIG_VFO_A, CACHE(my_rig)->split), + &ptt); if (retval != RIG_OK) { @@ -900,8 +900,8 @@ static int handle_ts2000(void *arg) freq_t freq = 0; char response[32]; - int retval = rig_get_freq(my_rig, vfo_fixup(my_rig, RIG_VFO_A, - my_rig->state.cache.split), &freq); + int retval = rig_get_freq(my_rig, vfo_fixup(my_rig, RIG_VFO_A, CACHE(my_rig)->split), + &freq); if (retval != RIG_OK) { @@ -917,8 +917,8 @@ static int handle_ts2000(void *arg) { char response[32]; freq_t freq = 0; - int retval = rig_get_freq(my_rig, vfo_fixup(my_rig, RIG_VFO_B, - my_rig->state.cache.split), &freq); + int retval = rig_get_freq(my_rig, vfo_fixup(my_rig, RIG_VFO_B, CACHE(my_rig)->split), + &freq); if (retval != RIG_OK) { @@ -941,7 +941,7 @@ static int handle_ts2000(void *arg) { char response[32]; - rig_set_ptt(my_rig, vfo_fixup(my_rig, RIG_VFO_A, my_rig->state.cache.split), 0); + rig_set_ptt(my_rig, vfo_fixup(my_rig, RIG_VFO_A, CACHE(my_rig)->split), 0); SNPRINTF(response, sizeof(response), "RX0;"); return write_block2((void *)__func__, &my_com, response, strlen(response)); } @@ -972,8 +972,7 @@ static int handle_ts2000(void *arg) } else if (strcmp(arg, "TX;") == 0) { - return rig_set_ptt(my_rig, vfo_fixup(my_rig, RIG_VFO_A, - my_rig->state.cache.split), 1); + return rig_set_ptt(my_rig, vfo_fixup(my_rig, RIG_VFO_A, CACHE(my_rig)->split), 1); } else if (strcmp(arg, "AI0;") == 0) { @@ -987,13 +986,11 @@ static int handle_ts2000(void *arg) } else if (strcmp(arg, "FR0;") == 0) { - return rig_set_vfo(my_rig, vfo_fixup(my_rig, RIG_VFO_A, - my_rig->state.cache.split)); + return rig_set_vfo(my_rig, vfo_fixup(my_rig, RIG_VFO_A, CACHE(my_rig)->split)); } else if (strcmp(arg, "FR1;") == 0) { - return rig_set_vfo(my_rig, vfo_fixup(my_rig, RIG_VFO_B, - my_rig->state.cache.split)); + return rig_set_vfo(my_rig, vfo_fixup(my_rig, RIG_VFO_B, CACHE(my_rig)->split)); } else if (strcmp(arg, "FR;") == 0) { @@ -1013,8 +1010,8 @@ static int handle_ts2000(void *arg) } - if (vfo == vfo_fixup(my_rig, RIG_VFO_A, my_rig->state.cache.split)) { nvfo = 0; } - else if (vfo == vfo_fixup(my_rig, RIG_VFO_B, my_rig->state.cache.split)) { nvfo = 1; } + if (vfo == vfo_fixup(my_rig, RIG_VFO_A, CACHE(my_rig)->split)) { nvfo = 0; } + else if (vfo == vfo_fixup(my_rig, RIG_VFO_B, CACHE(my_rig)->split)) { nvfo = 1; } else { retval = -RIG_EPROTO; @@ -1029,7 +1026,7 @@ static int handle_ts2000(void *arg) else if (strcmp(arg, "FT;") == 0) { char response[32]; - vfo_t vfo, vfo_curr = vfo_fixup(my_rig, RIG_VFO_A, my_rig->state.cache.split); + vfo_t vfo, vfo_curr = vfo_fixup(my_rig, RIG_VFO_A, CACHE(my_rig)->split); split_t split; int nvfo = 0; int retval = rig_get_split_vfo(my_rig, vfo_curr, &split, &vfo); @@ -1042,8 +1039,8 @@ static int handle_ts2000(void *arg) } - if (vfo == vfo_fixup(my_rig, RIG_VFO_A, my_rig->state.cache.split)) { nvfo = 0; } - else if (vfo == vfo_fixup(my_rig, RIG_VFO_B, my_rig->state.cache.split)) { nvfo = 1; } + if (vfo == vfo_fixup(my_rig, RIG_VFO_A, CACHE(my_rig)->split)) { nvfo = 0; } + else if (vfo == vfo_fixup(my_rig, RIG_VFO_B, CACHE(my_rig)->split)) { nvfo = 1; } else { retval = -RIG_EPROTO; @@ -1092,9 +1089,8 @@ static int handle_ts2000(void *arg) { char response[32]; int valA; - int retval = rig_get_func(my_rig, vfo_fixup(my_rig, RIG_VFO_A, - my_rig->state.cache.split), RIG_FUNC_AIP, - &valA); + int retval = rig_get_func(my_rig, vfo_fixup(my_rig, RIG_VFO_A, CACHE(my_rig)->split), + RIG_FUNC_AIP, &valA); int valB; if (retval != RIG_OK) @@ -1112,9 +1108,8 @@ static int handle_ts2000(void *arg) return retval; } - retval = rig_get_func(my_rig, vfo_fixup(my_rig, RIG_VFO_B, - my_rig->state.cache.split), RIG_FUNC_AIP, - &valB); + retval = rig_get_func(my_rig, vfo_fixup(my_rig, RIG_VFO_B, CACHE(my_rig)->split), + RIG_FUNC_AIP, &valB); if (retval != RIG_OK) { @@ -1139,8 +1134,8 @@ static int handle_ts2000(void *arg) (char *)arg); } - retval = rig_set_func(my_rig, vfo_fixup(my_rig, RIG_VFO_A, - my_rig->state.cache.split), RIG_FUNC_AIP, valA); + retval = rig_set_func(my_rig, vfo_fixup(my_rig, RIG_VFO_A, CACHE(my_rig)->split), + RIG_FUNC_AIP, valA); if (retval != RIG_OK) { @@ -1149,8 +1144,8 @@ static int handle_ts2000(void *arg) return retval; } - retval = rig_set_func(my_rig, vfo_fixup(my_rig, RIG_VFO_B, - my_rig->state.cache.split), RIG_FUNC_AIP, valB); + retval = rig_set_func(my_rig, vfo_fixup(my_rig, RIG_VFO_B, CACHE(my_rig)->split), + RIG_FUNC_AIP, valB); if (retval != RIG_OK) { @@ -1515,7 +1510,7 @@ static int handle_ts2000(void *arg) } else if (strcmp(arg, "DC;") == 0) { - vfo_t vfo, vfo_curr = vfo_fixup(my_rig, RIG_VFO_A, my_rig->state.cache.split); + vfo_t vfo, vfo_curr = vfo_fixup(my_rig, RIG_VFO_A, CACHE(my_rig)->split); split_t split; char response[32]; int retval = rig_get_split_vfo(my_rig, vfo_curr, &split, &vfo); @@ -1534,7 +1529,7 @@ static int handle_ts2000(void *arg) } else if (strncmp(arg, "DC", 2) == 0) { - vfo_t vfo_curr = vfo_fixup(my_rig, RIG_VFO_A, my_rig->state.cache.split); + vfo_t vfo_curr = vfo_fixup(my_rig, RIG_VFO_A, CACHE(my_rig)->split); split_t split; int isplit; int retval; @@ -1565,15 +1560,13 @@ static int handle_ts2000(void *arg) } else if (strcmp(arg, "FT0;") == 0) { - return rig_set_split_vfo(my_rig, vfo_fixup(my_rig, RIG_VFO_A, - my_rig->state.cache.split), vfo_fixup(my_rig, - RIG_VFO_A, my_rig->state.cache.split), 0); + return rig_set_split_vfo(my_rig, vfo_fixup(my_rig, RIG_VFO_A, CACHE(my_rig)->split), + vfo_fixup(my_rig, RIG_VFO_A, CACHE(my_rig)->split), 0); } else if (strcmp(arg, "FT1;") == 0) { - return rig_set_split_vfo(my_rig, vfo_fixup(my_rig, RIG_VFO_B, - my_rig->state.cache.split), vfo_fixup(my_rig, - RIG_VFO_B, my_rig->state.cache.split), 0); + return rig_set_split_vfo(my_rig, vfo_fixup(my_rig, RIG_VFO_B, CACHE(my_rig)->split), + vfo_fixup(my_rig, RIG_VFO_B, CACHE(my_rig)->split), 0); } else if (strncmp(arg, "FA0", 3) == 0) { @@ -1583,16 +1576,14 @@ static int handle_ts2000(void *arg) if (mapa2b) { vfo = RIG_VFO_B; } sscanf((char *)arg + 2, "%"SCNfreq, &freq); - return rig_set_freq(my_rig, vfo_fixup(my_rig, vfo, - my_rig->state.cache.split), freq); + return rig_set_freq(my_rig, vfo_fixup(my_rig, vfo, CACHE(my_rig)->split), freq); } else if (strncmp(arg, "FB0", 3) == 0) { freq_t freq; sscanf((char *)arg + 2, "%"SCNfreq, &freq); - return rig_set_freq(my_rig, vfo_fixup(my_rig, RIG_VFO_B, - my_rig->state.cache.split), freq); + return rig_set_freq(my_rig, vfo_fixup(my_rig, RIG_VFO_B, CACHE(my_rig)->split), freq); } else if (strncmp(arg, "MD", 2) == 0) { commit aa0d83df959ec7dcd76546be45a72a17552db98f Author: George Baltz N3GB <Geo...@gm...> Date: Sat Mar 9 14:25:59 2024 -0500 Use pointers for all cache references in rigs/* diff --git a/rigs/kenwood/ts2000.c b/rigs/kenwood/ts2000.c index 817156439..a1e2bf999 100644 --- a/rigs/kenwood/ts2000.c +++ b/rigs/kenwood/ts2000.c @@ -692,7 +692,7 @@ static int ts2000_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) return RIG_OK; case RIG_LEVEL_STRENGTH: - if (rig->state.cache.ptt != RIG_PTT_OFF) + if (CACHE(rig)->ptt != RIG_PTT_OFF) { val->i = -9 * 6; break; @@ -879,7 +879,7 @@ static int ts2000_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) int raw_value; char read_vfo_num; - if (rig->state.cache.ptt == RIG_PTT_OFF) + if (CACHE(rig)->ptt == RIG_PTT_OFF) { val->f = 0; break; diff --git a/rigs/kenwood/ts480.c b/rigs/kenwood/ts480.c index 3cd3579c1..f9034ad7b 100644 --- a/rigs/kenwood/ts480.c +++ b/rigs/kenwood/ts480.c @@ -581,7 +581,7 @@ kenwood_ts480_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) return RIG_OK; case RIG_LEVEL_STRENGTH: - if (rig->state.cache.ptt != RIG_PTT_OFF) + if (CACHE(rig)->ptt != RIG_PTT_OFF) { val->i = -9 * 6; break; @@ -708,7 +708,7 @@ kenwood_ts480_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) { int raw_value; - if (rig->state.cache.ptt == RIG_PTT_OFF) + if (CACHE(rig)->ptt == RIG_PTT_OFF) { val->f = 0; break; @@ -2198,15 +2198,16 @@ int malachite_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) int malachite_set_freq(RIG *rig, vfo_t vfo, freq_t freq) { int retval; + struct rig_cache *cachep = CACHE(rig); ENTERFUNC; rig_debug(RIG_DEBUG_TRACE, "%s: freqMainA=%g, freq=%g\n", __func__, - rig->state.cache.freqMainA, freq); + cachep->freqMainA, freq); - if ((rig->state.cache.freqMainA < 400000000 && freq >= 400000000) - || (rig->state.cache.freqMainA >= 400000000 && freq < 400000000) - || rig->state.cache.freqMainA == 0) + if ((cachep->freqMainA < 400000000 && freq >= 400000000) + || (cachep->freqMainA >= 400000000 && freq < 400000000) + || cachep->freqMainA == 0) { // Malachite has a bug where it takes two freq set to make it work // under band changes -- so we just do this all the time diff --git a/rigs/kenwood/ts590.c b/rigs/kenwood/ts590.c index a995182e3..84903494c 100644 --- a/rigs/kenwood/ts590.c +++ b/rigs/kenwood/ts590.c @@ -240,7 +240,7 @@ static int ts590_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) if (!sf_fails) { SNPRINTF(cmd, sizeof(cmd), "SF%d%011.0f%c", vfo == RIG_VFO_A ? 0 : 1, - vfo == RIG_VFO_A ? rig->state.cache.freqMainA : rig->state.cache.freqMainB, + vfo == RIG_VFO_A ? CACHE(rig)->freqMainA : CACHE(rig)->freqMainB, c); retval = kenwood_transaction(rig, cmd, NULL, 0); } @@ -328,7 +328,7 @@ static int ts590_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) if (vfo == RIG_VFO_CURR) { vfo = rig->state.current_vfo; } - if (vfo == RIG_VFO_TX || vfo == RIG_VFO_RX) { vfo = vfo_fixup(rig, vfo, rig->state.cache.split); } + if (vfo == RIG_VFO_TX || vfo == RIG_VFO_RX) { vfo = vfo_fixup(rig, vfo, CACHE(rig)->split); } retval = RIG_OK; @@ -875,7 +875,7 @@ static int ts590_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) return RIG_OK; case RIG_LEVEL_STRENGTH: - if (rig->state.cache.ptt != RIG_PTT_OFF) + if (CACHE(rig)->ptt != RIG_PTT_OFF) { val->i = -9 * 6; break; @@ -1022,7 +1022,7 @@ static int ts590_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) int raw_value; - if (rig->state.cache.ptt == RIG_PTT_OFF) + if (CACHE(rig)->ptt == RIG_PTT_OFF) { val->f = 0; break; diff --git a/rigs/yaesu/ft100.c b/rigs/yaesu/ft100.c index e243f0341..47623ddeb 100644 --- a/rigs/yaesu/ft100.c +++ b/rigs/yaesu/ft100.c @@ -914,7 +914,7 @@ int ft100_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) { unsigned char cmd_index; - int split = rig->state.cache.split; + int split = CACHE(rig)->split; rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); @@ -971,8 +971,8 @@ int ft100_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) { int ret; - int split = rig->state.cache.split; - int ptt = rig->state.cache.ptt; + int split = CACHE(rig)->split; + int ptt = CACHE(rig)->ptt; FT100_METER_INFO ft100_meter; diff --git a/rigs/yaesu/ft1000d.c b/rigs/yaesu/ft1000d.c index bf99876ce..bb67ec7c0 100644 --- a/rigs/yaesu/ft1000d.c +++ b/rigs/yaesu/ft1000d.c @@ -4121,11 +4121,11 @@ static int ft1000_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) if (vfo == RIG_VFO_A) { - *freq = rig->state.cache.freqMainA; + *freq = CACHE(rig)->freqMainA; } else { - *freq = rig->state.cache.freqMainB; + *freq = CACHE(rig)->freqMainB; } return RIG_OK; @@ -4135,11 +4135,11 @@ static int ft1000_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) { if (vfo == RIG_VFO_A) { - *mode = rig->state.cache.modeMainA; + *mode = CACHE(rig)->modeMainA; } else { - *mode = rig->state.cache.modeMainB; + *mode = CACHE(rig)->modeMainB; } return RIG_OK; @@ -4153,7 +4153,7 @@ static int ft1000_get_vfo(RIG *rig, vfo_t *vfo) static int ft1000_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt) { - *ptt = rig->state.cache.ptt; + *ptt = CACHE(rig)->ptt; return RIG_OK; } diff --git a/rigs/yaesu/ft1000mp.c b/rigs/yaesu/ft1000mp.c index 7e171da55..084a9c7c4 100644 --- a/rigs/yaesu/ft1000mp.c +++ b/rigs/yaesu/ft1000mp.c @@ -932,11 +932,11 @@ static int ft1000mp_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) if (vfo == RIG_VFO_A) { - *freq = rig->state.cache.freqMainA; + *freq = CACHE(rig)->freqMainA; } else { - *freq = rig->state.cache.freqMainB; + *freq = CACHE(rig)->freqMainB; } return RIG_OK; @@ -1818,8 +1818,8 @@ static int ft1000mp_set_split_freq_mode(RIG *rig, vfo_t vfo, freq_t freq, if (retval == RIG_OK) { - rig->state.cache.freqMainB = freq; - rig->state.cache.modeMainB = mode; + CACHE(rig)->freqMainB = freq; + CACHE(rig)->modeMainB = mode; } RETURNFUNC(retval); @@ -1842,8 +1842,8 @@ static int ft1000mp_get_split_freq_mode(RIG *rig, vfo_t vfo, freq_t *freq, if (retval == RIG_OK) { - rig->state.cache.freqMainB = *freq; - rig->state.cache.modeMainB = *mode; + CACHE(rig)->freqMainB = *freq; + CACHE(rig)->modeMainB = *mode; } RETURNFUNC(retval); diff --git a/rigs/yaesu/ft736.c b/rigs/yaesu/ft736.c index 69cf8d2e6..68f62d43a 100644 --- a/rigs/yaesu/ft736.c +++ b/rigs/yaesu/ft736.c @@ -298,7 +298,7 @@ int ft736_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) { rig_debug(RIG_DEBUG_VERBOSE, "%s: called\n", __func__); - if (vfo == RIG_VFO_A || vfo == RIG_VFO_MAIN) { *freq = rig->state.cache.freqMainA; } + if (vfo == RIG_VFO_A || vfo == RIG_VFO_MAIN) { *freq = CACHE(rig)->freqMainA; } else { rig_get_cache_freq(rig, vfo, freq, NULL); } return RIG_OK; diff --git a/rigs/yaesu/ft747.c b/rigs/yaesu/ft747.c index 52f951565..74a45c7d0 100644 --- a/rigs/yaesu/ft747.c +++ b/rigs/yaesu/ft747.c @@ -579,18 +579,19 @@ int ft747_set_freq(RIG *rig, vfo_t vfo, freq_t freq) int ft747_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) { struct ft747_priv_data *p; + struct rig_cache *cachep = CACHE(rig); freq_t f; int ret; rig_debug(RIG_DEBUG_VERBOSE, "%s: called vfo=%s, freqMainA=%.0f, freqMainB=%.0f\n", __func__, - rig_strvfo(vfo), rig->state.cache.freqMainA, rig->state.cache.freqMainB); + rig_strvfo(vfo), cachep->freqMainA, cachep->freqMainB); - if (vfo == RIG_VFO_CURR) { vfo = rig->state.cache.vfo; } + if (vfo == RIG_VFO_CURR) { vfo = cachep->vfo; } - if (rig->state.cache.ptt == RIG_PTT_ON) + if (cachep->ptt == RIG_PTT_ON) { - *freq = RIG_VFO_B ? rig->state.cache.freqMainB : rig->state.cache.freqMainA; + *freq = RIG_VFO_B ? cachep->freqMainB : cachep->freqMainA; return RIG_OK; } @@ -1005,7 +1006,7 @@ static int ft747_get_update_data(RIG *rig) p = (struct ft747_priv_data *)rig->state.priv; rigport = RIGPORT(rig); - if (rig->state.cache.ptt == RIG_PTT_ON + if (CACHE(rig)->ptt == RIG_PTT_ON || !rig_check_cache_timeout(&p->status_tv, FT747_CACHE_TIMEOUT)) { return RIG_OK; diff --git a/rigs/yaesu/ft817.c b/rigs/yaesu/ft817.c index 950379e0b..4d239014f 100644 --- a/rigs/yaesu/ft817.c +++ b/rigs/yaesu/ft817.c @@ -988,16 +988,17 @@ static int ft817_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) { struct ft817_priv_data *p = (struct ft817_priv_data *) rig->state.priv; freq_t f1 = 0, f2 = 0; + struct rig_cache *cachep = CACHE(rig); int retries = RIGPORT(rig)->retry + 1; // +1 because, because 2 steps are needed even in best scenario rig_debug(RIG_DEBUG_VERBOSE, "%s: called, vfo=%s, ptt=%d, split=%d\n", __func__, - rig_strvfo(vfo), rig->state.cache.ptt, rig->state.cache.split); + rig_strvfo(vfo), cachep->ptt, cachep->split); // we can't query VFOB while in transmit and split mode - if (rig->state.cache.ptt && vfo == RIG_VFO_B && rig->state.cache.split) + if (cachep->ptt && vfo == RIG_VFO_B && cachep->split) { - *freq = rig->state.cache.freqMainB; + *freq = cachep->freqMainB; return RIG_OK; } @@ -2127,7 +2128,7 @@ static int ft817_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo) return n; } - rig->state.cache.split = split; + CACHE(rig)->split = split; return RIG_OK; diff --git a/rigs/yaesu/ft857.c b/rigs/yaesu/ft857.c index 935a0b8ab..ace4e7874 100644 --- a/rigs/yaesu/ft857.c +++ b/rigs/yaesu/ft857.c @@ -615,14 +615,14 @@ int ft857_get_vfo(RIG *rig, vfo_t *vfo) // Some 857's cannot read so we'll just return the cached value if we've seen an error if (ignore) { - *vfo = rig->state.cache.vfo; + *vfo = CACHE(rig)->vfo; return RIG_OK; } if (ft857_read_eeprom(rig, 0x0068, &c) < 0) /* get vfo status */ { ignore = 1; - *vfo = rig->state.cache.vfo; + *vfo = CACHE(rig)->vfo; return RIG_OK; } diff --git a/rigs/yaesu/ft990v12.c b/rigs/yaesu/ft990v12.c index 1d165ee76..00eed8314 100644 --- a/rigs/yaesu/ft990v12.c +++ b/rigs/yaesu/ft990v12.c @@ -701,7 +701,7 @@ int ft990v12_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) else { // M0EZP: Uni use cache -// *freq = vfo == RIG_VFO_A ? rig->state.cache.freqMainA : rig->state.cache.freqMainB; +// *freq = vfo == RIG_VFO_A ? CACHE(rig)->freqMainA : CACHE(rig)->freqMainB; return (RIG_OK); } } diff --git a/rigs/yaesu/ft991.c b/rigs/yaesu/ft991.c index 47d9d484f..70e3e8b5f 100644 --- a/rigs/yaesu/ft991.c +++ b/rigs/yaesu/ft991.c @@ -458,7 +458,7 @@ ft991_set_split_freq(RIG *rig, vfo_t vfo, freq_t tx_freq) return (rval); } - if (rig->state.cache.freqMainB == tx_freq) + if (CACHE(rig)->freqMainB == tx_freq) { rig_debug(RIG_DEBUG_TRACE, "%s: freq %.0f already set on VFOB\n", __func__, tx_freq); @@ -635,7 +635,7 @@ static int ft991_set_split_mode(RIG *rig, vfo_t vfo, rmode_t tx_mode, return -RIG_EINVAL; } - if (rig->state.cache.modeMainB == tx_mode) + if (CACHE(rig)->modeMainB == tx_mode) { rig_debug(RIG_DEBUG_TRACE, "%s: mode %s already set on VFOB\n", __func__, rig_strrmode(tx_mode)); diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 6242a8b40..5b5665543 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -936,17 +936,18 @@ int newcat_set_freq(RIG *rig, vfo_t vfo, freq_t freq) char target_vfo; int err; struct rig_caps *caps; + struct rig_cache *cachep = CACHE(rig); struct newcat_priv_data *priv; int special_60m = 0; vfo_t vfo_mode; ENTERFUNC; - if (newcat_60m_exception(rig, freq, rig->state.cache.modeMainA)) + if (newcat_60m_exception(rig, freq, cachep->modeMainA)) { // we don't try to set freq on 60m for some rigs since we must be in memory mode // and we can't run split mode on 60M memory mode either - if (rig->state.cache.split == RIG_SPLIT_ON) + if (cachep->split == RIG_SPLIT_ON) { rig_set_split_vfo(rig, RIG_VFO_A, RIG_VFO_A, RIG_SPLIT_OFF); } @@ -1029,16 +1030,16 @@ int newcat_set_freq(RIG *rig, vfo_t vfo, freq_t freq) // some rigs like FTDX101D cannot change non-TX vfo freq // but they can change the TX vfo - if ((is_ftdx101d || is_ftdx101mp) && rig->state.cache.ptt == RIG_PTT_ON) + if ((is_ftdx101d || is_ftdx101mp) && cachep->ptt == RIG_PTT_ON) { rig_debug(RIG_DEBUG_TRACE, "%s: ftdx101 check vfo OK, vfo=%s, tx_vfo=%s\n", __func__, rig_strvfo(vfo), rig_strvfo(rig->state.tx_vfo)); // when in split we can change VFOB but not VFOA - if (rig->state.cache.split == RIG_SPLIT_ON && target_vfo == '0') { return -RIG_ENTARGET; } + if (cachep->split == RIG_SPLIT_ON && target_vfo == '0') { return -RIG_ENTARGET; } // when not in split we can't change VFOA at all - if (rig->state.cache.split == RIG_SPLIT_OFF && target_vfo == '0') { return -RIG_ENTARGET; } + if (cachep->split == RIG_SPLIT_OFF && target_vfo == '0') { return -RIG_ENTARGET; } if (vfo != rig->state.tx_vfo) { return -RIG_ENTARGET; } } @@ -1077,7 +1078,7 @@ int newcat_set_freq(RIG *rig, vfo_t vfo, freq_t freq) and select the correct VFO before setting the frequency */ // Plus we can't do the VFO swap if transmitting - if (target_vfo == '1' && rig->state.cache.ptt == RIG_PTT_ON) { RETURNFUNC(-RIG_ENTARGET); } + if (target_vfo == '1' && cachep->ptt == RIG_PTT_ON) { RETURNFUNC(-RIG_ENTARGET); } SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "VS%c", cat_term); @@ -1147,7 +1148,7 @@ int newcat_set_freq(RIG *rig, vfo_t vfo, freq_t freq) if (newcat_valid_command(rig, "BS") && changing && !rig->state.disable_yaesu_bandselect // remove the split check here -- hopefully works OK - //&& !rig->state.cache.split + //&& !cachep->split // seems some rigs are problematic // && !(is_ftdx3000 || is_ftdx3000dm) // some rigs can't do BS command on 60M @@ -1331,8 +1332,8 @@ int newcat_set_freq(RIG *rig, vfo_t vfo, freq_t freq) // just drop through } - rig_debug(RIG_DEBUG_ERR, "%s: is_ft991=%d, rig->state.cache.split=%d, vfo=%s\n", - __func__, is_ft991, rig->state.cache.split, rig_strvfo(vfo)); + rig_debug(RIG_DEBUG_ERR, "%s: is_ft991=%d, CACHE(rig)->split=%d, vfo=%s\n", + __func__, is_ft991, cachep->split, rig_strvfo(vfo)); if (priv->band_index < 0) { priv->band_index = newcat_band_index(freq); } @@ -1340,7 +1341,7 @@ int newcat_set_freq(RIG *rig, vfo_t vfo, freq_t freq) // there are multiple bandstacks so we just use the 1st one if (is_ft991 && vfo == RIG_VFO_A && priv->band_index != newcat_band_index(freq)) { - if (rig->state.cache.split) + if (cachep->split) { // FT991/991A bandstack does not work in split mode // so for a VFOA change we stop split, change bands, change freq, enable split @@ -1493,16 +1494,17 @@ int newcat_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) int newcat_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) { struct newcat_priv_data *priv; + struct rig_cache *cachep = CACHE(rig); int err; rmode_t tmode; pbwidth_t twidth; - split_t split_save = rig->state.cache.split; + split_t split_save = cachep->split; priv = (struct newcat_priv_data *)rig->state.priv; ENTERFUNC; - if (newcat_60m_exception(rig, rig->state.cache.freqMainA, mode)) { RETURNFUNC(RIG_OK); } // we don't set mode in this case + if (newcat_60m_exception(rig, cachep->freqMainA, mode)) { RETURNFUNC(RIG_OK); } // we don't set mode in this case if (!newcat_valid_command(rig, "MD")) { @@ -1571,11 +1573,11 @@ int newcat_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) if (vfo == RIG_VFO_A || vfo == RIG_VFO_MAIN) { - rig->state.cache.modeMainA = mode; + cachep->modeMainA = mode; } else { - rig->state.cache.modeMainB = mode; + cachep->modeMainB = mode; } if (RIG_PASSBAND_NOCHANGE == width) { RETURNFUNC(err); } @@ -1705,7 +1707,7 @@ int newcat_set_vfo(RIG *rig, vfo_t vfo) rig_strvfo(vfo)); // we can't change VFO while transmitting - if (rig->state.cache.ptt == RIG_PTT_ON) { RETURNFUNC(RIG_OK); } + if (CACHE(rig)->ptt == RIG_PTT_ON) { RETURNFUNC(RIG_OK); } if (!newcat_valid_command(rig, command)) { @@ -2712,11 +2714,11 @@ int newcat_set_split_mode(RIG *rig, vfo_t vfo, rmode_t tx_mode, if (vfo == RIG_VFO_A || vfo == RIG_VFO_MAIN) { - rig->state.cache.modeMainA = tx_mode; + CACHE(rig)->modeMainA = tx_mode; } else { - rig->state.cache.modeMainB = tx_mode; + CACHE(rig)->modeMainB = tx_mode; } @@ -2758,8 +2760,8 @@ int newcat_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo) RETURNFUNC(err); } - if (newcat_60m_exception(rig, rig->state.cache.freqMainA, - rig->state.cache.modeMainA)) + if (newcat_60m_exception(rig, CACHE(rig)->freqMainA, + CACHE(rig)->modeMainA)) { rig_debug(RIG_DEBUG_VERBOSE, "%s: force set_split off since we're on 60M exception\n", __func__); @@ -4088,7 +4090,8 @@ static int band2rig(hamlib_band_t band) int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) { - struct rig_state *state = &rig->state; + struct rig_state *state = STATE(rig); + struct rig_cache *cachep = CACHE(rig); struct newcat_priv_data *priv = (struct newcat_priv_data *)rig->state.priv; int err; int i; @@ -4300,9 +4303,9 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) rmode_t exclude = RIG_MODE_CW | RIG_MODE_CWR | RIG_MODE_RTTY | RIG_MODE_RTTYR; - if ((rig->state.tx_vfo == RIG_VFO_A && (rig->state.cache.modeMainA & exclude)) - || (rig->state.tx_vfo == RIG_VFO_B && (rig->state.cache.modeMainB & exclude)) - || (rig->state.tx_vfo == RIG_VFO_C && (rig->state.cache.modeMainC & exclude))) + if ((rig->state.tx_vfo == RIG_VFO_A && (cachep->modeMainA & exclude)) + || (rig->state.tx_vfo == RIG_VFO_B && (cachep->modeMainB & exclude)) + || (rig->state.tx_vfo == RIG_VFO_C && (cachep->modeMainC & exclude))) { rig_debug(RIG_DEBUG_VERBOSE, "%s: rig cannot set MG in CW/RTTY modes\n", __func__); @@ -4906,7 +4909,7 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) if (is_ftdx101d || is_ftdx101mp) { rmode_t curmode = rig->state.current_vfo == RIG_VFO_A ? - rig->state.cache.modeMainA : rig->state.cache.modeMainB; + cachep->modeMainA : cachep->modeMainB; float valf = val.f / level_info->step.f; switch (curmode) @@ -4960,7 +4963,8 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) { - struct rig_state *state = &rig->state; + struct rig_state *state = STATE(rig); + struct rig_cache *cachep = CACHE(rig); struct newcat_priv_data *priv = (struct newcat_priv_data *)rig->state.priv; int err; int ret_data_len; @@ -5117,9 +5121,9 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) rmode_t exclude = RIG_MODE_CW | RIG_MODE_CWR | RIG_MODE_RTTY | RIG_MODE_RTTYR; - if ((rig->state.tx_vfo == RIG_VFO_A && (rig->state.cache.modeMainA & exclude)) - || (rig->state.tx_vfo == RIG_VFO_B && (rig->state.cache.modeMainB & exclude)) - || (rig->state.tx_vfo == RIG_VFO_C && (rig->state.cache.modeMainC & exclude))) + if ((rig->state.tx_vfo == RIG_VFO_A && (cachep->modeMainA & exclude)) + || (rig->state.tx_vfo == RIG_VFO_B && (cachep->modeMainB & exclude)) + || (rig->state.tx_vfo == RIG_VFO_C && (cachep->modeMainC & exclude))) { rig_debug(RIG_DEBUG_VERBOSE, "%s: rig cannot read MG in CW/RTTY modes\n", __func__); @@ -5502,7 +5506,7 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) if (is_ftdx101d || is_ftdx101mp) { rmode_t curmode = rig->state.current_vfo == RIG_VFO_A ? - rig->state.cache.modeMainA : rig->state.cache.modeMainB; + cachep->modeMainA : cachep->modeMainB; switch (curmode) { @@ -5544,7 +5548,7 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) if (is_ftdx101d || is_ftdx101mp) { rmode_t curmode = rig->state.current_vfo == RIG_VFO_A ? - rig->state.cache.modeMainA : rig->state.cache.modeMainB; + cachep->modeMainA : cachep->modeMainB; switch (curmode) { commit 609065775c49da604d38b46b3fee601910d06e5d Author: George Baltz N3GB <Geo...@gm...> Date: Fri Mar 8 10:28:03 2024 -0500 Update some of rigs/* to use pointer to cache Issue #536 diff --git a/rigs/dummy/dummy.c b/rigs/dummy/dummy.c index b61f24f8e..239a8a3d6 100644 --- a/rigs/dummy/dummy.c +++ b/rigs/dummy/dummy.c @@ -446,7 +446,7 @@ static int dummy_set_freq(RIG *rig, vfo_t vfo, freq_t freq) if (vfo == RIG_VFO_CURR) { vfo = priv->curr_vfo; } - if (vfo == RIG_VFO_CURR || vfo == RIG_VFO_TX) { vfo = vfo_fixup(rig, vfo, rig->state.cache.split); } + if (vfo == RIG_VFO_CURR || vfo == RIG_VFO_TX) { vfo = vfo_fixup(rig, vfo, CACHE(rig)->split); } // if needed for testing enable this to emulate a rig with 100hz resolution #if 0 @@ -534,6 +534,7 @@ static int dummy_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) { struct dummy_priv_data *priv = (struct dummy_priv_data *)rig->state.priv; channel_t *curr = priv->curr; + struct rig_cache *cachep = CACHE(rig); char buf[16]; ENTERFUNC; @@ -542,7 +543,7 @@ static int dummy_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) rig_debug(RIG_DEBUG_VERBOSE, "%s called: %s %s %s\n", __func__, rig_strvfo(vfo), rig_strrmode(mode), buf); - vfo = vfo_fixup(rig, vfo, rig->state.cache.split); + vfo = vfo_fixup(rig, vfo, cachep->split); if (vfo == RIG_VFO_CURR) { vfo = priv->curr_vfo; } @@ -587,7 +588,7 @@ static int dummy_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) RETURNFUNC(-RIG_EINVAL); } - vfo = vfo_fixup(rig, vfo, rig->state.cache.split); + vfo = vfo_fixup(rig, vfo, cachep->split); if (RIG_PASSBAND_NOCHANGE == width) { RETURNFUNC(RIG_OK); } @@ -1085,7 +1086,7 @@ static int dummy_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo) if (tx_vfo == RIG_VFO_NONE || tx_vfo == RIG_VFO_CURR) { tx_vfo = priv->curr_vfo; } - if (tx_vfo == RIG_VFO_CURR || tx_vfo == RIG_VFO_TX) { tx_vfo = vfo_fixup(rig, vfo, rig->state.cache.split); } + if (tx_vfo == RIG_VFO_CURR || tx_vfo == RIG_VFO_TX) { tx_vfo = vfo_fixup(rig, vfo, CACHE(rig)->split); } priv->split = split; priv->tx_vfo = tx_vfo; diff --git a/rigs/icom/ic7300.c b/rigs/icom/ic7300.c index 9536beb35..98d010e60 100644 --- a/rigs/icom/ic7300.c +++ b/rigs/icom/ic7300.c @@ -2218,12 +2218,13 @@ int ic9700_set_vfo(RIG *rig, vfo_t vfo) int ack_len = sizeof(ackbuf); int retval; int vfo_is_main_or_sub = (vfo == RIG_VFO_MAIN) || (vfo == RIG_VFO_SUB); + struct rig_cache *cachep = CACHE(rig); ENTERFUNC; rig_debug(RIG_DEBUG_VERBOSE, "%s: vfo=%s\n", __func__, rig_strvfo(vfo)); - if (rig->state.cache.satmode && !vfo_is_main_or_sub) + if (cachep->satmode && !vfo_is_main_or_sub) { // Translate VFO A/B to Main/Sub in satellite mode if (vfo == RIG_VFO_A) @@ -2247,7 +2248,7 @@ int ic9700_set_vfo(RIG *rig, vfo_t vfo) } else if (vfo == RIG_VFO_B) { - if (rig->state.cache.satmode) + if (cachep->satmode) { rig_debug(RIG_DEBUG_WARN, "%s: cannot switch to VFOB when in satmode\n", __func__); @@ -2267,7 +2268,7 @@ int ic9700_set_vfo(RIG *rig, vfo_t vfo) return retval; } - if (rig->state.cache.satmode && vfo == RIG_VFO_MAIN_B) + if (cachep->satmode && vfo == RIG_VFO_MAIN_B) { rig_debug(RIG_DEBUG_WARN, "%s: cannot switch to VFOB when in satmode\n", __func__); // we return RIG_OK anyways as this should just be a bad request @@ -2290,7 +2291,7 @@ int ic9700_set_vfo(RIG *rig, vfo_t vfo) return retval; } - if (rig->state.cache.satmode && vfo == RIG_VFO_SUB_B) + if (cachep->satmode && vfo == RIG_VFO_SUB_B) { rig_debug(RIG_DEBUG_WARN, "%s: cannot switch to VFOB when in satmode\n", __func__); // we return RIG_OK anyways as this should just be a bad request diff --git a/rigs/icom/ic821h.c b/rigs/icom/ic821h.c index e8f4d33ea..3b6000f7a 100644 --- a/rigs/icom/ic821h.c +++ b/rigs/icom/ic821h.c @@ -64,10 +64,10 @@ int ic821h_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo) if (tx_vfo == RIG_VFO_MAIN) { - rig->state.cache.satmode = + CACHE(rig)->satmode = split; // we emulate satmode of other rigs since we apparently can't query rig_debug(RIG_DEBUG_TRACE, "%s: tx_vfo==MAIN so assuming sat mode=%d\n", - __func__, rig->state.cache.satmode); + __func__, CACHE(rig)->satmode); rig->state.tx_vfo = split == RIG_SPLIT_ON ? RIG_VFO_SUB : RIG_VFO_MAIN; // the IC821 seems to be backwards in satmode -- setting Main select Sub and vice versa retval = rig_set_vfo(rig, RIG_VFO_SUB); diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index a5894f681..921259642 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -934,7 +934,8 @@ static vfo_t icom_current_vfo(RIG *rig) freq_t freq_current, freq_other, f... [truncated message content] |
From: n0nb <n0...@us...> - 2024-02-20 13:11:24
|
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 8cc6ce131926b49a2a6bd5e1b1268f98fa00fc78 (commit) via 91ec3afcda5769d3d39f6684fa205e8a24130fc0 (commit) via 1657a0e673e37dc5c32b613b4f51d260998a1575 (commit) via 81dae00ea00be7c3976b564a320453c801e9fdd1 (commit) via 0902b32c457b9e6a2a879e6ecd550891a0560357 (commit) via 34d8b0eec3714a34fa466abbfd2c8fff374784f2 (commit) via 1ea597b6e133aa96c68d76e0bf0b229059ec22d3 (commit) via 4cadea95f8aa5e8c4ab23a6a393d38b96b8a1af6 (commit) via 7caef5398e7bda1460cf21e8a8ccc5a40856f9bb (commit) via 5d83ac767b0288498608134648b7802c6946116d (commit) via c471884122de94fa69fd76671eb8cb6ce9b932a8 (commit) via 47fcf999f063214027be7bbf9ac2115ba759cf2e (commit) via f12d653f6ceaa4dadeb17278239a73092d8a9802 (commit) via e1f23429821777b938a69b11f7589e5c0c191e51 (commit) via 972d792a4f82f010c9f8ef77e86ddc364dba7be1 (commit) via 2b22a42e732b586e64013fc1f88626adcec315d1 (commit) via 45e097d3a46e305bb3bf8c2ca46a1b8dbd7cd40f (commit) via 59aaf1f4c30e9efa729e9b3b5048c8d2e86a4225 (commit) via 59217b560ac1f65e642243f1e0196672c2d5d0de (commit) via 8d33869ca275e8445beb9a93fc51183d0296ac1e (commit) via a8cfff8bd34c1f3fb531bafae27f026760b740c1 (commit) via 916049b0a5fe790b1a292c75c44f7f31a9eb6385 (commit) via 6844722faab84e4cca03f405e91c5d6501ca9f6c (commit) via f5d6be3b3efe9781763df903d0c062e24b52e143 (commit) via 59e4ba1cdcd3f8789803ffbeac691cf79d71cd6c (commit) via 64c470a4e7e035a90e6b566eb95b3f8c68fdf48b (commit) via 3dd8c97b54ac58baed2e1cbd2c1cd55a53f200ff (commit) via e26e6cd7f28751448e7ba26a7f8c838c8dcb42b3 (commit) via 12552bff64b541f70ed1aee06e311e2b2a6716d6 (commit) via a2abc2541673e29caa3d9d44a8f52dff867facae (commit) via eb94ce2b940bea23e4be88751402e6728a83874d (commit) via 464eea58e720000b90dd19fe06f684d2a1c71fac (commit) via c7ab5c44afc0cb6f728860a2e25a8ad7aee25811 (commit) via 1e552b557fe99f9aa04b63dc4af01f81c0cade79 (commit) via f777179bc88b272f0bb0463a07c8f9f15662927b (commit) via 23d5d5324831ef710cebffbc23cc3dfe767cf4c4 (commit) via 02f0ad067a67453329e6e7690cee59f3f149f403 (commit) via 4a1fa678ea8adb0746e258180edc2ecadc0bf26f (commit) via b1d85e5aa1f9757a2afaa0b4ce00ebebb17bc4e2 (commit) via 1532a7d8dc4baea6b00ceb6868d572e66c69d44d (commit) via 3eb41c6400e5729e328c6c599a0b7fc6de4be630 (commit) via 96ee58436a9c3d029159fb6bdbe0db827bfc003a (commit) via bf8bf51bf404e8034088b8ef2dc20ad81ec45911 (commit) via 6bfccb3e929971185bf2f21e74d4a3a9af5a5454 (commit) via d42d505d226a0b8a64b1b0288da1488c3e34563f (commit) via 1093349564d1f65a41356d19db87f957a7f767ef (commit) via d77b0df70267fd086b42cbd180f16fb7ca5f6548 (commit) via 8757271437f39980ca738c8c1a9026dcc269c82d (commit) via ab8835e87e4b1578e925ee3d1e45bb6cf276727d (commit) via 9bfb0f5f7179582b1a62683b2520cb795a69dc02 (commit) via dab7cf1ee690c397fa9409c290df95a8e643acd8 (commit) via 904dfef9b96e8c0e2b61f600d27cbbfdb72231f4 (commit) via 0adaebd100ce58017f6d5fa7fc169de05ea7a58d (commit) via 09a90758444ac020a6a7c36fe4a5098fb82739ef (commit) via ade62105a30e978b371929b15b54b35260bcc331 (commit) via cff4faba533e84f66b29ef3117bd09b6e5ef0eeb (commit) via 697c0909350ecfcf28cfa80fe5e943c991976d12 (commit) via b6dc6110a61e53b91f2a44a41eb1857246b425d9 (commit) via 4ef5bd414293e310d2e161232adc3cae88d6b070 (commit) via a03a79c864148458339e2ec3d027beeab818d1b4 (commit) via 7436e4395f99614eb5a58d50cc5c9cf2474c80c0 (commit) via 7310f370c1ce7998909112ea91b8d61689f21da0 (commit) via d9bae6f46f4a9da3f579c4f247cb647cd5ba4b69 (commit) via 434f399d12f4452cd932adf75a1689984a366e84 (commit) via 68fca2c73d27bc91ba6b9ae0ba337ac7b0353b9b (commit) via 75a4d324de2e4cd6da9e792493661fb88451d165 (commit) via c969405c2602062751c40a2a9b3a8ce777fd54db (commit) via 270786320925964254921c7eb2ae6390a78c6dac (commit) via 35e49ffdfce5e17aacf84a48ab2fa93de1618d05 (commit) via 4fe6ea7cc4ce350e41b0139046ebe9cbedc152e3 (commit) via fff1bbc8cd14d74ab73996400339262800190b23 (commit) via b4ec8a427cd8e29ccea245570708a7af55337ef9 (commit) via 25a8d6586055da9ede363112ca0106716a450573 (commit) via 1ea95c94ee305f1a5cbf182dd773ea22413f8d4b (commit) via 9f6ca845722ca17a2b1deb89322b2e5f1d4257f2 (commit) via 8d59c9302f0fad49f6d8573f4015c1cc9f627242 (commit) via 793bc1a0dc4169f5edd5547e5600cc2e9174af3f (commit) via d29caa7cad63c7b8a74d0e2ec0308747dc77eb5d (commit) via 267f30d16b1fbeb338bbe9b3c5bf9036696d1552 (commit) via 6ef2c457e4f9eb1d4bb50f80083718503be68816 (commit) via 2efc2069f54a31f9826099cc03e57261b158f11a (commit) via 703d86a025821cb1ae87bef5e238eb0ccd3efaaf (commit) via c8e33010f672a6b5e7ef107817836d6319b2775e (commit) via 7fba4c012da025798ec81fed5d1f11f8515f2d84 (commit) via 10c002c13fbcad28aa611970b2c62428ff6df938 (commit) via a0f8251b64921be57edc0d391c99e2cd08655355 (commit) via 9ed13add011e41f76eb76624afa46e7a4da45b41 (commit) via fabfe61a457e2d184a855d77d057089d2bb143b2 (commit) via d8a9968fac650bd8402fdd21cf380c10a72c868b (commit) via 1b5fbc1d8b21d73f4e4e74d559ee278257823f0c (commit) via a4ff5a3e601ca7d1b3671ac575addfe47fcab2f5 (commit) via 83fa83586490976f2cfa71fd7974fb2e6b403ecf (commit) via ceebaeae35935d72dd1d2948098cd117f191cc7d (commit) via 0145588fd9cd58c08b1875a12ebacaeda11fa492 (commit) via 17b93213108e199e1217cf0f34696c9e4ef9569c (commit) via 75079d40a88651ca48298f332bc3b18c1b9757f4 (commit) via 5ad803d90cf898891f9c83c2bdbffa77006227ad (commit) via e42bb719b9692027addb0912c38508d0f1960d4e (commit) via a703c77c2d5225401c0523f5311da79da933319b (commit) via 74b07528982fc58c0b4c3ca1a8b2bf401794da8a (commit) via a52d0c5931f1e3b3d860f031c3bf146390f1376d (commit) via efeba2dfe0759704182e0072d35dd09a1e05b100 (commit) via 75cf467c1d2d314df747247efee28af5130d0b03 (commit) via 1bb469f90fcd04d27bd3ccac683e48fda3aae48d (commit) via 354606f46d6695978fea45efd1ef69caaeed8367 (commit) via 046f3b849caa9af7bf4828c7c569e873d4ebb22c (commit) via 05033171c379123b2af6e29bd9f586f77d5fdcd3 (commit) via 67aee821330f5374353b51cb1f7b0c02712a872f (commit) via e62dcd0b4a6e5acd500262187192f1b78de7c57f (commit) via 2cc68f4773c274d146083d74ac34a8b77658808d (commit) via c4733d9dc3fb4207b62fc5e7de18793bb7a75a4b (commit) via 66218e57f7179568a68b05d70fb17245f3868b6e (commit) via e4e12f3ce72d61799680b2648b9b3e4cf642e7cb (commit) via 1dfd17cc187f32ada47118b6d0be51a02b2a43a8 (commit) via 8bb5bcefb92a60751f8b7f198087f7fa0d1bac0b (commit) via 7d0c737e961cbb0103960a8c376c756952e18020 (commit) via 77aa5ddb551f66f064c5f8a6031fc73622ce8ed1 (commit) via eff0c7b6362bf13de8e65a31fd92c6cf95dbbe42 (commit) via 4b3a7514caa04e95ce0fca28ce6512f81f85fecf (commit) via d3917736227107af9c0d83a92f9a1042e1ad7552 (commit) via eb7634abfbc712ffdb6f837e4d50d97411267e73 (commit) via 051e671bfaad6b1450b5a35e4441d723d3c44e23 (commit) via 2358cba6a4df6172e560bbcccda5e1bde7706c1b (commit) via 1cc08d2f00a4d980e7ef120ed92ee22a9024cad4 (commit) via 3a414c3221630c0e2786b2809f340f9a222bb0e9 (commit) via 93b61d2c5e035eecd41772d010a072eb3bb71932 (commit) via 0dea8ed8bb276e59be05708378a2ffab7df8f02a (commit) via 8185a3562b5d3109d2c1c15cfec57e143458c140 (commit) via 00cb0eccdc666e101b64cb393891863522ca5d9a (commit) via 7b341a2ad6e9bf7488ecc75a57955c21869de73f (commit) via 7d5f540b9c367d2c3e7e6ef2f9b154e425c5fe44 (commit) via b78fa43b56855ee4b9ff913df501b5c3d5ef9c90 (commit) via dd974a25369a95f82316897071c5836b128908d6 (commit) via e2e723ec6098da211b907b5c1ee6c1fd11dc0b13 (commit) via 4a926ec503b6fc9b5148f0e7db4335393fe466e5 (commit) via 82f2b10275ccbea508f98d8c55d194f1cec50ada (commit) via c90c675add10dd2d32c371c85b4b8b9f4ad80f3d (commit) via 0ece468b49c9f5db72483fe87d366f55b557f346 (commit) via 4fa61a9a32a5666807a66135881887cd298cc9b8 (commit) via 89abbfeb3ae19d18894fd80d4e108576cb784cfe (commit) via f89e0f0388b339ae14614ada3a6fe3e3e678bd7b (commit) via 8ab8aafe4836288a1da736315b77ace5146d572c (commit) from 761f1d3b0024c4989935207a9e731c57eb2ccd8c (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 8cc6ce131926b49a2a6bd5e1b1268f98fa00fc78 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Feb 19 11:46:16 2024 -0600 Fix rigctlcom.c for Icom rigs and those that don't have get_vfo diff --git a/tests/rigctlcom.c b/tests/rigctlcom.c index 6de847c38..38422d742 100644 --- a/tests/rigctlcom.c +++ b/tests/rigctlcom.c @@ -667,7 +667,9 @@ static rmode_t ts2000_get_mode() pbwidth_t width; rig_get_mode(my_rig, vfo_fixup(my_rig, RIG_VFO_A, my_rig->state.cache.split), &mode, &width); - + rig_debug(RIG_DEBUG_ERR, "%s(%d): width=%ld\n", __func__, __LINE__, width); + kwidth = width; +#if 0 // Perhaps we should emulate a rig that has PKT modes instead?? int kwidth_ssb[] = { 10, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000 }; int kwidth_am[] = { 10, 100, 200, 500 }; @@ -704,6 +706,7 @@ static rmode_t ts2000_get_mode() default: mode = 0; break; } +#endif return mode; } @@ -765,6 +768,7 @@ static int handle_ts2000(void *arg) int retval = rig_get_freq(my_rig, vfo_fixup(my_rig, RIG_VFO_A, my_rig->state.cache.split), &freq); char response[64]; + rig_debug(RIG_DEBUG_ERR, "%s(%d):\n", __func__, __LINE__); char *fmt = // cppcheck-suppress * "IF%011"PRIll"%04d+%05d%1d%1d%1d%02d%1d%1"PRIll"%1d%1d%1d%1d%02d%1d;"; @@ -774,15 +778,19 @@ static int handle_ts2000(void *arg) return retval; } + rig_debug(RIG_DEBUG_ERR, "%s(%d):\n", __func__, __LINE__); mode = ts2000_get_mode(); + rig_debug(RIG_DEBUG_ERR, "%s(%d):\n", __func__, __LINE__); retval = rig_get_ptt(my_rig, vfo_fixup(my_rig, RIG_VFO_A, my_rig->state.cache.split), &ptt); + rig_debug(RIG_DEBUG_ERR, "%s(%d):\n", __func__, __LINE__); if (retval != RIG_OK) { return retval; } + rig_debug(RIG_DEBUG_ERR, "%s(%d):\n", __func__, __LINE__); // we need to know split status -- don't care about the vfo retval = rig_get_split_vfo(my_rig, RIG_VFO_CURR, &split, &vfo); @@ -791,13 +799,19 @@ static int handle_ts2000(void *arg) return retval; } + rig_debug(RIG_DEBUG_ERR, "%s(%d):\n", __func__, __LINE__); retval = rig_get_vfo(my_rig, &vfo); if (retval != RIG_OK) { + vfo = RIG_VFO_A; +#if 0 // so we work with rigs (like Icom) that have no get_vfo + rig_debug(RIG_DEBUG_ERR, "%s(%d):\n", __func__, __LINE__); return retval; +#endif } + rig_debug(RIG_DEBUG_ERR, "%s(%d):\n", __func__, __LINE__); switch (vfo) { case RIG_VFO_A: @@ -818,6 +832,7 @@ static int handle_ts2000(void *arg) rig_debug(RIG_DEBUG_ERR, "%s: unexpected vfo=%d\n", __func__, vfo); } + rig_debug(RIG_DEBUG_ERR, "%s(%d):\n", __func__, __LINE__); SNPRINTF(response, sizeof(response), fmt, @@ -836,10 +851,12 @@ static int handle_ts2000(void *arg) p14, p15); + rig_debug(RIG_DEBUG_ERR, "%s(%d):\n", __func__, __LINE__); return write_block2((void *)__func__, &my_com, response, strlen(response)); } else if (strcmp(arg, "MD;") == 0) { + rig_debug(RIG_DEBUG_ERR, "%s(%d):\n", __func__, __LINE__); rmode_t mode = ts2000_get_mode(); char response[32]; commit 91ec3afcda5769d3d39f6684fa205e8a24130fc0 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Feb 19 10:42:25 2024 -0600 Fix get_vfo for Icom rigs in rigctlcom.c diff --git a/tests/rigctlcom.c b/tests/rigctlcom.c index 39692f2c2..6de847c38 100644 --- a/tests/rigctlcom.c +++ b/tests/rigctlcom.c @@ -962,9 +962,12 @@ static int handle_ts2000(void *arg) if (retval != RIG_OK) { + vfo = RIG_VFO_A; +#if 0 // so we work with rigs (like Icom) that have no get_vfo rig_debug(RIG_DEBUG_ERR, "%s: get vfo failed: %s\n", __func__, rigerror(retval)); return retval; +#endif } commit 1657a0e673e37dc5c32b613b4f51d260998a1575 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Feb 19 10:34:15 2024 -0600 Fix rigctlcom.c diff --git a/tests/rigctlcom.c b/tests/rigctlcom.c index 023952baa..39692f2c2 100644 --- a/tests/rigctlcom.c +++ b/tests/rigctlcom.c @@ -493,14 +493,16 @@ int main(int argc, char *argv[]) exit(2); } +#if 0 retcode = -RIG_ENIMPL; -// retcode = set_conf(my_rig, conf_parms); + retcode = set_conf(my_rig, conf_parms); if (retcode != RIG_OK) { fprintf(stderr, "Config parameter error: %s\n", rigerror(retcode)); exit(2); } +#endif if (my_model > 5 && !rig_file) { commit 81dae00ea00be7c3976b564a320453c801e9fdd1 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Feb 18 22:25:19 2024 -0600 Fix ID read for Xiegu rigs and add x25x26 possible https://github.com/Hamlib/Hamlib/issues/1499 diff --git a/rigs/icom/xiegu.c b/rigs/icom/xiegu.c index 5ca0fb316..a4ba8da57 100644 --- a/rigs/icom/xiegu.c +++ b/rigs/icom/xiegu.c @@ -131,6 +131,32 @@ static int x108g_rig_open(RIG *rig) RETURNFUNC(RIG_OK); } +int xiegu_rig_open(RIG *rig) +{ + int retval; + unsigned char id[4]; + int id_len = 2; + int cmd = 0x19; + int subcmd = 0x00; + unsigned short iid; + retval = icom_transaction(rig, cmd, subcmd, NULL, 0, id, &id_len); + + if (retval == RIG_OK) + { + iid = (((int)id[2]) << 8) + id[3]; + rig_debug(RIG_DEBUG_VERBOSE, "%s: Xiegu Radio ID=0x%04x\n", __func__, iid); + switch(iid) + { + case 0x0090: rig_debug(RIG_DEBUG_VERBOSE, "%s: Xiegu model %s\n", __func__, "G90/G90S");break; + case 0x0106: rig_debug(RIG_DEBUG_VERBOSE, "%s: Xiegu model %s\n", __func__, "G106/G106C");break; + case 0x6100: rig_debug(RIG_DEBUG_VERBOSE, "%s: Xiegu model %s\n", __func__, "X6100");break; + default: rig_debug(RIG_DEBUG_VERBOSE, "%s: Xiegu model %s\n", __func__, "Unknown");break; + } + } + + return icom_rig_open(rig); +} + /* * taken from IC-7000 rig capabilities. * @@ -328,7 +354,7 @@ static struct icom_priv_caps x6100_priv_caps = 0, /* no XCHG */ ic7200_ts_sc_list, .x25x26_always = 0, - .x25x26_possibly = 0, + .x25x26_possibly = 1, .x1cx03_always = 0, .x1cx03_possibly = 0, .x1ax03_supported = 0, @@ -341,7 +367,7 @@ struct rig_caps x6100_caps = RIG_MODEL(RIG_MODEL_X6100), .model_name = "X6100", .mfg_name = "Xiegu", - .version = BACKEND_VER ".4", + .version = BACKEND_VER ".5", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -463,7 +489,7 @@ struct rig_caps x6100_caps = .priv = (void *) &x6100_priv_caps, .rig_init = icom_init, .rig_cleanup = icom_cleanup, - .rig_open = icom_rig_open, + .rig_open = xiegu_rig_open, .rig_close = icom_rig_close, .set_freq = icom_set_freq, @@ -512,25 +538,6 @@ struct rig_caps x6100_caps = .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS }; -int g90_rig_open(RIG *rig) -{ - int retval; - unsigned char id[2]; - int id_len = 2; - int cmd = 0x19; - int subcmd = 0x1d; - short iid; - retval = icom_transaction(rig, cmd, subcmd, NULL, 0, id, &id_len); - - if (retval == RIG_OK) - { - memcpy(&iid, id, 2); - rig_debug(RIG_DEBUG_VERBOSE, "Xiegu Radio ID=0x%04x\n", iid); - } - - return icom_rig_open(rig); -} - struct rig_caps g90_caps = { RIG_MODEL(RIG_MODEL_G90), @@ -658,7 +665,7 @@ struct rig_caps g90_caps = .priv = (void *)& x108g_priv_caps, .rig_init = icom_init, .rig_cleanup = icom_cleanup, - .rig_open = g90_rig_open, + .rig_open = xiegu_rig_open, .rig_close = icom_rig_close, .set_freq = icom_set_freq, @@ -833,7 +840,7 @@ struct rig_caps x5105_caps = .priv = (void *)& x108g_priv_caps, .rig_init = icom_init, .rig_cleanup = icom_cleanup, - .rig_open = icom_rig_open, + .rig_open = xiegu_rig_open, .rig_close = icom_rig_close, .set_freq = icom_set_freq, commit 0902b32c457b9e6a2a879e6ecd550891a0560357 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Feb 16 17:05:07 2024 -0600 Remove debug statement causing warning on mingw64 diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index 5ca4ffac8..e23cafce1 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -2290,8 +2290,8 @@ static int icom_set_mode_x26(RIG *rig, vfo_t vfo, rmode_t mode, // Skip filter selection, because at least IC-7300 has a bug defaulting to filter 2 when changing mode // Tested on IC-7300 and IC-9700 buf[2] = priv->filter; - rig_debug(RIG_DEBUG_TRACE, "%s: mode=%ld, filters usbd=%d, usb=%d, cw=%d\n", - __func__, mode, priv->filter_usbd, priv->filter_usb, priv->filter_cw); + //rig_debug(RIG_DEBUG_TRACE, "%s: mode=%ld, filters usbd=%d, usb=%d, cw=%d\n", + // __func__, mode, priv->filter_usbd, priv->filter_usb, priv->filter_cw); if (priv->filter_usbd > 0 && (mode == RIG_MODE_PKTUSB || mode == RIG_MODE_PKTLSB)) commit 34d8b0eec3714a34fa466abbfd2c8fff374784f2 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Feb 16 09:17:50 2024 -0600 Update simts590.c diff --git a/simulators/simts590.c b/simulators/simts590.c index 4f6f350a1..ee2db59b6 100644 --- a/simulators/simts590.c +++ b/simulators/simts590.c @@ -115,7 +115,7 @@ int main(int argc, char *argv[]) { printf("%s\n", buf); hl_usleep(mysleep * 1000); - pbuf = "RM5100000;"; + pbuf = "RM50005;"; WRITE(fd, pbuf, strlen(pbuf)); } commit 1ea597b6e133aa96c68d76e0bf0b229059ec22d3 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Feb 15 09:25:39 2024 -0600 Move time_t test later so 32-bit check of 64-bit functions can work https://github.com/Hamlib/Hamlib/issues/1478 diff --git a/src/misc.c b/src/misc.c index bbab4946f..18723f8eb 100644 --- a/src/misc.c +++ b/src/misc.c @@ -2826,6 +2826,7 @@ char *date_strget(char *buf, int buflen, int localtime) struct tm result = { 0, 0, 0, 0, 0, 0, 0, 0, 0}; int mytimezone; + // 2038 failure here for 32-bit time_t t = time(NULL); if (localtime) @@ -3068,12 +3069,6 @@ int rig_test_2038(RIG *rig) __MSVCRT_VERSION__); #endif - if (sizeof(time_t) == 4) - { - rig_debug(RIG_DEBUG_TRACE, "%s: ctime is null, 2038 test failed\n", __func__); - return 1; - } - int failed = 0; #if defined(__MSVCRT_VERSION__) x = (__time64_t)((1UL << 31) - 1); @@ -3082,12 +3077,26 @@ int rig_test_2038(RIG *rig) if (strlen(s) == 0) { failed = 1; } + rig_debug(RIG_DEBUG_VERBOSE, "%s: MSVCRT 2038 test = 0x%08lx:%s\n", __func__, x, + s); + #else - x = (time_t)((1U << 31) - 1); + + if (sizeof(time_t) == 4) + { + rig_debug(RIG_DEBUG_TRACE, "%s: time_t is 4 bytes, 2038 test failed\n", + __func__); + return 1; + } + + x = (time_t)((1U << 63) - 1); char *s = ctime(&x); if (s == NULL) { failed = 1; } + rig_debug(RIG_DEBUG_VERBOSE, "%s: time_t 2038 test = 0x%08lx:%s", __func__, x, + s); + #endif if (failed) commit 4cadea95f8aa5e8c4ab23a6a393d38b96b8a1af6 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Feb 15 09:25:27 2024 -0600 Astyle cal.c diff --git a/src/cal.c b/src/cal.c index eeeeea3ab..38fcfed70 100644 --- a/src/cal.c +++ b/src/cal.c @@ -86,7 +86,10 @@ float HAMLIB_API rig_raw2val(int rawval, const cal_table_t *cal) } if (rawval == cal->table[i - 1].raw) - return cal->table[i-1].val; + { + return cal->table[i - 1].val; + } + if (i == 0) { return cal->table[0].val; commit 7caef5398e7bda1460cf21e8a8ccc5a40856f9bb Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Feb 15 09:24:58 2024 -0600 Return exact value for rig_raw2val when appropriate diff --git a/src/cal.c b/src/cal.c index 2083a522e..eeeeea3ab 100644 --- a/src/cal.c +++ b/src/cal.c @@ -85,6 +85,8 @@ float HAMLIB_API rig_raw2val(int rawval, const cal_table_t *cal) } } + if (rawval == cal->table[i - 1].raw) + return cal->table[i-1].val; if (i == 0) { return cal->table[0].val; commit 5d83ac767b0288498608134648b7802c6946116d Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Feb 15 09:08:42 2024 -0600 Update SDRUno information diff --git a/rigs/kenwood/ts480.c b/rigs/kenwood/ts480.c index 9bb1c403f..3cd3579c1 100644 --- a/rigs/kenwood/ts480.c +++ b/rigs/kenwood/ts480.c @@ -2006,12 +2006,11 @@ struct rig_caps sdruno_caps = RIG_MODEL(RIG_MODEL_SDRUNO), .model_name = "SDRUno", .mfg_name = "SDRPlay", - .version = BACKEND_VER ".2", + .version = BACKEND_VER ".3", .copyright = "LGPL", .status = RIG_STATUS_STABLE, - .rig_type = RIG_TYPE_TRANSCEIVER, - .ptt_type = RIG_PTT_RIG_MICDATA, - .dcd_type = RIG_DCD_RIG, + .rig_type = RIG_TYPE_RECEIVER, + .ptt_type = RIG_PTT_NONE, .port_type = RIG_PORT_SERIAL, .serial_rate_min = 4800, .serial_rate_max = 115200, @@ -2036,26 +2035,6 @@ struct rig_caps sdruno_caps = RIG_FRNG_END, }, /*!< Receive frequency range list for ITU region 1 */ .tx_range_list1 = { - {kHz(1810), kHz(1850), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, /* 100W class */ - {kHz(1810), kHz(1850), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, /* 25W class */ - {kHz(3500), kHz(3800), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, - {kHz(3500), kHz(3800), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, - {MHz(7), kHz(7200), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, - {MHz(7), kHz(7200), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, - {kHz(10100), kHz(10150), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, - {kHz(10100), kHz(10150), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, - {MHz(14), kHz(14350), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, - {MHz(14), kHz(14350), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, - {kHz(18068), kHz(18168), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, - {kHz(18068), kHz(18168), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, - {MHz(21), kHz(21450), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, - {MHz(21), kHz(21450), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, - {kHz(24890), kHz(24990), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, - {kHz(24890), kHz(24990), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, - {MHz(28), kHz(29700), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, - {MHz(28), kHz(29700), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, - {MHz(50), kHz(52000), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, - {MHz(50), kHz(52000), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, RIG_FRNG_END, }, /*!< Transmit frequency range list for ITU region 1 */ .rx_range_list2 = { @@ -2063,28 +2042,6 @@ struct rig_caps sdruno_caps = RIG_FRNG_END, }, /*!< Receive frequency range list for ITU region 2 */ .tx_range_list2 = { - {kHz(1800), MHz(2) - 1, TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, /* 100W class */ - {kHz(1800), MHz(2) - 1, TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, /* 25W class */ - {kHz(3500), MHz(4) - 1, TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, - {kHz(3500), MHz(4) - 1, TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, - {kHz(5250), kHz(5450), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, - {kHz(5250), kHz(5450), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, - {MHz(7), kHz(7300), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, - {MHz(7), kHz(7300), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, - {kHz(10100), kHz(10150), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, - {kHz(10100), kHz(10150), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, - {MHz(14), kHz(14350), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, - {MHz(14), kHz(14350), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, - {kHz(18068), kHz(18168), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, - {kHz(18068), kHz(18168), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, - {MHz(21), kHz(21450), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, - {MHz(21), kHz(21450), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, - {kHz(24890), kHz(24990), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, - {kHz(24890), kHz(24990), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, - {MHz(28), kHz(29700), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, - {MHz(28), kHz(29700), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, - {MHz(50), kHz(52000), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, - {MHz(50), kHz(52000), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, RIG_FRNG_END, }, /*!< Transmit frequency range list for ITU region 2 */ .tuning_steps = { commit c471884122de94fa69fd76671eb8cb6ce9b932a8 Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Feb 14 16:35:34 2024 -0600 Fix TS590 and TS890 RIG_LEVEL_RFPOWER_METER_WATTS diff --git a/rigs/kenwood/ts590.c b/rigs/kenwood/ts590.c index 7523b81a8..a995182e3 100644 --- a/rigs/kenwood/ts590.c +++ b/rigs/kenwood/ts590.c @@ -41,11 +41,11 @@ #define TS590_LEVEL_GET (RIG_LEVEL_RFPOWER|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_SQL|RIG_LEVEL_AGC|RIG_LEVEL_MICGAIN|RIG_LEVEL_STRENGTH|RIG_LEVEL_KEYSPD|RIG_LEVEL_CWPITCH| \ RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB|RIG_LEVEL_NR|RIG_LEVEL_PREAMP|RIG_LEVEL_COMP|RIG_LEVEL_ATT|RIG_LEVEL_VOXDELAY|RIG_LEVEL_VOXGAIN|RIG_LEVEL_BKIN_DLYMS| \ - RIG_LEVEL_SWR|RIG_LEVEL_COMP_METER|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_SLOPE_HIGH|RIG_LEVEL_SLOPE_LOW|RIG_LEVEL_USB_AF|RIG_LEVEL_USB_AF_INPUT) + RIG_LEVEL_SWR|RIG_LEVEL_COMP_METER|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_RFPOWER_METER_WATTS|RIG_LEVEL_SLOPE_HIGH|RIG_LEVEL_SLOPE_LOW|RIG_LEVEL_USB_AF|RIG_LEVEL_USB_AF_INPUT) #define TS590_LEVEL_SET (RIG_LEVEL_RFPOWER|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_SQL|RIG_LEVEL_AGC|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_CWPITCH| \ RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB|RIG_LEVEL_NR|RIG_LEVEL_PREAMP|RIG_LEVEL_COMP|RIG_LEVEL_ATT|RIG_LEVEL_VOXDELAY|RIG_LEVEL_VOXGAIN|RIG_LEVEL_BKIN_DLYMS| \ - RIG_LEVEL_METER|RIG_LEVEL_RFPOWER_METER_WATTS|RIG_LEVEL_SLOPE_HIGH|RIG_LEVEL_SLOPE_LOW|RIG_LEVEL_USB_AF|RIG_LEVEL_USB_AF_INPUT) + RIG_LEVEL_METER|RIG_LEVEL_SLOPE_HIGH|RIG_LEVEL_SLOPE_LOW|RIG_LEVEL_USB_AF|RIG_LEVEL_USB_AF_INPUT) #define TS590_FUNC_ALL (RIG_FUNC_NB|RIG_FUNC_COMP|RIG_FUNC_VOX|RIG_FUNC_NR|RIG_FUNC_NR|RIG_FUNC_BC|RIG_FUNC_BC2|RIG_FUNC_RIT|RIG_FUNC_XIT| \ RIG_FUNC_TUNER|RIG_FUNC_MON|RIG_FUNC_FBKIN|RIG_FUNC_LOCK) @@ -1013,6 +1013,13 @@ static int ts590_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) case RIG_LEVEL_RFPOWER_METER: case RIG_LEVEL_RFPOWER_METER_WATTS: { + static cal_table_t power_meter = + { + 7, { { 0, 0}, { 3, 5}, { 6, 10}, { 8, 15}, {12, 25}, + { 17, 50}, { 30, 100} + } + }; + int raw_value; if (rig->state.cache.ptt == RIG_PTT_OFF) @@ -1030,13 +1037,16 @@ static int ts590_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) sscanf(ackbuf, "SM0%d", &raw_value); - val->f = (float) raw_value / 30.0f; +// val->f = (float) raw_value / 30.0f; if (level == RIG_LEVEL_RFPOWER_METER_WATTS) { - val->f *= 100; - if (val->f >= 10) val->f = roundf(val->f); - else val->f = roundf(val->f*10.0)/10.0; + val->f = roundf(rig_raw2val(raw_value, &power_meter)); + if (val->f < 10) + { + val->f = roundf(rig_raw2val(raw_value, &power_meter) * 10.0) / 10.0; + } + } break; @@ -1703,7 +1713,7 @@ struct rig_caps ts590_caps = RIG_MODEL(RIG_MODEL_TS590S), .model_name = "TS-590S", .mfg_name = "Kenwood", - .version = BACKEND_VER ".15", + .version = BACKEND_VER ".16", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -2097,7 +2107,7 @@ struct rig_caps ts590sg_caps = RIG_MODEL(RIG_MODEL_TS590SG), .model_name = "TS-590SG", .mfg_name = "Kenwood", - .version = BACKEND_VER ".9", + .version = BACKEND_VER ".10", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, diff --git a/rigs/kenwood/ts890s.c b/rigs/kenwood/ts890s.c index d9c28d829..2b8ca60c7 100644 --- a/rigs/kenwood/ts890s.c +++ b/rigs/kenwood/ts890s.c @@ -359,14 +359,7 @@ int kenwood_ts890_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) if (level == RIG_LEVEL_RFPOWER_METER_WATTS) { - if (val->f >= 10) - { - val->f = roundf(rig_raw2val(val->i, &power_meter)); - } - else - { - val->f = roundf(rig_raw2val(val->i, &power_meter) * 10.0) / 10.0; - } + val->f = roundf(rig_raw2val(val->i, &power_meter)); } else { commit 47fcf999f063214027be7bbf9ac2115ba759cf2e Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Feb 14 08:59:52 2024 -0600 Reduce debug error level for rig_test_2038 diff --git a/src/misc.c b/src/misc.c index b914e37d6..bbab4946f 100644 --- a/src/misc.c +++ b/src/misc.c @@ -3064,7 +3064,7 @@ int rig_test_2038(RIG *rig) __func__); #endif #if defined(__MSVCRT_VERSION__) - rig_debug(RIG_DEBUG_ERR, "%s: __MSVCRT_VERSION__=0x%04x\n", __func__, + rig_debug(RIG_DEBUG_TRACE, "%s: __MSVCRT_VERSION__=0x%04x\n", __func__, __MSVCRT_VERSION__); #endif commit f12d653f6ceaa4dadeb17278239a73092d8a9802 Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Feb 14 07:55:42 2024 -0600 Try to fix MINGW time_t https://github.com/Hamlib/Hamlib/issues/1478 diff --git a/src/misc.c b/src/misc.c index 4d59cc5c0..b914e37d6 100644 --- a/src/misc.c +++ b/src/misc.c @@ -3076,7 +3076,7 @@ int rig_test_2038(RIG *rig) int failed = 0; #if defined(__MSVCRT_VERSION__) - x = (__time64_t)((1U << 31) - 1); + x = (__time64_t)((1UL << 31) - 1); char s[64]; _ctime64_s(s, sizeof(s), &x); commit e1f23429821777b938a69b11f7589e5c0c191e51 Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Feb 14 07:11:20 2024 -0600 Promote all BETA to STABLE Promot all ALPHA to BETA diff --git a/amplifiers/elecraft/kpa1500.c b/amplifiers/elecraft/kpa1500.c index f2309b32c..f53d4c85a 100644 --- a/amplifiers/elecraft/kpa1500.c +++ b/amplifiers/elecraft/kpa1500.c @@ -62,7 +62,7 @@ const struct amp_caps kpa1500_amp_caps = .mfg_name = "Elecraft", .version = "20220710.0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .amp_type = AMP_TYPE_OTHER, .port_type = RIG_PORT_SERIAL, .serial_rate_min = 4800, diff --git a/amplifiers/expert/expert.c b/amplifiers/expert/expert.c index 35fdde367..756cb7b49 100644 --- a/amplifiers/expert/expert.c +++ b/amplifiers/expert/expert.c @@ -676,7 +676,7 @@ const struct amp_caps expert_amp_caps = .mfg_name = "Expert", .version = "20230328.0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .amp_type = AMP_TYPE_OTHER, .port_type = RIG_PORT_SERIAL, .serial_rate_min = 9600, diff --git a/amplifiers/gemini/dx1200.c b/amplifiers/gemini/dx1200.c index f0b41c654..a685453ba 100644 --- a/amplifiers/gemini/dx1200.c +++ b/amplifiers/gemini/dx1200.c @@ -62,7 +62,7 @@ const struct amp_caps gemini_amp_caps = .mfg_name = "Gemini", .version = "20230318.0", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .amp_type = AMP_TYPE_OTHER, .port_type = RIG_PORT_NETWORK, .write_delay = 0, diff --git a/rigs/anytone/d578.c b/rigs/anytone/d578.c index cf7ec4214..ee29f9b95 100644 --- a/rigs/anytone/d578.c +++ b/rigs/anytone/d578.c @@ -33,7 +33,7 @@ struct rig_caps anytone_d578_caps = .mfg_name = "AnyTone", .version = BACKEND_VER ".0", .copyright = "Michael Black W9MDB: GNU LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_RIG, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/aor/ar2700.c b/rigs/aor/ar2700.c index 161ee0ebe..0245dd07b 100644 --- a/rigs/aor/ar2700.c +++ b/rigs/aor/ar2700.c @@ -87,7 +87,7 @@ struct rig_caps ar2700_caps = .mfg_name = "AOR", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_SCANNER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/aor/ar5000.c b/rigs/aor/ar5000.c index 73a8ffd9c..95c9b313e 100644 --- a/rigs/aor/ar5000.c +++ b/rigs/aor/ar5000.c @@ -252,7 +252,7 @@ struct rig_caps ar5000a_caps = .mfg_name = "AOR", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_SCANNER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/aor/ar8200.c b/rigs/aor/ar8200.c index c1a640fd3..17832f15e 100644 --- a/rigs/aor/ar8200.c +++ b/rigs/aor/ar8200.c @@ -91,7 +91,7 @@ struct rig_caps ar8200_caps = .mfg_name = "AOR", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_SCANNER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/barrett/4100.c b/rigs/barrett/4100.c index 814ae7b15..e1a2bc77e 100644 --- a/rigs/barrett/4100.c +++ b/rigs/barrett/4100.c @@ -235,7 +235,7 @@ struct rig_caps barrett4100_caps = .mfg_name = "Barrett", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .targetable_vfo = RIG_TARGETABLE_FREQ | RIG_TARGETABLE_MODE, .ptt_type = RIG_PTT_RIG, diff --git a/rigs/dorji/dra818.c b/rigs/dorji/dra818.c index 065b0d305..8cf4e93e4 100644 --- a/rigs/dorji/dra818.c +++ b/rigs/dorji/dra818.c @@ -527,7 +527,7 @@ struct rig_caps dra818u_caps = .mfg_name = "Dorji", .version = "20191209.0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_RIG, @@ -631,7 +631,7 @@ struct rig_caps dra818v_caps = .mfg_name = "Dorji", .version = "20191209.0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/drake/r8b.c b/rigs/drake/r8b.c index 11fa4f1fe..a11a72bc3 100644 --- a/rigs/drake/r8b.c +++ b/rigs/drake/r8b.c @@ -85,7 +85,7 @@ struct rig_caps r8b_caps = .mfg_name = "Drake", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_RECEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/dummy/tci1x.c b/rigs/dummy/tci1x.c index a0aaaa635..15fae09cd 100644 --- a/rigs/dummy/tci1x.c +++ b/rigs/dummy/tci1x.c @@ -139,7 +139,7 @@ struct rig_caps tci1x_caps = .mfg_name = "Expert Elec", .version = "20211125.0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .targetable_vfo = RIG_TARGETABLE_FREQ | RIG_TARGETABLE_MODE, .ptt_type = RIG_PTT_RIG, diff --git a/rigs/flexradio/dttsp.c b/rigs/flexradio/dttsp.c index de41b6ad5..50de1461a 100644 --- a/rigs/flexradio/dttsp.c +++ b/rigs/flexradio/dttsp.c @@ -162,7 +162,7 @@ struct rig_caps dttsp_rig_caps = .mfg_name = "DTTS Microwave Society", .version = "20200319.0", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_COMPUTER, .targetable_vfo = RIG_TARGETABLE_ALL, .ptt_type = RIG_PTT_RIG, @@ -248,7 +248,7 @@ struct rig_caps dttsp_udp_rig_caps = .mfg_name = "DTTS Microwave Society", .version = "20200319.0", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_COMPUTER, .targetable_vfo = RIG_TARGETABLE_ALL, .ptt_type = RIG_PTT_RIG, diff --git a/rigs/flexradio/sdr1k.c b/rigs/flexradio/sdr1k.c index e773d47bf..3489651d2 100644 --- a/rigs/flexradio/sdr1k.c +++ b/rigs/flexradio/sdr1k.c @@ -117,7 +117,7 @@ struct rig_caps sdr1k_rig_caps = .mfg_name = "Flex-radio", .version = "20200323.0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TUNER, .targetable_vfo = 0, .ptt_type = RIG_PTT_RIG, diff --git a/rigs/gomspace/gs100.c b/rigs/gomspace/gs100.c index 04d7097a3..ee3541bac 100644 --- a/rigs/gomspace/gs100.c +++ b/rigs/gomspace/gs100.c @@ -380,7 +380,7 @@ struct rig_caps GS100_caps = .mfg_name = "GOMSPACE", .version = "20211117.0", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, .targetable_vfo = 0, .ptt_type = RIG_PTT_NONE, diff --git a/rigs/icmarine/icm700pro.c b/rigs/icmarine/icm700pro.c index 681ea4785..d1cd379dd 100644 --- a/rigs/icmarine/icm700pro.c +++ b/rigs/icmarine/icm700pro.c @@ -56,7 +56,7 @@ struct rig_caps icm700pro_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_RIG, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/icom/delta2.c b/rigs/icom/delta2.c index ec43e8ab0..e39f5017f 100644 --- a/rigs/icom/delta2.c +++ b/rigs/icom/delta2.c @@ -59,7 +59,7 @@ struct rig_caps delta2_caps = .mfg_name = "Ten-Tec", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/icom/ic271.c b/rigs/icom/ic271.c index dfa8d732a..b0dd0c336 100644 --- a/rigs/icom/ic271.c +++ b/rigs/icom/ic271.c @@ -56,7 +56,7 @@ struct rig_caps ic271_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/icom/ic2730.c b/rigs/icom/ic2730.c index 16ed41b01..f9fc56953 100644 --- a/rigs/icom/ic2730.c +++ b/rigs/icom/ic2730.c @@ -66,7 +66,7 @@ struct rig_caps ic2730_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_MOBILE, .ptt_type = RIG_PTT_RIG, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/icom/ic471.c b/rigs/icom/ic471.c index b1e1ec20c..c8f07de1c 100644 --- a/rigs/icom/ic471.c +++ b/rigs/icom/ic471.c @@ -55,7 +55,7 @@ struct rig_caps ic471_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/icom/ic707.c b/rigs/icom/ic707.c index 4376094a4..1b4834760 100644 --- a/rigs/icom/ic707.c +++ b/rigs/icom/ic707.c @@ -61,7 +61,7 @@ struct rig_caps ic707_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/icom/ic728.c b/rigs/icom/ic728.c index 964b013ae..7e959580a 100644 --- a/rigs/icom/ic728.c +++ b/rigs/icom/ic728.c @@ -61,7 +61,7 @@ struct rig_caps ic728_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/icom/ic736.c b/rigs/icom/ic736.c index 979c336b6..48e4817f4 100644 --- a/rigs/icom/ic736.c +++ b/rigs/icom/ic736.c @@ -65,7 +65,7 @@ struct rig_caps ic736_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/icom/ic737.c b/rigs/icom/ic737.c index 8f1a8da64..c7f3b3f23 100644 --- a/rigs/icom/ic737.c +++ b/rigs/icom/ic737.c @@ -63,7 +63,7 @@ struct rig_caps ic737_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/icom/ic738.c b/rigs/icom/ic738.c index 354152d4a..c71fab5d1 100644 --- a/rigs/icom/ic738.c +++ b/rigs/icom/ic738.c @@ -65,7 +65,7 @@ struct rig_caps ic738_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/icom/ic7410.c b/rigs/icom/ic7410.c index bc8895310..d8e31510a 100644 --- a/rigs/icom/ic7410.c +++ b/rigs/icom/ic7410.c @@ -126,7 +126,7 @@ struct rig_caps ic7410_caps = .mfg_name = "Icom", .version = BACKEND_VER ".3", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_RIG, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/icom/ic775.c b/rigs/icom/ic775.c index 33d10113a..7e7d19d79 100644 --- a/rigs/icom/ic775.c +++ b/rigs/icom/ic775.c @@ -58,7 +58,7 @@ struct rig_caps ic775_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/icom/ic78.c b/rigs/icom/ic78.c index 977e0ee2a..a752f4ccc 100644 --- a/rigs/icom/ic78.c +++ b/rigs/icom/ic78.c @@ -69,7 +69,7 @@ struct rig_caps ic78_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/icom/ic820h.c b/rigs/icom/ic820h.c index e81dc1637..1d0bf11cf 100644 --- a/rigs/icom/ic820h.c +++ b/rigs/icom/ic820h.c @@ -57,7 +57,7 @@ struct rig_caps ic820h_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/icom/ic92d.c b/rigs/icom/ic92d.c index b0f3b6753..5d8c33f95 100644 --- a/rigs/icom/ic92d.c +++ b/rigs/icom/ic92d.c @@ -100,7 +100,7 @@ struct rig_caps ic92d_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_HANDHELD, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/icom/ic970.c b/rigs/icom/ic970.c index 333eb6337..d627347f6 100644 --- a/rigs/icom/ic970.c +++ b/rigs/icom/ic970.c @@ -52,7 +52,7 @@ struct rig_caps ic970_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/icom/icr30.c b/rigs/icom/icr30.c index 7ce95a322..16453423e 100644 --- a/rigs/icom/icr30.c +++ b/rigs/icom/icr30.c @@ -131,7 +131,7 @@ struct rig_caps icr30_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_RECEIVER | RIG_FLAG_HANDHELD, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/icom/icr7000.c b/rigs/icom/icr7000.c index 3636046b8..768054cca 100644 --- a/rigs/icom/icr7000.c +++ b/rigs/icom/icr7000.c @@ -181,7 +181,7 @@ struct rig_caps icr7100_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_RECEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/icom/icr71.c b/rigs/icom/icr71.c index 660fba2e8..8666acfe5 100644 --- a/rigs/icom/icr71.c +++ b/rigs/icom/icr71.c @@ -51,7 +51,7 @@ struct rig_caps icr71_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_RECEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/icom/icr72.c b/rigs/icom/icr72.c index 115a2abd5..4af798a4d 100644 --- a/rigs/icom/icr72.c +++ b/rigs/icom/icr72.c @@ -52,7 +52,7 @@ struct rig_caps icr72_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_RECEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/icom/icr8600.c b/rigs/icom/icr8600.c index e3a012b4c..446b77a7e 100644 --- a/rigs/icom/icr8600.c +++ b/rigs/icom/icr8600.c @@ -135,7 +135,7 @@ struct rig_caps icr8600_caps = .mfg_name = "Icom", .version = BACKEND_VER ".4", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_RECEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/icom/icr9000.c b/rigs/icom/icr9000.c index 33e9f4887..9767cebd9 100644 --- a/rigs/icom/icr9000.c +++ b/rigs/icom/icr9000.c @@ -69,7 +69,7 @@ struct rig_caps icr9000_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_RECEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/icom/icrx7.c b/rigs/icom/icrx7.c index 089c1d6b5..e46d0d8b5 100644 --- a/rigs/icom/icrx7.c +++ b/rigs/icom/icrx7.c @@ -56,7 +56,7 @@ struct rig_caps icrx7_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_RECEIVER | RIG_FLAG_HANDHELD, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/icom/id1.c b/rigs/icom/id1.c index d83efc844..3ee4bb907 100644 --- a/rigs/icom/id1.c +++ b/rigs/icom/id1.c @@ -74,7 +74,7 @@ struct rig_caps id1_caps = .mfg_name = "Icom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_MOBILE, .ptt_type = RIG_PTT_RIG, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/icom/id31.c b/rigs/icom/id31.c index 9727c42b6..ffad0eaf1 100644 --- a/rigs/icom/id31.c +++ b/rigs/icom/id31.c @@ -82,7 +82,7 @@ struct rig_caps id31_caps = .mfg_name = "Icom", .version = BACKEND_VER ".1", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_HANDHELD, .ptt_type = RIG_PTT_RIG, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/icom/id4100.c b/rigs/icom/id4100.c index e06694e95..f45de58bb 100644 --- a/rigs/icom/id4100.c +++ b/rigs/icom/id4100.c @@ -86,7 +86,7 @@ struct rig_caps id4100_caps = .mfg_name = "Icom", .version = BACKEND_VER ".1", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_MOBILE, .ptt_type = RIG_PTT_RIG, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/icom/id51.c b/rigs/icom/id51.c index 729312a85..2688ba69b 100644 --- a/rigs/icom/id51.c +++ b/rigs/icom/id51.c @@ -89,7 +89,7 @@ struct rig_caps id51_caps = .mfg_name = "Icom", .version = BACKEND_VER ".1", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_HANDHELD, .ptt_type = RIG_PTT_RIG, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/icom/id5100.c b/rigs/icom/id5100.c index 006bcdce3..9ad6fa4ff 100644 --- a/rigs/icom/id5100.c +++ b/rigs/icom/id5100.c @@ -530,7 +530,7 @@ struct rig_caps id5100_caps = .mfg_name = "Icom", .version = BACKEND_VER ".9", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_MOBILE, .ptt_type = RIG_PTT_RIG, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/icom/perseus.c b/rigs/icom/perseus.c index e13ae8667..06aa1adaf 100644 --- a/rigs/icom/perseus.c +++ b/rigs/icom/perseus.c @@ -78,7 +78,7 @@ struct rig_caps perseus_caps = .mfg_name = "Microtelecom", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_PCRECEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/jrc/nrd525.c b/rigs/jrc/nrd525.c index ca0c6ad4b..aaf798566 100644 --- a/rigs/jrc/nrd525.c +++ b/rigs/jrc/nrd525.c @@ -61,7 +61,7 @@ struct rig_caps nrd525_caps = .mfg_name = "JRC", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_RECEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/kachina/505dsp.c b/rigs/kachina/505dsp.c index 36e6ad37b..0640f5e7a 100644 --- a/rigs/kachina/505dsp.c +++ b/rigs/kachina/505dsp.c @@ -60,7 +60,7 @@ struct rig_caps k505dsp_caps = .mfg_name = "Kachina", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_COMPUTER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/kenwood/ts480.c b/rigs/kenwood/ts480.c index 41269c2f1..9bb1c403f 100644 --- a/rigs/kenwood/ts480.c +++ b/rigs/kenwood/ts480.c @@ -1449,7 +1449,7 @@ struct rig_caps trudx_caps = .mfg_name = "DL2MAN", .version = BACKEND_VER ".1", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_RIG_MICDATA, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/kenwood/ts711.c b/rigs/kenwood/ts711.c index 8e3500c46..422e5ff71 100644 --- a/rigs/kenwood/ts711.c +++ b/rigs/kenwood/ts711.c @@ -101,7 +101,7 @@ struct rig_caps ts711_caps = .mfg_name = "Kenwood", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_RIG, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/kenwood/ts811.c b/rigs/kenwood/ts811.c index 043c78311..bfcdb1b2f 100644 --- a/rigs/kenwood/ts811.c +++ b/rigs/kenwood/ts811.c @@ -87,7 +87,7 @@ struct rig_caps ts811_caps = .mfg_name = "Kenwood", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_RIG, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/kenwood/ts930.c b/rigs/kenwood/ts930.c index 31a1e577e..f26542e5b 100644 --- a/rigs/kenwood/ts930.c +++ b/rigs/kenwood/ts930.c @@ -54,7 +54,7 @@ struct rig_caps ts930_caps = .mfg_name = "Kenwood", .version = BACKEND_VER ".1", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_RIG, .dcd_type = RIG_DCD_RIG, diff --git a/rigs/kit/dds60.c b/rigs/kit/dds60.c index 6d7e98077..30ec93f1a 100644 --- a/rigs/kit/dds60.c +++ b/rigs/kit/dds60.c @@ -100,7 +100,7 @@ struct rig_caps dds60_caps = .mfg_name = "AmQRP", .version = "20200112.0", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TUNER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/kit/dwt.c b/rigs/kit/dwt.c index fc21e6f6a..6f1d45844 100644 --- a/rigs/kit/dwt.c +++ b/rigs/kit/dwt.c @@ -549,7 +549,7 @@ struct rig_caps dwt_caps = .mfg_name = "Coding Technologies", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TUNER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/kit/hiqsdr.c b/rigs/kit/hiqsdr.c index e98aca072..5a58b10b9 100644 --- a/rigs/kit/hiqsdr.c +++ b/rigs/kit/hiqsdr.c @@ -105,7 +105,7 @@ struct rig_caps hiqsdr_caps = .mfg_name = "N2ADR", .version = "20200323.0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TUNER, .targetable_vfo = RIG_TARGETABLE_NONE, .ptt_type = RIG_PTT_RIG, diff --git a/rigs/kit/miniVNA.c b/rigs/kit/miniVNA.c index 7ef5e0ad9..5b73e8cde 100644 --- a/rigs/kit/miniVNA.c +++ b/rigs/kit/miniVNA.c @@ -61,7 +61,7 @@ struct rig_caps miniVNA_caps = .mfg_name = "mRS", .version = "20190817.0", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TUNER, .port_type = RIG_PORT_SERIAL, .serial_rate_min = 115200, diff --git a/rigs/kit/pcrotor.c b/rigs/kit/pcrotor.c index fa52f4489..c1345a034 100644 --- a/rigs/kit/pcrotor.c +++ b/rigs/kit/pcrotor.c @@ -111,7 +111,7 @@ const struct rot_caps pcrotor_caps = .mfg_name = "WA6UFQ", .version = "20081013.0", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rot_type = ROT_TYPE_OTHER, .port_type = RIG_PORT_PARALLEL, .write_delay = 0, diff --git a/rigs/kit/si570avrusb.c b/rigs/kit/si570avrusb.c index 6367e3702..3f71e9258 100644 --- a/rigs/kit/si570avrusb.c +++ b/rigs/kit/si570avrusb.c @@ -475,7 +475,7 @@ struct rig_caps fasdr_caps = .mfg_name = "Funkamateur", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_FLAG_TUNER | RIG_FLAG_TRANSMITTER, .ptt_type = RIG_PTT_RIG, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/kit/usrp.c b/rigs/kit/usrp.c index d389f2ca3..2e844788b 100644 --- a/rigs/kit/usrp.c +++ b/rigs/kit/usrp.c @@ -67,7 +67,7 @@ struct rig_caps usrp_caps = .mfg_name = "GNU Radio", .version = "0.1", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TUNER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/lowe/hf235.c b/rigs/lowe/hf235.c index ad7426db2..8b0a58b7f 100644 --- a/rigs/lowe/hf235.c +++ b/rigs/lowe/hf235.c @@ -50,7 +50,7 @@ struct rig_caps hf235_caps = .mfg_name = "Lowe", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_BETA, /* and only basic support */ + .status = RIG_STATUS_STABLE, /* and only basic support */ .rig_type = RIG_TYPE_RECEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/mds/4710.c b/rigs/mds/4710.c index d1cfacac7..b377f3847 100644 --- a/rigs/mds/4710.c +++ b/rigs/mds/4710.c @@ -7,7 +7,7 @@ struct rig_caps mds_4710_caps = .mfg_name = "MDS", .version = "20221114.0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_RIG, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/mds/9710.c b/rigs/mds/9710.c index b83a8c6d2..7abacdbdf 100644 --- a/rigs/mds/9710.c +++ b/rigs/mds/9710.c @@ -7,7 +7,7 @@ struct rig_caps mds_9710_caps = .mfg_name = "MDS", .version = "20221116.0", .copyright = "LGPL", - .status = RIG_STATUS_ALPHA, + .status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_TRANSCEIVER, .ptt_type = RIG_PTT_RIG, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/racal/ra3702.c b/rigs/racal/ra3702.c index 5ed8aa3b2..d5d3e5c51 100644 --- a/rigs/racal/ra3702.c +++ b/rigs/racal/ra3702.c @@ -51,7 +51,7 @@ struct rig_caps ra3702_caps = .mfg_name = "Racal", .version = BACKEND_VER ".0", .copyright = "LGPL", - .status = RIG_STATUS_BETA, + .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_RECEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, diff --git a/rigs/racal/ra6790... [truncated message content] |
From: n0nb <n0...@us...> - 2024-01-18 17:54:27
|
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 761f1d3b0024c4989935207a9e731c57eb2ccd8c (commit) via 48d3f3f7509034aaaf9ed2cd98ab4b486b62f85e (commit) from aec9348138c28a6b3d8569067e9c0717bf234843 (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 761f1d3b0024c4989935207a9e731c57eb2ccd8c Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Jan 18 09:18:49 2024 -0600 Add rest of RIG_FUNC_SYNC changes diff --git a/NEWS b/NEWS index 70fe9e26f..29fdbb15a 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 RIG_FUNC_SYNC for FTDX101D/MP * Added Barrett 4100 * Added DL2MAN (tr)uSDX -- needs refinement * Added Thetis entry -- derived from FlexRadio/Apache PowerSDR diff --git a/src/misc.c b/src/misc.c index 241765f32..c296e2972 100644 --- a/src/misc.c +++ b/src/misc.c @@ -740,6 +740,7 @@ static const struct { RIG_FUNC_SEND_MORSE, "SEND_MORSE" }, { RIG_FUNC_SEND_VOICE_MEM, "SEND_VOICE_MEM" }, { RIG_FUNC_OVF_STATUS, "OVF_STATUS" }, + { RIG_FUNC_SYNC, "SYNC" }, { RIG_FUNC_NONE, "" }, }; diff --git a/src/sprintflst.c b/src/sprintflst.c index ca87d8b6f..b6d70b125 100644 --- a/src/sprintflst.c +++ b/src/sprintflst.c @@ -177,6 +177,7 @@ int rig_sprintf_func(char *str, int nlen, setting_t func) if (!ms || !ms[0]) { + rig_debug(RIG_EINTERNAL, "%s: unknown RIG_FUNC=%x\n", __func__, i); continue; /* unknown, FIXME! */ } commit 48d3f3f7509034aaaf9ed2cd98ab4b486b62f85e Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Jan 18 07:56:30 2024 -0600 Add RIG_FUNC_SYNC -- only for FTDX101D/MP right now. diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 8044342c6..4e40e5c46 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -1273,7 +1273,7 @@ typedef uint64_t setting_t; #define RIG_FUNC_SEND_MORSE CONSTANT_64BIT_FLAG (45) /*!< \c SEND_MORSE -- Send specified characters using CW */ #define RIG_FUNC_SEND_VOICE_MEM CONSTANT_64BIT_FLAG (46) /*!< \c SEND_VOICE_MEM -- Transmit in SSB message stored in memory */ #define RIG_FUNC_OVF_STATUS CONSTANT_64BIT_FLAG (47) /*!< \c OVF -- Read overflow status 0=Off, 1=On */ -#define RIG_FUNC_BIT48 CONSTANT_64BIT_FLAG (48) /*!< \c available for future RIG_FUNC items */ +#define RIG_FUNC_SYNC CONSTANT_64BIT_FLAG (48) /*!< \c Synchronize VFOS -- FTDX101D/MP for now SY command */ #define RIG_FUNC_BIT49 CONSTANT_64BIT_FLAG (49) /*!< \c available for future RIG_FUNC items */ #define RIG_FUNC_BIT50 CONSTANT_64BIT_FLAG (50) /*!< \c available for future RIG_FUNC items */ #define RIG_FUNC_BIT51 CONSTANT_64BIT_FLAG (51) /*!< \c available for future RIG_FUNC items */ diff --git a/rigs/yaesu/ftdx101.h b/rigs/yaesu/ftdx101.h index fd830f1c5..64a433a3c 100644 --- a/rigs/yaesu/ftdx101.h +++ b/rigs/yaesu/ftdx101.h @@ -65,7 +65,8 @@ #define FTDX101_FUNCS (RIG_FUNC_TONE|RIG_FUNC_TSQL|RIG_FUNC_LOCK|\ RIG_FUNC_MON|RIG_FUNC_NB|RIG_FUNC_NR|RIG_FUNC_VOX|\ RIG_FUNC_FBKIN|RIG_FUNC_COMP|RIG_FUNC_ANF|RIG_FUNC_MN|\ - RIG_FUNC_RIT|RIG_FUNC_XIT|RIG_FUNC_TUNER|RIG_FUNC_APF) + RIG_FUNC_RIT|RIG_FUNC_XIT|RIG_FUNC_TUNER|RIG_FUNC_APF|\ + RIG_FUNC_SYNC) /* TBC */ #define FTDX101_VFO_OPS (RIG_OP_TUNE|RIG_OP_CPY|RIG_OP_XCHG|\ diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index fa278e7f6..b579e1abb 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -6401,6 +6401,16 @@ int newcat_set_func(RIG *rig, vfo_t vfo, setting_t func, int status) break; + case RIG_FUNC_SYNC: + if (!newcat_valid_command(rig, "SY")) + { + RETURNFUNC(-RIG_ENAVAIL); + } + + SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "SY%d%c", status ? 1 : 0, + cat_term); + break; + default: RETURNFUNC(-RIG_EINVAL); } @@ -6694,6 +6704,15 @@ int newcat_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) break; + case RIG_FUNC_SYNC: + if (!newcat_valid_command(rig, "SY")) + { + RETURNFUNC(-RIG_ENAVAIL); + } + + SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "SY%c", cat_term); + break; + default: RETURNFUNC(-RIG_EINVAL); } @@ -6808,6 +6827,10 @@ int newcat_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) break; + case RIG_FUNC_SYNC: + *status = (retfunc[0] == '1') ? 1 : 0; + break; + default: RETURNFUNC(-RIG_EINVAL); } diff --git a/rigs/yaesu/newcat.h b/rigs/yaesu/newcat.h index 43ffe73f2..dadf05f27 100644 --- a/rigs/yaesu/newcat.h +++ b/rigs/yaesu/newcat.h @@ -50,7 +50,7 @@ typedef char ncboolean; /* shared function version */ -#define NEWCAT_VER "20240113" +#define NEWCAT_VER "20240118" /* Hopefully large enough for future use, 128 chars plus '\0' */ #define NEWCAT_DATA_LEN 129 ----------------------------------------------------------------------- Summary of changes: NEWS | 1 + include/hamlib/rig.h | 2 +- rigs/yaesu/ftdx101.h | 3 ++- rigs/yaesu/newcat.c | 23 +++++++++++++++++++++++ rigs/yaesu/newcat.h | 2 +- src/misc.c | 1 + src/sprintflst.c | 1 + 7 files changed, 30 insertions(+), 3 deletions(-) hooks/post-receive -- Hamlib -- Ham radio control libraries |
From: n0nb <n0...@us...> - 2024-01-18 14:18:56
|
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 aec9348138c28a6b3d8569067e9c0717bf234843 (commit) from df64af4583a6e8fcac0494cd64a958ebb55ceff1 (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 aec9348138c28a6b3d8569067e9c0717bf234843 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Jan 18 07:39:56 2024 -0600 Add rig_band_changes to HAMLIB API diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 4a48d1c04..8044342c6 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -3846,6 +3846,7 @@ extern HAMLIB_EXPORT(char*) rig_date_strget(char *buf, int buflen, int localtime enum GPIO { GPIO1, GPIO2, GPIO3, GPIO4 }; extern HAMLIB_EXPORT(int) rig_cm108_get_bit(hamlib_port_t *p, enum GPIO gpio, int *bit); extern HAMLIB_EXPORT(int) rig_cm108_set_bit(hamlib_port_t *p, enum GPIO gpio, int bit); +extern HAMLIB_EXPORT(int) rig_band_changed(RIG *rig, hamlib_bandselect_t band); extern HAMLIB_EXPORT(void *) rig_data_pointer(RIG *rig, rig_ptrx_t idx); ----------------------------------------------------------------------- Summary of changes: include/hamlib/rig.h | 1 + 1 file changed, 1 insertion(+) hooks/post-receive -- Hamlib -- Ham radio control libraries |
From: n0nb <n0...@us...> - 2024-01-16 13:26:57
|
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 df64af4583a6e8fcac0494cd64a958ebb55ceff1 (commit) via 0e5d2cfc481e209624e8d9858f7129067c3be179 (commit) via 4d568c782e5e296f9d46e05fe8526de46f4fc51e (commit) via d6689145a048ad34bd91904186df93b4fc39b7aa (commit) via 34ccdcc5a57d7f06ebf6394fa50a94078b16e6ed (commit) via f15679f5758653ff2f0f09aeefea3eecc76d6afe (commit) via 7f6736368701d01944fb4f752e31099f9b0ff67e (commit) via 64f69421de9f72cb8707b87915dbbb82add28ecf (commit) via aa9c3b39baf9249e8bc3c8449971daa0cf4ea864 (commit) via fddddf1f6f1a2acfa38a92ff6ef467eeda7b4bea (commit) via 2c85a963092d4dd66bf6982a76dcc3c41ad70efe (commit) via b0d1eb297f009eef57d1d5bb47055897c22ab224 (commit) via cd1f4d39290b698e1db39f7deb055ad47de5cd89 (commit) via e178a984ca693750f2b8a45f3e6b1e516faed281 (commit) via 0b67958751067fc42a41a3ee6a734cbc70f5b4c2 (commit) via 4b03abbdac27fabb8d084c0331a5810775438699 (commit) via 11b5da878283f428144bbb21612dacc19fcd0a23 (commit) via 190747430f6b6bd7b9283175d3fccb85057b0c28 (commit) via f8fd79442dcc28a3c3ea1c7494754c8c8ff5baee (commit) via 34f953ba0b04f25475d427a799b1f8b08eae40a3 (commit) via 9b817f325df21e52416416aad431f50c6e9d770a (commit) via dc0fd2955ddc7a2eb3bd9419e2ac3135aade0255 (commit) via 89876895de0643f2ba050bed623f60ef2e96a786 (commit) via 79c496800e1b5d15b497b057840047eea7705e05 (commit) via a6951c8e1485df9ac2c71aad03bd7987f566d88a (commit) via 2646f0fd3a18938dcac26a3e843774dd01740a9e (commit) via 8280748acee945b084f740f1430903b4d42fd838 (commit) via 32ed2c4d919be757e8616f3745ef8d668b9f09c9 (commit) via ac054e9f75f8b9779346878eef3fcf2b7e33feaa (commit) via 05fb4389f79280fb5f6198688d6c4cc58625245b (commit) via e25fab7d2f279b6c8fb36775c16e5347fa7fc5ef (commit) via ddb0a6427286cb8ee020ad4e1181e5ad6d42f76a (commit) via 47062cf812ecda243266e40f7e8932966a236e7e (commit) via 7002ca9f092b319a9e4643fb786efd714a0e182e (commit) via a7d2a5e32b5084f584dccd07488c4e3082fb3238 (commit) via 2709fb8ab9fdf5e8f24db7052d7d871381490eaa (commit) via e610d3b691328e38302a20b451b813b477a10c3f (commit) via cb74453f06e4d3955281c52ebe88f99c122dcf9c (commit) via 5e59a555d8e605201b167c8b987613b43dbcd13c (commit) via df78960ff1df985c512c7fbd2af36cd8b7e819e5 (commit) via 8dff750285e43281511d4955813116418d22421f (commit) via 9af715d2443f56b11862d34ddb56d8ccdbc48fb4 (commit) via b38014832f36f4d901761829d13fae669a17acd7 (commit) via 9c7a21282cef499e61a16513619a45b5860d2aac (commit) from 21c14da270d8d73b9ecfffbf4c7709d6dc4f8c32 (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 df64af4583a6e8fcac0494cd64a958ebb55ceff1 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Jan 15 11:18:46 2024 -0600 Suppress no get_vfo message for Icom rigs. No hope of getting Icom to ever provide this ability diff --git a/src/rig.c b/src/rig.c index 85adb1bcb..c1cfd970d 100644 --- a/src/rig.c +++ b/src/rig.c @@ -3329,7 +3329,7 @@ int HAMLIB_API rig_get_vfo(RIG *rig, vfo_t *vfo) caps = rig->caps; - if (caps->get_vfo == NULL) + if (caps->get_vfo == NULL && RIG_ICOM != RIG_BACKEND_NUM(rig->caps->rig_model)) { rig_debug(RIG_DEBUG_WARN, "%s: no get_vfo\n", __func__); ELAPSED2; commit 0e5d2cfc481e209624e8d9858f7129067c3be179 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Jan 15 07:33:21 2024 -0600 Fix tx_vfo default in rig.c diff --git a/src/rig.c b/src/rig.c index e280dbec3..85adb1bcb 100644 --- a/src/rig.c +++ b/src/rig.c @@ -4509,7 +4509,7 @@ int HAMLIB_API rig_set_split_freq(RIG *rig, vfo_t vfo, freq_t tx_freq) { const struct rig_caps *caps; int retcode, rc2; - vfo_t curr_vfo, tx_vfo; + vfo_t curr_vfo, tx_vfo = RIG_VFO_CURR; freq_t tfreq = 0; if (CHECK_RIG_ARG(rig)) commit 4d568c782e5e296f9d46e05fe8526de46f4fc51e Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Jan 15 07:28:22 2024 -0600 Speed up rig_band_changed actions for FT991 and perhaps others Putting the AC001; command immediately after FA freq change make the band change end state occur immediately diff --git a/src/rig.c b/src/rig.c index 8c395be28..e280dbec3 100644 --- a/src/rig.c +++ b/src/rig.c @@ -588,7 +588,7 @@ RIG *HAMLIB_API rig_init(rig_model_t rig_model) rp = RIGPORT(rig); pttp = PTTPORT(rig); dcdp = DCDPORT(rig); - + rs->rig_model = caps->rig_model; rs->priv = NULL; rs->async_data_enabled = 0; @@ -1310,7 +1310,7 @@ int HAMLIB_API rig_open(RIG *rig) case RIG_DCD_GPIO: case RIG_DCD_GPION: dcdp->fd = gpio_open(dcdp, 0, - RIG_DCD_GPION == dcdp->type.dcd ? 0 : 1); + RIG_DCD_GPION == dcdp->type.dcd ? 0 : 1); if (dcdp->fd < 0) { @@ -1977,6 +1977,7 @@ int rig_set_freq(RIG *rig, vfo_t vfo, freq_t freq) vfo_t vfo_save; static int last_band = -1; int curr_band; + int band_changing = 0; if (CHECK_RIG_ARG(rig)) { @@ -1990,7 +1991,8 @@ int rig_set_freq(RIG *rig, vfo_t vfo, freq_t freq) { rig_debug(RIG_DEBUG_VERBOSE, "%s: band changing to %s\n", __func__, rig_get_band_str(rig, curr_band, 0)); - rig_band_changed(rig, curr_band); + band_changing = 1; + //rig_band_changed(rig, curr_band); last_band = curr_band; } @@ -2117,8 +2119,13 @@ int rig_set_freq(RIG *rig, vfo_t vfo, freq_t freq) do { - HAMLIB_TRACE; retcode = caps->set_freq(rig, vfo, freq); + + if (band_changing) + { + rig_band_changed(rig, curr_band); + } + // disabling the freq check as of 2023-06-02 // seems unnecessary and slows down rigs unnecessarily tfreq = freq; @@ -2207,6 +2214,9 @@ int rig_set_freq(RIG *rig, vfo_t vfo, freq_t freq) } HAMLIB_TRACE; + + if (band_changing) { rig_band_changed(rig, curr_band); } + retcode = caps->set_freq(rig, vfo, freq); } @@ -4521,10 +4531,8 @@ int HAMLIB_API rig_set_split_freq(RIG *rig, vfo_t vfo, freq_t tx_freq) { tx_vfo = rig->state.tx_vfo; } - else - { - tx_vfo = vfo_fixup(rig, vfo, rig->state.cache.split); - } + + tx_vfo = vfo_fixup(rig, tx_vfo, rig->state.cache.split); rig_get_freq(rig, tx_vfo, &tfreq); @@ -8652,18 +8660,22 @@ int morse_data_handler_set_keyspd(RIG *rig, int keyspd) */ HAMLIB_EXPORT(void *) rig_data_pointer(RIG *rig, rig_ptrx_t idx) { - switch(idx) + switch (idx) { case RIG_PTRX_RIGPORT: - return RIGPORT(rig); + return RIGPORT(rig); + case RIG_PTRX_PTTPORT: - return PTTPORT(rig); + return PTTPORT(rig); + case RIG_PTRX_DCDPORT: - return DCDPORT(rig); + return DCDPORT(rig); + case RIG_PTRX_CACHE: - return CACHE(rig); + return CACHE(rig); + default: - rig_debug(RIG_DEBUG_ERR, "%s: Invalid data index=%d\n", __func__, idx); - return NULL; + rig_debug(RIG_DEBUG_ERR, "%s: Invalid data index=%d\n", __func__, idx); + return NULL; } } commit d6689145a048ad34bd91904186df93b4fc39b7aa Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Jan 14 23:06:41 2024 -0600 Make rig_band_changed HAMLIB_API diff --git a/src/band_changed.c b/src/band_changed.c index 075f46ce2..848bef0bb 100644 --- a/src/band_changed.c +++ b/src/band_changed.c @@ -2,7 +2,7 @@ // Can customize during build // Eventually should improved this for external actions when // rigctld gets integrated as a service within Hamlib -int rig_band_changed(RIG *rig, hamlib_bandselect_t band) +int HAMLIB_API rig_band_changed(RIG *rig, hamlib_bandselect_t band) { // See band_changed.c // Examples: commit 34ccdcc5a57d7f06ebf6394fa50a94078b16e6ed Merge: 0b6795875 f15679f57 Author: Michael Black <mdb...@ya...> Date: Sun Jan 14 22:24:48 2024 -0600 Merge pull request #1476 from GeoBaltz/rp2 Phase 2 of moving port structures commit f15679f5758653ff2f0f09aeefea3eecc76d6afe Author: George Baltz N3GB <Geo...@gm...> Date: Sun Jan 14 16:50:06 2024 -0500 Update example.c Avoid using raw rigport, in two different ways. Fix variable name. diff --git a/tests/example.c b/tests/example.c index c784c3698..a9274d3c0 100644 --- a/tests/example.c +++ b/tests/example.c @@ -43,9 +43,9 @@ int main() /* Instantiate a rig */ my_rig = rig_init(MODEL); // your rig model. - strncpy(my_rig->state.rigport.pathname, PATH, HAMLIB_FILPATHLEN - 1); + rig_set_conf(my_rig, rig_token_lookup(my_rig, "rig_pathname"), PATH); - my_rig->state.rigport.parm.serial.rate = BAUD; // your baud rate + HAMLIB_RIGPORT(my_rig)->parm.serial.rate = BAUD; // your baud rate /* Open my rig */ retcode = rig_open(my_rig); @@ -131,7 +131,7 @@ int main() if (range) { char vfolist[256]; - rig_sprintf_vfo(vfolist, sizeof(vfo_list), my_rig->state.vfo_list); + rig_sprintf_vfo(vfolist, sizeof(vfolist), my_rig->state.vfo_list); printf("Range start=%"PRIfreq", end=%"PRIfreq", low_power=%d, high_power=%d, vfos=%s\n", range->startf, range->endf, range->low_power, range->high_power, vfolist); } commit 7f6736368701d01944fb4f752e31099f9b0ff67e Author: George Baltz N3GB <Geo...@gm...> Date: Sun Jan 14 15:08:18 2024 -0500 Need more parens to work in expressions. Clean up sticky note items. diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index f4760ed68..4a48d1c04 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -2489,13 +2489,13 @@ typedef hamlib_port_t port_t; */ #else /* Define external unique names */ -#define HAMLIB_RIGPORT(r) (hamlib_port_t *)rig_data_pointer(r, RIG_PTRX_RIGPORT) -#define HAMLIB_PTTPORT(r) (hamlib_port_t *)rig_data_pointer(r, RIG_PTRX_PTTPORT) -#define HAMLIB_DCDPORT(r) (hamlib_port_t *)rig_data_pointer(r, RIG_PTRX_DCDPORT) -//#define HAMLIB_CACHE(r) (struct rig_cache *)rig_data_pointer(r, RIG_PTRX_CACHE) -#define HAMLIB_AMPPORT(a) (hamlib_port_t *)amp_data_pointer(a, RIG_PTRX_AMPPORT) -#define HAMLIB_ROTPORT(r) (hamlib_port_t *)rot_data_pointer(r, RIG_PTRX_ROTPORT) -#define HAMLIB_ROTPORT2(r) (hamlib_port_t *)rot_data_pointer(r, RIG_PTRX_ROTPORT2) +#define HAMLIB_RIGPORT(r) ((hamlib_port_t *)rig_data_pointer(r, RIG_PTRX_RIGPORT)) +#define HAMLIB_PTTPORT(r) ((hamlib_port_t *)rig_data_pointer(r, RIG_PTRX_PTTPORT)) +#define HAMLIB_DCDPORT(r) ((hamlib_port_t *)rig_data_pointer(r, RIG_PTRX_DCDPORT)) +#define HAMLIB_CACHE(r) ((struct rig_cache *)rig_data_pointer(r, RIG_PTRX_CACHE)) +#define HAMLIB_AMPPORT(a) ((hamlib_port_t *)amp_data_pointer(a, RIG_PTRX_AMPPORT)) +#define HAMLIB_ROTPORT(r) ((hamlib_port_t *)rot_data_pointer(r, RIG_PTRX_ROTPORT)) +#define HAMLIB_ROTPORT2(r) ((hamlib_port_t *)rot_data_pointer(r, RIG_PTRX_ROTPORT2)) #endif typedef enum { diff --git a/src/conf.c b/src/conf.c index 7a37428a3..5099a0fad 100644 --- a/src/conf.c +++ b/src/conf.c @@ -573,7 +573,7 @@ static int frontend_set_conf(RIG *rig, token_t token, const char *val) } // JTDX and WSJTX currently use state.pttport to check for PTT_NONE - rig->state.pttport.type.ptt = pttp->type.ptt; +// rig->state.pttport.type.ptt = pttp->type.ptt; rs->pttport_deprecated.type.ptt = pttp->type.ptt; break; commit 64f69421de9f72cb8707b87915dbbb82add28ecf Author: George Baltz N3GB <Geo...@gm...> Date: Sat Jan 13 20:55:27 2024 -0500 Pointerize all the ports in src/rig.c diff --git a/src/rig.c b/src/rig.c index a3c93396f..8c395be28 100644 --- a/src/rig.c +++ b/src/rig.c @@ -518,6 +518,7 @@ RIG *HAMLIB_API rig_init(rig_model_t rig_model) RIG *rig; const struct rig_caps *caps; struct rig_state *rs; + hamlib_port_t *rp, *pttp, *dcdp; int i; rig_check_rig_caps(); @@ -582,11 +583,17 @@ RIG *HAMLIB_API rig_init(rig_model_t rig_model) pthread_mutex_init(&rs->mutex_set_transaction, NULL); #endif + //TODO Allocate and link ports + // For now, use the embedded ones + rp = RIGPORT(rig); + pttp = PTTPORT(rig); + dcdp = DCDPORT(rig); + rs->rig_model = caps->rig_model; rs->priv = NULL; rs->async_data_enabled = 0; - rs->rigport.fd = -1; - rs->pttport.fd = -1; + rp->fd = -1; + pttp->fd = -1; rs->comm_state = 0; rig->state.depth = 1; #if 0 // extra debug if needed @@ -594,9 +601,9 @@ RIG *HAMLIB_API rig_init(rig_model_t rig_model) __LINE__, &rs->comm_state, rs->comm_state); #endif - rs->rigport.type.rig = caps->port_type; /* default from caps */ + rp->type.rig = caps->port_type; /* default from caps */ #if defined(HAVE_PTHREAD) - rs->rigport.asyncio = 0; + rp->asyncio = 0; #endif rig->state.comm_status = RIG_COMM_STATUS_CONNECTING; @@ -605,73 +612,73 @@ RIG *HAMLIB_API rig_init(rig_model_t rig_model) switch (caps->port_type) { case RIG_PORT_SERIAL: - strncpy(rs->rigport.pathname, DEFAULT_SERIAL_PORT, HAMLIB_FILPATHLEN - 1); - rs->rigport.parm.serial.rate = caps->serial_rate_max; /* fastest ! */ - rs->rigport.parm.serial.data_bits = caps->serial_data_bits; - rs->rigport.parm.serial.stop_bits = caps->serial_stop_bits; - rs->rigport.parm.serial.parity = caps->serial_parity; - rs->rigport.parm.serial.handshake = caps->serial_handshake; + strncpy(rp->pathname, DEFAULT_SERIAL_PORT, HAMLIB_FILPATHLEN - 1); + rp->parm.serial.rate = caps->serial_rate_max; /* fastest ! */ + rp->parm.serial.data_bits = caps->serial_data_bits; + rp->parm.serial.stop_bits = caps->serial_stop_bits; + rp->parm.serial.parity = caps->serial_parity; + rp->parm.serial.handshake = caps->serial_handshake; break; case RIG_PORT_PARALLEL: - strncpy(rs->rigport.pathname, DEFAULT_PARALLEL_PORT, HAMLIB_FILPATHLEN - 1); + strncpy(rp->pathname, DEFAULT_PARALLEL_PORT, HAMLIB_FILPATHLEN - 1); break; /* Adding support for CM108 GPIO. This is compatible with CM108 series * USB audio chips from CMedia and SSS1623 series USB audio chips from 3S */ case RIG_PORT_CM108: - strncpy(rs->rigport.pathname, DEFAULT_CM108_PORT, HAMLIB_FILPATHLEN); + strncpy(rp->pathname, DEFAULT_CM108_PORT, HAMLIB_FILPATHLEN); - if (rs->rigport.parm.cm108.ptt_bitnum == 0) + if (rp->parm.cm108.ptt_bitnum == 0) { - rs->rigport.parm.cm108.ptt_bitnum = DEFAULT_CM108_PTT_BITNUM; - rs->pttport.parm.cm108.ptt_bitnum = DEFAULT_CM108_PTT_BITNUM; + rp->parm.cm108.ptt_bitnum = DEFAULT_CM108_PTT_BITNUM; + pttp->parm.cm108.ptt_bitnum = DEFAULT_CM108_PTT_BITNUM; } break; case RIG_PORT_GPIO: - strncpy(rs->rigport.pathname, DEFAULT_GPIO_PORT, HAMLIB_FILPATHLEN); + strncpy(rp->pathname, DEFAULT_GPIO_PORT, HAMLIB_FILPATHLEN); break; case RIG_PORT_NETWORK: case RIG_PORT_UDP_NETWORK: - strncpy(rs->rigport.pathname, "127.0.0.1:4532", HAMLIB_FILPATHLEN - 1); + strncpy(rp->pathname, "127.0.0.1:4532", HAMLIB_FILPATHLEN - 1); break; default: - strncpy(rs->rigport.pathname, "", HAMLIB_FILPATHLEN - 1); + strncpy(rp->pathname, "", HAMLIB_FILPATHLEN - 1); } - rs->rigport.write_delay = caps->write_delay; - rs->rigport.post_write_delay = caps->post_write_delay; + rp->write_delay = caps->write_delay; + rp->post_write_delay = caps->post_write_delay; // since we do two timeouts now we can cut the timeout in half for serial if (caps->port_type == RIG_PORT_SERIAL && caps->timeout_retry >= 0) { - rs->rigport.timeout = caps->timeout / 2; + rp->timeout = caps->timeout / 2; } - rs->rigport.retry = caps->retry; + rp->retry = caps->retry; if (caps->timeout_retry < 0) { // Rigs may disable read timeout retries - rs->rigport.timeout_retry = 0; + rp->timeout_retry = 0; } else if (caps->timeout_retry == 0) { // Default to 1 retry for read timeouts - rs->rigport.timeout_retry = 1; + rp->timeout_retry = 1; } else { - rs->rigport.timeout_retry = caps->timeout_retry; + rp->timeout_retry = caps->timeout_retry; } - rs->pttport.type.ptt = caps->ptt_type; - rs->dcdport.type.dcd = caps->dcd_type; + pttp->type.ptt = caps->ptt_type; + dcdp->type.dcd = caps->dcd_type; rs->vfo_comp = 0.0; /* override it with preferences */ rs->current_vfo = RIG_VFO_CURR; /* we don't know yet! */ @@ -837,7 +844,7 @@ RIG *HAMLIB_API rig_init(rig_model_t rig_model) rs->max_ifshift = caps->max_ifshift; rs->announces = caps->announces; - rs->rigport.fd = rs->pttport.fd = rs->dcdport.fd = -1; + rp->fd = pttp->fd = dcdp->fd = -1; // some rigs (like SDR) behave differnt when checking for power on // So we assume power is on until one of the backends KNOWS it is off rs->powerstat = RIG_POWER_ON; // default to power on until proven otherwise @@ -889,6 +896,9 @@ int HAMLIB_API rig_open(RIG *rig) { struct rig_caps *caps; struct rig_state *rs; + hamlib_port_t *rp = RIGPORT(rig); + hamlib_port_t *pttp = PTTPORT(rig); + hamlib_port_t *dcdp = DCDPORT(rig); int status = RIG_OK; value_t parm_value; //unsigned int net1, net2, net3, net4, net5, net6, net7, net8, port; @@ -904,10 +914,10 @@ int HAMLIB_API rig_open(RIG *rig) caps = rig->caps; rs = &rig->state; - rs->rigport.rig = rig; + rp->rig = rig; rs->rigport_deprecated.rig = rig; - if (strcmp(rs->rigport.pathname, "USB") == 0) + if (strcmp(rp->pathname, "USB") == 0) { rig_debug(RIG_DEBUG_ERR, "%s: 'USB' is not a valid COM port name\n", __func__); errno = 2; @@ -917,27 +927,27 @@ int HAMLIB_API rig_open(RIG *rig) // rigctl/rigctld may have deprecated values -- backwards compatibility if (rs->rigport_deprecated.pathname[0] != 0) { - strcpy(rs->rigport.pathname, rs->rigport_deprecated.pathname); + strcpy(rp->pathname, rs->rigport_deprecated.pathname); } if (rs->pttport_deprecated.type.ptt != RIG_PTT_NONE) { - rs->pttport.type.ptt = rs->pttport_deprecated.type.ptt; + pttp->type.ptt = rs->pttport_deprecated.type.ptt; } if (rs->dcdport_deprecated.type.dcd != RIG_DCD_NONE) { - rs->dcdport.type.dcd = rs->dcdport_deprecated.type.dcd; + dcdp->type.dcd = rs->dcdport_deprecated.type.dcd; } if (rs->pttport_deprecated.pathname[0] != 0) { - strcpy(rs->pttport.pathname, rs->pttport_deprecated.pathname); + strcpy(pttp->pathname, rs->pttport_deprecated.pathname); } if (rs->dcdport_deprecated.pathname[0] != 0) { - strcpy(rs->dcdport.pathname, rs->dcdport_deprecated.pathname); + strcpy(dcdp->pathname, rs->dcdport_deprecated.pathname); } rig_settings_load_all(NULL); // load default .hamlib_settings @@ -987,12 +997,12 @@ int HAMLIB_API rig_open(RIG *rig) "%s: async_data_enable=%d, async_data_supported=%d\n", __func__, rs->async_data_enabled, caps->async_data_supported); rs->async_data_enabled = rs->async_data_enabled && caps->async_data_supported; - rs->rigport.asyncio = rs->async_data_enabled; + rp->asyncio = rs->async_data_enabled; - if (strlen(rs->rigport.pathname) > 0) + if (strlen(rp->pathname) > 0) { char hoststr[256], portstr[6]; - status = parse_hoststr(rs->rigport.pathname, sizeof(rs->rigport.pathname), + status = parse_hoststr(rp->pathname, sizeof(rp->pathname), hoststr, portstr); if (status == RIG_OK) { is_network = 1; } @@ -1001,16 +1011,16 @@ int HAMLIB_API rig_open(RIG *rig) #if 0 // determine if we have a network address // - is_network |= sscanf(rs->rigport.pathname, "%u.%u.%u.%u:%u", &net1, &net2, + is_network |= sscanf(rp->pathname, "%u.%u.%u.%u:%u", &net1, &net2, &net3, &net4, &port) == 5; - is_network |= sscanf(rs->rigport.pathname, ":%u", &port) == 1; - is_network |= sscanf(rs->rigport.pathname, "%u::%u:%u:%u:%u:%u", &net1, &net2, + is_network |= sscanf(rp->pathname, ":%u", &port) == 1; + is_network |= sscanf(rp->pathname, "%u::%u:%u:%u:%u:%u", &net1, &net2, &net3, &net4, &net5, &port) == 6; - is_network |= sscanf(rs->rigport.pathname, "%u:%u:%u:%u:%u:%u:%u:%u:%u", &net1, + is_network |= sscanf(rp->pathname, "%u:%u:%u:%u:%u:%u:%u:%u:%u", &net1, &net2, &net3, &net4, &net5, &net6, &net7, &net8, &port) == 9; // if we haven't met one of the condition above then we must have a hostname - if (!is_network && (token = strtok_r(rs->rigport.pathname, ":", &strtokp))) + if (!is_network && (token = strtok_r(rp->pathname, ":", &strtokp))) { rig_debug(RIG_DEBUG_TRACE, "%s: token1=%s\n", __func__, token); token = strtok_r(strtokp, ":", &strtokp); @@ -1028,8 +1038,8 @@ int HAMLIB_API rig_open(RIG *rig) if (is_network) { rig_debug(RIG_DEBUG_TRACE, "%s: using network address %s\n", __func__, - rs->rigport.pathname); - rs->rigport.type.rig = RIG_PORT_NETWORK; + rp->pathname); + rp->type.rig = RIG_PORT_NETWORK; if (RIG_BACKEND_NUM(rig->caps->rig_model) == RIG_ICOM) { @@ -1039,7 +1049,7 @@ int HAMLIB_API rig_open(RIG *rig) { rig_debug(RIG_DEBUG_TRACE, "%s(%d): Icom rig UDP network enabled\n", __FILE__, __LINE__); - rs->rigport.type.rig = RIG_PORT_UDP_NETWORK; + rp->type.rig = RIG_PORT_UDP_NETWORK; } #endif @@ -1051,55 +1061,55 @@ int HAMLIB_API rig_open(RIG *rig) rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): %p rs->comm_state==1?=%d\n", __func__, __LINE__, &rs->comm_state, rs->comm_state); - port_close(&rs->rigport, rs->rigport.type.rig); + port_close(rp, rp->type.rig); rs->comm_state = 0; RETURNFUNC2(-RIG_EINVAL); } rs->comm_status = RIG_COMM_STATUS_CONNECTING; - rs->rigport.fd = -1; + rp->fd = -1; - if (rs->rigport.type.rig == RIG_PORT_SERIAL) + if (rp->type.rig == RIG_PORT_SERIAL) { - if (rs->rigport.parm.serial.rts_state != RIG_SIGNAL_UNSET - && rs->rigport.parm.serial.handshake == RIG_HANDSHAKE_HARDWARE) + if (rp->parm.serial.rts_state != RIG_SIGNAL_UNSET + && rp->parm.serial.handshake == RIG_HANDSHAKE_HARDWARE) { rig_debug(RIG_DEBUG_ERR, "%s: cannot set RTS with hardware handshake \"%s\"\n", __func__, - rs->rigport.pathname); + rp->pathname); RETURNFUNC2(-RIG_ECONF); } - if ('\0' == rs->pttport.pathname[0] - || !strcmp(rs->pttport.pathname, rs->rigport.pathname)) + if ('\0' == pttp->pathname[0] + || !strcmp(pttp->pathname, rp->pathname)) { /* check for control line conflicts */ - if (rs->rigport.parm.serial.rts_state != RIG_SIGNAL_UNSET - && rs->pttport.type.ptt == RIG_PTT_SERIAL_RTS) + if (rp->parm.serial.rts_state != RIG_SIGNAL_UNSET + && pttp->type.ptt == RIG_PTT_SERIAL_RTS) { rig_debug(RIG_DEBUG_ERR, "%s: cannot set RTS with PTT by RTS \"%s\"\n", __func__, - rs->rigport.pathname); + rp->pathname); RETURNFUNC2(-RIG_ECONF); } - if (rs->rigport.parm.serial.dtr_state != RIG_SIGNAL_UNSET - && rs->pttport.type.ptt == RIG_PTT_SERIAL_DTR) + if (rp->parm.serial.dtr_state != RIG_SIGNAL_UNSET + && pttp->type.ptt == RIG_PTT_SERIAL_DTR) { rig_debug(RIG_DEBUG_ERR, "%s: cannot set DTR with PTT by DTR \"%s\"\n", __func__, - rs->rigport.pathname); + rp->pathname); RETURNFUNC2(-RIG_ECONF); } } } - rs->rigport.timeout = caps->timeout; - status = port_open(&rs->rigport); + rp->timeout = caps->timeout; + status = port_open(rp); if (status < 0) { @@ -1110,7 +1120,7 @@ int HAMLIB_API rig_open(RIG *rig) RETURNFUNC2(status); } - switch (rs->pttport.type.ptt) + switch (pttp->type.ptt) { case RIG_PTT_NONE: case RIG_PTT_RIG: @@ -1119,124 +1129,123 @@ int HAMLIB_API rig_open(RIG *rig) case RIG_PTT_SERIAL_RTS: case RIG_PTT_SERIAL_DTR: - if (rs->pttport.pathname[0] == '\0' - && rs->rigport.type.rig == RIG_PORT_SERIAL) + if (pttp->pathname[0] == '\0' + && rp->type.rig == RIG_PORT_SERIAL) { - strcpy(rs->pttport.pathname, rs->rigport.pathname); + strcpy(pttp->pathname, rp->pathname); } - if (!strcmp(rs->pttport.pathname, rs->rigport.pathname)) + if (!strcmp(pttp->pathname, rp->pathname)) { - rs->pttport.fd = rs->rigport.fd; + pttp->fd = rp->fd; /* Needed on Linux because the serial port driver sets RTS/DTR on open - only need to address the PTT line as we offer config parameters to control the other (dtr_state & rts_state) */ - if (rs->pttport.type.ptt == RIG_PTT_SERIAL_DTR) + if (pttp->type.ptt == RIG_PTT_SERIAL_DTR) { - status = ser_set_dtr(&rs->pttport, 0); + status = ser_set_dtr(pttp, 0); } - if (rs->pttport.type.ptt == RIG_PTT_SERIAL_RTS) + if (pttp->type.ptt == RIG_PTT_SERIAL_RTS) { - status = ser_set_rts(&rs->pttport, 0); + status = ser_set_rts(pttp, 0); } } else { - rs->pttport.fd = ser_open(&rs->pttport); + pttp->fd = ser_open(pttp); - if (rs->pttport.fd < 0) + if (pttp->fd < 0) { rig_debug(RIG_DEBUG_ERR, "%s: cannot open PTT device \"%s\"\n", __func__, - rs->pttport.pathname); + pttp->pathname); status = -RIG_EIO; } if (RIG_OK == status - && (rs->pttport.type.ptt == RIG_PTT_SERIAL_DTR - || rs->pttport.type.ptt == RIG_PTT_SERIAL_RTS)) + && (pttp->type.ptt == RIG_PTT_SERIAL_DTR + || pttp->type.ptt == RIG_PTT_SERIAL_RTS)) { /* Needed on Linux because the serial port driver sets RTS/DTR high on open - set both low since we offer no control of the non-PTT line and low is better than high */ - status = ser_set_dtr(&rs->pttport, 0); + status = ser_set_dtr(pttp, 0); if (RIG_OK == status) { - status = ser_set_rts(&rs->pttport, 0); + status = ser_set_rts(pttp, 0); } } - ser_close(&rs->pttport); + ser_close(pttp); } break; case RIG_PTT_PARALLEL: - rs->pttport.fd = par_open(&rs->pttport); + pttp->fd = par_open(pttp); - if (rs->pttport.fd < 0) + if (pttp->fd < 0) { rig_debug(RIG_DEBUG_ERR, "%s: cannot open PTT device \"%s\"\n", __func__, - rs->pttport.pathname); + pttp->pathname); status = -RIG_EIO; } else { - par_ptt_set(&rs->pttport, RIG_PTT_OFF); + par_ptt_set(pttp, RIG_PTT_OFF); } break; case RIG_PTT_CM108: - rs->pttport.fd = cm108_open(&rs->pttport); + pttp->fd = cm108_open(pttp); - strncpy(rs->rigport.pathname, DEFAULT_CM108_PORT, HAMLIB_FILPATHLEN); + strncpy(rp->pathname, DEFAULT_CM108_PORT, HAMLIB_FILPATHLEN); - if (rs->rigport.parm.cm108.ptt_bitnum == 0) + if (rp->parm.cm108.ptt_bitnum == 0) { - rs->rigport.parm.cm108.ptt_bitnum = DEFAULT_CM108_PTT_BITNUM; - rs->pttport.parm.cm108.ptt_bitnum = DEFAULT_CM108_PTT_BITNUM; + rp->parm.cm108.ptt_bitnum = DEFAULT_CM108_PTT_BITNUM; + pttp->parm.cm108.ptt_bitnum = DEFAULT_CM108_PTT_BITNUM; } - if (rs->pttport.fd < 0) + if (pttp->fd < 0) { rig_debug(RIG_DEBUG_ERR, "%s: cannot open PTT device \"%s\"\n", __func__, - rs->pttport.pathname); + pttp->pathname); status = -RIG_EIO; } else { - cm108_ptt_set(&rs->pttport, RIG_PTT_OFF); + cm108_ptt_set(pttp, RIG_PTT_OFF); } break; case RIG_PTT_GPIO: case RIG_PTT_GPION: - rs->pttport.fd = gpio_open(&rs->pttport, 1, - RIG_PTT_GPION == rs->pttport.type.ptt ? 0 : 1); + pttp->fd = gpio_open(pttp, 1, RIG_PTT_GPION == pttp->type.ptt ? 0 : 1); - if (rs->pttport.fd < 0) + if (pttp->fd < 0) { rig_debug(RIG_DEBUG_ERR, "%s: cannot open PTT device \"GPIO%s\"\n", __func__, - rs->pttport.pathname); + pttp->pathname); status = -RIG_EIO; } else { - gpio_ptt_set(&rs->pttport, RIG_PTT_OFF); + gpio_ptt_set(pttp, RIG_PTT_OFF); } break; @@ -1245,11 +1254,11 @@ int HAMLIB_API rig_open(RIG *rig) rig_debug(RIG_DEBUG_ERR, "%s: unsupported PTT type %d\n", __func__, - rs->pttport.type.ptt); + pttp->type.ptt); status = -RIG_ECONF; } - switch (rs->dcdport.type.dcd) + switch (dcdp->type.dcd) { case RIG_DCD_NONE: case RIG_DCD_RIG: @@ -1258,41 +1267,41 @@ int HAMLIB_API rig_open(RIG *rig) case RIG_DCD_SERIAL_DSR: case RIG_DCD_SERIAL_CTS: case RIG_DCD_SERIAL_CAR: - if (rs->dcdport.pathname[0] == '\0' - && rs->rigport.type.rig == RIG_PORT_SERIAL) + if (dcdp->pathname[0] == '\0' + && rp->type.rig == RIG_PORT_SERIAL) { - strcpy(rs->dcdport.pathname, rs->rigport.pathname); + strcpy(dcdp->pathname, rp->pathname); } - if (strcmp(rs->dcdport.pathname, rs->rigport.pathname) == 0) + if (strcmp(dcdp->pathname, rp->pathname) == 0) { - rs->dcdport.fd = rs->rigport.fd; + dcdp->fd = rp->fd; } else { - rs->dcdport.fd = ser_open(&rs->dcdport); + dcdp->fd = ser_open(dcdp); } - if (rs->dcdport.fd < 0) + if (dcdp->fd < 0) { rig_debug(RIG_DEBUG_ERR, "%s: cannot open DCD device \"%s\"\n", __func__, - rs->dcdport.pathname); + dcdp->pathname); status = -RIG_EIO; } break; case RIG_DCD_PARALLEL: - rs->dcdport.fd = par_open(&rs->dcdport); + dcdp->fd = par_open(dcdp); - if (rs->dcdport.fd < 0) + if (dcdp->fd < 0) { rig_debug(RIG_DEBUG_ERR, "%s: cannot open DCD device \"%s\"\n", __func__, - rs->dcdport.pathname); + dcdp->pathname); status = -RIG_EIO; } @@ -1300,15 +1309,15 @@ int HAMLIB_API rig_open(RIG *rig) case RIG_DCD_GPIO: case RIG_DCD_GPION: - rs->dcdport.fd = gpio_open(&rs->dcdport, 0, - RIG_DCD_GPION == rs->dcdport.type.dcd ? 0 : 1); + dcdp->fd = gpio_open(dcdp, 0, + RIG_DCD_GPION == dcdp->type.dcd ? 0 : 1); - if (rs->dcdport.fd < 0) + if (dcdp->fd < 0) { rig_debug(RIG_DEBUG_ERR, "%s: cannot open DCD device \"GPIO%s\"\n", __func__, - rs->dcdport.pathname); + dcdp->pathname); status = -RIG_EIO; } @@ -1318,13 +1327,13 @@ int HAMLIB_API rig_open(RIG *rig) rig_debug(RIG_DEBUG_ERR, "%s: unsupported DCD type %d\n", __func__, - rs->dcdport.type.dcd); + dcdp->type.dcd); status = -RIG_ECONF; } if (status < 0) { - port_close(&rs->rigport, rs->rigport.type.rig); + port_close(rp, rp->type.rig); rig->state.comm_status = RIG_COMM_STATUS_ERROR; RETURNFUNC2(status); } @@ -1337,7 +1346,7 @@ int HAMLIB_API rig_open(RIG *rig) if (status < 0) { - port_close(&rs->rigport, rs->rigport.type.rig); + port_close(rp, rp->type.rig); rig->state.comm_status = RIG_COMM_STATUS_ERROR; RETURNFUNC2(status); } @@ -1357,8 +1366,8 @@ int HAMLIB_API rig_open(RIG *rig) * Maybe the backend has something to initialize * In case of failure, just close down and report error code. */ - int retry_save = rs->rigport.retry; - rs->rigport.retry = 0; + int retry_save = rp->retry; + rp->retry = 0; if (caps->rig_open != NULL) { @@ -1404,8 +1413,8 @@ int HAMLIB_API rig_open(RIG *rig) } #endif - port_close(&rs->rigport, rs->rigport.type.rig); - memcpy(&rs->rigport_deprecated, &rs->rigport, sizeof(hamlib_port_t_deprecated)); + port_close(rp, rp->type.rig); + memcpy(&rs->rigport_deprecated, rp, sizeof(hamlib_port_t_deprecated)); rs->comm_state = 0; rig->state.comm_status = RIG_COMM_STATUS_ERROR; RETURNFUNC2(status); @@ -1466,7 +1475,7 @@ int HAMLIB_API rig_open(RIG *rig) { rig_debug(RIG_DEBUG_ERR, "%s: cw_data_handler_start failed: %s\n", __func__, rigerror(status)); - port_close(&rs->rigport, rs->rigport.type.rig); + port_close(rp, rp->type.rig); RETURNFUNC2(status); } @@ -1535,12 +1544,12 @@ int HAMLIB_API rig_open(RIG *rig) } } - rs->rigport.retry = retry_save; + rp->retry = retry_save; - memcpy(&rs->rigport_deprecated, &rs->rigport, sizeof(hamlib_port_t_deprecated)); - memcpy(&rs->pttport_deprecated, &rs->pttport, sizeof(hamlib_port_t_deprecated)); - memcpy(&rs->dcdport_deprecated, &rs->dcdport, sizeof(hamlib_port_t_deprecated)); - rig_flush_force(&rs->rigport, 1); + memcpy(&rs->rigport_deprecated, rp, sizeof(hamlib_port_t_deprecated)); + memcpy(&rs->pttport_deprecated, pttp, sizeof(hamlib_port_t_deprecated)); + memcpy(&rs->dcdport_deprecated, dcdp, sizeof(hamlib_port_t_deprecated)); + rig_flush_force(rp, 1); #if defined(HAVE_PTHREAD) enum multicast_item_e items = RIG_MULTICAST_POLL | RIG_MULTICAST_TRANSCEIVE @@ -1602,6 +1611,9 @@ int HAMLIB_API rig_open(RIG *rig) int HAMLIB_API rig_close(RIG *rig) { const struct rig_caps *caps; + hamlib_port_t *rp = RIGPORT(rig); + hamlib_port_t *pttp = PTTPORT(rig); + hamlib_port_t *dcdp = DCDPORT(rig); struct rig_state *rs; if (!rig || !rig->caps) @@ -1652,7 +1664,7 @@ int HAMLIB_API rig_close(RIG *rig) * FIXME: what happens if PTT and rig ports are the same? * (eg. ptt_type = RIG_PTT_SERIAL) */ - switch (rs->pttport.type.ptt) + switch (pttp->type.ptt) { case RIG_PTT_NONE: case RIG_PTT_RIG: @@ -1662,14 +1674,14 @@ int HAMLIB_API rig_close(RIG *rig) case RIG_PTT_SERIAL_RTS: // If port is already closed, do nothing - if (rs->pttport.fd > -1) + if (pttp->fd > -1) { - ser_set_rts(&rs->pttport, 0); + ser_set_rts(pttp, 0); - if (rs->pttport.fd != rs->rigport.fd) + if (pttp->fd != rp->fd) { - port_close(&rs->pttport, RIG_PORT_SERIAL); - memcpy(&rs->rigport_deprecated, &rs->rigport, sizeof(hamlib_port_t_deprecated)); + port_close(pttp, RIG_PORT_SERIAL); + memcpy(&rs->rigport_deprecated, rp, sizeof(hamlib_port_t_deprecated)); } } @@ -1678,43 +1690,43 @@ int HAMLIB_API rig_close(RIG *rig) case RIG_PTT_SERIAL_DTR: // If port is already closed, do nothing - if (rs->pttport.fd > -1) + if (pttp->fd > -1) { - ser_set_dtr(&rs->pttport, 0); + ser_set_dtr(pttp, 0); - if (rs->pttport.fd != rs->rigport.fd) + if (pttp->fd != rp->fd) { - port_close(&rs->pttport, RIG_PORT_SERIAL); - memcpy(&rs->rigport_deprecated, &rs->rigport, sizeof(hamlib_port_t_deprecated)); + port_close(pttp, RIG_PORT_SERIAL); + memcpy(&rs->rigport_deprecated, rp, sizeof(hamlib_port_t_deprecated)); } } break; case RIG_PTT_PARALLEL: - par_ptt_set(&rs->pttport, RIG_PTT_OFF); - par_close(&rs->pttport); + par_ptt_set(pttp, RIG_PTT_OFF); + par_close(pttp); break; case RIG_PTT_CM108: - cm108_ptt_set(&rs->pttport, RIG_PTT_OFF); - cm108_close(&rs->pttport); + cm108_ptt_set(pttp, RIG_PTT_OFF); + cm108_close(pttp); break; case RIG_PTT_GPIO: case RIG_PTT_GPION: - gpio_ptt_set(&rs->pttport, RIG_PTT_OFF); - gpio_close(&rs->pttport); + gpio_ptt_set(pttp, RIG_PTT_OFF); + gpio_close(pttp); break; default: rig_debug(RIG_DEBUG_ERR, "%s: unsupported PTT type %d\n", __func__, - rs->pttport.type.ptt); + pttp->type.ptt); } - switch (rs->dcdport.type.dcd) + switch (dcdp->type.dcd) { case RIG_DCD_NONE: case RIG_DCD_RIG: @@ -1723,33 +1735,33 @@ int HAMLIB_API rig_close(RIG *rig) case RIG_DCD_SERIAL_DSR: case RIG_DCD_SERIAL_CTS: case RIG_DCD_SERIAL_CAR: - if (rs->dcdport.fd != rs->rigport.fd) + if (dcdp->fd != rp->fd) { - port_close(&rs->dcdport, RIG_PORT_SERIAL); - memcpy(&rs->rigport_deprecated, &rs->rigport, sizeof(hamlib_port_t_deprecated)); + port_close(dcdp, RIG_PORT_SERIAL); + memcpy(&rs->rigport_deprecated, rp, sizeof(hamlib_port_t_deprecated)); } break; case RIG_DCD_PARALLEL: - par_close(&rs->dcdport); + par_close(dcdp); break; case RIG_DCD_GPIO: case RIG_DCD_GPION: - gpio_close(&rs->dcdport); + gpio_close(dcdp); break; default: rig_debug(RIG_DEBUG_ERR, "%s: unsupported DCD type %d\n", __func__, - rs->dcdport.type.dcd); + dcdp->type.dcd); } - rs->dcdport.fd = rs->pttport.fd = -1; + dcdp->fd = pttp->fd = -1; - port_close(&rs->rigport, rs->rigport.type.rig); + port_close(rp, rp->type.rig); // zero split so it will allow it to be set again on open for rigctld rig->state.cache.split = 0; @@ -1798,6 +1810,8 @@ int HAMLIB_API rig_cleanup(RIG *rig) rig->caps->rig_cleanup(rig); } + //TODO Release and null any allocated port structures + free(rig); return (RIG_OK); @@ -3373,6 +3387,8 @@ int HAMLIB_API rig_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) { const struct rig_caps *caps; struct rig_state *rs = &rig->state; + hamlib_port_t *rp = RIGPORT(rig); + hamlib_port_t *pttp = PTTPORT(rig); int retcode = RIG_OK; if (CHECK_RIG_ARG(rig)) @@ -3388,7 +3404,7 @@ int HAMLIB_API rig_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) LOCK(1); - switch (rig->state.pttport.type.ptt) + switch (pttp->type.ptt) { case RIG_PTT_RIG: if (ptt == RIG_PTT_ON_MIC || ptt == RIG_PTT_ON_DATA) @@ -3536,19 +3552,19 @@ int HAMLIB_API rig_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) port when PTT is reset and seize the port when PTT is set, this allows limited sharing of the PTT port between applications so long as there is no contention */ - if (strcmp(rs->pttport.pathname, rs->rigport.pathname) - && rs->pttport.fd < 0 + if (strcmp(pttp->pathname, rp->pathname) + && pttp->fd < 0 && RIG_PTT_OFF != ptt) { - rs->pttport.fd = ser_open(&rs->pttport); + pttp->fd = ser_open(pttp); - if (rs->pttport.fd < 0) + if (pttp->fd < 0) { rig_debug(RIG_DEBUG_ERR, "%s: cannot open PTT device \"%s\"\n", __func__, - rs->pttport.pathname); + pttp->pathname); ELAPSED2; RETURNFUNC(-RIG_EIO); } @@ -3556,7 +3572,7 @@ int HAMLIB_API rig_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) /* Needed on Linux because the serial port driver sets RTS/DTR high on open - set both since we offer no control of the non-PTT line and low is better than high */ - retcode = ser_set_rts(&rs->pttport, 0); + retcode = ser_set_rts(pttp, 0); if (RIG_OK != retcode) { @@ -3565,16 +3581,16 @@ int HAMLIB_API rig_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) } } - retcode = ser_set_dtr(&rig->state.pttport, ptt != RIG_PTT_OFF); + retcode = ser_set_dtr(pttp, ptt != RIG_PTT_OFF); rig_debug(RIG_DEBUG_TRACE, "%s: rigport=%s, pttport=%s, ptt_share=%d\n", - __func__, rs->pttport.pathname, rs->rigport.pathname, rs->ptt_share); + __func__, rp->pathname, pttp->pathname, rs->ptt_share); - if (strcmp(rs->pttport.pathname, rs->rigport.pathname) + if (strcmp(pttp->pathname, rp->pathname) && ptt == RIG_PTT_OFF && rs->ptt_share != 0) { /* free the port */ - ser_close(&rs->pttport); + ser_close(pttp); } break; @@ -3585,20 +3601,20 @@ int HAMLIB_API rig_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) port when PTT is reset and seize the port when PTT is set, this allows limited sharing of the PTT port between applications so long as there is no contention */ - if (strcmp(rs->pttport.pathname, rs->rigport.pathname) - && rs->pttport.fd < 0 + if (strcmp(pttp->pathname, rp->pathname) + && pttp->fd < 0 && RIG_PTT_OFF != ptt) { rig_debug(RIG_DEBUG_TRACE, "%s: PTT RTS debug#1\n", __func__); - rs->pttport.fd = ser_open(&rs->pttport); + pttp->fd = ser_open(pttp); - if (rs->pttport.fd < 0) + if (pttp->fd < 0) { rig_debug(RIG_DEBUG_ERR, "%s: cannot open PTT device \"%s\"\n", __func__, - rs->pttport.pathname); + pttp->pathname); ELAPSED2; RETURNFUNC(-RIG_EIO); } @@ -3606,7 +3622,7 @@ int HAMLIB_API rig_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) /* Needed on Linux because the serial port driver sets RTS/DTR high on open - set both since we offer no control of the non-PTT line and low is better than high */ - retcode = ser_set_dtr(&rs->pttport, 0); + retcode = ser_set_dtr(pttp, 0); if (RIG_OK != retcode) { @@ -3616,31 +3632,31 @@ int HAMLIB_API rig_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) } } - retcode = ser_set_rts(&rig->state.pttport, ptt != RIG_PTT_OFF); + retcode = ser_set_rts(pttp, ptt != RIG_PTT_OFF); rig_debug(RIG_DEBUG_TRACE, "%s: rigport=%s, pttport=%s, ptt_share=%d\n", - __func__, rs->pttport.pathname, rs->rigport.pathname, rs->ptt_share); + __func__, rp->pathname, pttp->pathname, rs->ptt_share); - if (strcmp(rs->pttport.pathname, rs->rigport.pathname) + if (strcmp(pttp->pathname, rp->pathname) && ptt == RIG_PTT_OFF && rs->ptt_share != 0) { /* free the port */ - ser_close(&rs->pttport); + ser_close(pttp); } break; case RIG_PTT_PARALLEL: - retcode = par_ptt_set(&rig->state.pttport, ptt); + retcode = par_ptt_set(pttp, ptt); break; case RIG_PTT_CM108: - retcode = cm108_ptt_set(&rig->state.pttport, ptt); + retcode = cm108_ptt_set(pttp, ptt); break; case RIG_PTT_GPIO: case RIG_PTT_GPION: - retcode = gpio_ptt_set(&rig->state.pttport, ptt); + retcode = gpio_ptt_set(pttp, ptt); break; case RIG_PTT_NONE: @@ -3649,7 +3665,7 @@ int HAMLIB_API rig_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) default: rig_debug(RIG_DEBUG_WARN, "%s: unknown PTT type=%d\n", __func__, - rig->state.pttport.type.ptt); + pttp->type.ptt); ELAPSED2; RETURNFUNC(-RIG_EINVAL); } @@ -3669,7 +3685,7 @@ int HAMLIB_API rig_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) if (retcode != RIG_OK) { rig_debug(RIG_DEBUG_ERR, "%s: return code=%d\n", __func__, retcode); } - memcpy(&rig->state.pttport_deprecated, &rig->state.pttport, + memcpy(&rig->state.pttport_deprecated, pttp, sizeof(rig->state.pttport_deprecated)); if (rig->state.post_ptt_delay > 0) { hl_usleep(rig->state.post_ptt_delay * 1000); } @@ -3698,6 +3714,8 @@ int HAMLIB_API rig_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt) { const struct rig_caps *caps; struct rig_state *rs = &rig->state; + hamlib_port_t *rp = RIGPORT(rig); + hamlib_port_t *pttp = PTTPORT(rig); int retcode = RIG_OK; int status; vfo_t curr_vfo; @@ -3739,7 +3757,7 @@ int HAMLIB_API rig_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt) LOCK(1); - switch (rig->state.pttport.type.ptt) + switch (pttp->type.ptt) { case RIG_PTT_RIG: case RIG_PTT_RIG_MICDATA: @@ -3843,15 +3861,15 @@ int HAMLIB_API rig_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt) #endif - if (strcmp(rs->pttport.pathname, rs->rigport.pathname) - && rs->pttport.fd < 0) + if (strcmp(pttp->pathname, rp->pathname) + && pttp->fd < 0) { /* port is closed so assume PTT off */ *ptt = RIG_PTT_OFF; } else { - retcode = ser_get_rts(&rig->state.pttport, &status); + retcode = ser_get_rts(pttp, &status); *ptt = status ? RIG_PTT_ON : RIG_PTT_OFF; } @@ -3881,15 +3899,15 @@ int HAMLIB_API rig_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt) #endif - if (strcmp(rs->pttport.pathname, rs->rigport.pathname) - && rs->pttport.fd < 0) + if (strcmp(pttp->pathname, rp->pathname) + && pttp->fd < 0) { /* port is closed so assume PTT off */ *ptt = RIG_PTT_OFF; } else { - retcode = ser_get_dtr(&rig->state.pttport, &status); + retcode = ser_get_dtr(pttp, &status); *ptt = status ? RIG_PTT_ON : RIG_PTT_OFF; } @@ -3916,7 +3934,7 @@ int HAMLIB_API rig_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt) RETURNFUNC(retcode); } - retcode = par_ptt_get(&rig->state.pttport, ptt); + retcode = par_ptt_get(pttp, ptt); if (retcode == RIG_OK) { @@ -3945,7 +3963,7 @@ int HAMLIB_API rig_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt) RETURNFUNC(retcode); } - retcode = cm108_ptt_get(&rig->state.pttport, ptt); + retcode = cm108_ptt_get(pttp, ptt); if (retcode == RIG_OK) { @@ -3976,7 +3994,7 @@ int HAMLIB_API rig_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt) } elapsed_ms(&rig->state.cache.time_ptt, HAMLIB_ELAPSED_SET); - retcode = gpio_ptt_get(&rig->state.pttport, ptt); + retcode = gpio_ptt_get(pttp, ptt); ELAPSED2; LOCK(0); RETURNFUNC(retcode); @@ -4015,6 +4033,7 @@ int HAMLIB_API rig_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt) int HAMLIB_API rig_get_dcd(RIG *rig, vfo_t vfo, dcd_t *dcd) { const struct rig_caps *caps; + hamlib_port_t *dcdp = DCDPORT(rig); int retcode, rc2, status; vfo_t curr_vfo; @@ -4035,7 +4054,7 @@ int HAMLIB_API rig_get_dcd(RIG *rig, vfo_t vfo, dcd_t *dcd) caps = rig->caps; - switch (rig->state.dcdport.type.dcd) + switch (dcdp->type.dcd) { case RIG_DCD_RIG: if (caps->get_dcd == NULL) @@ -4086,24 +4105,24 @@ int HAMLIB_API rig_get_dcd(RIG *rig, vfo_t vfo, dcd_t *dcd) break; case RIG_DCD_SERIAL_CTS: - retcode = ser_get_cts(&rig->state.dcdport, &status); - memcpy(&rig->state.dcdport_deprecated, &rig->state.dcdport, + retcode = ser_get_cts(dcdp, &status); + memcpy(&rig->state.dcdport_deprecated, dcdp, sizeof(rig->state.dcdport_deprecated)); *dcd = status ? RIG_DCD_ON : RIG_DCD_OFF; ELAPSED2; RETURNFUNC(retcode); case RIG_DCD_SERIAL_DSR: - retcode = ser_get_dsr(&rig->state.dcdport, &status); - memcpy(&rig->state.dcdport_deprecated, &rig->state.dcdport, + retcode = ser_get_dsr(dcdp, &status); + memcpy(&rig->state.dcdport_deprecated, dcdp, sizeof(rig->state.dcdport_deprecated)); *dcd = status ? RIG_DCD_ON : RIG_DCD_OFF; ELAPSED2; RETURNFUNC(retcode); case RIG_DCD_SERIAL_CAR: - retcode = ser_get_car(&rig->state.dcdport, &status); - memcpy(&rig->state.dcdport_deprecated, &rig->state.dcdport, + retcode = ser_get_car(dcdp, &status); + memcpy(&rig->state.dcdport_deprecated, dcdp, sizeof(rig->state.dcdport_deprecated)); *dcd = status ? RIG_DCD_ON : RIG_DCD_OFF; ELAPSED2; @@ -4111,16 +4130,16 @@ int HAMLIB_API rig_get_dcd(RIG *rig, vfo_t vfo, dcd_t *dcd) case RIG_DCD_PARALLEL: - retcode = par_dcd_get(&rig->state.dcdport, dcd); - memcpy(&rig->state.dcdport_deprecated, &rig->state.dcdport, + retcode = par_dcd_get(dcdp, dcd); + memcpy(&rig->state.dcdport_deprecated, dcdp, sizeof(rig->state.dcdport_deprecated)); ELAPSED2; RETURNFUNC(retcode); case RIG_DCD_GPIO: case RIG_DCD_GPION: - retcode = gpio_dcd_get(&rig->state.dcdport, dcd); - memcpy(&rig->state.dcdport_deprecated, &rig->state.dcdport, + retcode = gpio_dcd_get(dcdp, dcd); + memcpy(&rig->state.dcdport_deprecated, dcdp, sizeof(rig->state.dcdport_deprecated)); ELAPSED2; RETURNFUNC(retcode); @@ -6499,7 +6518,7 @@ int HAMLIB_API rig_set_powerstat(RIG *rig, powerstat_t status) } // if anything is queued up flush it - rig_flush_force(&rig->state.rigport, 1); + rig_flush_force(RIGPORT(rig), 1); ELAPSED2; RETURNFUNC(retcode); } @@ -8241,7 +8260,7 @@ void *async_data_handler(void *arg) if (rs->transaction_active) { unsigned char data = (unsigned char) result; - write_block_sync_error(&rs->rigport, &data, 1); + write_block_sync_error(RIGPORT(rig), &data, 1); } // TODO: error handling -> store errors in rig state -> to be exposed in async snapshot packets @@ -8275,7 +8294,7 @@ void *async_data_handler(void *arg) } else { - result = write_block_sync(&rs->rigport, frame, frame_length); + result = write_block_sync(RIGPORT(rig), frame, frame_length); if (result < 0) { @@ -8459,12 +8478,12 @@ extern int read_icom_frame(hamlib_port_t *p, const unsigned char rxbuffer[], HAMLIB_EXPORT(int) rig_send_raw(RIG *rig, const unsigned char *send, int send_len, unsigned char *reply, int reply_len, unsigned char *term) { - struct rig_state *rs = &rig->state; int nbytes; int retval; + hamlib_port_t *rp = RIGPORT(rig); int simulate = rig->caps->rig_model == RIG_MODEL_DUMMY || rig->caps->rig_model == RIG_MODEL_NONE || - rs->rigport.rig == RIG_PORT_NONE; + rp->rig == RIG_PORT_NONE; ENTERFUNC; ELAPSED1; @@ -8481,7 +8500,7 @@ HAMLIB_EXPORT(int) rig_send_raw(RIG *rig, const unsigned char *send, } else { - retval = write_block(&rs->rigport, send, send_len); + retval = write_block(rp, send, send_len); if (retval < 0) { @@ -8506,25 +8525,25 @@ HAMLIB_EXPORT(int) rig_send_raw(RIG *rig, const unsigned char *send, if (term == NULL) { rig_debug(RIG_DEBUG_VERBOSE, "%s: reading binary frame\n", __func__); - retval = read_string(&rs->rigport, buf, reply_len, NULL, 0, 0, 1); + retval = read_string(rp, buf, reply_len, NULL, 0, 0, 1); } else if (*term == 0xfd) // then we want an Icom frame { rig_debug(RIG_DEBUG_VERBOSE, "%s: reading icom frame\n", __func__); - retval = read_icom_frame(&rs->rigport, buf, sizeof(buf)); + retval = read_icom_frame(rp, buf, sizeof(buf)); } else // we'll assume the provided terminator works { rig_debug(RIG_DEBUG_VERBOSE, "%s: reading frame terminated by 0x%x\n", __func__, *term); - retval = read_string(&rs->rigport, buf, sizeof(buf), (const char *)term, + retval = read_string(rp, buf, sizeof(buf), (const char *)term, 1, 0, 1); } if (retval < RIG_OK) { rig_debug(RIG_DEBUG_ERR, "%s: read_string, result=%d\n", __func__, retval); - rig_flush_force(&rs->rigport, 1); + rig_flush_force(rp, 1); set_transaction_inactive(rig); RETURNFUNC(retval); } @@ -8535,7 +8554,7 @@ HAMLIB_EXPORT(int) rig_send_raw(RIG *rig, const unsigned char *send, { rig_debug(RIG_DEBUG_ERR, "%s: reply_len(%d) less than reply from rig(%d)\n", __func__, reply_len, nbytes); - rig_flush_force(&rs->rigport, 1); + rig_flush_force(rp, 1); set_transaction_inactive(rig); return -RIG_EINVAL; } @@ -8545,12 +8564,12 @@ HAMLIB_EXPORT(int) rig_send_raw(RIG *rig, const unsigned char *send, } else { - rig_flush_force(&rs->rigport, 1); + rig_flush_force(rp, 1); set_transaction_inactive(rig); RETURNFUNC(retval); } - rig_flush_force(&rs->rigport, 1); + rig_flush_force(rp, 1); set_transaction_inactive(rig); ELAPSED2; commit aa9c3b39baf9249e8bc3c8449971daa0cf4ea864 Author: George Baltz N3GB <Geo...@gm...> Date: Sat Jan 13 11:36:57 2024 -0500 Convert more files in src/ Leaves only src/rig.c diff --git a/src/multicast.c b/src/multicast.c index f610cf067..189d15b7f 100644 --- a/src/multicast.c +++ b/src/multicast.c @@ -297,7 +297,7 @@ static int multicast_send_json(RIG *rig) // sprintf(msg,"%s:f=%.1f", date_strget(msg, (int)sizeof(msg), 0), f); msg[0] = 0; snprintf(buf, sizeof(buf), "%s:%s", rig->caps->model_name, - rig->state.rigport.pathname); + RIGPORT(rig)->pathname); strcat(msg, "{\n"); json_add_string(msg, "ID", buf, 1); json_add_time(msg, 1); @@ -339,7 +339,7 @@ void *multicast_thread_rx(void *vrig) while (rig->state.multicast->runflag) { #if 0 - ret = read_string(&rig->state.rigport, (unsigned char *) buf, sizeof(buf), "\n", + ret = read_string(RIGPORT(rig), (unsigned char *) buf, sizeof(buf), "\n", 1, 0, 1); #endif @@ -652,8 +652,8 @@ int main(int argc, const char *argv[]) return 1; } - strncpy(rig->state.rigport.pathname, "/dev/ttyUSB0", HAMLIB_FILPATHLEN - 1); - rig->state.rigport.parm.serial.rate = 38400; + strncpy(RIGPORT(rig)->pathname, "/dev/ttyUSB0", HAMLIB_FILPATHLEN - 1); + RIGPORT(rig)->parm.serial.rate = 38400; rig_open(rig); multicast_init(rig, "224.0.0.1", 4532); pthread_join(rig->state.multicast->threadid, NULL); diff --git a/src/serial.c b/src/serial.c index f891b1273..302e67b0c 100644 --- a/src/serial.c +++ b/src/serial.c @@ -1051,7 +1051,7 @@ int HAMLIB_API ser_set_rts(hamlib_port_t *p, int state) /** * \brief Get RTS bit - * \param p supposed to be &rig->state.rigport + * \param p supposed to be RIGPORT(rig) * \param state non-NULL */ int HAMLIB_API ser_get_rts(hamlib_port_t *p, int *state) @@ -1134,7 +1134,7 @@ int HAMLIB_API ser_set_dtr(hamlib_port_t *p, int state) /** * \brief Get DTR bit - * \param p supposed to be &rig->state.rigport + * \param p supposed to be RIGPORT(rig) * \param state non-NULL */ int HAMLIB_API ser_get_dtr(hamlib_port_t *p, int *state) @@ -1186,7 +1186,7 @@ int HAMLIB_API ser_set_brk(const hamlib_port_t *p, int state) /** * \brief Get Carrier (CI?) bit - * \param p supposed to be &rig->state.rigport + * \param p supposed to be RIGPORT(rig) * \param state non-NULL */ int HAMLIB_API ser_get_car(hamlib_port_t *p, int *state) @@ -1209,7 +1209,7 @@ int HAMLIB_API ser_get_car(hamlib_port_t *p, int *state) /** * \brief Get Clear to Send (CTS) bit - * \param p supposed to be &rig->state.rigport + * \param p supposed to be RIGPORT(rig) * \param state non-NULL */ int HAMLIB_API ser_get_cts(hamlib_port_t *p, int *state) @@ -1232,7 +1232,7 @@ int HAMLIB_API ser_get_cts(hamlib_port_t *p, int *state) /** * \brief Get Data Set Ready (DSR) bit - * \param p supposed to be &rig->state.rigport + * \param p supposed to be RIGPORT(rig) * \param state non-NULL */ int HAMLIB_API ser_get_dsr(hamlib_port_t *p, int *state) diff --git a/src/snapshot_data.c b/src/snapshot_data.c index 52f9a1333..7ddd53de2 100644 --- a/src/snapshot_data.c +++ b/src/snapshot_data.c @@ -22,7 +22,7 @@ static int snapshot_serialize_rig(cJSON *rig_node, RIG *rig) cJSON *id_node = cJSON_CreateObject(); cJSON_AddStringToObject(id_node, "model", rig->caps->model_name); - cJSON_AddStringToObject(id_node, "endpoint", r... [truncated message content] |
From: n0nb <n0...@us...> - 2024-01-08 12:08: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 21c14da270d8d73b9ecfffbf4c7709d6dc4f8c32 (commit) via e9e43e23da0be55cc6cc216cec5a6646ebac0bd1 (commit) via eab660500e565913a39caa42174f2ecb3f90d2db (commit) via 2eefb14137ab095dc0a83d4cdc6af4463139690f (commit) via 890d1a69aa3bbb816d8dfdf3d4e2f8410efbb8ce (commit) via 47f92eb5f712b6ac0822642bead5213ed95c1b3c (commit) via 5980eb3cc7c9f2ed758e9ca3e5e7385f6a552b0b (commit) via bb1590ed9cae1406cb24e40e2018face4b4d0a0c (commit) via 64d606c1c4a366f060b0b048f80a59836fefea58 (commit) via 921def7c5f18a4f0cf3f17b4007c8865156c2784 (commit) via 9877387c55153c268b548109fa64ad97dc21c09e (commit) via bd746387f9e7d1b6b52bf015a70c344891776d7a (commit) via 65bd022a2cadb58cada8f249a577653cf11f480e (commit) via c019467987eb9a0d56d8f55b5b0d9045cf752da0 (commit) via 19c4b01e5abf68e91474b376faf2e2dc0b92c9a4 (commit) via 5492572176581c8e17c3d82e9c935cc03a9346e3 (commit) via 0c1f66710a37bd978ac95a2d622e52ee86a52340 (commit) via 5d0cbba91edea54619fc9dcb0647ac4df8c84c39 (commit) via a4fa021848748eb2c57fd53062d911aabed3a917 (commit) via bc2f2ce5c7054450fdd2d251c6d2a4c5ea0ba811 (commit) via da478d6e74d64234fac1848ef3447a6e8892b192 (commit) via 02a6c80800f05c220294e7610c8c39ae95f6a157 (commit) via 08ba518b717f8c9abaadfb9ffa5a34e7f4cc664a (commit) from 32f37d390ffeaa83f9480780cde15a2cad9b3592 (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 21c14da270d8d73b9ecfffbf4c7709d6dc4f8c32 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Jan 7 22:38:52 2024 -0600 Add DL2MAN (tr)uSDX rig Copy of TS480 for starters and needs refinement diff --git a/NEWS b/NEWS index aee9a7730..66ca89cb6 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 DL2MAN (tr)uSDX -- needs refinement * 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 diff --git a/include/hamlib/riglist.h b/include/hamlib/riglist.h index 541ab43e0..5c2182db6 100644 --- a/include/hamlib/riglist.h +++ b/include/hamlib/riglist.h @@ -202,6 +202,7 @@ #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) +#define RIG_MODEL_TRUSDX RIG_MAKE_MODEL(RIG_KENWOOD, 55) /* * Icom diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index d7f26d9d3..7b4ba5b03 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -6189,6 +6189,7 @@ DECLARE_INITRIG_BACKEND(kenwood) rig_register(&qrplabs_caps); rig_register(&fx4_caps); rig_register(&thetis_caps); + rig_register(&trudx_caps); return (RIG_OK); } diff --git a/rigs/kenwood/kenwood.h b/rigs/kenwood/kenwood.h index 5ab2e64f0..6c2fdbcb5 100644 --- a/rigs/kenwood/kenwood.h +++ b/rigs/kenwood/kenwood.h @@ -325,6 +325,7 @@ extern struct rig_caps sdruno_caps; extern struct rig_caps qrplabs_caps; extern struct rig_caps fx4_caps; extern struct rig_caps thetis_caps; +extern struct rig_caps trudx_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, diff --git a/rigs/kenwood/ts480.c b/rigs/kenwood/ts480.c index 43bb9b769..415f656b0 100644 --- a/rigs/kenwood/ts480.c +++ b/rigs/kenwood/ts480.c @@ -1438,6 +1438,204 @@ struct rig_caps ts480_caps = .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS }; +/* + * truSDC rig capabilities + * Notice that some rigs share the same functions. + */ +struct rig_caps trudx_caps = +{ + RIG_MODEL(RIG_MODEL_TRUSDX), + .model_name = "(tr)uSDX", + .mfg_name = "DL2MAN", + .version = BACKEND_VER ".1", + .copyright = "LGPL", + .status = RIG_STATUS_BETA, + .rig_type = RIG_TYPE_TRANSCEIVER, + .ptt_type = RIG_PTT_RIG_MICDATA, + .dcd_type = RIG_DCD_RIG, + .port_type = RIG_PORT_SERIAL, + .serial_rate_min = 38400, + .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, + .timeout = 500, + .retry = 3, + .preamp = {12, RIG_DBLST_END,}, + .attenuator = {12, RIG_DBLST_END,}, + .max_rit = kHz(9.99), + .max_xit = kHz(9.99), + .max_ifshift = Hz(0), + .targetable_vfo = RIG_TARGETABLE_FREQ, + .transceive = RIG_TRN_RIG, + .agc_level_count = 3, + .agc_levels = { RIG_AGC_OFF, RIG_AGC_FAST, RIG_AGC_SLOW }, + + .rx_range_list1 = { + {kHz(100), Hz(59999999), TS480_ALL_MODES, -1, -1, TS480_VFO}, + RIG_FRNG_END, + }, /*!< Receive frequency range list for ITU region 1 */ + .tx_range_list1 = { + {kHz(1810), kHz(1850), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, /* 100W class */ + {kHz(1810), kHz(1850), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, /* 25W class */ + {kHz(3500), kHz(3800), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, + {kHz(3500), kHz(3800), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, + {MHz(7), kHz(7200), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, + {MHz(7), kHz(7200), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, + {kHz(10100), kHz(10150), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, + {kHz(10100), kHz(10150), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, + {MHz(14), kHz(14350), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, + {MHz(14), kHz(14350), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, + {kHz(18068), kHz(18168), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, + {kHz(18068), kHz(18168), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, + {MHz(21), kHz(21450), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, + {MHz(21), kHz(21450), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, + {kHz(24890), kHz(24990), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, + {kHz(24890), kHz(24990), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, + {MHz(28), kHz(29700), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, + {MHz(28), kHz(29700), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, + {MHz(50), kHz(52000), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, + {MHz(50), kHz(52000), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, + RIG_FRNG_END, + }, /*!< Transmit frequency range list for ITU region 1 */ + .rx_range_list2 = { + {kHz(100), Hz(59999999), TS480_ALL_MODES, -1, -1, TS480_VFO}, + RIG_FRNG_END, + }, /*!< Receive frequency range list for ITU region 2 */ + .tx_range_list2 = { + {kHz(1800), MHz(2) - 1, TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, /* 100W class */ + {kHz(1800), MHz(2) - 1, TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, /* 25W class */ + {kHz(3500), MHz(4) - 1, TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, + {kHz(3500), MHz(4) - 1, TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, + {kHz(5250), kHz(5450), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, + {kHz(5250), kHz(5450), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, + {MHz(7), kHz(7300), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, + {MHz(7), kHz(7300), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, + {kHz(10100), kHz(10150), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, + {kHz(10100), kHz(10150), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, + {MHz(14), kHz(14350), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, + {MHz(14), kHz(14350), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, + {kHz(18068), kHz(18168), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, + {kHz(18068), kHz(18168), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, + {MHz(21), kHz(21450), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, + {MHz(21), kHz(21450), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, + {kHz(24890), kHz(24990), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, + {kHz(24890), kHz(24990), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, + {MHz(28), kHz(29700), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, + {MHz(28), kHz(29700), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, + {MHz(50), kHz(52000), TS480_OTHER_TX_MODES, 5000, 100000, TS480_VFO}, + {MHz(50), kHz(52000), TS480_AM_TX_MODES, 5000, 25000, TS480_VFO}, + RIG_FRNG_END, + }, /*!< Transmit frequency range list for ITU region 2 */ + .tuning_steps = { + {TS480_ALL_MODES, kHz(1)}, + {TS480_ALL_MODES, Hz(2500)}, + {TS480_ALL_MODES, kHz(5)}, + {TS480_ALL_MODES, Hz(6250)}, + {TS480_ALL_MODES, kHz(10)}, + {TS480_ALL_MODES, Hz(12500)}, + {TS480_ALL_MODES, kHz(15)}, + {TS480_ALL_MODES, kHz(20)}, + {TS480_ALL_MODES, kHz(25)}, + {TS480_ALL_MODES, kHz(30)}, + {TS480_ALL_MODES, kHz(100)}, + {TS480_ALL_MODES, kHz(500)}, + {TS480_ALL_MODES, MHz(1)}, + {TS480_ALL_MODES, 0}, /* any tuning step */ + RIG_TS_END, + }, + /* mode/filter list, remember: order matters! */ + .filters = { + {RIG_MODE_SSB, kHz(2.4)}, + {RIG_MODE_SSB, Hz(270)}, + {RIG_MODE_SSB, Hz(500)}, + {RIG_MODE_CW | RIG_MODE_CWR, Hz(200)}, + {RIG_MODE_CW | RIG_MODE_CWR, Hz(50)}, + {RIG_MODE_CW | RIG_MODE_CWR, Hz(1000)}, + {RIG_MODE_CW | RIG_MODE_CWR, Hz(80)}, + {RIG_MODE_CW | RIG_MODE_CWR, Hz(100)}, + {RIG_MODE_CW | RIG_MODE_CWR, Hz(150)}, + {RIG_MODE_CW | RIG_MODE_CWR, Hz(300)}, + {RIG_MODE_CW | RIG_MODE_CWR, Hz(400)}, + {RIG_MODE_CW | RIG_MODE_CWR, Hz(500)}, + {RIG_MODE_CW | RIG_MODE_CWR, Hz(600)}, + {RIG_MODE_CW | RIG_MODE_CWR, Hz(2000)}, + {RIG_MODE_RTTY | RIG_MODE_RTTYR, Hz(500)}, + {RIG_MODE_RTTY | RIG_MODE_RTTYR, Hz(250)}, + {RIG_MODE_RTTY | RIG_MODE_RTTYR, Hz(1000)}, + {RIG_MODE_RTTY | RIG_MODE_RTTYR, Hz(1500)}, + {RIG_MODE_AM, kHz(6)}, + {RIG_MODE_AM, kHz(2.4)}, + {RIG_MODE_FM, kHz(12)}, + RIG_FLT_END, + }, + .vfo_ops = TS480_VFO_OPS, + .level_gran = + { +#include "level_gran_kenwood.h" + [LVL_VOXDELAY] = { .min = { .i = 0 }, .max = { .i = 30 }, .step = { .i = 1 } }, + [LVL_KEYSPD] = {.min = {.i = 10}, .max = {.i = 60}, .step = {.i = 1}}, + [LVL_CWPITCH] = {.min = {.i = 400}, .max = {.i = 1000}, .step = {.i = 50}}, + [LVL_BKIN_DLYMS] = {.min = {.i = 0}, .max = {.i = 1000}, .step = {.i = 50}}, + [LVL_SLOPE_LOW] = {.min = {.i = 0}, .max = {.i = 2400}, .step = {.i = 10}}, + [LVL_SLOPE_HIGH] = {.min = {.i = 0}, .max = {.i = 5000}, .step = {.i = 10}}, + }, + .str_cal = TS480_STR_CAL, + .swr_cal = TS480_SWR_CAL, + + .ext_tokens = ts480_ext_tokens, + .extfuncs = ts480_ext_funcs, + .extlevels = ts480_ext_levels, + + .priv = (void *)& ts480_priv_caps, + .rig_init = ts480_init, + .rig_open = kenwood_open, + .rig_cleanup = kenwood_cleanup, + .set_freq = kenwood_set_freq, + .get_freq = kenwood_get_freq, + .set_rit = ts480_set_rit, + .get_rit = ts480_get_rit, + .set_xit = ts480_set_rit, + .get_xit = ts480_get_rit, + .set_mode = kenwood_set_mode, + .get_mode = kenwood_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 = kenwood_get_ptt, + .set_ptt = kenwood_set_ptt, + .get_dcd = kenwood_get_dcd, + .set_powerstat = kenwood_set_powerstat, + .get_powerstat = kenwood_get_powerstat, + .get_info = kenwood_ts480_get_info, + .reset = kenwood_reset, + .set_ant = kenwood_set_ant, + .get_ant = kenwood_get_ant, + .scan = kenwood_scan, /* not working, invalid arguments using rigctl; kenwood_scan does only support on/off and not tone and CTCSS scan */ + .has_set_level = TS480_LEVEL_SET, + .has_get_level = TS480_LEVEL_GET, + .set_level = kenwood_ts480_set_level, + .get_level = kenwood_ts480_get_level, + .set_ext_level = ts480_set_ext_level, + .get_ext_level = ts480_get_ext_level, + .has_get_func = TS480_FUNC_ALL, + .has_set_func = TS480_FUNC_ALL, + .set_func = ts480_set_func, + .get_func = ts480_get_func, + .set_ext_func = ts480_set_ext_func, + .get_ext_func = ts480_get_ext_func, + .send_morse = kenwood_send_morse, + .wait_morse = rig_wait_morse, + .send_voice_mem = kenwood_send_voice_mem, + .stop_voice_mem = kenwood_stop_voice_mem, + .vfo_op = kenwood_vfo_op, + .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS +}; + /* * QRPLabs TS-480 emulation rig capabilities * Notice that some rigs share the same functions. commit e9e43e23da0be55cc6cc216cec5a6646ebac0bd1 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Jan 7 11:55:20 2024 -0600 Remove readonly references to caps structure since it is R/W now diff --git a/rigs/kenwood/ts450s.c b/rigs/kenwood/ts450s.c index 6a5a43b4d..b2dc44f6e 100644 --- a/rigs/kenwood/ts450s.c +++ b/rigs/kenwood/ts450s.c @@ -106,7 +106,6 @@ int ts450_open(RIG *rig) /* * ts450s rig capabilities. * Notice that some rigs share the same functions. - * Also this struct is READONLY! * RIT: Variable Range 9.99 kHz * * TODO: protocol to be checked with manual (identical to TS690) diff --git a/rigs/kenwood/ts480.c b/rigs/kenwood/ts480.c index 96a904805..43bb9b769 100644 --- a/rigs/kenwood/ts480.c +++ b/rigs/kenwood/ts480.c @@ -2073,7 +2073,6 @@ int malachite_set_freq(RIG *rig, vfo_t vfo, freq_t freq) /* * Malachite SDR rig capabilities. * Notice that some rigs share the same functions. - * Also this struct is READONLY! */ struct rig_caps malachite_caps = { diff --git a/rigs/kenwood/ts570.c b/rigs/kenwood/ts570.c index 33f942c41..ba4f6f49f 100644 --- a/rigs/kenwood/ts570.c +++ b/rigs/kenwood/ts570.c @@ -891,7 +891,6 @@ int ts570_set_xit(RIG *rig, vfo_t vfo, shortfreq_t rit) /* * ts570 rig capabilities. * Notice that some rigs share the same functions. - * Also this struct is READONLY! * RIT: Variable Range 9.99 kHz * * part of infos comes from .http = //www.kenwood.net/ @@ -1078,7 +1077,6 @@ struct rig_caps ts570s_caps = /* * ts570d rig capabilities, which is basically the ts570s without 6m. * Notice that some rigs share the same functions. - * Also this struct is READONLY! * RIT: Variable Range 9.99 kHz * * part of infos comes from .http = //www.kenwood.net/ diff --git a/rigs/kenwood/ts850.c b/rigs/kenwood/ts850.c index f829934ee..f649c51e2 100644 --- a/rigs/kenwood/ts850.c +++ b/rigs/kenwood/ts850.c @@ -94,7 +94,6 @@ static const struct confparams ts850_ext_parms[] = /* * ts850 rig capabilities. * Notice that some rigs share the same functions. -* Also this struct is READONLY! */ struct rig_caps ts850_caps = { diff --git a/rigs/kenwood/ts870s.c b/rigs/kenwood/ts870s.c index 2a7685cb2..cb130b0ef 100644 --- a/rigs/kenwood/ts870s.c +++ b/rigs/kenwood/ts870s.c @@ -528,7 +528,6 @@ static int ts870s_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) /* * ts870s rig capabilities. * Notice that some rigs share the same functions. - * Also this struct is READONLY! * RIT: Variable Range 9.99 kHz * * part of infos comes from .http = //www.kenwood.net/ diff --git a/rigs/kenwood/ts930.c b/rigs/kenwood/ts930.c index 72f3c9088..31a1e577e 100644 --- a/rigs/kenwood/ts930.c +++ b/rigs/kenwood/ts930.c @@ -44,7 +44,6 @@ static struct kenwood_priv_caps ts930_priv_caps = /* * ts930 rig capabilities. * Notice that some rigs share the same functions. - * Also this struct is READONLY! * * part of infos comes from .http = //www.kenwood.net/ */ commit eab660500e565913a39caa42174f2ecb3f90d2db Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Jan 6 16:12:48 2024 -0600 Suppress UDP packet error when errno==0 https://github.com/Hamlib/Hamlib/issues/1461 diff --git a/src/network.c b/src/network.c index 96aa7c5bb..28e7507e3 100644 --- a/src/network.c +++ b/src/network.c @@ -999,8 +999,15 @@ void *multicast_publisher(void *arg) if (send_result < 0) { - rig_debug(RIG_DEBUG_ERR, "%s: error sending UDP packet: %s\n", __func__, - strerror(errno)); + static int flag = 0; + + if (errno != 0 || flag == 0) + { + rig_debug(RIG_DEBUG_ERR, + "%s: error sending UDP packet: %s\n", __func__, + strerror(errno)); + flag = 1; + } } } commit 2eefb14137ab095dc0a83d4cdc6af4463139690f Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Jan 5 16:34:03 2024 -0600 Fix LVL granulatiry in ts590.c again diff --git a/rigs/kenwood/ts590.c b/rigs/kenwood/ts590.c index 0fc14b0e6..223af4863 100644 --- a/rigs/kenwood/ts590.c +++ b/rigs/kenwood/ts590.c @@ -1730,8 +1730,9 @@ struct rig_caps ts590_caps = { #include "level_gran_kenwood.h" [LVL_RF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 255.0f } }, - [LVL_AF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 10.0f } }, - [LVL_AF_INPUT] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 10.0f } }, + [LVL_AF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 255.0f } }, + [LVL_USB_AF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 10.0f } }, + [LVL_USB_AF_INPUT] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 10.0f } }, [LVL_VOXDELAY] = { .min = { .i = 0 }, .max = { .i = 30 }, .step = { .i = 1 } }, [LVL_CWPITCH] = {.min = {.i = 300}, .max = {.i = 1000}, .step = {.i = 50}}, [LVL_BKIN_DLYMS] = {.min = {.i = 0}, .max = {.i = 1000}, .step = {.i = 50}}, @@ -1925,7 +1926,7 @@ struct rig_caps fx4_caps = { #include "level_gran_kenwood.h" [LVL_RF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 100.0f } }, - [LVL_AF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 100.0f } }, + [LVL_AF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 255.0f } }, [LVL_VOXDELAY] = { .min = { .i = 0 }, .max = { .i = 30 }, .step = { .i = 1 } }, [LVL_CWPITCH] = {.min = {.i = 300}, .max = {.i = 1000}, .step = {.i = 50}}, [LVL_BKIN_DLYMS] = {.min = {.i = 0}, .max = {.i = 1000}, .step = {.i = 50}}, @@ -2123,7 +2124,9 @@ struct rig_caps ts590sg_caps = .level_gran = { #include "level_gran_kenwood.h" [LVL_RF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 255.0f } }, - [LVL_AF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 10.0f } }, + [LVL_AF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 255.0f } }, + [LVL_USB_AF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 10.0f } }, + [LVL_USB_AF_INPUT] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 10.0f } }, [LVL_VOXDELAY] = { .min = { .i = 0 }, .max = { .i = 30 }, .step = { .i = 1 } }, [LVL_CWPITCH] = {.min = {.i = 300}, .max = {.i = 1000}, .step = {.i = 50}}, [LVL_BKIN_DLYMS] = {.min = {.i = 0}, .max = {.i = 1000}, .step = {.i = 50}}, commit 890d1a69aa3bbb816d8dfdf3d4e2f8410efbb8ce Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Jan 5 16:26:45 2024 -0600 Fix granularity in ts590.c diff --git a/rigs/kenwood/ts590.c b/rigs/kenwood/ts590.c index 651cdfae0..0fc14b0e6 100644 --- a/rigs/kenwood/ts590.c +++ b/rigs/kenwood/ts590.c @@ -1729,8 +1729,9 @@ struct rig_caps ts590_caps = .level_gran = { #include "level_gran_kenwood.h" - [LVL_RF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 100.0f } }, - [LVL_AF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 100.0f } }, + [LVL_RF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 255.0f } }, + [LVL_AF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 10.0f } }, + [LVL_AF_INPUT] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 10.0f } }, [LVL_VOXDELAY] = { .min = { .i = 0 }, .max = { .i = 30 }, .step = { .i = 1 } }, [LVL_CWPITCH] = {.min = {.i = 300}, .max = {.i = 1000}, .step = {.i = 50}}, [LVL_BKIN_DLYMS] = {.min = {.i = 0}, .max = {.i = 1000}, .step = {.i = 50}}, @@ -2121,8 +2122,8 @@ struct rig_caps ts590sg_caps = }, .level_gran = { #include "level_gran_kenwood.h" - [LVL_RF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 100.0f } }, - [LVL_AF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 100.0f } }, + [LVL_RF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 255.0f } }, + [LVL_AF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 10.0f } }, [LVL_VOXDELAY] = { .min = { .i = 0 }, .max = { .i = 30 }, .step = { .i = 1 } }, [LVL_CWPITCH] = {.min = {.i = 300}, .max = {.i = 1000}, .step = {.i = 50}}, [LVL_BKIN_DLYMS] = {.min = {.i = 0}, .max = {.i = 1000}, .step = {.i = 50}}, commit 47f92eb5f712b6ac0822642bead5213ed95c1b3c Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Jan 4 12:25:38 2024 -0600 Improved Kenwood USB_AF and USB_AF_INPUT level to make it more symmetrical Values can now be enter in signal digits .1 .2 .3 .4 .5 .6 .7 .8, .9 and higher is max value diff --git a/rigs/kenwood/ts590.c b/rigs/kenwood/ts590.c index e758baa1e..651cdfae0 100644 --- a/rigs/kenwood/ts590.c +++ b/rigs/kenwood/ts590.c @@ -22,6 +22,7 @@ #include <stdio.h> #include <string.h> #include <stdlib.h> +#include <math.h> #include "hamlib/rig.h" #include "kenwood.h" @@ -467,7 +468,7 @@ static int ts590_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) switch (level) { case RIG_LEVEL_USB_AF: - kenwood_val = val.f * 9; + kenwood_val = roundl((val.f + .045) * 9); cmd = 65; // TS-590S if (rig->caps->rig_model == RIG_MODEL_TS590SG) { cmd = 72; } @@ -476,7 +477,7 @@ static int ts590_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) break; case RIG_LEVEL_USB_AF_INPUT: - kenwood_val = val.f * 9; + kenwood_val = roundl((val.f + .045) * 9); cmd = 64; // TS-590S if (rig->caps->rig_model == RIG_MODEL_TS590SG) { cmd = 71; } @@ -663,16 +664,34 @@ static int ts590_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) if (rig->caps->rig_model == RIG_MODEL_TS590SG) { cmd = 72; } retval = ts590_get_ex_menu(rig, cmd, 1, &levelint); - val->f = levelint / 9.0; + + if (levelint == 9) + { + val->f = 1.0; + } + else + { + val->f = roundl(levelint * 10 / 10.0 + .04) / 10.0; + } + return retval; case RIG_LEVEL_USB_AF_INPUT: - cmd = 65; // TS-590S + cmd = 64; // TS-590S if (rig->caps->rig_model == RIG_MODEL_TS590SG) { cmd = 71; } retval = ts590_get_ex_menu(rig, cmd, 1, &levelint); - val->f = levelint / 9.0; + + if (levelint == 9) + { + val->f = 1.0; + } + else + { + val->f = roundl(levelint * 10 / 10.0) / 10.0; + } + return retval; case RIG_LEVEL_AF: @@ -1593,7 +1612,7 @@ struct rig_caps ts590_caps = RIG_MODEL(RIG_MODEL_TS590S), .model_name = "TS-590S", .mfg_name = "Kenwood", - .version = BACKEND_VER ".11", + .version = BACKEND_VER ".12", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -2015,7 +2034,7 @@ 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 }, + { 1, 3, RIG_MTYPE_MORSE }, RIG_CHAN_END, }, commit 5980eb3cc7c9f2ed758e9ca3e5e7385f6a552b0b Merge: 921def7c5 bb1590ed9 Author: Michael Black <mdb...@ya...> Date: Wed Jan 3 22:10:06 2024 -0600 Merge pull request #1470 from GeoBaltz/fix7 Fix copy/paste errors in rigs/icom/ commit bb1590ed9cae1406cb24e40e2018face4b4d0a0c Author: George Baltz N3GB <Geo...@gm...> Date: Wed Jan 3 21:13:42 2024 -0500 More typos/copy/paste errors in rigs/icom diff --git a/rigs/icom/ic737.c b/rigs/icom/ic737.c index e04ea3b3d..8f1a8da64 100644 --- a/rigs/icom/ic737.c +++ b/rigs/icom/ic737.c @@ -157,7 +157,7 @@ struct rig_caps ic737_caps = .rig_init = icom_init, .rig_cleanup = icom_cleanup, .rig_open = icom_rig_open, - .rig_close = icom_rig_open, + .rig_close = icom_rig_close, .set_freq = icom_set_freq, .get_freq = icom_get_freq, diff --git a/rigs/icom/ic738.c b/rigs/icom/ic738.c index 09d646c28..354152d4a 100644 --- a/rigs/icom/ic738.c +++ b/rigs/icom/ic738.c @@ -162,7 +162,7 @@ struct rig_caps ic738_caps = .rig_init = icom_init, .rig_cleanup = icom_cleanup, .rig_open = icom_rig_open, - .rig_close = icom_rig_open, + .rig_close = icom_rig_close, .set_freq = icom_set_freq, .get_freq = icom_get_freq, diff --git a/rigs/icom/ic7410.c b/rigs/icom/ic7410.c index 750393ae5..9e114c8a5 100644 --- a/rigs/icom/ic7410.c +++ b/rigs/icom/ic7410.c @@ -245,7 +245,7 @@ struct rig_caps ic7410_caps = .rig_init = icom_init, .rig_cleanup = icom_cleanup, .rig_open = icom_rig_open, - .rig_close = icom_rig_open, + .rig_close = icom_rig_close, .set_freq = icom_set_freq, .get_freq = icom_get_freq, diff --git a/rigs/icom/ic746.c b/rigs/icom/ic746.c index 23d134bff..461998201 100644 --- a/rigs/icom/ic746.c +++ b/rigs/icom/ic746.c @@ -297,7 +297,7 @@ struct rig_caps ic746_caps = .rig_init = icom_init, .rig_cleanup = icom_cleanup, .rig_open = icom_rig_open, - .rig_close = icom_rig_open, + .rig_close = icom_rig_close, .set_freq = icom_set_freq, .get_freq = icom_get_freq, diff --git a/rigs/icom/ic751.c b/rigs/icom/ic751.c index a1352f616..a691443f7 100644 --- a/rigs/icom/ic751.c +++ b/rigs/icom/ic751.c @@ -209,7 +209,7 @@ struct rig_caps ic751_caps = .rig_init = icom_init, .rig_cleanup = icom_cleanup, .rig_open = icom_rig_open, - .rig_close = icom_rig_open, + .rig_close = icom_rig_close, .set_freq = icom_set_freq, .get_freq = icom_get_freq, diff --git a/rigs/icom/ic7600.c b/rigs/icom/ic7600.c index 3c6f2ba49..bf9c0937a 100644 --- a/rigs/icom/ic7600.c +++ b/rigs/icom/ic7600.c @@ -420,7 +420,7 @@ struct rig_caps ic7600_caps = .rig_init = icom_init, .rig_cleanup = icom_cleanup, .rig_open = icom_rig_open, - .rig_close = icom_rig_open, + .rig_close = icom_rig_close, .set_freq = icom_set_freq, .get_freq = icom_get_freq, diff --git a/rigs/icom/ic761.c b/rigs/icom/ic761.c index 4a73b7a12..0f27af61f 100644 --- a/rigs/icom/ic761.c +++ b/rigs/icom/ic761.c @@ -174,7 +174,7 @@ struct rig_caps ic761_caps = .rig_init = icom_init, .rig_cleanup = icom_cleanup, .rig_open = icom_rig_open, - .rig_close = icom_rig_open, + .rig_close = icom_rig_close, .set_freq = icom_set_freq, .get_freq = icom_get_freq, diff --git a/rigs/icom/id1.c b/rigs/icom/id1.c index 81004a411..d83efc844 100644 --- a/rigs/icom/id1.c +++ b/rigs/icom/id1.c @@ -169,7 +169,7 @@ struct rig_caps id1_caps = .rig_init = icom_init, .rig_cleanup = icom_cleanup, .rig_open = icom_rig_open, - .rig_close = icom_rig_open, + .rig_close = icom_rig_close, .set_freq = icom_set_freq, .get_freq = icom_get_freq, diff --git a/rigs/icom/id31.c b/rigs/icom/id31.c index 3de602f9d..9727c42b6 100644 --- a/rigs/icom/id31.c +++ b/rigs/icom/id31.c @@ -168,7 +168,7 @@ struct rig_caps id31_caps = .rig_init = icom_init, .rig_cleanup = icom_cleanup, .rig_open = icom_rig_open, - .rig_close = icom_rig_open, + .rig_close = icom_rig_close, .set_freq = icom_set_freq, .get_freq = icom_get_freq, diff --git a/rigs/icom/id4100.c b/rigs/icom/id4100.c index c04c9ec55..e06694e95 100644 --- a/rigs/icom/id4100.c +++ b/rigs/icom/id4100.c @@ -176,7 +176,7 @@ struct rig_caps id4100_caps = .rig_init = icom_init, .rig_cleanup = icom_cleanup, .rig_open = icom_rig_open, - .rig_close = icom_rig_open, + .rig_close = icom_rig_close, .set_freq = icom_set_freq, .get_freq = icom_get_freq, diff --git a/rigs/icom/omni.c b/rigs/icom/omni.c index 14eb87af3..0c2e33f7c 100644 --- a/rigs/icom/omni.c +++ b/rigs/icom/omni.c @@ -159,7 +159,7 @@ struct rig_caps omnivip_caps = .rig_cleanup = icom_cleanup, .rig_open = icom_rig_open, - .rig_close = icom_rig_open, + .rig_close = icom_rig_close, .set_freq = icom_set_freq, .get_freq = icom_get_freq, .set_mode = icom_set_mode, diff --git a/rigs/icom/perseus.c b/rigs/icom/perseus.c index 65b5a9c47..e13ae8667 100644 --- a/rigs/icom/perseus.c +++ b/rigs/icom/perseus.c @@ -153,7 +153,7 @@ struct rig_caps perseus_caps = .rig_init = icom_init, .rig_cleanup = icom_cleanup, .rig_open = icom_rig_open, - .rig_close = icom_rig_open, + .rig_close = icom_rig_close, .set_freq = icom_set_freq, .get_freq = icom_get_freq, commit 64d606c1c4a366f060b0b048f80a59836fefea58 Author: George Baltz N3GB <Geo...@gm...> Date: Wed Jan 3 21:00:36 2024 -0500 Fix copy/paste errors in xiegu.c diff --git a/rigs/icom/xiegu.c b/rigs/icom/xiegu.c index 68dc21f48..bd4a88aa3 100644 --- a/rigs/icom/xiegu.c +++ b/rigs/icom/xiegu.c @@ -273,7 +273,7 @@ struct rig_caps x108g_caps = .rig_init = icom_init, .rig_cleanup = icom_cleanup, .rig_open = x108g_rig_open, - .rig_close = icom_rig_open, + .rig_close = icom_rig_close, .set_freq = icom_set_freq, .get_freq = icom_get_freq, @@ -449,7 +449,7 @@ struct rig_caps x6100_caps = .rig_init = icom_init, .rig_cleanup = icom_cleanup, .rig_open = icom_rig_open, - .rig_close = icom_rig_open, + .rig_close = icom_rig_close, .set_freq = icom_set_freq, .get_freq = icom_get_freq, @@ -644,7 +644,7 @@ struct rig_caps g90_caps = .rig_init = icom_init, .rig_cleanup = icom_cleanup, .rig_open = g90_rig_open, - .rig_close = icom_rig_open, + .rig_close = icom_rig_close, .set_freq = icom_set_freq, .get_freq = icom_get_freq, @@ -819,7 +819,7 @@ struct rig_caps x5105_caps = .rig_init = icom_init, .rig_cleanup = icom_cleanup, .rig_open = icom_rig_open, - .rig_close = icom_rig_open, + .rig_close = icom_rig_close, .set_freq = icom_set_freq, .get_freq = icom_get_freq, commit 921def7c5f18a4f0cf3f17b4007c8865156c2784 Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Jan 3 16:56:10 2024 -0600 Show Xeigu Radio ID during g90_open https://github.com/Hamlib/Hamlib/issues/909 diff --git a/rigs/icom/xiegu.c b/rigs/icom/xiegu.c index 8b5313c5b..68dc21f48 100644 --- a/rigs/icom/xiegu.c +++ b/rigs/icom/xiegu.c @@ -497,12 +497,31 @@ struct rig_caps x6100_caps = .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS }; +int g90_rig_open(RIG *rig) +{ + int retval; + unsigned char id[2]; + int id_len = 2; + int cmd = 0x19; + int subcmd = 0x1d; + short iid; + retval = icom_transaction(rig, cmd, subcmd, NULL, 0, id, &id_len); + + if (retval == RIG_OK) + { + memcpy(&iid, id, 2); + rig_debug(RIG_DEBUG_VERBOSE, "Xiegu Radio ID=0x%04x\n", iid); + } + + return icom_rig_open(rig); +} + struct rig_caps g90_caps = { RIG_MODEL(RIG_MODEL_G90), .model_name = "G90", .mfg_name = "Xiegu", - .version = BACKEND_VER ".6", + .version = BACKEND_VER ".7", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -624,7 +643,7 @@ struct rig_caps g90_caps = .priv = (void *)& x108g_priv_caps, .rig_init = icom_init, .rig_cleanup = icom_cleanup, - .rig_open = icom_rig_open, + .rig_open = g90_rig_open, .rig_close = icom_rig_open, .set_freq = icom_set_freq, commit 9877387c55153c268b548109fa64ad97dc21c09e Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Dec 30 08:18:44 2023 -0600 Force split off for Yaesu rigs with 60m_exception since split cannot operate in memory mode diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index fee3ebf3a..436b08775 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -2732,8 +2732,9 @@ int newcat_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo) } if (newcat_60m_exception(rig, rig->state.cache.freqMainA, rig->state.cache.modeMainA)) { - rig_debug(RIG_DEBUG_VERBOSE, "%s: ignoring set_split since we're on 60M exception\n", __func__); - return RIG_OK; // fake the return code to make things happy + rig_debug(RIG_DEBUG_VERBOSE, "%s: force set_split off since we're on 60M exception\n", __func__); + split = RIG_SPLIT_OFF; + //return RIG_OK; // fake the return code to make things happy } if (is_ft991) diff --git a/rigs/yaesu/newcat.h b/rigs/yaesu/newcat.h index 6521bf966..f3a229035 100644 --- a/rigs/yaesu/newcat.h +++ b/rigs/yaesu/newcat.h @@ -50,7 +50,7 @@ typedef char ncboolean; /* shared function version */ -#define NEWCAT_VER "20231204" +#define NEWCAT_VER "20231230" /* Hopefully large enough for future use, 128 chars plus '\0' */ #define NEWCAT_DATA_LEN 129 commit bd746387f9e7d1b6b52bf015a70c344891776d7a Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Dec 29 15:59:34 2023 -0600 Fix set_ant and get_ant for rigctl -m 2 dump_caps https://github.com/Hamlib/Hamlib/issues/1466 diff --git a/rigs/dummy/netrigctl.c b/rigs/dummy/netrigctl.c index 8002348e4..96277700c 100644 --- a/rigs/dummy/netrigctl.c +++ b/rigs/dummy/netrigctl.c @@ -736,6 +736,18 @@ static int netrigctl_open(RIG *rig) if (!has) { rig->caps->get_conf = NULL; } } + else if (strcmp(setting, "has_get_ant") == 0) + { + int has = strtol(value, NULL, 0); + + if (!has) { rig->caps->get_ant = NULL; } + } + else if (strcmp(setting, "has_set_ant") == 0) + { + int has = strtol(value, NULL, 0); + + if (!has) { rig->caps->set_ant = NULL; } + } #if 0 // for the future else if (strcmp(setting, "has_set_trn") == 0) @@ -2811,7 +2823,7 @@ struct rig_caps netrigctl_caps = RIG_MODEL(RIG_MODEL_NETRIGCTL), .model_name = "NET rigctl", .mfg_name = "Hamlib", - .version = "20231004.0", + .version = "20231229.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_OTHER, diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index 7fe15672d..ff5018aeb 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -4671,6 +4671,8 @@ declare_proto_rig(dump_state) // fprintf(fout, "has_get_trn=%d\n", rig->caps->get_trn != NULL); fprintf(fout, "has_power2mW=%d\n", rig->caps->power2mW != NULL); fprintf(fout, "has_mW2power=%d\n", rig->caps->mW2power != NULL); + fprintf(fout, "has_get_ant=%d\n", rig->caps->get_ant != NULL); + fprintf(fout, "has_set_ant=%d\n", rig->caps->set_ant != NULL); fprintf(fout, "timeout=%d\n", rig->caps->timeout); fprintf(fout, "rig_model=%d\n", rig->caps->rig_model); fprintf(fout, "rigctld_version=%s\n", hamlib_version2); commit 65bd022a2cadb58cada8f249a577653cf11f480e Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Dec 29 15:41:05 2023 -0600 Fix BAND_SELECT segfault on dumpcaps https://github.com/Hamlib/Hamlib/issues/1467 diff --git a/src/sprintflst.c b/src/sprintflst.c index 5c57db5cd..ca87d8b6f 100644 --- a/src/sprintflst.c +++ b/src/sprintflst.c @@ -566,7 +566,7 @@ int rig_sprintf_parm_gran(char *str, int nlen, setting_t parm, if (RIG_PARM_IS_FLOAT(rig_idx2setting(i))) { - len += sprintf(str + len, + len += snprintf(str + len, nlen, "%s(%.g..%.g/%.g) ", ms, gran[i].min.f, @@ -578,10 +578,13 @@ int rig_sprintf_parm_gran(char *str, int nlen, setting_t parm, if (gran[i].step.s) { rig_debug(RIG_DEBUG_ERR, "%s: BAND_SELECT?\n", __func__); + if (strcmp(ms,"BANDSELECT")!=0) + { len += sprintf(str + len, "%s(%s) ", ms, gran[i].step.s); + } } } else commit c019467987eb9a0d56d8f55b5b0d9045cf752da0 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Dec 28 12:11:31 2023 -0600 Ignore set_split for Yaesu 60M exception rigs Cannot do split in memory modey diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 639ed241e..fee3ebf3a 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -2730,6 +2730,11 @@ int newcat_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo) { RETURNFUNC(err); } + if (newcat_60m_exception(rig, rig->state.cache.freqMainA, rig->state.cache.modeMainA)) + { + rig_debug(RIG_DEBUG_VERBOSE, "%s: ignoring set_split since we're on 60M exception\n", __func__); + return RIG_OK; // fake the return code to make things happy + } if (is_ft991) { commit 19c4b01e5abf68e91474b376faf2e2dc0b92c9a4 Merge: 549257217 0c1f66710 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Dec 28 11:52:24 2023 -0600 Merge branch 'master' of https://github.com/Hamlib/Hamlib commit 5492572176581c8e17c3d82e9c935cc03a9346e3 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Dec 28 11:51:56 2023 -0600 Add FTDX10 to 860M exception diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 3a392bdf4..639ed241e 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -852,7 +852,7 @@ int newcat_60m_exception(RIG *rig, freq_t freq, mode_t mode) } // some rigs need to skip freq/mode settings as 60M only operates in memory mode - if (is_ft991 || is_ft897 || is_ft897d || is_ftdx5000) { return 1; } + if (is_ft991 || is_ft897 || is_ft897d || is_ftdx5000 || is_ftdx10) { return 1; } if (!is_ftdx10 && !is_ft710 && !is_ftdx101d && !is_ftdx101mp) { return 0; } commit 0c1f66710a37bd978ac95a2d622e52ee86a52340 Merge: a4fa02184 5d0cbba91 Author: Michael Black <mdb...@ya...> Date: Thu Dec 28 06:37:23 2023 -0600 Merge pull request #1464 from zcsahok/minor_man_fix Minor man page fix commit 5d0cbba91edea54619fc9dcb0647ac4df8c84c39 Author: zcsahok <ha...@gm...> Date: Thu Dec 28 12:18:02 2023 +0000 Minor man page fix diff --git a/doc/man1/rigctl.1 b/doc/man1/rigctl.1 index baf5b8fa8..add6d52e9 100644 --- a/doc/man1/rigctl.1 +++ b/doc/man1/rigctl.1 @@ -1168,7 +1168,7 @@ VFO reset, \(oq4\(cq = Memory Clear reset, \(oq8\(cq = Master reset. .IP Since these values are defined as a bitmask in .IR include/hamlib/rig.h , -it should be possible to AND these values together to do multiple resets at +it should be possible to OR these values together to do multiple resets at once, if the backend supports it or supports a reset action via rig control at all. . diff --git a/doc/man1/rigctld.1 b/doc/man1/rigctld.1 index fa8277a4e..fc701018b 100644 --- a/doc/man1/rigctld.1 +++ b/doc/man1/rigctld.1 @@ -1052,7 +1052,7 @@ VFO reset, \(oq4\(cq = Memory Clear reset, \(oq8\(cq = Master reset. .IP Since these values are defined as a bitmask in .IR include/hamlib/rig.h , -it should be possible to AND these values together to do multiple resets at +it should be possible to OR these values together to do multiple resets at once, if the backend supports it or supports a reset action via rig control at all. . commit a4fa021848748eb2c57fd53062d911aabed3a917 Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Dec 27 11:58:40 2023 -0600 Update kenwood.c for THETIS diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index c74cd7d87..d7f26d9d3 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -5018,6 +5018,7 @@ int kenwood_set_trn(RIG *rig, int trn) char buf[5]; case RIG_MODEL_POWERSDR: // powersdr doesn't have AI command + case RIG_MODEL_THETIS: // powersdr doesn't have AI command RETURNFUNC(-RIG_ENAVAIL); case RIG_MODEL_TS990S: commit bc2f2ce5c7054450fdd2d251c6d2a4c5ea0ba811 Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Dec 27 10:25:48 2023 -0600 Enable set_ptt for IC703 diff --git a/rigs/icom/ic703.c b/rigs/icom/ic703.c index fa1f16d39..4d619f4be 100644 --- a/rigs/icom/ic703.c +++ b/rigs/icom/ic703.c @@ -86,11 +86,11 @@ struct rig_caps ic703_caps = RIG_MODEL(RIG_MODEL_IC703), .model_name = "IC-703", .mfg_name = "Icom", - .version = BACKEND_VER ".1", + .version = BACKEND_VER ".2", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_MOBILE, - .ptt_type = RIG_PTT_NONE, + .ptt_type = RIG_PTT_RIG, .dcd_type = RIG_DCD_RIG, .port_type = RIG_PORT_SERIAL, .serial_rate_min = 300, commit da478d6e74d64234fac1848ef3447a6e8892b192 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Dec 26 22:46:38 2023 -0600 Add THETIS to flex.c diff --git a/rigs/kenwood/flex.c b/rigs/kenwood/flex.c index 0fac02689..733a219e0 100644 --- a/rigs/kenwood/flex.c +++ b/rigs/kenwood/flex.c @@ -135,6 +135,7 @@ int flexradio_open(RIG *rig) break; case RIG_MODEL_POWERSDR: + case RIG_MODEL_THETIS: break; default: commit 02a6c80800f05c220294e7610c8c39ae95f6a157 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Dec 26 22:36:55 2023 -0600 Fix RIG_IS_THETIS in kenwood.c to match RIG_IS_POWERSDR diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index fe301968f..c74cd7d87 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -710,7 +710,7 @@ int kenwood_safe_transaction(RIG *rig, const char *cmd, char *buf, { size_t length; // some PowerSDR commands have variable len - int checklen = !RIG_IS_POWERSDR; + int checklen = !RIG_IS_POWERSDR && !RIG_IS_THETIS; err = kenwood_transaction(rig, cmd, buf, buf_size); if (err != RIG_OK) /* return immediately on error as any @@ -5052,7 +5052,7 @@ int kenwood_get_trn(RIG *rig, int *trn) /* these rigs only have AI[0|1] set commands and no AI query */ if (RIG_IS_TS450S || RIG_IS_TS690S || RIG_IS_TS790 || RIG_IS_TS850 - || RIG_IS_TS950S || RIG_IS_TS950SDX || RIG_IS_POWERSDR) + || RIG_IS_TS950S || RIG_IS_TS950SDX || RIG_IS_POWERSDR || RIG_IS_THETIS) { RETURNFUNC(-RIG_ENAVAIL); } diff --git a/rigs/kenwood/kenwood.h b/rigs/kenwood/kenwood.h index 338535b35..5ab2e64f0 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 "20231112" +#define BACKEND_VER "20231226" #define EOM_KEN ';' #define EOM_TH '\r' @@ -109,6 +109,7 @@ extern struct confparams kenwood_cfg_params[]; #define RIG_IS_XG3 (rig->caps->rig_model == RIG_MODEL_XG3) #define RIG_IS_PT8000A (rig->caps->rig_model == RIG_MODEL_PT8000A) #define RIG_IS_POWERSDR (rig->caps->rig_model == RIG_MODEL_POWERSDR) +#define RIG_IS_THETIS (rig->caps->rig_model == RIG_MODEL_THETIS) #define RIG_IS_MALACHITE (rig->caps->rig_model == RIG_MODEL_MALACHITE) #define RIG_IS_QRPLABS (rig->caps->rig_model == RIG_MODEL_QRPLABS) commit 08ba518b717f8c9abaadfb9ffa5a34e7f4cc664a Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Dec 26 06:40:11 2023 -0600 Change network.s to allow MacOS compilation for is_networked https://github.com/Hamlib/Hamlib/issues/1463 diff --git a/src/network.c b/src/network.c index 56688787e..96aa7c5bb 100644 --- a/src/network.c +++ b/src/network.c @@ -1153,11 +1153,9 @@ int is_wireless() return 0; } #else -#ifndef __APPLE__ #include <sys/ioctl.h> #include <sys/socket.h> #include <unistd.h> -#include <linux/wireless.h> #include <ifaddrs.h> int is_networked(char *ipv4, int ipv4_length) @@ -1200,6 +1198,8 @@ int is_networked(char *ipv4, int ipv4_length) } +#ifdef __linux__ +#include <linux/wireless.h> int is_wireless_linux(const char *ifname) { int sock = socket(AF_INET, SOCK_DGRAM, 0); @@ -1365,10 +1365,12 @@ 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)); + if (errno != 0) { return NULL; } + rig_debug(RIG_DEBUG_VERBOSE, "%s: errno==0 so trying to continue\n", __func__); } ----------------------------------------------------------------------- Summary of changes: NEWS | 1 + doc/man1/rigctl.1 | 2 +- doc/man1/rigctld.1 | 2 +- include/hamlib/riglist.h | 1 + rigs/dummy/netrigctl.c | 14 +++- rigs/icom/ic703.c | 4 +- rigs/icom/ic737.c | 2 +- rigs/icom/ic738.c | 2 +- rigs/icom/ic7410.c | 2 +- rigs/icom/ic746.c | 2 +- rigs/icom/ic751.c | 2 +- rigs/icom/ic7600.c | 2 +- rigs/icom/ic761.c | 2 +- rigs/icom/id1.c | 2 +- rigs/icom/id31.c | 2 +- rigs/icom/id4100.c | 2 +- rigs/icom/omni.c | 2 +- rigs/icom/perseus.c | 2 +- rigs/icom/xiegu.c | 31 ++++++-- rigs/kenwood/flex.c | 1 + rigs/kenwood/kenwood.c | 6 +- rigs/kenwood/kenwood.h | 4 +- rigs/kenwood/ts450s.c | 1 - rigs/kenwood/ts480.c | 199 ++++++++++++++++++++++++++++++++++++++++++++++- rigs/kenwood/ts570.c | 2 - rigs/kenwood/ts590.c | 47 ++++++++--- rigs/kenwood/ts850.c | 1 - rigs/kenwood/ts870s.c | 1 - rigs/kenwood/ts930.c | 1 - rigs/yaesu/newcat.c | 8 +- rigs/yaesu/newcat.h | 2 +- src/network.c | 17 +++- src/sprintflst.c | 5 +- tests/rigctl_parse.c | 2 + 34 files changed, 324 insertions(+), 52 deletions(-) hooks/post-receive -- Hamlib -- Ham radio control libraries |
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] |
From: n0nb <n0...@us...> - 2023-12-18 16:31:06
|
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 21cbd7704738d6e7da778c06145463e33f77b611 (commit) via a3676e0e3b7f20f5a85cbbccb6adc0fdcd4a0f96 (commit) via 3a6073d4013b63ab7e00e27e69ff6340ff7ca147 (commit) via 98edf92240ff64c62321886cd7f2c8e60e9dcb5e (commit) via 19bf90bbb48f80a0b1bc24ae9ab14896b1922a9e (commit) via bc6f874675a2c66930457557f3f66086ec465afa (commit) via dbb8f4d5a7d68e90633fe9357d9a42c7eedb0819 (commit) via 1f38d591539f4b47889e8b8e792c9ccbb5900de2 (commit) via 248d5e44a93d773119508e5bf4c363d1e5434342 (commit) via 027b7801899e67133c153b3918205bf5464946e1 (commit) via ac7c908036533b629ce70269e3d6b992c58ed3f8 (commit) via 50711dcfb8c88729bf50291fd68034b16e485236 (commit) via 11876d7cc4344d70354c28ad3c763c5999aab69a (commit) via e267c6276495bee71eaf217715874cb56bcb4d6b (commit) via e1b3ac2a95a052f8aa23b2aac2fa170a50b2771e (commit) via 67e57f6e4db5f6de582445113c4785fb116ec01c (commit) via f81d49cdabafa9254f539e1fa66fecf393674b20 (commit) via 5dac79340fad70c6422ff686b9ff58dfc996afed (commit) via 10accf17b83227ef16e27e15c7bf7df599cb89c8 (commit) via 18c88c9f3859c3201eaac30e000a69e6d5e232c2 (commit) via 5dc55ff9e1ea74732190eb57470e1a8a39a8a4a3 (commit) via 81db043fbd500c0a44f95c94a343d1a952976e75 (commit) via 27d7e8bd2d2013c60ec87e1393874ece8fea0273 (commit) via 5f0c8691d7fdc7ccafee7fb888fbdaf9a4182931 (commit) via e9f9286f212f4874f90d34aa6100481cfbab0910 (commit) via b25b4960512f0ca2411bc5509cec023d62fa4683 (commit) via 72fba4eb5b0d08de4818a5b56ecb08e02524e1a6 (commit) via 63c615a452ec066ca989600eb8d8bd24d2c45bf2 (commit) via ea823e911c5afdab7120e8b8d8f336e572428734 (commit) from ae69772d2a5dd8adad0c8de51b6c44db5f060e35 (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 21cbd7704738d6e7da778c06145463e33f77b611 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Dec 18 09:11:19 2023 -0600 Add retries in easycomm.c diff --git a/rotators/easycomm/easycomm.c b/rotators/easycomm/easycomm.c index 3007d3491..419c16fd8 100644 --- a/rotators/easycomm/easycomm.c +++ b/rotators/easycomm/easycomm.c @@ -50,6 +50,7 @@ easycomm_transaction(ROT *rot, const char *cmdstr, char *data, size_t data_len) { struct rot_state *rs; int retval; + int retry = rot->caps->retry; rig_debug(RIG_DEBUG_TRACE, "%s called: %s\n", __func__, cmdstr); @@ -59,33 +60,39 @@ easycomm_transaction(ROT *rot, const char *cmdstr, char *data, size_t data_len) } rs = &rot->state; - rig_flush(&rs->rotport); - retval = write_block(&rs->rotport, (unsigned char *) cmdstr, strlen(cmdstr)); - if (retval != RIG_OK) + do { - goto transaction_quit; - } + rig_flush(&rs->rotport); + retval = write_block(&rs->rotport, (unsigned char *) cmdstr, strlen(cmdstr)); - if (data == NULL) - { - return RIG_OK; /* don't want a reply */ - } + if (retval != RIG_OK) + { + goto transaction_quit; + } - retval = read_string(&rs->rotport, (unsigned char *) data, data_len, - "\n", 1, 0, 1); + if (data == NULL) + { + return RIG_OK; /* don't want a reply */ + } - if (retval < 0) - { - rig_debug(RIG_DEBUG_TRACE, "%s read_string failed with status %d:%s\n", __func__, - retval, strerror(retval)); - goto transaction_quit; - } - else - { - rig_debug(RIG_DEBUG_TRACE, "%s read_string: %s\n", __func__, data); - retval = RIG_OK; + retval = read_string(&rs->rotport, (unsigned char *) data, data_len, + "\n", 1, 0, 1); + + if (retval < 0) + { + rig_debug(RIG_DEBUG_TRACE, "%s read_string failed with status %d:%s\n", + __func__, + retval, strerror(retval)); + goto transaction_quit; + } + else + { + rig_debug(RIG_DEBUG_TRACE, "%s read_string: %s\n", __func__, data); + retval = RIG_OK; + } } + while (--retry && retval != RIG_OK); transaction_quit: return retval; @@ -520,7 +527,7 @@ const struct rot_caps easycomm1_rot_caps = ROT_MODEL(ROT_MODEL_EASYCOMM1), .model_name = "EasycommI", .mfg_name = "Hamlib", - .version = "20220109.0", + .version = "20231218.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rot_type = ROT_TYPE_OTHER, @@ -556,7 +563,7 @@ const struct rot_caps easycomm2_rot_caps = ROT_MODEL(ROT_MODEL_EASYCOMM2), .model_name = "EasycommII", .mfg_name = "Hamlib", - .version = "20191206.0", + .version = "20231218.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rot_type = ROT_TYPE_OTHER, @@ -602,7 +609,7 @@ const struct rot_caps easycomm3_rot_caps = ROT_MODEL(ROT_MODEL_EASYCOMM3), .model_name = "EasycommIII", .mfg_name = "Hamlib", - .version = "20201203.0", + .version = "2022312180", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rot_type = ROT_TYPE_OTHER, commit a3676e0e3b7f20f5a85cbbccb6adc0fdcd4a0f96 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Dec 18 09:05:15 2023 -0600 Improve error output in easycom.c to show message diff --git a/rotators/easycomm/easycomm.c b/rotators/easycomm/easycomm.c index af3a9ae69..3007d3491 100644 --- a/rotators/easycomm/easycomm.c +++ b/rotators/easycomm/easycomm.c @@ -77,8 +77,8 @@ easycomm_transaction(ROT *rot, const char *cmdstr, char *data, size_t data_len) if (retval < 0) { - rig_debug(RIG_DEBUG_TRACE, "%s read_string failed with status %d\n", __func__, - retval); + rig_debug(RIG_DEBUG_TRACE, "%s read_string failed with status %d:%s\n", __func__, + retval, strerror(retval)); goto transaction_quit; } else commit 3a6073d4013b63ab7e00e27e69ff6340ff7ca147 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Dec 18 08:25:15 2023 -0600 astyle files diff --git a/src/network.c b/src/network.c index bb0a1f6eb..3f519348d 100644 --- a/src/network.c +++ b/src/network.c @@ -917,8 +917,9 @@ void *multicast_publisher(void *arg) struct rig_state *rs = &rig->state; struct rig_spectrum_line spectrum_line; uint8_t packet_type = MULTICAST_PUBLISHER_DATA_PACKET_TYPE_SPECTRUM; - multicast_publisher_priv_data *mcast_publisher_priv = (multicast_publisher_priv_data *) - rs->multicast_publisher_priv_data; + multicast_publisher_priv_data *mcast_publisher_priv = + (multicast_publisher_priv_data *) + rs->multicast_publisher_priv_data; struct sockaddr_in dest_addr; int socket_fd = args->socket_fd; @@ -984,6 +985,7 @@ void *multicast_publisher(void *arg) strerror(errno)); } } + mcast_publisher_priv->thread_id = 0; rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): Stopped multicast publisher\n", __FILE__, @@ -1320,10 +1322,12 @@ int network_multicast_publisher_start(RIG *rig, const char *multicast_addr, status = network_init(); #ifdef __MINGW32__ // always RIG_OK if not Windows + if (status != RIG_OK) { RETURNFUNC(status); } + #endif socket_fd = socket(AF_INET, SOCK_DGRAM, 0); @@ -1445,7 +1449,7 @@ int network_multicast_publisher_stop(RIG *rig) if (mcast_publisher_priv->thread_id != 0) { - int err = pthread_join(mcast_publisher_priv->thread_id, NULL); + int err = pthread_join(mcast_publisher_priv->thread_id, NULL); if (err) { commit 98edf92240ff64c62321886cd7f2c8e60e9dcb5e Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Dec 18 07:53:55 2023 -0600 Update rig.h documentation a bit diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index f8a5a72ad..718e55d90 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -291,6 +291,8 @@ typedef unsigned int tone_t; /** * \brief Port type + * + * Note: All rigs may use a network:port address ( e.g. tcp/serial adapter) */ typedef enum rig_port_e { RIG_PORT_NONE = 0, /*!< No port */ commit 19bf90bbb48f80a0b1bc24ae9ab14896b1922a9e Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Dec 18 07:13:23 2023 -0600 Minor update to rigctl.1 rigctld.1 diff --git a/doc/man1/rigctl.1 b/doc/man1/rigctl.1 index 771051601..db4535e2e 100644 --- a/doc/man1/rigctl.1 +++ b/doc/man1/rigctl.1 @@ -81,8 +81,7 @@ Use .I device as the file name of the port connected to the radio. .IP -Often a serial port, but could be a USB to serial adapter. Typically -.IR /dev/ttyS0 ", " /dev/ttyS1 ", " /dev/ttyUSB0 , +Typically /dev/ttyS0 ", " /dev/ttyS1 ", " /dev/ttyUSB0 , etc. on Linux, .IR COM1 ", " COM2 , etc. on MS Windows. The BSD flavors and Mac OS/X have their own designations. diff --git a/doc/man1/rigctld.1 b/doc/man1/rigctld.1 index 56b08109b..fa8277a4e 100644 --- a/doc/man1/rigctld.1 +++ b/doc/man1/rigctld.1 @@ -127,8 +127,7 @@ Use .I device as the file name of the port connected to the radio. .IP -Often a serial port, but could be a USB to serial adapter. Typically -.IR /dev/ttyS0 ", " /dev/ttyS1 ", " /dev/ttyUSB0 , +Typically /dev/ttyS0 ", " /dev/ttyS1 ", " /dev/ttyUSB0 , etc. on Linux, .IR COM1 ", " COM2 , etc. on MS Windows. The BSD flavors and Mac OS/X have their own designations. commit bc6f874675a2c66930457557f3f66086ec465afa Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Dec 17 23:13:32 2023 -0600 Fix wireless detection diff --git a/src/network.c b/src/network.c index ada95a529..bb0a1f6eb 100644 --- a/src/network.c +++ b/src/network.c @@ -1142,17 +1142,17 @@ void *multicast_receiver(void *arg) dest_addr.sin_family = AF_INET; #ifdef __MINGW32__ - // Windows cannot bind to multicast group addresses for some unknown reason + // Windows wireless cannot bind to multicast group addresses for some unknown reason if (is_wireless()) { rig_debug(RIG_DEBUG_VERBOSE, - "%s: no wireless detect so INADDR_ANY is being used\n", __func__); + "%s: wireless detected so localhost is being used\n", __func__); + dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); } else { 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: no wireless detect so INADDR_ANY is being used\n", __func__); } #else commit dbb8f4d5a7d68e90633fe9357d9a42c7eedb0819 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Dec 17 22:29:21 2023 -0600 Remove some debug statements diff --git a/src/network.c b/src/network.c index cc3d287d3..ada95a529 100644 --- a/src/network.c +++ b/src/network.c @@ -1208,9 +1208,7 @@ void *multicast_receiver(void *arg) efds = rfds; select_result = select(socket_fd + 1, &rfds, NULL, &efds, &timeout); - rig_debug(RIG_DEBUG_VERBOSE,"%s(%d)\n", __func__, __LINE__); - rig_debug(RIG_DEBUG_VERBOSE,"%s(%d)\n", __func__, __LINE__); if (rs->multicast_receiver_run == 0) { rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): pselect signal\n", __func__, __LINE__); commit 1f38d591539f4b47889e8b8e792c9ccbb5900de2 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Dec 17 17:38:28 2023 -0600 Fix Windows rigctl shutdown https://github.com/Hamlib/Hamlib/issues/1448 diff --git a/src/network.c b/src/network.c index 867aa04ed..cc3d287d3 100644 --- a/src/network.c +++ b/src/network.c @@ -470,6 +470,7 @@ extern void sync_callback(int lock); //! @cond Doxygen_Suppress #define MULTICAST_DATA_PIPE_TIMEOUT_MILLIS 1000 +#define MULTICAST_DATA_PIPE_TIMEOUT_USEC 100000 #if defined(WIN32) && defined(HAVE_WINDOWS_H) @@ -535,8 +536,7 @@ static int multicast_publisher_read_data(multicast_publisher_args { ssize_t result; - result = async_pipe_wait_for_data(mcast_publisher_args->data_pipe, - MULTICAST_DATA_PIPE_TIMEOUT_MILLIS); + result = async_pipe_wait_for_data(mcast_publisher_args->data_pipe, 100); if (result < 0) { @@ -660,8 +660,8 @@ static int multicast_publisher_read_data(const multicast_publisher_args ssize_t result; int retval; - timeout.tv_sec = MULTICAST_DATA_PIPE_TIMEOUT_MILLIS / 1000; - timeout.tv_usec = 0; + timeout.tv_sec = 0; + timeout.tv_usec = MULTICAST_DATA_PIPE_TIMEOUT_USEC; FD_ZERO(&rfds); FD_SET(fd, &rfds); @@ -917,6 +917,8 @@ void *multicast_publisher(void *arg) struct rig_state *rs = &rig->state; struct rig_spectrum_line spectrum_line; uint8_t packet_type = MULTICAST_PUBLISHER_DATA_PACKET_TYPE_SPECTRUM; + multicast_publisher_priv_data *mcast_publisher_priv = (multicast_publisher_priv_data *) + rs->multicast_publisher_priv_data; struct sockaddr_in dest_addr; int socket_fd = args->socket_fd; @@ -982,8 +984,9 @@ void *multicast_publisher(void *arg) strerror(errno)); } } + mcast_publisher_priv->thread_id = 0; - rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): Stopping multicast publisher\n", __FILE__, + rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): Stopped multicast publisher\n", __FILE__, __LINE__); return NULL; } @@ -1198,14 +1201,16 @@ void *multicast_receiver(void *arg) int select_result; ssize_t result; - timeout.tv_sec = 1; - timeout.tv_usec = 0; + timeout.tv_sec = 0; + timeout.tv_usec = 100000; FD_ZERO(&rfds); FD_SET(socket_fd, &rfds); efds = rfds; select_result = select(socket_fd + 1, &rfds, NULL, &efds, &timeout); + rig_debug(RIG_DEBUG_VERBOSE,"%s(%d)\n", __func__, __LINE__); + rig_debug(RIG_DEBUG_VERBOSE,"%s(%d)\n", __func__, __LINE__); if (rs->multicast_receiver_run == 0) { rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): pselect signal\n", __func__, __LINE__); @@ -1215,7 +1220,7 @@ void *multicast_receiver(void *arg) if (select_result == 0) { // Select timed out -// rig_debug(RIG_DEBUG_ERR, "%s: select timeout\n", __FILE__); + //rig_debug(RIG_DEBUG_ERR, "%s: select timeout\n", __FILE__); continue; } @@ -1268,7 +1273,7 @@ void *multicast_receiver(void *arg) rs->multicast_receiver_run = 0; - rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): Stopping multicast receiver\n", __FILE__, + rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): Stopped multicast receiver\n", __FILE__, __LINE__); return NULL; } @@ -1316,10 +1321,12 @@ int network_multicast_publisher_start(RIG *rig, const char *multicast_addr, status = network_init(); +#ifdef __MINGW32__ // always RIG_OK if not Windows if (status != RIG_OK) { RETURNFUNC(status); } +#endif socket_fd = socket(AF_INET, SOCK_DGRAM, 0); @@ -1367,7 +1374,6 @@ int network_multicast_publisher_start(RIG *rig, const char *multicast_addr, } rs->snapshot_packet_sequence_number = 0; - rs->multicast_publisher_run = 1; rs->multicast_publisher_priv_data = calloc(1, sizeof(multicast_publisher_priv_data)); @@ -1441,7 +1447,7 @@ int network_multicast_publisher_stop(RIG *rig) if (mcast_publisher_priv->thread_id != 0) { - int err = pthread_join(mcast_publisher_priv->thread_id, NULL); + int err = pthread_join(mcast_publisher_priv->thread_id, NULL); if (err) { commit 248d5e44a93d773119508e5bf4c363d1e5434342 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Dec 17 12:52:34 2023 -0600 Fix cppcheck warning in newcat.c diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 4585cc06e..3a392bdf4 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -7565,7 +7565,7 @@ int newcat_get_trn(RIG *rig, int *trn) SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "%s%c", command, cat_term); /* Get Auto Information */ - if (RIG_OK != (err = newcat_get_cmd(rig))) + if (RIG_OK != newcat_get_cmd(rig)) { // if we failed to get AI we turn it off and try again SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "%s0%c", command, cat_term); commit 027b7801899e67133c153b3918205bf5464946e1 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Dec 17 06:19:08 2023 -0600 Fix FT857 set_vfo cppcheck warning as get_vfo is always RIG_OK diff --git a/rigs/yaesu/ft857.c b/rigs/yaesu/ft857.c index 7964cdd93..09dbbe861 100644 --- a/rigs/yaesu/ft857.c +++ b/rigs/yaesu/ft857.c @@ -636,14 +636,7 @@ int ft857_set_vfo(RIG *rig, vfo_t vfo) rig_debug(RIG_DEBUG_VERBOSE, "%s: called \n", __func__); - int retval = ft857_get_vfo(rig, &curvfo); - - if (retval != RIG_OK) - { - rig_debug(RIG_DEBUG_ERR, "%s: error get_vfo '%s'\n", __func__, - rigerror(retval)); - return retval; - } + ft857_get_vfo(rig, &curvfo); // retval is always RIG_OK so ignore it if (curvfo == vfo) { commit ac7c908036533b629ce70269e3d6b992c58ed3f8 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Dec 16 17:09:11 2023 -0600 Add DSTAR to flrig.c -- thanks to Philip Rose GM3ZZA diff --git a/rigs/dummy/flrig.c b/rigs/dummy/flrig.c index c1b467797..f3c02ea3a 100644 --- a/rigs/dummy/flrig.c +++ b/rigs/dummy/flrig.c @@ -50,7 +50,7 @@ RIG_MODE_PKTLSB | RIG_MODE_PKTUSB |\ RIG_MODE_SSB | RIG_MODE_LSB | RIG_MODE_USB |\ RIG_MODE_FM | RIG_MODE_WFM | RIG_MODE_FMN | RIG_MODE_PKTFM |\ - RIG_MODE_C4FM) + RIG_MODE_C4FM | RIG_MODE_DSTAR) #define FLRIG_LEVELS (RIG_LEVEL_AF | RIG_LEVEL_RF | RIG_LEVEL_MICGAIN | RIG_LEVEL_STRENGTH | RIG_LEVEL_RFPOWER_METER | RIG_LEVEL_RFPOWER_METER_WATTS | RIG_LEVEL_RFPOWER | RIG_LEVEL_SWR) @@ -143,7 +143,7 @@ struct rig_caps flrig_caps = RIG_MODEL(RIG_MODEL_FLRIG), .model_name = "FLRig", .mfg_name = "FLRig", - .version = "20231213.0", + .version = "20231216.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -242,6 +242,7 @@ static struct s_modeMap modeMap[] = {RIG_MODE_RTTY, NULL}, {RIG_MODE_RTTYR, NULL}, {RIG_MODE_C4FM, NULL}, + {RIG_MODE_DSTAR, NULL}, {0, NULL} }; @@ -1092,6 +1093,7 @@ static int flrig_open(RIG *rig) else if (streq(p, "UCW")) { modeMapAdd(&modes, RIG_MODE_CW, p); } else if (streq(p, "C4FM")) { modeMapAdd(&modes, RIG_MODE_C4FM, p); } else if (streq(p, "SPEC")) { modeMapAdd(&modes, RIG_MODE_SPEC, p); } + else if (streq(p, "DV")) { modeMapAdd(&modes, RIG_MODE_DSTAR, p); } else if (streq(p, "DRM")) // we don't support DRM yet (or maybe ever) { rig_debug(RIG_DEBUG_VERBOSE, "%s: no mapping for mode %s\n", __func__, p); commit 50711dcfb8c88729bf50291fd68034b16e485236 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Dec 16 15:03:21 2023 -0600 Remove dead code in flex6xxx.c diff --git a/rigs/kenwood/flex6xxx.c b/rigs/kenwood/flex6xxx.c index 7e3d3f324..50e21d15b 100644 --- a/rigs/kenwood/flex6xxx.c +++ b/rigs/kenwood/flex6xxx.c @@ -847,8 +847,6 @@ int powersdr_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) if (ptt == RIG_PTT_OFF) { val->f = priv->swr; return RIG_OK;} cmd = "ZZRM8"; // get SWR - len = 5; - ans = 8; retval = kenwood_transaction(rig, cmd, lvlbuf, sizeof(lvlbuf)); if (retval != RIG_OK) { val->f = priv->swr; return RIG_OK;}; commit 11876d7cc4344d70354c28ad3c763c5999aab69a Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Dec 16 15:02:01 2023 -0600 Fix ptt shadow in flex6xxx.c diff --git a/rigs/kenwood/flex6xxx.c b/rigs/kenwood/flex6xxx.c index a386b6366..7e3d3f324 100644 --- a/rigs/kenwood/flex6xxx.c +++ b/rigs/kenwood/flex6xxx.c @@ -841,7 +841,7 @@ int powersdr_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) case RIG_LEVEL_SWR: { struct kenwood_priv_caps *priv = kenwood_caps(rig); - ptt_t ptt = 0; + ptt = 0; rig_get_ptt(rig, RIG_VFO_CURR, &ptt); if (ptt == RIG_PTT_OFF) { val->f = priv->swr; return RIG_OK;} @@ -948,7 +948,7 @@ int powersdr_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) case RIG_LEVEL_RFPOWER_METER_WATTS: { // if not ptt then no power is going out so return 0W - ptt_t ptt; + ptt = 0; rig_get_ptt(rig, RIG_VFO_TX, &ptt); if (!ptt) { val->f = 0; return RIG_OK; } commit e267c6276495bee71eaf217715874cb56bcb4d6b Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Dec 16 11:37:58 2023 -0600 astyle files diff --git a/amplifiers/gemini/gemini.c b/amplifiers/gemini/gemini.c index 6f69b0678..df7ad27f7 100644 --- a/amplifiers/gemini/gemini.c +++ b/amplifiers/gemini/gemini.c @@ -103,8 +103,9 @@ int gemini_transaction(AMP *amp, const char *cmd, char *response, if (response) // if response expected get it { response[0] = 0; - int len = read_string(&rs->ampport, (unsigned char *) response, response_len, "\n", - 1, 0, 1); + int len = read_string(&rs->ampport, (unsigned char *) response, response_len, + "\n", + 1, 0, 1); if (len < 0) { diff --git a/lib/cJSON.c b/lib/cJSON.c index 524ba4641..d9b70dcd0 100644 --- a/lib/cJSON.c +++ b/lib/cJSON.c @@ -85,7 +85,8 @@ #endif #endif -typedef struct { +typedef struct +{ const unsigned char *json; size_t position; } error; @@ -93,10 +94,10 @@ static error global_error = { NULL, 0 }; CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void) { - return (const char*) (global_error.json + global_error.position); + return (const char *)(global_error.json + global_error.position); } -CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item) +CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON *const item) { if (!cJSON_IsString(item)) { @@ -106,7 +107,7 @@ CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item) return item->valuestring; } -CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item) +CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON *const item) { if (!cJSON_IsNumber(item)) { @@ -118,19 +119,21 @@ CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item) /* This is a safeguard to prevent copy-pasters from using incompatible C and header files */ #if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 7) || (CJSON_VERSION_PATCH != 15) - #error cJSON.h and cJSON.c have different versions. Make sure that both have the same. +#error cJSON.h and cJSON.c have different versions. Make sure that both have the same. #endif -CJSON_PUBLIC(const char*) cJSON_Version(void) +CJSON_PUBLIC(const char *) cJSON_Version(void) { static char version[15]; - sprintf(version, "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH); + sprintf(version, "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, + CJSON_VERSION_PATCH); return version; } /* Case insensitive string comparison, doesn't consider two NULL pointers equal though */ -static int case_insensitive_strcmp(const unsigned char *string1, const unsigned char *string2) +static int case_insensitive_strcmp(const unsigned char *string1, + const unsigned char *string2) { if ((string1 == NULL) || (string2 == NULL)) { @@ -142,7 +145,7 @@ static int case_insensitive_strcmp(const unsigned char *string1, const unsigned return 0; } - for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++) + for (; tolower(*string1) == tolower(*string2); (void)string1++, string2++) { if (*string1 == '\0') { @@ -162,7 +165,7 @@ typedef struct internal_hooks #if defined(_MSC_VER) /* work around MSVC error C2322: '...' address of dllimport '...' is not static */ -static void * CJSON_CDECL internal_malloc(size_t size) +static void *CJSON_CDECL internal_malloc(size_t size) { return malloc(size); } @@ -170,7 +173,7 @@ static void CJSON_CDECL internal_free(void *pointer) { free(pointer); } -static void * CJSON_CDECL internal_realloc(void *pointer, size_t size) +static void *CJSON_CDECL internal_realloc(void *pointer, size_t size) { return realloc(pointer, size); } @@ -185,7 +188,8 @@ static void * CJSON_CDECL internal_realloc(void *pointer, size_t size) static internal_hooks global_hooks = { internal_malloc, internal_free, internal_realloc }; -static unsigned char* cJSON_strdup(const unsigned char* string, const internal_hooks * const hooks) +static unsigned char *cJSON_strdup(const unsigned char *string, + const internal_hooks *const hooks) { size_t length = 0; unsigned char *copy = NULL; @@ -195,18 +199,20 @@ static unsigned char* cJSON_strdup(const unsigned char* string, const internal_h return NULL; } - length = strlen((const char*)string) + sizeof(""); - copy = (unsigned char*)hooks->allocate(length); + length = strlen((const char *)string) + sizeof(""); + copy = (unsigned char *)hooks->allocate(length); + if (copy == NULL) { return NULL; } + memcpy(copy, string, length); return copy; } -CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks) +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks *hooks) { if (hooks == NULL) { @@ -218,12 +224,14 @@ CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks) } global_hooks.allocate = malloc; + if (hooks->malloc_fn != NULL) { global_hooks.allocate = hooks->malloc_fn; } global_hooks.deallocate = free; + if (hooks->free_fn != NULL) { global_hooks.deallocate = hooks->free_fn; @@ -231,6 +239,7 @@ CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks) /* use realloc only if both free and malloc are used */ global_hooks.reallocate = NULL; + if ((global_hooks.allocate == malloc) && (global_hooks.deallocate == free)) { global_hooks.reallocate = realloc; @@ -238,9 +247,10 @@ CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks) } /* Internal constructor. */ -static cJSON *cJSON_New_Item(const internal_hooks * const hooks) +static cJSON *cJSON_New_Item(const internal_hooks *const hooks) { - cJSON* node = (cJSON*)hooks->allocate(sizeof(cJSON)); + cJSON *node = (cJSON *)hooks->allocate(sizeof(cJSON)); + if (node) { memset(node, '\0', sizeof(cJSON)); @@ -253,21 +263,26 @@ static cJSON *cJSON_New_Item(const internal_hooks * const hooks) CJSON_PUBLIC(void) cJSON_Delete(cJSON *item) { cJSON *next = NULL; + while (item != NULL) { next = item->next; + if (!(item->type & cJSON_IsReference) && (item->child != NULL)) { cJSON_Delete(item->child); } + if (!(item->type & cJSON_IsReference) && (item->valuestring != NULL)) { global_hooks.deallocate(item->valuestring); } + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) { global_hooks.deallocate(item->string); } + global_hooks.deallocate(item); item = next; } @@ -302,7 +317,8 @@ typedef struct #define buffer_at_offset(buffer) ((buffer)->content + (buffer)->offset) /* Parse the input text to generate a number, and populate the result into item. */ -static cJSON_bool parse_number(cJSON * const item, parse_buffer * const input_buffer) +static cJSON_bool parse_number(cJSON *const item, + parse_buffer *const input_buffer) { double number = 0; unsigned char *after_end = NULL; @@ -318,39 +334,42 @@ static cJSON_bool parse_number(cJSON * const item, parse_buffer * const input_bu /* copy the number into a temporary buffer and replace '.' with the decimal point * of the current locale (for strtod) * This also takes care of '\0' not necessarily being available for marking the end of the input */ - for (i = 0; (i < (sizeof(number_c_string) - 1)) && can_access_at_index(input_buffer, i); i++) + for (i = 0; (i < (sizeof(number_c_string) - 1)) + && can_access_at_index(input_buffer, i); i++) { switch (buffer_at_offset(input_buffer)[i]) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '+': - case '-': - case 'e': - case 'E': - number_c_string[i] = buffer_at_offset(input_buffer)[i]; - break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '+': + case '-': + case 'e': + case 'E': + number_c_string[i] = buffer_at_offset(input_buffer)[i]; + break; - case '.': - number_c_string[i] = decimal_point; - break; + case '.': + number_c_string[i] = decimal_point; + break; - default: - goto loop_end; + default: + goto loop_end; } } + loop_end: number_c_string[i] = '\0'; - number = strtod((const char*)number_c_string, (char**)&after_end); + number = strtod((const char *)number_c_string, (char **)&after_end); + if (number_c_string == after_end) { return false; /* parse_error */ @@ -397,28 +416,35 @@ CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number) return object->valuedouble = number; } -CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON *object, const char *valuestring) +CJSON_PUBLIC(char *) cJSON_SetValuestring(cJSON *object, + const char *valuestring) { char *copy = NULL; + /* if object's type is not cJSON_String or is cJSON_IsReference, it should not set valuestring */ if (!(object->type & cJSON_String) || (object->type & cJSON_IsReference)) { return NULL; } + if (strlen(valuestring) <= strlen(object->valuestring)) { strcpy(object->valuestring, valuestring); return object->valuestring; } - copy = (char*) cJSON_strdup((const unsigned char*)valuestring, &global_hooks); + + copy = (char *) cJSON_strdup((const unsigned char *)valuestring, &global_hooks); + if (copy == NULL) { return NULL; } + if (object->valuestring != NULL) { cJSON_free(object->valuestring); } + object->valuestring = copy; return copy; @@ -436,7 +462,7 @@ typedef struct } printbuffer; /* realloc printbuffer if necessary to have at least "needed" bytes more */ -static unsigned char* ensure(printbuffer * const p, size_t needed) +static unsigned char *ensure(printbuffer *const p, size_t needed) { unsigned char *newbuffer = NULL; size_t newsize = 0; @@ -459,12 +485,14 @@ static unsigned char* ensure(printbuffer * const p, size_t needed) } needed += p->offset + 1; + if (needed <= p->length) { return p->buffer + p->offset; } - if (p->noalloc) { + if (p->noalloc) + { return NULL; } @@ -489,7 +517,8 @@ static unsigned char* ensure(printbuffer * const p, size_t needed) if (p->hooks.reallocate != NULL) { /* reallocate with realloc if available */ - newbuffer = (unsigned char*)p->hooks.reallocate(p->buffer, newsize); + newbuffer = (unsigned char *)p->hooks.reallocate(p->buffer, newsize); + if (newbuffer == NULL) { p->hooks.deallocate(p->buffer); @@ -502,7 +531,8 @@ static unsigned char* ensure(printbuffer * const p, size_t needed) else { /* otherwise reallocate manually */ - newbuffer = (unsigned char*)p->hooks.allocate(newsize); + newbuffer = (unsigned char *)p->hooks.allocate(newsize); + if (!newbuffer) { p->hooks.deallocate(p->buffer); @@ -515,6 +545,7 @@ static unsigned char* ensure(printbuffer * const p, size_t needed) memcpy(newbuffer, p->buffer, p->offset + 1); p->hooks.deallocate(p->buffer); } + p->length = newsize; p->buffer = newbuffer; @@ -522,16 +553,18 @@ static unsigned char* ensure(printbuffer * const p, size_t needed) } /* calculate the new length of the string in a printbuffer and update the offset */ -static void update_offset(printbuffer * const buffer) +static void update_offset(printbuffer *const buffer) { const unsigned char *buffer_pointer = NULL; + if ((buffer == NULL) || (buffer->buffer == NULL)) { return; } + buffer_pointer = buffer->buffer + buffer->offset; - buffer->offset += strlen((const char*)buffer_pointer); + buffer->offset += strlen((const char *)buffer_pointer); } /* securely comparison of floating-point variables */ @@ -542,7 +575,8 @@ static cJSON_bool compare_double(double a, double b) } /* Render the number nicely from the given item into a string. */ -static cJSON_bool print_number(const cJSON * const item, printbuffer * const output_buffer) +static cJSON_bool print_number(const cJSON *const item, + printbuffer *const output_buffer) { unsigned char *output_pointer = NULL; double d = item->valuedouble; @@ -560,22 +594,23 @@ static cJSON_bool print_number(const cJSON * const item, printbuffer * const out /* This checks for NaN and Infinity */ if (isnan(d) || isinf(d)) { - length = sprintf((char*)number_buffer, "null"); + length = sprintf((char *)number_buffer, "null"); + } + else if (d == (double)item->valueint) + { + length = sprintf((char *)number_buffer, "%d", item->valueint); } - else if(d == (double)item->valueint) - { - length = sprintf((char*)number_buffer, "%d", item->valueint); - } else { /* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */ - length = sprintf((char*)number_buffer, "%1.15g", d); + length = sprintf((char *)number_buffer, "%1.15g", d); /* Check whether the original double can be recovered */ - if ((sscanf((char*)number_buffer, "%lg", &test) != 1) || !compare_double((double)test, d)) + if ((sscanf((char *)number_buffer, "%lg", &test) != 1) + || !compare_double((double)test, d)) { /* If not, print with 17 decimal places of precision */ - length = sprintf((char*)number_buffer, "%1.17g", d); + length = sprintf((char *)number_buffer, "%1.17g", d); } } @@ -587,6 +622,7 @@ static cJSON_bool print_number(const cJSON * const item, printbuffer * const out /* reserve appropriate space in the output */ output_pointer = ensure(output_buffer, (size_t)length + sizeof("")); + if (output_pointer == NULL) { return false; @@ -604,6 +640,7 @@ static cJSON_bool print_number(const cJSON * const item, printbuffer * const out output_pointer[i] = number_buffer[i]; } + output_pointer[i] = '\0'; output_buffer->offset += (size_t)length; @@ -612,7 +649,7 @@ static cJSON_bool print_number(const cJSON * const item, printbuffer * const out } /* parse 4 digit hexadecimal number */ -static unsigned parse_hex4(const unsigned char * const input) +static unsigned parse_hex4(const unsigned char *const input) { unsigned int h = 0; size_t i = 0; @@ -649,7 +686,9 @@ static unsigned parse_hex4(const unsigned char * const input) /* converts a UTF-16 literal to UTF-8 * A literal can be one or two sequences of the form \uXXXX */ -static unsigned char utf16_literal_to_utf8(const unsigned char * const input_pointer, const unsigned char * const input_end, unsigned char **output_pointer) +static unsigned char utf16_literal_to_utf8(const unsigned char *const + input_pointer, const unsigned char *const input_end, + unsigned char **output_pointer) { long unsigned int codepoint = 0; unsigned int first_code = 0; @@ -695,6 +734,7 @@ static unsigned char utf16_literal_to_utf8(const unsigned char * const input_poi /* get the second utf16 sequence */ second_code = parse_hex4(second_sequence + 2); + /* check that the code is valid */ if ((second_code < 0xDC00) || (second_code > 0xDFFF)) { @@ -745,12 +785,14 @@ static unsigned char utf16_literal_to_utf8(const unsigned char * const input_poi } /* encode as utf8 */ - for (utf8_position = (unsigned char)(utf8_length - 1); utf8_position > 0; utf8_position--) + for (utf8_position = (unsigned char)(utf8_length - 1); utf8_position > 0; + utf8_position--) { /* 10xxxxxx */ (*output_pointer)[utf8_position] = (unsigned char)((codepoint | 0x80) & 0xBF); codepoint >>= 6; } + /* encode first byte */ if (utf8_length > 1) { @@ -770,7 +812,8 @@ fail: } /* Parse the input text into an unescaped cinput, and populate item. */ -static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_buffer) +static cJSON_bool parse_string(cJSON *const item, + parse_buffer *const input_buffer) { const unsigned char *input_pointer = buffer_at_offset(input_buffer) + 1; const unsigned char *input_end = buffer_at_offset(input_buffer) + 1; @@ -787,7 +830,9 @@ static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_bu /* calculate approximate size of the output (overestimate) */ size_t allocation_length = 0; size_t skipped_bytes = 0; - while (((size_t)(input_end - input_buffer->content) < input_buffer->length) && (*input_end != '\"')) + + while (((size_t)(input_end - input_buffer->content) < input_buffer->length) + && (*input_end != '\"')) { /* is escape sequence */ if (input_end[0] == '\\') @@ -797,19 +842,26 @@ static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_bu /* prevent buffer overflow when last input character is a backslash */ goto fail; } + skipped_bytes++; input_end++; } + input_end++; } - if (((size_t)(input_end - input_buffer->content) >= input_buffer->length) || (*input_end != '\"')) + + if (((size_t)(input_end - input_buffer->content) >= input_buffer->length) + || (*input_end != '\"')) { goto fail; /* string ended unexpectedly */ } /* This is at most how much we need for the output */ - allocation_length = (size_t) (input_end - buffer_at_offset(input_buffer)) - skipped_bytes; - output = (unsigned char*)input_buffer->hooks.allocate(allocation_length + sizeof("")); + allocation_length = (size_t)(input_end - buffer_at_offset( + input_buffer)) - skipped_bytes; + output = (unsigned char *)input_buffer->hooks.allocate(allocation_length + + sizeof("")); + if (output == NULL) { goto fail; /* allocation failure */ @@ -817,6 +869,7 @@ static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_bu } output_pointer = output; + /* loop through the string literal */ while (input_pointer < input_end) { @@ -828,6 +881,7 @@ static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_bu else { unsigned char sequence_length = 2; + if ((input_end - input_pointer) < 1) { goto fail; @@ -835,40 +889,49 @@ static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_bu switch (input_pointer[1]) { - case 'b': - *output_pointer++ = '\b'; - break; - case 'f': - *output_pointer++ = '\f'; - break; - case 'n': - *output_pointer++ = '\n'; - break; - case 'r': - *output_pointer++ = '\r'; - break; - case 't': - *output_pointer++ = '\t'; - break; - case '\"': - case '\\': - case '/': - *output_pointer++ = input_pointer[1]; - break; - - /* UTF-16 literal */ - case 'u': - sequence_length = utf16_literal_to_utf8(input_pointer, input_end, &output_pointer); - if (sequence_length == 0) - { - /* failed to convert UTF16-literal to UTF-8 */ - goto fail; - } - break; - - default: + case 'b': + *output_pointer++ = '\b'; + break; + + case 'f': + *output_pointer++ = '\f'; + break; + + case 'n': + *output_pointer++ = '\n'; + break; + + case 'r': + *output_pointer++ = '\r'; + break; + + case 't': + *output_pointer++ = '\t'; + break; + + case '\"': + case '\\': + case '/': + *output_pointer++ = input_pointer[1]; + break; + + /* UTF-16 literal */ + case 'u': + sequence_length = utf16_literal_to_utf8(input_pointer, input_end, + &output_pointer); + + if (sequence_length == 0) + { + /* failed to convert UTF16-literal to UTF-8 */ goto fail; + } + + break; + + default: + goto fail; } + input_pointer += sequence_length; } } @@ -877,14 +940,15 @@ static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_bu *output_pointer = '\0'; item->type = cJSON_String; - item->valuestring = (char*)output; + item->valuestring = (char *)output; - input_buffer->offset = (size_t) (input_end - input_buffer->content); + input_buffer->offset = (size_t)(input_end - input_buffer->content); input_buffer->offset++; return true; fail: + if (output != NULL) { input_buffer->hooks.deallocate(output); @@ -899,7 +963,8 @@ fail: } /* Render the cstring provided to an escaped version that can be printed. */ -static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffer * const output_buffer) +static cJSON_bool print_string_ptr(const unsigned char *const input, + printbuffer *const output_buffer) { const unsigned char *input_pointer = NULL; unsigned char *output = NULL; @@ -917,11 +982,13 @@ static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffe if (input == NULL) { output = ensure(output_buffer, sizeof("\"\"")); + if (output == NULL) { return false; } - strcpy((char*)output, "\"\""); + + strcpy((char *)output, "\"\""); return true; } @@ -931,28 +998,32 @@ static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffe { switch (*input_pointer) { - case '\"': - case '\\': - case '\b': - case '\f': - case '\n': - case '\r': - case '\t': - /* one character escape sequence */ - escape_characters++; - break; - default: - if (*input_pointer < 32) - { - /* UTF-16 escape sequence uXXXX */ - escape_characters += 5; - } - break; + case '\"': + case '\\': + case '\b': + case '\f': + case '\n': + case '\r': + case '\t': + /* one character escape sequence */ + escape_characters++; + break; + + default: + if (*input_pointer < 32) + { + /* UTF-16 escape sequence uXXXX */ + escape_characters += 5; + } + + break; } } + output_length = (size_t)(input_pointer - input) + escape_characters; output = ensure(output_buffer, output_length + sizeof("\"\"")); + if (output == NULL) { return false; @@ -971,10 +1042,13 @@ static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffe output[0] = '\"'; output_pointer = output + 1; + /* copy the string */ - for (input_pointer = input; *input_pointer != '\0'; (void)input_pointer++, output_pointer++) + for (input_pointer = input; *input_pointer != '\0'; + (void)input_pointer++, output_pointer++) { - if ((*input_pointer > 31) && (*input_pointer != '\"') && (*input_pointer != '\\')) + if ((*input_pointer > 31) && (*input_pointer != '\"') + && (*input_pointer != '\\')) { /* normal character, copy */ *output_pointer = *input_pointer; @@ -983,37 +1057,46 @@ static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffe { /* character needs to be escaped */ *output_pointer++ = '\\'; + switch (*input_pointer) { - case '\\': - *output_pointer = '\\'; - break; - case '\"': - *output_pointer = '\"'; - break; - case '\b': - *output_pointer = 'b'; - break; - case '\f': - *output_pointer = 'f'; - break; - case '\n': - *output_pointer = 'n'; - break; - case '\r': - *output_pointer = 'r'; - break; - case '\t': - *output_pointer = 't'; - break; - default: - /* escape and print as unicode codepoint */ - sprintf((char*)output_pointer, "u%04x", *input_pointer); - output_pointer += 4; - break; + case '\\': + *output_pointer = '\\'; + break; + + case '\"': + *output_pointer = '\"'; + break; + + case '\b': + *output_pointer = 'b'; + break; + + case '\f': + *output_pointer = 'f'; + break; + + case '\n': + *output_pointer = 'n'; + break; + + case '\r': + *output_pointer = 'r'; + break; + + case '\t': + *output_pointer = 't'; + break; + + default: + /* escape and print as unicode codepoint */ + sprintf((char *)output_pointer, "u%04x", *input_pointer); + output_pointer += 4; + break; } } } + output[output_length + 1] = '\"'; output[output_length + 2] = '\0'; @@ -1021,21 +1104,27 @@ static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffe } /* Invoke print_string_ptr (which is useful) on an item. */ -static cJSON_bool print_string(const cJSON * const item, printbuffer * const p) +static cJSON_bool print_string(const cJSON *const item, printbuffer *const p) { - return print_string_ptr((unsigned char*)item->valuestring, p); + return print_string_ptr((unsigned char *)item->valuestring, p); } /* Predeclare these prototypes. */ -static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer); -static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer); -static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer); -static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer); -static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer); -static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_value(cJSON *const item, + parse_buffer *const input_buffer); +static cJSON_bool print_value(const cJSON *const item, + printbuffer *const output_buffer); +static cJSON_bool parse_array(cJSON *const item, + parse_buffer *const input_buffer); +static cJSON_bool print_array(const cJSON *const item, + printbuffer *const output_buffer); +static cJSON_bool parse_object(cJSON *const item, + parse_buffer *const input_buffer); +static cJSON_bool print_object(const cJSON *const item, + printbuffer *const output_buffer); /* Utility to jump whitespace and cr/lf */ -static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) +static parse_buffer *buffer_skip_whitespace(parse_buffer *const buffer) { if ((buffer == NULL) || (buffer->content == NULL)) { @@ -1049,7 +1138,7 @@ static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) while (can_access_at_index(buffer, 0) && (buffer_at_offset(buffer)[0] <= 32)) { - buffer->offset++; + buffer->offset++; } if (buffer->offset == buffer->length) @@ -1061,14 +1150,15 @@ static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) } /* skip the UTF-8 BOM (byte order mark) if it is at the beginning of a buffer */ -static parse_buffer *skip_utf8_bom(parse_buffer * const buffer) +static parse_buffer *skip_utf8_bom(parse_buffer *const buffer) { if ((buffer == NULL) || (buffer->content == NULL) || (buffer->offset != 0)) { return NULL; } - if (can_access_at_index(buffer, 4) && (strncmp((const char*)buffer_at_offset(buffer), "\xEF\xBB\xBF", 3) == 0)) + if (can_access_at_index(buffer, 4) + && (strncmp((const char *)buffer_at_offset(buffer), "\xEF\xBB\xBF", 3) == 0)) { buffer->offset += 3; } @@ -1076,7 +1166,8 @@ static parse_buffer *skip_utf8_bom(parse_buffer * const buffer) return buffer; } -CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated) +CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, + const char **return_parse_end, cJSON_bool require_null_terminated) { size_t buffer_length; @@ -1088,11 +1179,14 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return /* Adding null character size due to require_null_terminated. */ buffer_length = strlen(value) + sizeof(""); - return cJSON_ParseWithLengthOpts(value, buffer_length, return_parse_end, require_null_terminated); + return cJSON_ParseWithLengthOpts(value, buffer_length, return_parse_end, + require_null_terminated); } /* Parse an object - create a new root, and populate. */ -CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated) +CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, + size_t buffer_length, const char **return_parse_end, + cJSON_bool require_null_terminated) { parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } }; cJSON *item = NULL; @@ -1106,12 +1200,13 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer goto fail; } - buffer.content = (const unsigned char*)value; + buffer.content = (const unsigned char *)value; buffer.length = buffer_length; buffer.offset = 0; buffer.hooks = global_hooks; item = cJSON_New_Item(&global_hooks); + if (item == NULL) /* memory fail */ { goto fail; @@ -1127,19 +1222,22 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer if (require_null_terminated) { buffer_skip_whitespace(&buffer); + if ((buffer.offset >= buffer.length) || buffer_at_offset(&buffer)[0] != '\0') { goto fail; } } + if (return_parse_end) { - *return_parse_end = (const char*)buffer_at_offset(&buffer); + *return_parse_end = (const char *)buffer_at_offset(&buffer); } return item; fail: + if (item != NULL) { cJSON_Delete(item); @@ -1148,7 +1246,7 @@ fail: if (value != NULL) { error local_error; - local_error.json = (const unsigned char*)value; + local_error.json = (const unsigned char *)value; local_error.position = 0; if (buffer.offset < buffer.length) @@ -1162,7 +1260,7 @@ fail: if (return_parse_end != NULL) { - *return_parse_end = (const char*)local_error.json + local_error.position; + *return_parse_end = (const char *)local_error.json + local_error.position; } global_error = local_error; @@ -1177,14 +1275,16 @@ CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value) return cJSON_ParseWithOpts(value, 0, 0); } -CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length) +CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, + size_t buffer_length) { return cJSON_ParseWithLengthOpts(value, buffer_length, 0, 0); } #define cjson_min(a, b) (((a) < (b)) ? (a) : (b)) -static unsigned char *print(const cJSON * const item, cJSON_bool format, const internal_hooks * const hooks) +static unsigned char *print(const cJSON *const item, cJSON_bool format, + const internal_hooks *const hooks) { static const size_t default_buffer_size = 256; printbuffer buffer[1]; @@ -1193,10 +1293,11 @@ static unsigned char *print(const cJSON * const item, cJSON_bool format, const i memset(buffer, 0, sizeof(buffer)); /* create buffer */ - buffer->buffer = (unsigned char*) hooks->allocate(default_buffer_size); + buffer->buffer = (unsigned char *) hooks->allocate(default_buffer_size); buffer->length = default_buffer_size; buffer->format = format; buffer->hooks = *hooks; + if (buffer->buffer == NULL) { goto fail; @@ -1207,24 +1308,31 @@ static unsigned char *print(const cJSON * const item, cJSON_bool format, const i { goto fail; } + update_offset(buffer); /* check if reallocate is available */ if (hooks->reallocate != NULL) { - printed = (unsigned char*) hooks->reallocate(buffer->buffer, buffer->offset + 1); - if (printed == NULL) { + printed = (unsigned char *) hooks->reallocate(buffer->buffer, + buffer->offset + 1); + + if (printed == NULL) + { goto fail; } + buffer->buffer = NULL; } else /* otherwise copy the JSON over to a new buffer */ { - printed = (unsigned char*) hooks->allocate(buffer->offset + 1); + printed = (unsigned char *) hooks->allocate(buffer->offset + 1); + if (printed == NULL) { goto fail; } + memcpy(printed, buffer->buffer, cjson_min(buffer->length, buffer->offset + 1)); printed[buffer->offset] = '\0'; /* just to be sure */ @@ -1235,6 +1343,7 @@ static unsigned char *print(const cJSON * const item, cJSON_bool format, const i return printed; fail: + if (buffer->buffer != NULL) { hooks->deallocate(buffer->buffer); @@ -1251,15 +1360,16 @@ fail: /* Render a cJSON item/entity/structure to text. */ CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item) { - return (char*)print(item, true, &global_hooks); + return (char *)print(item, true, &global_hooks); } CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item) { - return (char*)print(item, false, &global_hooks); + return (char *)print(item, false, &global_hooks); } -CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt) +CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, + cJSON_bool fmt) { printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; @@ -1268,7 +1378,8 @@ CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON return NULL; } - p.buffer = (unsigned char*)global_hooks.allocate((size_t)prebuffer); + p.buffer = (unsigned char *)global_hooks.allocate((size_t)prebuffer); + if (!p.buffer) { return NULL; @@ -1286,10 +1397,11 @@ CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON return NULL; } - return (char*)p.buffer; + return (char *)p.buffer; } -CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format) +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, + const int length, const cJSON_bool format) { printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; @@ -1298,7 +1410,7 @@ CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, cons return false; } - p.buffer = (unsigned char*)buffer; + p.buffer = (unsigned char *)buffer; p.length = (size_t)length; p.offset = 0; p.noalloc = true; @@ -1309,7 +1421,8 @@ CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, cons } /* Parser core - when encountering text, process appropriately. */ -static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer) +static cJSON_bool parse_value(cJSON *const item, + parse_buffer *const input_buffer) { if ((input_buffer == NULL) || (input_buffer->content == NULL)) { @@ -1318,44 +1431,59 @@ static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buf /* parse the different types of values */ /* null */ - if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "null", 4) == 0)) + if (can_read(input_buffer, 4) + && (strncmp((const char *)buffer_at_offset(input_buffer), "null", 4) == 0)) { item->type = cJSON_NULL; input_buffer->offset += 4; return true; } + /* false */ - if (can_read(input_buffer, 5) && (strncmp((const char*)buffer_at_offset(input_buffer), "false", 5) == 0)) + if (can_read(input_buffer, 5) + ... [truncated message content] |
From: n0nb <n0...@us...> - 2023-12-08 18:56:35
|
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 ae69772d2a5dd8adad0c8de51b6c44db5f060e35 (commit) via f6eed234941f4985b992b57a2a2fd3c84aa1e403 (commit) via cf973c9b0aad24e764c03b8df48cbfbca4040e78 (commit) via 3729f658ecd6b9697233a6f741eb2beebed6f5f6 (commit) via 768ca6105d3b0cf3fa18c5988f1c418c7594a1c6 (commit) via f0e97a9e0e0c9d13479972996836df410beda484 (commit) via 4e1aa90499126198ff10069e7b1a1456c0d55889 (commit) via f4d40e0d79193a9b1925b9bac0ed7e9c9a5d2882 (commit) via e3f1816e8a422729b9ca4750d4690a2017b3c493 (commit) via 37fb4eafdd33cdb88beda3d20e94a6ffcf12d781 (commit) via ed630b28d196bcf723a52199c71b9b9f45f75f08 (commit) via f255f6f8d8412c423a2fffb4864e11200f45491f (commit) via 88c3d9427b5683f1d183cf75bceaefd346500847 (commit) via cc49669b494e736726b496fbec8e85b67904caf7 (commit) via 8940d915220b97b5ed4f25bfc9e606c89df48ac8 (commit) via e40981e198163d0acf7d9ab98bc073ee823b97fc (commit) via a5ad218bba7879b7e57c4b65043b1ead08ad3180 (commit) via 7973db52de5d149e7a416aabd19c093659e92629 (commit) via 001dd01a10397ec63f1ddcce05c9bddd843a9cbd (commit) via 756fad1c723cd77d2aa0e212777b29b7f352ed46 (commit) via 07f57cfc18349100280d26c3466d6b284512b561 (commit) via ed941939359da9f8734dbdf4a21a9b01622a1a6e (commit) via a910b16e8f961506d2408ff62632f8afe797f323 (commit) via 4f019e622e3c3957e94d5f42de8be93cdc55c6f4 (commit) via c0457a0d7b8f894baf4f8f2e446f36922cb9c1a1 (commit) via 09ab2819b3b66936e7a7d73d832660fc59354643 (commit) via 46c16b22a0bbce4acd5d25a6bcdcac69708a588e (commit) via 698cb10ff3a5921454924f0f5e05534ba21b55bd (commit) via 9c01045356a29622857ca7338329903317123a83 (commit) via 30f47cdeba342f80905a1c73a9b9afc3fa59dbc3 (commit) via 50563e2fce8132db121c42393e4256a796622996 (commit) via 6712f32fe3dc1aed1ac1ed4ee4bfe5c238a43f1c (commit) via 8c49a977faef8d8ffec9bfd546dc37752f6aef8f (commit) via 5bb669edbd24e6e05db0c67f8b826bf70c01dd4a (commit) via 9841e500b94f642a0b4511991faccb0143c32475 (commit) via f28d6742112ea0e508b21246cce42e082f4f9579 (commit) via 50c4646c1d237deb806b88724e171f7f6c9dfe48 (commit) via f88399ed3a2828fb967e7d570c13b19e029411f6 (commit) via d0fd27afd6b4d9df99b0e3c3e6afeafacbb88117 (commit) via 5d51e29d4459ff3a9dd87df90adc3ef6cac2de69 (commit) via 15729dfafd16fb1fabca24c03f6f0670ee278aea (commit) from bb87d92f43f2f0599e1e573907daf33a6b50286f (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 ae69772d2a5dd8adad0c8de51b6c44db5f060e35 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Dec 8 11:42:44 2023 -0600 Update NEWS diff --git a/NEWS b/NEWS index 5409bba58..644b7fd1a 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,14 @@ Version 5.x -- future * Change FT1000MP Mark V model names to align with FT1000MP Version 4.6 + * 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*) +#else +static int add_to_list(const struct rig_caps* rc, void*) +#endif + + * IC7610 now has IPP, DPP, and TX_INHIBIT functions set/get * Hamlib now starts a multicast server that sends out rig information. Does not receive commands yet. See README.multicast commit f6eed234941f4985b992b57a2a2fd3c84aa1e403 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Dec 8 08:24:29 2023 -0600 Ignore RIG_VFO_NONE in cache.c diff --git a/src/cache.c b/src/cache.c index 48452ac5d..75dea96a3 100644 --- a/src/cache.c +++ b/src/cache.c @@ -326,6 +326,10 @@ int rig_get_cache(RIG *rig, vfo_t vfo, freq_t *freq, int *cache_ms_freq, vfo = RIG_VFO_SUB_A; break; + case RIG_VFO_NONE: + rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): ignoring VFO_OTHER\n", __func__, __LINE__); + break; + default: 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 cf973c9b0aad24e764c03b8df48cbfbca4040e78 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Dec 8 07:53:21 2023 -0600 Ignorie RIG_VFO_OTHER cache request diff --git a/src/cache.c b/src/cache.c index cf257a3d8..48452ac5d 100644 --- a/src/cache.c +++ b/src/cache.c @@ -215,6 +215,10 @@ int rig_set_cache_freq(RIG *rig, vfo_t vfo, freq_t freq) elapsed_ms(&rig->state.cache.time_freqMem, flag); break; + case RIG_VFO_OTHER: + rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): ignoring VFO_OTHER\n", __func__, __LINE__); + break; + default: rig_debug(RIG_DEBUG_WARN, "%s(%d): unknown vfo?, vfo=%s\n", __func__, __LINE__, rig_strvfo(vfo)); commit 3729f658ecd6b9697233a6f741eb2beebed6f5f6 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Dec 4 22:18:14 2023 -0600 Add 60M channel 3 for 5357MhZ for FT8 on channelized 60M rigs diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 6635c2a33..d4c38f860 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -893,6 +893,7 @@ int newcat_60m_exception(RIG *rig, freq_t freq, mode_t mode) { if ((long)freq == freq_60m[i]) { channel = i; } } + if ((long)freq == 5357000) channel = 3; // 60M channel for FT8 if (channel < 0) { diff --git a/rigs/yaesu/newcat.h b/rigs/yaesu/newcat.h index 29a639eb7..6521bf966 100644 --- a/rigs/yaesu/newcat.h +++ b/rigs/yaesu/newcat.h @@ -50,7 +50,7 @@ typedef char ncboolean; /* shared function version */ -#define NEWCAT_VER "20231101" +#define NEWCAT_VER "20231204" /* Hopefully large enough for future use, 128 chars plus '\0' */ #define NEWCAT_DATA_LEN 129 commit 768ca6105d3b0cf3fa18c5988f1c418c7594a1c6 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Dec 4 16:35:23 2023 -0600 Update comment in icom.c diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index 7a4228750..1e34d671f 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -2212,7 +2212,7 @@ static int icom_set_mode_x26(RIG *rig, vfo_t vfo, rmode_t mode, int datamode, buf[1] = datamode; // filter fixed to filter 1 due to IC7300 bug defaulting to filter 2 on mode changed -- yuck!! // buf[2] = filter // if Icom ever fixed this - // buf[2] = 1; // let's skip the filter selection + // buf[2] = 1; // let's skip the filter selection Tested on 7300 and 9700 retval = icom_transaction(rig, cmd2, subcmd2, buf, 2, ackbuf, &ack_len); commit f0e97a9e0e0c9d13479972996836df410beda484 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Dec 4 16:13:52 2023 -0600 Allow freq=0 for PowerSDR and perhaps others diff --git a/rigs/dummy/flrig.c b/rigs/dummy/flrig.c index 3ef94b1f5..f4fb27349 100644 --- a/rigs/dummy/flrig.c +++ b/rigs/dummy/flrig.c @@ -143,7 +143,7 @@ struct rig_caps flrig_caps = RIG_MODEL(RIG_MODEL_FLRIG), .model_name = "FLRig", .mfg_name = "FLRig", - .version = "20231113.0", + .version = "20231204.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -1209,6 +1209,9 @@ static int flrig_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) *freq = atof(value); + +#if 0 // zero is actually valid for PowerSDR + if (*freq == 0) { rig_debug(RIG_DEBUG_ERR, "%s: freq==0??\nvalue=%s\n", __func__, @@ -1216,6 +1219,7 @@ static int flrig_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) RETURNFUNC(-RIG_EPROTO); } else +#endif { rig_debug(RIG_DEBUG_TRACE, "%s: freq=%.0f\n", __func__, *freq); } commit 4e1aa90499126198ff10069e7b1a1456c0d55889 Merge: e3f1816e8 f4d40e0d7 Author: Michael Black <mdb...@ya...> Date: Mon Dec 4 14:42:48 2023 -0600 Merge pull request #1444 from GeoBaltz/fix6 Restore shared library ABI compatibility with previous hamlibs commit f4d40e0d79193a9b1925b9bac0ed7e9c9a5d2882 Author: George Baltz N3GB <Geo...@gm...> Date: Mon Dec 4 10:47:52 2023 -0500 Restore shared library ABI compatibility with previous hamlibs No need for post_ptt_delay to be in hamlib_port - move it to misc rig_state data. Update references to post_ptt_delay Fix a couple of typos Add code to actually set post_ptt_delay Fixes issue #1412 diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 9ad2e32db..f8a5a72ad 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -2388,7 +2388,7 @@ typedef struct hamlib_port { int fd_sync_error_read; /*!< file descriptor for reading synchronous data error codes */ #endif short timeout_retry; /*!< number of retries to make in case of read timeout errors, some serial interfaces may require this, 0 to disable */ - int post_ptt_delay; /*!< delay after PTT to allow for relays and such */ +// DO NOT ADD ANYTHING HERE UNTIL 5.0!! } hamlib_port_t; @@ -2787,6 +2787,8 @@ struct rig_state { rig_comm_status_t comm_status; /*!< Detailed rig control status */ char device_id[HAMLIB_RIGNAMSIZ]; int dual_watch; /*!< Boolean DUAL_WATCH status */ + int post_ptt_delay; /*!< delay after PTT to allow for relays and such */ +// New rig_state items go before this line ============================================ }; /** @@ -2799,7 +2801,7 @@ struct rig_state { * It is NOT fine to touch this struct AT ALL!!! */ struct rig_state_deprecated { - /********* ENSURE YOU DO NOT EVERY MODIFY THIS STRUCTURE *********/ + /********* ENSURE YOU DO NOT EVER MODIFY THIS STRUCTURE *********/ /********* It will remain forever to provide DLL backwards compatiblity ******/ /* * overridable fields diff --git a/src/conf.c b/src/conf.c index 612fa46c4..6e5102de4 100644 --- a/src/conf.c +++ b/src/conf.c @@ -268,7 +268,15 @@ static int frontend_set_conf(RIG *rig, token_t token, const char *val) } rs->rigport.post_write_delay = val_i; - rs->rigport_deprecated.timeout = val_i; + rs->rigport_deprecated.post_write_delay = val_i; + break; + + case TOK_POST_PTT_DELAY: + if (1 != sscanf(val, "%ld", &val_i)) + { + return -RIG_EINVAL; + } + rs->post_ptt_delay = val_i; break; case TOK_TIMEOUT: @@ -841,7 +849,7 @@ static int frontend_get_conf2(RIG *rig, token_t token, char *val, int val_len) break; case TOK_POST_PTT_DELAY: - SNPRINTF(val, val_len, "%d", rs->rigport.post_ptt_delay); + SNPRINTF(val, val_len, "%d", rs->post_ptt_delay); break; case TOK_TIMEOUT: diff --git a/src/rig.c b/src/rig.c index 4fc6e6d32..059911bb7 100644 --- a/src/rig.c +++ b/src/rig.c @@ -3562,7 +3562,7 @@ int HAMLIB_API rig_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) memcpy(&rig->state.pttport_deprecated, &rig->state.pttport, sizeof(rig->state.pttport_deprecated)); - if (rig->state.rigport.post_ptt_delay > 0) hl_usleep(rig->state.rigport.post_ptt_delay*1000); + if (rig->state.post_ptt_delay > 0) hl_usleep(rig->state.post_ptt_delay*1000); ELAPSED2; RETURNFUNC(retcode); commit e3f1816e8a422729b9ca4750d4690a2017b3c493 Merge: f255f6f8d 37fb4eafd Author: Michael Black <mdb...@ya...> Date: Fri Dec 1 10:41:37 2023 -0600 Merge pull request #1441 from GeoBaltz/fix5 Fix FTDX101MP RFPOWER the right way commit 37fb4eafdd33cdb88beda3d20e94a6ffcf12d781 Author: George Baltz N3GB <Geo...@gm...> Date: Fri Dec 1 11:18:13 2023 -0500 Fix FTDX101MP RFPOWER the right way. diff --git a/rigs/yaesu/ftdx101mp.c b/rigs/yaesu/ftdx101mp.c index 5289c09e9..d459051c0 100644 --- a/rigs/yaesu/ftdx101mp.c +++ b/rigs/yaesu/ftdx101mp.c @@ -104,7 +104,7 @@ struct rig_caps ftdx101mp_caps = [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_MONITOR_GAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, - [LVL_RFPOWER] = { .min = { .f = .05 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_RFPOWER] = { .min = { .f = .025 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/200.0f } }, [LVL_USB_AF] = { .min = { .f = .0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_USB_AF_INPUT] = { .min = { .f = .0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, commit ed630b28d196bcf723a52199c71b9b9f45f75f08 Author: George Baltz N3GB <Geo...@gm...> Date: Fri Dec 1 11:11:21 2023 -0500 Revert "Fix FTDX101MP RFPOWER to allow 200W" Unnecessary code, breaks other levels. This reverts commit f255f6f8d8412c423a2fffb4864e11200f45491f. diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index e99a89558..6635c2a33 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -4046,19 +4046,13 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) } if ( is_ftdx3000dm ) /* No separate rig->caps for this rig :-( */ - { - fpf = (int)((val.f * 50.0f) + 0.5f); - } - else if (is_ftdx101mp) - { - fpf = (int)((val.f / level_info->step.f) + 0.5f ) * 2; - if (fpf > 200) fpf = 200; - } - - else - { - fpf = (int)((val.f / level_info->step.f) + 0.5f ); - } + { + fpf = (int)((val.f * 50.0f) + 0.5f); + } + else + { + fpf = (int)((val.f / level_info->step.f) + 0.5f ); + } SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "PC%03d%c", fpf, cat_term); break; @@ -5640,7 +5634,6 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) case RIG_LEVEL_RFPOWER: case RIG_LEVEL_MONITOR_GAIN: val->f = (float)atoi(retlvl) * level_info->step.f; - if (is_ftdx101mp) val->f /= 2; break; case RIG_LEVEL_BKINDL: diff --git a/rigs/yaesu/newcat.h b/rigs/yaesu/newcat.h index 3b30adf16..29a639eb7 100644 --- a/rigs/yaesu/newcat.h +++ b/rigs/yaesu/newcat.h @@ -50,7 +50,7 @@ typedef char ncboolean; /* shared function version */ -#define NEWCAT_VER "20231130" +#define NEWCAT_VER "20231101" /* Hopefully large enough for future use, 128 chars plus '\0' */ #define NEWCAT_DATA_LEN 129 commit f255f6f8d8412c423a2fffb4864e11200f45491f Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Nov 30 22:32:42 2023 -0600 Fix FTDX101MP RFPOWER to allow 200W https://github.com/Hamlib/Hamlib/issues/1396 diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 6635c2a33..e99a89558 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -4046,13 +4046,19 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) } if ( is_ftdx3000dm ) /* No separate rig->caps for this rig :-( */ - { - fpf = (int)((val.f * 50.0f) + 0.5f); - } - else - { - fpf = (int)((val.f / level_info->step.f) + 0.5f ); - } + { + fpf = (int)((val.f * 50.0f) + 0.5f); + } + else if (is_ftdx101mp) + { + fpf = (int)((val.f / level_info->step.f) + 0.5f ) * 2; + if (fpf > 200) fpf = 200; + } + + else + { + fpf = (int)((val.f / level_info->step.f) + 0.5f ); + } SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "PC%03d%c", fpf, cat_term); break; @@ -5634,6 +5640,7 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) case RIG_LEVEL_RFPOWER: case RIG_LEVEL_MONITOR_GAIN: val->f = (float)atoi(retlvl) * level_info->step.f; + if (is_ftdx101mp) val->f /= 2; break; case RIG_LEVEL_BKINDL: diff --git a/rigs/yaesu/newcat.h b/rigs/yaesu/newcat.h index 29a639eb7..3b30adf16 100644 --- a/rigs/yaesu/newcat.h +++ b/rigs/yaesu/newcat.h @@ -50,7 +50,7 @@ typedef char ncboolean; /* shared function version */ -#define NEWCAT_VER "20231101" +#define NEWCAT_VER "20231130" /* Hopefully large enough for future use, 128 chars plus '\0' */ #define NEWCAT_DATA_LEN 129 commit 88c3d9427b5683f1d183cf75bceaefd346500847 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Nov 30 22:15:44 2023 -0600 Fix simftdx101 diff --git a/simulators/simftdx101.c b/simulators/simftdx101.c index 13adf7965..10e34e72f 100644 --- a/simulators/simftdx101.c +++ b/simulators/simftdx101.c @@ -332,13 +332,13 @@ int main(int argc, char *argv[]) } else if (strcmp(buf, "EX010415;") == 0) { - sprintf(buf,"EX010415%03d;", rport_gain); + sprintf(buf,"EX010415%03d;", rport_gain_psk); n = write(fd, buf, strlen(buf)); } else if (strncmp(buf, "EX010415", 8) == 0) { printf("Here#1"); - sscanf(buf,"EX010415%d", &rport_gain); + sscanf(buf,"EX010415%d", &rport_gain_psk); } else if (strlen(buf) > 0) commit cc49669b494e736726b496fbec8e85b67904caf7 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Nov 30 10:31:56 2023 -0600 Change Icom 0x26 behavior to leave filter# alone Rigs should remember filter based on last filter used for the mode diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index ce8f09006..7a4228750 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -950,6 +950,7 @@ static vfo_t icom_current_vfo(RIG *rig) } rig_debug(RIG_DEBUG_TRACE, "%s: currVFO=%s\n", __func__, rig_strvfo(currVFO)); + if (rig->state.current_vfo != RIG_VFO_NONE) currVFO = rig->state.current_vfo; return currVFO; } @@ -2211,9 +2212,9 @@ static int icom_set_mode_x26(RIG *rig, vfo_t vfo, rmode_t mode, int datamode, buf[1] = datamode; // filter fixed to filter 1 due to IC7300 bug defaulting to filter 2 on mode changed -- yuck!! // buf[2] = filter // if Icom ever fixed this - buf[2] = 1; + // buf[2] = 1; // let's skip the filter selection - retval = icom_transaction(rig, cmd2, subcmd2, buf, 3, ackbuf, &ack_len); + retval = icom_transaction(rig, cmd2, subcmd2, buf, 2, ackbuf, &ack_len); if (retval != RIG_OK) { diff --git a/rigs/icom/icom.h b/rigs/icom/icom.h index cc800675c..95bb0787a 100644 --- a/rigs/icom/icom.h +++ b/rigs/icom/icom.h @@ -35,7 +35,7 @@ #include <sys/time.h> #endif -#define BACKEND_VER "20231116" +#define BACKEND_VER "20231130" #define ICOM_IS_ID31 rig_is_model(rig, RIG_MODEL_ID31) #define ICOM_IS_ID51 rig_is_model(rig, RIG_MODEL_ID51) commit 8940d915220b97b5ed4f25bfc9e606c89df48ac8 Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Nov 29 17:04:56 2023 -0600 Fix CPU usage in simulators when client quits diff --git a/simulators/simelecraft.c b/simulators/simelecraft.c index 7a9e84c47..d047474c7 100644 --- a/simulators/simelecraft.c +++ b/simulators/simelecraft.c @@ -70,6 +70,7 @@ getmyline(int fd, char *buf) if (c == ';') { return strlen(buf); } } + if (strlen(buf)==0) hl_usleep(10*1000); return strlen(buf); } diff --git a/simulators/simft818.c b/simulators/simft818.c index a2bafe672..dda144558 100644 --- a/simulators/simft818.c +++ b/simulators/simft818.c @@ -63,6 +63,7 @@ getmyline(int fd, char *buf) if (c == ';') { return strlen(buf); } } + if (strlen(buf)==0) hl_usleep(10*1000); return strlen(buf); } diff --git a/simulators/simft991.c b/simulators/simft991.c index d2f5b1eb2..3ce19996d 100644 --- a/simulators/simft991.c +++ b/simulators/simft991.c @@ -63,6 +63,7 @@ getmyline(int fd, char *buf) if (c == ';') { return strlen(buf); } } + if (strlen(buf)==0) hl_usleep(10*1000); return strlen(buf); } diff --git a/simulators/simftdx101.c b/simulators/simftdx101.c index f12cbdaac..13adf7965 100644 --- a/simulators/simftdx101.c +++ b/simulators/simftdx101.c @@ -72,6 +72,7 @@ getmyline(int fd, char *buf) if (c == ';') { return strlen(buf); } } + if (strlen(buf)==0) hl_usleep(10*1000); return strlen(buf); } diff --git a/simulators/simftdx1200.c b/simulators/simftdx1200.c index 2aa814b70..a5c948a78 100644 --- a/simulators/simftdx1200.c +++ b/simulators/simftdx1200.c @@ -65,6 +65,7 @@ getmyline(int fd, char *buf) if (c == ';') { return strlen(buf); } } + if (strlen(buf)==0) hl_usleep(10*1000); return strlen(buf); } diff --git a/simulators/simftdx3000.c b/simulators/simftdx3000.c index 23a1ae999..361993dd9 100644 --- a/simulators/simftdx3000.c +++ b/simulators/simftdx3000.c @@ -64,6 +64,7 @@ getmyline(int fd, char *buf) if (c == ';') { return strlen(buf); } } + if (strlen(buf)==0) hl_usleep(10*1000); return strlen(buf); } diff --git a/simulators/simftdx5000.c b/simulators/simftdx5000.c index 25450001d..a2560b4f9 100644 --- a/simulators/simftdx5000.c +++ b/simulators/simftdx5000.c @@ -66,6 +66,7 @@ getmyline(int fd, char *buf) if (c == ';') { return strlen(buf); } } + if (strlen(buf)==0) hl_usleep(10*1000); return strlen(buf); } diff --git a/simulators/simic7300.c b/simulators/simic7300.c index 92f1bf481..c49d0ea68 100644 --- a/simulators/simic7300.c +++ b/simulators/simic7300.c @@ -72,7 +72,7 @@ again: while (read(fd, &c, 1) > 0) { buf[i++] = c; - //printf("i=%d, c=0x%02x\n",i,c); + printf("i=%d, c=0x%02x\n",i,c); if (c == 0xfd) { @@ -141,6 +141,7 @@ void frameParse(int fd, unsigned char *frame, int len) if (powerstat) { + dump_hex(frame,11); n = write(fd, frame, 11); if (n <= 0) { fprintf(stderr, "%s(%d) write error %s\n", __func__, __LINE__, strerror(errno)); } diff --git a/simulators/simkenwood.c b/simulators/simkenwood.c index fabff7b43..12d1d8ff4 100644 --- a/simulators/simkenwood.c +++ b/simulators/simkenwood.c @@ -60,6 +60,7 @@ getmyline(int fd, char *buf) if (c == ';') { return strlen(buf); } } + if (strlen(buf)==0) hl_usleep(10*1000); return strlen(buf); } diff --git a/simulators/simpowersdr.c b/simulators/simpowersdr.c index 3dedd8fb7..fac5f2456 100644 --- a/simulators/simpowersdr.c +++ b/simulators/simpowersdr.c @@ -61,6 +61,7 @@ getmyline(int fd, char *buf) if (c == ';') { return strlen(buf); } } + if (strlen(buf)==0) hl_usleep(10*1000); return strlen(buf); } diff --git a/simulators/simqrplabs.c b/simulators/simqrplabs.c index 39372c75c..c33612307 100644 --- a/simulators/simqrplabs.c +++ b/simulators/simqrplabs.c @@ -40,6 +40,7 @@ getmyline(int fd, char *buf) if (c == ';') { return strlen(buf); } } + if (strlen(buf)==0) hl_usleep(10*1000); return strlen(buf); } diff --git a/simulators/simrotorez.c b/simulators/simrotorez.c index 51101ae4d..fdd859ece 100644 --- a/simulators/simrotorez.c +++ b/simulators/simrotorez.c @@ -39,6 +39,7 @@ getmyline(int fd, char *buf) printf("\n"); } + if (strlen(buf)==0) hl_usleep(10*1000); return n; } diff --git a/simulators/simtmd700.c b/simulators/simtmd700.c index e82aa49e9..67501b28b 100644 --- a/simulators/simtmd700.c +++ b/simulators/simtmd700.c @@ -60,6 +60,7 @@ getmyline(int fd, char *buf) buf[i++] = c; } + if (strlen(buf)==0) hl_usleep(10*1000); return strlen(buf); } diff --git a/simulators/simtrusdx.c b/simulators/simtrusdx.c index 5241e5a7d..211f20d6e 100644 --- a/simulators/simtrusdx.c +++ b/simulators/simtrusdx.c @@ -42,6 +42,7 @@ getmyline(int fd, char *buf) if (c == ';') { return strlen(buf); } } + if (strlen(buf)==0) hl_usleep(10*1000); return strlen(buf); } diff --git a/simulators/simts450.c b/simulators/simts450.c index 08ab439bb..853db5c85 100644 --- a/simulators/simts450.c +++ b/simulators/simts450.c @@ -42,6 +42,7 @@ getmyline(int fd, char *buf) if (c == ';') { return strlen(buf); } } + if (strlen(buf)==0) hl_usleep(10*1000); return strlen(buf); } diff --git a/simulators/simts590.c b/simulators/simts590.c index 699d6e266..08e444f11 100644 --- a/simulators/simts590.c +++ b/simulators/simts590.c @@ -48,6 +48,7 @@ getmyline(int fd, char *buf) if (c == ';') { return strlen(buf); } } + if (strlen(buf)==0) hl_usleep(10*1000); return strlen(buf); } diff --git a/simulators/simts950.c b/simulators/simts950.c index c0296fce6..c9b9ba2ca 100644 --- a/simulators/simts950.c +++ b/simulators/simts950.c @@ -40,6 +40,7 @@ getmyline(int fd, char *buf) if (c == ';') { return strlen(buf); } } + if (strlen(buf)==0) hl_usleep(10*1000); return strlen(buf); } diff --git a/simulators/simts990.c b/simulators/simts990.c index 24d265e9b..9433aaa8b 100644 --- a/simulators/simts990.c +++ b/simulators/simts990.c @@ -92,6 +92,7 @@ getmyline(int fd, char *buf) close(fd); fd = openPort(""); } + if (strlen(buf)==0) hl_usleep(10*1000); return strlen(buf); } diff --git a/simulators/simyaesu.c b/simulators/simyaesu.c index 550108f89..2759930ad 100644 --- a/simulators/simyaesu.c +++ b/simulators/simyaesu.c @@ -69,6 +69,7 @@ getmyline(int fd, char *buf) if (c == ';') { return strlen(buf); } } + if (strlen(buf)==0) hl_usleep(10*1000); return strlen(buf); } commit e40981e198163d0acf7d9ab98bc073ee823b97fc Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Nov 29 16:02:19 2023 -0600 Add simtrusdx.c diff --git a/simulators/simtrusdx.c b/simulators/simtrusdx.c new file mode 100644 index 000000000..5241e5a7d --- /dev/null +++ b/simulators/simtrusdx.c @@ -0,0 +1,358 @@ +// can run this using rigctl/rigctld and socat pty devices +// gcc -o simyaesu simyaesu.c +#define _XOPEN_SOURCE 700 +// since we are POSIX here we need this +#if 0 +struct ip_mreq +{ + int dummy; +}; +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <string.h> +#include <unistd.h> +#include <hamlib/rig.h> +#include "sim.h" + +#define BUFSIZE 256 + +int mysleep = 20; + +float freqA = 14074000; +float freqB = 14074500; +int filternum = 7; +int datamode = 0; +int vfo, vfo_tx, ptt, ptt_data, ptt_mic, ptt_tune; +int tomode = 0; +int keyspd = 25; + +int +getmyline(int fd, char *buf) +{ + char c; + int i = 0; + memset(buf, 0, BUFSIZE); + + while (read(fd, &c, 1) > 0) + { + buf[i++] = c; + + if (c == ';') { return strlen(buf); } + } + + return strlen(buf); +} + +#if defined(WIN32) || defined(_WIN32) +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd; + fd = open(comport, O_RDWR); + + if (fd < 0) + { + perror(comport); + } + + return fd; +} + +#else +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd = posix_openpt(O_RDWR); + char *name = ptsname(fd); + + if (name == NULL) + { + perror("pstname"); + return -1; + } + + printf("name=%s\n", name); + + if (fd == -1 || grantpt(fd) == -1 || unlockpt(fd) == -1) + { + perror("posix_openpt"); + return -1; + } + + return fd; +} +#endif + + + +int main(int argc, char *argv[]) +{ + char buf[256]; + char *pbuf; + int fd = openPort(argv[1]); + int freqa = 14074000, freqb = 140735000; + int modeA = 1, modeB = 2; + + while (1) + { + buf[0] = 0; + + if (getmyline(fd, buf) > 0) { printf("Cmd:%s\n", buf); } + +// else { return 0; } + + if (strcmp(buf, "RM5;") == 0) + { + printf("%s\n", buf); + hl_usleep(mysleep * 1000); + pbuf = "RM5100000;"; + WRITE(fd, pbuf, strlen(pbuf)); + } + + else if (strcmp(buf, "AN0;") == 0) + { + printf("%s\n", buf); + hl_usleep(mysleep * 1000); + pbuf = "AN030;"; + WRITE(fd, pbuf, strlen(pbuf)); + } + else if (strcmp(buf, "IF;") == 0) + { + char ifbuf[256]; + printf("%s\n", buf); + hl_usleep(mysleep * 1000); + pbuf = "IF000503130001000+0000000000030000000;"; + sprintf(ifbuf, "IF%011d0001000+0000000000030000000;", freqa); + //pbuf = "IF00010138698 +00000000002000000 ; + WRITE(fd, ifbuf, strlen(ifbuf)); + } + else if (strcmp(buf, "NB;") == 0) + { + hl_usleep(mysleep * 1000); + pbuf = "NB0;"; + WRITE(fd, pbuf, strlen(pbuf)); + } + else if (strcmp(buf, "RA;") == 0) + { + hl_usleep(mysleep * 1000); + pbuf = "RA01;"; + WRITE(fd, pbuf, strlen(pbuf)); + } + else if (strcmp(buf, "RG;") == 0) + { + hl_usleep(mysleep * 1000); + pbuf = "RG055;"; + WRITE(fd, pbuf, strlen(pbuf)); + } + else if (strcmp(buf, "MG;") == 0) + { + hl_usleep(mysleep * 1000); + pbuf = "MG050;"; + WRITE(fd, pbuf, strlen(pbuf)); + } + else if (strcmp(buf, "AG;") == 0) + { + hl_usleep(mysleep * 1000); + pbuf = "AG100;"; + WRITE(fd, pbuf, strlen(pbuf)); + } + else if (strcmp(buf, "FV;") == 0) + { + hl_usleep(mysleep * 1000); + pbuf = "FV1.2;"; + WRITE(fd, pbuf, strlen(pbuf)); + } + else if (strncmp(buf, "IS;", 3) == 0) + { + SNPRINTF(buf, sizeof(buf), "IS+0000;"); + WRITE(fd, buf, strlen(buf)); + printf("%s\n", buf); + } + else if (strncmp(buf, "IS", 2) == 0) + { + } + else if (strncmp(buf, "SM;", 3) == 0) + { + SNPRINTF(buf, sizeof(buf), "SM0035;"); + WRITE(fd, buf, strlen(buf)); + printf("%s\n", buf); + } + else if (strncmp(buf, "PC;", 3) == 0) + { + SNPRINTF(buf, sizeof(buf), "PC100;"); + WRITE(fd, buf, strlen(buf)); + printf("%s\n", buf); + } + else if (strcmp(buf, "FW;") == 0) + { + //usleep(mysleep * 1000); + pbuf = "FW240"; + WRITE(fd, pbuf, strlen(pbuf)); + hl_usleep(20 * 1000); + pbuf = "0;"; + WRITE(fd, pbuf, strlen(pbuf)); + } + else if (strncmp(buf, "FW", 2) == 0) + { + } + else if (strcmp(buf, "ID;") == 0) + { + printf("%s\n", buf); + hl_usleep(mysleep * 1000); + SNPRINTF(buf, sizeof(buf), "ID%03d;", 20); + WRITE(fd, buf, strlen(buf)); + } + + else if (strcmp(buf, "VS;") == 0) + { + printf("%s\n", buf); + hl_usleep(mysleep * 1000); + pbuf = "VS0;"; + WRITE(fd, pbuf, strlen(pbuf)); + } + else if (strcmp(buf, "EX032;") == 0) + { + static int ant = 0; + ant = (ant + 1) % 3; + printf("%s\n", buf); + hl_usleep(mysleep * 1000); + SNPRINTF(buf, sizeof(buf), "EX032%1d;", ant); + WRITE(fd, buf, strlen(buf)); + } + else if (strncmp(buf, "EX", 2) == 0) + { + } + else if (strcmp(buf, "FA;") == 0) + { + SNPRINTF(buf, sizeof(buf), "FA%011d;", freqa); + WRITE(fd, buf, strlen(buf)); + } + else if (strcmp(buf, "FB;") == 0) + { + SNPRINTF(buf, sizeof(buf), "FB%011d;", freqb); + WRITE(fd, buf, strlen(buf)); + } + else if (strncmp(buf, "FA", 2) == 0) + { + sscanf(buf, "FA%d", &freqa); + } + else if (strncmp(buf, "FB", 2) == 0) + { + sscanf(buf, "FB%d", &freqb); + } + else if (strncmp(buf, "AI", 2) == 0) + { + // nothing to do yet + } + + else if (strncmp(buf, "PS;", 3) == 0) + { + SNPRINTF(buf, sizeof(buf), "PS1;"); + WRITE(fd, buf, strlen(buf)); + } + else if (strncmp(buf, "SA;", 3) == 0) + { + SNPRINTF(buf, sizeof(buf), "SA0;"); + WRITE(fd, buf, strlen(buf)); + } + else if (buf[3] == ';' && strncmp(buf, "SF", 2) == 0) + { + SNPRINTF(buf, sizeof(buf), "SF%c%011.0f%c;", buf[2], + buf[2] == '0' ? freqA : freqB, + buf[2] == '0' ? modeA + '0' : modeB + '0'); + WRITE(fd, buf, strlen(buf)); + } + else if (strncmp(buf, "SF", 2) == 0) + { + mode_t tmpmode = buf[14]; + + if (buf[2] == '0') { modeA = tmpmode - '0'; } + else { modeB = tmpmode - '0'; } + + printf("modeA=%c, modeB=%c\n", modeA, modeB); + + } + else if (strncmp(buf, "MD;", 3) == 0) + { + SNPRINTF(buf, sizeof(buf), "MD%d;", + modeA); // not worried about modeB yet for simulator + WRITE(fd, buf, strlen(buf)); + } + else if (strncmp(buf, "MD", 2) == 0) + { + sscanf(buf, "MD%d", &modeA); // not worried about modeB yet for simulator + } + else if (strncmp(buf, "FL;", 3) == 0) + { + SNPRINTF(buf, sizeof(buf), "FL%03d;", filternum); + WRITE(fd, buf, strlen(buf)); + } + else if (strncmp(buf, "FL", 2) == 0) + { + sscanf(buf, "FL%d", &filternum); + } + else if (strcmp(buf, "FR;") == 0) + { + SNPRINTF(buf, sizeof(buf), "FR%d;", vfo); + WRITE(fd, buf, strlen(buf)); + } + else if (strncmp(buf, "FR", 2) == 0) + { + sscanf(buf, "FR%d", &vfo); + } + else if (strcmp(buf, "FT;") == 0) + { + SNPRINTF(buf, sizeof(buf), "FT%d;", vfo_tx); + WRITE(fd, buf, strlen(buf)); + } + else if (strncmp(buf, "FT", 2) == 0) + { + sscanf(buf, "FT%d", &vfo_tx); + } + else if (strncmp(buf, "DA;", 3) == 0) + { + SNPRINTF(buf, sizeof(buf), "DA%d;", datamode); + WRITE(fd, buf, strlen(buf)); + printf("%s\n", buf); + } + else if (strncmp(buf, "DA", 2) == 0) + { + sscanf(buf, "DA%d", &datamode); + printf("%s\n", buf); + } + else if (strncmp(buf, "TO;", 3) == 0) + { + SNPRINTF(buf, sizeof(buf), "TO%d;", tomode); + } + else if (strncmp(buf, "BD;", 3) == 0) + { + } + else if (strncmp(buf, "BU;", 3) == 0) + { + } + else if (strncmp(buf, "TX", 2) == 0) + { + ptt = ptt_mic = ptt_data = ptt_tune = 0; + + switch (buf[2]) + { + case ';': ptt = 1; + + case '0': ptt_mic = 1; + + case '1': ptt_data = 1; + + case '2': ptt_tune = 1; + } + + } + + else if (strlen(buf) > 0) + { + fprintf(stderr, "Unknown command: %s\n", buf); + } + } + + return 0; +} commit a5ad218bba7879b7e57c4b65043b1ead08ad3180 Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Nov 29 15:58:15 2023 -0600 Add simft1000 to Makefile.am diff --git a/simulators/Makefile.am b/simulators/Makefile.am index f383f5ce7..9b0412412 100644 --- a/simulators/Makefile.am +++ b/simulators/Makefile.am @@ -8,7 +8,7 @@ DISTCLEANFILES = bin_PROGRAMS = -check_PROGRAMS = simelecraft simicgeneric simkenwood simyaesu simic9100 simic9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simic7300 simic7000 simic7100 simic7200 simatd578 simic905 simts450 simic7600 simic7610 simic705 simts950 simts990 simic7851 simftdx101 simxiegug90 simqrplabs simft818 simic275 +check_PROGRAMS = simelecraft simicgeneric simkenwood simyaesu simic9100 simic9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simic7300 simic7000 simic7100 simic7200 simatd578 simic905 simts450 simic7600 simic7610 simic705 simts950 simts990 simic7851 simftdx101 simxiegug90 simqrplabs simft818 simic275 simtrusdx simft1000 simelecraft_SOURCES = simelecraft.c simkenwood_SOURCES = simkenwood.c commit 7973db52de5d149e7a416aabd19c093659e92629 Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Nov 29 14:53:39 2023 -0600 Remove debug from network.c diff --git a/src/network.c b/src/network.c index 048cb98e7..e2272d627 100644 --- a/src/network.c +++ b/src/network.c @@ -1196,9 +1196,7 @@ void *multicast_receiver(void *arg) if (select_result == 0) { // Select timed out - rig_debug(RIG_DEBUG_ERR, "%s: select timeout\n", __FILE__); -// char *p = NULL; -// *p = 0; +// rig_debug(RIG_DEBUG_ERR, "%s: select timeout\n", __FILE__); continue; } commit 001dd01a10397ec63f1ddcce05c9bddd843a9cbd Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Nov 29 12:53:16 2023 -0600 Fix more compile errors for mingw diff --git a/src/network.c b/src/network.c index 5a79e0df6..048cb98e7 100644 --- a/src/network.c +++ b/src/network.c @@ -1175,21 +1175,19 @@ void *multicast_receiver(void *arg) struct sockaddr_in client_addr; socklen_t client_len = sizeof(client_addr); fd_set rfds, efds; - sigset_t sigfds; - struct timespec timeout; + struct timeval timeout; int select_result; ssize_t result; timeout.tv_sec = 1; - timeout.tv_nsec = 0; + timeout.tv_usec = 0; FD_ZERO(&rfds); FD_SET(socket_fd, &rfds); efds = rfds; - sigfillset(&sigfds); - select_result = pselect(socket_fd + 1, &rfds, NULL, &efds, &timeout, &sigfds); + select_result = select(socket_fd + 1, &rfds, NULL, &efds, &timeout); - if (rs->multicast_receiver_run == 0 && sigismember(&sigfds, SIGINT)) + if (rs->multicast_receiver_run == 0) { rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): pselect signal\n", __func__, __LINE__); break; commit 756fad1c723cd77d2aa0e212777b29b7f352ed46 Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Nov 29 12:47:38 2023 -0600 Fix compile error on mingw with network.c diff --git a/src/network.c b/src/network.c index 66a7a4ec9..5a79e0df6 100644 --- a/src/network.c +++ b/src/network.c @@ -42,7 +42,6 @@ #include <errno.h> /* Error number definitions */ #include <sys/types.h> #include <signal.h> -#include <execinfo.h> #include <pthread.h> #ifdef HAVE_NETINET_IN_H commit 07f57cfc18349100280d26c3466d6b284512b561 Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Nov 29 12:45:11 2023 -0600 Fix error on ctrl-c of rigctld diff --git a/src/network.c b/src/network.c index 4f155e03e..66a7a4ec9 100644 --- a/src/network.c +++ b/src/network.c @@ -42,6 +42,7 @@ #include <errno.h> /* Error number definitions */ #include <sys/types.h> #include <signal.h> +#include <execinfo.h> #include <pthread.h> #ifdef HAVE_NETINET_IN_H @@ -686,7 +687,10 @@ static int multicast_publisher_read_data(const multicast_publisher_args if (FD_ISSET(fd, &efds)) { rig_debug(RIG_DEBUG_ERR, - "%s(): fd error when reading multicast publisher data\n", __func__); + "%s(): fd error when reading multicast publisher data: %s\n", + __func__, + strerror(errno)); + return -RIG_EIO; } @@ -1087,7 +1091,6 @@ int is_wireless() #endif #endif - void *multicast_receiver(void *arg) { char data[4096]; @@ -1173,38 +1176,50 @@ void *multicast_receiver(void *arg) struct sockaddr_in client_addr; socklen_t client_len = sizeof(client_addr); fd_set rfds, efds; - struct timeval timeout; + sigset_t sigfds; + struct timespec timeout; int select_result; ssize_t result; timeout.tv_sec = 1; - timeout.tv_usec = 0; - + timeout.tv_nsec = 0; FD_ZERO(&rfds); FD_SET(socket_fd, &rfds); efds = rfds; + sigfillset(&sigfds); + + select_result = pselect(socket_fd + 1, &rfds, NULL, &efds, &timeout, &sigfds); + + if (rs->multicast_receiver_run == 0 && sigismember(&sigfds, SIGINT)) + { + rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): pselect signal\n", __func__, __LINE__); + break; + } - select_result = select(socket_fd + 1, &rfds, NULL, &efds, &timeout); if (select_result == 0) { // Select timed out + rig_debug(RIG_DEBUG_ERR, "%s: select timeout\n", __FILE__); +// char *p = NULL; +// *p = 0; continue; } - if (select_result < 0) + if (select_result <= 0) { rig_debug(RIG_DEBUG_ERR, - "%s(): select() failed when reading UDP multicast socket data: %s\n", + "%s((%d): select() failed when reading UDP multicast socket data: %s\n", __func__, + __LINE__, strerror(errno)); break; } - if (FD_ISSET(socket_fd, &efds)) + if ((result = FD_ISSET(socket_fd, &efds))) { rig_debug(RIG_DEBUG_ERR, - "%s(): fd error when reading UDP multicast socket data\n", __func__); + "%s(%d): fd error when reading UDP multicast socket data: (%d)=%s\n", __func__, __LINE__, (int)result, strerror(errno)); break; } @@ -1230,6 +1245,7 @@ void *multicast_receiver(void *arg) // TODO: if a new snapshot needs to be sent, call network_publish_rig_poll_data() and the publisher routine will send out a snapshot // TODO: new logic in publisher needs to be written for other types of responses } + rs->multicast_receiver_run = 0; rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): Stopping multicast receiver\n", __FILE__, __LINE__); commit ed941939359da9f8734dbdf4a21a9b01622a1a6e Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Nov 29 11:10:43 2023 -0600 Add #define RIGCAPS_NOT_CONST Allows clients to test for which declarations to use https://github.com/Hamlib/Hamlib/issues/1436 diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 83ef311e6..9ad2e32db 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -24,6 +24,10 @@ #ifndef _RIG_H #define _RIG_H 1 +// as of 2023-11-23 rig_caps is no longer constant +// this #define allows clients to test which declaration to use for backwards compatibility +#define RIGCAPS_NOT_CONST 1 + #define BUILTINFUNC 0 // Our shared secret password commit a910b16e8f961506d2408ff62632f8afe797f323 Merge: 09ab2819b 4f019e622 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Nov 28 07:06:47 2023 -0600 Merge branch 'master' of https://github.com/Hamlib/Hamlib commit 4f019e622e3c3957e94d5f42de8be93cdc55c6f4 Merge: 46c16b22a c0457a0d7 Author: Michael Black <mdb...@ya...> Date: Tue Nov 28 07:06:33 2023 -0600 Merge pull request #1434 from pdaderko/master Fix for iOptron rotator (tested with AZ Mount Pro), added improvements commit c0457a0d7b8f894baf4f8f2e446f36922cb9c1a1 Author: pdaderko <pda...@ya...> Date: Tue Nov 28 05:07:00 2023 -0500 Fixed functionality (AZ Mount Pro), added improvements Updated code to work with current AZ Mount Pro firmware. Current firmware uses serial at 115200. Original code looked for # delimiter on responses, but not all responses end in #. This caused the software to timeout, which caused slow response time, and in some cases returned a failure (including :MountInfo# used at open). All responses have fixed length replies, so code updated to look at fixed length data rather than delimiter. Added workarounds for a couple firmware bugs. Minor cleanup. diff --git a/rotators/ioptron/rot_ioptron.c b/rotators/ioptron/rot_ioptron.c index ef4abbf15..3336914ce 100644 --- a/rotators/ioptron/rot_ioptron.c +++ b/rotators/ioptron/rot_ioptron.c @@ -38,10 +38,9 @@ * ioptron_transaction * * cmdstr - Command to be sent to the rig. - * data - Buffer for reply string. Can be NULL, indicating that no reply is - * is needed, but answer will still be read. - * data_len - in: Size of buffer. It is the caller's responsibily to provide - * a large enough buffer for all possible replies for a command. + * data - Buffer for reply string. + * resp_len - in: Expected length of response. It is the caller's responsibily to + * provide a buffer at least 1 byte larger than this for null terminator. * * COMMANDS note: as of 12/2018 a mixture of V2 and V3 * | TTTTTTTT(T) .01 arc seconds @@ -62,136 +61,103 @@ */ static int -ioptron_transaction(ROT *rot, const char *cmdstr, - char *data, size_t data_len) +ioptron_transaction(ROT *rot, const char *cmdstr, char *data, size_t resp_len) { struct rot_state *rs; - int retval; - int retry_read = 0; - char replybuf[BUFSZ]; + int retval = 0; + int retry_read; rs = &rot->state; -transaction_write: + for (retry_read = 0; retry_read <= rot->state.rotport.retry; retry_read++) + { + rig_flush(&rs->rotport); - rig_flush(&rs->rotport); + if (cmdstr) + { + retval = write_block(&rs->rotport, (unsigned char *) cmdstr, strlen(cmdstr)); - if (cmdstr) - { - retval = write_block(&rs->rotport, (unsigned char *) cmdstr, strlen(cmdstr)); + if (retval != RIG_OK) + { + return retval; + } + } - if (retval != RIG_OK) + /** the answer */ + memset(data, 0, resp_len+1); + retval = read_block(&rs->rotport, (unsigned char *) data, resp_len); + /** if expected number of bytes received, return OK status */ + if (retval == resp_len) { - goto transaction_quit; + return RIG_OK; } } - /** Always read the reply to know whether the cmd went OK */ - if (!data) - { - data = replybuf; - } + /** if got here, retry loop failed */ + rig_debug(RIG_DEBUG_ERR, "%s: unexpected response, len %d: '%s'\n", __func__, retval, data); - if (!data_len) - { - data_len = BUFSZ; - } + return -RIG_EPROTO; +} + +/** get mount type code, initializes mount */ +static const char * +ioptron_get_info(ROT *rot) +{ + static char info[32]; + char str[6]; + int retval; - /** the answer */ - memset(data, 0, data_len); - retval = read_string(&rs->rotport, (unsigned char *) data, data_len, ACK, - strlen(ACK), 0, 1); + rig_debug(RIG_DEBUG_TRACE, "%s called\n", __func__); - if (retval < 0) - { - if (retry_read++ < rot->state.rotport.retry) - { - goto transaction_write; - } + retval = ioptron_transaction(rot, ":MountInfo#", str, 4); - goto transaction_quit; - } + rig_debug(RIG_DEBUG_TRACE, "retval, RIG_OK str %d %d %str\n", retval, RIG_OK, + str); - /** check for acknowledge */ - if (retval < 1) - { - rig_debug(RIG_DEBUG_ERR, "%s: unexpected response, len %d: '%s'\n", __func__, - retval, data); - return -RIG_EPROTO; - } + SNPRINTF(info, sizeof(info), "MountInfo %s", str); - retval = RIG_OK; -transaction_quit: - return retval; + return info; } /** * Opens the Port and sets all needed parameters for operation * as of 12/2018 initiates mount with V3 :MountInfo# */ -static int ioptron_open(ROT *rot) -{ - rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); - - return ioptron_transaction(rot, ":Mountinfo#", NULL, 0); -} - -/** sets mount position, requires 4 steps - * set azmiuth - * set altitude - * goto set - * stop tracking - mount starts tracking after goto - */ static int -ioptron_set_position(ROT *rot, azimuth_t az, elevation_t el) +ioptron_open(ROT *rot) { - char cmdstr[32]; - char retbuf[10]; + const char *info; int retval; - float faz, fel; - - rig_debug(RIG_DEBUG_TRACE, "%s called: %f %f\n", __func__, az, el); - - /* units .01 arc sec */ - faz = az * 360000; - fel = el * 360000; - /* set azmiuth, returns '1" if OK */ - SNPRINTF(cmdstr, sizeof(cmdstr), ":Sz%09.0f#", faz); - retval = ioptron_transaction(rot, cmdstr, retbuf, sizeof(retbuf)); - - if (retval != RIG_OK || retbuf[0] != ACK1) - { - return -RIG_EPROTO; - } - - /* set altitude, returns '1" if OK */ - SNPRINTF(cmdstr, sizeof(cmdstr), ":Sa+%08.0f#", fel); - retval = ioptron_transaction(rot, cmdstr, retbuf, sizeof(retbuf)); + char retbuf[10]; + + rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); - if (retval != RIG_OK || retbuf[0] != ACK1) + info = ioptron_get_info(rot); + /* ioptron_get_info returns "MountInfo xxxx", check model number from string */ + /* string of 4 numeric digits is likely model number */ + if ((strlen(&info[10]) != 4) || (strspn(&info[10], "1234567890") != 4)) { - return -RIG_EPROTO; + return -RIG_ETIMEOUT; } - /* move to set target, V2 command, returns '1" if OK */ - SNPRINTF(cmdstr, sizeof(cmdstr), ":MS#"); // - retval = ioptron_transaction(rot, cmdstr, retbuf, sizeof(retbuf)); + /** stops tracking, returns "1" if OK */ + retval = ioptron_transaction(rot, ":ST0#", retbuf, 1); if (retval != RIG_OK || retbuf[0] != ACK1) { return -RIG_EPROTO; } - /* stop tracking, V2 command, returns '1" if OK */ - SNPRINTF(cmdstr, sizeof(cmdstr), ":ST0#"); - retval = ioptron_transaction(rot, cmdstr, retbuf, sizeof(retbuf)); + /** set alt limit to -1 since firmware bug sometimes doesn't allow alt of 0 when limit is 0 */ + /** returns "1" if OK */ + retval = ioptron_transaction(rot, ":SAL-01#", retbuf, 1); if (retval != RIG_OK || retbuf[0] != ACK1) { return -RIG_EPROTO; } - - return retval; + + return RIG_OK; } /** gets current position */ @@ -205,9 +171,9 @@ ioptron_get_position(ROT *rot, azimuth_t *az, elevation_t *el) rig_debug(RIG_DEBUG_TRACE, "%s called\n", __func__); /** Get Az-Alt */ - retval = ioptron_transaction(rot, ":GAC#", posbuf, sizeof(posbuf)); + retval = ioptron_transaction(rot, ":GAC#", posbuf, 19); - if (retval != RIG_OK || strlen(posbuf) < 18) + if (retval != RIG_OK || strlen(posbuf) < 19) { return retval < 0 ? retval : -RIG_EPROTO; } @@ -218,6 +184,8 @@ ioptron_get_position(ROT *rot, azimuth_t *az, elevation_t *el) } /** convert from .01 arc sec to degrees */ + /** note that firmware only reports alt between -90 and +90 */ + /** e.g. both 80 and 100 degrees are read as 80 degrees */ *el = ((elevation_t)w / 360000.); if (sscanf(posbuf + 9, "%9f", &w) != 1) @@ -243,7 +211,7 @@ ioptron_stop(ROT *rot) rig_debug(RIG_DEBUG_TRACE, "%s called\n", __func__); /** stop slew, returns "1" if OK */ - retval = ioptron_transaction(rot, ":Q#", retbuf, 10); + retval = ioptron_transaction(rot, ":Q#", retbuf, 1); if (retval != RIG_OK || retbuf[0] != ACK1) { @@ -251,38 +219,120 @@ ioptron_stop(ROT *rot) } /** stops tracking returns "1" if OK */ - retval = ioptron_transaction(rot, ":ST0#", retbuf, 10); + retval = ioptron_transaction(rot, ":ST0#", retbuf, 1); if (retval != RIG_OK || retbuf[0] != ACK1) { return -RIG_EPROTO; } - return retval; + return RIG_OK; } -/** get mount type code, initializes mount */ -static const char * -ioptron_get_info(ROT *rot) +/** sets mount position, requires 4 steps + * set azmiuth + * set altitude + * goto set + * stop tracking - mount starts tracking after goto + */ +static int +ioptron_set_position(ROT *rot, azimuth_t az, elevation_t el) { - static char info[32]; - char str[6]; + char cmdstr[32]; + char retbuf[10]; int retval; + double faz, fel; + azimuth_t curr_az; + elevation_t curr_el; - rig_debug(RIG_DEBUG_TRACE, "%s called\n", __func__); + rig_debug(RIG_DEBUG_TRACE, "%s called: %f %f\n", __func__, az, el); + + /* units .01 arc sec */ + faz = az * 360000; + fel = el * 360000; - retval = ioptron_transaction(rot, ":MountInfo#", str, sizeof(str)); + /** Firmware bug: (at least for AZ Mount Pro as of FW 20200305) + * azimuth has problems going to 0 + * going to 0 from <=180 causes it to overshoot 0 and never stop + * going to 0 from >180 causes it to make a hard stop at 0 and a following + * command to <= 180 will make it rotate forever until manually stopped, + * and require resetting the mount for azimuth to work correctly again + * similar behavior is seen the other direction (>180 to 360 goes past 360, + * <=180 to 360 makes a hard stop with the possibility of loss of + * azimuth control) + * Workaround: + * get current position, if 0 is requested, go to 0.01 arcseconds away from + * 0 from the same direction (e.g. go to 0.01 arcseconds if currently <= 180, + * 129599999 arcseconds if currently > 180) + */ + if (faz == 0) + { + /* make sure stopped */ + retval = ioptron_stop(rot); + if (retval != RIG_OK) + { + return -RIG_EPROTO; + } + + /* get current position */ + retval = ioptron_get_position(rot, &curr_az, &curr_el); + if (retval != RIG_OK) + { + return -RIG_EPROTO; + } - rig_debug(RIG_DEBUG_TRACE, "retval, RIG_OK str %d %d %str\n", retval, RIG_OK, - str); + if (curr_az <= 180) + { + faz = 1; + } + else + { + faz = 129599999; /* needs double precision float */ + } + } + + /* set azmiuth, returns '1" if OK */ + SNPRINTF(cmdstr, sizeof(cmdstr), ":Sz%09.0f#", faz); + retval = ioptron_transaction(rot, cmdstr, retbuf, 1); - SNPRINTF(info, sizeof(info), "MountInfo %s", str); + if (retval != RIG_OK || retbuf[0] != ACK1) + { + return -RIG_EPROTO; + } - return info; + /* set altitude, returns '1" if OK */ + SNPRINTF(cmdstr, sizeof(cmdstr), ":Sa+%08.0f#", fel); + retval = ioptron_transaction(rot, cmdstr, retbuf, 1); + + if (retval != RIG_OK || retbuf[0] != ACK1) + { + return -RIG_EPROTO; + } + + /* move to set target, V2 command, returns '1" if OK */ + SNPRINTF(cmdstr, sizeof(cmdstr), ":MS#"); // + retval = ioptron_transaction(rot, cmdstr, retbuf, 1); + + if (retval != RIG_OK || retbuf[0] != ACK1) + { + return -RIG_EPROTO; + } + + /* stop tracking, V2 command, returns '1" if OK */ + SNPRINTF(cmdstr, sizeof(cmdstr), ":ST0#"); + retval = ioptron_transaction(rot, cmdstr, retbuf, 1); + + if (retval != RIG_OK || retbuf[0] != ACK1) + { + return -RIG_EPROTO; + } + + return retval; } + /** ************************************************************************* * * ioptron mount capabilities. @@ -304,7 +354,7 @@ const struct rot_caps ioptron_rot_caps = .rot_type = ROT_TYPE_AZEL, .port_type = RIG_PORT_SERIAL, .serial_rate_min = 9600, - .serial_rate_max = 9600, + .serial_rate_max = 115200, .serial_data_bits = 8, .serial_stop_bits = 1, .serial_parity = RIG_PARITY_NONE, commit 09ab2819b3b66936e7a7d73d832660fc59354643 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Nov 27 11:39:09 2023 -0600 Add better error info to serial error diff --git a/src/serial.c b/src/serial.c index 7c46b0b0e..2d14b5852 100644 --- a/src/serial.c +++ b/src/serial.c @@ -227,7 +227,7 @@ int HAMLIB_API serial_open(hamlib_port_t *rp) if (fd == -1) // some serial ports fail to open 1st time for some unknown reason { - rig_debug(RIG_DEBUG_WARN, "%s(%d): open failed#%d\n", __func__, __LINE__, i); + rig_debug(RIG_DEBUG_WARN, "%s(%d): open failed#%d %s\n", __func__, __LINE__, i, strerror(errno)); hl_usleep(500 * 1000); fd = OPEN(rp->pathname, O_RDWR | O_NOCTTY | O_NDELAY); } commit 46c16b22a0bbce4acd5d25a6bcdcac69708a588e Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Nov 26 12:41:26 2023 -0600 Fix compile warning diff --git a/src/network.c b/src/network.c index 0ccf60990..4f155e03e 100644 --- a/src/network.c +++ b/src/network.c @@ -1046,7 +1046,7 @@ int is_wireless_linux(const char *ifname) int sock = socket(AF_INET, SOCK_DGRAM, 0); struct iwreq pwrq; memset(&pwrq, 0, sizeof(pwrq)); - strncpy(pwrq.ifr_name, ifname, IFNAMSIZ); + strncpy(pwrq.ifr_name, ifname, IFNAMSIZ-1); if (ioctl(sock, SIOCGIWNAME, &pwrq) != -1) { commit 698cb10ff3a5921454924f0f5e05534ba21b55bd Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Nov 25 22:33:07 2023 -0600 Re-enable extra get_freq so see if it fixes timeout problem on IC-7100 diff --git a/src/rig.c b/src/rig.c index 9dec89c4e..4fc6e6d32 100644 --- a/src/rig.c +++ b/src/rig.c @@ -2389,7 +2389,7 @@ int HAMLIB_API rig_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) RETURNFUNC(-RIG_ENAVAIL); } -#if 0 // this seems redundant as we ask for freq a few lines below +#if 1 // this seems redundant as we ask for freq a few lines below HAMLIB_TRACE; retcode = caps->get_freq(rig, vfo, freq); commit 9c01045356a29622857ca7338329903317123a83 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Nov 25 15:05:42 2023 -0600 Fix HOMEPATH for Windows hamlib_settings file diff --git a/src/settings.c b/src/settings.c index e51803741..28940ba17 100644 --- a/src/settings.c +++ b/src/settings.c @@ -1030,7 +1030,12 @@ HAMLIB_EXPORT(int) rig_settings_get_path(char *path, int pathlen) const char *xdgpath = getenv("XDG_CONFIG_HOME"); char *home = getenv("HOME"); - if (home == NULL) home = "?HOME"; + if (home == NULL) { + home = getenv("HOMEPATH"); + } + if (home == NULL) { + home = "?HOME"; + } snprintf(path, pathlen, "%s/.config", home); if (xdgpath) commit 30f47cdeba342f80905a1c73a9b9afc3fa59dbc3 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Nov 25 09:29:01 2023 -0600 Update Icom simulators for better behavior at rigctl shutdown diff --git a/simulators/simic275.c b/simulators/simic275.c index 388ddd2f7..6f4b3ccc0 100644 --- a/simulators/simic275.c +++ b/simulators/simic275.c @@ -103,7 +103,7 @@ again: } } - printf("Error??? c=x%02x\n", c); + printf("Error %s\n", strerror(errno)); return 0; } @@ -113,6 +113,12 @@ void frameParse(int fd, unsigned char *frame, int len) double freq; int n = 0; + if (len == 0) + { + printf("%s: len==0\n", __func__); + return; + } + dumphex(frame, len); if (frame[0] != 0xfe && frame[1] != 0xfe) diff --git a/simulators/simic7000.c b/simulators/simic7000.c index 388ddd2f7..6f4b3ccc0 100644 --- a/simulators/simic7000.c +++ b/simulators/simic7000.c @@ -103,7 +103,7 @@ again: } } - printf("Error??? c=x%02x\n", c); + printf("Error %s\n", strerror(errno)); return 0; } @@ -113,6 +113,12 @@ void frameParse(int fd, unsigned char *frame, int len) double freq; int n = 0; + if (len == 0) + { + printf("%s: len==0\n", __func__); + return; + } + dumphex(frame, len); if (frame[0] != 0xfe && frame[1] != 0xfe) dif... [truncated message content] |
From: n0nb <n0...@us...> - 2023-11-19 06:42:06
|
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 bb87d92f43f2f0599e1e573907daf33a6b50286f (commit) via eff7d97c64c1ae43179487ebb245098fa0deb3da (commit) via 58fdb4423f3645b2847809d5371520f506348690 (commit) via 85f828b19f80c169f8e0a0669c27d1860dee40f2 (commit) via 41a1da795cbb7670a11e146d4464451a2d4be330 (commit) via deebca4eaf3fa0e00d6b886c33b9ca36eaba1353 (commit) via 7d9ef323d76e72bcdc6ba0f6684ab97873ad9e92 (commit) via 43545e171a6bbd366e40891cb0349256aaf17b46 (commit) via 16488d3267b93219c70bc302d63a05b9dd54b38d (commit) via c1780b19f4a30697588da277db579825f3698516 (commit) via cb34dc3b207022410d8c44971e285997c05a29c1 (commit) via 4f0393d6add63b0c1460d3f36d32376c5e12116d (commit) via e8d387d51c552c014b19fc2acebfc4b3de871d13 (commit) via 1fce7ced5be4701a067cf4a9e52b88ac9c0f5922 (commit) via 512c82649e4f80d696938bd7843ea8fa2b2444ca (commit) via c348632b262c17121867457f685d06a3111727a2 (commit) via 8478367223f611a4fbc2e677a577664c5611db9c (commit) via f57b7cba71e48dfb3aef258f5e492d2cf06db711 (commit) via 723b835fdde16c774deaa51ba2be39e47436d0e5 (commit) via d868f1a545a753f1b8b1c47b30ae0383b3ff4483 (commit) via 394cb4cbcf53971ac5f5e2ede0b0c488be989528 (commit) via b1b567d64a7d65584377926fa0818fde3b6abf18 (commit) via 176c49240d5d3006a02db2d2db4ef84c6209825b (commit) via e05b79acd311caf0c2c9a14a8711881566a1362a (commit) via e19bdc3d564a774afa853bf8ba9f16a543b68942 (commit) from e7786cee4c4e15aeba8a551622342f4b090a3059 (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 bb87d92f43f2f0599e1e573907daf33a6b50286f Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Nov 18 10:39:58 2023 -0600 Update simts950 and simts990 diff --git a/simulators/simts950.c b/simulators/simts950.c index bcf8f8053..c0296fce6 100644 --- a/simulators/simts950.c +++ b/simulators/simts950.c @@ -391,6 +391,10 @@ int main(int argc, char *argv[]) continue; } + else if (strcmp(buf, "RX;") == 0) + { + ptt = ptt_mic = ptt_data = ptt_tune = 0; + } else if (strlen(buf) > 0) { fprintf(stderr, "Unknown command: %s\n", buf); diff --git a/simulators/simts990.c b/simulators/simts990.c index a3198b475..24d265e9b 100644 --- a/simulators/simts990.c +++ b/simulators/simts990.c @@ -394,6 +394,10 @@ int main(int argc, char *argv[]) { continue; } + else if (strcmp(buf, "RX;") == 0) + { + ptt = ptt_mic = ptt_data = ptt_tune = 0; + } else if (strncmp(buf, "TX", 2) == 0) { ptt = ptt_mic = ptt_data = ptt_tune = 0; commit eff7d97c64c1ae43179487ebb245098fa0deb3da Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Nov 17 00:07:04 2023 -0600 Update rigctl.1 diff --git a/doc/man1/rigctl.1 b/doc/man1/rigctl.1 index 6937cb267..771051601 100644 --- a/doc/man1/rigctl.1 +++ b/doc/man1/rigctl.1 @@ -1282,11 +1282,11 @@ option above, will terminate each command string sent to the radio. This character should not be a part of the input string. . .TP -.BR W ", " send_cmd_rx " \(aq" \fICmd\fP\(aq " " \fI[nbytes or terminator char\FP +.BR W ", " send_cmd_rx " \(aq" \fICmd\fP\(aq " " \fInbytes_or_terminator_char\fP Send a raw command string to the radio and expect nbytes returned or the terminator char (e.g. ;). .IP This is useful for testing and troubleshooting radio commands and responses when -developing a backend. If the # of bytes requested is <= the number actually returned no timeout will occur. +developing a backend. If the # of bytes requested is <= the number actually returned no timeout will occur. If a char is provided it will be used to terminate reading the string so ';' is popular for Kenwood/Yaesu commands for example. .IP The command argument can have no spaces in it. For binary protocols enter values as \\0xAA\\0xBB. Expect a commit 58fdb4423f3645b2847809d5371520f506348690 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Nov 16 16:37:03 2023 -0600 Add callback.c test diff --git a/tests/callback.c b/tests/callback.c new file mode 100644 index 000000000..57cada2af --- /dev/null +++ b/tests/callback.c @@ -0,0 +1,42 @@ +int callback(const struct rig_caps *caps, rig_ptr_t rigp) +{ + RIG *rig = (RIG *) rigp; + + rig = rig_init(caps->rig_model); + + if (!rig) + { + fprintf(stderr, "Unknown rig num: %u\n", caps->rig_model); + fprintf(stderr, "Please check riglist.h\n"); + exit(1); /* whoops! something went wrong (mem alloc?) */ + } + + const char *port = "/dev/pts/3"; + strcpy(rig->state.rigport.pathname, port); + + printf("%20s:", caps->model_name); + fflush(stdout); + struct timeval start, end; + gettimeofday(&start, NULL); + rig_open(rig); + gettimeofday(&end, NULL); + double dstart = start.tv_sec + start.tv_usec / 1e6; + double dend = end.tv_sec + end.tv_usec / (double)1e6; + printf(" %.1f\n", dend - dstart); + + rig_close(rig); /* close port */ + rig_cleanup(rig); /* if you care about memory */ + return 1; +} + +int main(int argc, char *argv[]) +{ + RIG rig; + printf("testing rig timeouts when rig powered off\n"); + + /* Turn off backend debugging output */ + rig_set_debug_level(RIG_DEBUG_NONE); + rig_load_all_backends(); + rig_list_foreach(callback, &rig); + return 0; +} commit 85f828b19f80c169f8e0a0669c27d1860dee40f2 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Nov 16 16:33:32 2023 -0600 Add sim.h diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index 2370ff947..ccdb2957e 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -7462,7 +7462,8 @@ int icom_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) case RIG_FUNC_DUAL_WATCH: if ((RIG_IS_IC9100) || - (RIG_IS_IC9700)) + (RIG_IS_IC9700) || + (RIG_IS_ID5100)) { fct_cn = C_CTL_FUNC; fct_sc = S_MEM_DUALMODE; diff --git a/rigs/icom/id5100.c b/rigs/icom/id5100.c index 613ebcf9a..637fe7afc 100644 --- a/rigs/icom/id5100.c +++ b/rigs/icom/id5100.c @@ -154,7 +154,7 @@ int id5100_set_vfo(RIG *rig, vfo_t vfo) if (vfo == RIG_VFO_A || vfo == RIG_VFO_B) { // and 0x25 works in this mode - priv->x25cmdfails = 0; + priv->x25cmdfails = 1; if (priv->dual_watch) { @@ -222,6 +222,24 @@ int id5100_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo) return retval; } +int id5100_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) +{ + unsigned char ackbuf[MAXFRAMELEN]; + int ack_len = sizeof(ackbuf), retval; + int fct_cn, fct_sc; /* Command Number, Subcommand */ + unsigned char fctbuf[MAXFRAMELEN]; + int fct_len = 0; + + const struct icom_priv_caps *priv_caps = rig->caps->priv; + const struct cmdparams *extcmds = priv_caps->extcmds; + int i; + + rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); + ENTERFUNC; + + value_t value; + RETURNFUNC(icom_get_func(rig, vfo, func, status)); +} /* */ static struct icom_priv_caps id5100_priv_caps = @@ -237,7 +255,7 @@ const struct rig_caps id5100_caps = RIG_MODEL(RIG_MODEL_ID5100), .model_name = "ID-5100", .mfg_name = "Icom", - .version = BACKEND_VER ".6", + .version = BACKEND_VER ".7", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_MOBILE, @@ -344,7 +362,7 @@ const struct rig_caps id5100_caps = .decode_event = icom_decode_event, .set_func = icom_set_func, - .get_func = icom_get_func, + .get_func = id5100_get_func, .set_level = icom_set_level, .get_level = icom_get_level, .set_parm = icom_set_parm, diff --git a/simulators/sim.h b/simulators/sim.h new file mode 100644 index 000000000..fda16b2e7 --- /dev/null +++ b/simulators/sim.h @@ -0,0 +1,20 @@ +#include "../src/misc.h" +#include <errno.h> + +#define WRITE(f,b,l) write_sim(f,(const unsigned char*)b,l,__func__,__LINE__) + +int write_sim(int fd, const unsigned char *buf, int buflen, const char *func, + int linenum) +{ + int n; + dump_hex(buf, buflen); + n = write(fd, buf, buflen); + + if (n <= 0) + { + fprintf(stderr, "%s(%d) buf='%s' write error %d: %s\n", func, linenum, buf, n, + strerror(errno)); + } + + return n; +} commit 41a1da795cbb7670a11e146d4464451a2d4be330 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Nov 16 15:42:52 2023 -0600 Fix build for Apple https://github.com/Hamlib/Hamlib/issues/1430 diff --git a/src/network.c b/src/network.c index aeba822ee..0ccf60990 100644 --- a/src/network.c +++ b/src/network.c @@ -1034,6 +1034,7 @@ int is_wireless() return 0; } #else +#ifndef __APPLE__ #include <sys/ioctl.h> #include <sys/socket.h> #include <unistd.h> @@ -1084,6 +1085,7 @@ int is_wireless() return 0; } #endif +#endif void *multicast_receiver(void *arg) commit deebca4eaf3fa0e00d6b886c33b9ca36eaba1353 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Nov 16 15:12:01 2023 -0600 Remove voice functions from IC275 -- rig does not have them diff --git a/rigs/icom/ic275.c b/rigs/icom/ic275.c index e3c9561a4..89a4c330a 100644 --- a/rigs/icom/ic275.c +++ b/rigs/icom/ic275.c @@ -143,8 +143,6 @@ const struct rig_caps ic275_caps = .set_mode = icom_set_mode, .get_mode = icom_get_mode, .set_vfo = icom_set_vfo, - .send_voice_mem = icom_send_voice_mem, - .stop_voice_mem = icom_stop_voice_mem, .decode_event = icom_decode_event, .set_mem = icom_set_mem, commit 7d9ef323d76e72bcdc6ba0f6684ab97873ad9e92 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Nov 16 14:40:54 2023 -0600 Add some needed enums diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index a0cb2486f..c524dd42c 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -2256,6 +2256,7 @@ enum rig_function_e { RIG_FUNCTION_IS_ASYNC_FRAME, RIG_FUNCTION_PROCESS_ASYNC_FRAME, RIG_FUNCTION_GET_CONF2, + RIG_FUNCTION_STOP_VOICE_MEM, }; /** @@ -2274,7 +2275,8 @@ enum rig_caps_int_e { RIG_CAPS_RIG_MODEL, RIG_CAPS_PORT_TYPE, RIG_CAPS_PTT_TYPE, - RIG_CAPS_HAS_GET_LEVEL + RIG_CAPS_HAS_GET_LEVEL, + RIG_CAPS_HAS_SET_LEVEL, }; enum rig_caps_cptr_e { commit 43545e171a6bbd366e40891cb0349256aaf17b46 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Nov 16 14:40:25 2023 -0600 Fix debug statement for mingw diff --git a/src/misc.c b/src/misc.c index c1c91d308..2e2837050 100644 --- a/src/misc.c +++ b/src/misc.c @@ -2676,7 +2676,7 @@ uint64_t HAMLIB_API rig_get_caps_int(rig_model_t rig_model, return caps->port_type; case RIG_CAPS_HAS_GET_LEVEL: - rig_debug(RIG_DEBUG_TRACE, "%s(%d): return %8lx\n", __func__, __LINE__, caps->has_get_level); + rig_debug(RIG_DEBUG_TRACE, "%s(%d): return %08"PRIll"\n", __func__, __LINE__, caps->has_get_level); return caps->has_get_level; default: commit 16488d3267b93219c70bc302d63a05b9dd54b38d Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Nov 16 09:16:26 2023 -0600 Add -liphlpapi to configure.ac for mingw build https://github.com/Hamlib/Hamlib/issues/1409 diff --git a/configure.ac b/configure.ac index 25f53c6bf..78fa890fe 100644 --- a/configure.ac +++ b/configure.ac @@ -241,7 +241,7 @@ AC_CHECK_FUNC([gethostbyname], [], [AC_CHECK_LIB([ws2_32], [main], - [NET_LIBS="$NET_LIBS -lws2_32"], + [NET_LIBS="$NET_LIBS -lws2_32 -liphlpapi"], [], []) ]) commit c1780b19f4a30697588da277db579825f3698516 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Nov 16 09:05:29 2023 -0600 Add wireless detection for multicast address -- possible fix for UDP error messages by using 127.0.0.1 instead of IN_ADDR_ANY https://github.com/Hamlib/Hamlib/issues/1409 diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 590e91e67..a0cb2486f 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -2288,7 +2288,7 @@ enum rig_caps_cptr_e { * \brief Function to return int value from rig->caps * Does not support > 32-bit rig_caps values */ -extern HAMLIB_EXPORT (long long) rig_get_caps_int(rig_model_t rig_model, enum rig_caps_int_e rig_caps); +extern HAMLIB_EXPORT (uint64_t) rig_get_caps_int(rig_model_t rig_model, enum rig_caps_int_e rig_caps); /** * \brief Function to return char pointer value from rig->caps diff --git a/simulators/simts990.c b/simulators/simts990.c index c4918d52a..a3198b475 100644 --- a/simulators/simts990.c +++ b/simulators/simts990.c @@ -456,6 +456,11 @@ int main(int argc, char *argv[]) { sscanf(buf, "OM1%d", &modeSub); } + else if (strcmp(buf,"RM;") == 0) + { + sprintf(buf, "RM2%04d;", 10); + write(fd, buf, strlen(buf)); + } else if (strlen(buf) > 0) { fprintf(stderr, "Unknown command: %s\n", buf); diff --git a/src/misc.c b/src/misc.c index c238e7ada..c1c91d308 100644 --- a/src/misc.c +++ b/src/misc.c @@ -2640,7 +2640,7 @@ void *HAMLIB_API rig_get_function_ptr(rig_model_t rig_model, * \param RIG* and rig_caps_int_e * \return the corresponding long value -- -RIG_EINVAL is the only error possible */ -long long HAMLIB_API rig_get_caps_int(rig_model_t rig_model, +uint64_t HAMLIB_API rig_get_caps_int(rig_model_t rig_model, enum rig_caps_int_e rig_caps) { const struct rig_caps *caps = rig_get_caps(rig_model); @@ -2676,6 +2676,7 @@ long long HAMLIB_API rig_get_caps_int(rig_model_t rig_model, return caps->port_type; case RIG_CAPS_HAS_GET_LEVEL: + rig_debug(RIG_DEBUG_TRACE, "%s(%d): return %8lx\n", __func__, __LINE__, caps->has_get_level); return caps->has_get_level; default: diff --git a/src/network.c b/src/network.c index a576d90bf..aeba822ee 100644 --- a/src/network.c +++ b/src/network.c @@ -983,6 +983,109 @@ void *multicast_publisher(void *arg) return NULL; } + +#ifdef __MINGW32__ +#include <winsock2.h> +#include <iphlpapi.h> +int is_wireless() +{ + DWORD dwSize = 0; + DWORD dwRetVal = 0; + ULONG flags = GAA_FLAG_INCLUDE_PREFIX; + PIP_ADAPTER_ADDRESSES pAddresses = NULL, pCurrAddresses = NULL; + + // First call to determine actual memory size needed + GetAdaptersAddresses(AF_UNSPEC, flags, NULL, pAddresses, &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) + { + // printf("Adapter name: %s\n", pCurrAddresses->AdapterName); + // printf("Adapter description: %ls\n", pCurrAddresses->Description); + // printf("Adapter type: "); + + if (pCurrAddresses->IfType == IF_TYPE_IEEE80211) + { + // printf("Wireless\n\n"); + return 1; + } + else + { + // printf("Not Wireless\n\n"); + } + } + } + else + { + //printf("GetAdaptersAddresses failed with error: %lu\n", dwRetVal); + } + + if (pAddresses) + { + free(pAddresses); + } + + return 0; +} +#else +#include <sys/ioctl.h> +#include <sys/socket.h> +#include <unistd.h> +#include <linux/wireless.h> +#include <ifaddrs.h> + +int is_wireless_linux(const char *ifname) +{ + int sock = socket(AF_INET, SOCK_DGRAM, 0); + struct iwreq pwrq; + memset(&pwrq, 0, sizeof(pwrq)); + strncpy(pwrq.ifr_name, ifname, IFNAMSIZ); + + if (ioctl(sock, SIOCGIWNAME, &pwrq) != -1) + { + close(sock); + return 1; // Wireless + } + + close(sock); + return 0; // Not wireless +} + +int is_wireless() +{ + struct ifaddrs *ifaddr, *ifa; + + if (getifaddrs(&ifaddr) == -1) + { + perror("getifaddrs"); + return 0; + } + + for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) + { + if (ifa->ifa_addr == NULL) + { + continue; + } + + int iswireless = is_wireless_linux(ifa->ifa_name); + + //printf("%s is %s\n", ifa->ifa_name, iswireless ? "wireless" : "not wireless"); + if (iswireless) {freeifaddrs(ifaddr); return 1;} + } + + freeifaddrs(ifaddr); + return 0; +} +#endif + + void *multicast_receiver(void *arg) { char data[4096]; @@ -1024,8 +1127,15 @@ void *multicast_receiver(void *arg) dest_addr.sin_family = AF_INET; #ifdef __MINGW32__ // Windows cannot bind to multicast group addresses for some unknown reason - dest_addr.sin_addr.s_addr = htonl(INADDR_ANY); - rig_debug(RIG_DEBUG_ERR, "%s(%d): INADDR_ANY=%x,%x\n", htonl(INADDR_ANY), INADDR_ANY); + if (is_wireless()) + { + rig_debug(RIG_DEBUG_VERBOSE, "%s: no wireless detect so INADDR_ANY is being used\n", __func__); + } + else + { + 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"); + } #else dest_addr.sin_addr.s_addr = inet_addr(args->multicast_addr); #endif diff --git a/tests/testrig.c b/tests/testrig.c index 18eb45a2e..19701f49c 100644 --- a/tests/testrig.c +++ b/tests/testrig.c @@ -11,7 +11,7 @@ #include <hamlib/config.h> -#define SERIAL_PORT "/dev/ttyUSB0" +#define SERIAL_PORT "/dev/pts/2" int main(int argc, const char *argv[]) @@ -38,9 +38,9 @@ int main(int argc, const char *argv[]) * allocate memory, setup & open port */ + hamlib_port_t myport; if (argc < 2) { - hamlib_port_t myport; /* may be overridden by backend probe */ myport.type.rig = RIG_PORT_SERIAL; myport.parm.serial.rate = 9600; @@ -48,7 +48,6 @@ int main(int argc, const char *argv[]) myport.parm.serial.stop_bits = 1; myport.parm.serial.parity = RIG_PARITY_NONE; myport.parm.serial.handshake = RIG_HANDSHAKE_NONE; - strncpy(myport.pathname, SERIAL_PORT, HAMLIB_FILPATHLEN - 1); rig_load_all_backends(); myrig_model = rig_probe(&myport); @@ -59,6 +58,7 @@ int main(int argc, const char *argv[]) } my_rig = rig_init(myrig_model); + rig_set_conf(my_rig, rig_token_lookup(my_rig, "rig_pathname"), SERIAL_PORT); if (!my_rig) { @@ -77,6 +77,9 @@ int main(int argc, const char *argv[]) exit(2); } + uint64_t levels = rig_get_caps_int(my_rig->caps->rig_model, RIG_CAPS_HAS_GET_LEVEL); + printf("HAS_GET_LEVEL=0x%8lx, SWR=%8llx,true=%d\n", levels, levels & RIG_LEVEL_SWR, (levels & RIG_LEVEL_SWR) == RIG_LEVEL_SWR); + char val[256]; retcode = rig_get_conf2(my_rig, rig_token_lookup(my_rig, "write_delay"), val, sizeof(val)); commit cb34dc3b207022410d8c44971e285997c05a29c1 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Nov 16 09:02:32 2023 -0600 Add stop_voice_mem to some icom rigs Also add send_voice_mem to IC275 diff --git a/rigs/icom/ic275.c b/rigs/icom/ic275.c index 89a4c330a..e3c9561a4 100644 --- a/rigs/icom/ic275.c +++ b/rigs/icom/ic275.c @@ -143,6 +143,8 @@ const struct rig_caps ic275_caps = .set_mode = icom_set_mode, .get_mode = icom_get_mode, .set_vfo = icom_set_vfo, + .send_voice_mem = icom_send_voice_mem, + .stop_voice_mem = icom_stop_voice_mem, .decode_event = icom_decode_event, .set_mem = icom_set_mem, diff --git a/rigs/icom/ic7300.c b/rigs/icom/ic7300.c index a9a68838e..ad1bf47f2 100644 --- a/rigs/icom/ic7300.c +++ b/rigs/icom/ic7300.c @@ -929,6 +929,7 @@ const struct rig_caps ic7300_caps = .stop_morse = icom_stop_morse, .wait_morse = rig_wait_morse, .send_voice_mem = icom_send_voice_mem, + .stop_voice_mem = icom_stop_voice_mem, .set_clock = ic7300_set_clock, .get_clock = ic7300_get_clock, .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS @@ -1251,6 +1252,7 @@ struct rig_caps ic9700_caps = .stop_morse = icom_stop_morse, .wait_morse = rig_wait_morse, .send_voice_mem = icom_send_voice_mem, + .stop_voice_mem = icom_stop_voice_mem, .set_clock = ic9700_set_clock, .get_clock = ic9700_get_clock, .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS @@ -1525,6 +1527,7 @@ const struct rig_caps ic705_caps = .stop_morse = icom_stop_morse, .wait_morse = rig_wait_morse, .send_voice_mem = icom_send_voice_mem, + .stop_voice_mem = icom_stop_voice_mem, .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS }; @@ -1795,6 +1798,7 @@ const struct rig_caps ic905_caps = .stop_morse = icom_stop_morse, .wait_morse = rig_wait_morse, .send_voice_mem = icom_send_voice_mem, + .stop_voice_mem = icom_stop_voice_mem, .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS, }; diff --git a/rigs/icom/ic7610.c b/rigs/icom/ic7610.c index 1ba953daa..ce327e324 100644 --- a/rigs/icom/ic7610.c +++ b/rigs/icom/ic7610.c @@ -603,6 +603,7 @@ struct rig_caps ic7610_caps = .stop_morse = icom_stop_morse, .wait_morse = rig_wait_morse, .send_voice_mem = icom_send_voice_mem, + .stop_voice_mem = icom_stop_voice_mem, .set_clock = ic7610_set_clock, .get_clock = ic7610_get_clock, .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index adf8898ce..2370ff947 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -9500,6 +9500,10 @@ int icom_get_level_raw(RIG *rig, setting_t level, int cmd, int subcmd, RETURNFUNC(RIG_OK); } +int icom_stop_voice_mem(RIG *rig, vfo_t vfo) +{ + return icom_send_voice_mem(rig, vfo, 0); +} /* * icom_send_voice_mem * Assumes rig!=NULL, rig->state.priv!=NULL diff --git a/rigs/icom/icom.h b/rigs/icom/icom.h index a29cfe221..a16230076 100644 --- a/rigs/icom/icom.h +++ b/rigs/icom/icom.h @@ -35,7 +35,7 @@ #include <sys/time.h> #endif -#define BACKEND_VER "20231113" +#define BACKEND_VER "20231116" #define ICOM_IS_ID31 rig_is_model(rig, RIG_MODEL_ID31) #define ICOM_IS_ID51 rig_is_model(rig, RIG_MODEL_ID51) @@ -390,6 +390,7 @@ int icom_mW2power(RIG *rig, float *power, unsigned int mwpower, freq_t freq, int icom_send_morse(RIG *rig, vfo_t vfo, const char *msg); int icom_stop_morse(RIG *rig, vfo_t vfo); int icom_send_voice_mem(RIG *rig, vfo_t vfo, int bank); +int icom_stop_voice_mem(RIG *rig, vfo_t vfo); /* Exposed routines */ int icom_get_split_vfos(RIG *rig, vfo_t *rx_vfo, vfo_t *tx_vfo); int icom_set_raw(RIG *rig, int cmd, int subcmd, int subcmdbuflen, commit 4f0393d6add63b0c1460d3f36d32376c5e12116d Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Nov 15 07:38:13 2023 -0600 Add simic275.c diff --git a/simulators/simic275.c b/simulators/simic275.c new file mode 100644 index 000000000..388ddd2f7 --- /dev/null +++ b/simulators/simic275.c @@ -0,0 +1,603 @@ +// simicom will show the pts port to use for rigctl on Unix +// using virtual serial ports on Windows is to be developed yet +// Needs a lot of improvement to work on all Icoms +// gcc -g -Wall -o simicom simicom.c -lhamlib +// On mingw in the hamlib src directory +// gcc -static -I../include -g -Wall -o simicom simicom.c -L../../build/src/.libs -lhamlib -lwsock32 -lws2_32 +#define _XOPEN_SOURCE 700 +// since we are POSIX here we need this +#if 0 +struct ip_mreq +{ + int dummy; +}; +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <sys/time.h> +#include <hamlib/rig.h> +#include "../src/misc.h" +#include <termios.h> +#include <unistd.h> + + +#define BUFSIZE 256 +#define X25 + +int civ_731_mode = 0; +vfo_t current_vfo = RIG_VFO_A; +int split = 0; + +// we make B different from A to ensure we see a difference at startup +float freqA = 14074000; +float freqB = 14074500; +mode_t modeA = RIG_MODE_PKTUSB; +mode_t modeB = RIG_MODE_PKTUSB; +int datamodeA = 0; +int datamodeB = 0; +pbwidth_t widthA = 0; +pbwidth_t widthB = 1; +ant_t ant_curr = 0; +int ant_option = 0; +int ptt = 0; +int satmode = 0; +int agc_time = 1; +int ovf_status = 0; +int powerstat = 1; +int transceive = 0; +int keyspd = 20; +int rigtime = 1230; + +void dumphex(const unsigned char *buf, int n) +{ + for (int i = 0; i < n; ++i) { printf("%02x ", buf[i]); } + + printf("\n"); +} + +int +frameGet(int fd, unsigned char *buf) +{ + int i = 0, n; + memset(buf, 0, BUFSIZE); + unsigned char c; + +again: + + while (read(fd, &c, 1) > 0) + { + buf[i++] = c; + //printf("i=%d, c=0x%02x\n",i,c); + + if (c == 0xfd) + { + char mytime[256]; + date_strget(mytime, sizeof(mytime), 1); + printf("%s:", mytime); dumphex(buf, i); + // echo + n = write(fd, buf, i); + + if (n != i) { printf("%s: error on write: %s\n", __func__, strerror(errno)); } + + return i; + } + + if (i > 2 && c == 0xfe) + { + printf("Turning power on due to 0xfe string\n"); + powerstat = 1; + int j; + + for (j = i; j < 175; ++j) + { + if (read(fd, &c, 1) < 0) { break; } + } + + i = 0; + goto again; + } + } + + printf("Error??? c=x%02x\n", c); + + return 0; +} + +void frameParse(int fd, unsigned char *frame, int len) +{ + double freq; + int n = 0; + + dumphex(frame, len); + + if (frame[0] != 0xfe && frame[1] != 0xfe) + { + printf("expected fe fe, got "); + dumphex(frame, len); + return; + } + + switch (frame[4]) + { + case 0x03: + + //from_bcd(frameackbuf[2], (civ_731_mode ? 4 : 5) * 2); + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) + { + printf("get_freqA\n"); + to_bcd(&frame[5], (long long)freqA, (civ_731_mode ? 4 : 5) * 2); + } + else + { + printf("get_freqB\n"); + to_bcd(&frame[5], (long long)freqB, (civ_731_mode ? 4 : 5) * 2); + } + + frame[10] = 0xfd; + + if (powerstat) + { + n = write(fd, frame, 11); + } + + break; + + case 0x04: + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) + { + printf("get_modeA\n"); + frame[5] = modeA; + frame[6] = widthA; + } + else + { + printf("get_modeB\n"); + frame[5] = modeB; + frame[6] = widthB; + } + + frame[7] = 0xfd; + n = write(fd, frame, 8); + break; + + case 0x05: + freq = from_bcd(&frame[5], (civ_731_mode ? 4 : 5) * 2); + printf("set_freq to %.0f\n", freq); + + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { freqA = freq; } + else { freqB = freq; } + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x06: + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { modeA = frame[6]; } + else { modeB = frame[6]; } + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x07: + + switch (frame[5]) + { + case 0x00: current_vfo = RIG_VFO_A; break; + + case 0x01: current_vfo = RIG_VFO_B; break; + + case 0xa0: current_vfo = freq = freqA; freqA = freqB; freqB = freq; break; + + case 0xb0: current_vfo = RIG_VFO_MAIN; break; + + case 0xd0: current_vfo = RIG_VFO_MAIN; break; + + case 0xd1: current_vfo = RIG_VFO_SUB; break; + } + + printf("set_vfo to %s\n", rig_strvfo(current_vfo)); + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x0f: + if (frame[5] == 0) { split = 0; } + else if (frame[5] == 1) { split = 1; } + else { frame[6] = split; } + + if (frame[5] == 0xfd) + { + printf("get split %d\n", 1); + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + printf("set split %d\n", 1); + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + + break; + + case 0x12: // we're simulating the 3-byte version -- not the 2-byte + if (frame[5] != 0xfd) + { + printf("Set ant %d\n", -1); + ant_curr = frame[5]; + ant_option = frame[6]; + dump_hex(frame, 8); + } + else + { + printf("Get ant\n"); + } + + frame[5] = ant_curr; + frame[6] = ant_option; + frame[7] = 0xfd; + printf("write 8 bytes\n"); + dump_hex(frame, 8); + n = write(fd, frame, 8); + break; + + case 0x14: + switch (frame[5]) + { + static int power_level = 0; + + case 0x07: + case 0x08: + if (frame[6] != 0xfd) + { + frame[6] = 0xfb; + dumphex(frame, 7); + n = write(fd, frame, 7); + printf("ACK x14 x08\n"); + } + else + { + to_bcd(&frame[6], (long long)128, 2); + frame[8] = 0xfb; + dumphex(frame, 9); + n = write(fd, frame, 9); + printf("SEND x14 x08\n"); + } + + break; + + case 0x0a: + printf("Using power level %d\n", power_level); + power_level += 10; + + if (power_level > 250) { power_level = 0; } + + to_bcd(&frame[6], (long long)power_level, 2); + frame[8] = 0xfd; + n = write(fd, frame, 9); + break; + + case 0x0c: + dumphex(frame, 10); + printf("subcmd=0x0c #1\n"); + + if (frame[6] != 0xfd) // then we have data + { + printf("subcmd=0x0c #1\n"); + keyspd = from_bcd(&frame[6], 2); + frame[6] = 0xfb; + n = write(fd, frame, 7); + } + else + { + printf("subcmd=0x0c #1\n"); + to_bcd(&frame[6], keyspd, 2); + frame[8] = 0xfd; + n = write(fd, frame, 9); + } + + break; + } + + break; + + + case 0x15: + switch (frame[5]) + { + static int meter_level = 0; + + case 0x07: + frame[6] = ovf_status; + frame[7] = 0xfd; + n = write(fd, frame, 8); + ovf_status = ovf_status == 0 ? 1 : 0; + break; + + case 0x11: + printf("Using meter level %d\n", meter_level); + meter_level += 10; + + if (meter_level > 250) { meter_level = 0; } + + to_bcd(&frame[6], (long long)meter_level, 2); + frame[8] = 0xfd; + n = write(fd, frame, 9); + break; + } + + case 0x16: + switch (frame[5]) + { + case 0x5a: + if (frame[6] == 0xfe) + { + satmode = frame[6]; + } + else + { + frame[6] = satmode; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + + break; + } + + break; + + case 0x19: // miscellaneous things + frame[5] = 0x94; + frame[6] = 0xfd; + n = write(fd, frame, 7); + break; + + case 0x1a: // miscellaneous things + switch (frame[5]) + { + case 0x03: // width + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { frame[6] = widthA; } + else { frame[6] = widthB; } + + frame[7] = 0xfd; + n = write(fd, frame, 8); + break; + + case 0x04: // AGC TIME + printf("frame[6]==x%02x, frame[7]=0%02x\n", frame[6], frame[7]); + + if (frame[6] == 0xfd) // the we are reading + { + frame[6] = agc_time; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + printf("AGC_TIME RESPONSE******************************"); + agc_time = frame[6]; + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + + break; + + case 0x05: + // FE FE 70 E0 1A 05 00 92 00 FD + printf("0x05 received\n"); + + if (frame[6] == 0x00 && frame[7] == 0x92) + { + if (frame[8] == 0x00) + { + printf("0x05 0x00 0x92 received\n"); + transceive = frame[8]; + frame[6] = 0xfb; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + frame[8] = transceive; + frame[9] = 0xfb; + frame[10] = 0xfd; + n = write(fd, frame, 11); + } + } + // FE FE 70 E0 1A 05 00 41 00 FD + else if (frame[6] == 0x00 && frame[7] == 0x41) + { + if (frame[8] != 0xfd) + { + printf("0x05 0x00 0x41 received\n"); + rigtime = frame[8] * 100 + frame[9]; + frame[6] = 0xfb; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + frame[8] = rigtime / 100; + frame[9] = rigtime % 100; + frame[10] = 0xfd; + n = write(fd, frame, 11); + } + } + + break; + + case 0x06: // Data mode + if (frame[6] == 0xfd) // then we're replying with mode + { + frame[6] = datamodeA; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + datamodeA = frame[6]; + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + + break; + + } + + break; + + case 0x1c: + switch (frame[5]) + { + case 0: + if (frame[6] == 0xfd) + { + frame[6] = ptt; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + ptt = frame[6]; + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + + break; + + } + + break; + + + case 0x25: + printf("x25 send nak\n"); + frame[4] = 0xfa; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x26: + printf("x26 send nak\n"); + frame[4] = 0xfa; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + default: printf("cmd 0x%02x unknown\n", frame[4]); + } + + if (n == 0) { printf("Write failed=%s\n", strerror(errno)); } + +// don't care about the rig type yet + +} + +#if defined(WIN32) || defined(_WIN32) +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd; + fd = open(comport, O_RDWR); + + if (fd < 0) + { + perror(comport); + } + + return fd; +} + +#else +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd = posix_openpt(O_RDWR); + char *name = ptsname(fd); + + if (name == NULL) + { + perror("pstname"); + return -1; + } + + printf("name=%s\n", name); + + if (fd == -1 || grantpt(fd) == -1 || unlockpt(fd) == -1) + { + perror("posix_openpt"); + return -1; + } + + return fd; +} +#endif + +void rigStatus() +{ + char vfoa = current_vfo == RIG_VFO_A ? '*' : ' '; + char vfob = current_vfo == RIG_VFO_B ? '*' : ' '; + printf("%cVFOA: mode=%d datamode=%d width=%ld freq=%.0f\n", vfoa, modeA, + datamodeA, + widthA, + freqA); + printf("%cVFOB: mode=%d datamode=%d width=%ld freq=%.0f\n", vfob, modeB, + datamodeB, + widthB, + freqB); +} + +int main(int argc, char **argv) +{ + unsigned char buf[256]; + int fd = openPort(argv[1]); + + printf("%s: %s\n", argv[0], rig_version()); + printf("x25/x26 command rejected\n"); +#if defined(WIN32) || defined(_WIN32) + + if (argc != 2) + { + printf("Missing comport argument\n"); + printf("%s [comport]\n", argv[0]); + exit(1); + } + +#endif + + while (1) + { + int len = frameGet(fd, buf); + + if (len <= 0) + { + close(fd); + fd = openPort(argv[1]); + } + + if (powerstat) + { + frameParse(fd, buf, len); + } + else + { + hl_usleep(1000 * 1000); + } + + rigStatus(); + } + + return 0; +} commit e8d387d51c552c014b19fc2acebfc4b3de871d13 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Nov 14 23:54:56 2023 -0600 Update actions in c-cpp.yml diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 30663e032..52fb2d589 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: bootstrap run: | sudo apt install libusb-1.0-0-dev commit 1fce7ced5be4701a067cf4a9e52b88ac9c0f5922 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Nov 14 23:44:47 2023 -0600 Really fix modeMapGetHamblib in Flrig to find mode in multiple mode list https://github.com/Hamlib/Hamlib/issues/1428 diff --git a/rigs/dummy/flrig.c b/rigs/dummy/flrig.c index 7c359d6be..ef2160bce 100644 --- a/rigs/dummy/flrig.c +++ b/rigs/dummy/flrig.c @@ -716,7 +716,7 @@ static rmode_t modeMapGetHamlib(const char *modeFLRig) modeFLRigCheck, modeMap[i].mode_flrig); if (modeMap[i].mode_flrig - && strstr(modeMap[i].mode_flrig, modeFLRigCheck) == 0) + && strstr(modeMap[i].mode_flrig, modeFLRigCheck)) { return (modeMap[i].mode_hamlib); } diff --git a/simulators/Makefile.am b/simulators/Makefile.am index ad9879b6b..f383f5ce7 100644 --- a/simulators/Makefile.am +++ b/simulators/Makefile.am @@ -8,7 +8,7 @@ DISTCLEANFILES = bin_PROGRAMS = -check_PROGRAMS = simelecraft simicgeneric simkenwood simyaesu simic9100 simic9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simic7300 simic7000 simic7100 simic7200 simatd578 simic905 simts450 simic7600 simic7610 simic705 simts950 simts990 simic7851 simftdx101 simxiegug90 simqrplabs simft818 +check_PROGRAMS = simelecraft simicgeneric simkenwood simyaesu simic9100 simic9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simic7300 simic7000 simic7100 simic7200 simatd578 simic905 simts450 simic7600 simic7610 simic705 simts950 simts990 simic7851 simftdx101 simxiegug90 simqrplabs simft818 simic275 simelecraft_SOURCES = simelecraft.c simkenwood_SOURCES = simkenwood.c diff --git a/simulators/simft817.c b/simulators/simft817.c index 00adb9c3a..a77fd3ddf 100644 --- a/simulators/simft817.c +++ b/simulators/simft817.c @@ -18,6 +18,7 @@ struct ip_mreq #define BUFSIZE 256 +int vfo = 0; // 0=A, !0=B float freqA = 14074000; float freqB = 14074500; char tx_vfo = '0'; @@ -121,7 +122,11 @@ again: case 0x88: printf("PTT OFF\n"); break; - case 0x07: printf("MODE\n"); break; + case 0x07: + printf("MODE %0xx\n", buf[0]); + if (vfo == 0) modeA = buf[0]; + else modeB = buf[0]; + break; case 0x05: printf("CLAR ON\n"); break; @@ -129,7 +134,10 @@ again: case 0xF5: printf("FREQ\n"); break; - case 0x81: printf("VFO TOGGLE\n"); break; + case 0x81: + vfo = !vfo; + printf("VFO TOGGLE, %s active\n", vfo==0?"VFOA":"VFOB"); + break; case 0x02: printf("SPLIT ON\n"); break; commit 512c82649e4f80d696938bd7843ea8fa2b2444ca Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Nov 14 22:55:25 2023 -0600 Fix modeMapGetHamblib in Flrig to find mode in multiple mode list https://github.com/Hamlib/Hamlib/issues/1428 diff --git a/rigs/dummy/flrig.c b/rigs/dummy/flrig.c index eb1db8b91..7c359d6be 100644 --- a/rigs/dummy/flrig.c +++ b/rigs/dummy/flrig.c @@ -716,7 +716,7 @@ static rmode_t modeMapGetHamlib(const char *modeFLRig) modeFLRigCheck, modeMap[i].mode_flrig); if (modeMap[i].mode_flrig - && strcmp(modeMap[i].mode_flrig, modeFLRigCheck) == 0) + && strstr(modeMap[i].mode_flrig, modeFLRigCheck) == 0) { return (modeMap[i].mode_hamlib); } commit c348632b262c17121867457f685d06a3111727a2 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Nov 14 17:03:40 2023 -0600 Add ptt_type to rig->caps when set so it can be queried correctly diff --git a/src/conf.c b/src/conf.c index 99fad9154..c6e991c4f 100644 --- a/src/conf.c +++ b/src/conf.c @@ -514,26 +514,32 @@ static int frontend_set_conf(RIG *rig, token_t token, const char *val) if (!strcmp(val, "RIG")) { rs->pttport.type.ptt = RIG_PTT_RIG; + rig->caps->ptt_type = RIG_PTT_RIG; } else if (!strcmp(val, "RIGMICDATA")) { rs->pttport.type.ptt = RIG_PTT_RIG_MICDATA; + rig->caps->ptt_type = RIG_PTT_RIG_MICDATA; } else if (!strcmp(val, "DTR")) { rs->pttport.type.ptt = RIG_PTT_SERIAL_DTR; + rig->caps->ptt_type = RIG_PTT_SERIAL_DTR; } else if (!strcmp(val, "RTS")) { rs->pttport.type.ptt = RIG_PTT_SERIAL_RTS; + rig->caps->ptt_type = RIG_PTT_SERIAL_RTS; } else if (!strcmp(val, "Parallel")) { rs->pttport.type.ptt = RIG_PTT_PARALLEL; + rig->caps->ptt_type = RIG_PTT_PARALLEL; } else if (!strcmp(val, "CM108")) { rs->pttport.type.ptt = RIG_PTT_CM108; + rig->caps->ptt_type = RIG_PTT_CM108; } else if (!strcmp(val, "GPIO")) { @@ -542,6 +548,7 @@ static int frontend_set_conf(RIG *rig, token_t token, const char *val) else if (!strcmp(val, "GPION")) { rs->pttport.type.ptt = RIG_PTT_GPION; + rig->caps->ptt_type = RIG_PTT_GPION; } else if (!strcmp(val, "None")) { commit 8478367223f611a4fbc2e677a577664c5611db9c Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Nov 14 10:23:14 2023 -0600 Improve rigctld printout when TCP session is aborted diff --git a/src/network.c b/src/network.c index a68329149..a576d90bf 100644 --- a/src/network.c +++ b/src/network.c @@ -1025,6 +1025,7 @@ void *multicast_receiver(void *arg) #ifdef __MINGW32__ // Windows cannot bind to multicast group addresses for some unknown reason dest_addr.sin_addr.s_addr = htonl(INADDR_ANY); + rig_debug(RIG_DEBUG_ERR, "%s(%d): INADDR_ANY=%x,%x\n", htonl(INADDR_ANY), INADDR_ANY); #else dest_addr.sin_addr.s_addr = inet_addr(args->multicast_addr); #endif diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index 23d14cfe3..9c6b215b0 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -720,9 +720,18 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, { if ((retcode = scanfc(fin, "%c", &cmd)) < 1) { + if (last_cmd==0) + { + rig_debug(RIG_DEBUG_WARN, "%s: nothing to scan#1? retcode=%d, last_cmd=[empty]\n", + __func__, + retcode); + } + else + { rig_debug(RIG_DEBUG_WARN, "%s: nothing to scan#1? retcode=%d, last_cmd=%c\n", __func__, retcode, last_cmd); + } return (RIGCTL_PARSE_ERROR); } diff --git a/tests/rigctld.c b/tests/rigctld.c index 2bce5b814..e82f18cff 100644 --- a/tests/rigctld.c +++ b/tests/rigctld.c @@ -867,6 +867,26 @@ int main(int argc, char *argv[]) freeaddrinfo(saved_result); /* No longer needed */ exit(2); } + int optval = 1; +#ifdef __MINGW32__ + if (setsockopt(sock_listen, SOL_SOCKET, SO_REUSEADDR, (PCHAR)&optval, sizeof(optval)) < 0) +#else + if (setsockopt(sock_listen, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) +#endif + { + rig_debug(RIG_DEBUG_ERR, "%s: error enabling UDP address reuse: %s\n", __func__, + strerror(errno)); + } + + // Windows does not have SO_REUSEPORT. However, SO_REUSEADDR works in a similar way. +#if defined(SO_REUSEPORT) + if (setsockopt(sock_listen, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval)) < 0) + { + rig_debug(RIG_DEBUG_ERR, "%s: error enabling UDP port reuse: %s\n", __func__, + strerror(errno)); + } +#endif + #if 0 if (setsockopt(sock_listen, commit f57b7cba71e48dfb3aef258f5e492d2cf06db711 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Nov 14 07:42:38 2023 -0600 Revert commit 1c379e793a066c30d35fed99e5fb1a77f7a882f8 Removing LF from here caused "l ?" to not have CR where "L ?" does. I don't see the problem with a CR to end the printout. Not sure why this was removed before...bad documentation on my part. diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index c47a87fe6..23d14cfe3 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -3352,7 +3352,7 @@ declare_proto_rig(get_level) fprintf(fout, "%s%c", s, resp_sep); } - //fputc('\n', fout); + fputc('\n', fout); RETURNFUNC2(RIG_OK); } level = rig_parse_level(arg1); commit 723b835fdde16c774deaa51ba2be39e47436d0e5 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Nov 14 06:48:41 2023 -0600 Remove bogus set_level in ts590.c for ALC,SWR,COMP diff --git a/rigs/kenwood/ts590.c b/rigs/kenwood/ts590.c index 1b80a3831..9a4c1dc48 100644 --- a/rigs/kenwood/ts590.c +++ b/rigs/kenwood/ts590.c @@ -564,28 +564,6 @@ static int ts590_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) SNPRINTF(levelbuf, sizeof(levelbuf), "RA%02d", (val.i == 12) ? 1 : 0); break; - case RIG_LEVEL_METER: - switch (val.i) - { - case RIG_METER_SWR: - kenwood_val = 1; - break; - - case RIG_METER_COMP: - kenwood_val = 2; - break; - - case RIG_METER_ALC: - kenwood_val = 3; - break; - - default: - RETURNFUNC(-RIG_EINVAL); - } - - SNPRINTF(levelbuf, sizeof(levelbuf), "RM%d", kenwood_val); - break; - case RIG_LEVEL_CWPITCH: if (val.i > 1000 || val.i < 300) { @@ -1594,7 +1572,7 @@ const struct rig_caps ts590_caps = RIG_MODEL(RIG_MODEL_TS590S), .model_name = "TS-590S", .mfg_name = "Kenwood", - .version = BACKEND_VER ".9", + .version = BACKEND_VER ".10", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -1792,7 +1770,7 @@ const struct rig_caps fx4_caps = RIG_MODEL(RIG_MODEL_FX4), .model_name = "FX4/C/CR/L", .mfg_name = "BG2FX", - .version = BACKEND_VER ".8", + .version = BACKEND_VER ".9", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -1986,7 +1964,7 @@ const struct rig_caps ts590sg_caps = RIG_MODEL(RIG_MODEL_TS590SG), .model_name = "TS-590SG", .mfg_name = "Kenwood", - .version = BACKEND_VER ".6", + .version = BACKEND_VER ".7", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, commit d868f1a545a753f1b8b1c47b30ae0383b3ff4483 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Nov 13 23:07:57 2023 -0600 Fix FLRig get_bwA/B for rigs that do not have it https://github.com/Hamlib/Hamlib/issues/1427 diff --git a/rigs/dummy/flrig.c b/rigs/dummy/flrig.c index a5688ecde..eb1db8b91 100644 --- a/rigs/dummy/flrig.c +++ b/rigs/dummy/flrig.c @@ -590,6 +590,8 @@ static int flrig_transaction(RIG *rig, char *cmd, char *cmd_arg, char *value, // we get an unknown response if function does not exist if (strstr(xml, "unknown")) { set_transaction_inactive(rig); RETURNFUNC(RIG_ENAVAIL); } + if (strstr(xml, "get_bw") && strstr(xml, "NONE")) { set_transaction_inactive(rig); RETURNFUNC(RIG_ENAVAIL); } + if (value) { xml_parse(xml, value, value_len); @@ -896,7 +898,8 @@ static int flrig_open(RIG *rig) if (retval == RIG_ENAVAIL) // must not have it { priv->has_get_bwA = 0; - rig_debug(RIG_DEBUG_VERBOSE, "%s: get_bwA is not available=%s\n", __func__, + priv->has_get_bwB = 0; // if we don't have A then surely we don't have B either + rig_debug(RIG_DEBUG_VERBOSE, "%s: get_bwA/B is not available=%s\n", __func__, value); } else @@ -911,6 +914,7 @@ static int flrig_open(RIG *rig) if (retval == RIG_ENAVAIL) // must not have it { priv->has_set_bwA = 0; + priv->has_set_bwB = 0; rig_debug(RIG_DEBUG_VERBOSE, "%s: set_bwA is not available=%s\n", __func__, value); } @@ -920,34 +924,37 @@ static int flrig_open(RIG *rig) rig_debug(RIG_DEBUG_VERBOSE, "%s: set_bwA is available=%s\n", __func__, value); } - /* see if get_bwB is available */ - retval = flrig_transaction(rig, "rig.get_bwB", NULL, value, sizeof(value)); - - if (retval == RIG_ENAVAIL) // must not have it + if (priv->has_get_bwA) { - priv->has_get_bwB = 0; - rig_debug(RIG_DEBUG_VERBOSE, "%s: get_bwB is not available=%s\n", __func__, - value); - } - else - { - priv->has_get_bwB = 1; - rig_debug(RIG_DEBUG_VERBOSE, "%s: get_bwB is available=%s\n", __func__, value); - } + /* see if get_bwB is available FLRig can return empty value too */ + retval = flrig_transaction(rig, "rig.get_bwB", NULL, value, sizeof(value)); - /* see if set_bwA is available */ - retval = flrig_transaction(rig, "rig.set_bwB", NULL, value, sizeof(value)); + if (retval == RIG_ENAVAIL || strlen(value) == 0) // must not have it + { + priv->has_get_bwB = 0; + rig_debug(RIG_DEBUG_VERBOSE, "%s: get_bwB is not available=%s\n", __func__, + value); + } + else + { + priv->has_get_bwB = 1; + rig_debug(RIG_DEBUG_VERBOSE, "%s: get_bwB is available=%s\n", __func__, value); + } - if (retval == RIG_ENAVAIL) // must not have it - { - priv->has_set_bwB = 0; - rig_debug(RIG_DEBUG_VERBOSE, "%s: set_bwB is not available=%s\n", __func__, - value); - } - else - { - priv->has_set_bwB = 1; - rig_debug(RIG_DEBUG_VERBOSE, "%s: set_bwB is available=%s\n", __func__, value); + /* see if set_bwA is available */ + retval = flrig_transaction(rig, "rig.set_bwB", NULL, value, sizeof(value)); + + if (retval == RIG_ENAVAIL) // must not have it + { + priv->has_set_bwB = 0; + rig_debug(RIG_DEBUG_VERBOSE, "%s: set_bwB is not available=%s\n", __func__, + value); + } + else + { + priv->has_set_bwB = 1; + rig_debug(RIG_DEBUG_VERBOSE, "%s: set_bwB is available=%s\n", __func__, value); + } } retval = flrig_transaction(rig, "rig.get_AB", NULL, value, sizeof(value)); @@ -1743,8 +1750,14 @@ static int flrig_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) /* so we may not be 100% accurate if op is twiddling knobs */ cmdp = "rig.get_bwA"; retval = flrig_transaction(rig, cmdp, NULL, value, sizeof(value)); + if (retval == RIG_OK && strstr(value,"NONE")) + { + priv->has_get_bwA = priv->has_get_bwB = 0; + *width = 0; + rig_debug(RIG_DEBUG_VERBOSE, "%s: does not have rig.get_bwA/B\n", __func__); + } - if (retval != RIG_OK) + if (retval != RIG_OK || strstr(value,"NONE")) { RETURNFUNC(retval); } @@ -1754,6 +1767,12 @@ static int flrig_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) { cmdp = "rig.get_bwB"; retval = flrig_transaction(rig, cmdp, NULL, value, sizeof(value)); + if (retval == RIG_OK && strlen(value)==0) + { + rig_debug(RIG_DEBUG_VERBOSE, "%s: does not have rig.get_bwB\n", __func__); + priv->has_get_bwB = 0; + *width = 0; + } if (retval != RIG_OK) { commit 394cb4cbcf53971ac5f5e2ede0b0c488be989528 Merge: b1b567d64 176c49240 Author: Michael Black <mdb...@ya...> Date: Mon Nov 13 17:48:52 2023 -0600 Merge pull request #1426 from GeoBaltz/990_meter 990 meter commit b1b567d64a7d65584377926fa0818fde3b6abf18 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Nov 13 13:58:06 2023 -0600 Fix FLRig get_bwA/B for rigs that do not have get_bwA/b https://github.com/Hamlib/Hamlib/issues/1427 diff --git a/rigs/dummy/flrig.c b/rigs/dummy/flrig.c index e5a14e32e..a5688ecde 100644 --- a/rigs/dummy/flrig.c +++ b/rigs/dummy/flrig.c @@ -118,6 +118,9 @@ struct flrig_priv_data value_t parms[RIG_SETTING_MAX]; struct ext_list *ext_parms; int get_SWR; + int has_get_modeB; /* True if this function is available */ + int has_get_bwB; /* True if this function is available */ + int has_set_bwB; /* True if this function is available */ }; /* level's and parm's tokens */ @@ -140,7 +143,7 @@ const struct rig_caps flrig_caps = RIG_MODEL(RIG_MODEL_FLRIG), .model_name = "FLRig", .mfg_name = "FLRig", - .version = "20231110.0", + .version = "20231113.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -863,6 +866,21 @@ static int flrig_open(RIG *rig) rig_debug(RIG_DEBUG_VERBOSE, "%s: getmodeA is available\n", __func__); } + /* see if get_modeB is available */ + retval = flrig_transaction(rig, "rig.get_modeB", NULL, value, sizeof(value)); + + if (retval == RIG_ENAVAIL) // must not have it + { + priv->has_get_modeB = 0; + rig_debug(RIG_DEBUG_VERBOSE, "%s: getmodeB is not available=%s\n", __func__, + value); + } + else + { + priv->has_get_modeB = 1; + rig_debug(RIG_DEBUG_VERBOSE, "%s: getmodeB is available\n", __func__); + } + freq_t freq; retval = flrig_get_freq(rig, RIG_VFO_CURR, &freq); @@ -902,6 +920,36 @@ static int flrig_open(RIG *rig) rig_debug(RIG_DEBUG_VERBOSE, "%s: set_bwA is available=%s\n", __func__, value); } + /* see if get_bwB is available */ + retval = flrig_transaction(rig, "rig.get_bwB", NULL, value, sizeof(value)); + + if (retval == RIG_ENAVAIL) // must not have it + { + priv->has_get_bwB = 0; + rig_debug(RIG_DEBUG_VERBOSE, "%s: get_bwB is not available=%s\n", __func__, + value); + } + else + { + priv->has_get_bwB = 1; + rig_debug(RIG_DEBUG_VERBOSE, "%s: get_bwB is available=%s\n", __func__, value); + } + + /* see if set_bwA is available */ + retval = flrig_transaction(rig, "rig.set_bwB", NULL, value, sizeof(value)); + + if (retval == RIG_ENAVAIL) // must not have it + { + priv->has_set_bwB = 0; + rig_debug(RIG_DEBUG_VERBOSE, "%s: set_bwB is not available=%s\n", __func__, + value); + } + else + { + priv->has_set_bwB = 1; + rig_debug(RIG_DEBUG_VERBOSE, "%s: set_bwB is available=%s\n", __func__, value); + } + retval = flrig_transaction(rig, "rig.get_AB", NULL, value, sizeof(value)); if (retval != RIG_OK) { RETURNFUNC(retval); } @@ -1599,6 +1647,8 @@ static int flrig_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) rig_debug(RIG_DEBUG_TRACE, "%s: vfo=%s\n", __func__, rig_strvfo(vfo)); + *width = 0; + if (check_vfo(vfo) == FALSE) { rig_debug(RIG_DEBUG_ERR, "%s: unsupported VFO %s\n", @@ -1655,7 +1705,7 @@ static int flrig_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) /* so we may not be 100% accurate if op is twiddling knobs */ cmdp = "rig.get_modeA"; - if (vfo == RIG_VFO_B) { cmdp = "rig.get_modeB"; } + if (priv->has_get_modeB && vfo == RIG_VFO_B) { cmdp = "rig.get_modeB"; } } retval = flrig_transaction(rig, cmdp, NULL, value, sizeof(value)); @@ -1692,15 +1742,25 @@ static int flrig_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) /* vfo B may not be getting polled though in FLRig */ /* so we may not be 100% accurate if op is twiddling knobs */ cmdp = "rig.get_bwA"; + retval = flrig_transaction(rig, cmdp, NULL, value, sizeof(value)); - if (vfo == RIG_VFO_B) { cmdp = "rig.get_bwB"; } - } + if (retval != RIG_OK) + { + RETURNFUNC(retval); + } - retval = flrig_transaction(rig, cmdp, NULL, value, sizeof(value)); - if (retval != RIG_OK) - { - RETURNFUNC(retval); + if (priv->has_get_bwB && vfo == RIG_VFO_B) + { + cmdp = "rig.get_bwB"; + retval = flrig_transaction(rig, cmdp, NULL, value, sizeof(value)); + + if (retval != RIG_OK) + { + RETURNFUNC(retval); + } + + } } rig_debug(RIG_DEBUG_TRACE, "%s: mode=%s width='%s'\n", __func__, @@ -2114,12 +2174,14 @@ static int flrig_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) RETURNFUNC(RIG_OK); } -typedef struct { +typedef struct +{ float mtr; float swr; } swrpair; -static swrpair swrtbl[] = { +static swrpair swrtbl[] = +{ {0.0, 1.0}, {10.5, 1.5}, {23.0, 2.0}, @@ -2129,21 +2191,29 @@ static swrpair swrtbl[] = { }; // Function to interpolate SWR from MTR -float interpolateSWR(float mtr) { +float interpolateSWR(float mtr) +{ int i; - for (i = 0; i < sizeof(swrtbl)/sizeof(swrpair) - 1; i++) { - if (mtr == swrtbl[i].mtr) { + + for (i = 0; i < sizeof(swrtbl) / sizeof(swrpair) - 1; i++) + { + if (mtr == swrtbl[i].mtr) + { // Exact match return swrtbl[i].swr; } - if (mtr < swrtbl[i + 1].mtr) { + + if (mtr < swrtbl[i + 1].mtr) + { // Perform linear interpolation - float slope = (swrtbl[i +... [truncated message content] |
From: n0nb <n0...@us...> - 2023-11-13 14:10:34
|
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 e7786cee4c4e15aeba8a551622342f4b090a3059 (commit) via 43159e55a1c4351199fada21eb6be4632001d930 (commit) via 9832fba7979c827785119052f0a824c76acd3007 (commit) via 6351d5deacd5b2ba37c307fe6430965fa86573f4 (commit) via 1374ee554c9d73b5fd301a2afd1023725ef4d4ab (commit) via 774e60895cb268f6ec1001047f97ff2319881869 (commit) via 5059ec8cd6bc2913ffc8d5f4b84910fed2f97466 (commit) via 1f9d3a63d42526d2cbd162a08c8d40d498b3c8de (commit) via 7cb10edf20c4a1be18f0ff2f52c54c1b095d17c7 (commit) via 59285750ef32dc0ee5deab8634832965372f7b73 (commit) via 3a08bbe3d82b2cbc22ecb5b4af6775cfea2e3c4b (commit) via 5d7db6b516affc9a4e1c6e6f6cba393bbe49a077 (commit) via f1a9823bddf2dd93e781bbc6fe9ef0a46335a639 (commit) via 62341a657efcce90af1f897861b20572d0e3f4a9 (commit) via 02b4da83c3c34330ca796942f7e0698fb0a86464 (commit) via a5bac081908255fe71dc06d934ef418821b50364 (commit) via 7c3e71a487fd600591d299794fa2c3c28e79147a (commit) via 162a685887d9cdd18dc17f557edbb117694b38f5 (commit) via afdb26093e6fe0eeafabcbad6b48859f928b7e47 (commit) via 4aa8e010a1653574bbf582fe9b102cb2464bff01 (commit) via 45dca3be598c028f08e6db1edb0a7e78525c2fe2 (commit) via 49e93f3090f0dd32a2fbf752ab43d5872e58e52b (commit) via 02ffc6d6dcaa34100e2b7ff93e7713999505c45c (commit) via 2d2d5009e0181a71d171add29c19a7bbe347887d (commit) via 1e3e1a9499f6cdc6738e311fdf07fb14e52ebbed (commit) via 337fb0f3e5b7b83c8d28481d516587cc9469e304 (commit) via 43d1fbb3230c74e62f47dc510aeafb072443aca5 (commit) via 31298bb91711d71356b2309670321a88a11f4582 (commit) via 3107a060f015dfda3d5087ce85bac5a668ae2154 (commit) via f8814732a2224d50ca16cf497fe0d9dd0686358d (commit) via 41c891251f4641d2aeb292e76654ed88b9f85a90 (commit) via 40a8cedc9da307c00ca7b4bd591ffb69542a9cde (commit) via 5b86d4efffe86b9893093790bcb0f74c86e11a9e (commit) via 88e86fb62a17a14dc681a1ed4336d6268af709cc (commit) via 53ff60d98156b277c369fbdd63ce3da2893594d2 (commit) via 5fb2e68e07c8b972d82b68dc4b0a5b2d79045623 (commit) via f36822ac20b43d7257ded7ba25b8162b4c5eda31 (commit) via f618540f227d634c05dfa69d2237fb1350a0eb77 (commit) via 0dbe24ff424854ce849c0c159bcd6f938f61d995 (commit) via f4f4d122a850bd2cffe586a2850b45fc5fa1b6ca (commit) via 8484b132f265e99257f64dcbc99d9e2da732e96c (commit) via 7f8f470ef75b3cb9424ab01667da6b5b1a23d03d (commit) via 701bc365599ee0cfe0174da58e5be56d38ac0a5a (commit) via fccc540353269ccf89aa70c37ec060fe30c78039 (commit) via 6cb17e49dcf1219d9c44b684356797128daf4209 (commit) via c8c8869a3c19661a73e321079d35a3cc1ce58262 (commit) via fb03d095dff23b7efd1794a9ce2ebf9425889579 (commit) via 012534a628f6025bbaed6d0189f686c776388945 (commit) via 6b558c5d2ad5dffa9887495688882fd6f1560ed0 (commit) via f9bd07bbf5faee04129158606e4c207db85115e9 (commit) via 7c5d4db2fe14addd7c57235229f610b0ee931207 (commit) via 06c20da7384f8426df3543bda42c94f34bbf10a2 (commit) via 1d57136d699ed8e4fa7cc829a1060338382542ea (commit) via 66e8548d606d666ed863ece111f1c1150d622e20 (commit) via 6d0035180c1126867e80069fee96970a5f4cc8a0 (commit) via 228aac34ca9e47bd30cf20d8b637013d320dc790 (commit) via b5653852b382eefc19273adc53ffea350f1f35f2 (commit) via d39662348642f2c8d9fe2977721403a1b7b0eb79 (commit) via 325277f269615eef8fdfb1fc1104203557dc99b1 (commit) via 32728ba95f8ee396793bb5fcaa002154ebf4f1cf (commit) via 599554ee162f2806bf84128f4ba6c62f947d2dc8 (commit) via 192822417b80e8ea7929c14ed2c1dfbf56cc511b (commit) via e0fa354d3a684d5a012144ec53a0e9afba126cff (commit) via a8f224e660728f428ea2f2cd6bef51d332c3896c (commit) via 7e0d60535a67443c27297ba054ab206ea943af2e (commit) via 0613c5844bf03fb3019b7c982f5228f895aa519c (commit) via 541c1e1de23cc41e020546b8bce4cf00a773f822 (commit) via b17d2b869c266548f44a92f1710ea2f8d1697067 (commit) via ce6dd8d2c79460ac368321b4065d39d629d78217 (commit) via 5a7eec1af702f7298ffc5084c814fc1cfb39352a (commit) via 84875071a93fefc9f4f7c56e31a4fc90c42f203c (commit) via 9b6d1565f137b8f0a61b9c934d1c0eded866e9fd (commit) via fb49c0cf7099dffba94354c7fffb77ca2e4e7987 (commit) via 46bfe24a62b5e2ae2c968e82aae8863892ad7b1d (commit) via 00d69f63ef65d287dc2a00d8ca747cee885d9603 (commit) via bdeb433d040736ad28a6f8cb7128ae4c5a2be532 (commit) via 464fa3f4780bf249bc876d26fac7df549f9c21af (commit) via 344f06382ce4eae0829ecd85eb6bd9469bec6356 (commit) via aa429806aa8f21569d7ca117bb98205753d2cd1b (commit) via 65caf427f09034f799e7498dbb9166dc197ce495 (commit) via e1ca06655d141e1bc30c112a86884967b925a937 (commit) via a1baf7307d7c5067c909322d39c9414a77a24837 (commit) via 9a22b39fcdf0ec063d630703146bf7f67bc34a9a (commit) via 05823482a001c13d0aaeede857371dac0128a642 (commit) via c74fc74e9ec23bc53649eeda2b46e873dc532098 (commit) via b6ffeeda990c79b64d32e1495b7055d00bd9193e (commit) via f697f71205862284de64bd4066742b7999796124 (commit) via b609eb0085f4f5f28a94a13b173d38c6784b2af8 (commit) via df413d0dc4d7083be4abca6b626340603a56a124 (commit) via d87671b54b9e432bdaef5860dcf4c8bf520d63c2 (commit) via 289585388b057f0e8043e3b0e220c818178b8de7 (commit) via ff2c0e6b0365e6ae6b5d2ab45a8812a3ee4f70a3 (commit) via 01292b261f40cc6d0ac0d57158ef5a7508234ae2 (commit) via ec6c19854e0c59c129ac6a1b20da295c51e352f6 (commit) via f5f8694a709bf084145121c4ed8633032eacf873 (commit) via 914c4f4d2a695dcf0e1d756e476806baeca0a88f (commit) via 60356f5774140738b692da88b7fd8b83a0190051 (commit) via cb5e9ec8539394bd4d0931eb189c4f3ec3f4f461 (commit) via aac762712a8382626a7c0d41ba481969f69b8f2b (commit) via 680ce55ba26df1e3634356229bfe20491706f77e (commit) via 1bf2111c7a72aac84f2618c4338142fdabafd06e (commit) via 8a006db51d297e5b894ee887ec89886de0bc5a8e (commit) via 9f053799e91e2ba5c090fc31e86bcb38fb716211 (commit) via cdc9bc45f21174d82af7350d967d771e425563c4 (commit) via b72dd095f730b73f560944d4261e0d876154625d (commit) via 8d15c04727ddea13feef5d37fe203a4105f4ae5d (commit) via e2354333f34986359559dd74073bb0712f060bcb (commit) via 534fe449a28273bf30b4ae363dc4d81160071367 (commit) via d72127f29a1a226fb09949a6570cace1db7e6bc2 (commit) via 501c4b62c9f40feb64d4acdd409f3940a8552949 (commit) via 9c6e564006c0e39db053b2bffe7084125a6f6ac9 (commit) via 744eb5fc5d23f69cdcc6268aff4815726dc3608f (commit) via e68b6f98b52d0ff5286e304734ad8455aa2e4bfb (commit) via 67fdf34f226f33573ea63eb9a8fd06eec1374122 (commit) via d3edab375950c67cafc987d73058912f684c9e57 (commit) via dfc04d49c4b218b7211eba0550ca20d602735428 (commit) via fd1c48bfabcd7fb890e1c24fbac4e6290afd957c (commit) via 64d6cd4af270bd2e94968eb6df5c34202b0763a4 (commit) via d7b65ec5a5e59bbd6f82d9271547ffc216728836 (commit) via f7f57ecc68fd647c59a27e226c9f8c46fd196b09 (commit) via 8a9776664ede8b2f902c6c33326a80a5edca11bf (commit) via 4175929a48f256e8ce8c2920f987f38c76601ced (commit) via 8dea15d4dbdfce581a348a87255c0882e34b4713 (commit) via 3217a007e4e1a7071bc40389809c7e69b69d172d (commit) via d5f7660781ea7310028463b99d22a054eb198022 (commit) via e2d03ea581b39400d15fcbe28f29ac54e0282ab7 (commit) via 6957c15ec39236bb3883539cdba9f654b80f169a (commit) via d48c847cf5c625868488f92a9633ac3da79af470 (commit) via 4fd9edbc97167f2c7f60a72bb720a2c7f8708f2d (commit) via adc339039decaa7b60e4cb0c1ff304dad39228ff (commit) via 98ab55b80500fb3b8e0fe98f0d94249bb0651dc2 (commit) via 89db4ae757e12474d2325d81d5011701b5159118 (commit) via d4cf8a04d71c9da9bdd704277a616574b4c973a3 (commit) via e0c4988e6a59ca781b6c9816c29a90d9fc07e429 (commit) via da5de3cb6ec6a188545910ec255d8c5849ebe18d (commit) via 3b5f7a6dcf6dc191d906f8a15d4b204ad8d51d93 (commit) via c93440706f24073daf2ec8e8c1ce09e2e6bbd417 (commit) via 5ac1e50b8060ac248659ffe8d7e28788843d5b04 (commit) via 631a2a3aa1f4ff0763d6d966067bdadcd5914c6c (commit) via 717a451d9cf48036ac9ed8c845d1fac35e1cb3aa (commit) via 1a8ae4b4342e433552384f6b0d002a02ad36e49b (commit) via 84ca35f19e643545bef67fb154994465b344993a (commit) via 6877d0357967df737b50049758d90900466d3d6b (commit) via 1a4a189dbcb972788efade98778ecc9a5705fbab (commit) via 0484dc08c8538db34d4e1302a702147b28e42353 (commit) via 18d016a2a2b72e70bb9c69acf85494cbaadd6380 (commit) via 18e122196f0f5fa7eedbda6b4b92534af52bea6d (commit) via 71f8b3b8c9e64e3e7d561da83ced9dad84bfb8d0 (commit) via 93af897753279dcc4455c47726ad80535284abf8 (commit) via a4698230287e2d9690d842f7c0498bc8e94f4ccc (commit) via f00661a8ae24f662b2ad8c2d88a3e904de8b8197 (commit) via e1e7112cb5ceecadcc62961fc63cd7902e8219ed (commit) via 53855c868db32e1dc87984d103daf6daf307a4bd (commit) via 027c59d6e94d44ea0c3235f23c43f7fa8a527df6 (commit) via 6e8d328fb15c63f09bc51e82340d5b6c076481fd (commit) via 4d540b14590aa8794d2fa1c380c67f7302fcf985 (commit) via f9e9657ad139dad008c0c3f6ad84beb585393bd7 (commit) via d49543f00c0b0198ef5a1f33c41a21a7017ee8eb (commit) via f55d0fc872cfbd88ffddd73fd13b7d1733906030 (commit) via 2423fb237ce2317464383803223d82b430dc8f9f (commit) via aeb03fda62c7dc1c931365654ca9b38188d4df5c (commit) via 8bb6a57548a3c56cd58183ef0ed15edbe83644f4 (commit) via a82d67234b9da44de9bd2729a27efc031dcc42e0 (commit) via f9a9de37cf7a6df701f7755a63ff973cc7b63b52 (commit) via 76a836af5b4550bbec01f0ea6261497afb3934fb (commit) via cd9077fbc26754032d505e5ec282fa31c7e193aa (commit) via 6b6289313cffb9f12dc531c4f835919478b276de (commit) via 85787c8e89d02388788313208a0167c2b82eb762 (commit) via db6ffaf7dad2bd5adcb619850f541676b1797d70 (commit) via 3e0420f13829436786c02eeaa13ce0fc5d0ce8cb (commit) via 85226e5bc43da0b3b12f17b54449cfb0654a4057 (commit) via be8372c72f16b123f7fa5b557d8329594eb1cf60 (commit) via f797178e961ff52f7d29ce281102e9b5141f7b29 (commit) via b731e77841e861c93b2cfb123e756aef7d2cf212 (commit) via 44a6274bbee830515756183f00ee46ba21529354 (commit) via 6b4cc5b36baa490342d15a87e69bad3cf44c43d5 (commit) via 6f3a9831c3e4750a75a83983e499710c1a301704 (commit) via 5e4cb6f1c189441107dddb0bc9d1cb363e1aa277 (commit) via 6644afbf8d4dbf966638a8597e59eb0133aeeaf6 (commit) via 1fbb03fa92320f49dfa45704a1e557f888a69093 (commit) via 5f825aa0d466b2e3b22455035423033cf8f5ffb3 (commit) via da9199577ea3b948d49babde894829a2c17fe806 (commit) via 86df4001a1b3d29b51ce0f7ef5bfcd8e7fdd4a5a (commit) via 57c8819ce0467ec80e322d1aa7f92332ab2fcadf (commit) via e9ef4c1a81d1de111d2e2996377159bcf1e64dab (commit) via 5115fa8959b75aeb15746146cd99ef7ce688214f (commit) via 0bee5820953d06e4796982b08c65dd4cbcebe9d6 (commit) via e972262e8068890ad21e46acb4d0affb016ae973 (commit) via 3e91601a0f2a1e0b6d8d28443f6b9d1512bc5543 (commit) via d50ff331eea3f183928c202fe544c9b8cf7fa7be (commit) via 9415fc34462128ab4a6cb1f14025657c31a91426 (commit) via f05b6604a28820b1dcf1582acba6afc336dce3d4 (commit) via 8a4767db17c049d2d9b67155370ab24cd6e40adc (commit) via 4df8260cc1153e9576f2cac30c7469b7cab00eaf (commit) via 4f65288c326a609eefc0b276b4db3c5f7af64c79 (commit) via 3cf5fab21d6a238dee77b1372413d116085251c6 (commit) via ee807a7541fbd85a8125aafcc12fddfa954e44cb (commit) via a00326161c25dba722211edaec0743c86104ae94 (commit) via 5b4654024ad2b7fb252fd8d10df8ea2cb6bd1211 (commit) via 81e14ae4f1663de21ada86b3b204a286cc58ac1a (commit) via 6f229d1c1a015e507e6bf912b18a02cd1b776f85 (commit) via c07e40e18be59e849c1643f602802b0cac22c194 (commit) via 256766c5b6c02eab247ac93581b41199c4fd1b2b (commit) via 8ebadb3b7d39ef2d3d314019d560232e8f63fa07 (commit) via 1e93364f7d7f4dd28f338c1f1d3b390b50ed4487 (commit) via 3c48de2159713ef073ec238e827eced4d2f5bce7 (commit) from 2e3e0df4d6be4bd9aad2f0a155ee2370a45959a0 (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 e7786cee4c4e15aeba8a551622342f4b090a3059 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Nov 12 13:22:02 2023 -0600 Fix TS990S SWR read -- strange behavior of RM command reading first RM turned on for read New SWR table too for TS990S https://github.com/Hamlib/Hamlib/issues/1423 diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index 4e87543ba..7974d4423 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -1100,6 +1100,15 @@ int kenwood_open(RIG *rig) // mismatched IDs can still be tested rig->state.rigport.retry = retry_save; + + // TS-990S needs to ensure all RM meters are turned off as first one with read on gets read + // Any RM commands need to be ON/READ/OFF to allow other apps or threads to read meters + + if (RIG_IS_TS990S) + { + kenwood_transaction(rig, "RM10;RM20;RM30;RM40;RM50;RM60;", NULL, 0); + } + RETURNFUNC(RIG_OK); } diff --git a/rigs/kenwood/kenwood.h b/rigs/kenwood/kenwood.h index cfb5df20b..0e2a3858f 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 "20231031" +#define BACKEND_VER "20231112" #define EOM_KEN ';' #define EOM_TH '\r' diff --git a/rigs/kenwood/ts990s.c b/rigs/kenwood/ts990s.c index 63374cb16..39a5c9a07 100644 --- a/rigs/kenwood/ts990s.c +++ b/rigs/kenwood/ts990s.c @@ -59,9 +59,9 @@ #define TS990S_SWR_CAL { 5, \ { \ { 0, 1.0f }, \ - { 14, 1.5f }, \ - { 28, 2.0f }, \ - { 42, 3.0f }, \ + { 7, 1.5f }, \ + { 36, 3.0f }, \ + { 43, 6.0f }, \ { 70, 10.0f } \ } } @@ -647,7 +647,9 @@ int ts990s_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) break; case RIG_LEVEL_SWR: - retval = kenwood_safe_transaction(rig, "RM21", lvlbuf, sizeof(lvlbuf), 7); + // we need to turn on read, read it, and turn it off again + // first RM meter with read on is the that gets read with RM; + retval = kenwood_safe_transaction(rig, "RM21;RM;RM20", lvlbuf, sizeof(lvlbuf), 8); if (retval != RIG_OK) { diff --git a/src/rig.c b/src/rig.c index a080cd7d8..d95ae97fb 100644 --- a/src/rig.c +++ b/src/rig.c @@ -2740,6 +2740,14 @@ int HAMLIB_API rig_get_mode(RIG *rig, *width = rig->state.cache.widthMainA; RETURNFUNC(RIG_OK); } + else if (vfo == RIG_VFO_B) + { + if (rig->state.cache.modeMainB == RIG_MODE_NONE) + { + retcode = caps->get_mode(rig, vfo, mode, width); + return retcode; + } + } if ((*mode != RIG_MODE_NONE && cache_ms_mode < rig->state.cache.timeout_ms) && cache_ms_width < rig->state.cache.timeout_ms) commit 43159e55a1c4351199fada21eb6be4632001d930 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Nov 12 08:47:28 2023 -0600 Default configure builds shared libraries Adding --enable-static now turnes off shared as it never build both at the same time diff --git a/configure.ac b/configure.ac index 863b76dec..25f53c6bf 100644 --- a/configure.ac +++ b/configure.ac @@ -43,6 +43,23 @@ m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) ## ------------------------------ ## ## Hamlib specific configuration. ## ## ------------------------------ ## +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared], + [Enable shared libraries @<:@default=yes@:>@])], + [enable_shared=$enableval], + [enable_shared=yes]) +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static], + [Enable static libraries @<:@default=check@:>@])], + [enable_static=$enableval], + [enable_static=check]) + +AS_IF([test "x$enable_static" = "xyes"], [ + enable_shared=no +]) +AS_IF([test "x$enable_static" = "xyes" && test "x$enable_shared" = "xyes"], [ + AC_MSG_ERROR([Both --enable-static and --enable-shared cannot be enabled at the same time.]) +]) dnl New backends must be listed here! Also the new Makefile path must be dnl added to AC_CONFIG_FILES near the end of this file. See README.developer commit 9832fba7979c827785119052f0a824c76acd3007 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Nov 11 22:21:38 2023 -0600 Add null check in rig_get_function_ptr diff --git a/src/misc.c b/src/misc.c index 67a96205f..eba3ee2b7 100644 --- a/src/misc.c +++ b/src/misc.c @@ -2346,6 +2346,12 @@ void *HAMLIB_API rig_get_function_ptr(rig_model_t rig_model, { const struct rig_caps *caps = rig_get_caps(rig_model); + if (caps == NULL) + { + rig_debug(RIG_DEBUG_ERR, "%s: caps == null for model %d??\n", __func__, rig_model); + return NULL; + } + switch (rig_function) { case RIG_FUNCTION_INIT: commit 6351d5deacd5b2ba37c307fe6430965fa86573f4 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Nov 10 17:38:57 2023 -0600 Get scaling correct (i.e.none) for FLRig get_SWR https://github.com/Hamlib/Hamlib/issues/1423 diff --git a/rigs/dummy/flrig.c b/rigs/dummy/flrig.c index c1c4e1c4f..e5a14e32e 100644 --- a/rigs/dummy/flrig.c +++ b/rigs/dummy/flrig.c @@ -2210,7 +2210,10 @@ static int flrig_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) { case RIG_LEVEL_SWR: { - val->f = interpolateSWR(atoi(value)); + if (priv->get_SWR) + val->f = atof(value); + else + val->f = interpolateSWR(atoi(value)); break; } case RIG_LEVEL_STRENGTH: commit 1374ee554c9d73b5fd301a2afd1023725ef4d4ab Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Nov 10 15:43:20 2023 -0600 Add new get_SWR function for FLRig https://github.com/Hamlib/Hamlib/issues/1423 diff --git a/rigs/dummy/flrig.c b/rigs/dummy/flrig.c index 7d10d4882..c1c4e1c4f 100644 --- a/rigs/dummy/flrig.c +++ b/rigs/dummy/flrig.c @@ -117,6 +117,7 @@ struct flrig_priv_data float powermeter_scale; /* So we can scale power meter to 0-1 */ value_t parms[RIG_SETTING_MAX]; struct ext_list *ext_parms; + int get_SWR; }; /* level's and parm's tokens */ @@ -639,6 +640,7 @@ static int flrig_init(RIG *rig) priv->curr_modeB = -1; priv->curr_widthA = -1; priv->curr_widthB = -1; + priv->get_SWR = 1; // we'll try getSWR once to see if it works if (!rig->caps) { @@ -2154,7 +2156,7 @@ static int flrig_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) char value[MAXARGLEN]; char *cmd; int retval; - const struct flrig_priv_data *priv = (struct flrig_priv_data *) rig->state.priv; + struct flrig_priv_data *priv = (struct flrig_priv_data *) rig->state.priv; ENTERFUNC; rig_debug(RIG_DEBUG_TRACE, "%s: vfo=%s\n", __func__, @@ -2171,8 +2173,11 @@ static int flrig_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) case RIG_LEVEL_STRENGTH: cmd = "rig.get_smeter"; break; - case RIG_LEVEL_SWR: cmd = "rig.get_SWR"; break; - //case RIG_LEVEL_SWR: cmd = "rig.get_swrmeter"; break; + case RIG_LEVEL_SWR: + cmd = "rig.get_swrmeter"; + // we'll try get_SWR at least once to see if it works + if (priv->get_SWR) cmd = "rig.get_SWR"; + break; case RIG_LEVEL_RFPOWER: cmd = "rig.get_power"; break; @@ -2188,6 +2193,7 @@ static int flrig_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) if (retval == RIG_ENAVAIL && strcmp(cmd,"rig.get_SWR")==0) { + priv->get_SWR = 0; cmd = "rig.get_swrmeter"; // revert to old flrig method retval = flrig_transaction(rig, cmd, NULL, value, sizeof(value)); } commit 774e60895cb268f6ec1001047f97ff2319881869 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Nov 10 11:55:30 2023 -0600 Use new FLRig get_SWR method if available -- otherwise use old method diff --git a/rigs/dummy/flrig.c b/rigs/dummy/flrig.c index 60dd8b5cf..7d10d4882 100644 --- a/rigs/dummy/flrig.c +++ b/rigs/dummy/flrig.c @@ -139,7 +139,7 @@ const struct rig_caps flrig_caps = RIG_MODEL(RIG_MODEL_FLRIG), .model_name = "FLRig", .mfg_name = "FLRig", - .version = "20231108.0", + .version = "20231110.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -2171,7 +2171,8 @@ static int flrig_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) case RIG_LEVEL_STRENGTH: cmd = "rig.get_smeter"; break; - case RIG_LEVEL_SWR: cmd = "rig.get_swrmeter"; break; + case RIG_LEVEL_SWR: cmd = "rig.get_SWR"; break; + //case RIG_LEVEL_SWR: cmd = "rig.get_swrmeter"; break; case RIG_LEVEL_RFPOWER: cmd = "rig.get_power"; break; @@ -2185,6 +2186,12 @@ static int flrig_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) retval = flrig_transaction(rig, cmd, NULL, value, sizeof(value)); + if (retval == RIG_ENAVAIL && strcmp(cmd,"rig.get_SWR")==0) + { + cmd = "rig.get_swrmeter"; // revert to old flrig method + retval = flrig_transaction(rig, cmd, NULL, value, sizeof(value)); + } + if (retval != RIG_OK) { rig_debug(RIG_DEBUG_ERR, "%s: flrig_transaction failed retval=%s\n", __func__, diff --git a/simulators/simft991.c b/simulators/simft991.c index 0a9066f3c..d2f5b1eb2 100644 --- a/simulators/simft991.c +++ b/simulators/simft991.c @@ -138,8 +138,14 @@ int main(int argc, char *argv[]) if (n <= 0) { perror("RM5"); } } + else if (strcmp(buf,"MR118;") == 0) + { + pbuf = "?;"; + n = write(fd, pbuf, strlen(pbuf)); + if (n <= 0) { perror("MR118"); } + } - if (strcmp(buf, "AN0;") == 0) + else if (strcmp(buf, "AN0;") == 0) { printf("%s\n", buf); hl_usleep(50 * 1000); @@ -161,7 +167,7 @@ int main(int argc, char *argv[]) } else if (strcmp(buf, "FA;") == 0) { - SNPRINTF(buf, sizeof(buf), "FA%08.0f;", freqA); + SNPRINTF(buf, sizeof(buf), "FA%09.0f;", freqA); n = write(fd, buf, strlen(buf)); } else if (strncmp(buf, "FA", 2) == 0) @@ -170,7 +176,7 @@ int main(int argc, char *argv[]) } else if (strcmp(buf, "FB;") == 0) { - SNPRINTF(buf, sizeof(buf), "FB%08.0f;", freqB); + SNPRINTF(buf, sizeof(buf), "FB%09.0f;", freqB); n = write(fd, buf, strlen(buf)); } else if (strncmp(buf, "FB", 2) == 0) commit 5059ec8cd6bc2913ffc8d5f4b84910fed2f97466 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Nov 10 10:55:31 2023 -0600 Add SWR for TS990 https://github.com/Hamlib/Hamlib/issues/1423 diff --git a/rigs/kenwood/ts990s.c b/rigs/kenwood/ts990s.c index ffa724a71..63374cb16 100644 --- a/rigs/kenwood/ts990s.c +++ b/rigs/kenwood/ts990s.c @@ -22,10 +22,12 @@ #include <stdlib.h> #include <string.h> +#include <math.h> #include <hamlib/rig.h> #include "kenwood.h" #include "ts990s.h" +#include "cal.h" #define TS990S_AM_MODES RIG_MODE_AM #define TS990S_FM_MODES (RIG_MODE_FM|RIG_MODE_FMN) @@ -37,7 +39,7 @@ #define TS2000_FUNC_ALL (RIG_FUNC_TONE|RIG_FUNC_TSQL|RIG_FUNC_BC|RIG_FUNC_NB|RIG_FUNC_NR|RIG_FUNC_ANF|RIG_FUNC_COMP) -#define TS2000_LEVEL_ALL (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_VOXDELAY|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_SQL|RIG_LEVEL_CWPITCH|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_COMP|RIG_LEVEL_AGC|RIG_LEVEL_BKINDL|RIG_LEVEL_METER|RIG_LEVEL_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH) +#define TS2000_LEVEL_ALL (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_VOXDELAY|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_SQL|RIG_LEVEL_CWPITCH|RIG_LEVEL_RFPOWER|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_COMP|RIG_LEVEL_AGC|RIG_LEVEL_BKINDL|RIG_LEVEL_METER|RIG_LEVEL_VOXGAIN|RIG_LEVEL_ANTIVOX|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH|RIG_LEVEL_SWR) #define TS990S_VFO_OP (RIG_OP_BAND_UP|RIG_OP_BAND_DOWN) #define TS990S_SCAN_OP (RIG_SCAN_VFO) @@ -54,6 +56,16 @@ {0x46, 60}}\ } +#define TS990S_SWR_CAL { 5, \ + { \ + { 0, 1.0f }, \ + { 14, 1.5f }, \ + { 28, 2.0f }, \ + { 42, 3.0f }, \ + { 70, 10.0f } \ + } } + + /* memory capabilities */ #define TS990S_MEM_CAP { \ .freq = 1, \ @@ -121,7 +133,7 @@ const struct rig_caps ts990s_caps = RIG_MODEL(RIG_MODEL_TS990S), .model_name = "TS-990S", .mfg_name = "Kenwood", - .version = BACKEND_VER ".5", + .version = BACKEND_VER ".6", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -311,6 +323,7 @@ const struct rig_caps ts990s_caps = }, .str_cal = TS990S_STR_CAL, + .swr_cal = TS990S_SWR_CAL, .priv = (void *)& ts990s_priv_caps, @@ -633,6 +646,19 @@ int ts990s_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) val->i = lvl / 100; break; + case RIG_LEVEL_SWR: + retval = kenwood_safe_transaction(rig, "RM21", lvlbuf, sizeof(lvlbuf), 7); + + if (retval != RIG_OK) + { + return retval; + } + + sscanf(lvlbuf, "RM2%d", &lvl); + val->f = rig_raw2val_float(lvl, &rig->caps->swr_cal); + val->f = round(val->f*10)/10.0; // 1 decimal place precision + break; + case RIG_LEVEL_METER: retval = kenwood_safe_transaction(rig, "RM", lvlbuf, sizeof(lvlbuf), 7); @@ -715,7 +741,7 @@ int ts990s_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) } } break; - + default: rig_debug(RIG_DEBUG_ERR, "%s: unsupported get_level %s", __func__, rig_strlevel(level)); diff --git a/simulators/simts990.c b/simulators/simts990.c index 462be1824..c4918d52a 100644 --- a/simulators/simts990.c +++ b/simulators/simts990.c @@ -14,6 +14,7 @@ struct ip_mreq #include <fcntl.h> #include <string.h> #include <unistd.h> +#include <errno.h> #include <hamlib/rig.h> #define BUFSIZE 256 @@ -32,22 +33,6 @@ int modeMain = 2; int modeSub = 2; int keyspd = 20; -int -getmyline(int fd, char *buf) -{ - char c; - int i = 0; - memset(buf, 0, BUFSIZE); - - while (read(fd, &c, 1) > 0) - { - buf[i++] = c; - - if (c == ';') { return strlen(buf); } - } - - return strlen(buf); -} #if defined(WIN32) || defined(_WIN32) int openPort(char *comport) // doesn't matter for using pts devices @@ -87,6 +72,30 @@ int openPort(char *comport) // doesn't matter for using pts devices } #endif +int +getmyline(int fd, char *buf) +{ + char c; + int i = 0; + memset(buf, 0, BUFSIZE); + int retval; + + while ((retval=read(fd, &c, 1)) > 0) + { + buf[i++] = c; + + if (c == ';') { return strlen(buf); } + } + if (retval != 0) + { + perror("read failed:"); + close(fd); + fd = openPort(""); + } + + return strlen(buf); +} + int main(int argc, char *argv[]) @@ -99,13 +108,19 @@ int main(int argc, char *argv[]) while (1) { + hl_usleep(10); buf[0] = 0; if (getmyline(fd, buf) > 0) { printf("Cmd:%s\n", buf); } // else { return 0; } - if (strcmp(buf, "RM5;") == 0) + if (strncmp(buf, "RM2", 3) == 0) + { + pbuf = "RM20020;"; + write(fd, pbuf, strlen(pbuf)); + } + else if (strcmp(buf, "RM5;") == 0) { printf("%s\n", buf); hl_usleep(mysleep * 1000); commit 1f9d3a63d42526d2cbd162a08c8d40d498b3c8de Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Nov 9 11:26:56 2023 -0600 Fix PTT status for multicast diff --git a/src/snapshot_data.c b/src/snapshot_data.c index a32ad1ff5..8d61ebe0b 100644 --- a/src/snapshot_data.c +++ b/src/snapshot_data.c @@ -151,7 +151,7 @@ static int snapshot_serialize_vfo(cJSON *vfo_node, RIG *rig, vfo_t vfo) || (split == RIG_SPLIT_ON && vfo != split_vfo); is_tx = (split == RIG_SPLIT_OFF && vfo == rig->state.current_vfo) || (split == RIG_SPLIT_ON && vfo == split_vfo); - ptt = rig->state.cache.ptt; + ptt = rig->state.cache.ptt && is_tx; if (is_tx) { commit 7cb10edf20c4a1be18f0ff2f52c54c1b095d17c7 Merge: 5d7db6b51 59285750e Author: Michael Black <mdb...@ya...> Date: Thu Nov 9 09:33:13 2023 -0600 Merge pull request #1421 from mikaelnousiainen/hamlib-multicast-4 Improve rig poll routine (multicast) commit 59285750ef32dc0ee5deab8634832965372f7b73 Merge: 3a08bbe3d 5d7db6b51 Author: Mikael Nousiainen <mik...@ik...> Date: Thu Nov 9 09:59:35 2023 +0200 Fix conflict commit 3a08bbe3d82b2cbc22ecb5b4af6775cfea2e3c4b Author: Mikael Nousiainen <mik...@ik...> Date: Thu Nov 9 09:53:48 2023 +0200 Detect also VFO changes in poll routine and allow detection of multiple changes at once. Remove old unused code. diff --git a/src/event.c b/src/event.c index 6f70e37af..10ca23ab9 100644 --- a/src/event.c +++ b/src/event.c @@ -69,10 +69,9 @@ void *rig_poll_routine(void *arg) rig_poll_routine_args *args = (rig_poll_routine_args *)arg; RIG *rig = args->rig; struct rig_state *rs = &rig->state; - int result; int update_occurred; - vfo_t vfo = RIG_VFO_NONE, vfo_prev = RIG_VFO_NONE; + vfo_t vfo = RIG_VFO_NONE, tx_vfo = RIG_VFO_NONE; freq_t freq_main_a = 0, freq_main_b = 0, freq_main_c = 0, freq_sub_a = 0, freq_sub_b = 0, freq_sub_c = 0; rmode_t mode_main_a = 0, mode_main_b = 0, mode_main_c = 0, mode_sub_a = 0, mode_sub_b = 0, mode_sub_c = 0; pbwidth_t width_main_a = 0, width_main_b = 0, width_main_c = 0, width_sub_a = 0, width_sub_b = 0, width_sub_c = 0; @@ -95,244 +94,117 @@ void *rig_poll_routine(void *arg) while (rs->poll_routine_thread_run) { + if (rig->state.current_vfo != vfo) + { + vfo = rig->state.current_vfo; + update_occurred = 1; + } + if (rig->state.tx_vfo != tx_vfo) + { + tx_vfo = rig->state.tx_vfo; + update_occurred = 1; + } if (rig->state.cache.freqMainA != freq_main_a) { freq_main_a = rig->state.cache.freqMainA; update_occurred = 1; } - else if (rig->state.cache.freqMainB != freq_main_b) + if (rig->state.cache.freqMainB != freq_main_b) { freq_main_b = rig->state.cache.freqMainB; update_occurred = 1; } - else if (rig->state.cache.freqMainC != freq_main_c) + if (rig->state.cache.freqMainC != freq_main_c) { freq_main_b = rig->state.cache.freqMainC; update_occurred = 1; } - else if (rig->state.cache.freqSubA != freq_sub_a) + if (rig->state.cache.freqSubA != freq_sub_a) { freq_sub_a = rig->state.cache.freqSubA; update_occurred = 1; } - else if (rig->state.cache.freqSubB != freq_sub_b) + if (rig->state.cache.freqSubB != freq_sub_b) { freq_sub_b = rig->state.cache.freqSubB; update_occurred = 1; } - else if (rig->state.cache.freqSubC != freq_sub_c) + if (rig->state.cache.freqSubC != freq_sub_c) { freq_sub_c = rig->state.cache.freqSubC; update_occurred = 1; } - else if (rig->state.cache.ptt != ptt) + if (rig->state.cache.ptt != ptt) { ptt = rig->state.cache.ptt; update_occurred = 1; } - else if (rig->state.cache.split != split) + if (rig->state.cache.split != split) { split = rig->state.cache.split; update_occurred = 1; } - else if (rig->state.cache.modeMainA != mode_main_a) + if (rig->state.cache.modeMainA != mode_main_a) { mode_main_a = rig->state.cache.modeMainA; update_occurred = 1; } - else if (rig->state.cache.modeMainB != mode_main_b) + if (rig->state.cache.modeMainB != mode_main_b) { mode_main_b = rig->state.cache.modeMainB; update_occurred = 1; } - else if (rig->state.cache.modeMainC != mode_main_c) + if (rig->state.cache.modeMainC != mode_main_c) { mode_main_c = rig->state.cache.modeMainC; update_occurred = 1; } - else if (rig->state.cache.modeSubA != mode_sub_a) + if (rig->state.cache.modeSubA != mode_sub_a) { mode_sub_a = rig->state.cache.modeSubA; update_occurred = 1; } - else if (rig->state.cache.modeSubB != mode_sub_b) + if (rig->state.cache.modeSubB != mode_sub_b) { mode_sub_b = rig->state.cache.modeSubB; update_occurred = 1; } - else if (rig->state.cache.modeSubC != mode_sub_c) + if (rig->state.cache.modeSubC != mode_sub_c) { mode_sub_c = rig->state.cache.modeSubC; update_occurred = 1; } - else if (rig->state.cache.widthMainA != width_main_a) + if (rig->state.cache.widthMainA != width_main_a) { width_main_a = rig->state.cache.widthMainA; update_occurred = 1; } - else if (rig->state.cache.widthMainB != width_main_b) + if (rig->state.cache.widthMainB != width_main_b) { width_main_b = rig->state.cache.widthMainB; update_occurred = 1; } - else if (rig->state.cache.widthMainC != width_main_c) + if (rig->state.cache.widthMainC != width_main_c) { width_main_c = rig->state.cache.widthMainC; update_occurred = 1; } - else if (rig->state.cache.widthSubA != width_sub_a) + if (rig->state.cache.widthSubA != width_sub_a) { width_sub_a = rig->state.cache.widthSubA; update_occurred = 1; } - else if (rig->state.cache.widthSubB != width_sub_b) + if (rig->state.cache.widthSubB != width_sub_b) { width_sub_b = rig->state.cache.widthSubB; update_occurred = 1; } - else if (rig->state.cache.widthSubC != width_sub_c) + if (rig->state.cache.widthSubC != width_sub_c) { width_sub_c = rig->state.cache.widthSubC; update_occurred = 1; } -// The original code here actively reads rig state, which can be too intensive and intrusive -#if 0 - if (rig->caps->get_vfo) - { - result = rig_get_vfo(rig, &vfo); - - if (result != RIG_OK) - { - rig_debug(RIG_DEBUG_ERR, "%s(%d): rig_get_vfo error %s\n", __FILE__, __LINE__, - rigerror(result)); - } - - if (vfo != vfo_prev) - { - rig_fire_vfo_event(rig, vfo); - } - - if (vfo != vfo_prev) - { - rig_debug(RIG_DEBUG_CACHE, - "%s(%d) vfo=%s was %s\n", __FILE__, __LINE__, - rig_strvfo(vfo), rig_strvfo(vfo_prev)); - update_occurred = 1; - vfo_prev = vfo; - } - } - - if (rig->caps->get_freq) - { - result = rig_get_freq(rig, RIG_VFO_A, &freq_main); - - if (result != RIG_OK) - { - rig_debug(RIG_DEBUG_ERR, "%s(%d): rig_get_freqA error %s\n", __FILE__, __LINE__, - rigerror(result)); - } - - result = rig_get_freq(rig, RIG_VFO_B, &freq_sub); - - if (result != RIG_OK) - { - rig_debug(RIG_DEBUG_ERR, "%s(%d): rig_get_freqB error %s\n", __FILE__, __LINE__, - rigerror(result)); - } - - if (freq_main != freq_main_prev) - { - rig_fire_freq_event(rig, RIG_VFO_A, freq_main); - } - - if (freq_sub != freq_sub_prev) - { - rig_fire_freq_event(rig, RIG_VFO_B, freq_sub); - } - - if (freq_main != freq_main_prev || freq_sub != freq_sub_prev) - { - rig_debug(RIG_DEBUG_CACHE, - "%s(%d) freq_main=%.0f was %.0f, freq_sub=%.0f was %.0f\n", __FILE__, __LINE__, - freq_main, freq_main_prev, freq_sub, freq_sub_prev); - update_occurred = 1; - freq_main_prev = freq_main; - freq_sub_prev = freq_sub; - } - } - - if (rig->caps->get_mode) - { - result = rig_get_mode(rig, RIG_VFO_A, &mode_main, &width_main); - - if (result != RIG_OK) - { - rig_debug(RIG_DEBUG_ERR, "%s(%d): rig_get_modeA error %s\n", __FILE__, __LINE__, - rigerror(result)); - } - - result = rig_get_mode(rig, RIG_VFO_B, &mode_sub, &width_sub); - - if (result != RIG_OK) - { - rig_debug(RIG_DEBUG_ERR, "%s(%d): rig_get_modeB error %s\n", __FILE__, __LINE__, - rigerror(result)); - } - - if (mode_main != mode_main_prev || width_main != width_main_prev) - { - rig_fire_mode_event(rig, RIG_VFO_A, mode_main, width_main); - } - - if (mode_sub != mode_sub_prev || width_sub != width_sub_prev) - { - rig_fire_mode_event(rig, RIG_VFO_B, mode_sub, width_sub); - } - - if (mode_main != mode_main_prev || mode_sub != mode_sub_prev) - { - rig_debug(RIG_DEBUG_CACHE, "%s(%d) mode_main=%s was %s, mode_sub=%s was %s\n", - __FILE__, __LINE__, rig_strrmode(mode_main), rig_strrmode(mode_main_prev), - rig_strrmode(mode_sub), rig_strrmode(mode_sub_prev)); - update_occurred = 1; - mode_main_prev = mode_main; - mode_sub_prev = mode_sub; - } - - if (width_main != width_main_prev || width_sub != width_sub_prev) - { - rig_debug(RIG_DEBUG_CACHE, - "%s(%d) width_main=%ld was %ld, width_sub=%ld was %ld\n", __FILE__, __LINE__, - width_main, width_main_prev, width_sub, width_sub_prev); - update_occurred = 1; - width_main_prev = width_main; - width_sub_prev = width_sub; - } - } - - if (rig->caps->get_split_vfo) - { - vfo_t tx_vfo; - result = rig_get_split_vfo(rig, RIG_VFO_A, &split, &tx_vfo); - - if (result != RIG_OK) - { - rig_debug(RIG_DEBUG_ERR, "%s(%d): rig_get_modeA error %s\n", __FILE__, __LINE__, - rigerror(result)); - } - - if (split != split_prev) - { - rig_debug(RIG_DEBUG_CACHE, "%s(%d) split=%d was %d\n", __FILE__, __LINE__, - split, - split_prev); - update_occurred = 1; - split_prev = split; - } - } -#endif - if (update_occurred) { network_publish_rig_poll_data(rig); commit 5d7db6b516affc9a4e1c6e6f6cba393bbe49a077 Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Nov 8 17:14:10 2023 -0600 Fix FLRig SWR value Change float level print to %g format for better appearance https://github.com/Hamlib/Hamlib/issues/1417 diff --git a/rigs/dummy/flrig.c b/rigs/dummy/flrig.c index 5c0b6fcd8..60dd8b5cf 100644 --- a/rigs/dummy/flrig.c +++ b/rigs/dummy/flrig.c @@ -23,6 +23,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> /* String function definitions */ +#include <math.h> #include <hamlib/rig.h> #include <serial.h> @@ -138,7 +139,7 @@ const struct rig_caps flrig_caps = RIG_MODEL(RIG_MODEL_FLRIG), .model_name = "FLRig", .mfg_name = "FLRig", - .version = "20231107.0", + .version = "20231108.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -2111,6 +2112,39 @@ static int flrig_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) RETURNFUNC(RIG_OK); } +typedef struct { + float mtr; + float swr; +} swrpair; + +static swrpair swrtbl[] = { + {0.0, 1.0}, + {10.5, 1.5}, + {23.0, 2.0}, + {35.0, 2.5}, + {48.0, 3.0}, + {100.0, 10.0 } // assuming 10.0 is infinity for FLRig +}; + +// Function to interpolate SWR from MTR +float interpolateSWR(float mtr) { + int i; + for (i = 0; i < sizeof(swrtbl)/sizeof(swrpair) - 1; i++) { + if (mtr == swrtbl[i].mtr) { + // Exact match + return swrtbl[i].swr; + } + if (mtr < swrtbl[i + 1].mtr) { + // Perform linear interpolation + float slope = (swrtbl[i + 1].swr - swrtbl[i].swr) / (swrtbl[i + 1].mtr - swrtbl[i].mtr); + float swr = round((swrtbl[i].swr + slope * (mtr - swrtbl[i].mtr))*10)/10.0; + rig_debug(RIG_DEBUG_VERBOSE,"%s: swr=%f\n", __func__, swr); + return swr; + } + } + // If mtr is not within the range of values in the table, you could choose to return an error or extrapolate + return 10; // Example er +} /* * flrig_get_level * Assumes rig!=NULL, rig->state.priv!=NULL, val!=NULL @@ -2161,6 +2195,11 @@ static int flrig_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) // most levels are 0-100 -- may have to allow for different ranges switch (level) { + case RIG_LEVEL_SWR: + { + val->f = interpolateSWR(atoi(value)); + break; + } case RIG_LEVEL_STRENGTH: val->i = atoi(value) - 54; //if (val->i > 0) val->i /= 10; diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index 668034b8b..c47a87fe6 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -1952,7 +1952,7 @@ int print_conf_list(const struct confparams *cfp, rig_ptr_t data) cfp->u.n.step); break; case RIG_CONF_NUMERIC: - printf("\tRange: %.1f..%.1f, step %.1f\n", + printf("\tRange: %g..%g, step %.1f\n", cfp->u.n.min, cfp->u.n.max, cfp->u.n.step); @@ -3287,7 +3287,7 @@ declare_proto_rig(set_level) break; case RIG_CONF_NUMERIC: - CHKSCN1ARG(sscanf(arg2, "%f", &val.f)); + CHKSCN1ARG(sscanf(arg2, "%g", &val.f)); break; case RIG_CONF_STRING: @@ -3393,7 +3393,7 @@ declare_proto_rig(get_level) break; case RIG_CONF_NUMERIC: - fprintf(fout, "%f%c", val.f, resp_sep); + fprintf(fout, "%g%c", val.f, resp_sep); break; case RIG_CONF_INT: @@ -3445,7 +3445,7 @@ declare_proto_rig(get_level) if (RIG_LEVEL_IS_FLOAT(level)) { - fprintf(fout, "%f%c", val.f, resp_sep); + fprintf(fout, "%g%c", val.f, resp_sep); } else { @@ -3629,7 +3629,7 @@ declare_proto_rig(set_parm) break; case RIG_CONF_NUMERIC: - CHKSCN1ARG(sscanf(arg2, "%f", &val.f)); + CHKSCN1ARG(sscanf(arg2, "%g", &val.f)); break; case RIG_CONF_STRING: @@ -3747,7 +3747,7 @@ declare_proto_rig(get_parm) break; case RIG_CONF_NUMERIC: - fprintf(fout, "%f%c", val.f, resp_sep); + fprintf(fout, "%g%c", val.f, resp_sep); break; case RIG_CONF_STRING: @@ -4442,7 +4442,7 @@ int dump_chan(FILE *fout, RIG *rig, channel_t *chan) break; case RIG_CONF_NUMERIC: - SNPRINTF(lstr, sizeof(lstr), "%f", chan->ext_levels[idx].val.f); + SNPRINTF(lstr, sizeof(lstr), "%g", chan->ext_levels[idx].val.f); break; case RIG_CONF_CHECKBUTTON: commit f1a9823bddf2dd93e781bbc6fe9ef0a46335a639 Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Nov 8 08:05:56 2023 -0600 Move swr from rig_cache to priv value until we get rig_cache fixed to be expandable https://github.com/Hamlib/Hamlib/issues/1419 diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index bc16a1f0c..590e91e67 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -2478,6 +2478,7 @@ typedef enum { * \brief Rig cache data * * This struct contains all the items we cache at the highest level + * DO NOT MODIFY THIS STRUCTURE AT ALL -- we need a new cache that is a pointer rather than a structure */ struct rig_cache { int timeout_ms; // the cache timeout for invalidating itself @@ -2551,7 +2552,6 @@ struct rig_cache { struct timespec time_ptt; struct timespec time_split; int satmode; // if rig is in satellite mode - double swr; // keep swr }; /** diff --git a/rigs/kenwood/flex6xxx.c b/rigs/kenwood/flex6xxx.c index 3a6b1d113..0510ceac8 100644 --- a/rigs/kenwood/flex6xxx.c +++ b/rigs/kenwood/flex6xxx.c @@ -94,7 +94,8 @@ static struct kenwood_priv_caps powersdr_priv_caps = { .cmdtrm = EOM_KEN, .mode_table = powersdr_mode_table, - .if_len = 37 + .if_len = 37, + .swr = 0 }; #define DSP_BW_NUM 8 @@ -839,16 +840,17 @@ int powersdr_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) case RIG_LEVEL_SWR: { + struct kenwood_priv_caps *priv = kenwood_caps(rig); ptt_t ptt = 0; rig_get_ptt(rig, RIG_VFO_CURR, &ptt); - if (ptt == RIG_PTT_OFF) { val->f = rig->state.cache.swr; return RIG_OK;} + if (ptt == RIG_PTT_OFF) { val->f = priv->swr; return RIG_OK;} cmd = "ZZRM8"; // get SWR len = 5; ans = 8; retval = kenwood_transaction(rig, cmd, lvlbuf, sizeof(lvlbuf)); - if (retval != RIG_OK) { val->f = rig->state.cache.swr; return RIG_OK;}; - sscanf(lvlbuf,"ZZRM8%lg", &rig->state.cache.swr); - val->f = rig->state.cache.swr; + if (retval != RIG_OK) { val->f = priv->swr; return RIG_OK;}; + sscanf(lvlbuf,"ZZRM8%lg", &priv->swr); + val->f = priv->swr; rig_debug(RIG_DEBUG_ERR, "%s(%d) swr=%.1f\n", __func__, __LINE__, val->f); return RIG_OK; } diff --git a/rigs/kenwood/kenwood.h b/rigs/kenwood/kenwood.h index c455685ff..cfb5df20b 100644 --- a/rigs/kenwood/kenwood.h +++ b/rigs/kenwood/kenwood.h @@ -135,6 +135,7 @@ struct kenwood_priv_caps struct kenwood_filter_width *filter_width; /* Last entry should have value == -1 and width_hz == -1 */ struct kenwood_slope_filter *slope_filter_high; /* Last entry should have value == -1 and frequency_hz == -1 */ struct kenwood_slope_filter *slope_filter_low; /* Last entry should have value == -1 and frequency_hz == -1 */ + double swr; }; struct kenwood_priv_data commit 62341a657efcce90af1f897861b20572d0e3f4a9 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Nov 7 16:05:27 2023 -0600 Only allow SWR read when ptt is on for PowerSDR https://github.com/Hamlib/Hamlib/issues/1417 diff --git a/rigs/kenwood/flex6xxx.c b/rigs/kenwood/flex6xxx.c index 1ff71288e..3a6b1d113 100644 --- a/rigs/kenwood/flex6xxx.c +++ b/rigs/kenwood/flex6xxx.c @@ -839,6 +839,9 @@ int powersdr_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) case RIG_LEVEL_SWR: { + ptt_t ptt = 0; + rig_get_ptt(rig, RIG_VFO_CURR, &ptt); + if (ptt == RIG_PTT_OFF) { val->f = rig->state.cache.swr; return RIG_OK;} cmd = "ZZRM8"; // get SWR len = 5; ans = 8; commit 02b4da83c3c34330ca796942f7e0698fb0a86464 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Nov 7 16:00:31 2023 -0600 Fix PowerSDR swr reading -- then we can fix FLRig's read too https://github.com/Hamlib/Hamlib/issues/1417 diff --git a/rigs/kenwood/flex6xxx.c b/rigs/kenwood/flex6xxx.c index 98699b212..1ff71288e 100644 --- a/rigs/kenwood/flex6xxx.c +++ b/rigs/kenwood/flex6xxx.c @@ -839,24 +839,14 @@ int powersdr_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) case RIG_LEVEL_SWR: { - // if not PTT we'll return the last SWR value - // seems desirable to able to see this always - ptt_t ptt; - rig_get_ptt(rig, RIG_VFO_TX, &ptt); - if (!ptt) { val->f = rig->state.cache.swr; return RIG_OK; } - double forward=0, reverse=0; - cmd = "ZZRM5"; // get forward power + cmd = "ZZRM8"; // get SWR len = 5; - ans = 4; - retval = kenwood_safe_transaction(rig, cmd, lvlbuf, sizeof(lvlbuf), len + ans); - if (retval != RIG_OK) { val->f = 0; return RIG_OK;}; - sscanf(lvlbuf,"ZZRM5%lg", &forward); - if (forward == 0) { val->f = 1.0; return RIG_OK;} - cmd = "ZZRM7"; - retval = kenwood_safe_transaction(rig, cmd, lvlbuf, sizeof(lvlbuf), len + ans); - if (retval != RIG_OK) { val->f = 0; return RIG_OK;}; - sscanf(lvlbuf,"ZZRM7%lg", &reverse); - rig->state.cache.swr = val->f = (1.0 + sqrt(reverse/forward)) / (1.0 - sqrt(reverse/forward)); + ans = 8; + retval = kenwood_transaction(rig, cmd, lvlbuf, sizeof(lvlbuf)); + if (retval != RIG_OK) { val->f = rig->state.cache.swr; return RIG_OK;}; + sscanf(lvlbuf,"ZZRM8%lg", &rig->state.cache.swr); + val->f = rig->state.cache.swr; + rig_debug(RIG_DEBUG_ERR, "%s(%d) swr=%.1f\n", __func__, __LINE__, val->f); return RIG_OK; } @@ -1350,7 +1340,7 @@ const struct rig_caps powersdr_caps = RIG_MODEL(RIG_MODEL_POWERSDR), .model_name = "PowerSDR/Thetis", .mfg_name = "FlexRadio/ANAN", - .version = "20231104.0", + .version = "20231107.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, commit a5bac081908255fe71dc06d934ef418821b50364 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Nov 7 12:32:47 2023 -0600 Add SWR to flrig diff --git a/rigs/dummy/flrig.c b/rigs/dummy/flrig.c index 8e649a3ef..5c0b6fcd8 100644 --- a/rigs/dummy/flrig.c +++ b/rigs/dummy/flrig.c @@ -51,7 +51,7 @@ RIG_MODE_FM | RIG_MODE_WFM | RIG_MODE_FMN | RIG_MODE_PKTFM |\ RIG_MODE_C4FM) -#define FLRIG_LEVELS (RIG_LEVEL_AF | RIG_LEVEL_RF | RIG_LEVEL_MICGAIN | RIG_LEVEL_STRENGTH | RIG_LEVEL_RFPOWER_METER | RIG_LEVEL_RFPOWER_METER_WATTS | RIG_LEVEL_RFPOWER) +#define FLRIG_LEVELS (RIG_LEVEL_AF | RIG_LEVEL_RF | RIG_LEVEL_MICGAIN | RIG_LEVEL_STRENGTH | RIG_LEVEL_RFPOWER_METER | RIG_LEVEL_RFPOWER_METER_WATTS | RIG_LEVEL_RFPOWER | RIG_LEVEL_SWR) #define FLRIG_PARM (TOK_FLRIG_VERIFY_FREQ|TOK_FLRIG_VERIFY_PTT) @@ -138,7 +138,7 @@ const struct rig_caps flrig_caps = RIG_MODEL(RIG_MODEL_FLRIG), .model_name = "FLRig", .mfg_name = "FLRig", - .version = "20231010.0", + .version = "20231107.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -2137,6 +2137,8 @@ static int flrig_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) case RIG_LEVEL_STRENGTH: cmd = "rig.get_smeter"; break; + case RIG_LEVEL_SWR: cmd = "rig.get_swrmeter"; break; + case RIG_LEVEL_RFPOWER: cmd = "rig.get_power"; break; case RIG_LEVEL_RFPOWER_METER_WATTS: commit 7c3e71a487fd600591d299794fa2c3c28e79147a Merge: 4aa8e010a 162a68588 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Nov 7 07:55:10 2023 -0600 Merge branch 'master' of https://github.com/Hamlib/Hamlib commit 162a685887d9cdd18dc17f557edbb117694b38f5 Merge: 45dca3be5 afdb26093 Author: Michael Black <mdb...@ya...> Date: Tue Nov 7 07:54:55 2023 -0600 Merge pull request #1416 from mikaelnousiainen/hamlib-multicast-3 List all available VFOs in multicast state snapshot packets commit afdb26093e6fe0eeafabcbad6b48859f928b7e47 Author: Mikael Nousiainen <mik...@ik...> Date: Tue Nov 7 09:55:30 2023 +0200 List all available VFOs in multicast state snapshot packets diff --git a/src/snapshot_data.c b/src/snapshot_data.c index 8d99af7e9..a32ad1ff5 100644 --- a/src/snapshot_data.c +++ b/src/snapshot_data.c @@ -10,8 +10,6 @@ #include "cJSON.h" -#define MAX_VFO_COUNT 4 - #define SPECTRUM_MODE_FIXED "FIXED" #define SPECTRUM_MODE_CENTER "CENTER" @@ -87,7 +85,6 @@ static int snapshot_serialize_rig(cJSON *rig_node, RIG *rig) } cJSON_AddItemToObject(rig_node, "modes", modes_array); - //RETURNFUNC2(RIG_OK); return RIG_OK; error: @@ -157,9 +154,13 @@ static int snapshot_serialize_vfo(cJSON *vfo_node, RIG *rig, vfo_t vfo) ptt = rig->state.cache.ptt; if (is_tx) - node = cJSON_AddBoolToObject(vfo_node, "ptt", ptt == RIG_PTT_OFF ? 0 : 1); - else - node = cJSON_AddBoolToObject(vfo_node, "ptt", 0); + { + node = cJSON_AddBoolToObject(vfo_node, "ptt", ptt == RIG_PTT_OFF ? 0 : 1); + } + else + { + node = cJSON_AddBoolToObject(vfo_node, "ptt", 0); + } if (node == NULL) { @@ -181,7 +182,6 @@ static int snapshot_serialize_vfo(cJSON *vfo_node, RIG *rig, vfo_t vfo) goto error; } - //RETURNFUNC2(RIG_OK); return RIG_OK; error: @@ -309,7 +309,6 @@ static int snapshot_serialize_spectrum(cJSON *spectrum_node, RIG *rig, goto error; } - //RETURNFUNC2(RIG_OK); return RIG_OK; error: @@ -329,15 +328,9 @@ int snapshot_serialize(size_t buffer_length, char *buffer, RIG *rig, cJSON *node; cJSON_bool bool_result; char buf[256]; - - int vfo_count = 2; - vfo_t vfos[MAX_VFO_COUNT]; int result; int i; - vfos[0] = RIG_VFO_A; - vfos[1] = RIG_VFO_B; - root_node = cJSON_CreateObject(); if (root_node == NULL) @@ -408,10 +401,16 @@ int snapshot_serialize(size_t buffer_length, char *buffer, RIG *rig, goto error; } - for (i = 0; i < vfo_count; i++) + for (i = 0; i < HAMLIB_MAX_VFOS; i++) { + vfo_t vfo = rig->state.vfo_list & RIG_VFO_N(i); + if (!vfo) + { + continue; + } + vfo_node = cJSON_CreateObject(); - result = snapshot_serialize_vfo(vfo_node, rig, vfos[i]); + result = snapshot_serialize_vfo(vfo_node, rig, vfo); if (result != RIG_OK) { @@ -459,7 +458,6 @@ int snapshot_serialize(size_t buffer_length, char *buffer, RIG *rig, rig->state.snapshot_packet_sequence_number++; - //RETURNFUNC2(RIG_OK); return RIG_OK; error: commit 4aa8e010a1653574bbf582fe9b102cb2464bff01 Merge: 49e93f309 45dca3be5 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Nov 5 22:38:55 2023 -0600 Merge branch 'master' of https://github.com/Hamlib/Hamlib commit 45dca3be598c028f08e6db1edb0a7e78525c2fe2 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Nov 5 17:34:49 2023 -0600 Add dumpcap include files to test/Makefile.am diff --git a/tests/Makefile.am b/tests/Makefile.am index b2ec16650..11831e511 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -19,8 +19,8 @@ bin_PROGRAMS = rigctl rigctld rigmem rigsmtr rigswr rotctl rotctld rigctlcom rig #check_PROGRAMS = dumpmem testrig testrigopen testrigcaps testtrn testbcd testfreq listrigs testloc rig_bench testcache cachetest cachetest2 testcookie testgrid testsecurity check_PROGRAMS = dumpmem testrig testrigopen testrigcaps testtrn testbcd testfreq listrigs testloc rig_bench testcache cachetest cachetest2 testcookie testgrid hamlibmodels testmW2power -RIGCOMMONSRC = rigctl_parse.c rigctl_parse.h dumpcaps.c dumpstate.c uthash.h rig_tests.c rig_tests.h -ROTCOMMONSRC = rotctl_parse.c rotctl_parse.h dumpcaps_rot.c uthash.h +RIGCOMMONSRC = rigctl_parse.c rigctl_parse.h dumpcaps.c dumpstate.c uthash.h rig_tests.c rig_tests.h dumpcaps.h +ROTCOMMONSRC = rotctl_parse.c rotctl_parse.h dumpcaps_rot.c uthash.h dumpcaps_rot.h AMPCOMMONSRC = ampctl_parse.c ampctl_parse.h dumpcaps_amp.c uthash.h rigctl_SOURCES = rigctl.c $(RIGCOMMONSRC) commit 49e93f3090f0dd32a2fbf752ab43d5872e58e52b Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Nov 5 17:16:09 2023 -0600 Comment out lines on compile warning diff --git a/src/event.c b/src/event.c index 6f70e37af..12feca650 100644 --- a/src/event.c +++ b/src/event.c @@ -69,10 +69,10 @@ void *rig_poll_routine(void *arg) rig_poll_routine_args *args = (rig_poll_routine_args *)arg; RIG *rig = args->rig; struct rig_state *rs = &rig->state; - int result; + //int result; int update_occurred; - vfo_t vfo = RIG_VFO_NONE, vfo_prev = RIG_VFO_NONE; + //vfo_t vfo = RIG_VFO_NONE, vfo_prev = RIG_VFO_NONE; freq_t freq_main_a = 0, freq_main_b = 0, freq_main_c = 0, freq_sub_a = 0, freq_sub_b = 0, freq_sub_c = 0; rmode_t mode_main_a = 0, mode_main_b = 0, mode_main_c = 0, mode_sub_a = 0, mode_sub_b = 0, mode_sub_c = 0; pbwidth_t width_main_a = 0, width_main_b = 0, width_main_c = 0, width_sub_a = 0, width_sub_b = 0, width_sub_c = 0; commit 02ffc6d6dcaa34100e2b7ff93e7713999505c45c Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Nov 5 17:03:21 2023 -0600 More set_conf/get_conf work https://github.com/Hamlib/Hamlib/issues/971 diff --git a/src/network.c b/src/network.c index c4754cbd1..a68329149 100644 --- a/src/network.c +++ b/src/network.c @@ -999,15 +999,19 @@ void *multicast_receiver(void *arg) __LINE__); int optval = 1; +#ifdef __MINGW32__ + if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, (PCHAR)&optval, sizeof(optval)) < 0) +#else if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) +#endif { rig_debug(RIG_DEBUG_ERR, "%s: error enabling UDP address reuse: %s\n", __func__, strerror(errno)); return NULL; } -#if defined(SO_REUSEPORT) // Windows does not have SO_REUSEPORT. However, SO_REUSEADDR works in a similar way. +#if defined(SO_REUSEPORT) if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval)) < 0) { rig_debug(RIG_DEBUG_ERR, "%s: error enabling UDP port reuse: %s\n", __func__, @@ -1038,7 +1042,11 @@ 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__ + if (setsockopt(socket_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (PCHAR)&mreq, sizeof(mreq)) < 0) +#else if (setsockopt(socket_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) +#endif { rig_debug(RIG_DEBUG_ERR, "%s: error joining multicast group %s:%d: %s\n", __func__, args->multicast_addr, args->multicast_port, strerror(err... [truncated message content] |
From: n0nb <n0...@us...> - 2023-09-04 10:37:47
|
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 2e3e0df4d6be4bd9aad2f0a155ee2370a45959a0 (commit) via 5963e149a97470d87bc4873748c76dc1bff31cd5 (commit) via 5d12e5f8bd5b2f36dd5cd178afc339240af33bf3 (commit) via 6e7aec3077da74b74cfc53beb32ae174b7260406 (commit) via 875214eb54a78146ac4b45a485fe314575ebeca5 (commit) via 8ede3518f1f2891654cab7190227f9c20e6fbabe (commit) via 42b6fb13f998a8ba5a28ee2457cb70ced954d7a3 (commit) via c1f24b2f7adf062d3378fed01ba042e53e2654c1 (commit) from 897faf00c08028c6f6567bf12cf309c7787b1fc6 (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 2e3e0df4d6be4bd9aad2f0a155ee2370a45959a0 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Aug 29 07:45:42 2023 -0500 Remove debug from serial.c diff --git a/src/serial.c b/src/serial.c index 23ccd1af8..cad1baa33 100644 --- a/src/serial.c +++ b/src/serial.c @@ -772,7 +772,7 @@ int HAMLIB_API serial_flush(hamlib_port_t *p) } timeout_save = p->timeout; - rig_debug(RIG_DEBUG_ERR, "%s: p->timeout=%d\n", __func__, p->timeout); + //rig_debug(RIG_DEBUG_ERR, "%s: p->timeout=%d\n", __func__, p->timeout); timeout_retry_save = p->timeout_retry; p->timeout = 0; p->timeout_retry = 0; commit 5963e149a97470d87bc4873748c76dc1bff31cd5 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Aug 28 23:34:28 2023 -0500 Fix IC-590 filter byte https://github.com/Hamlib/Hamlib/issues/1375 diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index 305731f03..9bbc86454 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -1345,7 +1345,7 @@ int icom_set_freq(RIG *rig, vfo_t vfo, freq_t freq) if (RIG_IS_IC905) { - // 10Hz resolution and > 5.85MHz is 6 bytes + // > 5.85GHz is 6 bytes if (freq > 5.85e9) { freq_len = 6; } } @@ -2241,6 +2241,7 @@ int icom_set_mode_with_data(RIG *rig, vfo_t vfo, rmode_t mode, || RIG_IS_IC9100 || RIG_IS_IC9700 || RIG_IS_IC705 + || RIG_IS_IC905 || RIG_IS_X6100; ENTERFUNC; diff --git a/simulators/simic905.c b/simulators/simic905.c index f9cfe2f56..4f6476a2d 100644 --- a/simulators/simic905.c +++ b/simulators/simic905.c @@ -32,7 +32,7 @@ vfo_t current_vfo = RIG_VFO_A; int split = 0; // we make B different from A to ensure we see a difference at startup -double freqA = 1407400; +double freqA = 145123456; double freqB = 1407450; mode_t modeA = RIG_MODE_PKTUSB; mode_t modeB = RIG_MODE_PKTUSB; @@ -50,6 +50,14 @@ int agc_time = 1; int ovf_status = 0; int powerstat = 1; int keyspd = 25; +int datamode = 0; +int filter = 0; + +int WRITE(int fd, unsigned char* buf, int buflen) +{ + dump_hex(buf,buflen); + return write(fd,buf,buflen); +} void dumphex(unsigned char *buf, int n) { @@ -121,22 +129,22 @@ void frameParse(int fd, unsigned char *frame, int len) int freq_len = 5; if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { - if (freqA > 5.85e5) freq_len = 6; + if (freqA > 5.85e9) freq_len = 6; printf("get_freqA len=%d\n", freq_len); to_bcd(&frame[5], (long long)freqA, freq_len * 2); } else { - if (freqB > 5.85e5) freq_len = 6; + if (freqB > 5.85e9) freq_len = 6; printf("get_freqB len=%d\n", freq_len); to_bcd(&frame[5], (long long)freqB, freq_len * 2); } - frame[4+freq_len] = 0xfd; + frame[5+freq_len] = 0xfd; if (powerstat) { - n = write(fd, frame, 11); + n = WRITE(fd, frame, 11); } break; @@ -156,7 +164,7 @@ void frameParse(int fd, unsigned char *frame, int len) } frame[7] = 0xfd; - n = write(fd, frame, 8); + n = WRITE(fd, frame, 8); break; case 0x05: @@ -168,7 +176,7 @@ void frameParse(int fd, unsigned char *frame, int len) frame[4] = 0xfb; frame[5] = 0xfd; - n = write(fd, frame, 6); + n = WRITE(fd, frame, 6); break; case 0x06: @@ -177,7 +185,7 @@ void frameParse(int fd, unsigned char *frame, int len) frame[4] = 0xfb; frame[5] = 0xfd; - n = write(fd, frame, 6); + n = WRITE(fd, frame, 6); break; case 0x07: @@ -197,7 +205,7 @@ void frameParse(int fd, unsigned char *frame, int len) frame[4] = 0xfb; frame[5] = 0xfd; - n = write(fd, frame, 6); + n = WRITE(fd, frame, 6); break; case 0x0f: @@ -206,7 +214,7 @@ void frameParse(int fd, unsigned char *frame, int len) printf("get split %d\n", split); frame[5] = split; frame[6] = 0xfd; - n = write(fd, frame, 7); + n = WRITE(fd, frame, 7); } else { @@ -214,7 +222,7 @@ void frameParse(int fd, unsigned char *frame, int len) split = frame[5]; frame[4] = 0xfb; frame[5] = 0xfd; - n = write(fd, frame, 6); + n = WRITE(fd, frame, 6); } break; @@ -235,9 +243,9 @@ void frameParse(int fd, unsigned char *frame, int len) frame[5] = ant_curr; frame[6] = ant_option; frame[7] = 0xfd; - printf("write 8 bytes\n"); + printf("WRITE 8 bytes\n"); dump_hex(frame, 8); - n = write(fd, frame, 8); + n = WRITE(fd, frame, 8); break; case 0x14: @@ -251,7 +259,7 @@ void frameParse(int fd, unsigned char *frame, int len) { frame[6] = 0xfb; dumphex(frame, 7); - n = write(fd, frame, 7); + n = WRITE(fd, frame, 7); printf("ACK x14 x08\n"); } else @@ -259,7 +267,7 @@ void frameParse(int fd, unsigned char *frame, int len) to_bcd(&frame[6], (long long)128, 2); frame[8] = 0xfb; dumphex(frame, 9); - n = write(fd, frame, 9); + n = WRITE(fd, frame, 9); printf("SEND x14 x08\n"); } @@ -273,7 +281,7 @@ void frameParse(int fd, unsigned char *frame, int len) to_bcd(&frame[6], (long long)power_level, 2); frame[8] = 0xfd; - n = write(fd, frame, 9); + n = WRITE(fd, frame, 9); break; case 0x0c: @@ -285,14 +293,14 @@ void frameParse(int fd, unsigned char *frame, int len) printf("subcmd=0x0c #1\n"); keyspd = from_bcd(&frame[6], 2); frame[6] = 0xfb; - n = write(fd, frame, 7); + n = WRITE(fd, frame, 7); } else { printf("subcmd=0x0c #1\n"); to_bcd(&frame[6], keyspd, 2); frame[8] = 0xfd; - n = write(fd, frame, 9); + n = WRITE(fd, frame, 9); } break; @@ -309,7 +317,7 @@ void frameParse(int fd, unsigned char *frame, int len) case 0x07: frame[6] = ovf_status; frame[7] = 0xfd; - n = write(fd, frame, 8); + n = WRITE(fd, frame, 8); ovf_status = ovf_status == 0 ? 1 : 0; break; @@ -321,7 +329,7 @@ void frameParse(int fd, unsigned char *frame, int len) to_bcd(&frame[6], (long long)meter_level, 2); frame[8] = 0xfd; - n = write(fd, frame, 9); + n = WRITE(fd, frame, 9); break; } @@ -337,7 +345,7 @@ void frameParse(int fd, unsigned char *frame, int len) { frame[6] = satmode; frame[7] = 0xfd; - n = write(fd, frame, 8); + n = WRITE(fd, frame, 8); } break; @@ -348,13 +356,13 @@ void frameParse(int fd, unsigned char *frame, int len) case 0x18: // miscellaneous things frame[5] = 1; frame[6] = 0xfd; - n = write(fd, frame, 7); + n = WRITE(fd, frame, 7); break; case 0x19: // miscellaneous things frame[5] = 0x94; frame[6] = 0xfd; - n = write(fd, frame, 7); + n = WRITE(fd, frame, 7); break; case 0x1a: // miscellaneous things @@ -365,7 +373,7 @@ void frameParse(int fd, unsigned char *frame, int len) else { frame[6] = widthB; } frame[7] = 0xfd; - n = write(fd, frame, 8); + n = WRITE(fd, frame, 8); break; case 0x04: // AGC TIME @@ -375,7 +383,7 @@ void frameParse(int fd, unsigned char *frame, int len) { frame[6] = agc_time; frame[7] = 0xfd; - n = write(fd, frame, 8); + n = WRITE(fd, frame, 8); } else { @@ -383,15 +391,31 @@ void frameParse(int fd, unsigned char *frame, int len) agc_time = frame[6]; frame[4] = 0xfb; frame[5] = 0xfd; - n = write(fd, frame, 6); + n = WRITE(fd, frame, 6); } break; + case 0x06: // datamode + if (frame[5] == 0xfd) + { + frame[6] = datamode; + frame[7] = filter; + frame[8] = 0xfd; + n = WRITE(fd, frame, 9); + } + else + { + datamode = frame[6]; + filter = frame[7]; + frame[4] = 0xfb; + frame[5] = 0xfd; + n = WRITE(fd, frame, 6); + } case 0x07: // satmode frame[4] = 0; frame[7] = 0xfd; - n = write(fd, frame, 8); + n = WRITE(fd, frame, 8); break; } @@ -404,16 +428,22 @@ void frameParse(int fd, unsigned char *frame, int len) case 0: if (frame[6] == 0xfd) { + int tmp = frame[2]; + frame[2] = frame[3]; + frame[3] = tmp; frame[6] = ptt; frame[7] = 0xfd; - n = write(fd, frame, 8); + n = WRITE(fd, frame, 8); } else { ptt = frame[6]; - frame[7] = 0xfb; - frame[8] = 0xfd; - n = write(fd, frame, 9); + int tmp = frame[2]; + frame[2] = frame[3]; + frame[3] = tmp; + frame[4] = 0xfb; + frame[5] = 0xfd; + n = WRITE(fd, frame, 6); } break; @@ -431,18 +461,21 @@ void frameParse(int fd, unsigned char *frame, int len) int freq_len = 5; if (frame[5] == 0x00) { - if (freqA > 5.85e5) freq_len = 6; + if (freqA > 5.85e9) freq_len = 6; to_bcd(&frame[6], (long long)freqA, freq_len * 2); printf("X25 get_freqA=%.0f\n", freqA); + frame[6+freq_len] = 0xfd; + n = WRITE(fd, frame, 7+freq_len); } else { - if (freqB > 5.85e5) freq_len = 6; + if (freqB > 5.85e9) freq_len = 6; to_bcd(&frame[6], (long long)freqB, freq_len * 2); printf("X25 get_freqB=%.0f\n", freqB); + frame[6+freq_len] = 0xfd; + n = WRITE(fd, frame, 7+freq_len); } - frame[6+freq_len] = 0xfd; //unsigned char frame2[12]; #if 0 @@ -458,9 +491,8 @@ void frameParse(int fd, unsigned char *frame, int len) frame2[9] = 0x00; frame2[10] = 0x00; frame2[11] = 0xfd; - n = write(fd, frame2, 12); + n = WRITE(fd, frame2, 12); #endif - n = write(fd, frame, 7+freq_len); } else { @@ -472,9 +504,12 @@ void frameParse(int fd, unsigned char *frame, int len) if (frame[5] == 0x00) { freqA = freq; } else { freqB = freq; } + int tmp = frame[2]; + frame[2] = frame[3]; + frame[3] = tmp; frame[4] = 0xfb; frame[5] = 0xfd; - n = write(fd, frame, 6); + n = WRITE(fd, frame, 6); #if 0 // send async frame frame[2] = 0x00; // async freq @@ -486,7 +521,7 @@ void frameParse(int fd, unsigned char *frame, int len) frame[8] = 0x96; frame[9] = 0x12; frame[10] = 0xfd; - n = write(fd, frame, 11); + n = WRITE(fd, frame, 11); #endif } @@ -503,7 +538,7 @@ void frameParse(int fd, unsigned char *frame, int len) frame[7] = frame[5] == 0 ? datamodeA : datamodeB; frame[8] = frame[5] == 0 ? filterA : filterB; frame[9] = 0xfd; - n = write(fd, frame, 10); + n = WRITE(fd, frame, 10); } else { @@ -522,7 +557,7 @@ void frameParse(int fd, unsigned char *frame, int len) frame[4] = 0xfb; frame[5] = 0xfd; - n = write(fd, frame, 6); + n = WRITE(fd, frame, 6); } printf("\n"); @@ -533,14 +568,14 @@ void frameParse(int fd, unsigned char *frame, int len) printf("x25 send nak\n"); frame[4] = 0xfa; frame[5] = 0xfd; - n = write(fd, frame, 6); + n = WRITE(fd, frame, 6); break; case 0x26: printf("x26 send nak\n"); frame[4] = 0xfa; frame[5] = 0xfd; - n = write(fd, frame, 6); + n = WRITE(fd, frame, 6); break; #endif commit 5d12e5f8bd5b2f36dd5cd178afc339240af33bf3 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Aug 27 15:43:28 2023 -0500 Fix IC-905 10Ghz+ set/get freq and lower frequencies too https://github.com/Hamlib/Hamlib/issues/1375 diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index f049c77e8..305731f03 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -1347,7 +1347,6 @@ int icom_set_freq(RIG *rig, vfo_t vfo, freq_t freq) { // 10Hz resolution and > 5.85MHz is 6 bytes if (freq > 5.85e9) { freq_len = 6; } - freq /= 10; } /* @@ -1799,8 +1798,6 @@ int icom_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) if (freq_len == 3) { *freq *= 10000; } // 3-byte freq for ID5100 is in 10000Hz units so convert to Hz -if (RIG_IS_IC905) { *freq *= 10; } - if (vfo == RIG_VFO_MEM && civ_731_mode) { priv->civ_731_mode = 1; } switch (vfo) diff --git a/simulators/simic7300.c b/simulators/simic7300.c index 86283a01c..978f72a8f 100644 --- a/simulators/simic7300.c +++ b/simulators/simic7300.c @@ -540,9 +540,8 @@ case 0x26: frame[6] = frame[5] == 0 ? modeA : modeB; frame[7] = frame[5] == 0 ? datamodeA : datamodeB; - frame[8] = 0xfb; - frame[9] = 0xfd; - n = write(fd, frame, 10); + frame[8] = 0xfd; + n = write(fd, frame, 9); } else { diff --git a/simulators/simic7851.c b/simulators/simic7851.c index 53fb10d27..41d76e25b 100644 --- a/simulators/simic7851.c +++ b/simulators/simic7851.c @@ -33,10 +33,12 @@ int split = 0; // we make B different from A to ensure we see a difference at startup float freqA = 14074000; float freqB = 14074500; -mode_t modeA = RIG_MODE_PKTUSB; -mode_t modeB = RIG_MODE_PKTUSB; -int datamodeA = 0; -int datamodeB = 0; +mode_t modeA = 1; +mode_t modeB = 0; +int datamodeA = 2; +int datamodeB = 1; +int filterA = 3; +int filterB = 2; pbwidth_t widthA = 0; pbwidth_t widthB = 1; ant_t ant_curr = 0; @@ -49,8 +51,9 @@ int powerstat = 1; int datamode = 0; int keyspd = 130; // 130=20WPM int attenuator; -int filterA = 2; -int filterB = 3; +int notch = 0; +int speechcompressor = 0; +int vox = 0; void dumphex(unsigned char *buf, int n) { @@ -75,7 +78,8 @@ again: if (c == 0xfd) { - dumphex(buf, i); +// printf("Read: "); +// dumphex(buf, i); return i; } @@ -105,7 +109,7 @@ void frameParse(int fd, unsigned char *frame, int len) double freq; int n = 0; - dumphex(frame, len); + //dumphex(frame, len); if (frame[0] != 0xfe && frame[1] != 0xfe) { @@ -114,7 +118,7 @@ void frameParse(int fd, unsigned char *frame, int len) return; } - int echo = 1; + int echo = 0; if (echo) { @@ -131,12 +135,12 @@ void frameParse(int fd, unsigned char *frame, int len) //from_bcd(frameackbuf[2], (civ_731_mode ? 4 : 5) * 2); if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { - printf("get_freqA\n"); + //printf("get_freqA\n"); to_bcd(&frame[5], (long long)freqA, (civ_731_mode ? 4 : 5) * 2); } else { - printf("get_freqB\n"); + //printf("get_freqB\n"); to_bcd(&frame[5], (long long)freqB, (civ_731_mode ? 4 : 5) * 2); } @@ -152,13 +156,13 @@ void frameParse(int fd, unsigned char *frame, int len) case 0x04: if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { - printf("get_modeA\n"); + //printf("get_modeA\n"); frame[5] = modeA; frame[6] = widthA; } else { - printf("get_modeB\n"); + //printf("get_modeB\n"); frame[5] = modeB; frame[6] = widthB; } @@ -169,7 +173,7 @@ void frameParse(int fd, unsigned char *frame, int len) case 0x05: freq = from_bcd(&frame[5], (civ_731_mode ? 4 : 5) * 2); - printf("set_freq to %.0f\n", freq); + //printf("set_freq to %.0f\n", freq); if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { freqA = freq; } else { freqB = freq; } @@ -190,12 +194,12 @@ void frameParse(int fd, unsigned char *frame, int len) case 0x07: - printf("******* [5] = 0x07\n"); + //printf("******* [5] = 0x07\n"); switch (frame[5]) { case 0xd2: - printf("******* [6] = 0x07\n"); + //printf("******* [6] = 0x07\n"); switch (frame[6]) { @@ -205,11 +209,11 @@ void frameParse(int fd, unsigned char *frame, int len) } } - printf("set_vfo to %s\n", rig_strvfo(current_vfo)); + //printf("set_vfo to %s\n", rig_strvfo(current_vfo)); frame[4] = 0xfb; frame[5] = 0xfd; - printf("0x07 0xd2 answer: \n"); + //printf("0x07 0xd2 answer: \n"); dump_hex(frame, 6); n = write(fd, frame, 6); break; @@ -221,13 +225,13 @@ void frameParse(int fd, unsigned char *frame, int len) if (frame[5] == 0xfd) { - printf("get split %d\n", 1); + //printf("get split %d\n", 1); frame[7] = 0xfd; n = write(fd, frame, 8); } else { - printf("set split %d\n", 1); + //printf("set split %d\n", 1); frame[4] = 0xfb; frame[5] = 0xfd; n = write(fd, frame, 6); @@ -245,37 +249,36 @@ void frameParse(int fd, unsigned char *frame, int len) } else { - frame[6] = attenuator; - frame[7] = 0xfd; - n = write(fd, frame, 8); + frame[5] = attenuator; + frame[6] = 0xfd; + n = write(fd, frame, 7); } break; - case 0x12: // we're simulating the 3-byte version -- not the 2-byte if (frame[5] != 0xfd) { - printf("Set ant %d\n", -1); + //printf("Set ant %d\n", -1); ant_curr = frame[5]; ant_option = frame[6]; dump_hex(frame, 8); } else { - printf("Get ant\n"); + //printf("Get ant\n"); } frame[5] = ant_curr; frame[6] = ant_option; frame[7] = 0xfd; - printf("write 8 bytes\n"); + //printf("write 8 bytes\n"); dump_hex(frame, 8); n = write(fd, frame, 8); break; case 0x14: - printf("******** 0x14 received frame[5]=0x%02x\n", frame[5]); + //printf("******** 0x14 received frame[5]=0x%02x\n", frame[5]); switch (frame[5]) { @@ -285,28 +288,28 @@ void frameParse(int fd, unsigned char *frame, int len) case 0x08: if (frame[6] != 0xfd) { - printf("DEBUG#1\n"); + //printf("DEBUG#1\n"); frame[4] = 0xfb; frame[5] = 0xfd; dumphex(frame, 6); n = write(fd, frame, 6); - printf("ACK x14 x08\n"); + //printf("ACK x14 x08\n"); } else { - printf("DEBUG#2\n"); + //printf("DEBUG#2\n"); to_bcd(&frame[6], (long long)128, 2); frame[8] = 0xfb; frame[9] = 0xfd; dumphex(frame, 10); n = write(fd, frame, 10); - printf("SEND x14 x08\n"); + //printf("SEND x14 x08\n"); } break; case 0x0a: - printf("Using power level %d\n", power_level); + //printf("Using power level %d\n", power_level); power_level += 10; if (power_level > 250) { power_level = 0; } @@ -331,7 +334,7 @@ void frameParse(int fd, unsigned char *frame, int len) break; default: - printf("*********** NAK\n"); + //printf("*********** NAK\n"); frame[5] = 0xfa; frame[6] = 0xfd; n = write(fd, frame, 7); @@ -353,7 +356,7 @@ void frameParse(int fd, unsigned char *frame, int len) break; case 0x11: - printf("Using meter level %d\n", meter_level); + //printf("Using meter level %d\n", meter_level); meter_level += 10; if (meter_level > 250) { meter_level = 0; } @@ -374,6 +377,51 @@ void frameParse(int fd, unsigned char *frame, int len) case 0x16: switch (frame[5]) { + case 0x44: + if (frame[6] == 0xfe) + { + frame[6] = speechcompressor; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + speechcompressor = frame[6]; + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + break; + case 0x46: + if (frame[6] == 0xfe) + { + frame[6] = vox; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + vox = frame[6]; + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + break; + case 0x48: + if (frame[6] == 0xfe) + { + frame[6] = notch; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + notch = frame[6]; + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + break; case 0x5a: if (frame[6] == 0xfe) { @@ -415,7 +463,7 @@ void frameParse(int fd, unsigned char *frame, int len) break; case 0x04: // AGC TIME - printf("frame[6]==x%02x, frame[7]=0%02x\n", frame[6], frame[7]); + //printf("frame[6]==x%02x, frame[7]=0%02x\n", frame[6], frame[7]); if (frame[6] == 0xfd) // the we are reading { @@ -425,7 +473,7 @@ void frameParse(int fd, unsigned char *frame, int len) } else { - printf("AGC_TIME RESPONSE******************************"); + //printf("AGC_TIME RESPONSE******************************"); agc_time = frame[6]; frame[4] = 0xfb; frame[5] = 0xfd; @@ -494,12 +542,12 @@ void frameParse(int fd, unsigned char *frame, int len) if (frame[5] == 0x00) { to_bcd(&frame[6], (long long)freqA, (civ_731_mode ? 4 : 5) * 2); - printf("X25 get_freqA=%.0f\n", freqA); + //printf("X25 get_freqA=%.0f\n", freqA); } else { to_bcd(&frame[6], (long long)freqB, (civ_731_mode ? 4 : 5) * 2); - printf("X25 get_freqB=%.0f\n", freqB); + //printf("X25 get_freqB=%.0f\n", freqB); } frame[11] = 0xfd; @@ -524,7 +572,7 @@ void frameParse(int fd, unsigned char *frame, int len) else { freq = from_bcd(&frame[6], (civ_731_mode ? 4 : 5) * 2); - printf("set_freq to %.0f\n", freq); + //printf("set_freq to %.0f\n", freq); if (frame[5] == 0x00) { freqA = freq; } else { freqB = freq; } @@ -548,31 +596,36 @@ void frameParse(int fd, unsigned char *frame, int len) break; case 0x26: - for (int i = 0; i < 6; ++i) { printf("%02x:", frame[i]); } + for (int i = 0; i < 7; ++i) { printf("%02x:", frame[i]); } if (frame[6] == 0xfd) // then a query { - for (int i = 0; i < 6; ++i) { printf("%02x:", frame[i]); } - + printf("GET MODE XXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"); +// fe fe e0 8e 26 00 01 00 fd fd frame[6] = frame[5] == 0 ? modeA : modeB; frame[7] = frame[5] == 0 ? datamodeA : datamodeB; frame[8] = frame[5] == 0 ? filterA : filterB; frame[9] = 0xfd; + printf("x26 response: "); + dumphex(frame, 10); n = write(fd, frame, 10); } else { + printf("SET MODE YYYYYYYYYYYYYYYYYYYYYYYYYYYYY\n"); for (int i = 0; i < 12; ++i) { printf("%02x:", frame[i]); } - if (frame[6] == 0) + if (frame[5] == 0) { - modeA = frame[7]; - datamodeA = frame[8]; + modeA = frame[6]; + datamodeA = frame[7]; + filterA = frame[8]; } else { - modeB = frame[7]; - datamodeB = frame[8]; + modeB = frame[6]; + datamodeB = frame[7]; + filterB = frame[8]; } frame[4] = 0xfb; @@ -701,7 +754,7 @@ int main(int argc, char **argv) hl_usleep(1000 * 1000); } - rigStatus(); + //rigStatus(); } return 0; diff --git a/simulators/simic905.c b/simulators/simic905.c index be90e4666..f9cfe2f56 100644 --- a/simulators/simic905.c +++ b/simulators/simic905.c @@ -32,12 +32,14 @@ vfo_t current_vfo = RIG_VFO_A; int split = 0; // we make B different from A to ensure we see a difference at startup -float freqA = 14074000; -float freqB = 14074500; +double freqA = 1407400; +double freqB = 1407450; mode_t modeA = RIG_MODE_PKTUSB; mode_t modeB = RIG_MODE_PKTUSB; int datamodeA = 0; int datamodeB = 0; +int filterA = 1; +int filterB = 2; pbwidth_t widthA = 0; pbwidth_t widthB = 1; ant_t ant_curr = 0; @@ -47,6 +49,7 @@ int satmode = 0; int agc_time = 1; int ovf_status = 0; int powerstat = 1; +int keyspd = 25; void dumphex(unsigned char *buf, int n) { @@ -115,18 +118,21 @@ void frameParse(int fd, unsigned char *frame, int len) case 0x03: //from_bcd(frameackbuf[2], (civ_731_mode ? 4 : 5) * 2); + int freq_len = 5; if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { - printf("get_freqA\n"); - to_bcd(&frame[5], (long long)freqA, (civ_731_mode ? 4 : 5) * 2); + if (freqA > 5.85e5) freq_len = 6; + printf("get_freqA len=%d\n", freq_len); + to_bcd(&frame[5], (long long)freqA, freq_len * 2); } else { - printf("get_freqB\n"); - to_bcd(&frame[5], (long long)freqB, (civ_731_mode ? 4 : 5) * 2); + if (freqB > 5.85e5) freq_len = 6; + printf("get_freqB len=%d\n", freq_len); + to_bcd(&frame[5], (long long)freqB, freq_len * 2); } - frame[10] = 0xfd; + frame[4+freq_len] = 0xfd; if (powerstat) { @@ -182,9 +188,9 @@ void frameParse(int fd, unsigned char *frame, int len) case 0x01: current_vfo = RIG_VFO_B; break; - case 0xd0: current_vfo = RIG_VFO_MAIN; break; + case 0xa0: freqB = freqA;modeB = modeA; break; - case 0xd1: current_vfo = RIG_VFO_SUB; break; + case 0xb0: current_vfo = RIG_VFO_SUB; exit(1);break; } printf("set_vfo to %s\n", rig_strvfo(current_vfo)); @@ -195,19 +201,17 @@ void frameParse(int fd, unsigned char *frame, int len) break; case 0x0f: - if (frame[5] == 0) { split = 0; } - else if (frame[5] == 1) { split = 1; } - else { frame[6] = split; } - if (frame[5] == 0xfd) { - printf("get split %d\n", 1); - frame[7] = 0xfd; - n = write(fd, frame, 8); + printf("get split %d\n", split); + frame[5] = split; + frame[6] = 0xfd; + n = write(fd, frame, 7); } else { printf("set split %d\n", 1); + split = frame[5]; frame[4] = 0xfb; frame[5] = 0xfd; n = write(fd, frame, 6); @@ -271,10 +275,32 @@ void frameParse(int fd, unsigned char *frame, int len) frame[8] = 0xfd; n = write(fd, frame, 9); break; + + case 0x0c: + dumphex(frame, 10); + printf("subcmd=0x0c #1\n"); + + if (frame[6] != 0xfd) // then we have data + { + printf("subcmd=0x0c #1\n"); + keyspd = from_bcd(&frame[6], 2); + frame[6] = 0xfb; + n = write(fd, frame, 7); + } + else + { + printf("subcmd=0x0c #1\n"); + to_bcd(&frame[6], keyspd, 2); + frame[8] = 0xfd; + n = write(fd, frame, 9); + } + + break; } break; + case 0x15: switch (frame[5]) { @@ -402,20 +428,24 @@ void frameParse(int fd, unsigned char *frame, int len) case 0x25: if (frame[6] == 0xfd) { + int freq_len = 5; if (frame[5] == 0x00) { - to_bcd(&frame[6], (long long)freqA, 6 * 2); + if (freqA > 5.85e5) freq_len = 6; + to_bcd(&frame[6], (long long)freqA, freq_len * 2); printf("X25 get_freqA=%.0f\n", freqA); } else { - to_bcd(&frame[6], (long long)freqB, 6 * 2); + if (freqB > 5.85e5) freq_len = 6; + to_bcd(&frame[6], (long long)freqB, freq_len * 2); printf("X25 get_freqB=%.0f\n", freqB); } - frame[12] = 0xfd; - unsigned char frame2[12]; + frame[6+freq_len] = 0xfd; + //unsigned char frame2[12]; +#if 0 frame2[0] = 0xfe; frame2[1] = 0xfe; frame2[2] = 0x00; // send transceive frame @@ -429,11 +459,14 @@ void frameParse(int fd, unsigned char *frame, int len) frame2[10] = 0x00; frame2[11] = 0xfd; n = write(fd, frame2, 12); - n = write(fd, frame, 13); +#endif + n = write(fd, frame, 7+freq_len); } else { - freq = from_bcd(&frame[6], (civ_731_mode ? 4 : 5) * 2); + int freq_len = 5; + if (frame[11] != 0xfd) freq_len = 6; + freq = from_bcd(&frame[6], freq_len * 2); printf("set_freq to %.0f\n", freq); if (frame[5] == 0x00) { freqA = freq; } @@ -442,6 +475,7 @@ void frameParse(int fd, unsigned char *frame, int len) frame[4] = 0xfb; frame[5] = 0xfd; n = write(fd, frame, 6); +#if 0 // send async frame frame[2] = 0x00; // async freq frame[3] = 0xa2; @@ -453,6 +487,7 @@ void frameParse(int fd, unsigned char *frame, int len) frame[9] = 0x12; frame[10] = 0xfd; n = write(fd, frame, 11); +#endif } break; @@ -466,7 +501,7 @@ void frameParse(int fd, unsigned char *frame, int len) frame[6] = frame[5] == 0 ? modeA : modeB; frame[7] = frame[5] == 0 ? datamodeA : datamodeB; - frame[8] = 0xfb; + frame[8] = frame[5] == 0 ? filterA : filterB; frame[9] = 0xfd; n = write(fd, frame, 10); } commit 6e7aec3077da74b74cfc53beb32ae174b7260406 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Aug 27 12:33:11 2023 -0500 Fix IC905 test for 5.8GHz (not MHz) vi simic905.c diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index fcdc196ee..f049c77e8 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -1346,8 +1346,8 @@ int icom_set_freq(RIG *rig, vfo_t vfo, freq_t freq) if (RIG_IS_IC905) { // 10Hz resolution and > 5.85MHz is 6 bytes - freq /= 10; - if (freq > 5.85e6) { freq_len = 6; } + if (freq > 5.85e9) { freq_len = 6; } + freq /= 10; } /* @@ -1355,7 +1355,6 @@ int icom_set_freq(RIG *rig, vfo_t vfo, freq_t freq) */ to_bcd(freqbuf, freq, freq_len * 2); - // mike if (rig->caps->targetable_vfo & RIG_TARGETABLE_FREQ) { vfo_t vfo_unselected = RIG_VFO_B | RIG_VFO_SUB | RIG_VFO_SUB_B | RIG_VFO_MAIN_B @@ -1834,8 +1833,8 @@ default: rig_strvfo(vfo)); } - rig_debug(RIG_DEBUG_VERBOSE, "%s exit vfo=%s, curr_vfo=%s\n", __func__, - rig_strvfo(vfo), rig_strvfo(rig->state.current_vfo)); + rig_debug(RIG_DEBUG_VERBOSE, "%s exit vfo=%s, curr_vfo=%s ,freq=%g\n", __func__, + rig_strvfo(vfo), rig_strvfo(rig->state.current_vfo), *freq); RETURNFUNC2(RIG_OK); } commit 875214eb54a78146ac4b45a485fe314575ebeca5 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Aug 27 12:08:00 2023 -0500 Fix IC-905 set_freq -- get_freq should be working https://github.com/Hamlib/Hamlib/issues/1375 diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index daecdbf03..fcdc196ee 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -1343,7 +1343,12 @@ int icom_set_freq(RIG *rig, vfo_t vfo, freq_t freq) freq_len = priv->civ_731_mode ? 4 : 5; - if (RIG_IS_IC905) { freq /= 10; freq_len = 6; } + if (RIG_IS_IC905) + { + // 10Hz resolution and > 5.85MHz is 6 bytes + freq /= 10; + if (freq > 5.85e6) { freq_len = 6; } + } /* * to_bcd requires nibble len commit 8ede3518f1f2891654cab7190227f9c20e6fbabe Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Aug 26 16:06:20 2023 -0500 Remove VFO_OP_XCHG from IC-905 as it's not working in firmware V1.11 anymore https://github.com/Hamlib/Hamlib/issues/1374 diff --git a/rigs/icom/ic7300.c b/rigs/icom/ic7300.c index 59acc14d5..e4da8a97f 100644 --- a/rigs/icom/ic7300.c +++ b/rigs/icom/ic7300.c @@ -135,6 +135,10 @@ int ic9700_set_vfo(RIG *rig, vfo_t vfo); } } +/* + * IC905 items that differ from IC7300 + */ +#define IC905_VFO_OPS (RIG_OP_CPY|RIG_OP_FROM_VFO|RIG_OP_TO_VFO|RIG_OP_MCL|RIG_OP_TUNE) /* * IC705 items that differ from IC7300 */ @@ -1523,7 +1527,7 @@ const struct rig_caps ic905_caps = RIG_MODEL(RIG_MODEL_IC905), .model_name = "IC-905", .mfg_name = "Icom", - .version = BACKEND_VER ".0", + .version = BACKEND_VER ".1", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -1576,7 +1580,7 @@ const struct rig_caps ic905_caps = .agc_level_count = 3, .agc_levels = { RIG_AGC_OFF, RIG_AGC_FAST, RIG_AGC_MEDIUM, RIG_AGC_SLOW }, .targetable_vfo = RIG_TARGETABLE_FREQ | RIG_TARGETABLE_MODE, - .vfo_ops = IC7300_VFO_OPS, + .vfo_ops = IC905_VFO_OPS, .scan_ops = IC7300_SCAN_OPS, .transceive = RIG_TRN_RIG, .bank_qty = 5, commit 42b6fb13f998a8ba5a28ee2457cb70ced954d7a3 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Aug 26 10:13:54 2023 -0500 Remove hamlib/config.h from nobase_include_HEADERS https://github.com/Hamlib/Hamlib/issues/1373 diff --git a/include/Makefile.am b/include/Makefile.am index 324c082f4..bba8cdc13 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -3,4 +3,4 @@ noinst_HEADERS = bandplan.h num_stdio.h nobase_include_HEADERS = hamlib/rig.h hamlib/riglist.h hamlib/rig_dll.h \ hamlib/rotator.h hamlib/rotlist.h hamlib/rigclass.h \ hamlib/rotclass.h hamlib/amplifier.h hamlib/amplist.h \ - hamlib/ampclass.h hamlib/config.h hamlib/multicast.h + hamlib/ampclass.h hamlib/multicast.h commit c1f24b2f7adf062d3378fed01ba042e53e2654c1 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Aug 25 15:36:12 2023 -0500 Fix TS2000 SA command diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index 77480f5b3..883507a01 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -1262,7 +1262,7 @@ int kenwood_set_vfo(RIG *rig, vfo_t vfo) rig_debug(RIG_DEBUG_VERBOSE, "%s: checking satellite mode status\n", __func__); SNPRINTF(cmdbuf, sizeof(cmdbuf), "SA"); - retval = kenwood_transaction(rig, cmdbuf, retbuf, 4); + retval = kenwood_transaction(rig, cmdbuf, retbuf, 18); if (retval != RIG_OK) { @@ -5330,6 +5330,7 @@ int kenwood_send_morse(RIG *rig, vfo_t vfo, const char *msg) /* * kenwood_stop_morse + / */ int kenwood_stop_morse(RIG *rig, vfo_t vfo) { diff --git a/rigs/kenwood/kenwood.h b/rigs/kenwood/kenwood.h index 0fbaaa79f..33dafa3e7 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 "20230821" +#define BACKEND_VER "20230825" #define EOM_KEN ';' #define EOM_TH '\r' ----------------------------------------------------------------------- Summary of changes: include/Makefile.am | 2 +- rigs/icom/ic7300.c | 8 ++- rigs/icom/icom.c | 14 ++-- rigs/kenwood/kenwood.c | 3 +- rigs/kenwood/kenwood.h | 2 +- simulators/simic7300.c | 5 +- simulators/simic7851.c | 151 +++++++++++++++++++++++++++-------------- simulators/simic905.c | 178 ++++++++++++++++++++++++++++++++++--------------- src/serial.c | 2 +- 9 files changed, 247 insertions(+), 118 deletions(-) hooks/post-receive -- Hamlib -- Ham radio control libraries |
From: n0nb <n0...@us...> - 2023-08-24 17:39:04
|
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 897faf00c08028c6f6567bf12cf309c7787b1fc6 (commit) via d049b90aa9041ea6821f88ce92617425e9efffad (commit) via ccab50a7df42dcd9b937c17cdd8cf602a9d22dea (commit) via 470c71dd93633d484525835de5bb438baa48f17e (commit) via 46c0649b234163f4d08927d173d505168ef93436 (commit) via 404ceb8c4b11ff54bfe76cfa2240a8878fc882f2 (commit) via 453a8cc94f98131b04bd136155d9df7523faf393 (commit) via 5113c6a895766ba32bb2aeaa3f04b2a6cac2f175 (commit) via 194906b2900366ea73327252d379e0330edb1fb5 (commit) via 24e407c82c358b09e7714c301bf2d398607b71cb (commit) via 7011b4855461a1fa178e7ddc9469b8826c220ad1 (commit) via cca3891362a0efd56e47eaa10c00bf419bedd215 (commit) via 1b0f0ec42201e418ebcdfa66ad0645ceed069348 (commit) via b40da0f6b0f07d19b79a0869d6fe522037dc3e5f (commit) via 424e8cc04a67bbb240efa2a14c44922eed352bd8 (commit) via 1ad43a44ba437ea095061ec289e51457a2335306 (commit) via 3492be25625a54a1331ac58a2b6daf680217b1e6 (commit) via af86f44eac92b526b017c73a81a72b7265459888 (commit) via d57e4ae185ddf5a1dc5971a080af8984187f2a03 (commit) via 3318766a7c9efcb23c522551fe111d395291e586 (commit) via 3814f2dadf53e2806130934cc8be09027ae3d1ec (commit) via 36dade6e6c25b7c2e8a322960fe045ac1a30f043 (commit) via 57ebd647ebc09c091fd43df2cb662d7ed35e05ab (commit) via 7bd9cbef83681468102dfafd6b2aa3792c4f5a13 (commit) via 7eefc77f5d50cf9198067c9fd879665f8a84da7e (commit) from 4faef9e0316fd118e114c2794baff5b19cadfbf3 (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 897faf00c08028c6f6567bf12cf309c7787b1fc6 Merge: 46c0649b2 d049b90aa Author: Michael Black <mdb...@ya...> Date: Tue Aug 22 22:25:48 2023 -0500 Merge pull request #1349 from torque/spid-logfix spid: handle a control stream containing log packets commit d049b90aa9041ea6821f88ce92617425e9efffad Author: torque <to...@us...> Date: Tue Aug 22 17:24:29 2023 -0700 spid: flush serial input buffer before command send This seems to take care of the log data pretty much entirely and is possibly a much simpler alternative solution to the previous two commits. However, for full robustness, I think it makes sense to keep all three of these changes together. Also, it's entirely possible that this approach introduces a performance regression: I haven't particularly looked at how the buffer flushing is implemented, but if it ends up doing looped reads with a timeout, this could slow down command processing for the SPID object significantly. Since I've only tested this through the command line interface, I have not taken a close look at performance. diff --git a/rotators/spid/spid.c b/rotators/spid/spid.c index 7c4100bd7..c2f68a9a7 100644 --- a/rotators/spid/spid.c +++ b/rotators/spid/spid.c @@ -168,6 +168,14 @@ static int read_r2p_frame(hamlib_port_t *port, unsigned char *rxbuffer, } } +static int spid_write(hamlib_port_t *p, const unsigned char *txbuffer, + size_t count) +{ + int ret = rig_flush(p); + if (ret < 0) return ret; + return write_block(p, txbuffer, count); +} + static int spid_rot_init(ROT *rot) { rig_debug(RIG_DEBUG_TRACE, "%s called\n", __func__); @@ -310,7 +318,7 @@ static int spid_rot1prog_rot_set_position(ROT *rot, azimuth_t az, cmdstr[11] = 0x2F; /* K */ cmdstr[12] = 0x20; /* END */ - retval = write_block(&rs->rotport, (unsigned char *) cmdstr, 13); + retval = spid_write(&rs->rotport, (unsigned char *) cmdstr, 13); if (retval != RIG_OK) { @@ -337,7 +345,7 @@ static int spid_rot2prog_rot_set_position(ROT *rot, azimuth_t az, { do { - retval = write_block(&rs->rotport, + retval = spid_write(&rs->rotport, (unsigned char *) "\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1F\x20", 13); if (retval != RIG_OK) @@ -378,7 +386,7 @@ static int spid_rot2prog_rot_set_position(ROT *rot, azimuth_t az, cmdstr[11] = 0x2F; /* K */ cmdstr[12] = 0x20; /* END */ - retval = write_block(&rs->rotport, (unsigned char *) cmdstr, 13); + retval = spid_write(&rs->rotport, (unsigned char *) cmdstr, 13); if (retval != RIG_OK) { @@ -412,7 +420,7 @@ static int spid_rot_get_position(ROT *rot, azimuth_t *az, elevation_t *el) do { - retval = write_block(&rs->rotport, + retval = spid_write(&rs->rotport, (unsigned char *) "\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1F\x20", 13); if (retval != RIG_OK) @@ -484,7 +492,7 @@ static int spid_rot_stop(ROT *rot) do { - retval = write_block(&rs->rotport, + retval = spid_write(&rs->rotport, (unsigned char *) "\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0F\x20", 13); if (retval != RIG_OK) @@ -559,7 +567,7 @@ static int spid_md01_rot2prog_rot_move(ROT *rot, int direction, int speed) moving at all), always send the stop command first. */ spid_rot_stop(rot); - retval = write_block(&rs->rotport, (unsigned char *) cmdstr, 13); + retval = spid_write(&rs->rotport, (unsigned char *) cmdstr, 13); return retval; } commit ccab50a7df42dcd9b937c17cdd8cf602a9d22dea Author: torque <to...@us...> Date: Tue Aug 22 17:23:19 2023 -0700 spid: account for another type of debug message When the settings are saved via the front panel on the MD-01, the following debug messages are printed on COM 0: thread_motionController: settings changed!\r\n thread_protocols: settings changed!\r\n Notably, because these aren't timestamped the way the other debug messages are, they were missing the our debug message sieve and causing protocol errors. Address this by treating anything that doesn't start with the ROT2PROG start byte ('W') as a log frame. diff --git a/rotators/spid/spid.c b/rotators/spid/spid.c index fe46b5af1..7c4100bd7 100644 --- a/rotators/spid/spid.c +++ b/rotators/spid/spid.c @@ -94,12 +94,16 @@ static int read_r2p_frame(hamlib_port_t *port, unsigned char *rxbuffer, // strict numerical bounds that could be used to sanity check the contents // of the reply frame). - int res = 0; unsigned char peek = 0; enum r2p_frame_parser_state pstate = ROT2PROG_PARSER_EXPECT_FRAME_START; - while (1) { + // This will loop infinitely in the case of a badly-behaved serial device + // that is producing log-like frames faster than we can consume them. + // However, this is not expected to be a practical possibility, and there's + // no concrete loop bounds we can use. + while (1) + { switch (pstate) { case ROT2PROG_PARSER_EXPECT_FRAME_START: @@ -108,27 +112,14 @@ static int read_r2p_frame(hamlib_port_t *port, unsigned char *rxbuffer, switch (peek) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': { - pstate = ROT2PROG_PARSER_EXPECT_CR; - break; - } - - case ROT2PROG_FRAME_START_BYTE: { + case ROT2PROG_FRAME_START_BYTE: rxbuffer[0] = peek; pstate = ROT2PROG_PARSER_EXPECT_FRAME_END; break; - } - default: return -RIG_EPROTO; + default: + pstate = ROT2PROG_PARSER_EXPECT_CR; + break; } break; @@ -168,10 +159,11 @@ static int read_r2p_frame(hamlib_port_t *port, unsigned char *rxbuffer, return -RIG_EPROTO; } - // lie about the number of bytes read + // account for the already-read start byte here return res + 1; - default: return -RIG_EINTERNAL; + default: + return -RIG_EINTERNAL; } } } commit 470c71dd93633d484525835de5bb438baa48f17e Author: torque <to...@us...> Date: Mon Jul 31 23:27:56 2023 -0700 spid: handle a control stream containing log packets I have an MD-01 controller running firmware 2.0.237 that is connected to the computer via the COM0 DB9 port. When it receives a control command to move the rotator, it prints debug logs to the serial output that look like this: input: W3600\x0A4500\x0A\x2F\x20 output: W\x03\x06\x00\x00\x0A\x04\x05\x01\x00\x0A\x20 287925671: in motion\r\n 287925673: Change motion state M0 to mcsStart\r\n 287925678: GO A 0.000000 0.000000 t ---\r\n 287925680: in motion\r\n 287925683: Change motion state M1 to mcsStart\r\n 287925686: GO E 90.000000 91.000000 t ---\r\n 287925690: distance to go M0 too small. End.\r\n 287925694: Change motion state M0 to mcsStopped\r\n 287925698: Stop on motor 0 on angle 0.000000\r\n 287925703: Change motion state M1 to mcsRunning\r\n 287926610: distance to go M1 too small. End.\r\n 287926613: Change motion state M1 to mcsStopped\r\n 287926617: Stop on motor 1 on angle 90.000000\r\n Note that the response frame is not necessarily present in an specific order relative to the log messages: I have seen it come after the logs as well. Because the current implementation just slurps up response bytes without checking the framing or anything, as soon as any of this log data enters the command stream, all subsequent commands will read completely bogus responses. Regardless of whether it's due to a misconfiguration, a weird artifact of the firmware, or something more sinister, the MD-01 is awkwardly interspersing its normal fixed-size-frame response with these line-based log messages. As shown above, the log messages appear to be consistently of the format <timestamp>: <message>\r\n, where <timestamp> is some kind of integer timestamp (possibly relative to unit boot) and <message> is an ASCII string. Due to poor(?) design decisions by the protocol designers, the frame start and end bytes are both printable ASCII characters ('W' and ' ' respectively) and the MD-01 response frame contains no other validation information (such as a CRC), which means that a valid log line could fairly easily contain a character sequence that is indistinguishable from a valid response frame, without actually being a valid response frame. However, since the log messages appear to be reasonably strictly structured, we can make a small number of assumptions that will allow us to reliably separate response frames from log lines without having to fall back on a heuristic-based parsing strategy. These assumptions are as follows: 1. A log line will always begin with an ASCII character in the range [0-9], none of which are the frame start byte. 2. A log line will never contain \r\n in the middle of the line (i.e. multi-line log messages do not exist). This means a log "frame" will always be of the form [0-9]<anything>\r\n. 3. The controller will not emit a response frame in the middle of a log line. 4. The operating system's serial port read buffer is large enough that we won't lose data while accumulating log messages between commands. Provided the above assumptions are true, a simple state machine can be used to parse the response by treating the log lines as a different type of frame. This could be made much more robust by applying additional heuristics for specific packets (e.g. get_position has some reasonably strict numerical bounds that could be used to sanity check the contents of the reply frame). diff --git a/rotators/spid/spid.c b/rotators/spid/spid.c index 072d019ca..fe46b5af1 100644 --- a/rotators/spid/spid.c +++ b/rotators/spid/spid.c @@ -39,6 +39,143 @@ struct spid_rot2prog_priv_data int el_resolution; }; +enum spid_rot2prog_framemagic { + ROT2PROG_FRAME_START_BYTE = 'W', + ROT2PROG_FRAME_END_BYTE = ' ', +}; + +enum r2p_frame_parser_state { + ROT2PROG_PARSER_EXPECT_FRAME_START, + ROT2PROG_PARSER_EXPECT_CR, + ROT2PROG_PARSER_EXPECT_LF, + ROT2PROG_PARSER_EXPECT_FRAME_END, +}; + +static int read_r2p_frame(hamlib_port_t *port, unsigned char *rxbuffer, + size_t count) +{ + // Some MD-01 firmware can apparently print debug messages to the same + // serial port that is used for the control protocol. This awkwardly + // intersperses the normal fixed-size frame response with a line-based + // logs. Theoretically, a valid response frame will not actually be emitted + // in the middle of a log message. + // + // Log messages are of the format <timestamp>: <message>\r\n, where + // <timestamp> is a unix-ish timestamp (inasmuch as it is an integer) and + // <message> is an ASCII string. + + // Due to poor(?) design decisions by the protocol designers, the frame + // start and end bytes are both printable ASCII characters ('W' and ' ' + // respectively) and the MD-01 response frame contains no other validation + // information (such as a CRC), which means that a valid log line can + // contain a character sequence that is indistinguishable from a valid + // response frame, without actually being a valid response frame. + + // However, since the log messages appear to be reasonably strictly + // structured, we can make a small number of assumptions that will allow us + // to reliably separate response frames from log lines without having to + // fall back on a heuristic-based parsing strategy. These assumptions are + // as follows: + + // 1. A log line will always begin with an ASCII character in the range + // [0-9], none of which are the frame start byte. + // 2. A log line will never contain \r\n in the middle of the line (i.e. + // multi-line log messages do not exist). This means a log "frame" will + // always be of the form [0-9]<anything>\r\n. + // 3. The controller will not emit a response frame in the middle of a log + // line. + // 4. The operating system's serial port read buffer is large enough that we + // won't lose data while accumulating log messages between commands. + + // Provided the above assumptions are true, a simple state machine can be + // used to parse the response by treating the log lines as a different type + // of frame. This could be made much more robust by applying additional + // heuristics for specific packets (e.g. get_position has some reasonably + // strict numerical bounds that could be used to sanity check the contents + // of the reply frame). + + + int res = 0; + unsigned char peek = 0; + enum r2p_frame_parser_state pstate = ROT2PROG_PARSER_EXPECT_FRAME_START; + + while (1) { + switch (pstate) + { + case ROT2PROG_PARSER_EXPECT_FRAME_START: + res = read_block(port, &peek, 1); + if (res < 0) return res; + + switch (peek) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': { + pstate = ROT2PROG_PARSER_EXPECT_CR; + break; + } + + case ROT2PROG_FRAME_START_BYTE: { + rxbuffer[0] = peek; + pstate = ROT2PROG_PARSER_EXPECT_FRAME_END; + break; + } + + default: return -RIG_EPROTO; + } + break; + + case ROT2PROG_PARSER_EXPECT_CR: + res = read_block(port, &peek, 1); + if (res < 0) return res; + + if (peek == '\r') pstate = ROT2PROG_PARSER_EXPECT_LF; + break; + + case ROT2PROG_PARSER_EXPECT_LF: + res = read_block(port, &peek, 1); + if (res < 0) return res; + + if (peek == '\n') + { + pstate = ROT2PROG_PARSER_EXPECT_FRAME_START; + } + else + { + // we have stumbled across a \r that is not immediately + // followed by \n. We could assume this is a weirdly formed + // log message, but I think it makes more sense to be + // defensive here and assume it is invalid for this to + // happen. + return -RIG_EPROTO; + } + break; + + case ROT2PROG_PARSER_EXPECT_FRAME_END: + // we already read the frame start byte + res = read_block(port, rxbuffer + 1, count - 1); + if (res < 0) return res; + + if (rxbuffer[count - 1] != ROT2PROG_FRAME_END_BYTE) + { + return -RIG_EPROTO; + } + + // lie about the number of bytes read + return res + 1; + + default: return -RIG_EINTERNAL; + } + } +} + static int spid_rot_init(ROT *rot) { rig_debug(RIG_DEBUG_TRACE, "%s called\n", __func__); @@ -217,7 +354,7 @@ static int spid_rot2prog_rot_set_position(ROT *rot, azimuth_t az, } memset(cmdstr, 0, 12); - retval = read_block(&rs->rotport, (unsigned char *) cmdstr, 12); + retval = read_r2p_frame(&rs->rotport, (unsigned char *) cmdstr, 12); } while (retval < 0 && retry_read++ < rot->state.rotport.retry); @@ -264,7 +401,7 @@ static int spid_rot2prog_rot_set_position(ROT *rot, azimuth_t az, do { - retval = read_block(&rs->rotport, (unsigned char *) cmdstr, 12); + retval = read_r2p_frame(&rs->rotport, (unsigned char *) cmdstr, 12); } while ((retval < 0) && (retry_read++ < rot->state.rotport.retry)); } @@ -295,12 +432,12 @@ static int spid_rot_get_position(ROT *rot, azimuth_t *az, elevation_t *el) if (rot->caps->rot_model == ROT_MODEL_SPID_ROT1PROG) { - retval = read_block(&rs->rotport, (unsigned char *) posbuf, 5); + retval = read_r2p_frame(&rs->rotport, (unsigned char *) posbuf, 5); } else if (rot->caps->rot_model == ROT_MODEL_SPID_ROT2PROG || rot->caps->rot_model == ROT_MODEL_SPID_MD01_ROT2PROG) { - retval = read_block(&rs->rotport, (unsigned char *) posbuf, 12); + retval = read_r2p_frame(&rs->rotport, (unsigned char *) posbuf, 12); } else { @@ -367,12 +504,12 @@ static int spid_rot_stop(ROT *rot) if (rot->caps->rot_model == ROT_MODEL_SPID_ROT1PROG) { - retval = read_block(&rs->rotport, (unsigned char *) posbuf, 5); + retval = read_r2p_frame(&rs->rotport, (unsigned char *) posbuf, 5); } else if (rot->caps->rot_model == ROT_MODEL_SPID_ROT2PROG || rot->caps->rot_model == ROT_MODEL_SPID_MD01_ROT2PROG) { - retval = read_block(&rs->rotport, (unsigned char *) posbuf, 12); + retval = read_r2p_frame(&rs->rotport, (unsigned char *) posbuf, 12); } } while (retval < 0 && retry_read++ < rot->state.rotport.retry); commit 46c0649b234163f4d08927d173d505168ef93436 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Aug 21 16:33:53 2023 -0500 Fix spacing in k3/k4_stop_morse https://github.com/Hamlib/Hamlib/issues/1366 diff --git a/rigs/kenwood/k3.c b/rigs/kenwood/k3.c index 7298999ad..760dc1b46 100644 --- a/rigs/kenwood/k3.c +++ b/rigs/kenwood/k3.c @@ -2912,7 +2912,7 @@ int k4_stop_voice_mem(RIG *rig, vfo_t vfo) int k4_stop_morse(RIG *rig, vfo_t vfo) { int retval; - retval = kenwood_transaction(rig, "KY@;", NULL, 0); + retval = kenwood_transaction(rig, "KY @;", NULL, 0); return retval; } @@ -2920,7 +2920,7 @@ int k3_stop_morse(RIG *rig, vfo_t vfo) { int retval; char cmd[32]; - SNPRINTF(cmd,sizeof(cmd),"KY%c;", 0x04); + SNPRINTF(cmd,sizeof(cmd),"KY %c;", 0x04); retval = kenwood_transaction(rig, cmd, NULL, 0); return retval; } commit 404ceb8c4b11ff54bfe76cfa2240a8878fc882f2 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Aug 21 15:16:32 2023 -0500 Change send_morse, stop_morse, send_voice_mem, and stop_voicemem to not require a VFO argument https://github.com/Hamlib/Hamlib/issues/1365 diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index dc322400a..6942abe5b 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -350,10 +350,10 @@ static struct test_table test_list[] = { 'w', "send_cmd", ACTION(send_cmd), ARG_IN1 | ARG_IN_LINE | ARG_OUT2 | ARG_NOVFO, "Cmd", "Reply" }, { 'W', "send_cmd_rx", ACTION(send_cmd), ARG_IN | ARG_OUT2 | ARG_NOVFO, "Cmd", "Reply"}, { 'b', "send_morse", ACTION(send_morse), ARG_IN | ARG_NOVFO | ARG_IN_LINE, "Morse" }, - { 0xbb, "stop_morse", ACTION(stop_morse), }, - { 0xbc, "wait_morse", ACTION(wait_morse), }, - { 0x94, "send_voice_mem", ACTION(send_voice_mem), ARG_IN, "Voice Mem#" }, - { 0xab, "stop_voice_mem", ACTION(stop_voice_mem), }, + { 0xbb, "stop_morse", ACTION(stop_morse), ARG_NOVFO}, + { 0xbc, "wait_morse", ACTION(wait_morse), ARG_NOVFO}, + { 0x94, "send_voice_mem", ACTION(send_voice_mem), ARG_NOVFO | ARG_IN, "Voice Mem#" }, + { 0xab, "stop_voice_mem", ACTION(stop_voice_mem), ARG_NOVFO}, { 0x8b, "get_dcd", ACTION(get_dcd), ARG_OUT, "DCD" }, { 0x8d, "set_twiddle", ACTION(set_twiddle), ARG_IN | ARG_NOVFO, "Timeout (secs)" }, { 0x8e, "get_twiddle", ACTION(get_twiddle), ARG_OUT | ARG_NOVFO, "Timeout (secs)" }, commit 453a8cc94f98131b04bd136155d9df7523faf393 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Aug 21 15:10:41 2023 -0500 Fix K3/K4 stop_morse https://github.com/Hamlib/Hamlib/issues/1366 diff --git a/rigs/kenwood/k3.c b/rigs/kenwood/k3.c index 46457e994..7298999ad 100644 --- a/rigs/kenwood/k3.c +++ b/rigs/kenwood/k3.c @@ -179,6 +179,7 @@ int k4_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt); int k4_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt); int k4_send_voice_mem(RIG *rig, vfo_t vfo, int ch); int k4_stop_voice_mem(RIG *rig, vfo_t vfo); +int k4_stop_morse(RIG *rig, vfo_t vfo); /* * K3 rig capabilities. @@ -508,7 +509,7 @@ const struct rig_caps k4_caps = RIG_MODEL(RIG_MODEL_K4), .model_name = "K4", .mfg_name = "Elecraft", - .version = BACKEND_VER ".27", + .version = BACKEND_VER ".28", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -656,7 +657,7 @@ const struct rig_caps k4_caps = .get_ant = kenwood_get_ant, .send_morse = kenwood_send_morse, .wait_morse = rig_wait_morse, - .stop_morse = k3_stop_morse, + .stop_morse = k4_stop_morse, .send_voice_mem = k4_send_voice_mem, .stop_voice_mem = k4_stop_voice_mem, .power2mW = k3_power2mW, @@ -2908,10 +2909,18 @@ int k4_stop_voice_mem(RIG *rig, vfo_t vfo) return retval; } +int k4_stop_morse(RIG *rig, vfo_t vfo) +{ + int retval; + retval = kenwood_transaction(rig, "KY@;", NULL, 0); + return retval; +} + int k3_stop_morse(RIG *rig, vfo_t vfo) { int retval; - char buf[32]; - retval = kenwood_transaction(rig, "KY;", buf, 4); + char cmd[32]; + SNPRINTF(cmd,sizeof(cmd),"KY%c;", 0x04); + retval = kenwood_transaction(rig, cmd, NULL, 0); return retval; } commit 5113c6a895766ba32bb2aeaa3f04b2a6cac2f175 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Aug 21 10:31:55 2023 -0500 Add simqrplabs.c diff --git a/simulators/simqrplabs.c b/simulators/simqrplabs.c new file mode 100644 index 000000000..4c1c282ea --- /dev/null +++ b/simulators/simqrplabs.c @@ -0,0 +1,429 @@ +// can run this using rigctl/rigctld and socat pty devices +// gcc -o simyaesu simyaesu.c +#define _XOPEN_SOURCE 700 +// since we are POSIX here we need this +struct ip_mreq +{ + int dummy; +}; + +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <string.h> +#include <unistd.h> +#include <hamlib/rig.h> + +#define BUFSIZE 256 + +int mysleep = 20; + +float freqA = 14074000; +float freqB = 14074500; +int filternum = 7; +int datamode = 0; +int vfo, vfo_tx, ptt, ptt_data, ptt_mic, ptt_tune; +int tomode = 0; + +int +getmyline(int fd, char *buf) +{ + char c; + int i = 0; + memset(buf, 0, BUFSIZE); + + while (read(fd, &c, 1) > 0) + { + buf[i++] = c; + + if (c == ';') { return strlen(buf); } + } + + return strlen(buf); +} + +#if defined(WIN32) || defined(_WIN32) +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd; + fd = open(comport, O_RDWR); + + if (fd < 0) + { + perror(comport); + } + + return fd; +} + +#else +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd = posix_openpt(O_RDWR); + char *name = ptsname(fd); + + if (name == NULL) + { + perror("pstname"); + return -1; + } + + printf("name=%s\n", name); + + if (fd == -1 || grantpt(fd) == -1 || unlockpt(fd) == -1) + { + perror("posix_openpt"); + return -1; + } + + return fd; +} +#endif + + + +int main(int argc, char *argv[]) +{ + char buf[256]; + char *pbuf; + int n; + int fd = openPort(argv[1]); + int freqa = 14074000, freqb = 140735000; + int modeA = 1, modeB = 2; + + while (1) + { + buf[0] = 0; + + if (getmyline(fd, buf) > 0) { printf("Cmd:%s\n", buf); } + +// else { return 0; } + + if (strcmp(buf, "RM5;") == 0) + { + printf("%s\n", buf); + hl_usleep(mysleep * 1000); + pbuf = "RM5100000;"; + n = write(fd, pbuf, strlen(pbuf)); +// printf("n=%d\n", n); + + if (n <= 0) { perror("RM5"); } + } + + else if (strcmp(buf, "AN0;") == 0) + { + printf("%s\n", buf); + hl_usleep(mysleep * 1000); + pbuf = "AN030;"; + n = write(fd, pbuf, strlen(pbuf)); +// printf("n=%d\n", n); + + if (n <= 0) { perror("AN"); } + } + else if (strcmp(buf, "IF;") == 0) + { + char ifbuf[256]; + printf("%s\n", buf); + hl_usleep(mysleep * 1000); + pbuf = "IF000503130001000+0000000000030000000;"; + // from QMX 1_09 firmware "IF00007074000 +0.0000000002000000 ;" + sprintf(ifbuf, "IF%011d +0.0000000002000000 ;", freqa); + //pbuf = "IF00010138698 +00000000002000000 ; + n = write(fd, ifbuf, strlen(ifbuf)); +// printf("n=%d\n", n); + + if (n <= 0) { perror("IF"); } + + continue; + } + else if (strcmp(buf, "NB;") == 0) + { + hl_usleep(mysleep * 1000); + pbuf = "NB0;"; + n = write(fd, pbuf, strlen(pbuf)); + continue; + } + else if (strcmp(buf, "RA;") == 0) + { + hl_usleep(mysleep * 1000); + pbuf = "RA01;"; + n = write(fd, pbuf, strlen(pbuf)); + continue; + } + else if (strcmp(buf, "RG;") == 0) + { + hl_usleep(mysleep * 1000); + pbuf = "RG055;"; + n = write(fd, pbuf, strlen(pbuf)); + continue; + } + else if (strcmp(buf, "MG;") == 0) + { + hl_usleep(mysleep * 1000); + pbuf = "MG050;"; + n = write(fd, pbuf, strlen(pbuf)); + continue; + } + else if (strcmp(buf, "AG;") == 0) + { + hl_usleep(mysleep * 1000); + pbuf = "AG100;"; + n = write(fd, pbuf, strlen(pbuf)); + continue; + } + else if (strcmp(buf, "FV;") == 0) + { + hl_usleep(mysleep * 1000); + pbuf = "FV1.2;"; + n = write(fd, pbuf, strlen(pbuf)); + continue; + } + else if (strncmp(buf, "IS;", 3) == 0) + { + SNPRINTF(buf, sizeof(buf), "IS+0000;"); + n = write(fd, buf, strlen(buf)); + printf("%s\n", buf); + continue; + } + else if (strncmp(buf, "IS", 2) == 0) + { + continue; + } + else if (strncmp(buf, "SM;", 3) == 0) + { + SNPRINTF(buf, sizeof(buf), "SM0035;"); + n = write(fd, buf, strlen(buf)); + printf("%s\n", buf); + continue; + } + else if (strncmp(buf, "PC;", 3) == 0) + { + SNPRINTF(buf, sizeof(buf), "PC100;"); + n = write(fd, buf, strlen(buf)); + printf("%s\n", buf); + continue; + } + else if (strcmp(buf, "FW;") == 0) + { + //usleep(mysleep * 1000); + pbuf = "FW240"; + n = write(fd, pbuf, strlen(pbuf)); + hl_usleep(20 * 1000); + pbuf = "0;"; + n = write(fd, pbuf, strlen(pbuf)); + continue; + } + else if (strncmp(buf, "FW", 2) == 0) + { + continue; + } + else if (strcmp(buf, "ID;") == 0) + { + printf("%s\n", buf); + hl_usleep(mysleep * 1000); + SNPRINTF(buf, sizeof(buf), "ID%03d;", 10); + n = write(fd, buf, strlen(buf)); +// printf("n=%d\n", n); + + if (n <= 0) { perror("ID"); } + + continue; + } + + else if (strncmp(buf, "AI", 2) == 0) + { + if (strcmp(buf, "AI;")) + { + printf("%s\n", buf); + hl_usleep(mysleep * 1000); + pbuf = "AI0;"; + n = write(fd, pbuf, strlen(pbuf)); + printf("n=%d\n", n); + + if (n <= 0) { perror("AI"); } + } + } + + else if (strcmp(buf, "VS;") == 0) + { + printf("%s\n", buf); + hl_usleep(mysleep * 1000); + pbuf = "VS0;"; + n = write(fd, pbuf, strlen(pbuf)); +// printf("n=%d\n", n); + + if (n < 0) { perror("VS"); } + + continue; + } + else if (strcmp(buf, "EX032;") == 0) + { + static int ant = 0; + ant = (ant + 1) % 3; + printf("%s\n", buf); + hl_usleep(mysleep * 1000); + SNPRINTF(buf, sizeof(buf), "EX032%1d;", ant); + n = write(fd, buf, strlen(buf)); +// printf("n=%d\n", n); + + if (n < 0) { perror("EX032"); } + + continue; + } + else if (strncmp(buf, "EX", 2) == 0) + { + continue; + } + else if (strcmp(buf, "FA;") == 0) + { + SNPRINTF(buf, sizeof(buf), "FA%011d;", freqa); + n = write(fd, buf, strlen(buf)); + continue; + } + else if (strcmp(buf, "FB;") == 0) + { + SNPRINTF(buf, sizeof(buf), "FB%011d;", freqb); + n = write(fd, buf, strlen(buf)); + continue; + } + else if (strncmp(buf, "FA", 2) == 0) + { + sscanf(buf, "FA%d", &freqa); + continue; + } + else if (strncmp(buf, "FB", 2) == 0) + { + sscanf(buf, "FB%d", &freqb); + continue; + } + else if (strncmp(buf, "AI;", 3) == 0) + { + SNPRINTF(buf, sizeof(buf), "AI0;"); + n = write(fd, buf, strlen(buf)); + continue; + } + + else if (strncmp(buf, "PS;", 3) == 0) + { + SNPRINTF(buf, sizeof(buf), "PS1;"); + n = write(fd, buf, strlen(buf)); + continue; + } + else if (strncmp(buf, "SA;", 3) == 0) + { + SNPRINTF(buf, sizeof(buf), "SA0;"); + n = write(fd, buf, strlen(buf)); + } + else if (buf[3] == ';' && strncmp(buf, "SF", 2)==0) + { + SNPRINTF(buf, sizeof(buf), "SF%c%011.0f%c;", buf[2], buf[2] == '0' ? freqA : freqB, + buf[2] == '0' ? modeA + '0' : modeB + '0'); + n = write(fd, buf, strlen(buf)); + continue; + } + else if (strncmp(buf, "SF", 2) == 0) + { + mode_t tmpmode= buf[14]; + + if (buf[2] == '0') { modeA = tmpmode - '0'; } + else { modeB = tmpmode - '0'; } + printf("modeA=%c, modeB=%c\n", modeA, modeB); + + continue; + } + else if (strncmp(buf, "MD;", 3) == 0) + { + SNPRINTF(buf, sizeof(buf), "MD%d;", + modeA); // not worried about modeB yet for simulator + n = write(fd, buf, strlen(buf)); + continue; + } + else if (strncmp(buf, "MD", 2) == 0) + { + sscanf(buf, "MD%d", &modeA); // not worried about modeB yet for simulator + continue; + } + else if (strncmp(buf, "FL;", 3) == 0) + { + SNPRINTF(buf, sizeof(buf), "FL%03d;", filternum); + n = write(fd, buf, strlen(buf)); + continue; + } + else if (strncmp(buf, "FL", 2) == 0) + { + sscanf(buf, "FL%d", &filternum); + continue; + } + else if (strcmp(buf, "FR;") == 0) + { + SNPRINTF(buf, sizeof(buf), "FR%d;", vfo); + n = write(fd, buf, strlen(buf)); + continue; + } + else if (strncmp(buf, "FR", 2) == 0) + { + sscanf(buf, "FR%d", &vfo); + } + else if (strcmp(buf, "FT;") == 0) + { + SNPRINTF(buf, sizeof(buf), "FR%d;", vfo_tx); + n = write(fd, buf, strlen(buf)); + continue; + } + else if (strncmp(buf, "FT", 2) == 0) + { + sscanf(buf, "FT%d", &vfo_tx); + } + else if (strncmp(buf, "DA;", 3) == 0) + { + SNPRINTF(buf, sizeof(buf), "DA%d;", datamode); + n = write(fd, buf, strlen(buf)); + printf("%s\n", buf); + continue; + } + else if (strncmp(buf, "DA", 2) == 0) + { + sscanf(buf, "DA%d", &datamode); + printf("%s\n", buf); + continue; + } + else if (strncmp(buf, "TO;", 3) == 0) + { + SNPRINTF(buf, sizeof(buf), "TO%d;", tomode); + continue; + } + else if (strncmp(buf, "BD;", 3) == 0) + { + continue; + } + else if (strncmp(buf, "BU;", 3) == 0) + { + continue; + } + else if (strncmp(buf, "TX", 2) == 0) + { + ptt = ptt_mic = ptt_data = ptt_tune = 0; + + switch (buf[2]) + { + case ';': ptt = 1; + + case '0': ptt_mic = 1; + + case '1': ptt_data = 1; + + case '2': ptt_tune = 1; + } + + continue; + } + else if (strlen(buf) > 0) + { + fprintf(stderr, "Unknown command: %s\n", buf); + } + + + } + + return 0; +} commit 194906b2900366ea73327252d379e0330edb1fb5 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Aug 21 10:13:26 2023 -0500 For QRPLabs ignore the IF return length as the differenet models can't agree on the length. QMX adds an extra space on the end with firmware 1_00_09 https://github.com/Hamlib/Hamlib/issues/1372 diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index 0503202c9..77480f5b3 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -719,6 +719,8 @@ int kenwood_safe_transaction(RIG *rig, const char *cmd, char *buf, if (checklen && length != expected) /* worth retrying as some rigs occasionally send short results */ { + // QRPLABS can't seem top decide if they give 37 or 38 bytes for IF command + if (strncmp(cmd,"IF",2)==0 && rig->caps->rig_model == RIG_MODEL_QRPLABS) break; struct kenwood_priv_data *priv = rig->state.priv; rig_debug(RIG_DEBUG_ERR, "%s: wrong answer; len for cmd %s: expected = %d, got %d\n", diff --git a/rigs/kenwood/kenwood.h b/rigs/kenwood/kenwood.h index c12a850f3..0fbaaa79f 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 "20230626" +#define BACKEND_VER "20230821" #define EOM_KEN ';' #define EOM_TH '\r' diff --git a/simulators/Makefile.am b/simulators/Makefile.am index 7b794947c..85394b19c 100644 --- a/simulators/Makefile.am +++ b/simulators/Makefile.am @@ -8,7 +8,7 @@ DISTCLEANFILES = bin_PROGRAMS = -check_PROGRAMS = simelecraft simicgeneric simkenwood simyaesu simic9100 simic9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simic7300 simic7000 simic7100 simic7200 simatd578 simic905 simts450 simic7600 simic7610 simic705 simts950 simts990 simic7851 simftdx101 simxiegug90 +check_PROGRAMS = simelecraft simicgeneric simkenwood simyaesu simic9100 simic9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simic7300 simic7000 simic7100 simic7200 simatd578 simic905 simts450 simic7600 simic7610 simic705 simts950 simts990 simic7851 simftdx101 simxiegug90 simqrplabs simelecraft_SOURCES = simelecraft.c simkenwood_SOURCES = simkenwood.c commit 24e407c82c358b09e7714c301bf2d398607b71cb Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Aug 20 16:34:35 2023 -0500 Fix github build diff --git a/tests/Makefile.am b/tests/Makefile.am index fb87a2918..b2ec16650 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -43,7 +43,7 @@ endif rigctl_CPPFLAGS = -I$(top_builddir)/tests -I$(top_builddir)/src -I$(srcdir) -I$(top_builddir)/security $(AM_CPPFLAGS) # all the programs need this -LDADD = $(top_builddir)/src/libhamlib.la $(top_builddir)/lib/libmisc.la $(DL_LIBS) +LDADD = $(top_builddir)/src/libhamlib.la $(top_builddir)/lib/libmisc.la $(DL_LIBS) -lm rigmem_CFLAGS = $(AM_CFLAGS) $(LIBXML2_CFLAGS) -I$(top_builddir)/src rigctld_CFLAGS = $(AM_CFLAGS) $(PTHREAD_CFLAGS) -I$(top_builddir)/src -I$(top_builddir)/security commit 7011b4855461a1fa178e7ddc9469b8826c220ad1 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Aug 20 16:16:08 2023 -0500 Add rigfreqwalk diff --git a/tests/rigfreqwalk.c b/tests/rigfreqwalk.c new file mode 100644 index 000000000..403d90008 --- /dev/null +++ b/tests/rigfreqwalk.c @@ -0,0 +1,152 @@ +/* + * Hamlib sample program + */ + +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <stdlib.h> +#include <math.h> + +#include <hamlib/rig.h> + +#include <hamlib/config.h> + +#define HISTORYSIZE 10 +double history[HISTORYSIZE]; +int nhistory; +int historyinit = 1; + +double compute_mean(double arr[], int length) +{ + double sum = 0.0; + for (int i = 0; i < length; i++) { + sum += arr[i]; + } + return sum / length; +} + +double sigma(double arr[], int length) { + double mean = compute_mean(arr, length); + double sum_of_squares = 0.0; + + for (int i = 0; i < length; i++) { + sum_of_squares += pow(arr[i] - mean, 2); + } + + return sqrt(sum_of_squares / length); +} + +int main(int argc, char *argv[]) +{ + RIG *my_rig; /* handle to rig (nstance) */ + int strength; /* S-Meter level */ + int retcode; /* generic return code from functions */ + + rig_model_t myrig_model; + + + + if (argc != 8) + { + fprintf(stderr,"%s: version 1.0\n", argv[0]); + fprintf(stderr,"Usage: %s [model#] [comport] [baud] [start freq] [stop_freq] [stepsize] [seconds/step]\n", + argv[0]); + return 1; + } + + /* Turn off backend debugging output */ + rig_set_debug_level(RIG_DEBUG_NONE); + + /* + * allocate memory, setup & open port + */ + + hamlib_port_t myport; + myrig_model = atoi(argv[1]); + strncpy(myport.pathname, argv[2], HAMLIB_FILPATHLEN - 1); + myport.parm.serial.rate = atoi(argv[3]); + + my_rig = rig_init(myrig_model); + + if (!my_rig) + { + fprintf(stderr, "Unknown rig num: %d\n", myrig_model); + fprintf(stderr, "Please check riglist.h\n"); + exit(1); /* whoops! something went wrong (mem alloc?) */ + } + + strncpy(my_rig->state.rigport.pathname, argv[2], HAMLIB_FILPATHLEN - 1); + + retcode = rig_open(my_rig); + + if (retcode != RIG_OK) + { + printf("rig_open: error = %s\n", rigerror(retcode)); + exit(2); + } + +// printf("Port %s opened ok\n", SERIAL_PORT); + + long freq1, freq2; + int stepsize, seconds; + int n = sscanf(argv[4], "%ld", &freq1); + n += sscanf(argv[5], "%ld", &freq2); + n += sscanf(argv[6], "%d", &stepsize); + n += sscanf(argv[7], "%d", &seconds); + + if (n != 4) + { + fprintf(stderr, "Error parsing %s/%s/%s/%s as start/stop/step/seconds\n", + argv[4], argv[5], argv[6], argv[7]); + return 1; + } + + printf("Start:%ld Stop:%ld Step:%d Wait:%d\n", freq1, freq2, stepsize, seconds); + + while (1) + { + for (long f = freq1; f <= freq2; f += stepsize) + { + retcode = rig_set_freq(my_rig, RIG_VFO_CURR, (freq_t)f); + if (retcode != RIG_OK) + { + fprintf(stderr, "%s: Error rig_set_freq: %s\n", __func__, rigerror(retcode)); + return 1; + } + sleep(seconds); + retcode = rig_get_strength(my_rig, RIG_VFO_CURR, &strength); + + if (retcode != RIG_OK) + { + int static once=1; + if (once) + { + once = 0; + fprintf(stderr,"rig_get_strength error: %s\n", rigerror(retcode)); + } + strength = 1; + } + history[nhistory++] = strength; + if (historyinit) + { + for(int i=0;i<HISTORYSIZE;++i) history[i] = strength; + historyinit = 0; + } + nhistory %= HISTORYSIZE; + double s = sigma(history, HISTORYSIZE); + char timebuf[64]; + rig_date_strget(timebuf, sizeof(timebuf), 1); + printf("%s\t%ld\t%d\t%f\n", timebuf, f, strength, s); + fflush(stdout); + + } + } + + rig_close(my_rig); /* close port */ + rig_cleanup(my_rig); /* if you care about memory */ + + printf("port %s closed ok \n", argv[2]); + + return 0; +} commit cca3891362a0efd56e47eaa10c00bf419bedd215 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Aug 20 16:03:25 2023 -0500 Change L METER to allow meter names in addition to numeric Change l METER to return meter number=name instead of just number Hopefully doesn't mess up anybody using this function via rigctl/rigctld uf they parsing the number correctly. It's easier for users with to use/see text names for both set/get https://github.com/Hamlib/Hamlib/issues/1369 diff --git a/NEWS b/NEWS index 2a6d62139..4e28851a7 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,8 @@ Version 5.x -- future * Change FT1000MP Mark V model names to align with FT1000MP Version 4.6 + * rig set level METER can now take SWR,COMP,ALC,IC/ID,DB,PO,VDD,TEMP arguments to set which meter to display + * reg get level displays meter number=name now * Added parm BANDSELECT for Yaesu rigs 'p BANDSELECT' returns current band of VFOA 'P BANDSELECT BAND160M' example selects the 160M band diff --git a/doc/man1/rigctl.1 b/doc/man1/rigctl.1 index 584bc43c7..80728ac0c 100644 --- a/doc/man1/rigctl.1 +++ b/doc/man1/rigctl.1 @@ -985,6 +985,8 @@ Lookup - if level shows 0/0/0 then it's probably a lookup value SPECTRUM_MODE 0=None, 1=Center, 2=Fixed, 3=Center Scroll, 4=Fixed Scroll SPECTRUM_AVG rig specific +METER -- SWR,COMP,ALC,IC/ID,DB,PO,VDD,TEMP or can use the numbers above in Lookup l METER returns the meter number=name + Watts RFPOWER_METER_WATTS diff --git a/simulators/simic7300.c b/simulators/simic7300.c index 898475f24..86283a01c 100644 --- a/simulators/simic7300.c +++ b/simulators/simic7300.c @@ -198,19 +198,17 @@ void frameParse(int fd, unsigned char *frame, int len) break; case 0x0f: - if (frame[5] == 0) { split = 0; } - else if (frame[5] == 1) { split = 1; } - else { frame[6] = split; } - if (frame[5] == 0xfd) { printf("get split %d\n", split); - frame[7] = 0xfd; - n = write(fd, frame, 8); + frame[5] = split; + frame[6] = 0xfd; + n = write(fd, frame, 7); } else { printf("set split %d\n", 1); + split = frame[5]; frame[4] = 0xfb; frame[5] = 0xfd; n = write(fd, frame, 6); diff --git a/tests/Makefile.am b/tests/Makefile.am index 72717b30e..fb87a2918 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -14,7 +14,7 @@ endif DISTCLEANFILES = rigctl.log rigctl.sum testbcd.log testbcd.sum -bin_PROGRAMS = rigctl rigctld rigmem rigsmtr rigswr rotctl rotctld rigctlcom rigctltcp rigctlsync ampctl ampctld rigtestmcast rigtestmcastrx $(TESTLIBUSB) +bin_PROGRAMS = rigctl rigctld rigmem rigsmtr rigswr rotctl rotctld rigctlcom rigctltcp rigctlsync ampctl ampctld rigtestmcast rigtestmcastrx $(TESTLIBUSB) rigfreqwalk #check_PROGRAMS = dumpmem testrig testrigopen testrigcaps testtrn testbcd testfreq listrigs testloc rig_bench testcache cachetest cachetest2 testcookie testgrid testsecurity check_PROGRAMS = dumpmem testrig testrigopen testrigcaps testtrn testbcd testfreq listrigs testloc rig_bench testcache cachetest cachetest2 testcookie testgrid hamlibmodels testmW2power diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index ffcfe099c..dc322400a 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -3272,6 +3272,13 @@ declare_proto_rig(set_level) level = rig_parse_level(arg1); + if ((!strcmp(arg2, "?") || arg2[0]==0) && level == RIG_LEVEL_METER) + { + fprintf(fout, "COMP ALC SWR ID/IC VDD DB PO TEMP%c", resp_sep); + RETURNFUNC2(RIG_OK); + } + + // some Java apps send comma in international setups so substitute period char *p = strchr(arg2, ','); @@ -3288,6 +3295,7 @@ declare_proto_rig(set_level) RETURNFUNC2(-RIG_ENAVAIL); /* no such parameter */ } + switch (cfp->type) { case RIG_CONF_BUTTON: @@ -3315,6 +3323,23 @@ declare_proto_rig(set_level) RETURNFUNC2(rig_set_ext_level(rig, vfo, cfp->token, val)); } + int dummy; + if (level == RIG_LEVEL_METER && sscanf(arg2,"%d",&dummy)==0) + { + if (strcmp(arg2,"COMP")==0) arg2 = "2"; + else if (strcmp(arg2,"ALC")==0) arg2 = "4"; + else if (strcmp(arg2,"SWR")==0) arg2 = "1"; + else if (strcmp(arg2,"ID")==0 || strcmp(arg2,"IC")==0) arg2 = "8"; + else if (strcmp(arg2,"VDD")==0) arg2 = "64"; + else if (strcmp(arg2, "DB")==0) arg2 = "16"; + else if (strcmp(arg2, "PO")==0) arg2 = "32"; + else if (strcmp(arg2, "TEMP")==0) arg2 = "128"; + else + { + rig_debug(RIG_DEBUG_ERR, "%s: unknown meter=%s, only know COMP,ALC,SWR,ID/IC,VDD,DB,PO,TEMP\n", __func__, arg2); + RETURNFUNC2(-RIG_EINVAL); + } + } if (RIG_LEVEL_IS_FLOAT(level)) { CHKSCN1ARG(sscanf(arg2, "%f", &val.f)); @@ -3352,7 +3377,6 @@ declare_proto_rig(get_level) //fputc('\n', fout); RETURNFUNC2(RIG_OK); } - level = rig_parse_level(arg1); if (!rig_has_get_level(rig, level)) @@ -3416,6 +3440,26 @@ declare_proto_rig(get_level) { fprintf(fout, "%s: ", cmd->arg2); } + if (level == RIG_LEVEL_METER && interactive && prompt) + { + // we will show text answers as they make morse sense for rigtl + switch(val.i) + { + case RIG_METER_COMP: fprintf(fout, "%d=%s%c", val.i, "COMP", resp_sep);break; + case RIG_METER_ALC: fprintf(fout, "%d=%s%c", val.i, "ALC", resp_sep);break; + case RIG_METER_SWR: fprintf(fout, "%d=%s%c", val.i, "SWR", resp_sep);break; + case RIG_METER_IC: fprintf(fout, "%d=%s%c", val.i, "IC", resp_sep);break; + case RIG_METER_VDD: fprintf(fout, "%d=%s%c", val.i, "VDD", resp_sep);break; + case RIG_METER_DB: fprintf(fout, "%d=%s%c", val.i, "DB", resp_sep);break; + case RIG_METER_PO: fprintf(fout, "%d=%s%c", val.i, "PO", resp_sep);break; + case RIG_METER_TEMP: fprintf(fout, "%d=%s%c", val.i, "TEMP", resp_sep);break; + default: + rig_debug(RIG_DEBUG_ERR, "%s: unknown meter=%d, only know COMP,ALC,SWR,ID/IC,VDD,DB,PO,TEMP\n", __func__, val.i); + RETURNFUNC2(-RIG_EINVAL); + } + RETURNFUNC(RIG_OK); + } + if (RIG_LEVEL_IS_FLOAT(level)) { commit 1b0f0ec42201e418ebcdfa66ad0645ceed069348 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Aug 19 15:35:54 2023 -0500 Fix K3 stop_morse RPRT return https://github.com/Hamlib/Hamlib/issues/1365 diff --git a/rigs/kenwood/k3.c b/rigs/kenwood/k3.c index 9d391c148..46457e994 100644 --- a/rigs/kenwood/k3.c +++ b/rigs/kenwood/k3.c @@ -2911,6 +2911,7 @@ int k4_stop_voice_mem(RIG *rig, vfo_t vfo) int k3_stop_morse(RIG *rig, vfo_t vfo) { int retval; - retval = kenwood_transaction(rig, "KY;", NULL, 0); + char buf[32]; + retval = kenwood_transaction(rig, "KY;", buf, 4); return retval; } commit b40da0f6b0f07d19b79a0869d6fe522037dc3e5f Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Aug 19 12:36:07 2023 -0500 Increase send_morse size to use maximum for rigs or 20 chars (if morse_qsize unknown) This will still allow for up to 1023 characater to queue up. No guarantees on which rigs allow for this queuing though. Kenwood rigs can at least find the buffer status to wait for room but not all rigs do. https://github.com/Hamlib/Hamlib/issues/1368 diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 027bc92de..d49734608 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -2153,6 +2153,7 @@ struct rig_caps { int (*set_lock_mode)(RIG *rig, int mode); int (*get_lock_mode)(RIG *rig, int *mode); short timeout_retry; /*!< number of retries to make in case of read timeout errors, some serial interfaces may require this, 0 to use default value, -1 to disable */ + short morse_qsize; /* max length of morse */ // int (*bandwidth2rig)(RIG *rig, enum bandwidth_t bandwidth); // enum bandwidth_t (*rig2bandwidth)(RIG *rig, int rigbandwidth); }; diff --git a/rigs/kenwood/k3.c b/rigs/kenwood/k3.c index 6ad85abf8..9d391c148 100644 --- a/rigs/kenwood/k3.c +++ b/rigs/kenwood/k3.c @@ -342,6 +342,7 @@ const struct rig_caps k3_caps = .send_voice_mem = k3_send_voice_mem, .stop_voice_mem = k3_stop_voice_mem, .power2mW = k3_power2mW, + .morse_qsize = 24, .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS }; @@ -497,6 +498,7 @@ const struct rig_caps k3s_caps = .send_voice_mem = k3_send_voice_mem, .stop_voice_mem = k3_stop_voice_mem, .power2mW = k3_power2mW, + .morse_qsize = 24, .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS }; @@ -658,6 +660,7 @@ const struct rig_caps k4_caps = .send_voice_mem = k4_send_voice_mem, .stop_voice_mem = k4_stop_voice_mem, .power2mW = k3_power2mW, + .morse_qsize = 24, .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS }; @@ -812,6 +815,7 @@ const struct rig_caps kx3_caps = .send_voice_mem = k3_send_voice_mem, .stop_voice_mem = k3_stop_voice_mem, .power2mW = k3_power2mW, + .morse_qsize = 24, .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS }; diff --git a/rigs/yaesu/ft1200.c b/rigs/yaesu/ft1200.c index 87e1f8c75..712e64aa2 100644 --- a/rigs/yaesu/ft1200.c +++ b/rigs/yaesu/ft1200.c @@ -147,7 +147,7 @@ const struct rig_caps ftdx1200_caps = RIG_MODEL(RIG_MODEL_FTDX1200), .model_name = "FTDX-1200", .mfg_name = "Yaesu", - .version = NEWCAT_VER ".6", + .version = NEWCAT_VER ".7", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -328,5 +328,6 @@ const struct rig_caps ftdx1200_caps = .set_clock = newcat_set_clock, .get_clock = newcat_get_clock, .scan = newcat_scan, + .morse_qsize = 50, .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS }; diff --git a/rigs/yaesu/ft2000.c b/rigs/yaesu/ft2000.c index 0ebb5f94b..416b239b0 100644 --- a/rigs/yaesu/ft2000.c +++ b/rigs/yaesu/ft2000.c @@ -132,7 +132,7 @@ const struct rig_caps ft2000_caps = RIG_MODEL(RIG_MODEL_FT2000), .model_name = "FT-2000", .mfg_name = "Yaesu", - .version = NEWCAT_VER ".4", + .version = NEWCAT_VER ".5", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -313,5 +313,6 @@ const struct rig_caps ft2000_caps = .send_morse = newcat_send_morse, .wait_morse = rig_wait_morse, .scan = newcat_scan, + .morse_qsize = 50, .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS }; diff --git a/rigs/yaesu/ft3000.c b/rigs/yaesu/ft3000.c index 20d3b7eaf..a51ae072e 100644 --- a/rigs/yaesu/ft3000.c +++ b/rigs/yaesu/ft3000.c @@ -242,7 +242,7 @@ const struct rig_caps ftdx3000_caps = RIG_MODEL(RIG_MODEL_FTDX3000), .model_name = "FTDX-3000", .mfg_name = "Yaesu", - .version = NEWCAT_VER ".11", + .version = NEWCAT_VER ".12", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -419,6 +419,7 @@ const struct rig_caps ftdx3000_caps = .send_morse = newcat_send_morse, .wait_morse = rig_wait_morse, .scan = newcat_scan, + .morse_qsize = 50, .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS }; diff --git a/rigs/yaesu/ft450.c b/rigs/yaesu/ft450.c index e1e5d13a9..d0a7cbb34 100644 --- a/rigs/yaesu/ft450.c +++ b/rigs/yaesu/ft450.c @@ -207,6 +207,7 @@ const struct rig_caps ft450_caps = .send_morse = newcat_send_morse, .wait_morse = rig_wait_morse, .scan = newcat_scan, + .morse_qsize = 40, .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS }; diff --git a/rigs/yaesu/ft5000.c b/rigs/yaesu/ft5000.c index a15e8ab50..f1a06608f 100644 --- a/rigs/yaesu/ft5000.c +++ b/rigs/yaesu/ft5000.c @@ -138,7 +138,7 @@ const struct rig_caps ftdx5000_caps = RIG_MODEL(RIG_MODEL_FTDX5000), .model_name = "FTDX-5000", .mfg_name = "Yaesu", - .version = NEWCAT_VER ".10", + .version = NEWCAT_VER ".11", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -315,5 +315,6 @@ const struct rig_caps ftdx5000_caps = .send_morse = newcat_send_morse, .wait_morse = rig_wait_morse, .scan = newcat_scan, + .morse_qsize = 50, .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS }; diff --git a/rigs/yaesu/ft710.c b/rigs/yaesu/ft710.c index ac0b425ec..792350806 100644 --- a/rigs/yaesu/ft710.c +++ b/rigs/yaesu/ft710.c @@ -119,7 +119,7 @@ const struct rig_caps ft710_caps = RIG_MODEL(RIG_MODEL_FT710), .model_name = "FT-710", .mfg_name = "Yaesu", - .version = NEWCAT_VER ".6", + .version = NEWCAT_VER ".7", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -305,5 +305,6 @@ const struct rig_caps ft710_caps = .set_clock = newcat_set_clock, .get_clock = newcat_get_clock, .scan = newcat_scan, + .morse_qsize = 50, .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS }; diff --git a/rigs/yaesu/ft891.c b/rigs/yaesu/ft891.c index 817b0a8cc..9a2eabc99 100644 --- a/rigs/yaesu/ft891.c +++ b/rigs/yaesu/ft891.c @@ -130,7 +130,7 @@ const struct rig_caps ft891_caps = RIG_MODEL(RIG_MODEL_FT891), .model_name = "FT-891", .mfg_name = "Yaesu", - .version = NEWCAT_VER ".8", + .version = NEWCAT_VER ".9", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -329,6 +329,7 @@ const struct rig_caps ft891_caps = .set_clock = newcat_set_clock, .get_clock = newcat_get_clock, .scan = newcat_scan, + .morse_qsize = 50, .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS }; diff --git a/rigs/yaesu/ft9000.c b/rigs/yaesu/ft9000.c index 795fa1b24..964bc38a6 100644 --- a/rigs/yaesu/ft9000.c +++ b/rigs/yaesu/ft9000.c @@ -46,7 +46,7 @@ const struct rig_caps ft9000_caps = RIG_MODEL(RIG_MODEL_FT9000), .model_name = "FTDX-9000", .mfg_name = "Yaesu", - .version = NEWCAT_VER ".4", + .version = NEWCAT_VER ".5", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -214,6 +214,7 @@ const struct rig_caps ft9000_caps = .send_morse = newcat_send_morse, .wait_morse = rig_wait_morse, .scan = newcat_scan, + .morse_qsize = 50, .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS }; @@ -222,7 +223,7 @@ const struct rig_caps ft9000Old_caps = RIG_MODEL(RIG_MODEL_FT9000OLD), .model_name = "FTDX-9000 Old", .mfg_name = "Yaesu", - .version = NEWCAT_VER ".4", + .version = NEWCAT_VER ".5", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -390,5 +391,6 @@ const struct rig_caps ft9000Old_caps = .send_morse = newcat_send_morse, .wait_morse = rig_wait_morse, .scan = newcat_scan, + .morse_qsize = 50, .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS }; diff --git a/rigs/yaesu/ft950.c b/rigs/yaesu/ft950.c index d640bfe76..9802033c5 100644 --- a/rigs/yaesu/ft950.c +++ b/rigs/yaesu/ft950.c @@ -289,5 +289,6 @@ const struct rig_caps ft950_caps = .send_morse = newcat_send_morse, .wait_morse = rig_wait_morse, .scan = newcat_scan, + .morse_qsize = 50, ... [truncated message content] |
From: n0nb <n0...@us...> - 2023-08-18 13:58:00
|
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 4faef9e0316fd118e114c2794baff5b19cadfbf3 (commit) via 01730082fbfd029e1df789df47f21eaeb524d510 (commit) via 0edd1df223bef5a2814e06c004c480e4d5593ddf (commit) via 147dea76514d072598197d44eb6ce29ad997214d (commit) via ccd6472f031aec1f38f4ae4453be602712b8e71d (commit) via 8c63fdeafc3c0011202a692cc29c64151df4d1b9 (commit) via aa338afa1ad2a70e2e06507f092e478c1b47cd9c (commit) via 63bb03cb07809fb8ee865a65351317e353d11085 (commit) via e88715240774db70a4e41d872cf4aa5f17e5b8a9 (commit) via beb69f752ae7ec58be753059557a06ae59841ab2 (commit) via 5062d565a951bdd3863a1b2c6e1dde8d2ddbca42 (commit) via 2bc28f2deaf3fb9d5fe406e86079afb4c06b39b4 (commit) via 003b50bc57a376556c96fbc8e60e6ed1c66a7bb1 (commit) via f0765e6c3a4ed0b0b7956f6137b380253a02b7ea (commit) via 7392d206a8f379c81399d2b55e2dc988aabe1784 (commit) via fb3d83a19ab5f6fc4692dfc4b5aee31764a84c86 (commit) via ac5018a9a39d26c005a926ceaf8bdeb3afedc62b (commit) via 1f50b88320bfcc229e6eb354e461638adea0879a (commit) via 6014e3142d421a6a4236bd5a755a5961a86cafc9 (commit) via f5e30815b7a31dd9cf8a67dcc326ce5f6118b23a (commit) via ef3b90a1bed12b040de6aeab67257a12d177ca98 (commit) via 72870ec26a6802de4b8f15e220ea977d56ad0721 (commit) via afa51b9863706018c47ba5168c0e8ccd163de901 (commit) via d7d450df493dd47c913bfc3c5272be4ba32eaf4b (commit) from 11d2f34ec8f2ac2d972f33e497ff10b0a837ab2b (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 4faef9e0316fd118e114c2794baff5b19cadfbf3 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Aug 18 08:17:39 2023 -0500 Add simxiegug90.c diff --git a/simulators/simxiegug90.c b/simulators/simxiegug90.c new file mode 100644 index 000000000..0378d88c7 --- /dev/null +++ b/simulators/simxiegug90.c @@ -0,0 +1,510 @@ +// simicom will show the pts port to use for rigctl on Unix +// using virtual serial ports on Windows is to be developed yet +// Needs a lot of improvement to work on all Icoms +// gcc -g -Wall -o simicom simicom.c -lhamlib +// On mingw in the hamlib src directory +// gcc -static -I../include -g -Wall -o simicom simicom.c -L../../build/src/.libs -lhamlib -lwsock32 -lws2_32 +#define _XOPEN_SOURCE 700 +// since we are POSIX here we need this +struct ip_mreq +{ + int dummy; +}; + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/time.h> +#include <hamlib/rig.h> +#include "../src/misc.h" + +#define BUFSIZE 256 +//#define X25 + +int civ_731_mode = 0; +vfo_t current_vfo = RIG_VFO_A; +int split = 0; + +// we make B different from A to ensure we see a difference at startup +float freqA = 14074000; +float freqB = 14074500; +mode_t modeA = RIG_MODE_CW; +mode_t modeB = RIG_MODE_USB; +int datamodeA = 0; +int datamodeB = 0; +pbwidth_t widthA = 0; +pbwidth_t widthB = 1; +ant_t ant_curr = 0; +int ant_option = 0; +int ptt = 0; +int keyspd = 20; + +void dumphex(unsigned char *buf, int n) +{ + for (int i = 0; i < n; ++i) { printf("%02x ", buf[i]); } + + printf("\n"); +} + +int +frameGet(int fd, unsigned char *buf) +{ + int i = 0; + memset(buf, 0, BUFSIZE); + unsigned char c; + + while (read(fd, &c, 1) > 0) + { + buf[i++] = c; + //printf("i=%d, c=0x%02x\n",i,c); + + if (c == 0xfd) + { + dumphex(buf, i); + return i; + } + } + + printf("Error???\n"); + + return 0; +} + +void frameParse(int fd, unsigned char *frame, int len) +{ + double freq; + int n; + + dumphex(frame, len); + + if (frame[0] != 0xfe && frame[1] != 0xfe) + { + printf("expected fe fe, got "); + dumphex(frame, len); + return; + } + + switch (frame[4]) + { + case 0x03: + + //from_bcd(frameackbuf[2], (civ_731_mode ? 4 : 5) * 2); + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) + { + printf("get_freqA\n"); + to_bcd(&frame[5], (long long)freqA, (civ_731_mode ? 4 : 5) * 2); + } + else + { + printf("get_freqB\n"); + to_bcd(&frame[5], (long long)freqB, (civ_731_mode ? 4 : 5) * 2); + } + + frame[10] = 0xfd; + n = write(fd, frame, 11); + + if (n != 11) {printf("Error!\n"); exit(1);} + + break; + + case 0x04: + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) + { + printf("get_modeA\n"); + frame[5] = modeA; + frame[6] = widthA; + } + else + { + printf("get_modeB\n"); + frame[5] = modeB; + frame[6] = widthB; + } + + frame[7] = 0xfd; + n = write(fd, frame, 8); + break; + + case 0x05: + freq = from_bcd(&frame[5], (civ_731_mode ? 4 : 5) * 2); + printf("set_freq to %.0f\n", freq); + + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { freqA = freq; } + else { freqB = freq; } + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x06: + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { modeA = frame[6]; } + else { modeB = frame[6]; } + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x07: + + switch (frame[5]) + { + case 0x00: current_vfo = RIG_VFO_A; break; + + case 0x01: current_vfo = RIG_VFO_B; break; + + case 0xb0: freq = freqA; freqA = freqB; freqB = freq; break; + + } + + printf("set_vfo to %s\n", rig_strvfo(current_vfo)); + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x0f: + if (frame[5] == 0) { split = 0; } + else { split = 1; } + + printf("set split %d\n", 1); + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + +#if 0 + case 0x12: // we're simulating the 3-byte version -- not the 2-byte + if (frame[5] != 0xfd) + { + printf("Set ant %d\n", -1); + ant_curr = frame[5]; + ant_option = frame[6]; + dump_hex(frame, 8); + } + else + { + printf("Get ant\n"); + } + + frame[5] = ant_curr; + frame[6] = ant_option; + frame[7] = 0xfd; + printf("n=write 8 bytes\n"); + dump_hex(frame, 8); + n = write(fd, frame, 8); + break; +#endif + + case 0x14: + switch (frame[5]) + { + static int power_level = 0; + static int level = 0; + + case 0x01: + level = 255; + printf("Using AF level %d\n", level); + to_bcd(&frame[6], (long long) level, 2); + frame[8] = 0xfd; + n = write(fd, frame, 9); + break; + + case 0x0a: + printf("Using power level %d\n", power_level); + power_level += 10; + + if (power_level > 250) { power_level = 0; } + + to_bcd(&frame[6], (long long)power_level, 2); + frame[8] = 0xfd; + n = write(fd, frame, 9); + break; + + case 0x0c: + dumphex(frame, 10); + printf("subcmd=0x0c #1\n"); + + if (frame[6] != 0xfd) // then we have data + { + printf("subcmd=0x0c #1\n"); + keyspd = from_bcd(&frame[6], 2); + frame[6] = 0xfb; + n = write(fd, frame, 7); + } + else + { + printf("subcmd=0x0c #1\n"); + to_bcd(&frame[6], keyspd, 2); + frame[8] = 0xfd; + n = write(fd, frame, 9); + } + + break; + } + + + break; + + case 0x15: + switch (frame[5]) + { + static int meter_level = 0; + + case 0x11: + printf("Using meter level %d\n", meter_level); + meter_level += 10; + + if (meter_level > 250) { meter_level = 0; } + + to_bcd(&frame[6], (long long)meter_level, 2); + frame[8] = 0xfd; + n = write(fd, frame, 9); + break; + } + + break; + +#if 0 + case 0x18: // miscellaneous things + frame[5] = 1; + frame[6] = 0xfd; + n = write(fd, frame, 7); + break; + + case 0x1a: // miscellaneous things + switch (frame[5]) + { + case 0x03: // width + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { frame[6] = widthA; } + else { frame[6] = widthB; } + + frame[7] = 0xfd; + n = write(fd, frame, 8); + break; + + case 0x04: // IC7200 data mode + frame[6] = 0; + frame[7] = 0; + frame[8] = 0xfd; + n = write(fd, frame, 9); + break; + + case 0x07: // satmode + frame[6] = 0; + frame[7] = 0xfd; + n = write(fd, frame, 8); + break; + + } + + break; +#endif + case 0x1c: + switch (frame[5]) + { + case 0: + if (frame[6] == 0xfd) + { + frame[6] = ptt; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + ptt = frame[6]; + frame[7] = 0xfb; + frame[8] = 0xfd; + n = write(fd, frame, 9); + } + + break; + + } + + break; + + +#ifdef X25 + + case 0x25: + if (frame[6] == 0xfd) + { + if (frame[5] == 0x00) + { + to_bcd(&frame[6], (long long)freqA, (civ_731_mode ? 4 : 5) * 2); + printf("get_freqA=%.0f\n", freqA); + } + else + { + to_bcd(&frame[6], (long long)freqB, (civ_731_mode ? 4 : 5) * 2); + printf("get_freqB=%.0f\n", freqB); + } + + frame[11] = 0xfd; + n = write(fd, frame, 12); + } + else + { + freq = from_bcd(&frame[6], (civ_731_mode ? 4 : 5) * 2); + printf("set_freq to %.0f\n", freq); + + if (frame[5] == 0x00) { freqA = freq; } + else { freqB = freq; } + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + + break; + + case 0x26: + for (int i = 0; i < 6; ++i) { printf("%02x:", frame[i]); } + + if (frame[6] == 0xfd) // then a query + { + for (int i = 0; i < 6; ++i) { printf("%02x:", frame[i]); } + + frame[6] = frame[5] == 0 ? modeA : modeB; + frame[7] = frame[5] == 0 ? datamodeA : datamodeB; + frame[8] = 0xfb; + frame[9] = 0xfd; + n = write(fd, frame, 10); + } + else + { + for (int i = 0; i < 12; ++i) { printf("%02x:", frame[i]); } + + if (frame[5] == 0) + { + modeA = frame[6]; + datamodeA = frame[7]; + } + else + { + modeB = frame[6]; + datamodeB = frame[7]; + } + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + + printf("\n"); + break; +#else + + case 0x25: + frame[4] = 0xfa; + frame[5] = 0xfd; + break; + + case 0x26: + frame[4] = 0xfa; + frame[5] = 0xfd; + break; +#endif + + default: printf("cmd 0x%02x unknown\n", frame[4]); + } + + // don't care about the rig type yet + +} + +#if defined(WIN32) || defined(_WIN32) +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd; + fd = open(comport, O_RDWR); + + if (fd < 0) + { + perror(comport); + } + + return fd; +} + +#else +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd = posix_openpt(O_RDWR); + char *name = ptsname(fd); + + if (name == NULL) + { + perror("pstname"); + return -1; + } + + printf("name=%s\n", name); + + if (fd == -1 || grantpt(fd) == -1 || unlockpt(fd) == -1) + { + perror("posix_openpt"); + return -1; + } + + return fd; +} +#endif + +void rigStatus() +{ + char vfoa = current_vfo == RIG_VFO_A ? '*' : ' '; + char vfob = current_vfo == RIG_VFO_B ? '*' : ' '; + printf("%cVFOA: mode=%d datamode=%d width=%ld freq=%.0f\n", vfoa, modeA, + datamodeA, + widthA, + freqA); + printf("%cVFOB: mode=%d datamode=%d width=%ld freq=%.0f\n", vfob, modeB, + datamodeB, + widthB, + freqB); +} + +int main(int argc, char **argv) +{ + unsigned char buf[256]; + int fd = openPort(argv[1]); + + printf("%s: %s\n", argv[0], rig_version()); +#ifdef X25 + printf("x25/x26 command recognized\n"); +#else + printf("x25/x26 command rejected\n"); +#endif +#if defined(WIN32) || defined(_WIN32) + + if (argc != 2) + { + printf("Missing comport argument\n"); + printf("%s [comport]\n", argv[0]); + exit(1); + } + +#endif + + while (1) + { + int len = frameGet(fd, buf); + + if (len <= 0) + { + close(fd); + fd = openPort(argv[1]); + } + + frameParse(fd, buf, len); + rigStatus(); + } + + return 0; +} commit 01730082fbfd029e1df789df47f21eaeb524d510 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Aug 18 08:06:14 2023 -0500 Fix G90 by changing set/get_mode_with_data to set/get_mode and suppress icom_get_dsp_flt https://github.com/Hamlib/Hamlib/issues/1364 diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index daecdbf03..6d5ae1c25 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -1951,7 +1951,6 @@ int filtericom[] = { 50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 600, 700, pbwidth_t icom_get_dsp_flt(RIG *rig, rmode_t mode) { - int retval, res_len = 0, rfstatus; unsigned char resbuf[MAXFRAMELEN]; value_t rfwidth; @@ -1984,7 +1983,8 @@ pbwidth_t icom_get_dsp_flt(RIG *rig, rmode_t mode) } if (RIG_MODEL_X108G == rig->caps->rig_model - || RIG_MODEL_X5105 == rig->caps->rig_model) + || RIG_MODEL_X5105 == rig->caps->rig_model + || RIG_MODEL_G90 == rig->caps->rig_model) { priv->no_1a_03_cmd = ENUM_1A_03_NO; } @@ -2761,12 +2761,7 @@ int icom_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) rig_set_vfo(rig, vfo); // force VFO } - retval = 0; - // G90 does have dsp_flt command - if (rig->caps->rig_model != RIG_MODEL_G90) - { - retval = icom_get_dsp_flt(rig, *mode); - } + retval = icom_get_dsp_flt(rig, *mode); *width = retval; if (retval == 0) @@ -2789,12 +2784,7 @@ int icom_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) // we need to figure out how to read VFOB without swapping VFOs //HAMLIB_TRACE; //rig_set_vfo(rig, RIG_VFO_B); - retval = 0; - - if (rig->caps->rig_model != RIG_MODEL_G90) - { - retval = icom_get_dsp_flt(rig, *mode); - } + retval = icom_get_dsp_flt(rig, *mode); *width = retval; if (*width == 0) { *width = rig->state.cache.widthMainA; } // we'll use VFOA's width diff --git a/rigs/icom/xiegu.c b/rigs/icom/xiegu.c index 697b6950a..91e5b5f09 100644 --- a/rigs/icom/xiegu.c +++ b/rigs/icom/xiegu.c @@ -632,8 +632,8 @@ const struct rig_caps g90_caps = .set_freq = icom_set_freq, .get_freq = icom_get_freq, - .set_mode = icom_set_mode_with_data, - .get_mode = icom_get_mode_with_data, + .set_mode = icom_set_mode, + .get_mode = icom_get_mode, .set_vfo = icom_set_vfo, .set_ant = NULL, /*automatically set by rig depending band */ .get_ant = NULL, diff --git a/simulators/Makefile.am b/simulators/Makefile.am index 3583ba822..7b794947c 100644 --- a/simulators/Makefile.am +++ b/simulators/Makefile.am @@ -8,7 +8,7 @@ DISTCLEANFILES = bin_PROGRAMS = -check_PROGRAMS = simelecraft simicgeneric simkenwood simyaesu simic9100 simic9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simic7300 simic7000 simic7100 simic7200 simatd578 simic905 simts450 simic7600 simic7610 simic705 simts950 simts990 simic7851 simftdx101 +check_PROGRAMS = simelecraft simicgeneric simkenwood simyaesu simic9100 simic9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simic7300 simic7000 simic7100 simic7200 simatd578 simic905 simts450 simic7600 simic7610 simic705 simts950 simts990 simic7851 simftdx101 simxiegug90 simelecraft_SOURCES = simelecraft.c simkenwood_SOURCES = simkenwood.c diff --git a/simulators/simxiegug90 b/simulators/simxiegug90 new file mode 100755 index 000000000..46a19d615 Binary files /dev/null and b/simulators/simxiegug90 differ commit 0edd1df223bef5a2814e06c004c480e4d5593ddf Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Aug 18 00:04:59 2023 -0500 Add more KEYERTYPE implementaions to Icom rigs diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index b8a065797..85396a2d8 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -1154,7 +1154,7 @@ enum multicast_item_e { //! @cond Doxygen_Suppress #define RIG_PARM_FLOAT_LIST (RIG_PARM_BACKLIGHT|RIG_PARM_BAT|RIG_PARM_KEYLIGHT|RIG_PARM_BACKLIGHT) -#define RIG_PARM_STRING_LIST (RIG_PARM_BANDSELECT) +#define RIG_PARM_STRING_LIST (RIG_PARM_BANDSELECT|RIG_PARM_KEYERTYPE) #define RIG_PARM_READONLY_LIST (RIG_PARM_BAT) #define RIG_PARM_IS_FLOAT(l) ((l)&RIG_PARM_FLOAT_LIST) diff --git a/rigs/icom/ic7300.c b/rigs/icom/ic7300.c index 76e74c46c..59acc14d5 100644 --- a/rigs/icom/ic7300.c +++ b/rigs/icom/ic7300.c @@ -727,7 +727,8 @@ const struct rig_caps ic7300_caps = [PARM_BEEP] = {.min = {.i = 0}, .max = {.i = 1}, .step = {.i = 1}}, [PARM_SCREENSAVER] = {.min = {.i = 0}, .max = {.i = 3}, .step = {.i = 1}}, [PARM_TIME] = {.min = {.i = 0}, .max = {.i = 86399}, .step = {.i = 1}}, - [PARM_KEYERTYPE] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}}, + [PARM_KEYERTYPE] = {.step = {.s = "STRAIGHT, BUG, PADDLE"}}, + }, .ext_tokens = ic7300_ext_tokens, .extlevels = icom_ext_levels, @@ -969,7 +970,7 @@ struct rig_caps ic9700_caps = [PARM_BANDSELECT] = {.step = {.s = "BANDUNUSED,BAND70CM,BAND33CM,BAND23CM"}}, [PARM_BEEP] = {.min = {.i = 0}, .max = {.i = 1}}, [PARM_SCREENSAVER] = {.min = {.i = 0}, .max = {.i = 3}, .step = {.i = 1}}, - [PARM_KEYERTYPE] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}}, + [PARM_KEYERTYPE] = {.step = {.s = "STRAIGHT, BUG, PADDLE"}}, }, .ext_tokens = ic9700_ext_tokens, .extlevels = icom_ext_levels, @@ -1561,7 +1562,7 @@ const struct rig_caps ic905_caps = [PARM_BANDSELECT] = {.step = {.s = "BANDUNUSED,BAND70CM,BAND33CM,BAND23CM,BAND23CM,BAND13CM,BAND3CM"}}, [PARM_BEEP] = {.min = {.i = 0}, .max = {.i = 1}}, [PARM_SCREENSAVER] = {.min = {.i = 0}, .max = {.i = 3}, .step = {.i = 1}}, - [PARM_KEYERTYPE] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}}, + [PARM_KEYERTYPE] = {.step = {.s = "STRAIGHT, BUG, PADDLE"}}, }, .ext_tokens = ic705_ext_tokens, .extlevels = icom_ext_levels, diff --git a/rigs/icom/ic7410.c b/rigs/icom/ic7410.c index 937b87bac..33a786af9 100644 --- a/rigs/icom/ic7410.c +++ b/rigs/icom/ic7410.c @@ -92,6 +92,7 @@ struct cmdparams ic7410_extcmds[] = { { {.s = RIG_LEVEL_VOXDELAY}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 1, {0x75 }, CMD_DAT_INT, 1 }, + { {.s = RIG_PARM_KEYERTYPE}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x00, 0x75}, CMD_DAT_INT, 1 }, { {0} } }; @@ -157,6 +158,7 @@ const struct rig_caps ic7410_caps = .parm_gran = { [PARM_BACKLIGHT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f}}, [PARM_ANN] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}}, + [PARM_KEYERTYPE] = {.step = {.s = "STRAIGHT, BUG, PADDLE"}}, }, .ctcss_list = common_ctcss_list, diff --git a/rigs/icom/ic7600.c b/rigs/icom/ic7600.c index fc0ba365f..97b8c4139 100644 --- a/rigs/icom/ic7600.c +++ b/rigs/icom/ic7600.c @@ -133,6 +133,7 @@ struct cmdparams ic7600_extcmds[] = { {.s = RIG_PARM_BACKLIGHT}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x00, 0x38}, CMD_DAT_LVL, 2 }, { {.s = RIG_PARM_TIME}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x00, 0x54}, CMD_DAT_TIM, 2 }, { {.s = RIG_LEVEL_VOXDELAY}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x67}, CMD_DAT_INT, 1 }, + { {.s = RIG_PARM_KEYERTYPE}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x37}, CMD_DAT_INT, 1 }, { { 0 } } }; @@ -315,6 +316,7 @@ struct rig_caps ic7600_caps = [PARM_TIME] = {.min = {.i = 0}, .max = {.i = 86399}, .step = {.i = 1}}, [PARM_ANN] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}}, [PARM_APO] = { .min = { .i = 1 }, .max = { .i = 1439} }, + [PARM_KEYERTYPE] = {.step = {.s = "STRAIGHT, BUG, PADDLE"}}, }, .ext_tokens = ic7600_ext_tokens, diff --git a/rigs/icom/ic7610.c b/rigs/icom/ic7610.c index 77dee9d20..4c8cfa6bd 100644 --- a/rigs/icom/ic7610.c +++ b/rigs/icom/ic7610.c @@ -137,6 +137,7 @@ struct cmdparams ic7610_extcmds[] = { {.s = RIG_FUNC_TRANSCEIVE}, CMD_PARAM_TYPE_FUNC, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x12}, CMD_DAT_BOL, 1 }, { {.s = RIG_LEVEL_SPECTRUM_AVG}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x70}, CMD_DAT_INT, 1 }, { {.s = RIG_LEVEL_USB_AF}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x00, 0x82}, CMD_DAT_LVL, 2 }, + { {.s = RIG_PARM_KEYERTYPE}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x02, 0x31}, CMD_DAT_INT, 1 }, { { 0 } } }; @@ -398,6 +399,7 @@ struct rig_caps ic7610_caps = [PARM_BEEP] = {.min = {.i = 0}, .max = {.i = 1}, .step = {.i = 1}}, [PARM_TIME] = {.min = {.i = 0}, .max = {.i = 86399}, .step = {.i = 1}}, [PARM_ANN] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}}, + [PARM_KEYERTYPE] = {.step = {.s = "STRAIGHT, BUG, PADDLE"}}, }, .ext_tokens = ic7610_ext_tokens, diff --git a/rigs/icom/ic785x.c b/rigs/icom/ic785x.c index 93f587faf..ec814a0be 100644 --- a/rigs/icom/ic785x.c +++ b/rigs/icom/ic785x.c @@ -42,7 +42,7 @@ #define IC785x_LEVELS (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_COMP|RIG_LEVEL_BKINDL|RIG_LEVEL_BALANCE|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_APF|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|RIG_LEVEL_SPECTRUM_ATT|RIG_LEVEL_AGC_TIME) #define IC785x_VFOS (RIG_VFO_MAIN|RIG_VFO_SUB|RIG_VFO_MEM) -#define IC785x_PARMS (RIG_PARM_ANN|RIG_PARM_BACKLIGHT|RIG_PARM_TIME|RIG_PARM_BEEP) +#define IC785x_PARMS (RIG_PARM_ANN|RIG_PARM_BACKLIGHT|RIG_PARM_TIME|RIG_PARM_BEEP|RIG_PARM_KEYERTYPE) #define IC785x_VFO_OPS (RIG_OP_CPY|RIG_OP_XCHG|RIG_OP_FROM_VFO|RIG_OP_TO_VFO|RIG_OP_MCL|RIG_OP_TUNE) #define IC785x_SCAN_OPS (RIG_SCAN_MEM|RIG_SCAN_VFO|RIG_SCAN_PROG|RIG_SCAN_DELTA|RIG_SCAN_PRIO) @@ -128,6 +128,7 @@ struct cmdparams ic785x_extcmds[] = { {.s = RIG_FUNC_TRANSCEIVE}, CMD_PARAM_TYPE_FUNC, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x55}, CMD_DAT_BOL, 1 }, { {.s = RIG_LEVEL_SPECTRUM_AVG}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x87}, CMD_DAT_INT, 1 }, { {.s = RIG_LEVEL_USB_AF}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x00, 0x52}, CMD_DAT_LVL, 2 }, + { {.s = RIG_PARM_KEYERTYPE}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x02, 0x54}, CMD_DAT_INT, 1 }, { { 0 } } }; @@ -282,6 +283,7 @@ const struct rig_caps ic785x_caps = [PARM_BEEP] = {.min = {.i = 0}, .max = {.i = 1}, .step = {.i = 1}}, [PARM_TIME] = {.min = {.i = 0}, .max = {.i = 86399}, .step = {.i = 1}}, [PARM_ANN] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}}, + [PARM_KEYERTYPE] = {.step = {.s = "STRAIGHT, BUG, PADDLE"}}, }, .ext_tokens = ic785x_ext_tokens, diff --git a/rigs/icom/ic9100.c b/rigs/icom/ic9100.c index 15cc1a03c..2a8ef9dcc 100644 --- a/rigs/icom/ic9100.c +++ b/rigs/icom/ic9100.c @@ -89,6 +89,7 @@ struct cmdparams ic9100_extcmds[] = { { {.s = RIG_LEVEL_VOXDELAY}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x27}, CMD_DAT_INT, 1 }, + { {.s = RIG_PARM_KEYERTYPE}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x02}, CMD_DAT_INT, 1 }, { {.s = RIG_PARM_NONE} } }; @@ -142,6 +143,7 @@ const struct rig_caps ic9100_caps = [PARM_BACKLIGHT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f}}, [PARM_BANDSELECT] = {.step = {.s = "BANDUNUSED,BAND160M,BAND80M,BAND40M,BAND30M,BAND20M,BAND17M,BAND15M,BAND12M,BAND10M,BAND6M,BANDGEN"}}, [PARM_ANN] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}}, + [PARM_KEYERTYPE] = {.step = {.s = "STRAIGHT, BUG, PADDLE"}}, }, .ctcss_list = common_ctcss_list, diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index 2ba99cb1e..49f5ab9ed 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -3734,7 +3734,14 @@ declare_proto_rig(get_parm) fprintf(fout, "%s: ", cmd->arg2); } - if (RIG_PARM_IS_FLOAT(parm)) + if (parm == RIG_PARM_KEYERTYPE) + { + char *s = "STRAIGHT"; + if (val.i == 1) s = "BUG"; + else if (val.i == 2) s = "PADDLE"; + fprintf(fout, "%s%cv", s, resp_sep); + } + else if (RIG_PARM_IS_FLOAT(parm)) { rig_debug(RIG_DEBUG_ERR, "%s: float\n", __func__); fprintf(fout, "%f%c", val.f, resp_sep); commit 147dea76514d072598197d44eb6ce29ad997214d Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Aug 17 22:57:11 2023 -0500 Remove get_dsp_flt for G90 as it does not have that command diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index b1a1ca83a..daecdbf03 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -2761,7 +2761,12 @@ int icom_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) rig_set_vfo(rig, vfo); // force VFO } - retval = icom_get_dsp_flt(rig, *mode); + retval = 0; + // G90 does have dsp_flt command + if (rig->caps->rig_model != RIG_MODEL_G90) + { + retval = icom_get_dsp_flt(rig, *mode); + } *width = retval; if (retval == 0) @@ -2784,7 +2789,12 @@ int icom_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) // we need to figure out how to read VFOB without swapping VFOs //HAMLIB_TRACE; //rig_set_vfo(rig, RIG_VFO_B); - retval = icom_get_dsp_flt(rig, *mode); + retval = 0; + + if (rig->caps->rig_model != RIG_MODEL_G90) + { + retval = icom_get_dsp_flt(rig, *mode); + } *width = retval; if (*width == 0) { *width = rig->state.cache.widthMainA; } // we'll use VFOA's width commit ccd6472f031aec1f38f4ae4453be602712b8e71d Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Aug 17 22:49:20 2023 -0500 Fix KEYERTYPE in ic7300.c and add parsing of STRAIGHT, BUG, PADDLE for rigctl(d) https://xiegu.eu/downloads/ diff --git a/doc/man1/rigctl.1 b/doc/man1/rigctl.1 index e8d0efafc..584bc43c7 100644 --- a/doc/man1/rigctl.1 +++ b/doc/man1/rigctl.1 @@ -1022,7 +1022,7 @@ and .RI \(aq "Parm Value" \(aq. .IP Parm is a token: \(oqANN\(cq, \(oqAPO\(cq, \(oqBACKLIGHT\(cq, \(oqBEEP\(cq, -\(oqTIME\(cq, \(oqBAT\(cq, \(oqKEYLIGHT\(cq, \(oqSCREENSAVER\(cq, \(oqAFIF\(cq, \(oqBANDSELECT\(cq. +\(oqTIME\(cq, \(oqBAT\(cq, \(oqKEYLIGHT\(cq, \(oqSCREENSAVER\(cq, \(oqAFIF\(cq, \(oqBANDSELECT\(cq, \(oqKEYERTYPE\(cq. .IP .BR Note : Passing a \(oq?\(cq (query) as the first argument instead of a Parm token will @@ -1039,6 +1039,7 @@ Use this to determine the supported parameters of a given radio backend. SCREENSAVER -- rig specific timeouts AFIF -- 0=AF audio, 1=IF audio -- see IC-7300/9700/705 BANDSELECT -- band name, e.g. BAND160M, BAND80M.... a ? instead of band will show band possibilities + KEYERTYPE -- Icom keyer type 0,1,2 or STRAIGHT,BUG,PADDLE . .TP diff --git a/doc/man1/rigctld.1 b/doc/man1/rigctld.1 index 9913ea1f4..190556d16 100644 --- a/doc/man1/rigctld.1 +++ b/doc/man1/rigctld.1 @@ -922,7 +922,7 @@ and .RI \(aq "Parm Value" \(aq. .IP Parm is a token: \(oqANN\(cq, \(oqAPO\(cq, \(oqBACKLIGHT\(cq, \(oqBEEP\(cq, -\(oqTIME\(cq, \(oqBAT\(cq, \(oqKEYLIGHT\(cq, \(oqBANDSELECT\(cq. +\(oqTIME\(cq, \(oqBAT\(cq, \(oqKEYLIGHT\(cq, \(oqBANDSELECT\(cq, \(oqKEYERTYPE\(cq. .IP .BR Note : Passing a \(oq?\(cq (query) as the first argument instead of a Parm token will diff --git a/rigs/icom/ic7300.c b/rigs/icom/ic7300.c index 66efe1085..76e74c46c 100644 --- a/rigs/icom/ic7300.c +++ b/rigs/icom/ic7300.c @@ -234,7 +234,7 @@ struct cmdparams ic7300_extcmds[] = { {.s = RIG_LEVEL_SPECTRUM_AVG}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x02}, CMD_DAT_INT, 1 }, { {.s = RIG_LEVEL_USB_AF}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x00, 0x60}, CMD_DAT_LVL, 2 }, { {.s = RIG_PARM_BANDSELECT}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_BAND_REG, SC_MOD_RW, 0, {0x00}, CMD_DAT_INT, 1 }, - { {.s = RIG_PARM_KEYERTYPE}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_BAND_REG, SC_MOD_RW, 2, {0x01, 0x64}, CMD_DAT_INT, 1 }, + { {.s = RIG_PARM_KEYERTYPE}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x64}, CMD_DAT_INT, 1 }, { {.s = RIG_PARM_NONE} } }; @@ -250,7 +250,7 @@ struct cmdparams ic9700_extcmds[] = { {.s = RIG_FUNC_TRANSCEIVE}, CMD_PARAM_TYPE_FUNC, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x27}, CMD_DAT_BOL, 1 }, { {.s = RIG_LEVEL_SPECTRUM_AVG}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x92}, CMD_DAT_INT, 1 }, { {.s = RIG_LEVEL_USB_AF}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x06}, CMD_DAT_LVL, 2 }, - { {.s = RIG_PARM_KEYERTYPE}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_BAND_REG, SC_MOD_RW, 2, {0x02, 0x27}, CMD_DAT_INT, 1 }, + { {.s = RIG_PARM_KEYERTYPE}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x02, 0x27}, CMD_DAT_INT, 1 }, { {.s = RIG_PARM_NONE} } }; @@ -266,7 +266,7 @@ struct cmdparams ic705_extcmds[] = { {.s = RIG_FUNC_TRANSCEIVE}, CMD_PARAM_TYPE_FUNC, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x31}, CMD_DAT_BOL, 1 }, { {.s = RIG_LEVEL_SPECTRUM_AVG}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x78}, CMD_DAT_INT, 1 }, { {.s = RIG_LEVEL_USB_AF}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x13}, CMD_DAT_LVL, 2 }, - { {.s = RIG_PARM_KEYERTYPE}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_BAND_REG, SC_MOD_RW, 2, {0x02, 0x55}, CMD_DAT_INT, 1 }, + { {.s = RIG_PARM_KEYERTYPE}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x02, 0x55}, CMD_DAT_INT, 1 }, { {.s = RIG_PARM_NONE} } }; diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index e446ad700..2ba99cb1e 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -3562,6 +3562,13 @@ declare_proto_rig(set_parm) else RETURNFUNC2(-RIG_EINTERNAL); } + if (strcmp(arg1,"KEYERTYPE")==0 && strcmp(arg2,"?") != 0) + { + if (strcmp(arg2,"STRAIGHT")==0) arg2 = "0"; + else if (strcmp(arg2,"BUG")==0) arg2 = "1"; + else if (strcmp(arg2,"PADDLE")==0) arg2 = "2"; + } + parm = rig_parse_parm(arg1); if (!rig_has_set_parm(rig, parm)) commit 8c63fdeafc3c0011202a692cc29c64151df4d1b9 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Aug 17 17:52:03 2023 -0500 Add KEYERTYPE for IC-7300, IC-705, IC-9700 https://github.com/Hamlib/Hamlib/issues/1363 diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 374735446..b8a065797 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -1118,7 +1118,14 @@ enum rig_parm_e { RIG_PARM_KEYLIGHT = (1 << 7), /*!< \c KEYLIGHT -- Button backlight, on/off */ RIG_PARM_SCREENSAVER = (1 << 8), /*!< \c SCREENSAVER -- rig specific timeouts */ RIG_PARM_AFIF = (1 << 9), /*!< \c AFIF -- 0=AF audio, 1=IF audio -- see IC-7300/9700/705 */ - RIG_PARM_BANDSELECT = (1 << 10) /*!< \c BANDSELECT -- e.g. BAND160M, BAND80M, BAND70CM, BAND2CM */ + RIG_PARM_BANDSELECT = (1 << 10), /*!< \c BANDSELECT -- e.g. BAND160M, BAND80M, BAND70CM, BAND2CM */ + RIG_PARM_KEYERTYPE = (1 << 11) /*!< \c KEYERTYPE -- 0,1,2 or STRAIGHT PADDLE BUG */ +}; + +enum rig_keyertype_e { + RIG_KEYERTYPE_STRAIGHT = 0, + RIG_KEYERTYPE_BUG = (1 << 0), + RIG_KEYERTYPE_PADDLE = (2 << 0) }; /** diff --git a/rigs/icom/ic7300.c b/rigs/icom/ic7300.c index 879bed0c9..66efe1085 100644 --- a/rigs/icom/ic7300.c +++ b/rigs/icom/ic7300.c @@ -59,7 +59,7 @@ int ic9700_set_vfo(RIG *rig, vfo_t vfo); #define IC7300_VFOS (RIG_VFO_A|RIG_VFO_B|RIG_VFO_MEM) // RIG_PARM_BANDSELECT disabled until Icom can describe the return from 0x1a 0x01 //#define IC7300_PARMS (RIG_PARM_ANN|RIG_PARM_BACKLIGHT|RIG_PARM_TIME|RIG_PARM_BEEP|RIG_PARM_BANDSELECT) -#define IC7300_PARMS (RIG_PARM_ANN|RIG_PARM_BACKLIGHT|RIG_PARM_SCREENSAVER|RIG_PARM_TIME|RIG_PARM_BEEP) +#define IC7300_PARMS (RIG_PARM_ANN|RIG_PARM_BACKLIGHT|RIG_PARM_SCREENSAVER|RIG_PARM_TIME|RIG_PARM_BEEP|RIG_PARM_KEYERTYPE) #define IC7300_VFO_OPS (RIG_OP_CPY|RIG_OP_XCHG|RIG_OP_FROM_VFO|RIG_OP_TO_VFO|RIG_OP_MCL|RIG_OP_TUNE) #define IC7300_SCAN_OPS (RIG_SCAN_STOP|RIG_SCAN_MEM|RIG_SCAN_PROG|RIG_SCAN_SLCT) @@ -149,7 +149,7 @@ int ic9700_set_vfo(RIG *rig, vfo_t vfo); #define IC9700_VFOS (RIG_VFO_A|RIG_VFO_B|RIG_VFO_MAIN|RIG_VFO_SUB|RIG_VFO_MEM|RIG_VFO_MAIN_A|RIG_VFO_MAIN_B|RIG_VFO_SUB_A|RIG_VFO_SUB_B) // RIG_PARM_BANDSELECT disabled until Icom can describe the return from 0x1a 0x01 //#define IC9700_PARMS (RIG_PARM_ANN|RIG_PARM_BACKLIGHT|RIG_PARM_TIME|RIG_PARM_BEEP|RIG_PARM_SCREENSAVER|RIG_PARM_BANDSELECT) -#define IC9700_PARMS (RIG_PARM_ANN|RIG_PARM_BACKLIGHT|RIG_PARM_TIME|RIG_PARM_BEEP|RIG_PARM_SCREENSAVER) +#define IC9700_PARMS (RIG_PARM_ANN|RIG_PARM_BACKLIGHT|RIG_PARM_TIME|RIG_PARM_BEEP|RIG_PARM_SCREENSAVER|RIG_PARM_KEYERTYPE) #define IC9700_FUNCS (RIG_FUNC_NB|RIG_FUNC_COMP|RIG_FUNC_VOX|RIG_FUNC_TONE|RIG_FUNC_TSQL|RIG_FUNC_SBKIN|RIG_FUNC_FBKIN|RIG_FUNC_NR|RIG_FUNC_MON|RIG_FUNC_MN|RIG_FUNC_ANF|RIG_FUNC_LOCK|RIG_FUNC_RIT|RIG_FUNC_SCOPE|RIG_FUNC_SATMODE|RIG_FUNC_DUAL_WATCH|RIG_FUNC_AFC|RIG_FUNC_TRANSCEIVE|RIG_FUNC_SPECTRUM|RIG_FUNC_SPECTRUM_HOLD|RIG_FUNC_SEND_MORSE|RIG_FUNC_SEND_VOICE_MEM|RIG_FUNC_OVF_STATUS) #define IC9700_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|RIG_LEVEL_USB_AF|RIG_LEVEL_AGC_TIME) #define IC9700_VFO_OPS (RIG_OP_CPY|RIG_OP_XCHG|RIG_OP_FROM_VFO|RIG_OP_TO_VFO|RIG_OP_MCL) @@ -234,6 +234,7 @@ struct cmdparams ic7300_extcmds[] = { {.s = RIG_LEVEL_SPECTRUM_AVG}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x02}, CMD_DAT_INT, 1 }, { {.s = RIG_LEVEL_USB_AF}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x00, 0x60}, CMD_DAT_LVL, 2 }, { {.s = RIG_PARM_BANDSELECT}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_BAND_REG, SC_MOD_RW, 0, {0x00}, CMD_DAT_INT, 1 }, + { {.s = RIG_PARM_KEYERTYPE}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_BAND_REG, SC_MOD_RW, 2, {0x01, 0x64}, CMD_DAT_INT, 1 }, { {.s = RIG_PARM_NONE} } }; @@ -249,6 +250,7 @@ struct cmdparams ic9700_extcmds[] = { {.s = RIG_FUNC_TRANSCEIVE}, CMD_PARAM_TYPE_FUNC, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x27}, CMD_DAT_BOL, 1 }, { {.s = RIG_LEVEL_SPECTRUM_AVG}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x92}, CMD_DAT_INT, 1 }, { {.s = RIG_LEVEL_USB_AF}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x06}, CMD_DAT_LVL, 2 }, + { {.s = RIG_PARM_KEYERTYPE}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_BAND_REG, SC_MOD_RW, 2, {0x02, 0x27}, CMD_DAT_INT, 1 }, { {.s = RIG_PARM_NONE} } }; @@ -264,6 +266,7 @@ struct cmdparams ic705_extcmds[] = { {.s = RIG_FUNC_TRANSCEIVE}, CMD_PARAM_TYPE_FUNC, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x31}, CMD_DAT_BOL, 1 }, { {.s = RIG_LEVEL_SPECTRUM_AVG}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x78}, CMD_DAT_INT, 1 }, { {.s = RIG_LEVEL_USB_AF}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x13}, CMD_DAT_LVL, 2 }, + { {.s = RIG_PARM_KEYERTYPE}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_BAND_REG, SC_MOD_RW, 2, {0x02, 0x55}, CMD_DAT_INT, 1 }, { {.s = RIG_PARM_NONE} } }; @@ -724,6 +727,7 @@ const struct rig_caps ic7300_caps = [PARM_BEEP] = {.min = {.i = 0}, .max = {.i = 1}, .step = {.i = 1}}, [PARM_SCREENSAVER] = {.min = {.i = 0}, .max = {.i = 3}, .step = {.i = 1}}, [PARM_TIME] = {.min = {.i = 0}, .max = {.i = 86399}, .step = {.i = 1}}, + [PARM_KEYERTYPE] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}}, }, .ext_tokens = ic7300_ext_tokens, .extlevels = icom_ext_levels, @@ -964,7 +968,8 @@ struct rig_caps ic9700_caps = [PARM_BACKLIGHT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f}}, [PARM_BANDSELECT] = {.step = {.s = "BANDUNUSED,BAND70CM,BAND33CM,BAND23CM"}}, [PARM_BEEP] = {.min = {.i = 0}, .max = {.i = 1}}, - [PARM_SCREENSAVER] = {.min = {.i = 0}, .max = {.i = 3}, .step = {.i = 1}} + [PARM_SCREENSAVER] = {.min = {.i = 0}, .max = {.i = 3}, .step = {.i = 1}}, + [PARM_KEYERTYPE] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}}, }, .ext_tokens = ic9700_ext_tokens, .extlevels = icom_ext_levels, @@ -1556,6 +1561,7 @@ const struct rig_caps ic905_caps = [PARM_BANDSELECT] = {.step = {.s = "BANDUNUSED,BAND70CM,BAND33CM,BAND23CM,BAND23CM,BAND13CM,BAND3CM"}}, [PARM_BEEP] = {.min = {.i = 0}, .max = {.i = 1}}, [PARM_SCREENSAVER] = {.min = {.i = 0}, .max = {.i = 3}, .step = {.i = 1}}, + [PARM_KEYERTYPE] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}}, }, .ext_tokens = ic705_ext_tokens, .extlevels = icom_ext_levels, diff --git a/src/idx_builtin.h b/src/idx_builtin.h index c0fafe62d..4a607189c 100644 --- a/src/idx_builtin.h +++ b/src/idx_builtin.h @@ -189,6 +189,7 @@ #define PARM_KEYLIGHT setting2idx_builtin(RIG_PARM_KEYLIGHT) #define PARM_BANDSELECT setting2idx_builtin(RIG_PARM_BANDSELECT) #define PARM_SCREENSAVER setting2idx_builtin(RIG_PARM_SCREENSAVER) +#define PARM_KEYERTYPE setting2idx_builtin(RIG_PARM_KEYERTYPE) /* Rotator levels */ diff --git a/src/misc.c b/src/misc.c index eff013560..c4304f89b 100644 --- a/src/misc.c +++ b/src/misc.c @@ -1270,6 +1270,7 @@ static const struct { RIG_PARM_KEYLIGHT, "KEYLIGHT"}, { RIG_PARM_SCREENSAVER, "SCREENSAVER"}, { RIG_PARM_BANDSELECT, "BANDSELECT"}, + { RIG_PARM_KEYERTYPE, "KEYERTYPE"}, { RIG_PARM_NONE, "" }, }; commit aa338afa1ad2a70e2e06507f092e478c1b47cd9c Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Aug 17 17:12:33 2023 -0500 Fix parm_gran for Kenwood https://github.com/Hamlib/Hamlib/issues/1357 diff --git a/rigs/kenwood/r5000.c b/rigs/kenwood/r5000.c index d9be871c8..b9041db2c 100644 --- a/rigs/kenwood/r5000.c +++ b/rigs/kenwood/r5000.c @@ -82,7 +82,10 @@ const struct rig_caps r5000_caps = .has_set_level = RIG_LEVEL_SET(R5000_LEVEL_ALL), .has_get_parm = R5000_PARM_ALL, .has_set_parm = RIG_PARM_SET(R5000_PARM_ALL), - .parm_gran = {}, + .parm_gran = { + [PARM_TIME] = {.min = {.i = 0}, .max = {.i = 86399}, .step = {.i = 1}}, + }, + .ctcss_list = NULL, .dcs_list = NULL, .preamp = { RIG_DBLST_END, }, diff --git a/rigs/kenwood/thd7.c b/rigs/kenwood/thd7.c index fbd871ad1..4a6cb48ba 100644 --- a/rigs/kenwood/thd7.c +++ b/rigs/kenwood/thd7.c @@ -110,7 +110,9 @@ const struct rig_caps thd7a_caps = { #include "level_gran_kenwood.h" }, - .parm_gran = {}, + .parm_gran = { + [PARM_BACKLIGHT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f}}, + }, .ctcss_list = kenwood38_ctcss_list, .dcs_list = NULL, .preamp = { RIG_DBLST_END, }, diff --git a/rigs/kenwood/thd72.c b/rigs/kenwood/thd72.c index 9ee9f3280..b939b26d1 100644 --- a/rigs/kenwood/thd72.c +++ b/rigs/kenwood/thd72.c @@ -1651,7 +1651,10 @@ const struct rig_caps thd72a_caps = { #include "level_gran_kenwood.h" }, - .parm_gran = {}, + .parm_gran = { + [PARM_TIME] = {.min = {.i = 0}, .max = {.i = 86399}, .step = {.i = 1}}, + [PARM_APO] = { .min = { .i = 1 }, .max = { .i = 1439} }, + }, .ctcss_list = kenwood42_ctcss_list, .dcs_list = thd72dcs_list, .preamp = { RIG_DBLST_END, }, diff --git a/rigs/kenwood/thd74.c b/rigs/kenwood/thd74.c index 07ba4660a..a46a892aa 100644 --- a/rigs/kenwood/thd74.c +++ b/rigs/kenwood/thd74.c @@ -1677,7 +1677,12 @@ const struct rig_caps thd74_caps = { #include "level_gran_kenwood.h" }, - .parm_gran = {}, + .parm_gran = { + [PARM_TIME] = {.min = {.i = 0}, .max = {.i = 86399}, .step = {.i = 1}}, + }, + + + .ctcss_list = kenwood38_ctcss_list, .dcs_list = NULL, .preamp = { RIG_DBLST_END, }, commit 63bb03cb07809fb8ee865a65351317e353d11085 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Aug 17 16:57:05 2023 -0500 Fix Yaesu gran_parm https://github.com/Hamlib/Hamlib/issues/1357 diff --git a/rigs/yaesu/frg100.c b/rigs/yaesu/frg100.c index 2dc155cec..975cd097d 100644 --- a/rigs/yaesu/frg100.c +++ b/rigs/yaesu/frg100.c @@ -174,7 +174,7 @@ const struct rig_caps frg100_caps = .has_get_level = RIG_LEVEL_RAWSTR, .has_set_level = RIG_LEVEL_BAND_SELECT, .has_get_parm = RIG_PARM_NONE, - .has_set_parm = RIG_PARM_BACKLIGHT, + .has_set_parm = RIG_PARM_NONE, .level_gran = { #include "level_gran_yaesu.h" diff --git a/rigs/yaesu/ft1000d.c b/rigs/yaesu/ft1000d.c index 8891d62df..9cd013f6a 100644 --- a/rigs/yaesu/ft1000d.c +++ b/rigs/yaesu/ft1000d.c @@ -296,6 +296,9 @@ const struct rig_caps ft1000d_caps = { #include "level_gran_yaesu.h" }, + .parm_gran = { + [PARM_BACKLIGHT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 13.0f}}, + }, .ctcss_list = NULL, .dcs_list = NULL, .preamp = { RIG_DBLST_END, }, diff --git a/rigs/yaesu/ft990.c b/rigs/yaesu/ft990.c index 8d059cb7e..5a2c9c5ce 100755 --- a/rigs/yaesu/ft990.c +++ b/rigs/yaesu/ft990.c @@ -263,6 +263,10 @@ const struct rig_caps ft990_caps = { #include "level_gran_yaesu.h" }, + .parm_gran = { + [PARM_BACKLIGHT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f}}, + }, + .ctcss_list = NULL, .dcs_list = NULL, .preamp = { RIG_DBLST_END, }, diff --git a/rigs/yaesu/ft990v12.c b/rigs/yaesu/ft990v12.c index b7f9f0656..eb445fad2 100644 --- a/rigs/yaesu/ft990v12.c +++ b/rigs/yaesu/ft990v12.c @@ -278,6 +278,10 @@ const struct rig_caps ft990uni_caps = .has_set_level = RIG_LEVEL_BAND_SELECT, .has_get_parm = RIG_PARM_NONE, .has_set_parm = RIG_PARM_BACKLIGHT, + .parm_gran = { + [PARM_BACKLIGHT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 13.0f}}, + }, + .ctcss_list = NULL, .dcs_list = NULL, .preamp = { RIG_DBLST_END, }, commit e88715240774db70a4e41d872cf4aa5f17e5b8a9 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Aug 17 16:04:45 2023 -0500 Fix parm_gran https://github.com/Hamlib/Hamlib/issues/1357 diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 09a563638..374735446 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -1146,7 +1146,7 @@ enum multicast_item_e { }; //! @cond Doxygen_Suppress -#define RIG_PARM_FLOAT_LIST (RIG_PARM_BACKLIGHT|RIG_PARM_BAT|RIG_PARM_KEYLIGHT) +#define RIG_PARM_FLOAT_LIST (RIG_PARM_BACKLIGHT|RIG_PARM_BAT|RIG_PARM_KEYLIGHT|RIG_PARM_BACKLIGHT) #define RIG_PARM_STRING_LIST (RIG_PARM_BANDSELECT) #define RIG_PARM_READONLY_LIST (RIG_PARM_BAT) diff --git a/rigs/icom/ic7000.c b/rigs/icom/ic7000.c index f6aaefdf2..f8e0d0546 100644 --- a/rigs/icom/ic7000.c +++ b/rigs/icom/ic7000.c @@ -137,6 +137,7 @@ struct cmdparams ic7000_extcmds[] = { { {.s = RIG_LEVEL_VOXDELAY}, CMD_PARAM_TYPE_LEVEL, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x17}, CMD_DAT_INT, 1 }, + { {.s = RIG_PARM_TIME}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x00, 0x41}, CMD_DAT_TIM, 2 }, { {.s = RIG_PARM_NONE} } }; @@ -226,7 +227,14 @@ const struct rig_caps ic7000_caps = [LVL_KEYSPD] = { .min = { .i = 6 }, .max = { .i = 48 }, .step = { .i = 1 } }, [LVL_CWPITCH] = { .min = { .i = 300 }, .max = { .i = 900 }, .step = { .i = 1 } }, }, - .parm_gran = {}, + .parm_gran = { + [PARM_BACKLIGHT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f}}, + [PARM_BEEP] = {.min = {.i = 0}, .max = {.i = 1}, .step = {.i = 1}}, + [PARM_TIME] = {.min = {.i = 0}, .max = {.i = 86399}, .step = {.i = 1}}, + [PARM_APO] = {.min = {.i = 0}, .max = {.i = 3}, .step = {.i = 1}}, + [PARM_ANN] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}}, + }, + .ctcss_list = common_ctcss_list, .dcs_list = common_dcs_list, .preamp = { 10, RIG_DBLST_END, }, /* FIXME: TBC it's a guess */ @@ -345,8 +353,8 @@ const struct rig_caps ic7000_caps = .get_level = icom_get_level, .set_func = icom_set_func, .get_func = icom_get_func, - .set_parm = NULL, - .get_parm = NULL, + .set_parm = icom_set_parm, + .get_parm = icom_get_parm, .set_mem = icom_set_mem, .set_bank = icom_set_bank, .vfo_op = icom_vfo_op, diff --git a/rigs/icom/ic7100.c b/rigs/icom/ic7100.c index b33d44038..d626c6810 100644 --- a/rigs/icom/ic7100.c +++ b/rigs/icom/ic7100.c @@ -98,7 +98,9 @@ RIG_LEVEL_NB | \ RIG_LEVEL_AGC_TIME) -#define IC7100_PARM_ALL (RIG_PARM_ANN|RIG_PARM_BACKLIGHT|RIG_PARM_KEYLIGHT|RIG_PARM_BEEP|RIG_PARM_TIME|RIG_PARM_BANDSELECT) +//#define IC7100_PARM_ALL (RIG_PARM_ANN|RIG_PARM_BACKLIGHT|RIG_PARM_KEYLIGHT|RIG_PARM_BEEP|RIG_PARM_TIME|RIG_PARM_BANDSELECT) +// BANDSELECT disabled unti we figure out Icom's ability +#define IC7100_PARM_ALL (RIG_PARM_ANN|RIG_PARM_BACKLIGHT|RIG_PARM_KEYLIGHT|RIG_PARM_BEEP|RIG_PARM_TIME) int ic7100_tokens[] = { TOK_DSTAR_CODE, TOK_DSTAR_DSQL, TOK_DSTAR_CALL_SIGN, TOK_DSTAR_MESSAGE, TOK_DSTAR_STATUS, TOK_DSTAR_MY_CS, TOK_DSTAR_TX_CS, TOK_DSTAR_TX_MESS, @@ -347,8 +349,16 @@ const struct rig_caps ic7100_caps = .extfuncs = icom_ext_funcs, .extparms = icom_ext_parms, .parm_gran = { - [PARM_BANDSELECT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.s = "BAND160M,BAND80M,BAND40M,BAND30M,BAND20M,BAND17M,BAND15M,BAND12M,BAND10M,BAND6M,BAND2M,BAND70CM,BANDGEN"}} - }, + [PARM_BACKLIGHT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f}}, + [PARM_KEYLIGHT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f}}, + [PARM_BANDSELECT] = {.step = {.s = "BANDUNUSED,BAND160M,BAND80M,BAND40M,BAND30M,BAND20M,BAND17M,BAND15M,BAND12M,BAND10M,BAND6M,BANDGEN"}}, + [PARM_BEEP] = {.min = {.i = 0}, .max = {.i = 1}, .step = {.i = 1}}, + [PARM_SCREENSAVER] = {.min = {.i = 0}, .max = {.i = 3}, .step = {.i = 1}}, + [PARM_TIME] = {.min = {.i = 0}, .max = {.i = 86399}, .step = {.i = 1}}, + [PARM_ANN] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}}, + [PARM_APO] = { .min = { .i = 1 }, .max = { .i = 1439} }, + }, + .ctcss_list = common_ctcss_list, .dcs_list = common_dcs_list, .preamp = { 1, 2, RIG_DBLST_END, }, diff --git a/rigs/icom/ic7200.c b/rigs/icom/ic7200.c index 9b964552a..01a451827 100644 --- a/rigs/icom/ic7200.c +++ b/rigs/icom/ic7200.c @@ -155,7 +155,15 @@ const struct rig_caps ic7200_caps = [LVL_KEYSPD] = { .min = { .i = 6 }, .max = { .i = 48 }, .step = { .i = 1 } }, [LVL_CWPITCH] = { .min = { .i = 300 }, .max = { .i = 900 }, .step = { .i = 1 } }, }, - .parm_gran = {}, + .parm_gran = { + [PARM_BACKLIGHT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f}}, + [PARM_BANDSELECT] = {.step = {.s = "BANDUNUSED,BAND160M,BAND80M,BAND40M,BAND30M,BAND20M,BAND17M,BAND15M,BAND12M,BAND10M,BAND6M,BANDGEN"}}, + [PARM_BEEP] = {.min = {.i = 0}, .max = {.i = 1}, .step = {.i = 1}}, + [PARM_TIME] = {.min = {.i = 0}, .max = {.i = 86399}, .step = {.i = 1}}, + [PARM_ANN] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}}, + [PARM_APO] = { .min = { .i = 1 }, .max = { .i = 1439} }, + }, + .ctcss_list = NULL, .dcs_list = NULL, .preamp = { 10, RIG_DBLST_END, }, /* FIXME: TBC it's a guess */ diff --git a/rigs/icom/ic7300.c b/rigs/icom/ic7300.c index ba92742e2..879bed0c9 100644 --- a/rigs/icom/ic7300.c +++ b/rigs/icom/ic7300.c @@ -223,6 +223,7 @@ int ic9700_set_vfo(RIG *rig, vfo_t vfo); struct cmdparams ic7300_extcmds[] = { + { {.s = RIG_PARM_ANN}, CMD_PARAM_TYPE_PARM, C_CTL_ANN, 0, SC_MOD_WR, 0, {0x00}, CMD_DAT_INT, 1 }, { {.s = RIG_PARM_BEEP}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x00, 0x23}, CMD_DAT_BOL, 1 }, { {.s = RIG_PARM_BACKLIGHT}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x00, 0x81}, CMD_DAT_LVL, 2 }, { {.s = RIG_PARM_SCREENSAVER}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x00, 0x89}, CMD_DAT_INT, 1 }, @@ -238,6 +239,7 @@ struct cmdparams ic7300_extcmds[] = struct cmdparams ic9700_extcmds[] = { + { {.s = RIG_PARM_ANN}, CMD_PARAM_TYPE_PARM, C_CTL_ANN, 0, SC_MOD_WR, 0, {0x00}, CMD_DAT_INT, 1 }, { {.s = RIG_PARM_BEEP}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x00, 0x29}, CMD_DAT_BOL, 1 }, { {.s = RIG_PARM_BACKLIGHT}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x52}, CMD_DAT_LVL, 2 }, { {.s = RIG_PARM_SCREENSAVER}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x67}, CMD_DAT_INT, 1 }, @@ -252,6 +254,7 @@ struct cmdparams ic9700_extcmds[] = struct cmdparams ic705_extcmds[] = { + { {.s = RIG_PARM_ANN}, CMD_PARAM_TYPE_PARM, C_CTL_ANN, 0, SC_MOD_WR, 0, {0x00}, CMD_DAT_INT, 1 }, { {.s = RIG_PARM_BEEP}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x00, 0x31}, CMD_DAT_BOL, 1 }, { {.s = RIG_PARM_BACKLIGHT}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x36}, CMD_DAT_LVL, 2 }, { {.s = RIG_PARM_SCREENSAVER}, CMD_PARAM_TYPE_PARM, C_CTL_MEM, S_MEM_PARM, SC_MOD_RW, 2, {0x01, 0x38}, CMD_DAT_INT, 1 }, @@ -715,7 +718,12 @@ const struct rig_caps ic7300_caps = [LVL_USB_AF] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f }}, }, .parm_gran = { - [PARM_BANDSELECT] = {.step = {.s = "BANDUNUSED,BAND160M,BAND80M,BAND40M,BAND30M,BAND20M,BAND17M,BAND15M,BAND12M,BAND10M,BAND6M,BANDGEN"}} + [PARM_ANN] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}}, + [PARM_BACKLIGHT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f}}, + [PARM_BANDSELECT] = {.step = {.s = "BANDUNUSED,BAND160M,BAND80M,BAND40M,BAND30M,BAND20M,BAND17M,BAND15M,BAND12M,BAND10M,BAND6M,BANDGEN"}}, + [PARM_BEEP] = {.min = {.i = 0}, .max = {.i = 1}, .step = {.i = 1}}, + [PARM_SCREENSAVER] = {.min = {.i = 0}, .max = {.i = 3}, .step = {.i = 1}}, + [PARM_TIME] = {.min = {.i = 0}, .max = {.i = 86399}, .step = {.i = 1}}, }, .ext_tokens = ic7300_ext_tokens, .extlevels = icom_ext_levels, @@ -953,7 +961,10 @@ struct rig_caps ic9700_caps = [LVL_USB_AF] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f }}, }, .parm_gran = { - [PARM_BANDSELECT] = {.step = {.s = "BANDUNUSED,BAND70CM,BAND33CM,BAND23CM"}} + [PARM_BACKLIGHT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f}}, + [PARM_BANDSELECT] = {.step = {.s = "BANDUNUSED,BAND70CM,BAND33CM,BAND23CM"}}, + [PARM_BEEP] = {.min = {.i = 0}, .max = {.i = 1}}, + [PARM_SCREENSAVER] = {.min = {.i = 0}, .max = {.i = 3}, .step = {.i = 1}} }, .ext_tokens = ic9700_ext_tokens, .extlevels = icom_ext_levels, @@ -1269,7 +1280,10 @@ const struct rig_caps ic705_caps = [LVL_USB_AF] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f }}, }, .parm_gran = { - [PARM_BANDSELECT] = {.step = {.s = "BANDUNUSED,BAND160M,BAND80M,BAND40M,BAND30M,BAND20M,BAND17M,BAND15M,BAND12M,BAND10M,BAND6M,BANDWFM,BANDAIR,BAND70CM,BAND33CM,BANDGEN"}} + [PARM_BACKLIGHT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f}}, + [PARM_BANDSELECT] = {.step = {.s = "BANDUNUSED,BAND160M,BAND80M,BAND40M,BAND30M,BAND20M,BAND17M,BAND15M,BAND12M,BAND10M,BAND6M,BANDWFM,BANDAIR,BAND70CM,BAND33CM,BANDGEN"}}, + [PARM_BEEP] = {.min = {.i = 0}, .max = {.i = 1}}, + [PARM_SCREENSAVER] = {.min = {.i = 0}, .max = {.i = 3}, .step = {.i = 1}}, }, .ext_tokens = ic705_ext_tokens, .extlevels = icom_ext_levels, @@ -1538,7 +1552,10 @@ const struct rig_caps ic905_caps = [LVL_USB_AF] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f }}, }, .parm_gran = { - [PARM_BANDSELECT] = {.step = {.s = "BANDUNUSED,BAND70CM,BAND33CM,BAND23CM,BAND23CM,BAND13CM,BAND3CM"}} + [PARM_BACKLIGHT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f}}, + [PARM_BANDSELECT] = {.step = {.s = "BANDUNUSED,BAND70CM,BAND33CM,BAND23CM,BAND23CM,BAND13CM,BAND3CM"}}, + [PARM_BEEP] = {.min = {.i = 0}, .max = {.i = 1}}, + [PARM_SCREENSAVER] = {.min = {.i = 0}, .max = {.i = 3}, .step = {.i = 1}}, }, .ext_tokens = ic705_ext_tokens, .extlevels = icom_ext_levels, @@ -1857,8 +1874,10 @@ int ic7300_get_parm(RIG *rig, setting_t parm, value_t *val) switch (parm) { +#if 0 case RIG_PARM_ANN: return -RIG_ENIMPL; // How can we implement this? +#endif default: rig_debug(RIG_DEBUG_TRACE, "%s: using icom routine for PARM=%s\n", __func__, @@ -1887,9 +1906,11 @@ int ic7300_get_parm(RIG *rig, setting_t parm, value_t *val) switch (parm) { +#if 0 case RIG_PARM_ANN: rig_debug(RIG_DEBUG_WARN, "%s: not implemented\n", __func__); return -RIG_ENIMPL; +#endif default: return icom_get_parm(rig, parm, val); diff --git a/rigs/icom/ic7410.c b/rigs/icom/ic7410.c index 3100397dc..937b87bac 100644 --- a/rigs/icom/ic7410.c +++ b/rigs/icom/ic7410.c @@ -154,7 +154,11 @@ const struct rig_caps ic7410_caps = [LVL_KEYSPD] = { .min = { .i = 6 }, .max = { .i = 48 }, .step = { .i = 1 } }, [LVL_CWPITCH] = { .min = { .i = 300 }, .max = { .i = 900 }, .step = { .i = 1 } }, }, - .parm_gran = {}, + .parm_gran = { + [PARM_BACKLIGHT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f}}, + [PARM_ANN] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}}, + }, + .ctcss_list = common_ctcss_list, .dcs_list = NULL, .preamp = { 10, 20, RIG_DBLST_END, }, /* FIXME: TBC */ diff --git a/rigs/icom/ic746.c b/rigs/icom/ic746.c index 95787dcb9..81c092b6f 100644 --- a/rigs/icom/ic746.c +++ b/rigs/icom/ic746.c @@ -446,7 +446,12 @@ const struct rig_caps ic746pro_caps = #include "level_gran_icom.h" [LVL_RAWSTR] = { .min = { .i = 0 }, .max = { .i = 255 } }, }, - .parm_gran = {}, + .parm_gran = { + [PARM_BACKLIGHT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f}}, + [PARM_BEEP] = {.min = {.i = 0}, .max = {.i = 1}, .step = {.i = 1}}, + [PARM_ANN] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}}, + }, + .extparms = ic746pro_ext_parms, .ctcss_list = common_ctcss_list, .dcs_list = full_dcs_list, diff --git a/rigs/icom/ic756.c b/rigs/icom/ic756.c index 25cf15f56..afeda348a 100644 --- a/rigs/icom/ic756.c +++ b/rigs/icom/ic756.c @@ -1014,7 +1014,13 @@ const struct rig_caps ic756pro3_caps = [LVL_KEYSPD] = { .min = { .i = 6 }, .max = { .i = 48 }, .step = { .i = 1 } }, [LVL_CWPITCH] = { .min = { .i = 300 }, .max = { .i = 900 }, .step = { .i = 1 } }, }, - .parm_gran = {}, + .parm_gran = { + [PARM_BACKLIGHT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f}}, + [PARM_BEEP] = {.min = {.i = 0}, .max = {.i = 1}, .step = {.i = 1}}, + [PARM_TIME] = {.min = {.i = 0}, .max = {.i = 86399}, .step = {.i = 1}}, + [PARM_ANN] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}}, + }, + .extparms = ic756pro2_ext_parms, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/icom/ic7600.c b/rigs/icom/ic7600.c index faeb11e5e..fc0ba365f 100644 --- a/rigs/icom/ic7600.c +++ b/rigs/icom/ic7600.c @@ -308,7 +308,15 @@ struct rig_caps ic7600_caps = [LVL_KEYSPD] = { .min = { .i = 6 }, .max = { .i = 48 }, .step = { .i = 1 } }, [LVL_CWPITCH] = { .min = { .i = 300 }, .max = { .i = 900 }, .step = { .i = 1 } }, }, - .parm_gran = {}, + .parm_gran = { + [PARM_BACKLIGHT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f}}, + [PARM_KEYLIGHT] = {.min = {.f = 0.0f}, .max = {.f = 1.0f}, .step = {.f = 1.0f / 255.0f}}, + [PARM_BEEP] = {.min = {.i = 0}, .max = {.i = 1}, .step = {.i = 1}}, + [PARM_TIME] = {.min = {.i = 0}, .max = {.i = 86399}, .step = {.i = 1}}, + [PARM_ANN] = {.min = {.i = 0}, .max = {.i = 2}, .step = {.i = 1}}, + [PARM_APO] = { .min = { .i = 1 }, .max = { .i = 1439} }, + }, + .ext_tokens = ic7600_ext_tokens, .extfuncs = icom_e... [truncated message content] |
From: n0nb <n0...@us...> - 2023-08-09 13:31:38
|
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 11d2f34ec8f2ac2d972f33e497ff10b0a837ab2b (commit) via 22aee2ff31aa0eb7aae8b51e5ae3bc4939113737 (commit) via 55370c1e64176ddb86a9230049feb557d5d9da4d (commit) via dfb923e001998b6630a262e0c4c08cadc5e7596e (commit) via 23ae64eeadc2e4fb6a5d04f53503cdfc6956e0fc (commit) via 457b09d50fc286052a0a9c927af1aebb448d38db (commit) via 93a1d90889a547e24a65ef3179e34eea6d60f8ba (commit) via 11f8a33e76c970b9e6280cb40ca8e0d1a4631a54 (commit) via 6c3e5a6b7f341bfd1fe4e4bce4338ef76879bb35 (commit) via b1bef6101b7a1c22139826aba2787c7277c08f24 (commit) via 915ee383fbe28806b10744eba744201579c5fa35 (commit) via cbec337cd3f5cbaa9263a84139b4c29c81d48891 (commit) via 90f0ffcdc9b9298728cd70864a500ff7c5a21f48 (commit) via 2194d0dac9b0fd39c9551d7eac7f8996de639d87 (commit) via 12f855dbacb80a5b518cfe3021ec442b30825b51 (commit) via 18390bdbf8901847db555c79743fb4156e1dd15a (commit) via aa3cf8988640b84b04311ede5054f9a3a3bc81ec (commit) via 17c5a8aed9cffafc100606ff35852c60faf422a0 (commit) via 364a1360007c962f29229d58392f90e17ac3137a (commit) via 7c57a22ac893c5514d58467f847f0e8653405503 (commit) via 145c9e0c80a439a1af05c43768f53c797ac99b84 (commit) via bf9835791beb3261ffc0d367345e3aed30428b04 (commit) via 10f88807e6c48a6ca6229694fdc2c10450244c44 (commit) via 82c169527dbe267a26f40f50b41b51f8cc54e3b2 (commit) via 4f14e14993020930495a7603a0878d66be1c5f4d (commit) via 652e12a44610e5121d10a6053205eb8386b3c0c1 (commit) via a29eb33e6e1b2c29f4bfce5ea8e74a8435504c0b (commit) via 321f3f8ab42c5961b7ac5f484ff99d6fc0a61762 (commit) via a9b3d62f41130712aabf1bb201630f7525a293ef (commit) via 8cf3d5c02c654b89c4113dea98625ff669cb4ce6 (commit) via 2c81d04ec02f046073fb6b6df96d0cb25f75d3ab (commit) via 2f818472abe3b20aeaf0f38f0bb4ee897c7b13d8 (commit) via 89214bf132680357f4948be799bab2ae305cb3c2 (commit) via 3eafbcad111891b2798def5ca1ff504f87eecdf6 (commit) via d03affebea4d3c343a4f934b4d72f1205b6cc1ac (commit) via deaf44c8c61fe6e5f31c5369cf29ce4a6b647351 (commit) via 6c89f0045ff8a38b0ad513e6d57c8646f1303a63 (commit) via d5828f65ffcbee8a021644ec2dd29ebf194eda71 (commit) via 97b341eb3fbced984340eb33c82ef8d94a1fecdb (commit) via 494252fe1cf27ce20c8a3a081a21f01cb1ec1286 (commit) via d76e28d7720e11ea826ba08a5069979744968558 (commit) via 5ddfefb91dfbdcafedae0fd070b552d495bb3521 (commit) via bbff9fae9f3fb325e08bb6a2b7fcdce8eaf2b066 (commit) via 8a49278682d55363417f9f497a1aa2dfb39dd8db (commit) via a4b88ee84aaaa733b534586cbf1506d9da325f06 (commit) via d48d12c97294e61b91026713d2e89dde3eff052c (commit) via 6a4e31f89009c5adedb9c38ba4f9e8b966447383 (commit) via 2e34bb599184aba7dcbc358367bcdee7250760a5 (commit) via 503f27e20c060719077d73a6157b22d1f2a1906a (commit) via f0821041a2c48a2c6da5e5f437a72ebdd291c360 (commit) via 0228614a1759eda971b27d9e3a8a8d103ea1a8bd (commit) via 17382c03c63b69e3f75921a94bcb4cf0a47cbba7 (commit) via 6aa13e45c7a44809ecd216a23461fab06d6bd603 (commit) from 56de3bb25d0e0c9919681c86ec3c2c235697d381 (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 11d2f34ec8f2ac2d972f33e497ff10b0a837ab2b Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Aug 8 15:42:40 2023 -0500 Fix rigctlsync.1 man page diff --git a/doc/man1/rigctlsync.1 b/doc/man1/rigctlsync.1 index 369950ad6..e2c504b1b 100644 --- a/doc/man1/rigctlsync.1 +++ b/doc/man1/rigctlsync.1 @@ -259,7 +259,7 @@ if an error was returned by Start .B rigctlsync with FLRig as the Hamlib model -.UE +.UE . . .PP .in +4n commit 22aee2ff31aa0eb7aae8b51e5ae3bc4939113737 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Aug 7 23:30:29 2023 -0500 Update simulators diff --git a/simulators/simic7100.c b/simulators/simic7100.c index f19b074c7..f05e44c44 100644 --- a/simulators/simic7100.c +++ b/simulators/simic7100.c @@ -200,6 +200,7 @@ void frameParse(int fd, unsigned char *frame, int len) frame[4] = 0xfb; frame[5] = 0xfd; + hl_usleep(20*1000); n = write(fd, frame, 6); break; diff --git a/simulators/simic7300.c b/simulators/simic7300.c index 8ac113245..be9f316ad 100644 --- a/simulators/simic7300.c +++ b/simulators/simic7300.c @@ -31,6 +31,7 @@ int civ_731_mode = 0; vfo_t current_vfo = RIG_VFO_A; int split = 0; int keyspd = 85; // 85=20WPM +int band=8; // we make B different from A to ensure we see a difference at startup float freqA = 14074000; @@ -365,6 +366,22 @@ void frameParse(int fd, unsigned char *frame, int len) case 0x1a: // miscellaneous things switch (frame[5]) { + case 0x01: // band + if (frame[6] == 0xfd) + { + frame[6] = band; + frame[7] = 0xfd; + n = write(fd,frame,8); + } + else + { + band = frame[6]; + printf("Band select=%d\n",band); + frame[4] = 0xfb; + frame[5] = 0xfe; + n = write(fd,frame,6); + } + break; case 0x03: // width if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { frame[6] = widthA; } else { frame[6] = widthB; } commit 55370c1e64176ddb86a9230049feb557d5d9da4d Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Aug 7 17:21:39 2023 -0500 Fix non-targetable VFO Icom rigs (e.g. IC7100) error during open routine by call get_freq first to establish echo on or off https://github.com/Hamlib/Hamlib/issues/1358 diff --git a/src/rig.c b/src/rig.c index e8661b09f..ef4ca9884 100644 --- a/src/rig.c +++ b/src/rig.c @@ -2317,6 +2317,15 @@ int HAMLIB_API rig_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) } HAMLIB_TRACE; + retcode = caps->get_freq(rig, vfo, freq); + + if (retcode != RIG_OK) + { + ELAPSED2; + LOCK(0); + RETURNFUNC(retcode); + } + retcode = caps->set_vfo(rig, vfo); if (retcode != RIG_OK) @@ -7773,6 +7782,7 @@ static int async_data_handler_start(RIG *rig) rs->async_data_enabled); RETURNFUNC(RIG_OK); } + sleep(2); // give other things a chance to finish opening up the rig #ifdef HAVE_PTHREAD commit dfb923e001998b6630a262e0c4c08cadc5e7596e Merge: 23ae64eea 93a1d9088 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Aug 5 12:15:50 2023 -0500 Merge branch 'master' of https://github.com/Hamlib/Hamlib commit 23ae64eeadc2e4fb6a5d04f53503cdfc6956e0fc Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Aug 5 12:15:28 2023 -0500 Add is_ft710 for SH command in newcat.c diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 31d1293cc..ec607fc3c 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -8737,7 +8737,7 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) RETURNFUNC(err); } } // end is_ftdx5000 - else if (is_ftdx101d || is_ftdx101mp || is_ftdx10) + else if (is_ftdx101d || is_ftdx101mp || is_ftdx10 || is_ft710) { switch (mode) { commit 457b09d50fc286052a0a9c927af1aebb448d38db Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Aug 5 09:41:55 2023 -0500 Fix FTDX101D/MP to allow new 3200/3500/4000Hz bandwidths https://github.com/Hamlib/Hamlib/issues/1355 diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 2fd09f867..31d1293cc 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -8765,7 +8765,10 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) else if (width <= 1700) { w = 15; } else if (width <= 2000) { w = 16; } else if (width <= 2400) { w = 17; } - else { w = 18; } // 3000Hz + else if (width <= 3000) { w = 18; } + else if (width <= 3200) { w = 19; } + else if (width <= 3500) { w = 20; } + else { w = 21; } // 4000Hz break; @@ -10053,7 +10056,15 @@ int newcat_get_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t *width) case 18: *width = 3000; break; - default: RETURNFUNC(-RIG_EINVAL); + case 19: *width = 3200; break; + + case 20: *width = 3500; break; + + case 21: *width = 4000; break; + + default: + + RETURNFUNC(-RIG_EINVAL); } break; diff --git a/rigs/yaesu/newcat.h b/rigs/yaesu/newcat.h index de1d49c7f..267b36f0b 100644 --- a/rigs/yaesu/newcat.h +++ b/rigs/yaesu/newcat.h @@ -50,7 +50,7 @@ typedef char ncboolean; /* shared function version */ -#define NEWCAT_VER "20230802" +#define NEWCAT_VER "20230805" /* Hopefully large enough for future use, 128 chars plus '\0' */ #define NEWCAT_DATA_LEN 129 commit 93a1d90889a547e24a65ef3179e34eea6d60f8ba Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Aug 5 09:41:55 2023 -0500 Fix FTDX101D/MP to allow new 3200/3500/4000Hz bandwidths https://github.com/Hamlib/Hamlib/issues/1356 diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 2fd09f867..31d1293cc 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -8765,7 +8765,10 @@ int newcat_set_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) else if (width <= 1700) { w = 15; } else if (width <= 2000) { w = 16; } else if (width <= 2400) { w = 17; } - else { w = 18; } // 3000Hz + else if (width <= 3000) { w = 18; } + else if (width <= 3200) { w = 19; } + else if (width <= 3500) { w = 20; } + else { w = 21; } // 4000Hz break; @@ -10053,7 +10056,15 @@ int newcat_get_rx_bandwidth(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t *width) case 18: *width = 3000; break; - default: RETURNFUNC(-RIG_EINVAL); + case 19: *width = 3200; break; + + case 20: *width = 3500; break; + + case 21: *width = 4000; break; + + default: + + RETURNFUNC(-RIG_EINVAL); } break; diff --git a/rigs/yaesu/newcat.h b/rigs/yaesu/newcat.h index de1d49c7f..267b36f0b 100644 --- a/rigs/yaesu/newcat.h +++ b/rigs/yaesu/newcat.h @@ -50,7 +50,7 @@ typedef char ncboolean; /* shared function version */ -#define NEWCAT_VER "20230802" +#define NEWCAT_VER "20230805" /* Hopefully large enough for future use, 128 chars plus '\0' */ #define NEWCAT_DATA_LEN 129 commit 11f8a33e76c970b9e6280cb40ca8e0d1a4631a54 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Aug 5 07:48:21 2023 -0500 Add simic7851 diff --git a/simulators/Makefile.am b/simulators/Makefile.am index 5fb482e10..895b8d416 100644 --- a/simulators/Makefile.am +++ b/simulators/Makefile.am @@ -8,7 +8,7 @@ DISTCLEANFILES = bin_PROGRAMS = -check_PROGRAMS = simelecraft simicgeneric simkenwood simyaesu simic9100 simic9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simic7300 simic7000 simic7100 simic7200 simatd578 simic905 simts450 simic7600 simic7610 simic705 simts950 simts990 +check_PROGRAMS = simelecraft simicgeneric simkenwood simyaesu simic9100 simic9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simic7300 simic7000 simic7100 simic7200 simatd578 simic905 simts450 simic7600 simic7610 simic705 simts950 simts990 simic7851 simelecraft_SOURCES = simelecraft.c simkenwood_SOURCES = simkenwood.c diff --git a/simulators/simic7851.c b/simulators/simic7851.c new file mode 100644 index 000000000..d0201d7de --- /dev/null +++ b/simulators/simic7851.c @@ -0,0 +1,705 @@ +// using virtual serial ports on Windows is to be developed yet +// Needs a lot of improvement to work on all Icoms +// gcc -g -Wall -o simicom simicom.c -lhamlib +// On mingw in the hamlib src directory +// gcc -static -I../include -g -Wall -o simicom simicom.c -L../../build/src/.libs -lhamlib -lwsock32 -lws2_32 +#define _XOPEN_SOURCE 700 +// since we are POSIX here we need this +struct ip_mreq +{ + int dummy; +}; + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <sys/time.h> +#include <hamlib/rig.h> +#include "../src/misc.h" +#include <termios.h> +#include <unistd.h> + + +#define BUFSIZE 256 +#define X25 + +int civ_731_mode = 0; +vfo_t current_vfo = RIG_VFO_A; +int split = 0; + +// we make B different from A to ensure we see a difference at startup +float freqA = 14074000; +float freqB = 14074500; +mode_t modeA = RIG_MODE_PKTUSB; +mode_t modeB = RIG_MODE_PKTUSB; +int datamodeA = 0; +int datamodeB = 0; +pbwidth_t widthA = 0; +pbwidth_t widthB = 1; +ant_t ant_curr = 0; +int ant_option = 0; +int ptt = 0; +int satmode = 0; +int agc_time = 1; +int ovf_status = 0; +int powerstat = 1; +int datamode = 0; +int keyspd = 130; // 130=20WPM +int attenuator; +int filterA = 2; +int filterB = 3; + +void dumphex(unsigned char *buf, int n) +{ + for (int i = 0; i < n; ++i) { printf("%02x ", buf[i]); } + + printf("\n"); +} + +int +frameGet(int fd, unsigned char *buf) +{ + int i = 0; + memset(buf, 0, BUFSIZE); + unsigned char c; + +again: + + while (read(fd, &c, 1) > 0) + { + buf[i++] = c; + //printf("i=%d, c=0x%02x\n",i,c); + + if (c == 0xfd) + { + dumphex(buf, i); + return i; + } + + if (i > 2 && c == 0xfe) + { + printf("Turning power on due to 0xfe string\n"); + powerstat = 1; + int j; + + for (j = i; j < 175; ++j) + { + if (read(fd, &c, 1) < 0) { break; } + } + + i = 0; + goto again; + } + } + + printf("Error??? c=x%02x\n", c); + + return 0; +} + +void frameParse(int fd, unsigned char *frame, int len) +{ + double freq; + int n = 0; + + dumphex(frame, len); + + if (frame[0] != 0xfe && frame[1] != 0xfe) + { + printf("expected fe fe, got "); + dumphex(frame, len); + return; + } + + int echo = 1; + + if (echo) + { + n = write(fd, frame, len); + } + + frame[3] = frame[2]; + frame[2] = 0xe0; + + switch (frame[4]) + { + case 0x03: + + //from_bcd(frameackbuf[2], (civ_731_mode ? 4 : 5) * 2); + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) + { + printf("get_freqA\n"); + to_bcd(&frame[5], (long long)freqA, (civ_731_mode ? 4 : 5) * 2); + } + else + { + printf("get_freqB\n"); + to_bcd(&frame[5], (long long)freqB, (civ_731_mode ? 4 : 5) * 2); + } + + frame[10] = 0xfd; + + if (powerstat) + { + n = write(fd, frame, 11); + } + + break; + + case 0x04: + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) + { + printf("get_modeA\n"); + frame[5] = modeA; + frame[6] = widthA; + } + else + { + printf("get_modeB\n"); + frame[5] = modeB; + frame[6] = widthB; + } + + frame[7] = 0xfd; + n = write(fd, frame, 8); + break; + + case 0x05: + freq = from_bcd(&frame[5], (civ_731_mode ? 4 : 5) * 2); + printf("set_freq to %.0f\n", freq); + + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { freqA = freq; } + else { freqB = freq; } + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x06: + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { modeA = frame[6]; } + else { modeB = frame[6]; } + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x07: + +printf("******* [5] = 0x07\n"); + switch (frame[5]) + { + case 0xd2: +printf("******* [6] = 0x07\n"); + switch (frame[6]) + { + case 0x00: current_vfo = RIG_VFO_MAIN; break; + + case 0x01: current_vfo = RIG_VFO_SUB; break; + } + } + + printf("set_vfo to %s\n", rig_strvfo(current_vfo)); + + frame[4] = 0xfb; + frame[5] = 0xfd; + printf("0x07 0xd2 answer: \n"); + dump_hex(frame, 6); + n = write(fd, frame, 6); + break; + + case 0x0f: + if (frame[5] == 0) { split = 0; } + else if (frame[5] == 1) { split = 1; } + else { frame[6] = split; } + + if (frame[5] == 0xfd) + { + printf("get split %d\n", 1); + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + printf("set split %d\n", 1); + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + + break; + + case 0x11: + if (frame[5] != 0xfd) + { + attenuator = frame[6]; + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + else + { + frame[6] = attenuator; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + break; + + + case 0x12: // we're simulating the 3-byte version -- not the 2-byte + if (frame[5] != 0xfd) + { + printf("Set ant %d\n", -1); + ant_curr = frame[5]; + ant_option = frame[6]; + dump_hex(frame, 8); + } + else + { + printf("Get ant\n"); + } + + frame[5] = ant_curr; + frame[6] = ant_option; + frame[7] = 0xfd; + printf("write 8 bytes\n"); + dump_hex(frame, 8); + n = write(fd, frame, 8); + break; + + case 0x14: + printf("******** 0x14 received frame[5]=0x%02x\n", frame[5]); + + switch (frame[5]) + { + static int power_level = 0; + + case 0x07: + case 0x08: + if (frame[6] != 0xfd) + { + printf("DEBUG#1\n"); + frame[4] = 0xfb; + frame[5] = 0xfd; + dumphex(frame, 6); + n = write(fd, frame, 6); + printf("ACK x14 x08\n"); + } + else + { + printf("DEBUG#2\n"); + to_bcd(&frame[6], (long long)128, 2); + frame[8] = 0xfb; + frame[9] = 0xfd; + dumphex(frame, 10); + n = write(fd, frame, 10); + printf("SEND x14 x08\n"); + } + + break; + + case 0x0a: + printf("Using power level %d\n", power_level); + power_level += 10; + + if (power_level > 250) { power_level = 0; } + + to_bcd(&frame[6], (long long)power_level, 2); + frame[8] = 0xfd; + n = write(fd, frame, 9); + break; + + case 0x0c: + if (frame[6] != 0xfd) + { + keyspd = frame[5]; + } + else + { + frame[6] = keyspd; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + + break; + + default: + printf("*********** NAK\n"); + frame[5] = 0xfa; + frame[6] = 0xfd; + n = write(fd, frame, 7); + break; + } + + break; + + case 0x15: + switch (frame[5]) + { + static int meter_level = 0; + + case 0x07: + frame[6] = ovf_status; + frame[7] = 0xfd; + n = write(fd, frame, 8); + ovf_status = ovf_status == 0 ? 1 : 0; + break; + + case 0x11: + printf("Using meter level %d\n", meter_level); + meter_level += 10; + + if (meter_level > 250) { meter_level = 0; } + + to_bcd(&frame[6], (long long)meter_level, 2); + frame[8] = 0xfd; + n = write(fd, frame, 9); + break; + + default: + frame[5] = 0xfa; + frame[6] = 0xfd; + n = write(fd, frame, 7); + break; + + } + + case 0x16: + switch (frame[5]) + { + case 0x5a: + if (frame[6] == 0xfe) + { + satmode = frame[6]; + } + else + { + frame[6] = satmode; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + + break; + } + + break; + + case 0x18: // miscellaneous things + frame[5] = 1; + frame[6] = 0xfd; + n = write(fd, frame, 7); + break; + + case 0x19: // miscellaneous things + frame[5] = 0x94; + frame[6] = 0xfd; + n = write(fd, frame, 7); + break; + + case 0x1a: // miscellaneous things + switch (frame[5]) + { + case 0x03: // width + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { frame[6] = widthA; } + else { frame[6] = widthB; } + + frame[7] = 0xfd; + n = write(fd, frame, 8); + break; + + case 0x04: // AGC TIME + printf("frame[6]==x%02x, frame[7]=0%02x\n", frame[6], frame[7]); + + if (frame[6] == 0xfd) // the we are reading + { + frame[6] = agc_time; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + printf("AGC_TIME RESPONSE******************************"); + agc_time = frame[6]; + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + + break; + + case 0x06: // satmode + if (frame[6] == 0xfd) // then we are reading + { + frame[6] = datamode; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + datamode = frame[6]; + frame[4] = 0xfd; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + + break; + + case 0x07: // satmode + frame[4] = 0; + frame[7] = 0xfd; + n = write(fd, frame, 8); + break; + + } + + break; + + case 0x1c: + switch (frame[5]) + { + case 0: + if (frame[6] == 0xfd) + { + frame[6] = ptt; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + ptt = frame[6]; + frame[7] = 0xfb; + frame[8] = 0xfd; + n = write(fd, frame, 9); + } + + break; + + } + + break; + + +#ifdef X25 + + case 0x25: + if (frame[6] == 0xfd) + { + if (frame[5] == 0x00) + { + to_bcd(&frame[6], (long long)freqA, (civ_731_mode ? 4 : 5) * 2); + printf("X25 get_freqA=%.0f\n", freqA); + } + else + { + to_bcd(&frame[6], (long long)freqB, (civ_731_mode ? 4 : 5) * 2); + printf("X25 get_freqB=%.0f\n", freqB); + } + + frame[11] = 0xfd; +#if 0 // async frame + unsigned char frame2[11]; + + frame2[0] = 0xfe; + frame2[1] = 0xfe; + frame2[2] = 0x00; // send transceive frame + frame2[3] = frame[3]; // send transceive frame + frame2[4] = 0x00; + frame2[5] = 0x70; + frame2[6] = 0x28; + frame2[7] = 0x57; + frame2[8] = 0x03; + frame2[9] = 0x00; + frame2[10] = 0xfd; + n = write(fd, frame2, 11); +#endif + n = write(fd, frame, 12); + } + else + { + freq = from_bcd(&frame[6], (civ_731_mode ? 4 : 5) * 2); + printf("set_freq to %.0f\n", freq); + + if (frame[5] == 0x00) { freqA = freq; } + else { freqB = freq; } + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + // send async frame + frame[2] = 0x00; // async freq + frame[3] = 0xa2; + frame[4] = 0x00; + frame[5] = 0x00; + frame[6] = 0x10; + frame[7] = 0x01; + frame[8] = 0x96; + frame[9] = 0x12; + frame[10] = 0xfd; + n = write(fd, frame, 11); + } + + break; + + case 0x26: + for (int i = 0; i < 6; ++i) { printf("%02x:", frame[i]); } + + if (frame[6] == 0xfd) // then a query + { + for (int i = 0; i < 6; ++i) { printf("%02x:", frame[i]); } + + frame[6] = frame[5] == 0 ? modeA : modeB; + frame[7] = frame[5] == 0 ? datamodeA : datamodeB; + frame[8] = frame[5] == 0 ? filterA : filterB; + frame[9] = 0xfd; + n = write(fd, frame, 10); + } + else + { + for (int i = 0; i < 12; ++i) { printf("%02x:", frame[i]); } + + if (frame[6] == 0) + { + modeA = frame[7]; + datamodeA = frame[8]; + } + else + { + modeB = frame[7]; + datamodeB = frame[8]; + } + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + + printf("\n"); + break; +#else + + case 0x25: + printf("x25 send nak\n"); + frame[4] = 0xfa; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x26: + printf("x26 send nak\n"); + frame[4] = 0xfa; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; +#endif + + default: printf("cmd 0x%02x unknown\n", frame[4]); + } + + if (n == 0) { printf("Write failed=%s\n", strerror(errno)); } + +// don't care about the rig type yet + +} + +#if defined(WIN32) || defined(_WIN32) +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd; + fd = open(comport, O_RDWR); + + if (fd < 0) + { + perror(comport); + } + + return fd; +} + +#else +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd = posix_openpt(O_RDWR); + char *name = ptsname(fd); + + if (name == NULL) + { + perror("pstname"); + return -1; + } + + printf("name=%s\n", name); + + if (fd == -1 || grantpt(fd) == -1 || unlockpt(fd) == -1) + { + perror("posix_openpt"); + return -1; + } + + return fd; +} +#endif + +void rigStatus() +{ + char vfoa = current_vfo == RIG_VFO_A ? '*' : ' '; + char vfob = current_vfo == RIG_VFO_B ? '*' : ' '; + printf("%cVFOA: mode=%d datamode=%d width=%ld freq=%.0f\n", vfoa, modeA, + datamodeA, + widthA, + freqA); + printf("%cVFOB: mode=%d datamode=%d width=%ld freq=%.0f\n", vfob, modeB, + datamodeB, + widthB, + freqB); +} + +int main(int argc, char **argv) +{ + unsigned char buf[256]; + int fd = openPort(argv[1]); + + printf("%s: %s\n", argv[0], rig_version()); +#ifdef X25 + printf("x25/x26 command recognized\n"); +#else + printf("x25/x26 command rejected\n"); +#endif +#if defined(WIN32) || defined(_WIN32) + + if (argc != 2) + { + printf("Missing comport argument\n"); + printf("%s [comport]\n", argv[0]); + exit(1); + } + +#endif + + while (1) + { + int len = frameGet(fd, buf); + + if (len <= 0) + { + close(fd); + fd = openPort(argv[1]); + } + + if (powerstat) + { + frameParse(fd, buf, len); + } + else + { + hl_usleep(1000 * 1000); + } + + rigStatus(); + } + + return 0; +} commit 6c3e5a6b7f341bfd1fe4e4bce4338ef76879bb35 Merge: 90f0ffcdc b1bef6101 Author: Michael Black <mdb...@ya...> Date: Fri Aug 4 08:58:27 2023 -0500 Merge pull request #1354 from GeoBaltz/yaesu_level2 Yaesu level2 commit b1bef6101b7a1c22139826aba2787c7277c08f24 Author: George Baltz N3GB <Geo...@gm...> Date: Thu Aug 3 09:56:38 2023 -0400 Convert RFPOWER to level_gran usage Two rigs (FTDX3000dm & FT450D) handled slightly abnormally - both should function as before. Remove 2 now unused variables to avoid compiler warnings. diff --git a/rigs/yaesu/ft1200.c b/rigs/yaesu/ft1200.c index 39477ff40..85d890fa5 100644 --- a/rigs/yaesu/ft1200.c +++ b/rigs/yaesu/ft1200.c @@ -177,6 +177,7 @@ const struct rig_caps ftdx1200_caps = [LVL_NOTCHF] = { .min = { .i = 1 }, .max = { .i = 4000 }, .step = { .i = 10 } }, [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_MONITOR_GAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_RFPOWER] = { .min = { .f = .05 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/yaesu/ft3000.c b/rigs/yaesu/ft3000.c index 6973de01a..9696677a8 100644 --- a/rigs/yaesu/ft3000.c +++ b/rigs/yaesu/ft3000.c @@ -272,6 +272,7 @@ const struct rig_caps ftdx3000_caps = [LVL_NOTCHF] = { .min = { .i = 1 }, .max = { .i = 4000 }, .step = { .i = 10 } }, [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_MONITOR_GAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_RFPOWER] = { .min = { .f = .05 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/yaesu/ft710.c b/rigs/yaesu/ft710.c index 5c7ada307..b3a8e4f6b 100644 --- a/rigs/yaesu/ft710.c +++ b/rigs/yaesu/ft710.c @@ -148,6 +148,7 @@ const struct rig_caps ft710_caps = [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_MONITOR_GAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_RFPOWER] = { .min = { .f = .05 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/yaesu/ft891.c b/rigs/yaesu/ft891.c index 0f2229a6e..09c1c6adc 100644 --- a/rigs/yaesu/ft891.c +++ b/rigs/yaesu/ft891.c @@ -161,6 +161,7 @@ const struct rig_caps ft891_caps = [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_MONITOR_GAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_RFPOWER] = { .min = { .f = .05 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/yaesu/ft950.c b/rigs/yaesu/ft950.c index 01abb261f..27d67023a 100644 --- a/rigs/yaesu/ft950.c +++ b/rigs/yaesu/ft950.c @@ -113,6 +113,7 @@ const struct rig_caps ft950_caps = [LVL_CWPITCH] = { .min = { .i = 300 }, .max = { .i = 1050 }, .step = { .i = 50 } }, [LVL_KEYSPD] = { .min = { .i = 4 }, .max = { .i = 60 }, .step = { .i = 1 } }, [LVL_NOTCHF] = { .min = { .i = 1 }, .max = { .i = 3000 }, .step = { .i = 10 } }, + [LVL_RFPOWER] = { .min = { .f = .05 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/yaesu/ft991.c b/rigs/yaesu/ft991.c index 7c5b27bc0..d13f67b86 100644 --- a/rigs/yaesu/ft991.c +++ b/rigs/yaesu/ft991.c @@ -166,6 +166,7 @@ const struct rig_caps ft991_caps = [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_MONITOR_GAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_RFPOWER] = { .min = { .f = .05 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = common_dcs_list, diff --git a/rigs/yaesu/ftdx10.c b/rigs/yaesu/ftdx10.c index 35ae64b82..d411b26a4 100644 --- a/rigs/yaesu/ftdx10.c +++ b/rigs/yaesu/ftdx10.c @@ -164,6 +164,7 @@ const struct rig_caps ftdx10_caps = [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_MONITOR_GAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_RFPOWER] = { .min = { .f = .05 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/yaesu/ftdx101.c b/rigs/yaesu/ftdx101.c index d06b384b4..6922a17ff 100644 --- a/rigs/yaesu/ftdx101.c +++ b/rigs/yaesu/ftdx101.c @@ -164,6 +164,7 @@ const struct rig_caps ftdx101d_caps = [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_MONITOR_GAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_RFPOWER] = { .min = { .f = .05 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/yaesu/ftdx101mp.c b/rigs/yaesu/ftdx101mp.c index 9ef8d46d9..78673c8ce 100644 --- a/rigs/yaesu/ftdx101mp.c +++ b/rigs/yaesu/ftdx101mp.c @@ -101,6 +101,7 @@ const struct rig_caps ftdx101mp_caps = [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_MONITOR_GAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_RFPOWER] = { .min = { .f = .05 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/yaesu/level_gran_yaesu.h b/rigs/yaesu/level_gran_yaesu.h index 7fdb383ff..c440455f1 100644 --- a/rigs/yaesu/level_gran_yaesu.h +++ b/rigs/yaesu/level_gran_yaesu.h @@ -17,7 +17,7 @@ /* levels with time units */ [LVL_VOXDELAY] = { .min = { .i = 3 }, .max = { .i = 300 }, .step = { .i = 1 } }, [LVL_BKINDL] = { .min = { .i = 30 }, .max = { .i = 3000 }, .step = { .i = 1 } }, - [LVL_BKIN_DLYMS] = { .min = { .i = 30 }, .max = { .i = 3000 }, .step = { .i = 1 } }, + [LVL_BKIN_DLYMS] = { .min = { .i = 30 }, .max = { .i = 3000 }, .step = { .i = 1 } }, /* levels with watt units */ [LVL_RFPOWER_METER_WATTS] = { .min = { .f = .0 }, .max = { .f = 100 }, .step = { .f = 1.0f/255.0f } }, /* level with misc units */ @@ -28,7 +28,7 @@ /* levels with 0-1 values -- increment based on rig's range */ [LVL_AF] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/255.0f } }, [LVL_RF] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/255.0f } }, - [LVL_RFPOWER] = { .min = { .f = .05 }, .max = { .f = 1 }, .step = { .f = 1.0f/100.0f } }, + [LVL_RFPOWER] = { .min = { .f = 5.0/255.0 }, .max = { .f = 1 }, .step = { .f = 1.0f/255.0f } }, [LVL_RFPOWER_METER] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/255.0f } }, [LVL_COMP_METER] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/255.0f } }, [LVL_ID_METER] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/255.0f } }, diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index e990624e5..2fd09f867 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -3999,7 +3999,6 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) struct newcat_priv_data *priv = (struct newcat_priv_data *)rig->state.priv; int err; int i; - int scale; int fpf; char main_sub_vfo = '0'; char *format; @@ -4035,26 +4034,16 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) RETURNFUNC(-RIG_ENAVAIL); } - if (is_ft950 || is_ftdx1200 || is_ftdx3000 || is_ft891 || is_ft991 || is_ft710 - || is_ftdx101d || is_ftdx101mp || is_ftdx10) - { - scale = 100.; - } - else if (is_ft450 && newcat_get_rigid(rig) == NC_RIGID_FT450D) - { - scale = 100.; - } - else if (is_ftdx3000dm) - { - scale = 50; - } - else - { - scale = 255.; - } - - fpf = newcat_scale_float(scale, val.f); + if ( is_ftdx3000dm ) /* No separate rig->caps for this rig :-( */ + { + fpf = (int)((val.f * 50.0f) + 0.5f); + } + else + { + fpf = (int)((val.f / level_info->step.f) + 0.5f ); + } + //TODO Remove when global level checking enabled if (is_ft950 || is_ft891 || is_ft991 || is_ftdx3000 || is_ftdx3000dm || is_ftdx101d || is_ftdx101mp || is_ftdx10) @@ -4065,6 +4054,7 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) fpf = 5; } } + //endTODO SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "PC%03d%c", fpf, cat_term); break; @@ -4880,7 +4870,6 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) int ret_data_len; char *retlvl; int retlvl_len; - float scale; char main_sub_vfo = '0'; int i; gran_t *level_info; @@ -5436,25 +5425,6 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) switch (level) { - case RIG_LEVEL_RFPOWER: - if (is_ft950 || is_ftdx1200 || is_ftdx3000 || is_ftdx3000dm || is_ft891 - || is_ft991 || is_ft710 - || is_ftdx101d || is_ftdx101mp || is_ftdx10) - { - scale = 100.; - } - else if (is_ft450 && newcat_get_rigid(rig) == NC_RIGID_FT450D) - { - scale = 100.; - } - else - { - scale = 255.; - } - - val->f = (float)atoi(retlvl) / scale; - break; - case RIG_LEVEL_SWR: if (retlvl_len > 3) { @@ -5597,6 +5567,7 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) case RIG_LEVEL_ANTIVOX: case RIG_LEVEL_MICGAIN: case RIG_LEVEL_VOXGAIN: + case RIG_LEVEL_RFPOWER: case RIG_LEVEL_MONITOR_GAIN: val->f = (float)atoi(retlvl) * level_info->step.f; break; diff --git a/rigs/yaesu/yaesu.c b/rigs/yaesu/yaesu.c index e1e0d7633..19aec375e 100644 --- a/rigs/yaesu/yaesu.c +++ b/rigs/yaesu/yaesu.c @@ -72,6 +72,8 @@ DECLARE_INITRIG_BACKEND(yaesu) ft450d_caps = ft450_caps; ft450d_caps.rig_model = RIG_MODEL_FT450D; ft450d_caps.model_name = "FT-450D"; + ft450d_caps.level_gran[LVL_RFPOWER].min.f = .05; + ft450d_caps.level_gran[LVL_RFPOWER].step.f = 1.0f/100.0f; rig_register(&ft100_caps); rig_register(&ft450_caps); rig_register(&ft450d_caps); commit 915ee383fbe28806b10744eba744201579c5fa35 Author: George Baltz N3GB <Geo...@gm...> Date: Sun Jul 30 11:14:01 2023 -0400 Convert MONITOR_GAIN diff --git a/rigs/yaesu/ft1200.c b/rigs/yaesu/ft1200.c index 81e98000d..39477ff40 100644 --- a/rigs/yaesu/ft1200.c +++ b/rigs/yaesu/ft1200.c @@ -176,6 +176,7 @@ const struct rig_caps ftdx1200_caps = // cppcheck-suppress * [LVL_NOTCHF] = { .min = { .i = 1 }, .max = { .i = 4000 }, .step = { .i = 10 } }, [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_MONITOR_GAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/yaesu/ft3000.c b/rigs/yaesu/ft3000.c index 2070e672e..6973de01a 100644 --- a/rigs/yaesu/ft3000.c +++ b/rigs/yaesu/ft3000.c @@ -271,6 +271,7 @@ const struct rig_caps ftdx3000_caps = #include "level_gran_yaesu.h" [LVL_NOTCHF] = { .min = { .i = 1 }, .max = { .i = 4000 }, .step = { .i = 10 } }, [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_MONITOR_GAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/yaesu/ft710.c b/rigs/yaesu/ft710.c index 8cd55f461..5c7ada307 100644 --- a/rigs/yaesu/ft710.c +++ b/rigs/yaesu/ft710.c @@ -147,6 +147,7 @@ const struct rig_caps ft710_caps = #include "level_gran_yaesu.h" [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_MONITOR_GAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/yaesu/ft891.c b/rigs/yaesu/ft891.c index 0ff29cb9b..0f2229a6e 100644 --- a/rigs/yaesu/ft891.c +++ b/rigs/yaesu/ft891.c @@ -160,6 +160,7 @@ const struct rig_caps ft891_caps = [LVL_RF] = { .min = { .f = 0 }, .max = { .f = 1.0f }, .step = { .f = 1.0f/30.0f } }, [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_MONITOR_GAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/yaesu/ft991.c b/rigs/yaesu/ft991.c index 85738ba1d..7c5b27bc0 100644 --- a/rigs/yaesu/ft991.c +++ b/rigs/yaesu/ft991.c @@ -165,6 +165,7 @@ const struct rig_caps ft991_caps = #include "level_gran_yaesu.h" [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_MONITOR_GAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = common_dcs_list, diff --git a/rigs/yaesu/ftdx10.c b/rigs/yaesu/ftdx10.c index 716bf6e35..35ae64b82 100644 --- a/rigs/yaesu/ftdx10.c +++ b/rigs/yaesu/ftdx10.c @@ -163,6 +163,7 @@ const struct rig_caps ftdx10_caps = #include "level_gran_yaesu.h" [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_MONITOR_GAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/yaesu/ftdx101.c b/rigs/yaesu/ftdx101.c index d40bf972f..d06b384b4 100644 --- a/rigs/yaesu/ftdx101.c +++ b/rigs/yaesu/ftdx101.c @@ -163,6 +163,7 @@ const struct rig_caps ftdx101d_caps = #include "level_gran_yaesu.h" [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_MONITOR_GAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/yaesu/ftdx101mp.c b/rigs/yaesu/ftdx101mp.c index 1840ec1b9..9ef8d46d9 100644 --- a/rigs/yaesu/ftdx101mp.c +++ b/rigs/yaesu/ftdx101mp.c @@ -100,6 +100,7 @@ const struct rig_caps ftdx101mp_caps = #include "level_gran_yaesu.h" [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_MONITOR_GAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/yaesu/level_gran_yaesu.h b/rigs/yaesu/level_gran_yaesu.h index d0e9c52a5..7fdb383ff 100644 --- a/rigs/yaesu/level_gran_yaesu.h +++ b/rigs/yaesu/level_gran_yaesu.h @@ -35,7 +35,7 @@ [LVL_VD_METER] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/255.0f } }, [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/255.0f } }, [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/255.0f } }, - [LVL_MONITOR_GAIN] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/100.0f } }, + [LVL_MONITOR_GAIN] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/255.0f } }, [LVL_COMP] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/100.0f } }, [LVL_VOXGAIN] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/100.0f } }, [LVL_ANTIVOX] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/100.0f } }, diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index a8c8fcf82..e990624e5 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -4799,19 +4799,10 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) RETURNFUNC(-RIG_ENAVAIL); } + //TODO Remove when full level checking enabled if (val.f > 1.0) { RETURNFUNC(-RIG_EINVAL); } - if (is_ftdx1200 || is_ftdx3000 || is_ftdx3000dm || is_ft891 || is_ft991 || is_ft710 - || is_ftdx101d - || is_ftdx101mp - || is_ftdx10) - { - fpf = newcat_scale_float(100, val.f); - } - else - { - fpf = newcat_scale_float(255, val.f); - } + fpf = (int)((val.f / level_info->step.f) + 0.5f); if (is_ftdx9000) { @@ -5606,6 +5597,7 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) case RIG_LEVEL_ANTIVOX: case RIG_LEVEL_MICGAIN: case RIG_LEVEL_VOXGAIN: + case RIG_LEVEL_MONITOR_GAIN: val->f = (float)atoi(retlvl) * level_info->step.f; break; @@ -5882,21 +5874,6 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) val->i = atoi(retlvl) * 10; break; - case RIG_LEVEL_MONITOR_GAIN: - if (is_ftdx1200 || is_ftdx3000 || is_ftdx3000dm || is_ft891 || is_ft991 || is_ft710 - || is_ftdx101d - || is_ftdx101mp) - { - scale = 100.; - } - else - { - scale = 255.; - } - - val->f = ((float) atoi(retlvl)) / scale; - break; - case RIG_LEVEL_NB: // Do not scale the value, level maximum value is set to 10 val->f = (float) atoi(retlvl); commit cbec337cd3f5cbaa9263a84139b4c29c81d48891 Author: George Baltz N3GB <Geo...@gm...> Date: Sat Jul 29 11:31:12 2023 -0400 Convert SQL to use level_gran data. diff --git a/rigs/yaesu/ft710.c b/rigs/yaesu/ft710.c index 8c850a42b..8cd55f461 100644 --- a/rigs/yaesu/ft710.c +++ b/rigs/yaesu/ft710.c @@ -146,6 +146,7 @@ const struct rig_caps ft710_caps = { #include "level_gran_yaesu.h" [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/yaesu/ft891.c b/rigs/yaesu/ft891.c index 9ce50b719..0ff29cb9b 100644 --- a/rigs/yaesu/ft891.c +++ b/rigs/yaesu/ft891.c @@ -159,6 +159,7 @@ const struct rig_caps ft891_caps = // cppcheck-suppress * [LVL_RF] = { .min = { .f = 0 }, .max = { .f = 1.0f }, .step = { .f = 1.0f/30.0f } }, [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/yaesu/ft991.c b/rigs/yaesu/ft991.c index 6dfd39d66..85738ba1d 100644 --- a/rigs/yaesu/ft991.c +++ b/rigs/yaesu/ft991.c @@ -164,6 +164,7 @@ const struct rig_caps ft991_caps = .level_gran = { #include "level_gran_yaesu.h" [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = common_dcs_list, diff --git a/rigs/yaesu/ftdx10.c b/rigs/yaesu/ftdx10.c index 7f9574c84..716bf6e35 100644 --- a/rigs/yaesu/ftdx10.c +++ b/rigs/yaesu/ftdx10.c @@ -162,6 +162,7 @@ const struct rig_caps ftdx10_caps = { #include "level_gran_yaesu.h" [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/yaesu/ftdx101.c b/rigs/yaesu/ftdx101.c index cfa8757ce..d40bf972f 100644 --- a/rigs/yaesu/ftdx101.c +++ b/rigs/yaesu/ftdx101.c @@ -162,6 +162,7 @@ const struct rig_caps ftdx101d_caps = { #include "level_gran_yaesu.h" [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/yaesu/ftdx101mp.c b/rigs/yaesu/ftdx101mp.c index 1eca8de1f..1840ec1b9 100644 --- a/rigs/yaesu/ftdx101mp.c +++ b/rigs/yaesu/ftdx101mp.c @@ -99,6 +99,7 @@ const struct rig_caps ftdx101mp_caps = .level_gran = { #include "level_gran_yaesu.h" [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, + [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/100.0f } }, }, .ctcss_list = common_ctcss_list, .dcs_list = NULL, diff --git a/rigs/yaesu/level_gran_yaesu.h b/rigs/yaesu/level_gran_yaesu.h index d99905a34..d0e9c52a5 100644 --- a/rigs/yaesu/level_gran_yaesu.h +++ b/rigs/yaesu/level_gran_yaesu.h @@ -33,7 +33,7 @@ [LVL_COMP_METER] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/255.0f } }, [LVL_ID_METER] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/255.0f } }, [LVL_VD_METER] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/255.0f } }, - [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/100.0f } }, + [LVL_SQL] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/255.0f } }, [LVL_MICGAIN] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/255.0f } }, [LVL_MONITOR_GAIN] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/100.0f } }, [LVL_COMP] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/100.0f } }, diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 5ccee0253..a8c8fcf82 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -4615,16 +4615,7 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) RETURNFUNC(-RIG_ENAVAIL); } - if (is_ft891 || is_ft991 || is_ft710 || is_ftdx101d || is_ftdx101mp || is_ftdx10) - { - scale = 100; - } - else - { - scale = 255; - } - - fpf = newcat_scale_float(scale, val.f); + fpf = (int) ((val.f / level_info->step.f) + 0.5f ); SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "SQ%c%03d%c", main_sub_vfo, fpf, cat_term); @@ -5610,6 +5601,7 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) case RIG_LEVEL_AF: case RIG_LEVEL_RF: + case RIG_LEVEL_SQL: case RIG_LEVEL_COMP: case RIG_LEVEL_ANTIVOX: case RIG_LEVEL_MICGAIN: @@ -5617,19 +5609,6 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) val->f = (float)atoi(retlvl) * level_info->step.f; break; - case RIG_LEVEL_SQL: - if (is_ft891 || is_ft991 || is_ft710 || is_ftdx101d || is_ftdx101mp || is_ftdx10) - { - scale = 100.; - } - else - { - scale = 255.; - } - - val->f = (float)atoi(retlvl) / scale; - break; - case RIG_LEVEL_BKINDL: { int raw_value = atoi(retlvl); commit 90f0ffcdc9b9298728cd70864a500ff7c5a21f48 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Aug 3 08:14:15 2023 -0500 Add simts950 simts990 diff --git a/simulators/Makefile.am b/simulators/Makefile.am index 923ac3790..5fb482e10 100644 --- a/simulators/Makefile.am +++ b/simulators/Makefile.am @@ -8,7 +8,7 @@ DISTCLEANFILES = bin_PROGRAMS = -check_PROGRAMS = simelecraft simicgeneric simkenwood simyaesu simic9100 simic9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simic7300 simic7000 simic7100 simic7200 simatd578 simic905 simts450 simic7600 simic7610 simic705 +check_PROGRAMS = simelecraft simicgeneric simkenwood simyaesu simic9100 simic9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simic7300 simic7000 simic7100 simic7200 simatd578 simic905 simts450 simic7600 simic7610 simic705 simts950 simts990 simelecraft_SOURCES = simelecraft.c simkenwood_SOURCES = simkenwood.c diff --git a/simulators/simts950.c b/simulators/simts950.c new file mode 100644 index 000000000..54847ea02 --- /dev/null +++ b/simulators/simts950.c @@ -0,0 +1,425 @@ +// can run this using rigctl/rigctld and socat pty devices +// gcc -o simyaesu simyaesu.c +#define _XOPEN_SOURCE 700 +// since we are POSIX here we need this +struct ip_mreq +{ + int dummy; +}; + +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <string.h> +#include <unistd.h> +#include <hamlib/rig.h> + +#define BUFSIZE 256 + +int mysleep = 20; + +float freqA = 14074000; +float freqB = 14074500; +int filternum1 = 7; +int filternum2 = 8; +int datamode = 0; +int vfo, vfo_tx, ptt, ptt_data, ptt_mic, ptt_tune; + +int +getmyline(int fd, char *buf) +{ + char c; + int i = 0; + memset(buf, 0, BUFSIZE); + + while (read(fd, &c, 1) > 0) + { + buf[i++] = c; + + if (c == ';') { return strlen(buf); } + } + + return strlen(buf); +} + +#if defined(WIN32) || defined(_WIN32) +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd; + fd = open(comport, O_RDWR); + + if (fd < 0) + { + perror(comport); + } + + return fd; +} + +#else +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd = posix_openpt(O_RDWR); + char *name = ptsname(fd); + + if (name == NULL) + { + perror("pstname"); + return -1; + } + + printf("name=%s\n", name); + + if (fd == -1 || grantpt(fd) == -1 || unlockpt(fd) == -1) + { + perror("posix_openpt"); + return -1; + } + + return fd; +} +#endif + + + +int main(int argc, char *argv[]) +{ + char buf[256]; + char *pbuf; + int n; + int fd = openPort(argv[1]); + int freqa = 14074000, freqb = 140735000; + int modeA = 1, modeB = 2; + + while (1) + { + buf[0] = 0; + + if (getmyline(fd, buf) > 0) { printf("Cmd:%s\n", buf); } + +// else { return 0; } + + if (strcmp(buf, "RM5;") == 0) + { + printf("%s\n", buf); + hl_usleep(mysleep * 1000); + pbuf = "RM5100000;"; + n = write(fd, pbuf, strlen(pbuf)); +// printf("n=%d\n", n); + + if (n <= 0) { perror("RM5"); } + } + + else if (strcmp(buf, "AN0;") == 0) + { + printf("%s\n", buf); + hl_usleep(mysleep * 1000); + pbuf = "AN030;"; + n = write(fd, pbuf, strlen(pbuf)); +// printf("n=%d\n", n); + + if (n <= 0) { perror("AN"); } + } + else if (strcmp(buf, "IF;") == 0) + { + char ifbuf[256]; + printf("%s\n", buf); + hl_usleep(mysleep * 1000); +// pbuf = "IF000503130001000+0000000000030000000;" + sprintf(ifbuf, "IF%011d1000+0000002000000000000;", freqa); + //pbuf = "IF00010138698 +00000000002000000 ; + n = write(fd, ifbuf, strlen(ifbuf)); +// printf("n=%d\n", n); + + if (n <= 0) { perror("IF"); } + + continue; + } + else if (strcmp(buf, "NB;") == 0) + { + hl_usleep(mysleep * 1000); + pbuf = "NB0;"; + n = write(fd, pbuf, strlen(pbuf)); + continue; + } + else if (strcmp(buf, "RA;") == 0) + { + hl_usleep(mysleep * 1000); + pbuf = "RA01;"; + n = write(fd, pbuf, strlen(pbuf)); + continue; + } + else if (strcmp(buf, "RG;") == 0) + { + hl_usleep(mysleep * 1000); + pbuf = "RG055;"; + n = write(fd, pbuf, strlen(pbuf)); + continue; + } + else if (strcmp(buf, "MG;") == 0) + { + hl_usleep(mysleep * 1000); + pbuf = "MG050;"; + n = write(fd, pbuf, strlen(pbuf)); + continue; + } + else if (strcmp(buf, "AG;") == 0) + { + hl_usleep(mysleep * 1000); + pbuf = "AG100;"; + n = write(fd, pbuf, strlen(pbuf)); + continue; + } + else if (strcmp(buf, "FV;") == 0) + { + hl_usleep(mysleep * 1000); + pbuf = "FV1.2;"; + n = write(fd, pbuf, strlen(pbuf)); + continue; + } + else if (strncmp(buf, "IS;", 3) == 0) + { + SNPRINTF(buf, siz... [truncated message content] |
From: n0nb <n0...@us...> - 2023-08-02 21:30:02
|
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 56de3bb25d0e0c9919681c86ec3c2c235697d381 (commit) via 942e4cd950e01e06d9a60708153435803ccee504 (commit) via 232d7626cc75b55a5db193e683e63c61cc5fcae7 (commit) via 2709be053ccca3c109ac0dfc3bfba85e8986fd2a (commit) via e155dfbf5e37f7d52075e643c566219f3fbee34c (commit) via 6c794a17bdb9e11f97b3923298aaf79efdb41310 (commit) via 428500bb1c79d783d19e9f6840bb1a10761e3b97 (commit) via 6ef0f32d56aabc9d62a90496c60e53b6a1a31bff (commit) via 89797e5a54f2db8dd721f62c1afd9bf3015e50c1 (commit) via c452cd31d904c05236329e26e03d793e8683c088 (commit) via 801d34e3fba7e94bb738aed32ba7b91c06dcbcbd (commit) via d9b1cfb4047c9b94700340a66fc6b1cb3b543f1c (commit) via 5446b2c99dc5e2da5b1d0593b19fa15aaf0aaf5a (commit) via 71629cf2f323f5121d7cb69fd198c3cd8e30b481 (commit) via c251a075abcaebd8b2222f9e5e02fe5ae5d81e4b (commit) via ddb128bbf74570addd7296afcf9e42eaabff8698 (commit) via 006f724dae6c992373779b28547e8daf9022a3cd (commit) via b4ddf64b311f31db08f094893b633059ea2434a6 (commit) via 21c5c3f419ad2a0f485176d725a2a454f3795395 (commit) via 2852fba73fa705a8a97ed5c580df2970cee5b3b0 (commit) via b24cad1278520e18576476e2236bdf5e97895f41 (commit) via bd1fcbe025bc2e88c08cf26d2b6a6faa8c718f95 (commit) via ebb6efba8d3a6c67ccfc062e4d90f3a0859022da (commit) via 1260921daf4db98f6511c6196af6f41942d050a1 (commit) via 192b5fe7a542c886e90e62488bdee4b0bf49bb92 (commit) via 342e082fbbefa314dac2b0d2b6270a335fd18db7 (commit) via 2ccac887d26422363863edf247fc4dbc39f09b7b (commit) via 2f3c632ff651f6cf230713ab52e0ab100c2674d8 (commit) via bb260d264061745e41a5d9686acaf09bffabdd9d (commit) via d1106cae8bc59df8ccfdae855dc39601699ee0c9 (commit) via a975a6e8a6faba510df5c2db5ac3bc1d981712be (commit) via ee5b96443f8f367b52040b257e4f81481c310810 (commit) via 13a8c0fb1d4350eea65a701b43a95cea37d92ef4 (commit) via bf3ac3bbecaca170fcfaab39a08ed55bc8cf3603 (commit) via 00d94d410fdf427d969b57ae436849b135796dda (commit) via 802892887af132b1e41af447cf893ed9c905c7f4 (commit) via bbdd1dc31211126fa7627b18c3bf4f6f556571ef (commit) via fcba1cab20e68da2b9d2e6fbf164bacc99dfc091 (commit) via da96315dc527d34eade1d5a1e718de98d6f53af2 (commit) via 2c40ebcbc16bd9bdc44270c36ece70312acaf792 (commit) via 09143fcff9e6c2e3acbc84da9b34a25a840e2c1f (commit) via f5b4cd6047d92ba1f932c5f599597c2de8b8c5ae (commit) via 557e9a71e5620b6fe466cc6e6d51188af4822840 (commit) via 75569ab3f2ab84af16873d38ae79d9e003e1d9f4 (commit) via 23639557a0f58b10670bf8edf7b5ed7124bfbe7e (commit) via c288dacb5429a21e481bffc29c857a24b526ba8c (commit) via d02b9f02b1113171f4863b89bb3c7f7fe1cbc204 (commit) via ca3f19fbd6ea69ed38443a93a4da6c88ba0cef5d (commit) via 9c246ed3fb7b5546038d4d509a1d3551c7db7c3c (commit) via 448c41978f991f252b7f5a868cffbb2c4825678a (commit) via 9ad070c33f9e2bf8d1bc17e0bae91b2588f80a02 (commit) via d28ce6b798f460c54bdc0358e8bb96d6e83d263f (commit) via c9fc80fea1fc7d7b077547e1bb6e2625b0de7952 (commit) via d8d716f0f2e20e3e86b459da5c9ab3088de8ffde (commit) via f48f6152ff639d58c39429793e428fe848bb540a (commit) via c5cc47dcd15b79bf1389e14091d4e1fec031317e (commit) via ef4489172abfb3288daa4ebe7b38564b24c8ce35 (commit) via 9b89e3fe2359081a476c1aa774ed7ff1f1762ab6 (commit) via 8fe3080139b9686f41fa34a19e904f5666d9f841 (commit) via aacf060e11b5fefba5a6a3aa63263f77277b8702 (commit) via 7adc91d0ead5fb9541f8396f20527738d0a032a3 (commit) via f33fa95d8d892d6fae674c8c70fd331409b48ff0 (commit) via 2da6c400f7a423be9d4992e0bffaa7810be17283 (commit) via 2f838f22644fce9577362b04d5302a0cf2c34908 (commit) via c17b5da379f61292df5fc221b5b495f33276f91c (commit) via 1688f25ed58b0dfc6dba13c988e77fcec29e8f33 (commit) via 4c8994d90551af96d7efed4a8fe3b94061d8ca7e (commit) via d0eed2b412cf621babbded446136c135f5fa4095 (commit) via 17c7c4d68f3418d16243dcd5db4863e6b88333b5 (commit) via 8161cda2fc9cc4ac010741438e54b14e3d36cf38 (commit) via df9d9dfbd155482d2d70007c28c6c262e290857a (commit) via 64cb40f06671ca1a87cd87dfb2b7f399fbfddeda (commit) via 2c834867750d6681a0ba40fdfe1145e627fa306b (commit) via 3a3c51bcf69d83455818f1afe17d4e876e956676 (commit) via 1fdc3f3eaf69407704efa1c1e785cc4460d95045 (commit) via 2395d37afde737622d9aca1b8522f2df2b59154f (commit) via 79737df92ac8c187678bfd699b17ac06e27a7bdf (commit) via d6b8575eb34972e8c48f892cf033e0ca1c8ac954 (commit) via 0540fa4f129364e376094d0bcb20124c9e1a393b (commit) via c1212b5bf398a632f4a23f0bba561cf80fb15060 (commit) via 0a9796f2e732348f68e881f875ee58301a05d614 (commit) via daa86f5b7a0c46cdc795d160b23c4390a0e6e7e9 (commit) via d0fba93c654bcbdc4e9c06f0bb78e4288b99f63a (commit) via ebc10b84f4885eff15b1ea0d4027a5de8ee4a155 (commit) via f7bed3320ec1501f98cf137e0b99054fb0de9dcb (commit) via b58c0a0fa473b4c0097babe7b6f3ca14a97bb31a (commit) via 56ad3ac1ef3d507a5b78976abd5d1343d87f8462 (commit) via 983a9fae0b8e0bc65fba828a267e55812ff10439 (commit) via 330322e745a005d917f7a55761f5e1c1044e5eb0 (commit) via 876e79c34df6458ae80124b8e667d78a972bb8e0 (commit) via 015de3b5a454e0fd3031090def00cf249c5b56ea (commit) via 5df0ae02f130a9b159c399d9bfd36a61d7523603 (commit) via 52df1e4f0abf76d4c323dbeb1f19cf14782b48dc (commit) via 3814224c89a39e87a5fb1177ec0895863949d351 (commit) via 9b04338080624117277befb5b038da1c7527f4fb (commit) via e167d0f1a07bf16cd14738cc772e7b268afc6075 (commit) via 7962a51f051d8f77067c91becd3b1b48b5d71d52 (commit) via 902cfd708f4064b91fd8da1be7c03159772ae139 (commit) via 932cca4c8419c8698aa13157c3b9ea1ea297800c (commit) via d834a5a50dabe000bc576d74b954878b547257ba (commit) via 8cd135e2cea9f1d4a7d537cd56a9faac0092543a (commit) via 685f8c38621fab8cfffdc1b6ab47371b4316ffe0 (commit) via a2c7227676ac23c5c04d2904bbaba0570d699f7b (commit) via a360d2aaeca4365a72a6541180c6711451f57c82 (commit) via f3941cdf62ce6f7563798a3e9b06470cd0b7f82a (commit) via 2204ebef563166c64744e1b387648b4847c0c5f0 (commit) via ecf914fca9c5b7c7aa9593a1817d0f77bce9cfcc (commit) via 71f4e47006cc6c7614589be242bde4e2431f91ad (commit) via 820549faf6e4dfe4779973c857605c359ecc8594 (commit) via 8a99adc5eb6b3a60324825f393776206addae332 (commit) via c4aa3c51f950a6679f2ed3cae6c3f3269ae6b35c (commit) via 3821ef92fa294d1a58de142dd722ba830ef9ad45 (commit) via c7e73ddf8f8abd7b2c135a1b60b718793b3f9dc1 (commit) via c1829e3de0ffcd59128330bbc1635c5a3aba83e1 (commit) via d54912e375cb0ad00acf8bd5b7ecdeabac6e5b8d (commit) via 5a8bd96427df6dfe34e6d0746c6a92b845da8254 (commit) via 778889e06ae20de8c55b78b402616c33640aece1 (commit) via 0225d51a6094f4b4b902c07cbc4a773196b90971 (commit) via 556e1dd198a088b70347b34a13fa088078e54188 (commit) via 94cce7242825f4dcba5d037b592702c3fa0d236f (commit) via 79657a4b4d4a7898bca0737a0c0ac5664ab1cdee (commit) via 84048e3e947cad3b24d82ea538f5f65f4215d874 (commit) via a5034b88aba921c1a741dde25b28bdb8e5500dbe (commit) via b37e9877bd45cb57fb44164e535f6219f163f7dc (commit) via 2ff99809f128dab0809c6dbca64387f798742672 (commit) via bb9a93cc35f34dfbbc9e0b48bd495af2cdabf412 (commit) via b2ea9da61c3b442daf8c75c74fe5cfa55a01a164 (commit) via 649f09449a15d007cc3fd40f851c219d1402a654 (commit) via 34fd238291958711735cd84448e2496fcf921959 (commit) via 14cb2304b0ae083e2ef173c45674d64f802c4e1c (commit) via fdc074e1b8ab27228dde95389d1714cc9addafff (commit) via 04c65d9d7ebae3994d3a1d456d2ffb0ed8a1038a (commit) via d22653a69df075257887d0607370c6f7a6f9b116 (commit) via e9fd0fba401a6ed2d5cbde5905e2c64cbae21f51 (commit) via 97c9cb1961d9bb08f562536351e5a34c57a9bb7f (commit) via 1ddaf638565b186564f41705ca91918ea4713dd4 (commit) via ebf054f4cc07b64344313a9646092ee60d700d28 (commit) via c6d0365c3b6640fa732195adc5b74948e1e5e2e6 (commit) via 9218d208ef0910018cc77e411184108e5b3c5622 (commit) via 0e25df0b4eacfc5f4c6dfe9b5418486212e959ac (commit) via 4aec46133750f55e13cb2b3310635f5c196c7460 (commit) from ba9a1006e8fd905f3c16679649ddbc8226e4a5ea (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 56de3bb25d0e0c9919681c86ec3c2c235697d381 Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Aug 2 16:13:55 2023 -0500 Fix FTDX10 SM command diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 4f81d6dc4..5ccee0253 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -5207,6 +5207,7 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) { RETURNFUNC(-RIG_ENAVAIL); } + if (is_ftdx10) { main_sub_vfo = '0'; } SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "SM%c%c", main_sub_vfo, cat_term); commit 942e4cd950e01e06d9a60708153435803ccee504 Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Aug 2 16:09:32 2023 -0500 Fix get_level AF for FTDX10 diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 92f5ce325..4f81d6dc4 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -4952,6 +4952,7 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) { RETURNFUNC(-RIG_ENAVAIL); } + if (is_ftdx10) { main_sub_vfo = '0'; } SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "AG%c%c", main_sub_vfo, cat_term); commit 232d7626cc75b55a5db193e683e63c61cc5fcae7 Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Aug 2 16:01:10 2023 -0500 Yaesu rigs (at least some of them cannot use MG command when in RTTY or CW mode So we return RIG_OK for set which just ignores it and level=0 in this case diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index e1bdcb009..92f5ce325 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -4247,6 +4247,16 @@ int newcat_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) RETURNFUNC(-RIG_ENAVAIL); } + rmode_t exclude = RIG_MODE_CW | RIG_MODE_CWR | RIG_MODE_RTTY | RIG_MODE_RTTYR; + if ((rig->state.tx_vfo == RIG_VFO_A && (rig->state.cache.modeMainA & exclude)) + ||(rig->state.tx_vfo == RIG_VFO_B && (rig->state.cache.modeMainB & exclude)) + ||(rig->state.tx_vfo == RIG_VFO_C && (rig->state.cache.modeMainC & exclude))) + { + rig_debug(RIG_DEBUG_VERBOSE, "%s: rig cannot set MG in CW/RTTY modes\n", __func__); + return RIG_OK; + } + + if (is_ft991 || is_ft710 || is_ftdx3000 || is_ftdx3000dm || is_ftdx5000 || is_ftdx101d || is_ftdx101mp) { @@ -5035,6 +5045,15 @@ int newcat_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) { RETURNFUNC(-RIG_ENAVAIL); } + rmode_t exclude = RIG_MODE_CW | RIG_MODE_CWR | RIG_MODE_RTTY | RIG_MODE_RTTYR; + if ((rig->state.tx_vfo == RIG_VFO_A && (rig->state.cache.modeMainA & exclude)) + ||(rig->state.tx_vfo == RIG_VFO_B && (rig->state.cache.modeMainB & exclude)) + ||(rig->state.tx_vfo == RIG_VFO_C && (rig->state.cache.modeMainC & exclude))) + { + rig_debug(RIG_DEBUG_VERBOSE, "%s: rig cannot read MG in CW/RTTY modes\n", __func__); + level = 0; + return RIG_OK; + } if (is_ft991 || is_ft710 || is_ftdx3000 || is_ftdx3000dm || is_ftdx5000 || is_ftdx101d || is_ftdx101mp) commit 2709be053ccca3c109ac0dfc3bfba85e8986fd2a Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Aug 2 15:25:44 2023 -0500 Fix new.cat EX030109 command diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 2893a02c0..e1bdcb009 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -626,7 +626,7 @@ int newcat_open(RIG *rig) else if (priv->rig_id == NC_RIGID_FTDX5000 || rig->caps->rig_model == RIG_MODEL_FTDX5000) { cmd = "EX0331;EX033"; } else if (priv->rig_id == NC_RIGID_FTDX10 - || rig->caps->rig_model == RIG_MODEL_FTDX10) { cmd = "EX03010901;EX030109;"; } + || rig->caps->rig_model == RIG_MODEL_FTDX10) { cmd = "EX0301091;EX030109;"; } SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "%s", cmd); diff --git a/rigs/yaesu/newcat.h b/rigs/yaesu/newcat.h index 4fd014372..de1d49c7f 100644 --- a/rigs/yaesu/newcat.h +++ b/rigs/yaesu/newcat.h @@ -50,7 +50,7 @@ typedef char ncboolean; /* shared function version */ -#define NEWCAT_VER "20230731" +#define NEWCAT_VER "20230802" /* Hopefully large enough for future use, 128 chars plus '\0' */ #define NEWCAT_DATA_LEN 129 commit e155dfbf5e37f7d52075e643c566219f3fbee34c Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Aug 2 12:50:03 2023 -0500 Fix cppcheck errors https://github.com/Hamlib/Hamlib/issues/1350 diff --git a/rigs/icom/ic7300.c b/rigs/icom/ic7300.c index e47c3c848..39c9313ec 100644 --- a/rigs/icom/ic7300.c +++ b/rigs/icom/ic7300.c @@ -1832,8 +1832,8 @@ int ic7300_set_parm(RIG *rig, setting_t parm, value_t val) int ic7300_get_parm(RIG *rig, setting_t parm, value_t *val) { unsigned char prmbuf[MAXFRAMELEN], resbuf[MAXFRAMELEN]; - int prm_len, res_len; - int prm_cn, prm_sc; + int prm_len = 0, res_len; + int prm_cn = 0, prm_sc = 0; int icom_val = 0; int cmdhead; int retval; diff --git a/rigs/icom/ic765.c b/rigs/icom/ic765.c index 9ce3d6586..eca4708c6 100644 --- a/rigs/icom/ic765.c +++ b/rigs/icom/ic765.c @@ -82,12 +82,9 @@ const struct rig_caps ic765_caps = .has_set_level = RIG_LEVEL_NONE, .has_get_parm = RIG_PARM_NONE, .has_set_parm = RIG_PARM_NONE, -#if 0 .level_gran = { -#include "level_gran_icom.h" }, -#endif .parm_gran = {}, .ctcss_list = NULL, .dcs_list = NULL, diff --git a/rigs/icom/ic821h.c b/rigs/icom/ic821h.c index db5ac2c55..d6b9f5fdc 100644 --- a/rigs/icom/ic821h.c +++ b/rigs/icom/ic821h.c @@ -57,7 +57,7 @@ static const struct icom_priv_caps ic821h_priv_caps = int ic821h_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo) { struct icom_priv_data *priv = (struct icom_priv_data *) rig->state.priv; - int retval; + int retval = -RIG_EINTERNAL; ENTERFUNC; rig_debug(RIG_DEBUG_TRACE, "%s: vfo=%s, split=%d, tx_vfo=%s\n", __func__, diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index 78932cb60..8f2bc165a 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -8286,6 +8286,7 @@ int icom_get_powerstat(RIG *rig, powerstat_t *status) RIG_POWER_ON : RIG_POWER_OFF; } + HAMLIB_TRACE; if (RIG_IS_IC2730 || RIG_IS_IC705 || RIG_IS_IC7100 @@ -8301,16 +8302,27 @@ int icom_get_powerstat(RIG *rig, powerstat_t *status) freq_t freq; short retry_save = rig->state.rigport.retry; short timeout_retry_save = rig->state.rigport.timeout_retry; + HAMLIB_TRACE; rig->state.rigport.retry = 0; rig->state.rigport.timeout_retry = 0; retval = rig_get_freq(rig, RIG_VFO_A, &freq); + if (retval == -RIG_ETIMEOUT) + { // then rig must be turned off + HAMLIB_TRACE; + rig_debug(RIG_DEBUG_WARN, "%s: get freq failed...assuming power is off\n", __func__); + rig->state.powerstat = RIG_POWER_OFF; + return RIG_OK; // returning RIG_OK here makes the rig->state reflect POWER_OFF + } + HAMLIB_TRACE; + rig->state.rigport.retry = retry_save; rig->state.rigport.timeout_retry = timeout_retry_save; *status = retval == RIG_OK ? RIG_POWER_ON : RIG_POWER_OFF; + rig->state.powerstat = *status; return retval; } else @@ -8318,6 +8330,12 @@ int icom_get_powerstat(RIG *rig, powerstat_t *status) retval = icom_transaction(rig, C_SET_PWR, -1, NULL, 0, ackbuf, &ack_len); + if (retval == -RIG_ETIMEOUT) + { // then rig must be turned off + rig_debug(RIG_DEBUG_WARN, "%s: get powerstat failed...assuming power is off\n", __func__); + rig->state.powerstat = RIG_POWER_OFF; + return RIG_OK; // returning RIG_OK here makes the rig->state reflect POWER_OFF + } if (retval != RIG_OK) { RETURNFUNC(retval); @@ -8551,7 +8569,7 @@ int icom_get_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t *option, ant_t *ant_curr, ant_t *ant_tx, ant_t *ant_rx) { unsigned char ackbuf[MAXFRAMELEN]; - int ack_len = sizeof(ackbuf), retval; + int ack_len = sizeof(ackbuf), retval = -RIG_EINTERNAL; struct icom_priv_caps *priv_caps = (struct icom_priv_caps *) rig->caps->priv; commit 6c794a17bdb9e11f97b3923298aaf79efdb41310 Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Aug 2 12:41:25 2023 -0500 Fix cppcheck errors https://github.com/Hamlib/Hamlib/issues/1350 diff --git a/rigs/dummy/aclog.c b/rigs/dummy/aclog.c index 8596d5c87..77a382801 100644 --- a/rigs/dummy/aclog.c +++ b/rigs/dummy/aclog.c @@ -738,7 +738,7 @@ static int aclog_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) char cmd[MAXCMDLEN]; char *p; char *pttmode; - char *ttmode; + char *ttmode = NULL; struct aclog_priv_data *priv = (struct aclog_priv_data *) rig->state.priv; ENTERFUNC; diff --git a/rigs/dummy/flrig.c b/rigs/dummy/flrig.c index bc5964043..5c793539d 100644 --- a/rigs/dummy/flrig.c +++ b/rigs/dummy/flrig.c @@ -1374,7 +1374,7 @@ static int flrig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) char cmd_arg[MAXCMDLEN]; char *p; char *pttmode; - char *ttmode; + char *ttmode = NULL; struct flrig_priv_data *priv = (struct flrig_priv_data *) rig->state.priv; ENTERFUNC; diff --git a/rigs/dummy/sdrsharp.c b/rigs/dummy/sdrsharp.c index e47f694cb..530fb9b07 100644 --- a/rigs/dummy/sdrsharp.c +++ b/rigs/dummy/sdrsharp.c @@ -387,6 +387,8 @@ static int sdrsharp_open(RIG *rig) char value[MAXARGLEN]; ENTERFUNC; + value[0] = '?'; + value[1] = 0; freq_t freq; retval = sdrsharp_get_freq(rig, RIG_VFO_CURR, &freq); diff --git a/rigs/dummy/tci1x.c b/rigs/dummy/tci1x.c index 2fe040e0d..39bcaa19b 100644 --- a/rigs/dummy/tci1x.c +++ b/rigs/dummy/tci1x.c @@ -596,6 +596,8 @@ static int tci1x_open(RIG *rig) char *p; char *pr; //struct tci1x_priv_data *priv = (struct tci1x_priv_data *) rig->state.priv; + arg[0] = '?'; + arg[1] = 0; rig_debug(RIG_DEBUG_VERBOSE, "%s: version %s\n", __func__, rig->caps->version); char *websocket = @@ -1097,7 +1099,7 @@ static int tci1x_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) char cmd_arg[MAXCMDLEN]; char *p; char *pttmode; - char *ttmode; + char *ttmode = NULL; struct tci1x_priv_data *priv = (struct tci1x_priv_data *) rig->state.priv; ENTERFUNC; commit 428500bb1c79d783d19e9f6840bb1a10761e3b97 Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Aug 2 12:37:36 2023 -0500 Fix cppcheck error https://github.com/Hamlib/Hamlib/issues/1350 diff --git a/lib/precise_time.c b/lib/precise_time.c index c4e0ddb89..84b011c53 100644 --- a/lib/precise_time.c +++ b/lib/precise_time.c @@ -132,13 +132,16 @@ static int showme = 0; #include <stdint.h> static inline uint64_t rdtsc() { - uint32_t hi, lo; + uint32_t hi, lo; + uint64_t hi64, lo64; asm volatile("rdtscp\n" "movl %%edx, %0\n" "movl %%eax, %1\n" "cpuid" : "=r" (hi), "=r" (lo) : : "%rax", "%rbx", "%rcx", "%rdx"); - return (((uint64_t)hi) << 32) | (uint64_t)lo; + hi64 = hi; + lo64 = lo; + return (hi64 << 32) | lo64); } static uint64_t rdtsc_per_sec = 0; commit 6ef0f32d56aabc9d62a90496c60e53b6a1a31bff Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Aug 1 17:05:59 2023 -0500 Add KS to simftdx1200.v diff --git a/simulators/simftdx1200.c b/simulators/simftdx1200.c index eb88715ea..2255f55be 100644 --- a/simulators/simftdx1200.c +++ b/simulators/simftdx1200.c @@ -27,6 +27,7 @@ int ai = 0; int sh = 25; int na = 0; int ex039 = 0; +int keyspd = 20; // ID 0310 == 310, Must drop leading zero typedef enum nc_rigid_e @@ -284,6 +285,16 @@ int main(int argc, char *argv[]) SNPRINTF(buf, sizeof(buf), "PS1;"); n = write(fd, buf, strlen(buf)); } + else if (strncmp(buf, "KS;", 3) == 0) + { + sprintf(buf,"KS%d;", keyspd); + n = write(fd, buf, strlen(buf)); + } + else if (strncmp(buf,"KS",2) == 0) + { + sscanf(buf,"KS%03d", &keyspd); + } + else if (strlen(buf) > 0) { fprintf(stderr, "Unknown command: %s\n", buf); commit 89797e5a54f2db8dd721f62c1afd9bf3015e50c1 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Jul 31 22:40:42 2023 -0500 Fix rig_set_freq to only set vfo at end when needed https://github.com/Hamlib/Hamlib/issues/1126 diff --git a/src/rig.c b/src/rig.c index 74ad943e2..e8661b09f 100644 --- a/src/rig.c +++ b/src/rig.c @@ -2091,7 +2091,7 @@ int rig_set_freq(RIG *rig, vfo_t vfo, freq_t freq) rig_set_cache_freq(rig, vfo, freq_new); - if (vfo != RIG_VFO_CURR) + if (vfo != vfo_save && vfo != RIG_VFO_CURR) { HAMLIB_TRACE; rig_set_vfo(rig, vfo_save); commit c452cd31d904c05236329e26e03d793e8683c088 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Jul 31 17:10:17 2023 -0500 Add simic705 simulator diff --git a/simulators/Makefile.am b/simulators/Makefile.am index 0a081a681..923ac3790 100644 --- a/simulators/Makefile.am +++ b/simulators/Makefile.am @@ -8,7 +8,7 @@ DISTCLEANFILES = bin_PROGRAMS = -check_PROGRAMS = simelecraft simicgeneric simkenwood simyaesu simic9100 simic9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simic7300 simic7000 simic7100 simic7200 simatd578 simic905 simts450 simic7600 simic7610 +check_PROGRAMS = simelecraft simicgeneric simkenwood simyaesu simic9100 simic9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simic7300 simic7000 simic7100 simic7200 simatd578 simic905 simts450 simic7600 simic7610 simic705 simelecraft_SOURCES = simelecraft.c simkenwood_SOURCES = simkenwood.c diff --git a/simulators/simic705.c b/simulators/simic705.c new file mode 100644 index 000000000..bcafc8bc6 --- /dev/null +++ b/simulators/simic705.c @@ -0,0 +1,652 @@ +// simicom will show the pts port to use for rigctl on Unix +// using virtual serial ports on Windows is to be developed yet +// Needs a lot of improvement to work on all Icoms +// gcc -g -Wall -o simicom simicom.c -lhamlib +// On mingw in the hamlib src directory +// gcc -static -I../include -g -Wall -o simicom simicom.c -L../../build/src/.libs -lhamlib -lwsock32 -lws2_32 +#define _XOPEN_SOURCE 700 +// since we are POSIX here we need this +struct ip_mreq +{ + int dummy; +}; + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <sys/time.h> +#include <hamlib/rig.h> +#include "../src/misc.h" +#include <termios.h> +#include <unistd.h> + + +#define BUFSIZE 256 +#define X25 + +int civ_731_mode = 0; +vfo_t current_vfo = RIG_VFO_A; +int split = 0; +int keyspd = 85; // 85=20WPM + +// we make B different from A to ensure we see a difference at startup +float freqA = 14074000; +float freqB = 14074500; +mode_t modeA = RIG_MODE_PKTUSB; +mode_t modeB = RIG_MODE_PKTUSB; +int datamodeA = 0; +int datamodeB = 0; +pbwidth_t widthA = 0; +pbwidth_t widthB = 1; +ant_t ant_curr = 0; +int ant_option = 0; +int ptt = 0; +int satmode = 0; +int agc_time = 1; +int ovf_status = 0; +int powerstat = 1; + +void dumphex(unsigned char *buf, int n) +{ + for (int i = 0; i < n; ++i) { printf("%02x ", buf[i]); } + + printf("\n"); +} + +int +frameGet(int fd, unsigned char *buf) +{ + int i = 0; + memset(buf, 0, BUFSIZE); + unsigned char c; + +again: + + while (read(fd, &c, 1) > 0) + { + buf[i++] = c; + //printf("i=%d, c=0x%02x\n",i,c); + + if (c == 0xfd) + { + dumphex(buf, i); + return i; + } + + if (i > 2 && c == 0xfe) + { + printf("Turning power on due to 0xfe string\n"); + powerstat = 1; + int j; + + for (j = i; j < 175; ++j) + { + if (read(fd, &c, 1) < 0) { break; } + } + + i = 0; + goto again; + } + } + + printf("Error??? c=x%02x\n", c); + + return 0; +} + +void frameParse(int fd, unsigned char *frame, int len) +{ + double freq; + int n = 0; + + dumphex(frame, len); + + if (frame[0] != 0xfe && frame[1] != 0xfe) + { + printf("expected fe fe, got "); + dumphex(frame, len); + return; + } + + switch (frame[4]) + { + case 0x03: + + //from_bcd(frameackbuf[2], (civ_731_mode ? 4 : 5) * 2); + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) + { + printf("get_freqA\n"); + to_bcd(&frame[5], (long long)freqA, (civ_731_mode ? 4 : 5) * 2); + } + else + { + printf("get_freqB\n"); + to_bcd(&frame[5], (long long)freqB, (civ_731_mode ? 4 : 5) * 2); + } + + frame[10] = 0xfd; + + if (powerstat) + { + n = write(fd, frame, 11); + } + + break; + + case 0x04: + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) + { + printf("get_modeA\n"); + frame[5] = modeA; + frame[6] = widthA; + } + else + { + printf("get_modeB\n"); + frame[5] = modeB; + frame[6] = widthB; + } + + frame[7] = 0xfd; + n = write(fd, frame, 8); + break; + + case 0x05: + freq = from_bcd(&frame[5], (civ_731_mode ? 4 : 5) * 2); + printf("set_freq to %.0f\n", freq); + + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { freqA = freq; } + else { freqB = freq; } + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x06: + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { modeA = frame[6]; } + else { modeB = frame[6]; } + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x07: + + switch (frame[5]) + { + case 0x00: current_vfo = RIG_VFO_A; break; + + case 0x01: current_vfo = RIG_VFO_B; break; + + case 0xd0: current_vfo = RIG_VFO_MAIN; break; + + case 0xd1: current_vfo = RIG_VFO_SUB; break; + } + + printf("set_vfo to %s\n", rig_strvfo(current_vfo)); + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x0f: + if (frame[5] == 0) { split = 0; } + else if (frame[5] == 1) { split = 1; } + else { frame[6] = split; } + + if (frame[5] == 0xfd) + { + printf("get split %d\n", split); + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + printf("set split %d\n", 1); + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + + break; + + case 0x12: // we're simulating the 3-byte version -- not the 2-byte + if (frame[5] != 0xfd) + { + printf("Set ant %d\n", -1); + ant_curr = frame[5]; + ant_option = frame[6]; + dump_hex(frame, 8); + } + else + { + printf("Get ant\n"); + } + + frame[5] = ant_curr; + frame[6] = ant_option; + frame[7] = 0xfd; + printf("write 8 bytes\n"); + dump_hex(frame, 8); + n = write(fd, frame, 8); + break; + + case 0x14: + printf("cmd=0x14\n"); + + switch (frame[5]) + { + static int power_level = 0; + + case 0x07: + case 0x08: + if (frame[6] != 0xfd) + { + frame[6] = 0xfb; + dumphex(frame, 7); + n = write(fd, frame, 7); + printf("ACK x14 x08\n"); + } + else + { + to_bcd(&frame[6], (long long)128, 2); + frame[8] = 0xfb; + dumphex(frame, 9); + n = write(fd, frame, 9); + printf("SEND x14 x08\n"); + } + + break; + + case 0x0a: + printf("Using power level %d\n", power_level); + power_level += 10; + + if (power_level > 250) { power_level = 0; } + + to_bcd(&frame[6], (long long)power_level, 2); + frame[8] = 0xfd; + n = write(fd, frame, 9); + break; + + case 0x0c: + dumphex(frame, 10); + printf("subcmd=0x0c #1\n"); + + if (frame[6] != 0xfd) // then we have data + { + printf("subcmd=0x0c #1\n"); + keyspd = from_bcd(&frame[6], 2); + frame[6] = 0xfb; + n = write(fd, frame, 7); + } + else + { + printf("subcmd=0x0c #1\n"); + to_bcd(&frame[6], keyspd, 2); + frame[8] = 0xfd; + n = write(fd, frame, 9); + } + + break; + } + + break; + + case 0x15: + switch (frame[5]) + { + static int meter_level = 0; + + case 0x02: + frame[6] = 00; + frame[7] = 00; + frame[8] = 0xfd; + n = write(fd, frame, 9); + break; + + case 0x07: + frame[6] = ovf_status; + frame[7] = 0xfd; + n = write(fd, frame, 8); + ovf_status = ovf_status == 0 ? 1 : 0; + break; + + case 0x11: + printf("Using meter level %d\n", meter_level); + meter_level += 10; + + if (meter_level > 250) { meter_level = 0; } + + to_bcd(&frame[6], (long long)meter_level, 2); + frame[8] = 0xfd; + n = write(fd, frame, 9); + break; + } + + case 0x16: + switch (frame[5]) + { + case 0x5a: + if (frame[6] == 0xfe) + { + satmode = frame[6]; + } + else + { + frame[6] = satmode; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + + break; + } + + break; + + case 0x18: // miscellaneous things + frame[5] = 1; + frame[6] = 0xfd; + n = write(fd, frame, 7); + break; + + case 0x19: // miscellaneous things + frame[5] = 0x94; + frame[6] = 0xfd; + n = write(fd, frame, 7); + break; + + case 0x1a: // miscellaneous things + switch (frame[5]) + { + case 0x03: // width + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { frame[6] = widthA; } + else { frame[6] = widthB; } + + frame[7] = 0xfd; + n = write(fd, frame, 8); + break; + + case 0x04: // AGC TIME + printf("frame[6]==x%02x, frame[7]=0%02x\n", frame[6], frame[7]); + + if (frame[6] == 0xfd) // the we are reading + { + frame[6] = agc_time; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + printf("AGC_TIME RESPONSE******************************"); + agc_time = frame[6]; + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + + break; + + case 0x07: // satmode + frame[4] = 0; + frame[7] = 0xfd; + n = write(fd, frame, 8); + break; + + } + + break; + + case 0x1c: + switch (frame[5]) + { + case 0: + if (frame[6] == 0xfd) + { + frame[6] = ptt; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + ptt = frame[6]; + frame[7] = 0xfb; + frame[8] = 0xfd; + n = write(fd, frame, 9); + } + + break; + + } + + break; + + +#ifdef X25 + + case 0x25: + if (frame[6] == 0xfd) + { + if (frame[5] == 0x00) + { + to_bcd(&frame[6], (long long)freqA, (civ_731_mode ? 4 : 5) * 2); + printf("X25 get_freqA=%.0f\n", freqA); + } + else + { + to_bcd(&frame[6], (long long)freqB, (civ_731_mode ? 4 : 5) * 2); + printf("X25 get_freqB=%.0f\n", freqB); + } + + frame[11] = 0xfd; +#if 1 + unsigned char frame2[11]; + + frame2[0] = 0xfe; + frame2[1] = 0xfe; + frame2[2] = 0x00; // send transceive frame + frame2[3] = frame[3]; // send transceive frame + frame2[4] = 0x00; + frame2[5] = 0x00; + frame2[6] = 0x35; + frame2[7] = 0x57; + frame2[8] = 0x03; + frame2[9] = 0x00; + frame2[10] = 0xfd; + n = write(fd, frame2, 11); +#endif + n = write(fd, frame, 12); + } + else + { + freq = from_bcd(&frame[6], (civ_731_mode ? 4 : 5) * 2); + printf("set_freq to %.0f\n", freq); + + if (frame[5] == 0x00) { freqA = freq; } + else { freqB = freq; } + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); +#if 0 + // send async frame + frame[2] = 0x00; // async freq + frame[3] = 0xa2; + frame[4] = 0x00; + frame[5] = 0x00; + frame[6] = 0x10; + frame[7] = 0x01; + frame[8] = 0x96; + frame[9] = 0x12; + frame[10] = 0xfd; + n = write(fd, frame, 11); +#endif + } + + break; + + case 0x26: + for (int i = 0; i < 6; ++i) { printf("%02x:", frame[i]); } + + if (frame[6] == 0xfd) // then a query + { + for (int i = 0; i < 6; ++i) { printf("%02x:", frame[i]); } + + frame[6] = frame[5] == 0 ? modeA : modeB; + frame[7] = frame[5] == 0 ? datamodeA : datamodeB; + frame[8] = 0xfb; + frame[9] = 0xfd; + n = write(fd, frame, 10); + } + else + { + for (int i = 0; i < 12; ++i) { printf("%02x:", frame[i]); } + + if (frame[6] == 0) + { + modeA = frame[7]; + datamodeA = frame[8]; + } + else + { + modeB = frame[7]; + datamodeB = frame[8]; + } + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + + printf("\n"); + break; +#else + + case 0x25: + printf("x25 send nak\n"); + frame[4] = 0xfa; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x26: + printf("x26 send nak\n"); + frame[4] = 0xfa; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; +#endif + + default: printf("cmd 0x%02x unknown\n", frame[4]); + } + + if (n == 0) { printf("Write failed=%s\n", strerror(errno)); } + +// don't care about the rig type yet + +} + +#if defined(WIN32) || defined(_WIN32) +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd; + fd = open(comport, O_RDWR); + + if (fd < 0) + { + perror(comport); + } + + return fd; +} + +#else +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd = posix_openpt(O_RDWR); + char *name = ptsname(fd); + + if (name == NULL) + { + perror("pstname"); + return -1; + } + + printf("name=%s\n", name); + + if (fd == -1 || grantpt(fd) == -1 || unlockpt(fd) == -1) + { + perror("posix_openpt"); + return -1; + } + + return fd; +} +#endif + +void rigStatus() +{ + char vfoa = current_vfo == RIG_VFO_A ? '*' : ' '; + char vfob = current_vfo == RIG_VFO_B ? '*' : ' '; + printf("%cVFOA: mode=%d datamode=%d width=%ld freq=%.0f\n", vfoa, modeA, + datamodeA, + widthA, + freqA); + printf("%cVFOB: mode=%d datamode=%d width=%ld freq=%.0f\n", vfob, modeB, + datamodeB, + widthB, + freqB); +} + +int main(int argc, char **argv) +{ + unsigned char buf[256]; + int fd = openPort(argv[1]); + + printf("%s: %s\n", argv[0], rig_version()); +#ifdef X25 + printf("x25/x26 command recognized\n"); +#else + printf("x25/x26 command rejected\n"); +#endif +#if defined(WIN32) || defined(_WIN32) + + if (argc != 2) + { + printf("Missing comport argument\n"); + printf("%s [comport]\n", argv[0]); + exit(1); + } + +#endif + + while (1) + { + int len = frameGet(fd, buf); + + if (len <= 0) + { + close(fd); + fd = openPort(argv[1]); + } + + if (powerstat) + { + frameParse(fd, buf, len); + } + else + { + hl_usleep(1000 * 1000); + } + + rigStatus(); + } + + return 0; +} commit 801d34e3fba7e94bb738aed32ba7b91c06dcbcbd Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Jul 31 15:31:06 2023 -0500 Fix reverse split for Yaeus VFO_SUB rigs https://github.com/Hamlib/Hamlib/issues/1103 diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 381e62f36..2893a02c0 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -7884,7 +7884,7 @@ int newcat_set_tx_vfo(RIG *rig, vfo_t tx_vfo) p1 = p1 + 2; /* use non-Toggle commands */ // If VFOB is active then we change VFOB with FT3 instead of VFOA - if (rig->state.current_vfo == RIG_VFO_B) { p1++; } + if (rig->state.current_vfo == RIG_VFO_B || rig->state.current_vfo == RIG_VFO_SUB) { p1++; } } if (is_ftdx101d || is_ftdx101mp) diff --git a/rigs/yaesu/newcat.h b/rigs/yaesu/newcat.h index f03ce1974..4fd014372 100644 --- a/rigs/yaesu/newcat.h +++ b/rigs/yaesu/newcat.h @@ -50,7 +50,7 @@ typedef char ncboolean; /* shared function version */ -#define NEWCAT_VER "20230724" +#define NEWCAT_VER "20230731" /* Hopefully large enough for future use, 128 chars plus '\0' */ #define NEWCAT_DATA_LEN 129 commit d9b1cfb4047c9b94700340a66fc6b1cb3b543f1c Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Jul 31 09:08:34 2023 -0500 Fix fifo.c mutex handling diff --git a/src/fifo.c b/src/fifo.c index dd91cc86d..7b7056f1c 100644 --- a/src/fifo.c +++ b/src/fifo.c @@ -27,7 +27,6 @@ int push(FIFO_RIG *fifo, const char *msg) #ifdef _PTHREAD_H pthread_mutex_lock(&fifo->mutex); #endif - return RIG_OK; int len = strlen(msg); for (int i = 0; i < len; ++i) @@ -76,10 +75,10 @@ int peek(FIFO_RIG *fifo) else rig_debug(RIG_DEBUG_VERBOSE, "%s: peek 0x%02x (%d,%d)\n", __func__, c, fifo->head, fifo->tail); - return c; #ifdef _PTHREAD_H pthread_mutex_unlock(&fifo->mutex); #endif + return c; } int pop(FIFO_RIG *fifo) commit 5446b2c99dc5e2da5b1d0593b19fa15aaf0aaf5a Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Jul 30 16:01:35 2023 -0500 Fix dependency for ignore.swg diff --git a/bindings/Makefile.am b/bindings/Makefile.am index 7e2647945..e1bb50ed2 100644 --- a/bindings/Makefile.am +++ b/bindings/Makefile.am @@ -39,7 +39,7 @@ BUILT_SOURCES += hamlibperl_wrap.c MOSTLYCLEANFILES += hamlibperl_wrap.c Hamlib.pm Hamlib.bs Hamlib-pl.mk.old example_DATA += perltest.pl -hamlibperl_wrap.c: hamlib.swg $(SWIGDEP) +hamlibperl_wrap.c: hamlib.swg $(SWIGDEP) ignore.swg $(AM_V_GEN)$(SWIG) -perl5 -shadow $(AM_CPPFLAGS) -I$(top_srcdir)/bindings \ -o $@ $$(test -f hamlib.swg || echo '$(srcdir)/')hamlib.swg commit 71629cf2f323f5121d7cb69fd198c3cd8e30b481 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Jul 30 11:24:16 2023 -0500 Hopefully fix Mac perl binding build diff --git a/bindings/ignore.swg b/bindings/ignore.swg index 37d6c96dc..acfd35fe9 100644 --- a/bindings/ignore.swg +++ b/bindings/ignore.swg @@ -213,6 +213,8 @@ %ignore hamlib_version2; %ignore macro_name; +%ignore FIFO_RIG; + #ifdef SWIGLUA %ignore Rig::set_level(setting_t,int,vfo_t); %ignore Rig::set_ext_level(setting_t,value_t,vfo_t); commit c251a075abcaebd8b2222f9e5e02fe5ae5d81e4b Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Jul 30 09:49:10 2023 -0500 Fix MAC build diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 458ef51d2..88240f535 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -137,7 +137,7 @@ typedef struct int head; int tail; int flush; // flush flag for stop_morse -#if _PTHREAD_H +#ifdef _PTHREAD_H pthread_mutex_t mutex; #else int mutex; commit ddb128bbf74570addd7296afcf9e42eaabff8698 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Jul 30 07:55:28 2023 -0500 Make fifo.c thread safe diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index ad57c3390..458ef51d2 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -137,6 +137,11 @@ typedef struct int head; int tail; int flush; // flush flag for stop_morse +#if _PTHREAD_H + pthread_mutex_t mutex; +#else + int mutex; +#endif } FIFO_RIG; commit 006f724dae6c992373779b28547e8daf9022a3cd Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Jul 30 07:53:17 2023 -0500 Make fifo.c thread safe diff --git a/src/fifo.c b/src/fifo.c index d445882bd..dd91cc86d 100644 --- a/src/fifo.c +++ b/src/fifo.c @@ -2,12 +2,16 @@ #include <stdio.h> #include <ctype.h> #include "fifo.h" - +#include "config.h" void initFIFO(FIFO_RIG *fifo) { fifo->head = 0; fifo->tail = 0; +#ifdef _PTHREAD_H + static pthread_mutex_t t = PTHREAD_MUTEX_INITIALIZER; + fifo->mutex = t; +#endif } void resetFIFO(FIFO_RIG *fifo) @@ -20,6 +24,10 @@ void resetFIFO(FIFO_RIG *fifo) // return -RIG error if overflow int push(FIFO_RIG *fifo, const char *msg) { +#ifdef _PTHREAD_H + pthread_mutex_lock(&fifo->mutex); +#endif + return RIG_OK; int len = strlen(msg); for (int i = 0; i < len; ++i) @@ -46,6 +54,9 @@ int push(FIFO_RIG *fifo, const char *msg) fifo->tail = (fifo->tail + 1) % HAMLIB_FIFO_SIZE; } +#ifdef _PTHREAD_H + pthread_mutex_unlock(&fifo->mutex); +#endif return RIG_OK; } @@ -55,6 +66,9 @@ int peek(FIFO_RIG *fifo) if (fifo->tail < 0 || fifo->head < 0) return -1; if (fifo->tail > 1023 || fifo->head > 1023) return -1; if (fifo->tail == fifo->head) { return -1; } +#ifdef _PTHREAD_H + pthread_mutex_lock(&fifo->mutex); +#endif char c = fifo->data[fifo->head]; if (isalnum(c)) rig_debug(RIG_DEBUG_VERBOSE, "%s: peek %c (%d,%d)\n", __func__, c, fifo->head, @@ -63,12 +77,18 @@ int peek(FIFO_RIG *fifo) rig_debug(RIG_DEBUG_VERBOSE, "%s: peek 0x%02x (%d,%d)\n", __func__, c, fifo->head, fifo->tail); return c; +#ifdef _PTHREAD_H + pthread_mutex_unlock(&fifo->mutex); +#endif } int pop(FIFO_RIG *fifo) { if (fifo->tail == fifo->head) { return -1; } +#ifdef _PTHREAD_H + pthread_mutex_lock(&fifo->mutex); +#endif char c = fifo->data[fifo->head]; if (isalnum(c)) rig_debug(RIG_DEBUG_VERBOSE, "%s: pop %c (%d,%d)\n", __func__, c, fifo->head, @@ -77,6 +97,9 @@ int pop(FIFO_RIG *fifo) rig_debug(RIG_DEBUG_VERBOSE, "%s: pop 0x%02x (%d,%d)\n", __func__, c, fifo->head, fifo->tail); fifo->head = (fifo->head + 1) % HAMLIB_FIFO_SIZE; +#ifdef _PTHREAD_H + pthread_mutex_unlock(&fifo->mutex); +#endif return c; } commit b4ddf64b311f31db08f094893b633059ea2434a6 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Jul 30 07:25:57 2023 -0500 Assume rig is powered on if get_powerstat is not implemented diff --git a/src/rig.c b/src/rig.c index bced3faaf..74ad943e2 100644 --- a/src/rig.c +++ b/src/rig.c @@ -6270,6 +6270,7 @@ int HAMLIB_API rig_set_powerstat(RIG *rig, powerstat_t status) if (rig->caps->set_powerstat == NULL) { rig_debug(RIG_DEBUG_WARN, "%s set_powerstat not implemented\n", __func__); + rig->state.powerstat = RIG_POWER_ON; // assume we are on if we can't set_powerstat RETURNFUNC(-RIG_ENAVAIL); } commit 21c5c3f419ad2a0f485176d725a2a454f3795395 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Jul 30 07:17:44 2023 -0500 Update comments in rig.c diff --git a/src/rig.c b/src/rig.c index 0529abae2..bced3faaf 100644 --- a/src/rig.c +++ b/src/rig.c @@ -829,7 +829,9 @@ RIG *HAMLIB_API rig_init(rig_model_t rig_model) rs->announces = caps->announces; rs->rigport.fd = rs->pttport.fd = rs->dcdport.fd = -1; - rs->powerstat = RIG_POWER_ON; // default to power on + // some rigs (like SDR) behave differnt when checking for power on + // So we assume power is on until one of the backends KNOWS it is off + rs->powerstat = RIG_POWER_ON; // default to power on until proven otherwise // we have to copy rs to rig->state_deprecated for DLL backwards compatibility memcpy(&rig->state_deprecated, rs, sizeof(rig->state_deprecated)); commit 2852fba73fa705a8a97ed5c580df2970cee5b3b0 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Jul 29 15:10:36 2023 -0500 Increase sleep during power on for Icom to wait for serial port to wake up diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index d3af1f0a1..78932cb60 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -8130,7 +8130,7 @@ int icom_set_powerstat(RIG *rig, powerstat_t status) // sending more than enough 0xfe's to wake up the rs232 write_block(&rs->rigport, fe_buf, fe_max); // need to wait a bit for RigPI and others to queue the echo - hl_usleep(200 * 1000); + hl_usleep(400 * 1000); // we'll try 0x18 0x01 now -- should work on STBY rigs too pwr_sc = S_PWR_ON; diff --git a/rigs/icom/icom.h b/rigs/icom/icom.h index afd52e2b2..2fe849e7a 100644 --- a/rigs/icom/icom.h +++ b/rigs/icom/icom.h @@ -35,7 +35,7 @@ #include <sys/time.h> #endif -#define BACKEND_VER "20230728" +#define BACKEND_VER "20230729" #define ICOM_IS_ID31 rig_is_model(rig, RIG_MODEL_ID31) #define ICOM_IS_ID51 rig_is_model(rig, RIG_MODEL_ID51) commit b24cad1278520e18576476e2236bdf5e97895f41 Merge: bd1fcbe02 1260921da Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Jul 28 17:32:56 2023 -0500 Merge branch 'master' of https://github.com/Hamlib/Hamlib commit bd1fcbe025bc2e88c08cf26d2b6a6faa8c718f95 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Jul 28 17:32:23 2023 -0500 Adjust icom power up to use the mininum number of 0xfe's needed for the baud rate diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index 33b361cc3..d3af1f0a1 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -8080,8 +8080,8 @@ int icom_set_powerstat(RIG *rig, powerstat_t status) unsigned char ackbuf[200]; int ack_len = sizeof(ackbuf), retval = RIG_OK, echo_status; int pwr_sc; - // so we'll do up to 175 for 115,200 - int fe_max = 175; + // so we'll do up to 150 for 115,200 + int fe_max = 150; unsigned char fe_buf[fe_max]; // for FE's to power up int i; int retry, retry_save; @@ -8105,6 +8105,27 @@ int icom_set_powerstat(RIG *rig, powerstat_t status) case RIG_POWER_ON: // ic7300 manual says ~150 for 115,200 // we'll just send a few more to be sure for all speeds + switch(rs->rigport.parm.serial.rate) + { + case 4800: + fe_max = 7; + break; + case 9600: + fe_max = 13; + break; + case 19200: + fe_max = 25; + break; + case 38400: + fe_max = 50; + break; + case 57600: + fe_max = 75; + break; + case 115200: + default: + fe_max = 150; + } memset(fe_buf, 0xfe, fe_max); // sending more than enough 0xfe's to wake up the rs232 write_block(&rs->rigport, fe_buf, fe_max); diff --git a/rigs/icom/icom.h b/rigs/icom/icom.h index 163b7754e..afd52e2b2 100644 --- a/rigs/icom/icom.h +++ b/rigs/icom/icom.h @@ -35,7 +35,7 @@ #include <sys/time.h> #endif -#define BACKEND_VER "20230724" +#define BACKEND_VER "20230728" #define ICOM_IS_ID31 rig_is_model(rig, RIG_MODEL_ID31) #define ICOM_IS_ID51 rig_is_model(rig, RIG_MODEL_ID51) commit ebb6efba8d3a6c67ccfc062e4d90f3a0859022da Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Jul 28 17:02:00 2023 -0500 Add simic7200.c fully compatible with FLRig Add simic7000.c Improve simpowersdr.c diff --git a/simulators/Makefile.am b/simulators/Makefile.am index 628695349..0a081a681 100644 --- a/simulators/Makefile.am +++ b/simulators/Makefile.am @@ -8,7 +8,7 @@ DISTCLEANFILES = bin_PROGRAMS = -check_PROGRAMS = simelecraft simicgeneric simkenwood simyaesu simic9100 simic9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simic7300 simic7100 simatd578 simic905 simts450 simic7600 simic7610 +check_PROGRAMS = simelecraft simicgeneric simkenwood simyaesu simic9100 simic9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simic7300 simic7000 simic7100 simic7200 simatd578 simic905 simts450 simic7600 simic7610 simelecraft_SOURCES = simelecraft.c simkenwood_SOURCES = simkenwood.c diff --git a/simulators/simic7000.c b/simulators/simic7000.c new file mode 100644 index 000000000..54c7bd7de --- /dev/null +++ b/simulators/simic7000.c @@ -0,0 +1,542 @@ +// simicom will show the pts port to use for rigctl on Unix +// using virtual serial ports on Windows is to be developed yet +// Needs a lot of improvement to work on all Icoms +// gcc -g -Wall -o simicom simicom.c -lhamlib +// On mingw in the hamlib src directory +// gcc -static -I../include -g -Wall -o simicom simicom.c -L../../build/src/.libs -lhamlib -lwsock32 -lws2_32 +#define _XOPEN_SOURCE 700 +// since we are POSIX here we need this +struct ip_mreq +{ + int dummy; +}; + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <sys/time.h> +#include <hamlib/rig.h> +#include "../src/misc.h" +#include <termios.h> +#include <unistd.h> + + +#define BUFSIZE 256 +#define X25 + +int civ_731_mode = 0; +vfo_t current_vfo = RIG_VFO_A; +int split = 0; + +// we make B different from A to ensure we see a difference at startup +float freqA = 14074000; +float freqB = 14074500; +mode_t modeA = RIG_MODE_PKTUSB; +mode_t modeB = RIG_MODE_PKTUSB; +int datamodeA = 0; +int datamodeB = 0; +pbwidth_t widthA = 0; +pbwidth_t widthB = 1; +ant_t ant_curr = 0; +int ant_option = 0; +int ptt = 0; +int satmode = 0; +int agc_time = 1; +int ovf_status = 0; +int powerstat = 1; +int transceive = 0; + +void dumphex(unsigned char *buf, int n) +{ + for (int i = 0; i < n; ++i) { printf("%02x ", buf[i]); } + + printf("\n"); +} + +int +frameGet(int fd, unsigned char *buf) +{ + int i = 0, n; + memset(buf, 0, BUFSIZE); + unsigned char c; + +again: + + while (read(fd, &c, 1) > 0) + { + buf[i++] = c; + //printf("i=%d, c=0x%02x\n",i,c); + + if (c == 0xfd) + { + char mytime[256]; + date_strget(mytime,sizeof(mytime),1); + printf("%s:", mytime); dumphex(buf, i); + // echo + n = write(fd, buf, i); + if (n != i) printf("%s: error on write: %s\n", __func__, strerror(errno)); + return i; + } + + if (i > 2 && c == 0xfe) + { + printf("Turning power on due to 0xfe string\n"); + powerstat = 1; + int j; + + for (j = i; j < 175; ++j) + { + if (read(fd, &c, 1) < 0) { break; } + } + + i = 0; + goto again; + } + } + + printf("Error??? c=x%02x\n", c); + + return 0; +} + +void frameParse(int fd, unsigned char *frame, int len) +{ + double freq; + int n = 0; + + dumphex(frame, len); + + if (frame[0] != 0xfe && frame[1] != 0xfe) + { + printf("expected fe fe, got "); + dumphex(frame, len); + return; + } + + switch (frame[4]) + { + case 0x03: + + //from_bcd(frameackbuf[2], (civ_731_mode ? 4 : 5) * 2); + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) + { + printf("get_freqA\n"); + to_bcd(&frame[5], (long long)freqA, (civ_731_mode ? 4 : 5) * 2); + } + else + { + printf("get_freqB\n"); + to_bcd(&frame[5], (long long)freqB, (civ_731_mode ? 4 : 5) * 2); + } + + frame[10] = 0xfd; + + if (powerstat) + { + n = write(fd, frame, 11); + } + + break; + + case 0x04: + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) + { + printf("get_modeA\n"); + frame[5] = modeA; + frame[6] = widthA; + } + else + { + printf("get_modeB\n"); + frame[5] = modeB; + frame[6] = widthB; + } + + frame[7] = 0xfd; + n = write(fd, frame, 8); + break; + + case 0x05: + freq = from_bcd(&frame[5], (civ_731_mode ? 4 : 5) * 2); + printf("set_freq to %.0f\n", freq); + + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { freqA = freq; } + else { freqB = freq; } + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x06: + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { modeA = frame[6]; } + else { modeB = frame[6]; } + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x07: + + switch (frame[5]) + { + case 0x00: current_vfo = RIG_VFO_A; break; + + case 0x01: current_vfo = RIG_VFO_B; break; + + case 0xa0: current_vfo = freq = freqA; freqA = freqB; freqB = freq; break; + + case 0xb0: current_vfo = RIG_VFO_MAIN; break; + + case 0xd0: current_vfo = RIG_VFO_MAIN; break; + + case 0xd1: current_vfo = RIG_VFO_SUB; break; + } + + printf("set_vfo to %s\n", rig_strvfo(current_vfo)); + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x0f: + if (frame[5] == 0) { split = 0; } + else if (frame[5] == 1) { split = 1; } + else { frame[6] = split; } + + if (frame[5] == 0xfd) + { + printf("get split %d\n", 1); + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + printf("set split %d\n", 1); + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + + break; + + case 0x12: // we're simulating the 3-byte version -- not the 2-byte + if (frame[5] != 0xfd) + { + printf("Set ant %d\n", -1); + ant_curr = frame[5]; + ant_option = frame[6]; + dump_hex(frame, 8); + } + else + { + printf("Get ant\n"); + } + + frame[5] = ant_curr; + frame[6] = ant_option; + frame[7] = 0xfd; + printf("write 8 bytes\n"); + dump_hex(frame, 8); + n = write(fd, frame, 8); + break; + + case 0x14: + switch (frame[5]) + { + static int power_level = 0; + + case 0x07: + case 0x08: + if (frame[6] != 0xfd) + { + frame[6] = 0xfb; + dumphex(frame, 7); + n = write(fd, frame, 7); + printf("ACK x14 x08\n"); + } + else + { + to_bcd(&frame[6], (long long)128, 2); + frame[8] = 0xfb; + dumphex(frame, 9); + n = write(fd, frame, 9); + printf("SEND x14 x08\n"); + } + + break; + + case 0x0a: + printf("Using power level %d\n", power_level); + power_level += 10; + + if (power_level > 250) { power_level = 0; } + + to_bcd(&frame[6], (long long)power_level, 2); + frame[8] = 0xfd; + n = write(fd, frame, 9); + break; + } + + break; + + case 0x15: + switch (frame[5]) + { + static int meter_level = 0; + + case 0x07: + frame[6] = ovf_status; + frame[7] = 0xfd; + n = write(fd, frame, 8); + ovf_status = ovf_status == 0 ? 1 : 0; + break; + + case 0x11: + printf("Using meter level %d\n", meter_level); + meter_level += 10; + + if (meter_level > 250) { meter_level = 0; } + + to_bcd(&frame[6], (long long)meter_level, 2); + frame[8] = 0xfd; + n = write(fd, frame, 9); + break; + } + + case 0x16: + switch (frame[5]) + { + case 0x5a: + if (frame[6] == 0xfe) + { + satmode = frame[6]; + } + else + { + frame[6] = satmode; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + + break; + } + + break; + + case 0x19: // miscellaneous things + frame[5] = 0x94; + frame[6] = 0xfd; + n = write(fd, frame, 7); + break; + + case 0x1a: // miscellaneous things + switch (frame[5]) + { + case 0x03: // width + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { frame[6] = widthA; } + else { frame[6] = widthB; } + + frame[7] = 0xfd; + n = write(fd, frame, 8); + break; + + case 0x04: // AGC TIME + printf("frame[6]==x%02x, frame[7]=0%02x\n", frame[6], frame[7]); + + if (frame[6] == 0xfd) // the we are reading + { + frame[6] = agc_time; + frame[7] = 0xfd; + ... [truncated message content] |
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 |
From: n0nb <n0...@us...> - 2023-07-07 15:43:16
|
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 3bda269494f4719fa49a996dd62ab0429f81e9d4 (commit) via 90585cbb6e0d51440ea122e1b054e39db52da0b4 (commit) via 24f17730f4ee4032216cb18e8a509fca73751b87 (commit) via 52cba4630b5eea36421bb55aa698fb1e211985d6 (commit) via ad1e63efa1e64e83cd9bb1c10bfc0b45f7e308bb (commit) via 58e5e260a51fc45f88ccc5a2d5551e5fd89e203d (commit) via 858f2b66c3f5e2ad8845a8b76b1bd3008283a132 (commit) via 44fa32c8cd8be026f9fa43a469247c9383220009 (commit) via 7a713634e37f2eca1ec05a74cae8022b5d88c8c7 (commit) via 4c02a70ea3bcea5b68aa765a837aed04eee579a3 (commit) via 0f706dfaae539e5bde62848ee20f5f6b1e4cf7f9 (commit) via 16b83b76b37503d81903fee6be2b237f6d78921a (commit) via 25ad13cea9ffe4f853a5a4070399b80e7adef778 (commit) via 4171598eafa5c028010b3191ff6659ff66847783 (commit) via f3cab55c4f8782761ceb9674c948a9a254050dc5 (commit) via a3ac6e0be312486628cb97199fa5e7eaa1e63954 (commit) via c0c70b014693f7d41703cb6087416b96c6935a90 (commit) via 2728d47a6052e6b3f1a469fdb0c716e7b0e2f290 (commit) via 4bd904502ba66a89bb9ec47fd799075bf8393306 (commit) via b158b224ab0f4d697136efaa0a71849df67713de (commit) via fcef98e60dc728453e245f7e59e0dcad2dc644d2 (commit) via 5c3f26cc5668e01f9540d3ab6c541ebdcd390eaf (commit) via e9d032011106dd24179754788b0eeb958711ab81 (commit) via 28396bad7a3fc116a8666269a27c95a7c1df3d94 (commit) via 5a26bde2369c6a2c986cde7effc9a9a1d01ba140 (commit) via 105cc6e3c612a1f7c94395c348c7e3895ac39062 (commit) via 3283c3b22ffda6a112376bf4278ad13e999011a4 (commit) via 701aaab1c6fb63ff7a9e0e4478c4879370a6a354 (commit) via c5937b23e518a396870a2c3ebc791b18f47cb673 (commit) via 1c2033c17f6d70f76b7a5b1b867a198e15b109a5 (commit) via 751935d83879c8edad2f58d131948eb714fafe50 (commit) via 5281361e071973386025571eef636f68ca7293db (commit) via efb567f66701b4227d290ca26bdb5155be91e109 (commit) via 97811d2aa7eb2246da0195150b2018cbc15bf193 (commit) via 4dfe98b0fea83737193a97105f4c52ee627a2962 (commit) via b3a61cf00ea55fdeb3fd12d2dc7238d9e353e533 (commit) via f14c241f43b83ed811a00d3d71f6a4849879436e (commit) via fa31975650c242dd0b734e59065a23b41e8eeaa8 (commit) via d9b936618c8a65593c71f435174bb3e462fb39c4 (commit) via f9d27d0e35ff0aa8fa47c75d7642199efbb16ad1 (commit) via 8e94bc63d0888fc70b551bf0e76d56c9c3ba5760 (commit) via 33d13f78492e85bc754c21bd4c5771f40118e6af (commit) via 07dde9ae0fe503a7093559ab947de1a21ad423e3 (commit) via ebedbbbfb5ba84ac8591220e6f8387750575693b (commit) via dc1fa7f450909a1bb2cc7fa40d2d5b688a204359 (commit) via 2e610be0313cef0366ce61443d2b54d040ab9b3b (commit) via c640f663260510e274b9991aa4cea929a63f6161 (commit) via 88a1d88e0fae81402ed31e9e6d7921858d34404f (commit) via 03e72c3a994b1a0a692faa8b7c23209f91fb38b3 (commit) via 788db91e2fce8c354b1779c717433bb8e470dc10 (commit) via 163d10651bb0d9601943e75b0b210af4288bca17 (commit) via c4f635ab5d71e9312380a264c655f2344e44af4f (commit) via 224d68d1ac3ffe951e1258a67fec726d1cfca313 (commit) via 6100bfdc115cb32021cb9dbf774a1e1f7e3a44c9 (commit) via 8d8f224affc955b94f12c0b4da7be533a55d6217 (commit) via 32569d40201728de756a8bfe012495bdcbadebea (commit) via 9bec3fad4ffb76073b1ed0bea26c25221ef88e20 (commit) from 05cf5546717be163e94b30f98cd17a3f1136ba1a (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 3bda269494f4719fa49a996dd62ab0429f81e9d4 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Jul 4 22:20:34 2023 -0500 Add elapsd to rig_test_cw diff --git a/tests/rig_tests.c b/tests/rig_tests.c index 8a8a63401..a4a706b69 100644 --- a/tests/rig_tests.c +++ b/tests/rig_tests.c @@ -8,6 +8,7 @@ int rig_test_cw(RIG *rig) char *s = "SOS SOS SOS SOS SOS SOS SOS SOS SOS SOS SOS SOS SOS"; //char *s = "TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST"; int i; + ELAPSED1; ENTERFUNC; for (i = 0; i < strlen(s); ++i) @@ -26,5 +27,6 @@ int rig_test_cw(RIG *rig) } } + ELAPSED2; RETURNFUNC(RIG_OK); } commit 90585cbb6e0d51440ea122e1b054e39db52da0b4 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Jul 4 17:36:42 2023 -0500 Add testmW2power.c diff --git a/tests/testmW2power.c b/tests/testmW2power.c new file mode 100644 index 000000000..215b20b25 --- /dev/null +++ b/tests/testmW2power.c @@ -0,0 +1,78 @@ +/* + * Hamlib sample program to test transceive mode (async event) + */ + +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <stdlib.h> + +#include <hamlib/rig.h> + +#include <hamlib/config.h> + +int nrigs = 0; + +int callback(const struct rig_caps *caps, rig_ptr_t rigp) +{ + RIG *rig = (RIG *) rigp; + + switch (caps->rig_model) + { + case RIG_MODEL_NETRIGCTL: + return 1; + break; + } + + rig = rig_init(caps->rig_model); + + if (!rig) + { + fprintf(stderr, "Unknown rig num: %u\n", caps->rig_model); + fprintf(stderr, "Please check riglist.h\n"); + exit(1); /* whoops! something went wrong (mem alloc?) */ + } + + if (caps->mW2power) + { + nrigs++; + printf("%20s:", caps->model_name); + fflush(stdout); + float fpow; + unsigned int mwpower = 1 * 1000; + freq_t freq = MHz(14); + int retcode = rig_mW2power(rig, &fpow, mwpower, freq, RIG_MODE_CW); + + if (retcode != RIG_OK) + { + printf("rig_mW2power: error = %s \n", rigerror(retcode)); + return 1; + } + + if (fpow < 0.009 || fpow > .11) + { +// printf("rig=%d, fpow=%g, min=%d, max=%d\n", caps->rig_model, fpow, caps->); + printf("rig=%d, fpow=%g\n", caps->rig_model, fpow); + // we call again to make debugging this section easier + rig_mW2power(rig, &fpow, mwpower, freq, RIG_MODE_CW); + } + else { printf("\n"); } + } + + rig_cleanup(rig); /* if you care about memory */ + return 1; +} + +int main(int argc, char *argv[]) +{ + RIG *rig; + int i; + + rig_set_debug(RIG_DEBUG_NONE); + + rig_load_all_backends(); + rig_list_foreach(callback, &rig); + printf("Done testing %d rigs\n", nrigs); + + return 0; +} commit 24f17730f4ee4032216cb18e8a509fca73751b87 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Jul 4 17:31:07 2023 -0500 Add \test command to rigctl -- first test routine is "cw" https://github.com/Hamlib/Hamlib/issues/1281 diff --git a/tests/Makefile.am b/tests/Makefile.am index 0e3d453d8..72717b30e 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -17,9 +17,9 @@ DISTCLEANFILES = rigctl.log rigctl.sum testbcd.log testbcd.sum bin_PROGRAMS = rigctl rigctld rigmem rigsmtr rigswr rotctl rotctld rigctlcom rigctltcp rigctlsync ampctl ampctld rigtestmcast rigtestmcastrx $(TESTLIBUSB) #check_PROGRAMS = dumpmem testrig testrigopen testrigcaps testtrn testbcd testfreq listrigs testloc rig_bench testcache cachetest cachetest2 testcookie testgrid testsecurity -check_PROGRAMS = dumpmem testrig testrigopen testrigcaps testtrn testbcd testfreq listrigs testloc rig_bench testcache cachetest cachetest2 testcookie testgrid hamlibmodels +check_PROGRAMS = dumpmem testrig testrigopen testrigcaps testtrn testbcd testfreq listrigs testloc rig_bench testcache cachetest cachetest2 testcookie testgrid hamlibmodels testmW2power -RIGCOMMONSRC = rigctl_parse.c rigctl_parse.h dumpcaps.c dumpstate.c uthash.h +RIGCOMMONSRC = rigctl_parse.c rigctl_parse.h dumpcaps.c dumpstate.c uthash.h rig_tests.c rig_tests.h ROTCOMMONSRC = rotctl_parse.c rotctl_parse.h dumpcaps_rot.c uthash.h AMPCOMMONSRC = ampctl_parse.c ampctl_parse.h dumpcaps_amp.c uthash.h diff --git a/tests/rig_tests.c b/tests/rig_tests.c new file mode 100644 index 000000000..8a8a63401 --- /dev/null +++ b/tests/rig_tests.c @@ -0,0 +1,30 @@ +#include <stdio.h> +#include <hamlib/rig.h> +#include <misc.h> + + +int rig_test_cw(RIG *rig) +{ + char *s = "SOS SOS SOS SOS SOS SOS SOS SOS SOS SOS SOS SOS SOS"; + //char *s = "TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST"; + int i; + ENTERFUNC; + + for (i = 0; i < strlen(s); ++i) + { + char cw[2]; + cw[0] = s[i]; + cw[1] = '\0'; + + int retval = rig_send_morse(rig, RIG_VFO_CURR, cw); + hl_usleep(100*1000); + + if (retval != RIG_OK) + { + rig_debug(RIG_DEBUG_ERR, "%s: rig_send_morse error: %s\n", __func__, + rigerror(retval)); + } + } + + RETURNFUNC(RIG_OK); +} diff --git a/tests/rig_tests.h b/tests/rig_tests.h new file mode 100644 index 000000000..7cd3e18a6 --- /dev/null +++ b/tests/rig_tests.h @@ -0,0 +1,3 @@ +#include <hamlib/rig.h> + +int rig_test_cw(RIG *rig); diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index 23e25d566..c0386bd2a 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -36,6 +36,7 @@ #include <ctype.h> #include <errno.h> #include <getopt.h> +#include <rig_tests.h> // If true adds some debug statements to see flow of rigctl parsing int debugflow = 0; @@ -264,6 +265,7 @@ declare_proto_rig(set_lock_mode); declare_proto_rig(get_lock_mode); declare_proto_rig(send_raw); declare_proto_rig(client_version); +declare_proto_rig(test); /* @@ -379,6 +381,7 @@ static struct test_table test_list[] = { 0xa4, "send_raw", ACTION(send_raw), ARG_NOVFO | ARG_IN1 | ARG_IN2 | ARG_OUT3, "Terminator", "Command", "Send raw answer" }, { 0xa5, "client_version", ACTION(client_version), ARG_NOVFO | ARG_IN1, "Version", "Client version" }, { 0xa6, "get_vfo_list", ACTION(get_vfo_list), ARG_NOVFO }, + { 0xa7, "test", ACTION(test), ARG_NOVFO | ARG_IN, "routine" }, { 0x00, "", NULL }, }; @@ -2437,6 +2440,20 @@ declare_proto_rig(get_vfo_list) RETURNFUNC2(RIG_OK); } +/* '\test' */ +declare_proto_rig(test) +{ + ENTERFUNC2; + if (!strcmp(arg1, "?")) + { + fprintf(fout, "cw\n"); + RETURNFUNC2(RIG_OK); + } + if (strcmp(arg1, "cw")==0) rig_test_cw(rig); + + RETURNFUNC2(RIG_OK); +} + /* '\get_modes' */ declare_proto_rig(get_modes) { commit 52cba4630b5eea36421bb55aa698fb1e211985d6 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Jul 3 07:56:04 2023 -0500 Change FLRig PKT modes to PKTUSB/LSB instead of RTTY https://github.com/Hamlib/Hamlib/issues/1327 diff --git a/rigs/dummy/flrig.c b/rigs/dummy/flrig.c index 8a77cc69e..bc5964043 100644 --- a/rigs/dummy/flrig.c +++ b/rigs/dummy/flrig.c @@ -138,7 +138,7 @@ const struct rig_caps flrig_caps = RIG_MODEL(RIG_MODEL_FLRIG), .model_name = "FLRig", .mfg_name = "FLRig", - .version = "20221109.0", + .version = "20230703.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -996,12 +996,12 @@ static int flrig_open(RIG *rig) else if (streq(p, "LSB-D2")) { modeMapAdd(&modes, RIG_MODE_PKTLSB, p); } else if (streq(p, "LSB-D3")) { modeMapAdd(&modes, RIG_MODE_PKTLSB, p); } else if (streq(p, "NFM")) { modeMapAdd(&modes, RIG_MODE_FMN, p); } - else if (streq(p, "PKT")) { modeMapAdd(&modes, RIG_MODE_RTTY, p); } + else if (streq(p, "PKT")) { modeMapAdd(&modes, RIG_MODE_PKTUSB, p); } else if (streq(p, "PKT-FM")) { modeMapAdd(&modes, RIG_MODE_PKTFM, p); } - else if (streq(p, "PKT-L")) { modeMapAdd(&modes, RIG_MODE_RTTYR, p); } - else if (streq(p, "PKT-U")) { modeMapAdd(&modes, RIG_MODE_RTTY, p); } - else if (streq(p, "PKT(L)")) { modeMapAdd(&modes, RIG_MODE_RTTYR, p); } - else if (streq(p, "PKT(U)")) { modeMapAdd(&modes, RIG_MODE_RTTY, p); } + else if (streq(p, "PKT-L")) { modeMapAdd(&modes, RIG_MODE_PKTLSB, p); } + else if (streq(p, "PKT-U")) { modeMapAdd(&modes, RIG_MODE_PKTUSB, p); } + else if (streq(p, "PKT(L)")) { modeMapAdd(&modes, RIG_MODE_PKTLSB, p); } + else if (streq(p, "PKT(U)")) { modeMapAdd(&modes, RIG_MODE_PKTUSB, p); } else if (streq(p, "PSK")) { modeMapAdd(&modes, RIG_MODE_RTTY, p); } else if (streq(p, "PSK-L")) { modeMapAdd(&modes, RIG_MODE_RTTYR, p); } else if (streq(p, "PSK-R")) { modeMapAdd(&modes, RIG_MODE_RTTYR, p); } commit ad1e63efa1e64e83cd9bb1c10bfc0b45f7e308bb Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Jul 2 17:50:38 2023 -0500 Fix FT-991 Fake It failing to retrun to receive frequency Yaesu rigs will no return from set_ptt until TX0 is achieved Restrict 300ms wait just to FTDX3000 due to antenna switching This speeds up set_ptt off for other Yaeus rigs https://github.com/Hamlib/Hamlib/issues/1326 diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index eb30eb57f..9b8de873d 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -1943,6 +1943,7 @@ int newcat_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) if (rig->state.current_mode != RIG_MODE_CW && rig->state.current_mode != RIG_MODE_CWR && rig->state.current_mode != RIG_MODE_CWN + && (is_ftdx3000 || is_ftdx3000dm) ) { // DX3000 with seperate rx/tx antennas was failing frequency change @@ -10908,6 +10909,7 @@ int newcat_set_cmd_validate(RIG *rig) { int bytes; char cmd[256]; // big enough + repeat: rig_flush(&state->rigport); /* discard any unsolicited data */ SNPRINTF(cmd, sizeof(cmd), "%s", priv->cmd_str); rc = write_block(&state->rigport, (unsigned char *) cmd, strlen(cmd)); @@ -10942,6 +10944,7 @@ int newcat_set_cmd_validate(RIG *rig) if (strncmp(priv->cmd_str, "TX", 2) == 0 && strncmp(priv->ret_data, "TX", 2) == 0) { + if (strstr(priv->ret_data,"TX2")) goto repeat; // TX command does not echo what's sent so we just check the basic command RETURNFUNC(RIG_OK); } diff --git a/rigs/yaesu/newcat.h b/rigs/yaesu/newcat.h index c943de044..23cc3083d 100644 --- a/rigs/yaesu/newcat.h +++ b/rigs/yaesu/newcat.h @@ -50,7 +50,7 @@ typedef char ncboolean; /* shared function version */ -#define NEWCAT_VER "20230531" +#define NEWCAT_VER "20230702" /* Hopefully large enough for future use, 128 chars plus '\0' */ #define NEWCAT_DATA_LEN 129 commit 58e5e260a51fc45f88ccc5a2d5551e5fd89e203d Merge: 858f2b66c 44fa32c8c Author: Michael Black <mdb...@ya...> Date: Sun Jul 2 17:28:52 2023 -0500 Merge pull request #1324 from koarlchen/rigctld-get-powerstat-separator-character Fix 'get_powerstat' command provided by rigctld regarding extended response protocol commit 858f2b66c3f5e2ad8845a8b76b1bd3008283a132 Merge: 7a713634e 4dfe98b0f Author: Michael Black <mdb...@ya...> Date: Sun Jul 2 17:28:18 2023 -0500 Merge pull request #1315 from j-gallardo/j-gallardo-patch-1 Update password.c commit 44fa32c8cd8be026f9fa43a469247c9383220009 Author: max <ma...@ka...> Date: Thu Jun 29 16:20:00 2023 +0200 Fix 'get_powerstat' command provided by rigctld by taking care of the given separator according to the extended response protocol diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index c076a8ac5..23e25d566 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -4796,7 +4796,7 @@ declare_proto_rig(get_powerstat) fprintf(fout, "%s: ", cmd->arg1); } - fprintf(fout, "%d\n", stat); + fprintf(fout, "%d%c", stat, resp_sep); rig_powerstat = stat; // update our global so others can see powerstat RETURNFUNC2(status); commit 7a713634e37f2eca1ec05a74cae8022b5d88c8c7 Merge: 4c02a70ea 0f706dfaa Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Jun 29 09:19:00 2023 -0500 Merge branch 'master' of https://github.com/Hamlib/Hamlib commit 4c02a70ea3bcea5b68aa765a837aed04eee579a3 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Jun 29 09:17:46 2023 -0500 Fix IC-76XX rig_mW2power -- fixed any such rig https://github.com/Hamlib/Hamlib/issues/1323 diff --git a/src/rig.c b/src/rig.c index e70bbda9b..7bc854191 100644 --- a/src/rig.c +++ b/src/rig.c @@ -6115,6 +6115,7 @@ int HAMLIB_API rig_mW2power(RIG *rig, rmode_t mode) { const freq_range_t *txrange; + int limited = 0; if (!rig || !rig->caps || !power || mwpower == 0) { @@ -6142,14 +6143,20 @@ int HAMLIB_API rig_mW2power(RIG *rig, RETURNFUNC2(RIG_OK); } - *power = (float)mwpower / txrange->high_power; + *power = (float)mwpower / (float) txrange->high_power; if (*power > 1.0) { *power = 1.0; + limited = 1; + } + else if (*power < 0.0) + { + *power = 0; + limited = 1; } - RETURNFUNC2(mwpower > txrange->high_power ? RIG_OK : -RIG_ETRUNC); + RETURNFUNC2(limited ? RIG_ETRUNC : RIG_OK); } commit 0f706dfaae539e5bde62848ee20f5f6b1e4cf7f9 Merge: 25ad13cea 16b83b76b Author: Michael Black <mdb...@ya...> Date: Thu Jun 29 07:35:13 2023 -0500 Merge pull request #1322 from koarlchen/man-rigctld-typo-section-command Fix minor typo in man page for rigctld commit 16b83b76b37503d81903fee6be2b237f6d78921a Author: max <ma...@ka...> Date: Thu Jun 29 13:34:14 2023 +0200 Fix minor typo (missing u character) diff --git a/doc/man1/rigctld.1 b/doc/man1/rigctld.1 index af3b6b4e0..9680b7fc7 100644 --- a/doc/man1/rigctld.1 +++ b/doc/man1/rigctld.1 @@ -436,7 +436,7 @@ Since most of the .B Hamlib operations have a .BR set " and a " get -method, a single pper case letter will be used for +method, a single upper case letter will be used for .B set methods whereas the corresponding single lower case letter refers to the .B get commit 25ad13cea9ffe4f853a5a4070399b80e7adef778 Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Jun 28 12:48:30 2023 -0500 Add BG2FX FC4/C/CR/L diff --git a/NEWS b/NEWS index b99dc6bb4..a0114ed9c 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,8 @@ Version 5.x -- future * Change FT1000MP Mark V model names to align with FT1000MP Version 4.6 + * Added BG2FX FX4/C/CR/L + * Fixed IC7610 to use new 0x25 0x26 command added in latest firmware * Fix W command in rigctld to work propery -- can take terminating char or # of bytes to expect * Add rig_set_debug_filename so Python can redirect debug stream * Fix Yaesu LBL_NR to use proper values diff --git a/include/hamlib/riglist.h b/include/hamlib/riglist.h index f231f38b8..b186f2308 100644 --- a/include/hamlib/riglist.h +++ b/include/hamlib/riglist.h @@ -198,6 +198,7 @@ #define RIG_MODEL_LAB599_TX500 RIG_MAKE_MODEL(RIG_KENWOOD,50) #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) /* * Icom diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index f03f526aa..649a7fee8 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -6105,6 +6105,7 @@ DECLARE_INITRIG_BACKEND(kenwood) rig_register(&tx500_caps); rig_register(&sdruno_caps); rig_register(&qrplabs_caps); + rig_register(&fx4_caps); return (RIG_OK); } diff --git a/rigs/kenwood/kenwood.h b/rigs/kenwood/kenwood.h index 836720667..c12a850f3 100644 --- a/rigs/kenwood/kenwood.h +++ b/rigs/kenwood/kenwood.h @@ -318,6 +318,7 @@ extern const struct rig_caps malachite_caps; extern const struct rig_caps tx500_caps; extern const struct rig_caps sdruno_caps; extern const struct rig_caps qrplabs_caps; +extern const struct rig_caps fx4_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, diff --git a/rigs/kenwood/ts590.c b/rigs/kenwood/ts590.c index 6902e34a6..b385da864 100644 --- a/rigs/kenwood/ts590.c +++ b/rigs/kenwood/ts590.c @@ -29,9 +29,13 @@ #include "cal.h" #include "iofunc.h" +#define FX4_ALL_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_SSB|RIG_MODE_FM|RIG_MODE_PKTUSB|RIG_MODE_PKTLSB) #define TS590_ALL_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_FM|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_PKTFM|RIG_MODE_PKTUSB|RIG_MODE_PKTLSB|RIG_MODE_PKTAM) +#define FX4_OTHER_TX_MODES (RIG_MODE_CW|RIG_MODE_SSB|RIG_MODE_FM) #define TS590_OTHER_TX_MODES (RIG_MODE_CW|RIG_MODE_SSB|RIG_MODE_FM|RIG_MODE_RTTY) +#define FX4_AM_TX_MODES (RIG_MODE_AM) #define TS590_AM_TX_MODES (RIG_MODE_AM|RIG_MODE_PKTAM) +#define FX4_VFO (RIG_VFO_A|RIG_VFO_B) #define TS590_VFO (RIG_VFO_A|RIG_VFO_B|RIG_VFO_MEM) #define TS590_LEVEL_GET (RIG_LEVEL_RFPOWER|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_SQL|RIG_LEVEL_AGC|RIG_LEVEL_MICGAIN|RIG_LEVEL_STRENGTH|RIG_LEVEL_KEYSPD|RIG_LEVEL_CWPITCH| \ @@ -49,6 +53,7 @@ #define TS590_SCAN_OPS (RIG_SCAN_VFO) +#define FX4_ANTS (RIG_ANT_1) #define TS590_ANTS (RIG_ANT_1|RIG_ANT_2) #define TS590_CHANNEL_CAPS { \ @@ -1734,6 +1739,200 @@ const struct rig_caps ts590_caps = .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS }; +/** + * BG2FX FX-4C/FX-4CR rig capabilities + * Supposed to be 590S compatible + * Separate entry allows for customization + */ +const struct rig_caps fx4_caps = +{ + RIG_MODEL(RIG_MODEL_FX4), + .model_name = "FX4/C/CR/L", + .mfg_name = "BG2FX", + .version = BACKEND_VER ".7", + .copyright = "LGPL", + .status = RIG_STATUS_STABLE, + .rig_type = RIG_TYPE_TRANSCEIVER, + .ptt_type = RIG_PTT_RIG_MICDATA, + .dcd_type = RIG_DCD_RIG, + .port_type = RIG_PORT_SERIAL, + .serial_rate_min = 115200, + .serial_rate_max = 115200, + .serial_data_bits = 8, + .serial_stop_bits = 1, + .serial_parity = RIG_PARITY_NONE, + .serial_handshake = RIG_HANDSHAKE_HARDWARE, + .write_delay = 0, + .post_write_delay = 0, + .timeout = 500, + .retry = 3, + .preamp = {12, RIG_DBLST_END,}, + .attenuator = {12, RIG_DBLST_END,}, + .max_rit = kHz(9.99), + .max_xit = kHz(9.99), + .max_ifshift = Hz(0), + .targetable_vfo = RIG_TARGETABLE_FREQ | RIG_TARGETABLE_MODE, + .transceive = RIG_TRN_RIG, + .agc_level_count = 6, + .agc_levels = { RIG_AGC_OFF, RIG_AGC_SLOW, RIG_AGC_MEDIUM, RIG_AGC_FAST, RIG_AGC_SUPERFAST, RIG_AGC_ON }, + + .chan_list = { /* TBC */ + { 0, 89, RIG_MTYPE_MEM, TS590_CHANNEL_CAPS }, + { 90, 99, RIG_MTYPE_EDGE, TS590_CHANNEL_CAPS }, + RIG_CHAN_END, + }, + + .rx_range_list1 = { + {kHz(30), Hz(59999999), FX4_ALL_MODES, -1, -1, FX4_VFO, FX4_ANTS}, + RIG_FRNG_END, + }, /*!< Receive frequency range list for ITU region 1 */ + .tx_range_list1 = { + {kHz(3500), kHz(3800), FX4_OTHER_TX_MODES, 5000, 100000, FX4_VFO, FX4_ANTS}, + {kHz(3500), kHz(3800), FX4_AM_TX_MODES, 5000, 25000, FX4_VFO, FX4_ANTS}, + {MHz(7), kHz(7200), FX4_OTHER_TX_MODES, 5000, 100000, FX4_VFO, FX4_ANTS}, + {MHz(7), kHz(7200), FX4_AM_TX_MODES, 5000, 25000, FX4_VFO, FX4_ANTS}, + {kHz(10100), kHz(10150), FX4_OTHER_TX_MODES, 5000, 100000, FX4_VFO, FX4_ANTS}, + {kHz(10100), kHz(10150), FX4_AM_TX_MODES, 5000, 25000, FX4_VFO, FX4_ANTS}, + {MHz(14), kHz(14350), FX4_OTHER_TX_MODES, 5000, 100000, FX4_VFO, FX4_ANTS}, + {MHz(14), kHz(14350), FX4_AM_TX_MODES, 5000, 25000, FX4_VFO, FX4_ANTS}, + {kHz(18068), kHz(18168), FX4_OTHER_TX_MODES, 5000, 100000, FX4_VFO, FX4_ANTS}, + {kHz(18068), kHz(18168), FX4_AM_TX_MODES, 5000, 25000, FX4_VFO, FX4_ANTS}, + {MHz(21), kHz(21450), FX4_OTHER_TX_MODES, 5000, 100000, FX4_VFO, FX4_ANTS}, + {MHz(21), kHz(21450), FX4_AM_TX_MODES, 5000, 25000, FX4_VFO, FX4_ANTS}, + {kHz(24890), kHz(24990), FX4_OTHER_TX_MODES, 5000, 100000, FX4_VFO, FX4_ANTS}, + {kHz(24890), kHz(24990), FX4_AM_TX_MODES, 5000, 25000, FX4_VFO, FX4_ANTS}, + {MHz(28), kHz(29700), FX4_OTHER_TX_MODES, 5000, 100000, FX4_VFO, FX4_ANTS}, + {MHz(28), kHz(29700), FX4_AM_TX_MODES, 5000, 25000, FX4_VFO, FX4_ANTS}, + {MHz(50), kHz(52000), FX4_OTHER_TX_MODES, 5000, 100000, FX4_VFO, FX4_ANTS}, + {MHz(50), kHz(52000), FX4_AM_TX_MODES, 5000, 25000, FX4_VFO, FX4_ANTS}, + RIG_FRNG_END, + }, /*!< Transmit frequency range list for ITU region 1 */ + .rx_range_list2 = { + {kHz(30), Hz(59999999), FX4_ALL_MODES, -1, -1, FX4_VFO, FX4_ANTS}, + RIG_FRNG_END, + }, /*!< Receive frequency range list for ITU region 2 */ + .tx_range_list2 = { + {kHz(3500), MHz(4) - 1, FX4_OTHER_TX_MODES, 5000, 100000, FX4_VFO, FX4_ANTS}, + {kHz(3500), MHz(4) - 1, FX4_AM_TX_MODES, 5000, 25000, FX4_VFO, FX4_ANTS}, + {kHz(5250), kHz(5450), FX4_OTHER_TX_MODES, 5000, 100000, FX4_VFO, FX4_ANTS}, + {kHz(5250), kHz(5450), FX4_AM_TX_MODES, 5000, 25000, FX4_VFO, FX4_ANTS}, + {MHz(7), kHz(7300), FX4_OTHER_TX_MODES, 5000, 100000, FX4_VFO, FX4_ANTS}, + {MHz(7), kHz(7300), FX4_AM_TX_MODES, 5000, 25000, FX4_VFO, FX4_ANTS}, + {kHz(10100), kHz(10150), FX4_OTHER_TX_MODES, 5000, 100000, FX4_VFO, FX4_ANTS}, + {kHz(10100), kHz(10150), FX4_AM_TX_MODES, 5000, 25000, FX4_VFO, FX4_ANTS}, + {MHz(14), kHz(14350), FX4_OTHER_TX_MODES, 5000, 100000, FX4_VFO, FX4_ANTS}, + {MHz(14), kHz(14350), FX4_AM_TX_MODES, 5000, 25000, FX4_VFO, FX4_ANTS}, + {kHz(18068), kHz(18168), FX4_OTHER_TX_MODES, 5000, 100000, FX4_VFO, FX4_ANTS}, + {kHz(18068), kHz(18168), FX4_AM_TX_MODES, 5000, 25000, FX4_VFO, FX4_ANTS}, + {MHz(21), kHz(21450), FX4_OTHER_TX_MODES, 5000, 100000, FX4_VFO, FX4_ANTS}, + {MHz(21), kHz(21450), FX4_AM_TX_MODES, 5000, 25000, FX4_VFO, FX4_ANTS}, + {kHz(24890), kHz(24990), FX4_OTHER_TX_MODES, 5000, 100000, FX4_VFO, FX4_ANTS}, + {kHz(24890), kHz(24990), FX4_AM_TX_MODES, 5000, 25000, FX4_VFO, FX4_ANTS}, + {MHz(28), kHz(29700), FX4_OTHER_TX_MODES, 5000, 100000, FX4_VFO, FX4_ANTS}, + {MHz(28), kHz(29700), FX4_AM_TX_MODES, 5000, 25000, FX4_VFO, FX4_ANTS}, + {MHz(50), kHz(52000), FX4_OTHER_TX_MODES, 5000, 100000, FX4_VFO, FX4_ANTS}, + {MHz(50), kHz(52000), FX4_AM_TX_MODES, 5000, 25000, FX4_VFO, FX4_ANTS}, + RIG_FRNG_END, + }, /*!< Transmit frequency range list for ITU region 2 */ + .tuning_steps = { + {TS590_ALL_MODES, kHz(1)}, + {TS590_ALL_MODES, Hz(2500)}, + {TS590_ALL_MODES, kHz(5)}, + {TS590_ALL_MODES, Hz(6250)}, + {TS590_ALL_MODES, kHz(10)}, + {TS590_ALL_MODES, Hz(12500)}, + {TS590_ALL_MODES, kHz(15)}, + {TS590_ALL_MODES, kHz(20)}, + {TS590_ALL_MODES, kHz(25)}, + {TS590_ALL_MODES, kHz(30)}, + {TS590_ALL_MODES, kHz(100)}, + {TS590_ALL_MODES, kHz(500)}, + {TS590_ALL_MODES, MHz(1)}, + {TS590_ALL_MODES, 0}, /* any tuning step */ + RIG_TS_END, + }, + /* mode/filter list, remember: order matters! */ + .filters = { + {RIG_MODE_SSB, kHz(2.2)}, + {RIG_MODE_CW | RIG_MODE_CWR, Hz(500)}, + {RIG_MODE_AM, kHz(6)}, + {RIG_MODE_FM, kHz(12)}, + RIG_FLT_END, + }, + .level_gran = + { +#include "level_gran_kenwood.h" + [LVL_RF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 100.0f } }, + [LVL_AF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f / 100.0f } }, + [LVL_VOXDELAY] = { .min = { .i = 0 }, .max = { .i = 30 }, .step = { .i = 1 } }, + [LVL_CWPITCH] = {.min = {.i = 300}, .max = {.i = 1000}, .step = {.i = 50}}, + [LVL_BKIN_DLYMS] = {.min = {.i = 0}, .max = {.i = 1000}, .step = {.i = 50}}, + [LVL_SLOPE_LOW] = {.min = {.i = 0}, .max = {.i = 2400}, .step = {.i = 10}}, + [LVL_SLOPE_HIGH] = {.min = {.i = 0}, .max = {.i = 5000}, .step = {.i = 10}}, + }, + + .str_cal = TS590_STR_CAL, + .swr_cal = TS590_SWR_CAL, + + .ext_tokens = ts590_ext_tokens, + .extfuncs = ts590_ext_funcs, + .extlevels = ts590_ext_levels, + + .priv = (void *)& ts590_priv_caps, + .rig_init = kenwood_init, + .rig_cleanup = kenwood_cleanup, + .rig_open = kenwood_open, + .rig_close = kenwood_close, + .set_freq = kenwood_set_freq, + .get_freq = kenwood_get_freq, + .set_rit = ts590_set_rit, + .get_rit = ts590_get_rit, + .set_xit = ts590_set_rit, + .get_xit = ts590_get_rit, + .set_mode = ts590_set_mode, + .get_mode = ts590_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 = kenwood_get_ptt, + .set_ptt = kenwood_set_ptt, + .get_dcd = kenwood_get_dcd, + .set_powerstat = kenwood_set_powerstat, + .get_powerstat = kenwood_get_powerstat, + .get_info = ts590_get_info, + .reset = kenwood_reset, + .set_ant = kenwood_set_ant, + .get_ant = kenwood_get_ant, + .scan_ops = TS590_SCAN_OPS, + .scan = kenwood_scan, /* not working, invalid arguments using rigctl; kenwood_scan does only support on/off and not tone and CTCSS scan */ + .has_set_level = TS590_LEVEL_SET, + .has_get_level = TS590_LEVEL_GET, + .set_level = ts590_set_level, + .get_level = ts590_get_level, + .set_ext_level = ts590_set_ext_level, + .get_ext_level = ts590_get_ext_level, + .has_get_func = TS590_FUNC_ALL, + .has_set_func = TS590_FUNC_ALL, + .set_func = ts590_set_func, + .get_func = ts590_get_func, + .set_ext_func = ts590_set_ext_func, + .get_ext_func = ts590_get_ext_func, + .set_ctcss_tone = kenwood_set_ctcss_tone, + .get_ctcss_tone = kenwood_get_ctcss_tone, + .ctcss_list = kenwood38_ctcss_list, + .set_trn = kenwood_set_trn, + .get_trn = kenwood_get_trn, + .send_morse = kenwood_send_morse, + .stop_morse = kenwood_stop_morse, + .wait_morse = rig_wait_morse, + .set_mem = kenwood_set_mem, + .get_mem = kenwood_get_mem, + .vfo_ops = TS590_VFO_OPS, + .vfo_op = kenwood_vfo_op, + .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS +}; + /** * TS-590SG rig capabilities */ commit 4171598eafa5c028010b3191ff6659ff66847783 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Jun 27 22:58:56 2023 -0500 Initialize rig->state.targetable_vfo diff --git a/src/rig.c b/src/rig.c index 22d08d825..e70bbda9b 100644 --- a/src/rig.c +++ b/src/rig.c @@ -658,6 +658,7 @@ RIG *HAMLIB_API rig_init(rig_model_t rig_model) rs->lo_freq = 0; rs->cache.timeout_ms = 500; // 500ms cache timeout by default rs->cache.ptt = 0; + rs->targetable_vfo = rig->caps->targetable_vfo; // We are using range_list1 as the default // Eventually we will have separate model number for different rig variations @@ -1385,7 +1386,7 @@ int HAMLIB_API rig_open(RIG *rig) { // for non-Icom rigs if there's no set_vfo then we need to set one rs->current_vfo = vfo_fixup(rig, RIG_VFO_A, rig->state.cache.split); - rig_debug(RIG_DEBUG_TRACE, "%s: No set_vfo function rig so default vfo = %s\n", + rig_debug(RIG_DEBUG_TRACE, "%s: No set_vfo function rig so default vfo=%s\n", __func__, rig_strvfo(rs->current_vfo)); } else commit f3cab55c4f8782761ceb9674c948a9a254050dc5 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Jun 27 14:28:37 2023 -0500 Change set_mode_x26 to do correct VFO for 7600/7610 https://github.com/Hamlib/Hamlib/issues/1319 diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index 40b1a5f67..4b9a691b5 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -2174,6 +2174,11 @@ static int icom_set_mode_x26(RIG *rig, vfo_t vfo, rmode_t mode, int datamode, { subcmd2 = 0x01; // get unselected VFO } + if (RIG_IS_IC7600 || RIG_IS_IC7610) + { // the 7600/7610 do it different 0=Main, 1=Sub -- maybe other Icoms will start doing this too + subcmd2 = 0; + if (vfo & RIG_VFO_B || vfo & RIG_VFO_SUB) subcmd2 = 1; + } buf[0] = mode; buf[1] = datamode; commit a3ac6e0be312486628cb97199fa5e7eaa1e63954 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Jun 27 11:24:27 2023 -0500 Change to using RIG_IS macros Fix segfault on non 76XX rigs https://github.com/Hamlib/Hamlib/issues/1319 diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index 9142a48bf..40b1a5f67 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -689,30 +689,30 @@ int icom_init(RIG *rig) // we can add rigs here that will never use the 0x25 cmd // some like the 751 don't even reject the command and have to time out if ( - rig->caps->rig_model == RIG_MODEL_IC275 - || rig->caps->rig_model == RIG_MODEL_IC375 - || rig->caps->rig_model == RIG_MODEL_IC706 - || rig->caps->rig_model == RIG_MODEL_IC706MKII - || rig->caps->rig_model == RIG_MODEL_IC706MKIIG - || rig->caps->rig_model == RIG_MODEL_IC751 - || rig->caps->rig_model == RIG_MODEL_X5105 - || rig->caps->rig_model == RIG_MODEL_IC1275 - || rig->caps->rig_model == RIG_MODEL_IC746 - || rig->caps->rig_model == RIG_MODEL_IC756 - || rig->caps->rig_model == RIG_MODEL_IC756PRO - || rig->caps->rig_model == RIG_MODEL_IC756PROII - || rig->caps->rig_model == RIG_MODEL_IC756PROIII - || rig->caps->rig_model == RIG_MODEL_IC746PRO - || rig->caps->rig_model == RIG_MODEL_IC756 - || rig->caps->rig_model == RIG_MODEL_IC7000 - || rig->caps->rig_model == RIG_MODEL_IC7100 - || rig->caps->rig_model == RIG_MODEL_IC7200 - || rig->caps->rig_model == RIG_MODEL_IC7700 - || rig->caps->rig_model == RIG_MODEL_IC821H - || rig->caps->rig_model == RIG_MODEL_IC910 - || rig->caps->rig_model == RIG_MODEL_IC2730 - || rig->caps->rig_model == RIG_MODEL_ID5100 - || rig->caps->rig_model == RIG_MODEL_IC9100 + RIG_IS_IC275 + || RIG_IS_IC375 + || RIG_IS_IC706 + || RIG_IS_IC706MKII + || RIG_IS_IC706MKIIG + || RIG_IS_IC751 + || RIG_IS_X5105 + || RIG_IS_IC1275 + || RIG_IS_IC746 + || RIG_IS_IC756 + || RIG_IS_IC756PRO + || RIG_IS_IC756PROII + || RIG_IS_IC756PROIII + || RIG_IS_IC746PRO + || RIG_IS_IC756 + || RIG_IS_IC7000 + || RIG_IS_IC7100 + || RIG_IS_IC7200 + || RIG_IS_IC7700 + || RIG_IS_IC821H + || RIG_IS_IC910 + || RIG_IS_IC2730 + || RIG_IS_ID5100 + || RIG_IS_IC9100 ) { priv->x25cmdfails = 1; @@ -961,13 +961,13 @@ static vfo_t icom_current_vfo(RIG *rig) // some rigs like IC9700 cannot do 0x25 0x26 command in satmode static void icom_satmode_fix(RIG *rig, int satmode) { - if (rig->caps->rig_model == RIG_MODEL_IC9700) + if (RIG_IS_IC9700) { rig_debug(RIG_DEBUG_VERBOSE, "%s: toggling IC9700 targetable for satmode=%d\n", __func__, satmode); - if (satmode) { rig->caps->targetable_vfo = 0; } - else { rig->caps->targetable_vfo = RIG_TARGETABLE_FREQ | RIG_TARGETABLE_MODE; } + if (satmode) { rig->caps->targetable_vfo = rig->state.targetable_vfo = 0; } + else { rig->caps->targetable_vfo = rig->state.targetable_vfo = RIG_TARGETABLE_FREQ | RIG_TARGETABLE_MODE; } } } @@ -1342,7 +1342,7 @@ int icom_set_freq(RIG *rig, vfo_t vfo, freq_t freq) freq_len = priv->civ_731_mode ? 4 : 5; - if (rig->caps->rig_model == RIG_MODEL_IC905) { freq /= 10; freq_len = 6; } + if (RIG_IS_IC905) { freq /= 10; freq_len = 6; } /* * to_bcd requires nibble len @@ -1373,8 +1373,8 @@ int icom_set_freq(RIG *rig, vfo_t vfo, freq_t freq) HAMLIB_TRACE; subcmd = 0x01; // get unselected VFO } - if (rig->state.rig_model == RIG_MODEL_IC7600) - { // the 7600 does it different 0=Main, 1=Sub -- maybe other Icoms will start doing this too + if (RIG_IS_IC7600) + { // the 7600/7610 do it different 0=Main, 1=Sub -- maybe other Icoms will start doing this too subcmd = 0; if (vfo & RIG_VFO_B || vfo & RIG_VFO_SUB) subcmd = 1; } @@ -1535,7 +1535,7 @@ int icom_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) subcmd = -1; if (vfo == RIG_VFO_MEM && (priv->civ_731_mode - || rig->caps->rig_model == RIG_MODEL_IC706)) + || RIG_IS_IC706)) { rig_debug(RIG_DEBUG_TRACE, "%s: VFO=MEM so turning off civ_731\n", __func__); civ_731_mode = 1; @@ -1666,10 +1666,10 @@ 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->caps->targetable_vfo = rig->state.targetable_vfo |= RIG_TARGETABLE_FREQ | RIG_TARGETABLE_MODE; rig_debug(RIG_DEBUG_VERBOSE, "%s: TARGETABLE_FREQ and TARGETABLE_MODE enabled\n", __func__); - if (rig->state.rig_model == RIG_MODEL_IC7600) - { // the 7600 does it different 0=Main, 1=Sub -- maybe other Icoms will start doing this too + if (RIG_IS_IC7600 || RIG_IS_IC7610) + { // 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; } @@ -1780,7 +1780,7 @@ int icom_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) if (freq_len == 3) { *freq *= 10000; } // 3-byte freq for ID5100 is in 10000Hz units so convert to Hz -if (rig->caps->rig_model == RIG_MODEL_IC905) { *freq *= 10; } +if (RIG_IS_IC905) { *freq *= 10; } if (vfo == RIG_VFO_MEM && civ_731_mode) { priv->civ_731_mode = 1; } @@ -2208,19 +2208,19 @@ int icom_set_mode_with_data(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t twidth; //struct icom_priv_data *priv = (struct icom_priv_data *) rig->state.priv; unsigned char dm_sub_cmd = - rig->caps->rig_model == RIG_MODEL_IC7200 ? 0x04 : S_MEM_DATA_MODE; - int filter_byte = rig->caps->rig_model == RIG_MODEL_IC7100 - || rig->caps->rig_model == RIG_MODEL_IC7200 - || rig->caps->rig_model == RIG_MODEL_IC7300 - || rig->caps->rig_model == RIG_MODEL_IC7600 - || rig->caps->rig_model == RIG_MODEL_IC7610 - || rig->caps->rig_model == RIG_MODEL_IC7700 - || rig->caps->rig_model == RIG_MODEL_IC7800 - || rig->caps->rig_model == RIG_MODEL_IC785x - || rig->caps->rig_model == RIG_MODEL_IC9100 - || rig->caps->rig_model == RIG_MODEL_IC9700 - || rig->caps->rig_model == RIG_MODEL_IC705 - || rig->caps->rig_model == RIG_MODEL_X6100; + RIG_IS_IC7200 ? 0x04 : S_MEM_DATA_MODE; + int filter_byte = RIG_IS_IC7100 + || RIG_IS_IC7200 + || RIG_IS_IC7300 + || RIG_IS_IC7600 + || RIG_IS_IC7610 + || RIG_IS_IC7700 + || RIG_IS_IC7800 + || RIG_IS_IC785X + || RIG_IS_IC9100 + || RIG_IS_IC9700 + || RIG_IS_IC705 + || RIG_IS_X6100; ENTERFUNC; @@ -2417,12 +2417,12 @@ int icom_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) /* IC-375, IC-731, IC-726, IC-735, IC-910, IC-7000 don't support passband data */ /* IC-726 & IC-475A/E also limited support - only on CW */ /* TODO: G4WJS CW wide/narrow are possible with above two radios */ - if (priv->civ_731_mode || rig->caps->rig_model == RIG_MODEL_OS456 - || rig->caps->rig_model == RIG_MODEL_IC375 - || rig->caps->rig_model == RIG_MODEL_IC726 - || rig->caps->rig_model == RIG_MODEL_IC475 - || rig->caps->rig_model == RIG_MODEL_IC910 - || rig->caps->rig_model == RIG_MODEL_IC7000) + if (priv->civ_731_mode || RIG_IS_OS456 + || RIG_IS_IC375 + || RIG_IS_IC726 + || RIG_IS_IC475 + || RIG_IS_IC910 + || RIG_IS_IC7000) { icmode_ext = -1; } @@ -2711,13 +2711,13 @@ int icom_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) /* Likewise, don't ask if we happen to be an Omni VI Plus */ /* Likewise, don't ask if we happen to be an IC-R30 */ /* Likewise, don't ask if we happen to be an IC-706* */ - if ((rig->caps->rig_model == RIG_MODEL_IC910) || - (rig->caps->rig_model == RIG_MODEL_OMNIVIP) || - (rig->caps->rig_model == RIG_MODEL_IC706) || - (rig->caps->rig_model == RIG_MODEL_IC706MKII) || - (rig->caps->rig_model == RIG_MODEL_IC706MKIIG) || - (rig->caps->rig_model == RIG_MODEL_IC756) || - (rig->caps->rig_model == RIG_MODEL_ICR30)) + if ((RIG_IS_IC910) || + (RIG_IS_OMNIVIP) || + (RIG_IS_IC706) || + (RIG_IS_IC706MKII) || + (RIG_IS_IC706MKIIG) || + (RIG_IS_IC756) || + (RIG_IS_ICR30)) { RETURNFUNC2(RIG_OK); } @@ -2879,7 +2879,7 @@ int icom_set_vfo(RIG *rig, vfo_t vfo) if (rig->state.cache.split == RIG_SPLIT_ON && !rig->state.cache.satmode) { vfo = RIG_VFO_A; } // Seems the IC821H reverses Main/Sub when in satmode - if (rig->caps->rig_model == RIG_MODEL_IC821H && rig->state.cache.satmode) { vfo = RIG_VFO_SUB; } + if (RIG_IS_IC821H && rig->state.cache.satmode) { vfo = RIG_VFO_SUB; } } else if ((vfo == RIG_VFO_B || vfo == RIG_VFO_SUB) && VFO_HAS_DUAL) { @@ -2896,7 +2896,7 @@ int icom_set_vfo(RIG *rig, vfo_t vfo) else if (rig->state.cache.split == RIG_SPLIT_ON) { vfo = RIG_VFO_B; } // Seems the IC821H reverses Main/Sub when in satmode - if (rig->caps->rig_model == RIG_MODEL_IC821H && rig->state.cache.satmode) { vfo = RIG_VFO_MAIN; } + if (RIG_IS_IC821H && rig->state.cache.satmode) { vfo = RIG_VFO_MAIN; } } else if ((vfo == RIG_VFO_A || vfo == RIG_VFO_B) && !VFO_HAS_A_B && VFO_HAS_MAIN_SUB) @@ -3362,7 +3362,7 @@ int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) } /* convert values to 0 .. 255 range */ - if (rig->caps->rig_model == RIG_MODEL_ICR75) + if (RIG_IS_ICR75) { switch (level) { @@ -3514,7 +3514,7 @@ int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) lvl_sc = S_LVL_CWPITCH; /* use 'set mode' call for CWPITCH on IC-R75 */ - if (rig->caps->rig_model == RIG_MODEL_ICR75) + if (RIG_IS_ICR75) { lvl_cn = C_CTL_MEM; lvl_sc = S_MEM_MODE_SLCT; @@ -3644,7 +3644,7 @@ int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) break; case RIG_LEVEL_VOXGAIN: - if (rig->caps->rig_model == RIG_MODEL_IC910) + if (RIG_IS_IC910) { /* IC-910H */ lvl_cn = C_CTL_MEM; @@ -3659,7 +3659,7 @@ int icom_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) break; case RIG_LEVEL_ANTIVOX: - if (rig->caps->rig_model == RIG_MODEL_IC910) + if (RIG_IS_IC910) { /* IC-910H */ lvl_cn = C_CTL_MEM; @@ -4021,7 +4021,7 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) lvl_sc = S_LVL_CWPITCH; /* use 'set mode' call for CWPITCH on IC-R75 */ - if (rig->caps->rig_model == RIG_MODEL_ICR75) + if (RIG_IS_ICR75) { lvl_cn = C_CTL_MEM; lvl_sc = S_MEM_MODE_SLCT; @@ -4072,7 +4072,7 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) break; case RIG_LEVEL_VOXGAIN: /* IC-910H */ - if (rig->caps->rig_model == RIG_MODEL_IC910) + if (RIG_IS_IC910) { /* IC-910H */ lvl_cn = C_CTL_MEM; @@ -4087,7 +4087,7 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) break; case RIG_LEVEL_ANTIVOX: - if (rig->caps->rig_model == RIG_MODEL_IC910) + if (RIG_IS_IC910) { /* IC-910H */ lvl_cn = C_CTL_MEM; @@ -4519,7 +4519,7 @@ int icom_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) } /* convert values from 0 .. 255 range */ - if (rig->caps->rig_model == RIG_MODEL_ICR75) + if (RIG_IS_ICR75) { switch (level) { @@ -5571,7 +5571,7 @@ int icom_set_split_freq(RIG *rig, vfo_t vfo, freq_t tx_freq) // we can add rigs we know will never have 0x25 here to skip this check if ((satmode == 0) - && !(rig->caps->rig_model == RIG_MODEL_IC751) + && !(RIG_IS_IC751) ) // only worth trying if not in satmode { int cmd, subcmd, freq_len, retry_save; @@ -5761,7 +5761,7 @@ int icom_get_split_freq(RIG *rig, vfo_t vfo, freq_t *tx_freq) rig_strvfo(rig->state.current_vfo)); - if (rig->caps->rig_model == RIG_MODEL_IC910) + if (RIG_IS_IC910) { ptt_t ptt; rig_debug(RIG_DEBUG_VERBOSE, "%s: ic910#2\n", __func__); @@ -5818,8 +5818,8 @@ int icom_get_split_freq(RIG *rig, vfo_t vfo, freq_t *tx_freq) // when transmitting in split mode the split VFO is active subcmd = (rig->state.cache.split && rig->state.cache.ptt) ? 0x00 : 0x01; // get the unselected vfo - if (rig->state.rig_model == RIG_MODEL_IC7600) - { // the 7600 does it different 0=Main, 1=Sub -- maybe other Icoms will start doing this too + if (RIG_IS_IC7600 || RIG_IS_IC7610) + { // the 7600/7610 do it different 0=Main, 1=Sub -- maybe other Icoms will start doing this too subcmd = 0; if (vfo & RIG_VFO_B || vfo & RIG_VFO_SUB) subcmd = 1; } @@ -7200,9 +7200,9 @@ int icom_set_func(RIG *rig, vfo_t vfo, setting_t func, int status) break; case RIG_FUNC_DUAL_WATCH: - if ((rig->caps->rig_model == RIG_MODEL_IC9100) - || (rig->caps->rig_model == RIG_MODEL_IC9700) - || (rig->caps->rig_model == RIG_MODEL_ID5100)) + if ((RIG_IS_IC9100) + || (RIG_IS_IC9700) + || (RIG_IS_ID5100)) { fct_cn = C_CTL_FUNC; fct_sc = S_MEM_DUALMODE; @@ -7217,7 +7217,7 @@ int icom_set_func(RIG *rig, vfo_t vfo, setting_t func, int status) break; case RIG_FUNC_SATMODE: - if (rig->caps->rig_model == RIG_MODEL_IC910) + if (RIG_IS_IC910) { // Is the 910 the only one that uses this command? fct_cn = C_CTL_MEM; @@ -7442,8 +7442,8 @@ int icom_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) break; case RIG_FUNC_DUAL_WATCH: - if ((rig->caps->rig_model == RIG_MODEL_IC9100) || - (rig->caps->rig_model == RIG_MODEL_IC9700)) + if ((RIG_IS_IC9100) || + (RIG_IS_IC9700)) { fct_cn = C_CTL_FUNC; fct_sc = S_MEM_DUALMODE; @@ -7457,7 +7457,7 @@ int icom_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) break; case RIG_FUNC_SATMODE: - if (rig->caps->rig_model == RIG_MODEL_IC910) + if (RIG_IS_IC910) { // Is the 910 the only one that uses this command? fct_cn = C_CTL_MEM; @@ -8096,7 +8096,7 @@ int icom_set_powerstat(RIG *rig, powerstat_t status) retval = icom_transaction(rig, C_SET_PWR, pwr_sc, NULL, 0, ackbuf, &ack_len); - if (rig->caps->rig_model == RIG_MODEL_IC7300) + if (RIG_IS_IC7300) { rig_debug(RIG_DEBUG_VERBOSE, "%s: waiting 5 seconds for rig to wake up\n", __func__); @@ -8215,7 +8215,7 @@ int icom_get_powerstat(RIG *rig, powerstat_t *status) *status = RIG_POWER_OFF; // default return until proven otherwise /* r75 has no way to get power status, so fake it */ - if (rig->caps->rig_model == RIG_MODEL_ICR75) + if (RIG_IS_ICR75) { /* getting the mode doesn't work if a memory is blank */ /* so use one of the more innocuous 'set mode' commands instead */ @@ -8234,14 +8234,14 @@ int icom_get_powerstat(RIG *rig, powerstat_t *status) RIG_POWER_ON : RIG_POWER_OFF; } - if (rig->caps->rig_model == RIG_MODEL_IC2730 - || rig->caps->rig_model == RIG_MODEL_IC7100 - || rig->caps->rig_model == RIG_MODEL_IC7300 - || rig->caps->rig_model == RIG_MODEL_IC7600 - || rig->caps->rig_model == RIG_MODEL_IC7610 - || rig->caps->rig_model == RIG_MODEL_IC7700 - || rig->caps->rig_model == RIG_MODEL_IC7800 - || rig->caps->rig_model == RIG_MODEL_IC905) + if (RIG_IS_IC2730 + || RIG_IS_IC7100 + || RIG_IS_IC7300 + || RIG_IS_IC7600 + || RIG_IS_IC7610 + || RIG_IS_IC7700 + || RIG_IS_IC7800 + || RIG_IS_IC905) { freq_t freq; int retrysave = rig->caps->retry; @@ -8512,7 +8512,7 @@ int icom_get_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t *option, { retval = icom_transaction(rig, C_CTL_ANT, -1, NULL, 0, ackbuf, &ack_len); } - else if (rig->caps->rig_model == RIG_MODEL_IC785x) + else if (RIG_IS_IC785X) { unsigned char buf[2]; buf[0] = 0x03; diff --git a/rigs/icom/icom.h b/rigs/icom/icom.h index a9e89f148..e5a00cf20 100644 --- a/rigs/icom/icom.h +++ b/rigs/icom/icom.h @@ -509,4 +509,88 @@ extern const struct rig_caps x5105_caps; extern const struct rig_caps icr8600_caps; extern const struct rig_caps icr30_caps; +#define RIG_IS_IC1271 (rig->state.rig_model == RIG_MODEL_IC1271) +#define RIG_IS_IC1275 (rig->state.rig_model == RIG_MODEL_IC1275) +#define RIG_IS_IC271 (rig->state.rig_model == RIG_MODEL_IC271) +#define RIG_IS_IC2730 (rig->state.rig_model == RIG_MODEL_IC2730) +#define RIG_IS_IC275 (rig->state.rig_model == RIG_MODEL_IC275) +#define RIG_IS_IC375 (rig->state.rig_model == RIG_MODEL_IC375) +#define RIG_IS_IC471 (rig->state.rig_model == RIG_MODEL_IC471) +#define RIG_IS_IC475 (rig->state.rig_model == RIG_MODEL_IC475) +#define RIG_IS_IC575 (rig->state.rig_model == RIG_MODEL_IC575) +#define RIG_IS_IC7000 (rig->state.rig_model == RIG_MODEL_IC7000) +#define RIG_IS_IC703 (rig->state.rig_model == RIG_MODEL_IC703) +#define RIG_IS_IC705 (rig->state.rig_model == RIG_MODEL_IC705) +#define RIG_IS_IC706 (rig->state.rig_model == RIG_MODEL_IC706) +#define RIG_IS_IC706MKII (rig->state.rig_model == RIG_MODEL_IC706MKII) +#define RIG_IS_IC706MKIIG (rig->state.rig_model == RIG_MODEL_IC706MKIIG) +#define RIG_IS_IC707 (rig->state.rig_model == RIG_MODEL_IC707) +#define RIG_IS_IC7100 (rig->state.rig_model == RIG_MODEL_IC7100) +#define RIG_IS_IC718 (rig->state.rig_model == RIG_MODEL_IC718) +#define RIG_IS_IC7200 (rig->state.rig_model == RIG_MODEL_IC7200) +#define RIG_IS_IC725 (rig->state.rig_model == RIG_MODEL_IC725) +#define RIG_IS_IC726 (rig->state.rig_model == RIG_MODEL_IC726) +#define RIG_IS_IC728 (rig->state.rig_model == RIG_MODEL_IC728) +#define RIG_IS_IC729 (rig->state.rig_model == RIG_MODEL_IC729) +#define RIG_IS_IC7300 (rig->state.rig_model == RIG_MODEL_IC7300) +#define RIG_IS_IC731 (rig->state.rig_model == RIG_MODEL_IC731) +#define RIG_IS_IC735 (rig->state.rig_model == RIG_MODEL_IC735) +#define RIG_IS_IC736 (rig->state.rig_model == RIG_MODEL_IC736) +#define RIG_IS_IC737 (rig->state.rig_model == RIG_MODEL_IC737) +#define RIG_IS_IC738 (rig->state.rig_model == RIG_MODEL_IC738) +#define RIG_IS_IC7410 (rig->state.rig_model == RIG_MODEL_IC7410) +#define RIG_IS_IC746 (rig->state.rig_model == RIG_MODEL_IC746) +#define RIG_IS_IC746PRO (rig->state.rig_model == RIG_MODEL_IC746PRO) +#define RIG_IS_IC751 (rig->state.rig_model == RIG_MODEL_IC751) +#define RIG_IS_IC751A (rig->state.rig_model == RIG_MODEL_IC751A) +#define RIG_IS_IC756 (rig->state.rig_model == RIG_MODEL_IC756) +#define RIG_IS_IC756PRO (rig->state.rig_model == RIG_MODEL_IC756PRO) +#define RIG_IS_IC756PROII (rig->state.rig_model == RIG_MODEL_IC756PROII) +#define RIG_IS_IC756PROIII (rig->state.rig_model == RIG_MODEL_IC756PROIII) +#define RIG_IS_IC7600 (rig->state.rig_model == RIG_MODEL_IC7600) +#define RIG_IS_IC761 (rig->state.rig_model == RIG_MODEL_IC761) +#define RIG_IS_IC7610 (rig->state.rig_model == RIG_MODEL_IC7610) +#define RIG_IS_IC765 (rig->state.rig_model == RIG_MODEL_IC765) +#define RIG_IS_IC7700 (rig->state.rig_model == RIG_MODEL_IC7700) +#define RIG_IS_IC775 (rig->state.rig_model == RIG_MODEL_IC775) +#define RIG_IS_IC78 (rig->state.rig_model == RIG_MODEL_IC78) +#define RIG_IS_IC7800 (rig->state.rig_model == RIG_MODEL_IC7800) +#define RIG_IS_IC781 (rig->state.rig_model == RIG_MODEL_IC781) +#define RIG_IS_IC785X (rig->state.rig_model == RIG_MODEL_IC785x) +#define RIG_IS_IC820 (rig->state.rig_model == RIG_MODEL_IC820) +#define RIG_IS_IC821 (rig->state.rig_model == RIG_MODEL_IC821) +#define RIG_IS_IC821H (rig->state.rig_model == RIG_MODEL_IC821H) +#define RIG_IS_IC905 (rig->state.rig_model == RIG_MODEL_IC905) +#define RIG_IS_IC910 (rig->state.rig_model == RIG_MODEL_IC910) +#define RIG_IS_IC9100 (rig->state.rig_model == RIG_MODEL_IC9100) +#define RIG_IS_IC92D (rig->state.rig_model == RIG_MODEL_IC92D) +#define RIG_IS_IC970 (rig->state.rig_model == RIG_MODEL_IC970) +#define RIG_IS_IC9700 (rig->state.rig_model == RIG_MODEL_IC9700) +#define RIG_IS_IC8101 (rig->state.rig_model == RIG_MODEL_ICF8101) +#define RIG_IS_ICID1 (rig->state.rig_model == RIG_MODEL_ICID1) +#define RIG_IS_ICM700PRO (rig->state.rig_model == RIG_MODEL_IC_M700PRO) +#define RIG_IS_ICM710 (rig->state.rig_model == RIG_MODEL_IC_M710) +#define RIG_IS_ICM802 (rig->state.rig_model == RIG_MODEL_IC_M802) +#define RIG_IS_ICM803 (rig->state.rig_model == RIG_MODEL_IC_M803) +#define RIG_IS_ICR10 (rig->state.rig_model == RIG_MODEL_ICR10) +#define RIG_IS_ICR20 (rig->state.rig_model == RIG_MODEL_ICR20) +#define RIG_IS_ICR30 (rig->state.rig_model == RIG_MODEL_ICR30) +#define RIG_IS_ICR6 (rig->state.rig_model == RIG_MODEL_ICR6) +#define RIG_IS_ICR7000 (rig->state.rig_model == RIG_MODEL_ICR7000) +#define RIG_IS_ICR71 (rig->state.rig_model == RIG_MODEL_ICR71) +#define RIG_IS_ICR7100 (rig->state.rig_model == RIG_MODEL_ICR7100) +#define RIG_IS_ICR72 (rig->state.rig_model == RIG_MODEL_ICR72) +#define RIG_IS_ICR75 (rig->state.rig_model == RIG_MODEL_ICR75) +#define RIG_IS_ICR8500 (rig->state.rig_model == RIG_MODEL_ICR8500) +#define RIG_IS_ICR8600 (rig->state.rig_model == RIG_MODEL_ICR8600) +#define RIG_IS_ICR9000 (rig->state.rig_model == RIG_MODEL_ICR9000) +#define RIG_IS_ICR9500 (rig->state.rig_model == RIG_MODEL_ICR9500) +#define RIG_IS_ICRX7 (rig->state.rig_model == RIG_MODEL_ICRX7) +#define RIG_IS_ID5100 (rig->state.rig_model == RIG_MODEL_ID5100) +#define RIG_IS_OMNIVIP (rig->state.rig_model == RIG_MODEL_OMNIVIP) +#define RIG_IS_OS456 (rig->state.rig_model == RIG_MODEL_OS456) +#define RIG_IS_X5105 (rig->state.rig_model == RIG_MODEL_X5105) +#define RIG_IS_X6100 (rig->state.rig_model == RIG_MODEL_X6100) + + #endif /* _ICOM_H */ commit c0c70b014693f7d41703cb6087416b96c6935a90 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Jun 27 08:54:43 2023 -0500 Fix IC-7600 set/get freq to use new 0x25/x26 capability if available https://github.com/Hamlib/Hamlib/issues/1319 diff --git a/rigs/icom/ic7600.c b/rigs/icom/ic7600.c index 9b9e84fdd..f56806fe1 100644 --- a/rigs/icom/ic7600.c +++ b/rigs/icom/ic7600.c @@ -263,7 +263,7 @@ int ic7600_get_clock(RIG *rig, int *year, int *month, int *day, int *hour, return retval; } -const struct rig_caps ic7600_caps = +struct rig_caps ic7600_caps = { RIG_MODEL(RIG_MODEL_IC7600), .model_name = "IC-7600", diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index 3abc0f61f..9142a48bf 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -1373,6 +1373,11 @@ int icom_set_freq(RIG *rig, vfo_t vfo, freq_t freq) HAMLIB_TRACE; subcmd = 0x01; // get unselected VFO } + if (rig->state.rig_model == RIG_MODEL_IC7600) + { // the 7600 does it different 0=Main, 1=Sub -- maybe other Icoms will start doing this too + subcmd = 0; + if (vfo & RIG_VFO_B || vfo & RIG_VFO_SUB) subcmd = 1; + } cmd = 0x25; retval = icom_transaction(rig, cmd, subcmd, freqbuf, freq_len, ackbuf, @@ -1659,6 +1664,16 @@ int icom_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) subcmd2 = 0x01; // get unselected VFO } + // 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->caps->targetable_vfo = rig->state.targetable_vfo |= RIG_TARGETABLE_FREQ | RIG_TARGETABLE_MODE; + rig_debug(RIG_DEBUG_VERBOSE, "%s: TARGETABLE_FREQ and TARGETABLE_MODE enabled\n", __func__); + if (rig->state.rig_model == RIG_MODEL_IC7600) + { // the 7600 does it different 0=Main, 1=Sub -- maybe other Icoms will start doing this too + subcmd2 = 0; + if (vfo & RIG_VFO_B || vfo & RIG_VFO_SUB) subcmd2 = 1; + } + retval = icom_transaction(rig, cmd2, subcmd2, NULL, 0, freqbuf, &freq_len); if (retval == RIG_OK) @@ -5803,6 +5818,11 @@ int icom_get_split_freq(RIG *rig, vfo_t vfo, freq_t *tx_freq) // when transmitting in split mode the split VFO is active subcmd = (rig->state.cache.split && rig->state.cache.ptt) ? 0x00 : 0x01; // get the unselected vfo + if (rig->state.rig_model == RIG_MODEL_IC7600) + { // the 7600 does it different 0=Main, 1=Sub -- maybe other Icoms will start doing this too + subcmd = 0; + if (vfo & RIG_VFO_B || vfo & RIG_VFO_SUB) subcmd = 1; + } retval = icom_transaction(rig, cmd, subcmd, NULL, 0, ackbuf, &ack_len); diff --git a/rigs/icom/icom.h b/rigs/icom/icom.h index 6c968d0a0..a9e89f148 100644 --- a/rigs/icom/icom.h +++ b/rigs/icom/icom.h @@ -35,7 +35,7 @@ #include <sys/time.h> #endif -#define BACKEND_VER "20230620" +#define BACKEND_VER "20230627" #define ICOM_IS_ID31 rig_is_model(rig, RIG_MODEL_ID31) #define ICOM_IS_ID51 rig_is_model(rig, RIG_MODEL_ID51) @@ -443,7 +443,7 @@ extern const struct rig_caps ic756pro_caps; extern const struct rig_caps ic756pro2_caps; extern const struct rig_caps ic756pro3_caps; extern const struct rig_caps ic751_caps; -extern const struct rig_caps ic7600_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 const struct rig_caps ic761_caps; extern const struct rig_caps ic765_caps; diff --git a/simulators/simicom7600.c b/simulators/simicom7600.c new file mode 100644 index 000000000..13301cdf4 --- /dev/null +++ b/simulators/simicom7600.c @@ -0,0 +1,635 @@ +// simicom will show the pts port to use for rigctl on Unix +// using virtual serial ports on Windows is to be developed yet +// Needs a lot of improvement to work on all Icoms +// gcc -g -Wall -o simicom simicom.c -lhamlib +// On mingw in the hamlib src directory +// gcc -static -I../include -g -Wall -o simicom simicom.c -L../../build/src/.libs -lhamlib -lwsock32 -lws2_32 +#define _XOPEN_SOURCE 700 +// since w... [truncated message content] |
From: n0nb <n0...@us...> - 2023-06-07 14:21:35
|
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 05cf5546717be163e94b30f98cd17a3f1136ba1a (commit) via 203920e293f470fbf709b9d54da0c9266788656a (commit) via 835b66e7df30f40a1941985727e22662bcb2b77d (commit) via 92363f6b0c27b81de1513c0770fdbfaa8b53d238 (commit) via 72071a313eef49a17c4d6d0704aba698f4274d21 (commit) via 138060d4d92de6c56c8af7e12c9f17338d91bcc2 (commit) via 527dbaad34e73538f2341454309f2c26f86925a8 (commit) via b25db51a515076f7991cadd0c4a84112a3b993c8 (commit) via bc50d9c273e2f195a4179498e9b5b96399fc8c03 (commit) via 1e5563909d7a9f5103bba0b2034159c6eeeee993 (commit) via 21f0e560f771f39acbf9ea5276356fa78832c3d9 (commit) via e8af3447aa62ec15ac363a9d706910513f29f0e8 (commit) via 5276e25a92584b33a8fd27a44b10e7c4d915ab3a (commit) via acc42665efb051707bc7380ae812f0afcdf665a4 (commit) via 55cbf80719a3b6972731ad9d85c725f0998a4e11 (commit) via 4e4d8e39d825412a8a5f46e6785f6eb465df2752 (commit) via eb97c7c107f550e01a63d01a7ec138e9aaa4ca89 (commit) via e1e570d19a944bd8918ad085b904ba6ffa7733ef (commit) via 48b01aa3ffb677e529e73cc8b4fe8783d9106c27 (commit) via a6de41e206d8d8fa2bab59069d052d9953b5e757 (commit) via 412221d346c61ebf70028edaac39f069b250e00c (commit) via 2491d208d945859f294f6f56ea0b52396350562e (commit) via cd0b685ed26baa5c89c786620dadbccb85f3ed39 (commit) via 729554ea80e84681ac77a000ebf3a6bd90016da3 (commit) via b34f18af40f822cfc235188523df933b297252da (commit) via 1fb69e18fdf1c974e252e5e4994799877ba7d652 (commit) via 82954c054922dc14d4a471cd7dcec8624ce539ff (commit) via fe209d7cce9cc1c647c8d1edac536bf3c46b7368 (commit) via fd86001ead11a5e2447a2382375857451efe93d6 (commit) via c3cf7a9874ba64c6a76eed13d8763782a96a351d (commit) via 2c8f8a9c294345bc878b000565ee3a1efd597a86 (commit) via 5745457d7f9c04b4ed60f11b81963826e0a83999 (commit) via c85cf58235dae925a00d70d4231373ab0669b8db (commit) via bdd16c8f20f2473f8a51636aa3694279da972039 (commit) via 5541deb8125632ece6f3274202e1a2a116605684 (commit) via 8fcd8242afbcca4c1fdeda751d260aa11df1da92 (commit) via 1ea7e2323579890afee9a34de0756ad949ead8f0 (commit) via 16137cd72ac6fcd9d33ddcc727b906d66858c87a (commit) via 75699adbbbfb9f1d7855a275deb47d6373a2b897 (commit) via dcd8ac58cf8f56cdbc49788114b626886faec345 (commit) via 84643407fff746f735aabd293d85622fd2e5b200 (commit) from 07a9f321b4a3a337df306b4b6184435040174eae (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 05cf5546717be163e94b30f98cd17a3f1136ba1a Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Jun 7 07:26:39 2023 -0500 This seems to fix the DLL backwards compatiblity now -- more testing needed Revert "Remove timeout_retry as it broke DLL compatibility" This reverts commit 1c08cd7a64a3cd46c5b3aae875f9a38d29b94b80. diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index bfa5f7e35..908f753c4 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -2084,6 +2084,7 @@ struct rig_caps { int (*password)(RIG *rig, const char *key1); /*< Send encrypted password if rigctld is secured with -A/--password */ int (*set_lock_mode)(RIG *rig, int mode); int (*get_lock_mode)(RIG *rig, int *mode); + short timeout_retry; /*!< number of retries to make in case of read timeout errors, some serial interfaces may require this, 0 to use default value, -1 to disable */ }; //! @endcond diff --git a/src/conf.c b/src/conf.c index 7529c87c0..831fdc5d8 100644 --- a/src/conf.c +++ b/src/conf.c @@ -69,6 +69,11 @@ static const struct confparams frontend_cfg_params[] = TOK_RETRY, "retry", "Retry", "Max number of retry", "0", RIG_CONF_NUMERIC, { .n = { 0, 10, 1 } } }, + { + TOK_TIMEOUT_RETRY, "timeout_retry", "Number of retries for read timeouts", + "Set the number of retries for data read timeouts that may occur especially with some serial interfaces", + "1", RIG_CONF_NUMERIC, { .n = { 0, 100, 1 } } + }, { TOK_RANGE_SELECTED, "Selected range list", "Range list#", "The tx/rx range list in use", @@ -738,6 +743,15 @@ static int frontend_set_conf(RIG *rig, token_t token, const char *val) rs->tuner_control_pathname = strdup(val); // yeah -- need to free it break; + case TOK_TIMEOUT_RETRY: + if (1 != sscanf(val, "%ld", &val_i)) + { + return -RIG_EINVAL; + } + + rs->rigport.timeout_retry = val_i; + break; + case TOK_OFFSET_VFOA: if (1 != sscanf(val, "%ld", &val_i)) { @@ -1111,6 +1125,10 @@ static int frontend_get_conf2(RIG *rig, token_t token, char *val, int val_len) SNPRINTF(val, val_len, "%d", rs->async_data_enabled); break; + case TOK_TIMEOUT_RETRY: + SNPRINTF(val, val_len, "%d", rs->rigport.timeout_retry); + break; + default: return -RIG_EINVAL; } diff --git a/src/rig.c b/src/rig.c index 1c5b8ae85..794a92471 100644 --- a/src/rig.c +++ b/src/rig.c @@ -623,13 +623,28 @@ RIG *HAMLIB_API rig_init(rig_model_t rig_model) rs->rigport.post_write_delay = caps->post_write_delay; // since we do two timeouts now we can cut the timeout in half for serial - if (caps->port_type == RIG_PORT_SERIAL) + if (caps->port_type == RIG_PORT_SERIAL && caps->timeout_retry >= 0) { rs->rigport.timeout = caps->timeout / 2; } rs->rigport.retry = caps->retry; + if (caps->timeout_retry < 0) + { + // Rigs may disable read timeout retries + rs->rigport.timeout_retry = 0; + } + else if (caps->timeout_retry == 0) + { + // Default to 1 retry for read timeouts + rs->rigport.timeout_retry = 1; + } + else + { + rs->rigport.timeout_retry = caps->timeout_retry; + } + rs->pttport.type.ptt = caps->ptt_type; rs->dcdport.type.dcd = caps->dcd_type; commit 203920e293f470fbf709b9d54da0c9266788656a Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Jun 7 07:05:05 2023 -0500 FIx FT817 set/get_mode -- thanks to Mooner Salem K6AQ https://github.com/drowe67/freedv-gui/issues/409 diff --git a/rigs/yaesu/ft817.c b/rigs/yaesu/ft817.c index dc8035090..a187b0017 100644 --- a/rigs/yaesu/ft817.c +++ b/rigs/yaesu/ft817.c @@ -224,13 +224,13 @@ enum ft817_digi }; #define FT817_ALL_RX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_PKTFM|\ - RIG_MODE_USB|RIG_MODE_LSB|RIG_MODE_RTTY|RIG_MODE_FM|RIG_MODE_PKTUSB|RIG_MODE_PKTLSB) + RIG_MODE_USB|RIG_MODE_LSB|RIG_MODE_RTTY|RIG_MODE_FM|RIG_MODE_PKTUSB|RIG_MODE_PKTLSB|RIG_MODE_PSK|RIG_MODE_PSKR) #define FT817_SSB_CW_RX_MODES (RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_USB|RIG_MODE_LSB|RIG_MODE_RTTY) #define FT817_CWN_RX_MODES (RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_RTTY) #define FT817_AM_FM_RX_MODES (RIG_MODE_AM|RIG_MODE_FM|RIG_MODE_PKTFM) #define FT817_OTHER_TX_MODES (RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_USB|\ - RIG_MODE_LSB|RIG_MODE_RTTY|RIG_MODE_FM|RIG_MODE_PKTUSB|RIG_MODE_PKTLSB) + RIG_MODE_LSB|RIG_MODE_RTTY|RIG_MODE_FM|RIG_MODE_PKTUSB|RIG_MODE_PKTLSB|RIG_MODE_PSK|RIG_MODE_PSKR) #define FT817_AM_TX_MODES (RIG_MODE_AM) #define FT817_VFO_ALL (RIG_VFO_A|RIG_VFO_B) @@ -294,7 +294,7 @@ const struct rig_caps ft817_caps = RIG_MODEL(RIG_MODEL_FT817), .model_name = "FT-817", .mfg_name = "Yaesu", - .version = "20230606.0", + .version = "20230607.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -711,6 +711,7 @@ static int ft817_read_eeprom(RIG *rig, unsigned short addr, unsigned char *out) rig_debug(RIG_DEBUG_VERBOSE, "%s: data[0]=%02x, data[1]=%02x, out=%02x\n", __func__, data[0], data[1], *out); + memcpy(out, data, 2); return RIG_OK; } @@ -934,9 +935,9 @@ static int ft817_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) { case FT817_DIGI_RTTY: *mode = RIG_MODE_RTTYR; break; - case FT817_DIGI_PSK_L: *mode = RIG_MODE_PKTLSB; break; + case FT817_DIGI_PSK_L: *mode = RIG_MODE_PSKR; break; - case FT817_DIGI_PSK_U: *mode = RIG_MODE_PKTUSB; break; + case FT817_DIGI_PSK_U: *mode = RIG_MODE_PSK; break; case FT817_DIGI_USER_L: *mode = RIG_MODE_PKTLSB; break; @@ -1532,9 +1533,9 @@ static int ft817_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) if (mode == RIG_MODE_RTTY) { data[2] = 0; } - if (mode == RIG_MODE_PSK) { data[2] = 1 << 5; } + if (mode == RIG_MODE_PSKR) { data[2] = 1 << 5; } - if (mode == RIG_MODE_PSKR) { data[2] = 2 << 5; } + if (mode == RIG_MODE_PSK) { data[2] = 2 << 5; } if (mode == RIG_MODE_PKTLSB) { data[2] = 3 << 5; } commit 835b66e7df30f40a1941985727e22662bcb2b77d Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Jun 6 23:34:15 2023 -0500 Give the FT-920 some time during PTT OFF to allow it to occur Fake-It was not working probably due to this as can't set freq while PTT diff --git a/rigs/yaesu/ft920.c b/rigs/yaesu/ft920.c index 01be2022a..68cc18877 100644 --- a/rigs/yaesu/ft920.c +++ b/rigs/yaesu/ft920.c @@ -407,7 +407,7 @@ const struct rig_caps ft920_caps = RIG_MODEL(RIG_MODEL_FT920), .model_name = "FT-920", .mfg_name = "Yaesu", - .version = "20220529.0", /* YYYYMMDD */ + .version = "20220060.0", /* YYYYMMDD */ .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -2296,6 +2296,7 @@ static int ft920_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) { return err; } + hl_usleep(200*1000); // give the rig some time before we try set_freq return RIG_OK; } commit 92363f6b0c27b81de1513c0770fdbfaa8b53d238 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Jun 6 15:12:52 2023 -0500 Re-add field to rig_state for DLL alignment https://github.com/Hamlib/Hamlib/issues/1299 diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 0dd9d648d..bfa5f7e35 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -2691,7 +2691,8 @@ struct rig_state { * It is NOT fine to touch this struct AT ALL!!! */ struct rig_state_deprecated { - /********* DO NOT MODIFY OR REMOVE THIS STRUCTURE -- IT IS FOREVER DEPRECATED *********/ + /********* ENSURE YOU DO NOT EVERY MODIFY THIS STRUCTURE *********/ + /********* It will remain forever to provide DLL backwards compatiblity ******/ /* * overridable fields */ @@ -2809,6 +2810,7 @@ struct rig_state_deprecated { char client_version[32]; /*!<! Allow client to report version for compatibility checks/capability */ freq_t offset_vfoa; /*!< Offset to apply to VFOA/Main set_freq */ freq_t offset_vfob; /*!< Offset to apply to VFOB/Sub set_freq */ + struct multicast_s *multicast; /*!< Pointer to multicast server data */ }; //! @cond Doxygen_Suppress @@ -2883,6 +2885,7 @@ struct s_rig { // Do not remove the deprecated structure -- it will mess up DLL backwards compatibility struct rig_state_deprecated state_deprecated; /*!< Deprecated Rig state */ struct rig_callbacks callbacks; /*!< registered event callbacks */ + // state should really be a pointer but that's a LOT of changes involved struct rig_state state; /*!< Rig state */ }; commit 72071a313eef49a17c4d6d0704aba698f4274d21 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Jun 6 14:22:28 2023 -0500 Fix FT817 get_mode https://github.com/Hamlib/Hamlib/issues/1308 diff --git a/rigs/yaesu/ft817.c b/rigs/yaesu/ft817.c index 6cc77009c..dc8035090 100644 --- a/rigs/yaesu/ft817.c +++ b/rigs/yaesu/ft817.c @@ -224,13 +224,13 @@ enum ft817_digi }; #define FT817_ALL_RX_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_PKTFM|\ - RIG_MODE_USB|RIG_MODE_LSB|RIG_MODE_RTTY|RIG_MODE_FM|RIG_MODE_PKTUSB) + RIG_MODE_USB|RIG_MODE_LSB|RIG_MODE_RTTY|RIG_MODE_FM|RIG_MODE_PKTUSB|RIG_MODE_PKTLSB) #define FT817_SSB_CW_RX_MODES (RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_USB|RIG_MODE_LSB|RIG_MODE_RTTY) #define FT817_CWN_RX_MODES (RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_RTTY) #define FT817_AM_FM_RX_MODES (RIG_MODE_AM|RIG_MODE_FM|RIG_MODE_PKTFM) #define FT817_OTHER_TX_MODES (RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_USB|\ - RIG_MODE_LSB|RIG_MODE_RTTY|RIG_MODE_FM|RIG_MODE_PKTUSB) + RIG_MODE_LSB|RIG_MODE_RTTY|RIG_MODE_FM|RIG_MODE_PKTUSB|RIG_MODE_PKTLSB) #define FT817_AM_TX_MODES (RIG_MODE_AM) #define FT817_VFO_ALL (RIG_VFO_A|RIG_VFO_B) @@ -799,7 +799,7 @@ static int ft817_get_status(RIG *rig, int status) } /* Top 3 bit define the digi mode */ - p->dig_mode = dig_mode[1] >> 5; + p->dig_mode = dig_mode[0] >> 5; default: break; commit 138060d4d92de6c56c8af7e12c9f17338d91bcc2 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Jun 6 14:17:48 2023 -0500 Fix flex6xxx ZZAR command diff --git a/rigs/kenwood/flex6xxx.c b/rigs/kenwood/flex6xxx.c index 99f7d55ad..14604e04f 100644 --- a/rigs/kenwood/flex6xxx.c +++ b/rigs/kenwood/flex6xxx.c @@ -666,8 +666,17 @@ int powersdr_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) case RIG_LEVEL_RF: if (val.f > 1.0) { return -RIG_EINVAL; } - ival = val.f * (120 - -20) - 20; - SNPRINTF(cmd, sizeof(cmd) - 1, "ZZAR%+04d", ival); + if (rig->caps->rig_model == RIG_MODEL_POWERSDR) + { + ival = val.f * (120 - -20) - 20; + SNPRINTF(cmd, sizeof(cmd) - 1, "ZZAR%+04d", ival); + } + else + { + ival = val.f * 100; + SNPRINTF(cmd, sizeof(cmd) - 1, "ZZAR%03d", ival); + } + break; case RIG_LEVEL_MICGAIN: @@ -1102,7 +1111,7 @@ const struct rig_caps f6k_caps = RIG_MODEL(RIG_MODEL_F6K), .model_name = "6xxx", .mfg_name = "FlexRadio", - .version = "20220306.0", + .version = "20230606.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -1123,7 +1132,7 @@ const struct rig_caps f6k_caps = .has_get_parm = RIG_PARM_NONE, .has_set_parm = RIG_PARM_NONE, /* FIXME: parms */ .level_gran = { - [LVL_KEYSPD] = { .min = { .i = 5 }, .max = { .i = 60 }, .step = { .i = 1 } }, + [LVL_KEYSPD] = { .min = { .i = 5 }, .max = { .i = 60 }, .step = { .i = 1 } }, }, /* FIXME: granularity */ .parm_gran = {}, //.extlevels = elecraft_ext_levels, @@ -1263,7 +1272,7 @@ const struct rig_caps powersdr_caps = .has_get_parm = RIG_PARM_NONE, .has_set_parm = RIG_PARM_NONE, /* FIXME: parms */ .level_gran = { - [LVL_KEYSPD] = { .min = { .i = 5 }, .max = { .i = 60 }, .step = { .i = 1 } }, + [LVL_KEYSPD] = { .min = { .i = 5 }, .max = { .i = 60 }, .step = { .i = 1 } }, }, /* FIXME: granularity */ .parm_gran = {}, //.extlevels = elecraft_ext_levels, commit 527dbaad34e73538f2341454309f2c26f86925a8 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Jun 6 12:40:51 2023 -0500 Add LOCK in send_morse diff --git a/src/rig.c b/src/rig.c index 9efd81c34..1c5b8ae85 100644 --- a/src/rig.c +++ b/src/rig.c @@ -788,6 +788,9 @@ RIG *HAMLIB_API rig_init(rig_model_t rig_model) rs->rigport.fd = rs->pttport.fd = rs->dcdport.fd = -1; rs->powerstat = RIG_POWER_ON; // default to power on + // we have to copy rs to rig->state_deprecated for DLL backwards compatibility + memcpy(&rig->state_deprecated, rs, sizeof(rig->state_deprecated)); + /* * let the backend a chance to setup his private data * This must be done only once defaults are setup, @@ -2420,10 +2423,6 @@ int HAMLIB_API rig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) retcode = caps->set_mode(rig, vfo, mode, width); rig_debug(RIG_DEBUG_TRACE, "%s: targetable retcode after set_mode(%s)=%d\n", __func__, rig_strrmode(mode), retcode); - if (rig->caps->rig_model == RIG_MODEL_FT817) - { - rig_debug(RIG_DEBUG_WARN, "%s: FT817 must use Menu 26 to switch between upper/lower sideband, Hamlib only sets DIG mode\n", __func__); - } } else { @@ -6753,7 +6752,9 @@ int HAMLIB_API rig_send_morse(RIG *rig, vfo_t vfo, const char *msg) if (vfo == RIG_VFO_CURR || vfo == rig->state.current_vfo) { + LOCK(1); retcode = caps->send_morse(rig, vfo, msg); + LOCK(0); RETURNFUNC(retcode); } commit b25db51a515076f7991cadd0c4a84112a3b993c8 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Jun 6 10:42:30 2023 -0500 Allow icom_send_morse to repeat a single char transmit when receiving a NAK diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index a44f193c8..92788ef77 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -8768,6 +8768,7 @@ int icom_send_morse(RIG *rig, vfo_t vfo, const char *msg) unsigned char ackbuf[MAXFRAMELEN]; int ack_len = sizeof(ackbuf), retval; int len; + int retry = 20; ENTERFUNC; len = strlen(msg); @@ -8779,6 +8780,7 @@ int icom_send_morse(RIG *rig, vfo_t vfo, const char *msg) rig_debug(RIG_DEBUG_TRACE, "%s: %s\n", __func__, msg); +morse_retry: retval = icom_transaction(rig, C_SND_CW, -1, (unsigned char *) msg, len, ackbuf, &ack_len); @@ -8798,6 +8800,11 @@ int icom_send_morse(RIG *rig, vfo_t vfo, const char *msg) { rig_debug(RIG_DEBUG_ERR, "%s: ack NG (%#.2x), len=%d\n", __func__, ackbuf[0], ack_len); + if (len == 1 && --retry > 0) { + // 50 retries should be around 200ms --plenty of time to clear out some characters + hl_usleep(10*1000); + goto morse_retry; + } RETURNFUNC(-RIG_ERJCTED); } commit bc50d9c273e2f195a4179498e9b5b96399fc8c03 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Jun 6 10:16:21 2023 -0500 +04d actaully kicks out 3-digits and not 4 -- the + is included in the width value Revert "Fix PowerSDR ZZAR command format -- may need another fix for SmartSDR format to be different" This reverts commit 1e5563909d7a9f5103bba0b2034159c6eeeee993. diff --git a/rigs/kenwood/flex6xxx.c b/rigs/kenwood/flex6xxx.c index d9f961d3a..99f7d55ad 100644 --- a/rigs/kenwood/flex6xxx.c +++ b/rigs/kenwood/flex6xxx.c @@ -667,7 +667,7 @@ int powersdr_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) if (val.f > 1.0) { return -RIG_EINVAL; } ival = val.f * (120 - -20) - 20; - SNPRINTF(cmd, sizeof(cmd) - 1, "ZZAR%+03d", ival); + SNPRINTF(cmd, sizeof(cmd) - 1, "ZZAR%+04d", ival); break; case RIG_LEVEL_MICGAIN: @@ -1233,7 +1233,7 @@ const struct rig_caps powersdr_caps = RIG_MODEL(RIG_MODEL_POWERSDR), .model_name = "PowerSDR/Thetis", .mfg_name = "FlexRadio/ANAN", - .version = "20230606.0", + .version = "20221123.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, commit 1e5563909d7a9f5103bba0b2034159c6eeeee993 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Jun 6 10:09:32 2023 -0500 Fix PowerSDR ZZAR command format -- may need another fix for SmartSDR format to be different diff --git a/rigs/kenwood/flex6xxx.c b/rigs/kenwood/flex6xxx.c index 99f7d55ad..d9f961d3a 100644 --- a/rigs/kenwood/flex6xxx.c +++ b/rigs/kenwood/flex6xxx.c @@ -667,7 +667,7 @@ int powersdr_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) if (val.f > 1.0) { return -RIG_EINVAL; } ival = val.f * (120 - -20) - 20; - SNPRINTF(cmd, sizeof(cmd) - 1, "ZZAR%+04d", ival); + SNPRINTF(cmd, sizeof(cmd) - 1, "ZZAR%+03d", ival); break; case RIG_LEVEL_MICGAIN: @@ -1233,7 +1233,7 @@ const struct rig_caps powersdr_caps = RIG_MODEL(RIG_MODEL_POWERSDR), .model_name = "PowerSDR/Thetis", .mfg_name = "FlexRadio/ANAN", - .version = "20221123.0", + .version = "20230606.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, commit 21f0e560f771f39acbf9ea5276356fa78832c3d9 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Jun 6 09:44:25 2023 -0500 For Icom rigs when PASSBAND_NOCHANGE is requested do not change the filter setting https://github.com/Hamlib/Hamlib/issues/1309 diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index 0c6852c99..a44f193c8 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -2215,9 +2215,10 @@ int icom_set_mode_with_data(RIG *rig, vfo_t vfo, rmode_t mode, RETURNFUNC(retval); } - if (tmode == mode && ((width == RIG_PASSBAND_NOCHANGE) || (width == twidth))) + // do we really need/want to skip if width == twidth? + if ((width == RIG_PASSBAND_NOCHANGE) || (width == twidth)) { - rig_debug(RIG_DEBUG_TRACE, "%s: mode/width not changing\n", __func__); + rig_debug(RIG_DEBUG_TRACE, "%s: width not changing..keeping filter selection\n", __func__); RETURNFUNC(RIG_OK); } diff --git a/rigs/icom/icom.h b/rigs/icom/icom.h index a8e0aa699..ff260c7a5 100644 --- a/rigs/icom/icom.h +++ b/rigs/icom/icom.h @@ -35,7 +35,7 @@ #include <sys/time.h> #endif -#define BACKEND_VER "20230530" +#define BACKEND_VER "20230606" #define ICOM_IS_ID31 rig_is_model(rig, RIG_MODEL_ID31) #define ICOM_IS_ID51 rig_is_model(rig, RIG_MODEL_ID51) commit e8af3447aa62ec15ac363a9d706910513f29f0e8 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Jun 6 08:36:50 2023 -0500 Fix ft817.c build for MacOS and Pi https://github.com/Hamlib/Hamlib/issues/1308 diff --git a/rigs/yaesu/ft817.c b/rigs/yaesu/ft817.c index b2086c613..6cc77009c 100644 --- a/rigs/yaesu/ft817.c +++ b/rigs/yaesu/ft817.c @@ -1504,6 +1504,7 @@ static int ft817_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) case RIG_MODE_PKTLSB: case RIG_MODE_PSK: case RIG_MODE_PSKR: + { // first we get our dig mode to see if it needs changing unsigned char digmode[2]; int ret = ft817_read_eeprom(rig, 0x65, digmode); @@ -1561,6 +1562,7 @@ static int ft817_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) } return RIG_OK; + } case RIG_MODE_FM: index = FT817_NATIVE_CAT_SET_MODE_FM; commit 5276e25a92584b33a8fd27a44b10e7c4d915ab3a Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Jun 6 08:14:37 2023 -0500 FIx from Brian G8SEZ for FT817 get_mode And another fix for returning the correct mode hopefully for DIG modes https://github.com/Hamlib/Hamlib/issues/1308 diff --git a/rigs/yaesu/ft817.c b/rigs/yaesu/ft817.c index 832eb94e0..b2086c613 100644 --- a/rigs/yaesu/ft817.c +++ b/rigs/yaesu/ft817.c @@ -294,7 +294,7 @@ const struct rig_caps ft817_caps = RIG_MODEL(RIG_MODEL_FT817), .model_name = "FT-817", .mfg_name = "Yaesu", - .version = "20230605.0", + .version = "20230606.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -799,7 +799,7 @@ static int ft817_get_status(RIG *rig, int status) } /* Top 3 bit define the digi mode */ - p->dig_mode = dig_mode[0] >> 5; + p->dig_mode = dig_mode[1] >> 5; default: break; @@ -1475,7 +1475,7 @@ static int ft817_set_freq(RIG *rig, vfo_t vfo, freq_t freq) static int ft817_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) { int index; /* index of sequence to send */ - unsigned char data[YAESU_CMD_LENGTH - 1]; + unsigned char data[YAESU_CMD_LENGTH]; rig_debug(RIG_DEBUG_VERBOSE, "%s: generic mode = %s\n", __func__, rig_strrmode(mode)); @@ -1526,15 +1526,23 @@ static int ft817_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) memcpy(data, ncmd[FT817_NATIVE_CAT_EEPROM_WRITE].nseq, YAESU_CMD_LENGTH); - if (mode == RIG_MODE_RTTY) { data[0] = 0; } + data[0] = 0x00; + data[1] = 0x65; + + if (mode == RIG_MODE_RTTY) { data[2] = 0; } - if (mode == RIG_MODE_PSK) { data[0] = 1 << 5; } + if (mode == RIG_MODE_PSK) { data[2] = 1 << 5; } - if (mode == RIG_MODE_PSKR) { data[0] = 2 << 5; } + if (mode == RIG_MODE_PSKR) { data[2] = 2 << 5; } - if (mode == RIG_MODE_PKTLSB) { data[0] = 3 << 5; } + if (mode == RIG_MODE_PKTLSB) { data[2] = 3 << 5; } - if (mode == RIG_MODE_PKTUSB) { data[0] = 4 << 5; } + if (mode == RIG_MODE_PKTUSB) { data[2] = 4 << 5; } + + // data[3] should be the original value at address 0x66, + // i.e. "DCS INV" / digmode[1]. This is so we don't end + // up overwriting this setting by mistake. + data[3] = digmode[1]; index = FT817_NATIVE_CAT_SET_MODE_DIG; ret = ft817_send_cmd(rig, index); @@ -1553,7 +1561,6 @@ static int ft817_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) } return RIG_OK; - break; case RIG_MODE_FM: index = FT817_NATIVE_CAT_SET_MODE_FM; commit acc42665efb051707bc7380ae812f0afcdf665a4 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon Jun 5 08:34:59 2023 -0500 Allow FT817 to write to EEPROM for set_mode Should not cause too much wear on the EEPROM https://github.com/Hamlib/Hamlib/issues/1308 diff --git a/rigs/yaesu/ft817.c b/rigs/yaesu/ft817.c index 17c86bb1a..832eb94e0 100644 --- a/rigs/yaesu/ft817.c +++ b/rigs/yaesu/ft817.c @@ -100,6 +100,7 @@ enum ft817_native_cmd_e FT817_NATIVE_CAT_PWR_ON, FT817_NATIVE_CAT_PWR_OFF, FT817_NATIVE_CAT_EEPROM_READ, + FT817_NATIVE_CAT_EEPROM_WRITE, FT817_NATIVE_CAT_GET_TX_METERING, FT817_NATIVE_SIZE /* end marker */ }; @@ -209,6 +210,7 @@ static const yaesu_cmd_set_t ncmd[] = { 1, { 0x00, 0x00, 0x00, 0x00, 0x0f } }, /* pwr on */ { 1, { 0x00, 0x00, 0x00, 0x00, 0x8f } }, /* pwr off */ { 0, { 0x00, 0x00, 0x00, 0x00, 0xbb } }, /* eeprom read */ + { 0, { 0x00, 0x00, 0x00, 0x00, 0xbc } }, /* eeprom write */ { 1, { 0x00, 0x00, 0x00, 0x00, 0xbd } }, /* get TX metering levels (PWR, SWR, MOD, ALC) */ }; @@ -292,7 +294,7 @@ const struct rig_caps ft817_caps = RIG_MODEL(RIG_MODEL_FT817), .model_name = "FT-817", .mfg_name = "Yaesu", - .version = "20230604.0", + .version = "20230605.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -788,16 +790,16 @@ static int ft817_get_status(RIG *rig, int status) * getting the frequency. */ switch (p->fm_status[4] & 0x7f) { - unsigned char dig_mode; + unsigned char dig_mode[2]; case 0x0a: - if ((n = ft817_read_eeprom(rig, 0x0065, &dig_mode)) < 0) + if ((n = ft817_read_eeprom(rig, 0x0065, dig_mode)) < 0) { return n; } /* Top 3 bit define the digi mode */ - p->dig_mode = dig_mode >> 5; + p->dig_mode = dig_mode[0] >> 5; default: break; @@ -986,17 +988,17 @@ static int ft817_get_split_vfo(RIG *rig, vfo_t vfo, split_t *split, if (ptt == RIG_PTT_OFF) { // TX status not valid when in RX - unsigned char c; + unsigned char c[2]; /* Get split status from EEPROM */ - n = ft817_read_eeprom(rig, 0x7a, &c); + n = ft817_read_eeprom(rig, 0x7a, c); if (n != RIG_OK) { return n; } - *split = (c & 0x80) ? RIG_SPLIT_ON : RIG_SPLIT_OFF; + *split = (c[0] & 0x80) ? RIG_SPLIT_ON : RIG_SPLIT_OFF; } else { @@ -1204,10 +1206,10 @@ static int ft818_817_get_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t *option, /* The FT818/817 has no RIG_TARGETABLE_ALL * so rig.c switched the active VFO to the one requested */ int ret; - unsigned char eeprom_band, eeprom_ant; + unsigned char eeprom_band[2], eeprom_ant[2]; /* Read eeprom for current 'band' for both VFO's */ - ret = ft817_read_eeprom(rig, 0x59, &eeprom_band); + ret = ft817_read_eeprom(rig, 0x59, eeprom_band); if (ret != RIG_OK) { @@ -1217,7 +1219,7 @@ static int ft818_817_get_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t *option, /* Read eeprom for antenna selection per band. * The FT818/817 stores antenna per band not per VFO! * So changing antenna will change for both VFO's */ - ret = ft817_read_eeprom(rig, 0x7A, &eeprom_ant); + ret = ft817_read_eeprom(rig, 0x7A, eeprom_ant); if (ret != RIG_OK) { @@ -1234,11 +1236,11 @@ static int ft818_817_get_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t *option, switch (vfo) { case RIG_VFO_A: - eeprom_band &= 0xF; + eeprom_band[0] &= 0xF; break; case RIG_VFO_B: - eeprom_band = eeprom_band >> 4; + eeprom_band[0] = eeprom_band[0] >> 4; break; default: @@ -1255,9 +1257,9 @@ static int ft818_817_get_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t *option, * So to make the code simple: if we have a 817 and 2 or higher band then * add 1 to the value to align it on the 818 mapping. */ - if (is817 && eeprom_band >= 2) + if (is817 && eeprom_band[0] >= 2) { - eeprom_band++; + eeprom_band[0]++; } /* The 817/818 does not have a antenna selection per VFO but per band. @@ -1266,7 +1268,7 @@ static int ft818_817_get_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t *option, */ - switch (eeprom_band) + switch (eeprom_band[0]) { case 0: /* 160M */ case 1: /* 80M */ @@ -1279,37 +1281,37 @@ static int ft818_817_get_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t *option, case 8: /* 12M */ case 9: /* 10M */ /* All HF use the same antenna setting, bit 0 */ - eeprom_ant &= 1 << 0; + eeprom_ant[0] &= 1 << 0; break; case 0xA: /* 6m, bit 1 */ - eeprom_ant &= 1 << 1; + eeprom_ant[0] &= 1 << 1; break; case 0xB: /* FM BCB 76Mhz - 108Mhz, bit 2 */ - eeprom_ant &= 1 << 2; + eeprom_ant[0] &= 1 << 2; break; case 0xC: /* Airband, bit 3 */ - eeprom_ant &= 1 << 3; + eeprom_ant[0] &= 1 << 3; break; case 0xD: /* 2M, bit 4 */ - eeprom_ant &= 1 << 4; + eeprom_ant[0] &= 1 << 4; break; case 0xE: /* 70cm / UHF, bit 5 */ - eeprom_ant &= 1 << 5; + eeprom_ant[0] &= 1 << 5; break; case 0xF: /* Free-tuning?, bit 6 */ - eeprom_ant &= 1 << 6; + eeprom_ant[0] &= 1 << 6; break; } /* We have no split TX/RX capability per VFO. * So only set ant_curr and leave rx/tx set to unknown. */ - *ant_curr = eeprom_ant ? FT817_ANT_REAR : FT817_ANT_FRONT; + *ant_curr = eeprom_ant[0] ? FT817_ANT_REAR : FT817_ANT_FRONT; return RIG_OK; } @@ -1403,16 +1405,16 @@ static int ft817_send_icmd(RIG *rig, int index, unsigned char *data) /* ---------------------------------------------------------------------- */ static int ft817_get_vfo(RIG *rig, vfo_t *vfo) { - unsigned char c; + unsigned char c[2]; rig_debug(RIG_DEBUG_VERBOSE, "%s: called \n", __func__); - if (ft817_read_eeprom(rig, 0x55, &c) < 0) /* get vfo status */ + if (ft817_read_eeprom(rig, 0x55, c) < 0) /* get vfo status */ { return -RIG_EPROTO; } - if ((c & 0x1) == 0) + if ((c[0] & 0x1) == 0) { *vfo = RIG_VFO_A; } @@ -1473,6 +1475,7 @@ static int ft817_set_freq(RIG *rig, vfo_t vfo, freq_t freq) static int ft817_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) { int index; /* index of sequence to send */ + unsigned char data[YAESU_CMD_LENGTH - 1]; rig_debug(RIG_DEBUG_VERBOSE, "%s: generic mode = %s\n", __func__, rig_strrmode(mode)); @@ -1499,8 +1502,57 @@ static int ft817_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) case RIG_MODE_RTTY: case RIG_MODE_PKTUSB: case RIG_MODE_PKTLSB: - /* user has to have correct DIG mode setup on rig */ + case RIG_MODE_PSK: + case RIG_MODE_PSKR: + // first we get our dig mode to see if it needs changing + unsigned char digmode[2]; + int ret = ft817_read_eeprom(rig, 0x65, digmode); + + if (ret != RIG_OK) + { + return ret; + } + + rig_debug(RIG_DEBUG_VERBOSE, "%s: digmode=0x%02x%02x\n", __func__, digmode[0], + digmode[1]); + digmode[0] = digmode[0] >> 5; // shift 5 bits + + // check if we're already in the mode and return if so + if (digmode[0] == 0x00 && mode == RIG_MODE_RTTY) { return RIG_OK; } + else if (digmode[0] == 0x01 && mode == RIG_MODE_PSKR) { return RIG_OK; } + else if (digmode[0] == 0x02 && mode == RIG_MODE_PSK) { return RIG_OK; } + else if (digmode[0] == 0x03 && mode == RIG_MODE_PKTLSB) { return RIG_OK; } + else if (digmode[0] == 0x04 && mode == RIG_MODE_PKTUSB) { return RIG_OK; } + + memcpy(data, ncmd[FT817_NATIVE_CAT_EEPROM_WRITE].nseq, YAESU_CMD_LENGTH); + + if (mode == RIG_MODE_RTTY) { data[0] = 0; } + + if (mode == RIG_MODE_PSK) { data[0] = 1 << 5; } + + if (mode == RIG_MODE_PSKR) { data[0] = 2 << 5; } + + if (mode == RIG_MODE_PKTLSB) { data[0] = 3 << 5; } + + if (mode == RIG_MODE_PKTUSB) { data[0] = 4 << 5; } + index = FT817_NATIVE_CAT_SET_MODE_DIG; + ret = ft817_send_cmd(rig, index); + + if (ret != RIG_OK) + { + rig_debug(RIG_DEBUG_ERR, "%s: ft817_send_cmd: %s\n", __func__, rigerror(ret)); + } + + index = FT817_NATIVE_CAT_EEPROM_WRITE; + ret = ft817_send_icmd(rig, index, data); + + if (ret != RIG_OK) + { + rig_debug(RIG_DEBUG_ERR, "%s: ft817_send_icmd: %s\n", __func__, rigerror(ret)); + } + + return RIG_OK; break; case RIG_MODE_FM: commit 55cbf80719a3b6972731ad9d85c725f0998a4e11 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Jun 4 17:44:31 2023 -0500 Fix compile warning in rig.c diff --git a/src/rig.c b/src/rig.c index 6af805c4b..9efd81c34 100644 --- a/src/rig.c +++ b/src/rig.c @@ -669,7 +669,7 @@ RIG *HAMLIB_API rig_init(rig_model_t rig_model) //return(NULL); // this is not fatal } - if (rs->level_gran) + //if (rs->level_gran) { memcpy(rs->level_gran, rig->caps->level_gran, sizeof(rs->level_gran)); } commit 4e4d8e39d825412a8a5f46e6785f6eb465df2752 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Jun 4 17:43:33 2023 -0500 Fix sleep.c function diff --git a/src/sleep.c b/src/sleep.c index 810d76edf..e7f5192ba 100644 --- a/src/sleep.c +++ b/src/sleep.c @@ -56,8 +56,8 @@ int hl_usleep(rig_useconds_t usec) double delay = sleep_time; double lasterr = 0; - if (sleep_time > .001) { sleep_time -= .001; } - else if (sleep_time > .0001) { sleep_time -= .0005; } + if (sleep_time > .001) { delay -= .0001; } + else if (sleep_time > .0001) { delay -= .00005; } tv1.tv_sec = (time_t) delay; tv1.tv_nsec = (long)((delay - tv1.tv_sec) * 1e+9); commit eb97c7c107f550e01a63d01a7ec138e9aaa4ca89 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Jun 4 15:56:01 2023 -0500 Change anytone.c to use bluetooth protocol Update some things to keep debug quiet during thread operations in anytone.c diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index c6666adae..0dd9d648d 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -2681,6 +2681,136 @@ struct rig_state { int spectrum_attenuator[HAMLIB_MAXDBLSTSIZ]; /*!< Spectrum attenuator list in dB, 0 terminated */ }; +/** + * \brief Deprecated Rig state containing live data and customized fields. + * Due to DLL problems this remains in-place in the rig_caps structure but is no longer referred to + * A new rig_state has been added at the end of the structure instead of the middle + * + * This struct contains no data and is just a place holder for DLL alignment + * + * It is NOT fine to touch this struct AT ALL!!! + */ +struct rig_state_deprecated { + /********* DO NOT MODIFY OR REMOVE THIS STRUCTURE -- IT IS FOREVER DEPRECATED *********/ + /* + * overridable fields + */ + // moving the hamlib_port_t to the end of rig_state and making it a pointer + // this should allow changes to hamlib_port_t without breaking shared libraries + // these will maintain a copy of the new port_t for backwards compatibility + // to these offsets -- note these must stay until a major version update is done like 5.0 + hamlib_port_t_deprecated rigport_deprecated; /*!< Rig port (internal use). */ + hamlib_port_t_deprecated pttport_deprecated; /*!< PTT port (internal use). */ + hamlib_port_t_deprecated dcdport_deprecated; /*!< DCD port (internal use). */ + + double vfo_comp; /*!< VFO compensation in PPM, 0.0 to disable */ + + int deprecated_itu_region; /*!< ITU region to select among freq_range_t */ + freq_range_t rx_range_list[HAMLIB_FRQRANGESIZ]; /*!< Receive frequency range list */ + freq_range_t tx_range_list[HAMLIB_FRQRANGESIZ]; /*!< Transmit frequency range list */ + + struct tuning_step_list tuning_steps[HAMLIB_TSLSTSIZ]; /*!< Tuning step list */ + + struct filter_list filters[HAMLIB_FLTLSTSIZ]; /*!< Mode/filter table, at -6dB */ + + cal_table_t str_cal; /*!< S-meter calibration table */ + + chan_t chan_list[HAMLIB_CHANLSTSIZ]; /*!< Channel list, zero ended */ + + shortfreq_t max_rit; /*!< max absolute RIT */ + shortfreq_t max_xit; /*!< max absolute XIT */ + shortfreq_t max_ifshift; /*!< max absolute IF-SHIFT */ + + ann_t announces; /*!< Announces bit field list */ + + int preamp[HAMLIB_MAXDBLSTSIZ]; /*!< Preamp list in dB, 0 terminated */ + int attenuator[HAMLIB_MAXDBLSTSIZ]; /*!< Preamp list in dB, 0 terminated */ + + setting_t has_get_func; /*!< List of get functions */ + setting_t has_set_func; /*!< List of set functions */ + setting_t has_get_level; /*!< List of get level */ + setting_t has_set_level; /*!< List of set level */ + setting_t has_get_parm; /*!< List of get parm */ + setting_t has_set_parm; /*!< List of set parm */ + + gran_t level_gran[RIG_SETTING_MAX]; /*!< level granularity */ + gran_t parm_gran[RIG_SETTING_MAX]; /*!< parm granularity */ + + + /* + * non overridable fields, internal use + */ + + int transaction_active; /*!< set to 1 to inform the async reader thread that a synchronous command transaction is waiting for a response, otherwise 0 */ + vfo_t current_vfo; /*!< VFO currently set */ + int vfo_list; /*!< Complete list of VFO for this rig */ + int comm_state; /*!< Comm port state, opened/closed. */ + rig_ptr_t priv; /*!< Pointer to private rig state data. */ + rig_ptr_t obj; /*!< Internal use by hamlib++ for event handling. */ + + int async_data_enabled; /*!< Whether async data mode is enabled */ + int poll_interval; /*!< Rig state polling period in milliseconds */ + freq_t current_freq; /*!< Frequency currently set */ + rmode_t current_mode; /*!< Mode currently set */ + //rmode_t current_modeB; /*!< Mode currently set VFOB */ + pbwidth_t current_width; /*!< Passband width currently set */ + vfo_t tx_vfo; /*!< Tx VFO currently set */ + rmode_t mode_list; /*!< Complete list of modes for this rig */ + // mode_list is used by some + // so anything added to this structure must be below here + int transmit; /*!< rig should be transmitting i.e. hard + wired PTT asserted - used by rigs that + don't do CAT while in Tx */ + freq_t lo_freq; /*!< Local oscillator frequency of any transverter */ + time_t twiddle_time; /*!< time when vfo twiddling was detected */ + int twiddle_timeout; /*!< timeout to resume from twiddling */ + // uplink allows gpredict to behave better by no reading the uplink VFO + int uplink; /*!< uplink=1 will not read Sub, uplink=2 will not read Main */ + struct rig_cache cache; + int vfo_opt; /*!< Is -o switch turned on? */ + int auto_power_on; /*!< Allow Hamlib to power on rig + automatically if supported */ + int auto_power_off; /*!< Allow Hamlib to power off rig + automatically if supported */ + int auto_disable_screensaver; /*!< Allow Hamlib to disable the + rig's screen saver automatically if + supported */ + int ptt_share; /*!< Share ptt port by open/close during get_ptt, set_ptt hogs the port while active */ + int power_now; /*!< Current RF power level in rig units */ + int power_min; /*!< Minimum RF power level in rig units */ + int power_max; /*!< Maximum RF power level in rig units */ + unsigned char disable_yaesu_bandselect; /*!< Disables Yaesu band select logic */ + int twiddle_rit; /*!< Suppresses VFOB reading (cached value used) so RIT control can be used */ + int twiddle_state; /*!< keeps track of twiddle status */ + vfo_t rx_vfo; /*!< Rx VFO currently set */ + + volatile unsigned int snapshot_packet_sequence_number; + + volatile int multicast_publisher_run; + void *multicast_publisher_priv_data; + volatile int async_data_handler_thread_run; + void *async_data_handler_priv_data; + volatile int poll_routine_thread_run; + void *poll_routine_priv_data; + pthread_mutex_t mutex_set_transaction; + hamlib_port_t rigport; /*!< Rig port (internal use). */ + hamlib_port_t pttport; /*!< PTT port (internal use). */ + hamlib_port_t dcdport; /*!< DCD port (internal use). */ + /********* DO NOT ADD or CHANGE anything (or than to rename) ABOVE THIS LINE *********/ + /********* ENSURE ANY NEW ITEMS ARE ADDED AFTER HERE *********/ + /* flags instructing the rig_get routines to use cached values when asyncio is in use */ + int use_cached_freq; /*!< flag instructing rig_get_freq to use cached values when asyncio is in use */ + int use_cached_mode; /*!< flag instructing rig_get_mode to use cached values when asyncio is in use */ + int use_cached_ptt; /*!< flag instructing rig_get_ptt to use cached values when asyncio is in use */ + int depth; /*!< a depth counter to use for debug indentation and such */ + int lock_mode; /*!< flag that prevents mode changes if ~= 0 -- see set/get_lock_mode */ + powerstat_t powerstat; /*!< power status */ + char *tuner_control_pathname; /*!< Path to external tuner control program that get 0/1 (Off/On) argument */ + char client_version[32]; /*!<! Allow client to report version for compatibility checks/capability */ + freq_t offset_vfoa; /*!< Offset to apply to VFOA/Main set_freq */ + freq_t offset_vfob; /*!< Offset to apply to VFOB/Sub set_freq */ +}; + //! @cond Doxygen_Suppress typedef int (*vprintf_cb_t)(enum rig_debug_level_e, rig_ptr_t, @@ -2750,8 +2880,10 @@ struct rig_callbacks { */ struct s_rig { struct rig_caps *caps; /*!< Pointer to rig capabilities (read only) */ - struct rig_state state; /*!< Rig state */ + // Do not remove the deprecated structure -- it will mess up DLL backwards compatibility + struct rig_state_deprecated state_deprecated; /*!< Deprecated Rig state */ struct rig_callbacks callbacks; /*!< registered event callbacks */ + struct rig_state state; /*!< Rig state */ }; @@ -3377,6 +3509,9 @@ rig_idx2setting(int i); extern HAMLIB_EXPORT(void) rig_set_debug HAMLIB_PARAMS((enum rig_debug_level_e debug_level)); +extern HAMLIB_EXPORT(void) +rig_get_debug HAMLIB_PARAMS((enum rig_debug_level_e *debug_level)); + extern HAMLIB_EXPORT(void) rig_set_debug_time_stamp HAMLIB_PARAMS((int flag)); diff --git a/rigs/anytone/anytone.c b/rigs/anytone/anytone.c index 0a8807249..43298c2f5 100644 --- a/rigs/anytone/anytone.c +++ b/rigs/anytone/anytone.c @@ -120,18 +120,28 @@ void *anytone_thread(void *vrig) rig_debug(RIG_DEBUG_TRACE, "%s: anytone_thread started\n", __func__); p->runflag = 1; - // if we don't have CACHE debug enabled then we only show WARN and higher for this rig - if (rig_need_debug(RIG_DEBUG_CACHE) == 0) - { - rig_set_debug(RIG_DEBUG_WARN); // only show WARN debug otherwise too verbose - } - while (p->runflag) { - char c = 0x06; +// char c [] = { 0x2b, 0x41, 0x44, 0x41, 0x54, 0x41, 0x3a, 0x30, 0x30, 0x2c, 0x30, 0x30, 0x31, 0x0d, 0x0a, 0x61, 0x0d, 0x0a }; + char *c = "+ADATA:00,001\r\na\r\n"; MUTEX_LOCK(p->priv.mutex); - write_block(&rig->state.rigport, (unsigned char *)&c, 1); + // if we don't have CACHE debug enabled then we only show WARN and higher for this rig + enum rig_debug_level_e debug_level_save; + rig_get_debug(&debug_level_save); + + if (rig_need_debug(RIG_DEBUG_CACHE) == 0) + { + rig_set_debug(RIG_DEBUG_WARN); // only show WARN debug otherwise too verbose + } + + write_block(&rig->state.rigport, (unsigned char *)c, strlen(c)); hl_usleep(100 * 1000); + + if (rig_need_debug(RIG_DEBUG_CACHE) == 0) + { + rig_set_debug(debug_level_save); + } + rig_flush(&rig->state.rigport); MUTEX_UNLOCK(p->priv.mutex); hl_usleep(1000 * 1000); // 1-second loop @@ -246,7 +256,7 @@ int anytone_init(RIG *rig) rig->state.priv = p; p->vfo_curr = RIG_VFO_NONE; #ifdef HAVE_PTHREAD -// pthread_mutex_init(&p->mutex, NULL); + pthread_mutex_init(&p->mutex, NULL); #endif } @@ -301,8 +311,8 @@ int anytone_open(RIG *rig) // can we ask for any information? Maybe just toggle A/B? } -#if 0 pthread_t id; + // will start the keep alive int err = pthread_create(&id, NULL, anytone_thread, (void *)rig); if (err) @@ -311,7 +321,12 @@ int anytone_open(RIG *rig) strerror(errno)); RETURNFUNC(-RIG_EINTERNAL); } -#endif + + hl_usleep(500 * 1000); + char *cmd = "+ADATA:00,016\r\n"; + + anytone_transaction(rig, cmd, strlen(cmd), 21); + RETURNFUNC(retval); } @@ -324,6 +339,8 @@ int anytone_close(RIG *rig) int retval = RIG_OK; ENTERFUNC; + char *cmd = "+ADATA:00,000\r\n"; + anytone_transaction(rig, cmd, strlen(cmd), 0); RETURNFUNC(retval); } @@ -452,12 +469,13 @@ int anytone_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) } else { - char buf[8] = { 0x41, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x06 }; + //char buf[8] = { 0x41, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x06 }; + char *cmd = "+ADATA:00,001\r\na\r\n"; - if (!ptt) { buf[1] = 0x01; } + if (!ptt) { cmd = "+ADATA:00,023\r\nV\r\n"; } MUTEX_LOCK(p->mutex); - anytone_transaction(rig, buf, 8, 1); + anytone_transaction(rig, cmd, strlen(cmd), 1); anytone_priv_data_t *p = rig->state.priv; p->ptt = ptt; MUTEX_UNLOCK(p->mutex); @@ -466,6 +484,50 @@ int anytone_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) RETURNFUNC(retval); } +int anytone_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) +{ + char cmd[32]; + + if (vfo == RIG_VFO_A) + { + SNPRINTF(cmd, sizeof(cmd), "+ADATA:00,119\r\n"); + cmd[15] = 0x04; + cmd[16] = 0x2c; + cmd[17] = 0x07; + cmd[18] = 0x00; + cmd[19] = 0x00; + cmd[21] = 0x00; + cmd[22] = 0x00; + cmd[23] = 0x0d; + cmd[24] = 0x0a; + } + else + { + SNPRINTF(cmd, sizeof(cmd), "+ADATA:00,006\r\n"); + cmd[15] = 0x04; + cmd[16] = 0x2d; + cmd[17] = 0x07; + cmd[18] = 0x00; + cmd[19] = 0x00; + cmd[21] = 0x00; + cmd[22] = 0x00; + cmd[23] = 0x0d; + cmd[24] = 0x0a; + } + + write_block(&rig->state.rigport, (unsigned char *)cmd, 25); + unsigned char buf[64]; + int retval = read_block(&rig->state.rigport, buf, 135); + + if (retval == 135) + { + *freq = buf[17] * 10e7 + buf[18] * 10e5 + buf[19] * 10e3 + buf[20] * 10e1; + retval = RIG_OK; + } + + return RIG_OK; +} + // --------------------------------------------------------------------------- // END OF FILE // --------------------------------------------------------------------------- diff --git a/rigs/anytone/anytone.h b/rigs/anytone/anytone.h index c3c39353f..1b1c6d0c4 100644 --- a/rigs/anytone/anytone.h +++ b/rigs/anytone/anytone.h @@ -42,4 +42,6 @@ extern int anytone_get_ptt(RIG *rig, vfo_t vfo,ptt_t *ptt); extern int anytone_set_vfo(RIG *rig, vfo_t vfo); extern int anytone_get_vfo(RIG *rig, vfo_t *vfo); +extern int anytone_get_freq(RIG *rig, vfo_t vfo, freq_t *freq); + #endif /* _ANYTONE_H */ diff --git a/rigs/anytone/d578.c b/rigs/anytone/d578.c index f6d56dd37..e16cbb3d4 100644 --- a/rigs/anytone/d578.c +++ b/rigs/anytone/d578.c @@ -84,6 +84,8 @@ const struct rig_caps anytone_d578_caps = .get_ptt = anytone_get_ptt, .set_ptt = anytone_set_ptt, + .get_freq = anytone_get_freq, + .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS }; diff --git a/simulators/simatd578.c b/simulators/simatd578.c index 82b07a027..d04296a4a 100644 --- a/simulators/simatd578.c +++ b/simulators/simatd578.c @@ -36,22 +36,23 @@ getmyline(int fd, unsigned char *buf) int n = 0; memset(buf, 0, BUFSIZE); - // seemd the anytone only gives 8-byte commands and 1-byte responses - while (i < 8 && read(fd, &c, 1) > 0) + // seems the anytone only gives 8-byte commands and 1-byte responses + do { - if (i == 0 && c == 0x06) - { - write(fd, &c, 1); - } - else + int bytes = read(fd, &c, 1); + if (bytes > 0) { buf[i++] = c; - n++; } + n++; } + while (c != 0x0a); + + printf("n=%d \n", n); + + for (i = 0; i < n; ++i) { printf("%02x ", buf[i]); } - printf("n=%d %02x %02x %02x %02x %02x %02x %02x %02x\n", n, buf[0], buf[1], - buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); + printf("\n"); return n; } diff --git a/src/debug.c b/src/debug.c index ae7420fca..693b7c92c 100644 --- a/src/debug.c +++ b/src/debug.c @@ -149,6 +149,19 @@ void HAMLIB_API rig_set_debug(enum rig_debug_level_e debug_level) rig_debug_level = debug_level; } +/** + * \brief Get the current debug level. + * + * \param debug_level Equivalent to the `-v` option of the utilities. + * + * Allows for obtaining the current debug level + * + */ +void HAMLIB_API rig_get_debug(enum rig_debug_level_e *debug_level) +{ + *debug_level = rig_debug_level; +} + /** * \brief Test if a given debug level is active. diff --git a/src/misc.c b/src/misc.c index 8a3b1c4ee..5180143c3 100644 --- a/src/misc.c +++ b/src/misc.c @@ -2188,8 +2188,8 @@ int HAMLIB_API rig_flush_force(hamlib_port_t *port, int flush_async_data) } #ifndef RIG_FLUSH_REMOVE - rig_debug(RIG_DEBUG_TRACE, "%s: called for %s device\n", __func__, - port->type.rig == RIG_PORT_SERIAL ? "serial" : "network"); +// rig_debug(RIG_DEBUG_TRACE, "%s: called for %s device\n", __func__, +// port->type.rig == RIG_PORT_SERIAL ? "serial" : "network"); if (port->type.rig == RIG_PORT_NETWORK || port->type.rig == RIG_PORT_UDP_NETWORK) diff --git a/src/serial.c b/src/serial.c index 4ce4baba0..eae1ac7ea 100644 --- a/src/serial.c +++ b/src/serial.c @@ -799,7 +799,7 @@ int HAMLIB_API serial_flush(hamlib_port_t *p) p->timeout = timeout_save; p->timeout_retry = timeout_retry_save; - rig_debug(RIG_DEBUG_VERBOSE, "tcflush%s\n", ""); +// rig_debug(RIG_DEBUG_VERBOSE, "tcflush%s\n", ""); // we also do this flush https://github.com/Hamlib/Hamlib/issues/1241 tcflush(p->fd,TCIFLUSH); commit e1e570d19a944bd8918ad085b904ba6ffa7733ef Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Jun 4 07:56:10 2023 -0500 Add documentaion for FT-817 diff --git a/rigs/yaesu/FT-817CAT.pdf b/rigs/yaesu/FT-817CAT.pdf new file mode 100755 index 000000000..76058cb31 Binary files /dev/null and b/rigs/yaesu/FT-817CAT.pdf differ diff --git a/rigs/yaesu/FT-817MemoryMap.pdf b/rigs/yaesu/FT-817MemoryMap.pdf new file mode 100755 index 000000000..47ec3f023 Binary files /dev/null and b/rigs/yaesu/FT-817MemoryMap.pdf differ commit 48b01aa3ffb677e529e73cc8b4fe8783d9106c27 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Jun 4 07:18:00 2023 -0500 Add RIG_MODE_PKTLSB to FT817 even though it must be switched using Menu 26 Add a warning message to notify the user https://github.com/Hamlib/Hamlib/issues/1308 diff --git a/rigs/yaesu/ft817.c b/rigs/yaesu/ft817.c index e30d4268a..17c86bb1a 100644 --- a/rigs/yaesu/ft817.c +++ b/rigs/yaesu/ft817.c @@ -292,7 +292,7 @@ const struct rig_caps ft817_caps = RIG_MODEL(RIG_MODEL_FT817), .model_name = "FT-817", .mfg_name = "Yaesu", - .version = "20230429.1", + .version = "20230604.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -1498,6 +1498,7 @@ static int ft817_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) case RIG_MODE_RTTY: case RIG_MODE_PKTUSB: + case RIG_MODE_PKTLSB: /* user has to have correct DIG mode setup on rig */ index = FT817_NATIVE_CAT_SET_MODE_DIG; break; diff --git a/src/rig.c b/src/rig.c index ed7074c92..6af805c4b 100644 --- a/src/rig.c +++ b/src/rig.c @@ -2420,6 +2420,10 @@ int HAMLIB_API rig_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) retcode = caps->set_mode(rig, vfo, mode, width); rig_debug(RIG_DEBUG_TRACE, "%s: targetable retcode after set_mode(%s)=%d\n", __func__, rig_strrmode(mode), retcode); + if (rig->caps->rig_model == RIG_MODEL_FT817) + { + rig_debug(RIG_DEBUG_WARN, "%s: FT817 must use Menu 26 to switch between upper/lower sideband, Hamlib only sets DIG mode\n", __func__); + } } else { commit a6de41e206d8d8fa2bab59069d052d9953b5e757 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Jun 3 16:50:30 2023 -0500 rigctld can now see RIG_LEVEL values correctly https://github.com/Hamlib/Hamlib/issues/1305 diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 424f404e0..c6666adae 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -2630,6 +2630,55 @@ struct rig_state { freq_t offset_vfoa; /*!< Offset to apply to VFOA/Main set_freq */ freq_t offset_vfob; /*!< Offset to apply to VFOB/Sub set_freq */ struct multicast_s *multicast; /*!< Pointer to multicast server data */ + // Adding a number of items so netrigctl can see the real rig information + // Eventually may want to add these so that rigctld can see more of the backend + // But that will come later if requested -- for now they just fill out dumpstate.c + rig_model_t rig_model; /*!< Rig model. */ + const char *model_name; /*!< Model name. */ + const char *mfg_name; /*!< Manufacturer. */ + const char *version; /*!< Driver version. */ + const char *copyright; /*!< Copyright info. */ + enum rig_status_e status; /*!< Driver status. */ + int rig_type; /*!< Rig type. */ + ptt_type_t ptt_type; /*!< Type of the PTT port. */ + dcd_type_t dcd_type; /*!< Type of the DCD port. */ + rig_port_t port_type; /*!< Type of communication port. */ + int serial_rate_min; /*!< Minimum serial speed. */ + int serial_rate_max; /*!< Maximum serial speed. */ + int serial_data_bits; /*!< Number of data bits. */ + int serial_stop_bits; /*!< Number of stop bits. */ + enum serial_parity_e serial_parity; /*!< Parity. */ + enum serial_handshake_e serial_handshake; /*!< Handshake. */ + int write_delay; /*!< Delay between each byte sent out, in mS */ + int post_write_delay; /*!< Delay between each commands send out, in mS */ + int timeout; /*!< Timeout, in mS */ + int retry; /*!< Maximum number of retries if command fails, 0 to disable */ + int targetable_vfo; /*!< Bit field list of direct VFO access commands */ + int async_data_supported; /*!< Indicates that rig is capable of outputting asynchronous data updates, such as transceive state updates or spectrum data. 1 if true, 0 otherwise. */ + int agc_level_count; /*!< Number of supported AGC levels. Zero indicates all modes should be available (for backwards-compatibility). */ + enum agc_level_e agc_levels[HAMLIB_MAX_AGC_LEVELS]; /*!< Supported AGC levels */ + tone_t *ctcss_list; /*!< CTCSS tones list, zero ended */ + tone_t *dcs_list; /*!< DCS code list, zero ended */ + vfo_op_t vfo_ops; /*!< VFO op bit field list */ + scan_t scan_ops; /*!< Scan bit field list */ + int transceive; /*!< \deprecated Use async_data_supported instead */ + int bank_qty; /*!< Number of banks */ + int chan_desc_sz; /*!< Max length of memory channel name */ + freq_range_t rx_range_list1[HAMLIB_FRQRANGESIZ]; /*!< Receive frequency range list #1 */ + freq_range_t tx_range_list1[HAMLIB_FRQRANGESIZ]; /*!< Transmit frequency range list #1 */ + freq_range_t rx_range_list2[HAMLIB_FRQRANGESIZ]; /*!< Receive frequency range list #2 */ + freq_range_t tx_range_list2[HAMLIB_FRQRANGESIZ]; /*!< Transmit frequency range list #2 */ + freq_range_t rx_range_list3[HAMLIB_FRQRANGESIZ]; /*!< Receive frequency range list #3 */ + freq_range_t tx_range_list3[HAMLIB_FRQRANGESIZ]; /*!< Transmit frequency range list #3 */ + freq_range_t rx_range_list4[HAMLIB_FRQRANGESIZ]; /*!< Receive frequency range list #4 */ + freq_range_t tx_range_list4[HAMLIB_FRQRANGESIZ]; /*!< Transmit frequency range list #4 */ + freq_range_t rx_range_list5[HAMLIB_FRQRANGESIZ]; /*!< Receive frequency range list #5 */ + freq_range_t tx_range_list5[HAMLIB_FRQRANGESIZ]; /*!< Transmit frequency range list #5 */ + struct rig_spectrum_scope spectrum_scopes[HAMLIB_MAX_SPECTRUM_SCOPES]; /*!< Supported spectrum scopes. The array index must match the scope ID. Last entry must have NULL name. */ + enum rig_spectrum_mode_e spectrum_modes[HAMLIB_MAX_SPECTRUM_MODES]; /*!< Supported spectrum scope modes.... [truncated message content] |
From: n0nb <n0...@us...> - 2023-05-29 11:42:13
|
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 07a9f321b4a3a337df306b4b6184435040174eae (commit) from f37c24d0525dd81449c854183c256b335f123991 (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 07a9f321b4a3a337df306b4b6184435040174eae Author: Mike Black W9MDB <mdb...@ya...> Date: Sun May 28 16:38:27 2023 -0500 Fix anytone set/get VFO https://github.com/Hamlib/Hamlib/issues/1303 diff --git a/rigs/anytone/anytone.c b/rigs/anytone/anytone.c index b91dcd651..1aed8db46 100644 --- a/rigs/anytone/anytone.c +++ b/rigs/anytone/anytone.c @@ -93,13 +93,6 @@ DECLARE_PROBERIG_BACKEND(anytone) memset(acBuf, 0, ANYTONE_RESPSZ + 1); -#if 0 - retval = write_block(port, - (unsigned char *)ADAT_CMD_DEF_STRING_GET_ID_CODE, - strlen(ADAT_CMD_DEF_STRING_GET_ID_CODE)); - nRead = read_string(port, (unsigned char *) acBuf, ANYTONE_RESPSZ, - ADAT_EOM, 1, 0, 1); -#endif close(port->fd); if ((retval != RIG_OK || nRead < 0)) @@ -205,12 +198,14 @@ int anytone_transaction(RIG *rig, char *cmd, int cmd_len, int expected_len) if (retval == RIG_OK && expected_len != 0) { - char buf[16]; - anytone_receive(rig, buf, sizeof(buf), 1); - if (buf[0] == 0xaa && buf[1] == 0x53) + char *buf = calloc(64,1); + int len = anytone_receive(rig, buf, 64, expected_len); + rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): rx len=%d\n", __func__, __LINE__, len); + if ( len == 16 && buf[0] == 0xaa && buf[1] == 0x53) { p->vfo_curr = buf[8] == 0x00 ? RIG_VFO_A : RIG_VFO_B; } + free(buf); } MUTEX_LOCK(p->mutex); @@ -231,19 +226,18 @@ int anytone_init(RIG *rig) if (rig != NULL) { - anytone_priv_data_ptr pPriv = NULL; + anytone_priv_data_ptr p = NULL; // Get new Priv Data - pPriv = calloc(1, sizeof(anytone_priv_data_t)); + p = calloc(1, sizeof(anytone_priv_data_t)); - if (pPriv == NULL) + if (p == NULL) { retval = -RIG_ENOMEM; } - rig->state.priv = pPriv; - anytone_priv_data_t *p = rig->state.priv; + rig->state.priv = p; p->vfo_curr = RIG_VFO_NONE; #ifdef HAVE_PTHREAD pthread_mutex_init(&p->mutex, NULL); @@ -301,6 +295,7 @@ int anytone_open(RIG *rig) // can we ask for any information? Maybe just toggle A/B? } +#if 0 pthread_t id; int err = pthread_create(&id, NULL, anytone_thread, (void *)rig); @@ -310,6 +305,7 @@ int anytone_open(RIG *rig) strerror(errno)); RETURNFUNC(-RIG_EINTERNAL); } +#endif RETURNFUNC(retval); @@ -321,21 +317,8 @@ int anytone_open(RIG *rig) int anytone_close(RIG *rig) { int retval = RIG_OK; -#if 0 - anytone_priv_data_ptr pPriv = (anytone_priv_data_ptr) rig->state.priv; - - if (pPriv->pcCmd != NULL) { free(pPriv->pcCmd); } - - if (pPriv->pcResult != NULL) { free(pPriv->pcResult); } - -#endif ENTERFUNC; -#if 0 - // Now switch to interactive mode - - retval = anytone_transaction(rig, &anytone_cmd_list_close_adat); -#endif RETURNFUNC(retval); } @@ -356,9 +339,15 @@ int anytone_get_vfo(RIG *rig, vfo_t *vfo) } else { - anytone_priv_data_ptr pPriv = (anytone_priv_data_ptr) rig->state.priv; + anytone_priv_data_ptr p = (anytone_priv_data_ptr) rig->state.priv; + if (p->vfo_curr == RIG_VFO_NONE) // then we need to find out what our current VFO is + { + // only way we know to do this is switch VFOS twice so we can get the reply + anytone_set_vfo(rig, RIG_VFO_B); // it's just toggle right now so VFO doesn't really matter + anytone_set_vfo(rig, RIG_VFO_A); + } - *vfo = pPriv->vfo_curr; + *vfo = p->vfo_curr; } RETURNFUNC(retval); @@ -370,6 +359,7 @@ int anytone_get_vfo(RIG *rig, vfo_t *vfo) int anytone_set_vfo(RIG *rig, vfo_t vfo) { int retval = RIG_OK; + anytone_priv_data_t *p = rig->state.priv; ENTERFUNC; // Check Params @@ -387,7 +377,13 @@ int anytone_set_vfo(RIG *rig, vfo_t vfo) char buf2[8] = { 0x41, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x06 }; anytone_transaction(rig, buf1, 8, 0); hl_usleep(100 * 1000); - anytone_transaction(rig, buf2, 8, 15); + anytone_transaction(rig, buf2, 8, 0); + // we expect 16 bytes coming back + unsigned char reply[16]; + int nbytes = read_block(&rig->state.rigport, reply, 16); + rig_debug(RIG_DEBUG_ERR, "%s(%d): nbytes=%d\n", __func__, __LINE__, nbytes); + if (reply[8] == 0x00) p->vfo_curr = RIG_VFO_A; + else p->vfo_curr = RIG_VFO_B; } else { @@ -395,7 +391,12 @@ int anytone_set_vfo(RIG *rig, vfo_t vfo) char buf2[8] = { 0x41, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x06 }; anytone_transaction(rig, buf1, 8, 0); hl_usleep(100 * 1000); - anytone_transaction(rig, buf2, 8, 15); + anytone_transaction(rig, buf2, 8, 0); + unsigned char reply[16]; + int nbytes = read_block(&rig->state.rigport, reply, 16); + rig_debug(RIG_DEBUG_ERR, "%s(%d): nbytes=%d\n", __func__, __LINE__, nbytes); + if (reply[8] == 0x00) p->vfo_curr = RIG_VFO_A; + else p->vfo_curr = RIG_VFO_B; } } @@ -419,6 +420,8 @@ int anytone_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt) } else { + anytone_priv_data_t *p = rig->state.priv; + *ptt = p->ptt; } return retval; @@ -443,6 +446,8 @@ int anytone_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) if (ptt) { buf[1] = 0x01; } anytone_transaction(rig, buf, 8, 1); + anytone_priv_data_t *p = rig->state.priv; + p->ptt = ptt; } RETURNFUNC(retval); diff --git a/rigs/anytone/anytone.h b/rigs/anytone/anytone.h index 2388f3c54..70cee0aca 100644 --- a/rigs/anytone/anytone.h +++ b/rigs/anytone/anytone.h @@ -3,7 +3,7 @@ #include "hamlib/rig.h" -#define BACKEND_VER "20230527" +#define BACKEND_VER "20230528" #define ANYTONE_RESPSZ 64 @@ -22,9 +22,10 @@ extern const struct rig_caps anytone_d578_caps; typedef struct _anytone_priv_data { - int ptt; + ptt_t ptt; vfo_t vfo_curr; int runflag; // thread control + char buf[64]; pthread_mutex_t mutex; } anytone_priv_data_t, * anytone_priv_data_ptr; diff --git a/simulators/simatd578.c b/simulators/simatd578.c index 53560b23a..f9b977332 100644 --- a/simulators/simatd578.c +++ b/simulators/simatd578.c @@ -25,6 +25,7 @@ char modeB = '1'; int width_main = 500; int width_sub = 700; int ptt = 0; +int curr_vfo = 0; int @@ -96,7 +97,7 @@ int openPort(char *comport) // doesn't matter for using pts devices int main(int argc, char *argv[]) { - unsigned char buf[256]; + unsigned char buf[256], buf2[256]; int n; again: @@ -120,19 +121,61 @@ again: switch (buf[0]) { case 0x41: - if (buf[1] == 1) + if (buf[4] == 0x00) // set ptt { - ptt = 1; - printf("PTT ON\n"); + if (buf[1] == 1) + { + ptt = 1; + printf("PTT ON\n"); + } + else + { + ptt = 0; + printf("PTT OFF\n"); + } + + buf[0] = 0x06; + n = write(fd, buf, 1); } - else + + if (buf[4] == 0x0d) // set vfo { - ptt = 0; - printf("PTT OFF\n"); + printf("Set VFO key1=%d, curr_vfo=%d\n", buf[2], curr_vfo); + + if (buf[2] == 0x00) + { + if (curr_vfo == 1) + { + curr_vfo = 0; + } + else + { + curr_vfo = 1; + } + } + + printf("Set VFO key2=%d, curr_vfo=%d\n", buf[2], curr_vfo); + buf2[0] = 0xaa; + buf2[1] = 0x53; + buf2[2] = 0x00; + buf2[3] = 0x00; + buf2[4] = 0x00; + buf2[5] = 0x00; + buf2[6] = 0x00; + buf2[7] = 0x00; + buf2[8] = curr_vfo; + buf2[9] = 0x00; + buf2[10] = 0x10; + buf2[11] = 0x00; + buf2[12] = 0x00; + buf2[13] = 0x00; + buf2[14] = 0x00; + buf2[15] = 0x06; + + if (buf[2] == 0x00) { n = write(fd, buf2, 16); } + else { n = 0; } } - buf[0] = 0x00; - n = write(fd, buf, 1); break; case 0x06: ----------------------------------------------------------------------- Summary of changes: rigs/anytone/anytone.c | 69 +++++++++++++++++++++++++++----------------------- rigs/anytone/anytone.h | 5 ++-- simulators/simatd578.c | 61 +++++++++++++++++++++++++++++++++++++------- 3 files changed, 92 insertions(+), 43 deletions(-) hooks/post-receive -- Hamlib -- Ham radio control libraries |
From: n0nb <n0...@us...> - 2023-05-28 20:32:19
|
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 f37c24d0525dd81449c854183c256b335f123991 (commit) via e5bb7355b8ab9e3adabe5f59625c0125c70d63c0 (commit) via 4ae3519c4ef97d6966122237a5ebc7b7c55583ad (commit) via 08abfbe19a66994108eb95c7363a6b4f6903049b (commit) via 1f95e06cc1cb1e438ff8055bf6d81eb80cabdb76 (commit) via 9b748bdb2e34d1e3e11aaf8398af71e4a96d92b9 (commit) via 4e8acc728c44f4a67646035351bcb5a344a93a88 (commit) via 34f20cc970af8ea5cc113a9df58f4ed7f1de08bc (commit) via c4a56a4cf087aa52f84c7f5434bb844cdb5641a9 (commit) via 33a1b2dfb0416b1619bc9f296ddd1411b1bf0462 (commit) via 3b45dfa4b845d581dd187c819876db6ccde447d7 (commit) via ab6058da0368aa3d4b5ce62ed8b8ee7c35d3ead0 (commit) via 00b6e0ecd72104d1c074e78ba3ddb87569ac1e19 (commit) from 77d9d11f9249edeaedef943766c243c595952ad8 (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 f37c24d0525dd81449c854183c256b335f123991 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat May 27 16:30:04 2023 -0500 Anytone process 0xaa 0x53 message diff --git a/rigs/anytone/anytone.c b/rigs/anytone/anytone.c index c7cfd3a36..b91dcd651 100644 --- a/rigs/anytone/anytone.c +++ b/rigs/anytone/anytone.c @@ -190,6 +190,7 @@ int anytone_receive(RIG *rig, char *buf, int buf_len, int expected) int anytone_transaction(RIG *rig, char *cmd, int cmd_len, int expected_len) { int retval = RIG_OK; + anytone_priv_data_t *p = rig->state.priv; ENTERFUNC; @@ -199,16 +200,20 @@ int anytone_transaction(RIG *rig, char *cmd, int cmd_len, int expected_len) } else { - MUTEX_LOCK(p->priv.mutex); + MUTEX_LOCK(p->mutex); retval = anytone_send(rig, cmd, cmd_len); if (retval == RIG_OK && expected_len != 0) { char buf[16]; anytone_receive(rig, buf, sizeof(buf), 1); + if (buf[0] == 0xaa && buf[1] == 0x53) + { + p->vfo_curr = buf[8] == 0x00 ? RIG_VFO_A : RIG_VFO_B; + } } - MUTEX_LOCK(p->priv.mutex); + MUTEX_LOCK(p->mutex); } RETURNFUNC(retval); commit e5bb7355b8ab9e3adabe5f59625c0125c70d63c0 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat May 27 16:21:14 2023 -0500 More anytone fixes https://github.com/Hamlib/Hamlib/issues/1303 diff --git a/rigs/anytone/anytone.c b/rigs/anytone/anytone.c index 44486b617..c7cfd3a36 100644 --- a/rigs/anytone/anytone.c +++ b/rigs/anytone/anytone.c @@ -187,7 +187,7 @@ int anytone_receive(RIG *rig, char *buf, int buf_len, int expected) // --------------------------------------------------------------------------- // anytone_transaction // --------------------------------------------------------------------------- -int anytone_transaction(RIG *rig, char *cmd, int cmd_len) +int anytone_transaction(RIG *rig, char *cmd, int cmd_len, int expected_len) { int retval = RIG_OK; @@ -202,7 +202,7 @@ int anytone_transaction(RIG *rig, char *cmd, int cmd_len) MUTEX_LOCK(p->priv.mutex); retval = anytone_send(rig, cmd, cmd_len); - if (retval == RIG_OK) + if (retval == RIG_OK && expected_len != 0) { char buf[16]; anytone_receive(rig, buf, sizeof(buf), 1); @@ -380,17 +380,17 @@ int anytone_set_vfo(RIG *rig, vfo_t vfo) { char buf1[8] = { 0x41, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x06 }; char buf2[8] = { 0x41, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x06 }; - anytone_transaction(rig, buf1, 8); + anytone_transaction(rig, buf1, 8, 0); hl_usleep(100 * 1000); - anytone_transaction(rig, buf2, 8); + anytone_transaction(rig, buf2, 8, 15); } else { char buf1[8] = { 0x41, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x06 }; char buf2[8] = { 0x41, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x06 }; - anytone_transaction(rig, buf1, 8); + anytone_transaction(rig, buf1, 8, 0); hl_usleep(100 * 1000); - anytone_transaction(rig, buf2, 8); + anytone_transaction(rig, buf2, 8, 15); } } @@ -437,7 +437,7 @@ int anytone_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) if (ptt) { buf[1] = 0x01; } - anytone_transaction(rig, buf, 8); + anytone_transaction(rig, buf, 8, 1); } RETURNFUNC(retval); commit 4ae3519c4ef97d6966122237a5ebc7b7c55583ad Author: Mike Black W9MDB <mdb...@ya...> Date: Sat May 27 15:13:22 2023 -0500 Revert "Allow generic_read_string to terminate on expected_len" This reverts commit 00b6e0ecd72104d1c074e78ba3ddb87569ac1e19. diff --git a/src/iofunc.c b/src/iofunc.c index e0d746cc6..2e37fb227 100644 --- a/src/iofunc.c +++ b/src/iofunc.c @@ -1336,11 +1336,12 @@ static int read_string_generic(hamlib_port_t *p, memset(rxbuffer, 0, rxmax); short timeout_retries = p->timeout_retry; - while ( total_count < expected_len && total_count < rxmax - 1) // allow 1 byte for end-of-string + while (total_count < rxmax - 1) // allow 1 byte for end-of-string { ssize_t rd_count = 0; int result; result = port_wait_for_data(p, direct); + if (result == -RIG_ETIMEOUT) { if (timeout_retries > 0) commit 08abfbe19a66994108eb95c7363a6b4f6903049b Author: Mike Black W9MDB <mdb...@ya...> Date: Sat May 27 15:11:40 2023 -0500 Revert "Fix read_string_generic to only use expected_len when expected_len == 0" This reverts commit 9b748bdb2e34d1e3e11aaf8398af71e4a96d92b9. diff --git a/src/iofunc.c b/src/iofunc.c index 25d5b9c33..e0d746cc6 100644 --- a/src/iofunc.c +++ b/src/iofunc.c @@ -1336,7 +1336,6 @@ static int read_string_generic(hamlib_port_t *p, memset(rxbuffer, 0, rxmax); short timeout_retries = p->timeout_retry; - if (expected_len == 0) expected_len = rxmax; while ( total_count < expected_len && total_count < rxmax - 1) // allow 1 byte for end-of-string { ssize_t rd_count = 0; commit 1f95e06cc1cb1e438ff8055bf6d81eb80cabdb76 Merge: 9b748bdb2 4e8acc728 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat May 27 14:59:22 2023 -0500 Merge branch 'master' of https://github.com/Hamlib/Hamlib commit 9b748bdb2e34d1e3e11aaf8398af71e4a96d92b9 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat May 27 14:58:07 2023 -0500 Fix read_string_generic to only use expected_len when expected_len == 0 https://github.com/Hamlib/Hamlib/commit/00b6e0ecd72104d1c074e78ba3ddb87569ac1e19#commitcomment-115297173 diff --git a/src/iofunc.c b/src/iofunc.c index e0d746cc6..25d5b9c33 100644 --- a/src/iofunc.c +++ b/src/iofunc.c @@ -1336,6 +1336,7 @@ static int read_string_generic(hamlib_port_t *p, memset(rxbuffer, 0, rxmax); short timeout_retries = p->timeout_retry; + if (expected_len == 0) expected_len = rxmax; while ( total_count < expected_len && total_count < rxmax - 1) // allow 1 byte for end-of-string { ssize_t rd_count = 0; commit 4e8acc728c44f4a67646035351bcb5a344a93a88 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat May 27 12:58:18 2023 -0500 Fix anytone/Makefile.am to include anytone.h https://github.com/Hamlib/Hamlib/issues/1303 diff --git a/rigs/anytone/Makefile.am b/rigs/anytone/Makefile.am index 5e32ba81a..083bdb4e8 100644 --- a/rigs/anytone/Makefile.am +++ b/rigs/anytone/Makefile.am @@ -1,6 +1,6 @@ -ANYTONESRC = anytone.c d578.c +ANYTONESRC = anytone.c d578.c anytone.h noinst_LTLIBRARIES = libhamlib-anytone.la libhamlib_anytone_la_SOURCES = $(ANYTONESRC) -EXTRA_DIST = Android.mk +EXTRA_DIST = Android.mk commit 34f20cc970af8ea5cc113a9df58f4ed7f1de08bc Author: Mike Black W9MDB <mdb...@ya...> Date: Sat May 27 12:51:24 2023 -0500 Add thread to anytone.c to do the keep alive it needs https://github.com/Hamlib/Hamlib/issues/1303 diff --git a/rigs/anytone/anytone.c b/rigs/anytone/anytone.c index 7b95f0a28..44486b617 100644 --- a/rigs/anytone/anytone.c +++ b/rigs/anytone/anytone.c @@ -29,6 +29,7 @@ #include <string.h> #include <unistd.h> #include <ctype.h> +#include <errno.h> // --------------------------------------------------------------------------- // HAMLIB INCLUDES @@ -117,6 +118,30 @@ DECLARE_PROBERIG_BACKEND(anytone) return retval; } +// AnyTone needs a keep-alive to emulate the MIC +// Apparently to keep the rig from getting stuck in PTT if mic disconnects +void *anytone_thread(void *vrig) +{ + RIG *rig = (RIG *)vrig; + anytone_priv_data_t *p = rig->state.priv; + rig_debug(RIG_DEBUG_TRACE, "%s: anytone_thread started\n", __func__); + p->runflag = 1; + + while (p->runflag) + { + char c = 0x06; + MUTEX_LOCK(p->priv.mutex); + write_block(&rig->state.rigport, (unsigned char *)&c, 1); + hl_usleep(100 * 1000); + rig_flush(&rig->state.rigport); + MUTEX_UNLOCK(p->priv.mutex); + hl_usleep(1000 * 1000); // 1-second loop + + } + + return NULL; +} + // --------------------------------------------------------------------------- // anytone_send // --------------------------------------------------------------------------- @@ -174,6 +199,7 @@ int anytone_transaction(RIG *rig, char *cmd, int cmd_len) } else { + MUTEX_LOCK(p->priv.mutex); retval = anytone_send(rig, cmd, cmd_len); if (retval == RIG_OK) @@ -181,6 +207,8 @@ int anytone_transaction(RIG *rig, char *cmd, int cmd_len) char buf[16]; anytone_receive(rig, buf, sizeof(buf), 1); } + + MUTEX_LOCK(p->priv.mutex); } RETURNFUNC(retval); @@ -212,6 +240,9 @@ int anytone_init(RIG *rig) rig->state.priv = pPriv; anytone_priv_data_t *p = rig->state.priv; p->vfo_curr = RIG_VFO_NONE; +#ifdef HAVE_PTHREAD + pthread_mutex_init(&p->mutex, NULL); +#endif } RETURNFUNC(retval); @@ -265,6 +296,17 @@ int anytone_open(RIG *rig) // can we ask for any information? Maybe just toggle A/B? } + pthread_t id; + int err = pthread_create(&id, NULL, anytone_thread, (void *)rig); + + if (err) + { + rig_debug(RIG_DEBUG_ERR, "%s: pthread_create error: %s\n", __func__, + strerror(errno)); + RETURNFUNC(-RIG_EINTERNAL); + } + + RETURNFUNC(retval); } @@ -333,18 +375,19 @@ int anytone_set_vfo(RIG *rig, vfo_t vfo) } else { + // can we use status reponse to deteremin which VFO is active? if (vfo == RIG_VFO_A) { - char buf1[8] = { 0x41, 0x00, 0x01, 0x00, 0x1a, 0x00, 0x00, 0x06 }; - char buf2[8] = { 0x41, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x06 }; + char buf1[8] = { 0x41, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x06 }; + char buf2[8] = { 0x41, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x06 }; anytone_transaction(rig, buf1, 8); hl_usleep(100 * 1000); anytone_transaction(rig, buf2, 8); } else { - char buf1[8] = { 0x41, 0x00, 0x01, 0x00, 0x1b, 0x00, 0x00, 0x06 }; - char buf2[8] = { 0x41, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x06 }; + char buf1[8] = { 0x41, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x06 }; + char buf2[8] = { 0x41, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x06 }; anytone_transaction(rig, buf1, 8); hl_usleep(100 * 1000); anytone_transaction(rig, buf2, 8); diff --git a/rigs/anytone/anytone.h b/rigs/anytone/anytone.h index bafa6f60c..2388f3c54 100644 --- a/rigs/anytone/anytone.h +++ b/rigs/anytone/anytone.h @@ -9,10 +9,23 @@ extern const struct rig_caps anytone_d578_caps; +#ifdef PTHREAD +#include <pthread.h> +#define MUTEX(var) static pthread_mutex_t var = PTHREAD_MUTEX_INITIALIZER +#define MUTEX_LOCK(var) pthread_mutex_lock(var) +#define MUTEX_UNLOCK(var) pthread_mutex_unlock(var) +#else +#define MUTEX(var) +#define MUTEX_LOCK(var) +#define MUTEX_UNLOCK(var) +#endif + typedef struct _anytone_priv_data { int ptt; vfo_t vfo_curr; + int runflag; // thread control + pthread_mutex_t mutex; } anytone_priv_data_t, * anytone_priv_data_ptr; diff --git a/simulators/simatd578.c b/simulators/simatd578.c index ca95b2dc6..53560b23a 100644 --- a/simulators/simatd578.c +++ b/simulators/simatd578.c @@ -38,13 +38,14 @@ getmyline(int fd, unsigned char *buf) // seemd the anytone only gives 8-byte commands and 1-byte responses while (i < 8 && read(fd, &c, 1) > 0) { - if (i==0 && buf[i]==0x06) + if (i == 0 && c == 0x06) { - write(fd, buf, 1); + write(fd, &c, 1); } - else { - buf[i++] = c; - n++; + else + { + buf[i++] = c; + n++; } } @@ -96,10 +97,8 @@ int openPort(char *comport) // doesn't matter for using pts devices int main(int argc, char *argv[]) { unsigned char buf[256]; - unsigned char *pbuf; int n; - again: int fd = openPort(argv[1]); @@ -136,8 +135,15 @@ again: n = write(fd, buf, 1); break; - default: printf("Unknown cmd=%02x\n", buf[0]); + case 0x06: + buf[0] = 0x06; + n = write(fd, buf, 1); + break; + + default: printf("Unknown cmd=%02x\n", buf[0]); continue; } + + printf("%d bytes returned\n", n); } return 0; commit c4a56a4cf087aa52f84c7f5434bb844cdb5641a9 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat May 27 12:00:44 2023 -0500 Fix simatd578 one more time https://github.com/Hamlib/Hamlib/issues/1303 diff --git a/simulators/Makefile.am b/simulators/Makefile.am index 8e421a5d2..299e04fb7 100644 --- a/simulators/Makefile.am +++ b/simulators/Makefile.am @@ -8,7 +8,7 @@ DISTCLEANFILES = bin_PROGRAMS = -check_PROGRAMS = simelecraft simicom simkenwood simyaesu simicom9100 simicom9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simicom7300 simicom7100 simatdt578 +check_PROGRAMS = simelecraft simicom simkenwood simyaesu simicom9100 simicom9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simicom7300 simicom7100 simatd578 simelecraft_SOURCES = simelecraft.c simicom_SOURCES = simicom.c commit 33a1b2dfb0416b1619bc9f296ddd1411b1bf0462 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat May 27 11:12:27 2023 -0500 Fix simatdt578 entry diff --git a/simulators/Makefile.am b/simulators/Makefile.am index 514721364..8e421a5d2 100644 --- a/simulators/Makefile.am +++ b/simulators/Makefile.am @@ -8,7 +8,7 @@ DISTCLEANFILES = bin_PROGRAMS = -check_PROGRAMS = simelecraft simicom simkenwood simyaesu simicom9100 simicom9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simicom7300 simicom7100 simdt578 +check_PROGRAMS = simelecraft simicom simkenwood simyaesu simicom9100 simicom9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simicom7300 simicom7100 simatdt578 simelecraft_SOURCES = simelecraft.c simicom_SOURCES = simicom.c commit 3b45dfa4b845d581dd187c819876db6ccde447d7 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat May 27 11:04:56 2023 -0500 Add AnyTone D578UVIII https://github.com/Hamlib/Hamlib/issues/1303 diff --git a/configure.ac b/configure.ac index cee1aff02..08ba1fa48 100644 --- a/configure.ac +++ b/configure.ac @@ -49,7 +49,7 @@ dnl added to AC_CONFIG_FILES near the end of this file. See README.developer dnl Beware of duplication should a backend directory include both rig and dnl rotor definitions, e.g. "dummy". Optional backends will not be listed dnl here but will be added later, e.g. "winradio". -RIG_BACKEND_LIST="rigs/adat rigs/alinco rigs/aor rigs/barrett rigs/codan rigs/dorji rigs/drake rigs/dummy rigs/elad rigs/flexradio rigs/icom rigs/icmarine rigs/jrc rigs/kachina rigs/kenwood rigs/kit rigs/lowe rigs/pcr rigs/prm80 rigs/racal rigs/rft rigs/rs rigs/skanti rigs/tapr rigs/tentec rigs/tuner rigs/uniden rigs/winradio rigs/wj rigs/yaesu rigs/gomspace rigs/mds" +RIG_BACKEND_LIST="rigs/adat rigs/alinco rigs/aor rigs/barrett rigs/codan rigs/dorji rigs/drake rigs/dummy rigs/elad rigs/flexradio rigs/icom rigs/icmarine rigs/jrc rigs/kachina rigs/kenwood rigs/kit rigs/lowe rigs/pcr rigs/prm80 rigs/racal rigs/rft rigs/rs rigs/skanti rigs/tapr rigs/tentec rigs/tuner rigs/uniden rigs/winradio rigs/wj rigs/yaesu rigs/gomspace rigs/mds rigs/anytone" ROT_BACKEND_LIST="rotators/amsat rotators/apex rotators/ars rotators/celestron rotators/cnctrk rotators/grbltrk rotators/easycomm rotators/ether6 rotators/flir rotators/fodtrack rotators/gs232a rotators/heathkit rotators/m2 rotators/meade rotators/rotorez rotators/sartek rotators/saebrtrack rotators/spid rotators/ts7400 rotators/prosistel rotators/ioptron rotators/satel rotators/radant" # Amplifiers are all in the amplifiers directory AMP_BACKEND_LIST="amplifiers/elecraft amplifiers/gemini amplifiers/expert" @@ -912,6 +912,7 @@ rigs/wj/Makefile rigs/yaesu/Makefile rigs/gomspace/Makefile rigs/mds/Makefile +rigs/anytone/Makefile tests/Makefile scripts/Makefile android/Makefile diff --git a/include/hamlib/riglist.h b/include/hamlib/riglist.h index f73e639fc..94c29c9d8 100644 --- a/include/hamlib/riglist.h +++ b/include/hamlib/riglist.h @@ -656,6 +656,14 @@ etc. */ +/* + * AnyTone rigs + */ +#define RIG_ANYTONE 37 +#define RIG_BACKEND_ANYTONE "AnyTone" +#define RIG_MODEL_ATD578UVIII RIG_MAKE_MODEL(RIG_ANYTONE, 1) + + //! @endcond /*! \typedef typedef int rig_model_t diff --git a/rigs/anytone/Android.mk b/rigs/anytone/Android.mk new file mode 100644 index 000000000..8fbe3b54f --- /dev/null +++ b/rigs/anytone/Android.mk @@ -0,0 +1,12 @@ +LOCAL_PATH:= $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := anytone.c d578.c +LOCAL_MODULE := anytone + +LOCAL_CFLAGS := +LOCAL_C_INCLUDES := android include src +LOCAL_LDLIBS := $(LOCAL_SHARED_LIBRARIES) -Lobj/local/$(TARGET_ARCH_ABI) + +include $(BUILD_STATIC_LIBRARY) diff --git a/rigs/anytone/Makefile.am b/rigs/anytone/Makefile.am new file mode 100644 index 000000000..5e32ba81a --- /dev/null +++ b/rigs/anytone/Makefile.am @@ -0,0 +1,6 @@ +ANYTONESRC = anytone.c d578.c + +noinst_LTLIBRARIES = libhamlib-anytone.la +libhamlib_anytone_la_SOURCES = $(ANYTONESRC) + +EXTRA_DIST = Android.mk diff --git a/rigs/anytone/anytone.c b/rigs/anytone/anytone.c new file mode 100644 index 000000000..7b95f0a28 --- /dev/null +++ b/rigs/anytone/anytone.c @@ -0,0 +1,405 @@ +// --------------------------------------------------------------------------- +// AnyTone D578 Hamlib Backend +// --------------------------------------------------------------------------- +// +// d578.c +// +// Created by Michael Black W9MDB +// Copyright © 2023 Michael Black W9MDB. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +// --------------------------------------------------------------------------- +// SYSTEM INCLUDES +// --------------------------------------------------------------------------- + +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <ctype.h> + +// --------------------------------------------------------------------------- +// HAMLIB INCLUDES +// --------------------------------------------------------------------------- + +#include <hamlib/rig.h> +#include "serial.h" +#include "misc.h" +#include "register.h" +#include "riglist.h" + +// --------------------------------------------------------------------------- +// ANYTONE INCLUDES +// --------------------------------------------------------------------------- + +#include "anytone.h" + +DECLARE_INITRIG_BACKEND(anytone) +{ + int retval = RIG_OK; + + rig_register(&anytone_d578_caps); + + return retval; +} + + + +// --------------------------------------------------------------------------- +// proberig_anytone +// --------------------------------------------------------------------------- +DECLARE_PROBERIG_BACKEND(anytone) +{ + int retval = RIG_OK; + + if (!port) + { + return RIG_MODEL_NONE; + } + + if (port->type.rig != RIG_PORT_SERIAL) + { + return RIG_MODEL_NONE; + } + + port->write_delay = port->post_write_delay = 0; + port->parm.serial.stop_bits = 1; + port->retry = 1; + + + retval = serial_open(port); + + if (retval != RIG_OK) + { + retval = RIG_MODEL_NONE; + } + else + { + char acBuf[ ANYTONE_RESPSZ + 1 ]; + int nRead = 0; + + memset(acBuf, 0, ANYTONE_RESPSZ + 1); + +#if 0 + retval = write_block(port, + (unsigned char *)ADAT_CMD_DEF_STRING_GET_ID_CODE, + strlen(ADAT_CMD_DEF_STRING_GET_ID_CODE)); + nRead = read_string(port, (unsigned char *) acBuf, ANYTONE_RESPSZ, + ADAT_EOM, 1, 0, 1); +#endif + close(port->fd); + + if ((retval != RIG_OK || nRead < 0)) + { + retval = RIG_MODEL_NONE; + } + else + { + rig_debug(RIG_DEBUG_VERBOSE, "Received ID = %s.", + acBuf); + + retval = RIG_MODEL_ADT_200A; + } + } + + return retval; +} + +// --------------------------------------------------------------------------- +// anytone_send +// --------------------------------------------------------------------------- +int anytone_send(RIG *rig, + char *cmd, int cmd_len) +{ + int retval = RIG_OK; + struct rig_state *rs = &rig->state; + + ENTERFUNC; + + rig_flush(&rs->rigport); + + retval = write_block(&rs->rigport, (unsigned char *) cmd, + cmd_len); + + RETURNFUNC(retval); +} + +// --------------------------------------------------------------------------- +// anytone_receive +// --------------------------------------------------------------------------- +int anytone_receive(RIG *rig, char *buf, int buf_len, int expected) +{ + int retval = RIG_OK; + struct rig_state *rs = &rig->state; + + ENTERFUNC; + + retval = read_string(&rs->rigport, (unsigned char *) buf, buf_len, + NULL, 0, 0, expected); + + if (retval > 0) + { + retval = RIG_OK; + rig_debug(RIG_DEBUG_VERBOSE, "%s: read %d byte=0x%02x\n", __func__, retval, + buf[0]); + } + + RETURNFUNC(retval); +} + +// --------------------------------------------------------------------------- +// anytone_transaction +// --------------------------------------------------------------------------- +int anytone_transaction(RIG *rig, char *cmd, int cmd_len) +{ + int retval = RIG_OK; + + ENTERFUNC; + + if (rig == NULL) + { + retval = -RIG_EARG; + } + else + { + retval = anytone_send(rig, cmd, cmd_len); + + if (retval == RIG_OK) + { + char buf[16]; + anytone_receive(rig, buf, sizeof(buf), 1); + } + } + + RETURNFUNC(retval); +} + +// --------------------------------------------------------------------------- +// Function anytone_init +// --------------------------------------------------------------------------- +int anytone_init(RIG *rig) +{ + int retval = RIG_OK; + + ENTERFUNC; + // Check Params + + if (rig != NULL) + { + anytone_priv_data_ptr pPriv = NULL; + + // Get new Priv Data + + pPriv = calloc(1, sizeof(anytone_priv_data_t)); + + if (pPriv == NULL) + { + retval = -RIG_ENOMEM; + } + + rig->state.priv = pPriv; + anytone_priv_data_t *p = rig->state.priv; + p->vfo_curr = RIG_VFO_NONE; + } + + RETURNFUNC(retval); +} + +// --------------------------------------------------------------------------- +// Function anytone_cleanup +// --------------------------------------------------------------------------- +int anytone_cleanup(RIG *rig) +{ + int retval = RIG_OK; + + ENTERFUNC; + + if (rig == NULL) + { + retval = -RIG_EARG; + } + else + { + if (rig->state.priv != NULL) + { + free(rig->state.priv); + rig->state.priv = NULL; + } + } + + RETURNFUNC(retval); +} + +// --------------------------------------------------------------------------- +// Function anytone_open +// --------------------------------------------------------------------------- +int anytone_open(RIG *rig) +{ + int retval = RIG_OK; + + ENTERFUNC; + // Check Params + + if (rig == NULL) + { + retval = -RIG_EARG; + } + else + { + // grace period for the radio to be there + + // hl_usleep(500); // do we need this for AnyTone? + + // can we ask for any information? Maybe just toggle A/B? + } + + RETURNFUNC(retval); +} + +// --------------------------------------------------------------------------- +// Function anytone_close +// --------------------------------------------------------------------------- +int anytone_close(RIG *rig) +{ + int retval = RIG_OK; +#if 0 + anytone_priv_data_ptr pPriv = (anytone_priv_data_ptr) rig->state.priv; + + if (pPriv->pcCmd != NULL) { free(pPriv->pcCmd); } + + if (pPriv->pcResult != NULL) { free(pPriv->pcResult); } + +#endif + + ENTERFUNC; +#if 0 + // Now switch to interactive mode + + retval = anytone_transaction(rig, &anytone_cmd_list_close_adat); +#endif + + RETURNFUNC(retval); +} + +// --------------------------------------------------------------------------- +// Function anytone_get_vfo +// --------------------------------------------------------------------------- +int anytone_get_vfo(RIG *rig, vfo_t *vfo) +{ + int retval = RIG_OK; + + ENTERFUNC; + // Check Params + + if (rig == NULL) + { + retval = -RIG_EARG; + } + else + { + anytone_priv_data_ptr pPriv = (anytone_priv_data_ptr) rig->state.priv; + + *vfo = pPriv->vfo_curr; + } + + RETURNFUNC(retval); +} + +// --------------------------------------------------------------------------- +// Function anytone_set_vfo +// --------------------------------------------------------------------------- +int anytone_set_vfo(RIG *rig, vfo_t vfo) +{ + int retval = RIG_OK; + + ENTERFUNC; + // Check Params + + if (rig == NULL) + { + retval = -RIG_EARG; + } + else + { + if (vfo == RIG_VFO_A) + { + char buf1[8] = { 0x41, 0x00, 0x01, 0x00, 0x1a, 0x00, 0x00, 0x06 }; + char buf2[8] = { 0x41, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x06 }; + anytone_transaction(rig, buf1, 8); + hl_usleep(100 * 1000); + anytone_transaction(rig, buf2, 8); + } + else + { + char buf1[8] = { 0x41, 0x00, 0x01, 0x00, 0x1b, 0x00, 0x00, 0x06 }; + char buf2[8] = { 0x41, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x06 }; + anytone_transaction(rig, buf1, 8); + hl_usleep(100 * 1000); + anytone_transaction(rig, buf2, 8); + } + + } + + RETURNFUNC(retval); +} + +// --------------------------------------------------------------------------- +// Function anytone_get_ptt +// --------------------------------------------------------------------------- +int anytone_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt) +{ + int retval = RIG_OK; + + ENTERFUNC; + // Check Params + + if (rig == NULL) + { + retval = -RIG_EARG; + } + else + { + } + + return retval; +} +// --------------------------------------------------------------------------- +// anytone_set_ptt +// --------------------------------------------------------------------------- +int anytone_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt) +{ + int retval = RIG_OK; + + ENTERFUNC; + + if (rig == NULL) + { + retval = -RIG_EARG; + } + else + { + char buf[8] = { 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06 }; + + if (ptt) { buf[1] = 0x01; } + + anytone_transaction(rig, buf, 8); + } + + RETURNFUNC(retval); +} + +// --------------------------------------------------------------------------- +// END OF FILE +// --------------------------------------------------------------------------- diff --git a/rigs/anytone/anytone.h b/rigs/anytone/anytone.h new file mode 100644 index 000000000..bafa6f60c --- /dev/null +++ b/rigs/anytone/anytone.h @@ -0,0 +1,31 @@ +#ifndef _ANYTONE_H +#define _ANYTONE_H 1 + +#include "hamlib/rig.h" + +#define BACKEND_VER "20230527" + +#define ANYTONE_RESPSZ 64 + +extern const struct rig_caps anytone_d578_caps; + +typedef struct _anytone_priv_data +{ + int ptt; + vfo_t vfo_curr; +} anytone_priv_data_t, +* anytone_priv_data_ptr; + + +extern int anytone_init(RIG *rig); +extern int anytone_cleanup(RIG *rig); +extern int anytone_open(RIG *rig); +extern int anytone_close(RIG *rig); + +extern int anytone_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt); +extern int anytone_get_ptt(RIG *rig, vfo_t vfo,ptt_t *ptt); + +extern int anytone_set_vfo(RIG *rig, vfo_t vfo); +extern int anytone_get_vfo(RIG *rig, vfo_t *vfo); + +#endif /* _ANYTONE_H */ diff --git a/rigs/anytone/d578.c b/rigs/anytone/d578.c new file mode 100644 index 000000000..f6d56dd37 --- /dev/null +++ b/rigs/anytone/d578.c @@ -0,0 +1,92 @@ +// --------------------------------------------------------------------------- +// Anytone D578UVIII +// --------------------------------------------------------------------------- +// +// d578.c +// +// Created by Michael Black W9MDB +// Copyright © 2023, Michael Black W9MDB. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +#include "anytone.h" + +#define D578_VFO (RIG_VFO_A|RIG_VFO_B) +#define D578_MODES (RIG_MODE_USB|RIG_MODE_AM) + +const struct rig_caps anytone_d578_caps = +{ + RIG_MODEL(RIG_MODEL_ATD578UVIII), + .model_name = "D578A", + .mfg_name = "AnyTone", + .version = BACKEND_VER ".0", + .copyright = "Michael Black W9MDB: GNU LGPL", + .status = RIG_STATUS_ALPHA, + .rig_type = RIG_TYPE_TRANSCEIVER, + .ptt_type = RIG_PTT_RIG, + .dcd_type = RIG_DCD_NONE, + .port_type = RIG_PORT_SERIAL, + .serial_rate_min = 115200, + .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, + .timeout = 1000, + .retry = 3, + + .level_gran = {}, + .parm_gran = {}, + .ctcss_list = NULL, + .dcs_list = NULL, + .targetable_vfo = RIG_TARGETABLE_NONE, + .transceive = 0, + + .rx_range_list1 = + { + { MHz(108), MHz(174), D578_MODES, -1, -1, D578_VFO }, + { MHz(144), MHz(148), D578_MODES, -1, -1, D578_VFO }, + { MHz(222), MHz(225), D578_MODES, -1, -1, D578_VFO }, + { MHz(420), MHz(450), D578_MODES, -1, -1, D578_VFO }, + RIG_FRNG_END, + }, + + .tx_range_list1 = + { + { MHz(144), MHz(148), D578_MODES, W(1), W(55), D578_VFO }, + { MHz(222), MHz(225), D578_MODES, W(1), W(40), D578_VFO }, + { MHz(420), MHz(450), D578_MODES, W(1), W(25), D578_VFO }, + RIG_FRNG_END, + }, + + .rig_init = anytone_init, + .rig_cleanup = anytone_cleanup, + .rig_open = anytone_open, + .rig_close = anytone_close, + + .get_vfo = anytone_get_vfo, + .set_vfo = anytone_set_vfo, + + .get_ptt = anytone_get_ptt, + .set_ptt = anytone_set_ptt, + + .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS +}; + +// --------------------------------------------------------------------------- +// END OF FILE +// --------------------------------------------------------------------------- diff --git a/src/register.c b/src/register.c index 7b02f3528..70bbaed7c 100644 --- a/src/register.c +++ b/src/register.c @@ -89,6 +89,7 @@ DEFINE_INITRIG_BACKEND(elad); DEFINE_INITRIG_BACKEND(codan); DEFINE_INITRIG_BACKEND(gomspace); DEFINE_INITRIG_BACKEND(mds); +DEFINE_INITRIG_BACKEND(anytone); //! @endcond #ifdef HAVE_WINRADIO @@ -148,6 +149,7 @@ static struct { RIG_CODAN, RIG_BACKEND_CODAN, RIG_FUNCNAMA(codan) }, { RIG_GOMSPACE, RIG_BACKEND_GOMSPACE, RIG_FUNCNAM(gomspace) }, { RIG_MDS, RIG_BACKEND_MDS, RIG_FUNCNAMA(mds) }, + { RIG_ANYTONE, RIG_BACKEND_ANYTONE, RIG_FUNCNAMA(anytone) }, { 0, NULL }, /* end */ }; @@ -199,8 +201,8 @@ int HAMLIB_API rig_register(const struct rig_caps *caps) return -RIG_EINVAL; } -#if 0 - rig_debug(RIG_DEBUG_VERBOSE, +#if 1 + rig_debug(RIG_DEBUG_ERR, "%s: rig_register (%u)\n", __func__, caps->rig_model); commit ab6058da0368aa3d4b5ce62ed8b8ee7c35d3ead0 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat May 27 10:45:45 2023 -0500 Add simatd578.c diff --git a/simulators/Makefile.am b/simulators/Makefile.am index 78006dcf4..514721364 100644 --- a/simulators/Makefile.am +++ b/simulators/Makefile.am @@ -8,7 +8,7 @@ DISTCLEANFILES = bin_PROGRAMS = -check_PROGRAMS = simelecraft simicom simkenwood simyaesu simicom9100 simicom9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simicom7300 simicom7100 +check_PROGRAMS = simelecraft simicom simkenwood simyaesu simicom9100 simicom9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simicom7300 simicom7100 simdt578 simelecraft_SOURCES = simelecraft.c simicom_SOURCES = simicom.c diff --git a/simulators/simatd578.c b/simulators/simatd578.c new file mode 100644 index 000000000..ca95b2dc6 --- /dev/null +++ b/simulators/simatd578.c @@ -0,0 +1,144 @@ +// can run this using rigctl/rigctld and socat pty devices +// gcc -o simatd578 simatd578.c +#define _XOPEN_SOURCE 700 +// since we are POSIX here we need this +struct ip_mreq +{ + int dummy; +}; + +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <string.h> +#include <unistd.h> +#include "../include/hamlib/rig.h" + +#define BUFSIZE 256 + +float freqA = 14074000; +float freqB = 14074500; +char tx_vfo = '0'; +char rx_vfo = '0'; +char modeA = '1'; +char modeB = '1'; +int width_main = 500; +int width_sub = 700; +int ptt = 0; + + +int +getmyline(int fd, unsigned char *buf) +{ + unsigned char c; + int i = 0; + int n = 0; + memset(buf, 0, BUFSIZE); + + // seemd the anytone only gives 8-byte commands and 1-byte responses + while (i < 8 && read(fd, &c, 1) > 0) + { + if (i==0 && buf[i]==0x06) + { + write(fd, buf, 1); + } + else { + buf[i++] = c; + n++; + } + } + + printf("n=%d %02x %02x %02x %02x %02x %02x %02x %02x\n", n, buf[0], buf[1], + buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); + return n; +} + +#if defined(WIN32) || defined(_WIN32) +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd; + fd = open(comport, O_RDWR); + + if (fd < 0) + { + perror(comport); + } + + return fd; +} + +#else +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd = posix_openpt(O_RDWR); + char *name = ptsname(fd); + + if (name == NULL) + { + perror("pstname"); + return -1; + } + + printf("name=%s\n", name); + + if (fd == -1 || grantpt(fd) == -1 || unlockpt(fd) == -1) + { + perror("posix_openpt"); + return -1; + } + + return fd; +} +#endif + + + +int main(int argc, char *argv[]) +{ + unsigned char buf[256]; + unsigned char *pbuf; + int n; + + +again: + int fd = openPort(argv[1]); + + while (1) + { + int bytes = getmyline(fd, buf); + + if (bytes == 0) + { + close(fd); + goto again; + } + + if (bytes != 8) + { + printf("Not 8 bytes? bytes=%d\n", bytes); + } + + switch (buf[0]) + { + case 0x41: + if (buf[1] == 1) + { + ptt = 1; + printf("PTT ON\n"); + } + else + { + ptt = 0; + printf("PTT OFF\n"); + } + + buf[0] = 0x00; + n = write(fd, buf, 1); + break; + + default: printf("Unknown cmd=%02x\n", buf[0]); + } + } + + return 0; +} commit 00b6e0ecd72104d1c074e78ba3ddb87569ac1e19 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat May 27 10:07:32 2023 -0500 Allow generic_read_string to terminate on expected_len https://github.com/Hamlib/Hamlib/issues/1303 diff --git a/src/iofunc.c b/src/iofunc.c index 2e37fb227..e0d746cc6 100644 --- a/src/iofunc.c +++ b/src/iofunc.c @@ -1336,12 +1336,11 @@ static int read_string_generic(hamlib_port_t *p, memset(rxbuffer, 0, rxmax); short timeout_retries = p->timeout_retry; - while (total_count < rxmax - 1) // allow 1 byte for end-of-string + while ( total_count < expected_len && total_count < rxmax - 1) // allow 1 byte for end-of-string { ssize_t rd_count = 0; int result; result = port_wait_for_data(p, direct); - if (result == -RIG_ETIMEOUT) { if (timeout_retries > 0) ----------------------------------------------------------------------- Summary of changes: configure.ac | 3 +- include/hamlib/riglist.h | 8 + rigs/{adat => anytone}/Android.mk | 4 +- rigs/anytone/Makefile.am | 6 + rigs/anytone/anytone.c | 453 +++++++++++++++++++++++++++++++ rigs/anytone/anytone.h | 44 +++ rigs/anytone/d578.c | 92 +++++++ simulators/Makefile.am | 2 +- simulators/{simjupiter.c => simatd578.c} | 60 ++-- src/register.c | 6 +- 10 files changed, 655 insertions(+), 23 deletions(-) copy rigs/{adat => anytone}/Android.mk (78%) create mode 100644 rigs/anytone/Makefile.am create mode 100644 rigs/anytone/anytone.c create mode 100644 rigs/anytone/anytone.h create mode 100644 rigs/anytone/d578.c copy simulators/{simjupiter.c => simatd578.c} (60%) hooks/post-receive -- Hamlib -- Ham radio control libraries |
From: n0nb <n0...@us...> - 2023-05-27 00:53:29
|
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 77d9d11f9249edeaedef943766c243c595952ad8 (commit) via 81dd39319b2a973ab7bb83b17b789a4e157a2033 (commit) via ccd832d4cb0b01f8623bbe849513742aaf3fc501 (commit) via 8d465a257ee9a5e0f4a472ec74c43b0c6a6b495e (commit) via 06f5d8376f6bbc152f0342fccdff5c5a3b29aa88 (commit) via f01a165ec774c98479543665b15074b39c831b73 (commit) via fd68723da1fbccb922bc7eb74f580869b0105f72 (commit) via 8730e6a0b141367a3f74b23629257b6236de50a8 (commit) via 610bf2d90324f9f1d722923e116943192e748a17 (commit) via b6fe91504f06534fa601320fbd7645e619d3a3b3 (commit) via 79492d42844b4bcbe8f7e1f5b374960311b4e7c6 (commit) via ae14af4bc1a1cf67ce25b8ee5ef3567a54c63c70 (commit) via a7d24a99dbe9b63f813aa568dd35ffd8eb217227 (commit) via 083669dbc8ba9610733d4af23c255093bb3d4a52 (commit) via 657e41fd099f81a4a9a63d1f2df4883867ccd851 (commit) via 7309b24411cb0437fb34654a9a46d4f54ab11ea3 (commit) via dbf1cacac60197af51c8139ba96198c7dde58b56 (commit) via 15a01889cd1cbb8eac0d394b8e04d1ef305eb93d (commit) via 9e1adcfdb862f3b489219a49ab2f74fa4cd9da86 (commit) via cce66d325797b014af2628f88f6f79636804b6c5 (commit) via 52358d7922fed71d0f7136e78a34c8863ab8b052 (commit) via 082bf83daa592d0fbef5953777257a6e4cf4c117 (commit) via 4832cc1bb27a729fe34055ec679fe7392607e7d6 (commit) via ece6a7ae1aa598b2dbe69beab3c411baeb89f1db (commit) via 6eb0735c75ff2875a0a52694ece73b9092da5d85 (commit) via 8b9a8d6649d5b17ba7047842de64ce7349a7efe2 (commit) via 125273f7a275d185aaf755c024344c134da59ad3 (commit) via c5f0e1e5770c2e169ecb6d016029c76fd6d47e22 (commit) via 14dbe41e763182893dd0d5cf1ad611da8765ed9f (commit) via e5f6b4e9d25516576cd1f2b435797b009fc66321 (commit) via d3c2ebcc1f8aee5d3a38305ea8b9e7cccb633b01 (commit) via d27283ceb7d2538d2457f0d6f5442ce2115661f3 (commit) via 3029260582f4cd29972d57b787c1d089b6d461b5 (commit) via 7a69042876133382cc864849562487641d3f7efa (commit) via ea37ad1b215a0fad366e8d282ee11e6e275068b7 (commit) via 05f04730d75aabfff19bc56310b088385a8aaeb4 (commit) via 1c08cd7a64a3cd46c5b3aae875f9a38d29b94b80 (commit) via ca62509013656b8b6de2a980ecf0b6dbb181bdce (commit) via e2a1a00f3a1fd0266266b141b85b0938aadd52f5 (commit) via 9528132f81a94d12f5c2f6debb03a4ce9cef88e5 (commit) via 67344a66a7a189d503c1426fb7fa0055087c9df5 (commit) via 04ee4ec58040daa86c87a0045f80d3acf38b5f30 (commit) via 673ef04b0f3fc8ed087f0af4dcff08cb14a47e62 (commit) via a9d098bab33ca7b4c42f225a0176921df7e29c52 (commit) via 44c9f83ae0787f60ca6affadf7ca3c6dd690168d (commit) via df53b9a92809ef06534c2df81241c79e4dad3a38 (commit) via 0f5982272aa620bfe8873c168a184686795aea80 (commit) via 474428082d8a0cc4e63c87e11fcde2ee60c8c49f (commit) via 14c535a01bfb40a80243a8a428fd37cdf20abeb5 (commit) via b60748265155f16d326d0ea0ba75deadf3692edd (commit) via 3c93d838482b77999175e5d61d1a024b22fbd8d5 (commit) via efc90d30de30535f7da9a5a9fbf4c36cbacbee07 (commit) via 84187e976d35c3ef4c96fdfa827bf5bffa20971f (commit) via 445e5070c1234ace1934767e3569df3da6e5a0e9 (commit) via 630f5866a71f00f3bab760f89054b955d5ab2936 (commit) via bba58dff7b7ad544d3b9aa54d607258819bc0802 (commit) via e02c42f629dbaf3309d84b12f0533cc92d97e81d (commit) via f43aa43671979a44a374634b66f3092763373e4a (commit) via f691be94d959d605d055e0bb668ef15ff14f23ae (commit) via c14d6f0fa2f612aa9bc7af7329dc141a3a321d1c (commit) via 1ad664be4ca5b58f8d7a1d75396be4ef4ca58c83 (commit) via 01a7eee18d1913d4ece42da24fd76880bc316dd7 (commit) via f4a08e10bf466deb0d385c86e0a195f10fe5d292 (commit) via 6142e98c23fcbac70e9745a164e1073e1014a90e (commit) via 73465d16c4976ed0912bc1e47be7d4b6ebae0867 (commit) via 58655be3557bf247f2cb130047c9c7eb71163a42 (commit) via d3b912aadb2a8348bf02da90f40631e531f9769a (commit) via 1265ede3844fa08b3e938318edbf482651e4a299 (commit) via 31733cea22c5242ec29527134049b14e9db53742 (commit) via eff6f2d5547fea910d03e291a9ddaf2c1567df05 (commit) via 647c5b37ef76efdd5d119e88a9907dca91623381 (commit) via 29d38332283d99009d4ef238a38aa39d8a3280e6 (commit) via 5e8de57f54dc38524e4db8acd478bcd98f136565 (commit) via fa9948b17d5be4df4b6e3d6623ea0d9f07b8e6cd (commit) via a43cd80799f3806090da6d09b0b9cc28dfe8c2ac (commit) via 176a63c72615e84521cfe841368f07a239c4335a (commit) via 0ad834f59e9638ead955534831b9aeb0d48c04af (commit) via 05ab130f9127b92733e72ddd9ed4845718ef5578 (commit) via 66513450652cb77e21006b50e3a4045756f61b33 (commit) via 10f1f3a7cd3da5a53583ad0ede45f1d2fc0c757a (commit) via eea12aff0ab2bda40b6ac8af24db446885070109 (commit) via 93e8a2879d0a74c60843c9942c2759178b746383 (commit) via c75fdeb3e4a6579d9ecf841bea0c9bce9793997f (commit) via 7c5a636a64cbef6b1a2fa3d02a73407c7ab4598e (commit) via 09c57dd96168825bfb117d1cbcc76d615f7835c5 (commit) via c3cfb760bb7823949915e7e58b12274d36260a86 (commit) via 7f4665723a2188e0efd74db0fdaa452543362ad9 (commit) via 12384c77965dfee4663138fee2e01246c762f336 (commit) via 300c0c415a873b7735718cfa73660225883c2360 (commit) via 006ca07b3c31caf15d6d71c6a126f897d26fddff (commit) via 75b1b20fa285a4eeaf8bd462cc1173ccb5b54f69 (commit) via c4d0df1f86fd32ee809f19c57c9e7ad6155f4dbf (commit) via 14cdbcba319922803af9f53b8cd6c8041603fd0f (commit) via c2d1f045073ae7912f2fc4e52752d84ad23fdb09 (commit) via 8ad62b1af8c843ed90b278acc6410820afc95652 (commit) via 99baa872bfe18760787b69629d32732e2a90f1ba (commit) via 28e2d8f45c7e2e398b350a299ef18dea68675b40 (commit) via 43b24caa0104a60cd007002dd9aca831e54f39e2 (commit) via 26aa57adede2f11eab099c513ecbd5843e28565f (commit) via fc96ec08742ee5b9cc3592744ccbe00ee5b55a43 (commit) via e89687668d5b0ef501a0930a5977516d1c3a6983 (commit) via c7cfc783035bdfc34b966d9ee22133314238b101 (commit) via 1f98f0d34770fd94aabc58100295bb1b525402fc (commit) via 92215dfd2ab7cbf7432792b63919260f24fc2f99 (commit) via dfc5e72d02c65b18064c15396947fe0e4da99f68 (commit) via bdecc7f73eb87f07195264434a28aebf0bd23d13 (commit) via 5f55b0ea486fdd1f5158543bb3d5ea349a2beaf7 (commit) via f03b03878e97990d8894694684be181c98fa9d68 (commit) via 6285c4a6b8b2ce15fbf8214a0f6db987182ae068 (commit) via 131f8443a3d1200c0ea7aa4b8ab27de14139516c (commit) via e9cc1881dc83ba34ff8e165749e2637d277ce2f9 (commit) via c80d45378a38bf228d10928e1f969a13d7cff394 (commit) via 716637c4abfba44fdb110c35873a962c035f9330 (commit) via 1596e125b61da4b495cc4fc7d8b6dde1d200f331 (commit) via 4b8de5f96d548860f4cca1ab6d3db7e0d274cc15 (commit) via 42d6cce77b7147c68736317f67745a31313a082f (commit) via d2924c7ae70c56301def2dda7208bd4d11533651 (commit) via 58e6ee3553cb3b371820fd0877ff5617ddd01a8a (commit) via 322ba6901c548567df4aa87f109ad1a846560db3 (commit) via 04e10da6e3ea11aae013c304ae5934412f1b1077 (commit) via b67803358c40b94216b8999d37fc92b1ac387b32 (commit) via 79852862082d78a38c74b17c859369c641b4aaec (commit) via f97736649fff5fea479e1ca02992036385dc1ea5 (commit) via 7835329e32b6ea24693a19dc410eb175bac0c68b (commit) via 1d96a84b44eda31edd2dbb9cd7e10d8c6ef753d3 (commit) via 4f0d78f1d91619b2cc67fade8c23ba88d6614371 (commit) via 7101c699c87270e7aba7c31e7bc17b4bc90c8749 (commit) via 46d31277c1972f980e92275ea57112a5e7150bcf (commit) via ca763d4ff11c3d25433fe36c2c03f8e5f467ef49 (commit) via a4c10c32063e0bff651303b8d29efd840b32245b (commit) via f45aea8859d55b8d2112dc0429b199318b315ecd (commit) via 247f0f72cf4b23fa9c0684ea5fb314f0480c3a3a (commit) via dad55ef1481cb82a93bac73d7d5793b7bfe4cdf5 (commit) via f55e7b8348e89f626d734bd0003df9d5e3e95aa5 (commit) via 6fa16ea77fa9d1a08cf696f40fae8c07603b94d8 (commit) via 023a6bd3fbdb4b188cb9fd79e6b79990b01600f6 (commit) via 9fd6af9699962e5d541363755b2423534fa5dc2b (commit) via b55a46a0f6bca06b479926aa4128863b68a2c5b1 (commit) via e505ed37db59fb29c1d6ca16c21f6191f53b57d2 (commit) via 62b9a12e8939e43a04324c731407ea761550b969 (commit) via 2a758b96abd700816c85726f92ac5b63bc1e41e0 (commit) via 6e6d192c91a2ffe3aaf17f1cfe35643e44189964 (commit) via 5d130be05c2339b5cf6d9385a9fc45a14bf64e16 (commit) via 5648e587a8e9f44a00d32baeb099ff710c2aaf0f (commit) via a8d9d90025d9bfe06e794b7c65d0f1e68ed2a62d (commit) via b0357025e671afd224831b0d67ba8fbd8a2e26e2 (commit) via 65a3305fa8903ef296fb1cf6d6543845ab9f8f07 (commit) via b6f1cc4bc87912b228e63acea44ef6b0d61a3e4d (commit) via 7ab97b5e7a4ea6b7a8fa1084af8f4e4b12ed088b (commit) via 95375a5587cad20f7616bc9cdb405ed22e333980 (commit) via 6c6b1799f98163d6a2db56980a6af127146671d1 (commit) via 58b01989b818b409f8e43e9ea907b703ffda7d3e (commit) via 1022596f76b82cace87f60d27e4b42cbbe246b3d (commit) via 60782af15a0e53eba4ca76473dbf1a17f15c2fbb (commit) via 1b3cee99fbf1d1357f8c69b9f33404bfdb5d7363 (commit) via e3c2a8d6caa2826710ae8ff017ebdb8f48428753 (commit) via f94ca773990f95e0f1cf205798670115a1f12917 (commit) via 4a8a82ffc476c39a6ba49e883324d392c61c3cfe (commit) via 41113de9a2856d0fcd0df83ca4ce25a2d71a6cc2 (commit) via fd4b3eb10398fff954378b4d515b9c5811008fa0 (commit) via 1ab828f8efcb85e51fe081208ae7387686c3e7da (commit) via d044ad998c5bf649e51ffaad12539067e8a7e0bc (commit) via ec648509014c6f7c83bce7bc95dbcf6c771bb672 (commit) via 5134fc5fdabb56ad66a961c3d4134875dd23f329 (commit) via 1e9ecb079ad5c6c172116d6a0beef6a342059b0e (commit) via 4ada2117131f85e438727d28f4606e5357304136 (commit) via 6e1b58b9802c427294e5fc66b6e7d518485d0aad (commit) via 40a1e7a2c4ea3cc5c0e312c6f83b1e85e185bb1d (commit) via 5a079e03a47112f6825bd98fad0acd4b75fae094 (commit) via 34566d433bb97cde593f8c7a3181c2a08689be6f (commit) via 2b37e8b79b286993d9c69eb5797fe2ae70652229 (commit) via e4acbac64745fc2297cb6ed183b344a09dc3a392 (commit) via fdf1c3cdab6c931bf1d4ad6ad2ef4d2250997cb9 (commit) via 3f7cf2d0b32ad6c14655aecbd665ae66059285dd (commit) from 9318df8e7511694c5652a91029ad1245328452cc (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 77d9d11f9249edeaedef943766c243c595952ad8 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri May 26 17:11:43 2023 -0500 Remove multicast from rig_state structure as it breaks backwards compability on DLL with WSJT-X This is due to the callbacks structure being realigned as the state structure expanded https://github.com/Hamlib/Hamlib/issues/1299 diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 424f404e0..81d5088e2 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -2629,7 +2629,7 @@ struct rig_state { char client_version[32]; /*!<! Allow client to report version for compatibility checks/capability */ freq_t offset_vfoa; /*!< Offset to apply to VFOA/Main set_freq */ freq_t offset_vfob; /*!< Offset to apply to VFOB/Sub set_freq */ - struct multicast_s *multicast; /*!< Pointer to multicast server data */ +// struct multicast_s *multicast; /*!< Pointer to multicast server data */ }; //! @cond Doxygen_Suppress diff --git a/src/multicast.c b/src/multicast.c index de834c7e1..b4b62e2c4 100644 --- a/src/multicast.c +++ b/src/multicast.c @@ -13,6 +13,7 @@ #endif #include "hamlib/rig.h" #include "misc.h" +#if 0 #include "multicast.h" #define RIG_MULTICAST_ADDR "224.0.0.1" @@ -524,3 +525,4 @@ int main(int argc, char *argv[]) return 0; } #endif +#endif diff --git a/src/rig.c b/src/rig.c index 8fa59756c..33cbb8226 100644 --- a/src/rig.c +++ b/src/rig.c @@ -7599,6 +7599,7 @@ HAMLIB_EXPORT(void) sync_callback(int lock) void rig_lock(RIG *rig, int lock) { #ifdef HAVE_PTHREAD +#if 0 //MULTICAST disabled as it breaks the DLL backwards compatibility if (rig->state.multicast == NULL) { return; } // not initialized yet @@ -7620,6 +7621,7 @@ void rig_lock(RIG *rig, int lock) } #endif +#endif } diff --git a/tests/rigtestmcast.c b/tests/rigtestmcast.c index fe87a8512..0ea3d0ef6 100644 --- a/tests/rigtestmcast.c +++ b/tests/rigtestmcast.c @@ -31,9 +31,9 @@ int main(int argc, char *argv[]) #endif rig->state.rigport.parm.serial.rate = 38400; rig_open(rig); - multicast_init(rig, "224.0.0.1", 4532); - printf("threadid=%lld\n", (long long)rig->state.multicast->threadid); - pthread_join(rig->state.multicast->threadid, NULL); +// multicast_init(rig, "224.0.0.1", 4532); + //printf("threadid=%lld\n", (long long)rig->state.multicast->threadid); + //pthread_join(rig->state.multicast->threadid, NULL); pthread_exit(NULL); return 0; } commit 81dd39319b2a973ab7bb83b17b789a4e157a2033 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri May 26 12:19:50 2023 -0500 Clean up startup messages in newcat.c when power is off diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 4be778958..de96b331d 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -1579,6 +1579,11 @@ int newcat_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) { RETURNFUNC(-RIG_ENAVAIL); } + if (rig->state.powerstat == 0) + { + rig_debug(RIG_DEBUG_WARN, "%s: Cannot get from rig when power is off\n", __func__); + return RIG_OK; // to prevent repeats + } err = newcat_set_vfo_from_alias(rig, &vfo); @@ -10449,6 +10454,11 @@ int newcat_get_vfo_mode(RIG *rig, vfo_t vfo, rmode_t *vfo_mode) { RETURNFUNC(err); } + if (rig->state.powerstat == 0) + { + rig_debug(RIG_DEBUG_WARN, "%s: Cannot get from rig when power is off\n", __func__); + return RIG_OK; // to prevent repeats + } /* vfo, mem, P7 ************************** */ // e.g. FT450 has 27 byte IF response, FT991 has 28 byte if response (one more byte for P2 VFO A Freq) @@ -10537,6 +10547,7 @@ int newcat_get_cmd(RIG *rig) int is_power_status_cmd = strncmp(priv->cmd_str, "PS", 2) == 0; ENTERFUNC; + priv->ret_data[0] = 0; // ensure zero-length ret_data by default if (state->powerstat == 0 && !is_power_status_cmd) { diff --git a/rigs/yaesu/newcat.h b/rigs/yaesu/newcat.h index 05b8f2fdb..02eb111ca 100644 --- a/rigs/yaesu/newcat.h +++ b/rigs/yaesu/newcat.h @@ -50,7 +50,7 @@ typedef char ncboolean; /* shared function version */ -#define NEWCAT_VER "20230517" +#define NEWCAT_VER "20230526" /* Hopefully large enough for future use, 128 chars plus '\0' */ #define NEWCAT_DATA_LEN 129 commit ccd832d4cb0b01f8623bbe849513742aaf3fc501 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri May 26 11:04:42 2023 -0500 Improve power on message in rig.c diff --git a/src/rig.c b/src/rig.c index c9359ae8d..8fa59756c 100644 --- a/src/rig.c +++ b/src/rig.c @@ -1295,7 +1295,7 @@ int HAMLIB_API rig_open(RIG *rig) { // rig_open() should succeed even if the rig is powered off, so simply log power status rig_debug(RIG_DEBUG_ERR, - "%s: rig power is off, use --set-conf=auto_power_on=1 if power on is wanted\n", + "%s: rig power is off, use --set-conf=auto_power_on=1 or set_powerstat if power on is wanted\n", __func__); } commit 8d465a257ee9a5e0f4a472ec74c43b0c6a6b495e Author: Mike Black W9MDB <mdb...@ya...> Date: Fri May 26 10:53:32 2023 -0500 Fix a couple more debug statements diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 0585b2729..4be778958 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -2991,7 +2991,7 @@ int newcat_get_xit(RIG *rig, vfo_t vfo, shortfreq_t *xit) if (offset == 0) { rig_debug(RIG_DEBUG_ERR, - "%s: incorrect length of IF response, expected 27 or 28, got %du", __func__, + "%s: incorrect length of IF response, expected 27 or 28, got %du\n", __func__, (int)strlen(priv->ret_data)); RETURNFUNC(-RIG_EPROTO); } @@ -10461,7 +10461,7 @@ int newcat_get_vfo_mode(RIG *rig, vfo_t vfo, rmode_t *vfo_mode) default: rig_debug(RIG_DEBUG_ERR, - "%s: incorrect length of IF response, expected 27 or 28, got %d", __func__, + "%s: incorrect length of IF response, expected 27 or 28, got %d\n", __func__, (int)strlen(priv->ret_data)); RETURNFUNC(-RIG_EPROTO); } commit 06f5d8376f6bbc152f0342fccdff5c5a3b29aa88 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri May 26 10:52:04 2023 -0500 Fix debug message eol diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 39219adeb..0585b2729 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -2875,7 +2875,7 @@ int newcat_get_rit(RIG *rig, vfo_t vfo, shortfreq_t *rit) if (offset == 0) { rig_debug(RIG_DEBUG_ERR, - "%s: incorrect length of IF response, expected 27 or 28, got %du", __func__, + "%s: incorrect length of IF response, expected 27 or 28, got %du\n", __func__, (int)strlen(priv->ret_data)); RETURNFUNC(-RIG_EPROTO); } commit f01a165ec774c98479543665b15074b39c831b73 Merge: 610bf2d90 fd68723da Author: Michael Black <mdb...@ya...> Date: Fri May 26 10:47:35 2023 -0500 Merge pull request #1302 from mikaelnousiainen/power-status-bug-fixes Power status bug fixes commit fd68723da1fbccb922bc7eb74f580869b0105f72 Author: Mikael Nousiainen <mik...@ik...> Date: Fri May 26 18:03:20 2023 +0300 Fix issues with power status handling in rigctl+rigctld and the Yaesu backend diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 4822c511d..39219adeb 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -10534,10 +10534,11 @@ int newcat_get_cmd(RIG *rig) int retry_count = 0; int rc = -RIG_EPROTO; int is_read_cmd = 0; + int is_power_status_cmd = strncmp(priv->cmd_str, "PS", 2) == 0; ENTERFUNC; - if (state->powerstat == 0) + if (state->powerstat == 0 && !is_power_status_cmd) { rig_debug(RIG_DEBUG_WARN, "%s: Cannot get from rig when power is off\n", __func__); return RIG_OK; // to prevent repeats @@ -10614,14 +10615,13 @@ int newcat_get_cmd(RIG *rig) || strcmp(priv->cmd_str, "VT0;") == 0 || strcmp(priv->cmd_str, "VT1;") == 0; - if (priv->cmd_str[2] != - ';' && !is_read_cmd) // then we must be setting something so we'll invalidate the cache + if (priv->cmd_str[2] != ';' && !is_read_cmd) { + // then we must be setting something so we'll invalidate the cache rig_debug(RIG_DEBUG_TRACE, "%s: cache invalidated\n", __func__); priv->cache_start.tv_sec = 0; } - while (rc != RIG_OK && retry_count++ <= state->rigport.retry) { rig_flush(&state->rigport); /* discard any unsolicited data */ @@ -10630,11 +10630,8 @@ int newcat_get_cmd(RIG *rig) /* send the command */ rig_debug(RIG_DEBUG_TRACE, "cmd_str = %s\n", priv->cmd_str); - - if (strncmp(priv->cmd_str,"PS",2)==0) state->rigport.timeout_retry = 0; - if (RIG_OK != (rc = write_block(&state->rigport, - (unsigned char *) priv->cmd_str, - strlen(priv->cmd_str)))) + rc = write_block(&state->rigport, (unsigned char *) priv->cmd_str, strlen(priv->cmd_str)); + if (rc != RIG_OK) { RETURNFUNC(rc); } @@ -10646,9 +10643,10 @@ int newcat_get_cmd(RIG *rig) &cat_term, sizeof(cat_term), 0, 1)) <= 0) { // if we get a timeout from PS probably means power is off - if (strncmp(priv->cmd_str,"PS",2)==0) { + if (rc == -RIG_ETIMEOUT && is_power_status_cmd) + { rig_debug(RIG_DEBUG_WARN, "%s: rig power is off?\n", __func__); - return -RIG_ETIMEOUT; + RETURNFUNC(rc); } continue; /* usually a timeout - retry */ } diff --git a/src/rig.c b/src/rig.c index 16047ea37..c9359ae8d 100644 --- a/src/rig.c +++ b/src/rig.c @@ -100,7 +100,7 @@ const char *hamlib_version2 = "Hamlib " PACKAGE_VERSION " " HAMLIBDATETIME " " ARCHBITS; HAMLIB_EXPORT_VAR(int) cookie_use; HAMLIB_EXPORT_VAR(int) lock_mode; // for use by rigctld -HAMLIB_EXPORT_VAR(powerstat_t) rig_powerstat; // for use by rigctld +HAMLIB_EXPORT_VAR(powerstat_t) rig_powerstat; // for use by both rigctld and rigctl //! @endcond struct rig_caps caps_test; @@ -6167,6 +6167,12 @@ int HAMLIB_API rig_set_powerstat(RIG *rig, powerstat_t status) HAMLIB_TRACE; retcode = rig->caps->set_powerstat(rig, status); + + if (retcode == RIG_OK) + { + rig->state.powerstat = status; + } + // if anything is queued up flush it rig_flush_force(&rig->state.rigport, 1); RETURNFUNC(retcode); @@ -6214,7 +6220,11 @@ int HAMLIB_API rig_get_powerstat(RIG *rig, powerstat_t *status) HAMLIB_TRACE; retcode = rig->caps->get_powerstat(rig, status); - if (retcode != RIG_OK) + if (retcode == RIG_OK) + { + rig->state.powerstat = *status; + } + else { // if failed, assume power is on *status = RIG_POWER_ON; diff --git a/tests/rigctl.c b/tests/rigctl.c index b2a7a322b..22253a9de 100644 --- a/tests/rigctl.c +++ b/tests/rigctl.c @@ -111,6 +111,7 @@ static struct option long_options[] = }; extern char rig_resp_sep; +extern powerstat_t rig_powerstat; #define MAXCONFLEN 1024 @@ -149,6 +150,7 @@ int main(int argc, char *argv[]) int i; char rigstartup[1024]; char vbuf[1024]; + rig_powerstat = RIG_POWER_ON; // defaults to power on int err = setvbuf(stderr, vbuf, _IOFBF, sizeof(vbuf)); @@ -575,6 +577,12 @@ int main(int argc, char *argv[]) my_rig->caps->model_name); } + if (my_rig->caps->get_powerstat) + { + rig_get_powerstat(my_rig, &rig_powerstat); + my_rig->state.powerstat = rig_powerstat; + } + if (my_rig->caps->rig_model == RIG_MODEL_NETRIGCTL) { /* We automatically detect if we need to be in vfo mode or not */ @@ -650,6 +658,21 @@ int main(int argc, char *argv[]) interactive, prompt, &vfo_opt, send_cmd_term, &ext_resp, &rig_resp_sep, 0); + // If we get a timeout, the rig might be powered off + // Update our power status in case power gets turned off + if (retcode == -RIG_ETIMEOUT && my_rig->caps->get_powerstat) + { + powerstat_t powerstat; + + rig_get_powerstat(my_rig, &powerstat); + rig_powerstat = powerstat; + + if (powerstat == RIG_POWER_OFF || powerstat == RIG_POWER_STANDBY) + { + retcode = -RIG_EPOWER; + } + } + // if we get a hard error we try to reopen the rig again // this should cover short dropouts that can occur if (retcode < 0 && !RIG_IS_SOFT_ERRCODE(-retcode)) diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index b267e69b1..fc60828bd 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -104,7 +104,7 @@ char rigctld_password[64]; int is_passwordOK; int is_rigctld; extern int lock_mode; // used by rigctld -extern int rig_powerstat; +extern powerstat_t rig_powerstat; @@ -4723,7 +4723,6 @@ declare_proto_rig(set_powerstat) retval = rig_set_powerstat(rig, (powerstat_t) stat); if (retval == RIG_OK) { - rig->state.powerstat = stat; rig_powerstat = stat; // update our global so others can see powerstat } fflush(fin); @@ -4752,7 +4751,6 @@ declare_proto_rig(get_powerstat) } fprintf(fout, "%d\n", stat); - rig->state.powerstat = stat; rig_powerstat = stat; // update our global so others can see powerstat RETURNFUNC2(status); diff --git a/tests/rigctld.c b/tests/rigctld.c index 8b75bbca6..bd0ad1b6b 100644 --- a/tests/rigctld.c +++ b/tests/rigctld.c @@ -1278,9 +1278,9 @@ void *handle_socket(void *arg) if (retcode != 0) { rig_debug(RIG_DEBUG_VERBOSE, "%s: rigctl_parse retcode=%d\n", __func__, retcode); } - // update our power stat in case power gets turned off - if (retcode == -RIG_ETIMEOUT - && my_rig->caps->get_powerstat) // if we get a timeout we might be powered off + // If we get a timeout, the rig might be powered off + // Update our power status in case power gets turned off + if (retcode == -RIG_ETIMEOUT && my_rig->caps->get_powerstat) { rig_get_powerstat(my_rig, &powerstat); rig_powerstat = powerstat; commit 8730e6a0b141367a3f74b23629257b6236de50a8 Author: Mikael Nousiainen <mik...@ik...> Date: Tue May 23 23:25:27 2023 +0300 IC-746 and IC-756ProII+III support AGC_TIME diff --git a/rigs/icom/ic746.c b/rigs/icom/ic746.c index d96309651..95787dcb9 100644 --- a/rigs/icom/ic746.c +++ b/rigs/icom/ic746.c @@ -54,7 +54,7 @@ #define IC746_FUNC_ALL (RIG_FUNC_NB|RIG_FUNC_COMP|RIG_FUNC_VOX|RIG_FUNC_TONE|RIG_FUNC_TSQL|RIG_FUNC_SBKIN|RIG_FUNC_FBKIN|RIG_FUNC_NR|RIG_FUNC_MON|RIG_FUNC_MN|RIG_FUNC_RF|RIG_FUNC_ANF|RIG_FUNC_APF|RIG_FUNC_RESUME|RIG_FUNC_ARO) -#define IC746_LEVEL_ALL (RIG_LEVEL_AF|RIG_LEVEL_RF|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_APF) +#define IC746_LEVEL_ALL (RIG_LEVEL_AF|RIG_LEVEL_RF|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_APF|RIG_LEVEL_AGC_TIME) #define IC746_GET_PARM (RIG_PARM_BACKLIGHT|RIG_PARM_BEEP) #define IC746_SET_PARM (RIG_PARM_BACKLIGHT|RIG_PARM_BEEP|RIG_PARM_ANN) diff --git a/rigs/icom/ic756.c b/rigs/icom/ic756.c index 70ce3bcaa..4dc752a9c 100644 --- a/rigs/icom/ic756.c +++ b/rigs/icom/ic756.c @@ -537,7 +537,7 @@ static int ic756pro2_get_ext_parm(RIG *rig, token_t token, value_t *val); #define IC756PROII_OTHER_TX_MODES (RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_FM) #define IC756PROII_AM_TX_MODES (RIG_MODE_AM) -#define IC756PROII_LEVEL_ALL (IC756PRO_LEVEL_ALL|RIG_LEVEL_VOXDELAY) +#define IC756PROII_LEVEL_ALL (IC756PRO_LEVEL_ALL|RIG_LEVEL_VOXDELAY|RIG_LEVEL_AGC_TIME) #define IC756PROII_PARMS (RIG_PARM_ANN|RIG_PARM_BEEP|RIG_PARM_BACKLIGHT|RIG_PARM_TIME) commit 610bf2d90324f9f1d722923e116943192e748a17 Merge: 79492d428 b6fe91504 Author: Michael Black <mdb...@ya...> Date: Tue May 23 15:05:54 2023 -0500 Merge pull request #1301 from GeoBaltz/man1 Man1 commit b6fe91504f06534fa601320fbd7645e619d3a3b3 Author: George Baltz N3GB <Geo...@gm...> Date: Tue May 23 13:14:28 2023 -0400 Avoid NULL dereference in debug statement. diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index 496494557..7e151db8b 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -246,7 +246,7 @@ int kenwood_transaction(RIG *rig, const char *cmdstr, char *data, struct kenwood_priv_caps *caps = kenwood_caps(rig); struct rig_state *rs; - if (datasize > 0 && datasize < strlen(cmdstr)) { + if (datasize > 0 && datasize < (cmdstr ? strlen(cmdstr) : 0)) { rig_debug(RIG_DEBUG_WARN, "%s called cmd=%s datasize=%d, datasize < cmd length?\n", __func__, cmdstr ? cmdstr : "(NULL)", (int)datasize); commit 79492d42844b4bcbe8f7e1f5b374960311b4e7c6 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue May 23 10:11:51 2023 -0500 Put enter/leave CAT in FT767GX.c again and reduce write_delay to zero. Hopefully speeds things up and still works but may need to tweak write_delay https://github.com/Hamlib/Hamlib/issues/1300 diff --git a/rigs/yaesu/ft767gx.c b/rigs/yaesu/ft767gx.c index c51318ce8..d8c60c0a2 100644 --- a/rigs/yaesu/ft767gx.c +++ b/rigs/yaesu/ft767gx.c @@ -259,7 +259,7 @@ const struct rig_caps ft767gx_caps = RIG_MODEL(RIG_MODEL_FT767), .model_name = "FT-767GX", .mfg_name = "Yaesu", - .version = "20230522.0", + .version = "20230523.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -468,7 +468,6 @@ int ft767_open(RIG *rig) return retval; } -#if 0 // we should be able to leave CAT on and just turn off on close retval = ft767_leave_CAT(rig); if (retval < 0) @@ -477,7 +476,6 @@ int ft767_open(RIG *rig) memset(priv->update_data, 0, FT767GX_STATUS_UPDATE_DATA_LENGTH); return retval; } -#endif rig->state.vfo_list = RIG_VFO_A | RIG_VFO_B; return RIG_OK; @@ -514,7 +512,6 @@ int ft767_set_freq(RIG *rig, vfo_t vfo, freq_t freq) /* fill in first four bytes */ to_bcd(cmd, freq / 10, 8); -#if 0 retval = ft767_enter_CAT(rig); if (retval < 0) @@ -522,7 +519,6 @@ int ft767_set_freq(RIG *rig, vfo_t vfo, freq_t freq) rig_debug(RIG_DEBUG_ERR, "%s: enter_CAT %d\n", __func__, retval); return retval; } -#endif retval = ft767_send_block_and_ack(rig, cmd, YAESU_CMD_LENGTH); @@ -533,14 +529,12 @@ int ft767_set_freq(RIG *rig, vfo_t vfo, freq_t freq) return retval; } -#if 0 retval = ft767_leave_CAT(rig); if (retval < 0) { rig_debug(RIG_DEBUG_ERR, "%s: leave_CAT %d\n", __func__, retval); } -#endif return retval; } @@ -553,7 +547,6 @@ int ft767_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) /* fill in p1 */ cmd[3] = mode2rig(rig, mode); -#if 0 retval = ft767_enter_CAT(rig); if (retval < 0) @@ -561,7 +554,6 @@ int ft767_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) rig_debug(RIG_DEBUG_ERR, "%s: enter_CAT %d\n", __func__, retval); return retval; } -#endif retval = ft767_send_block_and_ack(rig, cmd, YAESU_CMD_LENGTH); @@ -572,14 +564,12 @@ int ft767_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) return retval; } -#if 0 retval = ft767_leave_CAT(rig); if (retval < 0) { rig_debug(RIG_DEBUG_ERR, "%s: leave_CAT %d\n", __func__, retval); } -#endif return retval; } @@ -690,7 +680,6 @@ int ft767_set_vfo(RIG *rig, vfo_t vfo) priv->current_vfo = vfo; -#if 0 retval = ft767_enter_CAT(rig); if (retval < 0) @@ -698,7 +687,6 @@ int ft767_set_vfo(RIG *rig, vfo_t vfo) rig_debug(RIG_DEBUG_ERR, "%s: enter_CAT %d\n", __func__, retval); return retval; } -#endif retval = ft767_send_block_and_ack(rig, cmd, YAESU_CMD_LENGTH); @@ -709,14 +697,12 @@ int ft767_set_vfo(RIG *rig, vfo_t vfo) return retval; } -#if 0 retval = ft767_leave_CAT(rig); if (retval < 0) { rig_debug(RIG_DEBUG_ERR, "%s: leave_CAT %d\n", __func__, retval); } -#endif return retval; } @@ -781,7 +767,6 @@ int ft767_set_ctcss_tone(RIG *rig, vfo_t vfo, tone_t tone) /* cmd[3] = tone2rig(rig, tone); */ -#if 0 retval = ft767_enter_CAT(rig); if (retval < 0) @@ -789,7 +774,6 @@ int ft767_set_ctcss_tone(RIG *rig, vfo_t vfo, tone_t tone) rig_debug(RIG_DEBUG_ERR, "%s: enter_CAT %d\n", __func__, retval); return retval; } -#endif retval = ft767_send_block_and_ack(rig, cmd, YAESU_CMD_LENGTH); @@ -800,14 +784,12 @@ int ft767_set_ctcss_tone(RIG *rig, vfo_t vfo, tone_t tone) return retval; } -#if 0 retval = ft767_leave_CAT(rig); if (retval < 0) { rig_debug(RIG_DEBUG_ERR, "%s: leave_CAT %d\n", __func__, retval); } -#endif return retval; } @@ -903,7 +885,6 @@ int ft767_set_split_freq(RIG *rig, vfo_t vfo, freq_t tx_freq) /* fill in first four bytes */ to_bcd(freq_cmd, tx_freq / 10, 8); -#if 0 retval = ft767_enter_CAT(rig); if (retval < 0) @@ -911,7 +892,6 @@ int ft767_set_split_freq(RIG *rig, vfo_t vfo, freq_t tx_freq) rig_debug(RIG_DEBUG_ERR, "%s: enter_CAT %d\n", __func__, retval); return retval; } -#endif /* change to the xmit VFO */ vfo_cmd[3] = vfo2rig(rig, change_vfo); @@ -945,14 +925,12 @@ int ft767_set_split_freq(RIG *rig, vfo_t vfo, freq_t tx_freq) return retval; } -#if 0 retval = ft767_leave_CAT(rig); if (retval < 0) { rig_debug(RIG_DEBUG_ERR, "%s: leave_CAT %d\n", __func__, retval); } -#endif return RIG_OK; } @@ -1070,7 +1048,6 @@ int ft767_set_split_mode(RIG *rig, vfo_t vfo, rmode_t tx_mode, /* fill in p1 */ mode_cmd[3] = mode2rig(rig, tx_mode); -#if 0 retval = ft767_enter_CAT(rig); if (retval < 0) @@ -1078,7 +1055,6 @@ int ft767_set_split_mode(RIG *rig, vfo_t vfo, rmode_t tx_mode, rig_debug(RIG_DEBUG_ERR, "%s: enter_CAT %d\n", __func__, retval); return retval; } -#endif /* change to the xmit VFO */ vfo_cmd[3] = vfo2rig(rig, change_vfo); @@ -1112,14 +1088,12 @@ int ft767_set_split_mode(RIG *rig, vfo_t vfo, rmode_t tx_mode, return retval; } -#if 0 retval = ft767_leave_CAT(rig); if (retval < 0) { rig_debug(RIG_DEBUG_ERR, "%s: leave_CAT %d\n", __func__, retval); } -#endif return RIG_OK; } @@ -1259,7 +1233,6 @@ int ft767_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo) rig_flush(&rig->state.rigport); -#if 0 retval = ft767_enter_CAT(rig); if (retval < 0) @@ -1267,7 +1240,6 @@ int ft767_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo) rig_debug(RIG_DEBUG_ERR, "%s: enter_CAT %d\n", __func__, retval); return retval; } -#endif /* See whether we need to toggle the split state */ curr_split = priv->update_data[STATUS_FLAGS] & STATUS_MASK_SPLIT; @@ -1318,7 +1290,6 @@ int ft767_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo) } } -#if 0 retval = ft767_leave_CAT(rig); if (retval < 0) @@ -1326,7 +1297,6 @@ int ft767_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo) rig_debug(RIG_DEBUG_ERR, "%s: leave_CAT %d\n", __func__, retval); return retval; } -#endif break; diff --git a/rigs/yaesu/ft767gx.h b/rigs/yaesu/ft767gx.h index b9fe60c5b..a60f1eb6d 100644 --- a/rigs/yaesu/ft767gx.h +++ b/rigs/yaesu/ft767gx.h @@ -32,7 +32,7 @@ #define FT767GX_PACING_INTERVAL 5 #define FT767GX_PACING_DEFAULT_VALUE 0 -#define FT767GX_WRITE_DELAY 50 +#define FT767GX_WRITE_DELAY 0 /* Sequential fast writes confuse my FT767GX without this delay */ commit ae14af4bc1a1cf67ce25b8ee5ef3567a54c63c70 Author: George Baltz N3GB <Geo...@gm...> Date: Sun May 21 05:50:42 2023 -0400 Add missing commands to man pages diff --git a/doc/man1/rigctl.1 b/doc/man1/rigctl.1 index c7b497246..7627ada63 100644 --- a/doc/man1/rigctl.1 +++ b/doc/man1/rigctl.1 @@ -734,6 +734,11 @@ Stop sending the current morse code. Wait for morse to finish -- only works on full break-in . .TP +.BR 0x94 ", " send_voice_mem " \(aq" \fIMsgnum\fP \(aq +Have rig transmit internal message +.RI \(aq Msgnum \(aq +. +.TP .BR 0x8b ", " get_dcd Get .RI \(aq DCD \(aq diff --git a/doc/man1/rigctld.1 b/doc/man1/rigctld.1 index d701673a4..af3b6b4e0 100644 --- a/doc/man1/rigctld.1 +++ b/doc/man1/rigctld.1 @@ -726,6 +726,19 @@ Send symbols. . .TP +.BR 0xbb ", " stop_morse " +Stop sending the current morse code. +. +.TP +.BR 0xbc ", " wait_morse " +Wait for morse to finish -- only works on full break-in +. +.TP +.BR 0x94 ", " send_voice_mem " \(aq" \fIMsgnum\fP \(aq +Have rig transmit internal message +.RI \(aq Msgnum \(aq +. +.TP .BR 0x8b ", " get_dcd Get .RI \(aq DCD \(aq commit a7d24a99dbe9b63f813aa568dd35ffd8eb217227 Author: George Baltz N3GB <Geo...@gm...> Date: Sat May 20 16:43:42 2023 -0400 Fix typos (missing '('s ) in man pages. diff --git a/doc/man1/rigctl.1 b/doc/man1/rigctl.1 index cf3aa0821..c7b497246 100644 --- a/doc/man1/rigctl.1 +++ b/doc/man1/rigctl.1 @@ -876,9 +876,9 @@ Level is a token: \(oqPREAMP\(cq, \(oqATT\(cq, \(oqVOXDELAY\(cq, \(oqAF\(cq, \(oqBAL\(cq, \(oqMETER\(cq, \(oqVOXGAIN\(cq, \(oqANTIVOX\(cq, \(oqSLOPE_LOW\(cq, \(oqSLOPE_HIGH\(cq, \(oqBKIN_DLYMS\(cq, \(oqRAWSTR\(cq, \(oqSWR\(cq, \(oqALC\(cq, \(oqSTRENGTH\(cq, \(oqRFPOWER_METER\(cq, \(oqCOMPMETER\(cq, \(oqVD_METER\(cq, \(oqID_METER\(cq, -\(oqNOTCHF_RAW\(cq, \(oqMONITOR_GAIN\(cq, \(oqNQ\(cq, \(oqRFPOWER_METER_WATTS\cq, \(oqSPECTRUM_MODE\(cq, -\(oqSPECTRUM_SPAN\(cq, \(oqSPECTRUM_EDGE_LOW\(cq, \(oqSPECTRUM_EDGE_HIGH\(cq, \(oqSPECTRUM_SPEED\cq, -\(oqSPECTRUM_REF\(cq, (oqSPECTRUM_AVG\(cq, \(oqSPECTRUM_ATT\cq, \(oqTEMP_METER\cq, \(oqBAND_SELECT\(cq, +\(oqNOTCHF_RAW\(cq, \(oqMONITOR_GAIN\(cq, \(oqNQ\(cq, \(oqRFPOWER_METER_WATTS\(cq, \(oqSPECTRUM_MODE\(cq, +\(oqSPECTRUM_SPAN\(cq, \(oqSPECTRUM_EDGE_LOW\(cq, \(oqSPECTRUM_EDGE_HIGH\(cq, \(oqSPECTRUM_SPEED\(cq, +\(oqSPECTRUM_REF\(cq, \(oqSPECTRUM_AVG\(cq, \(oqSPECTRUM_ATT\(cq, \(oqTEMP_METER\(cq, \(oqBAND_SELECT\(cq, \(oqUSB_AF\(cq. .IP The Level Value can be a float or an integer value. For the AGC token the diff --git a/doc/man1/rigctld.1 b/doc/man1/rigctld.1 index 6b55bf59c..d701673a4 100644 --- a/doc/man1/rigctld.1 +++ b/doc/man1/rigctld.1 @@ -868,9 +868,9 @@ evel is a token: \(oqPREAMP\(cq, \(oqATT\(cq, \(oqVOXDELAY\(cq, \(oqAF\(cq, \(oqBAL\(cq, \(oqMETER\(cq, \(oqVOXGAIN\(cq, \(oqANTIVOX\(cq, \(oqSLOPE_LOW\(cq, \(oqSLOPE_HIGH\(cq, \(oqBKIN_DLYMS\(cq, \(oqRAWSTR\(cq, \(oqSWR\(cq, \(oqALC\(cq, \(oqSTRENGTH\(cq, \(oqRFPOWER_METER\(cq, \(oqCOMPMETER\(cq, \(oqVD_METER\(cq, \(oqID_METER\(cq, -\(oqNOTCHF_RAW\(cq, \(oqMONITOR_GAIN\(cq, \(oqNQ\(cq, \(oqRFPOWER_METER_WATTS\cq, \(oqSPECTRUM_MODE\(cq, -\(oqSPECTRUM_SPAN\(cq, \(oqSPECTRUM_EDGE_LOW\(cq, \(oqSPECTRUM_EDGE_HIGH\(cq, \(oqSPECTRUM_SPEED\cq, -\(oqSPECTRUM_REF\(cq, (oqSPECTRUM_AVG\(cq, \(oqSPECTRUM_ATT\cq, \(oqTEMP_METER\cq, \(oqBAND_SELECT\(cq, +\(oqNOTCHF_RAW\(cq, \(oqMONITOR_GAIN\(cq, \(oqNQ\(cq, \(oqRFPOWER_METER_WATTS\(cq, \(oqSPECTRUM_MODE\(cq, +\(oqSPECTRUM_SPAN\(cq, \(oqSPECTRUM_EDGE_LOW\(cq, \(oqSPECTRUM_EDGE_HIGH\(cq, \(oqSPECTRUM_SPEED\(cq, +\(oqSPECTRUM_REF\(cq, \(oqSPECTRUM_AVG\(cq, \(oqSPECTRUM_ATT\(cq, \(oqTEMP_METER\(cq, \(oqBAND_SELECT\(cq, \(oqUSB_AF\(cq. .IP The Level Value can be a float or an integer value. For the AGC token the commit 083669dbc8ba9610733d4af23c255093bb3d4a52 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon May 22 11:25:57 2023 -0500 Hopefully speed up FT767GX considerably https://github.com/Hamlib/Hamlib/issues/1300 diff --git a/rigs/yaesu/ft767gx.c b/rigs/yaesu/ft767gx.c index afc50a324..c51318ce8 100644 --- a/rigs/yaesu/ft767gx.c +++ b/rigs/yaesu/ft767gx.c @@ -259,7 +259,7 @@ const struct rig_caps ft767gx_caps = RIG_MODEL(RIG_MODEL_FT767), .model_name = "FT-767GX", .mfg_name = "Yaesu", - .version = "20210221.0", + .version = "20230522.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -468,6 +468,7 @@ int ft767_open(RIG *rig) return retval; } +#if 0 // we should be able to leave CAT on and just turn off on close retval = ft767_leave_CAT(rig); if (retval < 0) @@ -476,6 +477,7 @@ int ft767_open(RIG *rig) memset(priv->update_data, 0, FT767GX_STATUS_UPDATE_DATA_LENGTH); return retval; } +#endif rig->state.vfo_list = RIG_VFO_A | RIG_VFO_B; return RIG_OK; @@ -488,7 +490,13 @@ int ft767_open(RIG *rig) int ft767_close(RIG *rig) { - rig_flush(&rig->state.rigport); + int retval = ft767_leave_CAT(rig); + + if (retval < 0) + { + rig_debug(RIG_DEBUG_ERR, "%s: leave_CAT %d\n", __func__, retval); + return retval; + } return RIG_OK; } @@ -506,6 +514,7 @@ int ft767_set_freq(RIG *rig, vfo_t vfo, freq_t freq) /* fill in first four bytes */ to_bcd(cmd, freq / 10, 8); +#if 0 retval = ft767_enter_CAT(rig); if (retval < 0) @@ -513,6 +522,7 @@ int ft767_set_freq(RIG *rig, vfo_t vfo, freq_t freq) rig_debug(RIG_DEBUG_ERR, "%s: enter_CAT %d\n", __func__, retval); return retval; } +#endif retval = ft767_send_block_and_ack(rig, cmd, YAESU_CMD_LENGTH); @@ -523,12 +533,14 @@ int ft767_set_freq(RIG *rig, vfo_t vfo, freq_t freq) return retval; } +#if 0 retval = ft767_leave_CAT(rig); if (retval < 0) { rig_debug(RIG_DEBUG_ERR, "%s: leave_CAT %d\n", __func__, retval); } +#endif return retval; } @@ -541,6 +553,7 @@ int ft767_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) /* fill in p1 */ cmd[3] = mode2rig(rig, mode); +#if 0 retval = ft767_enter_CAT(rig); if (retval < 0) @@ -548,6 +561,7 @@ int ft767_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) rig_debug(RIG_DEBUG_ERR, "%s: enter_CAT %d\n", __func__, retval); return retval; } +#endif retval = ft767_send_block_and_ack(rig, cmd, YAESU_CMD_LENGTH); @@ -558,12 +572,14 @@ int ft767_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) return retval; } +#if 0 retval = ft767_leave_CAT(rig); if (retval < 0) { rig_debug(RIG_DEBUG_ERR, "%s: leave_CAT %d\n", __func__, retval); } +#endif return retval; } @@ -674,6 +690,7 @@ int ft767_set_vfo(RIG *rig, vfo_t vfo) priv->current_vfo = vfo; +#if 0 retval = ft767_enter_CAT(rig); if (retval < 0) @@ -681,6 +698,7 @@ int ft767_set_vfo(RIG *rig, vfo_t vfo) rig_debug(RIG_DEBUG_ERR, "%s: enter_CAT %d\n", __func__, retval); return retval; } +#endif retval = ft767_send_block_and_ack(rig, cmd, YAESU_CMD_LENGTH); @@ -691,12 +709,14 @@ int ft767_set_vfo(RIG *rig, vfo_t vfo) return retval; } +#if 0 retval = ft767_leave_CAT(rig); if (retval < 0) { rig_debug(RIG_DEBUG_ERR, "%s: leave_CAT %d\n", __func__, retval); } +#endif return retval; } @@ -761,6 +781,7 @@ int ft767_set_ctcss_tone(RIG *rig, vfo_t vfo, tone_t tone) /* cmd[3] = tone2rig(rig, tone); */ +#if 0 retval = ft767_enter_CAT(rig); if (retval < 0) @@ -768,6 +789,7 @@ int ft767_set_ctcss_tone(RIG *rig, vfo_t vfo, tone_t tone) rig_debug(RIG_DEBUG_ERR, "%s: enter_CAT %d\n", __func__, retval); return retval; } +#endif retval = ft767_send_block_and_ack(rig, cmd, YAESU_CMD_LENGTH); @@ -778,12 +800,14 @@ int ft767_set_ctcss_tone(RIG *rig, vfo_t vfo, tone_t tone) return retval; } +#if 0 retval = ft767_leave_CAT(rig); if (retval < 0) { rig_debug(RIG_DEBUG_ERR, "%s: leave_CAT %d\n", __func__, retval); } +#endif return retval; } @@ -879,6 +903,7 @@ int ft767_set_split_freq(RIG *rig, vfo_t vfo, freq_t tx_freq) /* fill in first four bytes */ to_bcd(freq_cmd, tx_freq / 10, 8); +#if 0 retval = ft767_enter_CAT(rig); if (retval < 0) @@ -886,6 +911,7 @@ int ft767_set_split_freq(RIG *rig, vfo_t vfo, freq_t tx_freq) rig_debug(RIG_DEBUG_ERR, "%s: enter_CAT %d\n", __func__, retval); return retval; } +#endif /* change to the xmit VFO */ vfo_cmd[3] = vfo2rig(rig, change_vfo); @@ -919,12 +945,14 @@ int ft767_set_split_freq(RIG *rig, vfo_t vfo, freq_t tx_freq) return retval; } +#if 0 retval = ft767_leave_CAT(rig); if (retval < 0) { rig_debug(RIG_DEBUG_ERR, "%s: leave_CAT %d\n", __func__, retval); } +#endif return RIG_OK; } @@ -1042,6 +1070,7 @@ int ft767_set_split_mode(RIG *rig, vfo_t vfo, rmode_t tx_mode, /* fill in p1 */ mode_cmd[3] = mode2rig(rig, tx_mode); +#if 0 retval = ft767_enter_CAT(rig); if (retval < 0) @@ -1049,6 +1078,7 @@ int ft767_set_split_mode(RIG *rig, vfo_t vfo, rmode_t tx_mode, rig_debug(RIG_DEBUG_ERR, "%s: enter_CAT %d\n", __func__, retval); return retval; } +#endif /* change to the xmit VFO */ vfo_cmd[3] = vfo2rig(rig, change_vfo); @@ -1082,12 +1112,14 @@ int ft767_set_split_mode(RIG *rig, vfo_t vfo, rmode_t tx_mode, return retval; } +#if 0 retval = ft767_leave_CAT(rig); if (retval < 0) { rig_debug(RIG_DEBUG_ERR, "%s: leave_CAT %d\n", __func__, retval); } +#endif return RIG_OK; } @@ -1227,6 +1259,7 @@ int ft767_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo) rig_flush(&rig->state.rigport); +#if 0 retval = ft767_enter_CAT(rig); if (retval < 0) @@ -1234,6 +1267,7 @@ int ft767_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo) rig_debug(RIG_DEBUG_ERR, "%s: enter_CAT %d\n", __func__, retval); return retval; } +#endif /* See whether we need to toggle the split state */ curr_split = priv->update_data[STATUS_FLAGS] & STATUS_MASK_SPLIT; @@ -1284,6 +1318,7 @@ int ft767_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo) } } +#if 0 retval = ft767_leave_CAT(rig); if (retval < 0) @@ -1291,6 +1326,7 @@ int ft767_set_split_vfo(RIG *rig, vfo_t vfo, split_t split, vfo_t tx_vfo) rig_debug(RIG_DEBUG_ERR, "%s: leave_CAT %d\n", __func__, retval); return retval; } +#endif break; commit 657e41fd099f81a4a9a63d1f2df4883867ccd851 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon May 22 09:32:04 2023 -0500 Add rig_date_strget to DLL for WSJTX use diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index c5ec621fc..424f404e0 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -3476,6 +3476,8 @@ extern HAMLIB_EXPORT(int) rig_get_lock_mode(RIG *rig, int *lock); extern HAMLIB_EXPORT(int) rig_is_model(RIG *rig, rig_model_t model); +extern HAMLIB_EXPORT(char*) rig_date_strget(char *buf, int buflen, int localtime); + //! @endcond diff --git a/src/misc.c b/src/misc.c index 467198065..8a3b1c4ee 100644 --- a/src/misc.c +++ b/src/misc.c @@ -2723,6 +2723,11 @@ char *date_strget(char *buf, int buflen, int localtime) return buf; } +char *rig_date_strget(char *buf, int buflen, int localtime) +{ + return date_strget(buf,buflen,localtime); +} + const char *spaces() { static char *s = " "; commit 7309b24411cb0437fb34654a9a46d4f54ab11ea3 Author: Mike Black W9MDB <mdb...@ya...> Date: Mon May 22 09:31:51 2023 -0500 Add simicom7100 diff --git a/simulators/Makefile.am b/simulators/Makefile.am index f4870bf84..78006dcf4 100644 --- a/simulators/Makefile.am +++ b/simulators/Makefile.am @@ -8,7 +8,7 @@ DISTCLEANFILES = bin_PROGRAMS = -check_PROGRAMS = simelecraft simicom simkenwood simyaesu simicom9100 simicom9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simicom7300 +check_PROGRAMS = simelecraft simicom simkenwood simyaesu simicom9100 simicom9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simft817 simts590 simft847 simicom7300 simicom7100 simelecraft_SOURCES = simelecraft.c simicom_SOURCES = simicom.c diff --git a/simulators/simicom7100.c b/simulators/simicom7100.c new file mode 100644 index 000000000..f19b074c7 --- /dev/null +++ b/simulators/simicom7100.c @@ -0,0 +1,530 @@ +// simicom will show the pts port to use for rigctl on Unix +// using virtual serial ports on Windows is to be developed yet +// Needs a lot of improvement to work on all Icoms +// gcc -g -Wall -o simicom simicom.c -lhamlib +// On mingw in the hamlib src directory +// gcc -static -I../include -g -Wall -o simicom simicom.c -L../../build/src/.libs -lhamlib -lwsock32 -lws2_32 +#define _XOPEN_SOURCE 700 +// since we are POSIX here we need this +struct ip_mreq +{ + int dummy; +}; + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <sys/time.h> +#include <hamlib/rig.h> +#include "../src/misc.h" +#include <termios.h> +#include <unistd.h> + + +#define BUFSIZE 256 +#define X25 + +int civ_731_mode = 0; +vfo_t current_vfo = RIG_VFO_A; +int split = 0; + +// we make B different from A to ensure we see a difference at startup +float freqA = 14074000; +float freqB = 14074500; +mode_t modeA = RIG_MODE_PKTUSB; +mode_t modeB = RIG_MODE_PKTUSB; +int datamodeA = 0; +int datamodeB = 0; +pbwidth_t widthA = 0; +pbwidth_t widthB = 1; +ant_t ant_curr = 0; +int ant_option = 0; +int ptt = 0; +int satmode = 0; +int agc_time = 1; +int ovf_status = 0; +int powerstat = 1; + +void dumphex(unsigned char *buf, int n) +{ + for (int i = 0; i < n; ++i) { printf("%02x ", buf[i]); } + + printf("\n"); +} + +int +frameGet(int fd, unsigned char *buf) +{ + int i = 0, n; + memset(buf, 0, BUFSIZE); + unsigned char c; + +again: + + while (read(fd, &c, 1) > 0) + { + buf[i++] = c; + //printf("i=%d, c=0x%02x\n",i,c); + + if (c == 0xfd) + { + char mytime[256]; + date_strget(mytime,sizeof(mytime),1); + printf("%s:", mytime); dumphex(buf, i); + // echo + n = write(fd, buf, i); + if (n != i) printf("%s: error on write: %s\n", __func__, strerror(errno)); + return i; + } + + if (i > 2 && c == 0xfe) + { + printf("Turning power on due to 0xfe string\n"); + powerstat = 1; + int j; + + for (j = i; j < 175; ++j) + { + if (read(fd, &c, 1) < 0) { break; } + } + + i = 0; + goto again; + } + } + + printf("Error??? c=x%02x\n", c); + + return 0; +} + +void frameParse(int fd, unsigned char *frame, int len) +{ + double freq; + int n = 0; + + dumphex(frame, len); + + if (frame[0] != 0xfe && frame[1] != 0xfe) + { + printf("expected fe fe, got "); + dumphex(frame, len); + return; + } + + switch (frame[4]) + { + case 0x03: + + //from_bcd(frameackbuf[2], (civ_731_mode ? 4 : 5) * 2); + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) + { + printf("get_freqA\n"); + to_bcd(&frame[5], (long long)freqA, (civ_731_mode ? 4 : 5) * 2); + } + else + { + printf("get_freqB\n"); + to_bcd(&frame[5], (long long)freqB, (civ_731_mode ? 4 : 5) * 2); + } + + frame[10] = 0xfd; + + if (powerstat) + { + n = write(fd, frame, 11); + } + + break; + + case 0x04: + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) + { + printf("get_modeA\n"); + frame[5] = modeA; + frame[6] = widthA; + } + else + { + printf("get_modeB\n"); + frame[5] = modeB; + frame[6] = widthB; + } + + frame[7] = 0xfd; + n = write(fd, frame, 8); + break; + + case 0x05: + freq = from_bcd(&frame[5], (civ_731_mode ? 4 : 5) * 2); + printf("set_freq to %.0f\n", freq); + + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { freqA = freq; } + else { freqB = freq; } + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x06: + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { modeA = frame[6]; } + else { modeB = frame[6]; } + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x07: + + switch (frame[5]) + { + case 0x00: current_vfo = RIG_VFO_A; break; + + case 0x01: current_vfo = RIG_VFO_B; break; + + case 0xa0: current_vfo = freq = freqA; freqA = freqB; freqB = freq; break; + + case 0xb0: current_vfo = RIG_VFO_MAIN; break; + + case 0xd0: current_vfo = RIG_VFO_MAIN; break; + + case 0xd1: current_vfo = RIG_VFO_SUB; break; + } + + printf("set_vfo to %s\n", rig_strvfo(current_vfo)); + + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x0f: + if (frame[5] == 0) { split = 0; } + else if (frame[5] == 1) { split = 1; } + else { frame[6] = split; } + + if (frame[5] == 0xfd) + { + printf("get split %d\n", 1); + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + printf("set split %d\n", 1); + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + + break; + + case 0x12: // we're simulating the 3-byte version -- not the 2-byte + if (frame[5] != 0xfd) + { + printf("Set ant %d\n", -1); + ant_curr = frame[5]; + ant_option = frame[6]; + dump_hex(frame, 8); + } + else + { + printf("Get ant\n"); + } + + frame[5] = ant_curr; + frame[6] = ant_option; + frame[7] = 0xfd; + printf("write 8 bytes\n"); + dump_hex(frame, 8); + n = write(fd, frame, 8); + break; + + case 0x14: + switch (frame[5]) + { + static int power_level = 0; + + case 0x07: + case 0x08: + if (frame[6] != 0xfd) + { + frame[6] = 0xfb; + dumphex(frame, 7); + n = write(fd, frame, 7); + printf("ACK x14 x08\n"); + } + else + { + to_bcd(&frame[6], (long long)128, 2); + frame[8] = 0xfb; + dumphex(frame, 9); + n = write(fd, frame, 9); + printf("SEND x14 x08\n"); + } + + break; + + case 0x0a: + printf("Using power level %d\n", power_level); + power_level += 10; + + if (power_level > 250) { power_level = 0; } + + to_bcd(&frame[6], (long long)power_level, 2); + frame[8] = 0xfd; + n = write(fd, frame, 9); + break; + } + + break; + + case 0x15: + switch (frame[5]) + { + static int meter_level = 0; + + case 0x07: + frame[6] = ovf_status; + frame[7] = 0xfd; + n = write(fd, frame, 8); + ovf_status = ovf_status == 0 ? 1 : 0; + break; + + case 0x11: + printf("Using meter level %d\n", meter_level); + meter_level += 10; + + if (meter_level > 250) { meter_level = 0; } + + to_bcd(&frame[6], (long long)meter_level, 2); + frame[8] = 0xfd; + n = write(fd, frame, 9); + break; + } + + case 0x16: + switch (frame[5]) + { + case 0x5a: + if (frame[6] == 0xfe) + { + satmode = frame[6]; + } + else + { + frame[6] = satmode; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + + break; + } + + break; + + case 0x19: // miscellaneous things + frame[5] = 0x94; + frame[6] = 0xfd; + n = write(fd, frame, 7); + break; + + case 0x1a: // miscellaneous things + switch (frame[5]) + { + case 0x03: // width + if (current_vfo == RIG_VFO_A || current_vfo == RIG_VFO_MAIN) { frame[6] = widthA; } + else { frame[6] = widthB; } + + frame[7] = 0xfd; + n = write(fd, frame, 8); + break; + + case 0x04: // AGC TIME + printf("frame[6]==x%02x, frame[7]=0%02x\n", frame[6], frame[7]); + + if (frame[6] == 0xfd) // the we are reading + { + frame[6] = agc_time; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + printf("AGC_TIME RESPONSE******************************"); + agc_time = frame[6]; + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + + break; + + case 0x06: // Data mode + if (frame[6] == 0xfd) // then we're replying with mode + { + frame[6] = datamodeA; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + datamodeA = frame[6]; + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + + break; + + } + + break; + + case 0x1c: + switch (frame[5]) + { + case 0: + if (frame[6] == 0xfd) + { + frame[6] = ptt; + frame[7] = 0xfd; + n = write(fd, frame, 8); + } + else + { + ptt = frame[6]; + frame[4] = 0xfb; + frame[5] = 0xfd; + n = write(fd, frame, 6); + } + + break; + + } + + break; + + + case 0x25: + printf("x25 send nak\n"); + frame[4] = 0xfa; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + case 0x26: + printf("x26 send nak\n"); + frame[4] = 0xfa; + frame[5] = 0xfd; + n = write(fd, frame, 6); + break; + + default: printf("cmd 0x%02x unknown\n", frame[4]); + } + + if (n == 0) { printf("Write failed=%s\n", strerror(errno)); } + +// don't care about the rig type yet + +} + +#if defined(WIN32) || defined(_WIN32) +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd; + fd = open(comport, O_RDWR); + + if (fd < 0) + { + perror(comport); + } + + return fd; +} + +#else +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd = posix_openpt(O_RDWR); + char *name = ptsname(fd); + + if (name == NULL) + { + perror("pstname"); + return -1; + } + + printf("name=%s\n", name); + + if (fd == -1 || grantpt(fd) == -1 || unlockpt(fd) == -1) + { + perror("posix_openpt"); + return -1; + } + + return fd; +} +#endif + +void rigStatus() +{ + ... [truncated message content] |
From: n0nb <n0...@us...> - 2023-04-29 21:00:19
|
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, Hamlib-4.5.6 has been created at 8832ad144a5f9e9990bc540c0b5cfc9f26e0f193 (commit) - Log ----------------------------------------------------------------- commit 8832ad144a5f9e9990bc540c0b5cfc9f26e0f193 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Apr 22 12:10:56 2023 -0500 Update NEWS diff --git a/NEWS b/NEWS index 8b13ec30..4982e4e6 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,32 @@ Copyright (C) 2000-2023 Michael Black W9MDB, and others Please send Hamlib bug reports to ham...@li... +Version 5.x -- future + * rig_get_conf deprecated and replaced by rig_get_conf2 + * rot_get_conf deprecated and replaced by rot_get_conf2 + * Change FT1000MP Mark V model names to align with FT1000MP + +Version 4.6 + * Add saebrtrack rotor https://sites.google.com/site/marklhammond/saebrtrack + * Add offset_vfoa and offset_vfob applying to rig_set_freq + * Fix K4 to put it in K40 mode when requesting ID + * 2023-11-XX -- Planned for Nov 2023 + * Fixes for M2 Rotors + * Add rigctlsync utility to synchronize frequency from a rig to SDR# (or others) + * Add SDR# rig for use with SDR#'s gpredict plugin -- can only get/set freq + * Add Apex Shared Loop rotator -- unidirectional only so far + * Add client_version to rigctld so client can report it's version for future use/compatibility/alternatives + * Add --set-conf=tuner_control_pathname=hamlib_tuner_control (default) + If file exists then it will be called with 0/1 (Off/On) argument + with 'U TUNER 0' or 'U TUNER 1" + Default path is for current directory + * Add MDS 4710/9710 rigs + * Add FLIR PTU-D48, E46, D100, D300 rotors + * Fix FTDX3000 rig split + +Version 4.5.6 + * Fix rigctld/rigctltcp information + Version 4.5.5 * 2023-04-05 * Add park to rotorez.c @@ -185,7 +211,7 @@ Version 4.3.1 - scripts: Update example in readme, since 4.0 817 is 1020 - Make testlibusb.c compatible with libusb < 1.0.23 Note: On systems with libusb < 1.0.23 a warning will be emitted - but compliation should proceed without error. + but compilation should proceed without error. - Update testlibusb.c warning to "may be" instead of "will be" - Change kenwood to only set VFOA default on 1st rig_open call commit 6b0530f7b7aa1cca7dd3e1ad64bd40c28b16f573 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Apr 21 16:14:48 2023 -0500 Revert "Only allow x25cmdfails when not set" This reverts commit a0cd186b68e2b81d0fa4e8d00f342d73c5ca76aa. diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index bde2e05d..de5e1871 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -686,7 +686,7 @@ int icom_init(RIG *rig) priv->rx_vfo = RIG_VFO_NONE; rig->state.current_vfo = RIG_VFO_NONE; priv->filter = RIG_PASSBAND_NOCHANGE; - priv->x25cmdfails = -1; + priv->x25cmdfails = 0; priv->x1cx03cmdfails = 0; // we can add rigs here that will never use the 0x25 cmd @@ -1656,8 +1656,7 @@ int icom_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) if (retval != RIG_OK) { - // only reset if not known -- means cannot change dynamically without restart - if (priv->x25cmdfails < 0) priv->x25cmdfails = 1; + priv->x25cmdfails = 1; rig_debug(RIG_DEBUG_WARN, "%s: rig probe shows 0x25 CI-V cmd not available\n", __func__); } diff --git a/rigs/icom/icom.h b/rigs/icom/icom.h index 0661336b..efc28fa4 100644 --- a/rigs/icom/icom.h +++ b/rigs/icom/icom.h @@ -31,7 +31,7 @@ #include <sys/time.h> #endif -#define BACKEND_VER "20230421" +#define BACKEND_VER "20230109" #define ICOM_IS_ID31 rig_is_model(rig, RIG_MODEL_ID31) #define ICOM_IS_ID51 rig_is_model(rig, RIG_MODEL_ID51) commit a0cd186b68e2b81d0fa4e8d00f342d73c5ca76aa Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Apr 21 16:12:53 2023 -0500 Only allow x25cmdfails when not set https://github.com/Hamlib/Hamlib/issues/1277 diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index de5e1871..bde2e05d 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -686,7 +686,7 @@ int icom_init(RIG *rig) priv->rx_vfo = RIG_VFO_NONE; rig->state.current_vfo = RIG_VFO_NONE; priv->filter = RIG_PASSBAND_NOCHANGE; - priv->x25cmdfails = 0; + priv->x25cmdfails = -1; priv->x1cx03cmdfails = 0; // we can add rigs here that will never use the 0x25 cmd @@ -1656,7 +1656,8 @@ int icom_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) if (retval != RIG_OK) { - priv->x25cmdfails = 1; + // only reset if not known -- means cannot change dynamically without restart + if (priv->x25cmdfails < 0) priv->x25cmdfails = 1; rig_debug(RIG_DEBUG_WARN, "%s: rig probe shows 0x25 CI-V cmd not available\n", __func__); } diff --git a/rigs/icom/icom.h b/rigs/icom/icom.h index efc28fa4..0661336b 100644 --- a/rigs/icom/icom.h +++ b/rigs/icom/icom.h @@ -31,7 +31,7 @@ #include <sys/time.h> #endif -#define BACKEND_VER "20230109" +#define BACKEND_VER "20230421" #define ICOM_IS_ID31 rig_is_model(rig, RIG_MODEL_ID31) #define ICOM_IS_ID51 rig_is_model(rig, RIG_MODEL_ID51) ----------------------------------------------------------------------- hooks/post-receive -- Hamlib -- Ham radio control libraries |
From: n0nb <n0...@us...> - 2023-04-29 20:57:34
|
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 9318df8e7511694c5652a91029ad1245328452cc (commit) via a349c3e07bcc40f30c43a1c465cd8b4030a1055f (commit) via e5a6055d5727b42f03307d0c2e2489482dfc8392 (commit) via 215aa6b92c76eab5e17e811e6c070bd68b00b48a (commit) via e82f127965fba7f5852f59ead3abc45ebe5e1548 (commit) via addee81f43a6ef9223f712cd30612141cc20c035 (commit) via 07ba41d551e96fe3498ec8355d4d1e93d913a7d6 (commit) via da94c8b77074720d64b335df28d98a75c964b6c0 (commit) via 1db6487b8d30a2cb0d315c21d24692f31986fb3e (commit) via 1c1b9e75116916ef11e18a78a43af4e3455608ea (commit) via 6fadbfb1122ebc11694406303071a069d1eb43ca (commit) via 44807be556b8264eca8fb40a6f79318336944461 (commit) via f1533984802a9959bd357dc55dd9a562b152c126 (commit) via 6422bc51d5197e4e2c0a302b15a77cc719b5b86b (commit) via 4ba3a025124669776f88e29af6d84e035ac903cc (commit) via 2af9f2c5b3355d8806ea9e7d6f34eec720b40057 (commit) via 6c410f164e489ca30e101eab91d63d21a098003b (commit) via 72266a677dd35c9ce789bd0cf22b8efa535f6b94 (commit) via c02ded5b494341242a231bb1fffaa39eeed8daed (commit) via 6eee376cbfb429b4055667b69fe3c600d8ca64c6 (commit) via f390aa499d171e4e6f91c8f5bfaf7d7ec298c9de (commit) via 3b66959f4e3289e343e9911d203cb5216f744a15 (commit) via 1a59ce2ae2b42585ceb140eb713f87945531b87c (commit) via 4551199de1756d9eaf651b7c6a106d7e52686346 (commit) via 6f0efd59e61ebc2a6b96fcb9414cd2b240a9157e (commit) via 6c197dbc1cba336490e10914f2af3c3b0c0594b6 (commit) via 1c72440c5173c5f2c7e592cb6ace5ed6dd75c5a7 (commit) via e11b4bd01c64688bdf3714470f81a7e9fddd09aa (commit) via 905c9fff95f4dcaabfb2cfba4a821c895894051a (commit) from 6c1d83ed8684c8b3ff806c07e8c465d41c502685 (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 9318df8e7511694c5652a91029ad1245328452cc Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Apr 29 12:56:00 2023 -0500 Update NEWS diff --git a/NEWS b/NEWS index 4982e4e6..5e39dc19 100644 --- a/NEWS +++ b/NEWS @@ -32,6 +32,7 @@ Version 4.6 Version 4.5.6 * Fix rigctld/rigctltcp information + * Fix FT817 get/set_vfo Version 4.5.5 * 2023-04-05 commit a349c3e07bcc40f30c43a1c465cd8b4030a1055f Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Apr 29 07:57:07 2023 -0500 Change ft817 startup timeout to 1500ms to avoid a timeout https://github.com/Hamlib/Hamlib/issues/1278 diff --git a/rigs/yaesu/ft817.c b/rigs/yaesu/ft817.c index c81b6be0..19c4da6b 100644 --- a/rigs/yaesu/ft817.c +++ b/rigs/yaesu/ft817.c @@ -292,7 +292,7 @@ const struct rig_caps ft817_caps = RIG_MODEL(RIG_MODEL_FT817), .model_name = "FT-817", .mfg_name = "Yaesu", - .version = "20230429.0", + .version = "20230429.1", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -623,7 +623,7 @@ static int ft817_cleanup(RIG *rig) static int ft817_open(RIG *rig) { rig_debug(RIG_DEBUG_VERBOSE, "%s: called \n", __func__); - hl_usleep(100*1000); // rig needs a bit to allow commands to come through + hl_usleep(1500*1000); // rig needs a bit to allow commands to come through on startup return RIG_OK; } commit e5a6055d5727b42f03307d0c2e2489482dfc8392 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Apr 28 22:30:07 2023 -0500 Another attempt to fix ft817_get_vfo https://github.com/Hamlib/Hamlib/issues/1278 diff --git a/rigs/yaesu/ft817.c b/rigs/yaesu/ft817.c index 08e9583c..c81b6be0 100644 --- a/rigs/yaesu/ft817.c +++ b/rigs/yaesu/ft817.c @@ -292,7 +292,7 @@ const struct rig_caps ft817_caps = RIG_MODEL(RIG_MODEL_FT817), .model_name = "FT-817", .mfg_name = "Yaesu", - .version = "20230428.0", + .version = "20230429.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -696,7 +696,14 @@ static int ft817_read_eeprom(RIG *rig, unsigned short addr, unsigned char *out) return -RIG_EIO; } - *out = data[addr % 2]; + if (addr == 0x55) // for some reason VFO returns high byte + { + *out = data[0]; + } + else + { + *out = data[addr % 2]; + } rig_debug(RIG_DEBUG_VERBOSE, "%s: data[0]=%02x, data[1]=%02x, out=%02x\n", __func__, data[0], data[1], *out); @@ -1398,7 +1405,7 @@ static int ft817_get_vfo(RIG *rig, vfo_t *vfo) rig_debug(RIG_DEBUG_VERBOSE, "%s: called \n", __func__); - if (ft817_read_eeprom(rig, 0x54, &c) < 0) /* get vfo status */ + if (ft817_read_eeprom(rig, 0x55, &c) < 0) /* get vfo status */ { return -RIG_EPROTO; } commit 215aa6b92c76eab5e17e811e6c070bd68b00b48a Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Apr 28 08:20:57 2023 -0500 Try to fix ft817 get_vfo to return the valid status bye https://github.com/Hamlib/Hamlib/issues/1278 diff --git a/rigs/yaesu/ft817.c b/rigs/yaesu/ft817.c index 98caf300..08e9583c 100644 --- a/rigs/yaesu/ft817.c +++ b/rigs/yaesu/ft817.c @@ -292,7 +292,7 @@ const struct rig_caps ft817_caps = RIG_MODEL(RIG_MODEL_FT817), .model_name = "FT-817", .mfg_name = "Yaesu", - .version = "20230424.0", + .version = "20230428.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -698,6 +698,8 @@ static int ft817_read_eeprom(RIG *rig, unsigned short addr, unsigned char *out) *out = data[addr % 2]; + rig_debug(RIG_DEBUG_VERBOSE, "%s: data[0]=%02x, data[1]=%02x, out=%02x\n", __func__, data[0], data[1], *out); + return RIG_OK; } @@ -1396,7 +1398,7 @@ static int ft817_get_vfo(RIG *rig, vfo_t *vfo) rig_debug(RIG_DEBUG_VERBOSE, "%s: called \n", __func__); - if (ft817_read_eeprom(rig, 0x55, &c) < 0) /* get vfo status */ + if (ft817_read_eeprom(rig, 0x54, &c) < 0) /* get vfo status */ { return -RIG_EPROTO; } commit e82f127965fba7f5852f59ead3abc45ebe5e1548 Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Apr 26 15:38:08 2023 -0500 Allow icom read_frame to return when bus collision occurs https://github.com/Hamlib/Hamlib/issues/1280 diff --git a/rigs/icom/frame.c b/rigs/icom/frame.c index 973b7047..ad644457 100644 --- a/rigs/icom/frame.c +++ b/rigs/icom/frame.c @@ -540,7 +540,8 @@ static int read_icom_frame_generic(hamlib_port_t *p, && (rxbuffer[read - 1] != COL)); // Check that we have a valid frame preamble (which might be just a single preable character) - if (rxbuffer[0] != PR) + // Or an error code + if (rxbuffer[0] != PR && rxbuffer[0] != COL) { return -RIG_EPROTO; } diff --git a/rigs/icom/icom.h b/rigs/icom/icom.h index 477e2598..5aced162 100644 --- a/rigs/icom/icom.h +++ b/rigs/icom/icom.h @@ -35,7 +35,7 @@ #include <sys/time.h> #endif -#define BACKEND_VER "20230425" +#define BACKEND_VER "20230426" #define ICOM_IS_ID31 rig_is_model(rig, RIG_MODEL_ID31) #define ICOM_IS_ID51 rig_is_model(rig, RIG_MODEL_ID51) commit addee81f43a6ef9223f712cd30612141cc20c035 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Apr 25 22:27:38 2023 -0500 Fix rigctld sending an extra space in front of send_morse string Single space still works https://github.com/Hamlib/Hamlib/issues/1281 diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index 61820ffb..9405c373 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -958,12 +958,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, { *nl = '\0'; /* chomp */ } - - if (cmd == 'b') - { - p1 = arg1; /* CW must accept a space argument */ - } - else /* skip a space arg if first arg...but why? */ + /* skip a space arg if first arg...happens parsing rigctld commands */ { p1 = arg1[0] == ' ' ? arg1 + 1 : arg1; } commit 07ba41d551e96fe3498ec8355d4d1e93d913a7d6 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Apr 25 11:07:25 2023 -0500 Add a retry in icom frame.c in case of collision https://github.com/Hamlib/Hamlib/issues/1280 diff --git a/rigs/icom/frame.c b/rigs/icom/frame.c index 81cc7fe9..973b7047 100644 --- a/rigs/icom/frame.c +++ b/rigs/icom/frame.c @@ -138,6 +138,7 @@ int icom_one_transaction(RIG *rig, unsigned char cmd, int subcmd, unsigned char sendbuf[MAXFRAMELEN]; int frm_len, frm_data_len, retval; unsigned char ctrl_id; + int collision_retry = 0; ENTERFUNC; memset(buf, 0, 200); @@ -156,6 +157,7 @@ int icom_one_transaction(RIG *rig, unsigned char cmd, int subcmd, */ set_transaction_active(rig); +collision_retry: rig_flush(&rs->rigport); if (data_len) { *data_len = 0; } @@ -223,6 +225,13 @@ int icom_one_transaction(RIG *rig, unsigned char cmd, int subcmd, { case COL: /* Collision */ + // IC746 for example responds 0xfc when tuning is active so we will retry + if (collision_retry++ < 20) + { + rig_debug(RIG_DEBUG_VERBOSE, "%s: collision retry#%d\n", __func__, collision_retry); + hl_usleep(500*1000); // 500ms 20 times for ~15 second max before we back out for a retry if needed + goto collision_retry; + } set_transaction_inactive(rig); RETURNFUNC(-RIG_BUSBUSY); commit da94c8b77074720d64b335df28d98a75c964b6c0 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Apr 25 08:52:42 2023 -0500 Change ft817.c to not mask the low bit on eepromp reads -- hopefully this doesn't break everything https://github.com/Hamlib/Hamlib/issues/1278 diff --git a/rigs/yaesu/ft817.c b/rigs/yaesu/ft817.c index efc84ea6..98caf300 100644 --- a/rigs/yaesu/ft817.c +++ b/rigs/yaesu/ft817.c @@ -292,7 +292,7 @@ const struct rig_caps ft817_caps = RIG_MODEL(RIG_MODEL_FT817), .model_name = "FT-817", .mfg_name = "Yaesu", - .version = "20230422.0", + .version = "20230424.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -442,7 +442,7 @@ const struct rig_caps ft818_caps = RIG_MODEL(RIG_MODEL_FT818), .model_name = "FT-818", .mfg_name = "Yaesu", - .version = "20220419.0", + .version = "20220424.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -682,7 +682,7 @@ static int ft817_read_eeprom(RIG *rig, unsigned short addr, unsigned char *out) YAESU_CMD_LENGTH); data[0] = addr >> 8; - data[1] = addr & 0xfe; + data[1] = addr & 0xff; write_block(&rig->state.rigport, data, YAESU_CMD_LENGTH); @@ -1418,7 +1418,7 @@ static int ft817_set_vfo(RIG *rig, vfo_t vfo) vfo_t curvfo; int retval; - rig_debug(RIG_DEBUG_VERBOSE, "%s: called \n", __func__); + rig_debug(RIG_DEBUG_VERBOSE, "%s: called vfo=%s\n", __func__, rig_strvfo(vfo)); retval = ft817_get_vfo(rig, &curvfo); commit 1db6487b8d30a2cb0d315c21d24692f31986fb3e Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Apr 25 08:26:12 2023 -0500 Add simspid.c diff --git a/simulators/Makefile.am b/simulators/Makefile.am index 73ca41c1..982e6a82 100644 --- a/simulators/Makefile.am +++ b/simulators/Makefile.am @@ -8,7 +8,7 @@ DISTCLEANFILES = bin_PROGRAMS = -check_PROGRAMS = simelecraft simicom simkenwood simyaesu simicom9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez +check_PROGRAMS = simelecraft simicom simkenwood simyaesu simicom9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simspid simelecraft_SOURCES = simelecraft.c simicom_SOURCES = simicom.c diff --git a/simulators/simspid.c b/simulators/simspid.c new file mode 100644 index 00000000..6c1d0ac1 --- /dev/null +++ b/simulators/simspid.c @@ -0,0 +1,116 @@ +// can run this using rigctl/rigctld and socat pty devices +// gcc -o simspid simspid.c +#define _XOPEN_SOURCE 600 +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <string.h> +#include <unistd.h> +#include "../include/hamlib/rig.h" + +#define BUFSIZE 256 + +float freqA = 14074000; +float freqB = 14074500; +char tx_vfo = '0'; +char rx_vfo = '0'; +char modeA = '1'; +char modeB = '1'; +int width_main = 500; +int width_sub = 700; + + +int +getmyline(int fd, unsigned char *buf) +{ + unsigned char c; + int i = 0; + int n = 0; + memset(buf, 0, BUFSIZE); + + while (i < 5 && read(fd, &c, 1) > 0) + { + buf[i++] = c; + n++; + } + + printf("n=%d %02x %02x %02x %02x %02x\n", n, buf[0], buf[1], buf[2], buf[3], + buf[4]); + return n; +} + +#if defined(WIN32) || defined(_WIN32) +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd; + fd = open(comport, O_RDWR); + + if (fd < 0) + { + perror(comport); + } + + return fd; +} + +#else +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd = posix_openpt(O_RDWR); + char *name = ptsname(fd); + + if (name == NULL) + { + perror("pstname"); + return -1; + } + + printf("name=%s\n", name); + + if (fd == -1 || grantpt(fd) == -1 || unlockpt(fd) == -1) + { + perror("posix_openpt"); + return -1; + } + + return fd; +} +#endif + + + +int main(int argc, char *argv[]) +{ + unsigned char buf[256]; + + +again: + int fd = openPort(argv[1]); + + while (1) + { + int bytes = getmyline(fd, buf); + + if (bytes == 0) + { + close(fd); + goto again; + } + + if (bytes != 5) + { + printf("Not 5 bytes? bytes=%d\n", bytes); + } + + switch (buf[0]) + { + case '?': printf("Query %c\n", buf[1]); break; + + case '*': printf("Set %c\n", buf[1]); break; + + default: printf("Unknown cmd=%02x\n", buf[4]); + } + } + + return 0; +} commit 1c1b9e75116916ef11e18a78a43af4e3455608ea Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Apr 25 08:13:03 2023 -0500 Enable async_io for IC-746 and IC-746PRO https://github.com/Hamlib/Hamlib/issues/1280 diff --git a/rigs/icom/ic746.c b/rigs/icom/ic746.c index b6370141..2231987b 100644 --- a/rigs/icom/ic746.c +++ b/rigs/icom/ic746.c @@ -181,7 +181,7 @@ const struct rig_caps ic746_caps = RIG_MODEL(RIG_MODEL_IC746), .model_name = "IC-746", .mfg_name = "Icom", - .version = BACKEND_VER ".3", + .version = BACKEND_VER ".4", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -286,6 +286,11 @@ const struct rig_caps ic746_caps = }, .str_cal = IC746_STR_CAL, + .async_data_supported = 1, + .read_frame_direct = icom_read_frame_direct, + .is_async_frame = icom_is_async_frame, + .process_async_frame = icom_process_async_frame, + .cfgparams = icom_cfg_params, .set_conf = icom_set_conf, .get_conf = icom_get_conf, @@ -413,7 +418,7 @@ const struct rig_caps ic746pro_caps = RIG_MODEL(RIG_MODEL_IC746PRO), .model_name = "IC-746PRO", .mfg_name = "Icom", - .version = BACKEND_VER ".2", + .version = BACKEND_VER ".3", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -532,6 +537,11 @@ const struct rig_caps ic746pro_caps = }, .str_cal = IC746_STR_CAL, + .async_data_supported = 1, + .read_frame_direct = icom_read_frame_direct, + .is_async_frame = icom_is_async_frame, + .process_async_frame = icom_process_async_frame, + .cfgparams = icom_cfg_params, .set_conf = icom_set_conf, .get_conf = icom_get_conf, commit 6fadbfb1122ebc11694406303071a069d1eb43ca Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Apr 25 08:00:43 2023 -0500 Change Icom 0x25 logic to only allow one detection https://github.com/Hamlib/Hamlib/issues/1277 diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index 592ba0f0..6dd9dc36 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -682,7 +682,7 @@ int icom_init(RIG *rig) priv->rx_vfo = RIG_VFO_NONE; rig->state.current_vfo = RIG_VFO_NONE; priv->filter = RIG_PASSBAND_NOCHANGE; - priv->x25cmdfails = 0; + priv->x25cmdfails = -1; priv->x1cx03cmdfails = 0; // we can add rigs here that will never use the 0x25 cmd @@ -1652,7 +1652,7 @@ int icom_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) if (retval != RIG_OK) { - priv->x25cmdfails = 1; + if (priv->x25cmdfails < 0) priv->x25cmdfails = 1; rig_debug(RIG_DEBUG_WARN, "%s: rig probe shows 0x25 CI-V cmd not available\n", __func__); } @@ -5758,7 +5758,7 @@ int icom_get_split_freq(RIG *rig, vfo_t vfo, freq_t *tx_freq) RETURNFUNC2(retval); } - priv->x25cmdfails = 1; + if (priv->x25cmdfails < 0) priv->x25cmdfails = 1; } } else // we're in satmode so we try another command diff --git a/rigs/icom/icom.h b/rigs/icom/icom.h index c2d970b0..477e2598 100644 --- a/rigs/icom/icom.h +++ b/rigs/icom/icom.h @@ -35,7 +35,7 @@ #include <sys/time.h> #endif -#define BACKEND_VER "20230122" +#define BACKEND_VER "20230425" #define ICOM_IS_ID31 rig_is_model(rig, RIG_MODEL_ID31) #define ICOM_IS_ID51 rig_is_model(rig, RIG_MODEL_ID51) commit 44807be556b8264eca8fb40a6f79318336944461 Author: Mike Black W9MDB <mdb...@ya...> Date: Tue Apr 25 07:58:55 2023 -0500 Add simrotorez diff --git a/simulators/Makefile.am b/simulators/Makefile.am index 811db29a..73ca41c1 100644 --- a/simulators/Makefile.am +++ b/simulators/Makefile.am @@ -8,7 +8,7 @@ DISTCLEANFILES = bin_PROGRAMS = -check_PROGRAMS = simelecraft simicom simkenwood simyaesu simicom9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 +check_PROGRAMS = simelecraft simicom simkenwood simyaesu simicom9700 simft991 simftdx1200 simftdx3000 simjupiter simpowersdr simid5100 simft736 simftdx5000 simtmd700 simrotorez simelecraft_SOURCES = simelecraft.c simicom_SOURCES = simicom.c diff --git a/simulators/simrotorez.c b/simulators/simrotorez.c new file mode 100644 index 00000000..2fdfa142 --- /dev/null +++ b/simulators/simrotorez.c @@ -0,0 +1,127 @@ +// can run this using rigctl/rigctld and socat pty devices +// gcc -o simspid simspid.c +#define _XOPEN_SOURCE 600 +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <string.h> +#include <unistd.h> +#include "../include/hamlib/rig.h" + +#define BUFSIZE 256 + +float az = 0; +float el = 0; + +int +getmyline(int fd, char *buf) +{ + unsigned char c; + int i = 0; + int n = 0; + memset(buf, 0, BUFSIZE); + + while (read(fd, &c, 1) > 0 && c!=';') + { + buf[i++] = c; + n++; + for(int i=0;i<strlen(buf);++i) printf("%02x ", buf[i]); + printf("\n"); + } + + return n; +} + +#if defined(WIN32) || defined(_WIN32) +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd; + fd = open(comport, O_RDWR); + + if (fd < 0) + { + perror(comport); + } + + return fd; +} + +#else +int openPort(char *comport) // doesn't matter for using pts devices +{ + int fd = posix_openpt(O_RDWR); + char *name = ptsname(fd); + + if (name == NULL) + { + perror("pstname"); + return -1; + } + + printf("name=%s\n", name); + + if (fd == -1 || grantpt(fd) == -1 || unlockpt(fd) == -1) + { + perror("posix_openpt"); + return -1; + } + + return fd; +} +#endif + + + +int main(int argc, char *argv[]) +{ + char buf[256]; + int n; + +again: + int fd = openPort(argv[1]); + int fd2 = openPort(argv[2]); + int flag = 0; + + while (1) + { + int bytes; + if (!flag) bytes = getmyline(fd, buf); + else bytes = getmyline(fd2, buf); + flag = !flag; + + if (bytes == 0) + { + //close(fd); + goto again; + } + printf("line=%s\n", buf); + + if (strncmp(buf,"BI1",3) == 0) + { + sprintf(buf,"%3.1f;", az); + n = write(fd, buf, strlen(buf)); + printf("n=%d\n", n); + } + else if (strncmp(buf,"AP1",3) == 0) + { + sscanf(buf,"AP1%f", &az); + } + else + { + printf("Unknown cmd=%s\n", buf); + } + +#if 0 + switch (buf[0]) + { + case '?': printf("Query %c\n", buf[1]); break; + + case '*': printf("Set %c\n", buf[1]); break; + + default: printf("Unknown cmd=%02x\n", buf[4]); + } +#endif + } + + return 0; +} commit f1533984802a9959bd357dc55dd9a562b152c126 Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Apr 22 12:09:33 2023 -0500 Update NEWS diff --git a/NEWS b/NEWS index 1556473a..4982e4e6 100644 --- a/NEWS +++ b/NEWS @@ -30,6 +30,9 @@ Version 4.6 * Add FLIR PTU-D48, E46, D100, D300 rotors * Fix FTDX3000 rig split +Version 4.5.6 + * Fix rigctld/rigctltcp information + Version 4.5.5 * 2023-04-05 * Add park to rotorez.c commit 6422bc51d5197e4e2c0a302b15a77cc719b5b86b Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Apr 22 11:39:03 2023 -0500 Add version to rig_init debug info diff --git a/src/rig.c b/src/rig.c index 8768d9af..555a3b23 100644 --- a/src/rig.c +++ b/src/rig.c @@ -509,8 +509,8 @@ RIG *HAMLIB_API rig_init(rig_model_t rig_model) return (NULL); } - rig_debug(RIG_DEBUG_VERBOSE, "%s: rig_model=%s %s\n", __func__, caps->mfg_name, - caps->model_name); + rig_debug(RIG_DEBUG_VERBOSE, "%s: rig_model=%s %s %s\n", __func__, caps->mfg_name, + caps->model_name, caps->version); if (caps->hamlib_check_rig_caps != NULL) { commit 4ba3a025124669776f88e29af6d84e035ac903cc Author: Mike Black W9MDB <mdb...@ya...> Date: Sat Apr 22 11:22:16 2023 -0500 FT-817 add 100ms delay during ft817_open to avoid initial cmd error during startup https://github.com/Hamlib/Hamlib/issues/1278 diff --git a/rigs/yaesu/ft817.c b/rigs/yaesu/ft817.c index d87efa05..efc84ea6 100644 --- a/rigs/yaesu/ft817.c +++ b/rigs/yaesu/ft817.c @@ -292,7 +292,7 @@ const struct rig_caps ft817_caps = RIG_MODEL(RIG_MODEL_FT817), .model_name = "FT-817", .mfg_name = "Yaesu", - .version = "20230421.0", + .version = "20230422.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -623,6 +623,7 @@ static int ft817_cleanup(RIG *rig) static int ft817_open(RIG *rig) { rig_debug(RIG_DEBUG_VERBOSE, "%s: called \n", __func__); + hl_usleep(100*1000); // rig needs a bit to allow commands to come through return RIG_OK; } commit 2af9f2c5b3355d8806ea9e7d6f34eec720b40057 Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Apr 21 22:05:42 2023 -0500 For FT-817 add sleep after set_vfo to allow vfo swap to occur https://github.com/Hamlib/Hamlib/issues/1278 diff --git a/rigs/yaesu/ft817.c b/rigs/yaesu/ft817.c index d912535b..d87efa05 100644 --- a/rigs/yaesu/ft817.c +++ b/rigs/yaesu/ft817.c @@ -292,7 +292,7 @@ const struct rig_caps ft817_caps = RIG_MODEL(RIG_MODEL_FT817), .model_name = "FT-817", .mfg_name = "Yaesu", - .version = "20220419.0", + .version = "20230421.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -1432,8 +1432,10 @@ static int ft817_set_vfo(RIG *rig, vfo_t vfo) { return RIG_OK; } + retval = ft817_send_cmd(rig, FT817_NATIVE_CAT_SET_VFOAB); + hl_usleep(50 * 1000); // can take a little while for vfo swap to happen -- otherwise we get errors trying to read eeprom to quickly - return ft817_send_cmd(rig, FT817_NATIVE_CAT_SET_VFOAB); + return retval; } static int ft817_set_freq(RIG *rig, vfo_t vfo, freq_t freq) commit 6c410f164e489ca30e101eab91d63d21a098003b Author: Mike Black W9MDB <mdb...@ya...> Date: Fri Apr 21 16:04:04 2023 -0500 This did not solve the problem with Win4Yaesu Revert "https://github.com/Hamlib/Hamlib/issues/1275" This reverts commit c02ded5b494341242a231bb1fffaa39eeed8daed. diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index db9e2b29..eb206647 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -10827,7 +10827,7 @@ int newcat_set_cmd_validate(RIG *rig) } else if (strncmp(priv->cmd_str, "ST", 2) == 0) { - strcpy(valcmd, "X;"); + strcpy(valcmd, ";"); } else { @@ -10855,7 +10855,7 @@ int newcat_set_cmd_validate(RIG *rig) case RIG_MODEL_FT991: case RIG_MODEL_FTDX101MP: case RIG_MODEL_FTDX3000: - strcpy(valcmd, "X;"); + strcpy(valcmd, ";"); break; // these models do not work with a single ; case RIG_MODEL_FT897: diff --git a/rigs/yaesu/newcat.h b/rigs/yaesu/newcat.h index 72980d2a..441914ca 100644 --- a/rigs/yaesu/newcat.h +++ b/rigs/yaesu/newcat.h @@ -50,7 +50,7 @@ typedef char ncboolean; /* shared function version */ -#define NEWCAT_VER "20230419" +#define NEWCAT_VER "20230328" /* Hopefully large enough for future use, 128 chars plus '\0' */ #define NEWCAT_DATA_LEN 129 commit 72266a677dd35c9ce789bd0cf22b8efa535f6b94 Merge: c02ded5b 6eee376c Author: Michael Black <mdb...@ya...> Date: Thu Apr 20 17:19:14 2023 -0500 Merge pull request #1276 from dforsi/fix/typos Fix name of command in --version and usage outputs commit c02ded5b494341242a231bb1fffaa39eeed8daed Author: Mike Black W9MDB <mdb...@ya...> Date: Wed Apr 19 15:15:56 2023 -0500 https://github.com/Hamlib/Hamlib/issues/1275 diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index eb206647..db9e2b29 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -10827,7 +10827,7 @@ int newcat_set_cmd_validate(RIG *rig) } else if (strncmp(priv->cmd_str, "ST", 2) == 0) { - strcpy(valcmd, ";"); + strcpy(valcmd, "X;"); } else { @@ -10855,7 +10855,7 @@ int newcat_set_cmd_validate(RIG *rig) case RIG_MODEL_FT991: case RIG_MODEL_FTDX101MP: case RIG_MODEL_FTDX3000: - strcpy(valcmd, ";"); + strcpy(valcmd, "X;"); break; // these models do not work with a single ; case RIG_MODEL_FT897: diff --git a/rigs/yaesu/newcat.h b/rigs/yaesu/newcat.h index 441914ca..72980d2a 100644 --- a/rigs/yaesu/newcat.h +++ b/rigs/yaesu/newcat.h @@ -50,7 +50,7 @@ typedef char ncboolean; /* shared function version */ -#define NEWCAT_VER "20230328" +#define NEWCAT_VER "20230419" /* Hopefully large enough for future use, 128 chars plus '\0' */ #define NEWCAT_DATA_LEN 129 commit 6eee376cbfb429b4055667b69fe3c600d8ca64c6 Author: Daniele Forsi IU5HKX <iu...@gm...> Date: Wed Apr 19 21:48:32 2023 +0200 Fix name of command in the version text diff --git a/tests/rigctld.c b/tests/rigctld.c index b9c6dbc6..a2e32820 100644 --- a/tests/rigctld.c +++ b/tests/rigctld.c @@ -309,7 +309,7 @@ int main(int argc, char *argv[]) exit(0); case 'V': - printf("rigctl %s\n", hamlib_version2); + printf("rigctld %s\n", hamlib_version2); exit(0); case 'R': commit f390aa499d171e4e6f91c8f5bfaf7d7ec298c9de Author: Daniele Forsi IU5HKX <iu...@gm...> Date: Wed Apr 19 21:34:44 2023 +0200 Fix name of command in the usage and version texts diff --git a/tests/rigctltcp.c b/tests/rigctltcp.c index 3ee212bc..e23cc0ea 100644 --- a/tests/rigctltcp.c +++ b/tests/rigctltcp.c @@ -312,7 +312,7 @@ int main(int argc, char *argv[]) exit(0); case 'V': - printf("rigctl %s\n", hamlib_version2); + printf("rigctltcp %s\n", hamlib_version2); exit(0); case 'R': @@ -656,7 +656,7 @@ int main(int argc, char *argv[]) rig_debug(RIG_DEBUG_VERBOSE, "%s\n", rigstartup); - rig_debug(RIG_DEBUG_VERBOSE, "rigctld %s\n", hamlib_version2); + rig_debug(RIG_DEBUG_VERBOSE, "rigctltcp %s\n", hamlib_version2); rig_debug(RIG_DEBUG_VERBOSE, "%s", "Report bugs to <ham...@li...>\n\n"); rig_debug(RIG_DEBUG_VERBOSE, "Max# of rigctld client services=%d\n", @@ -1513,7 +1513,7 @@ handle_exit: void usage(void) { - printf("Usage: rigctld [OPTION]...\n" + printf("Usage: rigctltcp [OPTION]...\n" "Daemon serving COMMANDs to a connected radio transceiver or receiver.\n\n"); commit 3b66959f4e3289e343e9911d203cb5216f744a15 Merge: 4551199d 1a59ce2a Author: Michael Black <mdb...@ya...> Date: Mon Apr 17 07:21:10 2023 -0500 Merge pull request #1274 from mikaelnousiainen/ts590sg-fixes Fix and extend TS-590(S/SG) backend commit 1a59ce2ae2b42585ceb140eb713f87945531b87c Author: Mikael Nousiainen <mik...@ik...> Date: Sat Apr 15 00:25:29 2023 +0300 Fix and extend TS-590(S/SG) backend diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index c691b46a..d8d5ad3f 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -1323,6 +1323,11 @@ typedef uint64_t rmode_t; */ #define RIG_MODE_SSB (RIG_MODE_USB|RIG_MODE_LSB) +/** + * \brief macro for backends, not to be used by rig_set_mode et al. + */ +#define RIG_MODE_PKTSSB (RIG_MODE_PKTUSB|RIG_MODE_PKTLSB) + /** * \brief macro for backends, not to be used by rig_set_mode et al. */ diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index 2f5b0c81..3bd3723c 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -322,7 +322,13 @@ transaction_write: rig_flush(&rs->rigport); // PS command may need to wake up serial port - if (strncmp(cmd, "PS", 2) == 0) { write_block(&rs->rigport, (unsigned char *) ";;;;", 4); } + if (priv->ps_cmd_wakeup_data) + { + if (strncmp(cmd, "PS", 2) == 0) + { + write_block(&rs->rigport, (unsigned char *) ";;;;", 4); + } + } retval = write_block(&rs->rigport, (unsigned char *) cmd, len); @@ -484,6 +490,24 @@ transaction_read: case '?': + /* The ? response is an ambiguous response, but for get commands it seems to + * indicate that the rig rejected the command because the state of the rig is not valid for the command + * or that the command parameter is invalid. Retrying the command does not fix the issue, + * as the error is caused by the an invalid combination of rig state. + * + * For example, the following cases have been observed: + * - NL (NB level) and RL (NR level) commands fail if NB / NR are not enabled on TS-590SG + * - SH and SL (filter width) fail in CW mode on TS-590SG + * - GT (AGC) fails in FM mode on TS-590SG + * + * There are more cases like these and they vary by rig model. + */ + if (priv->question_mark_response_means_rejected) + { + rig_debug(RIG_DEBUG_ERR, "%s: Command rejected by the rig (get): '%s'\n", __func__,cmdstr); + RETURNFUNC(-RIG_ERJCTED); + } + /* Command not understood by rig or rig busy */ if (cmdstr) { @@ -519,8 +543,18 @@ transaction_read: */ if (datasize) { - // we ignore the special ;;;;PS; command - if (cmdstr && strcmp(cmdstr, ";;;;PS") != 0 && (buffer[0] != cmdstr[0] + char *ps_cmd; + if (priv->ps_cmd_wakeup_data) + { + ps_cmd = ";;;;PS"; + } + else + { + ps_cmd = "PS"; + } + + // we ignore the special PS command + if (cmdstr && strcmp(cmdstr, ps_cmd) != 0 && (buffer[0] != cmdstr[0] || (cmdstr[1] && buffer[1] != cmdstr[1]))) { /* @@ -836,6 +870,8 @@ int kenwood_open(RIG *rig) id[0] = 0; rig->state.rigport.retry = 0; + priv->question_mark_response_means_rejected = 0; + if (rig->state.auto_power_on) { // Ensure rig is on @@ -3102,7 +3138,7 @@ static int kenwood_find_slope_filter_for_value(RIG *rig, vfo_t vfo, int kenwood_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) { char levelbuf[16]; - int i, kenwood_val, len; + int i, kenwood_val, len, result; struct kenwood_priv_data *priv = rig->state.priv; struct kenwood_priv_caps *caps = kenwood_caps(rig); @@ -3311,6 +3347,7 @@ int kenwood_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) } SNPRINTF(levelbuf, sizeof(levelbuf), "SH%02d", kenwood_val); + priv->question_mark_response_means_rejected = 1; break; case RIG_LEVEL_SLOPE_LOW: @@ -3329,6 +3366,7 @@ int kenwood_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) } SNPRINTF(levelbuf, sizeof(levelbuf), "SL%02d", kenwood_val); + priv->question_mark_response_means_rejected = 1; break; case RIG_LEVEL_CWPITCH: @@ -3404,7 +3442,10 @@ int kenwood_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) RETURNFUNC(-RIG_EINVAL); } - RETURNFUNC(kenwood_transaction(rig, levelbuf, NULL, 0)); + result = kenwood_transaction(rig, levelbuf, NULL, 0); + priv->question_mark_response_means_rejected = 0; + + RETURNFUNC(result); } int get_kenwood_level(RIG *rig, const char *cmd, float *fval, int *ival) @@ -3824,7 +3865,9 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) RETURNFUNC(ret); case RIG_LEVEL_SLOPE_LOW: + priv->question_mark_response_means_rejected = 1; retval = kenwood_transaction(rig, "SL", lvlbuf, sizeof(lvlbuf)); + priv->question_mark_response_means_rejected = 0; if (retval != RIG_OK) { @@ -3852,7 +3895,9 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) break; case RIG_LEVEL_SLOPE_HIGH: + priv->question_mark_response_means_rejected = 1; retval = kenwood_transaction(rig, "SH", lvlbuf, sizeof(lvlbuf)); + priv->question_mark_response_means_rejected = 0; if (retval != RIG_OK) { @@ -4661,6 +4706,10 @@ int kenwood_set_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t option) SNPRINTF(cmd, sizeof(cmd), "AN0%c%c99", c, a); } + else if (RIG_IS_TS590S || RIG_IS_TS590SG) + { + SNPRINTF(cmd, sizeof(cmd), "AN%c99", a); + } else { SNPRINTF(cmd, sizeof(cmd), "AN%c", a); @@ -4723,6 +4772,11 @@ int kenwood_get_ant(RIG *rig, vfo_t vfo, ant_t dummy, value_t *option, retval = kenwood_safe_transaction(rig, "AN0", ackbuf, sizeof(ackbuf), 7); offs = 4; } + else if (RIG_IS_TS590S || RIG_IS_TS590SG) + { + retval = kenwood_safe_transaction(rig, "AN", ackbuf, sizeof(ackbuf), 5); + offs = 2; + } else { retval = kenwood_safe_transaction(rig, "AN", ackbuf, sizeof(ackbuf), 3); @@ -5068,7 +5122,17 @@ int kenwood_get_powerstat(RIG *rig, powerstat_t *status) RETURNFUNC(-RIG_EINVAL); } - retval = kenwood_safe_transaction(rig, ";;;;PS", pwrbuf, 6, 3); + char *ps_cmd; + if (priv->ps_cmd_wakeup_data) + { + ps_cmd = ";;;;PS"; + } + else + { + ps_cmd = "PS"; + } + + retval = kenwood_safe_transaction(rig, ps_cmd, pwrbuf, 6, 3); if (retval != RIG_OK) { diff --git a/rigs/kenwood/kenwood.h b/rigs/kenwood/kenwood.h index 7604b95a..f071c8f1 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 "20230318" +#define BACKEND_VER "20230414" #define EOM_KEN ';' #define EOM_TH '\r' @@ -175,6 +175,8 @@ struct kenwood_priv_data rmode_t modeB; int datamodeA; // datamode status from get_mode or set_mode int datamodeB; // datamode status from get_mode or set_mode + int ps_cmd_wakeup_data; // PS command requires wakeup characters (;) + int question_mark_response_means_rejected; /* the question mark response has multiple meanings */ }; diff --git a/rigs/kenwood/level_gran_kenwood.h b/rigs/kenwood/level_gran_kenwood.h index 44b668f9..826499f6 100644 --- a/rigs/kenwood/level_gran_kenwood.h +++ b/rigs/kenwood/level_gran_kenwood.h @@ -7,7 +7,6 @@ [LVL_PREAMP] = { .min = { .i = 10 }, .max = { .i = 20 }, .step = { .i = 10 } }, [LVL_ATT] = { .min = { .i = 0 }, .max = { .i = 12 }, .step = { .i = 0 } }, [LVL_STRENGTH] = { .min = { .i = 0 }, .max = { .i = 60 }, .step = { .i = 0 } }, - [LVL_NB] = { .min = { .f = 0 }, .max = { .f = 10 }, .step = { .f = 1 } }, /* levels with WPM units */ [LVL_KEYSPD] = { .min = { .i = 4 }, .max = { .i = 60 }, .step = { .i = 1 } }, /* levels with Hz units */ @@ -25,6 +24,7 @@ [LVL_BAND_SELECT] = { .min = { .i = 0 }, .max = { .i = 16 }, .step = { .i = 1 } }, /* levels with 0-1 values -- increment based on rig's range */ [LVL_NR] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/10.0f } }, + [LVL_NB] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/10.0f } }, [LVL_AF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/255.0f } }, [LVL_RF] = { .min = { .f = 0 }, .max = { .f = 1.0 }, .step = { .f = 1.0f/255.0f } }, [LVL_RFPOWER] = { .min = { .f = .05 }, .max = { .f = 1 }, .step = { .f = 1.0f/100.0f } }, diff --git a/rigs/kenwood/ts480.c b/rigs/kenwood/ts480.c index 781434d7..9fc5247d 100644 --- a/rigs/kenwood/ts480.c +++ b/rigs/kenwood/ts480.c @@ -42,7 +42,7 @@ #define TS480_LEVEL_GET (RIG_LEVEL_RFPOWER|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_SQL|RIG_LEVEL_AGC|RIG_LEVEL_MICGAIN|RIG_LEVEL_STRENGTH|RIG_LEVEL_KEYSPD|RIG_LEVEL_CWPITCH| \ RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB|RIG_LEVEL_NR|RIG_LEVEL_PREAMP|RIG_LEVEL_COMP|RIG_LEVEL_ATT|RIG_LEVEL_VOXDELAY|RIG_LEVEL_VOXGAIN|RIG_LEVEL_BKIN_DLYMS| \ - RIG_LEVEL_METER|RIG_LEVEL_SWR|RIG_LEVEL_COMP_METER|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_SLOPE_HIGH|RIG_LEVEL_SLOPE_LOW) + RIG_LEVEL_SWR|RIG_LEVEL_COMP_METER|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_SLOPE_HIGH|RIG_LEVEL_SLOPE_LOW) #define TS480_LEVEL_SET (RIG_LEVEL_RFPOWER|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_SQL|RIG_LEVEL_AGC|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_CWPITCH| \ RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB|RIG_LEVEL_NR|RIG_LEVEL_PREAMP|RIG_LEVEL_COMP|RIG_LEVEL_ATT|RIG_LEVEL_VOXDELAY|RIG_LEVEL_VOXGAIN|RIG_LEVEL_BKIN_DLYMS| \ @@ -658,42 +658,6 @@ kenwood_ts480_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) val->i = ackbuf[3] == '1' ? 12 : 0; break; - case RIG_LEVEL_METER: - { - int raw_value; - - // TODO: Read all meters at the same time: RM10000;RM20000;RM30000; - - retval = kenwood_safe_transaction(rig, "RM", ackbuf, sizeof(ackbuf), 7); - - if (retval != RIG_OK) - { - RETURNFUNC(retval); - } - - sscanf(ackbuf, "RM%1d", &raw_value); - - switch (raw_value) - { - case 1: - val->i = RIG_METER_SWR; - break; - - case 2: - val->i = RIG_METER_COMP; - break; - - case 3: - val->i = RIG_METER_ALC; - break; - - default: - val->i = RIG_METER_NONE; - } - - break; - } - case RIG_LEVEL_SWR: case RIG_LEVEL_COMP_METER: case RIG_LEVEL_ALC: @@ -1205,7 +1169,7 @@ static struct kenwood_slope_filter ts480_slope_filter_low[] = { RIG_MODE_SSB | RIG_MODE_FM | RIG_MODE_RTTY | RIG_MODE_RTTYR, 0, 8, 700 }, { RIG_MODE_SSB | RIG_MODE_FM | RIG_MODE_RTTY | RIG_MODE_RTTYR, 0, 9, 800 }, { RIG_MODE_SSB | RIG_MODE_FM | RIG_MODE_RTTY | RIG_MODE_RTTYR, 0, 10, 900 }, - { RIG_MODE_SSB | RIG_MODE_FM | RIG_MODE_RTTY | RIG_MODE_RTTYR, 10, 1, 1000 }, + { RIG_MODE_SSB | RIG_MODE_FM | RIG_MODE_RTTY | RIG_MODE_RTTYR, 0, 11, 1000 }, { RIG_MODE_AM, 0, 0, 0 }, { RIG_MODE_AM, 0, 1, 100 }, { RIG_MODE_AM, 0, 2, 200 }, @@ -1247,6 +1211,7 @@ int ts480_init(RIG *rig) priv->ag_format = 2; priv->micgain_min = 0; priv->micgain_max = 100; + priv->ps_cmd_wakeup_data = 1; RETURNFUNC(RIG_OK); } diff --git a/rigs/kenwood/ts590.c b/rigs/kenwood/ts590.c index 285b8d11..e37bb2a1 100644 --- a/rigs/kenwood/ts590.c +++ b/rigs/kenwood/ts590.c @@ -1,7 +1,7 @@ /* - * Hamlib Kenwood backend - TS590 description + * Hamlib Kenwood backend - TS-590(S/SG) description * Copyright (c) 2010 by Stephane Fillod - * + * Copyright (c) 2023 by Mikael Nousiainen OH3BHX * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,74 +21,1389 @@ #include <stdio.h> #include <string.h> +#include <stdlib.h> + +#include "hamlib/rig.h" +#include "kenwood.h" +#include "misc.h" +#include "cal.h" +#include "iofunc.h" + +#define TS590_ALL_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_FM|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_PKTFM|RIG_MODE_PKTUSB|RIG_MODE_PKTLSB|RIG_MODE_PKTAM) +#define TS590_OTHER_TX_MODES (RIG_MODE_CW|RIG_MODE_SSB|RIG_MODE_FM|RIG_MODE_RTTY) +#define TS590_AM_TX_MODES (RIG_MODE_AM|RIG_MODE_PKTAM) +#define TS590_VFO (RIG_VFO_A|RIG_VFO_B|RIG_VFO_MEM) + +#define TS590_LEVEL_GET (RIG_LEVEL_RFPOWER|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_SQL|RIG_LEVEL_AGC|RIG_LEVEL_MICGAIN|RIG_LEVEL_STRENGTH|RIG_LEVEL_KEYSPD|RIG_LEVEL_CWPITCH| \ + RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB|RIG_LEVEL_NR|RIG_LEVEL_PREAMP|RIG_LEVEL_COMP|RIG_LEVEL_ATT|RIG_LEVEL_VOXDELAY|RIG_LEVEL_VOXGAIN|RIG_LEVEL_BKIN_DLYMS| \ + RIG_LEVEL_SWR|RIG_LEVEL_COMP_METER|RIG_LEVEL_ALC|RIG_LEVEL_RFPOWER_METER|RIG_LEVEL_SLOPE_HIGH|RIG_LEVEL_SLOPE_LOW) + +#define TS590_LEVEL_SET (RIG_LEVEL_RFPOWER|RIG_LEVEL_AF|RIG_LEVEL_RF|RIG_LEVEL_SQL|RIG_LEVEL_AGC|RIG_LEVEL_MICGAIN|RIG_LEVEL_KEYSPD|RIG_LEVEL_CWPITCH| \ + RIG_LEVEL_MONITOR_GAIN|RIG_LEVEL_NB|RIG_LEVEL_NR|RIG_LEVEL_PREAMP|RIG_LEVEL_COMP|RIG_LEVEL_ATT|RIG_LEVEL_VOXDELAY|RIG_LEVEL_VOXGAIN|RIG_LEVEL_BKIN_DLYMS| \ + RIG_LEVEL_METER|RIG_LEVEL_SLOPE_HIGH|RIG_LEVEL_SLOPE_LOW) + +#define TS590_FUNC_ALL (RIG_FUNC_NB|RIG_FUNC_COMP|RIG_FUNC_VOX|RIG_FUNC_NR|RIG_FUNC_NR|RIG_FUNC_BC|RIG_FUNC_BC2|RIG_FUNC_RIT|RIG_FUNC_XIT| \ + RIG_FUNC_TUNER|RIG_FUNC_MON|RIG_FUNC_FBKIN|RIG_FUNC_LOCK) + +#define TS590_VFO_OPS (RIG_OP_UP|RIG_OP_DOWN|RIG_OP_CPY|RIG_OP_TUNE) + +#define TS590_SCAN_OPS (RIG_SCAN_VFO) + +#define TS590_ANTS (RIG_ANT_1|RIG_ANT_2) + +#define TS590_CHANNEL_CAPS { \ + .freq=1,\ + .mode=1,\ + .tx_freq=1,\ + .tx_mode=1,\ + .split=1,\ + .funcs=RIG_FUNC_TONE, \ + .flags=RIG_CHFLAG_SKIP \ + } + +#define TS590_STR_CAL {9, {\ + { 0, -60},\ + { 3, -48},\ + { 6, -36},\ + { 9, -24},\ + {12, -12},\ + {15, 0},\ + {20, 20},\ + {25, 40},\ + {30, 60}}\ + } + +#define TS590_SWR_CAL { 5, \ + { \ + { 0, 1.0f }, \ + { 6, 1.5f }, \ + { 12, 2.0f }, \ + { 18, 3.0f }, \ + { 30, 10.0f } \ + } } + +#define TOK_FUNC_NOISE_REDUCTION_2 TOKEN_BACKEND(102) +#define TOK_LEVEL_DSP_RX_EQUALIZER TOKEN_BACKEND(104) +#define TOK_LEVEL_DSP_TX_EQUALIZER TOKEN_BACKEND(105) +#define TOK_LEVEL_BEEP_VOLUME TOKEN_BACKEND(107) +#define TOK_LEVEL_TX_SIDETONE_VOLUME TOKEN_BACKEND(108) +#define TOK_LEVEL_ACC2_AUDIO_INPUT_LEVEL TOKEN_BACKEND(109) +#define TOK_LEVEL_ACC2_AUDIO_OUTPUT_LEVEL TOKEN_BACKEND(110) +#define TOK_LEVEL_USB_AUDIO_INPUT_LEVEL TOKEN_BACKEND(113) +#define TOK_LEVEL_USB_AUDIO_OUTPUT_LEVEL TOKEN_BACKEND(114) +#define TOK_LEVEL_DSP_TX_SSB_AM_LOW_CUT_FILTER TOKEN_BACKEND(115) +#define TOK_LEVEL_DSP_TX_SSB_AM_HIGH_CUT_FILTER TOKEN_BACKEND(116) +#define TOK_LEVEL_DSP_TX_SSB_DATA_LOW_CUT_FILTER TOKEN_BACKEND(117) +#define TOK_LEVEL_DSP_TX_SSB_DATA_HIGH_CUT_FILTER TOKEN_BACKEND(118) + +int ts590_ext_tokens[] = +{ + TOK_FUNC_NOISE_REDUCTION_2, + TOK_LEVEL_DSP_RX_EQUALIZER, TOK_LEVEL_DSP_TX_EQUALIZER, + TOK_LEVEL_BEEP_VOLUME, TOK_LEVEL_TX_SIDETONE_VOLUME, + TOK_LEVEL_ACC2_AUDIO_INPUT_LEVEL, TOK_LEVEL_ACC2_AUDIO_OUTPUT_LEVEL, + TOK_LEVEL_USB_AUDIO_INPUT_LEVEL, TOK_LEVEL_USB_AUDIO_OUTPUT_LEVEL, + TOK_LEVEL_DSP_TX_SSB_AM_LOW_CUT_FILTER, TOK_LEVEL_DSP_TX_SSB_AM_HIGH_CUT_FILTER, + TOK_LEVEL_DSP_TX_SSB_DATA_LOW_CUT_FILTER, TOK_LEVEL_DSP_TX_SSB_DATA_HIGH_CUT_FILTER, + + TOK_BACKEND_NONE, +}; + +const struct confparams ts590_ext_funcs[] = +{ + { + TOK_FUNC_NOISE_REDUCTION_2, "NR2", "Noise reduction 2", "Noise reduction 2", + NULL, RIG_CONF_CHECKBUTTON, + }, + { RIG_CONF_END, NULL, } +}; + +const struct confparams ts590_ext_levels[] = +{ + { + TOK_LEVEL_DSP_RX_EQUALIZER, "DSP_RX_EQUALIZER", "DSP RX equalizer", "DSP RX equalizer type", + NULL, RIG_CONF_COMBO, { .c = { .combostr = { "OFF", "Hb1", "Hb2", "FP", "bb1", "bb2", "c", "U", NULL } } } + }, + { + TOK_LEVEL_DSP_TX_EQUALIZER, "DSP_TX_EQUALIZER", "DSP TX equalizer", "DSP TX equalizer type", + NULL, RIG_CONF_COMBO, { .c = { .combostr = { "OFF", "Hb1", "Hb2", "FP", "bb1", "bb2", "flat", "U", NULL } } } + }, + { + TOK_LEVEL_BEEP_VOLUME, "BEEP_VOLUME", "Beep volume", "Beep volume", + NULL, RIG_CONF_NUMERIC, { .n = { .min = 0, .max = 20, .step = 1 } } + }, + { + TOK_LEVEL_TX_SIDETONE_VOLUME, "TX_SIDETONE_VOLUME", "TX sidetone volume", "TX sidetone volume", + NULL, RIG_CONF_NUMERIC, { .n = { .min = 0, .max = 20, .step = 1 } } + }, + { + TOK_LEVEL_ACC2_AUDIO_INPUT_LEVEL, "ACC2_AUDIO_INPUT_LEVEL", "ACC2 audio input level", "ACC2 audio input level", + NULL, RIG_CONF_NUMERIC, { .n = { .min = 0, .max = 9, .step = 1 } } + }, + { + TOK_LEVEL_ACC2_AUDIO_OUTPUT_LEVEL, "ACC2_AUDIO_OUTPUT_LEVEL", "ACC2 audio output level", "ACC2 audio output level", + NULL, RIG_CONF_NUMERIC, { .n = { .min = 0, .max = 9, .step = 1 } } + }, + { + TOK_LEVEL_USB_AUDIO_INPUT_LEVEL, "USB_AUDIO_INPUT_LEVEL", "USB audio input level", "USB audio input level", + NULL, RIG_CONF_NUMERIC, { .n = { .min = 0, .max = 9, .step = 1 } } + }, + { + TOK_LEVEL_USB_AUDIO_OUTPUT_LEVEL, "USB_AUDIO_OUTPUT_LEVEL", "USB audio output level", "USB audio output level", + NULL, RIG_CONF_NUMERIC, { .n = { .min = 0, .max = 9, .step = 1 } } + }, + { + TOK_LEVEL_DSP_TX_SSB_AM_LOW_CUT_FILTER, "DSP_TX_SSB_AM_LOW_CUT_FILTER", "DSP TX SSB/AM low-cut", "DSP TX low-cut filter for SSB and AM", + NULL, RIG_CONF_COMBO, { .c = { .combostr = { "10 Hz", "100 Hz", "200 Hz", "300 Hz", "400 Hz", "500 Hz", NULL } } } + }, + { + TOK_LEVEL_DSP_TX_SSB_AM_HIGH_CUT_FILTER, "DSP_TX_SSB_AM_HIGH_CUT_FILTER", "DSP TX SSB/AM high-cut", "DSP TX high-cut filter for SSB and AM", + NULL, RIG_CONF_COMBO, { .c = { .combostr = { "2500 Hz", "2600 Hz", "2700 Hz", "2800 Hz", "2900 Hz", "3000 Hz", NULL } } } + }, + { + TOK_LEVEL_DSP_TX_SSB_DATA_LOW_CUT_FILTER, "DSP_TX_SSB_DATA_LOW_CUT_FILTER", "DSP TX SSB data low-cut", "DSP TX low-cut filter for SSB data", + NULL, RIG_CONF_COMBO, { .c = { .combostr = { "10 Hz", "100 Hz", "200 Hz", "300 Hz", "400 Hz", "500 Hz", NULL } } } + }, + { + TOK_LEVEL_DSP_TX_SSB_DATA_HIGH_CUT_FILTER, "DSP_TX_SSB_DATA_HIGH_CUT_FILTER", "DSP TX SSB data high-cut", "DSP TX high-cut filter for SSB data", + NULL, RIG_CONF_COMBO, { .c = { .combostr = { "2500 Hz", "2600 Hz", "2700 Hz", "2800 Hz", "2900 Hz", "3000 Hz", NULL } } } + }, + { RIG_CONF_END, NULL, } +}; + + +/* + * ts590_get_info + * This is not documented in the manual as of 3/11/15 but confirmed from Kenwood + * "TY" produces "TYK 00" for example + */ +const char *ts590_get_info(RIG *rig) +{ + char firmbuf[10]; + int retval; + + rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); + + retval = kenwood_safe_transaction(rig, "TY", firmbuf, 10, 6); + + if (retval != RIG_OK) + { + return NULL; + } + + switch (firmbuf[2]) + { + case 'K': return "Firmware: USA version"; + + case 'E': return "Firmware: European version"; + + default: return "Firmware: unknown"; + } +} + +static int ts590_set_ex_menu(RIG *rig, int number, int value_len, int value) +{ + char buf[20]; + + ENTERFUNC; + + SNPRINTF(buf, sizeof(buf), "EX%03d0000%0*d", number, value_len, value); + + RETURNFUNC(kenwood_transaction(rig, buf, NULL, 0)); +} + +static int ts590_get_ex_menu(RIG *rig, int number, int value_len, int *value) +{ + int retval; + char buf[20]; + char ackbuf[20]; + + rig_debug(RIG_DEBUG_TRACE, "%s called\n", __func__); + + SNPRINTF(buf, sizeof(buf), "EX%03d0000", number); + + retval = kenwood_safe_transaction(rig, buf, ackbuf, sizeof(ackbuf), + 9 + value_len); + + if (retval != RIG_OK) + { + RETURNFUNC2(retval); + } + + sscanf(ackbuf + 9, "%d", value); + + RETURNFUNC2(RIG_OK); +} + +static int ts590_set_func(RIG *rig, vfo_t vfo, setting_t func, int status) +{ + char buf[20]; + + rig_debug(RIG_DEBUG_TRACE, "%s called\n", __func__); + + switch (func) + { + case RIG_FUNC_MON: + SNPRINTF(buf, sizeof(buf), "ML00%c", (status == 0) ? '0' : '1'); + RETURNFUNC(kenwood_transaction(rig, buf, NULL, 0)); + + case RIG_FUNC_LOCK: + SNPRINTF(buf, sizeof(buf), "LK%c0", (status == 0) ? '0' : '1'); + RETURNFUNC(kenwood_transaction(rig, buf, NULL, 0)); + + case RIG_FUNC_TUNER: + SNPRINTF(buf, sizeof(buf), "AC%c%c0", (status == 0) ? '0' : '1', (status == 0) ? '0' : '1'); + RETURNFUNC(kenwood_transaction(rig, buf, NULL, 0)); + + default: + return kenwood_set_func(rig, vfo, func, status); + } +} + +static int ts590_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) +{ + char buf[20]; + int retval; + + ENTERFUNC; + + switch (func) + { + case RIG_FUNC_MON: + { + int raw_value; + retval = kenwood_safe_transaction(rig, "ML", buf, sizeof(buf), 5); + + if (retval != RIG_OK) + { + RETURNFUNC(retval); + } + + sscanf(buf, "ML%d", &raw_value); + + *status = (raw_value > 0); + break; + } + + case RIG_FUNC_LOCK: + retval = kenwood_safe_transaction(rig, "LK", buf, sizeof(buf), 4); + + if (retval != RIG_OK) + { + RETURNFUNC(retval); + } + + *status = buf[2] != '0'; + break; + + case RIG_FUNC_TUNER: + retval = kenwood_safe_transaction(rig, "AC", buf, sizeof(buf), 5); + + if (retval != RIG_OK) + { + RETURNFUNC(retval); + } + + *status = buf[3] != '0' ? 1 : 0; + RETURNFUNC(RIG_OK); + + default: + return kenwood_get_func(rig, vfo, func, status); + } + + RETURNFUNC(RIG_OK); +} + +static int ts590_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) +{ + struct kenwood_priv_data *priv = rig->state.priv; + char levelbuf[16]; + int kenwood_val; + int result; + + rig_debug(RIG_DEBUG_TRACE, "%s called\n", __func__); + + switch (level) + { + case RIG_LEVEL_RF: + kenwood_val = val.f * 255; + SNPRINTF(levelbuf, sizeof(levelbuf), "RG%03d", kenwood_val); + break; + + case RIG_LEVEL_AF: + return kenwood_set_level(rig, vfo, level, val); + + case RIG_LEVEL_SQL: + kenwood_val = val.f * 255; + SNPRINTF(levelbuf, sizeof(levelbuf), "SQ0%03d", kenwood_val); + break; + + case RIG_LEVEL_AGC: + /* Possible values for TS-2000 are 0(=off)-020(=slow) */ + + switch (val.i) + { + case RIG_AGC_OFF: + kenwood_val = 0; + break; + + case RIG_AGC_SUPERFAST: + kenwood_val = 1; + break; + + case RIG_AGC_FAST: + kenwood_val = 5; + break; + + case RIG_AGC_MEDIUM: + kenwood_val = 10; + break; + + case RIG_AGC_SLOW: + kenwood_val = 20; + break; + + default: + rig_debug(RIG_DEBUG_ERR, "%s: unsupported agc value", __func__); + return -RIG_EINVAL; + } + + SNPRINTF(levelbuf, sizeof(levelbuf), "GT%02d", kenwood_val); + break; + + case RIG_LEVEL_MONITOR_GAIN: + if (rig->caps->rig_model == RIG_MODEL_TS590S) + { + kenwood_val = val.f * 9.0f; + } + else + { + kenwood_val = val.f * 20.0f; + } + SNPRINTF(levelbuf, sizeof(levelbuf), "ML%03d", kenwood_val); + break; + + case RIG_LEVEL_NB: + priv->question_mark_response_means_rejected = 1; + kenwood_val = val.f * 10.0; + SNPRINTF(levelbuf, sizeof(levelbuf), "NL%03d", kenwood_val); + break; + + case RIG_LEVEL_NR: + priv->question_mark_response_means_rejected = 1; + kenwood_val = val.f * 9.0; + SNPRINTF(levelbuf, sizeof(levelbuf), "RL%02d", kenwood_val); + break; + + case RIG_LEVEL_PREAMP: + if (val.i != 12 && val.i != 0) + { + RETURNFUNC(-RIG_EINVAL); + } + + SNPRINTF(levelbuf, sizeof(levelbuf), "PA%c", (val.i == 12) ? '1' : '0'); + break; + + case RIG_LEVEL_ATT: + if (val.i != 12 && val.i != 0) + { + RETURNFUNC(-RIG_EINVAL); + } + + SNPRINTF(levelbuf, sizeof(levelbuf), "RA%02d", (val.i == 12) ? 1 : 0); + break; + + case RIG_LEVEL_METER: + switch (val.i) + { + case RIG_METER_SWR: + kenwood_val = 1; + break; + + case RIG_METER_COMP: + kenwood_val = 2; + break; + + case RIG_METER_ALC: + kenwood_val = 3; + break; + + default: + RETURNFUNC(-RIG_EINVAL); + } + + SNPRINTF(levelbuf, sizeof(levelbuf), "RM%d", kenwood_val); + break; + + case RIG_LEVEL_CWPITCH: + if (val.i > 1000 || val.i < 300) + { + RETURNFUNC(-RIG_EINVAL); + } + + RETURNFUNC(ts590_set_ex_menu(rig, 40, 2, (val.i - 300) / 50)); + + default: + RETURNFUNC(kenwood_set_level(rig, vfo, level, val)); + } + + result = kenwood_transaction(rig, levelbuf, NULL, 0); + priv->question_mark_response_means_rejected = 0; + + RETURNFUNC(result); +} + +static int ts590_read_meters(RIG *rig, int *swr, int *comp, int *alc) +{ + int retval; + char *cmd = "RM;"; + struct rig_state *rs = &rig->state; + char ackbuf[32]; + int expected_len = 24; + + ENTERFUNC; + + retval = write_block(&rs->rigport, (unsigned char *) cmd, strlen(cmd)); + + rig_debug(RIG_DEBUG_TRACE, "%s: write_block retval=%d\n", __func__, retval); + + if (retval != RIG_OK) + { + RETURNFUNC(retval); + } + + // TS-590 returns values for all meters at the same time, for example: RM10000;RM20000;RM30000; + + retval = read_string(&rs->rigport, (unsigned char *) ackbuf, expected_len + 1, + NULL, 0, 0, 1); + + rig_debug(RIG_DEBUG_TRACE, "%s: read_string retval=%d\n", __func__, retval); + + if (retval < 0) + { + rig_debug(RIG_DEBUG_ERR, "%s: failed to read rig response\n", __func__); + RETURNFUNC(retval); + } + + if (retval != expected_len) + { + rig_debug(RIG_DEBUG_ERR, "%s: expected %d bytes, got %d in '%s'\n", __func__, + expected_len, retval, ackbuf); + RETURNFUNC(-RIG_EPROTO); + } + + retval = sscanf(ackbuf, "RM1%d;RM2%d;RM3%d;", swr, comp, alc); + + if (retval != 3) + { + rig_debug(RIG_DEBUG_ERR, + "%s: expected 3 meter values to parse, got %d in '%s'\n", __func__, retval, + ackbuf); + RETURNFUNC(-RIG_EPROTO); + } + + RETURNFUNC(RIG_OK); +} + +static int ts590_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) +{ + struct kenwood_priv_data *priv = rig->state.priv; + char ackbuf[50]; + size_t ack_len, ack_len_expected; + int levelint; + int retval; + + ENTERFUNC; + + switch (level) + { + case RIG_LEVEL_AF: + return kenwood_get_level(rig, vfo, level, val); + + case RIG_LEVEL_RF: + retval = kenwood_transaction(rig, "RG", ackbuf, sizeof(ackbuf)); + + if (RIG_OK != retval) + { + return retval; + } + + ack_len = strlen(ackbuf); + + if (5 != ack_len) + { + return -RIG_EPROTO; + } + + if (1 != sscanf(&ackbuf[2], "%d", &levelint)) + { + return -RIG_EPROTO; + } + + val->f = levelint / (float) 255; + return RIG_OK; + + case RIG_LEVEL_SQL: + retval = kenwood_transaction(rig, "SQ0", ackbuf, sizeof(ackbuf)); + ack_len_expected = 6; + + if (RIG_OK != retval) + { + return retval; + } + + ack_len = strlen(ackbuf); + + if (ack_len != ack_len_expected) + { + return -RIG_EPROTO; + } + + if (1 != sscanf(&ackbuf[ack_len_expected - 3], "%d", &levelint)) + { + return -RIG_EPROTO; + } + + val->f = (float) levelint / 255.; + return RIG_OK; + + case RIG_LEVEL_AGC: + priv->question_mark_response_means_rejected = 1; + retval = kenwood_transaction(rig, "GT", ackbuf, sizeof(ackbuf)); + priv->question_mark_response_means_rejected = 0; + ack_len_expected = 4; + + if (RIG_OK != retval) + { + return retval; + } + + ack_len = strlen(ackbuf); + + if (ack_len != ack_len_expected) + { + return -RIG_EPROTO; + } + + if (1 != sscanf(&ackbuf[ack_len_expected - 2], "%d", &levelint)) + { + return -RIG_EPROTO; + } + + if (levelint == 0) + { + val->i = RIG_AGC_OFF; + } + else if (levelint <= 1) + { + val->i = RIG_AGC_SUPERFAST; + } + else if (levelint <= 5) + { + val->i = RIG_AGC_FAST; + } + else if (levelint <= 10) + { + val->i = RIG_AGC_MEDIUM; + } + else + { + val->i = RIG_AGC_SLOW; + } + + return RIG_OK; + + case RIG_LEVEL_STRENGTH: + if (rig->state.cache.ptt != RIG_PTT_OFF) + { + val->i = -9 * 6; + break; ... [truncated message content] |
From: n0nb <n0...@us...> - 2023-04-10 12:58:21
|
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 6c1d83ed8684c8b3ff806c07e8c465d41c502685 (commit) via cf77666cc1ca7a8eae96d5700deafc1adc660cc4 (commit) via c3d06fd043aeab69c4ade5fce1e739f8288a505f (commit) via 96bb604b1216547e599d06b61f73cb39ae797c17 (commit) via dd874dbf7f53b09d455afa921af0938ed914bbe8 (commit) via e5a00cddb9fcbebcf8a41de96a6380f03618d230 (commit) via 2c283ab47ae99fd404ee1950434465385f00a734 (commit) from 748b45b91f8216744d9bd38baf882a592c1f804b (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 6c1d83ed8684c8b3ff806c07e8c465d41c502685 Merge: cf77666c 2c283ab4 Author: Michael Black <mdb...@ya...> Date: Sun Apr 9 22:14:00 2023 -0500 Merge pull request #1269 from ncw/fix-qcx-cw-sending Fix QRP Labs QCX Morse Sending commit cf77666cc1ca7a8eae96d5700deafc1adc660cc4 Merge: dd874dbf c3d06fd0 Author: Michael Black <mdb...@ya...> Date: Sun Apr 9 22:13:42 2023 -0500 Merge pull request #1268 from dforsi/fix/doxygen Add/fix Doxygen comments commit c3d06fd043aeab69c4ade5fce1e739f8288a505f Author: Daniele Forsi IU5HKX <iu...@gm...> Date: Sat Apr 8 20:31:40 2023 +0200 Add/fix Doxygen comments diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index b263bbfe..c691b46a 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -537,7 +537,7 @@ typedef unsigned int vfo_t; /** \brief \c Macro to tell you if VFO can transmit */ #define RIG_VFO_TX_VFO(v) ((v)|RIG_VFO_TX_FLAG) -/** \brief \c TX -- alias for split tx or uplink, of VFO_CURR */ +/** \brief \c TX -- alias for split tx or uplink, of VFO_CURR */ #define RIG_VFO_TX RIG_VFO_TX_VFO(RIG_VFO_CURR) /** \brief \c RX -- alias for split rx or downlink */ diff --git a/include/hamlib/riglist.h b/include/hamlib/riglist.h index 3c641856..f73e639f 100644 --- a/include/hamlib/riglist.h +++ b/include/hamlib/riglist.h @@ -33,6 +33,8 @@ #define RIG_MAKE_MODEL(a,b) ((a)*MAX_MODELS_PER_BACKEND+(b)) #define RIG_BACKEND_NUM(a) ((a)/MAX_MODELS_PER_BACKEND) +//! @endcond + /*! \file riglist.h * \brief Hamlib rig(radio) model definitions. * @@ -49,6 +51,13 @@ * whishes to use. It is done with the rig_init() API call. */ +/** + * \def RIG_MODEL_NONE + * \brief A macro that returns the model number for an unknown model. + * + * The none backend, as the name suggests, does nothing. It is mainly for + * internal use. + */ #define RIG_MODEL_NONE 0 /*! \def RIG_MODEL_DUMMY @@ -62,9 +71,12 @@ * It has also been expanded to provide support to "virtual" type of rigs * such as the network rig control backend and W1HKJ's Flrig application. */ +//! @cond Doxygen_Suppress #define RIG_DUMMY 0 #define RIG_BACKEND_DUMMY "dummy" +//! @endcond #define RIG_MODEL_DUMMY RIG_MAKE_MODEL(RIG_DUMMY, 1) +//! @cond Doxygen_Suppress #define RIG_MODEL_NETRIGCTL RIG_MAKE_MODEL(RIG_DUMMY, 2) #define RIG_MODEL_ARMSTRONG RIG_MAKE_MODEL(RIG_DUMMY, 3) #define RIG_MODEL_FLRIG RIG_MAKE_MODEL(RIG_DUMMY, 4) @@ -629,7 +641,6 @@ #define RIG_GOMSPACE 35 #define RIG_BACKEND_GOMSPACE "gomspace" #define RIG_MODEL_GS100 RIG_MAKE_MODEL(RIG_GOMSPACE, 1) -//! @endcond /* * MDS Microwave Data Systems https://en.wikipedia.org/wiki/Microwave_Data_Systems @@ -645,6 +656,7 @@ etc. */ +//! @endcond /*! \typedef typedef int rig_model_t \brief Convenience type definition for rig model. diff --git a/src/cache.c b/src/cache.c index cdab9aba..c29fd7b9 100644 --- a/src/cache.c +++ b/src/cache.c @@ -26,6 +26,7 @@ #define CHECK_RIG_ARG(r) (!(r) || !(r)->caps || !(r)->state.comm_state) /** + * \file cache.c * \addtogroup rig * @{ */ diff --git a/src/rig.c b/src/rig.c index 13aeb5fe..8768d9af 100644 --- a/src/rig.c +++ b/src/rig.c @@ -5708,7 +5708,7 @@ int HAMLIB_API rig_get_ts(RIG *rig, vfo_t vfo, shortfreq_t *ts) * \brief set the antenna * \param rig The rig handle * \param vfo The target VFO - * \param ant The anntena to select + * \param ant The antenna to select * \param option An option that the ant command for the rig recognizes * * Select the antenna connector. diff --git a/src/token.h b/src/token.h index 41bd7ab2..703dc58c 100644 --- a/src/token.h +++ b/src/token.h @@ -71,7 +71,7 @@ #define TOK_STOP_BITS TOKEN_FRONTEND(22) /** \brief Serial parity (format?) */ #define TOK_PARITY TOKEN_FRONTEND(23) -/** \brief Serial Handshake (format?) */ +/** \brief Serial Handshake (format?) */ #define TOK_HANDSHAKE TOKEN_FRONTEND(24) /** \brief Serial Req. To Send status */ #define TOK_RTS_STATE TOKEN_FRONTEND(25) @@ -89,7 +89,7 @@ #define TOK_PTT_BITNUM TOKEN_FRONTEND(34) /** \brief PTT share with other applications */ #define TOK_PTT_SHARE TOKEN_FRONTEND(35) -/** \brief PTT share with other applications */ +/** \brief Flush with read instead of TCFLUSH */ #define TOK_FLUSHX TOKEN_FRONTEND(36) /** \brief Asynchronous data transfer support */ #define TOK_ASYNC TOKEN_FRONTEND(37) @@ -101,7 +101,7 @@ */ /* rx_range_list/tx_range_list, filters, announces, has(func,lvl,..) */ -/** \brief rig: ?? */ +/** \brief rig: VFO compensation in ppm */ #define TOK_VFO_COMP TOKEN_FRONTEND(110) /** \brief rig: Rig state poll interval in milliseconds */ #define TOK_POLL_INTERVAL TOKEN_FRONTEND(111) @@ -121,11 +121,13 @@ #define TOK_AUTO_DISABLE_SCREENSAVER TOKEN_FRONTEND(126) /** \brief rig: Disable Yaesu band select logic */ #define TOK_DISABLE_YAESU_BANDSELECT TOKEN_FRONTEND(127) -/** \brief rig: Supporess get_freq on VFOB for satellite RIT tuning */ +/** \brief rig: Suppress get_freq on VFOB for satellite RIT tuning */ #define TOK_TWIDDLE_TIMEOUT TOKEN_FRONTEND(128) -/** \brief rig: Supporess get_freq on VFOB for satellite RIT tuning */ +/** \brief rig: Suppress get_freq on VFOB for satellite RIT tuning */ #define TOK_TWIDDLE_RIT TOKEN_FRONTEND(129) +/** \brief rig: Add Hz to VFOA/Main frequency set */ #define TOK_OFFSET_VFOA TOKEN_FRONTEND(130) +/** \brief rig: Add Hz to VFOB/Sub frequency set */ #define TOK_OFFSET_VFOB TOKEN_FRONTEND(131) /* * rotator specific tokens commit 96bb604b1216547e599d06b61f73cb39ae797c17 Author: Daniele Forsi IU5HKX <iu...@gm...> Date: Thu Apr 6 21:21:04 2023 +0200 Fix typos diff --git a/NEWS b/NEWS index 1d1c95e3..1556473a 100644 --- a/NEWS +++ b/NEWS @@ -21,7 +21,7 @@ Version 4.6 * Add rigctlsync utility to synchronize frequency from a rig to SDR# (or others) * Add SDR# rig for use with SDR#'s gpredict plugin -- can only get/set freq * Add Apex Shared Loop rotator -- unidirectional only so far - * Add client_version to rigctld so client can report it's version for future use/compatility/alternatives + * Add client_version to rigctld so client can report it's version for future use/compatibility/alternatives * Add --set-conf=tuner_control_pathname=hamlib_tuner_control (default) If file exists then it will be called with 0/1 (Off/On) argument with 'U TUNER 0' or 'U TUNER 1" diff --git a/doc/README.man-pages b/doc/README.man-pages index fe1c62d4..bac868bb 100644 --- a/doc/README.man-pages +++ b/doc/README.man-pages @@ -159,7 +159,7 @@ PDF as blocks of constant width text and should be verbatim input or output in the shell, programs, or blocks of source code. Text intended to be typed at a shell or program prompt should be in bold and -program orshell output in normal weight. In some cases it will be necessary +program or shell output in normal weight. In some cases it will be necessary to use the "\fB...\fP" font formatting calls especially where backslash escapes ("\\") are required. diff --git a/doc/hamlib.cfg.in b/doc/hamlib.cfg.in index 569c6c14..df115717 100644 --- a/doc/hamlib.cfg.in +++ b/doc/hamlib.cfg.in @@ -17,7 +17,7 @@ MAN_EXTENSION = .3 # Set GENERATE_LATEX to YES to generate the needed files for the PDF manual # and run 'make doc'. Then 'cd latex ; make' to generate the PDF manual. # -# See section 1.3.1.2 in @top_srcdir@/README.developer for the needed LaTEX +# See section 1.3.1.2 in @top_srcdir@/README.developer for the needed LaTeX # packages. USE_PDFLATEX = YES PDF_HYPERLINKS = YES diff --git a/extra/kylix/README.kylix b/extra/kylix/README.kylix index 861faef1..926ab389 100644 --- a/extra/kylix/README.kylix +++ b/extra/kylix/README.kylix @@ -16,13 +16,13 @@ hamlib_rotapi.pas HamlibComponents.pas This file contain two components that encapsulate the rig and rotator - frontends. It is very simular to the C++ class. + frontends. It is very similar to the C++ class. A simple test program is included in the tests/ directory. It implements a selection dialog and a very simple Radio Control dialog. -This binding was develop with Borland Kylix Open Edition Ver 2.0. Open Edition +This binding was developed with Borland Kylix Open Edition Ver 2.0. Open Edition is freely downloadable from Borland's website for use with GPL projects. http://www.borland.com/kylix/ diff --git a/extra/kylix/hamlib_rigapi.pas b/extra/kylix/hamlib_rigapi.pas index 5d32d7dc..b9cec3ee 100644 --- a/extra/kylix/hamlib_rigapi.pas +++ b/extra/kylix/hamlib_rigapi.pas @@ -327,7 +327,7 @@ const //#define RIG_IS_TOKEN_FRONTEND(t) ((t)&(1<<30)) {* - * strongly inspired from soundmedem. Thanks Thomas! + * strongly inspired from soundmodem. Thanks Thomas! *} RIG_CONF_STRING = 0; RIG_CONF_COMBO = 1; @@ -472,7 +472,7 @@ type const {* - * tranceive mode, ie. the rig notify the host of any event, + * transceive mode, ie. the rig notify the host of any event, * like freq changed, mode changed, etc. *} RIG_TRN_OFF = 0; diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index 842da28d..b263bbfe 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -565,7 +565,7 @@ typedef unsigned int vfo_t; #define RIG_TARGETABLE_ANT (1<<10) #define RIG_TARGETABLE_ROOFING (1<<11) // roofing filter targetable by VFO #define RIG_TARGETABLE_SPECTRUM (1<<12) // spectrum scope targetable by VFO -#define RIG_TARGETABLE_BAND (1<<13) // Band select -- e.g. Yaeus BS command +#define RIG_TARGETABLE_BAND (1<<13) // Band select -- e.g. Yaesu BS command #define RIG_TARGETABLE_COMMON (RIG_TARGETABLE_RITXIT | RIG_TARGETABLE_PTT | RIG_TARGETABLE_MEM | RIG_TARGETABLE_BANK) #define RIG_TARGETABLE_ALL 0x7fffffff //! @endcond @@ -779,7 +779,7 @@ typedef long token_t; * * Current internal implementation * NUMERIC: val.f or val.i - * COMBO: val.i, starting from 0. Points to a table of strings or asci stored values. + * COMBO: val.i, starting from 0. Points to a table of strings or ASCII stored values. * STRING: val.s or val.cs * CHECKBUTTON: val.i 0/1 * BINARY: val.b @@ -2586,7 +2586,7 @@ struct rig_state { int lock_mode; /*!< flag that prevents mode changes if ~= 0 -- see set/get_lock_mode */ powerstat_t powerstat; /*!< power status */ char *tuner_control_pathname; /*!< Path to external tuner control program that get 0/1 (Off/On) argument */ - char client_version[32]; /*!<! Allow client to report version for compatility checks/capability */ + char client_version[32]; /*!<! Allow client to report version for compatibility checks/capability */ freq_t offset_vfoa; /*!< Offset to apply to VFOA/Main set_freq */ freq_t offset_vfob; /*!< Offset to apply to VFOB/Sub set_freq */ }; diff --git a/rigs/jrc/jst145.c b/rigs/jrc/jst145.c index 49874da2..95eaeca8 100644 --- a/rigs/jrc/jst145.c +++ b/rigs/jrc/jst145.c @@ -506,7 +506,7 @@ static int jst145_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) if (retval != RIG_OK) { - rig_debug(RIG_DEBUG_ERR, "%s: jrc_transcation failed: %s\n", __func__, + rig_debug(RIG_DEBUG_ERR, "%s: jrc_transaction failed: %s\n", __func__, rigerror(retval)); } diff --git a/rigs/uniden/uniden_digital.c b/rigs/uniden/uniden_digital.c index d72d0293..a9d752c2 100644 --- a/rigs/uniden/uniden_digital.c +++ b/rigs/uniden/uniden_digital.c @@ -46,7 +46,7 @@ * use the address returned from one of the commands. If you decide * the latter method, the order is slightly confusing but, I have it * well documented within DSctl. The latter method is also as much - * as 30% faster then using the Uniden software or "Get Next + * as 30% faster than using the Uniden software or "Get Next * Location" command. */ diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 601db0c6..eb206647 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -3536,7 +3536,7 @@ int newcat_set_powerstat(RIG *rig, powerstat_t status) ENTERFUNC; -#if 0 // all Yaeus rigs have PS and calling this here interferes with power on +#if 0 // all Yaesu rigs have PS and calling this here interferes with power on if (!newcat_valid_command(rig, "PS")) { @@ -7809,7 +7809,7 @@ int newcat_set_tx_vfo(RIG *rig, vfo_t tx_vfo) if (is_ftdx101d || is_ftdx101mp) { - // what other Yaeus rigs should be using this? + // what other Yaesu rigs should be using this? // The DX101D returns FT0 when in split and not transmitting command = "ST"; } @@ -7840,7 +7840,7 @@ int newcat_get_tx_vfo(RIG *rig, vfo_t *tx_vfo) if (is_ftdx101d || is_ftdx101mp) { - // what other Yaeus rigs should be using this? + // what other Yaesu rigs should be using this? // The DX101D returns FT0 when in split and not transmitting command = "ST"; } @@ -10897,7 +10897,7 @@ int newcat_set_cmd_validate(RIG *rig) { // for the BS command we can only run it once // so we'll assume it worked - // maybe Yaeus will make this command more intelligent + // maybe Yaesu will make this command more intelligent if (strstr(priv->cmd_str, "BS")) { RETURNFUNC(RIG_OK); } // if the first two chars match we are validated diff --git a/src/amplifier.c b/src/amplifier.c index 0dccadb3..c0f16494 100644 --- a/src/amplifier.c +++ b/src/amplifier.c @@ -132,7 +132,7 @@ static int remove_opened_amp(const AMP *amp) #ifdef XXREMOVEDXX /** - * \brief Executess cfunc() on each #AMP handle. + * \brief Executes cfunc() on each #AMP handle. * * \param cfunc The function to be executed on each #AMP handle. * \param data Data pointer to be passed to cfunc() diff --git a/src/rig.c b/src/rig.c index d08616e4..13aeb5fe 100644 --- a/src/rig.c +++ b/src/rig.c @@ -843,7 +843,7 @@ int HAMLIB_API rig_open(RIG *rig) RETURNFUNC(-RIG_EINVAL); } - // rigctl/rigctld may have deprecated values -- backwards compatility + // rigctl/rigctld may have deprecated values -- backwards compatibility if (rs->rigport_deprecated.pathname[0] != 0) { strcpy(rs->rigport.pathname, rs->rigport_deprecated.pathname); @@ -4540,10 +4540,10 @@ int HAMLIB_API rig_set_split_mode(RIG *rig, __LINE__, rig_strvfo(tx_vfo), rig_strrmode(tx_mode)); } - // code below here should be dead code now -- but maybe we have VFO situatiuon we need to handle + // code below here should be dead code now -- but maybe we have VFO situation we need to handle if (caps->rig_model == RIG_MODEL_NETRIGCTL) { - // special handlingt for netrigctl to avoid set_vfo + // special handling for netrigctl to avoid set_vfo retcode = caps->set_split_mode(rig, vfo, tx_mode, tx_width); ELAPSED2; RETURNFUNC(retcode); @@ -4830,7 +4830,7 @@ int HAMLIB_API rig_set_split_freq_mode(RIG *rig, HAMLIB_TRACE; retcode = caps->set_split_freq_mode(rig, vfo, tx_freq, tx_mode, tx_width); -#if 0 // this verification seems to be causing bad behavior on some reigs +#if 0 // this verification seems to be causing bad behavior on some rigs // we query freq after set to ensure it really gets done do @@ -7456,7 +7456,7 @@ int HAMLIB_API rig_cookie(RIG *rig, enum cookie_e cookie_cmd, char *cookie, date_strget(cookie, cookie_len, 0); size_t len = strlen(cookie); // add on our random number to ensure uniqueness - // The cookie should never be longer then HAMLIB_COOKIE_SIZE + // The cookie should never be longer than HAMLIB_COOKIE_SIZE SNPRINTF(cookie + len, HAMLIB_COOKIE_SIZE - len, " %d\n", rand()); strcpy(cookie_save, cookie); time_last_used = time_curr; diff --git a/tests/ampctl_parse.c b/tests/ampctl_parse.c index 73ae8023..55d2137a 100644 --- a/tests/ampctl_parse.c +++ b/tests/ampctl_parse.c @@ -868,7 +868,7 @@ int ampctl_parse(AMP *my_amp, FILE *fin, FILE *fout, char *argv[], int argc) rp_getline("\nAmplifier command: "); - /* EOF (Ctl-D) received on empty input line, bail out gracefully. */ + /* EOF (Ctrl-D) received on empty input line, bail out gracefully. */ if (!input_line) { fprintf_flush(fout, "\n"); @@ -952,7 +952,7 @@ int ampctl_parse(AMP *my_amp, FILE *fin, FILE *fout, char *argv[], int argc) char cmd_name[MAXNAMSIZ]; /* if there is no terminating '\0' character in the source string, - * srncpy() doesn't add one even if the supplied length is less + * strncpy() doesn't add one even if the supplied length is less * than the destination array. Truncate the source string here. */ if (strlen(parsed_input[0] + 1) >= MAXNAMSIZ) diff --git a/tests/testcookie.c b/tests/testcookie.c index 5108e179..10625480 100644 --- a/tests/testcookie.c +++ b/tests/testcookie.c @@ -28,9 +28,9 @@ static int test1() else {printf("Test#1c Failed\n"); return 1;} #if 0 - // after 1 second we should be able to get a coookie + // after 1 second we should be able to get a cookie // this means the cookie holder did not renew within 1 second - hl_usleep(1500 * 1000); // after 1 second we should be able to get a coookie + hl_usleep(1500 * 1000); // after 1 second we should be able to get a cookie retcode = rig_cookie(NULL, RIG_COOKIE_GET, cookie2, sizeof(cookie2)); @@ -91,7 +91,7 @@ static int test3_invalid_input() char cookie[HAMLIB_COOKIE_SIZE]; int n = 0; - /* Make sure any value smaller then HAMLIB_COOKIE_SIZE is rejected */ + /* Make sure any value smaller than HAMLIB_COOKIE_SIZE is rejected */ for (unsigned int i = 0; i < HAMLIB_COOKIE_SIZE; i++) { retcode = rig_cookie(NULL, RIG_COOKIE_GET, cookie, i); commit dd874dbf7f53b09d455afa921af0938ed914bbe8 Merge: e5a00cdd 748b45b9 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Apr 9 08:30:44 2023 -0500 Merge branch 'master' of https://github.com/Hamlib/Hamlib commit e5a00cddb9fcbebcf8a41de96a6380f03618d230 Author: Mike Black W9MDB <mdb...@ya...> Date: Sun Apr 9 08:29:48 2023 -0500 Fix case where netrigctl gets a 0 answer to chk_vfo https://github.com/Hamlib/Hamlib/issues/1266 diff --git a/rigs/dummy/netrigctl.c b/rigs/dummy/netrigctl.c index 8e7613ae..da181e8f 100644 --- a/rigs/dummy/netrigctl.c +++ b/rigs/dummy/netrigctl.c @@ -265,7 +265,7 @@ static int netrigctl_open(RIG *rig) if (sscanf(buf, "CHKVFO %d", &priv->rigctld_vfo_mode) == 1) { - rig->state.vfo_opt = 1; + rig->state.vfo_opt = priv->rigctld_vfo_mode; rig_debug(RIG_DEBUG_TRACE, "%s: chkvfo=%d\n", __func__, priv->rigctld_vfo_mode); } else if (ret == 2) @@ -2732,7 +2732,7 @@ struct rig_caps netrigctl_caps = RIG_MODEL(RIG_MODEL_NETRIGCTL), .model_name = "NET rigctl", .mfg_name = "Hamlib", - .version = "20230328.0", + .version = "20204009.0", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_OTHER, commit 2c283ab47ae99fd404ee1950434465385f00a734 Author: Nick Craig-Wood <ni...@cr...> Date: Sun Apr 9 14:00:25 2023 +0100 Fix QRP Labs QCX Morse Sending Before this fix, hamlib used the TS480 protocol for sending morse which adds a lot of spaces on the end. The QCX actually uses the Elecraft morse sending protocol so switch it over to using that. Tested with QCX Mini firmware v1.09a diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index 8cc758f8..2f5b0c81 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -5196,6 +5196,7 @@ int kenwood_send_morse(RIG *rig, vfo_t vfo, const char *msg) case RIG_MODEL_K3S: case RIG_MODEL_KX2: case RIG_MODEL_KX3: + case RIG_MODEL_QRPLABS: SNPRINTF(morsebuf, sizeof(morsebuf), "KY %s", m2); break; ----------------------------------------------------------------------- Summary of changes: NEWS | 2 +- doc/README.man-pages | 2 +- doc/hamlib.cfg.in | 2 +- extra/kylix/README.kylix | 4 ++-- extra/kylix/hamlib_rigapi.pas | 4 ++-- include/hamlib/rig.h | 8 ++++---- include/hamlib/riglist.h | 14 +++++++++++++- rigs/dummy/netrigctl.c | 4 ++-- rigs/jrc/jst145.c | 2 +- rigs/kenwood/kenwood.c | 1 + rigs/uniden/uniden_digital.c | 2 +- rigs/yaesu/newcat.c | 8 ++++---- src/amplifier.c | 2 +- src/cache.c | 1 + src/rig.c | 12 ++++++------ src/token.h | 12 +++++++----- tests/ampctl_parse.c | 4 ++-- tests/testcookie.c | 6 +++--- 18 files changed, 53 insertions(+), 37 deletions(-) hooks/post-receive -- Hamlib -- Ham radio control libraries |