From 193f2b9011748f7e34859494d6f6615ec51f4836 Mon Sep 17 00:00:00 2001 From: Samuel Debionne Date: Mon, 25 Mar 2019 17:52:30 +0100 Subject: [PATCH] Split slsReceiver into slsListener and slsReceiver --- CMakeLists.txt | 11 +- slsReceiverSoftware/CMakeLists.txt | 92 +-- .../slsListener/CMakeLists.txt | 35 + .../{ => slsListener}/include/GeneralData.h | 0 .../slsListener/include/Listener.h | 275 +++++++ .../include/gitInfoReceiver.h | 0 .../include/gitInfoReceiverTmp.h | 0 .../{ => slsListener}/include/receiver_defs.h | 0 .../{ => slsListener}/slsReceiverUsers.doxy | 0 .../slsListener/src/Listener.cpp | 527 +++++++++++++ .../{ => slsListener}/updateAPIVersion.sh | 0 .../{ => slsListener}/updateGitVersion.sh | 0 .../slsReceiver/CMakeLists.txt | 90 +++ slsReceiverSoftware/slsReceiver/gitInfo.txt | 9 + .../{ => slsReceiver}/include/BinaryFile.h | 0 .../include/BinaryFileStatic.h | 0 .../{ => slsReceiver}/include/DataProcessor.h | 0 .../{ => slsReceiver}/include/DataStreamer.h | 0 .../{ => slsReceiver}/include/Fifo.h | 0 .../{ => slsReceiver}/include/File.h | 0 .../slsReceiver/include/GeneralData.h | 702 ++++++++++++++++++ .../{ => slsReceiver}/include/HDF5File.h | 0 .../include/HDF5FileStatic.h | 0 .../{ => slsReceiver}/include/Listener.h | 0 .../{ => slsReceiver}/include/ThreadObject.h | 0 .../{ => slsReceiver}/include/circularFifo.h | 0 .../slsReceiver/include/gitInfoReceiver.h | 6 + .../slsReceiver/include/gitInfoReceiverTmp.h | 6 + .../slsReceiver/include/receiver_defs.h | 50 ++ .../{ => slsReceiver}/include/slsReceiver.h | 0 .../include/slsReceiverImplementation.h | 0 .../include/slsReceiverTCPIPInterface.h | 0 .../include/slsReceiverUsers.h | 0 .../slsReceiver/slsReceiverUsers.doxy | 86 +++ .../{ => slsReceiver}/src/BinaryFile.cpp | 0 .../{ => slsReceiver}/src/DataProcessor.cpp | 0 .../{ => slsReceiver}/src/DataStreamer.cpp | 0 .../{ => slsReceiver}/src/Fifo.cpp | 0 .../{ => slsReceiver}/src/File.cpp | 0 .../{ => slsReceiver}/src/HDF5File.cpp | 0 .../{ => slsReceiver}/src/Listener.cpp | 0 .../{ => slsReceiver}/src/ThreadObject.cpp | 0 .../{ => slsReceiver}/src/main.cpp | 0 .../{ => slsReceiver}/src/slsReceiver.cpp | 0 .../src/slsReceiverImplementation.cpp | 0 .../src/slsReceiverTCPIPInterface.cpp | 0 .../src/slsReceiverUsers.cpp | 0 .../slsReceiver/updateAPIVersion.sh | 7 + .../slsReceiver/updateGitVersion.sh | 28 + 49 files changed, 1832 insertions(+), 92 deletions(-) create mode 100644 slsReceiverSoftware/slsListener/CMakeLists.txt rename slsReceiverSoftware/{ => slsListener}/include/GeneralData.h (100%) create mode 100644 slsReceiverSoftware/slsListener/include/Listener.h rename slsReceiverSoftware/{ => slsListener}/include/gitInfoReceiver.h (100%) rename slsReceiverSoftware/{ => slsListener}/include/gitInfoReceiverTmp.h (100%) rename slsReceiverSoftware/{ => slsListener}/include/receiver_defs.h (100%) mode change 100755 => 100644 rename slsReceiverSoftware/{ => slsListener}/slsReceiverUsers.doxy (100%) create mode 100644 slsReceiverSoftware/slsListener/src/Listener.cpp rename slsReceiverSoftware/{ => slsListener}/updateAPIVersion.sh (100%) mode change 100755 => 100644 rename slsReceiverSoftware/{ => slsListener}/updateGitVersion.sh (100%) mode change 100755 => 100644 create mode 100644 slsReceiverSoftware/slsReceiver/CMakeLists.txt create mode 100644 slsReceiverSoftware/slsReceiver/gitInfo.txt rename slsReceiverSoftware/{ => slsReceiver}/include/BinaryFile.h (100%) rename slsReceiverSoftware/{ => slsReceiver}/include/BinaryFileStatic.h (100%) rename slsReceiverSoftware/{ => slsReceiver}/include/DataProcessor.h (100%) rename slsReceiverSoftware/{ => slsReceiver}/include/DataStreamer.h (100%) rename slsReceiverSoftware/{ => slsReceiver}/include/Fifo.h (100%) rename slsReceiverSoftware/{ => slsReceiver}/include/File.h (100%) create mode 100644 slsReceiverSoftware/slsReceiver/include/GeneralData.h rename slsReceiverSoftware/{ => slsReceiver}/include/HDF5File.h (100%) rename slsReceiverSoftware/{ => slsReceiver}/include/HDF5FileStatic.h (100%) rename slsReceiverSoftware/{ => slsReceiver}/include/Listener.h (100%) rename slsReceiverSoftware/{ => slsReceiver}/include/ThreadObject.h (100%) rename slsReceiverSoftware/{ => slsReceiver}/include/circularFifo.h (100%) create mode 100644 slsReceiverSoftware/slsReceiver/include/gitInfoReceiver.h create mode 100644 slsReceiverSoftware/slsReceiver/include/gitInfoReceiverTmp.h create mode 100644 slsReceiverSoftware/slsReceiver/include/receiver_defs.h rename slsReceiverSoftware/{ => slsReceiver}/include/slsReceiver.h (100%) rename slsReceiverSoftware/{ => slsReceiver}/include/slsReceiverImplementation.h (100%) rename slsReceiverSoftware/{ => slsReceiver}/include/slsReceiverTCPIPInterface.h (100%) rename slsReceiverSoftware/{ => slsReceiver}/include/slsReceiverUsers.h (100%) create mode 100644 slsReceiverSoftware/slsReceiver/slsReceiverUsers.doxy rename slsReceiverSoftware/{ => slsReceiver}/src/BinaryFile.cpp (100%) rename slsReceiverSoftware/{ => slsReceiver}/src/DataProcessor.cpp (100%) rename slsReceiverSoftware/{ => slsReceiver}/src/DataStreamer.cpp (100%) rename slsReceiverSoftware/{ => slsReceiver}/src/Fifo.cpp (100%) rename slsReceiverSoftware/{ => slsReceiver}/src/File.cpp (100%) rename slsReceiverSoftware/{ => slsReceiver}/src/HDF5File.cpp (100%) rename slsReceiverSoftware/{ => slsReceiver}/src/Listener.cpp (100%) rename slsReceiverSoftware/{ => slsReceiver}/src/ThreadObject.cpp (100%) rename slsReceiverSoftware/{ => slsReceiver}/src/main.cpp (100%) rename slsReceiverSoftware/{ => slsReceiver}/src/slsReceiver.cpp (100%) rename slsReceiverSoftware/{ => slsReceiver}/src/slsReceiverImplementation.cpp (100%) rename slsReceiverSoftware/{ => slsReceiver}/src/slsReceiverTCPIPInterface.cpp (100%) rename slsReceiverSoftware/{ => slsReceiver}/src/slsReceiverUsers.cpp (100%) create mode 100644 slsReceiverSoftware/slsReceiver/updateAPIVersion.sh create mode 100644 slsReceiverSoftware/slsReceiver/updateGitVersion.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index d11b8a104..52ac5fa93 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,7 +32,8 @@ endif() option (SLS_USE_HDF5 "HDF5 File format" OFF) option (SLS_USE_TEXTCLIENT "Text Client" OFF) -option (SLS_USE_RECEIVER "Receiver" OFF) +option (SLS_USE_RECEIVER "Receiver High Level API" OFF) +option (SLS_USE_LISTENER "Receiver Low Level API" OFF) option (SLS_USE_GUI "GUI" OFF) option (SLS_USE_TESTS "TESTS" ON) option (SLS_USE_INTEGRATION_TESTS "Integration Tests" ON) @@ -87,14 +88,20 @@ if (SLS_USE_TEXTCLIENT) add_subdirectory(slsDetectorSoftware) endif (SLS_USE_TEXTCLIENT) +# This logic could be moved in slsReceiverSoftware/CMakeLists.txt if (SLS_USE_RECEIVER) + set(SLS_USE_LISTENER ON) if (SLS_USE_HDF5) find_package(HDF5 1.10 COMPONENTS CXX REQUIRED) endif (SLS_USE_HDF5) - add_subdirectory(slsReceiverSoftware) + add_subdirectory(slsReceiverSoftware/slsReceiver) add_subdirectory(manual/manual-api) endif (SLS_USE_RECEIVER) +if (SLS_USE_LISTENER) + add_subdirectory(slsReceiverSoftware/slsListener) +endif (SLS_USE_LISTENER) + if (SLS_USE_GUI) find_package(Qt4 REQUIRED) find_package(Qwt 6 REQUIRED) diff --git a/slsReceiverSoftware/CMakeLists.txt b/slsReceiverSoftware/CMakeLists.txt index eea64a321..35d2ba57b 100644 --- a/slsReceiverSoftware/CMakeLists.txt +++ b/slsReceiverSoftware/CMakeLists.txt @@ -1,90 +1,2 @@ -set(SOURCES - src/slsReceiverImplementation.cpp - src/slsReceiverTCPIPInterface.cpp - src/slsReceiver.cpp - src/slsReceiverUsers.cpp - src/File.cpp - src/BinaryFile.cpp - src/ThreadObject.cpp - src/Listener.cpp - src/DataProcessor.cpp - src/DataStreamer.cpp - src/Fifo.cpp -) - - -# HDF5 -if (SLS_USE_HDF5) - if (HDF5_FOUND) - include_directories( - ${HDF5_INCLUDE_DIRS} - ) - add_definitions( - -DHDF5C ${HDF5_DEFINITIONS} - ) - list (APPEND SOURCES - src/HDF5File.cpp - ) - endif () -endif (SLS_USE_HDF5) - - -# include_directories( -# ${SLS_SUPPORT_LIB_INCLUDE_DIRS} -# ) - -add_library(slsReceiverShared SHARED - ${SOURCES} - ${HEADERS} -) - -target_link_libraries(slsReceiverShared PUBLIC - slsSupportLib -) - -target_include_directories(slsReceiverShared PUBLIC - "$" - "$") - -#What is included in slsReceiverLib? -set(PUBLICHEADERS - include/slsReceiverUsers.h -) - - -set_target_properties(slsReceiverShared PROPERTIES - LIBRARY_OUTPUT_NAME SlsReceiver - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin - PUBLIC_HEADER "${PUBLICHEADERS}" -) - -add_executable(slsReceiver - src/main.cpp -) -set_target_properties(slsReceiver PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin -) - -target_link_libraries(slsReceiver PUBLIC - slsSupportLib - slsReceiverShared - pthread - ${ZeroMQ_LIBRARIES} - rt -) - -if (HDF5_FOUND) - target_link_libraries(slsReceiver PUBLIC ${HDF5_LIBRARIES}) -endif () - - - -install(TARGETS slsReceiverShared - EXPORT "${TARGETS_EXPORT_NAME}" - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) - -install(FILES ${ZMQ_STATIC_ARCHIVE} -DESTINATION lib) +add_subdirectory(slsListener) +add_subdirectory(slsReceiver) diff --git a/slsReceiverSoftware/slsListener/CMakeLists.txt b/slsReceiverSoftware/slsListener/CMakeLists.txt new file mode 100644 index 000000000..6f90391d8 --- /dev/null +++ b/slsReceiverSoftware/slsListener/CMakeLists.txt @@ -0,0 +1,35 @@ +set(SOURCES + src/Listener.cpp +) + +add_library(slsListenerShared SHARED + ${SOURCES} + ${HEADERS} +) + +target_link_libraries(slsListenerShared PUBLIC + slsSupportLib +) + +target_include_directories(slsListenerShared PUBLIC + "$" + "$") + +#What is included in slsReceiverLib? +set(PUBLICHEADERS + include/Listener.h +) + + +set_target_properties(slsListenerShared PROPERTIES + LIBRARY_OUTPUT_NAME slsListener + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin + PUBLIC_HEADER "${PUBLICHEADERS}" +) + +install(TARGETS slsListenerShared + EXPORT "${TARGETS_EXPORT_NAME}" + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) diff --git a/slsReceiverSoftware/include/GeneralData.h b/slsReceiverSoftware/slsListener/include/GeneralData.h similarity index 100% rename from slsReceiverSoftware/include/GeneralData.h rename to slsReceiverSoftware/slsListener/include/GeneralData.h diff --git a/slsReceiverSoftware/slsListener/include/Listener.h b/slsReceiverSoftware/slsListener/include/Listener.h new file mode 100644 index 000000000..3678476e5 --- /dev/null +++ b/slsReceiverSoftware/slsListener/include/Listener.h @@ -0,0 +1,275 @@ +#pragma once +/************************************************ + * @file Listener.h + * @short creates the listener thread that + * listens to udp sockets, writes data to memory + * & puts pointers to their memory addresses into fifos + ***********************************************/ +/** + *@short creates & manages a listener thread each + */ + +#include "sls_detector_defs.h" +#include "logger.h" + +#include +#include + +class GeneralData; +class genericSocket; + +class Listener : private virtual slsDetectorDefs { + + public: + /** + * Constructor + * Calls Base Class CreateThread(), sets ErrorMask if error and increments NumberofListerners + * @param ind self index + * @param dtype detector type + * @param f address of Fifo pointer + * @param s pointer to receiver status + * @param portno pointer to udp port number + * @param e ethernet interface + * @param nf pointer to number of images to catch + * @param dr pointer to dynamic range + * @param us pointer to udp socket buffer size + * @param as pointer to actual udp socket buffer size + * @param fpf pointer to frames per file + * @param fdp frame discard policy + * @param act pointer to activated + * @param depaden pointer to deactivated padding enable + * @param sm pointer to silent mode + */ + Listener(int ind, detectorType dtype, runStatus* s, + uint32_t* portno, char* e, uint64_t* nf, uint32_t* dr, + int64_t* us, int64_t* as, uint32_t* fpf, + frameDiscardPolicy* fdp, bool* act, bool* depaden, bool* sm); + + /** + * Destructor + * Calls Base Class DestroyThread() and decrements NumberofListerners + */ + ~Listener(); + + /** + * Populate a buffer with an image + * \note This is a blocking call + */ + void getImage(char* buffer); + + /** + * Get acquisition started flag + * @return acquisition started flag + */ + bool GetAcquisitionStartedFlag(); + + /** + * Get measurement started flag + * @return measurement started flag + */ + bool GetMeasurementStartedFlag(); + + /** + * Get Packets caught in a real time acquisition (start and stop of receiver) + * @return Packets caught in a real time acquisition + */ + uint64_t GetPacketsCaught(); + + /** + * Get Last Frame index caught + * @return last frame index caught + */ + uint64_t GetLastFrameIndexCaught(); + + + + /** + * Reset parameters for new acquisition (including all scans) + */ + void ResetParametersforNewAcquisition(); + + /** + * Reset parameters for new measurement (eg. for each scan) + */ + void ResetParametersforNewMeasurement(); + + /** + * Set GeneralData pointer to the one given + * @param g address of GeneralData (Detector Data) pointer + */ + void SetGeneralData(GeneralData* g); + + /** + * Creates UDP Sockets + * @return OK or FAIL + */ + int CreateUDPSockets(); + + /** + * Shuts down and deletes UDP Sockets + */ + void ShutDownUDPSocket(); + + /** + * Create & closes a dummy UDP socket + * to set & get actual buffer size + * @param s UDP socket buffer size to be set + * @return OK or FAIL of dummy socket creation + */ + int CreateDummySocketForUDPSocketBufferSize(int64_t s); + + /** + * Set hard coded (calculated but not from detector) row and column + * r is in row index if detector has not send them yet in firmware, + * c is in col index for jungfrau and eiger (for missing packets/deactivated eiger) + * c when used is in 2d + */ + void SetHardCodedPosition(uint16_t r, uint16_t c); + + + + private: + + /** + * Record First Indices (firstAcquisitionIndex, firstMeasurementIndex) + * @param fnum frame index to record + */ + void RecordFirstIndices(uint64_t fnum); + + /** + * Pushes non empty buffers into fifo/ frees empty buffer, + * pushes dummy buffer into fifo + * and reset running mask by calling StopRunning() + * @param buf address of buffer + */ + void StopListening(char* buf); + + /** + * Listen to the UDP Socket for an image, + * place them in the right order + * @param buffer + * @returns number of bytes of relevant data, can be image size or 0 (stop acquisition) + * or -1 to discard image + */ + uint32_t ListenToAnImage(char* buf); + + /** type of thread */ + static const std::string TypeName; + + /** Self Index */ + int index; + + /** GeneralData (Detector Data) object */ + GeneralData* generalData; + + // individual members + /** Detector Type */ + detectorType myDetectorType; + + /** Receiver Status */ + runStatus* status; + + /** UDP Socket - Detector to Receiver */ + std::unique_ptr udpSocket; + + /** UDP Port Number */ + uint32_t* udpPortNumber; + + /** ethernet interface */ + char* eth; + + /** Number of Images to catch */ + uint64_t* numImages; + + /** Dynamic Range */ + uint32_t* dynamicRange; + + /** UDP Socket Buffer Size */ + int64_t* udpSocketBufferSize; + + /** actual UDP Socket Buffer Size (double due to kernel bookkeeping) */ + int64_t* actualUDPSocketBufferSize; + + /** frames per file */ + uint32_t* framesPerFile; + + /** frame discard policy */ + frameDiscardPolicy* frameDiscardMode; + + /** Activated/Deactivated */ + bool* activated; + + /** Deactivated padding enable */ + bool* deactivatedPaddingEnable; + + /** Silent Mode */ + bool* silentMode; + + /** row hardcoded as 1D or 2d, + * if detector does not send them yet or + * missing packets/deactivated (eiger/jungfrau sends 2d pos) **/ + uint16_t row; + + /** column hardcoded as 2D, + * deactivated eiger/missing packets (eiger/jungfrau sends 2d pos) **/ + uint16_t column; + + + // acquisition start + /** Aquisition Started flag */ + bool acquisitionStartedFlag; + + /** Measurement Started flag */ + bool measurementStartedFlag; + + /** Frame Number of First Frame of an entire Acquisition (including all scans) */ + uint64_t firstAcquisitionIndex; + + /** Frame Number of First Frame for each real time acquisition (eg. for each scan) */ + uint64_t firstMeasurementIndex; + + + // for acquisition summary + /** Number of complete Packets caught for each real time acquisition (eg. for each scan (start& stop of receiver)) */ + volatile uint64_t numPacketsCaught; + + /** Last Frame Index caught from udp network */ + uint64_t lastCaughtFrameIndex; + + + // parameters to acquire image + /** Current Frame Index, default value is 0 + * ( always check acquisitionStartedFlag for validity first) + */ + uint64_t currentFrameIndex; + + /** True if there is a packet carry over from previous Image */ + bool carryOverFlag; + + /** Carry over packet buffer */ + std::unique_ptr carryOverPacket; + + /** Listening buffer for one packet - might be removed when we can peek and eiger fnum is in header */ + std::unique_ptr listeningPacket; + + /** if the udp socket is connected */ + bool udpSocketAlive; + + /** Semaphore to synchonize deleting udp socket */ + sem_t semaphore_socket; + + + // for print progress during acqusition + /** number of packets for statistic */ + uint32_t numPacketsStatistic; + + /** number of images for statistic */ + uint32_t numFramesStatistic; + + /** + * starting packet number is odd or evern, accordingly increment frame number + * to get first packet number as 0 + * (pecific to gotthard, can vary between modules, hence defined here) */ + bool oddStartingPacket; +}; + diff --git a/slsReceiverSoftware/include/gitInfoReceiver.h b/slsReceiverSoftware/slsListener/include/gitInfoReceiver.h similarity index 100% rename from slsReceiverSoftware/include/gitInfoReceiver.h rename to slsReceiverSoftware/slsListener/include/gitInfoReceiver.h diff --git a/slsReceiverSoftware/include/gitInfoReceiverTmp.h b/slsReceiverSoftware/slsListener/include/gitInfoReceiverTmp.h similarity index 100% rename from slsReceiverSoftware/include/gitInfoReceiverTmp.h rename to slsReceiverSoftware/slsListener/include/gitInfoReceiverTmp.h diff --git a/slsReceiverSoftware/include/receiver_defs.h b/slsReceiverSoftware/slsListener/include/receiver_defs.h old mode 100755 new mode 100644 similarity index 100% rename from slsReceiverSoftware/include/receiver_defs.h rename to slsReceiverSoftware/slsListener/include/receiver_defs.h diff --git a/slsReceiverSoftware/slsReceiverUsers.doxy b/slsReceiverSoftware/slsListener/slsReceiverUsers.doxy similarity index 100% rename from slsReceiverSoftware/slsReceiverUsers.doxy rename to slsReceiverSoftware/slsListener/slsReceiverUsers.doxy diff --git a/slsReceiverSoftware/slsListener/src/Listener.cpp b/slsReceiverSoftware/slsListener/src/Listener.cpp new file mode 100644 index 000000000..830793195 --- /dev/null +++ b/slsReceiverSoftware/slsListener/src/Listener.cpp @@ -0,0 +1,527 @@ +/************************************************ + * @file Listener.cpp + * @short creates the listener thread that + * listens to udp sockets, writes data to memory + * & puts pointers to their memory addresses into fifos + ***********************************************/ + + +#include "Listener.h" +#include "GeneralData.h" +#include "genericSocket.h" +#include "container_utils.h" // For sls::make_unique<> +#include "sls_detector_exceptions.h" + +#include +#include +#include + +const std::string Listener::TypeName = "Listener"; + + +Listener::Listener(int ind, detectorType dtype, runStatus* s, + uint32_t* portno, char* e, uint64_t* nf, uint32_t* dr, + int64_t* us, int64_t* as, uint32_t* fpf, + frameDiscardPolicy* fdp, bool* act, bool* depaden, bool* sm) : + index(ind), + generalData(nullptr), + myDetectorType(dtype), + status(s), + udpSocket(nullptr), + udpPortNumber(portno), + eth(e), + numImages(nf), + dynamicRange(dr), + udpSocketBufferSize(us), + actualUDPSocketBufferSize(as), + framesPerFile(fpf), + frameDiscardMode(fdp), + activated(act), + deactivatedPaddingEnable(depaden), + silentMode(sm), + row(0), + column(0), + acquisitionStartedFlag(false), + measurementStartedFlag(false), + firstAcquisitionIndex(0), + firstMeasurementIndex(0), + numPacketsCaught(0), + lastCaughtFrameIndex(0), + currentFrameIndex(0), + carryOverFlag(0), + udpSocketAlive(0), + numPacketsStatistic(0), + numFramesStatistic(0), + oddStartingPacket(true) +{ + FILE_LOG(logDEBUG) << "Listener " << ind << " created"; +} + +/** getters */ +bool Listener::GetAcquisitionStartedFlag(){ + return acquisitionStartedFlag; +} + +bool Listener::GetMeasurementStartedFlag(){ + return measurementStartedFlag; +} + +uint64_t Listener::GetPacketsCaught() { + return numPacketsCaught; +} + +uint64_t Listener::GetLastFrameIndexCaught() { + return lastCaughtFrameIndex; +} + +void Listener::ResetParametersforNewAcquisition() { + acquisitionStartedFlag = false; + firstAcquisitionIndex = 0; + currentFrameIndex = 0; + lastCaughtFrameIndex = 0; +} + + +void Listener::ResetParametersforNewMeasurement() { + measurementStartedFlag = false; + numPacketsCaught = 0; + firstMeasurementIndex = 0; + carryOverFlag = false; + carryOverPacket = sls::make_unique(generalData->packetSize); + memset(carryOverPacket.get(),0,generalData->packetSize); + listeningPacket = sls::make_unique(generalData->packetSize); + memset(carryOverPacket.get(),0,generalData->packetSize); + + numPacketsStatistic = 0; + numFramesStatistic = 0; +} + + + +void Listener::RecordFirstIndices(uint64_t fnum) { + //listen to this fnum, later +1 + currentFrameIndex = fnum; + + measurementStartedFlag = true; + firstMeasurementIndex = fnum; + + //start of entire acquisition + if (!acquisitionStartedFlag) { + acquisitionStartedFlag = true; + firstAcquisitionIndex = fnum; + } + + if(!(*silentMode)) { + if (!index) { + FILE_LOG(logINFOBLUE) << index << + " First Acquisition Index: " << firstAcquisitionIndex; + FILE_LOG(logDEBUG1) << index << " First Measurement Index: " << firstMeasurementIndex; + } + } +} + + +void Listener::SetGeneralData(GeneralData* g) { + generalData = g; + generalData->Print(); +} + +int Listener::CreateUDPSockets() { + + if (!(*activated)) { + return OK; + } + + //if eth is mistaken with ip address + if (strchr(eth,'.') != nullptr){ + memset(eth, 0, MAX_STR_LENGTH); + } + if(!strlen(eth)){ + FILE_LOG(logWARNING) << "eth is empty. Listening to all"; + } + + ShutDownUDPSocket(); + + try{ + udpSocket = sls::make_unique(*udpPortNumber, genericSocket::UDP, + generalData->packetSize, (strlen(eth)?eth:nullptr), generalData->headerPacketSize, + *udpSocketBufferSize); + FILE_LOG(logINFO) << index << ": UDP port opened at port " << *udpPortNumber; + } catch (...) { + FILE_LOG(logERROR) << "Could not create UDP socket on port " << *udpPortNumber; + return FAIL; + } + + udpSocketAlive = true; + + // doubled due to kernel bookkeeping (could also be less due to permissions) + *actualUDPSocketBufferSize = udpSocket->getActualUDPSocketBufferSize(); + + return OK; +} + + + +void Listener::ShutDownUDPSocket() { + if(udpSocket){ + udpSocketAlive = false; + udpSocket->ShutDownSocket(); + FILE_LOG(logINFO) << "Shut down of UDP port " << *udpPortNumber; + fflush(stdout); + } +} + + +int Listener::CreateDummySocketForUDPSocketBufferSize(int64_t s) { + FILE_LOG(logINFO) << "Testing UDP Socket Buffer size with test port " << *udpPortNumber; + + if (!(*activated)) { + *actualUDPSocketBufferSize = (s*2); + return OK; + } + + int64_t temp = *udpSocketBufferSize; + *udpSocketBufferSize = s; + + //if eth is mistaken with ip address + if (strchr(eth,'.') != nullptr){ + memset(eth, 0, MAX_STR_LENGTH); + } + + //create dummy socket + try { + genericSocket g(*udpPortNumber, genericSocket::UDP, + generalData->packetSize, (strlen(eth)?eth:nullptr), generalData->headerPacketSize, + *udpSocketBufferSize); + + // doubled due to kernel bookkeeping (could also be less due to permissions) + *actualUDPSocketBufferSize = g.getActualUDPSocketBufferSize(); + if (*actualUDPSocketBufferSize != (s*2)) { + *udpSocketBufferSize = temp; + } + + } catch (...) { + FILE_LOG(logERROR) << "Could not create a test UDP socket on port " << *udpPortNumber; + return FAIL; + } + + + return OK; +} + +void Listener::SetHardCodedPosition(uint16_t r, uint16_t c) { + row = r; + column = c; +} + +void Listener::getImage(char* buffer) { + int rc = 0; + + //udpsocket doesnt exist + if (*activated && !udpSocketAlive && !carryOverFlag) { + //FILE_LOG(logERROR) << "Listening_Thread " << index << ": UDP Socket not created or shut down earlier"; + (*((uint32_t*)buffer)) = 0; + throw std::runtime_error("UDP Socket not created or shut down earlier"); + } + + //get data + if ((*status != TRANSMITTING && (!(*activated) || udpSocketAlive)) || carryOverFlag) { + rc = ListenToAnImage(buffer); + } + + + //error check, (should not be here) if not transmitting yet (previous if) rc should be > 0 + if (rc == 0) + return; + // discarding image + else if (rc < 0) { + FILE_LOG(logDEBUG) << index << " discarding fnum:" << currentFrameIndex; + currentFrameIndex++; + return; + } + + (*((uint32_t*)buffer)) = rc; + (*((uint64_t*)(buffer + FIFO_HEADER_NUMBYTES ))) = currentFrameIndex; //for those returning earlier + currentFrameIndex++; +} + + +/* buf includes the fifo header and packet header */ +uint32_t Listener::ListenToAnImage(char* buf) { + + int rc = 0; + uint64_t fnum = 0, bid = 0; + uint32_t pnum = 0, snum = 0; + uint32_t numpackets = 0; + uint32_t dsize = generalData->dataSize; + uint32_t hsize = generalData->headerSizeinPacket; //(includes empty header) + uint32_t esize = generalData->emptyHeader; + uint32_t fifohsize = generalData->fifoBufferHeaderSize; + uint32_t pperFrame = generalData->packetsPerFrame; + bool isHeaderEmpty = true; + sls_detector_header* old_header = nullptr; + sls_receiver_header* new_header = nullptr; + bool standardheader = generalData->standardheader; + uint32_t corrected_dsize = dsize - ((pperFrame * dsize) - generalData->imageSize); + + + //reset to -1 + std::memset(buf, 0, fifohsize); + /*memset(buf + fifohsize, 0xFF, generalData->imageSize);*/ + new_header = (sls_receiver_header*) (buf + FIFO_HEADER_NUMBYTES); + + // deactivated (eiger) + if (!(*activated)) { + // no padding + if (!(*deactivatedPaddingEnable)) + return 0; + // padding without setting bitmask (all missing packets padded in dataProcessor) + if (currentFrameIndex >= *numImages) + return 0; + + //(eiger) first fnum starts at 1 + if (!currentFrameIndex) { + ++currentFrameIndex; + } + new_header->detHeader.frameNumber = currentFrameIndex; + new_header->detHeader.row = row; + new_header->detHeader.column = column; + new_header->detHeader.detType = (uint8_t) generalData->myDetectorType; + new_header->detHeader.version = (uint8_t) SLS_DETECTOR_HEADER_VERSION; + return generalData->imageSize; + } + + + + //look for carry over + if (carryOverFlag) { + FILE_LOG(logDEBUG3) << index << "carry flag"; + //check if its the current image packet + // -------------------------- new header ---------------------------------------------------------------------- + if (standardheader) { + old_header = (sls_detector_header*) (&carryOverPacket[esize]); + fnum = old_header->frameNumber; + pnum = old_header->packetNumber; + } + // -------------------old header ----------------------------------------------------------------------------- + else { + generalData->GetHeaderInfo(index, &carryOverPacket[esize], + *dynamicRange, oddStartingPacket, fnum, pnum, snum, bid); + } + //------------------------------------------------------------------------------------------------------------ + if (fnum != currentFrameIndex) { + if (fnum < currentFrameIndex) { + FILE_LOG(logERROR) << "(Weird), With carry flag: Frame number " << + fnum << " less than current frame number " << currentFrameIndex; + return 0; + } + switch(*frameDiscardMode) { + case DISCARD_EMPTY_FRAMES: + if (!numpackets) + return -1; + break; + case DISCARD_PARTIAL_FRAMES: + return -1; + default: + break; + } + new_header->detHeader.packetNumber = numpackets; + if(isHeaderEmpty) { + new_header->detHeader.row = row; + new_header->detHeader.column = column; + } + return generalData->imageSize; + } + + //copy packet + switch(myDetectorType) { + //for gotthard, 1st packet: 4 bytes fnum, CACA + CACA, 639*2 bytes data + // 2nd packet: 4 bytes fnum, previous 1*2 bytes data + 640*2 bytes data !! + case GOTTHARD: + if(!pnum) + memcpy(buf + fifohsize , &carryOverPacket[hsize+4], dsize-2); + else + memcpy(buf + fifohsize + dsize - 2, &carryOverPacket[hsize], dsize+2); + break; + case CHIPTESTBOARD: + case MOENCH: + if (pnum == (pperFrame-1)) + memcpy(buf + fifohsize + (pnum * dsize), &carryOverPacket[hsize], corrected_dsize); + else + memcpy(buf + fifohsize + (pnum * dsize), &carryOverPacket[hsize], dsize); + break; + default: + memcpy(buf + fifohsize + (pnum * dsize), &carryOverPacket[hsize], dsize); + break; + } + + carryOverFlag = false; + ++numpackets; //number of packets in this image (each time its copied to buf) + new_header->packetsMask[((pnum < MAX_NUM_PACKETS) ? pnum : MAX_NUM_PACKETS)] = 1; + + //writer header + if(isHeaderEmpty) { + // -------------------------- new header ---------------------------------------------------------------------- + if (standardheader) { + memcpy((char*)new_header, (char*)old_header, sizeof(sls_detector_header)); + } + // -------------------old header ------------------------------------------------------------------------------ + else { + new_header->detHeader.frameNumber = fnum; + new_header->detHeader.row = row; + new_header->detHeader.column = column; + new_header->detHeader.detType = (uint8_t) generalData->myDetectorType; + new_header->detHeader.version = (uint8_t) SLS_DETECTOR_HEADER_VERSION; + } + //------------------------------------------------------------------------------------------------------------ + isHeaderEmpty = false; + } + + } + + + + + //until last packet isHeaderEmpty to account for gotthard short frame, else never entering this loop) + while ( numpackets < pperFrame) { + //listen to new packet + rc = 0; + if (udpSocketAlive){ + rc = udpSocket->ReceiveDataOnly(&listeningPacket[0]); + } + // end of acquisition + if(rc <= 0) { + if (numpackets == 0) return 0; //empty image + + switch(*frameDiscardMode) { + case DISCARD_EMPTY_FRAMES: + if (!numpackets) + return -1; + break; + case DISCARD_PARTIAL_FRAMES: + return -1; + default: + break; + } + new_header->detHeader.packetNumber = numpackets; //number of packets caught + if(isHeaderEmpty) { + new_header->detHeader.row = row; + new_header->detHeader.column = column; + } + return generalData->imageSize; //empty packet now, but not empty image + } + + //update parameters + numPacketsCaught++; //record immediately to get more time before socket shutdown + numPacketsStatistic++; + + // -------------------------- new header ---------------------------------------------------------------------- + if (standardheader) { + old_header = (sls_detector_header*) (&listeningPacket[esize]); + fnum = old_header->frameNumber; + pnum = old_header->packetNumber; + } + // -------------------old header ----------------------------------------------------------------------------- + else { + // set first packet to be odd or even (check required when switching from roi to no roi) + if (myDetectorType == GOTTHARD && !measurementStartedFlag) { + oddStartingPacket = generalData->SetOddStartingPacket(index, &listeningPacket[esize]); + } + + generalData->GetHeaderInfo(index, &listeningPacket[esize], + *dynamicRange, oddStartingPacket, fnum, pnum, snum, bid); + } + //------------------------------------------------------------------------------------------------------------ + + // Eiger Firmware in a weird state + if (myDetectorType == EIGER && fnum == 0) { + FILE_LOG(logERROR) << "[" << *udpPortNumber << "]: Got Frame Number " + "Zero from Firmware. Discarding Packet"; + numPacketsCaught--; + return 0; + } + + lastCaughtFrameIndex = fnum; + + FILE_LOG(logDEBUG5) << "Listening " << index << ": currentfindex:" << currentFrameIndex << + ", fnum:" << fnum << ", pnum:" << pnum << ", numpackets:" << numpackets; + + if (!measurementStartedFlag) + RecordFirstIndices(fnum); + + if (pnum >= pperFrame ) { + FILE_LOG(logERROR) << "Bad packet " << pnum << + "(fnum: " << fnum << "), throwing away. " + "Packets caught so far: " << numpackets; + return 0; // bad packet + } + + //future packet by looking at image number (all other detectors) + if (fnum != currentFrameIndex) { + carryOverFlag = true; + memcpy(carryOverPacket.get(), &listeningPacket[0], generalData->packetSize); + + switch(*frameDiscardMode) { + case DISCARD_EMPTY_FRAMES: + if (!numpackets) + return -1; + break; + case DISCARD_PARTIAL_FRAMES: + return -1; + default: + break; + } + new_header->detHeader.packetNumber = numpackets; //number of packets caught + if(isHeaderEmpty) { + new_header->detHeader.row = row; + new_header->detHeader.column = column; + } + return generalData->imageSize; + } + + //copy packet + switch(myDetectorType) { + //for gotthard, 1st packet: 4 bytes fnum, CACA + CACA, 639*2 bytes data + // 2nd packet: 4 bytes fnum, previous 1*2 bytes data + 640*2 bytes data !! + case GOTTHARD: + if(!pnum) + memcpy(buf + fifohsize + (pnum * dsize), &listeningPacket[hsize+4], dsize-2); + else + memcpy(buf + fifohsize + (pnum * dsize) - 2, &listeningPacket[hsize], dsize+2); + break; + case CHIPTESTBOARD: + case MOENCH: + if (pnum == (pperFrame-1)) + memcpy(buf + fifohsize + (pnum * dsize), &listeningPacket[hsize], corrected_dsize); + else + memcpy(buf + fifohsize + (pnum * dsize), &listeningPacket[hsize], dsize); + break; + default: + memcpy(buf + fifohsize + (pnum * dsize), &listeningPacket[hsize], dsize); + break; + } + ++numpackets; //number of packets in this image (each time its copied to buf) + new_header->packetsMask[((pnum < MAX_NUM_PACKETS) ? pnum : MAX_NUM_PACKETS)] = 1; + + if(isHeaderEmpty) { + // -------------------------- new header ---------------------------------------------------------------------- + if (standardheader) { + memcpy((char*)new_header, (char*)old_header, sizeof(sls_detector_header)); + } + // -------------------old header ------------------------------------------------------------------------------ + else { + new_header->detHeader.frameNumber = fnum; + new_header->detHeader.row = row; + new_header->detHeader.column = column; + new_header->detHeader.detType = (uint8_t) generalData->myDetectorType; + new_header->detHeader.version = (uint8_t) SLS_DETECTOR_HEADER_VERSION; + } + //------------------------------------------------------------------------------------------------------------ + isHeaderEmpty = false; + } + } + + // complete image + new_header->detHeader.packetNumber = numpackets; //number of packets caught + return generalData->imageSize; +} diff --git a/slsReceiverSoftware/updateAPIVersion.sh b/slsReceiverSoftware/slsListener/updateAPIVersion.sh old mode 100755 new mode 100644 similarity index 100% rename from slsReceiverSoftware/updateAPIVersion.sh rename to slsReceiverSoftware/slsListener/updateAPIVersion.sh diff --git a/slsReceiverSoftware/updateGitVersion.sh b/slsReceiverSoftware/slsListener/updateGitVersion.sh old mode 100755 new mode 100644 similarity index 100% rename from slsReceiverSoftware/updateGitVersion.sh rename to slsReceiverSoftware/slsListener/updateGitVersion.sh diff --git a/slsReceiverSoftware/slsReceiver/CMakeLists.txt b/slsReceiverSoftware/slsReceiver/CMakeLists.txt new file mode 100644 index 000000000..eea64a321 --- /dev/null +++ b/slsReceiverSoftware/slsReceiver/CMakeLists.txt @@ -0,0 +1,90 @@ +set(SOURCES + src/slsReceiverImplementation.cpp + src/slsReceiverTCPIPInterface.cpp + src/slsReceiver.cpp + src/slsReceiverUsers.cpp + src/File.cpp + src/BinaryFile.cpp + src/ThreadObject.cpp + src/Listener.cpp + src/DataProcessor.cpp + src/DataStreamer.cpp + src/Fifo.cpp +) + + +# HDF5 +if (SLS_USE_HDF5) + if (HDF5_FOUND) + include_directories( + ${HDF5_INCLUDE_DIRS} + ) + add_definitions( + -DHDF5C ${HDF5_DEFINITIONS} + ) + list (APPEND SOURCES + src/HDF5File.cpp + ) + endif () +endif (SLS_USE_HDF5) + + +# include_directories( +# ${SLS_SUPPORT_LIB_INCLUDE_DIRS} +# ) + +add_library(slsReceiverShared SHARED + ${SOURCES} + ${HEADERS} +) + +target_link_libraries(slsReceiverShared PUBLIC + slsSupportLib +) + +target_include_directories(slsReceiverShared PUBLIC + "$" + "$") + +#What is included in slsReceiverLib? +set(PUBLICHEADERS + include/slsReceiverUsers.h +) + + +set_target_properties(slsReceiverShared PROPERTIES + LIBRARY_OUTPUT_NAME SlsReceiver + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin + PUBLIC_HEADER "${PUBLICHEADERS}" +) + +add_executable(slsReceiver + src/main.cpp +) +set_target_properties(slsReceiver PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin +) + +target_link_libraries(slsReceiver PUBLIC + slsSupportLib + slsReceiverShared + pthread + ${ZeroMQ_LIBRARIES} + rt +) + +if (HDF5_FOUND) + target_link_libraries(slsReceiver PUBLIC ${HDF5_LIBRARIES}) +endif () + + + +install(TARGETS slsReceiverShared + EXPORT "${TARGETS_EXPORT_NAME}" + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + +install(FILES ${ZMQ_STATIC_ARCHIVE} +DESTINATION lib) diff --git a/slsReceiverSoftware/slsReceiver/gitInfo.txt b/slsReceiverSoftware/slsReceiver/gitInfo.txt new file mode 100644 index 000000000..5bc0b7c85 --- /dev/null +++ b/slsReceiverSoftware/slsReceiver/gitInfo.txt @@ -0,0 +1,9 @@ +Path: slsDetectorsPackage/slsReceiverSoftware +URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git +Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git +Repsitory UUID: def79807f6f40ed1797b8154240adbc0e35c95e0 +Revision: 840 +Branch: refactor +Last Changed Author: Dhanya_Thattil +Last Changed Rev: 4039 +Last Changed Date: 2018-10-02 10:40:58.000000002 +0200 diff --git a/slsReceiverSoftware/include/BinaryFile.h b/slsReceiverSoftware/slsReceiver/include/BinaryFile.h similarity index 100% rename from slsReceiverSoftware/include/BinaryFile.h rename to slsReceiverSoftware/slsReceiver/include/BinaryFile.h diff --git a/slsReceiverSoftware/include/BinaryFileStatic.h b/slsReceiverSoftware/slsReceiver/include/BinaryFileStatic.h similarity index 100% rename from slsReceiverSoftware/include/BinaryFileStatic.h rename to slsReceiverSoftware/slsReceiver/include/BinaryFileStatic.h diff --git a/slsReceiverSoftware/include/DataProcessor.h b/slsReceiverSoftware/slsReceiver/include/DataProcessor.h similarity index 100% rename from slsReceiverSoftware/include/DataProcessor.h rename to slsReceiverSoftware/slsReceiver/include/DataProcessor.h diff --git a/slsReceiverSoftware/include/DataStreamer.h b/slsReceiverSoftware/slsReceiver/include/DataStreamer.h similarity index 100% rename from slsReceiverSoftware/include/DataStreamer.h rename to slsReceiverSoftware/slsReceiver/include/DataStreamer.h diff --git a/slsReceiverSoftware/include/Fifo.h b/slsReceiverSoftware/slsReceiver/include/Fifo.h similarity index 100% rename from slsReceiverSoftware/include/Fifo.h rename to slsReceiverSoftware/slsReceiver/include/Fifo.h diff --git a/slsReceiverSoftware/include/File.h b/slsReceiverSoftware/slsReceiver/include/File.h similarity index 100% rename from slsReceiverSoftware/include/File.h rename to slsReceiverSoftware/slsReceiver/include/File.h diff --git a/slsReceiverSoftware/slsReceiver/include/GeneralData.h b/slsReceiverSoftware/slsReceiver/include/GeneralData.h new file mode 100644 index 000000000..28e26969c --- /dev/null +++ b/slsReceiverSoftware/slsReceiver/include/GeneralData.h @@ -0,0 +1,702 @@ +#pragma once +/************************************************ + * @file GeneralData.h + * @short abstract for setting/getting properties of detector data + ***********************************************/ +/** + *@short abstract for setting/getting properties of detector data + */ + +#include "sls_detector_defs.h" +#include "receiver_defs.h" + +#include //ceil +#include + + +class GeneralData { + +public: + + /** DetectorType */ + slsDetectorDefs::detectorType myDetectorType; + + /** Number of Pixels in x axis */ + uint32_t nPixelsX; + + /** Number of Pixels in y axis */ + uint32_t nPixelsY; + + /** emptybuffer (mainly for jungfrau) */ + uint32_t emptyHeader; + + /** Size of header in Packet */ + uint32_t headerSizeinPacket; + + /** Size of just data in 1 packet (in bytes) */ + uint32_t dataSize; + + /** Size of 1 packet (in bytes) */ + uint32_t packetSize; + + /** Number of packets in an image (for each listening UDP port) */ + uint32_t packetsPerFrame; + + /** Image size (in bytes, for each listening UDP port) */ + uint32_t imageSize; + + /** Frame Number Mask */ + uint64_t frameIndexMask; + + /** Frame Index Offset */ + uint32_t frameIndexOffset; + + /** Packet Index Mask */ + uint32_t packetIndexMask; + + /** Packet Index Offset */ + uint32_t packetIndexOffset; + + /** Max Frames per binary file */ + uint32_t maxFramesPerFile; + + /** Header size of data saved into fifo buffer at a time*/ + uint32_t fifoBufferHeaderSize; + + /** Default Fifo depth */ + uint32_t defaultFifoDepth; + + /** Threads per receiver */ + uint32_t threadsPerReceiver; + + /** Size of a header packet */ + uint32_t headerPacketSize; + + /** Streaming (for ROI - mainly short Gotthard) - Number of Pixels in x axis */ + uint32_t nPixelsXComplete; + + /** Streaming (for ROI - mainly short Gotthard) - Number of Pixels in y axis */ + uint32_t nPixelsYComplete; + + /** Streaming (for ROI - mainly short Gotthard) - Image size (in bytes) */ + uint32_t imageSizeComplete; + + /** if standard header implemented in firmware */ + bool standardheader; + + /** default udp socket buffer size */ + uint32_t defaultUdpSocketBufferSize; + + + + + /** Cosntructor */ + GeneralData(): + myDetectorType(slsDetectorDefs::GENERIC), + nPixelsX(0), + nPixelsY(0), + emptyHeader(0), + headerSizeinPacket(0), + dataSize(0), + packetSize(0), + packetsPerFrame(0), + imageSize(0), + frameIndexMask(0), + frameIndexOffset(0), + packetIndexMask(0), + packetIndexOffset(0), + maxFramesPerFile(0), + fifoBufferHeaderSize(0), + defaultFifoDepth(0), + threadsPerReceiver(1), + headerPacketSize(0), + nPixelsXComplete(0), + nPixelsYComplete(0), + imageSizeComplete(0), + standardheader(false), + defaultUdpSocketBufferSize(RECEIVE_SOCKET_BUFFER_SIZE) + {}; + + /** Destructor */ + virtual ~GeneralData(){}; + + /** + * 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 oddStartingPacket odd starting packet (gotthard) + * @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, bool oddStartingPacket, + uint64_t& frameNumber, uint32_t& packetNumber, uint32_t& subFrameNumber, uint64_t& bunchId) const + { + subFrameNumber = -1; + bunchId = -1; + frameNumber = ((uint32_t)(*((uint32_t*)(packetData)))); + frameNumber++; + packetNumber = frameNumber&packetIndexMask; + frameNumber = (frameNumber & frameIndexMask) >> frameIndexOffset; + } + + /** + * Set ROI + * @param i ROI + */ + virtual void SetROI(std::vector i) { + FILE_LOG(logERROR) << "SetROI is a generic function that should be overloaded by a derived class"; + }; + + /** + * Get Adc configured + * @param index thread index for debugging purposes + * @param i pointer to a vector of ROI pointers + * @returns adc configured + */ + virtual int GetAdcConfigured(int index, std::vector* i) const{ + FILE_LOG(logERROR) << "GetAdcConfigured is a generic function that should be overloaded by a derived class"; + return 0; + }; + + /** + * Setting dynamic range changes member variables + * @param dr dynamic range + * @param tgEnable true if 10GbE is enabled, else false + */ + virtual void SetDynamicRange(int dr, bool tgEnable) { + FILE_LOG(logERROR) << "SetDynamicRange is a generic function that should be overloaded by a derived class"; + }; + + /** + * Setting ten giga enable changes member variables + * @param tgEnable true if 10GbE is enabled, else false + * @param dr dynamic range + */ + virtual void SetTenGigaEnable(bool tgEnable, int dr) { + FILE_LOG(logERROR) << "SetTenGigaEnable is a generic function that should be overloaded by a derived class"; + }; + + /** + * Setting packets per frame changes member variables + * @param ns number of samples + */ + virtual void setNumberofSamples(const uint64_t ns) { + FILE_LOG(logERROR) << "setNumberofSamples is a generic function that should be overloaded by a derived class"; + }; + + /** + * Enable Gap Pixels changes member variables + * @param enable true if gap pixels enable, else false + */ + virtual void SetGapPixelsEnable(bool b, int dr) { + FILE_LOG(logERROR) << "SetGapPixelsEnable is a generic function that should be overloaded by a derived class"; + }; + + /** + * Set odd starting packet (gotthard) + * @param index thread index for debugging purposes + * @param packetData pointer to data + * @returns true or false for odd starting packet number + */ + virtual bool SetOddStartingPacket(int index, char* packetData) { + cprintf(RED,"SetOddStartingPacket is a generic function that should be overloaded by a derived class\n"); + return false; + }; + + /** + * Set databytes (ctb, moench) + * @param f readout flags + * @param r roi + * @param s number of samples + * @param t tengiga enable + */ + virtual void setImageSize(std::vector r, int s, bool t, slsDetectorDefs::readOutFlags f = slsDetectorDefs::GET_READOUT_FLAGS) { + cprintf(RED,"setImageSize is a generic function that should be overloaded by a derived class\n"); + }; + + /** + * Print all variables + */ + virtual void Print(TLogLevel level = logDEBUG1) const { + FILE_LOG(level) << "\n\nDetector Data Variables:"; + FILE_LOG(level) << "myDetectorType: " << slsDetectorDefs::detectorTypeToString(myDetectorType); + FILE_LOG(level) << "Pixels X: " << nPixelsX; + FILE_LOG(level) << "Pixels Y: " << nPixelsY; + FILE_LOG(level) << "Empty Header: " << emptyHeader; + FILE_LOG(level) << "Header Size in Packet: " << headerSizeinPacket; + FILE_LOG(level) << "Data Size: " << dataSize; + FILE_LOG(level) << "Packet Size: " << packetSize; + FILE_LOG(level) << "Packets per Frame: " << packetsPerFrame; + FILE_LOG(level) << "Image Size: " << imageSize; + FILE_LOG(level) << "Frame Index Mask: " << frameIndexMask; + FILE_LOG(level) << "Frame Index Offset: " << frameIndexOffset; + FILE_LOG(level) << "Packet Index Mask: " << packetIndexMask; + FILE_LOG(level) << "Packet Index Offset: " << packetIndexOffset; + FILE_LOG(level) << "Max Frames Per File: " << maxFramesPerFile; + FILE_LOG(level) << "Fifo Buffer Header Size: " << fifoBufferHeaderSize; + FILE_LOG(level) << "Default Fifo Depth: " << defaultFifoDepth; + FILE_LOG(level) << "Threads Per Receiver: " << threadsPerReceiver; + FILE_LOG(level) << "Header Packet Size: " << headerPacketSize; + FILE_LOG(level) << "Complete Pixels X: " << nPixelsXComplete; + FILE_LOG(level) << "Complete Pixels Y: " << nPixelsYComplete; + FILE_LOG(level) << "Complete Image Size: " << imageSizeComplete; + FILE_LOG(level) << "Standard Header: " << standardheader; + FILE_LOG(level) << "UDP Socket Buffer Size: " << defaultUdpSocketBufferSize; + }; +}; + + +class GotthardData : public GeneralData { + +private: + const int nChip = 10; + const int nChan = 128; + const int nChipsPerAdc = 2; + public: + + /** Constructor */ + GotthardData(){ + myDetectorType = slsDetectorDefs::GOTTHARD; + nPixelsX = 1280; + nPixelsY = 1; + headerSizeinPacket = 4; + dataSize = 1280; + packetSize = GOTTHARD_PACKET_SIZE; + packetsPerFrame = 2; + imageSize = dataSize*packetsPerFrame; + frameIndexMask = 0xFFFFFFFE; + frameIndexOffset = 1; + packetIndexMask = 1; + maxFramesPerFile = MAX_FRAMES_PER_FILE; + fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); + defaultFifoDepth = 50000; + }; + + + /** + * 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 oddStartingPacket odd starting packet (gotthard) + * @param frameNumber frame number + * @param packetNumber packet number + * @param subFrameNumber sub frame number if applicable + * @param bunchId bunch id + */ + void GetHeaderInfo(int index, char* packetData, uint32_t dynamicRange, bool oddStartingPacket, + uint64_t& frameNumber, uint32_t& packetNumber, uint32_t& subFrameNumber, uint64_t& bunchId) const + { + if (nPixelsX == 1280) { + subFrameNumber = -1; + bunchId = -1; + frameNumber = ((uint32_t)(*((uint32_t*)(packetData)))); + if (oddStartingPacket) + frameNumber++; + packetNumber = frameNumber&packetIndexMask; + frameNumber = (frameNumber & frameIndexMask) >> frameIndexOffset; + } else { + subFrameNumber = -1; + bunchId = -1; + frameNumber = ((uint32_t)(*((uint32_t*)(packetData)))); + packetNumber = 0; + } + } + + + /** + * Set ROI + * @param i ROI + */ + void SetROI(std::vector i) { + // all adcs + if(!i.size()) { + nPixelsX = 1280; + dataSize = 1280; + packetSize = GOTTHARD_PACKET_SIZE; + packetsPerFrame = 2; + imageSize = dataSize*packetsPerFrame; + frameIndexMask = 0xFFFFFFFE; + frameIndexOffset = 1; + packetIndexMask = 1; + maxFramesPerFile = MAX_FRAMES_PER_FILE; + fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); + defaultFifoDepth = 50000; + nPixelsXComplete = 0; + nPixelsYComplete = 0; + imageSizeComplete = 0; + } + + // single adc + else { + nPixelsX = 256; + dataSize = 512; + packetSize = 518; + packetsPerFrame = 1; + imageSize = dataSize*packetsPerFrame; + frameIndexMask = 0xFFFFFFFF; + frameIndexOffset = 0; + packetIndexMask = 0; + maxFramesPerFile = SHORT_MAX_FRAMES_PER_FILE; + fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); + defaultFifoDepth = 25000; + nPixelsXComplete = 1280; + nPixelsYComplete = 1; + imageSizeComplete = 1280 * 2; + } + }; + + /** + * Get Adc configured + * @param index thread index for debugging purposes + * @param i pointer to a vector of ROI + * @returns adc configured + */ + int GetAdcConfigured(int index, std::vector* i) const{ + int adc = -1; + // single adc + if(i->size()) { + // gotthard can have only one adc per detector enabled (or all) + // so just looking at the first roi is enough (more not possible at the moment) + + //if its for 1 adc or general + if ((i->at(0).xmin == 0) && (i->at(0).xmax == nChip * nChan)) + adc = -1; + else { + //adc = mid value/numchans also for only 1 roi + adc = ((((i->at(0).xmax) + (i->at(0).xmin))/2)/ + (nChan * nChipsPerAdc)); + if((adc < 0) || (adc > 4)) { + FILE_LOG(logWARNING) << index << ": Deleting ROI. " + "Adc value should be between 0 and 4"; + adc = -1; + } + } + } + FILE_LOG(logINFO) << "Adc Configured: " << adc; + return adc; + }; + + /** + * Set odd starting packet (gotthard) + * @param index thread index for debugging purposes + * @param packetData pointer to data + * @returns true or false for odd starting packet number + */ + bool SetOddStartingPacket(int index, char* packetData) { + bool oddStartingPacket = true; + // care only if no roi + if (nPixelsX == 1280) { + uint32_t fnum = ((uint32_t)(*((uint32_t*)(packetData)))); + uint32_t firstData = ((uint32_t)(*((uint32_t*)(packetData + 4)))); + // first packet + if (firstData == 0xCACACACA) { + // packet number should be 0, but is 1 => so odd starting packet + if (fnum & packetIndexMask) { + oddStartingPacket = true; + } else { + oddStartingPacket = false; + } + } + // second packet + else { + // packet number should be 1, but is 0 => so odd starting packet + if (!(fnum & packetIndexMask)) { + oddStartingPacket = true; + } else { + oddStartingPacket = false; + } + } + } + return oddStartingPacket; + }; + +}; + + +class EigerData : public GeneralData { + + public: + + /** Constructor */ + EigerData(){ + myDetectorType = slsDetectorDefs::EIGER; + nPixelsX = (256*2); + nPixelsY = 256; + headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); + dataSize = 1024; + packetSize = headerSizeinPacket + dataSize; + packetsPerFrame = 256; + imageSize = dataSize*packetsPerFrame; + maxFramesPerFile = EIGER_MAX_FRAMES_PER_FILE; + fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); + defaultFifoDepth = 100; + threadsPerReceiver = 2; + headerPacketSize = 40; + standardheader = true; + }; + + /** + * Setting dynamic range changes member variables + * @param dr dynamic range + * @param tgEnable true if 10GbE is enabled, else false + */ + void SetDynamicRange(int dr, bool tgEnable) { + packetsPerFrame = (tgEnable ? 4 : 16) * dr; + imageSize = dataSize*packetsPerFrame; + } + + /** + * Setting ten giga enable changes member variables + * @param tgEnable true if 10GbE is enabled, else false + * @param dr dynamic range + */ + void SetTenGigaEnable(bool tgEnable, int dr) { + dataSize = (tgEnable ? 4096 : 1024); + packetSize = headerSizeinPacket + dataSize; + packetsPerFrame = (tgEnable ? 4 : 16) * dr; + imageSize = dataSize*packetsPerFrame; + }; + + /** + * Enable Gap Pixels changes member variables + * @param enable true if gap pixels enable, else false + * @param dr dynamic range + */ + void SetGapPixelsEnable(bool b, int dr) { + if (dr == 4) + b = 0; + switch((int)b) { + case 1: + nPixelsX = (256 * 2) + 3; + nPixelsY = 256 + 1; + imageSize = nPixelsX * nPixelsY * ((dr > 16) ? 4 : // 32 bit + ((dr > 8) ? 2 : // 16 bit + ((dr > 4) ? 1 : // 8 bit + 0.5))); // 4 bit + break; + default: + nPixelsX = (256*2); + nPixelsY = 256; + imageSize = nPixelsX * nPixelsY * ((dr > 16) ? 4 : // 32 bit + ((dr > 8) ? 2 : // 16 bit + ((dr > 4) ? 1 : // 8 bit + 0.5))); // 4 bit + break; + } + }; + + +}; + + + +class JungfrauData : public GeneralData { + + public: + + /** Constructor */ + JungfrauData(){ + myDetectorType = slsDetectorDefs::JUNGFRAU; + nPixelsX = (256*4); + nPixelsY = 512; + emptyHeader = 6; + headerSizeinPacket = emptyHeader + sizeof(slsDetectorDefs::sls_detector_header); + dataSize = 8192; + packetSize = headerSizeinPacket + dataSize; + packetsPerFrame = 128; + imageSize = dataSize*packetsPerFrame; + maxFramesPerFile = JFRAU_MAX_FRAMES_PER_FILE; + fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); + defaultFifoDepth = 2500; + standardheader = true; + defaultUdpSocketBufferSize = (2000 * 1024 * 1024); + }; + +}; + + + +class ChipTestBoardData : public GeneralData { +private: + /** Number of analog channels */ + const int NCHAN_ANALOG = 32; + /** Number of digital channels */ + const int NCHAN_DIGITAL = 4; + /** Number of bytes per pixel */ + const int NUM_BYTES_PER_PIXEL = 2; +public: + + + /** Constructor */ + ChipTestBoardData(){ + myDetectorType = slsDetectorDefs::CHIPTESTBOARD; + nPixelsX = 36; // total number of channels + nPixelsY = 1; // number of samples + headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); + dataSize = UDP_PACKET_DATA_BYTES; + packetSize = headerSizeinPacket + dataSize; + //packetsPerFrame = 1; + imageSize = nPixelsX * nPixelsY * 2; + packetsPerFrame = ceil((double)imageSize / (double)UDP_PACKET_DATA_BYTES); + maxFramesPerFile = CTB_MAX_FRAMES_PER_FILE; + fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); + defaultFifoDepth = 2500; + standardheader = true; + }; + + /** + * Set databytes (ctb, moench) + * @param f readout flags + * @param r roi + * @param s number of samples + * @param t tengiga enable + */ + void setImageSize(std::vector r, int s, bool t, slsDetectorDefs::readOutFlags f = slsDetectorDefs::GET_READOUT_FLAGS) { + int nchans = 0; + if (f != slsDetectorDefs::GET_READOUT_FLAGS) { + // analog channels + if (f == slsDetectorDefs::NORMAL_READOUT || f & slsDetectorDefs::ANALOG_AND_DIGITAL) { + nchans += NCHAN_ANALOG; + // if roi + if (r.size()) { + nchans = 0; + for (auto &roi : r) { + nchans += (roi.xmax - roi.xmin + 1); + } + } + } + // digital channels + if (f & slsDetectorDefs::DIGITAL_ONLY || f & slsDetectorDefs::ANALOG_AND_DIGITAL) { + nchans += NCHAN_DIGITAL; + } + } + nPixelsX = nchans; + nPixelsY = s; + // 10G + if (t) { + headerSizeinPacket = 22; + dataSize = 8192; + packetSize = headerSizeinPacket + dataSize; + imageSize = nPixelsX * nPixelsY * 2; + packetsPerFrame = ceil((double)imageSize / (double)packetSize); + standardheader = false; } + // 1g udp (via fifo readout) + else { + headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); + dataSize = UDP_PACKET_DATA_BYTES; + packetSize = headerSizeinPacket + dataSize; + imageSize = nPixelsX * nPixelsY * 2; + packetsPerFrame = ceil((double)imageSize / (double)UDP_PACKET_DATA_BYTES); + standardheader = true; + } + } + +}; + + +class MoenchData : public GeneralData { + + +private: + /** Number of analog channels */ + const int NCHAN_ANALOG = 32; + /** Number of bytes per pixel */ + const int NUM_BYTES_PER_PIXEL = 2; + + /** Structure of an jungfrau ctb packet header (10G Udp) */ + typedef struct { + unsigned char emptyHeader[6]; + unsigned char reserved[4]; + unsigned char packetNumber[1]; + unsigned char frameNumber[3]; + unsigned char bunchid[8]; + } jfrauctb_packet_header_t; + + public: + + /** Constructor */ + MoenchData(){ + myDetectorType = slsDetectorDefs::MOENCH; + nPixelsX = 32; // total number of channels + nPixelsY = 1; // number of samples + headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); + dataSize = UDP_PACKET_DATA_BYTES; + packetSize = headerSizeinPacket + dataSize; + //packetsPerFrame = 1; + imageSize = nPixelsX * nPixelsY * 2; + packetsPerFrame = ceil((double)imageSize / (double)UDP_PACKET_DATA_BYTES); + frameIndexMask = 0xFFFFFF; + maxFramesPerFile = CTB_MAX_FRAMES_PER_FILE; + fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); + defaultFifoDepth = 2500; + standardheader = true; + }; + + /** + * 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 oddStartingPacket odd starting packet (gotthard) + * @param frameNumber frame number * @param packetNumber packet number + * @param subFrameNumber sub frame number if applicable + * @param bunchId bunch id + */ + void GetHeaderInfo(int index, char* packetData, uint32_t dynamicRange, bool oddStartingPacket, + uint64_t& frameNumber, uint32_t& packetNumber, uint32_t& subFrameNumber, uint64_t& bunchId) const { + subFrameNumber = -1; + jfrauctb_packet_header_t* header = (jfrauctb_packet_header_t*)(packetData); + frameNumber = (uint64_t)((*( (uint32_t*) header->frameNumber)) & frameIndexMask); + packetNumber = (uint32_t)(*( (uint8_t*) header->packetNumber)); + bunchId = (*((uint64_t*) header->bunchid)); + } + + + /** + * Set databytes (ctb, moench) + * @param f readout flags + * @param r roi + * @param s number of samples + * @param t tengiga enable + */ + void setImageSize(std::vector r, int s, bool t, + slsDetectorDefs::readOutFlags f = slsDetectorDefs::GET_READOUT_FLAGS) { + int nchans = NCHAN_ANALOG; + // if roi + if (r.size()) { + nchans = 0; + for (auto &roi : r) { + nchans += abs(roi.xmax - roi.xmin) + 1; + } + } + + nPixelsX = nchans; + nPixelsY = s; + // 10G + if (t) { + headerSizeinPacket = 22; + dataSize = 8192; + packetSize = headerSizeinPacket + dataSize; + imageSize = nPixelsX * nPixelsY * 2; + packetsPerFrame = ceil((double)imageSize / (double)packetSize); + standardheader = false; + } + // 1g udp (via fifo readout) + else { + headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); + dataSize = UDP_PACKET_DATA_BYTES; + packetSize = headerSizeinPacket + dataSize; + imageSize = nPixelsX * nPixelsY * 2; + packetsPerFrame = ceil((double)imageSize / (double)UDP_PACKET_DATA_BYTES); + standardheader = true; + } + } +}; + + + + diff --git a/slsReceiverSoftware/include/HDF5File.h b/slsReceiverSoftware/slsReceiver/include/HDF5File.h similarity index 100% rename from slsReceiverSoftware/include/HDF5File.h rename to slsReceiverSoftware/slsReceiver/include/HDF5File.h diff --git a/slsReceiverSoftware/include/HDF5FileStatic.h b/slsReceiverSoftware/slsReceiver/include/HDF5FileStatic.h similarity index 100% rename from slsReceiverSoftware/include/HDF5FileStatic.h rename to slsReceiverSoftware/slsReceiver/include/HDF5FileStatic.h diff --git a/slsReceiverSoftware/include/Listener.h b/slsReceiverSoftware/slsReceiver/include/Listener.h similarity index 100% rename from slsReceiverSoftware/include/Listener.h rename to slsReceiverSoftware/slsReceiver/include/Listener.h diff --git a/slsReceiverSoftware/include/ThreadObject.h b/slsReceiverSoftware/slsReceiver/include/ThreadObject.h similarity index 100% rename from slsReceiverSoftware/include/ThreadObject.h rename to slsReceiverSoftware/slsReceiver/include/ThreadObject.h diff --git a/slsReceiverSoftware/include/circularFifo.h b/slsReceiverSoftware/slsReceiver/include/circularFifo.h similarity index 100% rename from slsReceiverSoftware/include/circularFifo.h rename to slsReceiverSoftware/slsReceiver/include/circularFifo.h diff --git a/slsReceiverSoftware/slsReceiver/include/gitInfoReceiver.h b/slsReceiverSoftware/slsReceiver/include/gitInfoReceiver.h new file mode 100644 index 000000000..fbb980f19 --- /dev/null +++ b/slsReceiverSoftware/slsReceiver/include/gitInfoReceiver.h @@ -0,0 +1,6 @@ +#define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" +#define GITREPUUID "def79807f6f40ed1797b8154240adbc0e35c95e0" +#define GITAUTH "Dhanya_Thattil" +#define GITREV 0x4039 +#define GITDATE 0x20181002 +#define GITBRANCH "refactor" diff --git a/slsReceiverSoftware/slsReceiver/include/gitInfoReceiverTmp.h b/slsReceiverSoftware/slsReceiver/include/gitInfoReceiverTmp.h new file mode 100644 index 000000000..dfd9bb246 --- /dev/null +++ b/slsReceiverSoftware/slsReceiver/include/gitInfoReceiverTmp.h @@ -0,0 +1,6 @@ +#define GITURL "" +#define GITREPUUID "" +#define GITAUTH "" +#define GITREV "" +#define GITDATE "" +#define GITBRANCH "" diff --git a/slsReceiverSoftware/slsReceiver/include/receiver_defs.h b/slsReceiverSoftware/slsReceiver/include/receiver_defs.h new file mode 100644 index 000000000..5f623e16f --- /dev/null +++ b/slsReceiverSoftware/slsReceiver/include/receiver_defs.h @@ -0,0 +1,50 @@ +#pragma once + +#include "sls_detector_defs.h" +#include + +#define MAX_DIMENSIONS 2 +//socket +#define GOODBYE -200 +#define RECEIVE_SOCKET_BUFFER_SIZE (100*1024*1024) + +#define MAX_SOCKET_INPUT_PACKET_QUEUE 250000 + + +//files +#define DO_NOTHING 0 +#define DO_EVERYTHING 1 + +#define STATISTIC_FRAMENUMBER_INFINITE 20000 + +//binary +#define FILE_BUFFER_SIZE (16*1024*1024) //16mb + +//fifo +#define FIFO_HEADER_NUMBYTES 4 + + +//hdf5 +#define MAX_CHUNKED_IMAGES 1 + +//versions +#define HDF5_WRITER_VERSION 3.0 //1 decimal places +#define BINARY_WRITER_VERSION 3.0 //1 decimal places + + +//parameters to calculate fifo depth +#define SAMPLE_TIME_IN_NS 100000000//100ms +#define MAX_JOBS_PER_THREAD 1000 + + +//to differentiate between gotthard and short gotthard +#define GOTTHARD_PACKET_SIZE 1286 + + +#define DUMMY_PACKET_VALUE 0xFFFFFFFF + +#define LISTENER_PRIORITY 90 +#define PROCESSOR_PRIORITY 70 +#define STREAMER_PRIORITY 10 +#define TCP_PRIORITY 10 + diff --git a/slsReceiverSoftware/include/slsReceiver.h b/slsReceiverSoftware/slsReceiver/include/slsReceiver.h similarity index 100% rename from slsReceiverSoftware/include/slsReceiver.h rename to slsReceiverSoftware/slsReceiver/include/slsReceiver.h diff --git a/slsReceiverSoftware/include/slsReceiverImplementation.h b/slsReceiverSoftware/slsReceiver/include/slsReceiverImplementation.h similarity index 100% rename from slsReceiverSoftware/include/slsReceiverImplementation.h rename to slsReceiverSoftware/slsReceiver/include/slsReceiverImplementation.h diff --git a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h b/slsReceiverSoftware/slsReceiver/include/slsReceiverTCPIPInterface.h similarity index 100% rename from slsReceiverSoftware/include/slsReceiverTCPIPInterface.h rename to slsReceiverSoftware/slsReceiver/include/slsReceiverTCPIPInterface.h diff --git a/slsReceiverSoftware/include/slsReceiverUsers.h b/slsReceiverSoftware/slsReceiver/include/slsReceiverUsers.h similarity index 100% rename from slsReceiverSoftware/include/slsReceiverUsers.h rename to slsReceiverSoftware/slsReceiver/include/slsReceiverUsers.h diff --git a/slsReceiverSoftware/slsReceiver/slsReceiverUsers.doxy b/slsReceiverSoftware/slsReceiver/slsReceiverUsers.doxy new file mode 100644 index 000000000..8c91db014 --- /dev/null +++ b/slsReceiverSoftware/slsReceiver/slsReceiverUsers.doxy @@ -0,0 +1,86 @@ +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + + + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = YES + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +INTERNAL_DOCS = NO + +SHOW_INCLUDE_FILES = NO + +SHOW_FILES = NO + +SHOW_NAMESPACES = NO + +COMPACT_LATEX = YES + +PAPER_TYPE = a4 + +PDF_HYPERLINKS = YES + +USE_PDFLATEX = YES + +LATEX_HIDE_INDICES = YES + + +PREDEFINED = __cplusplus + +INPUT = include/slsReceiverUsers.h + +OUTPUT_DIRECTORY = slsReceiverUsersDocs diff --git a/slsReceiverSoftware/src/BinaryFile.cpp b/slsReceiverSoftware/slsReceiver/src/BinaryFile.cpp similarity index 100% rename from slsReceiverSoftware/src/BinaryFile.cpp rename to slsReceiverSoftware/slsReceiver/src/BinaryFile.cpp diff --git a/slsReceiverSoftware/src/DataProcessor.cpp b/slsReceiverSoftware/slsReceiver/src/DataProcessor.cpp similarity index 100% rename from slsReceiverSoftware/src/DataProcessor.cpp rename to slsReceiverSoftware/slsReceiver/src/DataProcessor.cpp diff --git a/slsReceiverSoftware/src/DataStreamer.cpp b/slsReceiverSoftware/slsReceiver/src/DataStreamer.cpp similarity index 100% rename from slsReceiverSoftware/src/DataStreamer.cpp rename to slsReceiverSoftware/slsReceiver/src/DataStreamer.cpp diff --git a/slsReceiverSoftware/src/Fifo.cpp b/slsReceiverSoftware/slsReceiver/src/Fifo.cpp similarity index 100% rename from slsReceiverSoftware/src/Fifo.cpp rename to slsReceiverSoftware/slsReceiver/src/Fifo.cpp diff --git a/slsReceiverSoftware/src/File.cpp b/slsReceiverSoftware/slsReceiver/src/File.cpp similarity index 100% rename from slsReceiverSoftware/src/File.cpp rename to slsReceiverSoftware/slsReceiver/src/File.cpp diff --git a/slsReceiverSoftware/src/HDF5File.cpp b/slsReceiverSoftware/slsReceiver/src/HDF5File.cpp similarity index 100% rename from slsReceiverSoftware/src/HDF5File.cpp rename to slsReceiverSoftware/slsReceiver/src/HDF5File.cpp diff --git a/slsReceiverSoftware/src/Listener.cpp b/slsReceiverSoftware/slsReceiver/src/Listener.cpp similarity index 100% rename from slsReceiverSoftware/src/Listener.cpp rename to slsReceiverSoftware/slsReceiver/src/Listener.cpp diff --git a/slsReceiverSoftware/src/ThreadObject.cpp b/slsReceiverSoftware/slsReceiver/src/ThreadObject.cpp similarity index 100% rename from slsReceiverSoftware/src/ThreadObject.cpp rename to slsReceiverSoftware/slsReceiver/src/ThreadObject.cpp diff --git a/slsReceiverSoftware/src/main.cpp b/slsReceiverSoftware/slsReceiver/src/main.cpp similarity index 100% rename from slsReceiverSoftware/src/main.cpp rename to slsReceiverSoftware/slsReceiver/src/main.cpp diff --git a/slsReceiverSoftware/src/slsReceiver.cpp b/slsReceiverSoftware/slsReceiver/src/slsReceiver.cpp similarity index 100% rename from slsReceiverSoftware/src/slsReceiver.cpp rename to slsReceiverSoftware/slsReceiver/src/slsReceiver.cpp diff --git a/slsReceiverSoftware/src/slsReceiverImplementation.cpp b/slsReceiverSoftware/slsReceiver/src/slsReceiverImplementation.cpp similarity index 100% rename from slsReceiverSoftware/src/slsReceiverImplementation.cpp rename to slsReceiverSoftware/slsReceiver/src/slsReceiverImplementation.cpp diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/slsReceiver/src/slsReceiverTCPIPInterface.cpp similarity index 100% rename from slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp rename to slsReceiverSoftware/slsReceiver/src/slsReceiverTCPIPInterface.cpp diff --git a/slsReceiverSoftware/src/slsReceiverUsers.cpp b/slsReceiverSoftware/slsReceiver/src/slsReceiverUsers.cpp similarity index 100% rename from slsReceiverSoftware/src/slsReceiverUsers.cpp rename to slsReceiverSoftware/slsReceiver/src/slsReceiverUsers.cpp diff --git a/slsReceiverSoftware/slsReceiver/updateAPIVersion.sh b/slsReceiverSoftware/slsReceiver/updateAPIVersion.sh new file mode 100644 index 000000000..389b2929e --- /dev/null +++ b/slsReceiverSoftware/slsReceiver/updateAPIVersion.sh @@ -0,0 +1,7 @@ +SRCFILE=include/gitInfoReceiver.h +DSTFILE=include/versionAPI.h + +SRCPATTERN=GITDATE +DSTPATTERN=APIRECEIVER + +awk -v a="$SRCFILE" -v b="$DSTFILE" -v c="$SRCPATTERN" -v d="$DSTPATTERN" 'FNR==NR&&$2==c{x=$3} NR!=FNR{if($2==d){$3="0x"substr(x,5)}print > b}' $SRCFILE $DSTFILE \ No newline at end of file diff --git a/slsReceiverSoftware/slsReceiver/updateGitVersion.sh b/slsReceiverSoftware/slsReceiver/updateGitVersion.sh new file mode 100644 index 000000000..96e58f255 --- /dev/null +++ b/slsReceiverSoftware/slsReceiver/updateGitVersion.sh @@ -0,0 +1,28 @@ +MAINDIR=slsDetectorPackage +SPECDIR=slsReceiverSoftware +TMPFILE=include/gitInfoReceiverTmp.h +INCLFILE=include/gitInfoReceiver.h +WD=$PWD + +#evaluate the variables +EVALFILE=../evalVersionVariables.sh +source $EVALFILE + +#get modified date +#RDATE1='git log --pretty=format:"%ci" -1' +RDATE1="find . -type f -exec stat --format '%Y :%y %n' '{}' \; | sort -nr | cut -d: -f2- | egrep -v 'gitInfo|build|.git|updateGitVersion' | head -n 1" +RDATE=`eval $RDATE1` +NEWDATE=$(sed "s/-//g" <<< $RDATE | awk '{print $1;}') +NEWDATE=${NEWDATE/#/0x} + +#get old date from INCLFILE +OLDDATE=$(more $INCLFILE | grep '#define GITDATE' | awk '{print $3}') + +#update INCLFILE if changes +if [ "$OLDDATE" != "$NEWDATE" ]; then + echo Path: ${MAINDIR}/${SPECDIR} $'\n'URL: ${GITREPO} $'\n'Repository Root: ${GITREPO} $'\n'Repsitory UUID: ${REPUID} $'\n'Revision: ${FOLDERREV} $'\n'Branch: ${BRANCH} $'\n'Last Changed Author: ${AUTH1}_${AUTH2} $'\n'Last Changed Rev: ${REV} $'\n'Last Changed Date: ${RDATE} > gitInfo.txt + cd .. + ./genVersionHeader.sh $SPECDIR/gitInfo.txt $SPECDIR/$TMPFILE $SPECDIR/$INCLFILE + cd $WD +fi +