diff --git a/dornier2.c b/dornier2.c index 1b4166c..60d7a9b 100644 --- a/dornier2.c +++ b/dornier2.c @@ -132,15 +132,16 @@ static int takeControl(pDornier pDorn){ if(pDorn->statusMode == STATSEND){ if(!requestDornierStatus(pDorn)){ - *fPos = -9999.; - return 0; + *fPos = -9999.; + return 0; } if(!readAndInterpretStatus(pDorn,&DStatus)){ - *fPos = -9999.; - return 0; + *fPos = -9999.; + return 0; } pDorn->lastStatus = DStatus; } + *fPos = pDorn->lastStatus.cur_rpm; pDorn->fLastRPM = pDorn->lastStatus.cur_rpm; return 1; diff --git a/el734hp.c b/el734hp.c index ba280a0..ac9ce9c 100644 --- a/el734hp.c +++ b/el734hp.c @@ -675,6 +675,31 @@ MotorDriver *CreateEL734HP(SConnection *pCon, int argc, char *argv[]){ SCWrite(pCon,pError,eError); return (MotorDriver *)pNew; } +/*================ a 1000 scaled motor for SANSLI =================*/ +static int EL734TRun(void *pData,float fValue){ + return EL734Run(pData, fValue*1000); +} +/*-----------------------------------------------------------------*/ +static int EL734TGetPos(void *pData, float *fPos){ + int status; + status = EL734GetPos(pData, fPos); + *fPos /= 1000; + return status; +} +/*-------------------------------------------------------------------*/ +MotorDriver *CreateEL734HPT(SConnection *pCon, int argc, + char *argv[]){ + MotorDriver *pDriv = NULL; + pDriv = CreateEL734HP(pCon,argc,argv); + if(pDriv != NULL){ + pDriv->GetPosition = EL734TGetPos; + pDriv->RunTo = EL734TRun; + pDriv->fLower /= 1000.; + pDriv->fUpper /= 1000.; + } + return pDriv; +} + diff --git a/el755driv.c b/el755driv.c index 686d635..f7ffbc6 100644 --- a/el755driv.c +++ b/el755driv.c @@ -23,6 +23,9 @@ #include "hardsup/el755_errcodes.h" #include "hardsup/sinq_prototypes.h" +#define CAPSIZED -8090 + +#define ABS(x) (x < 0 ? -(x) : (x)) /*-----------------------------------------------------------------------*/ typedef struct { void *pData; @@ -31,6 +34,7 @@ int iChannel; int iIndex; int iLastError; + int iCapCount; } EL755Driv, *pEL755Driv; /*---------------------------------------------------------------------------*/ @@ -49,6 +53,22 @@ { return 0; } + /** + * This here is a check for the condition when the current breaks down. + * This situation is characterized by the fSoll being something and the + * fPos being 0. + */ + if(ABS(*fPos) < .1 && ABS(fSoll) > .1 ){ + pMe->iCapCount++; + if(pMe->iCapCount > 3){ + pMe->iLastError = CAPSIZED; + return 0; + } + } + else + { + pMe->iCapCount = 0; + } return 1; } /*----------------------------------------------------------------------------*/ @@ -62,6 +82,7 @@ assert(pMe); iRet = EL755_SetCurrent(&(pMe->pData),fVal); + pMe->iCapCount = 0; if(iRet != 1) { return 0; @@ -84,6 +105,9 @@ EL755_ErrInfo(&pPtr,iCode,&i1,&i2); switch(*iCode) { + case CAPSIZED: + strncpy(error,"Powersupply has capsized, try lower current", iErrLen); + break; case EL755__TURNED_OFF: strncpy(error,"EL755__TURNED_OF",iErrLen); break; @@ -215,6 +239,7 @@ switch(iError) { + case CAPSIZED: case EL755__TURNED_OFF: case EL755__TOO_MANY: case EL755__TOO_LARGE: diff --git a/lmd200.c b/lmd200.c index 1b86ffd..bdb66da 100644 --- a/lmd200.c +++ b/lmd200.c @@ -54,15 +54,21 @@ } free(priv); } -/*--------------------------------------------------------------------------*/ -static void doAlarm(pSICSOBJ self, char *lineBuffer){ +/*-------------------------------------------------------------------------*/ +static void setAlarm(pSICSOBJ self, char *text){ hdbValue alarmVal; pHdb node = NULL; - alarmVal = MakeHdbText(lineBuffer); + alarmVal = MakeHdbText(text); node = GetHipadabaNode(self->objectNode,"alarm"); assert(node != NULL); UpdateHipadabaPar(node,alarmVal, NULL); + ReleaseHdbValue(&alarmVal); +} +/*--------------------------------------------------------------------------*/ +static void doAlarm(pSICSOBJ self, char *lineBuffer){ + + setAlarm(self,lineBuffer); WriteToCommandLog("CERCA>> ", lineBuffer); ServerWriteGlobal(lineBuffer,eError); } @@ -79,6 +85,7 @@ static void storeData(pSICSOBJ self, int start, char *lineBuffer){ * throw first away */ pPtr = stptok(lineBuffer,number,80," "); + pPtr = trim(pPtr); pPtr = stptok(pPtr,number,80," "); while(pPtr != NULL){ if(strstr(number,"noinp") != NULL){ @@ -89,46 +96,76 @@ static void storeData(pSICSOBJ self, int start, char *lineBuffer){ if(pKomma != NULL){ *pKomma = '.'; } + pKomma = strchr(number,'('); + if(pKomma != NULL){ + *pKomma = ' '; + } + pKomma = strchr(number,')'); + if(pKomma != NULL){ + *pKomma = ' '; + } node->value.v.floatArray[start] = atof(trim(number)); start++; - } + } + pPtr = trim(pPtr); pPtr = stptok(pPtr,number,80," "); } } /*--------------------------------------------------------------------------*/ static int countTokens(char *lineBuffer){ int count = 0; - char myBuffer[BUFLEN]; + char myBuffer[BUFLEN], token[60]; char *pPtr = NULL; - + + memset(myBuffer,0,BUFLEN); strcpy(myBuffer, lineBuffer); pPtr = myBuffer; + pPtr = stptok(pPtr,token, 60," \r\n"); while(pPtr != NULL){ count++; - pPtr = strtok(pPtr," "); + pPtr = trim(pPtr); + pPtr = stptok(pPtr,token,60," \r\n"); } return count; } /*--------------------------------------------------------------------------*/ static void interpretLine(pSICSOBJ self, pLMD200 priv){ + pHdb node = NULL; + switch(priv->state){ case IDLE: - if(countTokens(priv->lineBuffer) == 2){ - priv->state = WAITDATA1; - return; + if(strstr(priv->lineBuffer, "Alarm") != NULL){ + doAlarm(self, priv->lineBuffer); + return; + } else if(strstr(priv->lineBuffer,"Pre") != NULL){ + setAlarm(self,priv->lineBuffer); } else { - doAlarm(self, priv->lineBuffer); - return; + priv->state = WAITDATA1; + setAlarm(self,"I do not feel very alarmed"); + return; } break; case WAITDATA1: + if(strstr(priv->lineBuffer,"...0") == NULL){ + /* this data is out of order, recover...*/ + priv->state == IDLE; + return; + } storeData(self, 0, priv->lineBuffer); priv->state = WAITDATA2; break; case WAITDATA2: + if(strstr(priv->lineBuffer,"...0") == NULL){ + /* this data is out of order, recover...*/ + priv->state == IDLE; + return; + } storeData(self, 8, priv->lineBuffer); priv->state = IDLE; + node = GetHipadabaNode(self->objectNode,"data"); + assert(node != NULL); + NotifyHipadabaPar(node,NULL); break; } } @@ -139,23 +176,22 @@ static void interpretLine(pSICSOBJ self, pLMD200 priv){ static int LMD200Callback(void *context, int mode){ pSICSOBJ self = (pSICSOBJ)context; pLMD200 priv = NULL; - char buffer[512], *pPtr = NULL; - + char buffer[512], *pPtr = NULL, line[132]; + assert(self != NULL); priv = (pLMD200)self->pPrivate; if(mode == nwatch_read){ memset(buffer,0,512); + memset(line,0,132); NETRead(priv->pSock, buffer, 512, 0); - pPtr = strchr(buffer,'\n'); - if(pPtr != NULL){ - *pPtr = '\0'; - strncat(priv->lineBuffer,buffer,BUFLEN); + pPtr = stptok(buffer,line,132,"\r"); + while(pPtr != NULL){ + if(strlen(line) > 3){ + strncpy(priv->lineBuffer,line,BUFLEN); interpretLine(self, priv); priv->lineBuffer[0] = '\0'; - pPtr++; - strncpy(priv->lineBuffer,pPtr,BUFLEN); - } else { - strncat(priv->lineBuffer,buffer,BUFLEN); + } + pPtr = stptok(pPtr,line,132,"\r"); } } return 1; @@ -166,17 +202,18 @@ int MakeLMD200(SConnection *pCon, SicsInterp *pSics, void *pData, pSICSOBJ self = NULL; pLMD200 priv = NULL; hdbValue dataValue, textValue; - - if(argc < 5){ + int status; + + if(argc < 4){ SCWrite(pCon, - "ERROR: require name class host and port parameter for initialization", + "ERROR: require name host and port parameters for initialization", eError); return 0; } priv = (pLMD200)malloc(sizeof(LMD200)); memset(priv,0,sizeof(LMD200)); - strncpy(priv->host,argv[3], 256); - priv->port = atoi(argv[4]); + strncpy(priv->host,argv[2], 256); + priv->port = atoi(argv[3]); priv->pSock = NETConnect(priv->host,priv->port); if(priv->pSock == NULL){ SCWrite(pCon,"ERROR: failed to connect to LMD200",eError); @@ -184,7 +221,7 @@ int MakeLMD200(SConnection *pCon, SicsInterp *pSics, void *pData, return 0; } - self = SetupSICSOBJ(pCon,pSics, pData,argc, argv); + self = MakeSICSOBJv(argv[1],"LMD400",HIPNONE, 0); if(self == NULL || priv == NULL){ return 0; } @@ -198,5 +235,18 @@ int MakeLMD200(SConnection *pCon, SicsInterp *pSics, void *pData, ReleaseHdbValue(&textValue); NetWatchRegisterCallback(&priv->watchContext, priv->pSock->sockid, LMD200Callback, self); + + status = AddCommand(pSics, + argv[1], + InterInvokeSICSOBJ, + KillSICSOBJ, + self); + if(status != 1){ + KillSICSOBJ(self); + SCPrintf(pCon,eError,"ERROR: failed create duplicate command %s", argv[1]); + return 0; + } + + return 1; } diff --git a/make_gen b/make_gen index 1b057da..8eb053e 100644 --- a/make_gen +++ b/make_gen @@ -22,7 +22,7 @@ OBJ=psi.o buffer.o ruli.o dmc.o nxsans.o nextrics.o sps.o pimotor.o \ $(MZOBJ) amordrive.o amorset.o tcpdornier.o sinqhttp.o\ dgrambroadcast.o sinq.o tabledrive.o tcpdocho.o julcho.o \ ritastorage.o poldizug.o audinelib.o delcam.o el737hpdrivsps.o \ - rebin.o sanslirebin.o lmd200.o + rebin.o sanslirebin.o lmd200.o slsvme.o .SECONDARY.: sanslirebin.c diff --git a/makefile_linux b/makefile_linux index 686638f..c4a4bf3 100644 --- a/makefile_linux +++ b/makefile_linux @@ -11,7 +11,7 @@ include ../sllinux_def CC = gcc CFLAGS = -I$(HDFROOT)/include -DHDF4 -DHDF5 $(NI) -Ihardsup \ - -I.. -DCYGNUS -DNONINTF -g $(DFORTIFY) \ + -I.. -DCYGNUS -DNONINTF -g $(DFORTIFY) \ -Wall -Wno-unused -Wno-comment -Wno-switch -Werror EXTRA=nintf.o diff --git a/psi.c b/psi.c index e0f0324..f35bf41 100644 --- a/psi.c +++ b/psi.c @@ -174,6 +174,7 @@ static void RemovePsiCommands(SicsInterp *pSics){ MotorDriver *CreateEL734(SConnection *pCon, int argc, char *argv[]); MotorDriver *CreateEL734DC(SConnection *pCon, int argc, char *argv[]); MotorDriver *CreateEL734HP(SConnection *pCon, int argc, char *argv[]); + MotorDriver *CreateEL734HPT(SConnection *pCon, int argc, char *argv[]); MotorDriver *MakePiPiezo(Tcl_Interp *pTcl,char *pArray); /*-------------------------------------------------------------------*/ static pMotor CreatePsiMotor(SConnection *pCon, int argc, char *argv[]){ @@ -220,6 +221,18 @@ static pMotor CreatePsiMotor(SConnection *pCon, int argc, char *argv[]){ SCWrite(pCon,pBueffel,eError); return NULL; } + } else if(strcmp(argv[1],"el734hpt") == 0){ + pDriver = (MotorDriver *)CreateEL734HPT(pCon,argc-2,&argv[2]); + if(!pDriver){ + return NULL; + } + /* create the motor */ + pNew = MotorInit("EL734HPT",argv[0],pDriver); + if(!pNew){ + sprintf(pBueffel,"Failure to create motor %s",argv[1]); + SCWrite(pCon,pBueffel,eError); + return NULL; + } } else if(strcmp(argv[1],"el734dc") == 0){ pDriver = (MotorDriver *)CreateEL734DC(pCon,argc-2,&argv[2]); if(!pDriver){ @@ -417,7 +430,7 @@ static void ConfigureController(char *name, pEVControl pNew, } /*-------------------------------------------------------------------*/ extern pEVDriver CreateSLSDriv(int argc, char *argv[]); - +extern pEVDriver CreateSLSVMEDriv(int argc, char *argv[]); /*------------------------------------------------------------------*/ static pEVControl InstallPsiEnvironmentController(SicsInterp *pSics, @@ -506,6 +519,12 @@ static pEVControl InstallPsiEnvironmentController(SicsInterp *pSics, if(pDriv != NULL){ pNew = CreateEVController(pDriv,argv[2],&status); } + } else if(strcmp(argv[3],"vme-dsp") == 0) { + checkError = 1; + pDriv = CreateSLSVMEDriv(argc-4,&argv[4]); + if(pDriv != NULL){ + pNew = CreateEVController(pDriv,argv[2],&status); + } } else if(strcmp(argv[3],"el755") == 0){ checkError = 1; pDriv = CreateEL755Driv(argc-4,&argv[4]);