From 262140728f3bdd840dc895c6b3fadf3724ce4572 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 24 Apr 2019 13:30:57 +0200 Subject: [PATCH 1/3] receiver callback rearranging data for mythen302 --- CMakeLists.txt | 4 +- cmk.sh | 52 +++++++++++++++---------- slsReceiverSoftware/CMakeLists.txt | 17 ++++++-- slsReceiverSoftware/src/slsReceiver.cpp | 5 ++- 4 files changed, 53 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1b6eb68c3..fa26e41ce 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,7 @@ set(PROJECT_VERSION 5.0.0) include(CheckIPOSupported) +cmake_policy(SET CMP0074 OLD) @@ -38,6 +39,7 @@ option (SLS_USE_HDF5 "HDF5 File format" OFF) option (SLS_USE_TEXTCLIENT "Text Client" OFF) option (SLS_USE_RECEIVER "Receiver" OFF) option (SLS_USE_GUI "GUI" OFF) +option (SLS_USE_MYTHEN302_CTB_RECEIVER "Mythen302 CTB Receiver" OFF) option (SLS_USE_TESTS "TESTS" ON) option (SLS_USE_INTEGRATION_TESTS "Integration Tests" ON) option(SLS_USE_SANITIZER "Sanitizers for debugging" OFF) @@ -137,6 +139,7 @@ if (SLS_USE_TEXTCLIENT) add_subdirectory(slsDetectorSoftware) endif (SLS_USE_TEXTCLIENT) + if (SLS_USE_RECEIVER) if (SLS_USE_HDF5) find_package(HDF5 1.10 COMPONENTS CXX REQUIRED) @@ -174,4 +177,3 @@ if(SLS_MASTER_PROJECT) # Generate and install package config file and version include(cmake/package_config.cmake) endif() - diff --git a/cmk.sh b/cmk.sh index 183aef922..e52a92275 100755 --- a/cmk.sh +++ b/cmk.sh @@ -8,6 +8,7 @@ RECEIVER=0 GUI=0 DEBUG=0 PYTHON=0 +SPECIAL_RECEIVER_TYPE=0 CLEAN=0 @@ -16,7 +17,7 @@ CMAKE_PRE="" CMAKE_POST="" usage() { echo -e " -Usage: $0 [-c] [-b] [-p] [e] [t] [r] [g] [-h] [-d ] [-j] +Usage: $0 [-c] [-b] [-p] [e] [t] [r] [g] [-h] [-d ] [-j] [-s] -[no option]: only make -c: Clean -b: Builds/Rebuilds CMake files normal mode @@ -28,6 +29,7 @@ Usage: $0 [-c] [-b] [-p] [e] [t] [r] [g] [-h] [-d ] [-j] -g: Build/Rebuilds only gui -j: Number of threads to compile through -e: Debug mode + -s: Special Receiver Type (1-Mythen302) Rebuild when you switch to a new build and compile in parallel: ./cmk.sh -bj5 @@ -63,7 +65,7 @@ For rebuilding only certain sections " ; exit 1; } -while getopts ":bpchd:j:trge" opt ; do +while getopts ":bpchd:j:trges:" opt ; do case $opt in b) echo "Building of CMake files Required" @@ -109,7 +111,11 @@ while getopts ":bpchd:j:trge" opt ; do e) echo "Compiling Options: Debug" DEBUG=1 - ;; + ;; + s) + echo "Special Receiver Type: $OPTARG" + SPECIAL_RECEIVER_TYPE=$OPTARG + ;; \?) echo "Invalid option: -$OPTARG" usage @@ -123,30 +129,36 @@ while getopts ":bpchd:j:trge" opt ; do esac done +#special receiver type +if [ $SPECIAL_RECEIVER_TYPE -eq 1 ]; then + CMAKE_POST+=" -DSLS_USE_MYTHEN302_CTB_RECEIVER=ON " + echo "Enabling Compile Option: Mythen302 CTB Receiver" +fi +#python if [ $PYTHON -eq 1 ]; then - CMAKE_POST+=" -DSLS_USE_PYTHON=ON " - echo "Enabling Compile Option: Python" + CMAKE_POST+=" -DSLS_USE_PYTHON=ON " + echo "Enabling Compile Option: Python" fi if [ $TEXTCLIENT -eq 0 ] && [ $RECEIVER -eq 0 ] && [ $GUI -eq 0 ]; then - #CMAKE_POST+=" -DSLS_USE_TEXTCLIENT=ON -DSLS_USE_RECEIVER=ON -DSLS_USE_GUI=ON " - CMAKE_POST+=" -DSLS_USE_TEXTCLIENT=ON -DSLS_USE_RECEIVER=ON -DSLS_USE_GUI=OFF " - echo "Enabling Compile Option: TextClient, Receiver and GUI" + #CMAKE_POST+=" -DSLS_USE_TEXTCLIENT=ON -DSLS_USE_RECEIVER=ON -DSLS_USE_GUI=ON " + CMAKE_POST+=" -DSLS_USE_TEXTCLIENT=ON -DSLS_USE_RECEIVER=ON -DSLS_USE_GUI=OFF " + echo "Enabling Compile Option: TextClient, Receiver and GUI" else - if [ $TEXTCLIENT -eq 1 ]; then - CMAKE_POST+=" -DSLS_USE_TEXTCLIENT=ON " - echo "Enabling Compile Option: TextClient" - fi - if [ $RECEIVER -eq 1 ]; then - CMAKE_POST+=" -DSLS_USE_RECEIVER=ON " - echo "Enabling Compile Option: Receiver" - fi - if [ $GUI -eq 1 ]; then - CMAKE_POST+=" -DSLS_USE_GUI=ON " - echo "Enabling Compile Option: GUI" - fi + if [ $TEXTCLIENT -eq 1 ]; then + CMAKE_POST+=" -DSLS_USE_TEXTCLIENT=ON " + echo "Enabling Compile Option: TextClient" + fi + if [ $RECEIVER -eq 1 ]; then + CMAKE_POST+=" -DSLS_USE_RECEIVER=ON " + echo "Enabling Compile Option: Receiver" + fi + if [ $GUI -eq 1 ]; then + CMAKE_POST+=" -DSLS_USE_GUI=ON " + echo "Enabling Compile Option: GUI" + fi fi diff --git a/slsReceiverSoftware/CMakeLists.txt b/slsReceiverSoftware/CMakeLists.txt index f02689010..b5234358b 100755 --- a/slsReceiverSoftware/CMakeLists.txt +++ b/slsReceiverSoftware/CMakeLists.txt @@ -61,9 +61,20 @@ set_target_properties(slsReceiverShared PROPERTIES PUBLIC_HEADER "${PUBLICHEADERS}" ) -add_executable(slsReceiver - src/main.cpp -) + +if (SLS_USE_MYTHEN302_CTB_RECEIVER) + add_executable(slsReceiver + src/mainCustomized.cpp + ) + add_definitions( + -DMYTHEN302 + ) +else() + add_executable(slsReceiver + src/main.cpp + ) +endif (SLS_USE_MYTHEN302_CTB_RECEIVER) + set_target_properties(slsReceiver PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) diff --git a/slsReceiverSoftware/src/slsReceiver.cpp b/slsReceiverSoftware/src/slsReceiver.cpp index ea400b5c2..c35018127 100755 --- a/slsReceiverSoftware/src/slsReceiver.cpp +++ b/slsReceiverSoftware/src/slsReceiver.cpp @@ -44,13 +44,16 @@ slsReceiver::slsReceiver(int argc, char *argv[]): int c = 0; while ( c != -1 ){ - c = getopt_long (argc, argv, "hvf:t:", long_options, &option_index); + c = getopt_long (argc, argv, "hvf:t:o:", long_options, &option_index); // Detect the end of the options. if (c == -1) break; switch(c){ + // reserved for ctb receiver users + case 'o': + break; case 't': sscanf(optarg, "%d", &tcpip_port_no); From eb88fabfbc2f90cfedaf7edb4a5152f657c127ca Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 24 Apr 2019 13:32:21 +0200 Subject: [PATCH 2/3] receiver callback rearranging data for mythen302 --- slsReceiverSoftware/src/mainCustomized.cpp | 164 +++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100755 slsReceiverSoftware/src/mainCustomized.cpp diff --git a/slsReceiverSoftware/src/mainCustomized.cpp b/slsReceiverSoftware/src/mainCustomized.cpp new file mode 100755 index 000000000..39febb2f2 --- /dev/null +++ b/slsReceiverSoftware/src/mainCustomized.cpp @@ -0,0 +1,164 @@ +/* A simple server in the internet domain using TCP + The port number is passed as an argument */ + +#include "sls_detector_defs.h" +#include "slsReceiverUsers.h" +#include "logger.h" + +#include +#include +#include //SIGINT +#include //system +#include //wait +#include //wait +#include //usleep +#include +#include +#include + +bool keeprunning; +int ctbOffset = 0; + +void sigInterruptHandler(int p){ + keeprunning = false; +} + + +#ifdef MYTHEN302 +void GetData(char* metadata, char* datapointer, uint32_t& datasize, void* p) { + // remove the offset in datasize + int offset = ctbOffset * sizeof(uint64_t); + datasize -= offset; + + constexpr int dynamicRange = 24; + constexpr int numSamples = 32 * 3; // 32 channels * 3 counters = 96 + constexpr int numCounters = numSamples * 2; // 2 strips + // validate datasize + { + FILE_LOG(logDEBUG) << "Datasize after removing offset:" << datasize; + const double dataNumSamples = + ((double)datasize / (double)sizeof(uint64_t)) / (double)dynamicRange; // 2304 / 24 = 96 + if (dataNumSamples - numSamples) { + FILE_LOG(logERROR) << "Number of samples do not match, Expected " + << numSamples << ", got " << dataNumSamples; + } + } + // source + uint64_t* source = (uint64_t*)datapointer; + // remove the offset from source + source += offset; + // destination + auto result = new int[numCounters]; + auto destStrip0 = result; + auto destStrip1 = result + numSamples; + constexpr int bit_index0 = 6; + constexpr int bit_index1 = 17; + constexpr int mask0 = (1 << bit_index0); + constexpr int mask1 = (1 << bit_index1); + + for (int j = 0; j < numSamples; ++j) { + for (int i = 0; i < dynamicRange; ++i) { + int bit0 = (*source & mask0) >> bit_index0; + int bit1 = (*source++ & mask1) >> bit_index1; + *destStrip0 |= bit0 << i; + *destStrip1 |= bit1 << i; + } + destStrip0++; + destStrip1++; + } + + // update the size to be written to file & overwrite data in memory + datasize = numCounters * sizeof(int); + memcpy(datapointer, (char*)result, datasize); + FILE_LOG(logDEBUG) << "Modified Size: " << datasize; +} +#endif + + +int main(int argc, char *argv[]) { + + // options + std::map configuration_map; + //parse command line for config + static struct option long_options[] = { + {"ctb_offset", required_argument, nullptr, 'o'}, + {nullptr, 0, nullptr, 0} + }; + //initialize global optind variable (required when instantiating multiple receivers in the same process) + optind = 1; + // getopt_long stores the option index here. + int option_index = 0; + int c = 0; + while ( c != -1 ) { + c = getopt_long (argc, argv, "hvf:t:o:", long_options, &option_index); + // Detect the end of the options. + if (c == -1) + break; + switch(c) { + case 'o': + sscanf(optarg, "%d", &ctbOffset); + break; + default: + break; + } + } + +#ifdef MYTHEN302 + FILE_LOG(logINFOGREEN) << "Mythen 302 Receiver"; + FILE_LOG(logINFO) << "CTB Offset: " << ctbOffset; +#endif + + keeprunning = true; + FILE_LOG(logINFOBLUE) << "Created [ Tid: " << syscall(SYS_gettid) << " ]"; + + // Catch signal SIGINT to close files and call destructors properly + struct sigaction sa; + sa.sa_flags = 0; // no flags + sa.sa_handler = sigInterruptHandler; // handler function + sigemptyset(&sa.sa_mask); // dont block additional signals during invocation + // of handler + if (sigaction(SIGINT, &sa, nullptr) == -1) { + FILE_LOG(logERROR) << "Could not set handler function for SIGINT"; + } + + + // if socket crash, ignores SISPIPE, prevents global signal handler + // subsequent read/write to socket gives error - must handle locally + struct sigaction asa; + asa.sa_flags=0; // no flags + asa.sa_handler=SIG_IGN; // handler function + sigemptyset(&asa.sa_mask); // dont block additional signals during invocation of handler + if (sigaction(SIGPIPE, &asa, nullptr) == -1) { + FILE_LOG(logERROR) << "Could not set handler function for SIGPIPE"; + } + + int ret = slsDetectorDefs::OK; + slsReceiverUsers *receiver = new slsReceiverUsers(argc, argv, ret); + if(ret==slsDetectorDefs::FAIL){ + delete receiver; + FILE_LOG(logINFOBLUE) << "Exiting [ Tid: " << syscall(SYS_gettid) << " ]"; + exit(EXIT_FAILURE); + } + + + //register callbacks + receiver->registerCallBackRawDataModifyReady(GetData, NULL); + + //start tcp server thread + if (receiver->start() == slsDetectorDefs::FAIL){ + delete receiver; + FILE_LOG(logINFOBLUE) << "Exiting [ Tid: " << syscall(SYS_gettid) << " ]"; + exit(EXIT_FAILURE); + } + + FILE_LOG(logINFO) << "Ready ... "; + FILE_LOG(logINFO) << "[ Press \'Ctrl+c\' to exit ]"; + while(keeprunning) + pause(); + + delete receiver; + FILE_LOG(logINFOBLUE) << "Exiting [ Tid: " << syscall(SYS_gettid) << " ]"; + FILE_LOG(logINFO) << "Exiting Receiver"; + return 0; +} + From 9e16dcb1e62f749e8923efa7497deb7513e34122 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 24 Apr 2019 13:46:19 +0200 Subject: [PATCH 3/3] reverting cmake policy change --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fa26e41ce..0731def7a 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,6 @@ set(PROJECT_VERSION 5.0.0) include(CheckIPOSupported) -cmake_policy(SET CMP0074 OLD)