- Fixed sign problems with om in tasub
- Mended tasdrive to drive energy even if Q is askew - Fixed QM values - Fixed problems in mesure: om2th, wrong theta selection - Fixed core dump when driving h,kl, failed
This commit is contained in:
90
tasdrive.c
90
tasdrive.c
@ -29,7 +29,7 @@
|
||||
#define ACH 11
|
||||
|
||||
/*============== Drivable Interface functions =====================*/
|
||||
static int TASSetValue(void *pData, SConnection *pCon,
|
||||
static long TASSetValue(void *pData, SConnection *pCon,
|
||||
float value){
|
||||
ptasMot self = (ptasMot)pData;
|
||||
assert(self);
|
||||
@ -142,7 +142,8 @@ static float TASQMGetValue(void *pData, SConnection *pCon){
|
||||
if(status != 1){
|
||||
return -999.99;
|
||||
}
|
||||
status = calcTasPowderPosition(&self->math->machine, angles, &self->math->current);
|
||||
status = calcTasPowderPosition(&self->math->machine,
|
||||
angles, &self->math->current);
|
||||
if(status < 0){
|
||||
SCWrite(pCon,"ERROR: out of memory calculating Q-E variables",eError);
|
||||
return -999.99;
|
||||
@ -176,7 +177,7 @@ static int TASHalt(void *pData){
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int startMotors(ptasMot self, tasAngles angles,
|
||||
SConnection *pCon){
|
||||
SConnection *pCon, int driveQ){
|
||||
float val;
|
||||
double curve;
|
||||
int status;
|
||||
@ -276,6 +277,9 @@ static int startMotors(ptasMot self, tasAngles angles,
|
||||
}
|
||||
}
|
||||
}
|
||||
if(driveQ == 0){
|
||||
return OKOK;
|
||||
}
|
||||
|
||||
/*
|
||||
crystal
|
||||
@ -319,39 +323,95 @@ static int startMotors(ptasMot self, tasAngles angles,
|
||||
self->math->mustDrive = 0;
|
||||
return OKOK;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int checkQMotorLimits(ptasMot self, SConnection *pCon,
|
||||
tasAngles angles){
|
||||
int status, retVal = 1;
|
||||
char error[131];
|
||||
char pBueffel[256];
|
||||
|
||||
status = self->math->motors[A3]->pDrivInt->CheckLimits(self->math->motors[A3],
|
||||
angles.a3,
|
||||
error,
|
||||
131);
|
||||
if(status != 1) {
|
||||
retVal = 0;
|
||||
snprintf(pBueffel,256,"ERROR: limit violation an a3: %s", error);
|
||||
SCWrite(pCon,pBueffel,eError);
|
||||
}
|
||||
|
||||
status = self->math->motors[A4]->pDrivInt->CheckLimits(self->math->motors[A4],
|
||||
angles.sample_two_theta,
|
||||
error,
|
||||
131);
|
||||
if(status != 1) {
|
||||
retVal = 0;
|
||||
snprintf(pBueffel,256,"ERROR: limit violation an a4: %s", error);
|
||||
SCWrite(pCon,pBueffel,eError);
|
||||
}
|
||||
|
||||
status = self->math->motors[A3]->pDrivInt->CheckLimits(self->math->motors[SGU],
|
||||
angles.sgu,
|
||||
error,
|
||||
131);
|
||||
if(status != 1) {
|
||||
retVal = 0;
|
||||
snprintf(pBueffel,256,"ERROR: limit violation an SGU: %s", error);
|
||||
SCWrite(pCon,pBueffel,eError);
|
||||
}
|
||||
|
||||
status = self->math->motors[SGL]->pDrivInt->CheckLimits(self->math->motors[SGL],
|
||||
angles.sgl,
|
||||
error,
|
||||
131);
|
||||
if(status != 1) {
|
||||
retVal = 0;
|
||||
snprintf(pBueffel,256,"ERROR: limit violation an SGL: %s", error);
|
||||
SCWrite(pCon,pBueffel,eError);
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
static int calculateAndDrive(ptasMot self, SConnection *pCon){
|
||||
tasAngles angles;
|
||||
int status;
|
||||
int status, driveQ = 1;
|
||||
|
||||
if(self->math->ubValid == 0){
|
||||
SCWrite(pCon,"WARNING: UB matrix invalid",eWarning);
|
||||
}
|
||||
status = calcAllTasAngles(&self->math->machine, self->math->target,
|
||||
&angles);
|
||||
self->math->mustDrive = 0;
|
||||
switch(status){
|
||||
case ENERGYTOBIG:
|
||||
SCWrite(pCon,"ERROR: desired energy to big",eError);
|
||||
self->math->mustDrive = 0;
|
||||
return HWFault;
|
||||
break;
|
||||
|
||||
case UBNOMEMORY:
|
||||
SCWrite(pCon,"ERROR: out of memory calculating angles",eError);
|
||||
self->math->mustDrive = 0;
|
||||
return HWFault;
|
||||
driveQ = 0;
|
||||
break;
|
||||
case BADRMATRIX:
|
||||
SCWrite(pCon,"ERROR: bad crystallographic parameters or bad UB",eError);
|
||||
self->math->mustDrive = 0;
|
||||
return HWFault;
|
||||
driveQ = 0;
|
||||
break;
|
||||
case BADUBORQ:
|
||||
SCWrite(pCon,"ERROR: bad UB matrix or bad Q-vector",eError);
|
||||
driveQ = 0;
|
||||
break;
|
||||
case TRIANGLENOTCLOSED:
|
||||
SCWrite(pCon,"ERROR: cannot close scattering triangle",eError);
|
||||
self->math->mustDrive = 0;
|
||||
return HWFault;
|
||||
driveQ = 0;
|
||||
break;
|
||||
default:
|
||||
return startMotors(self,angles,pCon);
|
||||
}
|
||||
return HWFault;
|
||||
if(!checkQMotorLimits(self,pCon,angles)){
|
||||
driveQ = 0;
|
||||
}
|
||||
|
||||
if(driveQ == 0){
|
||||
SCWrite(pCon,"WARNING: NOT driving Q-vector because of errors",eError);
|
||||
}
|
||||
return startMotors(self,angles,pCon, driveQ);
|
||||
}
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
static int checkMotors(ptasMot self, SConnection *pCon){
|
||||
|
Reference in New Issue
Block a user