This commit is contained in:
maliakal_d 2020-07-03 16:06:12 +02:00
parent 7c48ef8931
commit 95089b5faa
14 changed files with 373 additions and 411 deletions

View File

@ -1267,6 +1267,7 @@ int setHighVoltage(int val) {
if (master) {
// set
if (val != -1) {
LOG(logINFO, ("Setting High voltage: %d V\n", val));
eiger_theo_highvoltage = val;
}
return eiger_theo_highvoltage;

View File

@ -1198,17 +1198,11 @@ int setHighVoltage(int val) {
val = HV_SOFT_MAX_VOLTAGE;
}
#ifdef VIRTUAL
if (val >= 0)
highvoltage = val;
return highvoltage;
#endif
// setting hv
if (val >= 0) {
LOG(logINFO, ("Setting High voltage: %d V\n", val));
DAC6571_Set(val);
highvoltage = val;
if (DAC6571_Set(val) == OK)
highvoltage = val;
}
return highvoltage;
}

View File

@ -1133,17 +1133,12 @@ int setHighVoltage(int val) {
if (val > HV_SOFT_MAX_VOLTAGE) {
val = HV_SOFT_MAX_VOLTAGE;
}
#ifdef VIRTUAL
if (val >= 0)
highvoltage = val;
return highvoltage;
#endif
// setting hv
if (val >= 0) {
LOG(logINFO, ("Setting High voltage: %d V\n", val));
DAC6571_Set(val);
highvoltage = val;
if (DAC6571_Set(val) == OK)
highvoltage = val;
}
return highvoltage;
}

View File

@ -37,6 +37,7 @@ int set_bus_test(int);
int set_image_test_mode(int);
int get_image_test_mode(int);
enum DACINDEX getDACIndex(enum dacIndex ind);
int validateAndSetDac(enum dacIndex ind, int val, int mV);
int set_dac(int);
int get_adc(int);
int write_register(int);
@ -91,6 +92,7 @@ int get_last_client_ip(int);
int set_port(int);
int calibrate_pedestal(int);
int enable_ten_giga(int);
int validateAndSetAllTrimbits(int arg);
int set_all_trimbits(int);
int set_pattern_io_control(int);
int set_pattern_word(int);
@ -226,3 +228,4 @@ int set_veto(int);
int set_pattern(int);
int get_scan(int);
int set_scan(int);
int get_scan_error_message(int);

View File

@ -59,8 +59,8 @@ int numScanSteps = 0;
int *scanSteps = NULL;
int64_t scanSettleTime_ns = 0;
enum dacIndex scanGlobalIndex = 0;
enum DACINDEX scanDac = 0;
int scanTrimbits = 0;
char scanErrMessage[MAX_STR_LENGTH] = "";
/* initialization functions */
@ -345,6 +345,8 @@ void function_table() {
flist[F_SET_PATTERN] = &set_pattern;
flist[F_GET_SCAN] = get_scan;
flist[F_SET_SCAN] = set_scan;
flist[F_GET_SCAN_ERROR_MESSAGE] = get_scan_error_message;
// check
if (NUM_DET_FUNCTIONS >= RECEIVER_ENUM_START) {
LOG(logERROR, ("The last detector function enum has reached its "
@ -713,7 +715,7 @@ int get_image_test_mode(int file_des) {
}
enum DACINDEX getDACIndex(enum dacIndex ind) {
enum DACINDEX serverDacIndex = 0;
enum DACINDEX serverDacIndex = -1;
// check if dac exists for this detector
switch (ind) {
#ifdef GOTTHARDD
@ -993,6 +995,235 @@ enum DACINDEX getDACIndex(enum dacIndex ind) {
return serverDacIndex;
}
int validateAndSetDac(enum dacIndex ind, int val, int mV) {
int retval = -1;
enum DACINDEX serverDacIndex = getDACIndex(ind);
if (ret == OK) {
switch (ind) {
// adc vpp
#if defined(CHIPTESTBOARDD) || defined(MOENCHD)
case ADC_VPP:
// set
if (val >= 0) {
ret = AD9257_SetVrefVoltage(val, mV);
if (ret == FAIL) {
sprintf(mess, "Could not set Adc Vpp. Please set a "
"proper value\n");
LOG(logERROR, (mess));
}
}
retval = AD9257_GetVrefVoltage(mV);
LOG(logDEBUG1,
("Adc Vpp retval: %d %s\n", retval, (mV ? "mV" : "mode")));
// cannot validate (its just a variable and mv gives different
// value)
break;
#endif
// io delay
#ifdef EIGERD
case IO_DELAY:
retval = setIODelay(val);
LOG(logDEBUG1, ("IODelay: %d\n", retval));
validate(val, retval, "set iodelay", DEC);
break;
#endif
// high voltage
case HIGH_VOLTAGE:
retval = setHighVoltage(val);
LOG(logDEBUG1, ("High Voltage: %d\n", retval));
#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || \
defined(GOTTHARD2D) || defined(MYTHEN3D)
validate(val, retval, "set high voltage", DEC);
#endif
#ifdef GOTTHARDD
if (retval == -1) {
ret = FAIL;
strcpy(mess, "Invalid Voltage. Valid values are 0, 90, "
"110, 120, 150, 180, 200\n");
LOG(logERROR, (mess));
} else
validate(val, retval, "set high voltage", DEC);
#elif EIGERD
if ((retval != SLAVE_HIGH_VOLTAGE_READ_VAL) && (retval < 0)) {
ret = FAIL;
if (retval == -1)
sprintf(mess,
"Setting high voltage failed. Bad value %d. "
"The range is from 0 to 200 V.\n",
val);
else if (retval == -2)
strcpy(mess, "Setting high voltage failed. "
"Serial/i2c communication failed.\n");
else if (retval == -3)
strcpy(mess, "Getting high voltage failed. "
"Serial/i2c communication failed.\n");
LOG(logERROR, (mess));
}
#endif
break;
// power, vlimit
#ifdef CHIPTESTBOARDD
case V_POWER_A:
case V_POWER_B:
case V_POWER_C:
case V_POWER_D:
case V_POWER_IO:
if (val != GET_FLAG) {
if (!mV) {
ret = FAIL;
sprintf(mess,
"Could not set power. Power regulator %d "
"should be in mV and not dac units.\n",
ind);
LOG(logERROR, (mess));
} else if (checkVLimitCompliant(val) == FAIL) {
ret = FAIL;
sprintf(mess,
"Could not set power. Power regulator %d "
"exceeds voltage limit %d.\n",
ind, getVLimit());
LOG(logERROR, (mess));
} else if (!isPowerValid(serverDacIndex, val)) {
ret = FAIL;
sprintf(mess,
"Could not set power. Power regulator %d "
"should be between %d and %d mV\n",
ind,
(serverDacIndex == D_PWR_IO ? VIO_MIN_MV
: POWER_RGLTR_MIN),
(VCHIP_MAX_MV - VCHIP_POWER_INCRMNT));
LOG(logERROR, (mess));
} else {
setPower(serverDacIndex, val);
}
}
retval = getPower(serverDacIndex);
LOG(logDEBUG1, ("Power regulator(%d): %d\n", ind, retval));
validate(val, retval, "set power regulator", DEC);
break;
case V_POWER_CHIP:
if (val >= 0) {
ret = FAIL;
sprintf(mess, "Can not set Vchip. Can only be set "
"automatically in the background (+200mV "
"from highest power regulator voltage).\n");
LOG(logERROR, (mess));
/* restrict users from setting vchip
if (!mV) {
ret = FAIL;
sprintf(mess,"Could not set Vchip. Should be in mV and
not dac units.\n"); LOG(logERROR,(mess)); } else if
(!isVchipValid(val)) { ret = FAIL; sprintf(mess,"Could not
set Vchip. Should be between %d and %d mV\n", VCHIP_MIN_MV,
VCHIP_MAX_MV); LOG(logERROR,(mess)); } else { setVchip(val);
}
*/
}
retval = getVchip();
LOG(logDEBUG1, ("Vchip: %d\n", retval));
if (ret == OK && val != GET_FLAG && val != -100 && retval != val) {
ret = FAIL;
sprintf(mess, "Could not set vchip. Set %d, but read %d\n", val,
retval);
LOG(logERROR, (mess));
}
break;
#endif
#if defined(CHIPTESTBOARDD) || defined(MOENCHD)
case V_LIMIT:
if (val >= 0) {
if (!mV) {
ret = FAIL;
strcpy(mess, "Could not set power. VLimit should be in "
"mV and not dac units.\n");
LOG(logERROR, (mess));
} else {
setVLimit(val);
}
}
retval = getVLimit();
LOG(logDEBUG1, ("VLimit: %d\n", retval));
validate(val, retval, "set vlimit", DEC);
break;
#endif
// dacs
default:
if (mV && val > DAC_MAX_MV) {
ret = FAIL;
sprintf(mess,
"Could not set dac %d to value %d. Allowed limits "
"(0 - %d mV).\n",
ind, val, DAC_MAX_MV);
LOG(logERROR, (mess));
} else if (!mV && val > getMaxDacSteps()) {
ret = FAIL;
sprintf(mess,
"Could not set dac %d to value %d. Allowed limits "
"(0 - %d dac units).\n",
ind, val, getMaxDacSteps());
LOG(logERROR, (mess));
} else {
#if defined(CHIPTESTBOARDD) || defined(MOENCHD)
if ((val != GET_FLAG && mV &&
checkVLimitCompliant(val) == FAIL) ||
(val != GET_FLAG && !mV &&
checkVLimitDacCompliant(val) == FAIL)) {
ret = FAIL;
sprintf(mess,
"Could not set dac %d to value %d. "
"Exceeds voltage limit %d.\n",
ind, (mV ? val : dacToVoltage(val)), getVLimit());
LOG(logERROR, (mess));
} else
#endif
setDAC(serverDacIndex, val, mV);
retval = getDAC(serverDacIndex, mV);
}
#ifdef EIGERD
if (val != GET_FLAG && getSettings() != UNDEFINED) {
// changing dac changes settings to undefined
switch (serverDacIndex) {
case E_VCMP_LL:
case E_VCMP_LR:
case E_VCMP_RL:
case E_VCMP_RR:
case E_VRPREAMP:
case E_VCP:
setSettings(UNDEFINED);
LOG(logERROR, ("Settings has been changed "
"to undefined (changed specific dacs)\n"));
break;
default:
break;
}
}
#endif
// check
if (ret == OK) {
if ((abs(retval - val) <= 5) || val == GET_FLAG) {
ret = OK;
} else {
ret = FAIL;
sprintf(mess, "Setting dac %d : wrote %d but read %d\n",
serverDacIndex, val, retval);
LOG(logERROR, (mess));
}
}
LOG(logDEBUG1, ("Dac (%d): %d %s\n\n", serverDacIndex, retval,
(mV ? "mV" : "dac units")));
break;
}
}
return retval;
}
int set_dac(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
@ -1005,240 +1236,12 @@ int set_dac(int file_des) {
enum dacIndex ind = args[0];
int mV = args[1];
int val = args[2];
enum DACINDEX serverDacIndex = getDACIndex(ind);
// index exists
if (ret == OK) {
LOG(logDEBUG1, ("Setting DAC %d to %d %s\n", serverDacIndex, val,
(mV ? "mV" : "dac units")));
// set & get
if ((val == GET_FLAG) || (Server_VerifyLock() == OK)) {
switch (ind) {
// adc vpp
#if defined(CHIPTESTBOARDD) || defined(MOENCHD)
case ADC_VPP:
// set
if (val >= 0) {
ret = AD9257_SetVrefVoltage(val, mV);
if (ret == FAIL) {
sprintf(mess, "Could not set Adc Vpp. Please set a "
"proper value\n");
LOG(logERROR, (mess));
}
}
retval = AD9257_GetVrefVoltage(mV);
LOG(logDEBUG1,
("Adc Vpp retval: %d %s\n", retval, (mV ? "mV" : "mode")));
// cannot validate (its just a variable and mv gives different
// value)
break;
#endif
// io delay
#ifdef EIGERD
case IO_DELAY:
retval = setIODelay(val);
LOG(logDEBUG1, ("IODelay: %d\n", retval));
validate(val, retval, "set iodelay", DEC);
break;
#endif
// high voltage
case HIGH_VOLTAGE:
retval = setHighVoltage(val);
LOG(logDEBUG1, ("High Voltage: %d\n", retval));
#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || \
defined(GOTTHARD2D) || defined(MYTHEN3D)
validate(val, retval, "set high voltage", DEC);
#endif
#ifdef GOTTHARDD
if (retval == -1) {
ret = FAIL;
strcpy(mess, "Invalid Voltage. Valid values are 0, 90, "
"110, 120, 150, 180, 200\n");
LOG(logERROR, (mess));
} else
validate(val, retval, "set high voltage", DEC);
#elif EIGERD
if ((retval != SLAVE_HIGH_VOLTAGE_READ_VAL) && (retval < 0)) {
ret = FAIL;
if (retval == -1)
sprintf(mess,
"Setting high voltage failed. Bad value %d. "
"The range is from 0 to 200 V.\n",
val);
else if (retval == -2)
strcpy(mess, "Setting high voltage failed. "
"Serial/i2c communication failed.\n");
else if (retval == -3)
strcpy(mess, "Getting high voltage failed. "
"Serial/i2c communication failed.\n");
LOG(logERROR, (mess));
}
#endif
break;
// power, vlimit
#ifdef CHIPTESTBOARDD
case V_POWER_A:
case V_POWER_B:
case V_POWER_C:
case V_POWER_D:
case V_POWER_IO:
if (val != GET_FLAG) {
if (!mV) {
ret = FAIL;
sprintf(mess,
"Could not set power. Power regulator %d "
"should be in mV and not dac units.\n",
ind);
LOG(logERROR, (mess));
} else if (checkVLimitCompliant(val) == FAIL) {
ret = FAIL;
sprintf(mess,
"Could not set power. Power regulator %d "
"exceeds voltage limit %d.\n",
ind, getVLimit());
LOG(logERROR, (mess));
} else if (!isPowerValid(serverDacIndex, val)) {
ret = FAIL;
sprintf(mess,
"Could not set power. Power regulator %d "
"should be between %d and %d mV\n",
ind,
(serverDacIndex == D_PWR_IO ? VIO_MIN_MV
: POWER_RGLTR_MIN),
(VCHIP_MAX_MV - VCHIP_POWER_INCRMNT));
LOG(logERROR, (mess));
} else {
setPower(serverDacIndex, val);
}
}
retval = getPower(serverDacIndex);
LOG(logDEBUG1, ("Power regulator(%d): %d\n", ind, retval));
validate(val, retval, "set power regulator", DEC);
break;
case V_POWER_CHIP:
if (val >= 0) {
ret = FAIL;
sprintf(mess, "Can not set Vchip. Can only be set "
"automatically in the background (+200mV "
"from highest power regulator voltage).\n");
LOG(logERROR, (mess));
/* restrict users from setting vchip
if (!mV) {
ret = FAIL;
sprintf(mess,"Could not set Vchip. Should be in mV and
not dac units.\n"); LOG(logERROR,(mess)); } else if
(!isVchipValid(val)) { ret = FAIL; sprintf(mess,"Could not
set Vchip. Should be between %d and %d mV\n", VCHIP_MIN_MV,
VCHIP_MAX_MV); LOG(logERROR,(mess)); } else { setVchip(val);
}
*/
}
retval = getVchip();
LOG(logDEBUG1, ("Vchip: %d\n", retval));
if (ret == OK && val != GET_FLAG && val != -100 &&
retval != val) {
ret = FAIL;
sprintf(mess, "Could not set vchip. Set %d, but read %d\n",
val, retval);
LOG(logERROR, (mess));
}
break;
#endif
#if defined(CHIPTESTBOARDD) || defined(MOENCHD)
case V_LIMIT:
if (val >= 0) {
if (!mV) {
ret = FAIL;
strcpy(mess, "Could not set power. VLimit should be in "
"mV and not dac units.\n");
LOG(logERROR, (mess));
} else {
setVLimit(val);
}
}
retval = getVLimit();
LOG(logDEBUG1, ("VLimit: %d\n", retval));
validate(val, retval, "set vlimit", DEC);
break;
#endif
// dacs
default:
if (mV && val > DAC_MAX_MV) {
ret = FAIL;
sprintf(mess,
"Could not set dac %d to value %d. Allowed limits "
"(0 - %d mV).\n",
ind, val, DAC_MAX_MV);
LOG(logERROR, (mess));
} else if (!mV && val > getMaxDacSteps()) {
ret = FAIL;
sprintf(mess,
"Could not set dac %d to value %d. Allowed limits "
"(0 - %d dac units).\n",
ind, val, getMaxDacSteps());
LOG(logERROR, (mess));
} else {
#if defined(CHIPTESTBOARDD) || defined(MOENCHD)
if ((val != GET_FLAG && mV &&
checkVLimitCompliant(val) == FAIL) ||
(val != GET_FLAG && !mV &&
checkVLimitDacCompliant(val) == FAIL)) {
ret = FAIL;
sprintf(mess,
"Could not set dac %d to value %d. "
"Exceeds voltage limit %d.\n",
ind, (mV ? val : dacToVoltage(val)),
getVLimit());
LOG(logERROR, (mess));
} else
#endif
setDAC(serverDacIndex, val, mV);
retval = getDAC(serverDacIndex, mV);
}
#ifdef EIGERD
if (val != GET_FLAG) {
// changing dac changes settings to undefined
switch (serverDacIndex) {
case E_VCMP_LL:
case E_VCMP_LR:
case E_VCMP_RL:
case E_VCMP_RR:
case E_VRPREAMP:
case E_VCP:
setSettings(UNDEFINED);
LOG(logERROR,
("Settings has been changed "
"to undefined (changed specific dacs)\n"));
break;
default:
break;
}
}
#endif
// check
if (ret == OK) {
if ((abs(retval - val) <= 5) || val == GET_FLAG) {
ret = OK;
} else {
ret = FAIL;
sprintf(mess, "Setting dac %d : wrote %d but read %d\n",
serverDacIndex, val, retval);
LOG(logERROR, (mess));
}
}
LOG(logDEBUG1, ("Dac (%d): %d %s\n\n", serverDacIndex, retval,
(mV ? "mV" : "dac units")));
break;
}
}
LOG(logDEBUG1,
("Setting DAC %d to %d %s\n", ind, val, (mV ? "mV" : "dac units")));
// set & get
if ((val == GET_FLAG) || (Server_VerifyLock() == OK)) {
retval = validateAndSetDac(ind, val, mV);
}
return Server_SendResult(file_des, INT32, &retval, sizeof(retval));
}
@ -1731,6 +1734,7 @@ int acquire(int blocking, int file_des) {
"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,
@ -1773,30 +1777,24 @@ void *start_state_machine(void *arg) {
if (scanTrimbits) {
LOG(logINFOBLUE,
("Trimbits scan %d/%d: [%d]\n", i, times, scanSteps[i]));
#if !defined(EIGERD) && !defined(MYTHEN3D)
ret = FAIL;
sprintf(mess, "trimbit scan not implemented for this "
"detector!\n");
LOG(logERROR, (mess));
sharedMemory_setScanStatus(ERROR);
break;
#else
setAllTrimbits(scanSteps[i]);
#endif
validateAndSetAllTrimbits(scanSteps[i]);
if (ret == FAIL) {
sprintf(scanErrMessage, "Cannot scan trimbit %d. ",
scanSteps[i]);
strcat(scanErrMessage, mess);
sharedMemory_setScanStatus(ERROR);
break;
}
}
// dac scan
else {
LOG(logINFOBLUE, ("Dac [%d] scan %d/%d: [%d]\n", scanDac, i,
times, scanSteps[i]));
setDAC(scanDac, scanSteps[i], 0);
int retval = getDAC(scanDac, 0);
if (abs(retval - scanSteps[i]) > 5) {
ret = FAIL;
sprintf(mess,
"Could not scan. Setting dac %d : wrote %d but "
"read %d\n",
scanDac, scanSteps[i], scanSteps[i]);
LOG(logERROR, (mess));
LOG(logINFOBLUE, ("Dac [%d] scan %d/%d: [%d]\n",
scanGlobalIndex, i, times, scanSteps[i]));
validateAndSetDac(scanGlobalIndex, scanSteps[i], 0);
if (ret == FAIL) {
sprintf(scanErrMessage, "Cannot scan dac %d at %d. ",
scanGlobalIndex, scanSteps[i]);
strcat(scanErrMessage, mess);
sharedMemory_setScanStatus(ERROR);
break;
}
@ -1823,6 +1821,8 @@ void *start_state_machine(void *arg) {
#endif
LOG(logERROR, (mess));
if (scan) {
sprintf(scanErrMessage, "Cannot scan at %d. ", scanSteps[i]);
strcat(scanErrMessage, mess);
sharedMemory_setScanStatus(ERROR);
}
break;
@ -1830,10 +1830,16 @@ void *start_state_machine(void *arg) {
// blocking or scan
if (*blocking || times > 1) {
readFrame(&ret, mess);
if (ret == FAIL && scan) {
sprintf(scanErrMessage, "Cannot scan at %d. ", scanSteps[i]);
strcat(scanErrMessage, mess);
sharedMemory_setScanStatus(ERROR);
break;
}
}
}
// end of scan
if (scan) {
if (scan && sharedMemory_getScanStatus() != ERROR) {
sharedMemory_setScanStatus(IDLE);
}
return NULL;
@ -1917,7 +1923,9 @@ int set_num_frames(int file_des) {
if (arg != numScanSteps) {
ret = FAIL;
sprintf(mess,
"Could not set number of frames %lld. In scan mode, it is number of steps %d\n", (long long unsigned int)arg, numScanSteps);
"Could not set number of frames %lld. In scan mode, it "
"is number of steps %d\n",
(long long unsigned int)arg, numScanSteps);
LOG(logERROR, (mess));
}
} else {
@ -2860,6 +2868,40 @@ int enable_ten_giga(int file_des) {
return Server_SendResult(file_des, INT32, &retval, sizeof(retval));
}
int validateAndSetAllTrimbits(int arg) {
int retval = -1;
#if !defined(EIGERD) && !defined(MYTHEN3D)
functionNotImplemented();
#else
// set
if (arg >= 0) {
if (arg > MAX_TRIMBITS_VALUE) {
ret = FAIL;
sprintf(mess, "Cannot set all trimbits. Range: 0 - %d\n",
MAX_TRIMBITS_VALUE);
LOG(logERROR, (mess));
} else {
ret = setAllTrimbits(arg);
#ifdef EIGERD
// changes settings to undefined
if (getSettings() != UNDEFINED) {
setSettings(UNDEFINED);
LOG(logERROR,
("Settings has been changed to undefined (change all "
"trimbits)\n"));
}
#endif
}
}
// get
retval = getAllTrimbits();
LOG(logDEBUG1, ("All trimbits: %d\n", retval));
validate(arg, retval, "set all trimbits", DEC);
#endif
return retval;
}
int set_all_trimbits(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
@ -2870,32 +2912,10 @@ int set_all_trimbits(int file_des) {
return printSocketReadError();
LOG(logDEBUG1, ("Set all trmbits to %d\n", arg));
#if !defined(EIGERD) && !defined(MYTHEN3D)
functionNotImplemented();
#else
// set
if (arg >= 0 && Server_VerifyLock() == OK) {
if (arg > MAX_TRIMBITS_VALUE) {
ret = FAIL;
sprintf(mess, "Cannot set all trimbits. Range: 0 - %d\n",
MAX_TRIMBITS_VALUE);
LOG(logERROR, (mess));
} else {
ret = setAllTrimbits(arg);
#ifdef EIGERD
// changes settings to undefined
setSettings(UNDEFINED);
LOG(logERROR, ("Settings has been changed to undefined (change all "
"trimbits)\n"));
#endif
}
if ((arg >= 0 && Server_VerifyLock() == OK) || arg < 0) {
retval = validateAndSetAllTrimbits(arg);
}
// get
retval = getAllTrimbits();
LOG(logDEBUG1, ("All trimbits: %d\n", retval));
validate(arg, retval, "set all trimbits", DEC);
#endif
return Server_SendResult(file_des, INT32, &retval, sizeof(retval));
}
@ -4816,7 +4836,8 @@ int set_detector_position(int file_des) {
int check_detector_idle() {
enum runStatus status = getRunStatus();
if (status != IDLE && status != RUN_FINISHED && status != STOPPED) {
if (status != IDLE && status != RUN_FINISHED && status != STOPPED &&
status != ERROR) {
ret = FAIL;
sprintf(mess,
"Cannot configure mac when detector is not idle. Detector at "
@ -7562,120 +7583,21 @@ int set_scan(int file_des) {
sprintf(mess, "Invalid scan parameters\n");
LOG(logERROR, (mess));
} else {
// trimbit scan
if (index == TRIMBIT_SCAN) {
#if !defined(EIGERD) && !defined(MYTHEN3D)
ret = FAIL;
sprintf(mess,
"Cannot enable trimbit scan. Not implemented for "
"this detector\n");
LOG(logERROR, (mess));
#else
if (start < 0 || start > MAX_TRIMBITS_VALUE || stop < 0 ||
stop > MAX_TRIMBITS_VALUE) {
ret = FAIL;
sprintf(mess, "Invalid trimbits scan values\n");
LOG(logERROR, (mess));
}
// validated
else {
LOG(logINFOBLUE, ("Trimbit scan enabled\n"));
scanTrimbits = 1;
scanGlobalIndex = index;
scanSettleTime_ns = dacTime;
#ifdef EIGERD
// changing trimbits, settings to undefined
setSettings(UNDEFINED);
LOG(logERROR, ("Settings has been changed to undefined "
"(change all "
"trimbits)\n"));
#endif
}
#endif
LOG(logINFOBLUE, ("Trimbit scan enabled\n"));
scanTrimbits = 1;
scanGlobalIndex = index;
scanSettleTime_ns = dacTime;
}
// dac scan
else {
if (start < 0 || start > getMaxDacSteps() || stop < 0 ||
stop > getMaxDacSteps()) {
ret = FAIL;
sprintf(mess, "Invalid dac scan values\n");
LOG(logERROR, (mess));
}
#if defined(CHIPTESTBOARDD) || defined(MOENCHD)
else if (checkVLimitDacCompliant(start) == FAIL ||
checkVLimitDacCompliant(stop) == FAIL) {
ret = FAIL;
sprintf(mess,
"Invalid scan dac values."
"Exceeds voltage limit %d.\n",
getVLimit());
LOG(logERROR, (mess));
}
#endif
else {
// validate allowed dac scans
switch (index) {
case HIGH_VOLTAGE:
#ifdef EIGERD
case IO_DELAY:
#elif CHIPTESTBOARDD
case ADC_VPP:
case V_POWER_A:
case V_POWER_B:
case V_POWER_C:
case V_POWER_D:
case V_POWER_IO:
case V_POWER_CHIP:
case V_LIMIT:
#elif MOENCHD
case ADC_VPP:
case V_LIMIT:
#endif
modeNotImplemented("Scan Dac Index", index);
break;
default:
break;
}
// validate dac according to detector type
if (ret == OK) {
enum DACINDEX dac = getDACIndex(index);
if (ret == FAIL) {
sprintf(mess,
"Cannot enable scan. Dac index %d not "
"implemented for "
"this detector for scanning\n",
(int)index);
LOG(logERROR, (mess));
}
// validated
else {
LOG(logINFOBLUE,
("Dac [%d] scan enabled\n", scanDac));
scanTrimbits = 0;
scanGlobalIndex = index;
scanSettleTime_ns = dacTime;
scanDac = dac;
#ifdef EIGERD
// changing dac changes settings to undefined
switch (scanDac) {
case E_VCMP_LL:
case E_VCMP_LR:
case E_VCMP_RL:
case E_VCMP_RR:
case E_VRPREAMP:
case E_VCP:
setSettings(UNDEFINED);
LOG(logERROR, ("Settings has been changed "
"to undefined (changed "
"specific dacs)\n"));
break;
default:
break;
}
#endif
}
}
getDACIndex(index);
if (ret == OK) {
LOG(logINFOBLUE, ("Dac [%d] scan enabled\n", index));
scanTrimbits = 0;
scanGlobalIndex = index;
scanSettleTime_ns = dacTime;
}
}
}
@ -7709,3 +7631,18 @@ int set_scan(int file_des) {
}
return Server_SendResult(file_des, INT64, &retval, sizeof(retval));
}
int get_scan_error_message(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
char retvals[MAX_STR_LENGTH];
memset(retvals, 0, MAX_STR_LENGTH);
LOG(logDEBUG1, ("Getting scan error message\n"));
// get only
strcpy(retvals, scanErrMessage);
LOG(logDEBUG1, ("scan retval err message: [%s]\n", retvals));
return Server_SendResult(file_des, OTHER, retvals, sizeof(retvals));
}

View File

@ -401,6 +401,10 @@ class Detector {
* receiver. Disabling scan sets number of frames to 1 */
void setScan(const defs::scanParameters t);
/** gets scan error message in case of error during scan in case of non
* blocking acquisition (startDetector, not acquire) */
Result<std::string> getScanErrorMessage(Positions pos = {}) const;
/**************************************************
* *
* Network Configuration (Detector<->Receiver) *

View File

@ -1039,7 +1039,8 @@ std::string CmdProxy::Scan(int action) {
throw sls::RuntimeError("Unknown action");
}
return os.str();
} // namespace sls
}
/* Network Configuration (Detector<->Receiver) */
std::string CmdProxy::UDPDestinationIP(int action) {

View File

@ -738,6 +738,7 @@ class CmdProxy {
{"startingfnum", &CmdProxy::startingfnum},
{"trigger", &CmdProxy::trigger},
{"scan", &CmdProxy::Scan},
{"scanerrmsg", &CmdProxy::scanerrmsg},
/* Network Configuration (Detector<->Receiver) */
{"numinterfaces", &CmdProxy::numinterfaces},
@ -1554,6 +1555,10 @@ class CmdProxy {
trigger, sendSoftwareTrigger,
"\n\t[Eiger] Sends software trigger signal to detector.");
GET_COMMAND(scanerrmsg, getScanErrorMessage,
"\n\tGets Scan error message if scan ended in error for non "
"blocking acquisitions.");
/* Network Configuration (Detector<->Receiver) */
INTEGER_COMMAND(

View File

@ -567,6 +567,10 @@ void Detector::setScan(const defs::scanParameters t) {
pimpl->Parallel(&Module::setScan, {}, t);
}
Result<std::string> Detector::getScanErrorMessage(Positions pos) const {
return pimpl->Parallel(&Module::getScanErrorMessage, pos);
}
// Network Configuration (Detector<->Receiver)
Result<int> Detector::getNumberofUDPInterfaces(Positions pos) const {

View File

@ -459,6 +459,12 @@ void Module::setScan(const defs::scanParameters t) {
setNumberOfFrames(retval);
}
std::string Module::getScanErrorMessage() {
char retval[MAX_STR_LENGTH]{};
sendToDetector(F_GET_SCAN_ERROR_MESSAGE, nullptr, retval);
return retval;
}
// Network Configuration (Detector<->Receiver)
int Module::getNumberofUDPInterfacesFromShm() {

View File

@ -168,6 +168,7 @@ class Module : public virtual slsDetectorDefs {
void sendSoftwareTrigger();
defs::scanParameters getScan();
void setScan(const defs::scanParameters t);
std::string getScanErrorMessage();
/**************************************************
* *

View File

@ -465,11 +465,11 @@ typedef struct {
/** disable scan */
scanParameters()
: enable(0), dacInd(DAC_0), startOffset(0), stopOffset(0),
stepSize(0), dacSettleTime_ns{10000} {}
stepSize(0), dacSettleTime_ns{0} {}
/** enable scan */
scanParameters(
dacIndex dac, int start, int stop, int step,
std::chrono::nanoseconds t = std::chrono::nanoseconds{10000})
std::chrono::nanoseconds t = std::chrono::milliseconds{1})
: enable(1), dacInd(dac), startOffset(start), stopOffset(stop),
stepSize(step) {
dacSettleTime_ns = t.count();

View File

@ -202,6 +202,7 @@ enum detFuncs {
F_SET_PATTERN,
F_GET_SCAN,
F_SET_SCAN,
F_GET_SCAN_ERROR_MESSAGE,
NUM_DET_FUNCTIONS,
RECEIVER_ENUM_START = 256, /**< detector function should not exceed this
@ -502,6 +503,7 @@ const char* getFunctionNameFromEnum(enum detFuncs func) {
case F_SET_PATTERN: return "F_SET_PATTERN";
case F_GET_SCAN: return "F_GET_SCAN";
case F_SET_SCAN: return "F_SET_SCAN";
case F_GET_SCAN_ERROR_MESSAGE: return "F_GET_SCAN_ERROR_MESSAGE";
case NUM_DET_FUNCTIONS: return "NUM_DET_FUNCTIONS";
case RECEIVER_ENUM_START: return "RECEIVER_ENUM_START";

View File

@ -491,6 +491,10 @@ std::string ToString(const defs::dacIndex s) {
return std::string("ibias_sfp");
case defs::TRIMBIT_SCAN:
return std::string("trimbit_scan");
case defs::HIGH_VOLTAGE:
return std::string("vhighvoltage");
case defs::IO_DELAY:
return std::string("iodelay");
default:
return std::string("Unknown");
}
@ -846,6 +850,11 @@ template <> defs::dacIndex StringTo(const std::string &s) {
return defs::IBIAS_SFP;
if (s == "trimbit_scan")
return defs::TRIMBIT_SCAN;
if (s == "vhighvoltage")
return defs::HIGH_VOLTAGE;
if (s == "iodelay")
return defs::IO_DELAY;
throw sls::RuntimeError("Unknown dac Index " + s);
}