mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-23 15:00:02 +02:00
Merge branch 'master' of gitorious.psi.ch:sls_det_software/sls_receiver_software
This commit is contained in:
commit
cd3a502167
@ -18,9 +18,8 @@ using namespace std;
|
||||
slsReceiver::slsReceiver(int argc, char *argv[], int &success){
|
||||
//creating base receiver
|
||||
cout << "SLS Receiver" << endl;
|
||||
receiverBase = new slsReceiverUDPFunctions();
|
||||
int tcpip_port_no=-1;
|
||||
|
||||
bool bottom = false;
|
||||
|
||||
|
||||
ifstream infile;
|
||||
@ -116,6 +115,31 @@ slsReceiver::slsReceiver(int argc, char *argv[], int &success){
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//mode top:bottom
|
||||
else if(!strcasecmp(argv[iarg],"-mode")){
|
||||
if(iarg+1==argc){
|
||||
cout << "no mode given after -mode in command line. Exiting." << endl;
|
||||
success=FAIL;
|
||||
}else{
|
||||
if(!strcasecmp(argv[iarg+1],"bottom")){
|
||||
cout<<"mode: bottom"<<endl;
|
||||
bottom = true;
|
||||
iarg++;
|
||||
}else if(!strcasecmp(argv[iarg+1],"top")){
|
||||
cout<<"mode: top"<<endl;
|
||||
iarg++;
|
||||
}
|
||||
else{
|
||||
cout << "could not decode port in command line. \n\nExiting." << endl;
|
||||
success=FAIL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
else{
|
||||
cout << "Unknown argument:" << argv[iarg] << endl;
|
||||
success=FAIL;
|
||||
@ -130,9 +154,9 @@ slsReceiver::slsReceiver(int argc, char *argv[], int &success){
|
||||
cout << "rx_tcpport:\t TCP Communication Port with the client. Default:1954. " << endl << endl;
|
||||
}
|
||||
|
||||
|
||||
receiverBase = new slsReceiverUDPFunctions(bottom);
|
||||
if (success==OK)
|
||||
tcpipInterface = new slsReceiverTCPIPInterface(success,receiverBase, tcpip_port_no);
|
||||
tcpipInterface = new slsReceiverTCPIPInterface(success,receiverBase, tcpip_port_no, bottom);
|
||||
//tcp ip interface
|
||||
|
||||
|
||||
|
@ -17,6 +17,9 @@
|
||||
#include <sstream>
|
||||
#include <fstream>
|
||||
#include <stdlib.h>
|
||||
#include <byteswap.h> //linux5
|
||||
#define be64toh(x) __bswap_64 (x) //linux5
|
||||
//#include <endian.h> //linux6
|
||||
using namespace std;
|
||||
|
||||
|
||||
@ -28,7 +31,7 @@ slsReceiverTCPIPInterface::~slsReceiverTCPIPInterface() {
|
||||
}
|
||||
|
||||
|
||||
slsReceiverTCPIPInterface::slsReceiverTCPIPInterface(int &success, slsReceiverBase* rbase, int pn):
|
||||
slsReceiverTCPIPInterface::slsReceiverTCPIPInterface(int &success, slsReceiverBase* rbase, int pn, bool bot):
|
||||
myDetectorType(GOTTHARD),
|
||||
receiverBase(rbase),
|
||||
ret(OK),
|
||||
@ -38,7 +41,8 @@ slsReceiverTCPIPInterface::slsReceiverTCPIPInterface(int &success, slsReceiverBa
|
||||
dynamicrange(16),
|
||||
socket(NULL),
|
||||
killTCPServerThread(0),
|
||||
tenGigaEnable(0), portNumber(DEFAULT_PORTNO+2){
|
||||
tenGigaEnable(0), portNumber(DEFAULT_PORTNO+2),
|
||||
bottom(bot){
|
||||
|
||||
int port_no=portNumber;
|
||||
|
||||
@ -1336,7 +1340,7 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){
|
||||
}
|
||||
|
||||
/**proper frame*/
|
||||
else{
|
||||
else{//cout<<"**** got proper frame ******"<<endl;
|
||||
|
||||
memcpy(origVal,raw,frameSize);
|
||||
raw=NULL;
|
||||
@ -1344,12 +1348,11 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){
|
||||
int c1=8;//first port
|
||||
int c2=(frameSize/2) + 8; //second port
|
||||
int retindex=0;
|
||||
int irow,ibytesperpacket,irepeat;
|
||||
int repeat=1;
|
||||
int irow,ibytesperpacket;
|
||||
int linesperpacket = (16/dynamicrange)* 1;// 16:1 line, 8:2 lines, 4:4 lines, 32: 0.5
|
||||
int numbytesperlineperport=(EIGER_PIXELS_IN_ONE_ROW/EIGER_MAX_PORTS)*dynamicrange/8;//16:1024,8:512,4:256,32:2048
|
||||
int datapacketlength = EIGER_ONE_GIGA_ONE_DATA_SIZE;
|
||||
|
||||
int total_num_bytes = 1040*(16*dynamicrange)*2;
|
||||
|
||||
if(tenGigaEnable){
|
||||
linesperpacket = (16/dynamicrange)* 4;// 16:4 line, 8:8 lines, 4:16 lines, 32: 2
|
||||
@ -1357,55 +1360,106 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){
|
||||
}
|
||||
//if 1GbE, one line is split into two packets for 32 bit mode, so its special
|
||||
else if(dynamicrange == 32){
|
||||
repeat=2;
|
||||
numbytesperlineperport = 1024;
|
||||
linesperpacket = 1; //we repeat this twice anyway for 32 bit
|
||||
}
|
||||
|
||||
if(!bottom){
|
||||
|
||||
for(irow=0;irow<EIGER_PIXELS_IN_ONE_COL/linesperpacket;++irow){
|
||||
ibytesperpacket=0;
|
||||
while(ibytesperpacket<datapacketlength){
|
||||
for(irepeat=0;irepeat<repeat;irepeat++){//only for 32 bit mode, take 2 packets from same port
|
||||
for(irow=0;irow<EIGER_PIXELS_IN_ONE_COL/linesperpacket;++irow){
|
||||
ibytesperpacket=0;
|
||||
while(ibytesperpacket<datapacketlength){
|
||||
//first port
|
||||
memcpy(retval+retindex ,origVal+c1 ,numbytesperlineperport);
|
||||
retindex += numbytesperlineperport;
|
||||
c1 += numbytesperlineperport;
|
||||
if(repeat == 2) c1 += 16;
|
||||
}
|
||||
for(irepeat=0;irepeat<repeat;irepeat++){//only for 32 bit mode, take 2 packets from same port
|
||||
|
||||
if(dynamicrange == 32){
|
||||
c1 += 16;
|
||||
memcpy(retval+retindex ,origVal+c1 ,numbytesperlineperport);
|
||||
retindex += numbytesperlineperport;
|
||||
c1 += numbytesperlineperport;
|
||||
c1 += 16;
|
||||
}
|
||||
//second port
|
||||
memcpy(retval+retindex ,origVal+c2 ,numbytesperlineperport);
|
||||
retindex += numbytesperlineperport;
|
||||
c2 += numbytesperlineperport;
|
||||
if(repeat == 2) c2 += 16;
|
||||
if(dynamicrange == 32){
|
||||
c2 += 16;
|
||||
memcpy(retval+retindex ,origVal+c2 ,numbytesperlineperport);
|
||||
retindex += numbytesperlineperport;
|
||||
c2 += numbytesperlineperport;
|
||||
c2 += 16;
|
||||
}
|
||||
ibytesperpacket += numbytesperlineperport;
|
||||
}
|
||||
if(dynamicrange != 32) {
|
||||
c1 += 16;
|
||||
c2 += 16;
|
||||
}
|
||||
ibytesperpacket += numbytesperlineperport;
|
||||
}
|
||||
if(repeat == 1) {
|
||||
c1 += 16;
|
||||
c2 += 16;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//bottom half module
|
||||
else{
|
||||
c1 = (frameSize/2) - numbytesperlineperport - 8 ;
|
||||
c2 = total_num_bytes - numbytesperlineperport - 8;
|
||||
|
||||
int64_t temp;
|
||||
for(irow=0;irow<EIGER_PIXELS_IN_ONE_COL/linesperpacket;++irow){
|
||||
ibytesperpacket=0;
|
||||
while(ibytesperpacket<datapacketlength){
|
||||
if(dynamicrange == 32){
|
||||
//first port first chip
|
||||
c1 -= (numbytesperlineperport + 16);
|
||||
memcpy(retval+retindex ,origVal+c1 ,numbytesperlineperport);
|
||||
retindex += numbytesperlineperport;
|
||||
//first port second chip
|
||||
c1 += (numbytesperlineperport+16);
|
||||
memcpy(retval+retindex ,origVal+c1 ,numbytesperlineperport);
|
||||
retindex += numbytesperlineperport;
|
||||
c1 -= (numbytesperlineperport*2+32);//1024*2+16*2
|
||||
//second port first chip
|
||||
c2 -= (numbytesperlineperport + 16);
|
||||
memcpy(retval+retindex ,origVal+c2 ,numbytesperlineperport);
|
||||
retindex += numbytesperlineperport;
|
||||
//second port second chip
|
||||
c2 += (numbytesperlineperport + 16);
|
||||
memcpy(retval+retindex ,origVal+c2 ,numbytesperlineperport);
|
||||
retindex += numbytesperlineperport;
|
||||
c2 -= (numbytesperlineperport*2+32);
|
||||
}else{
|
||||
//first port
|
||||
memcpy(retval+retindex ,origVal+c1 ,numbytesperlineperport);
|
||||
retindex += numbytesperlineperport;
|
||||
c1 -= numbytesperlineperport;
|
||||
//second port
|
||||
memcpy(retval+retindex ,origVal+c2 ,numbytesperlineperport);
|
||||
retindex += numbytesperlineperport;
|
||||
c2 -= numbytesperlineperport;
|
||||
}
|
||||
ibytesperpacket += numbytesperlineperport;
|
||||
}
|
||||
if(dynamicrange != 32) {
|
||||
c1 -= 16;
|
||||
c2 -= 16;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//64 bit htonl cuz of endianness
|
||||
for(i=0;i<(1024*(16*dynamicrange)*2)/8;i++){
|
||||
(*(((uint64_t*)retval)+i)) = be64toh(((uint64_t)(*(((uint64_t*)retval)+i))));
|
||||
/*
|
||||
int64_t temp;
|
||||
temp = ((uint64_t)(*(((uint64_t*)retval)+i)));
|
||||
temp = ((temp << 8) & 0xFF00FF00FF00FF00ULL ) | ((temp >> 8) & 0x00FF00FF00FF00FFULL );
|
||||
temp = ((temp << 16) & 0xFFFF0000FFFF0000ULL ) | ((temp >> 16) & 0x0000FFFF0000FFFFULL );
|
||||
temp = (temp << 32) | ((temp >> 32) & 0xFFFFFFFFULL);
|
||||
(*(((uint64_t*)retval)+i)) = temp;
|
||||
*/
|
||||
}
|
||||
/*
|
||||
( (((val) >> 56) & 0x00000000000000FF) | (((val) >> 40) & 0x000000000000FF00) | \
|
||||
(((val) >> 24) & 0x0000000000FF0000) | (((val) >> 8) & 0x00000000FF000000) | \
|
||||
(((val) << 8) & 0x000000FF00000000) | (((val) << 24) & 0x0000FF0000000000) | \
|
||||
(((val) << 40) & 0x00FF000000000000) | (((val) << 56) & 0xFF00000000000000) )
|
||||
*/
|
||||
/*
|
||||
for(i=0;i<(1024*(16*dynamicrange)*2)/4;i++)
|
||||
(*(((uint32_t*)retval)+i)) = htonl((uint32_t)(*(((uint32_t*)retval)+i)));
|
||||
*/
|
||||
arg = index-startIndex;
|
||||
}
|
||||
}
|
||||
|
@ -26,8 +26,9 @@ public:
|
||||
* @param succecc socket creation was successfull
|
||||
* @param rbase pointer to the receiver base
|
||||
* @param pn port number (defaults to default port number)
|
||||
* @param bot mode is bottom if true, else its a top half module
|
||||
*/
|
||||
slsReceiverTCPIPInterface(int &success, slsReceiverBase* rbase, int pn=-1);
|
||||
slsReceiverTCPIPInterface(int &success, slsReceiverBase* rbase, int pn=-1, bool bot=false);
|
||||
|
||||
/**
|
||||
* Sets the port number to listen to.
|
||||
@ -272,6 +273,9 @@ private:
|
||||
/** port number */
|
||||
int portNumber;
|
||||
|
||||
/** true if bottom half module for eiger */
|
||||
bool bottom;
|
||||
|
||||
|
||||
protected:
|
||||
/** Socket */
|
||||
|
@ -31,13 +31,14 @@ using namespace std;
|
||||
|
||||
|
||||
|
||||
slsReceiverUDPFunctions::slsReceiverUDPFunctions():
|
||||
slsReceiverUDPFunctions::slsReceiverUDPFunctions(bool bot):
|
||||
thread_started(0),
|
||||
eth(NULL),
|
||||
latestData(NULL),
|
||||
guiFileName(NULL),
|
||||
guiFrameNumber(0),
|
||||
tengigaEnable(0){
|
||||
tengigaEnable(0),
|
||||
bottom(bot){
|
||||
for(int i=0;i<MAX_NUM_LISTENING_THREADS;i++){
|
||||
udpSocket[i] = NULL;
|
||||
server_port[i] = DEFAULT_UDP_PORTNO+i;
|
||||
@ -443,16 +444,12 @@ void slsReceiverUDPFunctions::setEthernetInterface(char* c){
|
||||
|
||||
|
||||
void slsReceiverUDPFunctions::setUDPPortNo(int p){
|
||||
//for(int i=0;i<numListeningThreads;i++){
|
||||
server_port[0] = p;
|
||||
//}
|
||||
server_port[0] = p;
|
||||
}
|
||||
|
||||
|
||||
void slsReceiverUDPFunctions::setUDPPortNo2(int p){
|
||||
//for(int i=0;i<numListeningThreads;i++){
|
||||
server_port[1] = p;
|
||||
//}
|
||||
server_port[1] = p;
|
||||
}
|
||||
|
||||
|
||||
@ -885,6 +882,15 @@ void slsReceiverUDPFunctions::copyFrameToGui(char* startbuf[], uint32_t fnum, ch
|
||||
|
||||
int slsReceiverUDPFunctions::createUDPSockets(){
|
||||
|
||||
int port[2];
|
||||
port[0] = server_port[0];
|
||||
port[1] = server_port[1];
|
||||
|
||||
/** eiger specific */
|
||||
if(bottom){
|
||||
port[0] = server_port[1];
|
||||
port[1] = server_port[0];
|
||||
}
|
||||
|
||||
//if eth is mistaken with ip address
|
||||
if (strchr(eth,'.')!=NULL)
|
||||
@ -897,14 +903,14 @@ int slsReceiverUDPFunctions::createUDPSockets(){
|
||||
cout<<"warning:eth is empty.listening to all"<<endl;
|
||||
|
||||
for(int i=0;i<numListeningThreads;i++)
|
||||
udpSocket[i] = new genericSocket(server_port[i],genericSocket::UDP,bufferSize);
|
||||
udpSocket[i] = new genericSocket(port[i],genericSocket::UDP,bufferSize);
|
||||
}
|
||||
//normal socket
|
||||
else{
|
||||
cout<<"eth:"<<eth<<endl;
|
||||
|
||||
for(int i=0;i<numListeningThreads;i++)
|
||||
udpSocket[i] = new genericSocket(server_port[i],genericSocket::UDP,bufferSize,eth);
|
||||
udpSocket[i] = new genericSocket(port[i],genericSocket::UDP,bufferSize,eth);
|
||||
}
|
||||
|
||||
//error
|
||||
@ -912,10 +918,10 @@ int slsReceiverUDPFunctions::createUDPSockets(){
|
||||
for(int i=0;i<numListeningThreads;i++){
|
||||
iret = udpSocket[i]->getErrorStatus();
|
||||
if(!iret)
|
||||
cout << "UDP port opened at port " << server_port[i] << endl;
|
||||
cout << "UDP port opened at port " << port[i] << endl;
|
||||
else{
|
||||
#ifdef VERBOSE
|
||||
cout << "Could not create UDP socket on port " << server_port[i] << " error:" << iret << endl;
|
||||
cout << "Could not create UDP socket on port " << port[i] << " error:" << iret << endl;
|
||||
#endif
|
||||
return FAIL;
|
||||
}
|
||||
@ -1351,7 +1357,7 @@ int slsReceiverUDPFunctions::startReceiver(char message[]){
|
||||
cout << endl << message << endl;
|
||||
return FAIL;
|
||||
}
|
||||
cout << "UDP socket(s) created successfully. 1st port " << server_port[0] << endl;
|
||||
cout << "UDP socket(s) created successfully." << endl;
|
||||
|
||||
|
||||
if(setupWriter() == FAIL){
|
||||
@ -1540,9 +1546,9 @@ int slsReceiverUDPFunctions::startListening(){
|
||||
expected = maxBufferSize - carryonBufferSize;
|
||||
}
|
||||
|
||||
#ifdef VERYDEBUG
|
||||
//#ifdef VERYDEBUG
|
||||
cout << ithread << " *** rc:" << dec << rc << ". expected:" << dec << expected << endl;
|
||||
#endif
|
||||
//#endif
|
||||
|
||||
|
||||
|
||||
@ -1954,9 +1960,9 @@ int i;
|
||||
#endif
|
||||
pthread_mutex_unlock(&(status_mutex));
|
||||
|
||||
#ifdef VERYDEBUG
|
||||
//#ifdef VERYDEBUG
|
||||
cout << ithread << ": Frames listened to " << dec << ((totalListeningFrameCount[ithread]*numListeningThreads)/packetsPerFrame) << endl;
|
||||
#endif
|
||||
//#endif
|
||||
|
||||
//waiting for all listening threads to be done, to print final count of frames listened to
|
||||
if(ithread == 0){
|
||||
|
@ -40,7 +40,7 @@ public:
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
slsReceiverUDPFunctions();
|
||||
slsReceiverUDPFunctions(bool bot);
|
||||
|
||||
/**
|
||||
* Destructor
|
||||
@ -768,6 +768,9 @@ private:
|
||||
* 2 we open, close, write file, callback does not do anything */
|
||||
int cbAction;
|
||||
|
||||
/** true if bottom half module for eiger */
|
||||
bool bottom;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user