Пример #1
0
/**
 * \brief Convert a decimal angle into D M.MMM notation
 * \param dec          Decimal degrees
 * \param degrees     Pointer for the calculated whole Degrees
 * \param minutes     Pointer for the calculated decimal Minutes
 * \param sw            Pointer for the calculated SW flag
 *
 *  Convert a decimal angle into its degree, decimal minute
 *  notation common on many GPS units.
 *
 *  When passed a value < -180 or > 180, the value will be normalized
 *  within these limits and the sign set apropriately.
 *
 *  Upon return dec2dmmm guarantees 0 >= \a degrees <= 180,
 *  0.0 >= \a minutes < 60.0.
 *
 *  When \a dec is < 0.0 \a sw will be set to 1.  When \a dec is
 *  >= 0.0 \a sw will be set to 0.  This flag allows the application
 *  to determine whether the D M.MMM angle should be treated as negative
 *  (south or west).
 *
 * \retval -RIG_EINVAL if any of the pointers are NULL.
 * \retval RIG_OK if conversion went OK.
 *
 * \sa dmmm2dec()
 */
int dec2dmmm (double dec, int *degrees, double *minutes, int *sw) {
     int r, min;
     double sec;

     /* bail if NULL pointers passed */
     if (!degrees || !minutes || !sw)
          return -RIG_EINVAL;

     r = dec2dms(dec, degrees, &min, &sec, sw);
     if (r != RIG_OK)
          return r;

     *minutes = (double)min + sec / 60;

     return RIG_OK;
}
Пример #2
0
void dec2dmsstring(double dec, char* str) {
	int sign, d, m;
	double s;
	int ss, ds;
	dec2dms(dec, &sign, &d, &m, &s);
	ss = (int)floor(s);
	ds = (int)round((s - ss) * 1000.0);
	if (ds >= 1000) {
		ss++;
		ds -= 1000;
	}
	if (ss >= 60) {
		ss -= 60;
		m += 1;
	}
	if (m >= 60) {
		m -= 60;
		d += 1;
	}
	sprintf(str, "%c%02i:%02i:%02i.%03i", (sign==1 ? '+':'-'), d, m, ss, ds);
}
Пример #3
0
int main (int argc, char *argv[]) {
	char recodedloc[13], *loc1, *loc2, sign;
	double lon1, lat1, lon2, lat2;
	double distance, az, mmm, sec;
	int  deg, min, retcode, loc_len, nesw = 0;

	if (argc < 2) {
		fprintf(stderr, "Usage: %s <locator1> <precision> [<locator2>]\n", argv[0]);
		exit(1);
	}

	loc1 = argv[1];
       	loc_len = argc > 2 ? atoi(argv[2]) : strlen(loc1)/2;
	loc2 = argc > 3 ? argv[3] : NULL;

	printf("Locator1:\t%s\n", loc1);

        /* hamlib function to convert maidenhead to decimal degrees */
	retcode = locator2longlat(&lon1, &lat1, loc1);
	if (retcode != RIG_OK) {
		fprintf(stderr, "locator2longlat() failed with malformed input.\n");
		exit(2);
	}

        /* hamlib function to convert decimal degrees to deg, min, sec */
	retcode = dec2dms(lon1, &deg, &min, &sec, &nesw);
	if (retcode != RIG_OK) {
		fprintf(stderr, "dec2dms() failed, invalid paramter address.\n");
		exit(2);
	}
	if (nesw == 1)
		sign = '-';
	else
                sign = '\0';
	printf("  Longitude:\t%f\t%c%d %d' %.2f\"\n", lon1, sign, deg, min, sec);

        /* hamlib function to convert deg, min, sec to decimal degrees */
	lon1 = dms2dec(deg, min, sec, nesw);
	printf("  Recoded lon:\t%f\n", lon1);

        /* hamlib function to convert decimal degrees to deg decimal minutes */
	retcode = dec2dmmm(lon1, &deg, &mmm, &nesw);
	if (retcode != RIG_OK) {
		fprintf(stderr, "dec2dmmm() failed, invalid paramter address.\n");
		exit(2);
	}
	if (nesw == 1)
		sign = '-';
	else
                sign = '\0';
	printf("  GPS lon:\t%f\t%c%d %.3f'\n", lon1, sign, deg, mmm);

        /* hamlib function to convert deg, decimal min to decimal degrees */
	lon1 = dmmm2dec(deg, mmm, nesw);
	printf("  Recoded GPS:\t%f\n", lon1);

        /* hamlib function to convert decimal degrees to deg, min, sec */
	retcode = dec2dms(lat1, &deg, &min, &sec, &nesw);
	if (retcode != RIG_OK) {
		fprintf(stderr, "dec2dms() failed, invalid paramter address.\n");
		exit(2);
	}
	if (nesw == 1)
		sign = '-';
	else
                sign = '\0';
	printf("  Latitude:\t%f\t%c%d %d' %.2f\"\n", lat1, sign, deg, min, sec);

        /* hamlib function to convert deg, min, sec to decimal degrees */
	lat1 = dms2dec(deg, min, sec, nesw);
	printf("  Recoded lat:\t%f\n", lat1);

        /* hamlib function to convert decimal degrees to deg decimal minutes */
	retcode = dec2dmmm(lat1, &deg, &mmm, &nesw);
	if (retcode != RIG_OK) {
		fprintf(stderr, "dec2dmmm() failed, invalid paramter address.\n");
		exit(2);
	}
	if (nesw == 1)
		sign = '-';
	else
                sign = '\0';
	printf("  GPS lat:\t%f\t%c%d %.3f'\n", lat1, sign, deg, mmm);

        /* hamlib function to convert deg, decimal min to decimal degrees */
	lat1 = dmmm2dec(deg, mmm, nesw);
	printf("  Recoded GPS:\t%f\n", lat1);

        /* hamlib function to convert decimal degrees to maidenhead */
	retcode = longlat2locator(lon1, lat1, recodedloc, loc_len);
	if (retcode != RIG_OK) {
		fprintf(stderr, "longlat2locator() failed, precision out of range.\n");
		exit(2);
	}
	printf("  Recoded:\t%s\n", recodedloc);

	if (loc2 == NULL)
		exit(0);

	/* Now work on the second locator */
	printf("\nLocator2:\t%s\n", loc2);

	retcode = locator2longlat(&lon2, &lat2, loc2);
	if (retcode != RIG_OK) {
		fprintf(stderr, "locator2longlat() failed with malformed input.\n");
		exit(2);
	}

	/* hamlib function to convert decimal degrees to deg, min, sec */
	retcode = dec2dms(lon2, &deg, &min, &sec, &nesw);
	if (retcode != RIG_OK) {
		fprintf(stderr, "dec2dms() failed, invalid paramter address.\n");
		exit(2);
	}
	if (nesw == 1)
		sign = '-';
	else
                sign = '\0';
	printf("  Longitude:\t%f\t%c%d %d' %.2f\"\n", lon2, sign, deg, min, sec);

	/* hamlib function to convert deg, min, sec to decimal degrees */
	lon2 = dms2dec(deg, min, sec, nesw);
	printf("  Recoded lon:\t%f\n", lon2);

	/* hamlib function to convert decimal degrees to deg decimal minutes */
	retcode = dec2dmmm(lon2, &deg, &mmm, &nesw);
	if (retcode != RIG_OK) {
		fprintf(stderr, "dec2dmmm() failed, invalid paramter address.\n");
		exit(2);
	}
	if (nesw == 1)
		sign = '-';
	else
                sign = '\0';
	printf("  GPS lon:\t%f\t%c%d %.3f'\n", lon2, sign, deg, mmm);

	/* hamlib function to convert deg, decimal min to decimal degrees */
	lon2 = dmmm2dec(deg, mmm, nesw);
	printf("  Recoded GPS:\t%f\n", lon2);

	/* hamlib function to convert decimal degrees to deg, min, sec */
	retcode = dec2dms(lat2, &deg, &min, &sec, &nesw);
	if (retcode != RIG_OK) {
		fprintf(stderr, "dec2dms() failed, invalid paramter address.\n");
		exit(2);
	}
	if (nesw == 1)
		sign = '-';
	else
                sign = '\0';
	printf("  Latitude:\t%f\t%c%d %d' %.2f\"\n", lat2, sign, deg, min, sec);

	/* hamlib function to convert deg, min, sec to decimal degrees */
	lat2 = dms2dec(deg, min, sec, nesw);
	printf("  Recoded lat:\t%f\n", lat2);

	/* hamlib function to convert decimal degrees to deg decimal minutes */
	retcode = dec2dmmm(lat2, &deg, &mmm, &nesw);
	if (retcode != RIG_OK) {
		fprintf(stderr, "dec2dmmm() failed, invalid paramter address.\n");
		exit(2);
	}
	if (nesw == 1)
		sign = '-';
	else
                sign = '\0';
	printf("  GPS lat:\t%f\t%c%d %.3f'\n", lat2, sign, deg, mmm);

        /* hamlib function to convert deg, decimal min to decimal degrees */
	lat2 = dmmm2dec(deg, mmm, nesw);
	printf("  Recoded GPS:\t%f\n", lat2);

        /* hamlib function to convert decimal degrees to maidenhead */
	retcode = longlat2locator(lon2, lat2, recodedloc, loc_len);
	if (retcode != RIG_OK) {
		fprintf(stderr, "longlat2locator() failed, precision out of range.\n");
		exit(2);
	}
	printf("  Recoded:\t%s\n", recodedloc);

	retcode = qrb(lon1, lat1, lon2, lat2, &distance, &az);
	if (retcode != RIG_OK) {
		fprintf(stderr, "QRB error: %d\n", retcode);
		exit(2);
	}

	dec2dms(az, &deg, &min, &sec, &nesw);
	printf("\nDistance: %.6fkm\n", distance);
	if (nesw == 1)
		sign = '-';
	else
		sign = '\0';
        /* Beware printf() rounding error! */
	printf("Bearing: %.2f, %c%d %d' %.2f\"\n", az, sign, deg, min, sec);

	exit(0);
}