// maidenheadR.ino Bob Larkin 12 Nov 2022 // Built from the K. Goba double precision files. // Data types float precision, funtion unchanged, names have added 'f' char letterizeR(int x) { return (char) x + 65; } // Input lat, lon in degrees; Input grid locator size 4, 6, 8, or 10 // Output grid square string pointer. char* get_mhf(float32_t lat, float32_t lon, int size) { static char locator[11]; float32_t LON_F[]={20.0f, 2.0f, 0.0833333f, 0.008333f, 0.00034720833f}; float32_t LAT_F[]={10.0f, 1.0f, 0.0416665f, 0.004166f, 0.00017358333f}; int i; lon += 180.0f; lat += 90.0f; if (size <= 0 || size > 10) size = 6; size/=2; size*=2; for (i = 0; i < size/2; i++){ if (i % 2 == 1) { locator[i*2] = (char)(lon/LON_F[i] + '0'); locator[i*2+1] = (char)(lat/LAT_F[i] + '0'); } else { locator[i*2] = letterizeR((int)(lon/LON_F[i])); locator[i*2+1] = letterizeR((int)(lat/LAT_F[i])); } lon = fmod(lon, LON_F[i]); lat = fmod(lat, LAT_F[i]); } locator[i*2]=0; return locator; } char* complete_mh(char* locator) { static char locator2[11] = "LL55LL55LL"; int len = strlen(locator); if (len >= 10) return locator; memcpy(locator2, locator, strlen(locator)); return locator2; } // Convert grid square string to longitude float32_t mh2lonf(char* locator) { float32_t field, square, subsquare, extsquare, precsquare; int len = strlen(locator); if (len > 10) return 0; if (len < 10) locator = complete_mh(locator); field = (locator[0] - 'A') * 20.0f; square = (locator[2] - '0') * 2.0f; subsquare = (locator[4] - 'A') / 12.0f; extsquare = (locator[6] - '0') / 120.0f; precsquare = (locator[8] - 'A') / 2880.0f; return field + square + subsquare + extsquare + precsquare - 180.0f; } // Convert grid square string to latitude float32_t mh2latf(char* locator) { float field, square, subsquare, extsquare, precsquare; int len = strlen(locator); if (len > 10) return 0; if (len < 10) locator = complete_mh(locator); field = (locator[1] - 'A') * 10.0f; square = (locator[3] - '0') * 1.0f; subsquare = (locator[5] - 'A') / 24.0f; extsquare = (locator[7] - '0') / 240.0f; precsquare = (locator[9] - 'A') / 5760.0f; return field + square + subsquare + extsquare + precsquare - 90; }