#include #ifdef _MSC_VER #include "stdint.h" #include "inttypes.h" #else #include #include #include #endif #include #include #if 0 /*3rd party calibration */ #define POI_CA 0x80000034 /*0 */ #define POI_CB 0xF1C71CD4 /*160 */ #define ZERO (POI_CA) #define SCALE (((double) (POI_CB-POI_CA))/160.) #endif #if 0 /*From VW */ #define POI_CA 0x80b60b60 /*1*/ #define POI_CB 0xff49f49f /*179*/ #define SCALE (((double) (POI_CB-POI_CA))/178.) #define ONE (POI_CA) #define ZERO (ONE - (uint32_t) (SCALE+.5)) #endif #if 1 /*From James*/ #define ZERO 0x80000000 #define SCALE (((float) 0x7FFFFFFF)/180.) #endif static void fromz (int64_t a, double *lat, double *lon) { uint64_t b, c; uint32_t d, e, f; memcpy (&b, &a, sizeof (a)); e = f = 0; for (c = 1, d = 1; c; c <<= 1, d <<= 1) { if (b & c) e |= d; c <<= 1; if (b & c) f |= d; } *lon = e; *lat = f; *lon -= ZERO; *lat -= ZERO; *lon /= SCALE; *lat /= SCALE; } static void toz (double lat, double lon, int64_t * a) { uint64_t b, c; uint32_t d, e, f; lon *= SCALE; lat *= SCALE; lon += ZERO; lat += ZERO; e = (uint32_t) (lon + .5); f = (uint32_t) (lat + .5); //printf("%.1f %x\n",lat-ZERO, e,f); b = 0; for (c = 1, d = 1; c; c <<= 1, d <<= 1) { if (e & d) b |= c; c <<= 1; if (f & d) b |= c; } memcpy (a, &b, sizeof (*a)); } void librns510_encode (const char *slat, const char *slon, char *out) { double lat = atof (slat), lon = atof (slon); int64_t z; toz (lat, lon, &z); sprintf (out, "%" PRId64, z); } void librns510_decode (const char *code, char *slat, char *slon) { double lat, lon; int64_t z; #ifdef _MSC_VER sscanf(code, "%" PRId64, &z); #else z = atoll (code); #endif fromz (z, &lat, &lon); sprintf (slat, "%.10f", lat); sprintf (slon, "%.10f", lon); }