eiger server bug fix: split quad and interruptframe into set and get to catch fails in set and when quad and interrupt subframe used together(different register values for tl and tr)

This commit is contained in:
maliakal_d 2019-07-31 10:58:49 +02:00
parent d981e1b8e5
commit e07e2f2da0
10 changed files with 228 additions and 147 deletions

View File

@ -1213,11 +1213,14 @@ void Beb_SetDetectorNumber(uint32_t detid) {
}
int Beb_SetQuad(int val) {
if (val >= 0) {
printf("Setting Quad to %d in Beb\n", val);
Beb_quadEnable = (val == 0 ? 0 : 1);
Beb_SetDetectorPosition(Beb_positions);
}
if (val < 0)
return OK;
printf("Setting Quad to %d in Beb\n", val);
Beb_quadEnable = (val == 0 ? 0 : 1);
return Beb_SetDetectorPosition(Beb_positions);
}
int Beb_GetQuad() {
return Beb_quadEnable;
}

View File

@ -92,6 +92,7 @@ struct BebInfo{
void Beb_SetDetectorNumber(uint32_t detid);
int Beb_SetQuad(int val);
int Beb_GetQuad();
int Beb_SetDetectorPosition(int pos[]);
uint16_t Beb_swap_uint16( uint16_t val);

View File

@ -2009,165 +2009,172 @@ int Feb_Control_SoftwareTrigger() {
return 1;
}
int Feb_Control_InterruptSubframe(int val) {
if (val >= 0) {
printf("Setting Interrupt Subframe to %d\n", val);
}
int Feb_Control_SetInterruptSubframe(int val) {
printf("Setting Interrupt Subframe to %d\n", val);
// they need to be written separately because the left and right registers have different values for this particular register
uint32_t offset = DAQ_REG_HRDWRE;
int top = Module_TopAddressIsValid(&modules[1]) ? 1 : 0;
uint32_t lvalue = 0;
uint32_t rvalue = 0;
// right
unsigned int addr = top ? Module_GetTopRightAddress (&modules[1]) : Module_GetBottomRightAddress (&modules[1]);
if (val >= 0) {
if(!Feb_Interface_ReadRegister(addr, offset, &rvalue)) {
cprintf(RED,"Could not read %s right interrupt subframe\n", top ? "top" : "bottom");
return -1;
uint32_t regVal = 0;
char side[2][10] = {"right", "left"};
char isTop[10]; strcpy(isTop, Module_TopAddressIsValid(&modules[1]) ? "top" : "bottom");
unsigned int addr[2];
addr[0] = Module_TopAddressIsValid(&modules[1]) ? Module_GetTopRightAddress (&modules[1]) : Module_GetBottomRightAddress (&modules[1]);
addr[1] = Module_TopAddressIsValid(&modules[1]) ? Module_GetTopLeftAddress (&modules[1]) : Module_GetBottomLeftAddress (&modules[1]);
int iloop = 0;
for(iloop = 0; iloop < 2; ++iloop) {
// get previous value to keep it
if(!Feb_Interface_ReadRegister(addr[iloop], offset, &regVal)) {
cprintf(RED, "Could not read %s %s interrupt subframe\n", isTop, side[iloop]);
return 0;
}
uint32_t data = ((val == 0) ? (rvalue &~ DAQ_REG_HRDWRE_INTRRPT_SF_MSK) : (rvalue | DAQ_REG_HRDWRE_INTRRPT_SF_MSK));
if(!Feb_Interface_WriteRegister(addr, offset, data, 0, 0)) {
cprintf(RED,"Could not write 0x%x to %s right interrupt subframe addr 0x%x\n", data, top ? "top" : "bottom", offset);
return -1;
uint32_t data = ((val == 0) ? (regVal &~ DAQ_REG_HRDWRE_INTRRPT_SF_MSK) : (regVal | DAQ_REG_HRDWRE_INTRRPT_SF_MSK));
if(!Feb_Interface_WriteRegister(addr[iloop], offset, data, 0, 0)) {
cprintf(RED, "Could not write 0x%x to %s %s interrupt subframe addr 0x%x\n", data, isTop, side[iloop], offset);
return 0;
}
}
if(!Feb_Interface_ReadRegister(addr, offset, &rvalue)) {
cprintf(RED,"Could not read back %s right interrupt subframe\n", top ? "top" : "bottom");
return -1;
return 1;
}
int Feb_Control_GetInterruptSubframe() {
// they need to be written separately because the left and right registers have different values for this particular register
uint32_t offset = DAQ_REG_HRDWRE;
uint32_t regVal = 0;
char side[2][10] = {"right", "left"};
char isTop[10]; strcpy(isTop, Module_TopAddressIsValid(&modules[1]) ? "top" : "bottom");
unsigned int addr[2];
addr[0] = Module_TopAddressIsValid(&modules[1]) ? Module_GetTopRightAddress (&modules[1]) : Module_GetBottomRightAddress (&modules[1]);
addr[1] = Module_TopAddressIsValid(&modules[1]) ? Module_GetTopLeftAddress (&modules[1]) : Module_GetBottomLeftAddress (&modules[1]);
uint32_t value[2] = {0, 0};
int iloop = 0;
for(iloop = 0; iloop < 2; ++iloop) {
if(!Feb_Interface_ReadRegister(addr[iloop], offset, &regVal)) {
cprintf(RED, "Could not read back %s %s interrupt subframe\n", isTop, side[iloop]);
return -1;
}
value[iloop] = (regVal & DAQ_REG_HRDWRE_INTRRPT_SF_MSK) >> DAQ_REG_HRDWRE_INTRRPT_SF_OFST;
}
// left
addr = top ? Module_GetTopLeftAddress (&modules[1]) : Module_GetBottomLeftAddress (&modules[1]);
if (val >= 0) {
if(!Feb_Interface_ReadRegister(addr, offset, &lvalue)) {
cprintf(RED,"Could not read %s left interrupt subframe\n", top ? "top" : "bottom");
return -1;
}
uint32_t data = ((val == 0) ? (lvalue &~ DAQ_REG_HRDWRE_INTRRPT_SF_MSK) : (lvalue | DAQ_REG_HRDWRE_INTRRPT_SF_MSK));
if(!Feb_Interface_WriteRegister(addr, offset, data, 0, 0)) {
cprintf(RED,"Could not write 0x%x to %s left interrupt subframe addr 0x%x\n", data, top ? "top" : "bottom", offset);
return -1;
}
}
if(!Feb_Interface_ReadRegister(addr, offset, &lvalue)) {
cprintf(RED,"Could not read back %s left interrupt subframe\n", top ? "top" : "bottom");
return -1;
}
// inconsistent
if (lvalue != rvalue) {
cprintf(RED, "Inconsistent values of interrupt subframe betweeen left and right\n");
if (value[0] != value[1]) {
cprintf(RED, "Inconsistent values of interrupt subframe betweeen left %d and right %d\n", value[0], value[1]);
return -1;
}
return (lvalue & DAQ_REG_HRDWRE_INTRRPT_SF_MSK) >> DAQ_REG_HRDWRE_INTRRPT_SF_OFST;
return value[0];
}
int Feb_Control_SetQuad(int val) {
// no bottom for quad
if (!Module_TopAddressIsValid(&modules[1])) {
return 0;
return 1;
}
uint32_t offset = DAQ_REG_HRDWRE;
if (val >= 0) {
printf("Setting Quad to %d in Feb\n", val);
unsigned int addr = Module_GetTopRightAddress (&modules[1]);
uint32_t rvalue = 0;
if(!Feb_Interface_ReadRegister(addr, offset, &rvalue)) {
cprintf(RED,"Could not read top right quad reg\n");
return -1;
}
uint32_t data = ((val == 0) ? (rvalue &~ DAQ_REG_HRDWRE_OW_MSK) : ((rvalue | DAQ_REG_HRDWRE_OW_MSK) &~ DAQ_REG_HRDWRE_TOP_MSK));
if(!Feb_Interface_WriteRegister(addr, offset, data, 0, 0)) {
cprintf(RED,"Could not write 0x%x to top right quad addr 0x%x\n", data, offset);
return -1;
}
printf("Setting Quad to %d in Feb\n", val);
unsigned int addr = Module_GetTopRightAddress (&modules[1]);
uint32_t regVal = 0;
if(!Feb_Interface_ReadRegister(addr, offset, &regVal)) {
cprintf(RED, "Could not read top right quad reg\n");
return 0;
}
return 0;
uint32_t data = ((val == 0) ? (regVal &~ DAQ_REG_HRDWRE_OW_MSK) : ((regVal | DAQ_REG_HRDWRE_OW_MSK) &~ DAQ_REG_HRDWRE_TOP_MSK));
if(!Feb_Interface_WriteRegister(addr, offset, data, 0, 0)) {
cprintf(RED, "Could not write 0x%x to top right quad addr 0x%x\n", data, offset);
return 0;
}
return 1;
}
uint32_t Feb_Control_WriteRegister(uint32_t offset, uint32_t data) {
int Feb_Control_WriteRegister(uint32_t offset, uint32_t data) {
uint32_t actualOffset = offset;
int left = 0;
int right = 0;
char side[2][10] = {"right", "left"};
char isTop[10]; strcpy(isTop, Module_TopAddressIsValid(&modules[1]) ? "top" : "bottom");
unsigned int addr[2];
addr[0] = Module_TopAddressIsValid(&modules[1]) ? Module_GetTopRightAddress (&modules[1]) : Module_GetBottomRightAddress (&modules[1]);
addr[1] = Module_TopAddressIsValid(&modules[1]) ? Module_GetTopLeftAddress (&modules[1]) : Module_GetBottomLeftAddress (&modules[1]);
int run[2] = {0, 0};
// both registers
if (offset < 0x100) {
left = 1;
right = 1;
run[0] = 1;
run[1] = 1;
}
// right registers only
else if (offset >= 0x200) {
right = 1;
run[0] = 1;
actualOffset = offset - 0x200;
} else {
left = 1;
}
// left registers only
else {
run[1] = 1;
actualOffset = offset - 0x100;
}
int top = Module_TopAddressIsValid(&modules[1]) ? 1 : 0;
unsigned int addr = top ? Module_GetTopRightAddress (&modules[1]) : Module_GetBottomRightAddress (&modules[1]);
if (right) {
if(!Feb_Interface_WriteRegister(addr,actualOffset, data,0, 0)) {
cprintf(RED,"Could not write 0x%x to %s right addr 0x%x\n", data, top ? "top" : "bottom", actualOffset);
}
}
addr = top ? Module_GetTopLeftAddress (&modules[1]) : Module_GetBottomLeftAddress (&modules[1]);
if (left) {
if(!Feb_Interface_WriteRegister(addr,actualOffset, data,0, 0)) {
cprintf(RED,"Could not write 0x%x to %s left addr 0x%x\n", data, top ? "top" : "bottom", actualOffset);
int iloop = 0;
for(iloop = 0; iloop < 2; ++iloop) {
if(run[iloop]) {
printf("Writing 0x%x to %s %s 0x%x\n", data, isTop, side[iloop], actualOffset);
if(!Feb_Interface_WriteRegister(addr[iloop],actualOffset, data, 0, 0)) {
cprintf(RED, "Could not write 0x%x to %s %s addr 0x%x\n", data, isTop, side[iloop], actualOffset);
return 0;
}
}
}
return Feb_Control_ReadRegister(offset);
return 1;
}
uint32_t Feb_Control_ReadRegister(uint32_t offset) {
int Feb_Control_ReadRegister(uint32_t offset, uint32_t* retval) {
uint32_t actualOffset = offset;
int left = 0;
int right = 0;
char side[2][10] = {"right", "left"};
char isTop[10]; strcpy(isTop, Module_TopAddressIsValid(&modules[1]) ? "top" : "bottom");
unsigned int addr[2];
addr[0] = Module_TopAddressIsValid(&modules[1]) ? Module_GetTopRightAddress (&modules[1]) : Module_GetBottomRightAddress (&modules[1]);
addr[1] = Module_TopAddressIsValid(&modules[1]) ? Module_GetTopLeftAddress (&modules[1]) : Module_GetBottomLeftAddress (&modules[1]);
uint32_t value[2] = {0, 0};
int run[2] = {0, 0};
// both registers
if (offset < 0x100) {
left = 1;
right = 1;
run[0] = 1;
run[1] = 1;
}
// right registers only
else if (offset >= 0x200) {
right = 1;
run[0] = 1;
actualOffset = offset - 0x200;
} else {
left = 1;
}
// left registers only
else {
run[1] = 1;
actualOffset = offset - 0x100;
}
uint32_t lvalue=0;
uint32_t rvalue=0;
int top = Module_TopAddressIsValid(&modules[1]) ? 1 : 0;
unsigned int addr = top ? Module_GetTopRightAddress (&modules[1]) : Module_GetBottomRightAddress (&modules[1]);
if (right) {
if(!Feb_Interface_ReadRegister(addr, actualOffset, &rvalue)) {
cprintf(RED,"Could not read %s right addr 0x%x\n", top ? "top" : "bottom", actualOffset);
return -1;
}
printf("Read %s right addr: 0x%08x\n", top ? "top" : "bottom", rvalue);
if (!left) {
return rvalue;
int iloop = 0;
for(iloop = 0; iloop < 2; ++iloop) {
if(run[iloop]) {
if(!Feb_Interface_ReadRegister(addr[iloop],actualOffset, &value[iloop])) {
cprintf(RED, "Could not read from %s %s addr 0x%x\n", isTop, side[iloop], actualOffset);
return 0;
}
printf("Read 0x%x from %s %s 0x%x\n", value[iloop], isTop, side[iloop], actualOffset);
*retval = value[iloop];
// if not the other (left, not right OR right, not left), return the value
if (!run[iloop ? 0 : 1]) {
return 1;
}
}
}
addr = top ? Module_GetTopLeftAddress (&modules[1]) : Module_GetBottomLeftAddress (&modules[1]);
if(left) {
if(!Feb_Interface_ReadRegister(addr, actualOffset, &lvalue)) {
cprintf(RED,"Could not read %s left addr 0x%x\n", top ? "top" : "bottom", actualOffset);
return -1;
}
printf("Read %s left addr: 0x%08x\n", top ? "top" : "bottom", lvalue);
if (!right) {
return lvalue;
}
// Inconsistent values
if (value[0] != value[1]) {
cprintf(RED, "Inconsistent values read from left 0x%x and right 0x%x\n", value[0], value[1]);
return 0;
}
if (lvalue != rvalue) {
cprintf(RED, "Inconsistent values betweeen left and right\n");
return -1;
}
return lvalue;
return 1;
}

View File

@ -204,9 +204,10 @@ int Feb_Control_GetModuleNumber();
int64_t Feb_Control_GetSubMeasuredPeriod();
int Feb_Control_SoftwareTrigger();
int Feb_Control_InterruptSubframe(int val);
int Feb_Control_SetInterruptSubframe(int val);
int Feb_Control_GetInterruptSubframe();
int Feb_Control_SetQuad(int val);
uint32_t Feb_Control_WriteRegister(uint32_t offset, uint32_t data);
uint32_t Feb_Control_ReadRegister(uint32_t offset);
int Feb_Control_WriteRegister(uint32_t offset, uint32_t data);
int Feb_Control_ReadRegister(uint32_t offset, uint32_t* retval);
#endif

View File

@ -1,9 +1,9 @@
Path: slsDetectorsPackage/slsDetectorSoftware/eigerDetectorServer
URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
Repsitory UUID: 27f3af53657b744f43b79f9751909ae4e289ad29
Revision: 354
Repsitory UUID: d981e1b8e558d3f576038f374d6eddcbbf5af48e
Revision: 356
Branch: 4.1.0-rc
Last Changed Author: Dhanya_Thattil
Last Changed Rev: 4121
Last Changed Date: 2019-07-29 09:33:57.000000001 +0200 ./FebRegisterDefs.h
Last Changed Rev: 4123
Last Changed Date: 2019-07-30 17:58:54.000000001 +0200 ./Beb.c

View File

@ -1,6 +1,6 @@
#define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git"
#define GITREPUUID "27f3af53657b744f43b79f9751909ae4e289ad29"
#define GITREPUUID "d981e1b8e558d3f576038f374d6eddcbbf5af48e"
#define GITAUTH "Dhanya_Thattil"
#define GITREV 0x4121
#define GITDATE 0x20190729
#define GITREV 0x4123
#define GITDATE 0x20190730
#define GITBRANCH "4.1.0-rc"

View File

@ -486,19 +486,25 @@ void setupDetector() {
/* advanced read/write reg */
uint32_t writeRegister(uint32_t offset, uint32_t data) {
int writeRegister(uint32_t offset, uint32_t data) {
#ifdef VIRTUAL
return 0;
return OK;
#else
return Feb_Control_WriteRegister(offset, data);
if(!Feb_Control_WriteRegister(offset, data)) {
return FAIL;
}
return OK;
#endif
}
uint32_t readRegister(uint32_t offset) {
int readRegister(uint32_t offset, uint32_t* retval) {
#ifdef VIRTUAL
return 0;
return OK;
#else
return Feb_Control_ReadRegister(offset);
if(!Feb_Control_ReadRegister(offset, retval)) {
return FAIL;
}
return OK;
#endif
}
@ -1219,17 +1225,45 @@ int setDetectorPosition(int pos[]) {
}
int setQuad(int val) {
int ret = Beb_SetQuad(val);
if (Feb_Control_SetQuad(val) == -1)
return -1;
return ret;
int setQuad(int value) {
if(value < 0)
return FAIL;
#ifndef VIRTUAL
Beb_SetQuad(value);
if(!Feb_Control_SetQuad(value)) {
return FAIL;
}
#endif
return OK;
}
int setInterruptSubframe(int val) {
return Feb_Control_InterruptSubframe(val);
int getQuad() {
#ifdef VIRTUAL
return 0;
#else
return Beb_GetQuad();
#endif
}
int setInterruptSubframe(int value) {
if(value < 0)
return FAIL;
#ifndef VIRTUAL
if(!Feb_Control_SetInterruptSubframe(value)) {
return FAIL;
}
return OK;
#endif
}
int getInterruptSubframe() {
#ifdef VIRTUAL
return 0;
#else
return Feb_Control_GetInterruptSubframe();
#endif
}

View File

@ -73,8 +73,8 @@ int setDefaultDacs();
extern u_int32_t writeRegister(u_int32_t offset, u_int32_t data); // blackfin.h
extern u_int32_t readRegister(u_int32_t offset); // blackfin.h
#else
uint32_t writeRegister(uint32_t offset, uint32_t data);
uint32_t readRegister(uint32_t offset);
int writeRegister(uint32_t offset, uint32_t data);
int readRegister(uint32_t offset, uint32_t* retval);
#endif
@ -196,7 +196,9 @@ int setDetectorPosition(int pos[]);
#endif
#ifdef EIGERD
int setQuad(int val);
int getQuad();
int setInterruptSubframe(int val);
int getInterruptSubframe();
#endif

View File

@ -1458,8 +1458,22 @@ int write_register(int file_des) {
#ifdef VERBOSE
printf("writing to register 0x%x data 0x%x\n", addr, val);
#endif
#ifdef EIGERD
if(writeRegister(addr, val) == FAIL) {
ret = FAIL;
sprintf(mess,"Could not write to register 0x%x.\n", addr);
cprintf(RED, "Warning: %s", mess);
} else {
if(readRegister(addr, &retval) == FAIL) {
ret = FAIL;
sprintf(mess,"Could not read register 0x%x.\n", addr);
cprintf(RED, "Warning: %s", mess);
}
}
#else
retval=writeRegister(addr,val);
if (retval!=val) {
#endif
if (ret == OK && retval!=val) {
ret = FAIL;
sprintf(mess,"Writing to register 0x%x failed: wrote 0x%x but read 0x%x\n", addr, val, retval);
cprintf(RED, "Warning: %s", mess);
@ -1509,8 +1523,16 @@ int read_register(int file_des) {
printf("reading register 0x%x\n", addr);
#endif
#ifdef SLS_DETECTOR_FUNCTION_LIST
#ifdef EIGERD
if(readRegister(addr, &retval) == FAIL) {
ret = FAIL;
sprintf(mess,"Could not read register 0x%x.\n", addr);
cprintf(RED, "Warning: %s", mess);
}
#else
retval=readRegister(addr);
#endif
#endif
#ifdef VERBOSE
printf("Returned value 0x%x\n", retval);
#endif
@ -5962,11 +5984,16 @@ int set_quad(int file_des) {
#ifdef VERBOSE
printf("Setting Quad :%d \n",arg);
#endif
retval=setQuad(arg);
if((arg != -1) && (retval != arg)) {
if(arg != -1 && setQuad(arg) == FAIL) {
ret=FAIL;
strcpy(mess, "setting quad failed\n");
cprintf(RED, "Warning: %s", mess);
}
retval = getQuad();
if(ret == OK && (arg != -1) && (retval != arg)) {
ret=FAIL;
cprintf(RED, "Warning: %s", mess);
}
}
#endif
if (ret==OK && differentClients)
@ -6021,12 +6048,18 @@ int set_interrupt_subframe(int file_des) {
#ifdef VERBOSE
printf("Setting Interrupt subframe :%d \n",arg);
#endif
retval=setInterruptSubframe(arg);
if (arg != -1 && setInterruptSubframe(arg) == FAIL) {
ret=FAIL;
strcpy(mess, "setting interrupt subframe failed\n");
cprintf(RED, "Warning: %s", mess);
}
retval = getInterruptSubframe();
#ifdef VERBOSE
printf("retval Interrupt subframe :%d \n",retval);
#endif
if((arg != -1) && (retval != arg)) {
if(ret == OK && (arg != -1) && (retval != arg)) {
ret=FAIL;
sprintf(mess, "setting interrupt subframe failed. Set %d, got %d\n", arg, retval);
cprintf(RED, "Warning: %s", mess);
}
}