/*--------------------------------------------------------------------------*/ /* kw2asc.c */ /*--------------------------------------------------------------------------*/ /* 3/27/95 kw2asc.c converts to K2 or Mt. Whitney file to an event.HDR formatted ascii header and for each channel an ascii file event.### of %11.9f floating fraction of Full Scale # / TWO223 == sample.0 / 8388608.0 */ /* 3/29/95 1.00 add option '-h' write formatted header file to disk */ /* 5/23/95 1.10 fix bug in chanavail, need to shift mask even if channel not selected */ /* 5/31/95 1.20 compile with Turbo C== 4.0J to fix emulation problem*/ /* 6/ 1/95 1.30 compile with Borland C++ 4.5 8086/emulate/medium model used bcc dcompiler -- dobcc.bat */ /* 6/5/95 1.30 fixed frame error message, needed frameCounter+1, to report correct frame # starting @ 1*/ /* 6/15/95 1.40 fix bug when xmodem padds end of file with 0x00 */ /* 7/12/95 1.50 fix bug - mscans counter was inside channel loop ended file short by #chans factor */ /* 5/20/96 1.60 verify works @ 1000 sps for CDMG add default to bytesPerSample 5/21/96 1.60 add new parameters */ /* 6/ 4/96 1.70 add CRYEAR and master header\formatters from kwsup\heads */ /* 6/10/96 add [.EVT] option*/ /* 6/11/96 add HEADER == TRUE for kwhd1/2.c cellStartTime[] changed 2->5 */ /* 6/14/96 fix spacing in formatted header, fix adding .EVT */ /* 6/20/96 fix adding .EVT, add program title, fullpathname & file date */ /* make data %12.9 */ /* 6/24/96 fix indexing bug in r0.channels: max @, min @, mean, aqoffset */ /* 7/01/96 fix case of invalid frameSize */ /* 7/01/96 limit bytesPerSample 2-3-4, default 3 */ /* 9/19/96 1.71 kwhd1/2.c remove sensor response 1-6, FIX phone numbers */ /* 10/ 3/96 1.72 Fix framesize minimum from 20 to 2 */ /* 03/15/97 1.80 ADD: process to output file frames that are not 1/10 sec */ /* report frame error to .SHD & screen */ /* 3/30/97 ADD: 1.40 K2 & 1/50 MTW */ /* ADD: Seismological Parms & Serial Data Stream Parms */ /* 7/17/97 ---- Correction @ get samples, counts translated to Volts, not FullScale */ /* 5/12/98 1.90 FIX: message:from 'frame 1583 data read failure' to 'Premature end of file @ scan.... */ /* 9/22/97 1.92 SCR 296 Fix gpsStatus decode, using '&&', s/b using '&' */ /* SCR 287 Fix limit on voterinfo array. ADD maxvoters */ /* SCR 272 FIX-CHANGE reporting of timing.local Offset */ /* Used Boaland 4.52 command line compiler */ #include "kw2asc.h" static BYTE idata[FRAME_DATA3]; // 18ch * 25scans * 3bytes -- read data from file here static union { BYTE b[FRAME_DATA4]; // 18ch * 25scans * 4bytes -- expand data to here long l[FRAME_SAMPLES]; // 18ch * 25scans * 1long -- read long from here to heap } far ixdata; void main(int argc, char *argv[]) { int scansPerFrame,bytesPerSample,bytesPerScan,frameSize; long frameCounter, scans,mscans; int i,j,k,p,q; char sbuf[_MAX_PATH]; char cx1,cx2,cx3,cx4; int testi; struct ffblk ffblk; unsigned int d1,d2,d3,t1,t2,t3; if ( argc < 2 ) { printf("Altus K2 & Mt. Whitney ASCII File Converter\n"); printf(" Version %s %s\n",VERSION,DATE); printf(" Copyright (c) %s Kinemetrics, Inc., Pasadena, CA\n\n",CRYEAR); printf("Usage: KW2ASC filename[.EVT] [-H]\n"); printf("\n"); printf(" Option: -H Write formatted header, filename.HDR, to disk.\n"); printf("\n"); printf(" Output: Separate file, filename.###, for each channel.\n"); printf(" Format: xx.xxxxxxxxx V, max +/- 2.5V\n"); printf("\n"); printf(" Short Header File, filename.SHD, with pertinent\n"); printf(" information about the event file.\n"); return; } // if no filename fmhdflag = FALSE; strcpy(infname,argv[1]); tempint = strlen(infname); // add default extension, if necessary cx1 = infname[tempint -4]; cx2 = infname[tempint -3]; cx3 = infname[tempint -2]; cx4 = infname[tempint -1]; if ( (cx1 != '.') && (cx2 != '.') && (cx3 != '.') && (cx4 != '.') ) strcat(infname,".EVT"); // ASSUME K2 '.EVT' FOR NOW // expand name to full pathname if (_fullpath(sbuf,infname,_MAX_PATH) != NULL) { strcpy(infname,sbuf); for (i = 0; i < strlen(infname); i++) // set path & filename to uppercase infname[i] = toupper(infname[i]); tempint = access(infname,0); if (tempint == -1) { sound(150); // file not exist delay(400); nosound(); if (errno == EACCES) printf("KW2ASC %s permission denied\n",infname); if (errno == ENOENT) printf("KW2ASC %s path or filename not found\n",infname); return; } // if file exists } else { printf("KW2ASC %s - unable to build full path name\n",infname); return; } infile = fopen(infname,"rb"); if ( infile == NULL ) { printf("KW2ASC Unable to open %s\n",infname); return; } // GOT GOOD INFILE // create name of short header file strncpy(hdrname,infname,(strlen(infname) -3)); strcat(hdrname,"SHD"); for (i=2; i < argc; i++) { if (argv[i][0] == '-' ) { switch (toupper(argv[i][1])) { case 'H': strncpy(hfpname,infname,(strlen(infname) -3)); strcat(hfpname,"HDR"); fmhdflag = TRUE; break; } } // if option code } // for arguments over 1 // START READING INFILE fread(&tag,sizeof(tag),1,infile); tagheadlen = (unsigned int) swap2(tag.length); tagdatalen = (unsigned int) swap2(tag.dataLength); if ( (tagdatalen !=0) || ((tagheadlen != sizeof(k2head)) && (tagheadlen != sizeof(mwhead))) ) { printf("KW2ASC Invalid file header tag.\n"); return; } // determine which header fread(&k2head,10,1,infile); fclose(infile); findfirst(infname,&ffblk,0); d1 = (unsigned int)ffblk.ff_fdate & 0x001f; // day d2 = (unsigned int)ffblk.ff_fdate & 0x01e0; d2 = d2 >> 5; // month d3 = (unsigned int)ffblk.ff_fdate & 0xfe00; d3 = 1980 + (d3 >> 9); // year t1 = (unsigned int)ffblk.ff_ftime & 0x001f; t1 = t1 << 1; // seconds -- not used t2 = (unsigned int)ffblk.ff_ftime & 0x07e0; t2 = t2 >> 5; // minutes t3 = (unsigned int)ffblk.ff_ftime & 0xf800; t3 = t3 >> 11; // hours headver = swap2(k2head.roParms.headerVersion); // add new .C declarations for 1.40/1.50 headers if ((headver == K2100) || (headver == K2110) || (headver == K2130) || (headver == K2140)) { headtype = K2; } else { if ((headver == MTW120) || (headver == MTW150)) { headtype = MTW; } else { printf("KW2ASC Header Version %d not recognized, %s\n",headver,infname); fcloseall(); return; } } // headvers -> headtype // end new declarations for 1.40/1.50 headers if ( headtype == MTW ) { infile = fopen(infname,"rb"); hdrfile = fopen(hdrname,"wt"); fread(&tag,sizeof(tag),1,infile); // toss tag fread(&mwhead,sizeof(mwhead),1,infile); printf("KW2ASC: %s %02d/%02d/%d %02d:%02d \n",infname,d2,d1,d3,t3,t2); printf("Mt. Whitney Header Version %0.2f\n",(float)headver*0.01); fprintf(hdrfile,"KW2ASC: %s %02d/%02d/%d %02d:%02d \n",infname,d2,d1,d3,t3,t2); fprintf(hdrfile,"Mt. Whitney Header Version %0.2f\n",(float)headver*0.01); } else { infile = fopen(infname,"rb"); hdrfile = fopen(hdrname,"wt"); fread(&tag,sizeof(tag),1,infile); // toss tag fread(&k2head,sizeof(k2head),1,infile); printf("KW2ASC: %s %02d/%02d/%d %02d:%02d \n",infname,d2,d1,d3,t3,t2); printf("K2 Header Version %0.2f\n",(float)headver*0.01); fprintf(hdrfile,"KW2ASC: %s %02d/%02d/%d %02d:%02d \n",infname,d2,d1,d3,t3,t2); fprintf(hdrfile,"K2 Header Version %0.2f\n",(float)headver*0.01); } if ( headtype == MTW ) strcpy(tempstr,mwhead.rwParms.misc.stnID); else strcpy(tempstr,k2head.rwParms.misc.stnID); printf("Station ID: %s",tempstr); fprintf(hdrfile,"Station ID: %s",tempstr); if ( headtype == MTW ) // added 5/21/96 strcpy(tempstr,mwhead.rwParms.misc.siteID); else strcpy(tempstr,k2head.rwParms.misc.siteID); printf(" Site: %s",tempstr); fprintf(hdrfile," Site: %s",tempstr); if ( headtype == MTW ) us = swap2(mwhead.rwParms.misc.serialNumber); else us = swap2(k2head.rwParms.misc.serialNumber); printf(" Serial number: %d",us); fprintf(hdrfile," Serial number: %d",us); if ( headtype == MTW ) usedchans = swap2(mwhead.rwParms.misc.nchannels); else usedchans = swap2(k2head.rwParms.misc.nchannels); printf(" Channels: %d\n",usedchans); fprintf(hdrfile," Channels: %d\n",usedchans); if ( headtype == MTW ) sps = swap2(mwhead.rwParms.stream.sps); // samples per second else sps = swap2(k2head.rwParms.stream.sps); // samples per second printf("Sampling rate: %d",sps); fprintf(hdrfile,"Sampling rate: %d",sps); if ( headtype == MTW ) us = swap2(mwhead.rwParms.stream.preEvent); else us = swap2(k2head.rwParms.stream.preEvent); printf(" Pre-event: %d seconds.",us); fprintf(hdrfile," Pre-event: %d seconds.",us); if ( headtype == MTW ) us = swap2(mwhead.rwParms.stream.postEvent); else us = swap2(k2head.rwParms.stream.postEvent); printf(" Post-event: %d seconds.\n",us); fprintf(hdrfile," Post-event: %d seconds.\n",us); if ( headtype == MTW ) temptime = swap4i(mwhead.roParms.stream.startTime); else temptime = swap4i(k2head.roParms.stream.startTime); CK2Time(temptime); if (headver >= K2110) { if ( headtype == MTW) tempmsec = swap2(mwhead.roParms.stream.startTimeMsec); else tempmsec = swap2(k2head.roParms.stream.startTimeMsec); sprintf(starttime,"%d/%d/%d (%d) %d:%02d:%02d.%03d", m_nMonth,m_nDayOfMonth,m_nYear,m_nDayOfYear,m_nHour,m_nMin,m_nSec,tempmsec); } else sprintf(starttime,"%d/%d/%d (%d) %d:%02d:%02d",m_nMonth,m_nDayOfMonth,m_nYear, m_nDayOfYear,m_nHour,m_nMin,m_nSec); printf("Start time: %s\n",starttime); fprintf(hdrfile,"Start time: %s\n",starttime); if ( headtype == MTW ) { temptime = swap4i(mwhead.roParms.stream.triggerTime); } else { temptime = swap4i(k2head.roParms.stream.triggerTime); } CK2Time(temptime); if (headver >= K2110) { if (headtype == MTW) tempmsec = swap2(mwhead.roParms.stream.triggerTimeMsec); else tempmsec = swap2(k2head.roParms.stream.triggerTimeMsec); sprintf(trigtime,"%d/%d/%d (%d) %d:%02d:%02d.%03d", m_nMonth,m_nDayOfMonth,m_nYear,m_nDayOfYear,m_nHour,m_nMin,m_nSec,tempmsec); } else sprintf(trigtime,"%d/%d/%d (%d) %d:%02d:%02d",m_nMonth,m_nDayOfMonth,m_nYear, m_nDayOfYear,m_nHour,m_nMin,m_nSec); printf("Trigger time: %s\n",trigtime); fprintf(hdrfile,"Trigger time: %s\n",trigtime); if (headver == K2100) { lw = swap4i(k2head.roParms.stream.duration); // 1/10 second frames lwa = lw * 20; hr = (float)((float)lw * 0.1); printf("Duration: %6.3f seconds, %ld frames, %ld scans.\n", hr,lw,lwa); fprintf(hdrfile,"Duration: %6.3f seconds, %ld frames, %ld scans.\n", hr,lw,lwa); scans = lwa; } if ((headver == K2110) || (headver == K2130) || (headver == K2140)) { lwa = swap4i(k2head.roParms.stream.duration); // frame count lwb = swap4i(k2head.roParms.stream.nscans); hr = (float)((float)lwb * ((float)1/sps)); // 1/sps printf("Duration: %6.3f seconds, %ld frames, %ld scans.\n",hr,lwa,lwb); fprintf(hdrfile,"Duration: %6.3f seconds, %ld frames, %ld scans.\n",hr,lwa,lwb); scans = lwb; } if (headtype == MTW) { lwa = swap4i(mwhead.roParms.stream.duration); // frame count lwb = swap4i(mwhead.roParms.stream.nscans); hr = (float)((float)lwb * ((float)1/sps)); // 1/sps printf("Duration: %6.3f seconds, %ld frames, %ld scans.\n",hr,lwa,lwb); fprintf(hdrfile,"Duration: %6.3f seconds, %ld frames, %ld scans.\n",hr,lwa,lwb); scans = lwb; } if ( headtype == MTW ) hw = swap2(mwhead.roParms.stream.flags); else hw = swap2(k2head.roParms.stream.flags); if ((hw & 0x0003) == 1) { printf(" Functional Test\n"); fprintf(hdrfile," Functional Test\n"); } if ((hw & 0x0003) == 3) { printf(" Sensor Response Test\n"); fprintf(hdrfile," Sensor Response Test\n"); } if ((hw & 0x0004) == 4) { printf(" Trigger Data\n"); fprintf(hdrfile," Trigger Data\n"); } // GPS stuff printf("GPS Status byte decoded:\n"); if ( headtype == MTW ) hb = mwhead.roParms.timing.gpsStatus; else hb = k2head.roParms.timing.gpsStatus; if ((0x01 && hb) == 0x01) { printf(" Currently checking for presence of GPS.\n"); fprintf(hdrfile," Currently checking for presence of GPS.\n"); } if ((0x02 && hb) == 0x02) { printf(" GPS present.\n"); fprintf(hdrfile," GPS present.\n"); } if ((0x04 && hb) == 0x04) { printf(" Error communicating with GPS.\n"); fprintf(hdrfile," Error communicating with GPS.\n"); } if ((0x08 && hb) == 0x08) { printf(" GPS failed to lock with gpsMaxTurnOnTime.\n"); fprintf(hdrfile," GPS failed to lock with gpsMaxTurnOnTime.\n"); } if ((0x10 && hb) == 0x10) { printf(" GPS not locked.\n"); fprintf(hdrfile," GPS not locked.\n"); } if ((0x20 && hb) == 0x20) { printf(" GPS power is ON.\n"); fprintf(hdrfile," GPS power is ON.\n"); } if ( headtype == MTW ) hw = swap2(mwhead.roParms.timing.gpsUpdateRTCCount); else hw = swap2(k2head.roParms.timing.gpsUpdateRTCCount); printf("GPS updated the RTC %d times since last reset.\n",hw); fprintf(hdrfile,"GPS updated the RTC %d times since last reset.\n",hw); if ( headtype == MTW ) { hi1 = swap2(mwhead.roParms.timing.gpsLastDrift[0]); hi2 = swap2(mwhead.roParms.timing.gpsLastDrift[1]); } else { hi1 = swap2(k2head.roParms.timing.gpsLastDrift[0]); hi2 = swap2(k2head.roParms.timing.gpsLastDrift[1]); } printf("Drift Rate at last two RTC updates to UTC: %d & %d msec.\n",hi1,hi2); fprintf(hdrfile,"Drift Rate at last two RTC updates to UTC: %d & %d msec.\n",hi1,hi2); if ( headtype == MTW ) temptime = swap4i(mwhead.roParms.timing.gpsLastUpdateTime[0]); else temptime = swap4i(k2head.roParms.timing.gpsLastUpdateTime[0]); CK2Time(temptime); sprintf(string1,"%d/%d/%d (%d) %02d:%02d:%02d",m_nMonth,m_nDayOfMonth,m_nYear, m_nDayOfYear,m_nHour, m_nMin, m_nSec); if ( headtype == MTW ) temptime = swap4i(mwhead.roParms.timing.gpsLastUpdateTime[1]); else temptime = swap4i(k2head.roParms.timing.gpsLastUpdateTime[1]); CK2Time(temptime); sprintf(string2,"%d/%d/%d (%d) %02d:%02d:%02d",m_nMonth,m_nDayOfMonth,m_nYear, m_nDayOfYear,m_nHour, m_nMin, m_nSec); printf("Last GPS Update times were:\n"); fprintf(hdrfile,"Last GPS Update times were:\n"); printf(" %s & %s.\n",string1,string2); fprintf(hdrfile," %s & %s.\n",string1,string2); if ( headtype == MTW ) temptime = swap4i(mwhead.roParms.timing.gpsLastTurnOnTime[0]); else temptime = swap4i(k2head.roParms.timing.gpsLastTurnOnTime[0]); CK2Time(temptime); sprintf(string1,"%d/%d/%d (%d) %02d:%02d:%02d",m_nMonth,m_nDayOfMonth,m_nYear, m_nDayOfYear,m_nHour, m_nMin, m_nSec); if ( headtype == MTW ) temptime = swap4i(mwhead.roParms.timing.gpsLastTurnOnTime[1]); else temptime = swap4i(k2head.roParms.timing.gpsLastTurnOnTime[1]); CK2Time(temptime); sprintf(string2,"%d/%d/%d (%d) %02d:%02d:%02d",m_nMonth,m_nDayOfMonth,m_nYear, m_nDayOfYear,m_nHour, m_nMin, m_nSec); printf("Last GPS TurnOn times were:\n"); fprintf(hdrfile,"Last GPS TurnOn times were:\n"); printf(" %s & %s.\n",string1,string2); fprintf(hdrfile," %s & %s.\n",string1,string2); if ( headtype == MTW ) temptime = swap4i(mwhead.roParms.timing.gpsLastLockTime[0]); else temptime = swap4i(k2head.roParms.timing.gpsLastLockTime[0]); CK2Time(temptime); sprintf(string1,"%d/%d/%d (%d) %02d:%02d:%02d",m_nMonth,m_nDayOfMonth,m_nYear, m_nDayOfYear,m_nHour, m_nMin, m_nSec); if ( headtype == MTW ) temptime = swap4i(mwhead.roParms.timing.gpsLastLockTime[1]); else temptime = swap4i(k2head.roParms.timing.gpsLastLockTime[1]); CK2Time(temptime); sprintf(string2,"%d/%d/%d (%d) %02d:%02d:%02d",m_nMonth,m_nDayOfMonth,m_nYear, m_nDayOfYear,m_nHour, m_nMin, m_nSec); printf("Last GPS Lock times were:\n"); fprintf(hdrfile,"Last GPS Lock times were:\n"); printf(" %s & %s.\n",string1,string2); fprintf(hdrfile," %s & %s.\n",string1,string2); if ( headtype == MTW ) hw = swap2(mwhead.roParms.timing.gpsLockFailCount); else hw = swap2(k2head.roParms.timing.gpsLockFailCount); printf("Count of times GPS failed to lock\n"); fprintf(hdrfile,"Count of times GPS failed to lock\n"); printf(" within gpsMaxTurnOnTime: %d\n",hw); fprintf(hdrfile," within gpsMaxTurnOnTime: %d\n",hw); // Battery stuff if ( headtype == MTW ) bat = swap2(mwhead.roParms.misc.batteryVoltage); // short, voltage * 10 else bat = swap2(k2head.roParms.misc.batteryVoltage); // short, voltage * 10 x = bat * 1.0; x = x / 10.0; if (headver == K2100) { printf("Main battery: %3.2fV",x); fprintf(hdrfile,"Main battery: %3.2fV",x); } if ((headver == K2110) || (headver == K2130) || (headver == K2140)) { hb = k2head.rwParms.misc.minBatteryVoltage; hr = ((float) hb) * 0.1; if (x < 0.0) { x = x * -1.0; // make positive printf("Main battery: %3.2fV, charging, minimum alarm voltage: %3.1fV",x,hr); fprintf(hdrfile,"Main battery: %3.2fV, charging, minimum alarm voltage: %3.1fV",x,hr); } else { printf("Main battery: %3.2fV, minimum alarm voltage: %3.1fV",x,hr); fprintf(hdrfile,"Main battery: %3.2fV, Not charging, minimum alarm voltage: %3.1fV",x,hr); } } // if headver K2 if (headtype == MTW) { hb = mwhead.rwParms.misc.minBatteryVoltage; hr = ((float) hb) * 0.1; if (x < 0.0) { x = x * -1.0; // make positive printf("Main battery: %3.2fV, charging, minimum alarm voltage: %3.1fV",x,hr); fprintf(hdrfile,"Main battery: %3.2fV, charging, minimum alarm voltage: %3.1fV",x,hr); } else { printf("Main battery: %3.2fV, minimum alarm voltage: %3.1fV",x,hr); fprintf(hdrfile,"Main battery: %3.2fV, Not charging, minimum alarm voltage: %3.1fV",x,hr); } } // if headver MTW printf("\n\n"); fprintf(hdrfile,"\n\n"); // determine which channels are in file, check map in 1st frame // channel bitmap in frame only place used since beginning // READ FIRST FRAME HEADER HERE fread(&tag,sizeof(tag),1,infile); // toss tag fread(&frmhdr,sizeof(frmhdr),1,infile); if (tag.sync != 'K') { printf("%s is a Header Only file. No data to write.\n",infname); fprintf(hdrfile,"%s is a Header Only file. No data to write.\n",infname); fcloseall(); return; } // read channels in frame from channelbitmap chanavailbitmap = swap2(frmhdr.channelBitMap); chanmask = 0x0001; // chan 1 is in bit 0 tempint = 0; chanct = 0; // counts channels in initial display // setup list of used channels for (j = 0; j < MAX_CHANNELS; j++) // initialize chanavail[j] = FALSE; k = 0; for (j = 0; j < MAX_CHANNELS; j++) // 3/17/95 make work for 18 { if (headtype == MTW) { if (j == 16) // channel 17 { chanavailbitmap = (int)frmhdr.channelBitMap1; // only 1 byte chanmask = 0x0001; // reset mask } } else { if (j == MAX_K2_CHANNELS) break; // stop testing - not legal } tempint = chanavailbitmap & chanmask; chidx[j] = 0; // zero 1st then make some 'channel number' if (tempint != 0) { chidx[k] = j +1; // 2, = 3 etc. k ++; chanavail[j] = TRUE; chanct = chanct +1; // increment channel counter } // if tempint != 0 chanmask = chanmask << 1; // shift mask left 1 bit } // for j = 0 < max-chans if ( chanct != usedchans ) { printf("# channels do not match: header %d 1st frame %d\n",usedchans,chanct); fprintf(hdrfile,"# channels do not match: header %d 1st frame %d\n",usedchans,chanct); fcloseall(); return; } // WRITE HEADER FILE HERE ... if (fmhdflag == TRUE) { printf("\nWriting formatted header, %s, to disk.\n",hfpname); fprintf(hdrfile,"\nWriting formatted header, %s, to disk.\n",hfpname); hfp = fopen(hfpname,"wt"); decodeheader1(); decodeheader2(); fclose(hfp); } // fmhdflag == TRUE // OPEN CHANNEL FILES // BC limit of 20 files open at once, when run 18 channel file // only get files .001 thru .012, rest have NULL/VOID pointers if (chanct > (FIRST_LIMIT+1)) { printf("\nChannel Count > %d, demultiplex data in two passes.\n",FIRST_LIMIT +1); // FIRST PASS for ( i = 0; i < FIRST_LIMIT; i++ ) { strncpy(chname[i],infname,(strlen(infname) -3)); sprintf(string1,"%03d",chidx[i]); strcat(chname[i],string1); chfile[i] = fopen(chname[i],"wt"); i = i; } //OPEN OVERFLOW TEMPORARY FILE strcpy(overname,"OVER.BIN"); // text file for overfile = fopen(overname,"wt"); // overflow data channels //........................ // // LOOP TO DO FRAMES -- FIRST PASS // //........................ scansPerFrame = 0; bytesPerSample = 0; bytesPerScan = 0; frameSize = 0; frameCounter = 0L; mscans = 0L; // for ( frameCounter = 0;; ) do { //read tag structure if ( frameCounter != 0 ) // already have 0th tag { i= fread(&tag,sizeof(tag),1,infile); if ( i!= 1 ) { break; } i= fread(&frmhdr,sizeof(frmhdr),1,infile); if ( i!= 1 ) { break; } } // if frameCounter != 0 .. already have 0th tag & frameheader framestat = frmhdr.frameStatus & 0xC0; switch ( framestat ) { case 0x40: bytesPerSample = 2; break; case 0x80: bytesPerSample = 3; break; case 0xC0: bytesPerSample = 4; break; default: bytesPerSample = 3; // added 5/20/96 } bytesPerScan = bytesPerSample * chanct; frameSize = swap2(frmhdr.frameSize) -32; // # data bytes following frame head scansPerFrame = frameSize / bytesPerScan; if ( scansPerFrame != (sps/10) ) { printf("\nFrame %ld, %d bytes, %d scans, not 0.1 sec\n", frameCounter+1,frameSize,scansPerFrame); // needs '\n' at beginning to end field of '.....' fprintf(hdrfile,"Frame %ld, %d bytes, %d scans, not 0.1 sec\n", frameCounter+1,frameSize,scansPerFrame); } if ( (frameSize < 2) // 1 ch * 1scans * 2 bytes - minimum 100sps // 10/3/96 1.72, was 20 || (frameSize > 7200) ) // 18 ch * 100scans * 4 bytes - maximum 1000sps { printf("\nInvalid frame Size = %d. Terminating Program.\n",frameSize); fprintf(hdrfile,"Invalid frame Size = %d. Terminating Program.\n",frameSize); fcloseall(); for ( i = 0; i < FIRST_LIMIT; i++ ) { remove(chname[i]); } remove(overname); return; } i = fread(&idata,frameSize,1,infile); // read frame's data samples if (i == 0) { fileseconds = mscans * ((float)1/sps); printf("\nPremature end of %s at frame %d.\n", infname,frameCounter); printf(" %ld scans found (%5.1f seconds)\n",mscans,fileseconds); fprintf(hdrfile,"Premature end of %s at frame %d.\n", infname,frameCounter); fprintf(hdrfile," %ld scans found (%5.1f seconds)\n",mscans,fileseconds); // beg debug // printf("FrameSize= %d scans= %ld mscans= %ld i= %d\n",frameSize,scans,mscans, i); // end debug scans = mscans; break; } else { if (i != 1) { printf("\nFrame %d data read failure.\n",frameCounter+1); // beg debug printf("FrameSize= %d scans= %ld mscans= %ld i= %d\n",frameSize,scans,mscans, i); // end debug fprintf(hdrfile,"Frame %d data read failure.\n",frameCounter+1); fcloseall(); return; } } p = 0; // index for idata, 3 byte sample q = 0; // index for ixdata, 4 byte as byte k = 0; // index for ixdata, 4 bytes as 1 long for (i = 0; i < scansPerFrame; i++) // # of scans in this frame { for (j = 0; j < chanct; j++) // actual # of channels { if (bytesPerSample == 4) // sambyte { ixdata.b[q] = idata[p+3]; // low - translate from ixdata.b[q+1] = idata[p+2]; // mid - motorola 3 byte to ixdata.b[q+2] = idata[p+1]; // high - intel 4 byte ixdata.b[q+3] = idata[p]; } else { if (bytesPerSample == 3) // sambyte ixdata.b[q] = idata[p+2]; // low - translate from else ixdata.b[q] = 0x00; ixdata.b[q+1] = idata[p+1]; // mid - motorola 3 byte to ixdata.b[q+2] = idata[p]; // high - intel 4 byte if ((ixdata.b[q+2] & 0x80) != 0) ixdata.b[q+3] = 0xFF; else ixdata.b[q+3] = 0x00; } // put data sample in file as float - Volts fsample = ((float)ixdata.l[k] * 2.5) / 8388608.0; if (fsample > 2.5) fsample = 2.5; if (fsample < -2.5) fsample = -2.5; if (j < FIRST_LIMIT) fprintf(chfile[j],"%12.9f\n",fsample); else fprintf(overfile,"%12.9f\n",fsample); // multiplexed ascii samples // increment pointers if (bytesPerSample == 4) // sambyte p = p +4; if (bytesPerSample == 3) p = p +3; if (bytesPerSample == 2) p = p +2; q = q +4; k ++; } // for j = 0 < max_chans mscans++; } // for i = 0 < framescans frameCounter++; printf("."); if ( (frameCounter % 50) == 0 ) printf("\n"); else { if ( (frameCounter % 10) == 0 ) printf(" "); else { if ( (frameCounter % 5) == 0 ) printf(" "); } // not 10 } // not 50 // } // for frameCounter .. until fread fails } while(mscans < scans); for (i = 0; i < FIRST_LIMIT; i++) { if (chfile[i] != NULL) fclose(chfile[i]); } fclose(overfile); // SECOND PASS printf("\nStarting Second Pass ...\n"); for ( i = FIRST_LIMIT; i < chanct; i++ ) { strncpy(chname[i],infname,(strlen(infname) -3)); sprintf(string1,"%03d",chidx[i]); strcat(chname[i],string1); chfile[i] = fopen(chname[i],"wt"); i = i; } overfile = fopen(overname,"rt"); for (frameCounter = 0;frameCounter < scans; frameCounter++) // frameCounter used here as scan counter { for ( i = FIRST_LIMIT; i < chanct; i++ ) { fgets(string1,20,overfile); j = strlen(string1); if (j == NULL) break; fprintf(chfile[i],"%s",string1); } // for channels over if ( (frameCounter % scansPerFrame) == 0 ) printf("."); if ( (frameCounter % (50 * scansPerFrame )) == 0 ) printf("\n"); else { if ( (frameCounter % (10 * scansPerFrame)) == 0 ) printf(" "); else { if ( (frameCounter % (5 * scansPerFrame)) == 0 ) printf(" "); } // not 10 } // not 50 if (j == NULL) break; } // for frameCounter until fscanf fails fclose(overfile); remove(overname); } // if chanct > FIRST_LIMIT else { printf("\nChannel Count <= %d, demultiplex data in one pass.\n",FIRST_LIMIT +1); for ( i = 0; i < chanct; i++ ) { strncpy(chname[i],infname,(strlen(infname) -3)); sprintf(string1,"%03d",chidx[i]); strcat(chname[i],string1); chfile[i] = fopen(chname[i],"wt"); i = i; } //........................ // // LOOP TO DO FRAMES // //........................ scansPerFrame = 0; bytesPerSample = 0; bytesPerScan = 0; frameSize = 0; frameCounter = 0L; mscans = 0L; // for ( frameCounter = 0;; ) do { //read tag structure if ( frameCounter != 0 ) // already have 0th tag { i= fread(&tag,sizeof(tag),1,infile); if ( i!= 1 ) { break; } i= fread(&frmhdr,sizeof(frmhdr),1,infile); if ( i!= 1 ) { break; } } // if frameCounter != 0 .. already have 0th tag & frameheader framestat = frmhdr.frameStatus & 0xC0; switch ( framestat ) { case 0x40: bytesPerSample = 2; break; case 0x80: bytesPerSample = 3; break; case 0xC0: bytesPerSample = 4; } if ( (bytesPerSample < 2) || (bytesPerSample > 4) ) bytesPerSample = 3; bytesPerScan = bytesPerSample * chanct; frameSize = swap2(frmhdr.frameSize) -32; // # data bytes following frame head scansPerFrame = frameSize / bytesPerScan; if ( scansPerFrame != (sps/10) ) { printf("\nFrame %ld, %d bytes, %d scans, not 0.1 sec\n", frameCounter+1,frameSize,scansPerFrame); fprintf(hdrfile,"Frame %ld, %d bytes, %d scans, not 0.1 sec\n", frameCounter+1,frameSize,scansPerFrame); } if ( (frameSize < 2) // 1 ch * 10scans * 2 bytes - minimum 100sps // 1.80 was 20 || (frameSize > 7200) ) // 18 ch * 100scans * 4 bytes - maximum 1000sps { printf("\nInvalid frame Size = %d. Terminating Program.\n",frameSize); fprintf(hdrfile,"Invalid frame Size = %d. Terminating Program.\n",frameSize); fcloseall(); for ( i = 0; i < FIRST_LIMIT; i++ ) remove(chname[i]); return; } i = fread(&idata,frameSize,1,infile); // read frame's data samples if (i != 1) { printf("\nFrame %d data read failure.\n",frameCounter+1); fprintf(hdrfile,"Frame %d data read failure.\n",frameCounter+1); fcloseall(); for ( i = 0; i < FIRST_LIMIT; i++ ) remove(chname[i]); return; } p = 0; // index for idata, 3 byte sample q = 0; // index for ixdata, 4 byte as byte k = 0; // index for ixdata, 4 bytes as 1 long for (i = 0; i < scansPerFrame; i++) // # of scans in this frame { for (j = 0; j < chanct; j++) // actual # of channels { if (bytesPerSample == 4) // sambyte { ixdata.b[q] = idata[p+3]; // low - translate from ixdata.b[q+1] = idata[p+2]; // mid - motorola 3 byte to ixdata.b[q+2] = idata[p+1]; // high - intel 4 byte ixdata.b[q+3] = idata[p]; } else { if (bytesPerSample == 3) // sambyte ixdata.b[q] = idata[p+2]; // low - translate from else ixdata.b[q] = 0x00; ixdata.b[q+1] = idata[p+1]; // mid - motorola 3 byte to ixdata.b[q+2] = idata[p]; // high - intel 4 byte if ((ixdata.b[q+2] & 0x80) != 0) ixdata.b[q+3] = 0xFF; else ixdata.b[q+3] = 0x00; } // put data sample in file as float - fraction of Full Scale fsample = ((float)ixdata.l[k] * 2.5) / 8388608.0; if (fsample > 2.5) fsample = 2.5; if (fsample < -2.5) fsample = -2.5; fprintf(chfile[j],"%12.9f\n",fsample); // increment pointers p = p +3; q = q +4; k ++; } // for j = 0 < max_chans mscans++; } // for i = 0 < framescans frameCounter++; printf("."); if ( (frameCounter % 50) == 0 ) printf("\n"); else { if ( (frameCounter % 10) == 0 ) { printf(" "); } else { if ( (frameCounter % 5) == 0 ) printf(" "); } } // } // for frameCounter .. until fread fails } while (mscans < scans); } // if chanct <= 12 printf("\nFiles Created: %s, \n", hdrname); for (i = 0; i < chanct;i++) { printf(" %s\n",chname[i]); } fprintf(hdrfile,"\nFiles Created: %s, \n", hdrname); for (i = 0; i < chanct;i++) { fprintf(hdrfile," %s\n",chname[i]); } fcloseall(); printf("\nKW2ASC completed.\n"); } // main /*--- end kw2asc.c ------------------------------------------------------*/