somewere stuck with virtual template overloading

This commit is contained in:
Dhanya Maliakal
2017-03-23 11:56:17 +01:00
parent 300b014f73
commit b9eb3d5a52
25 changed files with 407 additions and 244 deletions

View File

@ -46,6 +46,12 @@ class BinaryFile : private virtual slsReceiverDefs, public File, public BinaryFi
*/ */
void PrintMembers(); void PrintMembers();
/**
* Get File Handle pointer
* @returns file handle pointer
*/
FILE* GetFileHandle();
/** /**
* Create file * Create file
* @param fnum current frame index to include in file name * @param fnum current frame index to include in file name

View File

@ -34,7 +34,8 @@ class DataProcessor : private virtual slsReceiverDefs, public ThreadObject {
*/ */
DataProcessor(Fifo*& f, fileFormat* ftype, bool* fwenable, bool* dsEnable, DataProcessor(Fifo*& f, fileFormat* ftype, bool* fwenable, bool* dsEnable,
int* cbaction, int* cbaction,
void (*dataReadycb)(int, char*, int, FILE*, char*, void*), void (*dataReadycb)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t,
char*, uint32_t, FILE*, void*),
void *pDataReadycb); void *pDataReadycb);
/** /**
@ -293,19 +294,32 @@ class DataProcessor : private virtual slsReceiverDefs, public ThreadObject {
int* callbackAction; int* callbackAction;
/** /**
* function being called back for raw data * Call back for raw data
* args to raw data ready callback are * args to raw data ready callback are
* framenum * frameNumber is the frame number
* datapointer * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others)
* datasize in bytes * packetNumber is the packet number
* file descriptor * bunchId is the bunch id from beamline
* guidatapointer (NULL, no data required) * 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
*/ */
void (*rawDataReadyCallBack)(int, char*, int, FILE*, char*, void*); void (*rawDataReadyCallBack)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t,
char*, uint32_t, FILE*, void*);
void *pRawDataReady; void *pRawDataReady;
}; };

View File

@ -125,11 +125,6 @@ class DataStreamer : private virtual slsReceiverDefs, public ThreadObject {
*/ */
bool IsRunning(); bool IsRunning();
/**
* Create Part1 of Json Header which includes common attributes in an acquisition
*/
void CreateHeaderPart1();
/** /**
* Record First Indices (firstAcquisitionIndex, firstMeasurementIndex) * Record First Indices (firstAcquisitionIndex, firstMeasurementIndex)
* @param fnum frame index to record * @param fnum frame index to record
@ -172,12 +167,11 @@ class DataStreamer : private virtual slsReceiverDefs, public ThreadObject {
/** /**
* Create and send Json Header * Create and send Json Header
* @param fnum frame number * @param header header of image
* @param snum sub frame number
* @param dummy true if its a dummy header * @param dummy true if its a dummy header
* @returns 0 if error, else 1 * @returns 0 if error, else 1
*/ */
int SendHeader(uint64_t fnum, uint32_t snum, bool dummy = false); int SendHeader(sls_detector_header* header, bool dummy = false);
/** type of thread */ /** type of thread */
static const std::string TypeName; static const std::string TypeName;
@ -227,9 +221,6 @@ class DataStreamer : private virtual slsReceiverDefs, public ThreadObject {
/** timer beginning stamp for random streaming */ /** timer beginning stamp for random streaming */
struct timespec timerBegin; struct timespec timerBegin;
/** Current Json Header prefix*/
char* currentHeader;
/** Aquisition Started flag */ /** Aquisition Started flag */
bool acquisitionStartedFlag; bool acquisitionStartedFlag;

View File

@ -11,6 +11,15 @@
#include "sls_receiver_defs.h" #include "sls_receiver_defs.h"
#include "logger.h" #include "logger.h"
#ifdef HDF5C
//#ifndef HDF5DEFINED
//#define HDF5DEFINED
#include "H5Cpp.h"
#ifndef H5_NO_NAMESPACE
using namespace H5;
#endif
#endif
//#endif
#include <string> #include <string>
@ -58,6 +67,15 @@ class File : private virtual slsReceiverDefs {
*/ */
virtual fileFormat GetFileType() = 0; virtual fileFormat GetFileType() = 0;
/**
* Get File Handle pointer
* @returns file handle pointer
*/
virtual FILE* GetBinaryFileHandle() {return NULL;};
#ifdef HDF5C
virtual H5File* GetHDF5FileHandle() {return NULL;};
#endif
/** /**
* Get Member Pointer Values before the object is destroyed * Get Member Pointer Values before the object is destroyed
* @param nd pointer to number of detectors in each dimension * @param nd pointer to number of detectors in each dimension

View File

@ -230,7 +230,7 @@ class GotthardData : public GeneralData {
packetIndexMask = 1; packetIndexMask = 1;
maxFramesPerFile = MAX_FRAMES_PER_FILE; maxFramesPerFile = MAX_FRAMES_PER_FILE;
fifoBufferSize = imageSize; fifoBufferSize = imageSize;
fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsReceiverDefs::sls_detector_header);
defaultFifoDepth = 25000; defaultFifoDepth = 25000;
nPixelsX_Streamer = nPixelsX; nPixelsX_Streamer = nPixelsX;
nPixelsY_Streamer = nPixelsY; nPixelsY_Streamer = nPixelsY;
@ -256,7 +256,7 @@ class ShortGotthardData : public GeneralData {
frameIndexMask = 0xFFFFFFFF; frameIndexMask = 0xFFFFFFFF;
maxFramesPerFile = SHORT_MAX_FRAMES_PER_FILE; maxFramesPerFile = SHORT_MAX_FRAMES_PER_FILE;
fifoBufferSize = imageSize; fifoBufferSize = imageSize;
fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsReceiverDefs::sls_detector_header);
defaultFifoDepth = 25000; defaultFifoDepth = 25000;
nPixelsX_Streamer = 1280; nPixelsX_Streamer = 1280;
nPixelsY_Streamer = 1; nPixelsY_Streamer = 1;
@ -321,7 +321,7 @@ class PropixData : public GeneralData {
packetIndexMask = 1; packetIndexMask = 1;
maxFramesPerFile = MAX_FRAMES_PER_FILE; maxFramesPerFile = MAX_FRAMES_PER_FILE;
fifoBufferSize = imageSize; fifoBufferSize = imageSize;
fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsReceiverDefs::sls_detector_header);
defaultFifoDepth = 25000; defaultFifoDepth = 25000;
nPixelsX_Streamer = nPixelsX; nPixelsX_Streamer = nPixelsX;
nPixelsY_Streamer = nPixelsY; nPixelsY_Streamer = nPixelsY;
@ -352,7 +352,7 @@ class Moench02Data : public GeneralData {
packetIndexMask = 0xFF; packetIndexMask = 0xFF;
maxFramesPerFile = MOENCH_MAX_FRAMES_PER_FILE; maxFramesPerFile = MOENCH_MAX_FRAMES_PER_FILE;
fifoBufferSize = imageSize; fifoBufferSize = imageSize;
fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsReceiverDefs::sls_detector_header);
defaultFifoDepth = 2500; defaultFifoDepth = 2500;
nPixelsX_Streamer = nPixelsX; nPixelsX_Streamer = nPixelsX;
nPixelsY_Streamer = nPixelsY; nPixelsY_Streamer = nPixelsY;
@ -388,7 +388,7 @@ class Moench03Data : public GeneralData {
packetIndexMask = 0xFFFFFFFF; packetIndexMask = 0xFFFFFFFF;
maxFramesPerFile = JFRAU_MAX_FRAMES_PER_FILE; maxFramesPerFile = JFRAU_MAX_FRAMES_PER_FILE;
fifoBufferSize = imageSize; fifoBufferSize = imageSize;
fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsReceiverDefs::sls_detector_header);
defaultFifoDepth = 2500; defaultFifoDepth = 2500;
nPixelsX_Streamer = nPixelsX; nPixelsX_Streamer = nPixelsX;
nPixelsY_Streamer = nPixelsY; nPixelsY_Streamer = nPixelsY;
@ -416,7 +416,7 @@ class JCTBData : public GeneralData {
imageSize = dataSize*packetsPerFrame; imageSize = dataSize*packetsPerFrame;
maxFramesPerFile = JFCTB_MAX_FRAMES_PER_FILE; maxFramesPerFile = JFCTB_MAX_FRAMES_PER_FILE;
fifoBufferSize = imageSize; fifoBufferSize = imageSize;
fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsReceiverDefs::sls_detector_header);
defaultFifoDepth = 2500; defaultFifoDepth = 2500;
nPixelsX_Streamer = nPixelsX; nPixelsX_Streamer = nPixelsX;
nPixelsY_Streamer = nPixelsY; nPixelsY_Streamer = nPixelsY;
@ -463,7 +463,7 @@ private:
imageSize = dataSize*packetsPerFrame; imageSize = dataSize*packetsPerFrame;
maxFramesPerFile = JFRAU_MAX_FRAMES_PER_FILE; maxFramesPerFile = JFRAU_MAX_FRAMES_PER_FILE;
fifoBufferSize = imageSize; fifoBufferSize = imageSize;
fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsReceiverDefs::sls_detector_header);
defaultFifoDepth = 2500; defaultFifoDepth = 2500;
nPixelsX_Streamer = nPixelsX; nPixelsX_Streamer = nPixelsX;
nPixelsY_Streamer = nPixelsY; nPixelsY_Streamer = nPixelsY;
@ -553,7 +553,7 @@ private:
frameIndexMask = 0xffffff; frameIndexMask = 0xffffff;
maxFramesPerFile = EIGER_MAX_FRAMES_PER_FILE; maxFramesPerFile = EIGER_MAX_FRAMES_PER_FILE;
fifoBufferSize = imageSize; fifoBufferSize = imageSize;
fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsReceiverDefs::sls_detector_header);
defaultFifoDepth = 100; defaultFifoDepth = 100;
footerOffset = headerSizeinPacket + dataSize; footerOffset = headerSizeinPacket + dataSize;
threadsPerReceiver = 2; threadsPerReceiver = 2;

View File

@ -12,10 +12,14 @@
#include "File.h" #include "File.h"
#include "HDF5FileStatic.h" #include "HDF5FileStatic.h"
//#ifndef HDF5DEFINED
//#define HDF5DEFINED
#include "H5Cpp.h" #include "H5Cpp.h"
#ifndef H5_NO_NAMESPACE #ifndef H5_NO_NAMESPACE
using namespace H5; using namespace H5;
#endif #endif
//#endif
#include <string> #include <string>
@ -54,6 +58,12 @@ class HDF5File : private virtual slsReceiverDefs, public File, public HDF5FileSt
*/ */
void PrintMembers(); void PrintMembers();
/**
* Get File Handle pointer
* @returns file handle pointer
*/
H5File* GetHDF5FileHandle();
/** /**
* Set Number of pixels * Set Number of pixels
* @param nx number of pixels in x direction * @param nx number of pixels in x direction

View File

@ -518,31 +518,42 @@ class UDPBaseImplementation : protected virtual slsReceiverDefs, public UDPInter
* fileindex * fileindex
* datasize * datasize
* *
* return value is the action which decides what the user and default responsibilities to save data are * return value is
* 0 callback takes care of open,close,wrie file * 0 callback takes care of open,close,wrie file
* 1 callback writes file, we have to open, close it * 1 callback writes file, we have to open, close it
* 2 we open, close, write file, callback does not do anything * 2 we open, close, write file, callback does not do anything
*/ */
void registerCallBackStartAcquisition(int (*func)(char*, char*,int, int, void*),void *arg); void registerCallBackStartAcquisition(int (*func)(char*, char*, uint64_t, uint32_t, void*),void *arg);
/** /**
* Call back for acquisition finished * Call back for acquisition finished
* callback argument is * callback argument is
* total frames caught * total frames caught
*/ */
void registerCallBackAcquisitionFinished(void (*func)(int, void*),void *arg); void registerCallBackAcquisitionFinished(void (*func)(uint64_t, void*),void *arg);
/** /**
* Call back for raw data * Call back for raw data
* args to raw data ready callback are * args to raw data ready callback are
* framenum * frameNumber is the frame number
* datapointer * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others)
* datasize in bytes * packetNumber is the packet number
* file descriptor * bunchId is the bunch id from beamline
* guidatapointer (NULL, no data required) * 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
*/ */
void registerCallBackRawDataReady(void (*func)(int, char*, int, FILE*, char*, void*),void *arg); void registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t,
char*, uint32_t, FILE*, void*),void *arg);
@ -623,7 +634,7 @@ class UDPBaseImplementation : protected virtual slsReceiverDefs, public UDPInter
//***callback parameters*** //***callback parameters***
/** /**
* function being called back for start acquisition * Call back for start acquisition
* callback arguments are * callback arguments are
* filepath * filepath
* filename * filename
@ -635,31 +646,42 @@ class UDPBaseImplementation : protected virtual slsReceiverDefs, public UDPInter
* 1 callback writes file, we have to open, close it * 1 callback writes file, we have to open, close it
* 2 we open, close, write file, callback does not do anything * 2 we open, close, write file, callback does not do anything
*/ */
int (*startAcquisitionCallBack)(char*, char*,int, int, void*); int (*startAcquisitionCallBack)(char*, char*, uint64_t, uint32_t, void*);
void *pStartAcquisition; void *pStartAcquisition;
/** /**
* function being called back for acquisition finished * Call back for acquisition finished
* callback argument is * callback argument is
* total frames caught * total frames caught
*/ */
void (*acquisitionFinishedCallBack)(int, void*); void (*acquisitionFinishedCallBack)(uint64_t, void*);
void *pAcquisitionFinished; void *pAcquisitionFinished;
/** /**
* function being called back for raw data * Call back for raw data
* args to raw data ready callback are * args to raw data ready callback are
* framenum * frameNumber is the frame number
* datapointer * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others)
* datasize in bytes * packetNumber is the packet number
* file descriptor * bunchId is the bunch id from beamline
* guidatapointer (NULL, no data required) * 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
*/ */
void (*rawDataReadyCallBack)(int, char*, int, FILE*, char*, void*); void (*rawDataReadyCallBack)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t,
char*, uint32_t, FILE*, void*);
void *pRawDataReady; void *pRawDataReady;
private:
private:
}; };

View File

@ -582,25 +582,37 @@ class UDPInterface {
* 1 callback writes file, we have to open, close it * 1 callback writes file, we have to open, close it
* 2 we open, close, write file, callback does not do anything * 2 we open, close, write file, callback does not do anything
*/ */
virtual void registerCallBackStartAcquisition(int (*func)(char*, char*,int, int, void*),void *arg) = 0; virtual void registerCallBackStartAcquisition(int (*func)(char*, char*, uint64_t, uint32_t, void*),void *arg) = 0;
/** /**
* Call back for acquisition finished * Call back for acquisition finished
* callback argument is * callback argument is
* total frames caught * total frames caught
*/ */
virtual void registerCallBackAcquisitionFinished(void (*func)(int, void*),void *arg) = 0; virtual void registerCallBackAcquisitionFinished(void (*func)(uint64_t, void*),void *arg) = 0;
/** /**
* Call back for raw data * Call back for raw data
* args to raw data ready callback are * args to raw data ready callback are
* framenum * frameNumber is the frame number
* datapointer * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others)
* datasize in bytes * packetNumber is the packet number
* file descriptor * bunchId is the bunch id from beamline
* guidatapointer (NULL, no data required) * 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
*/ */
virtual void registerCallBackRawDataReady(void (*func)(int, char*, int, FILE*, char*, void*),void *arg) = 0; virtual void registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t,
char*, uint32_t, FILE*, void*),void *arg) = 0;
protected: protected:

View File

@ -59,13 +59,6 @@ class UDPStandardImplementation: private virtual slsReceiverDefs, public UDPBase
*/ */
void setFileFormat(slsReceiverDefs::fileFormat f); void setFileFormat(slsReceiverDefs::fileFormat f);
/**
* Set File Name Prefix (without frame index, file index and extension (_f000000000000_8.raw))
* Does not check for file existence since it is created only at startReceiver
* @param c file name (max of 1000 characters)
*/
void setFileName(const char c[]);
/** /**
* Set Short Frame Enabled, later will be moved to getROI (so far only for gotthard) * Set Short Frame Enabled, later will be moved to getROI (so far only for gotthard)
* @param i index of adc enabled, else -1 if all enabled * @param i index of adc enabled, else -1 if all enabled

View File

@ -8,6 +8,7 @@
*/ */
#include "ansi.h" #include "ansi.h"
//#include "sls_receiver_defs.h"
#include <zmq.h> #include <zmq.h>
#include <errno.h> #include <errno.h>
@ -306,23 +307,13 @@ public:
cprintf (RED,"Error: Could not parse header for socket %d\n",index); cprintf (RED,"Error: Could not parse header for socket %d\n",index);
return 0; return 0;
} }
#ifdef VERYVERBOSE if(d["acqIndex"].GetUint64()!=(uint64_t)-1) {
printf("version:%.1f\n", d["version"].GetDouble());
// shape is an array of ints
rapidjson::Value::Array shape = d["shape"].GetArray();
printf("%d: shape: ", index);
for (int i = 0; i < shape.Size(); i++)
printf("%d: %d ", index, shape[i].GetInt());
printf("\n");
printf("%d: type: %s\n", index, d["type"].GetString());
#endif
if(d["acqIndex"].GetUint64()!=-1){
acqIndex = d["acqIndex"].GetUint64(); acqIndex = d["acqIndex"].GetUint64();
frameIndex = d["fIndex"].GetUint64(); frameIndex = d["fIndex"].GetUint64();
subframeIndex = d["subfnum"].GetUint(); subframeIndex = -1;
if(d["bitmode"].GetInt()==32 && d["detType"].GetUint() == slsReceiverDefs::EIGER) {
subframeIndex = d["expLength"].GetUint();
}
filename = d["fname"].GetString(); filename = d["fname"].GetString();
#ifdef VERYVERBOSE #ifdef VERYVERBOSE
cout << "Acquisition index: " << acqIndex << endl; cout << "Acquisition index: " << acqIndex << endl;

View File

@ -15,10 +15,12 @@
#define DO_EVERYTHING 2 #define DO_EVERYTHING 2
//binary file/ fifo //binary file/ fifo
#define FILE_FRAME_HDR_FNUM_SIZE 8
#define FILE_FRAME_HDR_SNUM_SIZE 4 //#define FILE_FRAME_HDR_FNUM_SIZE 8
#define FILE_FRAME_HDR_BID_SIZE 8 //#define FILE_FRAME_HDR_SNUM_SIZE 8
#define FILE_FRAME_HEADER_SIZE (FILE_FRAME_HDR_FNUM_SIZE + FILE_FRAME_HDR_SNUM_SIZE + FILE_FRAME_HDR_BID_SIZE) //#define FILE_FRAME_HDR_BID_SIZE 8
//#define FILE_FRAME_HEADER_SIZE (FILE_FRAME_HDR_FNUM_SIZE + FILE_FRAME_HDR_SNUM_SIZE + FILE_FRAME_HDR_BID_SIZE)
#define FIFO_HEADER_NUMBYTES 4 #define FIFO_HEADER_NUMBYTES 4
#define FILE_BUFFER_SIZE (16*1024*1024) //16mb #define FILE_BUFFER_SIZE (16*1024*1024) //16mb
@ -26,10 +28,10 @@
#define MAX_CHUNKED_IMAGES 1 #define MAX_CHUNKED_IMAGES 1
//versions //versions
#define STREAMER_VERSION 1.0 #define HDF5_WRITER_VERSION 1.0 //1 decimal places
#define HDF5_WRITER_VERSION 1.0 #define BINARY_WRITER_VERSION 1.0 //1 decimal places
#define BINARY_WRITER_VERSION 1.0 //1 decimal places #define SLS_DETECTOR_HEADER_VERSION 0x1
#define SLS_DETECTOR_JSON_HEADER_VERSION 0x2
//parameters to calculate fifo depth //parameters to calculate fifo depth
#define SAMPLE_TIME_IN_NS 100000000//100ms #define SAMPLE_TIME_IN_NS 100000000//100ms

View File

@ -58,28 +58,49 @@ class slsReceiver : private virtual slsReceiverDefs {
int64_t getReceiverVersion(); int64_t getReceiverVersion();
/** /**
@sort register calbback for starting the acquisition * Call back for start acquisition
@param func callback to be called when starting the acquisition. Its arguments are filepath filename fileindex data size * callback arguments are
\returns 0 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 * 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
*/ */
void registerCallBackStartAcquisition(int (*func)(char*, char*,int, int, void*),void *arg); void registerCallBackStartAcquisition(int (*func)(char*, char*, uint64_t, uint32_t, void*),void *arg);
/** /**
callback argument is * Call back for acquisition finished
toatal farmes caught * callback argument is
* total frames caught
*/ */
void registerCallBackAcquisitionFinished(void (*func)(int, void*),void *arg); void registerCallBackAcquisitionFinished(void (*func)(uint64_t, void*),void *arg);
/** /**
args to raw data ready callback are * Call back for raw data
framenum * args to raw data ready callback are
datapointer * frameNumber is the frame number
datasize in bytes * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others)
file descriptor * packetNumber is the packet number
guidatapointer (NULL, no data required) * 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
*/ */
void registerCallBackRawDataReady(void (*func)(int, char*, int, FILE*, char*, void*),void *arg); void registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t,
char*, uint32_t, FILE*, void*),void *arg);
private: private:

View File

@ -64,30 +64,42 @@ class slsReceiverTCPIPInterface : private virtual slsReceiverDefs {
* fileindex * fileindex
* datasize * datasize
* *
* return value is the action which decides what the user and default responsibilities to save data are * return value is
* 0 callback takes care of open,close,wrie file * 0 callback takes care of open,close,wrie file
* 1 callback writes file, we have to open, close it * 1 callback writes file, we have to open, close it
* 2 we open, close, write file, callback does not do anything * 2 we open, close, write file, callback does not do anything
*/ */
void registerCallBackStartAcquisition(int (*func)(char*, char*,int, int, void*),void *arg); void registerCallBackStartAcquisition(int (*func)(char*, char*, uint64_t, uint32_t, void*),void *arg);
/** /**
* Call back for acquisition finished * Call back for acquisition finished
* callback argument is * callback argument is
* total frames caught * total frames caught
*/ */
void registerCallBackAcquisitionFinished(void (*func)(int, void*),void *arg); void registerCallBackAcquisitionFinished(void (*func)(uint64_t, void*),void *arg);
/** /**
* Call back for raw data * Call back for raw data
* args to raw data ready callback are * args to raw data ready callback are
* framenum * frameNumber is the frame number
* datapointer * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others)
* datasize in bytes * packetNumber is the packet number
* file descriptor * bunchId is the bunch id from beamline
* guidatapointer (NULL, no data required) * 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
*/ */
void registerCallBackRawDataReady(void (*func)(int, char*, int, FILE*, char*, void*),void *arg); void registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t,
char*, uint32_t, FILE*, void*),void *arg);
private: private:
@ -290,7 +302,7 @@ private:
//***callback parameters*** //***callback parameters***
/** /**
* function being called back for start acquisition * Call back for start acquisition
* callback arguments are * callback arguments are
* filepath * filepath
* filename * filename
@ -302,31 +314,44 @@ private:
* 1 callback writes file, we have to open, close it * 1 callback writes file, we have to open, close it
* 2 we open, close, write file, callback does not do anything * 2 we open, close, write file, callback does not do anything
*/ */
int (*startAcquisitionCallBack)(char*, char*,int, int, void*); int (*startAcquisitionCallBack)(char*, char*, uint64_t, uint32_t, void*);
void *pStartAcquisition; void *pStartAcquisition;
/** /**
* function being called back for acquisition finished * Call back for acquisition finished
* callback argument is * callback argument is
* total frames caught * total frames caught
*/ */
void (*acquisitionFinishedCallBack)(int, void*); void (*acquisitionFinishedCallBack)(uint64_t, void*);
void *pAcquisitionFinished; void *pAcquisitionFinished;
/** /**
* function being called back for raw data * Call back for raw data
* args to raw data ready callback are * args to raw data ready callback are
* framenum * frameNumber is the frame number
* datapointer * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others)
* datasize in bytes * packetNumber is the packet number
* file descriptor * bunchId is the bunch id from beamline
* guidatapointer (NULL, no data required) * 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
*/ */
void (*rawDataReadyCallBack)(int, char*, int, FILE*, char*, void*); void (*rawDataReadyCallBack)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t,
char*, uint32_t, FILE*, void*);
void *pRawDataReady; void *pRawDataReady;
protected: protected:
/** Socket */ /** Socket */
MySocketTCP* mySock; MySocketTCP* mySock;

View File

@ -50,13 +50,10 @@ public:
/** /**
@sort register calbback for starting the acquisition @sort register calbback for starting the acquisition
\param func callback to be called when starting the acquisition. Its arguments are filepath filename fileindex data size \param func callback to be called when starting the acquisition. Its arguments are filepath, filename, fileindex, datasize
\returns 0 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 \returns 0 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
*/ */
void registerCallBackStartAcquisition(int (*func)(char* filepath, char* filename, uint64_t fileindex, uint32_t datasize, void*),void *arg);
void registerCallBackStartAcquisition(int (*func)(char* filepath, char* filename,int fileindex, int datasize, void*),void *arg);
/** /**
@ -64,20 +61,19 @@ public:
\param func end of acquisition callback. Argument nf is total frames caught \param func end of acquisition callback. Argument nf is total frames caught
\returns nothing \returns nothing
*/ */
void registerCallBackAcquisitionFinished(void (*func)(uint64_t nf, void*),void *arg);
void registerCallBackAcquisitionFinished(void (*func)(int nf, void*),void *arg);
/** /**
@sort register callback to be called when data are available (to process and/or save the data). @sort register callback to be called when data are available (to process and/or save the data).
\param func raw data ready callback. arguments are framenum datapointer datasize file descriptor guidatapointer (NULL, no data required) \param func raw data ready callback. arguments are frameNumber, expLength, packetNumber, bunchId, timestamp, modId, xCoord, yCoord, zCoord, debug, roundRNumber, detType, version, dataPointer, dataSize, fileDescriptor
\returns nothing \returns nothing
*/ */
void registerCallBackRawDataReady(void (*func)(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*),void *arg);
void registerCallBackRawDataReady(void (*func)(int framenumber, char* datapointer, int datasize, FILE* filedescriptor, char* guidatapointer, void*),void *arg);
//receiver object //receiver object
slsReceiver* receiver; slsReceiver* receiver;
}; };

View File

@ -115,6 +115,40 @@ public:
STOPPED /**< acquisition stopped externally */ STOPPED /**< acquisition stopped externally */
}; };
/**
@short structure for a Detector Packet or Image Header
@li frameNumber is the frame number
@li expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others)
@li packetNumber is the packet number
@li bunchId is the bunch id from beamline
@li timestamp is the time stamp with 10 MHz clock
@li modId is the unique module id (unique even for left, right, top, bottom)
@li xCoord is the x coordinate in the complete detector system
@li yCoord is the y coordinate in the complete detector system
@li zCoord is the z coordinate in the complete detector system
@li debug is for debugging purposes
@li roundRNumber is the round robin set number
@li detType is the detector type see :: detectorType
@li version is the version number of this structure format
*/
typedef struct {
uint64_t frameNumber; /**< is the frame number */
uint32_t expLength; /**< is the subframe number (32 bit eiger) or real time exposure time in 100ns (others) */
uint32_t packetNumber; /**< is the packet number */
uint64_t bunchId; /**< is the bunch id from beamline */
uint64_t timestamp; /**< is the time stamp with 10 MHz clock */
uint16_t modId; /**< is the unique module id (unique even for left, right, top, bottom) */
uint16_t xCoord; /**< is the x coordinate in the complete detector system */
uint16_t yCoord; /**< is the y coordinate in the complete detector system */
uint16_t zCoord; /**< is the z coordinate in the complete detector system */
uint32_t debug; /**< is for debugging purposes */
uint16_t roundRNumber; /**< is the round robin set number */
uint8_t detType; /**< is the detector type see :: detectorType */
uint8_t version; /**< is the version number of this structure format */
} sls_detector_header;
/** /**
format format
*/ */

View File

@ -35,6 +35,10 @@ void BinaryFile::PrintMembers() {
printf("Number of Frames in File: %d\n",numFramesInFile); printf("Number of Frames in File: %d\n",numFramesInFile);
} }
FILE* BinaryFile::GetFileHandle() {
return filefd;
}
slsReceiverDefs::fileFormat BinaryFile::GetFileType() { slsReceiverDefs::fileFormat BinaryFile::GetFileType() {
return BINARY; return BINARY;
} }

View File

@ -33,7 +33,8 @@ pthread_mutex_t DataProcessor::Mutex = PTHREAD_MUTEX_INITIALIZER;
DataProcessor::DataProcessor(Fifo*& f, fileFormat* ftype, bool* fwenable, bool* dsEnable, DataProcessor::DataProcessor(Fifo*& f, fileFormat* ftype, bool* fwenable, bool* dsEnable,
int* cbaction, int* cbaction,
void (*dataReadycb)(int, char*, int, FILE*, char*, void*), void (*dataReadycb)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t,
char*, uint32_t, FILE*, void*),
void *pDataReadycb) : void *pDataReadycb) :
ThreadObject(NumberofDataProcessors), ThreadObject(NumberofDataProcessors),
@ -300,8 +301,8 @@ void DataProcessor::ProcessAnImage(char* buf) {
numFramesCaught++; numFramesCaught++;
numTotalFramesCaught++; numTotalFramesCaught++;
sls_detector_header* header = (sls_detector_header*) (buf);
uint64_t fnum = (*((uint64_t*)buf)); uint64_t fnum = header->frameNumber;
#ifdef VERBOSE #ifdef VERBOSE
if (!index) cprintf(BLUE,"DataProcessing %d: fnum:%lld\n", index, (long long int)fnum); if (!index) cprintf(BLUE,"DataProcessing %d: fnum:%lld\n", index, (long long int)fnum);
#endif #endif
@ -315,11 +316,30 @@ void DataProcessor::ProcessAnImage(char* buf) {
if (*callbackAction == DO_EVERYTHING) { if (*callbackAction == DO_EVERYTHING) {
if (*fileWriteEnable) if (*fileWriteEnable)
file->WriteToFile(buf, generalData->fifoBufferSize + FILE_FRAME_HEADER_SIZE, fnum-firstMeasurementIndex); file->WriteToFile(buf, generalData->fifoBufferSize + sizeof(sls_detector_header), fnum-firstMeasurementIndex);
} else { } else {
/*
if (rawDataReadyCallBack) if (rawDataReadyCallBack)
rawDataReadyCallBack((int)fnum, buf + FILE_FRAME_HEADER_SIZE, generalData->fifoBufferSize, rawDataReadyCallBack(
NULL, NULL, pRawDataReady); header->frameNumber,
header->expLength,
header->packetNumber,
header->bunchId,
header->timestamp,
header->modId,
header->xCoord,
header->yCoord,
header->zCoord,
header->debug,
header->roundRNumber,
header->detType,
header->version,
buf + sizeof(sls_detector_header),
generalData->imageSize,
file->GetFileHandle(), pRawDataReady);
*/
file->GetBinaryFileHandle();
//GetHDF5FileHandle
} }
} }

View File

@ -23,18 +23,29 @@ uint64_t DataStreamer::RunningMask(0x0);
pthread_mutex_t DataStreamer::Mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t DataStreamer::Mutex = PTHREAD_MUTEX_INITIALIZER;
const char* DataStreamer::jsonHeaderFormat_part1 =
"{"
"\"version\":%.1f, "
"\"type\":\"%s\", "
"\"shape\":[%d, %d], ";
const char* DataStreamer::jsonHeaderFormat = const char* DataStreamer::jsonHeaderFormat =
"%s" "{"
"\"jsonversion\":%u, "
"\"bitmode\":%d, "
"\"shape\":[%d, %d], "
"\"acqIndex\":%llu, " "\"acqIndex\":%llu, "
"\"fIndex\":%llu, " "\"fIndex\":%llu, "
"\"subfnum\":%u, " "\"fname\":\"%s\", "
"\"fname\":\"%s\"}";
"\"frameNumber\":%llu, "
"\"expLength\":%u, "
"\"packetNumber\":%u, "
"\"bunchId\":%llu, "
"\"timestamp\":%llu, "
"\"modId\":%u, "
"\"xCoord\":%u, "
"\"yCoord\":%u, "
"\"zCoord\":%u, "
"\"debug\":%u, "
"\"roundRNumber\":%u, "
"\"detType\":%u, "
"\"version\":%u"
"}";
DataStreamer::DataStreamer(Fifo*& f, uint32_t* dr, uint32_t* freq, uint32_t* timer, int* sEnable) : DataStreamer::DataStreamer(Fifo*& f, uint32_t* dr, uint32_t* freq, uint32_t* timer, int* sEnable) :
@ -47,7 +58,6 @@ DataStreamer::DataStreamer(Fifo*& f, uint32_t* dr, uint32_t* freq, uint32_t* tim
streamingFrequency(freq), streamingFrequency(freq),
streamingTimerInMs(timer), streamingTimerInMs(timer),
currentFreqCount(0), currentFreqCount(0),
currentHeader(0),
acquisitionStartedFlag(false), acquisitionStartedFlag(false),
measurementStartedFlag(false), measurementStartedFlag(false),
firstAcquisitionIndex(0), firstAcquisitionIndex(0),
@ -64,14 +74,12 @@ DataStreamer::DataStreamer(Fifo*& f, uint32_t* dr, uint32_t* freq, uint32_t* tim
FILE_LOG (logDEBUG) << "Number of DataStreamers: " << NumberofDataStreamers; FILE_LOG (logDEBUG) << "Number of DataStreamers: " << NumberofDataStreamers;
memset((void*)&timerBegin, 0, sizeof(timespec)); memset((void*)&timerBegin, 0, sizeof(timespec));
currentHeader = new char[255];
strcpy(fileNametoStream, ""); strcpy(fileNametoStream, "");
} }
DataStreamer::~DataStreamer() { DataStreamer::~DataStreamer() {
CloseZmqSocket(); CloseZmqSocket();
if (currentHeader) delete currentHeader;
if (completeBuffer) delete completeBuffer; if (completeBuffer) delete completeBuffer;
ThreadObject::DestroyThread(); ThreadObject::DestroyThread();
NumberofDataStreamers--; NumberofDataStreamers--;
@ -137,27 +145,6 @@ void DataStreamer::ResetParametersforNewMeasurement(char* fname){
completeBuffer = new char[generalData->imageSize_Streamer]; completeBuffer = new char[generalData->imageSize_Streamer];
memset(completeBuffer, 0, generalData->imageSize_Streamer); memset(completeBuffer, 0, generalData->imageSize_Streamer);
} }
CreateHeaderPart1();
}
void DataStreamer::CreateHeaderPart1() {
char type[10] = "";
switch (*dynamicRange) {
case 4: strcpy(type, "uint4"); break;
case 8: strcpy(type, "uint8"); break;
case 16: strcpy(type, "uint16"); break;
case 32: strcpy(type, "uint32"); break;
default:
strcpy(type, "unknown");
cprintf(RED," Unknown datatype in json format %d\n", *dynamicRange);
break;
}
sprintf(currentHeader, jsonHeaderFormat_part1,
STREAMER_VERSION, type, generalData->nPixelsX_Streamer, generalData->nPixelsY_Streamer);
#ifdef VERBOSE
cprintf(BLUE, "%d currentheader: %s\n", index, currentHeader);
#endif
} }
@ -240,8 +227,9 @@ void DataStreamer::ThreadExecution() {
void DataStreamer::StopProcessing(char* buf) { void DataStreamer::StopProcessing(char* buf) {
sls_detector_header* header = (sls_detector_header*) (buf);
//send dummy header and data //send dummy header and data
if (!SendHeader(0, true)) if (!SendHeader(header, true))
cprintf(RED,"Error: Could not send zmq dummy header for streamer %d\n", index); cprintf(RED,"Error: Could not send zmq dummy header for streamer %d\n", index);
if (!zmqSocket->SendData((char*)DUMMY_MSG, DUMMY_MSG_SIZE)) if (!zmqSocket->SendData((char*)DUMMY_MSG, DUMMY_MSG_SIZE))
@ -256,8 +244,9 @@ void DataStreamer::StopProcessing(char* buf) {
void DataStreamer::ProcessAnImage(char* buf) { void DataStreamer::ProcessAnImage(char* buf) {
uint64_t fnum = (*((uint64_t*)buf));
uint32_t snum = (*((uint32_t*)(buf + FILE_FRAME_HDR_FNUM_SIZE))); sls_detector_header* header = (sls_detector_header*) (buf);
uint64_t fnum = header->frameNumber;
#ifdef VERBOSE #ifdef VERBOSE
if (!index) cprintf(MAGENTA,"DataStreamer %d: fnum:%lld\n", index, (long long int)fnum); if (!index) cprintf(MAGENTA,"DataStreamer %d: fnum:%lld\n", index, (long long int)fnum);
#endif #endif
@ -282,20 +271,20 @@ void DataStreamer::ProcessAnImage(char* buf) {
return; return;
} }
if (!SendHeader(fnum, snum)) if (!SendHeader(header))
cprintf(RED,"Error: Could not send zmq header for fnum %lld and streamer %d\n", cprintf(RED,"Error: Could not send zmq header for fnum %lld and streamer %d\n",
(long long int) fnum, index); (long long int) fnum, index);
//shortframe gotthard - data sending //shortframe gotthard - data sending
if (completeBuffer) { if (completeBuffer) {
memcpy(completeBuffer + ((generalData->imageSize)**shortFrameEnable), buf + FILE_FRAME_HEADER_SIZE, generalData->imageSize); memcpy(completeBuffer + ((generalData->imageSize)**shortFrameEnable), buf + sizeof(sls_detector_header), generalData->imageSize);
if (!zmqSocket->SendData(completeBuffer, generalData->imageSize_Streamer)) if (!zmqSocket->SendData(completeBuffer, generalData->imageSize_Streamer))
cprintf(RED,"Error: Could not send zmq data for fnum %lld and streamer %d\n", cprintf(RED,"Error: Could not send zmq data for fnum %lld and streamer %d\n",
(long long int) fnum, index); (long long int) fnum, index);
} }
//normal - data sending //normal - data sending
else { else {
if (!zmqSocket->SendData(buf + FILE_FRAME_HEADER_SIZE, generalData->imageSize)) if (!zmqSocket->SendData(buf + sizeof(sls_detector_header), generalData->imageSize))
cprintf(RED,"Error: Could not send zmq data for fnum %lld and streamer %d\n", cprintf(RED,"Error: Could not send zmq data for fnum %lld and streamer %d\n",
(long long int) fnum, index); (long long int) fnum, index);
} }
@ -329,19 +318,24 @@ bool DataStreamer::CheckCount() {
} }
int DataStreamer::SendHeader(uint64_t fnum, uint32_t snum, bool dummy) { int DataStreamer::SendHeader(sls_detector_header* header, bool dummy) {
uint64_t frameIndex = -1;
uint64_t acquisitionIndex = -1; uint64_t frameIndex = header->frameNumber - firstMeasurementIndex;
uint32_t subframeIndex = -1; uint64_t acquisitionIndex = header->frameNumber - firstAcquisitionIndex;
uint32_t subframeIndex = header->expLength;
char buf[1000] = ""; char buf[1000] = "";
if (!dummy) { if (dummy) {
frameIndex = fnum - firstMeasurementIndex; frameIndex = -1;
acquisitionIndex = fnum - firstAcquisitionIndex; acquisitionIndex = -1;
subframeIndex = snum; subframeIndex = -1;
} }
int len = sprintf(buf, jsonHeaderFormat, currentHeader, acquisitionIndex, frameIndex, subframeIndex, fileNametoStream); int len = sprintf(buf, jsonHeaderFormat,
SLS_DETECTOR_JSON_HEADER_VERSION, *dynamicRange, generalData->nPixelsX_Streamer, generalData->nPixelsY_Streamer, acquisitionIndex, frameIndex, fileNametoStream,
header->frameNumber, header->expLength, header->packetNumber, header->bunchId, header->timestamp,
header->modId, header->xCoord, header->yCoord, header->zCoord, header->debug, header->roundRNumber, header->detType, header->version);
#ifdef VERBOSE #ifdef VERBOSE
printf("%d Streamer: buf:%s\n", index, buf); printf("%d Streamer: buf:%s\n", index, buf);
#endif #endif

View File

@ -66,6 +66,10 @@ void HDF5File::PrintMembers() {
} }
H5File* HDF5File::GetHDF5FileHandle() {
return filefd;
}
void HDF5File::SetNumberofPixels(uint32_t nx, uint32_t ny) { void HDF5File::SetNumberofPixels(uint32_t nx, uint32_t ny) {
nPixelsX = nx; nPixelsX = nx;
nPixelsY = ny; nPixelsY = ny;
@ -139,19 +143,20 @@ int HDF5File::WriteToFile(char* buffer, int buffersize, uint64_t fnum) {
} }
numFramesInFile++; numFramesInFile++;
uint32_t snum = (*((uint32_t*)(buffer + FILE_FRAME_HDR_FNUM_SIZE))); sls_detector_header* header = (sls_detector_header*) (buffer);
uint64_t bid = (*((uint64_t*)(buffer + FILE_FRAME_HDR_FNUM_SIZE + FILE_FRAME_HDR_SNUM_SIZE))); //uint32_t snum = header->expLength;
// uint64_t bid = header->expLength
pthread_mutex_lock(&Mutex); pthread_mutex_lock(&Mutex);
if (HDF5FileStatic::WriteDataFile(index, buffer + FILE_FRAME_HEADER_SIZE, if (HDF5FileStatic::WriteDataFile(index, buffer + sizeof(sls_detector_header),
fnum%maxFramesPerFile, nPixelsY, ((*dynamicRange==4) ? (nPixelsX/2) : nPixelsX), fnum%maxFramesPerFile, nPixelsY, ((*dynamicRange==4) ? (nPixelsX/2) : nPixelsX),
dataspace, dataset, datatype) == OK) { dataspace, dataset, datatype) == OK) {
if (HDF5FileStatic::WriteParameterDatasets(index, dataspace_para, /*if (HDF5FileStatic::WriteParameterDatasets(index, dataspace_para,
fnum%maxFramesPerFile, fnum%maxFramesPerFile,
dataset_para1, datatype_para1, &snum, dataset_para1, datatype_para1, &snum,
dataset_para2, datatype_para2, &bid) == OK) { dataset_para2, datatype_para2, &bid) == OK) {
pthread_mutex_unlock(&Mutex); pthread_mutex_unlock(&Mutex);
return OK; return OK;
} }*/
} }
pthread_mutex_unlock(&Mutex); pthread_mutex_unlock(&Mutex);
cprintf(RED,"%d Error: Write to file failed\n", index); cprintf(RED,"%d Error: Write to file failed\n", index);

View File

@ -248,7 +248,7 @@ void Listener::ThreadExecution() {
//get data //get data
if (*status != TRANSMITTING) { if (*status != TRANSMITTING) {
if (*activated) if (*activated)
rc = ListenToAnImage(buffer + generalData->fifoBufferHeaderSize); rc = ListenToAnImage(buffer);
else else
rc = CreateAnImage(buffer + generalData->fifoBufferHeaderSize); rc = CreateAnImage(buffer + generalData->fifoBufferHeaderSize);
} }
@ -306,7 +306,7 @@ uint32_t Listener::ListenToAnImage(char* buf) {
//reset to -1 //reset to -1
memset(buf,0xFF,dsize); memset(buf + generalData->fifoBufferHeaderSize, 0xFF, dsize);
//look for carry over //look for carry over
@ -319,11 +319,28 @@ uint32_t Listener::ListenToAnImage(char* buf) {
return generalData->imageSize; return generalData->imageSize;
} }
carryOverFlag = false; carryOverFlag = false;
memcpy(buf + (pnum * dsize), carryOverPacket + generalData->headerSizeinPacket, dsize); memcpy(buf + generalData->fifoBufferHeaderSize + (pnum * dsize), carryOverPacket + generalData->headerSizeinPacket, dsize);
//writer header
if(isHeaderEmpty) { if(isHeaderEmpty) {
(*((uint64_t*)(buf - FILE_FRAME_HEADER_SIZE))) = fnum; sls_detector_header* header = (sls_detector_header*) (buf);
(*((uint64_t*)(buf - FILE_FRAME_HEADER_SIZE + FILE_FRAME_HDR_FNUM_SIZE))) = snum; memset(header, 0, sizeof(sls_detector_header));
(*((uint64_t*)(buf - FILE_FRAME_HEADER_SIZE + FILE_FRAME_HDR_FNUM_SIZE + FILE_FRAME_HDR_SNUM_SIZE))) = bid; header->frameNumber = fnum;
if (generalData->myDetectorType == EIGER && *dynamicRange == 32)
header->expLength = snum;
header->packetNumber = generalData->packetsPerFrame; /*in the end..*/
if (generalData->myDetectorType == JUNGFRAU)
header->bunchId = bid;
/*header->xCoord = index; given by det packet, also for ycoord, zcoord */
/*header->detType = (uint8_t) generalData->myDetectorType; given by det packet */
header->version = (uint8_t) SLS_DETECTOR_HEADER_VERSION;
#ifdef VERBOSE
if(!ithread)
cprintf(BLUE,
"framenumber:%llu\tsubfnum:%u\tpnum:%u\tbunchid:%llu\txcoord:%u\tdettype:%u\tversion:%u\n",
header->frameNumber, header->expLength, header->packetNumber,
header->bunchId, header->xCoord, header->detType, header->version);
#endif
isHeaderEmpty = false; isHeaderEmpty = false;
} }
expectpnum = pnum+1; //for jungfrau expectpnum = pnum+1; //for jungfrau
@ -374,11 +391,19 @@ uint32_t Listener::ListenToAnImage(char* buf) {
} }
//copy packet //copy packet
memcpy(buf + (pnum * dsize), listeningPacket + generalData->headerSizeinPacket, dsize); memcpy(buf + generalData->fifoBufferHeaderSize + (pnum * dsize), listeningPacket + generalData->headerSizeinPacket, dsize);
if(isHeaderEmpty) { if(isHeaderEmpty) {
(*((uint64_t*)(buf - FILE_FRAME_HEADER_SIZE))) = fnum; sls_detector_header* header = (sls_detector_header*) (buf);
(*((uint64_t*)(buf - FILE_FRAME_HEADER_SIZE + FILE_FRAME_HDR_FNUM_SIZE))) = snum; memset(header, 0, sizeof(sls_detector_header));
(*((uint64_t*)(buf - FILE_FRAME_HEADER_SIZE + FILE_FRAME_HDR_FNUM_SIZE + FILE_FRAME_HDR_SNUM_SIZE))) = bid; header->frameNumber = fnum;
if (generalData->myDetectorType == EIGER && *dynamicRange == 32)
header->expLength = snum;
header->packetNumber = generalData->packetsPerFrame; /*in the end..*/
if (generalData->myDetectorType == JUNGFRAU)
header->bunchId = bid;
/*header->xCoord = index; given by det packet, also for ycoord, zcoord */
/*header->detType = (uint8_t) generalData->myDetectorType; given by det packet */
header->version = (uint8_t) SLS_DETECTOR_HEADER_VERSION;
isHeaderEmpty = false; isHeaderEmpty = false;
} }
expectpnum = pnum+1; //for jungfrau expectpnum = pnum+1; //for jungfrau

View File

@ -541,20 +541,20 @@ int UDPBaseImplementation::setActivate(int enable){
} }
/***callback functions***/ /***callback functions***/
void UDPBaseImplementation::registerCallBackStartAcquisition(int (*func)(char*, char*,int, int, void*),void *arg){ void UDPBaseImplementation::registerCallBackStartAcquisition(int (*func)(char*, char*, uint64_t, uint32_t, void*),void *arg){
startAcquisitionCallBack=func; startAcquisitionCallBack=func;
pStartAcquisition=arg; pStartAcquisition=arg;
} }
void UDPBaseImplementation::registerCallBackAcquisitionFinished(void (*func)(int, void*),void *arg){ void UDPBaseImplementation::registerCallBackAcquisitionFinished(void (*func)(uint64_t, void*),void *arg){
acquisitionFinishedCallBack=func; acquisitionFinishedCallBack=func;
pAcquisitionFinished=arg; pAcquisitionFinished=arg;
} }
void UDPBaseImplementation::registerCallBackRawDataReady(void (*func)(int, char*, int, FILE*, char*, void*),void *arg){ void UDPBaseImplementation::registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t,
char*, uint32_t, FILE*, void*),void *arg){
rawDataReadyCallBack=func; rawDataReadyCallBack=func;
pRawDataReady=arg; pRawDataReady=arg;
} }
//#endif //#endif

View File

@ -132,26 +132,6 @@ void UDPStandardImplementation::setFileFormat(const fileFormat f){
void UDPStandardImplementation::setFileName(const char c[]) {
if (strlen(c)) {
strcpy(fileName, c); //automatically update fileName in Filewriter (pointer)
/*int detindex = -1;
string tempname(fileName);
size_t uscore=tempname.rfind("_");
if (uscore!=string::npos) {
if (sscanf(tempname.substr(uscore+1, tempname.size()-uscore-1).c_str(), "d%d", &detindex)) {
detID = detindex;
tempname=tempname.substr(0,uscore);
strcpy(fileName, tempname.c_str());
}
}
if (detindex == -1)
detID = 0;*/
}
FILE_LOG (logINFO) << "File name:" << fileName;
}
int UDPStandardImplementation::setShortFrameEnable(const int i) { int UDPStandardImplementation::setShortFrameEnable(const int i) {
if (myDetectorType != GOTTHARD) { if (myDetectorType != GOTTHARD) {
cprintf(RED, "Error: Can not set short frame for this detector\n"); cprintf(RED, "Error: Can not set short frame for this detector\n");
@ -556,7 +536,7 @@ void UDPStandardImplementation::stopReceiver(){
{ //statistics { //statistics
int tot = 0; uint64_t tot = 0;
for (int i = 0; i < numThreads; i++) { for (int i = 0; i < numThreads; i++) {
tot += dataProcessor[i]->GetNumFramesCaught(); tot += dataProcessor[i]->GetNumFramesCaught();
@ -577,7 +557,7 @@ void UDPStandardImplementation::stopReceiver(){
cprintf(RED,"Note: Deactivated Receiver\n"); cprintf(RED,"Note: Deactivated Receiver\n");
//callback //callback
if (acquisitionFinishedCallBack) if (acquisitionFinishedCallBack)
acquisitionFinishedCallBack((int)(tot/numThreads), pAcquisitionFinished); acquisitionFinishedCallBack((tot/numThreads), pAcquisitionFinished);
} }
//change status //change status

View File

@ -160,7 +160,7 @@ int64_t slsReceiver::getReceiverVersion(){
} }
void slsReceiver::registerCallBackStartAcquisition(int (*func)(char*, char*,int, int, void*),void *arg){ void slsReceiver::registerCallBackStartAcquisition(int (*func)(char*, char*, uint64_t, uint32_t, void*),void *arg){
//tcpipInterface //tcpipInterface
if(udp_interface) if(udp_interface)
udp_interface->registerCallBackStartAcquisition(func,arg); udp_interface->registerCallBackStartAcquisition(func,arg);
@ -170,7 +170,7 @@ void slsReceiver::registerCallBackStartAcquisition(int (*func)(char*, char*,int,
void slsReceiver::registerCallBackAcquisitionFinished(void (*func)(int, void*),void *arg){ void slsReceiver::registerCallBackAcquisitionFinished(void (*func)(uint64_t, void*),void *arg){
//tcpipInterface //tcpipInterface
if(udp_interface) if(udp_interface)
udp_interface->registerCallBackAcquisitionFinished(func,arg); udp_interface->registerCallBackAcquisitionFinished(func,arg);
@ -179,7 +179,8 @@ void slsReceiver::registerCallBackAcquisitionFinished(void (*func)(int, void*),v
} }
void slsReceiver::registerCallBackRawDataReady(void (*func)(int, char*, int, FILE*, char*, void*),void *arg){ void slsReceiver::registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t,
char*, uint32_t, FILE*, void*),void *arg){
//tcpipInterface //tcpipInterface
if(udp_interface) if(udp_interface)
udp_interface->registerCallBackRawDataReady(func,arg); udp_interface->registerCallBackRawDataReady(func,arg);

View File

@ -2680,17 +2680,18 @@ int slsReceiverTCPIPInterface::exec_command() {
/***callback functions***/ /***callback functions***/
void slsReceiverTCPIPInterface::registerCallBackStartAcquisition(int (*func)(char*, char*,int, int, void*),void *arg){ void slsReceiverTCPIPInterface::registerCallBackStartAcquisition(int (*func)(char*, char*, uint64_t, uint32_t, void*),void *arg){
startAcquisitionCallBack=func; startAcquisitionCallBack=func;
pStartAcquisition=arg; pStartAcquisition=arg;
} }
void slsReceiverTCPIPInterface::registerCallBackAcquisitionFinished(void (*func)(int, void*),void *arg){ void slsReceiverTCPIPInterface::registerCallBackAcquisitionFinished(void (*func)(uint64_t, void*),void *arg){
acquisitionFinishedCallBack=func; acquisitionFinishedCallBack=func;
pAcquisitionFinished=arg; pAcquisitionFinished=arg;
} }
void slsReceiverTCPIPInterface::registerCallBackRawDataReady(void (*func)(int, char*, int, FILE*, char*, void*),void *arg){ void slsReceiverTCPIPInterface::registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t,
char*, uint32_t, FILE*, void*),void *arg){
rawDataReadyCallBack=func; rawDataReadyCallBack=func;
pRawDataReady=arg; pRawDataReady=arg;
} }

View File

@ -27,19 +27,17 @@ int64_t slsReceiverUsers::getReceiverVersion(){
} }
void slsReceiverUsers::registerCallBackStartAcquisition(int (*func)(char*, char*,int, int, void*),void *arg){ void slsReceiverUsers::registerCallBackStartAcquisition(int (*func)(char*, char*, uint64_t, uint32_t, void*),void *arg){
receiver->registerCallBackStartAcquisition(func,arg); receiver->registerCallBackStartAcquisition(func,arg);
} }
void slsReceiverUsers::registerCallBackAcquisitionFinished(void (*func)(uint64_t, void*),void *arg){
void slsReceiverUsers::registerCallBackAcquisitionFinished(void (*func)(int, void*),void *arg){
receiver->registerCallBackAcquisitionFinished(func,arg); receiver->registerCallBackAcquisitionFinished(func,arg);
} }
void slsReceiverUsers::registerCallBackRawDataReady(void (*func)(uint64_t frameNumber, uint32_t expLength, uint32_t packetNumber, uint64_t bunchId, uint64_t timestamp,
void slsReceiverUsers::registerCallBackRawDataReady(void (*func)(int, char*, int, FILE*, char*, void*),void *arg){ 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*), void *arg){
receiver->registerCallBackRawDataReady(func,arg); receiver->registerCallBackRawDataReady(func,arg);
} }