diff --git a/Makefile b/Makefile index aa03de7a2..0198450eb 100755 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ $(info ) .PHONY: all nonstatic static lib libreceiver textclient receiver gui stextclient sreceiver -all: lib textclient receiver gui +all: lib textclient receiver#gui nonstatic: lib libreceiver textclient receiver gui diff --git a/users/mainReceiver.cpp b/users/mainReceiver.cpp index 0d29055f9..ac9a02166 100644 --- a/users/mainReceiver.cpp +++ b/users/mainReceiver.cpp @@ -11,16 +11,26 @@ #include "utilities.h" #include "logger.h" + +#include using namespace std; -slsReceiverUsers *receiver; +#define NUM_RECEIVERS 2 +#define START_TCP_PORT 1954 +#define PRINT_IN_COLOR(c,f, ...) printf ("\033[%dm" f RESET, 30 + c+1, ##__VA_ARGS__) -void deleteReceiver(slsReceiverUsers* r){ - if(r){delete r;r=0;} +slsReceiverUsers *receivers[NUM_RECEIVERS]; + +void deleteReceiver(slsReceiverUsers* r[]){ + for (int i = 0; i < NUM_RECEIVERS; ++i) + if (r[i]) { + delete r[i]; + r[i] = 0; + } } void closeFile(int p){ - deleteReceiver(receiver); + deleteReceiver(receivers); } @@ -41,9 +51,18 @@ void AcquisitionFinished(uint64_t frames, void*p){ } -void GetData(int index, uint64_t framenum, uint64_t timestamp, uint64_t explength, char* datapointer, uint32_t datasize, FILE* descriptor, void* p){ - printf("GetData: index:%d framenum: %llu, timestamp: %llu, explength:%llu, firstbytedata: 0x%x datsize: %u\n", - index, framenum, timestamp, explength,((uint8_t)(*((uint8_t*)(datapointer)))), datasize); +void GetData(uint64_t frameNumber, uint32_t expLength, uint32_t packetNumber, uint64_t bunchId, uint64_t timestamp, + uint16_t modId, uint16_t xCoord, uint16_t yCoord, uint16_t zCoord, uint32_t debug, uint16_t roundRNumber, uint8_t detType, uint8_t version, + char* datapointer, uint32_t datasize, FILE* filedescriptor, void* p){ + + PRINT_IN_COLOR (xCoord, + "%d GetData: \n" + "frameNumber: %llu\t\texpLength: %u\t\tpacketNumber: %u\t\tbunchId: %llu\t\ttimestamp: %llu\t\tmodId: %u\t\t" + "xCoord: %u\t\tyCoord: %u\t\tzCoord: %u\t\tdebug: %u\t\troundRNumber: %u\t\tdetType: %u\t\t" + "version: %u\t\tfirstbytedata: 0x%x\t\tdatsize: %u\n\n", + xCoord, frameNumber, expLength, packetNumber, bunchId, timestamp, modId, + xCoord, yCoord, zCoord, debug, roundRNumber, detType, version, + ((uint8_t)(*((uint8_t*)(datapointer)))), datasize); } @@ -55,85 +74,98 @@ int main(int argc, char *argv[]) { signal(SIGINT,closeFile); int ret = slsReceiverDefs::OK; - receiver = new slsReceiverUsers(argc, argv, ret); + int narg= 3; - if(ret==slsReceiverDefs::FAIL){ - deleteReceiver(receiver); - return -1; + for (int i = 0; i < NUM_RECEIVERS; ++i) { + + char temp[10]; + sprintf(temp,"%d",START_TCP_PORT + i); + char* args[] = {(char*)"ignored", (char*)"--rx_tcpport", temp}; + + cprintf(BLUE,"Starting Receiver %d\n", i); + receivers[i] = new slsReceiverUsers(narg, args, ret); + if(ret==slsReceiverDefs::FAIL){ + deleteReceiver(receivers); + return -1; + } + + //register callbacks + + /** + * Call back for start acquisition + * callback arguments are + * filepath + * filename + * fileindex + * datasize + * + * return value is + * 0 callback takes care of open,close,wrie file + * 1 callback writes file, we have to open, close it + * 2 we open, close, write file, callback does not do anything + */ + printf("Registering StartAcq()\n"); + receivers[i]->registerCallBackStartAcquisition(StartAcq, NULL); + + /** + * Call back for acquisition finished + * callback argument is + * total frames caught + */ + printf("Registering AcquisitionFinished()\n"); + receivers[i]->registerCallBackAcquisitionFinished(AcquisitionFinished, NULL); + + /** + * Call back for raw data + * args to raw data ready callback are + * frameNumber is the frame number + * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others) + * packetNumber is the packet number + * bunchId is the bunch id from beamline + * timestamp is the time stamp with 10 MHz clock + * modId is the unique module id (unique even for left, right, top, bottom) + * xCoord is the x coordinate in the complete detector system + * yCoord is the y coordinate in the complete detector system + * zCoord is the z coordinate in the complete detector system + * debug is for debugging purposes + * roundRNumber is the round robin set number + * detType is the detector type see :: detectorType + * version is the version number of this structure format + * dataPointer is the pointer to the data + * dataSize in bytes is the size of the data in bytes + * fileDescriptor is the file descriptor + */ + printf("Registering GetData() \n"); + receivers[i]->registerCallBackRawDataReady(GetData,NULL); + + + //start tcp server thread + ret = receivers[i]->start(); + if(ret == slsReceiverDefs::FAIL){ + for (int i = 0; i < i; ++i) + receivers[i]->stop(); + deleteReceiver(receivers); + return -1; + } } - - //register callbacks - - - /** - callback arguments are - filepath - filename - fileindex - datasize - - return value is - 0 raw data ready callback takes care of open,close,write file - 1 callback writes file, we have to open, close it - 2 we open, close, write file, callback does not do anything - - registerCallBackStartAcquisition(int (*func)(char*, char*,int, int, void*),void *arg); - */ - //receiver->registerCallBackStartAcquisition(func,arg); - - printf("Registering StartAcq()\n"); - receiver->registerCallBackStartAcquisition(StartAcq, NULL); - - - - /** - callback argument is - total farmes caught - registerCallBackAcquisitionFinished(void (*func)(int, void*),void *arg); - */ - //receiver->registerCallBackAcquisitionFinished(func,arg); - - printf("Registering AcquisitionFinished()\n"); - receiver->registerCallBackAcquisitionFinished(AcquisitionFinished, NULL); - - - /** - args to raw data ready callback are - framenum - datapointer - file descriptor - guidatapointer (NULL, no data required) - - NEVER DELETE THE DATA POINTER - REMEMBER THAT THE CALLBACK IS BLOCKING - - registerCallBackRawDataReady(void (*func)(int, char*, FILE*, char*, void*),void *arg); - - */ - //receiver->registerCallBackRawDataReady(func,arg); - - printf("Registering GetData() \n"); - receiver->registerCallBackRawDataReady(GetData,NULL); - - - /* start receiver to listen for commands from the client (and data from detectors when expected */ - receiver->start(); - - //start tcp server thread - if(receiver->start() == slsReceiverDefs::OK){ - FILE_LOG(logDEBUG1) << "DONE!" << endl; - string str; + FILE_LOG(logDEBUG1) << "DONE!" << endl; + cprintf( BLUE, "Type \'q\' to exit\n"); + string str; + cin>>str; + //wait and look for an exit keyword + while(str.find("q") == string::npos) cin>>str; - //wait and look for an exit keyword - while(str.find("exit") == string::npos) - cin>>str; - //stop tcp server thread, stop udp socket - receiver->stop(); - } - - - return 0; + //stop tcp server thread, stop udp socket + for (int i = 0; i < NUM_RECEIVERS; ++i) + receivers[i]->stop(); + + + deleteReceiver(receivers); + + + + return 0; } diff --git a/users/userReceiver b/users/userReceiver index 71ceb8aee..2e1fe7886 100755 Binary files a/users/userReceiver and b/users/userReceiver differ