#include #include #include void opnpinc(int argc, char *argv[]); void clspin(); void gparma(char *str, int lnam, char *nam); char *strdtm(); int lwkdir_(int *len, char *dnm, size_t ls); void abendm_(char *ems, size_t len); /***** 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, double *secd) { int day, mth, y, yy; 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.; *secd = dv; 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); } void cvhms(double secd, char *stm) { int h, m; float s; m = (int)(secd/60.); s = secd - m*60.; h = m/60; m -= h*60; sprintf(stm, "%02i:%02i:%05.2f", h,m,s); } int main(int argc, char *argv[]) { char head[232], spec[4], data[64], gps[30]; char wdr[80], flog[80], fnam[80], fout[80], sdt[10], stm[13], tz[6]; double dv1,dv2,dv3,dv4, slp[8], off[8], tmag, secd, secg, tdif; int l, li, i, j, nh, nm, tzsec, np; float dif, fv; FILE *fp, *fp2; opnpinc(argc, argv); fprintf(stderr, "ALOG2ASC: Convert AM binary raw data into ASCII form\n"); l = 50; li = lwkdir_(&l, wdr, 80); wdr[li] = '\0'; 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, "rb")) == 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); } gparma("Localtime-Zone string ? \"[+/-]HHMM\" [default: +0900] ==> ", 6, tz); if (strlen(tz) == 0) strcpy(tz, "+0900"); if ((tz[0] != '+') && (tz[0] != '-')) abendm_("invalid timezone specification", (size_t)30); for (i=1,j=0; i<5; i++) { if ((tz[i] < '0') || (tz[i] > '9')) abendm_("invalid timezone specification", (size_t)30); j = j*10 + (tz[i] - '0'); if (i == 2) { nh = j; j = 0; } if (i == 4) { nm = j; j = 0; } } if ((nh>23) || (nm>59)) abendm_("invalid timezone specification", (size_t)30); tzsec = nh*3600 + nm*60; if (tz[0] == '-') tzsec = -tzsec; 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); fprintf(stdout, " Localtime zone : %s\n", tz); fprintf(stdout, " GPS-UTC will be converted into LTsec\n"); /******** Correct PC-Time data by GPS *********/ printf("First scanning Time data offset\n"); np = 0; tdif = 0.; if (fread(head,1,232,fp) < 232) { abendm_("input file EOF", (size_t)14); } while (1) { if (fread(spec,1,4,fp) < 4) break; if (fread(data,1,64,fp) < 64) { abendm_("input file EOF", (size_t)14); } dv2 = dconv(&data[8]); cvdtm(dv2,sdt,&secd); if (spec[3] != '\0') { if (fread(gps,1,30,fp) < 30) { abendm_("input file EOF", (size_t)14); } dv1 = dconv(&gps[0]); l = (int)(dv1/10000.); dv1 -= l*4000; l = (int)(dv1/100.); dv1 -= l*40; // now 'dv1' is UTCsec secg = dv1 + tzsec; if (secg < 0.) secg += 86400.; if (secg >= 86400.) secg -= 86400.; // 'secg': UTCsec 'dv1' is converted into Localtime-sec // This 'secg' value is compared with PC system time 'secd' // to evaluate the PC system time data accuracy, // assuming data do not include near-midnight ones. np++; dif = secg-secd; tdif += dif; if ((dif < -1000.) || (dif > +1000.)) { abendm_("Mistaken TimeZone or Abnormal Time data", (size_t)39); } } } if (np == 0) { printf(" PC-Time data will be conserved\n"); printf(" because GPS data do not contain any reliable ones\n"); } else { tdif /= (double)np; tdif = (double)(int)(tdif*100.) / 100.; printf(" PC-Time data will be Shifted by %+.2f sec.\n", tdif); } rewind(fp); /**********************************************/ 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,&secd); cvhms(secd, stm); fprintf(fp2, "//alog2asc v.2017-10-16 by T. Nakatsuka\n"); fprintf(fp2, "//InputDataFilename: %s\n", fnam); if (np == 0) { fprintf(fp2, "//PC-Time data were conserved.\n"); } else { fprintf(fp2, "//PC-Time data were Shifted by %+.2f sec.\n", tdif); } 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, "/GPS-UTC was converted into LTsec of Timezone %s\n", tz); fprintf(fp2, "/ FID SYSTIME t200 MAG"); fprintf(fp2, " FGx FGy FGz"); fprintf(fp2, " Ralt Balt AD6 AD7 AD8"); fprintf(fp2, " LTsec 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,&secd); if (((secd+tdif) < 0.) || ((secd+tdif) > 86399.9)) { fprintf(stderr, "*** secd : %.2f + tdif(%.2f)\n", secd, tdif); abendm_("illegal Time data (< 0H or >= 24H)", (size_t)37); } secd += tdif; cvhms(secd,stm); tmag = dv4/3.498577; fprintf(fp2, "%7.1lf %11s %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; // now 'dv1' is UTCsec secg = dv1 + tzsec; if (secg < 0.) secg += 86400.; if (secg >= 86400.) secg -= 86400.; // 'secg': UTCsec is converted into Localtime-sec. l = (int)dv2/100.; dv2 /= 60.; dv2 -= l*2./3.; // dv2 in degrees l = (int)dv3/100.; dv3 /= 60.; dv3 -= l*2./3.; // dv3 in degrees fprintf(fp2, " %8.2lf %11.7lf %12.7lf %7.2f %2d %2d\n", secg,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, " Localtime zone : %s\n", tz); fprintf(fp2, " GPS-UTC was converted into LTsec\n"); if (np == 0) { fprintf(fp2, " PC-Time data were conserved\n"); fprintf(fp2, " because GPS data do not contain any reliable ones\n"); } else { fprintf(fp2, " PC-Time data were Shifted by %+.2f sec.\n", tdif); } fprintf(fp2, "=============== %s===============\n", strdtm()); fclose(fp2); } fprintf(stderr, " Completed.\n"); exit(0); }