10 static int status = 0;
13 int calculateRelativeHumidity(int temp, int dew) {
15 rh = 100.0 * powf ((112 - (0.1 * temp)+dew ) / (112 + (0.9 * temp)), 8);
19 int calculateWindChill(int temperatureC, int windKn) {
20 double windKmh = knTokph(windKn);
21 return (int)(13.112+0.6215*temperatureC - 11.37*powf(windKmh,.16) + 0.3965*temperatureC*powf(windKmh,.16) );
24 int knTokph(int knSpeed ){
25 return (knSpeed * 1.852);
28 const char *calculateWindDirectionString(int degree) {
31 } else if (degree < 67.5){
33 } else if (degree < 112.5) {
35 } else if (degree < 157.5) {
37 } else if (degree < 202.5){
39 } else if (degree < 247.5) {
41 } else if (degree < 292.5) {
43 } else if (degree < 337.5){
49 const char*calculateShortWindDirectionString(int degree){
52 } else if (degree < 67.5){
54 } else if (degree < 112.5) {
56 } else if (degree < 157.5) {
58 } else if (degree < 202.5){
60 } else if (degree < 247.5) {
62 } else if (degree < 292.5) {
64 } else if (degree < 337.5){
71 void ftpData(void *userData, const char *data, int len)
73 if(userData) {} // do nothing to make stupid warning go away
82 extern unsigned int sleep(unsigned int);
85 // try three times if it fails
89 /* this happens too often, so i'll leave it commented fprintf(stderr, "METAR update failed for some reason, retry %i\n", tries); */
90 sleep(15); /* give it some time in case the server is busy or down */
94 if ( strlen(metar_station) != 8 ){
95 ERR("You didn't supply a valid METAR station code\n");
98 if (metar_server == NULL)
99 metar_server = strdup("weather.noaa.gov");
100 if (metar_path == NULL)
101 metar_path = strdup("/data/observations/metar/stations");
105 res = connectFtp(metar_server, 0);
107 ERR("Couldn't connect to %s\n", metar_server);
111 res = changeFtpDirectory(metar_path);
113 ERR("Metar update failed (couldn't CWD to %s)\n", metar_path);
119 ERR("Metar update failed\n");
123 if (getFtp(ftpData, NULL, metar_station) < 0) {
124 ERR("Failed to get file %s\n", metar_station);
129 dcdNetMETAR(line, &data);
139 } while (ftp_ok == 0 && tries < 3);
144 static pthread_t thread1;
146 void update_metar() {
150 iret1 = pthread_create( &thread1, NULL, fetch_ftp, NULL);
152 else if (status == 2) { /* thread is still running. what else can we do? */
156 pthread_join( thread1, NULL);
158 iret1 = pthread_create( &thread1, NULL, fetch_ftp, NULL);