From 47a769e677975064011e90e4133e0bad6657f3e3 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 15 Mar 2017 15:00:01 +0100 Subject: [PATCH] modified users receiver to have all objects defined in one --- Makefile | 2 +- users/mainReceiver.cpp | 196 ++++++++++++++++++++++++----------------- users/userReceiver | Bin 12882 -> 13780 bytes 3 files changed, 115 insertions(+), 83 deletions(-) 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 71ceb8aee896727ee289800d52dda3bb1d18c845..2e1fe78864490ca3f6ae7a8e29a2bd26db4ed2ae 100755 GIT binary patch literal 13780 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 TMIocbKCL*(@`Lq14(a_b7~6QQ