#include "stdio.h" #include "stdlib.h" #include "../include/string.h" #include "../include/astring.h" #include "../include/flatfile.h" #include "../include/amag.h" void main(int argc, char *argv[]) { char ff_var[100],ff_units[100],ff_source[100],ff_type[100]; char ff_notes[300], filein[100], fileout[100]; char stat[4], c[16]; float dataout[4], cal, c1, c2, hf, ef, zf; double uttime,basetime, testt, testt2; int i,j,k,itime[6], cfile, nfiles, itest[6]; int error, unit, nvar, done, sa, ich, ical, ic[16]; long orow, lpos, pos; FILE *fpin; if (argc < 2) { printf("Enter filename to convert : "); gets(filein); nfiles = 1; } else { nfiles = argc - 1; strcpy(filein, argv[1]); } for (cfile=1;cfile<=nfiles;cfile++) { if (cfile > 1) strcpy(filein,argv[cfile]); fpin = fopen(filein,"rb"); orow = 0; error = 0; fseek(fpin,0,SEEK_END); lpos = ftell(fpin); fseek(fpin,0,SEEK_SET); for (i=0;i<16;i++) c[i] = getc(fpin); for (i=0;i<16;i++) ic[i] = (int)(c[i]); for (i=0;i<16;i++) if (ic[i] < 0) ic[i] = ic[i]+256; for (i=0;i<6;i++) { itime[i] = ic[i]; } if (itime[0] > 1900) { itime[0] = itime[0] - 1900; if (itime[0] >= 100) { itime[0] = itime[0] - 100; } if (itime[0] < 65) { itime[0] = itime[0] + 100; } } basetime = c_i_to_r(itime); sa = ic[6]*256 + ic[7]; ich = ic[8]; ical = ic[9]*256 + ic[10]; cal = ical/65535.0/10.0; /* printf("sa,ich,ical,cal : %d %d %d %f\n",sa/100,ich,ical,cal); fprintf(stderr, "ic[7] = %d %d %d %d\n",ic[7],ic[8],ic[9],ic[10]); */ for (i=0;i<16;i++) c[i] = getc(fpin); for (i=0;i<3;i++) stat[i] = c[i]; stat[3] = '\0'; /* station name changes */ change_station_name(stat); hf = 1.0; ef = 1.0; zf = 1.0; if (strpos(stat,"BRV") >= 0) zf = -1.0; if (strpos(stat,"LEM") >= 0) zf = -1.0; if (strpos(stat,"DRW") >= 0) zf = -1.0; if (strpos(stat,"BIK") >= 0) zf = -1.0; if (strpos(stat,"MCQ") >= 0) zf = -1.0; if (strpos(stat,"DLB") >= 0) zf = -1.0; if (strpos(stat,"WEP") >= 0) { itest[0] = 91; itest[1] = 01; itest[2] = 31; itest[3] = 05; itest[4] = 00; itest[5] = 00; testt = c_i_to_r(itest); if (basetime > testt) zf = -1.0; } if (strpos(stat,"CBI") >= 0) ef = -1.0; if (strpos(stat,"WWK") >= 0) { zf = -1.0; ef = -1.0; } /* not confirmerd - but southern hemisphere stations */ if (strpos(stat,"PTN") >= 0) zf = -1.0; if (strpos(stat,"WTK") >= 0) zf = -1.0; if (strpos(stat,"KAT") >= 0) zf = -1.0; if (strpos(stat,"CAN") >= 0) zf = -1.0; if (strpos(stat,"ADL") >= 0) zf = -1.0; if (strpos(stat,"ASA") >= 0) zf = -1.0; if (strpos(stat,"LEM") >= 0) { itest[0] = 91; itest[1] = 10; itest[2] = 30; itest[3] = 0; itest[4] = 0; itest[5] = 0; testt = c_i_to_r(itest); if (basetime > testt) { itest[0] = 91; itest[1] = 11; itest[2] = 19; itest[3] = 23; itest[4] = 59; itest[5] = 59; testt2 = c_i_to_r(itest); if (basetime < testt2) { basetime = basetime + 2.0*3600.0; } } } if (strpos(stat,"BRV") >= 0) { itest[0] = 91; itest[1] = 11; itest[2] = 2; itest[3] = 0; itest[4] = 0; itest[5] = 0; testt = c_i_to_r(itest); if (basetime > testt) { itest[0] = 91; itest[1] = 11; itest[2] = 16; itest[3] = 23; itest[4] = 59; itest[5] = 59; testt2 = c_i_to_r(itest); if (basetime < testt2) { basetime = basetime - 1.0*3600.0; } } } if (strpos(stat,"BRV") >= 0) { itest[0] = 92; itest[1] = 11; itest[2] = 24; itest[3] = 0; itest[4] = 0; itest[5] = 0; testt = c_i_to_r(itest); if (basetime > testt) { itest[0] = 91; itest[1] = 12; itest[2] = 7; itest[3] = 23; itest[4] = 59; itest[5] = 59; testt2 = c_i_to_r(itest); if (basetime < testt2) { basetime = basetime - 10.0*3600.0; } } } if (strpos(stat,"ADL") >= 0) { itest[0] = 93; itest[1] = 11; itest[2] = 25; itest[3] = 0; itest[4] = 0; itest[5] = 0; testt = c_i_to_r(itest); if (basetime > testt) { itest[0] = 93; itest[1] = 12; itest[2] = 6; itest[3] = 23; itest[4] = 59; itest[5] = 59; testt2 = c_i_to_r(itest); if (basetime < testt2) { basetime = basetime + 1.0*3600.0; } } } if (strpos(stat,"KOT") >= 0) { itest[0] = 93; itest[1] = 12; itest[2] = 7; itest[3] = 0; itest[4] = 0; itest[5] = 0; testt = c_i_to_r(itest); if (basetime > testt) { itest[0] = 94; itest[1] = 1; itest[2] = 17; itest[3] = 23; itest[4] = 59; itest[5] = 59; testt2 = c_i_to_r(itest); if (basetime < testt2) { basetime = basetime + 2.0*3600.0; } } } if (strpos(stat,"CBI") >= 0) { itest[0] = 94; itest[1] = 1; itest[2] = 18; itest[3] = 0; itest[4] = 0; itest[5] = 0; testt = c_i_to_r(itest); if (basetime > testt) { itest[0] = 94; itest[1] = 1; itest[2] = 22; itest[3] = 23; itest[4] = 59; itest[5] = 59; testt2 = c_i_to_r(itest); if (basetime < testt2) { basetime = basetime - 9.0*3600.0; } } } if (strpos(stat,"CBI") >= 0) { itest[0] = 94; itest[1] = 3; itest[2] = 18; itest[3] = 0; itest[4] = 0; itest[5] = 0; testt = c_i_to_r(itest); if (basetime > testt) { itest[0] = 94; itest[1] = 4; itest[2] = 27; itest[3] = 23; itest[4] = 59; itest[5] = 59; testt2 = c_i_to_r(itest); if (basetime < testt2) { basetime = basetime + 24.0*3600.0; } } } if (strpos(stat,"WEP") >= 0) { itest[0] = 94; itest[1] = 03; itest[2] = 17; itest[3] = 0; itest[4] = 0; itest[5] = 0; testt = c_i_to_r(itest); if (basetime > testt) { itest[0] = 94; itest[1] = 4; itest[2] = 18; itest[3] = 23; itest[4] = 59; itest[5] = 59; testt2 = c_i_to_r(itest); if (basetime < testt2) { basetime = basetime + 6.0*3600.0; } } } if (strpos(stat,"WEP") >= 0) { itest[0] = 94; itest[1] = 4; itest[2] = 21; itest[3] = 0; itest[4] = 0; itest[5] = 0; testt = c_i_to_r(itest); if (basetime > testt) { itest[0] = 94; itest[1] = 7; itest[2] = 29; itest[3] = 23; itest[4] = 59; itest[5] = 59; testt2 = c_i_to_r(itest); if (basetime < testt2) { basetime = basetime + 6.0*3600.0; } } } if (strpos(stat,"BRV") >= 0) { itest[0] = 95; itest[1] = 3; itest[2] = 24; itest[3] = 0; itest[4] = 0; itest[5] = 0; testt = c_i_to_r(itest); if (basetime > testt) { itest[0] = 95; itest[1] = 5; itest[2] = 6; itest[3] = 23; itest[4] = 59; itest[5] = 59; testt2 = c_i_to_r(itest); if (basetime < testt2) { basetime = basetime + 24.0*3600.0; } } } if (strpos(stat,"ADL") >= 0) { itest[0] = 95; itest[1] = 4; itest[2] = 7; itest[3] = 0; itest[4] = 0; itest[5] = 0; testt = c_i_to_r(itest); if (basetime > testt) { itest[0] = 95; itest[1] = 4; itest[2] = 9; itest[3] = 23; itest[4] = 59; itest[5] = 59; testt2 = c_i_to_r(itest); if (basetime < testt2) { basetime = basetime + 1.0*3600.0; } } } if (strpos(stat,"ADL") >= 0) { itest[0] = 95; itest[1] = 4; itest[2] = 27; itest[3] = 0; itest[4] = 0; itest[5] = 0; testt = c_i_to_r(itest); if (basetime > testt) { itest[0] = 95; itest[1] = 4; itest[2] = 29; itest[3] = 23; itest[4] = 59; itest[5] = 59; testt2 = c_i_to_r(itest); if (basetime < testt2) { basetime = basetime + 1.0*3600.0; } } } if (strpos(stat,"ADL") >= 0) { itest[0] = 95; itest[1] = 5; itest[2] = 23; itest[3] = 0; itest[4] = 0; itest[5] = 0; testt = c_i_to_r(itest); if (basetime > testt) { itest[0] = 95; itest[1] = 5; itest[2] = 25; itest[3] = 23; itest[4] = 59; itest[5] = 59; testt2 = c_i_to_r(itest); if (basetime < testt2) { basetime = basetime + 1.0*3600.0; } } } if (strpos(stat,"CBI") >= 0) { itest[0] = 95; itest[1] = 11; itest[2] = 1; itest[3] = 0; itest[4] = 0; itest[5] = 0; testt = c_i_to_r(itest); if (basetime > testt) { itest[0] = 95; itest[1] = 12; itest[2] = 9; itest[3] = 23; itest[4] = 59; itest[5] = 59; testt2 = c_i_to_r(itest); if (basetime < testt2) { basetime = basetime + 12.0*3600.0; } } } strcpy(fileout,mklower(stat)); strcat(fileout,c_int_str(itime[0],2)); strcat(fileout,c_int_str(itime[1],2)); strcat(fileout,c_int_str(itime[2],2)); strcpy(ff_var,"time,"); strcat(ff_var,stat); strcat(ff_var,"H,"); strcat(ff_var,stat); strcat(ff_var,"E,"); strcat(ff_var,stat); strcat(ff_var,"Z"); strcpy(ff_units, "s,nT,nT,nT"); strcpy(ff_source,"from file listed below,same,same,same"); strcpy(ff_type,"T,R,R,R"); strcpy(ff_notes,"Converted from file : "); strcat(ff_notes,filein); nvar = 4; error = mkhead(fileout,nvar,ff_var,ff_units,ff_source, ff_type,ff_notes); if (!error) unit = ffcreate(fileout); if (error || unit == -1) error = 1; if (error) { printf("error in creating flat file. Can not continue.\n"); } else { printf("Writing file %s\n",fileout); } for (j=0;j<14;j++) { for (i=0;i<16;i++) c[i] = getc(fpin); } done = 0; while ((!feof(fpin)) && (!error)) { pos = ftell(fpin); if (lpos-pos <= 0) { done = 1; } if (!done) { for (i=0;i<16;i++) c[i] = getc(fpin); for (i=0;i<3;i++) { c1 = (float)c[i*2]; c2 = (float)c[i*2+1]; if (c1 < 0) c1 = 256.0 + c1; if (c2 < 0) c2 = 256.0 + c2; dataout[i] = c1*256.0 + c2; if (dataout[i] > 32768) dataout[i] = dataout[i] - 65536.0; dataout[i] = dataout[i]*cal; } dataout[0] = dataout[0]*hf; dataout[1] = dataout[1]*ef; dataout[2] = dataout[2]*zf; uttime = basetime + (double) orow; error = fdput(unit,orow,uttime,dataout); if (error) printf("Error in writing data to file.\n"); orow++; if (ich == 4) { for (i=4;i<7;i++) { c1 = (float)c[i*2]; c2 = (float)c[i*2+1]; if (c1 < 0) c1 = 256.0 + c1; if (c2 < 0) c2 = 256.0 + c2; dataout[i-4] = c1*256.0 + c2; if (dataout[i-4] > 32768) dataout[i-4] = dataout[i-4] - 65536.0; dataout[i-4] = dataout[i-4]*cal; } dataout[0] = dataout[0]*hf; dataout[1] = dataout[1]*ef; dataout[2] = dataout[2]*zf; uttime = basetime + (double) orow; error = fdput(unit,orow,uttime,dataout); if (error) printf("Error in writing data to file.\n"); orow++; } } else { error = 1; } } ffclose(unit); close(fpin); } }