/******************************************************************
* Author: James Bynes
* Date: 04-19-2016
* XRMdataExtractor.c
* Description: Extracts data taken from ASIC and outputs to
* readable format.
******************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
unsigned int data_ch[8][64];
int mm = 0;
int carrier = 0;
int asic = 0;
void initialize_data(void){
int m,n;
for(n=0;n<8;n++){
for(m=0;m<64;m++)
data_ch[n][m]=0;
}
}
unsigned int createMask(unsigned int a, unsigned int b){
unsigned int r=0;
unsigned int i=0;
for (i=a; i<=b; i++)
r |= 1 << i;
return r;
}
void fprint_data(FILE *fp){
int m,n;
for(m=0;m<64;m++)
fprintf(fp,"%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n", carrier, asic, m, data_ch[0][m], data_ch[1][m], data_ch[2][m], data_ch[3][m], data_ch[4][m], data_ch[5][m], data_ch[6][m], data_ch[7][m]);
}
void get_eventInfo(FILE *headerFile, unsigned int wordsInPacket,int mm, int k){
unsigned int r, result;
fprintf(headerFile,"line %d\n", mm);
fprintf(headerFile,"k: %d\n", k);
r = createMask(30,31);
result = (r & wordsInPacket)>>30;
carrier = result;
fprintf(headerFile,"Carrier: 0x%01x\n", result);
r = createMask(28,29);
result = (r & wordsInPacket)>>28;
asic = result;
fprintf(headerFile,"IRSX: 0x%01x\n", result);
r = createMask(27,27);
result = (r & wordsInPacket)>>27;
fprintf(headerFile,"0: 0x%01x\n", result);
r = createMask(24,26);
result = (r & wordsInPacket)>>24;
fprintf(headerFile,"Channel: 0x%01x\n", result);
r = createMask(16,23);
result = (r & wordsInPacket)>>16;
fprintf(headerFile,"LastWriteAddress: 0x%02x\n", result);
r = createMask(9,15);
result = (r & wordsInPacket)>>9;
fprintf(headerFile,"SCROD ID: 0x%03x\n", result);
r = createMask(0,8);
result = (r & wordsInPacket);
fprintf(headerFile,"Converted Addr: 0x%03x\n", result);
}
main(int argc, char *argv[]){
if(argc < 2){
printf("You must enter a binary filename\n");
goto INVALID_ARGS;
}
char headerName[80];
char dataName[80];
strcpy(headerName, "XRM_header_");
strcat(headerName, argv[1]);
strcat(headerName, ".txt");
strcpy(dataName, "XRM_data_");
strcat(dataName, argv[1]);
strcat(dataName, ".txt");
FILE *fileName = fopen(argv[1], "r");
FILE *headerFile = fopen(headerName, "w");
FILE *dataFile = fopen(dataName, "w");
fputs("DATA FORMAT\n", headerFile);
fputs("carrier# | ASIC# | Sample# | CH0 | CH1 | CH2 | CH3 | CH4 | CH5 | CH6 | CH7\n\n", headerFile);
if(!fileName){
printf("File doesn't exist\n");
INVALID_ARGS:
printf("Usage:\n");
printf("XRMdataExtractor <binary file>\n");
return;
}
unsigned int wordsInPacket, packet_hdr, result, r, num_windows, footer;
int i = 0;
int j = 0;
int k = 0;
initialize_data();
printf("_________HEADER__________\n");
while(!feof(fileName)){
NEW_EVENT:
fread(&packet_hdr, sizeof(packet_hdr),1,fileName);
if(feof(fileName))
break;
wordsInPacket = packet_hdr;
if (mm < 3){
if (mm == 0){
fprintf(headerFile,"Event size: %d\n", wordsInPacket);
}
if (mm == 1){
r = createMask(28,31);
result = (r & wordsInPacket)>>28;
fprintf(headerFile,"Trig Pattern: 0x%01x\n", result);
r = createMask(19,27);
result = (r & wordsInPacket)>>19;
num_windows = result+1;
fprintf(headerFile,"# of windows: 0x%03x\n", result);
r = createMask(0,18);
result = r & wordsInPacket;
fprintf(headerFile,"Timestamp: 0x%05x\n", result);
}
if (mm == 2){
get_eventInfo(headerFile,wordsInPacket,mm,k);
}
}
else{
if((j < 8) && (i < 64)){
r = createMask(0,11);
result = (r & wordsInPacket);
data_ch[j][i] = result;
i++;
r = createMask(16,27);
result = (r & wordsInPacket)>>16;
data_ch[j][i] = result;
i++;
}
else{
if((j==7)){ //on to next event
j = 0;
i = 0;
k = k + 1;
fprint_data(dataFile);
if(k<4)
get_eventInfo(headerFile,wordsInPacket,mm,k);
else{
footer = wordsInPacket;
printf("Footer %08x\n",footer);
mm = 0;
k = 0;
goto NEW_EVENT;
}
}
else{//on to next channel (same event)
i = 0;
j++;
r = createMask(0,11);
result = (r & wordsInPacket);
data_ch[j][i] = result;
i++;
r = createMask(16,27);
result = (r & wordsInPacket)>>16;
data_ch[j][i] = result;
i++;
}
}
}
mm++;
}
printf("\n");
}
|