changes to gotthard server to include write adc, and also changes to fix the dma=dma+1

This commit is contained in:
Dhanya Maliakal 2017-07-11 10:54:21 +02:00
parent a583f3d6e2
commit 931a5840e8
14 changed files with 397 additions and 291 deletions

View File

@ -0,0 +1 @@
../slsDetectorServer/AD9257.h

View File

@ -16,7 +16,7 @@ INSTMODE= 0777
BINS = testlib_sharedlibc BINS = testlib_sharedlibc
SRCS = server.c server_funcs.c communication_funcs.c firmware_funcs.c mcb_funcs.c trimming_funcs.c sharedmemory.c SRCS = server.c firmware_funcs.c server_funcs.c communication_funcs.c mcb_funcs.c trimming_funcs.c sharedmemory.c
OBJS = $(SRCS:%.c=%.o) OBJS = $(SRCS:%.c=%.o)

View File

@ -0,0 +1 @@
../slsDetectorServer/commonServerFunctions.h

View File

@ -4,6 +4,8 @@
#include "mcb_funcs.h" #include "mcb_funcs.h"
#include "registers_g.h" #include "registers_g.h"
#include "AD9257.h" // include "commonServerFunctions.h"
#ifdef SHAREDMEMORY #ifdef SHAREDMEMORY
#include "sharedmemory.h" #include "sharedmemory.h"
#endif #endif
@ -1814,7 +1816,9 @@ int allocateRAM() {
} }
int prepareADC(){
int configureADC(){
printf("Preparing ADC\n"); printf("Preparing ADC\n");
u_int32_t valw,codata,csmask; u_int32_t valw,codata,csmask;
int i,j,cdx,ddx; int i,j,cdx,ddx;
@ -1834,26 +1838,26 @@ int prepareADC(){
// start point // start point
valw=0xff; valw=0xff;
bus_w(ADC_WRITE_REG,(valw)); bus_w(ADC_SPI_REG,(valw));
//chip sel bar down //chip sel bar down
valw=((0xffffffff&(~csmask))); valw=((0xffffffff&(~csmask)));
bus_w(ADC_WRITE_REG,valw); bus_w(ADC_SPI_REG,valw);
for (i=0;i<24;i++) { for (i=0;i<24;i++) {
//cldwn //cldwn
valw=valw&(~(0x1<<cdx)); valw=valw&(~(0x1<<cdx));
bus_w(ADC_WRITE_REG,valw); bus_w(ADC_SPI_REG,valw);
usleep(0); usleep(0);
//write data (i) //write data (i)
valw=(valw&(~(0x1<<ddx)))+(((codata>>(23-i))&0x1)<<ddx); valw=(valw&(~(0x1<<ddx)))+(((codata>>(23-i))&0x1)<<ddx);
bus_w(ADC_WRITE_REG,valw); bus_w(ADC_SPI_REG,valw);
usleep(0); usleep(0);
//clkup //clkup
valw=valw+(0x1<<cdx); valw=valw+(0x1<<cdx);
bus_w(ADC_WRITE_REG,valw); bus_w(ADC_SPI_REG,valw);
usleep(0); usleep(0);
} }
@ -1861,7 +1865,7 @@ int prepareADC(){
valw=valw&(~(0x1<<cdx)); valw=valw&(~(0x1<<cdx));
usleep(0); usleep(0);
valw=0xff; valw=0xff;
bus_w(ADC_WRITE_REG,(valw)); bus_w(ADC_SPI_REG,(valw));
//usleep in between //usleep in between
usleep(50000); usleep(50000);
@ -1872,19 +1876,19 @@ int prepareADC(){
/* /*
codata=0; codata=0;
codata=(0x14<<8)+(0x0); //command and value; codata=(0x14<<8)+(0x0); //command and value;
valw=0xff; bus_w(ADC_WRITE_REG,(valw)); // start point valw=0xff; bus_w(ADC_SPI_REG,(valw)); // start point
valw=((0xffffffff&(~csmask)));bus_w(ADC_WRITE_REG,valw); //chip sel bar down valw=((0xffffffff&(~csmask)));bus_w(ADC_SPI_REG,valw); //chip sel bar down
for (i=0;i<24;i++) { for (i=0;i<24;i++) {
valw=valw&(~(0x1<<cdx));bus_w(ADC_WRITE_REG,valw);usleep(0); //cldwn valw=valw&(~(0x1<<cdx));bus_w(ADC_SPI_REG,valw);usleep(0); //cldwn
valw=(valw&(~(0x1<<ddx)))+(((codata>>(23-i))&0x1)<<ddx); bus_w(ADC_WRITE_REG,valw); usleep(0); //write data (i) valw=(valw&(~(0x1<<ddx)))+(((codata>>(23-i))&0x1)<<ddx); bus_w(ADC_SPI_REG,valw); usleep(0); //write data (i)
valw=valw+(0x1<<cdx);bus_w(ADC_WRITE_REG,valw); usleep(0); //clkup valw=valw+(0x1<<cdx);bus_w(ADC_SPI_REG,valw); usleep(0); //clkup
} }
valw=valw&(~(0x1<<cdx));usleep(0); valw=valw&(~(0x1<<cdx));usleep(0);
valw=0xff; bus_w(ADC_WRITE_REG,(valw)); // stop point =start point valw=0xff; bus_w(ADC_SPI_REG,(valw)); // stop point =start point
@ -1892,36 +1896,36 @@ int prepareADC(){
codata=0; codata=0;
codata=(0x08<<8)+(0x3); //command and value;Power modes(global) reset codata=(0x08<<8)+(0x3); //command and value;Power modes(global) reset
valw=0xff; bus_w(ADC_WRITE_REG,(valw)); // start point valw=0xff; bus_w(ADC_SPI_REG,(valw)); // start point
valw=((0xffffffff&(~csmask)));bus_w(ADC_WRITE_REG,valw); //chip sel bar down valw=((0xffffffff&(~csmask)));bus_w(ADC_SPI_REG,valw); //chip sel bar down
for (i=0;i<24;i++) { for (i=0;i<24;i++) {
valw=valw&(~(0x1<<cdx));bus_w(ADC_WRITE_REG,valw);usleep(0); //cldwn valw=valw&(~(0x1<<cdx));bus_w(ADC_SPI_REG,valw);usleep(0); //cldwn
valw=(valw&(~(0x1<<ddx)))+(((codata>>(23-i))&0x1)<<ddx); bus_w(ADC_WRITE_REG,valw); usleep(0); //write data (i) valw=(valw&(~(0x1<<ddx)))+(((codata>>(23-i))&0x1)<<ddx); bus_w(ADC_SPI_REG,valw); usleep(0); //write data (i)
valw=valw+(0x1<<cdx);bus_w(ADC_WRITE_REG,valw); usleep(0); //clkup valw=valw+(0x1<<cdx);bus_w(ADC_SPI_REG,valw); usleep(0); //clkup
} }
valw=valw&(~(0x1<<cdx));usleep(0); valw=valw&(~(0x1<<cdx));usleep(0);
valw=0xff; bus_w(ADC_WRITE_REG,(valw)); // stop point =start point valw=0xff; bus_w(ADC_SPI_REG,(valw)); // stop point =start point
usleep(50000); usleep(50000);
codata=0; codata=0;
codata=(0x08<<8)+(0x0); //command and value;Power modes(global) reset codata=(0x08<<8)+(0x0); //command and value;Power modes(global) reset
valw=0xff; bus_w(ADC_WRITE_REG,(valw)); // start point valw=0xff; bus_w(ADC_SPI_REG,(valw)); // start point
valw=((0xffffffff&(~csmask)));bus_w(ADC_WRITE_REG,valw); //chip sel bar down valw=((0xffffffff&(~csmask)));bus_w(ADC_SPI_REG,valw); //chip sel bar down
for (i=0;i<24;i++) { for (i=0;i<24;i++) {
valw=valw&(~(0x1<<cdx));bus_w(ADC_WRITE_REG,valw);usleep(0); //cldwn valw=valw&(~(0x1<<cdx));bus_w(ADC_SPI_REG,valw);usleep(0); //cldwn
valw=(valw&(~(0x1<<ddx)))+(((codata>>(23-i))&0x1)<<ddx); bus_w(ADC_WRITE_REG,valw); usleep(0); //write data (i) valw=(valw&(~(0x1<<ddx)))+(((codata>>(23-i))&0x1)<<ddx); bus_w(ADC_SPI_REG,valw); usleep(0); //write data (i)
valw=valw+(0x1<<cdx);bus_w(ADC_WRITE_REG,valw); usleep(0); //clkup valw=valw+(0x1<<cdx);bus_w(ADC_SPI_REG,valw); usleep(0); //clkup
} }
valw=valw&(~(0x1<<cdx));usleep(0); valw=valw&(~(0x1<<cdx));usleep(0);
valw=0xff; bus_w(ADC_WRITE_REG,(valw)); // stop point =start point valw=0xff; bus_w(ADC_SPI_REG,(valw)); // stop point =start point
*/ */
} }

View File

@ -139,6 +139,7 @@ int allocateRAM();
int clearRAM(); int clearRAM();
int setMaster(int f); int setMaster(int f);
int setSynchronization(int s); int setSynchronization(int s);

View File

@ -33,7 +33,16 @@
//#define TIME_FROM_START_REG 0x16<<11 //#define TIME_FROM_START_REG 0x16<<11
#define MCB_CNTRL_REG_OFF 0x17<<11// control the dacs #define MCB_CNTRL_REG_OFF 0x17<<11// control the dacs
//ADC //ADC
#define ADC_WRITE_REG 0x18<<11 #define ADC_SPI_REG 0x18<<11
#define ADC_SERIAL_CLK_OUT_OFST (0)
#define ADC_SERIAL_CLK_OUT_MSK (0x00000001 << ADC_SERIAL_CLK_OUT_OFST)
#define ADC_SERIAL_DATA_OUT_OFST (1)
#define ADC_SERIAL_DATA_OUT_MSK (0x00000001 << ADC_SERIAL_DATA_OUT_OFST)
#define ADC_SERIAL_CS_OUT_OFST (2)
#define ADC_SERIAL_CS_OUT_MSK (0x0000000F << ADC_SERIAL_CS_OUT_OFST)
#define ADC_SYNC_REG 0x19<<11 #define ADC_SYNC_REG 0x19<<11
//#define MUTIME_REG 0x1a<<11 //#define MUTIME_REG 0x1a<<11
//temperature //temperature

View File

@ -84,7 +84,7 @@ int init_detector( int b) {
//gotthard specific //gotthard specific
setPhaseShiftOnce(); setPhaseShiftOnce();
prepareADC(); configureADC();
setADC(-1); //already does setdaqreg and clean fifo setADC(-1); //already does setdaqreg and clean fifo
setSettings(GET_SETTINGS,-1); setSettings(GET_SETTINGS,-1);
@ -192,6 +192,7 @@ int function_table() {
flist[F_PREPARE_ACQUISITION]=&start_receiver; flist[F_PREPARE_ACQUISITION]=&start_receiver;
flist[F_CLEANUP_ACQUISITION]=&stop_receiver; flist[F_CLEANUP_ACQUISITION]=&stop_receiver;
flist[F_CALIBRATE_PEDESTAL]=&calibrate_pedestal; flist[F_CALIBRATE_PEDESTAL]=&calibrate_pedestal;
flist[F_WRITE_ADC_REG]=&write_adc_register;
return OK; return OK;
} }
@ -3055,3 +3056,54 @@ int calibrate_pedestal(int file_des){
} }
int write_adc_register(int file_des) {
int ret=OK;
int n=0;
int retval=-1;
sprintf(mess,"write to adc register failed\n");
// receive arguments
int arg[2]={-1,-1};
n = receiveData(file_des,arg,sizeof(arg),INT32);
if (n < 0) {
sprintf(mess,"Error reading from socket\n");
ret=FAIL;
}
int addr=arg[0];
int val=arg[1];
// execute action
if (ret == OK) {
if (differentClients && lockStatus) {
ret = FAIL;
sprintf(mess,"Detector locked by %s\n",lastClientIP);
cprintf(RED, "Warning: %s", mess);
}
else {
#ifdef VERBOSE
printf("writing to register 0x%x data 0x%x\n", addr, val);
#endif
setAdc(addr,val);
#ifdef VERBOSE
printf("Data set to 0x%x\n", retval);
#endif
if (ret==OK && differentClients)
ret=FORCE_UPDATE;
}
}
// send ok / fail
n = sendDataOnly(file_des,&ret,sizeof(ret));
// send return argument
if (ret==FAIL) {
n = sendDataOnly(file_des,mess,sizeof(mess));
} else
n = sendDataOnly(file_des,&retval,sizeof(retval));
// return ok / fail
return ret;
}

View File

@ -69,7 +69,7 @@ int set_dynamic_range(int);
int set_roi(int); int set_roi(int);
int get_roi(int); int get_roi(int);
int set_speed(int); int set_speed(int);
void prepareADC(void); void configureADC();
int set_readout_flags(int); int set_readout_flags(int);
int execute_trimming(int); int execute_trimming(int);
int lock_server(int); int lock_server(int);
@ -94,4 +94,6 @@ int calibrate_pedestal(int);
int set_roi(int); int set_roi(int);
int write_adc_register(int);
#endif #endif

View File

@ -2971,84 +2971,109 @@ int multiSlsDetector::getAngularConversion(int &direction, angleConversionCons
dacs_t multiSlsDetector::setDAC(dacs_t val, dacIndex idac, int mV, int imod) { dacs_t multiSlsDetector::setDAC(dacs_t val, dacIndex idac, int mV, int imod) {
dacs_t ret = -100; dacs_t ret = -100;
// single
{
int id=-1, im=-1;
if (decodeNMod(imod, id, im)>=0) {
if(detectors[id]){
ret = detectors[id]->setDAC(val, idac, mV, im);
if(detectors[id]->getErrorMask())
setErrorMask(getErrorMask()|(1<<id));
return ret;
}
return -1;
}
}
// multi
if(!threadpool){ if(!threadpool){
cout << "Error in creating threadpool. Exiting" << endl; cout << "Error in creating threadpool. Exiting" << endl;
return -1; return -1;
}else{ }
int id=-1, im=-1;
int posmin=0, posmax=thisMultiDetector->numberOfDetectors;
if (decodeNMod(imod, id, im)>=0) {
posmin=id;
posmax=id+1;
}
//return storage values int posmin=0, posmax=thisMultiDetector->numberOfDetectors;
dacs_t* iret[posmax-posmin]; dacs_t* iret[posmax-posmin];
for(int idet=posmin; idet<posmax; ++idet){
if(detectors[idet]){ for(int idet=posmin; idet<posmax; ++idet){
iret[idet]= new dacs_t(-1); if(detectors[idet]){
Task* task = new Task(new func4_t <dacs_t,slsDetector,dacs_t,dacIndex,int,int,dacs_t>(&slsDetector::setDAC, iret[idet]= new dacs_t(-1);
detectors[idet],val, idac, mV, im, iret[idet])); Task* task = new Task(new func4_t <dacs_t,slsDetector,dacs_t,dacIndex,int,int,dacs_t>(&slsDetector::setDAC,
threadpool->add_task(task); detectors[idet],val, idac, mV, imod, iret[idet]));
} threadpool->add_task(task);
}
threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete();
for(int idet=posmin; idet<posmax; idet++){
if(detectors[idet]){
if(iret[idet] != NULL){
if (ret==-100)
ret=*iret[idet];
else if (ret!=*iret[idet])
ret=-1;
delete iret[idet];
}else ret=-1;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
}
} }
} }
threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete();
for(int idet=posmin; idet<posmax; idet++){
if(detectors[idet]){
if(iret[idet] != NULL){
if (ret==-100)
ret=*iret[idet];
else if (ret!=*iret[idet])
ret=-1;
delete iret[idet];
}else ret=-1;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
}
}
return ret; return ret;
} }
dacs_t multiSlsDetector::getADC(dacIndex idac, int imod) { dacs_t multiSlsDetector::getADC(dacIndex idac, int imod) {
dacs_t ret = -100; dacs_t ret = -100;
// single
{
int id=-1, im=-1;
if (decodeNMod(imod, id, im)>=0) {
if(detectors[id]){
ret = detectors[id]->getADC(idac, im);
if(detectors[id]->getErrorMask())
setErrorMask(getErrorMask()|(1<<id));
return ret;
}
return -1;
}
}
// multi
if(!threadpool){ if(!threadpool){
cout << "Error in creating threadpool. Exiting" << endl; cout << "Error in creating threadpool. Exiting" << endl;
return -1; return -1;
}else{ }
int id=-1, im=-1;
int posmin=0, posmax=thisMultiDetector->numberOfDetectors; int posmin=0, posmax=thisMultiDetector->numberOfDetectors;
if (decodeNMod(imod, id, im)>=0) { dacs_t* iret[posmax-posmin];
posmin=id;
posmax=id+1; for(int idet=posmin; idet<posmax; ++idet){
} if(detectors[idet]){
//return storage values iret[idet]= new dacs_t(-1);
dacs_t* iret[posmax-posmin]; Task* task = new Task(new func2_t <dacs_t,slsDetector,dacIndex,int,dacs_t>(&slsDetector::getADC,
for(int idet=posmin; idet<posmax; ++idet){ detectors[idet],idac, imod, iret[idet]));
if(detectors[idet]){ threadpool->add_task(task);
iret[idet]= new dacs_t(-1);
Task* task = new Task(new func2_t <dacs_t,slsDetector,dacIndex,int,dacs_t>(&slsDetector::getADC,
detectors[idet],idac, im, iret[idet]));
threadpool->add_task(task);
}
}
threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete();
for(int idet=posmin; idet<posmax; idet++){
if(detectors[idet]){
if(iret[idet] != NULL){
if (ret==-100)
ret=*iret[idet];
else if (ret!=*iret[idet])
ret=-1;
delete iret[idet];
}else ret=-1;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
}
} }
} }
threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete();
for(int idet=posmin; idet<posmax; idet++){
if(detectors[idet]){
if(iret[idet] != NULL){
if (ret==-100)
ret=*iret[idet];
else if (ret!=*iret[idet])
ret=-1;
delete iret[idet];
}else ret=-1;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
}
}
return ret; return ret;
} }
@ -3059,7 +3084,7 @@ int multiSlsDetector::setChannel(int64_t reg, int ichan, int ichip, int imod) {
if (decodeNMod(imod, id, im)>=0) { if (decodeNMod(imod, id, im)>=0) {
dmi=id; dmi=id;
dma=dma+1; dma=id+1;
} }
for (int idet=dmi; idet<dma; idet++) { for (int idet=dmi; idet<dma; idet++) {
if (detectors[idet]) { if (detectors[idet]) {
@ -4042,51 +4067,55 @@ int multiSlsDetector::digitalTest(digitalTestMode mode, int imod) {
int multiSlsDetector::executeTrimming(trimMode mode, int par1, int par2, int imod) { int multiSlsDetector::executeTrimming(trimMode mode, int par1, int par2, int imod) {
int id, im, ret=100; int ret=100;
if (decodeNMod(imod, id, im)>=0) { // single
if (detectors[id]) { {
ret = detectors[id]->executeTrimming(mode, par1, par2, im); int id=-1, im=-1;
if(detectors[id]->getErrorMask()) if (decodeNMod(imod, id, im)>=0) {
setErrorMask(getErrorMask()|(1<<id)); if (detectors[id]) {
return ret; ret = detectors[id]->executeTrimming(mode, par1, par2, im);
} if(detectors[id]->getErrorMask())
} else if (imod<0) { setErrorMask(getErrorMask()|(1<<id));
return ret;
if(!threadpool){ }
cout << "Error in creating threadpool. Exiting" << endl;
return -1; return -1;
}else{
//return storage values
int* iret[thisMultiDetector->numberOfDetectors];
for(int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++){
if(detectors[idet]){
iret[idet]= new int(-1);
Task* task = new Task(new func4_t <int,slsDetector,trimMode,int,int,int,int>(&slsDetector::executeTrimming,
detectors[idet],mode,par1,par2,imod,iret[idet]));
threadpool->add_task(task);
}
}
threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete();
for(int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++){
if(detectors[idet]){
if(iret[idet] != NULL){
if (ret==-100)
ret=*iret[idet];
else if (ret!=*iret[idet])
ret=-1;
delete iret[idet];
}else ret=-1;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
}
}
} }
return ret;
} }
return -1;
// multi
if(!threadpool){
cout << "Error in creating threadpool. Exiting" << endl;
return -1;
}
int* iret[thisMultiDetector->numberOfDetectors];
for(int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++){
if(detectors[idet]){
iret[idet]= new int(-1);
Task* task = new Task(new func4_t <int,slsDetector,trimMode,int,int,int,int>(&slsDetector::executeTrimming,
detectors[idet],mode,par1,par2,imod,iret[idet]));
threadpool->add_task(task);
}
}
threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete();
for(int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++){
if(detectors[idet]){
if(iret[idet] != NULL){
if (ret==-100)
ret=*iret[idet];
else if (ret!=*iret[idet])
ret=-1;
delete iret[idet];
}else ret=-1;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
}
}
return ret;
} }
@ -4142,121 +4171,124 @@ int multiSlsDetector::powerChip(int ival){
int multiSlsDetector::loadSettingsFile(string fname, int imod) { int multiSlsDetector::loadSettingsFile(string fname, int imod) {
int id, im, ret=OK; int ret=OK;
if (decodeNMod(imod, id, im)>=0) { // single
if (detectors[id]) { {
ret = detectors[id]->loadSettingsFile(fname, im); int id=-1, im=-1;
if(detectors[id]->getErrorMask()) if (decodeNMod(imod, id, im)>=0) {
setErrorMask(getErrorMask()|(1<<id)); if(detectors[id]){
return ret; ret = detectors[id]->loadSettingsFile(fname, im);
} if(detectors[id]->getErrorMask())
} else if (imod<0) { setErrorMask(getErrorMask()|(1<<id));
return ret;
}
return -1;
}
}
if(!threadpool){ // multi
cout << "Error in creating threadpool. Exiting" << endl; if(!threadpool){
return -1; cout << "Error in creating threadpool. Exiting" << endl;
}else{ return -1;
//return storage values }
int* iret[thisMultiDetector->numberOfDetectors];
for(int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++){
if(detectors[idet]){
iret[idet]= new int(OK);
Task* task = new Task(new func2_t <int,slsDetector,string,int,int>(&slsDetector::loadSettingsFile,
detectors[idet],fname,imod,iret[idet]));
threadpool->add_task(task);
}
}
threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete();
for(int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++){
if(detectors[idet]){
if(iret[idet] != NULL){
if(*iret[idet] != OK)
ret = FAIL;
delete iret[idet];
}else ret = FAIL;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
}
}
}
return ret; int* iret[thisMultiDetector->numberOfDetectors];
} for(int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++){
return -1; if(detectors[idet]){
iret[idet]= new int(OK);
Task* task = new Task(new func2_t <int,slsDetector,string,int,int>(&slsDetector::loadSettingsFile,
detectors[idet],fname,imod,iret[idet]));
threadpool->add_task(task);
}
}
threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete();
for(int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++){
if(detectors[idet]){
if(iret[idet] != NULL){
if(*iret[idet] != OK)
ret = FAIL;
delete iret[idet];
}else ret = FAIL;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
}
}
return ret;
} }
int multiSlsDetector::saveSettingsFile(string fname, int imod) { int multiSlsDetector::saveSettingsFile(string fname, int imod) {
int id, im, ret; int id=-1, im=-1, ret;
if (decodeNMod(imod, id, im)>=0) {
if (detectors[id]) {
ret = detectors[id]->saveSettingsFile(fname, im);
if(detectors[id]->getErrorMask())
setErrorMask(getErrorMask()|(1<<id));
return ret;
}
} else if (imod<0) {
for (int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++) {
if (detectors[idet]) {
ret=detectors[idet]->saveSettingsFile(fname, imod);
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
}
}
return ret;
}
return -1;
if (decodeNMod(imod, id, im)>=0) {
if (detectors[id]) {
ret = detectors[id]->saveSettingsFile(fname, im);
if(detectors[id]->getErrorMask())
setErrorMask(getErrorMask()|(1<<id));
return ret;
}
return -1;
}
for (int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++) {
if (detectors[idet]) {
ret=detectors[idet]->saveSettingsFile(fname, imod);
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
}
}
return ret;
} }
int multiSlsDetector::setAllTrimbits(int val, int imod){ int multiSlsDetector::setAllTrimbits(int val, int imod){
int ret=-100,id, im; int ret=-100;
if (decodeNMod(imod, id, im)>=0) { // single
if (detectors[id]) { {
ret=detectors[id]->setAllTrimbits(val,im); int id=-1, im=-1;
if(detectors[id]->getErrorMask()) if (decodeNMod(imod, id, im)>=0) {
setErrorMask(getErrorMask()|(1<<id)); if(detectors[id]){
ret = detectors[id]->setAllTrimbits(val,im);
if(detectors[id]->getErrorMask())
setErrorMask(getErrorMask()|(1<<id));
return ret;
}
return -1;
} }
} }
else if (imod<0) {
if(!threadpool){ // multi
cout << "Error in creating threadpool. Exiting" << endl; if(!threadpool){
return -1; cout << "Error in creating threadpool. Exiting" << endl;
}else{ return -1;
//return storage values }
int* iret[thisMultiDetector->numberOfDetectors]; int* iret[thisMultiDetector->numberOfDetectors];
for(int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++){ for(int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++){
if(detectors[idet]){ if(detectors[idet]){
iret[idet]= new int(-1); iret[idet]= new int(-1);
Task* task = new Task(new func2_t <int,slsDetector,int,int,int>(&slsDetector::setAllTrimbits, Task* task = new Task(new func2_t <int,slsDetector,int,int,int>(&slsDetector::setAllTrimbits,
detectors[idet],val,imod,iret[idet])); detectors[idet],val,imod,iret[idet]));
threadpool->add_task(task); threadpool->add_task(task);
} }
} }
threadpool->startExecuting(); threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete(); threadpool->wait_for_tasks_to_complete();
for(int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++){ for(int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++){
if(detectors[idet]){ if(detectors[idet]){
if(iret[idet] != NULL){ if(iret[idet] != NULL){
if (ret==-100) if (ret==-100)
ret=*iret[idet]; ret=*iret[idet];
else if (ret!=*iret[idet]) else if (ret!=*iret[idet])
ret=-1; ret=-1;
delete iret[idet]; delete iret[idet];
}else ret=-1; }else ret=-1;
if(detectors[idet]->getErrorMask()) if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet)); setErrorMask(getErrorMask()|(1<<idet));
}
}
} }
} }
return ret; return ret;
@ -4267,73 +4299,75 @@ int multiSlsDetector::setAllTrimbits(int val, int imod){
int multiSlsDetector::loadCalibrationFile(string fname, int imod) { int multiSlsDetector::loadCalibrationFile(string fname, int imod) {
int id, im, ret = OK; int ret = OK;
if (decodeNMod(imod, id, im)>=0) { // single
if (detectors[id]) { {
ret = detectors[id]->loadCalibrationFile(fname, im); int id=-1, im=-1;
if(detectors[id]->getErrorMask()) if (decodeNMod(imod, id, im)>=0) {
setErrorMask(getErrorMask()|(1<<id)); if(detectors[id]){
return ret; ret = detectors[id]->loadCalibrationFile(fname, im);
} if(detectors[id]->getErrorMask())
} else if (imod<0) { setErrorMask(getErrorMask()|(1<<id));
return ret;
if(!threadpool){ }
cout << "Error in creating threadpool. Exiting" << endl;
return -1; return -1;
}else{
//return storage values
int* iret[thisMultiDetector->numberOfDetectors];
for(int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++){
if(detectors[idet]){
iret[idet]= new int(OK);
Task* task = new Task(new func2_t <int,slsDetector,string,int,int>(&slsDetector::loadCalibrationFile,
detectors[idet],fname,imod,iret[idet]));
threadpool->add_task(task);
}
}
threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete();
for(int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++){
if(detectors[idet]){
if(iret[idet] != NULL){
if(*iret[idet] != OK)
ret = FAIL;
delete iret[idet];
}else ret = FAIL;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
}
}
} }
return ret;
} }
return -1;
// multi
if(!threadpool){
cout << "Error in creating threadpool. Exiting" << endl;
return -1;
}
int* iret[thisMultiDetector->numberOfDetectors];
for(int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++){
if(detectors[idet]){
iret[idet]= new int(OK);
Task* task = new Task(new func2_t <int,slsDetector,string,int,int>(&slsDetector::loadCalibrationFile,
detectors[idet],fname,imod,iret[idet]));
threadpool->add_task(task);
}
}
threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete();
for(int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++){
if(detectors[idet]){
if(iret[idet] != NULL){
if(*iret[idet] != OK)
ret = FAIL;
delete iret[idet];
}else ret = FAIL;
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
}
}
return ret;
} }
int multiSlsDetector::saveCalibrationFile(string fname, int imod) { int multiSlsDetector::saveCalibrationFile(string fname, int imod) {
int id, im, ret; int id=-1, im=-1, ret;
if (decodeNMod(imod, id, im)>=0) {
if (detectors[id]) {
ret = detectors[id]->saveCalibrationFile(fname, im);
if(detectors[id]->getErrorMask())
setErrorMask(getErrorMask()|(1<<id));
return ret;
}
} else if (imod<0) {
for (int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++) {
if (detectors[idet]) {
ret=detectors[idet]->saveCalibrationFile(fname, imod);
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
}
}
return ret;
}
return -1;
if (decodeNMod(imod, id, im)>=0) {
if (detectors[id]) {
ret = detectors[id]->saveCalibrationFile(fname, im);
if(detectors[id]->getErrorMask())
setErrorMask(getErrorMask()|(1<<id));
return ret;
}
return -1;
}
for (int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++) {
if (detectors[idet]) {
ret=detectors[idet]->saveCalibrationFile(fname, imod);
if(detectors[idet]->getErrorMask())
setErrorMask(getErrorMask()|(1<<idet));
}
}
return ret;
} }

View File

@ -522,10 +522,10 @@ class multiSlsDetector : public slsDetectorUtils {
int powerChip(int ival= -1); int powerChip(int ival= -1);
/** loads the modules settings/trimbits reading from a file - file name extension is automatically generated! */ /** loads the modules settings/trimbits reading from a file - file name extension is automatically generated! */
int loadSettingsFile(string fname, int nmod=0); int loadSettingsFile(string fname, int nmod=-1);
/** gets the modules settings/trimbits and writes them to file - file name extension is automatically generated! */ /** gets the modules settings/trimbits and writes them to file - file name extension is automatically generated! */
int saveSettingsFile(string fname, int nmod=0); int saveSettingsFile(string fname, int nmod=-1);
/** sets all the trimbits to a particular value /** sets all the trimbits to a particular value
@ -537,10 +537,10 @@ class multiSlsDetector : public slsDetectorUtils {
/** loads the modules calibration data reading from a file - file name extension is automatically generated! */ /** loads the modules calibration data reading from a file - file name extension is automatically generated! */
int loadCalibrationFile(string fname, int nmod=0); int loadCalibrationFile(string fname, int nmod=-1);
/** gets the modules calibration data and writes them to file - file name extension is automatically generated! */ /** gets the modules calibration data and writes them to file - file name extension is automatically generated! */
int saveCalibrationFile(string fname, int nmod=0); int saveCalibrationFile(string fname, int nmod=-1);

View File

@ -555,7 +555,7 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing {
\param imod module number \param imod module number
\returns current ADC value \returns current ADC value
*/ */
virtual dacs_t getADC(dacIndex index, int imod=0)=0; virtual dacs_t getADC(dacIndex index, int imod=-1)=0;
/** /**
get the maximum size of the detector get the maximum size of the detector

View File

@ -1,7 +1,9 @@
#ifndef COMMON_SERVER_FUNCTIONS_H #ifndef COMMON_SERVER_FUNCTIONS_H
#define COMMON_SERVER_FUNCTIONS_H #define COMMON_SERVER_FUNCTIONS_H
#ifndef GOTTHARDD //gotthard already had bus_w etc defined in its firmware_funcs.c (not yet made with common files)
#include "blackfin.h" #include "blackfin.h"
#endif
/* global variables */ /* global variables */
void serializeToSPI(u_int32_t addr, u_int32_t val, u_int16_t csmask, int numbitstosend, u_int16_t clkmask, u_int16_t digoutmask, int digofset) { void serializeToSPI(u_int32_t addr, u_int32_t val, u_int16_t csmask, int numbitstosend, u_int16_t clkmask, u_int16_t digoutmask, int digofset) {