mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-05 17:40:40 +02:00
Jungfrautrigger (#516)
* jungfrau trigger added * added blocking trigger
This commit is contained in:
parent
1bc4994be6
commit
01696ca89b
@ -87,6 +87,7 @@ This document describes the differences between v7.0.0 and v6.x.x
|
|||||||
- callback modified to have rx header and not rx header pointer
|
- callback modified to have rx header and not rx header pointer
|
||||||
- adapted for g2 hdi v2.0. able to set master from server command line, server config file, and client.
|
- adapted for g2 hdi v2.0. able to set master from server command line, server config file, and client.
|
||||||
- rx udp socket refactored (maybe resolves getting stuck?)remove check for eiger header and isntead checks for malformed packets for every detector
|
- rx udp socket refactored (maybe resolves getting stuck?)remove check for eiger header and isntead checks for malformed packets for every detector
|
||||||
|
- jungfrau sw trigger , blocking trigger
|
||||||
-help should not create a new object
|
-help should not create a new object
|
||||||
- g2 parallel command
|
- g2 parallel command
|
||||||
|
|
||||||
|
@ -218,6 +218,8 @@
|
|||||||
#define CONTROL_START_ACQ_MSK (0x00000001 << CONTROL_START_ACQ_OFST)
|
#define CONTROL_START_ACQ_MSK (0x00000001 << CONTROL_START_ACQ_OFST)
|
||||||
#define CONTROL_STOP_ACQ_OFST (1)
|
#define CONTROL_STOP_ACQ_OFST (1)
|
||||||
#define CONTROL_STOP_ACQ_MSK (0x00000001 << CONTROL_STOP_ACQ_OFST)
|
#define CONTROL_STOP_ACQ_MSK (0x00000001 << CONTROL_STOP_ACQ_OFST)
|
||||||
|
#define CONTROL_SOFTWARE_TRIGGER_OFST (2)
|
||||||
|
#define CONTROL_SOFTWARE_TRIGGER_MSK (0x00000001 << CONTROL_SOFTWARE_TRIGGER_OFST)
|
||||||
#define CONTROL_CORE_RST_OFST (10)
|
#define CONTROL_CORE_RST_OFST (10)
|
||||||
#define CONTROL_CORE_RST_MSK (0x00000001 << CONTROL_CORE_RST_OFST)
|
#define CONTROL_CORE_RST_MSK (0x00000001 << CONTROL_CORE_RST_OFST)
|
||||||
#define CONTROL_PERIPHERAL_RST_OFST (11) // DDR3 HMem Ctrlr, GBE, Temp
|
#define CONTROL_PERIPHERAL_RST_OFST (11) // DDR3 HMem Ctrlr, GBE, Temp
|
||||||
|
Binary file not shown.
@ -2686,6 +2686,33 @@ int stopStateMachine() {
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int softwareTrigger(int block) {
|
||||||
|
#ifndef VIRTUAL
|
||||||
|
// ready for trigger
|
||||||
|
if (getRunStatus() != WAITING) {
|
||||||
|
LOG(logWARNING, ("Not yet ready for trigger!\n"));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
LOG(logINFO, ("Sending Software Trigger\n"));
|
||||||
|
bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_SOFTWARE_TRIGGER_MSK);
|
||||||
|
|
||||||
|
#ifndef VIRTUAL
|
||||||
|
// block till frame is sent out
|
||||||
|
if (block) {
|
||||||
|
enum runStatus s = getRunStatus();
|
||||||
|
while (s == RUNNING || s == TRANSMITTING) {
|
||||||
|
usleep(5000);
|
||||||
|
s = getRunStatus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LOG(logINFO, ("Ready for Next Trigger...\n"));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
enum runStatus getRunStatus() {
|
enum runStatus getRunStatus() {
|
||||||
LOG(logDEBUG1, ("Getting status\n"));
|
LOG(logDEBUG1, ("Getting status\n"));
|
||||||
// scan error or running
|
// scan error or running
|
||||||
|
@ -650,7 +650,7 @@ int stopStateMachine();
|
|||||||
#ifdef MYTHEN3D
|
#ifdef MYTHEN3D
|
||||||
int softwareTrigger();
|
int softwareTrigger();
|
||||||
#endif
|
#endif
|
||||||
#ifdef EIGERD
|
#if defined(EIGERD) || defined(JUNGFRAUD)
|
||||||
int softwareTrigger(int block);
|
int softwareTrigger(int block);
|
||||||
#endif
|
#endif
|
||||||
#if defined(EIGERD) || defined(MYTHEN3D)
|
#if defined(EIGERD) || defined(MYTHEN3D)
|
||||||
|
@ -1880,57 +1880,55 @@ int acquire(int blocking, int file_des) {
|
|||||||
#ifdef EIGERD
|
#ifdef EIGERD
|
||||||
// check for hardware mac and hardware ip
|
// check for hardware mac and hardware ip
|
||||||
if (udpDetails[0].srcmac != getDetectorMAC()) {
|
if (udpDetails[0].srcmac != getDetectorMAC()) {
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
uint64_t sourcemac = getDetectorMAC();
|
uint64_t sourcemac = getDetectorMAC();
|
||||||
char src_mac[MAC_ADDRESS_SIZE];
|
char src_mac[MAC_ADDRESS_SIZE];
|
||||||
getMacAddressinString(src_mac, MAC_ADDRESS_SIZE, sourcemac);
|
getMacAddressinString(src_mac, MAC_ADDRESS_SIZE, sourcemac);
|
||||||
sprintf(
|
sprintf(mess,
|
||||||
mess,
|
|
||||||
"Invalid udp source mac address for this detector. Must be "
|
"Invalid udp source mac address for this detector. Must be "
|
||||||
"same as hardware detector mac address %s\n",
|
"same as hardware detector mac address %s\n",
|
||||||
src_mac);
|
src_mac);
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
} else if (!enableTenGigabitEthernet(GET_FLAG) &&
|
} else if (!enableTenGigabitEthernet(GET_FLAG) &&
|
||||||
(udpDetails[0].srcip != getDetectorIP())) {
|
(udpDetails[0].srcip != getDetectorIP())) {
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
uint32_t sourceip = getDetectorIP();
|
uint32_t sourceip = getDetectorIP();
|
||||||
char src_ip[INET_ADDRSTRLEN];
|
char src_ip[INET_ADDRSTRLEN];
|
||||||
getIpAddressinString(src_ip, sourceip);
|
getIpAddressinString(src_ip, sourceip);
|
||||||
sprintf(
|
sprintf(mess,
|
||||||
mess,
|
|
||||||
"Invalid udp source ip address for this detector. Must be "
|
"Invalid udp source ip address for this detector. Must be "
|
||||||
"same "
|
"same "
|
||||||
"as hardware detector ip address %s in 1G readout mode \n",
|
"as hardware detector ip address %s in 1G readout mode \n",
|
||||||
src_ip);
|
src_ip);
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
if (configured == FAIL) {
|
if (configured == FAIL) {
|
||||||
|
ret = FAIL;
|
||||||
|
strcpy(mess, "Could not start acquisition because ");
|
||||||
|
strcat(mess, configureMessage);
|
||||||
|
LOG(logERROR, (mess));
|
||||||
|
} else if (sharedMemory_getScanStatus() == RUNNING) {
|
||||||
|
ret = FAIL;
|
||||||
|
strcpy(mess, "Could not start acquisition because a scan is "
|
||||||
|
"already running!\n");
|
||||||
|
LOG(logERROR, (mess));
|
||||||
|
} else {
|
||||||
|
memset(scanErrMessage, 0, MAX_STR_LENGTH);
|
||||||
|
sharedMemory_setScanStop(0);
|
||||||
|
sharedMemory_setScanStatus(IDLE); // if it was error
|
||||||
|
if (pthread_create(&pthread_tid, NULL, &start_state_machine,
|
||||||
|
&blocking)) {
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
strcpy(mess, "Could not start acquisition because ");
|
strcpy(mess, "Could not start acquisition thread!\n");
|
||||||
strcat(mess, configureMessage);
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
} else if (sharedMemory_getScanStatus() == RUNNING) {
|
|
||||||
ret = FAIL;
|
|
||||||
strcpy(mess, "Could not start acquisition because a scan is "
|
|
||||||
"already running!\n");
|
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
} else {
|
} else {
|
||||||
memset(scanErrMessage, 0, MAX_STR_LENGTH);
|
// only does not wait for non blocking and scan
|
||||||
sharedMemory_setScanStop(0);
|
if (blocking || !scan) {
|
||||||
sharedMemory_setScanStatus(IDLE); // if it was error
|
pthread_join(pthread_tid, NULL);
|
||||||
if (pthread_create(&pthread_tid, NULL, &start_state_machine,
|
|
||||||
&blocking)) {
|
|
||||||
ret = FAIL;
|
|
||||||
strcpy(mess, "Could not start acquisition thread!\n");
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
} else {
|
|
||||||
// only does not wait for non blocking and scan
|
|
||||||
if (blocking || !scan) {
|
|
||||||
pthread_join(pthread_tid, NULL);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return Server_SendResult(file_des, INT32, NULL, 0);
|
return Server_SendResult(file_des, INT32, NULL, 0);
|
||||||
}
|
}
|
||||||
@ -4129,18 +4127,19 @@ int software_trigger(int file_des) {
|
|||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
LOG(logDEBUG1, ("Software Trigger (block: %d\n", arg));
|
LOG(logDEBUG1, ("Software Trigger (block: %d\n", arg));
|
||||||
|
|
||||||
#if !defined(EIGERD) && !defined(MYTHEN3D)
|
#if !defined(EIGERD) && !defined(MYTHEN3D) && !defined(JUNGFRAUD)
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
if (arg && myDetectorType == MYTHEN3) {
|
if (arg && myDetectorType == MYTHEN3) {
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
strcpy(mess, "Blocking trigger not implemented for Mythen3. Please use "
|
strcpy(mess, "Blocking trigger not implemented for this detector. "
|
||||||
|
"Please use "
|
||||||
"non blocking trigger.\n");
|
"non blocking trigger.\n");
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
}
|
}
|
||||||
// only set
|
// only set
|
||||||
else if (Server_VerifyLock() == OK) {
|
else if (Server_VerifyLock() == OK) {
|
||||||
#ifdef MYTHEN3
|
#ifdef MYTHEN3D
|
||||||
ret = softwareTrigger();
|
ret = softwareTrigger();
|
||||||
#else
|
#else
|
||||||
ret = softwareTrigger(arg);
|
ret = softwareTrigger(arg);
|
||||||
|
@ -618,8 +618,10 @@ class Detector {
|
|||||||
* different frame numbers for different modules.*/
|
* different frame numbers for different modules.*/
|
||||||
void setNextFrameNumber(uint64_t value, Positions pos = {});
|
void setNextFrameNumber(uint64_t value, Positions pos = {});
|
||||||
|
|
||||||
/** [Eiger][Mythen3] Sends an internal software trigger to the detector
|
/** [Eiger][Mythen3][Jungfrau] Sends an internal software trigger to the
|
||||||
* block true if command blocks till frames are sent out from that trigger
|
* detector block true if command blocks till frames are sent out from that
|
||||||
|
* trigger
|
||||||
|
* [Eiger][Jungfrau] Block can be true
|
||||||
*/
|
*/
|
||||||
void sendSoftwareTrigger(const bool block = false, Positions pos = {});
|
void sendSoftwareTrigger(const bool block = false, Positions pos = {});
|
||||||
|
|
||||||
|
@ -1402,12 +1402,12 @@ std::string CmdProxy::Trigger(int action) {
|
|||||||
os << cmd << ' ';
|
os << cmd << ' ';
|
||||||
if (action == defs::HELP_ACTION) {
|
if (action == defs::HELP_ACTION) {
|
||||||
if (cmd == "trigger") {
|
if (cmd == "trigger") {
|
||||||
os << "\n\t[Eiger][Mythen3] Sends software trigger signal to "
|
os << "\n\t[Eiger][Mythen3][Jungfrau] Sends software trigger "
|
||||||
"detector";
|
"signal to detector";
|
||||||
} else if (cmd == "blockingtrigger") {
|
} else if (cmd == "blockingtrigger") {
|
||||||
os << "\n\t[Eiger] Sends software trigger signal to detector and "
|
os << "\n\t[Eiger][Jungfrau] Sends software trigger signal to "
|
||||||
"blocks till "
|
"detector and blocks till the frames are sent out for that "
|
||||||
"the frames are sent out for that trigger.";
|
"trigger.";
|
||||||
} else {
|
} else {
|
||||||
throw RuntimeError("unknown command " + cmd);
|
throw RuntimeError("unknown command " + cmd);
|
||||||
}
|
}
|
||||||
|
@ -523,7 +523,7 @@ TEST_CASE("interpolation", "[.cmd]") {
|
|||||||
REQUIRE(oss.str() == "interpolation 0\n");
|
REQUIRE(oss.str() == "interpolation 0\n");
|
||||||
REQUIRE(det.getCounterMask().tsquash(
|
REQUIRE(det.getCounterMask().tsquash(
|
||||||
"inconsistent counter mask") == fixedMask[i]);
|
"inconsistent counter mask") == fixedMask[i]);
|
||||||
uint32_t expectedVth3DacVal =
|
int expectedVth3DacVal =
|
||||||
(fixedMask[i] & 0x4 ? fixedVth3DacVal : disabledDacValue);
|
(fixedMask[i] & 0x4 ? fixedVth3DacVal : disabledDacValue);
|
||||||
REQUIRE(det.getDAC(defs::VTH3, 0, {0})
|
REQUIRE(det.getDAC(defs::VTH3, 0, {0})
|
||||||
.tsquash("inconsistent vth3 dac value") ==
|
.tsquash("inconsistent vth3 dac value") ==
|
||||||
|
@ -1943,11 +1943,9 @@ TEST_CASE("trigger", "[.cmd]") {
|
|||||||
CmdProxy proxy(&det);
|
CmdProxy proxy(&det);
|
||||||
REQUIRE_THROWS(proxy.Call("trigger", {}, -1, GET));
|
REQUIRE_THROWS(proxy.Call("trigger", {}, -1, GET));
|
||||||
auto det_type = det.getDetectorType().squash();
|
auto det_type = det.getDetectorType().squash();
|
||||||
if (det_type != defs::EIGER && det_type != defs::MYTHEN3) {
|
if (det_type == defs::MYTHEN3) {
|
||||||
REQUIRE_THROWS(proxy.Call("trigger", {}, -1, PUT));
|
|
||||||
} else if (det_type == defs::MYTHEN3) {
|
|
||||||
REQUIRE_NOTHROW(proxy.Call("trigger", {}, -1, PUT));
|
REQUIRE_NOTHROW(proxy.Call("trigger", {}, -1, PUT));
|
||||||
} else if (det_type == defs::EIGER) {
|
} else if (det_type == defs::EIGER || det_type == defs::JUNGFRAU) {
|
||||||
auto prev_timing =
|
auto prev_timing =
|
||||||
det.getTimingMode().tsquash("inconsistent timing mode in test");
|
det.getTimingMode().tsquash("inconsistent timing mode in test");
|
||||||
auto prev_frames =
|
auto prev_frames =
|
||||||
@ -1977,6 +1975,8 @@ TEST_CASE("trigger", "[.cmd]") {
|
|||||||
det.setNumberOfFrames(prev_frames);
|
det.setNumberOfFrames(prev_frames);
|
||||||
det.setExptime(prev_exptime);
|
det.setExptime(prev_exptime);
|
||||||
det.setPeriod(prev_period);
|
det.setPeriod(prev_period);
|
||||||
|
} else {
|
||||||
|
REQUIRE_THROWS(proxy.Call("trigger", {}, -1, PUT));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1985,9 +1985,7 @@ TEST_CASE("blockingtrigger", "[.cmd]") {
|
|||||||
CmdProxy proxy(&det);
|
CmdProxy proxy(&det);
|
||||||
REQUIRE_THROWS(proxy.Call("blockingtrigger", {}, -1, GET));
|
REQUIRE_THROWS(proxy.Call("blockingtrigger", {}, -1, GET));
|
||||||
auto det_type = det.getDetectorType().squash();
|
auto det_type = det.getDetectorType().squash();
|
||||||
if (det_type != defs::EIGER) {
|
if (det_type == defs::EIGER || det_type == defs::JUNGFRAU) {
|
||||||
REQUIRE_THROWS(proxy.Call("blockingtrigger", {}, -1, PUT));
|
|
||||||
} else if (det_type == defs::EIGER) {
|
|
||||||
auto prev_timing =
|
auto prev_timing =
|
||||||
det.getTimingMode().tsquash("inconsistent timing mode in test");
|
det.getTimingMode().tsquash("inconsistent timing mode in test");
|
||||||
auto prev_frames =
|
auto prev_frames =
|
||||||
@ -2020,6 +2018,8 @@ TEST_CASE("blockingtrigger", "[.cmd]") {
|
|||||||
det.setNumberOfFrames(prev_frames);
|
det.setNumberOfFrames(prev_frames);
|
||||||
det.setExptime(prev_exptime);
|
det.setExptime(prev_exptime);
|
||||||
det.setPeriod(prev_period);
|
det.setPeriod(prev_period);
|
||||||
|
} else {
|
||||||
|
REQUIRE_THROWS(proxy.Call("blockingtrigger", {}, -1, PUT));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,8 +7,8 @@
|
|||||||
#define APIGUI 0x220609
|
#define APIGUI 0x220609
|
||||||
#define APICTB 0x220816
|
#define APICTB 0x220816
|
||||||
#define APIGOTTHARD 0x220816
|
#define APIGOTTHARD 0x220816
|
||||||
#define APIJUNGFRAU 0x220816
|
|
||||||
#define APIMYTHEN3 0x220816
|
#define APIMYTHEN3 0x220816
|
||||||
#define APIMOENCH 0x220816
|
#define APIMOENCH 0x220816
|
||||||
#define APIEIGER 0x220816
|
#define APIEIGER 0x220816
|
||||||
#define APIGOTTHARD2 0x220816
|
#define APIGOTTHARD2 0x220816
|
||||||
|
#define APIJUNGFRAU 0x220816
|
||||||
|
Loading…
x
Reference in New Issue
Block a user