From b3fe0e79bcbc18628f40e2ef857bf4a2250352d2 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 8 Apr 2020 16:43:28 +0200 Subject: [PATCH] WIP --- .../slsDetectorFunctionList.c | 4 +- .../include/slsDetectorFunctionList.h | 4 +- .../src/slsDetectorServer_funcs.c | 197 +++++++++++++++++- slsDetectorSoftware/src/Module.cpp | 71 +++++-- slsSupportLib/include/sls_detector_defs.h | 39 +++- 5 files changed, 288 insertions(+), 27 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c index 8b74cc2eb..c462a17e9 100755 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c @@ -759,7 +759,7 @@ int64_t getSubExpTime() { #endif } -int setDeadTime(int64_t val) { +int setSubDeadTime(int64_t val) { LOG(logINFO, ("Setting subdeadtime %lld ns\n", (long long int)val)); #ifndef VIRTUAL // get subexptime @@ -781,7 +781,7 @@ int setDeadTime(int64_t val) { return OK; } -int64_t getDeadTime() { +int64_t getSubDeadTime() { #ifndef VIRTUAL // get subexptime int64_t subexptime = Feb_Control_GetSubFrameExposureTime(); diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index fcc22c2eb..4a68981dc 100755 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -206,8 +206,8 @@ int64_t getBurstPeriod(); #ifdef EIGERD int setSubExpTime(int64_t val); int64_t getSubExpTime(); -int setDeadTime(int64_t val); -int64_t getDeadTime(); +int setSubDeadTime(int64_t val); +int64_t getSubDeadTime(); int64_t getMeasuredPeriod(); int64_t getMeasuredSubPeriod(); #endif diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 7b17cc4b6..340c68c04 100755 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -2393,7 +2393,7 @@ int get_sub_deadtime(int file_des) { functionNotImplemented(); #else // get only - retval = getDeadTime(); + retval = getSubDeadTime(); LOG(logDEBUG1, ("retval subdeadtime %lld ns\n", (long long int)retval)); #endif return Server_SendResult(file_des, INT64, &retval, sizeof(retval)); @@ -2424,8 +2424,8 @@ int set_sub_deadtime(int file_des) { ((double)subexptime/(double)1E9)); LOG(logERROR,(mess)); } else { - ret = setDeadTime(arg); - int64_t retval = getDeadTime(); + ret = setSubDeadTime(arg); + int64_t retval = getSubDeadTime(); LOG(logDEBUG1, ("retval subdeadtime %lld ns\n", (long long int)retval)); if (ret == FAIL) { sprintf(mess, "Could not set subframe dead time. Set %lld ns, read %lld ns.\n", (long long int)arg, (long long int)retval); @@ -6836,6 +6836,8 @@ int get_receiver_parameters(int file_des) { int n = 0; int i32 = 0; int64_t i64 = 0; + uint32_t u32 = 0; + uint64_t u64 = 0; // frames i64 = getNumFrames(); @@ -6847,8 +6849,30 @@ int get_receiver_parameters(int file_des) { n = sendData(file_des,&i64,sizeof(i64),INT64); if (n < 0) return printSocketReadError(); - // timing mode - i32 = (int)getTiming(); + // bursts +#ifdef GOTTHARD2D + i64 = getNumBursts(); +#else + i64 = 0; +#endif + n = sendData(file_des,&i64,sizeof(i64),INT64); + if (n < 0) return printSocketReadError(); + + // analog samples +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) + i32 = getNumAnalogSamples(); +#else + i32 = 0; +#endif + n = sendData(file_des,&i32,sizeof(i32),INT32); + if (n < 0) return printSocketReadError(); + + // digital samples +#ifdef CHIPTESTBOARDD + i32 = getNumDigitalSamples(); +#else + i32 = 0; +#endif n = sendData(file_des,&i32,sizeof(i32),INT32); if (n < 0) return printSocketReadError(); @@ -6862,5 +6886,168 @@ int get_receiver_parameters(int file_des) { n = sendData(file_des,&i64,sizeof(i64),INT64); if (n < 0) return printSocketReadError(); + // sub exptime +#ifdef EIGERD + i64 = getSubExpTime(); +#else + i64 = 0; +#endif + n = sendData(file_des,&i64,sizeof(i64),INT64); + if (n < 0) return printSocketReadError(); + + // sub deadtime +#ifdef EIGERD + i64 = getSubDeadTime(); +#else + i64 = 0; +#endif + n = sendData(file_des,&i64,sizeof(i64),INT64); + if (n < 0) return printSocketReadError(); + + + + + + // dynamic range + i32 = setDynamicRange(-1); + n = sendData(file_des,&i32,sizeof(i32),INT32); + if (n < 0) return printSocketReadError(); + + // timing mode + i32 = (int)getTiming(); + n = sendData(file_des,&i32,sizeof(i32),INT32); + if (n < 0) return printSocketReadError(); + + // activate +#ifdef EIGERD + i32 = activate(-1); +#else + i32 = 0; +#endif + n = sendData(file_des,&i32,sizeof(i32),INT32); + if (n < 0) return printSocketReadError(); + + // 10 gbe +#if defined(EIGERD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) + i32 = enableTenGigabitEthernet(-1); +#else + i32 = 0; +#endif + n = sendData(file_des,&i32,sizeof(i32),INT32); + if (n < 0) return printSocketReadError(); + + // quad +#ifdef EIGERD + i32 = getQuad(); +#else + i32 = 0; +#endif + n = sendData(file_des,&i32,sizeof(i32),INT32); + if (n < 0) return printSocketReadError(); + + // readout mode +#ifdef CHIPTESTBOARD + i32 = getReadoutMode(); +#else + i32 = 0; +#endif + n = sendData(file_des,&i32,sizeof(i32),INT32); + if (n < 0) return printSocketReadError(); + + // adc mask +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) + u32 = getADCEnableMask(); +#else + u32 = 0; +#endif + n = sendData(file_des,&u32,sizeof(u32),INT32); + if (n < 0) return printSocketReadError(); + + // 10g adc mask +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) + u32 = getADCEnableMask_10G(); +#else + u32 = 0; +#endif + n = sendData(file_des,&u32,sizeof(u32),INT32); + if (n < 0) return printSocketReadError(); + + // roi + { + ROI roi; +#ifdef GOTTHARDD + roi = getROI(); +#else + roi.xmin = -1; + roi.xmax = -1; +#endif + n = sendData(file_des,&roi.xmin,sizeof(int),INT32); + if (n < 0) return printSocketReadError(); + n = sendData(file_des,&roi.xmax,sizeof(int),INT32); + if (n < 0) return printSocketReadError(); + } + + // counter mask +#ifdef MYTHEN3D + u32 = getCounterMask(); +#else + u32 = 0; +#endif + n = sendData(file_des,&u32,sizeof(u32),INT32); + if (n < 0) return printSocketReadError(); + + // burst mode +#ifdef GOTTHARD2D + i32 = (int)getBurstMode(); +#else + i32 = 0; +#endif + n = sendData(file_des,&i32,sizeof(i32),INT32); + if (n < 0) return printSocketReadError(); + + + + // udp interfaces +#ifdef JUNGFRAUD + i32 = getNumberofUDPInterfaces(); +#else + i32 = 1; +#endif + n = sendData(file_des,&i32,sizeof(i32),INT32); + if (n < 0) return printSocketReadError(); + + // udp dst port + i32 = udpDetails.dstport; + n = sendData(file_des,&i32,sizeof(i32),INT32); + if (n < 0) return printSocketReadError(); + + // udp dst ip + u32 = udpDetails.dstip; + u32 = __builtin_bswap32(u32); + n = sendData(file_des,&u32,sizeof(u32),INT32); + if (n < 0) return printSocketReadError(); + + // udp dst mac + u64 = udpDetails.dstmac; + n = sendData(file_des,&u64,sizeof(u64),INT64); + if (n < 0) return printSocketReadError(); + + // udp dst port2 + i32 = udpDetails.dstport2; + n = sendData(file_des,&i32,sizeof(i32),INT32); + if (n < 0) return printSocketReadError(); + + // udp dst ip2 + u32 = udpDetails.dstip2; + u32 = __builtin_bswap32(u32); + n = sendData(file_des,&u32,sizeof(u32),INT32); + if (n < 0) return printSocketReadError(); + + // udp dst mac2 + u64 = udpDetails.dstmac2; + n = sendData(file_des,&u64,sizeof(u64),INT64); + if (n < 0) return printSocketReadError(); + + return OK; } \ No newline at end of file diff --git a/slsDetectorSoftware/src/Module.cpp b/slsDetectorSoftware/src/Module.cpp index 7c76656e2..82f0ca3e3 100755 --- a/slsDetectorSoftware/src/Module.cpp +++ b/slsDetectorSoftware/src/Module.cpp @@ -1620,22 +1620,43 @@ void Module::test() { int n = 0; rxParameters retval; + // populate from shared memory retval.detType = shm()->myDetectorType; n += sizeof(retval.detType); + // populate from detector auto client = DetectorSocket(shm()->hostname, shm()->controlPort); client.sendCommandThenRead(F_GET_RECEIVER_PARAMETERS, nullptr, 0, nullptr, 0); - - // frames - n += client.Receive(&retval.nFrames, sizeof(retval.nFrames)); - // triggers - n += client.Receive(&retval.nTriggers, sizeof(retval.nTriggers)); - // timing mode - n += client.Receive(&retval.timMode, sizeof(retval.timMode)); - // exptime + n += client.Receive(&retval.frames, sizeof(retval.frames)); + n += client.Receive(&retval.triggers, sizeof(retval.triggers)); + n += client.Receive(&retval.bursts, sizeof(retval.bursts)); + n += client.Receive(&retval.analogSamples, sizeof(retval.analogSamples)); + n += client.Receive(&retval.digitalSamples, sizeof(retval.digitalSamples)); n += client.Receive(&retval.expTimeNs, sizeof(retval.expTimeNs)); - // period n += client.Receive(&retval.periodNs, sizeof(retval.periodNs)); + n += client.Receive(&retval.subExpTimeNs, sizeof(retval.subExpTimeNs)); + n += client.Receive(&retval.subDeadTimeNs, sizeof(retval.subDeadTimeNs)); + + n += client.Receive(&retval.dynamicRange, sizeof(retval.dynamicRange)); + n += client.Receive(&retval.timMode, sizeof(retval.timMode)); + n += client.Receive(&retval.activate, sizeof(retval.activate)); + n += client.Receive(&retval.tenGiga, sizeof(retval.tenGiga)); + n += client.Receive(&retval.quad, sizeof(retval.quad)); + n += client.Receive(&retval.roMode, sizeof(retval.roMode)); + n += client.Receive(&retval.adcMask, sizeof(retval.adcMask)); + n += client.Receive(&retval.adc10gMask, sizeof(retval.adc10gMask)); + n += client.Receive(&retval.roi.xmin, sizeof(retval.roi.xmin)); + n += client.Receive(&retval.roi.xmax, sizeof(retval.roi.xmax)); + n += client.Receive(&retval.countermask, sizeof(retval.countermask)); + n += client.Receive(&retval.burstType, sizeof(retval.burstType)); + + n += client.Receive(&retval.udpInterfaces, sizeof(retval.udpInterfaces)); + n += client.Receive(&retval.udp_dstport, sizeof(retval.udp_dstport)); + n += client.Receive(&retval.udp_dstip, sizeof(retval.udp_dstip)); + n += client.Receive(&retval.udp_dstmac, sizeof(retval.udp_dstmac)); + n += client.Receive(&retval.udp_dstport2, sizeof(retval.udp_dstport2)); + n += client.Receive(&retval.udp_dstip2, sizeof(retval.udp_dstip2)); + n += client.Receive(&retval.udp_dstmac2, sizeof(retval.udp_dstmac2)); LOG(logINFO) << "n:" << n << " retvalsize:" << sizeof(retval); if (n != sizeof(retval)) { @@ -1643,11 +1664,37 @@ void Module::test() { } LOG(logINFO) << "detType:" << retval.detType; - LOG(logINFO) << "nFrames:" << retval.nFrames; - LOG(logINFO) << "nTriggers:" << retval.nTriggers; - LOG(logINFO) << "timMode:" << retval.timMode; + + LOG(logINFO) << "frames:" << retval.frames; + LOG(logINFO) << "triggers:" << retval.triggers; + LOG(logINFO) << "bursts:" << retval.bursts; + LOG(logINFO) << "analogSamples:" << retval.analogSamples; + LOG(logINFO) << "digitalSamples:" << retval.digitalSamples; LOG(logINFO) << "expTimeNs:" << retval.expTimeNs; LOG(logINFO) << "periodNs:" << retval.periodNs; + LOG(logINFO) << "subExpTimeNs:" << retval.subExpTimeNs; + LOG(logINFO) << "subDeadTimeNs:" << retval.subDeadTimeNs; + + LOG(logINFO) << "dynamicRange:" << retval.dynamicRange; + LOG(logINFO) << "timMode:" << retval.timMode; + LOG(logINFO) << "activate:" << retval.activate; + LOG(logINFO) << "tenGiga:" << retval.tenGiga; + LOG(logINFO) << "quad:" << retval.quad; + LOG(logINFO) << "roMode:" << retval.roMode; + LOG(logINFO) << "adcMask:" << retval.adcMask; + LOG(logINFO) << "adc10gMask:" << retval.adc10gMask; + LOG(logINFO) << "roi.xmin:" << retval.roi.xmin; + LOG(logINFO) << "roi.xmax:" << retval.roi.xmax; + LOG(logINFO) << "countermask:" << retval.countermask; + LOG(logINFO) << "burstType:" << retval.burstType; + + LOG(logINFO) << "udpInterfaces:" << retval.udpInterfaces; + LOG(logINFO) << "udp_dstport:" << retval.udp_dstport; + LOG(logINFO) << "udp_dstip:" << sls::IpAddr(retval.udp_dstip); + LOG(logINFO) << "udp_dstmac:" << sls::MacAddr(retval.udp_dstmac); + LOG(logINFO) << "udp_dstport2:" << retval.udp_dstport2; + LOG(logINFO) << "udp_dstip2:" << sls::IpAddr(retval.udp_dstip2); + LOG(logINFO) << "udp_dstmac2:" << sls::MacAddr(retval.udp_dstmac2); } std::string Module::getReceiverHostname() const { diff --git a/slsSupportLib/include/sls_detector_defs.h b/slsSupportLib/include/sls_detector_defs.h index 64079dc2d..7f5226d8e 100755 --- a/slsSupportLib/include/sls_detector_defs.h +++ b/slsSupportLib/include/sls_detector_defs.h @@ -465,12 +465,39 @@ class slsDetectorDefs { * structure to udpate receiver */ struct rxParameters { - enum detectorType detType{GENERIC}; - uint64_t nFrames{0}; - uint64_t nTriggers{0}; - enum timingMode timMode{AUTO_TIMING}; - uint64_t expTimeNs{0}; - uint64_t periodNs{0}; + detectorType detType{GENERIC}; + + int64_t frames{0}; + int64_t triggers{0}; + int64_t bursts{0}; + int analogSamples{0}; + int digitalSamples{0}; + int64_t expTimeNs{0}; + int64_t periodNs{0}; + int64_t subExpTimeNs{0}; + int64_t subDeadTimeNs{0}; + + int dynamicRange{16}; + timingMode timMode{AUTO_TIMING}; + int activate{0}; + int tenGiga{0}; + int quad{0}; + readoutMode roMode{ANALOG_ONLY}; + uint32_t adcMask{0}; + uint32_t adc10gMask{0}; + ROI roi; + uint32_t countermask{0}; + burstMode burstType{BURST_OFF}; + + + int udpInterfaces{1}; + int udp_dstport{0}; + uint32_t udp_dstip{0U}; + uint64_t udp_dstmac{0LU}; + int udp_dstport2{0}; + uint32_t udp_dstip2{0U}; + uint64_t udp_dstmac2{0LU}; + }__attribute__((packed)); #endif