/* This code module converts between MIDAS TDR and MBS 64 bit data formats */ #include #include #include extern int MBSBuffer[]; extern unsigned long long TimeStampF; extern unsigned long long WRTimeF; extern unsigned long long MBSTimeF; // this is used to fill the timestamp of the block header extern unsigned int Time4863; extern unsigned int Time2847; extern unsigned int Time0027; extern unsigned int WR4863; extern unsigned int WR2847; extern unsigned int WR0027; extern int Verbose; /* --------------------------------------------------------------------- */ int convertMIDASTDRtoMBS (char * dataBuffer , int dataBufferLen) { int len; unsigned int * eventbuffer; unsigned int data, timestamp; unsigned int icode, ifield,module; int rc=-1; int flag=0; int mbsbufferlen; /* len in units of ints */ int * mbsbufferptr; mbsbufferptr = &MBSBuffer[8]; mbsbufferlen = 0; len = (dataBufferLen+3)/4; /* len in units of int */ eventbuffer = (unsigned int *) dataBuffer; if (Verbose) printf("len = %d ints\n",len); if (len == 0) {return mbsbufferlen;} /* empty event */ rc = -1; flag = 0; while (len > 0) { data = *eventbuffer++; timestamp = *eventbuffer++; len -=2; Time0027 = (unsigned long) timestamp & 0x0fffffff; switch ((data >> 30 ) & 3) { case 3: /* ADC data word */ *mbsbufferptr++ = data; *mbsbufferptr++ = timestamp; mbsbufferlen += 2; break; case 2: /* information data word */ icode = (data >> 20) & 0x0f; /* information code */ ifield = data & 0x000fffff; /* information field */ module = (data >> 24) & 0x3f; rc = -1; switch (icode) { case 2: /* pause */ WR2847 = (unsigned long) data & 0x000fffff; WR0027 = (unsigned long) timestamp & 0x0fffffff; WRTimeF = ((unsigned long long) WR4863 << 48) | ((unsigned long long) WR2847 << 28) | (unsigned long long) WR0027; rc = 0; break; case 3: /* resume Here there is nothing logical to learn until a full WR timestamp*/ rc = 0; break; case 7: /* full timestamp */ Time2847 = (unsigned long) data & 0x000fffff; Time0027 = (unsigned long) timestamp & 0x0fffffff; TimeStampF = ((unsigned long long) Time4863 << 48) | ((unsigned long long) Time2847 << 28) | (unsigned long long) Time0027; if (Verbose > 0) printf("7 Time => 0x%016llx\n", TimeStampF); rc = 0; break; case 8: /* full timestamp */ Time4863 = (unsigned long) data & 0x000fffff; TimeStampF = ((unsigned long long) Time4863 << 48) | ((unsigned long long) Time2847 << 28) | (unsigned long long) Time0027; if (Verbose > 0) printf("8 Time => 0x%016llx\n", TimeStampF); rc = 0; break; case 4: /* WR4 this is always second of the pair */ WR2847 = (unsigned long) data & 0x000fffff; WR0027 = (unsigned long) timestamp & 0x0fffffff; WRTimeF = ((unsigned long long) WR4863 << 48) | ((unsigned long long) WR2847 << 28) | (unsigned long long) WR0027; // if (flag == 0) { // only update this here if it's the first word in the block // MBSTimeF = WRTimeF; // if (Verbose > 0) printf("4 MBS Time => 0x%016llx\n", MBSTimeF); // } /* use first WR time in buffer */ // flag++; rc = 0; break; case 5: /* WR5 this always comes before info #4 */ WR4863 = (unsigned long) data & 0x000fffff; WRTimeF = ((unsigned long long) WR4863 << 48) | ((unsigned long long) WR2847 << 28) | (unsigned long long) WR0027; // if (flag == 0) { // MBSTimeF = WRTimeF; // if (Verbose > 0) printf("5 MBS Time => 0x%016llx\n", MBSTimeF); // } /* use first WR time in buffer */ // flag++; rc = 0; break; case 6: /* discriminator */ rc = 0; break; default: /* undefined code */ printf("unexpected information data word (%lx) at len = %d\n", data, len); break; } if (rc == 0) { *mbsbufferptr++ = data; *mbsbufferptr++ = timestamp; mbsbufferlen += 2; } break; case 1: /* wave format */ printf("wave data not supported (%lx) at len = %d\n", data, len); len = 0; /* quit */ break; case 0: /* bad format */ default: printf("bad event data (%lx) at len = %d\n", data, len); len = 0; /* quit */ break; } if ( flag == 0 ) { // here only for the first data word pair MBSTimeF = ((unsigned long long) WR4863 << 48) | ((unsigned long long) WR2847 << 28) | (unsigned long long)Time0027; flag = 1 ; } } if (MBSTimeF == 0) printf("Warning: MBSTimeF = 0; 0x%016llx 0x%08lx 0x%08lx 0x%08lx\n", WRTimeF, WR0027, WR2847, WR4863); if (Verbose > 0) { printf("Block start Time = 0x%016llx \n", MBSTimeF ); printf("Last WR Time => 0x%016llx \n", WRTimeF ); printf("Difference => 0x%016llx \n", ( WRTimeF - MBSTimeF ) ); } return (mbsbufferlen); }