fixed short gotthard

This commit is contained in:
Dhanya Maliakal 2017-03-09 13:28:03 +01:00
parent 86018684c9
commit 1e94ec0c6a
5 changed files with 122 additions and 20 deletions

View File

@ -22,10 +22,11 @@ class DataStreamer : private virtual slsReceiverDefs, public ThreadObject {
* Calls Base Class CreateThread(), sets ErrorMask if error and increments NumberofDataStreamers * Calls Base Class CreateThread(), sets ErrorMask if error and increments NumberofDataStreamers
* @param f address of Fifo pointer * @param f address of Fifo pointer
* @param dr pointer to dynamic range * @param dr pointer to dynamic range
* @param freq poiner to streaming frequency * @param freq pointer to streaming frequency
* @param timer poiner to timer if streaming frequency is random * @param timer pointer to timer if streaming frequency is random
* @param sEnable pointer to short frame enable
*/ */
DataStreamer(Fifo*& f, uint32_t* dr, uint32_t* freq, uint32_t* timer); DataStreamer(Fifo*& f, uint32_t* dr, uint32_t* freq, uint32_t* timer, int* sEnable);
/** /**
* Destructor * Destructor
@ -211,6 +212,9 @@ class DataStreamer : private virtual slsReceiverDefs, public ThreadObject {
/** Pointer to dynamic range */ /** Pointer to dynamic range */
uint32_t* dynamicRange; uint32_t* dynamicRange;
/** Pointer to short frame enable */
int* shortFrameEnable;
/** Pointer to Streaming frequency, if 0, sending random images with a timer */ /** Pointer to Streaming frequency, if 0, sending random images with a timer */
uint32_t* streamingFrequency; uint32_t* streamingFrequency;
@ -240,5 +244,8 @@ class DataStreamer : private virtual slsReceiverDefs, public ThreadObject {
/* File name to stream */ /* File name to stream */
char fileNametoStream[MAX_STR_LENGTH]; char fileNametoStream[MAX_STR_LENGTH];
/** Complete buffer used for roi, eg. shortGotthard */
char* completeBuffer;
}; };

View File

@ -69,6 +69,15 @@ public:
/** Size of a header packet */ /** Size of a header packet */
uint32_t headerPacketSize; uint32_t headerPacketSize;
/** Streaming (for ROI - mainly short Gotthard) - Number of Pixels in x axis */
uint32_t nPixelsX_Streamer;
/** Streaming (for ROI - mainly short Gotthard) - Number of Pixels in y axis */
uint32_t nPixelsY_Streamer;
/** Streaming (for ROI - mainly short Gotthard) - Image size (in bytes) */
uint32_t imageSize_Streamer;
/** Cosntructor */ /** Cosntructor */
GeneralData(): GeneralData():
myDetectorType(slsReceiverDefs::GENERIC), myDetectorType(slsReceiverDefs::GENERIC),
@ -88,7 +97,11 @@ public:
fifoBufferHeaderSize(0), fifoBufferHeaderSize(0),
defaultFifoDepth(0), defaultFifoDepth(0),
threadsPerReceiver(1), threadsPerReceiver(1),
headerPacketSize(0){}; headerPacketSize(0),
nPixelsX_Streamer(0),
nPixelsY_Streamer(0),
imageSize_Streamer(0)
{};
/** Destructor */ /** Destructor */
virtual ~GeneralData(){}; virtual ~GeneralData(){};
@ -124,8 +137,7 @@ public:
subFrameNumber = -1; subFrameNumber = -1;
bunchId = -1; bunchId = -1;
frameNumber = ((uint32_t)(*((uint32_t*)(packetData)))); frameNumber = ((uint32_t)(*((uint32_t*)(packetData))));
if (myDetectorType == slsReceiverDefs::PROPIX ||(myDetectorType == slsReceiverDefs::GOTTHARD && packetSize == GOTTHARD_PACKET_SIZE)) frameNumber++;
frameNumber++;
packetNumber = frameNumber&packetIndexMask; packetNumber = frameNumber&packetIndexMask;
frameNumber = (frameNumber & frameIndexMask) >> frameIndexOffset; frameNumber = (frameNumber & frameIndexMask) >> frameIndexOffset;
} }
@ -170,8 +182,11 @@ public:
"Fifo Buffer Header Size: %d\n" "Fifo Buffer Header Size: %d\n"
"Default Fifo Depth: %d\n" "Default Fifo Depth: %d\n"
"Threads Per Receiver: %d\n" "Threads Per Receiver: %d\n"
"Header Packet Size: %d\n", "Header Packet Size: %d\n"
slsReceiverDefs::getDetectorType(myDetectorType).c_str(), "Streamer Pixels X: %d\n"
"Streamer Pixels Y: %d\n"
"Streamer Image Size: %d\n"
,slsReceiverDefs::getDetectorType(myDetectorType).c_str(),
nPixelsX, nPixelsX,
nPixelsY, nPixelsY,
headerSizeinPacket, headerSizeinPacket,
@ -188,7 +203,10 @@ public:
fifoBufferHeaderSize, fifoBufferHeaderSize,
defaultFifoDepth, defaultFifoDepth,
threadsPerReceiver, threadsPerReceiver,
headerPacketSize); headerPacketSize,
nPixelsX_Streamer,
nPixelsY_Streamer,
imageSize_Streamer);
}; };
}; };
@ -214,6 +232,9 @@ class GotthardData : public GeneralData {
fifoBufferSize = imageSize; fifoBufferSize = imageSize;
fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE;
defaultFifoDepth = 25000; defaultFifoDepth = 25000;
nPixelsX_Streamer = nPixelsX;
nPixelsY_Streamer = nPixelsY;
imageSize_Streamer = imageSize;
}; };
}; };
@ -237,7 +258,42 @@ class ShortGotthardData : public GeneralData {
fifoBufferSize = imageSize; fifoBufferSize = imageSize;
fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE;
defaultFifoDepth = 25000; defaultFifoDepth = 25000;
nPixelsX_Streamer = 1280;
nPixelsY_Streamer = 1;
imageSize_Streamer = 1280 * 2;
}; };
/**
* Get Header Infomation (frame number, packet number)
* @param index thread index for debugging purposes
* @param packetData pointer to data
* @param frameNumber frame number
* @param packetNumber packet number
*/
virtual void GetHeaderInfo(int index, char* packetData, uint64_t& frameNumber, uint32_t& packetNumber) const
{
frameNumber = ((uint32_t)(*((uint32_t*)(packetData))));
packetNumber = 0;
}
/**
* Get Header Infomation (frame number, packet number)
* @param index thread index for debugging purposes
* @param packetData pointer to data
* @param dynamicRange dynamic range to assign subframenumber if 32 bit mode
* @param frameNumber frame number
* @param packetNumber packet number
* @param subFrameNumber sub frame number if applicable
* @param bunchId bunch id
*/
virtual void GetHeaderInfo(int index, char* packetData, uint32_t dynamicRange,
uint64_t& frameNumber, uint32_t& packetNumber, uint32_t& subFrameNumber, uint64_t& bunchId) const
{
subFrameNumber = -1;
bunchId = -1;
frameNumber = ((uint32_t)(*((uint32_t*)(packetData))));
packetNumber = 0;
}
}; };
@ -267,6 +323,9 @@ class PropixData : public GeneralData {
fifoBufferSize = imageSize; fifoBufferSize = imageSize;
fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE;
defaultFifoDepth = 25000; defaultFifoDepth = 25000;
nPixelsX_Streamer = nPixelsX;
nPixelsY_Streamer = nPixelsY;
imageSize_Streamer = imageSize;
}; };
}; };
@ -295,6 +354,9 @@ class Moench02Data : public GeneralData {
fifoBufferSize = imageSize; fifoBufferSize = imageSize;
fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE;
defaultFifoDepth = 2500; defaultFifoDepth = 2500;
nPixelsX_Streamer = nPixelsX;
nPixelsY_Streamer = nPixelsY;
imageSize_Streamer = imageSize;
}; };
/** /**
@ -328,6 +390,9 @@ class Moench03Data : public GeneralData {
fifoBufferSize = imageSize; fifoBufferSize = imageSize;
fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE;
defaultFifoDepth = 2500; defaultFifoDepth = 2500;
nPixelsX_Streamer = nPixelsX;
nPixelsY_Streamer = nPixelsY;
imageSize_Streamer = imageSize;
}; };
}; };
@ -353,6 +418,9 @@ class JCTBData : public GeneralData {
fifoBufferSize = imageSize; fifoBufferSize = imageSize;
fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE;
defaultFifoDepth = 2500; defaultFifoDepth = 2500;
nPixelsX_Streamer = nPixelsX;
nPixelsY_Streamer = nPixelsY;
imageSize_Streamer = imageSize;
}; };
/** /**
@ -397,6 +465,9 @@ private:
fifoBufferSize = imageSize; fifoBufferSize = imageSize;
fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + FILE_FRAME_HEADER_SIZE;
defaultFifoDepth = 2500; defaultFifoDepth = 2500;
nPixelsX_Streamer = nPixelsX;
nPixelsY_Streamer = nPixelsY;
imageSize_Streamer = imageSize;
}; };
/** /**
@ -487,6 +558,9 @@ private:
footerOffset = headerSizeinPacket + dataSize; footerOffset = headerSizeinPacket + dataSize;
threadsPerReceiver = 2; threadsPerReceiver = 2;
headerPacketSize = 48; headerPacketSize = 48;
nPixelsX_Streamer = nPixelsX;
nPixelsY_Streamer = nPixelsY;
imageSize_Streamer = imageSize;
}; };
/** /**

View File

@ -37,12 +37,13 @@ const char* DataStreamer::jsonHeaderFormat =
"\"fname\":\"%s\"}"; "\"fname\":\"%s\"}";
DataStreamer::DataStreamer(Fifo*& f, uint32_t* dr, uint32_t* freq, uint32_t* timer) : DataStreamer::DataStreamer(Fifo*& f, uint32_t* dr, uint32_t* freq, uint32_t* timer, int* sEnable) :
ThreadObject(NumberofDataStreamers), ThreadObject(NumberofDataStreamers),
generalData(0), generalData(0),
fifo(f), fifo(f),
zmqSocket(0), zmqSocket(0),
dynamicRange(dr), dynamicRange(dr),
shortFrameEnable(sEnable),
streamingFrequency(freq), streamingFrequency(freq),
streamingTimerInMs(timer), streamingTimerInMs(timer),
currentFreqCount(0), currentFreqCount(0),
@ -50,7 +51,8 @@ DataStreamer::DataStreamer(Fifo*& f, uint32_t* dr, uint32_t* freq, uint32_t* tim
acquisitionStartedFlag(false), acquisitionStartedFlag(false),
measurementStartedFlag(false), measurementStartedFlag(false),
firstAcquisitionIndex(0), firstAcquisitionIndex(0),
firstMeasurementIndex(0) firstMeasurementIndex(0),
completeBuffer(0)
{ {
if(ThreadObject::CreateThread()){ if(ThreadObject::CreateThread()){
pthread_mutex_lock(&Mutex); pthread_mutex_lock(&Mutex);
@ -69,7 +71,8 @@ DataStreamer::DataStreamer(Fifo*& f, uint32_t* dr, uint32_t* freq, uint32_t* tim
DataStreamer::~DataStreamer() { DataStreamer::~DataStreamer() {
CloseZmqSocket(); CloseZmqSocket();
delete currentHeader; if (currentHeader) delete currentHeader;
if (completeBuffer) delete completeBuffer;
ThreadObject::DestroyThread(); ThreadObject::DestroyThread();
NumberofDataStreamers--; NumberofDataStreamers--;
} }
@ -126,10 +129,17 @@ void DataStreamer::ResetParametersforNewMeasurement(char* fname){
firstMeasurementIndex = 0; firstMeasurementIndex = 0;
measurementStartedFlag = false; measurementStartedFlag = false;
strcpy(fileNametoStream, fname); strcpy(fileNametoStream, fname);
if (completeBuffer) {
delete completeBuffer;
completeBuffer = 0;
}
if (*shortFrameEnable >= 0) {
completeBuffer = new char[generalData->imageSize_Streamer];
memset(completeBuffer, 0, generalData->imageSize_Streamer);
}
CreateHeaderPart1(); CreateHeaderPart1();
} }
void DataStreamer::CreateHeaderPart1() { void DataStreamer::CreateHeaderPart1() {
char type[10] = ""; char type[10] = "";
switch (*dynamicRange) { switch (*dynamicRange) {
@ -144,7 +154,7 @@ void DataStreamer::CreateHeaderPart1() {
} }
sprintf(currentHeader, jsonHeaderFormat_part1, sprintf(currentHeader, jsonHeaderFormat_part1,
STREAMER_VERSION, type, generalData->nPixelsX, generalData->nPixelsY); STREAMER_VERSION, type, generalData->nPixelsX_Streamer, generalData->nPixelsY_Streamer);
#ifdef VERBOSE #ifdef VERBOSE
cprintf(BLUE, "%d currentheader: %s\n", index, currentHeader); cprintf(BLUE, "%d currentheader: %s\n", index, currentHeader);
#endif #endif
@ -276,9 +286,19 @@ void DataStreamer::ProcessAnImage(char* buf) {
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);
if (!zmqSocket->SendData(buf + FILE_FRAME_HEADER_SIZE, generalData->imageSize)) //shortframe gotthard - data sending
cprintf(RED,"Error: Could not send zmq data for fnum %lld and streamer %d\n", if (completeBuffer) {
(long long int) fnum, index); memcpy(completeBuffer + ((generalData->imageSize)**shortFrameEnable), buf + FILE_FRAME_HEADER_SIZE, generalData->imageSize);
if (!zmqSocket->SendData(completeBuffer, generalData->imageSize_Streamer))
cprintf(RED,"Error: Could not send zmq data for fnum %lld and streamer %d\n",
(long long int) fnum, index);
}
//normal - data sending
else {
if (!zmqSocket->SendData(buf + FILE_FRAME_HEADER_SIZE, generalData->imageSize))
cprintf(RED,"Error: Could not send zmq data for fnum %lld and streamer %d\n",
(long long int) fnum, index);
}
} }

View File

@ -330,10 +330,11 @@ uint32_t Listener::ListenToAnImage(char* buf) {
} }
//until last packet //until last packet isHeaderEmpty to account for gotthard short frame, else never entering this loop)
while (pnum < (generalData->packetsPerFrame-1)) { while ( isHeaderEmpty || (pnum < (generalData->packetsPerFrame-1))) {
//listen to new packet //listen to new packet
int curr_rc = udpSocket->ReceiveDataOnly(listeningPacket); int curr_rc = udpSocket->ReceiveDataOnly(listeningPacket);
if(curr_rc <= 0) { if(curr_rc <= 0) {
if (rc <= 0) return 0; //empty image if (rc <= 0) return 0; //empty image

View File

@ -215,7 +215,7 @@ int UDPStandardImplementation::setDataStreamEnable(const bool enable) {
if (enable) { if (enable) {
bool error = false; bool error = false;
for ( int i = 0; i < numThreads; ++i ) { for ( int i = 0; i < numThreads; ++i ) {
dataStreamer.push_back(new DataStreamer(fifo[i], &dynamicRange, &frameToGuiFrequency, &frameToGuiTimerinMS)); dataStreamer.push_back(new DataStreamer(fifo[i], &dynamicRange, &frameToGuiFrequency, &frameToGuiTimerinMS, &shortFrameEnable));
dataStreamer[i]->SetGeneralData(generalData); dataStreamer[i]->SetGeneralData(generalData);
if (dataStreamer[i]->CreateZmqSockets(&detID, &numThreads) == FAIL) { if (dataStreamer[i]->CreateZmqSockets(&detID, &numThreads) == FAIL) {
error = true; error = true;