Change gs232b parsing to mandate at least AZ= and make EL= optional

This covers the 12PR1A rotor which claims gs232b compatibility
The 12PR1A also claims gs232a compability which is wrong as the AZ= EL= format is gs232b
https://github.com/Hamlib/Hamlib/issues/309
Simplify gs232a parsing but mandate both arguments in +0xxx+0xxx format
pull/314/head
Michael Black W9MDB 2020-06-17 07:22:11 -05:00
rodzic 7dedf007a1
commit 786c1ae925
2 zmienionych plików z 20 dodań i 23 usunięć

Wyświetl plik

@ -180,33 +180,27 @@ static int
gs232a_rot_get_position(ROT *rot, azimuth_t *az, elevation_t *el)
{
char posbuf[32];
int retval, angle;
int retval, int_az, int_el = 0;
rig_debug(RIG_DEBUG_TRACE, "%s called\n", __func__);
retval = gs232a_transaction(rot, "C2" EOM, posbuf, sizeof(posbuf), 0);
if (retval != RIG_OK || strlen(posbuf) < 10)
if (retval != RIG_OK)
{
return retval < 0 ? retval : -RIG_EPROTO;
return retval;
}
/* parse "+0aaa+0eee" */
if (sscanf(posbuf + 2, "%d", &angle) != 1)
// parse "+0aaa+0eee" and expect both arguments
if (sscanf(posbuf, "+0%d+0%d", &int_az, &int_el) != 2)
{
rig_debug(RIG_DEBUG_ERR, "%s: wrong reply '%s'\n", __func__, posbuf);
rig_debug(RIG_DEBUG_ERR, "%s: wrong reply '%s', not +0xxx+0xxx format?\n",
__func__, posbuf);
return -RIG_EPROTO;
}
*az = (azimuth_t)angle;
if (sscanf(posbuf + 7, "%d", &angle) != 1)
{
rig_debug(RIG_DEBUG_ERR, "%s: wrong reply '%s'\n", __func__, posbuf);
return -RIG_EPROTO;
}
*el = (elevation_t)angle;
*az = (azimuth_t) int_az;
*el = (elevation_t) int_el;
rig_debug(RIG_DEBUG_TRACE, "%s: (az, el) = (%.1f, %.1f)\n",
__func__, *az, *el);
@ -298,9 +292,9 @@ const struct rot_caps gs23_rot_caps =
ROT_MODEL(ROT_MODEL_GS23),
.model_name = "GS-23",
.mfg_name = "Yaesu/Kenpro",
.version = "20200505.0",
.version = "20200617.0",
.copyright = "LGPL",
.status = RIG_STATUS_ALPHA,
.status = RIG_STATUS_STABLE,
.rot_type = ROT_TYPE_AZEL,
.port_type = RIG_PORT_SERIAL,
.serial_rate_min = 150,

Wyświetl plik

@ -141,7 +141,8 @@ transaction_write:
#endif
#if 0
https://github.com/Hamlib/Hamlib/issues/272
https://github.com/Hamlib/Hamlib/issues/272
// If asked for we will check for connection
// we don't expect a reply...just a prompt return
// Seems some GS232B's only echo the CR
@ -152,6 +153,7 @@ transaction_write:
__func__, data, cmdstr);
return -RIG_EPROTO;
}
#endif
if (data[0] == '?')
@ -207,7 +209,7 @@ static int
gs232b_rot_get_position(ROT *rot, azimuth_t *az, elevation_t *el)
{
char posbuf[32];
int retval, int_az, int_el;
int retval, int_az = 0, int_el = 0;
rig_debug(RIG_DEBUG_TRACE, "%s called\n", __func__);
@ -223,9 +225,10 @@ gs232b_rot_get_position(ROT *rot, azimuth_t *az, elevation_t *el)
/* With the format string containing a space character as one of the
* directives, any amount of space is matched, including none in the input.
*/
if (sscanf(posbuf, "AZ=%d EL=%d", &int_az, &int_el) != 2)
{
rig_debug(RIG_DEBUG_ERR, "%s: wrong reply '%s'\n", __func__,
// There's a 12PR1A rotor that only returns AZ so we may only get AZ=xxx
if (sscanf(posbuf, "AZ=%d EL=%d", &int_az, &int_el) == 0)
{ // only give error if we didn't parse anything
rig_debug(RIG_DEBUG_ERR, "%s: wrong reply '%s', expected AZ=xxx EL=xxx\n", __func__,
posbuf);
return -RIG_EPROTO;
}
@ -324,7 +327,7 @@ const struct rot_caps gs232b_rot_caps =
ROT_MODEL(ROT_MODEL_GS232B),
.model_name = "GS-232B",
.mfg_name = "Yaesu",
.version = "20200615.0",
.version = "20200617.0",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rot_type = ROT_TYPE_OTHER,