mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-23 18:17:59 +02:00
should work for 8 and 16 bit eiger
This commit is contained in:
@ -38,7 +38,7 @@ public:
|
|||||||
//Map
|
//Map
|
||||||
int totalNumberOfBytes = 1040 * dynamicRange * 16 *2; //for both 1g and 10g
|
int totalNumberOfBytes = 1040 * dynamicRange * 16 *2; //for both 1g and 10g
|
||||||
int iPacket1 = 8;
|
int iPacket1 = 8;
|
||||||
int iPacket2 = bufferSize + 8;
|
int iPacket2 = (totalNumberOfBytes/2) + 8;
|
||||||
int iData1 = 0, iData2 = 0;
|
int iData1 = 0, iData2 = 0;
|
||||||
int increment = (dynamicRange/8);
|
int increment = (dynamicRange/8);
|
||||||
int ic_increment = 1;
|
int ic_increment = 1;
|
||||||
@ -48,7 +48,6 @@ public:
|
|||||||
}
|
}
|
||||||
int iPort;
|
int iPort;
|
||||||
|
|
||||||
|
|
||||||
if(top){
|
if(top){
|
||||||
for (int ir=0; ir<ypixels; ir++) {
|
for (int ir=0; ir<ypixels; ir++) {
|
||||||
for (int ic=0; ic<xpixels; ic = ic + ic_increment) {
|
for (int ic=0; ic<xpixels; ic = ic + ic_increment) {
|
||||||
@ -59,7 +58,7 @@ public:
|
|||||||
iData1 += increment;
|
iData1 += increment;
|
||||||
//increment header
|
//increment header
|
||||||
if(iData1 >= actualDataSize){
|
if(iData1 >= actualDataSize){
|
||||||
iPacket1 += (bufferSize + 8);
|
iPacket1 += 16;
|
||||||
iData1 = 0;
|
iData1 = 0;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
@ -68,7 +67,7 @@ public:
|
|||||||
iData2 += increment;
|
iData2 += increment;
|
||||||
//increment header
|
//increment header
|
||||||
if(iData2 >= actualDataSize){
|
if(iData2 >= actualDataSize){
|
||||||
iPacket2 += (bufferSize + 8);
|
iPacket2 += 16;
|
||||||
iData2 = 0;
|
iData2 = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -80,13 +79,14 @@ public:
|
|||||||
//bottom
|
//bottom
|
||||||
else{
|
else{
|
||||||
iData1 = 0; iData2 = 0;
|
iData1 = 0; iData2 = 0;
|
||||||
int numbytesperlineperport = 1024;
|
int numbytesperlineperport;
|
||||||
if (dynamicRange == 8)
|
|
||||||
numbytesperlineperport = 512;
|
switch(dynamicRange){
|
||||||
else if (dynamicRange == 4)
|
case 4: numbytesperlineperport = 256; break;
|
||||||
numbytesperlineperport = 256;
|
case 8: numbytesperlineperport = 512; break;
|
||||||
else if (dynamicRange == 32)
|
case 16:numbytesperlineperport = 1024; break;
|
||||||
numbytesperlineperport = 2048;
|
case 32:numbytesperlineperport = 2048; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -260,27 +260,30 @@ 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;
|
uint8_t t;
|
||||||
uint64_t k;
|
int linesperpacket,newix, newiy;
|
||||||
int numBytes,divFactor,pixelval, newix;
|
|
||||||
|
|
||||||
//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;
|
||||||
if (ix>=0 && ix<nx && iy>=0 && iy<ny && dataMap[iy][ix]>=0 && dataMap[iy][ix]<dataSize) {
|
if (ix>=0 && ix<nx && iy>=0 && iy<ny && dataMap[iy][ix]>=0 && dataMap[iy][ix]<dataSize) {
|
||||||
m=dataMask[iy][ix];
|
m=dataMask[iy][ix];
|
||||||
|
|
||||||
numBytes = (nx * iy + ix);
|
//pixelpos1d = (nx * iy + ix);
|
||||||
divFactor=512;
|
|
||||||
if (dr == 16) divFactor = 1024;
|
|
||||||
else if (dr == 8) divFactor = 2048;
|
|
||||||
/*if(dr == 4) divFactor = 16;
|
|
||||||
else if (dr == 8) divFactor = 8;
|
|
||||||
else if (dr == 16) divFactor = 512;*/
|
|
||||||
|
|
||||||
pixelval = numBytes % divFactor;
|
switch(dr){
|
||||||
//big endian
|
case 4: linesperpacket=4;break;
|
||||||
newix = ix - pixelval;
|
case 8: linesperpacket=2;break;
|
||||||
|
case 16: linesperpacket=1;break;
|
||||||
|
case 32: linesperpacket=0;break;/*dont know*/
|
||||||
|
}
|
||||||
|
|
||||||
//cprintf(GREEN,"64 value: 0x%016llx\n",((uint64_t)(*((uint64_t*)(((char*)data)+(dataMap[iy][newix]-8))))));
|
//to get the starting of a packet, ix is divided by 512pixels because of 2 ports
|
||||||
t = (*(uint8_t*)(((eiger_packet_header *)((char*)(data +(dataMap[iy][newix]-8))))->num3));
|
newix = ix - (ix%512);
|
||||||
|
//iy divided by linesperpacket depending on bitmode
|
||||||
|
if(!(iy%linesperpacket))
|
||||||
|
newiy = iy;
|
||||||
|
else
|
||||||
|
newiy = (iy - (iy%linesperpacket));
|
||||||
|
|
||||||
|
t = (*(uint8_t*)(((eiger_packet_header *)((char*)(data +(dataMap[newiy][newix]-8))))->num3));
|
||||||
//cprintf(GREEN,"num3 0x%x\n",t);
|
//cprintf(GREEN,"num3 0x%x\n",t);
|
||||||
//check if missing packet
|
//check if missing packet
|
||||||
if(t & 0x02){
|
if(t & 0x02){
|
||||||
@ -294,7 +297,9 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
//little endian
|
//little endian
|
||||||
n = ((uint32_t)(*((uint32_t*)(((char*)data)+(dataMap[iy][ix])))));
|
|
||||||
|
/*if(dr == 16) return ((uint16_t)(*((uint16_t*)(((char*)data)+(dataMap[iy][ix])))));*/
|
||||||
|
n = ((uint32_t)(*((uint32_t*)(((char*)data)+(dataMap[iy][ix])))));
|
||||||
if(dr == 4) return (n & 0xf)^m;
|
if(dr == 4) return (n & 0xf)^m;
|
||||||
else if(dr == 8) return (n & 0xff)^m;
|
else if(dr == 8) return (n & 0xff)^m;
|
||||||
else if(dr == 16) return (n & 0xffff)^m;
|
else if(dr == 16) return (n & 0xffff)^m;
|
||||||
@ -336,17 +341,36 @@ private:
|
|||||||
bool top;
|
bool top;
|
||||||
|
|
||||||
|
|
||||||
/** structure of an eiger image header*/
|
/** structure of an eiger packet for 1g*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
unsigned char num1[4];
|
unsigned char subframenum[4];
|
||||||
unsigned char num2[2];
|
unsigned char missingpacket[1];
|
||||||
unsigned char num3[1];
|
unsigned char random[1];
|
||||||
unsigned char num4[1];
|
unsigned char portnum[1];
|
||||||
} eiger_packet_header;
|
unsigned char dynamicrange[1];
|
||||||
|
unsigned char data[1024];
|
||||||
|
unsigned char framenumbig[2];
|
||||||
|
unsigned char framenum[4];
|
||||||
|
unsigned char packetnum[2];
|
||||||
|
} eiger_packet_1g;
|
||||||
|
|
||||||
|
/** structure of an eiger packet for 10g*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
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];
|
||||||
|
} eiger_packet_10g;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user