You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
OpenAudio_ArduinoLibrary/examples/FT8Receive/maidenheadR.ino

72 lines
2.4 KiB

// 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;
}