/*
 *
 *    radarinfo.c
 *
 *	This is a subsection of the WSR-88D archive-II I/O library
 *    codes, a2io.c,  written by Kevin Thomas of NSSL, and
 *    shamelessly stolen and adapted by Keith Brewster, CAPS.
 *    It reads the a2io radar information file, radarinfo.dat
 *
 *    Keith Brewster, May, 1996
 *
 */
 
#include <stdio.h>
#include <strings.h>

#define MISSING -999

int radar_name_set =0;
char radar_name[4];
char site_name[8];
int lat;
int lon;
int alt;

int lat1,lat2,lat3;
int lon1,lon2,lon3;

/*
 *	The altitude info (station elevation) may now be in the data file.
 */

int get_altitude()
{
	return( alt );
}

int get_latitude()
{
	return( lat );
}

int get_longitude()
{
	return( lon );
}

void get_radar_name(s)
char *s;
{
	strncpy(s,radar_name,4);
	return;
}

void get_site_name(s)
char *s;
{
	strncpy(s,site_name,8);
	return;
}

void set_radar_name(s)
char *s;
{
	strncpy(radar_name,s,4);
	radar_name_set++;
}

/*
 *	Radar name, site name, latitude, and longitude are all important
 *	radar parameters.  Unfortunately, none of them are in the actual
 *	data themselves.
 *
 *	The user may set the radar name by:
 *	o  set_radar_name( some_name );	[in code]
 *	o  setenv RADARNAME some_name	[ignored if set_radar_name() used]
 *
 *	The program retrieves the info from the file:
 *	o  setenv RADARFILE some_file	[data file]
 *	o  from "./radarinfo.dat"	[if RADARFILE not used]
 */

#define	SIZE	120

FILE *fp;

void get_radar_info()
{
	int rc;
	char line[SIZE];
	char *default_name = "radarinfo.dat";
	char name[4], site[8];
	char *ptr;

/*
 *	Initialize info to missing.  Do NOT initialize "radar_name" here as
 *	the user may have already called set_radar_name().
 */

	strncpy( site_name, "Unknown ", 8 );
	lat = 0;
	lon = 0;
	alt = MISSING;

/*
 *	Retrieve the radar name.
 *
 *	First, look and see if "set_radar_name()" has been called.  If it
 *	hasn't, we look for an environmental variable.
 */

	if ( radar_name_set == 0 )
	{
		ptr = (char *)getenv("RADARNAME");
		if (ptr == NULL)
		{
			printf("WARNING:  no call to set_radar_name, and no environmental variable RADARNAME\n");
			printf("WARNING:  radar name set to 'UNKN'\n");
			strncpy(radar_name,"UNKN",4);
			goto finish;
		}
		else
			strncpy(radar_name,ptr,4);
	}

/*
 *	Open the radar info file.
 *
 *	Look for an environment variable.
 *
 *	If the environmental variable isn't set,  look for the radar file in
 *	the current directory.  If it is set, and the file doesn't exist,
 *	complain and still look for the file in the current directory.
 */

	ptr = (char *)getenv("RADARFILE");
	if ( ptr != NULL )
	{
		fp = fopen(ptr,"r");
		if (fp == NULL)
			perror(ptr);
	}

	if (fp == NULL)
	{
		fp = fopen(default_name,"r");
		if (fp == NULL)
		{
			printf("WARNING:  can't find a valid '%s' file\n",
				default_name);
			goto finish;
		}
	}

	fgets(line,SIZE,fp);			/* eat header line */

	while( fgets(line,SIZE,fp) != NULL )
	{
		rc = sscanf(line,"%4s %8c %d %d %d %d %d %d %d",
			name,site,&lat1,&lat2,&lat3,&lon1,&lon2,&lon3,&alt);
		if ( rc < 8 || rc > 9 )
		{
			printf("get_radar_info:  %d arguments returned.  ",rc);
			printf("Radarinfo file is corrupt.  Exit.\n");
			exit( 1 );
		}
		if ( rc == 8 )
			alt = MISSING;
#ifdef	DEBUG_RADARINFO
		printf("name %4s site %8.8s lat1 %d lat2 %d lat3 %d ",
			name, site, lat1, lat2, lat3 );
		printf("lon1 %d lon2 %d lon3 %d alt %d\n",
			lon1, lon2, lon3, alt );
#endif
		if (strncmp( radar_name, name, 4 ) == 0)
		{
			strncpy(site_name, site, 8);
			break;
		}
	}

	fclose(fp);

	lat = dms_df( lat1, lat2, lat3 );
	lon = dms_df( lon1, lon2, lon3 );

	if ( lat == 0 )
		printf("WARNING:  radar '%s' not found in data file\n",
			radar_name);

finish:	;

	if ( lat == 0 )
		printf("WARNING:  latitude and longitude set to 0\n");
#ifdef	DEBUG_A2IO
	printf("\nRadar:	%-4.4s\nSite:	%-8.8s\nLat.:	%f\nLong.:	%f\n\n",
		radar_name, site_name, lat/100000., lon/100000.);
#endif	/* DEBUG_A2IO */

	return;
}
/*
 *    Convert degrees, minutes, seconds to an integer (floating point
 *    value times 100000).
 */

int dms_df(a,b,c)
int a,b,c;
{
      float tmp;
      int ans;

      tmp = ( (float) a + (float) b / 60.0 + (float) c / 3600.0 );

      ans = (int) ( tmp * 100000 );

      return( ans );
}