From 5989eebc0d7dba198273b57fdeac4fac145121a1 Mon Sep 17 00:00:00 2001 From: "Nate Bargmann, N0NB" Date: Thu, 11 Sep 2003 01:04:14 +0000 Subject: [PATCH] 2003-09-10 Updated: locator.c -- fixed "zero bug" in dec2dms() and dms2dec() rotator.h -- changed dec2dms() and dms2dec() parameter, degrees to float and minutes to double testloc.c -- modified to support changed parameters git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@1534 7ae35d74-ebe9-4afe-98af-79ac388436b8 --- include/hamlib/rotator.h | 8 ++++---- src/locator.c | 37 +++++++++++++++++++++---------------- tests/testloc.c | 14 +++++++------- 3 files changed, 32 insertions(+), 27 deletions(-) diff --git a/include/hamlib/rotator.h b/include/hamlib/rotator.h index 62b0185ff..0b23dc8db 100644 --- a/include/hamlib/rotator.h +++ b/include/hamlib/rotator.h @@ -2,7 +2,7 @@ * Hamlib Interface - Rotator API header * Copyright (c) 2000-2003 by Stephane Fillod * - * $Id: rotator.h,v 1.8 2003-08-21 20:22:06 n0nb Exp $ + * $Id: rotator.h,v 1.9 2003-09-11 01:04:14 n0nb Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -339,10 +339,10 @@ extern HAMLIB_EXPORT(int) longlat2locator HAMLIB_PARAMS((double longitude, extern HAMLIB_EXPORT(int) locator2longlat HAMLIB_PARAMS((double *longitude, double *latitude, const char *locator)); -extern HAMLIB_EXPORT(double) dms2dec HAMLIB_PARAMS((int degs, int minutes, +extern HAMLIB_EXPORT(double) dms2dec HAMLIB_PARAMS((float degrees, double minutes, double seconds)); -extern HAMLIB_EXPORT(void) dec2dms HAMLIB_PARAMS((double dec, int *degrees, - int *minutes, double *seconds)); +extern HAMLIB_EXPORT(void) dec2dms HAMLIB_PARAMS((double dec, float *degrees, + double *minutes, double *seconds)); /*! \def rot_debug diff --git a/src/locator.c b/src/locator.c index 1fbb24159..b6e22ef8a 100644 --- a/src/locator.c +++ b/src/locator.c @@ -14,7 +14,7 @@ * Copyright (c) 2003 by Nate Bargmann * Copyright (c) 2003 by Dave Hines * - * $Id: locator.c,v 1.9 2003-08-21 20:22:06 n0nb Exp $ + * $Id: locator.c,v 1.10 2003-09-11 01:04:14 n0nb Exp $ * * Code to determine bearing and range was taken from the Great Circle, * by S. R. Sampson, N5OWK. @@ -116,11 +116,14 @@ const static int loc_char_range[] = { 18, 10, 24, 10, 25, 10 }; * * \sa dec2dms() */ -double dms2dec(int degrees, int minutes, double seconds) { - if (degrees >= 0) - return (double)degrees + (double)minutes/60. + seconds/3600.; - else - return (double)degrees - (double)minutes/60. - seconds/3600.; + +double dms2dec(float degrees, double minutes, double seconds) { + double s, st; + + s = copysign(1.0, (double)degrees); + st = fabs((double)degrees); + + return copysign((st + minutes / 60. + seconds / 3600.), s); } /** @@ -135,14 +138,16 @@ double dms2dec(int degrees, int minutes, double seconds) { * When passed a value < -180 or > 180, the sign will be reversed * and the value constrained to => -180 and <= 180 before conversion. * - * Upon return dec2dms guarantees -180<=degrees<180, - * 0<=minutes<60, and 0<=seconds<60. + * Upon return dec2dms guarantees -180 <= degrees < 180, + * 0 <= minutes < 60, and 0 <= seconds < 60. * * \sa dms2dec() */ -void dec2dms(double dec, int *degrees, int *minutes, double *seconds) { - int deg, min, is_neg = 0; - double st; + +void dec2dms(double dec, float *degrees, double *minutes, double *seconds) { + int is_neg = 0; + float deg; + double st, min; if (!degrees || !minutes || !seconds) return; @@ -175,13 +180,13 @@ void dec2dms(double dec, int *degrees, int *minutes, double *seconds) { */ st = fabs(st); - deg = (int)floor(st); - st = 60. * (st-(double)deg); - min = (int)floor(st); - st = 60. * (st-(double)min); + deg = (float)floor(st); + st = 60. * (st - (double)deg); + min = floor(st); + st = 60. * (st - min); /* set *degrees to original sign passed to dec */ - (is_neg == 1) ? (*degrees = deg * -1) : (*degrees = deg); + (is_neg == 1) ? (*degrees = -deg) : (*degrees = deg); *minutes = min; *seconds = st; diff --git a/tests/testloc.c b/tests/testloc.c index f7b18c411..cea6cc3bf 100644 --- a/tests/testloc.c +++ b/tests/testloc.c @@ -15,8 +15,8 @@ int main (int argc, char *argv[]) { char recodedloc[13], *loc1, *loc2; double lon1 = 0, lat1, lon2, lat2; - double distance, az, sec; - int deg, min; + double distance, az, min, sec; + float deg; int retcode, locator_length; if (argc < 3) { @@ -36,12 +36,12 @@ int main (int argc, char *argv[]) { } dec2dms(lon1, °, &min, &sec); - printf(" Longitude: %f, %d° %d' %.2f\"\n", lon1, deg, min, sec); + printf(" Longitude: %f, %.0f° %.0f' %.2f\"\n", lon1, deg, min, sec); lon1 = dms2dec(deg, min, sec); printf(" Recoded lon: %f\n", lon1); dec2dms(lat1, °, &min, &sec); - printf(" Latitude: %f, %d° %d' %.2f\"\n", lat1, deg, min, sec); + printf(" Latitude: %f, %.0f° %.0f' %.2f\"\n", lat1, deg, min, sec); lat1 = dms2dec(deg, min, sec); printf(" Recoded lat: %f\n", lat1); @@ -63,12 +63,12 @@ int main (int argc, char *argv[]) { } dec2dms(lon2, °, &min, &sec); - printf(" Longitude: %f, %d° %d' %.2f\"\n", lon2, deg, min, sec); + printf(" Longitude: %f, %.0f° %.0f' %.2f\"\n", lon2, deg, min, sec); lon2 = dms2dec(deg, min, sec); printf(" Recoded lon: %f\n", lon2); dec2dms(lat2, °, &min, &sec); - printf(" Latitude: %f, %d° %d' %.2f\"\n", lat2, deg, min, sec); + printf(" Latitude: %f, %.0f° %.0f' %.2f\"\n", lat2, deg, min, sec); lat2 = dms2dec(deg, min, sec); printf(" Recoded lat: %f\n", lat2); @@ -86,7 +86,7 @@ int main (int argc, char *argv[]) { } dec2dms(az, °, &min, &sec); printf("\nDistance: %.2fkm\n", distance); - printf("Bearing: %f, %d° %d' %.2f\"\n", az, deg, min, sec); + printf("Bearing: %f, %.0f° %.0f' %.2f\"\n", az, deg, min, sec); exit(0); }