#include #include #include /***** Byte SWAP operation for Sun-Solaris etc. (Big Endian) *****/ /***** or NOSWAP operation for LINUX or Windows (Little Endian) *****/ /***** as the data is recorded in Little Endian byte-order *****/ /* double dconv(char *str) { char d[8]; int i; for(i=8;i>0;) d[--i]=*str++; return(*(double *)d); } double fconv(char *str) { char f[4]; int i; for(i=4;i>0;) f[--i]=*str++; return(*(float *)f); } */ double dconv(char *str) { return(*(double *)str); } double fconv(char *str) { return(*(float *)str); } /**/ void cvdtm(double dv, char *sdt, char *stm) { int h, m, day, mth, y, yy; float s; int ndm[13]={0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}; dv -= 3029497200.; day = (int)(dv/86400.); dv -= day*86400.; m = (int)(dv/60.); s = dv - m*60.; h = m/60; m -= h*60; yy = day/1461; day -= yy*1461; yy = 2000 + yy*4; y = (day-1)/365; if ((y == 0) && (day < 60)) { if (day < 31) { mth = 1; day++; } else { mth = 2; day -= 30; } } else { day -= (y*365+1); yy += y; for (mth=1; mth<13; mth++) { if (day < ndm[mth]) break; } if (mth > 12) day = 99; else day = day - ndm[mth-1] + 1; } sprintf(sdt, "%04i%02i%02i", yy,mth,day); sprintf(stm, "%02i:%02i:%05.2f", h,m,s); } main(int argc, char *argv[]) { char head[232], spec[4], data[64], gps[30]; char wdr[80], flog[80], fnam[80], fout[80], buf[80], sdt[10], stm[13]; double dv1,dv2,dv3,dv4, slp[8], off[8], tmag; float fv; int l, li, i; FILE *fp, *fp2; fprintf(stderr, "ALOG2ASC: Convert AM binary raw data into ASCII form\n"); opnpinc(argc, argv); l = 50; li = lwkdir_(&l, wdr); strcpy(flog, wdr); strcpy(fnam, wdr); strcpy(fout, wdr); l = 80 - li; gparma("Enter LOG filename ==> ", l, &flog[li]); gparma("Enter Input filename ==> ", l, &fnam[li]); if ((fp=fopen(fnam, "r")) == NULL) { abendm_("input file open fail", (size_t)20); } gparma("Enter Output filename ==> ", l, &fout[li]); if ((fp2=fopen(fout, "w")) == NULL) { abendm_("output file open fail", (size_t)21); } clspin(); fprintf(stdout, "----------------------------------------\n"); fprintf(stdout, "ALOG2ASC: Convert AM binary raw data into ASCII form\n"); fprintf(stdout, " Input filename : %s\n", fnam); fprintf(stdout, " Output filename : %s\n", fout); if (fread(head,1,232,fp) < 232) { abendm_("input file EOF", (size_t)14); } dv1 = dconv(&head[0]); dv2 = dconv(&head[8]); dv3 = dconv(&head[16]); cvdtm(dv2,sdt,stm); fprintf(fp2, "//alog2asc v.2003-11-26 by T. Nakatsuka\n"); fprintf(fp2, "//InputDataFilename: %s\n", fnam); fprintf(fp2, "/AlogVersion %6.4lf\n", dv1); fprintf(fp2, "/DateTime: %s %s (JulianDay: %3.0lf)\n", sdt,stm,dv3); dv1 = dconv(&head[24]); dv2 = dconv(&head[32]); dv3 = dconv(&head[40]); fprintf(fp2, "/Date: %04.0lf - %02.0lf - %02.0lf\n", dv1,dv2,dv3); dv1 = dconv(&head[48]); dv2 = dconv(&head[56]); dv3 = dconv(&head[64]); dv4 = dconv(&head[72]); fprintf(fp2, "/Time: %02.0lf : %02.0lf : %02.0lf+%5.3lf\n", dv1,dv2,dv3,dv4); dv1 = dconv(&head[80]); dv2 = dconv(&head[88]); dv3 = dconv(&head[96]); if (dv1 == 0.) fprintf(fp2, "/SensorType: 0(Cesium)\n"); else if (dv1 == 1.) fprintf(fp2, "/SensorType: 1(Potasium)\n"); else fprintf(fp2, "/SensorType: (unknown) %5.2lf\n", dv1); fprintf(fp2, "/Flight#: %2.0lf\n", dv2); fprintf(fp2, "/CyclingInterval: %6.3lf sec\n", dv3); for (i=0; i<8; i++) { slp[i] = dconv(&head[i*16+104]); off[i] = dconv(&head[i*16+112]); fprintf(fp2, "/Analog%d: slope=%9.3lf, offset=%9.3lf\n", i,slp[i],off[i]); } fprintf(fp2, "/ FID SYSTIME t200 MAG"); fprintf(fp2, " FGx FGy FGz"); fprintf(fp2, " Ralt Balt AD6 AD7 AD8"); fprintf(fp2, " UTC LAT LON ALT Q N\n"); while (1) { if (fread(spec,1,4,fp) < 4) break; if (fread(data,1,64,fp) < 64) { abendm_("input file EOF", (size_t)14); } dv1 = dconv(&data[0]); dv2 = dconv(&data[8]); dv3 = dconv(&data[16]); dv4 = dconv(&data[24]); cvdtm(dv2,sdt,stm); tmag = dv4/3.498577; fprintf(fp2, "%7.1lf %s %9.3lf %9.3lf", dv1,stm,dv3,tmag); for (i=0; i<8; i++) { fv = fconv(&data[i*4+32]); fprintf(fp2, " %7.3f", fv); } if (spec[3] != '\0') { if (fread(gps,1,30,fp) < 30) { abendm_("input file EOF", (size_t)14); } dv1 = dconv(&gps[0]); dv2 = dconv(&gps[8]); dv3 = dconv(&gps[16]); fv = fconv(&gps[24]); l = (int)(dv1/10000.); dv1 -= l*4000; l = (int)(dv1/100.); dv1 -= l*40; dv1 /= 3600.; l = (int)dv2/100.; dv2 /= 60.; dv2 -= l*2./3.; l = (int)dv3/100.; dv3 /= 60.; dv3 -= l*2./3.; fprintf(fp2, " %8.5lf %9.5lf %10.5lf %7.2f %2d %2d\n", dv1,dv2,dv3,fv,gps[28],gps[29]); } else fprintf(fp2, " * * * * * *\n"); } fclose(fp2); fclose(fp); if (flog[li] != '\0') { fp2 = fopen(flog, "a"); fprintf(fp2, "\n\n"); fprintf(fp2, "ALOG2ASC: Convert AM binary raw data into ASCII form\n"); fprintf(fp2, " Input filename ==> %s\n", fnam); fprintf(fp2, " Output filename ==> %s\n", fout); fprintf(fp2, "=============== %s===============\n", strdtm()); fclose(fp2); } fprintf(stderr, " Completed.\n"); exit(0); }