[Hamlib-commits] Hamlib -- Ham radio control libraries branch master updated. aa50482c831001eef1bd5
Library to control radio transceivers and receivers
Brought to you by:
n0nb
From: n0nb <n0...@us...> - 2022-12-09 12:25:25
|
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 aa50482c831001eef1bd585035b83dace93fdbfc (commit) via 9eddf62687bd894a09ff02fef53500f5977794a0 (commit) via 0489df5bf10af2746b952c9cd00bb12ebdf8bd8f (commit) via d369b60f6d089a2a8691a9d9e8715156e8fcdafe (commit) via dd029a3082a1c53a3c139bcb98bb48ba6a69fd06 (commit) via 180e49754fe41754b5a075cdea1701830cabc01b (commit) via 458bb2d9e470afcec45601f90262c34cdbbc9153 (commit) via 8a057d8bf4fef2849698d820dc0250d22bad5ae8 (commit) via 07cc887432be93b191aa7b67c68a5b2962c4f06e (commit) via 0860bda83214382d1d0c887573d553cd0d9a4e86 (commit) via 0cc4ca778dc580ed5078eed51bbe4eeb294637ee (commit) via a522e6f6e7e0cdca8e0cbb8204a29d584431cc41 (commit) via c7d0004b36e60691f5f2e87acf538f505d6e5175 (commit) via b2d6a856a432aa7394d6b7887660d4dca504d842 (commit) via db690f37ff31fc303edf87c41358bcdc0d9ad9fc (commit) via 0bdb6827dabab3321fb10d835810c180f77fde99 (commit) via 82ef0a39bfb9ff5be56cd28c212b1954e8f39ba0 (commit) from 7b7a0460edfcef8afe1ef7f5b5b0f3e109751926 (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 aa50482c831001eef1bd585035b83dace93fdbfc Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Dec 8 22:37:22 2022 -0600 astyle flir.c diff --git a/rotators/flir/flir.c b/rotators/flir/flir.c index 7ae3ffc0..b1a8fa79 100644 --- a/rotators/flir/flir.c +++ b/rotators/flir/flir.c @@ -63,12 +63,12 @@ struct flir_priv_data char *magic_conf; - float_t resolution_pp; - float_t resolution_tp; + float_t resolution_pp; + float_t resolution_tp; }; static int flir_request(ROT *rot, char *request, char *response, - int resp_size) + int resp_size) { int return_value = -RIG_EINVAL; int retry_read = 0; @@ -78,45 +78,51 @@ static int flir_request(ROT *rot, char *request, char *response, rig_flush(&rot->state.rotport); - if (request) + if (request) + { + return_value = write_block(&rot->state.rotport, (unsigned char *)request, + strlen(request)); + + if (return_value != RIG_OK) { - return_value = write_block(&rot->state.rotport, (unsigned char *)request, - strlen(request)); - if (return_value != RIG_OK) - { - rig_debug(RIG_DEBUG_VERBOSE, "%s request not OK\n", __func__); - return return_value; - } + rig_debug(RIG_DEBUG_VERBOSE, "%s request not OK\n", __func__); + return return_value; } - //Is a direct response expected? - if (response != NULL) + } + + //Is a direct response expected? + if (response != NULL) + { + while (retry_read < rot->state.rotport.retry) { - while(retry_read < rot->state.rotport.retry) + memset(response, 0, (size_t)resp_size); + read_char = read_string(&rot->state.rotport, (unsigned char *)response, + resp_size, + "\r\n", sizeof("\r\n"), 0, 1); + + if (read_char > 0) { - memset(response, 0, (size_t)resp_size); - read_char = read_string(&rot->state.rotport, (unsigned char *)response, resp_size, - "\r\n", sizeof("\r\n"), 0, 1); - if(read_char > 0) + if (response[0] == '*') + { + rig_debug(RIG_DEBUG_VERBOSE, "accepted command %s\n", request); + return RIG_OK; + } + else { - if(response[0] == '*') - { - rig_debug(RIG_DEBUG_VERBOSE, "accepted command %s\n", request); - return RIG_OK; - } - else - { - rig_debug(RIG_DEBUG_VERBOSE, "NOT accepted command %s\n", request); - return -RIG_ERJCTED; - } - + rig_debug(RIG_DEBUG_VERBOSE, "NOT accepted command %s\n", request); + return -RIG_ERJCTED; } - retry_read++; + } - response = ""; - rig_debug(RIG_DEBUG_VERBOSE, "timeout for command %s\n", request); - return -RIG_ETIMEOUT; + + retry_read++; } + response = ""; + rig_debug(RIG_DEBUG_VERBOSE, "timeout for command %s\n", request); + return -RIG_ETIMEOUT; + } + return return_value; }; @@ -151,7 +157,7 @@ static int flir_init(ROT *rot) static int flir_cleanup(ROT *rot) { struct flir_priv_data *priv = (struct flir_priv_data *) - rot->state.priv; + rot->state.priv; rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); @@ -188,21 +194,24 @@ static int flir_open(ROT *rot) return_value = flir_request(rot, "FT\n", return_str, MAXBUF); // Get PAN resolution in arcsecs - if(flir_request(rot, "PR\n", return_str, MAXBUF) == RIG_OK) + if (flir_request(rot, "PR\n", return_str, MAXBUF) == RIG_OK) { sscanf(return_str, "* %f", &resolution_pp); - rig_debug(RIG_DEBUG_VERBOSE, "PAN resolution: %f arcsecs per position\n", resolution_pp); + rig_debug(RIG_DEBUG_VERBOSE, "PAN resolution: %f arcsecs per position\n", + resolution_pp); priv->resolution_pp = resolution_pp; } else { return_value = -RIG_EPROTO; } + // Get TILT resolution in arcsecs - if(flir_request(rot, "TR\n", return_str, MAXBUF) == RIG_OK) + if (flir_request(rot, "TR\n", return_str, MAXBUF) == RIG_OK) { sscanf(return_str, "* %f", &resolution_tp); - rig_debug(RIG_DEBUG_VERBOSE, "TILT resolution: %f arcsecs per position\n", resolution_tp); + rig_debug(RIG_DEBUG_VERBOSE, "TILT resolution: %f arcsecs per position\n", + resolution_tp); priv->resolution_tp = resolution_tp; } else @@ -236,7 +245,7 @@ static int flir_set_position(ROT *rot, azimuth_t az, elevation_t el) char return_str[MAXBUF]; char cmd_str[MAXBUF]; struct flir_priv_data *priv = (struct flir_priv_data *) - rot->state.priv; + rot->state.priv; rig_debug(RIG_DEBUG_VERBOSE, "%s called: %.2f %.2f\n", __func__, az, el); @@ -260,14 +269,14 @@ static int flir_get_position(ROT *rot, azimuth_t *az, elevation_t *el) int return_value = RIG_OK; char return_str[MAXBUF]; int32_t pan_positions, tilt_positions; - + struct flir_priv_data *priv = (struct flir_priv_data *) - rot->state.priv; + rot->state.priv; rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); - if(flir_request(rot, "PP\n", return_str, MAXBUF) == RIG_OK) + if (flir_request(rot, "PP\n", return_str, MAXBUF) == RIG_OK) { rig_debug(RIG_DEBUG_VERBOSE, "PP Return String: %s\n", return_str); sscanf(return_str, "* %d", &pan_positions); @@ -279,8 +288,8 @@ static int flir_get_position(ROT *rot, azimuth_t *az, elevation_t *el) rig_debug(RIG_DEBUG_VERBOSE, "PP Wrong Return String: %s\n", return_str); return_value = -RIG_EPROTO; } - - if(flir_request(rot, "TP\n", return_str, MAXBUF) == RIG_OK) + + if (flir_request(rot, "TP\n", return_str, MAXBUF) == RIG_OK) { rig_debug(RIG_DEBUG_VERBOSE, "TP Return String: %s\n", return_str); sscanf(return_str, "* %d", &tilt_positions); @@ -301,7 +310,7 @@ static int flir_stop(ROT *rot) int return_value = RIG_OK; struct flir_priv_data *priv = (struct flir_priv_data *) - rot->state.priv; + rot->state.priv; azimuth_t az; elevation_t el; @@ -333,22 +342,25 @@ static int flir_reset(ROT *rot, rot_reset_t reset) { int return_value = RIG_OK; rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); + if (reset != 0) { return_value = flir_request(rot, "r\n", NULL, 0); + // After Reset: Disable Hard Limits - if(return_value == RIG_OK) + if (return_value == RIG_OK) { return_value = flir_request(rot, "LD\n", NULL, MAXBUF); } } + return return_value; } static int flir_move(ROT *rot, int direction, int speed) { struct flir_priv_data *priv = (struct flir_priv_data *) - rot->state.priv; + rot->state.priv; rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); rig_debug(RIG_DEBUG_TRACE, "%s: Direction = %d, Speed = %d\n", __func__, @@ -381,20 +393,24 @@ static const char *flir_get_info(ROT *rot) char info_str[101]; struct flir_priv_data *priv = (struct flir_priv_data *) - rot->state.priv; + rot->state.priv; sprintf(priv->info, "No Info"); rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); - if(flir_request(rot, "V\n", firmware_str, 120) != RIG_OK) + + if (flir_request(rot, "V\n", firmware_str, 120) != RIG_OK) { return "No Info available"; } + hl_usleep(500000); - if(flir_request(rot, "O\n", info_str, 100) != RIG_OK) + + if (flir_request(rot, "O\n", info_str, 100) != RIG_OK) { return "No Info available"; } + sprintf(priv->info, "Firmware: %s\nPower: %s", firmware_str, info_str); return priv->info; @@ -463,7 +479,7 @@ static int flir_get_ext_parm(ROT *rot, token_t token, value_t *val) static int flir_get_status(ROT *rot, rot_status_t *status) { struct flir_priv_data *priv = (struct flir_priv_data *) - rot->state.priv; + rot->state.priv; *status = priv->status; return RIG_OK; commit 9eddf62687bd894a09ff02fef53500f5977794a0 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Dec 8 22:37:10 2022 -0600 Update simftdx3000.c diff --git a/simulators/simftdx3000.c b/simulators/simftdx3000.c index e8c4a31f..33b0cd00 100644 --- a/simulators/simftdx3000.c +++ b/simulators/simftdx3000.c @@ -252,6 +252,11 @@ int main(int argc, char *argv[]) { sscanf(buf, "MD0%d", &md); } + else if (strcmp(buf, "PS;") == 0) + { + SNPRINTF(buf, sizeof(buf), "PS1;"); + n = write(fd, buf, strlen(buf)); + } else if (strcmp(buf, "VS;") == 0) { SNPRINTF(buf, sizeof(buf), "VS%d;", vs); commit 0489df5bf10af2746b952c9cd00bb12ebdf8bd8f Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Dec 8 22:36:35 2022 -0600 Update NEWS diff --git a/NEWS b/NEWS index eb8e4432..8becd307 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,7 @@ Version 5.x -- future Version 4.6 * 2023-11-XX -- Planned for Nov 2023 * Add MDS 4710/9710 rigs + * Add FLIR PTU-D48, E46, D100, D300 rotors * Add NB2 for FT2000 * Fix FTDX3000 rig split commit d369b60f6d089a2a8691a9d9e8715156e8fcdafe Merge: dd029a30 07cc8874 Author: Michael Black <mdb...@ya...> Date: Thu Dec 8 22:30:24 2022 -0600 Merge pull request #1164 from andz82/master Added FLIR/DirectedPerception PTU rotor backend commit dd029a3082a1c53a3c139bcb98bb48ba6a69fd06 Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Dec 8 22:26:09 2022 -0600 Fix FTDX3000 split problem with sticking on Sub VFO https://github.com/Hamlib/Hamlib/issues/1177 diff --git a/NEWS b/NEWS index 13a3d4e0..eb8e4432 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,7 @@ Version 4.6 * 2023-11-XX -- Planned for Nov 2023 * Add MDS 4710/9710 rigs * Add NB2 for FT2000 + * Fix FTDX3000 rig split Version 4.5.1 * 2022-XX-XX diff --git a/src/rig.c b/src/rig.c index 7c8b326f..bddad1e8 100644 --- a/src/rig.c +++ b/src/rig.c @@ -2888,12 +2888,12 @@ int HAMLIB_API rig_get_vfo(RIG *rig, vfo_t *vfo) } cache_ms = elapsed_ms(&rig->state.cache.time_vfo, HAMLIB_ELAPSED_GET); - rig_debug(RIG_DEBUG_TRACE, "%s: cache check age=%dms\n", __func__, cache_ms); + //rig_debug(RIG_DEBUG_TRACE, "%s: cache check age=%dms\n", __func__, cache_ms); if (cache_ms < rig->state.cache.timeout_ms) { - rig_debug(RIG_DEBUG_TRACE, "%s: cache hit age=%dms\n", __func__, cache_ms); *vfo = rig->state.cache.vfo; + rig_debug(RIG_DEBUG_TRACE, "%s: cache hit age=%dms, vfo=%s\n", __func__, cache_ms, rig_strvfo(*vfo)); ELAPSED2; RETURNFUNC(RIG_OK); } @@ -4424,12 +4424,12 @@ int HAMLIB_API rig_set_split_mode(RIG *rig, // so we turn it off, do our thing, and turn split back on rx_vfo = vfo; - if (tx_vfo == RIG_VFO_B) { rx_vfo = RIG_VFO_A; } + if (tx_vfo == RIG_VFO_B || tx_vfo == RIG_VFO_SUB) { rx_vfo = RIG_VFO_A; } - if (vfo == RIG_VFO_CURR && tx_vfo == RIG_VFO_B) { rx_vfo = RIG_VFO_A; } - else if (vfo == RIG_VFO_CURR && tx_vfo == RIG_VFO_A) { rx_vfo = RIG_VFO_B; } + if (vfo == RIG_VFO_CURR && tx_vfo == RIG_VFO_B) { rx_vfo = RIG_VFO_A; } + else if (vfo == RIG_VFO_CURR && tx_vfo == RIG_VFO_A) { rx_vfo = RIG_VFO_B; } else if (vfo == RIG_VFO_CURR && tx_vfo == RIG_VFO_MAIN) { rx_vfo = RIG_VFO_SUB; } - else if (vfo == RIG_VFO_CURR && tx_vfo == RIG_VFO_SUB) { rx_vfo = RIG_VFO_MAIN; } + else if (vfo == RIG_VFO_CURR && tx_vfo == RIG_VFO_SUB) { rx_vfo = RIG_VFO_MAIN; } rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): rx_vfo=%s, tx_vfo=%s\n", __func__, __LINE__, rig_strvfo(rx_vfo), rig_strvfo(tx_vfo)); @@ -4927,8 +4927,10 @@ int HAMLIB_API rig_set_split_vfo(RIG *rig, { switch (tx_vfo) { + case RIG_VFO_MAIN: case RIG_VFO_A: rx_vfo = split == 1 ? RIG_VFO_B : RIG_VFO_A; break; + case RIG_VFO_SUB: case RIG_VFO_B: rx_vfo = split == 1 ? RIG_VFO_A : RIG_VFO_B; break; } commit 180e49754fe41754b5a075cdea1701830cabc01b Author: Mike Black W9MDB <mdb...@ya...> Date: Thu Dec 8 22:25:18 2022 -0600 Update NEWS diff --git a/NEWS b/NEWS index 5cc62a02..13a3d4e0 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,7 @@ Version 5.x -- future Version 4.6 * 2023-11-XX -- Planned for Nov 2023 * Add MDS 4710/9710 rigs + * Add NB2 for FT2000 Version 4.5.1 * 2022-XX-XX commit 458bb2d9e470afcec45601f90262c34cdbbc9153 Merge: 7b7a0460 8a057d8b Author: Michael Black <mdb...@ya...> Date: Thu Dec 8 16:43:15 2022 -0600 Merge pull request #1179 from PianetaRadio/patch-1 Update NEWS commit 8a057d8bf4fef2849698d820dc0250d22bad5ae8 Author: PianetaRadio <789...@us...> Date: Thu Dec 8 21:03:22 2022 +0100 Update NEWS FT-2000 NB2 diff --git a/NEWS b/NEWS index 7fc4511d..5cc62a02 100644 --- a/NEWS +++ b/NEWS @@ -19,7 +19,7 @@ Version 4.6 Version 4.5.1 * 2022-XX-XX * FT2000, FTDX3000/D, FT891, FT991, FT950, FTDX5000 now set CAT TOT to 100ms - * Add missing NB2 setting to FT-950, FTDX-1200, FTDX-3000, FTDX-5000, FTDX-9000 + * Add missing NB2 setting to FT-950, FTDX-1200, FT-2000, FTDX-3000, FTDX-5000, FTDX-9000 * Add missing meter reading to TS-890S -- thanks to Geore Baltz N3GB * Fix FT736 VFOB freq and mode set * Added send_raw to rigctl -- see rigctl man page commit 07cc887432be93b191aa7b67c68a5b2962c4f06e Author: andz <an...@an...> Date: Wed Nov 30 16:06:27 2022 +0100 Added Android.mk diff --git a/rotators/flir/Android.mk b/rotators/flir/Android.mk new file mode 100644 index 00000000..3fa35ec0 --- /dev/null +++ b/rotators/flir/Android.mk @@ -0,0 +1,12 @@ +LOCAL_PATH:= $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := flir.c +LOCAL_MODULE := flir + +LOCAL_CFLAGS := +LOCAL_C_INCLUDES := android include src +LOCAL_LDLIBS := -lhamlib -Lobj/local/$(TARGET_ARCH_ABI) + +include $(BUILD_STATIC_LIBRARY) commit 0860bda83214382d1d0c887573d553cd0d9a4e86 Author: andz <an...@an...> Date: Wed Nov 30 15:55:27 2022 +0100 Changed header description diff --git a/rotators/flir/flir.h b/rotators/flir/flir.h index 5b32e1c3..e20c05c7 100644 --- a/rotators/flir/flir.h +++ b/rotators/flir/flir.h @@ -1,6 +1,6 @@ /* - * Hamlib Dummy backend - main header - * Copyright (c) 2001-2008 by Stephane Fillod + * Hamlib FLIR PTU rotor backend - main header + * Copyright (c) 2022 by Andreas Mueller (DC1MIL) * * * This library is free software; you can redistribute it and/or commit 0cc4ca778dc580ed5078eed51bbe4eeb294637ee Merge: a522e6f6 526b1853 Author: andz <an...@us...> Date: Wed Nov 30 15:50:38 2022 +0100 Merge branch 'Hamlib:master' into master commit a522e6f6e7e0cdca8e0cbb8204a29d584431cc41 Author: andz <an...@an...> Date: Wed Nov 30 15:41:41 2022 +0100 Added README.md diff --git a/rotators/flir/README b/rotators/flir/README deleted file mode 100644 index 0601a099..00000000 --- a/rotators/flir/README +++ /dev/null @@ -1 +0,0 @@ -tbd diff --git a/rotators/flir/README.md b/rotators/flir/README.md new file mode 100644 index 00000000..11d3b9bc --- /dev/null +++ b/rotators/flir/README.md @@ -0,0 +1,75 @@ +# FLIR/DirectedPerception PTU Rotor Module + +This module interfaces FLIR and DirectedPerception +rotor using the PTU protocol via serial. + +This includes: + +* PTU-D48(E) +* PTU-E46 +* PTU-D100(E) +* PTU-D300(E) + +Tested only with PTU-D48 yet and with one rotor per chain only. + +## Usage + +1. Connect the rotor via serial (RS232 or RS485) +2. Power up the rotor +3. The rotor must be calibrated after each power up. This can be accived +either using the rotctl `Reset` command (R) or manually via serial terminal +sending the `R\n` command. +4. To enable the rotor to fully turn +/- 180°, the softlock must be disabled. +This is included in the rotctl `Reset` commnad or manually via serial terminal +seinden the command `LD\n`. **WARNING:** Send this command only after the rotor is +calibrated, or you risk damage running into the hard endstops (at about +/-190°) +5. Start `rotctl` or `rotctld` with the arguments `-m 2501 -r <Serial + Interface>` + +Have Fun. + +### Hints + +1. Setup the max. velocity, power and acceleration according to your antenna load. +This must be done via serial terminal, as the functions are not implemented yet. +2. Never use the maximum hold power, only use the low or off. If you use max or regular, +the rotor may easily overheat! + +## PTU Protocol + +* [Protocol Version 3.02 (2011)](https://flir.netx.net/file/asset/11556/original/attachment) + +## Current Status + +The current status is **ALPHA**. It is tested with DirectedPercepiton PTU-D48 (Firmware v2.13.4r0(D48-C14/E)) +Linux with `rotctl` and `gpredict`. + +### Implemented so far: + +* init +* cleanup +* open +* close +* set_position +* get_position +* park +* stop +* reset +* move +* info + +### Needs to be implemented: + +#### Parameters + +* velocity +* acceleration +* velocity profile +* user soft-limits +* power commands (move and hold) +* step mode +* reset on startup + +#### Functions + +* usage of chained rotors via RS485 commit c7d0004b36e60691f5f2e87acf538f505d6e5175 Author: andz <an...@an...> Date: Wed Nov 30 15:33:55 2022 +0100 Fixed Info command diff --git a/rotators/flir/flir.c b/rotators/flir/flir.c index 8adaa892..7ae3ffc0 100644 --- a/rotators/flir/flir.c +++ b/rotators/flir/flir.c @@ -377,21 +377,26 @@ static int flir_move(ROT *rot, int direction, int speed) static const char *flir_get_info(ROT *rot) { - char firmware_str[120]; - char info_str[120]; + char firmware_str[121]; + char info_str[101]; + struct flir_priv_data *priv = (struct flir_priv_data *) rot->state.priv; sprintf(priv->info, "No Info"); rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); - - if(flir_request(rot, "V\n", firmware_str, 120) == RIG_OK && - flir_request(rot, "O\n", info_str, 120) == RIG_OK) + if(flir_request(rot, "V\n", firmware_str, 120) != RIG_OK) { - sprintf(priv->info, "Firmware: %s Info: %s", firmware_str, info_str); + return "No Info available"; } - //rig_debug(RIG_DEBUG_VERBOSE, "Return String: %s", return_str); + hl_usleep(500000); + if(flir_request(rot, "O\n", info_str, 100) != RIG_OK) + { + return "No Info available"; + } + sprintf(priv->info, "Firmware: %s\nPower: %s", firmware_str, info_str); + return priv->info; } commit b2d6a856a432aa7394d6b7887660d4dca504d842 Author: andz <an...@an...> Date: Wed Nov 30 15:00:29 2022 +0100 Fixed segfault when read_string failed diff --git a/rotators/flir/flir.c b/rotators/flir/flir.c index ee3d317c..8adaa892 100644 --- a/rotators/flir/flir.c +++ b/rotators/flir/flir.c @@ -72,6 +72,7 @@ static int flir_request(ROT *rot, char *request, char *response, { int return_value = -RIG_EINVAL; int retry_read = 0; + int read_char = 0; rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); @@ -83,6 +84,7 @@ static int flir_request(ROT *rot, char *request, char *response, strlen(request)); if (return_value != RIG_OK) { + rig_debug(RIG_DEBUG_VERBOSE, "%s request not OK\n", __func__); return return_value; } } @@ -92,9 +94,9 @@ static int flir_request(ROT *rot, char *request, char *response, while(retry_read < rot->state.rotport.retry) { memset(response, 0, (size_t)resp_size); - resp_size = read_string(&rot->state.rotport, (unsigned char *)response, resp_size, + read_char = read_string(&rot->state.rotport, (unsigned char *)response, resp_size, "\r\n", sizeof("\r\n"), 0, 1); - if(resp_size > 0) + if(read_char > 0) { if(response[0] == '*') { @@ -110,6 +112,7 @@ static int flir_request(ROT *rot, char *request, char *response, } retry_read++; } + response = ""; rig_debug(RIG_DEBUG_VERBOSE, "timeout for command %s\n", request); return -RIG_ETIMEOUT; } @@ -273,6 +276,7 @@ static int flir_get_position(ROT *rot, azimuth_t *az, elevation_t *el) } else { + rig_debug(RIG_DEBUG_VERBOSE, "PP Wrong Return String: %s\n", return_str); return_value = -RIG_EPROTO; } @@ -285,6 +289,7 @@ static int flir_get_position(ROT *rot, azimuth_t *az, elevation_t *el) } else { + rig_debug(RIG_DEBUG_VERBOSE, "PP Wrong Return String: %s\n", return_str); return_value = -RIG_EPROTO; } commit db690f37ff31fc303edf87c41358bcdc0d9ad9fc Author: andz <an...@an...> Date: Wed Nov 30 13:55:00 2022 +0100 Cleaned up * removed all warnings * retrun -RIG_ENIMPL for all not yet implemented functions diff --git a/rotators/flir/flir.c b/rotators/flir/flir.c index 0e1b839c..ee3d317c 100644 --- a/rotators/flir/flir.c +++ b/rotators/flir/flir.c @@ -29,6 +29,7 @@ #include "hamlib/rotator.h" #include "register.h" #include "idx_builtin.h" +#include "serial.h" #include "flir.h" @@ -40,8 +41,6 @@ ROT_STATUS_MOVING_EL | ROT_STATUS_MOVING_UP | ROT_STATUS_MOVING_DOWN | \ ROT_STATUS_LIMIT_UP | ROT_STATUS_LIMIT_DOWN | ROT_STATUS_LIMIT_LEFT | ROT_STATUS_LIMIT_RIGHT) -//static int simulating = 0; // do we need rotator emulation for debug? - struct flir_priv_data { azimuth_t az; @@ -56,6 +55,8 @@ struct flir_priv_data value_t levels[RIG_SETTING_MAX]; value_t parms[RIG_SETTING_MAX]; + char info[256]; + struct ext_list *ext_funcs; struct ext_list *ext_levels; struct ext_list *ext_parms; @@ -66,61 +67,11 @@ struct flir_priv_data float_t resolution_tp; }; -// static const struct confparams flir_ext_levels[] = -// { -// { -// TOK_EL_ROT_MAGICLEVEL, "MGL", "Magic level", "Magic level, as an example", -// NULL, RIG_CONF_NUMERIC, { .n = { 0, 1, .001 } } -// }, -// { -// TOK_EL_ROT_MAGICFUNC, "MGF", "Magic func", "Magic function, as an example", -// NULL, RIG_CONF_CHECKBUTTON -// }, -// { -// TOK_EL_ROT_MAGICOP, "MGO", "Magic Op", "Magic Op, as an example", -// NULL, RIG_CONF_BUTTON -// }, -// { -// TOK_EL_ROT_MAGICCOMBO, "MGC", "Magic combo", "Magic combo, as an example", -// "VALUE1", RIG_CONF_COMBO, { .c = { .combostr = { "VALUE1", "VALUE2", "NONE", NULL } } } -// }, -// { RIG_CONF_END, NULL, } -// }; - -// static const struct confparams flir_ext_funcs[] = -// { -// { -// TOK_EL_ROT_MAGICEXTFUNC, "MGEF", "Magic ext func", "Magic ext function, as an example", -// NULL, RIG_CONF_CHECKBUTTON -// }, -// { RIG_CONF_END, NULL, } -// }; - -// static const struct confparams flir_ext_parms[] = -// { -// { -// TOK_EP_ROT_MAGICPARM, "MGP", "Magic parm", "Magic parameter, as an example", -// NULL, RIG_CONF_NUMERIC, { .n = { 0, 1, .001 } } -// }, -// { RIG_CONF_END, NULL, } -// }; - -/* cfgparams are configuration item generally used by the backend's open() method */ -// static const struct confparams flir_cfg_params[] = -// { -// { -// TOK_CFG_ROT_MAGICCONF, "mcfg", "Magic conf", "Magic parameter, as an example", -// "ROTATOR", RIG_CONF_STRING, { } -// }, -// { RIG_CONF_END, NULL, } -// }; - static int flir_request(ROT *rot, char *request, char *response, - uint32_t *resp_size) + int resp_size) { int return_value = -RIG_EINVAL; int retry_read = 0; - unsigned char cmd_ok; rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); @@ -128,20 +79,20 @@ static int flir_request(ROT *rot, char *request, char *response, if (request) { - return_value = write_block(&rot->state.rotport, (unsigned char *) request, + return_value = write_block(&rot->state.rotport, (unsigned char *)request, strlen(request)); if (return_value != RIG_OK) { return return_value; } } - //Is a direct request expected? + //Is a direct response expected? if (response != NULL) { while(retry_read < rot->state.rotport.retry) { - memset(response, 0, resp_size); - resp_size = read_string(&rot->state.rotport, response, resp_size, + memset(response, 0, (size_t)resp_size); + resp_size = read_string(&rot->state.rotport, (unsigned char *)response, resp_size, "\r\n", sizeof("\r\n"), 0, 1); if(resp_size > 0) { @@ -182,30 +133,6 @@ static int flir_init(ROT *rot) priv = rot->state.priv; - // priv->ext_funcs = alloc_init_ext(flir_ext_funcs); - - // if (!priv->ext_funcs) - // { - // return -RIG_ENOMEM; - // } - - // priv->ext_levels = alloc_init_ext(flir_ext_levels); - - // if (!priv->ext_levels) - // { - // return -RIG_ENOMEM; - // } - - // priv->ext_parms = alloc_init_ext(flir_ext_parms); - - // if (!priv->ext_parms) - // { - // return -RIG_ENOMEM; - // } - - //rot->state.rotport.type.rig = RIG_PORT_SERIAL; - //flir_request(rot, "r\n", sizeof("r\n"), NULL, NULL); - priv->az = priv->el = 0; priv->target_az = priv->target_el = 0; @@ -290,56 +217,15 @@ static int flir_close(ROT *rot) return RIG_OK; } -// static int flir_set_conf(ROT *rot, token_t token, const char *val) -// { -// struct flir_priv_data *priv; - -// priv = (struct flir_priv_data *)rot->state.priv; - -// switch (token) -// { -// case TOK_CFG_ROT_MAGICCONF: -// if (val) -// { -// free(priv->magic_conf); -// priv->magic_conf = strdup(val); -// } - -// break; - -// default: -// return -RIG_EINVAL; -// } - -// return RIG_OK; -// } - - -// static int flir_get_conf2(ROT *rot, token_t token, char *val, int val_len) -// { -// struct flir_priv_data *priv; - -// priv = (struct flir_priv_data *)rot->state.priv; - -// switch (token) -// { -// case TOK_CFG_ROT_MAGICCONF: -// SNPRINTF(val, val_len, "%s", priv->magic_conf); -// break; - -// default: -// return -RIG_EINVAL; -// } - -// return RIG_OK; -// } - -// static int flir_get_conf(ROT *rot, token_t token, char *val) -// { -// return flir_get_conf2(rot, token, val, 128); -// } - +static int flir_set_conf(ROT *rot, token_t token, const char *val) +{ + return -RIG_ENIMPL; +} +static int flir_get_conf(ROT *rot, token_t token, char *val) +{ + return -RIG_ENIMPL; +} static int flir_set_position(ROT *rot, azimuth_t az, elevation_t el) { @@ -383,6 +269,7 @@ static int flir_get_position(ROT *rot, azimuth_t *az, elevation_t *el) rig_debug(RIG_DEBUG_VERBOSE, "PP Return String: %s\n", return_str); sscanf(return_str, "* %d", &pan_positions); priv->az = (pan_positions * priv->resolution_pp) / 3600; + *az = priv->az; } else { @@ -394,23 +281,19 @@ static int flir_get_position(ROT *rot, azimuth_t *az, elevation_t *el) rig_debug(RIG_DEBUG_VERBOSE, "TP Return String: %s\n", return_str); sscanf(return_str, "* %d", &tilt_positions); priv->el = 90.0 + ((tilt_positions * priv->resolution_tp) / 3600); + *el = priv->el; } else { return_value = -RIG_EPROTO; } - *az = priv->az; - *el = priv->el; - return return_value; } - static int flir_stop(ROT *rot) { int return_value = RIG_OK; - char return_str[MAXBUF]; struct flir_priv_data *priv = (struct flir_priv_data *) rot->state.priv; @@ -431,7 +314,6 @@ static int flir_stop(ROT *rot) return return_value; } - static int flir_park(ROT *rot) { rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); @@ -448,7 +330,7 @@ static int flir_reset(ROT *rot, rot_reset_t reset) rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); if (reset != 0) { - return_value = flir_request(rot, "r\n", NULL, NULL); + return_value = flir_request(rot, "r\n", NULL, 0); // After Reset: Disable Hard Limits if(return_value == RIG_OK) { @@ -490,490 +372,93 @@ static int flir_move(ROT *rot, int direction, int speed) static const char *flir_get_info(ROT *rot) { - const char* firmware_str[120]; - const char* info_str[120]; - const char* return_str[256]; + char firmware_str[120]; + char info_str[120]; + struct flir_priv_data *priv = (struct flir_priv_data *) + rot->state.priv; - sprintf(return_str, "No Info"); + sprintf(priv->info, "No Info"); rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); if(flir_request(rot, "V\n", firmware_str, 120) == RIG_OK && flir_request(rot, "O\n", info_str, 120) == RIG_OK) { - sprintf(return_str, "Firmware: %s Info: %s", firmware_str, info_str); + sprintf(priv->info, "Firmware: %s Info: %s", firmware_str, info_str); } //rig_debug(RIG_DEBUG_VERBOSE, "Return String: %s", return_str); - return *return_str; + return priv->info; } -// static int flir_set_func(ROT *rot, setting_t func, int status) -// { -// struct flir_priv_data *priv = (struct flir_priv_data *) -// rot->state.priv; - -// rig_debug(RIG_DEBUG_VERBOSE, "%s called: %s %d\n", __func__, -// rot_strfunc(func), status); - -// if (status) -// { -// priv->funcs |= func; -// } -// else -// { -// priv->funcs &= ~func; -// } - -// return RIG_OK; -// } - - -// static int flir_get_func(ROT *rot, setting_t func, int *status) -// { -// struct flir_priv_data *priv = (struct flir_priv_data *) -// rot->state.priv; - -// *status = (priv->funcs & func) ? 1 : 0; - -// rig_debug(RIG_DEBUG_VERBOSE, "%s called: %s\n", __func__, -// rot_strfunc(func)); - -// return RIG_OK; -// } - - -// static int flir_set_level(ROT *rot, setting_t level, value_t val) -// { -// struct flir_priv_data *priv = (struct flir_priv_data *) -// rot->state.priv; -// int idx; -// char lstr[32]; - -// idx = rig_setting2idx(level); - -// if (idx >= RIG_SETTING_MAX) -// { -// return -RIG_EINVAL; -// } - -// priv->levels[idx] = val; - -// if (ROT_LEVEL_IS_FLOAT(level)) -// { -// SNPRINTF(lstr, sizeof(lstr), "%f", val.f); -// } -// else -// { -// SNPRINTF(lstr, sizeof(lstr), "%d", val.i); -// } - -// rig_debug(RIG_DEBUG_VERBOSE, "%s called: %s %s\n", __func__, -// rot_strlevel(level), lstr); - -// return RIG_OK; -// } - - -// static int flir_get_level(ROT *rot, setting_t level, value_t *val) -// { -// struct flir_priv_data *priv = (struct flir_priv_data *) -// rot->state.priv; -// int idx; - -// idx = rig_setting2idx(level); - -// if (idx >= RIG_SETTING_MAX) -// { -// return -RIG_EINVAL; -// } - -// *val = priv->levels[idx]; - -// rig_debug(RIG_DEBUG_VERBOSE, "%s called: %s\n", __func__, -// rot_strlevel(level)); - -// return RIG_OK; -// } - -// static int flir_set_ext_level(ROT *rot, token_t token, value_t val) -// { -// struct flir_priv_data *priv = (struct flir_priv_data *) -// rot->state.priv; -// char lstr[64]; -// const struct confparams *cfp; -// struct ext_list *elp; - -// cfp = rot_ext_lookup_tok(rot, token); - -// if (!cfp) -// { -// return -RIG_EINVAL; -// } - -// switch (token) -// { -// case TOK_EL_ROT_MAGICLEVEL: -// case TOK_EL_ROT_MAGICFUNC: -// case TOK_EL_ROT_MAGICOP: -// case TOK_EL_ROT_MAGICCOMBO: -// break; - -// default: -// return -RIG_EINVAL; -// } - -// switch (cfp->type) -// { -// case RIG_CONF_STRING: -// strcpy(lstr, val.s); -// break; - -// case RIG_CONF_COMBO: -// SNPRINTF(lstr, sizeof(lstr), "%d", val.i); -// break; - -// case RIG_CONF_NUMERIC: -// SNPRINTF(lstr, sizeof(lstr), "%f", val.f); -// break; - -// case RIG_CONF_CHECKBUTTON: -// SNPRINTF(lstr, sizeof(lstr), "%s", val.i ? "ON" : "OFF"); -// break; - -// case RIG_CONF_BUTTON: -// lstr[0] = '\0'; -// break; - -// default: -// return -RIG_EINTERNAL; -// } - -// elp = find_ext(priv->ext_levels, token); - -// if (!elp) -// { -// return -RIG_EINTERNAL; -// } - -// /* store value */ -// elp->val = val; - -// rig_debug(RIG_DEBUG_VERBOSE, "%s called: %s %s\n", __func__, -// cfp->name, lstr); - -// return RIG_OK; -// } - -// static int flir_get_ext_level(ROT *rot, token_t token, value_t *val) -// { -// struct flir_priv_data *priv = (struct flir_priv_data *) -// rot->state.priv; -// const struct confparams *cfp; -// struct ext_list *elp; - -// cfp = rot_ext_lookup_tok(rot, token); - -// if (!cfp) -// { -// return -RIG_EINVAL; -// } - -// switch (token) -// { -// case TOK_EL_ROT_MAGICLEVEL: -// case TOK_EL_ROT_MAGICFUNC: -// case TOK_EL_ROT_MAGICOP: -// case TOK_EL_ROT_MAGICCOMBO: -// break; - -// default: -// return -RIG_EINVAL; -// } - -// elp = find_ext(priv->ext_levels, token); - -// if (!elp) -// { -// return -RIG_EINTERNAL; -// } - -// /* load value */ -// *val = elp->val; - -// rig_debug(RIG_DEBUG_VERBOSE, "%s called: %s\n", __func__, -// cfp->name); - -// return RIG_OK; -// } - - -// static int flir_set_ext_func(ROT *rot, token_t token, int status) -// { -// struct flir_priv_data *priv = (struct flir_priv_data *) -// rot->state.priv; -// const struct confparams *cfp; -// struct ext_list *elp; - -// cfp = rot_ext_lookup_tok(rot, token); - -// if (!cfp) -// { -// return -RIG_EINVAL; -// } - -// switch (token) -// { -// case TOK_EL_ROT_MAGICEXTFUNC: -// break; - -// default: -// return -RIG_EINVAL; -// } - -// switch (cfp->type) -// { -// case RIG_CONF_CHECKBUTTON: -// break; - -// case RIG_CONF_BUTTON: -// break; - -// default: -// return -RIG_EINTERNAL; -// } - -// elp = find_ext(priv->ext_funcs, token); - -// if (!elp) -// { -// return -RIG_EINTERNAL; -// } - -// /* store value */ -// elp->val.i = status; - -// rig_debug(RIG_DEBUG_VERBOSE, "%s called: %s %d\n", __func__, -// cfp->name, status); - -// return RIG_OK; -// } - - -// static int flir_get_ext_func(ROT *rot, token_t token, int *status) -// { -// struct flir_priv_data *priv = (struct flir_priv_data *) -// rot->state.priv; -// const struct confparams *cfp; -// struct ext_list *elp; - -// cfp = rot_ext_lookup_tok(rot, token); - -// if (!cfp) -// { -// return -RIG_EINVAL; -// } - -// switch (token) -// { -// case TOK_EL_ROT_MAGICEXTFUNC: -// break; - -// default: -// return -RIG_EINVAL; -// } - -// elp = find_ext(priv->ext_funcs, token); - -// if (!elp) -// { -// return -RIG_EINTERNAL; -// } - -// /* load value */ -// *status = elp->val.i; - -// rig_debug(RIG_DEBUG_VERBOSE, "%s called: %s\n", __func__, -// cfp->name); - -// return RIG_OK; -// } - - -// static int flir_set_parm(ROT *rot, setting_t parm, value_t val) -// { -// struct flir_priv_data *priv = (struct flir_priv_data *) -// rot->state.priv; -// int idx; -// char pstr[32]; - -// idx = rig_setting2idx(parm); - -// if (idx >= RIG_SETTING_MAX) -// { -// return -RIG_EINVAL; -// } - -// if (ROT_PARM_IS_FLOAT(parm)) -// { -// SNPRINTF(pstr, sizeof(pstr), "%f", val.f); -// } -// else -// { -// SNPRINTF(pstr, sizeof(pstr), "%d", val.i); -// } - -// rig_debug(RIG_DEBUG_VERBOSE, "%s called: %s %s\n", __func__, -// rig_strparm(parm), pstr); - -// priv->parms[idx] = val; - -// return RIG_OK; -// } - - -// static int flir_get_parm(ROT *rot, setting_t parm, value_t *val) -// { -// struct flir_priv_data *priv = (struct flir_priv_data *) -// rot->state.priv; -// int idx; - -// idx = rig_setting2idx(parm); - -// if (idx >= RIG_SETTING_MAX) -// { -// return -RIG_EINVAL; -// } - -// *val = priv->parms[idx]; - -// rig_debug(RIG_DEBUG_VERBOSE, "%s called %s\n", __func__, -// rig_strparm(parm)); - -// return RIG_OK; -// } - -// static int flir_set_ext_parm(ROT *rot, token_t token, value_t val) -// { -// struct flir_priv_data *priv = (struct flir_priv_data *) -// rot->state.priv; -// char lstr[64]; -// const struct confparams *cfp; -// struct ext_list *epp; - -// cfp = rot_ext_lookup_tok(rot, token); - -// if (!cfp) -// { -// return -RIG_EINVAL; -// } - -// switch (token) -// { -// case TOK_EP_ROT_MAGICPARM: -// break; - -// default: -// return -RIG_EINVAL; -// } - -// switch (cfp->type) -// { -// case RIG_CONF_STRING: -// strcpy(lstr, val.s); -// break; - -// case RIG_CONF_COMBO: -// SNPRINTF(lstr, sizeof(lstr), "%d", val.i); -// break; - -// case RIG_CONF_NUMERIC: -// SNPRINTF(lstr, sizeof(lstr), "%f", val.f); -// break; - -// case RIG_CONF_CHECKBUTTON: -// SNPRINTF(lstr, sizeof(lstr), "%s", val.i ? "ON" : "OFF"); -// break; - -// case RIG_CONF_BUTTON: -// lstr[0] = '\0'; -// break; - -// default: -// return -RIG_EINTERNAL; -// } - -// epp = find_ext(priv->ext_parms, token); - -// if (!epp) -// { -// return -RIG_EINTERNAL; -// } - -// /* store value */ -// epp->val = val; - -// rig_debug(RIG_DEBUG_VERBOSE, "%s called: %s %s\n", __func__, -// cfp->name, lstr); - -// return RIG_OK; -// } +static int flir_set_func(ROT *rot, setting_t func, int status) +{ + return -RIG_ENIMPL; +} -// static int flir_get_ext_parm(ROT *rot, token_t token, value_t *val) -// { -// struct flir_priv_data *priv = (struct flir_priv_data *) -// rot->state.priv; -// const struct confparams *cfp; -// struct ext_list *epp; +static int flir_get_func(ROT *rot, setting_t func, int *status) +{ + return -RIG_ENIMPL; +} -// cfp = rot_ext_lookup_tok(rot, token); +static int flir_set_level(ROT *rot, setting_t level, value_t val) +{ + return -RIG_ENIMPL; +} -// if (!cfp) -// { -// return -RIG_EINVAL; -// } +static int flir_get_level(ROT *rot, setting_t level, value_t *val) +{ + return -RIG_ENIMPL; +} -// switch (token) -// { -// case TOK_EP_ROT_MAGICPARM: -// break; +static int flir_set_ext_level(ROT *rot, token_t token, value_t val) +{ + return -RIG_ENIMPL; +} -// default: -// return -RIG_EINVAL; -// } +static int flir_get_ext_level(ROT *rot, token_t token, value_t *val) +{ + return -RIG_ENIMPL; +} -// epp = find_ext(priv->ext_parms, token); +static int flir_set_ext_func(ROT *rot, token_t token, int status) +{ + return -RIG_ENIMPL; +} -// if (!epp) -// { -// return -RIG_EINTERNAL; -// } +static int flir_get_ext_func(ROT *rot, token_t token, int *status) +{ + return -RIG_ENIMPL; +} -// /* load value */ -// *val = epp->val; +static int flir_set_parm(ROT *rot, setting_t parm, value_t val) +{ + return -RIG_ENIMPL; +} -// rig_debug(RIG_DEBUG_VERBOSE, "%s called: %s\n", __func__, -// cfp->name); +static int flir_get_parm(ROT *rot, setting_t parm, value_t *val) +{ + return -RIG_ENIMPL; +} -// return RIG_OK; -// } +static int flir_set_ext_parm(ROT *rot, token_t token, value_t val) +{ + return -RIG_ENIMPL; +} +static int flir_get_ext_parm(ROT *rot, token_t token, value_t *val) +{ + return -RIG_ENIMPL; +} static int flir_get_status(ROT *rot, rot_status_t *status) { struct flir_priv_data *priv = (struct flir_priv_data *) rot->state.priv; - - // if (simulating) - // { - // flir_simulate_rotation(rot); - // } - *status = priv->status; return RIG_OK; } - /* * flir rotator capabilities. */ @@ -1003,23 +488,16 @@ struct rot_caps flir_caps = .min_el = 0., .max_el = 90., - - .priv = NULL, /* priv */ - // .has_get_func = FLIR_FUNC, - // .has_set_func = FLIR_FUNC, - // .has_get_level = FLIR_LEVEL, - // .has_set_level = ROT_LEVEL_SET(FLIR_LEVEL), - // .has_get_parm = FLIR_PARM, - // .has_set_parm = ROT_PARM_SET(FLIR_PARM), - - // .level_gran = { [ROT_LVL_SPEED] = { .min = { .i = 1 }, .max = { .i = 4 }, .step = { .i = 1 } } }, + .has_get_func = FLIR_FUNC, + .has_set_func = FLIR_FUNC, + .has_get_level = FLIR_LEVEL, + .has_set_level = ROT_LEVEL_SET(FLIR_LEVEL), + .has_get_parm = FLIR_PARM, + .has_set_parm = ROT_PARM_SET(FLIR_PARM), - // .extlevels = flir_ext_levels, - // .extfuncs = flir_ext_funcs, - // .extparms = flir_ext_parms, - // .cfgparams = flir_cfg_params, + .level_gran = { [ROT_LVL_SPEED] = { .min = { .i = 1 }, .max = { .i = 4 }, .step = { .i = 1 } } }, .has_status = FLIR_STATUS, @@ -1028,8 +506,8 @@ struct rot_caps flir_caps = .rot_open = flir_open, .rot_close = flir_close, - // .set_conf = flir_set_conf, - // .get_conf = flir_get_conf, + .set_conf = flir_set_conf, + .get_conf = flir_get_conf, .set_position = flir_set_position, .get_position = flir_get_position, @@ -1038,19 +516,19 @@ struct rot_caps flir_caps = .reset = flir_reset, .move = flir_move, - // .set_func = flir_set_func, - // .get_func = flir_get_func, - // .set_level = flir_set_level, - // .get_level = flir_get_level, - // .set_parm = flir_set_parm, - // .get_parm = flir_get_parm, - - // .set_ext_func = flir_set_ext_func, - // .get_ext_func = flir_get_ext_func, - // .set_ext_level = flir_set_ext_level, - // .get_ext_level = flir_get_ext_level, - // .set_ext_parm = flir_set_ext_parm, - // .get_ext_parm = flir_get_ext_parm, + .set_func = flir_set_func, + .get_func = flir_get_func, + .set_level = flir_set_level, + .get_level = flir_get_level, + .set_parm = flir_set_parm, + .get_parm = flir_get_parm, + + .set_ext_func = flir_set_ext_func, + .get_ext_func = flir_get_ext_func, + .set_ext_level = flir_set_ext_level, + .get_ext_level = flir_get_ext_level, + .set_ext_parm = flir_set_ext_parm, + .get_ext_parm = flir_get_ext_parm, .get_info = flir_get_info, .get_status = flir_get_status, commit 0bdb6827dabab3321fb10d835810c180f77fde99 Author: andz <an...@an...> Date: Wed Nov 30 12:20:25 2022 +0100 Implemented FLIR basic funktions: * flir_init * flir_cleanup * flir_open * flir_close * flir_set_position * flir_get_position * flir_park * flir_stop * flir_reset * flir_move diff --git a/rotators/flir/flir.c b/rotators/flir/flir.c index 04f648af..0e1b839c 100644 --- a/rotators/flir/flir.c +++ b/rotators/flir/flir.c @@ -1,6 +1,6 @@ /* - * Hamlib Dummy backend - main file - * Copyright (c) 2001-2009 by Stephane Fillod + * Hamlib FLIR PTU rotor backend - main file + * Copyright (c) 2022 by Andreas Mueller (DC1MIL) * * * This library is free software; you can redistribute it and/or @@ -27,7 +27,6 @@ #include <sys/time.h> #include "hamlib/rotator.h" -//#include "dummy_common.h" #include "register.h" #include "idx_builtin.h" @@ -41,7 +40,7 @@ ROT_STATUS_MOVING_EL | ROT_STATUS_MOVING_UP | ROT_STATUS_MOVING_DOWN | \ ROT_STATUS_LIMIT_UP | ROT_STATUS_LIMIT_DOWN | ROT_STATUS_LIMIT_LEFT | ROT_STATUS_LIMIT_RIGHT) -static int simulating = 0; // do we need rotator emulation for debug? +//static int simulating = 0; // do we need rotator emulation for debug? struct flir_priv_data { @@ -62,57 +61,110 @@ struct flir_priv_data struct ext_list *ext_parms; char *magic_conf; -}; -static const struct confparams flir_ext_levels[] = -{ - { - TOK_EL_ROT_MAGICLEVEL, "MGL", "Magic level", "Magic level, as an example", - NULL, RIG_CONF_NUMERIC, { .n = { 0, 1, .001 } } - }, - { - TOK_EL_ROT_MAGICFUNC, "MGF", "Magic func", "Magic function, as an example", - NULL, RIG_CONF_CHECKBUTTON - }, - { - TOK_EL_ROT_MAGICOP, "MGO", "Magic Op", "Magic Op, as an example", - NULL, RIG_CONF_BUTTON - }, - { - TOK_EL_ROT_MAGICCOMBO, "MGC", "Magic combo", "Magic combo, as an example", - "VALUE1", RIG_CONF_COMBO, { .c = { .combostr = { "VALUE1", "VALUE2", "NONE", NULL } } } - }, - { RIG_CONF_END, NULL, } -}; - -static const struct confparams flir_ext_funcs[] = -{ - { - TOK_EL_ROT_MAGICEXTFUNC, "MGEF", "Magic ext func", "Magic ext function, as an example", - NULL, RIG_CONF_CHECKBUTTON - }, - { RIG_CONF_END, NULL, } + float_t resolution_pp; + float_t resolution_tp; }; -static const struct confparams flir_ext_parms[] = -{ - { - TOK_EP_ROT_MAGICPARM, "MGP", "Magic parm", "Magic parameter, as an example", - NULL, RIG_CONF_NUMERIC, { .n = { 0, 1, .001 } } - }, - { RIG_CONF_END, NULL, } -}; +// static const struct confparams flir_ext_levels[] = +// { +// { +// TOK_EL_ROT_MAGICLEVEL, "MGL", "Magic level", "Magic level, as an example", +// NULL, RIG_CONF_NUMERIC, { .n = { 0, 1, .001 } } +// }, +// { +// TOK_EL_ROT_MAGICFUNC, "MGF", "Magic func", "Magic function, as an example", +// NULL, RIG_CONF_CHECKBUTTON +// }, +// { +// TOK_EL_ROT_MAGICOP, "MGO", "Magic Op", "Magic Op, as an example", +// NULL, RIG_CONF_BUTTON +// }, +// { +// TOK_EL_ROT_MAGICCOMBO, "MGC", "Magic combo", "Magic combo, as an example", +// "VALUE1", RIG_CONF_COMBO, { .c = { .combostr = { "VALUE1", "VALUE2", "NONE", NULL } } } +// }, +// { RIG_CONF_END, NULL, } +// }; + +// static const struct confparams flir_ext_funcs[] = +// { +// { +// TOK_EL_ROT_MAGICEXTFUNC, "MGEF", "Magic ext func", "Magic ext function, as an example", +// NULL, RIG_CONF_CHECKBUTTON +// }, +// { RIG_CONF_END, NULL, } +// }; + +// static const struct confparams flir_ext_parms[] = +// { +// { +// TOK_EP_ROT_MAGICPARM, "MGP", "Magic parm", "Magic parameter, as an example", +// NULL, RIG_CONF_NUMERIC, { .n = { 0, 1, .001 } } +// }, +// { RIG_CONF_END, NULL, } +// }; /* cfgparams are configuration item generally used by the backend's open() method */ -static const struct confparams flir_cfg_params[] = +// static const struct confparams flir_cfg_params[] = +// { +// { +// TOK_CFG_ROT_MAGICCONF, "mcfg", "Magic conf", "Magic parameter, as an example", +// "ROTATOR", RIG_CONF_STRING, { } +// }, +// { RIG_CONF_END, NULL, } +// }; + +static int flir_request(ROT *rot, char *request, char *response, + uint32_t *resp_size) { - { - TOK_CFG_ROT_MAGICCONF, "mcfg", "Magic conf", "Magic parameter, as an example", - "ROTATOR", RIG_CONF_STRING, { } - }, - { RIG_CONF_END, NULL, } -}; + int return_value = -RIG_EINVAL; + int retry_read = 0; + unsigned char cmd_ok; + + rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); + + rig_flush(&rot->state.rotport); + if (request) + { + return_value = write_block(&rot->state.rotport, (unsigned char *) request, + strlen(request)); + if (return_value != RIG_OK) + { + return return_value; + } + } + //Is a direct request expected? + if (response != NULL) + { + while(retry_read < rot->state.rotport.retry) + { + memset(response, 0, resp_size); + resp_size = read_string(&rot->state.rotport, response, resp_size, + "\r\n", sizeof("\r\n"), 0, 1); + if(resp_size > 0) + { + if(response[0] == '*') + { + rig_debug(RIG_DEBUG_VERBOSE, "accepted command %s\n", request); + return RIG_OK; + } + else + { + rig_debug(RIG_DEBUG_VERBOSE, "NOT accepted command %s\n", request); + return -RIG_ERJCTED; + } + + } + retry_read++; + } + rig_debug(RIG_DEBUG_VERBOSE, "timeout for command %s\n", request); + return -RIG_ETIMEOUT; + } + + return return_value; +}; static int flir_init(ROT *rot) { @@ -130,28 +182,29 @@ static int flir_init(ROT *rot) priv = rot->state.priv; - priv->ext_funcs = alloc_init_ext(flir_ext_funcs); + // priv->ext_funcs = alloc_init_ext(flir_ext_funcs); - if (!priv->ext_funcs) - { - return -RIG_ENOMEM; - } + // if (!priv->ext_funcs) + // { + // return -RIG_ENOMEM; + // } - priv->ext_levels = alloc_init_ext(flir_ext_levels); + // priv->ext_levels = alloc_init_ext(flir_ext_levels); - if (!priv->ext_levels) - { - return -RIG_ENOMEM; - } + // if (!priv->ext_levels) + // { + // return -RIG_ENOMEM; + // } - priv->ext_parms = alloc_init_ext(flir_ext_parms); + // priv->ext_parms = alloc_init_ext(flir_ext_parms); - if (!priv->ext_parms) - { - return -RIG_ENOMEM; - } + // if (!priv->ext_parms) + // { + // return -RIG_ENOMEM; + // } - rot->state.rotport.type.rig = RIG_PORT_NONE; + //rot->state.rotport.type.rig = RIG_PORT_SERIAL; + //flir_request(rot, "r\n", sizeof("r\n"), NULL, NULL); priv->az = priv->el = 0; @@ -159,6 +212,9 @@ static int flir_init(ROT *rot) priv->magic_conf = strdup("ROTATOR"); + priv->resolution_pp = 92.5714; + priv->resolution_tp = 46.2857; + return RIG_OK; } @@ -186,16 +242,45 @@ static int flir_cleanup(ROT *rot) static int flir_open(ROT *rot) { + struct flir_priv_data *priv; + char return_str[MAXBUF]; + float_t resolution_pp, resolution_tp; + int return_value = RIG_OK; + rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); - if (rot->caps->rot_model == ROT_MODEL_FLIR) + priv = rot->state.priv; + + // Disable ECHO + return_value = flir_request(rot, "ED\n", NULL, MAXBUF); + + // Disable Verbose Mode + return_value = flir_request(rot, "FT\n", return_str, MAXBUF); + + // Get PAN resolution in arcsecs + if(flir_request(rot, "PR\n", return_str, MAXBUF) == RIG_OK) + { + sscanf(return_str, "* %f", &resolution_pp); + rig_debug(RIG_DEBUG_VERBOSE, "PAN resolution: %f arcsecs per position\n", resolution_pp); + priv->resolution_pp = resolution_pp; + } + else + { + return_value = -RIG_EPROTO; + } + // Get TILT resolution in arcsecs + if(flir_request(rot, "TR\n", return_str, MAXBUF) == RIG_OK) { - simulating = 1; - rig_debug(RIG_DEBUG_VERBOSE, "%s: flir rotator so simulating speed\n", - __func__); + sscanf(return_str, "* %f", &resolution_tp); + rig_debug(RIG_DEBUG_VERBOSE, "TILT resolution: %f arcsecs per position\n", resolution_tp); + priv->resolution_tp = resolution_tp; + } + else + { + return_value = -RIG_EPROTO; } - return RIG_OK; + return return_value; } static int flir_close(ROT *rot) @@ -205,185 +290,128 @@ static int flir_close(ROT *rot) return RIG_OK; } -static int flir_set_conf(ROT *rot, token_t token, const char *val) -{ - struct flir_priv_data *priv; +// static int flir_set_conf(ROT *rot, token_t token, const char *val) +// { +// struct flir_priv_data *priv; - priv = (struct flir_priv_data *)rot->state.priv; +// priv = (struct flir_priv_data *)rot->state.priv; - switch (token) - { - case TOK_CFG_ROT_MAGICCONF: - if (val) - { - free(priv->magic_conf); - priv->magic_conf = strdup(val); - } +// switch (token) +// { +// case TOK_CFG_ROT_MAGICCONF: +// if (val) +// { +// free(priv->magic_conf); +// priv->magic_conf = strdup(val); +// } - break; +// break; - default: - return -RIG_EINVAL; - } +// default: +// return -RIG_EINVAL; +// } - return RIG_OK; -} +// return RIG_OK; +// } -static int flir_get_conf2(ROT *rot, token_t token, char *val, int val_len) -{ - struct flir_priv_data *priv; +// static int flir_get_conf2(ROT *rot, token_t token, char *val, int val_len) +// { +// struct flir_priv_data *priv; - priv = (struct flir_priv_data *)rot->state.priv; +// priv = (struct flir_priv_data *)rot->state.priv; - switch (token) - { - case TOK_CFG_ROT_MAGICCONF: - SNPRINTF(val, val_len, "%s", priv->magic_conf); - break; +// switch (token) +// { +// case TOK_CFG_ROT_MAGICCONF: +// SNPRINTF(val, val_len, "%s", priv->magic_conf); +// break; - default: - return -RIG_EINVAL; - } +// default: +// return -RIG_EINVAL; +// } - return RIG_OK; -} +// return RIG_OK; +// } -static int flir_get_conf(ROT *rot, token_t token, char *val) -{ - return flir_get_conf2(rot, token, val, 128); -} +// static int flir_get_conf(ROT *rot, token_t token, char *val) +// { +// return flir_get_conf2(rot, token, val, 128); +// } static int flir_set_position(ROT *rot, azimuth_t az, elevation_t el) { + int32_t t_pan_positions, t_tilt_positions; + char return_str[MAXBUF]; + char cmd_str[MAXBUF]; struct flir_priv_data *priv = (struct flir_priv_data *) rot->state.priv; rig_debug(RIG_DEBUG_VERBOSE, "%s called: %.2f %.2f\n", __func__, az, el); - if (simulating) - { - priv->target_az = az; - priv->target_el = el; - gettimeofday(&priv->tv, NULL); - } - else - { - priv->az = priv->target_az = az; - priv->el = priv->target_az = el; - } + priv->target_az = az; + priv->target_el = el; + t_pan_positions = (az * 3600) / priv->resolution_pp; + t_tilt_positions = - ((90.0 - el) * 3600) / priv->resolution_tp; - return RIG_OK; + sprintf(cmd_str, "PP%d TP%d\n", t_pan_positions, t_tilt_positions); + + return flir_request(rot, cmd_str, return_str, MAXBUF); } -static void flir_simulate_rotation(ROT *rot) +/* + * Get position of rotor + */ +static int flir_get_position(ROT *rot, azimuth_t *az, elevation_t *el) { + int return_value = RIG_OK; + char return_str[MAXBUF]; + int32_t pan_positions, tilt_positions; + struct flir_priv_data *priv = (struct flir_priv_data *) rot->state.priv; - struct timeval tv; - unsigned elapsed; /* ms */ - - gettimeofday(&tv, NULL); - elapsed = (tv.tv_sec - priv->tv.tv_sec) * 1000 + - (tv.tv_usec - priv->tv.tv_usec) / 1000; + rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); - /* - * Simulate rotation speed of 360 deg per minute - */ -#define DEG_PER_MS (360./60/1000) - if (fabs(priv->target_az - priv->az) / DEG_PER_MS <= elapsed) + if(flir_request(rot, "PP\n", return_str, MAXBUF) == RIG_OK) { - /* target reached */ - priv->az = priv->target_az; - priv->status &= ~(ROT_STATUS_MOVING_AZ | ROT_STATUS_MOVING_LEFT | - ROT_STATUS_MOVING_RIGHT); + rig_debug(RIG_DEBUG_VERBOSE, "PP Return String: %s\n", return_str); + sscanf(return_str, "* %d", &pan_positions); + priv->az = (pan_positions * priv->resolution_pp) / 3600; } else { - if (priv->az < priv->target_az) - { - priv->az += (azimuth_t)elapsed * DEG_PER_MS; - priv->status |= ROT_STATUS_MOVING_AZ | ROT_STATUS_MOVING_RIGHT; - } - else - { - priv->az -= (azimuth_t)elapsed * DEG_PER_MS; - priv->status |= ROT_STATUS_MOVING_AZ | ROT_STATUS_MOVING_LEFT; - } + return_value = -RIG_EPROTO; } - - if (fabs(priv->target_el - pr... [truncated message content] |