#ifndef ERPSS_H #define ERPSS_H #define RAWHSIZE 512 #define SRDNDUM 12 #define SRDMAXEVENTS 110 //#include #include extern unsigned char CCode; class srdevent //4 bytes { public: unsigned char sample_offset; unsigned char condition_code; unsigned short event_code; srdevent():sample_offset(0),condition_code(CCode),event_code(0){}; }; //#include "DEBUGON.H" struct RAWREC //size=512 no compression { unsigned short srd_byteswab; //* byte swab indicator * unsigned short srd_eid; //* id number * unsigned short srd_flags; //* compressed, ... * unsigned short srd_nchans_; //* duplicated * unsigned short srd_rl2size; //* record size log base 2 (each chan) * unsigned short srd_rptsize; //* record size in points (each chan) * unsigned short srd_ndupsamp; //* # A/D errors (duplicated samples) * unsigned short srd_run; //* # pauses since beginning * unsigned short srd_errdetect; //0x10 * error detection flag * unsigned short srd_nlost; //* # events lost * unsigned short srd_nevents; //* # events in event structure array * unsigned short srd_nes; //* if compressed, # encoded shorts * unsigned short srd_dummy[SRDNDUM];// 0x18 * to 512 bytes * long srd_speriod; //* sampling period in microseconds * long srd_recnum; //* record number (cats with offsets) * long srd_stime; //* UNIX time, start of digitization * long srd_ptime; //* UNIX time, last startup from pause * long srd_sitem; //* cumulative start item this list * long srd_chksum; //* checksum to 0L for header and data * struct srdevent srd_events[SRDMAXEVENTS]; RAWREC(unsigned cmprs,short nchans, short blkSize, short speriod): srd_byteswab(0xAA55), //* byte swab indicator * srd_eid (0x00F0), //* id number * srd_flags (cmprs), //* compressed, ... * srd_nchans_ (nchans), //* duplicated * srd_rl2size (7), //* record size log base 2 (each chan) * srd_rptsize (blkSize), //* record size in points (each chan) * srd_ndupsamp(0), //* # A/D errors (duplicated samples) * srd_run (0), //* # pauses since beginning * srd_errdetect(0), //* error detection flag * srd_nlost (0), //* # events lost * srd_nevents (0), //* # events in event structure array * srd_nes (0), //* if compressed, # encoded shorts * srd_speriod (speriod), //* sampling period in microseconds * srd_recnum (0), //* record number 0,1,2...(cats with offsets) * srd_stime (0), //* UNIX time, start of digitization * srd_ptime (0), //* UNIX time, last startup from pause * srd_sitem (0), //* cumulative start item this list * srd_chksum (0) //* checksum to 0L for header and data * { // Debug=1; // PRINT(srd_nchans_); memset(srd_dummy,0,SRDNDUM*2); //* to 512 bytes * memset(srd_events,0,SRDMAXEVENTS*sizeof(srdevent)); if (blkSize==256) srd_rl2size=8; } long datasize_uncmpr(){return srd_nchans_*srd_rptsize*2;}; long datasize(){return srd_flags ? srd_nes*2:datasize_uncmpr();}; }; inline ostream & operator<<(ostream &S, RAWREC & RR) { S.write((char *)&RR,sizeof(RAWREC)); return S; }; inline istream & operator>>(istream &S, RAWREC & RR) { S.read((char *)&RR,sizeof(RAWREC)); return S; }; //----------------------------------------------------- class FHeader { public: unsigned Magic; unsigned Id; unsigned Compr1; //yes! unsigned Chnmb; unsigned x1; unsigned x2; unsigned x3; unsigned ComprXXX; // ???? unsigned short srd_rl2size; //* record size log base 2 (each chan) * unsigned short srd_rptsize; //* record size in points (each chan) * char Filler0[0x228-10*2]; // unsigned short srd_speriod; //offs 0x228 unsigned short Filler1[5+8]; // offs 0x22a-0x243 // char Filler[0x244-10*2]; // char Labels[72][8]; //offs 0x244 char Filler2[0x1000-0x244-72*8]; }; /* class FHeader { public: unsigned Magic; unsigned Id; unsigned Compr1; //yes! unsigned Chnmb; unsigned x1; unsigned x2; unsigned x3; unsigned ComprXXX; // ???? unsigned short srd_rl2size; //* record size log base 2 (each chan) * unsigned short srd_rptsize; //* record size in points (each chan) * char Filler[0x244-10*2]; // char Labels[64][8]; char Filler2[0x1000-0x244-64*8]; }; */ inline ostream & operator<<(ostream &S, FHeader & RR) { S.write((char *)&RR,sizeof(FHeader)); return S; }; inline istream & operator>>(istream &S, FHeader & RR) { S.read((char *)&RR,sizeof(FHeader)); return S; }; //----------------------------------------------------- struct DataRecord { RAWREC RRecHdr; short * Data; // int chns; DataRecord(unsigned cprs, int Ch, int blkSize=128, short speriod): RRecHdr(cprs,Ch,blkSize,speriod)//,chns(Ch) { Data=(short *) malloc(Ch*blkSize*2); memset(Data,0,Ch*blkSize*2); }; ~DataRecord(){free(Data);}; int indx(int a, int b) {return a*RRecHdr.srd_nchans_+b;} //chns //friend ostream & operator<<(ostream &S, DataRecord & RR); }; extern int ERPSS; extern fstream * ERPSS_File; extern DataRecord * Data_Rec; // initialized in DATAMENU =new DataRecord(cprs); str ErpssFileSize(void *); #endif