[Hamlib-commits] Hamlib -- Ham radio control libraries branch master updated. 56de3bb25d0e0c9919681
Library to control radio transceivers and receivers
Brought to you by:
n0nb
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] |