#include #include #include #include #include #include #include #define DEG_RAD 0.01745329251 /* converts degrees to radians */ #define DEG_KM 0.009009 /* converts degrees to km */ #define MAX_NUM 1000 #define PAUSE printf("HIT ANY KEY TO CONTINUE.\n");getch() #define SCREEN_WIDTH 160 #define EQLIST 0x410 #define MEMSIZ 0x413 #define NAME_SIZE 100 #define S_SIZE 40 #define F_SIZE 20 #define T_SIZE 15 #define NUMLIST 7 #define MAX_BUFF 32768 #define NUMDAT 50 #define NUM_MAP_FILES 31 #define BLACK 0 #define BACKGROUND 241 #define D_GREY 242 #define M_GREY 243 #define L_GREY 244 #define WHITE 245 #define RED 246 #define ORANGE 247 #define YELLOW 248 #define GREEN 249 #define CYAN 250 #define BLUE 251 #define MAGENTA 252 #define BROWN 253 #define D_CYAN 254 #define D_BLUE 255 extern int LastN; int Rxc,Ryc,Repeat; int LastMap=0; char MapName[20]; struct Color { unsigned char r, g, b; }; extern struct Color lut[256]; extern char VideoType; float Lat0,Lon0,LatN,LonX,Deg_Pix,CosLat,PixSize,DelLat,DelLon; float MFll[5],DelParm[5]={0.0,10.0,10.0,10.0,30.0}; int Bxc,Byc,Bxs,Bys,Hits; struct map_input { char name[100]; float max,min; int color; }; struct help { int lines; char *text[4]; }Help[6]= { {3, "'Enter' to move DOWN", "'Backspace' to move UP", "'Esc' to EXIT 'C' to count hits" }, {4, "box shows Lat/Lon range; arrows to move box", "'+' faster,'-' slower,(s)maller or (l)arger", "(S)horter,(H)igher,(N)arrower or (W)ider", "(Z)oom, (R)eset," }, {3, "<-- --> to position", "up/down arrow to change", "+ = faster - = slower" }, {4, "<-- --> to position", "up/down arrow to change", "+ = faster - = slower" }, {3, "arrows to position", "'*' to select", "", "RED is ON" }, {3, "<-- --> to position", "'*' to select", "", "RED is ON" } }; struct hdr_hdr { float maxlat,minlat,maxlon,minlon; float maxwd,minwd,maxid,minid,maxih,minih; long freq[33]; long mintime,maxtime; long numfiles; }Hhdr; struct short_hdr { char name[12]; float lat,lon; /* degrees */ float w_depth,i_depth,i_height; /* meters */ float ob_freq; /* obs/hr */ long start,stop; /* 85012 = 1985, j-day 12 */ unsigned char parm[10]; }Shdr; FILE *FpHdr; struct data_type { int num_name; char *name[6]; }; extern struct data_type DType[NUMDAT]; struct month { char name[12],id3[4],id2[3]; int days[2]; }d[13]= { {"error","xxx","xx",0,0}, {"January","Jan","JA",31,31}, {"February","Feb","FB",28,29}, {"March","Mar","MR",31,31}, {"April","Apr","AP",30,30}, {"May","May","MY",31,31}, {"June","Jun","JN",30,30}, {"July","Jul","JL",31,31}, {"August","Aug","AG",31,31}, {"September","Sep","SP",30,30}, {"October","Oct","OC",31,31}, {"November","Nov","NV",30,30}, {"December","Dec","DC",31,31} }; int day_tab[2][13]= { { 0,31,28,31,30,31,30,31,31,30,31,30,31}, { 0,31,29,31,30,31,30,31,31,30,31,30,31}, }; extern int Font[128][25]; extern int ScreenXs,ScreenYs; int Monitor; struct equipment { int printers; /* number present */ int sprinter; /* serial printer installed? 0=no 1=yes */ int game; /* game adapter installed? */ int sports; /* number of serial ports */ int dma; /* DMA chip installed? */ int drives; /* number of disk drives */ int video; /* video mode 1=40 color 2=80 color 3=80 B/W */ int disk; /* any disk drives? */ int memory; /* memory size in Kbytes */ }Eq; extern int Red,Green,Orange,Yellow,Green,Cyan,Blue,Magenta; extern int Black,White,L_Grey,M_Grey,D_Grey,Center; extern char GF_String[MAX_NUM][S_SIZE]; extern unsigned char Mbuff[MAX_BUFF],Buffer[4096]; unsigned char BBuff[4096]; struct variable { int row,col; float value; char *format; }; struct text { int row,col; char *txt; }; unsigned char Parm[2][25]; unsigned char Freq[25]; int Fq[17]={-1,0,1,-1,2,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,4}; struct list { int type,row,lines; int numtext; struct text txt[5]; int numvar; struct variable var[4]; }List[NUMLIST]= { { 1,1,4, 5, 1, 1,"Location", 2,13,"Max Lat", 4,13,"Min Lat", 3,23,"Max Lon", 3, 2,"Min Lon", 4, 2,21, 90.0000,"%10.4f", 4,21, -90.0000,"%10.4f", 3,31, 180.0000,"%10.4f", 3,10,-180.0000,"%10.4f" }, { 2,6,2, 5, 6, 1,"Water Depth", 7,23,"Max", 7,34, "m", 7, 9,"Min", 7,20,"m", 2, 7,13, 0,"%5.0f", 7,27, 99999,"%5.0f", 0, 0, 0.0000,"%", 0, 0, 0.0000,"%" }, { 2,9,2, 5, 9, 1,"Instrument Depth", 10,23,"Max", 10,34, "m", 10, 9,"Min", 10,20,"m", 2, 10,13, 0,"%5.0f", 10,27, 99999,"%5.0f", 0, 0, 0.0000,"%", 0, 0, 0.0000,"%" }, { 2,12,2, 5, 12, 1,"Instrument Height" , 13,23,"Max", 13,34, "m", 13, 9,"Min", 13,20,"m", 2, 13,13, 0,"%5.0f", 13,27, 99999,"%5.0f", 0, 0, 0.0000,"%", 0, 0, 0.0000,"%" }, { 3,15,2, 3, 15, 1,"Date" , 16, 9,"Start", 16,26,"Stop", 16, 1,"Any", 16, 1,"All", 3, 16, 1, 1,"%d", 16,15, 82001,"%9.0f", 16,31, 88310,"%9.0f", 0, 0, 0.0000,"%" }, { 4,18,3, 1, 18, 1,"Parameter (must contain all chosen)" , 19,10,"tTCSLAuvuvdsRRvBmpppttnni", 20,10,"iibBeDTLTEdTtTehtwwwTpRds", 0, 0," ", 0, 0," ", 2, 0, 0, 0.0000,"%", 0, 0, 0.0000,"%", 0, 0, 0.0000,"%", 0, 0, 0.0000,"%" }, { 5,22,2, 1, 22, 1,"Observations Per Hour (must be one of chosen)" , 23,10," 1 2 4 8 16 Any", 0, 0," ", 0, 0," ", 0, 0," ", 1, 0, 0, 0.0000,"%", 0, 0, 0.0000,"%", 0, 0, 0.0000,"%", 0, 0, 0.0000,"%" } }; unsigned char Bit[8]={1,2,4,8,16,32,64,128}; int tmouse_vertical_range(){}; int tmouse_horizontal_range(){}; int tmouse_information(){}; int tmouse_show_cursor(){}; int tmouse_move_cursor(){}; int tmouse_hide_cursor(){}; FILE *p_open(char *name,char *format); /*********************************************************************** ** ** ** ** ************************************************************************/ int set_range() { int i,j,k,n=-1,m; int xc=ScreenXs/2,yc=0,xs=ScreenXs/2,ys=ScreenYs; int hxc=0,hyc=ScreenYs-(17*7+3),hxs=xs,hys=17*7+3,hys2=17*4+3; char ans,ans2,string[100]; int back1,text1,box1,var1,high1; int back2,text2,box2,var2,high2; int back3,text3,box3,var3,high3; int numhit,totnum; long jday,yr,date; float dellat,dellon; FILE *fplim; /* current limits */ unsigned char *buffer; LastN=0; set_video_on(); set_lut('D'); SetVideoMode(0); back1=D_Grey;text1=L_Grey;box1=M_Grey;var1=Black;high1=Red; back2=M_Grey;text2=Black;box2=L_Grey;var2=Black;high2=Red; back3=Black;text3=White;box3=Black;var3=L_Grey;high3=Red; reset_range(); set_video_on(); set_lut('D'); paint_box(0,D_Grey,Buffer,xc,yc,xs,ys); paint_box(0,D_Grey,Buffer,hxc,hyc,hxs,hys); plot_help(0,hxc+3,hyc+3+17*4,WHITE); load_limits(MapName); for(i=0;iLat0) { List[0].var[0].value=Lat0; List[0].var[1].value=Lat0-dellat; } if(List[0].var[1].valueLonX) { List[0].var[2].value=LonX; List[0].var[3].value=LonX-dellon; } if(List[0].var[3].valueList[i].var[1].value) List[i].var[0].value=List[i].var[1].value= (List[i].var[0].value+List[i].var[1].value)/2.0; plot_value(i,j,n,box3,var3,xc,yc,high3); } if(i==4&&(ans2==72||ans2==80)) /* date: up/down arrow */ { if(j>0) { date=List[i].var[j].value; yr=date/1000; jday=date%1000; if(ans2==72) jday+=DelParm[i]; if(ans2==80) jday-=DelParm[i]; while(jday>365) { yr+=1; jday-=365; } while(jday<1) { yr-=1; jday+=365; } date=yr*1000+jday; List[i].var[j].value=date; if(List[i].var[0].value>List[i].var[1].value) { m=2; if(j==2) m=1; List[i].var[j].value=List[i].var[m].value; } } else { if(List[i].var[j].value==1.0) List[i].var[j].value=0.0; else List[i].var[j].value=1.0; } plot_value(i,j,n,box3,var3,xc,yc,high3); } if((i==1||i==2||i==3||i==4)&&(ans2==75||ans2==77)) /* <-- --> */ { plot_value(i,j,n,box2,var2,xc,yc,high2); if(ans2==75) j-=1; if(ans2==77) j+=1; if(j<0) j=List[i].numvar-1; if(j>=List[i].numvar) j=0; plot_value(i,j,n,box3,var3,xc,yc,high3); } if(i==5&&(ans2==75||ans2==77)) /* <-- --> */ { plot_value(i,j,n,box2,var2,xc,yc,high2); if(ans2==75) n-=1; if(ans2==77) n+=1; if(n<0) n=24; if(n>24) n=0; plot_value(i,j,n,box3,var3,xc,yc,high3); } if(i==6&&(ans2==75||ans2==77)) /* <-- --> */ { plot_value(i,j,n,box2,var2,xc,yc,high2); if(ans2==75) n-=1; if(ans2==77) n+=1; if(n<0) n=5; if(n>5) n=0; plot_value(i,j,n,box3,var3,xc,yc,high3); } if(i==5&&(ans2==72||ans2==80)) /* up or down arrow */ { plot_value(i,j,n,box2,var2,xc,yc,high2); if(ans2==72) j-=1; if(ans2==80) j+=1; if(j<0) j=1; if(j>1) j=0; plot_value(i,j,n,box3,var3,xc,yc,high3); } } if(i==5&&ans=='*') { if(Parm[j][n]==0) Parm[j][n]=1; else Parm[j][n]=0; plot_value(i,j,n,box2,var2,xc,yc,high2); n+=1; if(n>24) n=0; plot_value(i,j,n,box3,var3,xc,yc,high3); } if(i==6&&ans=='*') { if(Freq[n]==0) Freq[n]=1; else Freq[n]=0; plot_value(i,j,n,box2,var2,xc,yc,high2); n+=1; if(n>5) n=0; plot_value(i,j,n,box3,var3,xc,yc,high3); } if(i==0&&ans=='Z') { plot_map(MapName,0,0,hxs,hyc); plot_box(); } if(ans=='C') { FpHdr=p_open("current.hdr","rb"); plot_cursors(BLACK); mark_cursors(&numhit,&totnum); plot_hits(numhit,totnum); fclose(FpHdr); } if(i==0&&ans=='R') { List[0].var[0].value=Hhdr.maxlat; List[0].var[1].value=Hhdr.minlat; List[0].var[2].value=Hhdr.maxlon; List[0].var[3].value=Hhdr.minlon; for(j=0;j=2.0) DelParm[i]/=2.0; } if(i==0&&(ans=='+'||ans=='-')) { if(ans=='+') { DelLat*=2.0; DelLon*=2.0; } if(ans=='-') { DelLat/=2.0; DelLon/=2.0; } } if(i==0&&(ans=='S'||ans=='H'||ans=='W'||ans=='N'||ans=='s'||ans=='l')) { unplot_box(); if(ans=='s'||ans=='S') { List[0].var[0].value-=DelLat/2.0; List[0].var[1].value+=DelLat/2.0; } if(ans=='H'||ans=='l') { List[0].var[0].value+=DelLat/2.0; List[0].var[1].value-=DelLat/2.0; } if(ans=='N'||ans=='s') { List[0].var[2].value-=DelLon/2.0; List[0].var[3].value+=DelLon/2.0; } if(ans=='W'||ans=='l') { List[0].var[2].value+=DelLon/2.0; List[0].var[3].value-=DelLon/2.0; } while(List[0].var[0].valueLat0) List[0].var[0].value=Lat0; if(List[0].var[1].valueLonX) List[0].var[2].value=LonX; if(List[0].var[3].value99) { fclose(fplbl); return(-1); } sprintf(string,"%s.lbl",name); fplbl=p_open(string,"rt"); if(fplbl) { exist=1; fclose(fplbl); } else exist=0; }while(exist==1); sprintf(string,"%s.lbl",name); fplbl=p_open(string,"wt"); if(!fplbl) return(-2); fprintf(fplbl,"FILE_TYPE = IMAGE\n"); fprintf(fplbl,"IMAGE_LINES = %d\n",ys); fprintf(fplbl,"LINE_SAMPLES = %d\n",xs); fprintf(fplbl,"SAMPLE_BITS = 8\n"); fprintf(fplbl,"PALETTE_POINTER = '%s.pal'\n",name); fprintf(fplbl,"PAL_POINTER = '%s.pal'\n",name); fprintf(fplbl,"IMAGE_POINTER = '%s.dat'\n",name); fprintf(fplbl,"END\n"); fclose(fplbl); sprintf(string,"%s.pal",name); fppal=p_open(string,"wt"); if(!fppal) return(-2); for(i=0;i<256;i++) fprintf(fppal,"%3d %3d %3d %3d\n",i,lut[i].r,lut[i].g,lut[i].b); fclose(fppal); sprintf(string,"%s.dat",name); fpdat=p_open(string,"wb"); if(!fpdat) return(-2); for(i=0;iPixSize&&mi.min<=PixSize) { if(convert_bin(mi.name,mi.color)<-1) break; } } fclose(fpvec); } } if(savemap==1) { for(i=0;i0) { ix=(Shdr.lon-Lon0)*Deg_Pix*CosLat; iy=(Lat0-Shdr.lat)*Deg_Pix; csize=Shdr.i_depth/50+3; box(0,ix-csize,iy-csize,M_GREY,csize*2+1,csize*2+1); } rewind(FpHdr); plot_cursors(BLACK); mark_cursors(&numhit,&totnum); fclose(FpHdr); ScreenXs=sxs; ScreenYs=sys; plot_hits(numhit,totnum); if(savemap==1||readmap==1) fclose(fpmap); } /*********************************************************************** ** ** ** ** ************************************************************************/ int plot_cursors(val) { int i,j,k,f,h; unsigned char uval; int ix,iy; int num=0,hit=0; int good; rewind(FpHdr); fread((char *)&Hhdr,sizeof(struct hdr_hdr),1,FpHdr); while(fread((char *)&Shdr,sizeof(struct short_hdr),1,FpHdr)>0) { ix=(Shdr.lon-Lon0)*Deg_Pix*CosLat; iy=(Lat0-Shdr.lat)*Deg_Pix; cursor(0,ix,iy,val,3); } } /*********************************************************************** ** ** ** ** ************************************************************************/ int mark_cursors(numhit,totnum) int *numhit,*totnum; { int i,j,k,f,h; unsigned char uval; int ix,iy; int num=0,hit=0; int good; rewind(FpHdr); fread((char *)&Hhdr,sizeof(struct hdr_hdr),1,FpHdr); while(fread((char *)&Shdr,sizeof(struct short_hdr),1,FpHdr)>0) { num+=1; good=1; ix=(Shdr.lon-Lon0)*Deg_Pix*CosLat; iy=(Lat0-Shdr.lat)*Deg_Pix; if( Shdr.lat>List[0].var[0].value|| Shdr.latList[0].var[2].value|| Shdr.lonList[1].var[1].value|| Shdr.i_depthList[2].var[1].value|| Shdr.i_heightList[3].var[1].value ) good=0; if( List[4].var[0].value==0.0&& /* Any */ ( Shdr.stop<(long)List[4].var[1].value|| /* min */ Shdr.start>(long)List[4].var[2].value /* max */ ) ) good=0; if( List[4].var[0].value==1.0&& /* All */ ( Shdr.stop<(long)List[4].var[2].value|| /* max */ Shdr.start>(long)List[4].var[1].value /* min */ ) ) good=0; for(i=0;iLonX||mnlt>Lat0||mxln0) { val=getch(); if(val==27) return(-2); } fread((char *)latlon,sizeof(float),2,fp); ix=(latlon[1]-Lon0)*Deg_Pix*CosLat; iy=(Lat0-latlon[0])*Deg_Pix; if(i>0) plotln(3,ix,iy,ixo,iyo,val); ixo=ix; iyo=iy; } } } fclose(fp); fclose(fphdr); return(numplot); } /*********************************************************************** ** ** ** ** ************************************************************************/ int plot_help(i,xc,yc,val) int i,xc,yc,val; { int k; for(k=0;k=0) { LastMap=val; for(k=0;k0) { string[0]=List[i].txt[j+1].txt[k]; string[1]='\0'; plot_font_h(high, xc+2+(List[i].txt[j+1].col+k)*7,yc+List[i].txt[j+1].row*17, string,2,Font); } } } else { paint_box(0,back,Buffer, xc+(List[i].txt[j+1].col+n)*7, yc+List[i].txt[j+1].row*17-2,7,14); string[0]=List[i].txt[j+1].txt[n]; string[1]='\0'; if(Parm[j][n]>0) plot_font_h(high, xc+2+(List[i].txt[j+1].col+n)*7,yc+List[i].txt[j+1].row*17, string,2,Font); else plot_font_h(text, xc+2+(List[i].txt[j+1].col+n)*7,yc+List[i].txt[j+1].row*17, string,2,Font); m=j*25+n; paint_box(0,back,Buffer, xc+11*7,yc+List[i].row*17-2,25*7,16); if(Parm[j][n]>0) plot_font_h(high, xc+2+11*7,yc+List[i].row*17, DType[m].name[1],2,Font); else plot_font_h(text, xc+2+11*7,yc+List[i].row*17, DType[m].name[1],2,Font); } } if(List[i].type==5) { if(n<0) { len=24; paint_box(0,back,Buffer, xc+List[i].txt[j+1].col*7,yc+List[i].txt[j+1].row*17-2,len*7,14); plot_font_h(text, xc+2+List[i].txt[j+1].col*7,yc+List[i].txt[j+1].row*17, List[i].txt[j+1].txt,2,Font); for(k=0;k<6;k++) { if(Freq[k]>0) { strcpy(string,List[i].txt[j+1].txt+k*4); string[4]='\0'; plot_font_h(high, xc+2+(List[i].txt[j+1].col+k*4)*7,yc+List[i].txt[j+1].row*17, string,2,Font); } } } else { paint_box(0,back,Buffer, xc+(List[i].txt[j+1].col+n*4)*7, yc+List[i].txt[j+1].row*17-2,28,16); strcpy(string,List[i].txt[j+1].txt+n*4); string[4]='\0'; if(Freq[n]>0) plot_font_h(high, xc+2+(List[i].txt[j+1].col+n*4)*7,yc+List[i].txt[j+1].row*17, string,2,Font); else plot_font_h(text, xc+2+(List[i].txt[j+1].col+n*4)*7,yc+List[i].txt[j+1].row*17, string,2,Font); } } } /******************************************************************** ** ** ** ********************************************************************* */ int month_day(year,yearday,pmonth,pday) int year, yearday,*pmonth,*pday; { int i,leap; *pmonth=*pday=0; if(yearday<1)return(-1); /* year day too low */ leap=year%4==0&&year%100!=0||year%400==0; if(leap==0&&yearday>365)return(-1); /* day to large */ if(leap==1&&yearday>366)return(-1); for(i=1;yearday>day_tab[leap][i];i++) yearday-=day_tab[leap][i]; *pmonth=i; *pday=yearday; return(0); } /******************************************************************** ** ** ** ********************************************************************* */ int day_of_year(year,month,day) int year,month,day; { int i,leap; if(month<1||month>12)return(-1); /* invalid month */ leap=year%4==0&&year%100!=0||year%400==0; if(day<1||day>day_tab[leap][month])return(-2); /* invalid day */ for(i=1;i=0 -- number of file chosen = n of String[n] ** ** ********************************************************************* */ int get_cur_name(file_id,file_name) char *file_id,*file_name; { int i,j,k; int num_files; int val=-2,start=LastN; char string[NAME_SIZE],file[F_SIZE],type[T_SIZE],directory[NAME_SIZE]; int t=0,d=0,ls=-1; Monitor=check_equip(&Eq); for(i=0;i0) { d=1; strcpy(directory,file_id); directory[ls+1]='\0'; } else directory[0]='\0'; num_files=Hits; if(num_files<0) return(num_files); else { ClearBox(40,79,0,0,112); sprintf(string,"file ob start stop depth num"); WriteStringAtxy(40,0,39,(char)112,string); val=scroll_list(40,1,40,21,GF_String,num_files,file_name,LastN); LastN=val; if(val>=0) { sscanf(file_name,"%s%s",file,type); if(file_name[9]!=' ') t=1; if(d==1) { strcpy(file_name,directory); strcat(file_name,file); } else strcpy(file_name,file); if(t==1) { strcat(file_name,"."); strcat(file_name,type); } if(file_name[strlen(file_name)-1]=='.') file_name[strlen(file_name)-1]='\0'; } } return(val); }