
/*
	kcomp.c

	reads klein '.dat' files and makes the '.phd' files
	then '.bhd' files.

*/
#include <stdio.h>
#include <string.h>
#include <math.h>

#define DP100M 0.0009009
#define DEG_RAD 0.01745329251				/* converts degrees to radians */
#define DEG_M   111120		/* converts degrees to meters -- 60 nmiles */
#define FILE_HEADER 5120
#define HEADER 32
#define DATA 404
#define TRAILER 4
#define NUMPTS 50
#define MAXHDR 100
#define PIXSIZE 0.5
#define MAX_NUM 300
#define S_SIZE 40
#define HALFWIDE 100

#define BLACK    0
#define D_GREY   1
#define M_GREY   2
#define L_GREY   3
#define WHITE    4
#define BUFF     5
#define RED      6
#define ORANGE   7
#define YELLOW   8
#define GREEN    9
#define CYAN     10
#define BLUE     11
#define PURPLE   12
#define MAGENTA  13
#define BROWN    14
#define D_GREEN  15

int VGAColor[16][3]=
{
	{  0,   0,   0},
	{ 46,  46,  46},
	{128, 128, 128},
	{191, 191, 191},
	{255, 255, 255},
 	{105,  90,  75},
	{255,  0,  0},
	{255,121,  0},
	{255,179,  0},
	{255,245,  0},
	{184,255,  0},
	{ 87,255,  0},
	{  0,255,166},
	{  0,200,255},
	{  0,111,255},
	{  0,  0,255}
};
double Pixsize=21.53;
double CLat=42.386996;
double CLon=-70.806298;
double Xc,Yc,Xs,Ys;
double Kx,Ky;		/* pixels/degree */
double Xk,Yk;		/* degrees/pixel */
double Lat1,Lon1;	/* upper left corner */
double Ax,By;		/* -Kx*Lon1 , Ky*Lat1 */
struct file_id
{
	char name[S_SIZE];
	long size;
	unsigned date,time;
};
extern struct file_id GF_File[MAX_NUM];
extern int GF_Order[MAX_NUM];
struct   Color 
{ 
	unsigned char  r, g, b; 
}Lut[256]; 
struct board
{
	int row,col,color;
}B_Id;
int ScreenXs=640,ScreenYs=480,VideoType='X';
unsigned char Buffer[4096],DBuff[1024],HBuff[256];
struct br_header
{
	double lat,lon;
	float heading,px,py;
	char mo,da,yr,hr,min,sec,tsec,status;
}B;
struct b_header
{
	double maxlat,minlat,maxlon,minlon;
	double pixsize;
	long row,col,file_hdr,line_hdr,line_data,line_tlr;
	int mean,min,perc10,perc25,median,perc75,perc90,max; /* pixel values */
	int numavg,numhdg;
	char space[96];	/* space for future expansion */
}C;
int Asn[256];
FILE *FpHdr,*FpDat;
double MaxLat,MinLat,MaxLon,MinLon,Row,Col;

main(argc,argv)

int argc;
char *argv[];

{
	int i,i1,j,k;
	int numfiles;
	char ans;
	FILE *fpin,*fpout;

	do
	{
		printf("\n\n   1 -- scan headers\n");
		printf("   2 -- plot tracks\n");
		printf("   3 -- plot data\n");
		printf("\n   x -- exit program\n\n");
		ans=getch();
		if(ans=='1')
		{
			scan_files();
		}
		if(ans=='2')
		{
			plot_track();
		}
		if(ans=='3')
		{
			video_on();
			set_lut();
			fpin=fopen("kplot.xmg","rb");
			if(fpin)
			{
				fread((char *)&CLat,sizeof(double),1,fpin);
				fread((char *)&CLon,sizeof(double),1,fpin);
				fread((char *)&Pixsize,sizeof(double),1,fpin);
				for(i=0;i<ScreenYs;i++)
				{
					fread((char *)Buffer,sizeof(char),ScreenXs,fpin);
					plotrow(0,0,ScreenXs-1,i,Buffer);
				}
				fclose(fpin);
				set_map();
			}
			else
			{
				plot_data();
				fpout=fopen("kplot.xmg","wb");
				if(!fpout)
				{
					SetVideoMode(0,&B_Id);
					return(0);
				}
				fwrite((char *)&CLat,sizeof(double),1,fpout);
				fwrite((char *)&CLon,sizeof(double),1,fpout);
				fwrite((char *)&Pixsize,sizeof(double),1,fpout);
				for(i=0;i<ScreenYs;i++)
				{
					getrow(0,0,ScreenXs-1,i,Buffer);
					fwrite((char *)Buffer,sizeof(char),ScreenXs,fpout);
				}
				fclose(fpout);
			}
			do
			{
				ans=zoom();
				if(ans!=27)
					plot_data();
			}while(ans!=27);
			SetVideoMode(0,&B_Id);
		}
	}while(ans!='x');
}

/***********************************************************************
**
**
**
**
************************************************************************/

int zoom()

{
	int i,j,k;
	int xc=ScreenXs/4,yc=ScreenYs/4,xs=ScreenXs/2,ys=ScreenYs/2;
	int speed=16;
	double dxs=xs,dys=ys,dspeed=1.26;
	double clat,clon,pixsize=Pixsize/2,x,y;
	char ans,ans2;

	tbox_val(0,xc,yc,xs,ys,Buffer,BLACK,WHITE,64);
	do
	{
		ans=getch();
		unbox(0,xc,yc,xs,ys,Buffer);		
		if(ans==0)
		{
			ans2=getch();
			if(ans2==71||ans2==72||ans2==73)
				yc-=speed;
			if(ans2==79||ans2==80||ans2==81)
				yc+=speed;
			if(ans2==71||ans2==75||ans2==79)
				xc-=speed;
			if(ans2==73||ans2==77||ans2==81)
				xc+=speed;
			if(xc<0)
				xc=0;
			if(yc<0)
				yc=0;
			if((xc+xs)>=ScreenXs)
				xc=ScreenXs-xs;
			if((yc+ys)>=ScreenYs)
				yc=ScreenYs-ys;
		}
		if(ans=='l'&&xs<ScreenXs)
		{
			dxs*=dspeed;
			dys*=dspeed;
			pixsize*=dspeed;
		}
		if(ans=='s'&&pixsize>0.50)
		{
			dxs/=dspeed;
			dys/=dspeed;
			pixsize/=dspeed;
		}
		xs=dxs;
		ys=dys;
		if(ans=='+'&&speed<128)
			speed*=2;
		if(ans=='-'&&speed>1)
			speed/=2;
		tbox_val(0,xc,yc,xs,ys,Buffer,BLACK,WHITE,64);
	}while(ans!=13&&ans!=27);
	unbox(0,xc,yc,xs,ys,Buffer);
	if(ans!=27)
	{
		x=xc+xs/2;
		y=yc+ys/2;
		xy_ll(x,y,&CLat,&CLon);
		Pixsize=pixsize;
	}
	return(ans);
}





/***********************************************************************
**
**
**
**
************************************************************************/

int plot_data()

{
	int i,i1,j,k,m;
	int numfiles;
	double x,y,lat,lon,dx,dy;
	FILE *fpdat;
	char string[100];
	long line_skip=0,pixel_space=0;
	long Bsize=sizeof(struct br_header),Csize;
	float dv,v;
	int hdr,dat,val;

	numfiles=load_names("*.bhd");
	sort_name(numfiles);
	set_map();

	paint_box(0,BUFF,Buffer,0,0,ScreenXs,ScreenYs);
	for(i=0;i<numfiles;i++)
	{
		i1=GF_Order[i];
		FpHdr=fopen(GF_File[i1].name,"rb");
		strcpy(string,GF_File[i1].name);
		for(k=0;k<strlen(string);k++)
			if(string[k]=='.')
				string[k]='\0';
		strcat(string,".dat");
		fpdat=fopen(string,"rb");
		if(FpHdr&&fpdat)
		{
			fread((char *)&C,sizeof(struct b_header),1,FpHdr);
			if(C.minlon<MaxLon&&C.maxlon>MinLon&&
				C.minlat<MaxLat&&C.maxlat>MinLat)
			{
				hdr=C.line_hdr;
				dat=C.line_data+C.line_tlr;
				Csize=C.col;
				fseek(fpdat,C.file_hdr,SEEK_SET);
				line_skip=(Pixsize/C.pixsize)/2.0-1.0;
				pixel_space=(Pixsize/C.pixsize)/1.5;
				if(C.min<C.max)
				{
					for(m=0;m<=C.min;m++)
						Asn[m]=16;
					dv=64.0/(float)(C.max-C.min);
					v=16.0;
					for(m=C.min;m<C.max;m++)
					{
						Asn[m]=v;
						v+=dv;
					}
					for(m=C.max;m<256;m++)
						Asn[m]=79;
				}
				else
					for(m=0;m<256;m++)
						Asn[m]=m/4+16;
				if(line_skip<0)
					line_skip=0;
				if(pixel_space<1)
					pixel_space=1;
				while(fread((char *)&B,sizeof(struct br_header),1,FpHdr)>0)
				{
					if(kbhit()>0)
					{
						if(getch()==27)
						{
							fclose(FpHdr);
							fclose(fpdat);
							return(0);	
						}
					}
					if(line_skip>0)
					{
						fseek(fpdat,line_skip*Csize,SEEK_CUR);
						fseek(FpHdr,line_skip*Bsize,SEEK_CUR);
					}
					if(B.lat>MinLat&&B.lat<MaxLat&&B.lon>MinLon&&B.lon<MaxLon)
					{
						fread((char *)DBuff,sizeof(char),hdr,fpdat);
						fread((char *)DBuff,sizeof(char),dat,fpdat);
						ll_xy(&x,&y,B.lat,B.lon);
						dx=B.px*C.pixsize/Pixsize;
						dy=-B.py*C.pixsize/Pixsize;
						x-=dx*((float)C.line_data/2.0-.5);
						y-=dy*((float)C.line_data/2.0-.5);
						dy*=pixel_space;
						dx*=pixel_space;
						if(B.status==1)
						{
							for(j=0;j<C.line_data/pixel_space;j++)
							{
								plotpt(0,(int)x,(int)y,Asn[DBuff[j*pixel_space]]);
								x+=dx;
								y+=dy;
							}
						}
						else
							plotpt(0,(int)x,(int)y,79);
					}
					else
						fseek(fpdat,C.col,SEEK_CUR);
				}
			}
			else
			{
				fclose(FpHdr);
				fclose(fpdat);
			}
		}
		fclose(FpHdr);
		fclose(fpdat);
	}
}

/***********************************************************************
**
**
**
**
************************************************************************/

int plot_track()

{
	int i,i1,j,k;
	int numfiles,val;
	double x,y,lat,lon;

	numfiles=load_names("*.bhd");
	sort_name(numfiles);
printf("There are %d '.bhd' files\n",numfiles);
	set_map();
	printf("Hit any key to continue.\n\n");
	getch();
	video_on();
	set_lut();
	paint_box(0,BUFF,Buffer,0,0,ScreenXs,ScreenYs);
	for(i=0;i<numfiles;i++)
	{
		i1=GF_Order[i];
		FpHdr=fopen(GF_File[i1].name,"rb");
		if(FpHdr)
		{
			fread((char *)&C,sizeof(struct b_header),1,FpHdr);
			while(fread((char *)&B,sizeof(struct br_header),1,FpHdr)>0)
			{
				if(kbhit()>0)
				{
					val=getch();
					if(val==27)
						return(-2);
				}
				ll_xy(&x,&y,B.lat,B.lon);
				if(B.status==1)
					plotpt(0,(int)x,(int)y,47);
				else
					plotpt(0,(int)x,(int)y,79);
			}
		}
		fclose(FpHdr);
	}
	getch();
	SetVideoMode(0,&B_Id);
}

/***********************************************************************
**
**
**
**
************************************************************************/

int set_map()

{
	double xc,yc,xs,ys,cosclat;
	double screenxs=ScreenXs,screenys=ScreenYs;

	cosclat=cos(CLat*DEG_RAD);
	Xs=Pixsize;					/* meters/pixel */
	Ys=Pixsize;					/* meder0 ‡®Ä0|  þf&€ˆçÃÇgŒ ,3‰¬¼Îü&IÃ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                *********************************** */

int set_lut(type,filename)

char type,*filename;

{
	int i,j,k;

	for(i=0;i<16;i++)
	{
		Lut[i].r=VGAColor[i][0];
		Lut[i].g=VGAColor[i][1];
		Lut[i].b=VGAColor[i][2];
	}
	for(i=0;i<64;i++)
	{
		Lut[i+16].r=i*4;
		Lut[i+16].g=i*4;
		Lut[i+16].b=i*4;
	}
	WritePalette(Lut);
	return(1);
}



                          