works for 16 and 8bit offline

This commit is contained in:
Dhanya Maliakal 2015-09-23 11:35:40 +02:00
parent 9dee6d41bd
commit 2f8a036b5e

View File

@ -20,7 +20,7 @@ public:
eigerHalfModuleData(int dr, int np, int bsize, int dsize, bool top, double c=0): slsReceiverData<uint32_t>(xpixels, ypixels, np, bsize), eigerHalfModuleData(int dr, int np, int bsize, int dsize, bool top, double c=0): slsReceiverData<uint32_t>(xpixels, ypixels, np, bsize),
xtalk(c), bufferSize(bsize), actualDataSize(dsize), dynamicRange(dr), numberOfPackets(np), top(top){ xtalk(c), bufferSize(bsize), actualDataSize(dsize), dynamicRange(dr), numberOfPackets(np), top(top),header_t(0), footer_t(0){
int **dMap; int **dMap;
@ -36,7 +36,7 @@ public:
} }
//Map //Map
int totalNumberOfBytes = 1040 * dynamicRange * 16 *2; //for both 1g and 10g int totalNumberOfBytes = numberOfPackets * bufferSize;
int iPacket1 = 8; int iPacket1 = 8;
int iPacket2 = (totalNumberOfBytes/2) + 8; int iPacket2 = (totalNumberOfBytes/2) + 8;
int iData1 = 0, iData2 = 0; int iData1 = 0, iData2 = 0;
@ -172,7 +172,8 @@ public:
\returns frame number \returns frame number
*/ */
int getFrameNumber(char *buff){ int getFrameNumber(char *buff){
return(*(unsigned int*)(((eiger_packet_header *)((char*)buff))->num1)); footer_t = (eiger_packet_footer_t*)(buff + actualDataSize + sizeof(eiger_packet_header_t));
return ((uint32_t)(*( (uint64_t*) footer_t)));
}; };
@ -181,36 +182,13 @@ public:
/** gets the packets number /** gets the packets number
\param buff pointer to the memory \param buff pointer to the memory
\returns packet number \returns packet number
*/ */
int getPacketNumber(char *buff){ int getPacketNumber(char *buff){
#ifdef VERY_DEBUG footer_t = (eiger_packet_footer_t*)(buff + actualDataSize + sizeof(eiger_packet_header_t));
cprintf(RED, "\n0x%x - %d - %d", return(*( (uint16_t*) footer_t->packetnum));
(*(uint8_t*)(((eiger_packet_header *)((char*)(buff)))->num3)),//port and dr
(*(uint8_t*)(((eiger_packet_header *)((char*)(buff)))->num4)),//non 32 bit packet#
(*(uint16_t*)(((eiger_packet_header *)((char*)(buff)))->num2)));//32 bit packet#
#endif
return ((*(uint16_t*)(((eiger_packet_header *)((char*)buff))->num2)));
/*
//both ports have same packet numbers, so reconstruct
//16 bit packet number written in num2 for 32 bit mode
if(dynamicRange == 32){
if((*(uint8_t*)(((eiger_packet_header *)((char*)buff))->num3)) & 0x1)
return ((*(uint16_t*)(((eiger_packet_header *)((char*)buff))->num2))+(numberOfPackets/2) +1);
else
return ((*(uint16_t*)(((eiger_packet_header *)((char*)buff))->num2))+1);
}
else{
if((*(uint8_t*)(((eiger_packet_header *)((char*)buff))->num3)) &0x1)
return ((*(uint8_t*)(((eiger_packet_header *)((char*)buff))->num4))+(numberOfPackets/2) +1);
else
return ((*(uint8_t*)(((eiger_packet_header *)((char*)buff))->num4))+1);
}*/
}; };
@ -220,11 +198,9 @@ public:
\returns dynamic range \returns dynamic range
*/ */
static int getDynamicRange(char *buff){ static int getDynamicRange(char *buff){
#ifdef VERY_DEBUG eiger_packet_header_t* header_t;
cprintf(RED, "\n0x%x", header_t = (eiger_packet_header_t*)buff;
(*(uint8_t*)(((eiger_packet_header *)((char*)(buff)))->num3))); return(*( (uint8_t*) header_t->dynamicrange));
#endif
return (*(uint8_t*)(((eiger_packet_header *)((char*)buff))->num3)) >> 2;
}; };
@ -259,7 +235,6 @@ public:
virtual int getChannel(char *data, int ix, int iy, int dr) { virtual int getChannel(char *data, int ix, int iy, int dr) {
uint32_t m=0, n = 0; uint32_t m=0, n = 0;
uint8_t t;
int linesperpacket,newix, newiy; int linesperpacket,newix, newiy;
//cout <<"ix:"<<ix<<" nx:"<<nx<<" iy:"<<iy<<" ny:"<<ny<<" datamap[iy][ix]:"<< dataMap[iy][ix] <<" datasize:"<< dataSize <<endl; //cout <<"ix:"<<ix<<" nx:"<<nx<<" iy:"<<iy<<" ny:"<<ny<<" datamap[iy][ix]:"<< dataMap[iy][ix] <<" datasize:"<< dataSize <<endl;
@ -283,14 +258,15 @@ public:
else else
newiy = (iy - (iy%linesperpacket)); newiy = (iy - (iy%linesperpacket));
t = (*(uint8_t*)(((eiger_packet_header *)((char*)(data +(dataMap[newiy][newix]-8))))->num3));
//cprintf(GREEN,"num3 0x%x\n",t);
//check if missing packet //check if missing packet
if(t & 0x02){ header_t = (eiger_packet_header_t*)((char*)(data +(dataMap[newiy][newix]-8)));
if(*( (uint16_t*) header_t->missingpacket)==0xFFFF){
cprintf(RED,"missing packet\n"); cprintf(RED,"missing packet\n");
return -1; return -1;
} }
}else{ }else{
cprintf(RED,"outside limits\n"); cprintf(RED,"outside limits\n");
return -99; return -99;
@ -341,33 +317,21 @@ private:
bool top; bool top;
/** structure of an eiger packet for 1g*/ /** structure of an eiger packet*/
typedef struct typedef struct{
{
unsigned char subframenum[4]; unsigned char subframenum[4];
unsigned char missingpacket[1]; unsigned char missingpacket[2];
unsigned char random[1];
unsigned char portnum[1]; unsigned char portnum[1];
unsigned char dynamicrange[1]; unsigned char dynamicrange[1];
unsigned char data[1024]; } eiger_packet_header_t;
unsigned char framenumbig[2];
unsigned char framenum[4];
unsigned char packetnum[2];
} eiger_packet_1g;
/** structure of an eiger packet for 10g*/ typedef struct{
typedef struct unsigned char framenum[6];
{
unsigned char subframenum[4];
unsigned char missingpacket[1];
unsigned char random[1];
unsigned char portnum[1];
unsigned char dynamicrange[1];
unsigned char data[4096];
unsigned char framenumbig[2];
unsigned char framenum[4];
unsigned char packetnum[2]; unsigned char packetnum[2];
} eiger_packet_10g; } eiger_packet_footer_t;
eiger_packet_header_t* header_t;
eiger_packet_footer_t* footer_t;
}; };