mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-25 07:40:03 +02:00
Merge branch 'developer' into jf_singlemodule
This commit is contained in:
commit
31f6a6de61
Binary file not shown.
@ -395,11 +395,13 @@ int Feb_Control_ReceiveHighVoltage(unsigned int *value) {
|
|||||||
|
|
||||||
// normal
|
// normal
|
||||||
if (Feb_Control_normal) {
|
if (Feb_Control_normal) {
|
||||||
|
if (readParameterFromFile(NORMAL_HIGHVOLTAGE_INPUTPORT, "high voltage",
|
||||||
if (readADCFromFile(NORMAL_HIGHVOLTAGE_INPUTPORT, value) == FAIL) {
|
value) == FAIL) {
|
||||||
LOG(logERROR, ("Could not get high voltage\n"));
|
LOG(logERROR, ("Could not get high voltage\n"));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
*value /= 10;
|
||||||
|
LOG(logINFO, ("High Voltage: %d\n", (*value)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 9m
|
// 9m
|
||||||
|
Binary file not shown.
Binary file not shown.
@ -53,8 +53,8 @@ enum detectorSettings thisSettings = UNINITIALIZED;
|
|||||||
int32_t clkPhase[NUM_CLOCKS] = {};
|
int32_t clkPhase[NUM_CLOCKS] = {};
|
||||||
uint32_t clkDivider[NUM_CLOCKS] = {};
|
uint32_t clkDivider[NUM_CLOCKS] = {};
|
||||||
double systemFrequency = 0;
|
double systemFrequency = 0;
|
||||||
int highvoltage = 0;
|
|
||||||
int dacValues[NDAC] = {};
|
int dacValues[NDAC] = {};
|
||||||
|
int startupPowerChipConfigDone = 0;
|
||||||
int onChipdacValues[ONCHIP_NDAC][NCHIP] = {};
|
int onChipdacValues[ONCHIP_NDAC][NCHIP] = {};
|
||||||
int defaultDacValues[NDAC] = {};
|
int defaultDacValues[NDAC] = {};
|
||||||
int hardCodedDefaultDacValues[NDAC] = {};
|
int hardCodedDefaultDacValues[NDAC] = {};
|
||||||
@ -74,6 +74,7 @@ int64_t burstPeriodReg = 0;
|
|||||||
int filterResistor = 0;
|
int filterResistor = 0;
|
||||||
int cdsGain = 0;
|
int cdsGain = 0;
|
||||||
int detPos[2] = {};
|
int detPos[2] = {};
|
||||||
|
int chipConfigured = 0;
|
||||||
|
|
||||||
int isInitCheckDone() { return initCheckDone; }
|
int isInitCheckDone() { return initCheckDone; }
|
||||||
|
|
||||||
@ -428,9 +429,9 @@ void setupDetector() {
|
|||||||
systemFrequency = INT_SYSTEM_C0_FREQUENCY;
|
systemFrequency = INT_SYSTEM_C0_FREQUENCY;
|
||||||
detPos[0] = 0;
|
detPos[0] = 0;
|
||||||
detPos[1] = 0;
|
detPos[1] = 0;
|
||||||
|
chipConfigured = 0;
|
||||||
|
|
||||||
thisSettings = UNINITIALIZED;
|
thisSettings = UNINITIALIZED;
|
||||||
highvoltage = 0;
|
|
||||||
injectedChannelsOffset = 0;
|
injectedChannelsOffset = 0;
|
||||||
injectedChannelsIncrement = 0;
|
injectedChannelsIncrement = 0;
|
||||||
burstMode = BURST_INTERNAL;
|
burstMode = BURST_INTERNAL;
|
||||||
@ -442,6 +443,7 @@ void setupDetector() {
|
|||||||
burstPeriodReg = 0;
|
burstPeriodReg = 0;
|
||||||
filterResistor = 0;
|
filterResistor = 0;
|
||||||
cdsGain = 0;
|
cdsGain = 0;
|
||||||
|
startupPowerChipConfigDone = 0;
|
||||||
memset(clkPhase, 0, sizeof(clkPhase));
|
memset(clkPhase, 0, sizeof(clkPhase));
|
||||||
memset(dacValues, 0, sizeof(dacValues));
|
memset(dacValues, 0, sizeof(dacValues));
|
||||||
for (int i = 0; i < NDAC; ++i) {
|
for (int i = 0; i < NDAC; ++i) {
|
||||||
@ -478,7 +480,12 @@ void setupDetector() {
|
|||||||
setTimingSource(DEFAULT_TIMING_SOURCE);
|
setTimingSource(DEFAULT_TIMING_SOURCE);
|
||||||
|
|
||||||
// Default values
|
// Default values
|
||||||
setHighVoltage(DEFAULT_HIGH_VOLTAGE);
|
initError = setHighVoltage(DEFAULT_HIGH_VOLTAGE);
|
||||||
|
if (initError == FAIL) {
|
||||||
|
sprintf(initErrorMessage, "Could not set high voltage to %d\n",
|
||||||
|
DEFAULT_HIGH_VOLTAGE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// check module type attached if not in debug mode
|
// check module type attached if not in debug mode
|
||||||
if (initError == FAIL)
|
if (initError == FAIL)
|
||||||
@ -493,7 +500,9 @@ void setupDetector() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// power on chip
|
// power on chip
|
||||||
powerChip(1);
|
initError = powerChip(1, initErrorMessage);
|
||||||
|
if (initError == FAIL)
|
||||||
|
return;
|
||||||
|
|
||||||
setASICDefaults();
|
setASICDefaults();
|
||||||
|
|
||||||
@ -975,6 +984,9 @@ int readConfigFile() {
|
|||||||
// inform FPGA that onchip dacs will be configured soon
|
// inform FPGA that onchip dacs will be configured soon
|
||||||
LOG(logINFO, ("Setting configuration done bit\n"));
|
LOG(logINFO, ("Setting configuration done bit\n"));
|
||||||
bus_w(ASIC_CONFIG_REG, bus_r(ASIC_CONFIG_REG) | ASIC_CONFIG_DONE_MSK);
|
bus_w(ASIC_CONFIG_REG, bus_r(ASIC_CONFIG_REG) | ASIC_CONFIG_DONE_MSK);
|
||||||
|
|
||||||
|
// to inform powerchip config parameters are set
|
||||||
|
startupPowerChipConfigDone = 1;
|
||||||
}
|
}
|
||||||
return initError;
|
return initError;
|
||||||
}
|
}
|
||||||
@ -1529,27 +1541,53 @@ int getMaxDacSteps() { return LTC2620_D_GetMaxNumSteps(); }
|
|||||||
|
|
||||||
int getADC(enum ADCINDEX ind, int *value) {
|
int getADC(enum ADCINDEX ind, int *value) {
|
||||||
LOG(logDEBUG1, ("Reading FPGA temperature...\n"));
|
LOG(logDEBUG1, ("Reading FPGA temperature...\n"));
|
||||||
if (readADCFromFile(TEMPERATURE_FILE_NAME, value) == FAIL) {
|
if (readParameterFromFile(TEMPERATURE_FILE_NAME, "temperature", value) ==
|
||||||
|
FAIL) {
|
||||||
LOG(logERROR, ("Could not get temperature\n"));
|
LOG(logERROR, ("Could not get temperature\n"));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
LOG(logINFO, ("Temperature: %.2f °C\n", (double)(*value) / 1000.00));
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int setHighVoltage(int val) {
|
int setHighVoltage(int val) {
|
||||||
if (val > HV_SOFT_MAX_VOLTAGE) {
|
if (val > HV_SOFT_MAX_VOLTAGE) {
|
||||||
val = HV_SOFT_MAX_VOLTAGE;
|
LOG(logERROR, ("Invalid high voltage: %d V\n", val));
|
||||||
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// setting hv
|
|
||||||
if (val >= 0) {
|
|
||||||
LOG(logINFO, ("Setting High voltage: %d V\n", val));
|
LOG(logINFO, ("Setting High voltage: %d V\n", val));
|
||||||
if (DAC6571_Set(val) == OK)
|
int waitTime = WAIT_HIGH_VOLTAGE_SETTLE_TIME_S;
|
||||||
highvoltage = val;
|
|
||||||
|
// get current high voltage
|
||||||
|
int prevHighVoltage = 0;
|
||||||
|
// at startup (initCheck not done: to not wait 10s assuming hv = 0
|
||||||
|
// otherwise as below, always check current hv to wait 10s if powering off
|
||||||
|
if (initCheckDone) {
|
||||||
|
if (getHighVoltage(&prevHighVoltage) == FAIL) {
|
||||||
|
LOG(logERROR, ("Could not get current high voltage to determine if "
|
||||||
|
"%d s wait is required\n",
|
||||||
|
waitTime));
|
||||||
|
return FAIL;
|
||||||
}
|
}
|
||||||
return highvoltage;
|
}
|
||||||
|
|
||||||
|
int ret = DAC6571_Set(val);
|
||||||
|
|
||||||
|
// only when powering off (from non zero value), wait 10s
|
||||||
|
if (ret == OK) {
|
||||||
|
if (prevHighVoltage > 0 && val == 0) {
|
||||||
|
LOG(logINFO,
|
||||||
|
("\tSwitching off high voltage requires %d s...\n", waitTime));
|
||||||
|
sleep(waitTime);
|
||||||
|
LOG(logINFO, ("\tAssuming high voltage switched off\n"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getHighVoltage(int *retval) { return DAC6571_Get(retval); }
|
||||||
|
|
||||||
/* parameters - timing */
|
/* parameters - timing */
|
||||||
|
|
||||||
int setMaster(enum MASTERINDEX m) {
|
int setMaster(enum MASTERINDEX m) {
|
||||||
@ -2214,20 +2252,101 @@ int checkDetectorType(char *mess) {
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int powerChip(int on) {
|
int powerChip(int on, char *mess) {
|
||||||
if (on != -1) {
|
|
||||||
if (on) {
|
if (on) {
|
||||||
LOG(logINFO, ("Powering chip: on\n"));
|
LOG(logINFO, ("Powering chip: on\n"));
|
||||||
bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_PWR_CHIP_MSK);
|
bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_PWR_CHIP_MSK);
|
||||||
|
// only if power chip config done, configure chip with current set up
|
||||||
|
if (startupPowerChipConfigDone == 1 && configureChip(mess) == FAIL)
|
||||||
|
return FAIL;
|
||||||
} else {
|
} else {
|
||||||
|
// throw if high voltage on
|
||||||
|
int highVoltage = 0;
|
||||||
|
if (getHighVoltage(&highVoltage) == FAIL) {
|
||||||
|
sprintf(mess, "Could not get high voltage status to do a safety "
|
||||||
|
"check first\n");
|
||||||
|
LOG(logERROR, (mess));
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
if (highVoltage > 0) {
|
||||||
|
sprintf(mess, "High voltage is on. Turn off high voltage first\n");
|
||||||
|
LOG(logERROR, (mess));
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
LOG(logINFO, ("Powering chip: off\n"));
|
LOG(logINFO, ("Powering chip: off\n"));
|
||||||
bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_PWR_CHIP_MSK);
|
bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_PWR_CHIP_MSK);
|
||||||
|
chipConfigured = 0;
|
||||||
}
|
}
|
||||||
}
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getPowerChip() {
|
||||||
return ((bus_r(CONTROL_REG) & CONTROL_PWR_CHIP_MSK) >>
|
return ((bus_r(CONTROL_REG) & CONTROL_PWR_CHIP_MSK) >>
|
||||||
CONTROL_PWR_CHIP_OFST);
|
CONTROL_PWR_CHIP_OFST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int isChipConfigured() { return chipConfigured; }
|
||||||
|
|
||||||
|
int configureChip(char *mess) {
|
||||||
|
LOG(logINFOBLUE, ("\tConfiguring chip\n"));
|
||||||
|
|
||||||
|
// on chip dacs
|
||||||
|
for (int idac = 0; idac != ONCHIP_NDAC; ++idac) {
|
||||||
|
// ignore unused dacs
|
||||||
|
if (idac == (int)G2_VCHIP_UNUSED)
|
||||||
|
continue;
|
||||||
|
for (int ichip = 0; ichip != NCHIP; ++ichip) {
|
||||||
|
if (onChipdacValues[idac][ichip] == -1) {
|
||||||
|
sprintf(mess, "On chip DAC [%d] value not set for chip %d\n",
|
||||||
|
idac, ichip);
|
||||||
|
LOG(logERROR, (mess));
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
if (setOnChipDAC(idac, ichip, onChipdacValues[idac][ichip]) ==
|
||||||
|
FAIL) {
|
||||||
|
sprintf(mess, "Could not set on chip DAC for chip %d\n", ichip);
|
||||||
|
LOG(logERROR, (mess));
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// adc configuration
|
||||||
|
for (int ichip = 0; ichip != NCHIP; ++ichip) {
|
||||||
|
for (int iadc = 0; iadc != NADC; ++iadc) {
|
||||||
|
if (setADCConfiguration(ichip, iadc,
|
||||||
|
adcConfiguration[ichip][iadc]) == FAIL) {
|
||||||
|
sprintf(mess, "Could not set ADC configuration for chip %d\n",
|
||||||
|
ichip);
|
||||||
|
LOG(logERROR, (mess));
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// veto reference
|
||||||
|
for (int ichip = 0; ichip != NCHIP; ++ichip) {
|
||||||
|
if (configureASICVetoReference(ichip, vetoGainIndices[ichip],
|
||||||
|
vetoReference[ichip]) == FAIL) {
|
||||||
|
sprintf(mess, "Could not configure veto reference for chip %d\n",
|
||||||
|
ichip);
|
||||||
|
LOG(logERROR, (mess));
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// asic global settings (burst mode, cds gain, filter resistor)
|
||||||
|
if (configureASICGlobalSettings() == FAIL) {
|
||||||
|
sprintf(mess, "Could not configure asic global settings\n");
|
||||||
|
LOG(logERROR, (mess));
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG(logINFOBLUE, ("\tChip configured\n"));
|
||||||
|
chipConfigured = 1;
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
void setDBITPipeline(int val) {
|
void setDBITPipeline(int val) {
|
||||||
if (val < 0) {
|
if (val < 0) {
|
||||||
return;
|
return;
|
||||||
|
@ -51,6 +51,8 @@
|
|||||||
#define TYPE_NO_MODULE_STARTING_VAL (800)
|
#define TYPE_NO_MODULE_STARTING_VAL (800)
|
||||||
#define INITIAL_STARTUP_WAIT (1 * 1000 * 1000)
|
#define INITIAL_STARTUP_WAIT (1 * 1000 * 1000)
|
||||||
|
|
||||||
|
#define WAIT_HIGH_VOLTAGE_SETTLE_TIME_S (10) // 10s
|
||||||
|
|
||||||
/** Default Parameters */
|
/** Default Parameters */
|
||||||
#define DEFAULT_BURST_MODE (BURST_INTERNAL)
|
#define DEFAULT_BURST_MODE (BURST_INTERNAL)
|
||||||
#define DEFAULT_FILTER_RESISTOR (0)
|
#define DEFAULT_FILTER_RESISTOR (0)
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -63,7 +63,6 @@ int32_t clkPhase[NUM_CLOCKS] = {};
|
|||||||
uint32_t clkDivider[NUM_CLOCKS] = {};
|
uint32_t clkDivider[NUM_CLOCKS] = {};
|
||||||
|
|
||||||
enum TLogLevel trimmingPrint = logINFO;
|
enum TLogLevel trimmingPrint = logINFO;
|
||||||
int highvoltage = 0;
|
|
||||||
int detPos[2] = {};
|
int detPos[2] = {};
|
||||||
int64_t exptimeReg[NCOUNTERS] = {0, 0, 0};
|
int64_t exptimeReg[NCOUNTERS] = {0, 0, 0};
|
||||||
int64_t gateDelayReg[NCOUNTERS] = {0, 0, 0};
|
int64_t gateDelayReg[NCOUNTERS] = {0, 0, 0};
|
||||||
@ -462,7 +461,6 @@ void setupDetector() {
|
|||||||
clkDivider[SYSTEM_C1] = DEFAULT_SYSTEM_C1;
|
clkDivider[SYSTEM_C1] = DEFAULT_SYSTEM_C1;
|
||||||
clkDivider[SYSTEM_C2] = DEFAULT_SYSTEM_C2;
|
clkDivider[SYSTEM_C2] = DEFAULT_SYSTEM_C2;
|
||||||
|
|
||||||
highvoltage = 0;
|
|
||||||
trimmingPrint = logINFO;
|
trimmingPrint = logINFO;
|
||||||
for (int i = 0; i < NUM_CLOCKS; ++i) {
|
for (int i = 0; i < NUM_CLOCKS; ++i) {
|
||||||
clkPhase[i] = 0;
|
clkPhase[i] = 0;
|
||||||
@ -496,7 +494,13 @@ void setupDetector() {
|
|||||||
cleanFifos();
|
cleanFifos();
|
||||||
|
|
||||||
// defaults
|
// defaults
|
||||||
setHighVoltage(DEFAULT_HIGH_VOLTAGE);
|
initError = setHighVoltage(DEFAULT_HIGH_VOLTAGE);
|
||||||
|
if (initError == FAIL) {
|
||||||
|
sprintf(initErrorMessage, "Could not set high voltage to %d\n",
|
||||||
|
DEFAULT_HIGH_VOLTAGE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
setASICDefaults();
|
setASICDefaults();
|
||||||
setADIFDefaults();
|
setADIFDefaults();
|
||||||
|
|
||||||
@ -1675,10 +1679,12 @@ int getMaxDacSteps() { return LTC2620_D_GetMaxNumSteps(); }
|
|||||||
|
|
||||||
int getADC(enum ADCINDEX ind, int *value) {
|
int getADC(enum ADCINDEX ind, int *value) {
|
||||||
LOG(logDEBUG1, ("Reading FPGA temperature...\n"));
|
LOG(logDEBUG1, ("Reading FPGA temperature...\n"));
|
||||||
if (readADCFromFile(TEMPERATURE_FILE_NAME, value) == FAIL) {
|
if (readParameterFromFile(TEMPERATURE_FILE_NAME, "temperature", value) ==
|
||||||
|
FAIL) {
|
||||||
LOG(logERROR, ("Could not get temperature\n"));
|
LOG(logERROR, ("Could not get temperature\n"));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
LOG(logINFO, ("Temperature: %.2f °C\n", (double)(*value) / 1000.00));
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1688,15 +1694,12 @@ int setHighVoltage(int val) {
|
|||||||
val = HV_SOFT_MAX_VOLTAGE;
|
val = HV_SOFT_MAX_VOLTAGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// setting hv
|
|
||||||
if (val >= 0) {
|
|
||||||
LOG(logINFO, ("Setting High voltage: %d V\n", val));
|
LOG(logINFO, ("Setting High voltage: %d V\n", val));
|
||||||
if (DAC6571_Set(val) == OK)
|
return DAC6571_Set(val);
|
||||||
highvoltage = val;
|
|
||||||
}
|
|
||||||
return highvoltage;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getHighVoltage(int *retval) { return DAC6571_Get(retval); }
|
||||||
|
|
||||||
/* parameters - timing */
|
/* parameters - timing */
|
||||||
|
|
||||||
int isMaster(int *retval) {
|
int isMaster(int *retval) {
|
||||||
|
@ -4,16 +4,6 @@
|
|||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
/**
|
|
||||||
* Set Defines
|
|
||||||
* @param hardMaxV maximum hardware limit
|
|
||||||
* @param driverfname driver file name
|
|
||||||
*/
|
|
||||||
void DAC6571_SetDefines(int hardMaxV, char *driverfname);
|
void DAC6571_SetDefines(int hardMaxV, char *driverfname);
|
||||||
|
|
||||||
/**
|
|
||||||
* Set value
|
|
||||||
* @param val value to set
|
|
||||||
* @return OK or FAIL
|
|
||||||
*/
|
|
||||||
int DAC6571_Set(int val);
|
int DAC6571_Set(int val);
|
||||||
|
int DAC6571_Get(int *retval);
|
||||||
|
@ -69,4 +69,4 @@ int deleteFile(char *mess, char *fname, char *errorPrefix);
|
|||||||
|
|
||||||
int deleteOldServers(char *mess, char *newServerPath, char *errorPrefix);
|
int deleteOldServers(char *mess, char *newServerPath, char *errorPrefix);
|
||||||
|
|
||||||
int readADCFromFile(char *fname, int *value);
|
int readParameterFromFile(char *fname, char *parameterName, int *value);
|
@ -442,6 +442,9 @@ int getSlowADC(int ichan, int *retval);
|
|||||||
int getTemperature(int *retval);
|
int getTemperature(int *retval);
|
||||||
#else
|
#else
|
||||||
int setHighVoltage(int val);
|
int setHighVoltage(int val);
|
||||||
|
#if defined(MYTHEN3D) || defined(GOTTHARD2D)
|
||||||
|
int getHighVoltage(int *retval);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// parameters - timing, extsig
|
// parameters - timing, extsig
|
||||||
@ -650,7 +653,10 @@ int getClockDivider(enum CLKINDEX ind);
|
|||||||
|
|
||||||
#elif GOTTHARD2D
|
#elif GOTTHARD2D
|
||||||
int checkDetectorType(char *mess);
|
int checkDetectorType(char *mess);
|
||||||
int powerChip(int on);
|
int powerChip(int on, char *mess);
|
||||||
|
int getPowerChip();
|
||||||
|
int isChipConfigured();
|
||||||
|
int configureChip(char *mess);
|
||||||
void setDBITPipeline(int val);
|
void setDBITPipeline(int val);
|
||||||
int getDBITPipeline();
|
int getDBITPipeline();
|
||||||
int setPhase(enum CLKINDEX ind, int val, int degrees);
|
int setPhase(enum CLKINDEX ind, int val, int degrees);
|
||||||
|
@ -15,12 +15,19 @@
|
|||||||
int DAC6571_HardMaxVoltage = 0;
|
int DAC6571_HardMaxVoltage = 0;
|
||||||
char DAC6571_DriverFileName[MAX_STR_LENGTH];
|
char DAC6571_DriverFileName[MAX_STR_LENGTH];
|
||||||
|
|
||||||
|
#ifdef VIRTUAL
|
||||||
|
int highvoltage = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
void DAC6571_SetDefines(int hardMaxV, char *driverfname) {
|
void DAC6571_SetDefines(int hardMaxV, char *driverfname) {
|
||||||
LOG(logINFOBLUE, ("Configuring High Voltage to %s (hard max: %dV)\n",
|
LOG(logINFOBLUE, ("Configuring High Voltage to %s (hard max: %dV)\n",
|
||||||
driverfname, hardMaxV));
|
driverfname, hardMaxV));
|
||||||
DAC6571_HardMaxVoltage = hardMaxV;
|
DAC6571_HardMaxVoltage = hardMaxV;
|
||||||
memset(DAC6571_DriverFileName, 0, MAX_STR_LENGTH);
|
memset(DAC6571_DriverFileName, 0, MAX_STR_LENGTH);
|
||||||
strcpy(DAC6571_DriverFileName, driverfname);
|
strcpy(DAC6571_DriverFileName, driverfname);
|
||||||
|
#ifdef VIRTUAL
|
||||||
|
highvoltage = 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int DAC6571_Set(int val) {
|
int DAC6571_Set(int val) {
|
||||||
@ -31,11 +38,58 @@ int DAC6571_Set(int val) {
|
|||||||
int dacvalue = 0;
|
int dacvalue = 0;
|
||||||
|
|
||||||
// convert value
|
// convert value
|
||||||
ConvertToDifferentRange(0, DAC6571_HardMaxVoltage, DAC6571_MIN_DAC_VAL,
|
if (ConvertToDifferentRange(0, DAC6571_HardMaxVoltage, DAC6571_MIN_DAC_VAL,
|
||||||
DAC6571_MAX_DAC_VAL, val, &dacvalue);
|
DAC6571_MAX_DAC_VAL, val, &dacvalue) == FAIL) {
|
||||||
|
LOG(logERROR,
|
||||||
|
("Could not convert %d high voltage to a valid dac value\n", val));
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
LOG(logINFO, ("\t%dV (dacval %d)\n", val, dacvalue));
|
LOG(logINFO, ("\t%dV (dacval %d)\n", val, dacvalue));
|
||||||
|
|
||||||
|
#ifdef VIRTUAL
|
||||||
|
highvoltage = dacvalue;
|
||||||
|
#else
|
||||||
|
// open file
|
||||||
|
FILE *fd = fopen(DAC6571_DriverFileName, "w");
|
||||||
|
if (fd == NULL) {
|
||||||
|
LOG(logERROR,
|
||||||
|
("Could not open file %s for writing to set high voltage\n",
|
||||||
|
DAC6571_DriverFileName));
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
// convert to string, add 0 and write to file
|
||||||
|
fprintf(fd, "%d\n", dacvalue);
|
||||||
|
fclose(fd);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DAC6571_Get(int *retval) {
|
||||||
|
LOG(logDEBUG1, ("Getting high voltage\n"));
|
||||||
|
int dacvalue = 0;
|
||||||
|
|
||||||
|
#ifdef VIRTUAL
|
||||||
|
dacvalue = highvoltage;
|
||||||
|
#else
|
||||||
|
if (readParameterFromFile(DAC6571_DriverFileName, "high voltage",
|
||||||
|
&dacvalue) == FAIL) {
|
||||||
|
LOG(logERROR, ("Could not get high voltage\n"));
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// convert value
|
||||||
|
if (ConvertToDifferentRange(DAC6571_MIN_DAC_VAL, DAC6571_MAX_DAC_VAL, 0,
|
||||||
|
DAC6571_HardMaxVoltage, dacvalue,
|
||||||
|
retval) == FAIL) {
|
||||||
|
LOG(logERROR,
|
||||||
|
("Could not convert %d dac value to a valid high voltage\n",
|
||||||
|
dacvalue));
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
LOG(logINFO, ("\t%dV (dacval %d)\n", (*retval), dacvalue));
|
||||||
|
|
||||||
#ifndef VIRTUAL
|
#ifndef VIRTUAL
|
||||||
// open file
|
// open file
|
||||||
FILE *fd = fopen(DAC6571_DriverFileName, "w");
|
FILE *fd = fopen(DAC6571_DriverFileName, "w");
|
||||||
|
@ -727,8 +727,8 @@ int deleteOldServers(char *mess, char *newServerPath, char *errorPrefix) {
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int readADCFromFile(char *fname, int *value) {
|
int readParameterFromFile(char *fname, char *parameterName, int *value) {
|
||||||
LOG(logDEBUG1, ("fname:%s\n", fname));
|
LOG(logDEBUG1, ("fname:%s parameter:%s\n", fname, parameterName));
|
||||||
// open file
|
// open file
|
||||||
FILE *fd = fopen(fname, "r");
|
FILE *fd = fopen(fname, "r");
|
||||||
if (fd == NULL) {
|
if (fd == NULL) {
|
||||||
@ -752,20 +752,10 @@ int readADCFromFile(char *fname, int *value) {
|
|||||||
|
|
||||||
*value = -1;
|
*value = -1;
|
||||||
if (sscanf(line, "%d", value) != 1) {
|
if (sscanf(line, "%d", value) != 1) {
|
||||||
#ifdef XILINX_CHIPTESTBOARDD
|
LOG(logERROR, ("Could not scan %s from %s\n", parameterName, line));
|
||||||
LOG(logERROR, ("Could not scan adc from %s\n", line));
|
|
||||||
#else
|
|
||||||
LOG(logERROR, ("Could not scan temperature from %s\n", line));
|
|
||||||
#endif
|
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef EIGERD
|
|
||||||
*value /= 10;
|
|
||||||
#elif !defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
LOG(logINFO, ("Temperature: %.2f °C\n", (double)(*value) / 1000.00));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fclose(fd);
|
fclose(fd);
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
@ -1214,12 +1214,39 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) {
|
|||||||
// high voltage
|
// high voltage
|
||||||
#ifndef XILINX_CHIPTESTBOARDD
|
#ifndef XILINX_CHIPTESTBOARDD
|
||||||
case HIGH_VOLTAGE:
|
case HIGH_VOLTAGE:
|
||||||
|
|
||||||
|
#if defined(MYTHEN3D) || defined(GOTTHARD2D)
|
||||||
|
if ((val != -1 && val < 0) || (val > HV_SOFT_MAX_VOLTAGE)) {
|
||||||
|
ret = FAIL;
|
||||||
|
sprintf(mess, "Invalid Voltage. Valid range (0 - %d)\n",
|
||||||
|
HV_SOFT_MAX_VOLTAGE);
|
||||||
|
LOG(logERROR, (mess));
|
||||||
|
} else {
|
||||||
|
if (val >= 0) {
|
||||||
|
ret = setHighVoltage(val);
|
||||||
|
if (ret == FAIL) {
|
||||||
|
strcpy(mess, "Could not set high voltage.\n");
|
||||||
|
LOG(logERROR, (mess));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ret == OK) {
|
||||||
|
ret = getHighVoltage(&retval);
|
||||||
|
if (ret == FAIL) {
|
||||||
|
strcpy(mess, "Could not get high voltage.\n");
|
||||||
|
LOG(logERROR, (mess));
|
||||||
|
}
|
||||||
|
LOG(logDEBUG1, ("High Voltage: %d\n", retval));
|
||||||
|
validate(&ret, mess, val, retval, "set high voltage", DEC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
retval = setHighVoltage(val);
|
retval = setHighVoltage(val);
|
||||||
LOG(logDEBUG1, ("High Voltage: %d\n", retval));
|
LOG(logDEBUG1, ("High Voltage: %d\n", retval));
|
||||||
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD) || \
|
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD)
|
||||||
defined(GOTTHARD2D) || defined(MYTHEN3D)
|
|
||||||
validate(&ret, mess, val, retval, "set high voltage", DEC);
|
validate(&ret, mess, val, retval, "set high voltage", DEC);
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef GOTTHARDD
|
#ifdef GOTTHARDD
|
||||||
if (retval == -1) {
|
if (retval == -1) {
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
@ -1973,20 +2000,24 @@ int acquire(int blocking, int file_des) {
|
|||||||
}
|
}
|
||||||
// only set
|
// only set
|
||||||
if (Server_VerifyLock() == OK) {
|
if (Server_VerifyLock() == OK) {
|
||||||
#if defined(XILINX_CHIPTESTBOARDD)
|
#if defined(XILINX_CHIPTESTBOARDD) || defined(GOTTHARD2D)
|
||||||
if (!isChipConfigured()) {
|
if (!isChipConfigured()) {
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
strcpy(mess, "Could not start acquisition. Chip is not configured. "
|
strcpy(mess, "Could not start acquisition. Chip is not configured. "
|
||||||
"Power it on to configure it.\n");
|
"Power it on to configure it.\n");
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
} else if ((getReadoutMode() == TRANSCEIVER_ONLY ||
|
}
|
||||||
|
#if defined(XILINX_CHIPTESTBOARDD)
|
||||||
|
else if ((getReadoutMode() == TRANSCEIVER_ONLY ||
|
||||||
getReadoutMode() == DIGITAL_AND_TRANSCEIVER) &&
|
getReadoutMode() == DIGITAL_AND_TRANSCEIVER) &&
|
||||||
(isTransceiverAligned() == 0)) {
|
(isTransceiverAligned() == 0)) {
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
strcpy(mess, "Could not start acquisition. Transceiver not "
|
strcpy(mess, "Could not start acquisition. Transceiver not "
|
||||||
"aligned. Use configtransceiver command.\n");
|
"aligned. Use configtransceiver command.\n");
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
} else
|
}
|
||||||
|
#endif
|
||||||
|
else
|
||||||
#endif
|
#endif
|
||||||
#if defined(JUNGFRAUD)
|
#if defined(JUNGFRAUD)
|
||||||
// chipv1.1 has to be configured before acquisition
|
// chipv1.1 has to be configured before acquisition
|
||||||
@ -4111,7 +4142,7 @@ int power_chip(int file_des) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef XILINX_CHIPTESTBOARDD
|
#if defined(XILINX_CHIPTESTBOARDD) || defined(GOTTHARD2D)
|
||||||
if (ret == OK) {
|
if (ret == OK) {
|
||||||
if (arg != -1) {
|
if (arg != -1) {
|
||||||
if (arg != 0 && arg != 1) {
|
if (arg != 0 && arg != 1) {
|
||||||
|
Binary file not shown.
@ -1150,10 +1150,10 @@ int getSlowADC(int ichan, int *retval) {
|
|||||||
sprintf(fname, SLOWADC_DRIVER_FILE_NAME, adcDeviceIndex, ichan);
|
sprintf(fname, SLOWADC_DRIVER_FILE_NAME, adcDeviceIndex, ichan);
|
||||||
LOG(logDEBUG1, ("fname %s\n", fname));
|
LOG(logDEBUG1, ("fname %s\n", fname));
|
||||||
|
|
||||||
if (readADCFromFile(fname, retval) == FAIL) {
|
if (readParameterFromFile(fname, "slow adc", retval) == FAIL) {
|
||||||
|
LOG(logERROR, ("Could not get slow adc\n"));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO assuming already converted to uV
|
// TODO assuming already converted to uV
|
||||||
// convert to uV
|
// convert to uV
|
||||||
// double value = SLOWDAC_CONVERTION_FACTOR_TO_UV * (double)(*retval);
|
// double value = SLOWDAC_CONVERTION_FACTOR_TO_UV * (double)(*retval);
|
||||||
@ -1168,11 +1168,11 @@ int getSlowADC(int ichan, int *retval) {
|
|||||||
int getTemperature(int *retval) {
|
int getTemperature(int *retval) {
|
||||||
*retval = 0;
|
*retval = 0;
|
||||||
#ifndef VIRTUAL
|
#ifndef VIRTUAL
|
||||||
if (readADCFromFile(TEMP_DRIVER_FILE_NAME, retval) == FAIL) {
|
if (readParameterFromFile(TEMP_DRIVER_FILE_NAME, "temperature", retval) ==
|
||||||
|
FAIL) {
|
||||||
|
LOG(logERROR, ("Could not get temperature\n"));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// value already in millidegree celsius
|
|
||||||
LOG(logINFO, ("Temperature: %.2f °C\n", (double)(*retval) / 1000.00));
|
LOG(logINFO, ("Temperature: %.2f °C\n", (double)(*retval) / 1000.00));
|
||||||
#endif
|
#endif
|
||||||
return OK;
|
return OK;
|
||||||
|
@ -1506,6 +1506,23 @@ TEST_CASE("CALLER::powerchip", "[.cmdcall]") {
|
|||||||
caller.call("powerchip", {"0"}, -1, PUT, oss);
|
caller.call("powerchip", {"0"}, -1, PUT, oss);
|
||||||
REQUIRE(oss.str() == "powerchip 0\n");
|
REQUIRE(oss.str() == "powerchip 0\n");
|
||||||
}
|
}
|
||||||
|
// powering off chip throws if hv on (only test virtualserver - safety
|
||||||
|
if (det_type == defs::GOTTHARD2 &&
|
||||||
|
det.isVirtualDetectorServer().tsquash(
|
||||||
|
"Inconsistent virtual detector "
|
||||||
|
"server to test powerchip command")) {
|
||||||
|
det.setPowerChip(1);
|
||||||
|
int hv = det.getHighVoltage().tsquash(
|
||||||
|
"Inconsistent high voltage to test "
|
||||||
|
"powerchip command");
|
||||||
|
|
||||||
|
det.setHighVoltage(100);
|
||||||
|
REQUIRE_THROWS(caller.call("powerchip", {"0"}, -1, PUT));
|
||||||
|
|
||||||
|
// previous settings
|
||||||
|
det.setHighVoltage(hv);
|
||||||
|
det.setPowerChip(0);
|
||||||
|
}
|
||||||
{
|
{
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
caller.call("powerchip", {}, -1, GET, oss);
|
caller.call("powerchip", {}, -1, GET, oss);
|
||||||
|
@ -4,11 +4,11 @@
|
|||||||
#define RELEASE "developer"
|
#define RELEASE "developer"
|
||||||
#define APILIB "developer 0x230224"
|
#define APILIB "developer 0x230224"
|
||||||
#define APIRECEIVER "developer 0x230224"
|
#define APIRECEIVER "developer 0x230224"
|
||||||
#define APICTB "developer 0x240207"
|
#define APICTB "developer 0x240725"
|
||||||
#define APIGOTTHARD "developer 0x240207"
|
#define APIGOTTHARD "developer 0x240725"
|
||||||
#define APIGOTTHARD2 "developer 0x240207"
|
#define APIJUNGFRAU "developer 0x240725"
|
||||||
#define APIJUNGFRAU "developer 0x240207"
|
#define APIMYTHEN3 "developer 0x240725"
|
||||||
#define APIXILINXCTB "developer 0x240207"
|
#define APIMOENCH "developer 0x240725"
|
||||||
#define APIEIGER "developer 0x240207"
|
#define APIXILINXCTB "developer 0x240725"
|
||||||
#define APIMOENCH "developer 0x240703"
|
#define APIEIGER "developer 0x240725"
|
||||||
#define APIMYTHEN3 "developer 0x240715"
|
#define APIGOTTHARD2 "developer 0x240731"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user