kopia lustrzana https://github.com/cyoung/stratux
964 wiersze
25 KiB
C
964 wiersze
25 KiB
C
/*
|
|
METAR Decoder Software Package Library: Parses Aviation Routine Weather Reports
|
|
Copyright (C) 2003 Eric McCarthy
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#include "metar_structs.h"
|
|
|
|
|
|
void say_text(char *speech, char *text) {
|
|
int i;
|
|
char tmp[2];
|
|
for (i = 0; i < strlen(text); i++) {
|
|
switch(text[i]) {
|
|
case '-':
|
|
strcat(speech, "minus");
|
|
break;
|
|
case '0':
|
|
strcat(speech, "zero");
|
|
break;
|
|
case '1':
|
|
strcat(speech, "one");
|
|
break;
|
|
case '2':
|
|
strcat(speech, "two");
|
|
break;
|
|
case '3':
|
|
strcat(speech, "three");
|
|
break;
|
|
case '4':
|
|
strcat(speech, "four");
|
|
break;
|
|
case '5':
|
|
strcat(speech, "five");
|
|
break;
|
|
case '6':
|
|
strcat(speech, "six");
|
|
break;
|
|
case '7':
|
|
strcat(speech, "seven");
|
|
break;
|
|
case '8':
|
|
strcat(speech, "eight");
|
|
break;
|
|
case '9':
|
|
strcat(speech, "niner");
|
|
break;
|
|
case '@':
|
|
strcat(speech, "at");
|
|
break;
|
|
default:
|
|
sprintf(tmp, "%c", text[i]);
|
|
strcat(speech, tmp);
|
|
break;
|
|
}
|
|
strcat(speech, " ");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void sprint_metar (char * string, Decoded_METAR *Mptr)
|
|
{
|
|
|
|
/***************************/
|
|
/* DECLARE LOCAL VARIABLES */
|
|
/***************************/
|
|
|
|
int i;
|
|
char temp[100];
|
|
|
|
/*************************/
|
|
/* START BODY OF ROUTINE */
|
|
/*************************/
|
|
|
|
|
|
strcat(string, "ME TAR. ");
|
|
|
|
if ( Mptr->stnid[ 0 ] == '\0' ) {
|
|
strcat(string, "Error");
|
|
return;
|
|
}
|
|
|
|
for (i = 0; i < strlen(Mptr->stnid); i++) {
|
|
sprintf(temp, "%c ", Mptr->stnid[i]);
|
|
strcat(string, temp);
|
|
}
|
|
strcat(string, ". ");
|
|
|
|
if (Mptr->ob_hour != MAXINT && Mptr->ob_minute != MAXINT) {
|
|
if (Mptr->AUTO) {
|
|
strcat(string, "Automated ");
|
|
}
|
|
if (Mptr->COR) {
|
|
strcat(string, "Corrected ");
|
|
}
|
|
strcat(string, "Observation ");
|
|
sprintf(temp, "%d%d", Mptr->ob_hour, Mptr->ob_minute);
|
|
say_text(string, temp);
|
|
strcat(string, "zulu. ");
|
|
}
|
|
|
|
strcat(string, "Wind ");
|
|
if (Mptr->winData.windDir != MAXINT) {
|
|
sprintf(temp, "%03d", Mptr->winData.windDir);
|
|
say_text(string, temp);
|
|
}
|
|
|
|
if ( Mptr->winData.windVRB ) {
|
|
strcat(string, "variable ");
|
|
}
|
|
|
|
//FIXME.
|
|
if ( Mptr->minWnDir != MAXINT ) {
|
|
sprintf(temp, "%03d", Mptr->minWnDir);
|
|
say_text(string, temp);
|
|
}
|
|
|
|
//FIXME.
|
|
if ( Mptr->maxWnDir != MAXINT ) {
|
|
sprintf(temp, "%03d", Mptr->maxWnDir);
|
|
say_text(string, temp);
|
|
}
|
|
|
|
|
|
if ( Mptr->winData.windSpeed != MAXINT ) {
|
|
sprintf(temp, "@%d", Mptr->winData.windSpeed);
|
|
say_text(string, temp);
|
|
} else {
|
|
strcat(string, "calm ");
|
|
}
|
|
|
|
if ( Mptr->winData.windGust != MAXINT ) {
|
|
strcat(string, "gusting ");
|
|
sprintf(temp, "%d", Mptr->winData.windGust);
|
|
say_text(string, temp);
|
|
}
|
|
|
|
strcat(string, ". ");
|
|
|
|
if ( Mptr->prevail_vsbyM != (float) MAXINT ) {
|
|
strcat(string, "Visibility ");
|
|
sprintf(temp, "%d", (int)Mptr->prevail_vsbyM);
|
|
say_text(string, temp);
|
|
strcat(string, "miles. ");
|
|
}
|
|
|
|
if ( Mptr->prevail_vsbySM != (float) MAXINT ) {
|
|
strcat(string, "Visibility ");
|
|
sprintf(temp, "%d", (int)Mptr->prevail_vsbySM);
|
|
say_text(string, temp);
|
|
strcat(string, "miles. ");
|
|
}
|
|
|
|
|
|
/* for ( i = 0; i < 12; i++ )
|
|
{
|
|
if( Mptr->RRVR[i].runway_designator[0] != '\0' ) {
|
|
sprintf(temp, "RUNWAY DESIGNATOR : %s\n",
|
|
Mptr->RRVR[i].runway_designator);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if( Mptr->RRVR[i].visRange != MAXINT ) {
|
|
sprintf(temp, "R_WAY VIS RANGE (FT): %d\n",
|
|
Mptr->RRVR[i].visRange);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->RRVR[i].vrbl_visRange ) {
|
|
sprintf(temp, "VRBL VISUAL RANGE : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->RRVR[i].below_min_RVR ) {
|
|
sprintf(temp, "BELOW MIN RVR : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->RRVR[i].above_max_RVR ) {
|
|
sprintf(temp, "ABOVE MAX RVR : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if( Mptr->RRVR[i].Max_visRange != MAXINT ) {
|
|
sprintf(temp, "MX R_WAY VISRNG (FT): %d\n",
|
|
Mptr->RRVR[i].Max_visRange);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if( Mptr->RRVR[i].Min_visRange != MAXINT ) {
|
|
sprintf(temp, "MN R_WAY VISRNG (FT): %d\n",
|
|
Mptr->RRVR[i].Min_visRange);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
if( Mptr->DVR.visRange != MAXINT ) {
|
|
sprintf(temp, "DISPATCH VIS RANGE : %d\n",
|
|
Mptr->DVR.visRange);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->DVR.vrbl_visRange ) {
|
|
sprintf(temp, "VRBL DISPATCH VISRNG: TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->DVR.below_min_DVR ) {
|
|
sprintf(temp, "BELOW MIN DVR : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->DVR.above_max_DVR ) {
|
|
sprintf(temp, "ABOVE MAX DVR : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if( Mptr->DVR.Max_visRange != MAXINT ) {
|
|
sprintf(temp, "MX DSPAT VISRNG (FT): %d\n",
|
|
Mptr->DVR.Max_visRange);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if( Mptr->DVR.Min_visRange != MAXINT ) {
|
|
sprintf(temp, "MN DSPAT VISRNG (FT): %d\n",
|
|
Mptr->DVR.Min_visRange);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
|
|
i = 0;
|
|
while ( Mptr->WxObstruct[i][0] != '\0' && i < MAXWXSYMBOLS )
|
|
{
|
|
sprintf(temp, "WX/OBSTRUCT VISION : %s\n",
|
|
Mptr->WxObstruct[i] );
|
|
strcat(string, temp);
|
|
i++;
|
|
}
|
|
|
|
if ( Mptr->PartialObscurationAmt[0][0] != '\0' ) {
|
|
sprintf(temp, "OBSCURATION AMOUNT : %s\n",
|
|
&(Mptr->PartialObscurationAmt[0][0]));
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->PartialObscurationPhenom[0][0] != '\0' ) {
|
|
sprintf(temp, "OBSCURATION PHENOM : %s\n",
|
|
&(Mptr->PartialObscurationPhenom[0][0]));
|
|
strcat(string, temp);
|
|
}
|
|
|
|
|
|
if ( Mptr->PartialObscurationAmt[1][0] != '\0' ) {
|
|
sprintf(temp, "OBSCURATION AMOUNT : %s\n",
|
|
&(Mptr->PartialObscurationAmt[1][0]));
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->PartialObscurationPhenom[1][0] != '\0' ) {
|
|
sprintf(temp, "OBSCURATION PHENOM : %s\n",
|
|
&(Mptr->PartialObscurationPhenom[1][0]));
|
|
strcat(string, temp);
|
|
}
|
|
*/
|
|
|
|
strcat(string, "Sky condition ");
|
|
|
|
i = 0;
|
|
while ( Mptr->cldTypHgt[ i ].cloud_type[0] != '\0' &&
|
|
i < 6 )
|
|
{
|
|
if ( Mptr->cldTypHgt[ i ].cloud_type[0] != '\0' ) {
|
|
if (strcmp(Mptr->cldTypHgt[ i ].cloud_type, "CLR") == 0) {
|
|
strcat(string, "clear. ");
|
|
} else {
|
|
if (strcmp(Mptr->cldTypHgt[ i ].cloud_type, "FEW") == 0) {
|
|
strcat(string, "scattered ");
|
|
}
|
|
if (strcmp(Mptr->cldTypHgt[ i ].cloud_type, "SCT") == 0) {
|
|
strcat(string, "scattered ");
|
|
}
|
|
if (strcmp(Mptr->cldTypHgt[ i ].cloud_type, "BKN") == 0) {
|
|
strcat(string, "broken ");
|
|
}
|
|
if (strcmp(Mptr->cldTypHgt[ i ].cloud_type, "OVC") == 0) {
|
|
strcat(string, "overcast ");
|
|
}
|
|
//TODO: Others?
|
|
}
|
|
}
|
|
|
|
if ( Mptr->cldTypHgt[ i ].cloud_hgt_char[0] != '\0' ) {
|
|
char thousands[4];
|
|
char hundreds[4];
|
|
int height = atoi(Mptr->cldTypHgt[i].cloud_hgt_char);
|
|
if ((height - (height%10)) > 0) {
|
|
sprintf(thousands, "%d", height/10);
|
|
say_text(string, thousands);
|
|
strcat(string, "thousand ");
|
|
}
|
|
if (height%10) {
|
|
sprintf(hundreds, "%d", height%10);
|
|
say_text(string, hundreds);
|
|
strcat(string, "hundred ");
|
|
}
|
|
}
|
|
|
|
strcat(string, ". ");
|
|
/*
|
|
//TODO: TCU, Towering Cumulus, etc.
|
|
if ( Mptr->cldTypHgt[ i ].other_cld_phenom[0] != '\0' ) {
|
|
sprintf(temp, "OTHER CLOUD PHENOM : %s\n",
|
|
Mptr->cldTypHgt[ i ].other_cld_phenom);
|
|
strcat(string, temp);
|
|
}
|
|
*/
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
if ( Mptr->temp != MAXINT ) {
|
|
strcat(string, "Temperature ");
|
|
sprintf(temp, "%d", Mptr->temp);
|
|
say_text(string, temp);
|
|
strcat(string, "celsius. ");
|
|
}
|
|
|
|
if ( Mptr->dew_pt_temp != MAXINT ) {
|
|
strcat(string, "Dew point ");
|
|
sprintf(temp, "%d", Mptr->dew_pt_temp);
|
|
say_text(string, temp);
|
|
strcat(string, "celsius. ");
|
|
}
|
|
|
|
if ( Mptr->A_altstng ) {
|
|
strcat(string, "Altimeter ");
|
|
sprintf(temp, "%d", (int)Mptr->inches_altstng);
|
|
say_text(string, temp);
|
|
strcat(string, ", ");
|
|
sprintf(temp, "%02d", (int)(100*Mptr->inches_altstng)%100);
|
|
say_text(string, temp);
|
|
strcat(string, ". ");
|
|
}
|
|
|
|
/*
|
|
if ( Mptr->TornadicType[0] != '\0' ) {
|
|
sprintf(temp, "TORNADIC ACTVTY TYPE: %s\n",
|
|
Mptr->TornadicType );
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->BTornadicHour != MAXINT ) {
|
|
sprintf(temp, "TORN. ACTVTY BEGHOUR: %d\n",
|
|
Mptr->BTornadicHour );
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->BTornadicMinute != MAXINT ) {
|
|
sprintf(temp, "TORN. ACTVTY BEGMIN : %d\n",
|
|
Mptr->BTornadicMinute );
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->ETornadicHour != MAXINT ) {
|
|
sprintf(temp, "TORN. ACTVTY ENDHOUR: %d\n",
|
|
Mptr->ETornadicHour );
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->ETornadicMinute != MAXINT ) {
|
|
sprintf(temp, "TORN. ACTVTY ENDMIN : %d\n",
|
|
Mptr->ETornadicMinute );
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->TornadicDistance != MAXINT ) {
|
|
sprintf(temp, "TORN. DIST. FROM STN: %d\n",
|
|
Mptr->TornadicDistance );
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->TornadicLOC[0] != '\0' ) {
|
|
sprintf(temp, "TORNADIC LOCATION : %s\n",
|
|
Mptr->TornadicLOC );
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->TornadicDIR[0] != '\0' ) {
|
|
sprintf(temp, "TORNAD. DIR FROM STN: %s\n",
|
|
Mptr->TornadicDIR );
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->TornadicMovDir[0] != '\0' ) {
|
|
sprintf(temp, "TORNADO DIR OF MOVM.: %s\n",
|
|
Mptr->TornadicMovDir );
|
|
strcat(string, temp);
|
|
}
|
|
|
|
|
|
if ( Mptr->autoIndicator[0] != '\0' ) {
|
|
sprintf(temp, "AUTO INDICATOR : %s\n",
|
|
Mptr->autoIndicator);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->PKWND_dir != MAXINT ) {
|
|
sprintf(temp, "PEAK WIND DIRECTION : %d\n",Mptr->PKWND_dir);
|
|
strcat(string, temp);
|
|
}
|
|
if ( Mptr->PKWND_speed != MAXINT ) {
|
|
sprintf(temp, "PEAK WIND SPEED : %d\n",Mptr->PKWND_speed);
|
|
strcat(string, temp);
|
|
}
|
|
if ( Mptr->PKWND_hour != MAXINT ) {
|
|
sprintf(temp, "PEAK WIND HOUR : %d\n",Mptr->PKWND_hour);
|
|
strcat(string, temp);
|
|
}
|
|
if ( Mptr->PKWND_minute != MAXINT ) {
|
|
sprintf(temp, "PEAK WIND MINUTE : %d\n",Mptr->PKWND_minute);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->WshfTime_hour != MAXINT ) {
|
|
sprintf(temp, "HOUR OF WIND SHIFT : %d\n",Mptr->WshfTime_hour);
|
|
strcat(string, temp);
|
|
}
|
|
if ( Mptr->WshfTime_minute != MAXINT ) {
|
|
sprintf(temp, "MINUTE OF WIND SHIFT: %d\n",Mptr->WshfTime_minute);
|
|
strcat(string, temp);
|
|
}
|
|
if ( Mptr->Wshft_FROPA != FALSE ) {
|
|
sprintf(temp, "FROPA ASSOC. W/WSHFT: TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->TWR_VSBY != (float) MAXINT ) {
|
|
sprintf(temp, "TOWER VISIBILITY : %.2f\n",Mptr->TWR_VSBY);
|
|
strcat(string, temp);
|
|
}
|
|
if ( Mptr->SFC_VSBY != (float) MAXINT ) {
|
|
sprintf(temp, "SURFACE VISIBILITY : %.2f\n",Mptr->SFC_VSBY);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->minVsby != (float) MAXINT ) {
|
|
sprintf(temp, "MIN VRBL_VIS (SM) : %.4f\n",Mptr->minVsby);
|
|
strcat(string, temp);
|
|
}
|
|
if ( Mptr->maxVsby != (float) MAXINT ) {
|
|
sprintf(temp, "MAX VRBL_VIS (SM) : %.4f\n",Mptr->maxVsby);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if( Mptr->VSBY_2ndSite != (float) MAXINT ) {
|
|
sprintf(temp, "VSBY_2ndSite (SM) : %.4f\n",Mptr->VSBY_2ndSite);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if( Mptr->VSBY_2ndSite_LOC[0] != '\0' ) {
|
|
sprintf(temp, "VSBY_2ndSite LOC. : %s\n",
|
|
Mptr->VSBY_2ndSite_LOC);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->OCNL_LTG ) {
|
|
sprintf(temp, "OCCASSIONAL LTG : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->FRQ_LTG ) {
|
|
sprintf(temp, "FREQUENT LIGHTNING : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->CNS_LTG ) {
|
|
sprintf(temp, "CONTINUOUS LTG : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->CG_LTG ) {
|
|
sprintf(temp, "CLOUD-GROUND LTG : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->IC_LTG ) {
|
|
sprintf(temp, "IN-CLOUD LIGHTNING : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->CC_LTG ) {
|
|
sprintf(temp, "CLD-CLD LIGHTNING : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->CA_LTG ) {
|
|
sprintf(temp, "CLOUD-AIR LIGHTNING : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->AP_LTG ) {
|
|
sprintf(temp, "LIGHTNING AT AIRPORT: TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->OVHD_LTG ) {
|
|
sprintf(temp, "LIGHTNING OVERHEAD : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->DSNT_LTG ) {
|
|
sprintf(temp, "DISTANT LIGHTNING : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->LightningVCTS ) {
|
|
sprintf(temp, "L'NING W/I 5-10(ALP): TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->LightningTS ) {
|
|
sprintf(temp, "L'NING W/I 5 (ALP) : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->VcyStn_LTG ) {
|
|
sprintf(temp, "VCY STN LIGHTNING : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->LTG_DIR[0] != '\0' ) {
|
|
sprintf(temp, "DIREC. OF LIGHTNING : %s\n", Mptr->LTG_DIR);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
|
|
|
|
i = 0;
|
|
while( i < 3 && Mptr->ReWx[ i ].Recent_weather[0] != '\0' )
|
|
{
|
|
sprintf(temp, "RECENT WEATHER : %s",
|
|
Mptr->ReWx[i].Recent_weather);
|
|
strcat(string, temp);
|
|
|
|
if ( Mptr->ReWx[i].Bhh != MAXINT ) {
|
|
sprintf(temp, " BEG_hh = %d",Mptr->ReWx[i].Bhh);
|
|
strcat(string, temp);
|
|
}
|
|
if ( Mptr->ReWx[i].Bmm != MAXINT ) {
|
|
sprintf(temp, " BEG_mm = %d",Mptr->ReWx[i].Bmm);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->ReWx[i].Ehh != MAXINT ) {
|
|
sprintf(temp, " END_hh = %d",Mptr->ReWx[i].Ehh);
|
|
strcat(string, temp);
|
|
}
|
|
if ( Mptr->ReWx[i].Emm != MAXINT ) {
|
|
sprintf(temp, " END_mm = %d",Mptr->ReWx[i].Emm);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
strcat(string, "\n");
|
|
|
|
i++;
|
|
}
|
|
|
|
if ( Mptr->minCeiling != MAXINT ) {
|
|
sprintf(temp, "MIN VRBL_CIG (FT) : %d\n",Mptr->minCeiling);
|
|
strcat(string, temp);
|
|
}
|
|
if ( Mptr->maxCeiling != MAXINT ) {
|
|
sprintf(temp, "MAX VRBL_CIG (FT)) : %d\n",Mptr->maxCeiling);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->CIG_2ndSite_Meters != MAXINT ) {
|
|
sprintf(temp, "CIG2ndSite (FT) : %d\n",Mptr->CIG_2ndSite_Meters);
|
|
strcat(string, temp);
|
|
}
|
|
if ( Mptr->CIG_2ndSite_LOC[0] != '\0' ) {
|
|
sprintf(temp, "CIG @ 2nd Site LOC. : %s\n",Mptr->CIG_2ndSite_LOC);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->PRESFR ) {
|
|
sprintf(temp, "PRESFR : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
if ( Mptr->PRESRR ) {
|
|
sprintf(temp, "PRESRR : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->SLPNO ) {
|
|
sprintf(temp, "SLPNO : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->SLP != (float) MAXINT ) {
|
|
sprintf(temp, "SLP (hPa) : %.1f\n", Mptr->SLP);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->SectorVsby != (float) MAXINT ) {
|
|
sprintf(temp, "SECTOR VSBY (MILES) : %.2f\n", Mptr->SectorVsby );
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->SectorVsby_Dir[ 0 ] != '\0' ) {
|
|
sprintf(temp, "SECTOR VSBY OCTANT : %s\n", Mptr->SectorVsby_Dir );
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->TS_LOC[ 0 ] != '\0' ) {
|
|
sprintf(temp, "THUNDERSTORM LOCAT. : %s\n", Mptr->TS_LOC );
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->TS_MOVMNT[ 0 ] != '\0' ) {
|
|
sprintf(temp, "THUNDERSTORM MOVMNT.: %s\n", Mptr->TS_MOVMNT);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->GR ) {
|
|
sprintf(temp, "GR (HAILSTONES) : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->GR_Size != (float) MAXINT ) {
|
|
sprintf(temp, "HLSTO SIZE (INCHES) : %.3f\n",Mptr->GR_Size);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->VIRGA ) {
|
|
sprintf(temp, "VIRGA : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->VIRGA_DIR[0] != '\0' ) {
|
|
sprintf(temp, "DIR OF VIRGA FRM STN: %s\n", Mptr->VIRGA_DIR);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
for( i = 0; i < 6; i++ ) {
|
|
if( Mptr->SfcObscuration[i][0] != '\0' ) {
|
|
sprintf(temp, "SfcObscuration : %s\n",
|
|
&(Mptr->SfcObscuration[i][0]) );
|
|
strcat(string, temp);
|
|
}
|
|
}
|
|
|
|
if ( Mptr->Num8thsSkyObscured != MAXINT ) {
|
|
sprintf(temp, "8ths of SkyObscured : %d\n",Mptr->Num8thsSkyObscured);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->CIGNO ) {
|
|
sprintf(temp, "CIGNO : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->Ceiling != MAXINT ) {
|
|
sprintf(temp, "Ceiling (ft) : %d\n",Mptr->Ceiling);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->Estimated_Ceiling != MAXINT ) {
|
|
sprintf(temp, "Estimated CIG (ft) : %d\n",Mptr->Estimated_Ceiling);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->VrbSkyBelow[0] != '\0' ) {
|
|
sprintf(temp, "VRB SKY COND BELOW : %s\n",Mptr->VrbSkyBelow);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->VrbSkyAbove[0] != '\0' ) {
|
|
sprintf(temp, "VRB SKY COND ABOVE : %s\n",Mptr->VrbSkyAbove);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->VrbSkyLayerHgt != MAXINT ) {
|
|
sprintf(temp, "VRBSKY COND HGT (FT): %d\n",Mptr->VrbSkyLayerHgt);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->ObscurAloftHgt != MAXINT ) {
|
|
sprintf(temp, "Hgt Obscur Aloft(ft): %d\n",Mptr->ObscurAloftHgt);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->ObscurAloft[0] != '\0' ) {
|
|
sprintf(temp, "Obscur Phenom Aloft : %s\n",Mptr->ObscurAloft);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->ObscurAloftSkyCond[0] != '\0' ) {
|
|
sprintf(temp, "Obscur ALOFT SKYCOND: %s\n",Mptr->ObscurAloftSkyCond);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
|
|
if ( Mptr->NOSPECI ) {
|
|
sprintf(temp, "NOSPECI : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->LAST ) {
|
|
sprintf(temp, "LAST : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->synoptic_cloud_type[ 0 ] != '\0' ) {
|
|
sprintf(temp, "SYNOPTIC CLOUD GROUP: %s\n",Mptr->synoptic_cloud_type);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->CloudLow != '\0' ) {
|
|
sprintf(temp, "LOW CLOUD CODE : %c\n",Mptr->CloudLow);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->CloudMedium != '\0' ) {
|
|
sprintf(temp, "MEDIUM CLOUD CODE : %c\n",Mptr->CloudMedium);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->CloudHigh != '\0' ) {
|
|
sprintf(temp, "HIGH CLOUD CODE : %c\n",Mptr->CloudHigh);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->SNINCR != MAXINT ) {
|
|
sprintf(temp, "SNINCR (INCHES) : %d\n",Mptr->SNINCR);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->SNINCR_TotalDepth != MAXINT ) {
|
|
sprintf(temp, "SNINCR(TOT. INCHES) : %d\n",Mptr->SNINCR_TotalDepth);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->snow_depth_group[ 0 ] != '\0' ) {
|
|
sprintf(temp, "SNOW DEPTH GROUP : %s\n",Mptr->snow_depth_group);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->snow_depth != MAXINT ) {
|
|
sprintf(temp, "SNOW DEPTH (INCHES) : %d\n",Mptr->snow_depth);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->WaterEquivSnow != (float) MAXINT ) {
|
|
sprintf(temp, "H2O EquivSno(inches): %.2f\n",Mptr->WaterEquivSnow);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->SunshineDur != MAXINT ) {
|
|
sprintf(temp, "SUNSHINE (MINUTES) : %d\n",Mptr->SunshineDur);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->SunSensorOut ) {
|
|
sprintf(temp, "SUN SENSOR OUT : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->hourlyPrecip != (float) MAXINT ) {
|
|
sprintf(temp, "HRLY PRECIP (INCHES): %.2f\n",Mptr->hourlyPrecip);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if( Mptr->precip_amt != (float) MAXINT) {
|
|
sprintf(temp, "3/6HR PRCIP (INCHES): %.2f\n",
|
|
Mptr->precip_amt);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if( Mptr->Indeterminant3_6HrPrecip ) {
|
|
sprintf(temp, "INDTRMN 3/6HR PRECIP: TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if( Mptr->precip_24_amt != (float) MAXINT) {
|
|
sprintf(temp, "24HR PRECIP (INCHES): %.2f\n",
|
|
Mptr->precip_24_amt);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->Indeterminant_24HrPrecip ) {
|
|
sprintf(temp, "INDTRMN 24 HR PRECIP: TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->Temp_2_tenths != (float) MAXINT ) {
|
|
sprintf(temp, "TMP2TENTHS (CELSIUS): %.1f\n",Mptr->Temp_2_tenths);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->DP_Temp_2_tenths != (float) MAXINT ) {
|
|
sprintf(temp, "DPT2TENTHS (CELSIUS): %.1f\n",Mptr->DP_Temp_2_tenths);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->maxtemp != (float) MAXINT) {
|
|
sprintf(temp, "MAX TEMP (CELSIUS) : %.1f\n",
|
|
Mptr->maxtemp);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->mintemp != (float) MAXINT) {
|
|
sprintf(temp, "MIN TEMP (CELSIUS) : %.1f\n",
|
|
Mptr->mintemp);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->max24temp != (float) MAXINT) {
|
|
sprintf(temp, "24HrMAXTMP (CELSIUS): %.1f\n",
|
|
Mptr->max24temp);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->min24temp != (float) MAXINT) {
|
|
sprintf(temp, "24HrMINTMP (CELSIUS): %.1f\n",
|
|
Mptr->min24temp);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->char_prestndcy != MAXINT) {
|
|
sprintf(temp, "CHAR PRESS TENDENCY : %d\n",
|
|
Mptr->char_prestndcy );
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->prestndcy != (float) MAXINT) {
|
|
sprintf(temp, "PRES. TENDENCY (hPa): %.1f\n",
|
|
Mptr->prestndcy );
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->PWINO ) {
|
|
sprintf(temp, "PWINO : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->PNO ) {
|
|
sprintf(temp, "PNO : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->CHINO ) {
|
|
sprintf(temp, "CHINO : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->CHINO_LOC[0] != '\0' ) {
|
|
sprintf(temp, "CHINO_LOC : %s\n",Mptr->CHINO_LOC);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->VISNO ) {
|
|
sprintf(temp, "VISNO : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->VISNO_LOC[0] != '\0' ) {
|
|
sprintf(temp, "VISNO_LOC : %s\n",Mptr->VISNO_LOC);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->FZRANO ) {
|
|
sprintf(temp, "FZRANO : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->TSNO ) {
|
|
sprintf(temp, "TSNO : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->DollarSign) {
|
|
sprintf(temp, "DOLLAR $IGN INDCATR : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->horiz_vsby[ 0 ] != '\0' ) {
|
|
sprintf(temp, "HORIZ VISIBILITY : %s\n",Mptr->horiz_vsby);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->dir_min_horiz_vsby[ 0 ] != '\0' ) {
|
|
sprintf(temp, "DIR MIN HORIZ VSBY : %s\n",Mptr->dir_min_horiz_vsby);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->CAVOK ) {
|
|
sprintf(temp, "CAVOK : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
|
|
if( Mptr->VertVsby != MAXINT ) {
|
|
sprintf(temp, "Vert. Vsby (meters) : %d\n",
|
|
Mptr->VertVsby );
|
|
strcat(string, temp);
|
|
}
|
|
*/
|
|
|
|
/*
|
|
if( Mptr->charVertVsby[0] != '\0' )
|
|
sprintf(temp, "Vert. Vsby (CHAR) : %s\n",
|
|
Mptr->charVertVsby );
|
|
*/
|
|
/*
|
|
if ( Mptr->QFE != MAXINT ) {
|
|
sprintf(temp, "QFE : %d\n", Mptr->QFE);
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->VOLCASH ) {
|
|
sprintf(temp, "VOLCANIC ASH : TRUE\n");
|
|
strcat(string, temp);
|
|
}
|
|
|
|
if ( Mptr->min_vrbl_wind_dir != MAXINT ) {
|
|
sprintf(temp, "MIN VRBL WIND DIR : %d\n",Mptr->min_vrbl_wind_dir);
|
|
strcat(string, temp);
|
|
}
|
|
if ( Mptr->max_vrbl_wind_dir != MAXINT ) {
|
|
sprintf(temp, "MAX VRBL WIND DIR : %d\n",Mptr->max_vrbl_wind_dir);
|
|
strcat(string, temp);
|
|
}
|
|
*/
|
|
|
|
strcat(string, "\n\n\n");
|
|
}
|
|
|
|
|
|
void prtDMETR (Decoded_METAR *Mptr)
|
|
{
|
|
char string[5000];
|
|
|
|
sprint_metar(string, Mptr);
|
|
printf(string);
|
|
}
|