#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 buf[1024+256], sgps[85], shmst[13], smdy[9], zz[9], tz[6], ns[2], ew[2]; char wdr[80], flog[80], fnam[80], fout[80]; double tdif, fm1, fm2, utc, dlat, dlon, tgps, tsec, secg; float fgx, fgy, fgz, ralt, balt, ad6, ad7, ad8, galt, sec, dif; int l, li, np, nc, n, ker, nd, krec, lz, tzsec; int key, i, j, nh, nm, hh, mm, k, gQ, gN; int len, ll, lnl[1025]; long flen, loff; FILE *fp, *fp1, *fp2; opnpinc(argc, argv); fprintf(stderr, "DMAQ2ASC: Convert G858+GPS DLded 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, "rb")) == NULL) { abendm_("input file open fail", (size_t)20); } gparma("Enter Output filename ==> ", l, &fout[li]); if ((fp2=fopen(fout, "wb")) == 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("DMAQ2ASC: Convert G858+GPS DLded 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"); /******** data check *********/ printf("First scanning Data format\n"); n = 0; ker = 0; np = 0; tdif = 0.; while (fgets(buf,1024,fp) != NULL) { n++; nd = sscanf(buf, "%d", &krec); if (nd != 1) { ker++; fprintf(stderr, "L.%d: data format error\n", n); } else if (krec == 0) { nd = sscanf(buf, "%d %lf %lf %s %s %d %8s", &krec, &fm1, &fm2, shmst, smdy, &lz, zz); if (nd != 6) { fprintf(stderr, "L.%d: [0] data format error\n", n); ker++; } } else if (krec == 21) { nd = sscanf(buf, "%d %s %s %s %d %d %8s", &krec, sgps, shmst, smdy, &key, &lz, zz); if (nd == 6) { if (strncmp(sgps,"$GPGGA",6) == 0) { nd = sscanf(&sgps[6], ",%lf,%*f,%1[NS],%*f,%1[EW],%*d,%*d,%*f,%*f,M,%f,M", &utc, ns, ew, &galt); if (nd == 4) { j = (int)(utc/10000.); utc -= j*4000; j = (int)(utc/100.); utc -= j*40; // now 'utc' is UTCsec secg = utc + tzsec; if (secg < 0.) secg += 86400.; if (secg >= 86400.) secg -= 86400.; nd = sscanf(shmst, "%d:%d:%f", &hh,&mm,&sec); if (nd == 3) { tgps = (double)((hh*60+mm)*60) + sec; np++; dif = secg - tgps; tdif += dif; if ((dif < -1000.) || (dif > +1000.)) abendm_("Mistaken TimeZone or Abnormal Time data", (size_t)39); } else { fprintf(stderr, "L.%d: TimeStamp error\n", n); ker++; } } else { fprintf(stderr, "L.%d: GPS data format error\n", n); ker++; } } else { fprintf(stderr, "L.%d: unexpected GPS data\n", n); ker++; } } else { fprintf(stderr, "L.%d: [21] data format error\n", n); ker++; } } else if (krec == 6) { nd = sscanf(buf, "%d %lf %lf %s %s %d %d", &krec, &fm1, &fm2, shmst, smdy, &key, &lz); if (nd != 7) { fprintf(stderr, "L.%d: [6] unexpected rec-format\n", n); ker++; } } else { fprintf(stderr, "L.%d: unexpected rec-type = %d\n", n, krec); ker++; } } if (ker != 0) { fprintf(stderr, "\n%d Error(s) detected, Process terminated.\n", ker); exit(1); } if (np == 0) { printf(" G858 TimeVal 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(" G858 TimeVal data will be Shifted by %+.2f sec.\n", tdif); } /**********************************************/ if ((fp1=tmpfile()) == NULL) { fprintf(stderr, "tmpfile open FAIL\n"); exit(1); } if (fseek(fp,0L,SEEK_END) != 0) { fprintf(stderr, "fseek(END) FAIL\n"); exit(1); } flen = ftell(fp); n = (int)((flen-1) / 1024); loff = (long)n * 1024; len = (int)(flen - loff); while (n >= 0) { if (fseek(fp,loff,SEEK_SET) != 0) { fprintf(stderr, "fseek(%ld) FAIL\n", loff); exit(1); } if (fread(buf,(size_t)1,(size_t)len,fp) != (size_t)len) { fprintf(stderr, "fread(%ld,%d) FAIL\n", loff,len); exit(1); } for (k=0,i=0; i 0) { ll = lnl[k] - lnl[k-1]; if (buf[lnl[k]] != '\n') { ll++; buf[lnl[k]+1] = '\n'; } if (fwrite(&buf[lnl[k-1]+1],(size_t)1,(size_t)ll,fp1) != (size_t)ll) { fprintf(stderr, "fwrite(%ld,%d,%d) FAIL\n", loff,k,ll); exit(1); } k--; } if (lnl[0] > 254) { fprintf(stderr, "too long data line\n"); exit(1); } len = 1024 + lnl[0]; n--; loff = (long)(n*1024); } if ((ll=lnl[0]) > 0) { if ((fwrite(&buf[0],(size_t)1,(size_t)ll,fp1)) != (size_t)ll) { fprintf(stderr, "fwrite(0,0,%d) FAIL\n", ll); exit(1); } } rewind(fp1); fclose(fp); /**********************************************/ fprintf(fp2, "//dmaq2asc v.2017-10-16 by T. Nakatsuka\n"); fprintf(fp2, "//InputDataFilename: %s\n", fnam); if (np == 0) { fprintf(fp2, "//G858 TimeVal were conserved.\n"); } else { fprintf(fp2, "//G858 TimeVal were Shifted by %+.2f sec.\n", tdif); } k = 0; 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"); fgx = fgy = fgz = ralt = balt = ad6 = ad7 = ad8 = 0.; while (fgets(buf,1024,fp1) != NULL) { sscanf(buf, "%d", &krec); if (krec == 21) { sscanf(buf, "%*d %s %s %s %d %d", sgps,shmst,smdy,&key,&lz); sscanf(sgps, "%6s,%n", zz, &nc); k = 1; if ((nc != 7) || (strncmp(zz,"$GPGGA",6) != 0)){ fprintf(stderr, "*** Unknown Non $GPGGA Pos.data\n"); exit(1); } sscanf(&sgps[7], "%lf,%lf,%1[NS],%lf,%1[EW],%d,%d,%*f,%f", &utc,&dlat,ns,&dlon,ew,&gQ,&gN,&galt); j = (int)(utc/10000.); utc -= j*4000; j = (int)(utc/100.); utc -= j*40; // now 'utc' is UTCsec j = (int)(dlat/100.); dlat -= (double)(j*100); secg = utc + tzsec; if (secg < 0.) secg += 86400.; if (secg >= 86400.) secg -= 86400.; // 'secg': UTCsec is converted into Localtime-sec. dlat = dlat/60. + (double)j; if (ns[0] == 'S') dlat = -dlat; // dlat in degrees j = (int)(dlon/100.); dlon -= (double)(j*100); dlon = dlon/60. + (double)j; if (ew[0] == 'W') dlon = -dlon; // dlon in degrees } else if (krec == 0) { sscanf(buf, "%*d %lf %lf %s %s %d", &fm1,&fm2,shmst,smdy,&lz); sscanf(shmst, "%d:%d:%f", &hh,&mm,&sec); tsec = (double)((hh*60 + mm)*60) + sec + tdif; if ((tsec < 0.) || (tsec > 86399.9)) { fprintf(stderr, "*** shmst : %s + tdif(%.2f)\n", shmst, tdif); abendm_("illegal Time data (< 0H or >= 24H)", (size_t)37); } l = (int)(tsec/60.); sprintf(shmst, "%02d:%02d:%05.2f", l/60, l%60, (tsec-l*60)); if (k == 1) { fprintf(fp2, "%7.1lf %11s %9.3lf %9.3lf", tsec, shmst, tsec, fm1); 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); fprintf(fp2, " %8.2lf %11.7lf %12.7lf %7.2f %2d %2d\n", secg, dlat, dlon, galt, gQ, gN); k = 0; } else { fprintf(fp2, "%7.1lf %11s %9.3lf %9.3lf", tsec, shmst, tsec, fm1); 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); fprintf(fp2, " * * * * * *\n"); } } } fclose(fp2); fclose(fp1); if (flog[li] != '\0') { fp2 = fopen(flog, "a"); fprintf(fp2, "\n\n"); fprintf(fp2, "DMAQ2ASC: Convert G858+GPS DLded 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, " G858 TimeVal were conserved\n"); fprintf(fp2, " because GPS data do not contain any reliable ones\n"); } else { fprintf(fp2, " G858 TimeVal were Shifted by %+.2f sec.\n", tdif); } fprintf(fp2, "=============== %s===============\n", strdtm()); fclose(fp2); } fprintf(stderr, " Completed.\n"); exit(0); }