#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); int main(int argc, char *argv[]) { char shmst[12], tx1[9], tx2[7], sgps[7], tz[6], ns[2], ew[2]; char wdr[80], flog[80], fnam[80], fout[80], buf[500]; double hmst, tdif, tmag1, tmag2, tgps, fid, utc, dlat, dlon, secg; float fgx, fgy, fgz, ralt, balt, ad6, ad7, ad8, galt, dif; int year, month, day, hh, mm, ss, gQ, gN; int l, li, i, j, nh, nm, tzsec, k, nc, np; FILE *fp, *fp2; opnpinc(argc, argv); fprintf(stderr, "BDAQ2ASC: Convert AMBDAQ raw data into ASCII format\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, "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); } 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(); printf("----------------------------------------\n"); printf("BDAQ2ASC: Convert AMBDAQ raw data into ASCII format\n"); printf(" Input filename : %s\n", fnam); printf(" Output filename : %s\n", fout); printf(" Localtime zone : %s\n", tz); printf(" 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.; k = 0; do { fgets(buf,500,fp); k++; } while (*buf == '/'); while (1) { nc = 0; sscanf(buf, "%*f,%*d,%*f,%*f,%*11s,%*8s,%*d%n", &nc); if (nc != 58) { fprintf(stderr, "*** Infile format Unknown (1) at Line = %d\n", k); exit(1); } if ((strlen(buf)>120) && (buf[58]==',')) { // We assume GPS data signal is started to send at the moment of // message Time (UTC) without any delay, the time of which is // detected by the Data Acquisition software as a PC system time // (second of the day) value, as recorded just before '$GPGGA' // message. // Those time data are read into the variable 'tgps', and compared // with UTC data value to evaluate the PC system time data accuracy. sscanf(&buf[58], ",%lf,%6s,%n", &tgps, sgps, &nc); if ((nc != 17) || (strncmp(sgps,"$GPGGA",6) != 0)){ fprintf(stderr, "*** Infile format Unknown (2) at Line = %d\n", k); exit(1); } nc = sscanf(&buf[75], "%lf,%*f,%1[NS],%*f,%1[EW],%*d,%*d,%*f,%f", &utc, ns, ew, &galt); if (nc != 4) { fprintf(stderr, "*** Infile format Unknown (3) at Line = %d\n", k); exit(1); } l = (int)(utc/10000.); utc -= l*4000; l = (int)(utc/100.); utc -= l*40; // now 'utc' is UTCsec secg = utc + tzsec; if (secg < 0.) secg += 86400.; if (secg >= 86400.) secg -= 86400.; // 'secg': UTCsec is converted into Localtime-sec. // This 'secg' value is compared with PC system time 'tgps' // to evaluate the PC system time data accuracy, // assuming data do not include near-midnight ones. np++; dif = secg - tgps; tdif += dif; if ((dif < -1000.) || (dif > +1000.)) abendm_("Mistaken TimeZone or Abnormal Time data", (size_t)39); } if (fgets(buf,500,fp) == NULL) break; k++; } 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); /**********************************************/ fprintf(fp2, "//bdaq2asc 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); } k = 0; while (fgets(buf,500,fp) != NULL) { k++; if (buf[0] != '/') break; if (strncmp(buf,"/DateTime:",10) == 0) { sscanf(&buf[10], "%d-%d-%d %d:%d:%d %8s %6s", &year,&month,&day, &hh,&mm,&ss, tx1,tx2); fprintf(fp2, "/DateTime: %04d%02d%02d %02d:%02d:%02d %s %s\n", year,month,day, hh,mm,ss, tx1,tx2); } else { l = strlen(buf); if (buf[l-2] == '\r') buf[l-2] = '\0'; else buf[l-1] = '\0'; fprintf(fp2, "%s\n", buf); } } 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"); strcpy(shmst, "00:00:00.00"); hmst = tmag1 = tmag2 = fid = 0.; fgx = fgy = fgz = ralt = balt = ad6 = ad7 = ad8 = 0.; while (1) { sscanf(buf, "%lf,%*d,%lf,%lf,%*11s,%*8s,%*d,%*f", &hmst, &tmag1, &tmag2); if (((hmst+tdif) < 0.) || ((hmst+tdif) > 86399.9)) { fprintf(stderr, "*** hmst : %s + tdif(%.2f)\n", shmst, tdif); abendm_("illegal Time data (< 0H or >= 24H)", (size_t)37); } hmst += tdif; l = (int)(hmst/60.); sprintf(shmst, "%02d:%02d:%05.2f", l/60, l%60, (hmst-l*60)); fid = hmst; fprintf(fp2, "%7.1lf %11s %9.3lf %9.3lf", fid, shmst, fid, tmag1); fprintf(fp2, " %7.3f %7.3f %7.3f %7.3f %7.3f %7.3f %7.3f %7.3f", fgx, fgy, fgz, ralt, balt, ad6, ad7, ad8); if ((strlen(buf)>120) && (buf[58]==',')) { sscanf(&buf[58], ",%lf,%6s,%n", &tgps, sgps, &nc); if ((nc != 17) || (strncmp(sgps,"$GPGGA",6) != 0)){ fprintf(stderr, "*** Unexpected ERROR at Line = %d\n", k); exit(1); } sscanf(&buf[75], "%lf,%lf,%1[NS],%lf,%1[EW],%d,%d,%*f,%f", &utc,&dlat,ns,&dlon,ew,&gQ,&gN,&galt); l = (int)(utc/10000.); utc -= l*4000; l = (int)(utc/100.); utc -= l*40; // now 'utc' is UTCsec secg = utc + tzsec; if (secg < 0.) secg += 86400.; if (secg >= 86400.) secg -= 86400.; // 'secg': UTCsec is converted into Localtime-sec. l = (int)dlat/100.; dlat /= 60.; dlat -= l*2./3.; if (ns[0] == 'S') dlat = -dlat; // dlat in degrees l = (int)dlon/100.; dlon /= 60.; dlon -= l*2./3.; if (ew[0] == 'W') dlon = -dlon; // dlon in degrees fprintf(fp2, " %8.2lf %11.7lf %12.7lf %7.2f %2d %2d\n", secg, dlat, dlon, galt, gQ, gN); } else { fprintf(fp2, " * * * * * *\n"); } if (fgets(buf,500,fp) == NULL) break; k++; } fclose(fp2); fclose(fp); if (flog[li] != '\0') { fp2 = fopen(flog, "a"); fprintf(fp2, "\n\n"); fprintf(fp2, "BDAQ2ASC: Convert AMBDAQ raw data into ASCII format\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); }