38 |
extern preferencestype preferences; |
extern preferencestype preferences; |
39 |
extern GtkWidget *mainwindow; |
extern GtkWidget *mainwindow; |
40 |
|
|
|
/* return distance in Km */ |
|
|
gdouble |
|
|
wwl_dist (gchar * my, gchar * dx) |
|
|
{ |
|
|
gint strlen_dx; |
|
|
gdouble p, z, y, n, h, x, w, t, s, v, u, c, d; |
|
|
gchar my_wwl[7], dx_wwl[7] = "AA55MM"; |
|
|
|
|
|
if (strlen (my) != 6) |
|
|
{ |
|
|
return -1; |
|
|
} |
|
|
|
|
|
strlen_dx = strlen (dx); |
|
|
if (strlen_dx < 2 || strlen_dx > 6) |
|
|
{ |
|
|
return -1; |
|
|
} |
|
|
|
|
|
strcpy (my_wwl, my); |
|
|
memcpy (dx_wwl, dx, strlen_dx); |
|
|
|
|
|
my_wwl[0] = toupper (my_wwl[0]); |
|
|
z = my_wwl[0] - 65; |
|
|
my_wwl[1] = toupper (my_wwl[1]); |
|
|
y = my_wwl[1] - 65; |
|
|
n = my_wwl[2] - 48; |
|
|
h = my_wwl[3] - 48; |
|
|
my_wwl[4] = toupper (my_wwl[4]); |
|
|
x = my_wwl[4] - 65; |
|
|
my_wwl[5] = toupper (my_wwl[5]); |
|
|
w = my_wwl[5] - 65; |
|
|
|
|
|
if (my_wwl[0] < 65 || my_wwl[0] > 88 || my_wwl[1] < 65 || my_wwl[1] > 88 || |
|
|
my_wwl[2] < 48 || my_wwl[2] > 57 || my_wwl[3] < 48 || my_wwl[3] > 57 || |
|
|
my_wwl[4] < 65 || my_wwl[4] > 88 || my_wwl[5] < 65 || my_wwl[5] > 88) |
|
|
{ |
|
|
return -1; |
|
|
} |
|
|
|
|
|
t = z * 20 - 180 + n * 2 + x / 12 + 1.0 / 24; |
|
|
t = t * 3.1415926 / 180; |
|
|
s = y * 10 - 90 + h + w / 24 + 1.0 / 48; |
|
|
s = s * 3.1415926 / 180; |
|
|
|
|
|
dx_wwl[0] = toupper (dx_wwl[0]); |
|
|
z = dx_wwl[0] - 65; |
|
|
dx_wwl[1] = toupper (dx_wwl[1]); |
|
|
y = dx_wwl[1] - 65; |
|
|
n = dx_wwl[2] - 48; |
|
|
h = dx_wwl[3] - 48; |
|
|
dx_wwl[4] = toupper (dx_wwl[4]); |
|
|
x = dx_wwl[4] - 65; |
|
|
dx_wwl[5] = toupper (dx_wwl[5]); |
|
|
w = dx_wwl[5] - 65; |
|
41 |
|
|
42 |
if (dx_wwl[0] < 65 || dx_wwl[0] > 88 || dx_wwl[1] < 65 || dx_wwl[1] > 88 || |
/* calculate distance between 2 locators, distance in kilometers */ |
43 |
dx_wwl[2] < 48 || dx_wwl[2] > 57 || dx_wwl[3] < 48 || dx_wwl[3] > 57 || |
gint |
44 |
dx_wwl[4] < 65 || dx_wwl[4] > 88 || dx_wwl[5] < 65 || dx_wwl[5] > 88) |
wwl (gchar * my, gchar * dx, gint *p, gint *l) |
|
{ |
|
|
return -1; |
|
|
} |
|
|
|
|
|
v = z * 20 - 180 + n * 2 + x / 12 + 1.0 / 24; |
|
|
v = v * 3.1415926 / 180; |
|
|
u = y * 10 - 90 + h + w / 24 + 1.0 / 48; |
|
|
u = u * 3.1415926 / 180; |
|
|
|
|
|
c = cos (s) * cos (u) * cos (v - t) + sin (s) * sin (u); |
|
|
d = 1 - c * c; |
|
|
|
|
|
p = (atan (sqrt (d) / c) * 6371.33) + .5; |
|
|
if (p < 0) p = 20002 + p; |
|
|
|
|
|
return p; |
|
|
} |
|
|
|
|
|
static gchar * |
|
|
wwl (gchar * my, gchar * dx) |
|
45 |
{ |
{ |
46 |
gint l, p, m, strlen_dx; |
gint strlen_dx; |
47 |
gdouble z, y, n, h, x, w, t, s, v, u, c, d, e, lx; |
gdouble z, y, n, h, x, w, t, s, v, u, c, d, e, lx; |
48 |
gchar my_wwl[7], dx_wwl[7] = "AA55MM"; |
gchar my_wwl[7], dx_wwl[7] = "AA55MM"; |
|
gchar *result; |
|
49 |
gchar *msg; |
gchar *msg; |
50 |
|
|
51 |
if (strlen (my) != 6) |
if (strlen (my) != 6) |
53 |
msg = g_strdup_printf (_("%s: not a valid locator"), my); |
msg = g_strdup_printf (_("%s: not a valid locator"), my); |
54 |
update_statusbar (msg); |
update_statusbar (msg); |
55 |
g_free (msg); |
g_free (msg); |
56 |
return (g_strdup ("")); |
return 0; |
57 |
} |
} |
58 |
|
|
59 |
strlen_dx = strlen (dx); |
strlen_dx = strlen (dx); |
62 |
msg = g_strdup_printf (_("%s: not a valid locator"), dx); |
msg = g_strdup_printf (_("%s: not a valid locator"), dx); |
63 |
update_statusbar (msg); |
update_statusbar (msg); |
64 |
g_free (msg); |
g_free (msg); |
65 |
return (g_strdup ("")); |
return 0; |
66 |
} |
} |
67 |
|
|
68 |
strcpy (my_wwl, my); |
strcpy (my_wwl, my); |
86 |
msg = g_strdup_printf (_("%s: not a valid locator"), my_wwl); |
msg = g_strdup_printf (_("%s: not a valid locator"), my_wwl); |
87 |
update_statusbar (msg); |
update_statusbar (msg); |
88 |
g_free (msg); |
g_free (msg); |
89 |
return (g_strdup ("")); |
return 0; |
90 |
} |
} |
91 |
|
|
92 |
t = z * 20 - 180 + n * 2 + x / 12 + 1.0 / 24; |
t = z * 20 - 180 + n * 2 + x / 12 + 1.0 / 24; |
112 |
msg = g_strdup_printf (_("%s: not a valid locator"), dx_wwl); |
msg = g_strdup_printf (_("%s: not a valid locator"), dx_wwl); |
113 |
update_statusbar (msg); |
update_statusbar (msg); |
114 |
g_free (msg); |
g_free (msg); |
115 |
return (g_strdup ("")); |
return 0; |
116 |
} |
} |
117 |
|
|
118 |
v = z * 20 - 180 + n * 2 + x / 12 + 1.0 / 24; |
v = z * 20 - 180 + n * 2 + x / 12 + 1.0 / 24; |
128 |
if (e > 1.0) e = 1.0; |
if (e > 1.0) e = 1.0; |
129 |
if (e < -1.0) e = -1.0; |
if (e < -1.0) e = -1.0; |
130 |
lx = acos (e) * 180 / 3.1415926; |
lx = acos (e) * 180 / 3.1415926; |
131 |
l = (int) (lx + 0.5); |
*l = (int) (lx + 0.5); |
132 |
} |
} |
133 |
else |
else |
134 |
{ |
{ |
135 |
l = 0; |
*l = 0; |
136 |
} |
} |
137 |
|
|
138 |
if (sin (v - t) < 0) |
if (sin (v - t) < 0) |
139 |
{ |
{ |
140 |
l = 360 - l; |
*l = 360 - *l; |
141 |
} |
} |
142 |
|
|
143 |
p = (gint) (atan (sqrt (d) / c) * 6371.33) + .5; |
*p = (gint) (atan (sqrt (d) / c) * 6371.33) + .5; |
144 |
if (p < 0) p = 20002 + p; |
if (*p < 0) *p = 20002 + *p; |
145 |
if (p < 1) p = 0; |
if (*p < 1) *p = 0; |
146 |
m = (gint) (p / 1.609); |
return 1; |
|
|
|
|
if (p != 0) |
|
|
{ |
|
|
if (preferences.units == 1) |
|
|
result = g_strdup_printf (_("Distance: %d km, azimuth: %d deg"), p, l); |
|
|
else |
|
|
result = g_strdup_printf (_("Distance: %d m, azimuth: %d deg"), m, l); |
|
|
} |
|
|
else result = g_strdup (""); |
|
|
return (result); |
|
147 |
} |
} |
148 |
|
|
149 |
void |
void |
150 |
updatelocatorframe (gchar * locator) |
updatelocatorframe (gchar * locator) |
151 |
{ |
{ |
152 |
gchar *label; |
gchar *locatorlabeltext, *framelabeltext; |
153 |
GtkWidget *locatorframe, *framelabel, *locatorlabel; |
GtkWidget *locatorframe, *framelabel, *locatorlabel; |
154 |
|
gint p, m, result, l; |
155 |
|
|
156 |
/* initialize */ |
/* initialize */ |
157 |
locatorframe = lookup_widget (mainwindow, "locatorframe"); |
locatorframe = lookup_widget (mainwindow, "locatorframe"); |
158 |
locatorlabel = lookup_widget (mainwindow, "locatorlabel1"); |
locatorlabel = lookup_widget (mainwindow, "locatorlabel1"); |
159 |
framelabel = gtk_frame_get_label_widget (GTK_FRAME(locatorframe)); |
framelabel = gtk_frame_get_label_widget (GTK_FRAME(locatorframe)); |
160 |
label = g_strdup (""); |
locatorlabeltext = g_strdup (""); |
161 |
gtk_label_set_text (GTK_LABEL (framelabel), "Locator"); |
framelabeltext = g_strdup (""); |
162 |
|
|
163 |
if (strlen (locator) >= 2) |
if (strlen (locator) >= 2) |
164 |
|
{ |
165 |
|
result = wwl (preferences.locator, locator, &p, &l); |
166 |
|
if (result != 0) |
167 |
{ |
{ |
168 |
label = wwl (preferences.locator, locator); |
if (preferences.units == 1) |
169 |
g_ascii_strup (locator, -1); |
locatorlabeltext = g_strdup_printf |
170 |
|
(_("Distance: %d km, azimuth: %d deg"), p, l); |
171 |
|
else |
172 |
|
{ |
173 |
|
m = (gint) (p / 1.609); |
174 |
|
locatorlabeltext = g_strdup_printf |
175 |
|
(_("Distance: %d m, azimuth: %d deg"), m, l); |
176 |
|
} |
177 |
} |
} |
178 |
gtk_label_set_text (GTK_LABEL (framelabel), locator); |
framelabeltext = g_ascii_strup (locator, -1); |
179 |
gtk_label_set_text (GTK_LABEL (locatorlabel), label); |
} |
180 |
g_free (label); |
gtk_label_set_text (GTK_LABEL (framelabel), framelabeltext); |
181 |
|
gtk_label_set_text (GTK_LABEL (locatorlabel), locatorlabeltext); |
182 |
|
g_free (framelabeltext); |
183 |
|
g_free (locatorlabeltext); |
184 |
} |
} |