From 983f517e07c34cc436dacb6a535a437c93ab4233 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 15 Dec 2016 14:04:37 +0100 Subject: [PATCH] added users to the package --- users/Makefile | 25 +++++++ users/Makefile_new | 24 +++++++ users/mainClient.cpp | 78 ++++++++++++++++++++++ users/mainClient_new.cpp | 86 ++++++++++++++++++++++++ users/mainReceiver.cpp | 138 +++++++++++++++++++++++++++++++++++++++ users/userClient | Bin 0 -> 13897 bytes users/userReceiver | Bin 0 -> 12769 bytes 7 files changed, 351 insertions(+) create mode 100644 users/Makefile create mode 100644 users/Makefile_new create mode 100644 users/mainClient.cpp create mode 100644 users/mainClient_new.cpp create mode 100644 users/mainReceiver.cpp create mode 100755 users/userClient create mode 100755 users/userReceiver diff --git a/users/Makefile b/users/Makefile new file mode 100644 index 000000000..892283037 --- /dev/null +++ b/users/Makefile @@ -0,0 +1,25 @@ +WD = $(shell pwd) +LIBDIR = $(WD)/../bin +LIBRARYRXRDIR = $(WD)/../slsReceiverSoftware +LIBRARYDETDIR = $(WD)/../slsDetectorSoftware +LDFLAGRXR = -L$(LIBDIR) -lSlsReceiver -L/usr/lib64/ -lpthread +LDFLAGDET = -L$(LIBDIR) -lSlsDetector -L/usr/lib64/ -lpthread +INCLUDESRXR = -I $(LIBRARYRXRDIR)/include +INCLUDESDET = -I $(LIBRARYRXRDIR)/include -I $(LIBRARYDETDIR)/slsDetector -I $(LIBRARYDETDIR)/slsDetectorAnalysis + + + +all: receivers users + +receivers: + @echo $(WD) + g++ mainReceiver.cpp $(INCLUDESRXR) $(LDFLAGRXR) -o userReceiver + +users: + @echo $(WD) + g++ mainClient.cpp $(INCLUDESDET) $(LDFLAGDET) -o userClient + + +clean: + rm userReceiver userClient + diff --git a/users/Makefile_new b/users/Makefile_new new file mode 100644 index 000000000..ddc005018 --- /dev/null +++ b/users/Makefile_new @@ -0,0 +1,24 @@ +WD = $(shell pwd) +LIBDIR = $(WD)/../bin +LIBRARYRXRDIR = $(WD)/../slsReceiverSoftware +LIBRARYDETDIR = $(WD)/../slsDetectorSoftware +LDFLAGRXR = -L$(LIBDIR) -lSlsReceiver -L/usr/lib64/ -lpthread +LDFLAGDET = -L$(LIBDIR) -lSlsDetector -L/usr/lib64/ -lpthread +INCLUDESRXR = -I $(LIBRARYRXRDIR)/include +INCLUDESDET = -I $(LIBRARYDETDIR)/slsDetector -I $(LIBRARYDETDIR)/slsDetectorAnalysis + + + +all: receivers users + +receivers: + @echo $(WD) + g++ mainReceiver.cpp $(INCLUDESRXR) $(LDFLAGRXR) -o userReceiver + +users: + @echo $(WD) + g++ mainClient.cpp $(INCLUDESDET) $(LDFLAGDET) -o userClient + + +clean: + rm userReceiver userClient diff --git a/users/mainClient.cpp b/users/mainClient.cpp new file mode 100644 index 000000000..df03ad74e --- /dev/null +++ b/users/mainClient.cpp @@ -0,0 +1,78 @@ +/** +\file mainClient.cpp + +This file is an example of how to implement the slsDetectorUsers class +You can compile it linking it to the slsDetector library + +gcc mainClient.cpp -L lib -l SlsDetector -lm -lpthread + +where lib is the location of libSlsDetector.so +gcc mainClient.cpp -L . -l SlsDetector -lm -lpthread -o users + +*/ + +#include +#include "slsDetectorUsers.h" +#include "detectorData.h" +#include + +/** Definition of the data callback which simply prints out the number of points received and teh frame number */ +int dataCallback(detectorData *pData, int iframe, int isubframe, void *pArg) +{ + std::cout << "dataCallback: " << pData->npoints << " " << pData->npy << "Frame number: " << iframe << std::endl; +} + + +/**example of a main program using the slsDetectorUsers class */ +int main(int argc, char **argv) { + int id=0; + /** if specified, argv[3] is used as detector ID (default is 0)*/ + if (argc>=4) + id=atoi(argv[3]); + + + + /** slsDetectorUsers is instantiated */ + slsDetectorUsers *pDetector = new slsDetectorUsers (id); + + + /** if specified, argv[1] is used as detector config file (necessary at least the first time it is called to properly configure advanced settings in the shared memory)*/ + if (argc>=2){ + pDetector->readConfigurationFile(argv[1]); + cout<<"Detector configured" << endl; + } + /** registering data callback */ + //pDetector->registerDataCallback(&dataCallback, NULL); + //pDetector->enableDataStreamingFromReceiver(1); + + /** checking detector status and exiting if not idle */ + int status = pDetector->getDetectorStatus(); + if (status != 0){ + std::cout << "Detector not ready: " << slsDetectorUsers::runStatusType(status) << std::endl; + return 1; + } + + /** load detector settings */ + if (argc>=3){ + pDetector->retrieveDetectorSetup(argv[2]); + cout<<"Detector measurement set-up done" << endl; + } + /** start measurement */ + pDetector->startMeasurement(); + cout<<"started measurement"<getDetectorStatus(); + if (status == 0 || status == 1|| status == 3) + break; + }*/ + cout<<"measurement finished"< +#include "slsDetectorUsers.h" +#include "detectorData.h" +#include + +/** Definition of the data callback which simply prints out the number of points received and teh frame number */ +int dataCallback(detectorData *pData, int iframe, void *pArg) +{ + std::cout << "dataCallback: " << pData->npoints << " " << pData->npy << "Frame number: " << iframe << std::endl; +} + + +/**example of a main program using the slsDetectorUsers class */ +int main(int argc, char **argv) { + int id=0; + /** if specified, argv[3] is used as detector ID (default is 0)*/ + if (argc>=4) + id=atoi(argv[3]); + + + + /** slsDetectorUsers is instantiated */ + slsDetectorUsers *pDetector = new slsDetectorUsers (id); + + + char* argse[1]; + argse[0] = (char*)"free"; + pDetector->getCommand(1, argse, 0); + + /** if specified, argv[1] is used as detector config file (necessary at least the first time it is called to properly configure advanced settings in the shared memory)*/ + if (argc>=2){ + pDetector->readConfigurationFile(argv[1]); + cout<<"Detector configured" << endl; + } + + + /** registering data callback */ + // pDetector->registerDataCallback(&dataCallback, NULL); + + /** checking detector status and exiting if not idle */ + /* int status = pDetector->getDetectorStatus(); + if (status != 0){ + std::cout << "Detector not ready: " << slsDetectorUsers::runStatusType(status) << std::endl; + return 1; + } +*/ + /** load detector settings */ + /* if (argc>=3){ + pDetector->retrieveDetectorSetup(argv[2]); + cout<<"Detector measurement set-up done" << endl; + } + */ + /** start measurement */ + /* pDetector->startMeasurement(); + cout<<"started measurement"<getDetectorStatus(); + if (status == 0 || status == 1|| status == 3) + break; + } + cout<<"measurement finished"< +#include +#include //SIGINT +#include //system + +#include "utilities.h" +#include "logger.h" +using namespace std; + +slsReceiverUsers *receiver; + +void deleteReceiver(slsReceiverUsers* r){ + if(r){delete r;r=0;} +} + +void closeFile(int p){ + deleteReceiver(receiver); +} + + + + +int StartAcq(char* filepath, char*filename,int fileindex, int datasize, void*p){ + printf("--StartAcq: filepath:%s filename:%s fileindex:%d datasize:%d\n", + filepath, filename, fileindex, datasize); + + printf("--StartAcq: returning 0\n"); + return 0; +} + + +void AcquisitionFinished(int frames, void*p){ + printf("AcquisitionFinished: frames:%d \n",frames); + +} + + +void GetData(int framenum, char* datapointer, int datasize, FILE* descriptor, char* gui, void* p){ + printf("GetData: framenum: %d(%d)\n", framenum, *(int*)datapointer); + +} + + + +int main(int argc, char *argv[]) { + + //Catch signal SIGINT to close files properly + signal(SIGINT,closeFile); + + int ret = slsReceiverDefs::OK; + receiver = new slsReceiverUsers(argc, argv, ret); + + if(ret==slsReceiverDefs::FAIL){ + deleteReceiver(receiver); + 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; + 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; +} + diff --git a/users/userClient b/users/userClient new file mode 100755 index 0000000000000000000000000000000000000000..80f8c8af2e9d2f4fc44cbd319a4820600dc8f2c6 GIT binary patch literal 13897 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 MTrDH`Q4Y#~0}0JBDgXcg literal 0 HcmV?d00001