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

@ -35,6 +35,10 @@ void BinaryFile::PrintMembers() {
printf("Number of Frames in File: %d\n",numFramesInFile);
}
FILE* BinaryFile::GetFileHandle() {
return filefd;
}
slsReceiverDefs::fileFormat BinaryFile::GetFileType() {
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,
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) :
ThreadObject(NumberofDataProcessors),
@ -300,8 +301,8 @@ void DataProcessor::ProcessAnImage(char* buf) {
numFramesCaught++;
numTotalFramesCaught++;
uint64_t fnum = (*((uint64_t*)buf));
sls_detector_header* header = (sls_detector_header*) (buf);
uint64_t fnum = header->frameNumber;
#ifdef VERBOSE
if (!index) cprintf(BLUE,"DataProcessing %d: fnum:%lld\n", index, (long long int)fnum);
#endif
@ -315,11 +316,30 @@ void DataProcessor::ProcessAnImage(char* buf) {
if (*callbackAction == DO_EVERYTHING) {
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 {
/*
if (rawDataReadyCallBack)
rawDataReadyCallBack((int)fnum, buf + FILE_FRAME_HEADER_SIZE, generalData->fifoBufferSize,
NULL, NULL, pRawDataReady);
rawDataReadyCallBack(
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;
const char* DataStreamer::jsonHeaderFormat_part1 =
"{"
"\"version\":%.1f, "
"\"type\":\"%s\", "
"\"shape\":[%d, %d], ";
const char* DataStreamer::jsonHeaderFormat =
"%s"
"{"
"\"jsonversion\":%u, "
"\"bitmode\":%d, "
"\"shape\":[%d, %d], "
"\"acqIndex\":%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) :
@ -47,7 +58,6 @@ DataStreamer::DataStreamer(Fifo*& f, uint32_t* dr, uint32_t* freq, uint32_t* tim
streamingFrequency(freq),
streamingTimerInMs(timer),
currentFreqCount(0),
currentHeader(0),
acquisitionStartedFlag(false),
measurementStartedFlag(false),
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;
memset((void*)&timerBegin, 0, sizeof(timespec));
currentHeader = new char[255];
strcpy(fileNametoStream, "");
}
DataStreamer::~DataStreamer() {
CloseZmqSocket();
if (currentHeader) delete currentHeader;
if (completeBuffer) delete completeBuffer;
ThreadObject::DestroyThread();
NumberofDataStreamers--;
@ -137,27 +145,6 @@ void DataStreamer::ResetParametersforNewMeasurement(char* fname){
completeBuffer = new char[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) {
sls_detector_header* header = (sls_detector_header*) (buf);
//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);
if (!zmqSocket->SendData((char*)DUMMY_MSG, DUMMY_MSG_SIZE))
@ -256,8 +244,9 @@ void DataStreamer::StopProcessing(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
if (!index) cprintf(MAGENTA,"DataStreamer %d: fnum:%lld\n", index, (long long int)fnum);
#endif
@ -282,20 +271,20 @@ void DataStreamer::ProcessAnImage(char* buf) {
return;
}
if (!SendHeader(fnum, snum))
if (!SendHeader(header))
cprintf(RED,"Error: Could not send zmq header for fnum %lld and streamer %d\n",
(long long int) fnum, index);
//shortframe gotthard - data sending
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))
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))
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",
(long long int) fnum, index);
}
@ -329,19 +318,24 @@ bool DataStreamer::CheckCount() {
}
int DataStreamer::SendHeader(uint64_t fnum, uint32_t snum, bool dummy) {
uint64_t frameIndex = -1;
uint64_t acquisitionIndex = -1;
uint32_t subframeIndex = -1;
int DataStreamer::SendHeader(sls_detector_header* header, bool dummy) {
uint64_t frameIndex = header->frameNumber - firstMeasurementIndex;
uint64_t acquisitionIndex = header->frameNumber - firstAcquisitionIndex;
uint32_t subframeIndex = header->expLength;
char buf[1000] = "";
if (!dummy) {
frameIndex = fnum - firstMeasurementIndex;
acquisitionIndex = fnum - firstAcquisitionIndex;
subframeIndex = snum;
if (dummy) {
frameIndex = -1;
acquisitionIndex = -1;
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
printf("%d Streamer: buf:%s\n", index, buf);
#endif

View File

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

View File

@ -248,7 +248,7 @@ void Listener::ThreadExecution() {
//get data
if (*status != TRANSMITTING) {
if (*activated)
rc = ListenToAnImage(buffer + generalData->fifoBufferHeaderSize);
rc = ListenToAnImage(buffer);
else
rc = CreateAnImage(buffer + generalData->fifoBufferHeaderSize);
}
@ -306,7 +306,7 @@ uint32_t Listener::ListenToAnImage(char* buf) {
//reset to -1
memset(buf,0xFF,dsize);
memset(buf + generalData->fifoBufferHeaderSize, 0xFF, dsize);
//look for carry over
@ -319,11 +319,28 @@ uint32_t Listener::ListenToAnImage(char* buf) {
return generalData->imageSize;
}
carryOverFlag = false;
memcpy(buf + (pnum * dsize), carryOverPacket + generalData->headerSizeinPacket, dsize);
memcpy(buf + generalData->fifoBufferHeaderSize + (pnum * dsize), carryOverPacket + generalData->headerSizeinPacket, dsize);
//writer header
if(isHeaderEmpty) {
(*((uint64_t*)(buf - FILE_FRAME_HEADER_SIZE))) = fnum;
(*((uint64_t*)(buf - FILE_FRAME_HEADER_SIZE + FILE_FRAME_HDR_FNUM_SIZE))) = snum;
(*((uint64_t*)(buf - FILE_FRAME_HEADER_SIZE + FILE_FRAME_HDR_FNUM_SIZE + FILE_FRAME_HDR_SNUM_SIZE))) = bid;
sls_detector_header* header = (sls_detector_header*) (buf);
memset(header, 0, sizeof(sls_detector_header));
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;
}
expectpnum = pnum+1; //for jungfrau
@ -374,11 +391,19 @@ uint32_t Listener::ListenToAnImage(char* buf) {
}
//copy packet
memcpy(buf + (pnum * dsize), listeningPacket + generalData->headerSizeinPacket, dsize);
memcpy(buf + generalData->fifoBufferHeaderSize + (pnum * dsize), listeningPacket + generalData->headerSizeinPacket, dsize);
if(isHeaderEmpty) {
(*((uint64_t*)(buf - FILE_FRAME_HEADER_SIZE))) = fnum;
(*((uint64_t*)(buf - FILE_FRAME_HEADER_SIZE + FILE_FRAME_HDR_FNUM_SIZE))) = snum;
(*((uint64_t*)(buf - FILE_FRAME_HEADER_SIZE + FILE_FRAME_HDR_FNUM_SIZE + FILE_FRAME_HDR_SNUM_SIZE))) = bid;
sls_detector_header* header = (sls_detector_header*) (buf);
memset(header, 0, sizeof(sls_detector_header));
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;
}
expectpnum = pnum+1; //for jungfrau

View File

@ -541,20 +541,20 @@ int UDPBaseImplementation::setActivate(int enable){
}
/***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;
pStartAcquisition=arg;
}
void UDPBaseImplementation::registerCallBackAcquisitionFinished(void (*func)(int, void*),void *arg){
void UDPBaseImplementation::registerCallBackAcquisitionFinished(void (*func)(uint64_t, void*),void *arg){
acquisitionFinishedCallBack=func;
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;
pRawDataReady=arg;
}
//#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) {
if (myDetectorType != GOTTHARD) {
cprintf(RED, "Error: Can not set short frame for this detector\n");
@ -556,7 +536,7 @@ void UDPStandardImplementation::stopReceiver(){
{ //statistics
int tot = 0;
uint64_t tot = 0;
for (int i = 0; i < numThreads; i++) {
tot += dataProcessor[i]->GetNumFramesCaught();
@ -577,7 +557,7 @@ void UDPStandardImplementation::stopReceiver(){
cprintf(RED,"Note: Deactivated Receiver\n");
//callback
if (acquisitionFinishedCallBack)
acquisitionFinishedCallBack((int)(tot/numThreads), pAcquisitionFinished);
acquisitionFinishedCallBack((tot/numThreads), pAcquisitionFinished);
}
//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
if(udp_interface)
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
if(udp_interface)
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
if(udp_interface)
udp_interface->registerCallBackRawDataReady(func,arg);

View File

@ -2680,17 +2680,18 @@ int slsReceiverTCPIPInterface::exec_command() {
/***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;
pStartAcquisition=arg;
}
void slsReceiverTCPIPInterface::registerCallBackAcquisitionFinished(void (*func)(int, void*),void *arg){
void slsReceiverTCPIPInterface::registerCallBackAcquisitionFinished(void (*func)(uint64_t, void*),void *arg){
acquisitionFinishedCallBack=func;
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;
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);
}
void slsReceiverUsers::registerCallBackAcquisitionFinished(void (*func)(int, void*),void *arg){
void slsReceiverUsers::registerCallBackAcquisitionFinished(void (*func)(uint64_t, void*),void *arg){
receiver->registerCallBackAcquisitionFinished(func,arg);
}
void slsReceiverUsers::registerCallBackRawDataReady(void (*func)(int, char*, int, FILE*, char*, void*),void *arg){
void slsReceiverUsers::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){
receiver->registerCallBackRawDataReady(func,arg);
}