From 8a1a808fe536d201fdb4e8119e96e15873b65669 Mon Sep 17 00:00:00 2001 From: koennecke Date: Fri, 24 Nov 2006 15:52:51 +0000 Subject: [PATCH] - Fixed bugs in sinqhttp.c, most notatbly the unknown error on hm init - Added first slit to amorset - Added untested code for the POLDI strees machine --- amordrive.h | 1 + amorset.c | 74 +++++++---- amorset.h | 2 + amorset.tex | 1 + amorset.w | 1 + amorstat.c | 6 +- el737driv.c | 4 +- el737hpdriv.c | 4 + julcho.c | 26 +++- libpsi.a | Bin 1947698 -> 1995674 bytes make_gen | 2 +- poldizug.c | 358 ++++++++++++++++++++++++++++++++++++++++++++++++++ poldizug.h | 19 +++ psi.c | 3 + sinqhttp.c | 102 +++++++------- slsmagnet.c | 10 +- tabledrive.c | 66 ++++++++-- 17 files changed, 591 insertions(+), 88 deletions(-) create mode 100644 poldizug.c create mode 100644 poldizug.h diff --git a/amordrive.h b/amordrive.h index dd192d0..d1a53c5 100644 --- a/amordrive.h +++ b/amordrive.h @@ -22,3 +22,4 @@ int AmorDriveAction(SConnection *pCon, SicsInterp *pSics, void *pData, int argc, char *argv[]); #endif + diff --git a/amorset.c b/amorset.c index d49057d..46af797 100644 --- a/amorset.c +++ b/amorset.c @@ -29,11 +29,16 @@ static int readMotors(pamorSet self, SConnection *pCon){ float val; result = LLDcreate(sizeof(MotControl)); - status = addMotorToList(result,"d2t",.0); - if(status != 1){ - SCWrite(pCon,"ERROR: configuration error: d2t not found", eError); - return -1; - } + status = addMotorToList(result,"d1t",.0); + if(status != 1){ + SCWrite(pCon,"ERROR: configuration error: d1t not found", eError); + return -1; + } + status = addMotorToList(result,"d2t",.0); + if(status != 1){ + SCWrite(pCon,"ERROR: configuration error: d2t not found", eError); + return -1; + } status = addMotorToList(result,"d3t",.0); if(status != 1){ SCWrite(pCon,"ERROR: configuration error: d3t not found", eError); @@ -91,21 +96,37 @@ static int calcAmorSettings(pamorSet self,SConnection *pCon){ val = dist*Tand(-self->targetm2t) - self->dspar; addMotorToList(self->driveList,"dbs",val); } + + /* + * slit 1 is before the monochromator and does not need to be + * driven when m2t changes. This is here to make sure that d1b is + * in a feasible position. + */ + if(self->D1.activeFlag == 1){ + mot = getListMotorPosition(readList,"d1t"); + if(mot < -99999){ + SCWrite(pCon,"WARNING: skipping d1 because of bad read on d1t", + eWarning); + } else { + val = - .5 * mot; + addMotorToList(self->driveList,"d1b",val); + } + } - /* - * slit 2 - */ - if(self->D2.activeFlag == 1){ - dist = ABS(calcCompPosition(&self->D2) - calcCompPosition(&self->M)); - mot = getListMotorPosition(readList,"d2t"); - if(mot < -99999){ - SCWrite(pCon,"WARNING: skipping d2 because of bad read on d2t", - eWarning); - } else { - val = dist*Tand(-self->targetm2t) - .5 * mot; - addMotorToList(self->driveList,"d2b",val); - } - } + /* + * slit 2 + */ + if(self->D2.activeFlag == 1){ + dist = ABS(calcCompPosition(&self->D2) - calcCompPosition(&self->M)); + mot = getListMotorPosition(readList,"d2t"); + if(mot < -99999){ + SCWrite(pCon,"WARNING: skipping d2 because of bad read on d2t", + eWarning); + } else { + val = dist*Tand(-self->targetm2t) - .5 * mot; + addMotorToList(self->driveList,"d2b",val); + } + } /* * slit 3 @@ -362,7 +383,8 @@ static int amorSetSave(void *data, char *name,FILE *fd){ saveAmorComp(fd,name,"chopper",&self->chopper); saveAmorComp(fd,name,"mono",&self->M); saveAmorComp(fd,name,"ds",&self->DS); - saveAmorComp(fd,name,"slit2",&self->D2); + saveAmorComp(fd,name,"slit1",&self->D2); + saveAmorComp(fd,name,"slit2",&self->D2); saveAmorComp(fd,name,"slit3",&self->D3); saveAmorComp(fd,name,"sample",&self->S); saveAmorComp(fd,name,"slit4",&self->D4); @@ -423,7 +445,9 @@ static void killAmorSet(void *data){ /*-------------------------------------------------------------------*/ static int testRequiredMotors(SConnection *pCon){ char motList[][20] = {"soz", "com", - "cox","coz","dbs","d2b","d2t", + "cox","coz","dbs", + "d1t", "d1b", + "d2b","d2t", "d3b", "d3t", "d4b","d4t", "d5t", "d5b","aoz", "aom"}; int i = 0, status = 1; @@ -431,7 +455,7 @@ static int testRequiredMotors(SConnection *pCon){ char pBueffel[132]; - for(i = 0; i < 15; i++){ + for(i = 0; i < 17; i++){ pMot = NULL; pMot = FindMotor(pServ->pSics,motList[i]); if(pMot == NULL){ @@ -507,8 +531,10 @@ static pamorComp locateComponent(pamorSet self, char *name){ return &self->M; } else if(strcmp(name,"ds") == 0){ return &self->DS; - }else if(strcmp(name,"slit2") == 0){ - return &self->D2; + }else if(strcmp(name,"slit1") == 0){ + return &self->D1; + }else if(strcmp(name,"slit2") == 0){ + return &self->D2; }else if(strcmp(name,"slit3") == 0){ return &self->D3; }else if(strcmp(name,"sample") == 0){ diff --git a/amorset.h b/amorset.h index f483d59..f772d67 100644 --- a/amorset.h +++ b/amorset.h @@ -19,6 +19,7 @@ typedef struct { amorComp chopper; amorComp M; amorComp DS; + amorComp D1; amorComp D2; amorComp D3; amorComp S; @@ -50,3 +51,4 @@ double amorGetMotor(pamorSet amor, SConnection *pCon, int type); #endif + diff --git a/amorset.tex b/amorset.tex index ca91dd8..d575d02 100644 --- a/amorset.tex +++ b/amorset.tex @@ -70,6 +70,7 @@ $\langle$amorsetint {\footnotesize ?}$\rangle\equiv$ \mbox{}\verb@ amorComp chopper;@\\ \mbox{}\verb@ amorComp M;@\\ \mbox{}\verb@ amorComp DS;@\\ +\mbox{}\verb@ amorComp D1;@\\ \mbox{}\verb@ amorComp D2;@\\ \mbox{}\verb@ amorComp D3;@\\ \mbox{}\verb@ amorComp S;@\\ diff --git a/amorset.w b/amorset.w index 2a7140a..e9e6ff3 100644 --- a/amorset.w +++ b/amorset.w @@ -53,6 +53,7 @@ typedef struct { amorComp chopper; amorComp M; amorComp DS; + amorComp D1; amorComp D2; amorComp D3; amorComp S; diff --git a/amorstat.c b/amorstat.c index 354dbac..54037a7 100644 --- a/amorstat.c +++ b/amorstat.c @@ -593,7 +593,11 @@ { snprintf(hmCommand,255,"sum:2:0:%d",iDim[2]); - data = self->pHM->pDriv->SubSample(self->pHM->pDriv,pCon,0,hmCommand); + if(self->pHM->pDriv->SubSample != NULL){ + data = self->pHM->pDriv->SubSample(self->pHM->pDriv,pCon,0,hmCommand); + } else { + data = NULL; + } if(data == NULL) { SCWrite(pCon,"ERROR: failed to retrieve collapsed data from HM", eError); diff --git a/el737driv.c b/el737driv.c index 92f5aa5..3321cb3 100644 --- a/el737driv.c +++ b/el737driv.c @@ -515,11 +515,11 @@ if(strcmp(name,"threshold") == 0) { - sprintf(pCommand,"DL %1.1d %f\r",iCter,fVal); + sprintf(pCommand,"DL %1.1d %6.2f\r",iCter,fVal); iRet = EL737_SendCmnd(&pEL737->pData,pCommand,pReply,79); if(iRet == 1) { - if(pCommand[0] == '?') + if(pReply[0] == '?') { self->iErrorCode = BADCOUNTER; return HWFault; diff --git a/el737hpdriv.c b/el737hpdriv.c index 1217f07..e7cfe61 100644 --- a/el737hpdriv.c +++ b/el737hpdriv.c @@ -412,6 +412,9 @@ static int EL737GetError(struct __COUNTER *self, int *iCode, case OFFLINE: strncpy(pError,"EL737 is offline",errLen); break; + case OVERFLOW: + strncpy(pError,"EL737 reported overflow, communication problem",errLen); + break; case BADRANGE: strncpy(pError,"EL737 parameter is out of range",errLen); break; @@ -468,6 +471,7 @@ static int EL737FixIt(struct __COUNTER *self, int iCode){ case NOPARAM: case BADRANGE: case BADTRANGE: + case OVERFLOW: return COREDO; break; case BADREPLY: diff --git a/julcho.c b/julcho.c index 852b44a..f8086b6 100644 --- a/julcho.c +++ b/julcho.c @@ -17,6 +17,7 @@ #include #include #include +#include #define CHOCOINTERNAL #include #include @@ -41,6 +42,8 @@ /*--------------------- update flags -------------------------------------*/ #define ALL 1 #define SPEED 2 +/*--------------------- wait after set -----------------------------------*/ +#define STWAIT 5 /*------------------------- chopper internal names -----------------------*/ #define CH1N "snail" #define CH2N "master" @@ -381,6 +384,7 @@ static int ReadJulChoFlags(pJulCho self){ char reply[256]; status = JulChoTransact(self,"RSC",reply,255); +/* fprintf(stdout,"Chopper flags = %s\n", reply);*/ if(status < 0){ self->errorCode = status; return 0; @@ -911,6 +915,12 @@ static int JulChoSetPar2(pCodri pDriv, char *parname, char *pValue){ self->errorCode = status; return 0; } + /* + * The SicsWait is here to allow the chopper to update his status flags. + * There were occurrences where the chopper was still driving but the + * status flag did not reflect this. + */ + SicsWait(STWAIT); self->lastUpdate = 0; return status; } @@ -958,6 +968,12 @@ static int JulChoSetPar(pCodri pDriv, char *parname, float fValue){ self->errorCode = status; return 0; } + /* + * The SicsWait is here to allow the chopper to update his status flags. + * There were occurrences where the chopper was still driving but the + * status flag did not reflect this. + */ + SicsWait(STWAIT); self->lastUpdate = 0; return status; } @@ -1015,8 +1031,8 @@ static int JulChoGetPar(pCodri pDriv, char *parname, /*---------------------------------------------------------------------------*/ static int JulChoCheckPar(pCodri pDriv, char *parname){ pJulCho self = NULL; - int i; - char path[256]; + int i, status; + char path[256], reply[256]; pHdb target = NULL; char *chNames[] = {CH1N, CH2N, @@ -1052,6 +1068,12 @@ static int JulChoCheckPar(pCodri pDriv, char *parname){ return HWBusy; } } + status = JulChoTransact(self,"RSC",reply,255); + if(status < 0){ + self->errorCode = status; + return HWFault; + } +/* fprintf(stdout,"Chopper Flags at finish: %s\n", reply);*/ return HWIdle; } /*---------------------------------------------------------------------------*/ diff --git a/libpsi.a b/libpsi.a index c9c2d54a0b82033b1af42e9e2b2c2744526a184e..981de56d09fb8d7f2536c0928f15ec1214dcfa81 100644 GIT binary patch delta 102922 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 YZ0C8+!GavE8=QTJdvt#tEI2piIgK`1@c;k- diff --git a/make_gen b/make_gen index e8c7445..360050f 100644 --- a/make_gen +++ b/make_gen @@ -18,7 +18,7 @@ OBJ=psi.o buffer.o ruli.o dmc.o nxsans.o nextrics.o sps.o pimotor.o \ el737hpv2driv.o swmotor2.o tricssupport.o amorcomp.o \ $(MZOBJ) amordrive.o amorset.o tcpdornier.o sinqhttp.o\ dgrambroadcast.o sinq.o tabledrive.o tcpdocho.o julcho.o \ - ritastorage.o + ritastorage.o poldizug.o MZOBJ=fsm.o logger.o sugar.o pardef.o ease.o strobj.o oxinst.o logreader.o \ ipsdriv.o ilmdriv.o itcdriv.o ighdriv.o euro2kdriv.o modbus.o arrobj.o \ diff --git a/poldizug.c b/poldizug.c new file mode 100644 index 0000000..4365ec7 --- /dev/null +++ b/poldizug.c @@ -0,0 +1,358 @@ +/** + * This is the implementation of a SICS access module for the POLDI + * pull machine for testing mechanical samples. This thing is a one + * of a kind; therefore its implementation does not follow the usual + * SICS distinction between hardware object and driver. The thing can + * operate in two modes: either a force is driven or a position. + * + * copyright: see file COPYRIGHT + * + * Mark Koennecke, October 2006 + */ +#include +#include +#include +/*===============================================================*/ +#define FORCE 0 +#define ZUGPOS 1 +/*---------------------------------------------------------------*/ +typedef struct { + pObjectDescriptor pDes; + pIDrivable pDriv; + prs232 controller; + int iMode; + float maxForce, minForce; + float maxPos, minPos; +}PZR, *pPZR; +/*--------------------------------------------------------------*/ +static int PZRCommand(prs232 controller, SConnection *pCon, + char *command, + char *reply, int replyLen){ + int status, i; + char buffer[512], error[132]; + + /* + * try three times to get our message through... + */ + for(i = 0; i < 3; i++){ + status = transactRS232(controller,command, strlen(command), + reply, replyLen); + if(status == 1){ + return 1; + } + /* + * error processing + */ + memset(error,0,132); + getRS232Error(status,error,131); + status = fixRS232Error(controller,status); + if(pCon != NULL){ + if(status == 1){ + snprintf(buffer,511,"WARNING: trying to fix: %s", + error); + SCWrite(pCon,buffer,eWarning); + } else { + snprintf(buffer,511,"ERROR: %s", + error); + SCWrite(pCon,buffer,eError); + } + } + if(status == 0){ + return HWFault; + } + } + return HWFault; +} +/*===============================================================*/ +static void *PZRGetInterface(void *data, int iD){ + pPZR self = NULL; + + self = (pPZR)data; + if(self != NULL && iD == DRIVEID){ + return self->pDriv; + } else { + return NULL; + } + return NULL; +} +/*---------------------------------------------------------------- + This routine can return either OKOK or HWFault when thing + go wrong. However, the return value of Halt is usually ignored! +------------------------------------------------------------------*/ +static int PZRHalt(void *data) { + pPZR self = NULL; + char buffer[80]; + + self = (pPZR)data; + + PZRCommand(self->controller,NULL,"stop\n",buffer,79); + + return OKOK; +} +/*---------------------------------------------------------------- + This routine can return either 1 or 0. 1 means the position can + be reached, 0 NOT + If 0, error shall contain up to errlen characters of information + about which limit was violated +------------------------------------------------------------------*/ +static int PZRCheckLimits(void *data, float val, + char *error, int errlen){ + pPZR self = NULL; + + self = (pPZR)data; + if(self->iMode == FORCE){ + if(val < self->minForce || val > self->maxForce){ + snprintf(error,errlen,"%f is not within limits %f to %f", + val,self->minForce, self->maxForce); + return 0; + } + } else { + if(val < self->minPos || val > self->maxPos){ + snprintf(error,errlen,"%f is not within limits %f to %f", + val,self->minPos, self->maxPos); + return 0; + } + } + return 1; +} +/*---------------------------------------------------------------- + This routine can return 0 when a limit problem occurred + OKOK when the motor was successfully started + HWFault when a problem occured starting the device + Possible errors shall be printed to pCon + For real motors, this is supposed to try at least three times + to start the motor in question + val is the value to drive the motor too +------------------------------------------------------------------*/ +static long PZRSetValue(void *data, SConnection *pCon, float val){ + pPZR self = NULL; + char command[80], reply[80]; + int status; + + self = (pPZR)data; + + if(self->iMode == FORCE){ + snprintf(command,79,"wr force %f\n", val); + } else { + snprintf(command,79,"wr vel %f\n", val); + } + status = PZRCommand(self->controller, pCon, command, reply, 79); + if(status == 1){ + return OKOK; + } else { + return HWFault; + } + return HWFault; +} +/*---------------------------------------------------------------- + Checks the status of a running motor. Possible return values + HWBusy The motor is still running + OKOK or HWIdle when the motor finished driving + HWFault when a hardware problem ocurred + HWPosFault when the hardware cannot reach a position + Errors are duly to be printed to pCon + For real motors CheckStatus again shall try hard to fix any + issues with the motor +------------------------------------------------------------------*/ +static int PZRCheckStatus(void *data, SConnection *pCon){ + pPZR self = NULL; + int status, code; + char command[80], reply[80], bits[1]; + + self = (pPZR)data; + snprintf(command,79,"rd stat\n"); + status = PZRCommand(self->controller, pCon, command, reply, 79); + if(status != 1){ + return HWFault; + } + sscanf(reply,"%x", &code); + bits[0] = (char)code; + /* + * check for errors + */ + if(BITSET(bits,3)){ + SCWrite(pCon,"ERROR: BANG! Sample broken!",eError); + return HWFault; + } + if(BITSET(bits,4)){ + SCWrite(pCon,"ERROR: hit positive limit switch",eError); + return HWFault; + } + if(BITSET(bits,5)){ + SCWrite(pCon,"ERROR: hit negative limit switch",eError); + return HWFault; + } + if(BITSET(bits,7)){ + SCWrite(pCon,"ERROR: general and overall error",eError); + return HWFault; + } + if(BITSET(bits,2)){ + return HWBusy; + } else { + return HWIdle; + } + + return HWFault; +} +/*---------------------------------------------------------------- + GetValue is supposed to read a motor position + On errors, -99999999.99 is returned and messages printed to pCon +------------------------------------------------------------------*/ +static float PZRGetValue(void *data, SConnection *pCon){ + pPZR self = NULL; + float val = -99999999.99; + int status; + char command[80], reply[80]; + + self = (pPZR)data; + if(self->iMode == FORCE){ + snprintf(command,79,"rd force\n"); + } else { + snprintf(command,79,"rd vel\n"); + } + status = PZRCommand(self->controller, pCon, command, reply, 79); + if(status != 1){ + return HWFault; + } + sscanf(reply,"%f",&val); + return val; +} +/*---------------------------------------------------------------- + returns NULL on failure, a new datastructure else +------------------------------------------------------------------*/ +static pPZR PZRMakeObject(char *host, int port){ + pPZR self = NULL; + + self = malloc(sizeof(PZR)); + if(self == NULL){ + return NULL; + } + self->pDes = CreateDescriptor("PoldiReiss"); + self->pDriv = CreateDrivableInterface(); + self->controller = createRS232(host,port); + if(self->pDes == NULL || self->pDriv == NULL || self->controller == NULL){ + free(self); + return NULL; + } + initRS232(self->controller); + setRS232SendTerminator(self->controller,"\n"); + setRS232ReplyTerminator(self->controller,"\n"); + setRS232Timeout(self->controller,1000); + setRS232Debug(self->controller,1); + + + self->pDes->GetInterface = PZRGetInterface; + self->pDriv->Halt = PZRHalt; + self->pDriv->CheckLimits = PZRCheckLimits; + self->pDriv->SetValue = PZRSetValue; + self->pDriv->CheckStatus = PZRCheckStatus; + self->pDriv->GetValue = PZRGetValue; + + return self; +} +/*--------------------------------------------------------------------------*/ +static void killPoldiZug(void *data){ + pPZR self = (pPZR)data; + + if(self == NULL){ + return; + } + if(self->pDes != NULL){ + DeleteDescriptor(self->pDes); + } + if(self->controller != NULL){ + closeRS232(self->controller); + KillRS232(self->controller); + } + free(self); +} +/*============================================================================*/ +static int PoldiReissAction(SConnection *pCon, SicsInterp *pSics, + void *pData, int argc, char *argv[]){ + pPZR self = NULL; + char command[80], reply[80]; + float val; + int status; + + self = (pPZR)pData; + assert(self != NULL); + + if(argc > 1) { + strtolower(argv[1]); + if(strcmp(argv[1],"mode") == 0) { + if(argc > 2){ + if(!SCMatchRights(pCon,usUser)){ + return 0; + } + strtolower(argv[2]); + if(strcmp(argv[2],"force") == 0) { + status = PZRCommand(self->controller, pCon, + "wr mode 1\n", reply,79); + if(status == 1){ + self->iMode == FORCE; + SCSendOK(pCon); + return 1; + } else { + return 0; + } + } else if(strcmp(argv[2],"pos") == 0) { + status = PZRCommand(self->controller, pCon, + "wr mode 0\n", reply,79); + if(status == 1){ + self->iMode == ZUGPOS; + SCSendOK(pCon); + return 1; + } else { + return 0; + } + } else { + SCWrite(pCon,"ERROR: zug mode unknown, allowed force, pos", + eError); + return 0; + } + } + } else { + if(self->iMode == FORCE){ + snprintf(command,79,"%s.mode = force",argv[0]); + } else { + snprintf(command,79,"%s.mode = pos",argv[0]); + } + SCWrite(pCon,command,eValue); + return 1; + } + } + val = self->pDriv->GetValue(self,pCon); + snprintf(command,79,"%s = %f", argv[0], val); + SCWrite(pCon,command,eValue); + return 1; +} +/*---------------------------------------------------------------------------- + * MakePoldiReiss name host port minForce maxForce minPos maxPos + * ---------------------------------------------------------------------------*/ +int MakePoldiReiss(SConnection *pCon, SicsInterp *pSics, + void *pData, int argc, char *argv[]){ + pPZR self = NULL; + char reply[80]; + + if(argc < 8) { + SCWrite(pCon,"ERROR: not enough arguments to MakePoldiReiss",eError); + return 0; + } + self = PZRMakeObject(argv[2],atoi(argv[3])); + if(self == NULL){ + SCWrite(pCon,"ERROR: out of memory making PoldiReiss",eError); + return 0; + } + self->minForce = atof(argv[4]); + self->maxForce = atof(argv[5]); + self->minPos = atof(argv[6]); + self->maxPos = atof(argv[7]); + PZRCommand(self->controller, pCon, + "wr mode 1\n", reply,79); + + AddCommand(pSics,argv[1], + PoldiReissAction, + killPoldiZug, + self); + return 1; +} diff --git a/poldizug.h b/poldizug.h new file mode 100644 index 0000000..559e013 --- /dev/null +++ b/poldizug.h @@ -0,0 +1,19 @@ +/** + * This is the implementation of a SICS access module for the POLDI + * pull machine for testing mechanical samples. This thing is a one + * of a kind; therefore its implementation does not follow the usual + * SICS distinction between hardware object and driver. The thing can + * operate in two modes: either a force is driven or a position. + * + * There is only the creation function here, everything else is in poldizug.c + * + * copyright: see file COPYRIGHT + * + * Mark Koennecke, October 2006 + */ +#ifndef POLDIZUG_H_ +#define POLDIZUG_H_ +#include +int MakePoldiReiss(SConnection *pCon, SicsInterp *pSics, + void *pData, int argc, char *argv[]); +#endif /*POLDIZUG_H_*/ diff --git a/psi.c b/psi.c index a6063fc..d48fd79 100644 --- a/psi.c +++ b/psi.c @@ -55,6 +55,7 @@ #include "tabledrive.h" #include "amorset.h" #include "sinqhttp.h" +#include "poldizug.h" /* from tcpdornier.c */ @@ -121,6 +122,7 @@ static void AddPsiCommands(SicsInterp *pInter){ AddCommand(pInter,"MakeTCPSelector",VelSelTcpFactory,NULL,NULL); AddCommand(pInter,"MakeJulCho",JulChoFactory,NULL,NULL); AddCommand(pInter,"MakeRitaFix",MakeRitaFix,NULL,NULL); + AddCommand(pInter,"MakePoldiReiss",MakePoldiReiss,NULL,NULL); /* AddCommand(pInter,"MakeDifrac",MakeDifrac,NULL,NULL); */ @@ -143,6 +145,7 @@ static void RemovePsiCommands(SicsInterp *pSics){ RemoveCommand(pSics,"MakeTCPSelector"); RemoveCommand(pSics,"MakeJulCho"); RemoveCommand(pSics,"MakeRitaFix"); + RemoveCommand(pSics,"MakePoldiReiss"); /* RemoveCommand(pSics,"MakeDifrac"); */ diff --git a/sinqhttp.c b/sinqhttp.c index b12db18..17cd186 100644 --- a/sinqhttp.c +++ b/sinqhttp.c @@ -131,7 +131,7 @@ static int sinqHttpGet(pSinqHttp self, char *request){ if(httpStatus != ghttp_done){ ghttp_close(self->syncRequest); sinqHttpGetPrepare(self,request); - ghttp_prepare(self->syncRequest); + ghttp_prepare(self->syncRequest); httpStatus = ghttp_process(self->syncRequest); } if(httpStatus != ghttp_done){ @@ -151,6 +151,7 @@ static int SinqHttpConfigure(pHistDriver self, SConnection *pCon, pSinqHttp pPriv = NULL; int status, iInit; float fVal; + int i; char *confData = NULL; ghttp_status httpStatus; @@ -199,58 +200,69 @@ static int SinqHttpConfigure(pHistDriver self, SConnection *pCon, actually do configure */ if(iInit == 1){ - memset(confCommand,0,512*sizeof(char)); - if(StringDictGet(pOpt,"hmconfigscript",confCommand,511) != 1){ - SCWrite(pCon, - "ERROR: required parameter hmconfigscript not found!", - eError); - return 0; - } - status = Tcl_Eval(pSics->pTcl,confCommand); - if(status != TCL_OK){ - snprintf(confCommand,511, - "ERROR: Tcl reported %s while evaluating hmconfigscript", - Tcl_GetStringResult(pSics->pTcl)); - SCWrite(pCon,confCommand,eError); - return 0; - } else { - /* - uplod new configuration to HM - */ - ghttp_clean(pPriv->syncRequest); - snprintf(url,511,"%s%s",pPriv->hmAddress,configure); - status = ghttp_set_uri(pPriv->syncRequest,url); - if(status < 0){ - SCWrite(pCon,"ERROR: invalid URI for HM request",eError); + for(i = 0; i < 2; i++){ + memset(confCommand,0,512*sizeof(char)); + if(StringDictGet(pOpt,"hmconfigscript",confCommand,511) != 1){ + SCWrite(pCon, + "ERROR: required parameter hmconfigscript not found!", + eError); return 0; } - status = ghttp_set_type(pPriv->syncRequest,ghttp_type_post); - confData = (char *)Tcl_GetStringResult(pSics->pTcl); - /* puts(confData); */ - status = ghttp_set_body(pPriv->syncRequest,confData, - strlen(confData)); - ghttp_set_authinfo(pPriv->syncRequest, pPriv->userName, - pPriv->passWord); - ghttp_set_sync(pPriv->syncRequest,ghttp_sync); - status = ghttp_prepare(pPriv->syncRequest); - httpStatus = ghttp_process(pPriv->syncRequest); - confData = (char *)ghttp_get_body(pPriv->syncRequest); - if(httpStatus != ghttp_done){ - confData = (char *)ghttp_get_error(pPriv->syncRequest); - snprintf(confCommand,511,"ERROR: http error %s occurred", - confData); + status = Tcl_Eval(pSics->pTcl,confCommand); + if(status != TCL_OK){ + snprintf(confCommand,511, + "ERROR: Tcl reported %s while evaluating hmconfigscript", + Tcl_GetStringResult(pSics->pTcl)); SCWrite(pCon,confCommand,eError); return 0; - } else if(confData != NULL){ - if(strstr(confData,"ERROR") != NULL){ - snprintf(confCommand,511,"%s",confData); - SCWrite(pCon,confCommand,eError); + } else { + /* + uplod new configuration to HM + */ + ghttp_clean(pPriv->syncRequest); + snprintf(url,511,"%s%s",pPriv->hmAddress,configure); + status = ghttp_set_uri(pPriv->syncRequest,url); + if(status < 0){ + SCWrite(pCon,"ERROR: invalid URI for HM request",eError); return 0; } - if(strstr(confData,"Authentication Error") != NULL){ - snprintf(confCommand,511,"%s",confData); + status = ghttp_set_type(pPriv->syncRequest,ghttp_type_post); + confData = (char *)Tcl_GetStringResult(pSics->pTcl); + /* puts(confData); */ + status = ghttp_set_body(pPriv->syncRequest,confData, + strlen(confData)); + ghttp_set_authinfo(pPriv->syncRequest, pPriv->userName, + pPriv->passWord); + ghttp_set_sync(pPriv->syncRequest,ghttp_sync); + status = ghttp_prepare(pPriv->syncRequest); + httpStatus = ghttp_process(pPriv->syncRequest); + confData = (char *)ghttp_get_body(pPriv->syncRequest); + if(httpStatus != ghttp_done){ + /* we may need to reconnect..... + */ + if(i == 0){ + ghttp_close(pPriv->syncRequest); + continue; + } + /* + * no we have a real error + */ + confData = (char *)ghttp_get_error(pPriv->syncRequest); + snprintf(confCommand,511,"ERROR: http error %s occurred", + confData); SCWrite(pCon,confCommand,eError); return 0; + } else if(confData != NULL){ + if(strstr(confData,"ERROR") != NULL){ + snprintf(confCommand,511,"%s",confData); + SCWrite(pCon,confCommand,eError); + return 0; + } + if(strstr(confData,"Authentication Error") != NULL){ + snprintf(confCommand,511,"%s",confData); + SCWrite(pCon,confCommand,eError); + return 0; + } } } } diff --git a/slsmagnet.c b/slsmagnet.c index 1aad633..f03a812 100644 --- a/slsmagnet.c +++ b/slsmagnet.c @@ -758,6 +758,12 @@ static void slsdspCodeToText(int code, char *text, int textlen){ int iRet, ival; char msg[6], reply[6]; + assert(self); + pMe = (pSLSDriv )self->pPrivate; + assert(pMe); + + + msg[0] = DSPWRITE; msg[1] = 0x3c; if(strcmp(pCommand,"off") == 0){ @@ -825,9 +831,6 @@ static void slsdspCodeToText(int code, char *text, int textlen){ try to switch device on */ msg[0] = DSPWRITE; - /* old device on - msg[1] = 0x31; - */ msg[1] = 0x3c; /* * ival = 0: ausschalten @@ -869,7 +872,6 @@ static void slsdspCodeToText(int code, char *text, int textlen){ memcpy(msg+2, &ival,4); iRet = communicateSLS(pMe->pSock,msg,reply); */ - NETClosePort(pMe->pSock); pMe->pSock = NULL; return 1; diff --git a/tabledrive.c b/tabledrive.c index fc2505c..90d53f0 100644 --- a/tabledrive.c +++ b/tabledrive.c @@ -10,11 +10,13 @@ #include "../lld.h" #include "tabledrive.h" /*--------------------------------------------------------------------------*/ -#define OUTOFSYNC 100 -#define STARTING 101 -#define STEPPING 102 -#define WAITING 103 +#define OUTOFSYNC 100 +#define STARTING 101 +#define STEPPING 102 +#define WAITING 103 #define WAITFINISH 104 +#define IDLE 105 + #define ABS(x) (x < 0 ? -(x) : (x)) #define SIGN(x) (x < .0 ? (-1) : (1)) extern char *trim(char *txt); @@ -182,6 +184,10 @@ static void checkSync(pTableDrive self, SConnection *pCon, float value){ float motorPosition, targetPosition, tolerance, diff; tdMotor moti; char pBueffel[256]; + + if(self->state != IDLE){ + return; + } status = LLDnodePtr2First(self->motorTable); while(status != 0){ @@ -224,6 +230,36 @@ static float TableDriveGetValue(void *pData, SConnection *pCon){ self->currentPosition = value; return value; } +/*-------------------------------------------------------------------------*/ +static void tableInfo(pTableDrive self, SConnection *pCon){ + int status, test; + float motorPosition, targetPosition, tolerance, diff, value; + tdMotor moti; + char pBueffel[256]; + + value = TableDriveGetValue(self,pCon); + snprintf(pBueffel,255," Triffid Position: %8.2f", value); + SCWrite(pCon,pBueffel,eValue); + + status = LLDnodePtr2First(self->motorTable); + while(status != 0){ + LLDnodeDataTo(self->motorTable,&moti); + test = MotorGetSoftPosition(moti.pMot,pCon,&motorPosition); + if(!test){ + snprintf(pBueffel,255,"ERROR: failed to read motor %s", + moti.motorName); + SCWrite(pCon,pBueffel,eError); + } else { + MotorGetPar(moti.pMot,"precision",&tolerance); + targetPosition = findTarget(moti,value); + snprintf(pBueffel,256,"Motor %10s, should: %8.2f, is %8.2f, diff = %8.2f", + moti.motorName, motorPosition, targetPosition, + ABS(targetPosition - motorPosition)); + SCWrite(pCon,pBueffel,eValue); + } + status = LLDnodePtr2Next(self->motorTable); + } +} /*------------------------------------------------------------------------*/ static void tableSetPar(pMotor pMot, char *name, float value){ ObPar *ob = NULL; @@ -401,6 +437,7 @@ static int TableDriveCheckStatus(void *pData, SConnection *pCon){ if(status != HWBusy){ TableDriveGetValue(self,pCon); closeMotors(self,pCon); + self->state = IDLE; return status; } else { return HWBusy; @@ -408,6 +445,7 @@ static int TableDriveCheckStatus(void *pData, SConnection *pCon){ break; case OUTOFSYNC: SCWrite(pCon,"WARNING: tabledrive out of sync",eWarning); + self->state = IDLE; return HWFault; break; default: @@ -579,6 +617,7 @@ int TableDriveFactory(SConnection *pCon, SicsInterp *pSics, void *pData, killTableDrive(pNew); return 0; } + pNew->state = IDLE; status = AddCommand(pSics,argv[1], TableDriveAction, @@ -599,7 +638,8 @@ int TableDriveAction(SConnection *pCon, SicsInterp *pSics, void *pData, pTableDrive self = (pTableDrive)pData; int status; char pBueffel[1024]; - float value; + float value; + pDynString print = NULL; if(argc < 2){ value = TableDriveGetValue(self,pCon); @@ -626,10 +666,18 @@ int TableDriveAction(SConnection *pCon, SicsInterp *pSics, void *pData, SCSendOK(pCon); } return status; - }else if(strcmp(argv[1],"show") == 0){ - showPositions(self,pCon,pBueffel,1023); - SCWrite(pCon,pBueffel,eValue); - return 1; + }else if(strcmp(argv[1],"show") == 0){ + showPositions(self,pCon,pBueffel,1023); + SCWrite(pCon,pBueffel,eValue); + return 1; + }else if(strcmp(argv[1],"info") == 0){ + SCStartBuffering(pCon); + tableInfo(self,pCon); + print = SCEndBuffering(pCon); + if(print != NULL){ + SCWrite(pCon,GetCharArray(print), eValue); + } + return 1; }else if(strcmp(argv[1],"orient") == 0){ if(argc > 2){ if(!SCMatchRights(pCon,usMugger)){