From db7c193ed53ddca6c6768f9a0a96ec9961f19c7b Mon Sep 17 00:00:00 2001 From: koennecke Date: Fri, 27 Jan 2006 11:34:19 +0000 Subject: [PATCH] - Fixes to slsmagnet - First working version of the new SINQHM http driver --- ecbdriv.c | 6 +++- libpsi.a | Bin 1730650 -> 1731870 bytes sinqhttp.c | 77 +++++++++++++++++++++++++++++++++++++++------------- slsmagnet.c | 12 ++++++-- 4 files changed, 73 insertions(+), 22 deletions(-) diff --git a/ecbdriv.c b/ecbdriv.c index 03713ed..78d5596 100644 --- a/ecbdriv.c +++ b/ecbdriv.c @@ -194,7 +194,11 @@ int ECBMOTGetPos(void *pData, float *fPos){ if((int)ObVal(self->driverPar,ENCODER) > 0){ status = readEncoder(self, &digits); - *fPos = digits/ObVal(self->driverPar,DEG2STEP) - + step2degree = ObVal(self->driverPar,DEG2STEP); + if(step2degree == 0.0){ + step2degree = 1; + } + *fPos = (digits/step2degree) - ObVal(self->driverPar,OFFSET); return status; } else { diff --git a/libpsi.a b/libpsi.a index 4b014f376c597f7634514cc3b197a9cc9822b34d..476d5696a6b16bee097ffdae55a4ca7a25221dc3 100644 GIT binary patch delta 36307 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 delta 35053 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 = 0; + ghttp_clean(self->syncRequest); memset(self->hmError,0,512*sizeof(char)); snprintf(url,511,"%s%s",self->hmAddress,request); ghttp_set_type(self->syncRequest,ghttp_type_get); + ghttp_set_header(self->syncRequest,"connection","keep-alive"); if(ghttp_set_uri(self->syncRequest,url) < 0){ self->errorCode = BADURL; return 0; } ghttp_prepare(self->syncRequest); - ghttp_clean(self->syncRequest); httpStatus = ghttp_process(self->syncRequest); if(httpStatus != ghttp_done){ + strncpy(self->hmError,ghttp_get_error(self->syncRequest), 511); + self->errorCode = SERVERERROR; + return 0; + } else { + self->failCount = 0; pPtr = ghttp_get_body(self->syncRequest); len = ghttp_get_body_len(self->syncRequest); if(len > 511){ len = 510; } - memset(self->hmError,0,512*sizeof(char)); - strncpy(self->hmError,pPtr, len); - self->errorCode = HTTPERROR; - return 0; + if(strstr(pPtr,"ERROR") != NULL){ + memset(self->hmError,0,512*sizeof(char)); + strncpy(self->hmError,pPtr, len); + self->errorCode = HTTPERROR; + return 0; + } } return 1; } @@ -139,25 +150,33 @@ static int SinqHttpConfigure(pHistDriver self, SConnection *pCon, /* 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; } - ghttp_set_type(pPriv->syncRequest,ghttp_type_post); + status = ghttp_set_type(pPriv->syncRequest,ghttp_type_post); confData = (char *)Tcl_GetStringResult(pSics->pTcl); - ghttp_set_body(pPriv->syncRequest,confData,strlen(confData)); - ghttp_prepare(pPriv->syncRequest); - ghttp_clean(pPriv->syncRequest); + status = ghttp_set_body(pPriv->syncRequest,confData, + strlen(confData)); + 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_body(pPriv->syncRequest); + confData = ghttp_get_error(pPriv->syncRequest); snprintf(confCommand,511,"ERROR: http error %s occurred", confData); SCWrite(pCon,confCommand,eError); return 0; - } + } else { + if(strstr(confData,"ERROR") != NULL){ + snprintf(confCommand,511,"%s",confData); + SCWrite(pCon,confCommand,eError); + return 0; + } + } } } return 1; @@ -202,7 +221,7 @@ static int SinqHttpPause(pHistDriver self,SConnection *pCon){ if(status != 1){ return HWFault; } - pPriv->pause == 1; + pPriv->pause = 1; return 1; } /*---------------------------------------------------------------------*/ @@ -213,11 +232,11 @@ static int SinqHttpContinue(pHistDriver self, SConnection *pCon){ pPriv = (pSinqHttp)self->pPriv; assert(pPriv != NULL); - pPriv->pause == 0; status = sinqHttpGet(pPriv,continuedaq); if(status != 1){ return HWFault; } + pPriv->pause = 0; return 1; } /*--------------------------------------------------------------------*/ @@ -249,6 +268,7 @@ static int readStatus(pSinqHttp self){ /*---------------------------------------------------------------------*/ static int SinqHttpStatus(pHistDriver self,SConnection *pCon){ pSinqHttp pPriv = NULL; + char daqStatus[20]; int status, len; char *pPtr = NULL; @@ -268,11 +288,22 @@ static int SinqHttpStatus(pHistDriver self,SConnection *pCon){ if(status != 1){ return HWFault; } - - /* - * TODO: evaluate status fields - */ - + + if(StringDictGet(pPriv->lastStatus,"DAQ",daqStatus,20) != 1){ + pPriv->errorCode = BADSTATUS; + strncpy(pPriv->hmError,"ERROR: status does not contain DAQ field",511); + return HWFault; + } + if(strstr(daqStatus,"1") != NULL){ + return HWBusy; + } else if(strstr(daqStatus,"0") != NULL){ + return HWIdle; + } else { + pPriv->errorCode = BADSTATUS; + snprintf(pPriv->hmError,511,"ERROR: invalid DAQ sttaus %s",daqStatus); + return HWFault; + } + return HWIdle; } /*---------------------------------------------------------------------*/ @@ -300,6 +331,14 @@ static int SinqHttpFixIt(pHistDriver self, int code){ * connection problems... But abort any pending transactions... */ ghttp_close(pPriv->syncRequest); + if(code == SERVERERROR){ + pPriv->failCount++; + if(pPriv->failCount > 2){ + return COTERM; + } else { + return COREDO; + } + } return COTERM; } /*--------------------------------------------------------------------*/ diff --git a/slsmagnet.c b/slsmagnet.c index 210563b..f2c70d8 100644 --- a/slsmagnet.c +++ b/slsmagnet.c @@ -121,7 +121,7 @@ static double DSPfloat2double( ULONG input ) static int communicateSLS(mkChannel *pSock, char msg[6], char reply[6]) { long lVal = 0; - int iRet, i, address; + int iRet, i, address, status; if(!pSock) return NOTCONNECTED; @@ -141,7 +141,15 @@ static int communicateSLS(mkChannel *pSock, char msg[6], char reply[6]) } else if(iRet == 1) { - lVal += NETRead(pSock,reply+lVal,6-lVal,-10); + status = NETRead(pSock,reply+lVal,6-lVal,-10); + if(status >= 0){ + lVal += status; + } else { + /* + * network read error + */ + return status; + } if(lVal >= 6) { return (int)lVal;