From 980efacf6f1487ee1e9db0792c6e2e998a47fef2 Mon Sep 17 00:00:00 2001 From: koennecke Date: Fri, 20 Oct 2006 14:55:25 +0000 Subject: [PATCH] - JulCho now reads data in tow bunches, speeds and rest for optimization --- julcho.c | 78 ++++++++++++++++++++++++++++++------------- libpsi.a | Bin 1947254 -> 1947698 bytes sinqhttp.c | 13 ++++++-- slsmagnet.c | 3 +- tabledrive.c | 91 ++++++++++++++++++++++++++++++++------------------- 5 files changed, 125 insertions(+), 60 deletions(-) diff --git a/julcho.c b/julcho.c index e9e4353..852b44a 100644 --- a/julcho.c +++ b/julcho.c @@ -7,6 +7,11 @@ * copyright: see file COPYRIGHT * * Mark Koennecke, June-July 2006 +* +* Parameter updating is to slow, therefore it happens in two groups now: +* actspeed and actphase are requested more frequently, so they go separate +* +* Mark Koennecke, October 2006 */ #include #include @@ -33,6 +38,9 @@ #define ROPAR -811 #define NOMEM -812 #define HALT -813 +/*--------------------- update flags -------------------------------------*/ +#define ALL 1 +#define SPEED 2 /*------------------------- chopper internal names -----------------------*/ #define CH1N "snail" #define CH2N "master" @@ -46,6 +54,7 @@ typedef struct { int errorCode; time_t lastUpdate; int updateIntervall; + int speedUpdate; int halt; }JulCho, *pJulCho; /*------------------------------------------------------------------------*/ @@ -383,12 +392,45 @@ static int ReadJulChoFlags(pJulCho self){ return 1; } /*---------------------------------------------------------------------------*/ -static int UpdateJulChoParameters(pJulCho self){ +static int UpdateJulChoParameters(pJulCho self, int what){ int status, intData[5]; double doubleData[5]; char reply[255]; - if(time(NULL) < self->lastUpdate + self->updateIntervall){ + assert(what == ALL || what == SPEED); + + if(what == SPEED){ + if(time(NULL) < self->speedUpdate + self->updateIntervall){ + return 1; + } + } else{ + if(time(NULL) < self->lastUpdate + self->updateIntervall){ + return 1; + } + } + + status = JulChoTransact(self,"RAS",reply,255); + if(status < 0){ + self->errorCode = status; + return 0; + } + if(!splitJulChoInt(reply,intData)){ + self->errorCode = BADREPLY; + } + setJulChoIntPar(self->parNode,"actspeed",intData); + + status = JulChoTransact(self,"RAP",reply,255); + if(status < 0){ + self->errorCode = status; + return 0; + } + if(!splitJulChoDouble(reply,doubleData)){ + self->errorCode = BADREPLY; + } + setJulChoDoublePar(self->parNode,"actphase",doubleData); + + if(what != ALL){ + self->speedUpdate = time(NULL); return 1; } @@ -402,15 +444,6 @@ static int UpdateJulChoParameters(pJulCho self){ } setJulChoIntPar(self->parNode,"nomspeed",intData); - status = JulChoTransact(self,"RAS",reply,255); - if(status < 0){ - self->errorCode = status; - return 0; - } - if(!splitJulChoInt(reply,intData)){ - self->errorCode = BADREPLY; - } - setJulChoIntPar(self->parNode,"actspeed",intData); status = JulChoTransact(self,"RNP",reply,255); if(status < 0){ @@ -422,15 +455,6 @@ static int UpdateJulChoParameters(pJulCho self){ } setJulChoDoublePar(self->parNode,"nomphase",doubleData); - status = JulChoTransact(self,"RAP",reply,255); - if(status < 0){ - self->errorCode = status; - return 0; - } - if(!splitJulChoDouble(reply,doubleData)){ - self->errorCode = BADREPLY; - } - setJulChoDoublePar(self->parNode,"actphase",doubleData); status = JulChoTransact(self,"RGW",reply,255); if(status < 0){ @@ -496,6 +520,7 @@ static int UpdateJulChoParameters(pJulCho self){ status = ReadJulChoFlags(self); self->lastUpdate = time(NULL); + self->speedUpdate = time(NULL); return status; } /*------------------------------------------------------------------------*/ @@ -551,6 +576,15 @@ static void JulChoErrorcodeToString(int code, char *pError, int iLen){ break; } } +/*------------------------------------------------------------------------*/ +static int testParGroup(char *name){ + if(strstr(name,"actspeed") != NULL || + strstr(name,"actphase") != NULL){ + return SPEED; + } else { + return ALL; + } +} /*-------------------------------------------------------------------------*/ static int JulChoGetCallback(void *userData, void *callData, pHdb currentNode, hdbValue v){ @@ -564,7 +598,7 @@ static int JulChoGetCallback(void *userData, void *callData, assert(self != NULL); - status = UpdateJulChoParameters(self); + status = UpdateJulChoParameters(self,testParGroup(currentNode->name)); if(status != 1 && pCon != NULL){ JulChoErrorcodeToString(self->errorCode, error,127); snprintf(buffer,255,"ERROR: %s occurred reading par",error); @@ -966,7 +1000,7 @@ static int JulChoGetPar(pCodri pDriv, char *parname, self->errorCode = NOTPAR; return 0; } - if(!UpdateJulChoParameters(self)){ + if(!UpdateJulChoParameters(self,testParGroup(parname))){ return 0; } val = formatValue(target->value); diff --git a/libpsi.a b/libpsi.a index cd407554e1bf54d180e5d45d8057cc0abafcad2b..c9c2d54a0b82033b1af42e9e2b2c2744526a184e 100644 GIT binary patch delta 50971 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

aws@89E9Ru#kb4(Ccaa8iL2Aig2DTs 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 F{|!EJLDc{N diff --git a/sinqhttp.c b/sinqhttp.c index ef4f6a0..b12db18 100644 --- a/sinqhttp.c +++ b/sinqhttp.c @@ -46,6 +46,7 @@ static char subsample[] = {"/admin/processhmdata.egi"}; #define BADSTATUS -707 #define BADAUTH -708 #define HMNOMEMORY -709 +#define BADSUBSAMPLE -710 /*===================================================================== our driver private data structure ======================================================================*/ @@ -94,6 +95,9 @@ static int sinqHttpCheckResponse(pSinqHttp self){ self->failCount = 0; pPtr = ghttp_get_body(self->syncRequest); + if(pPtr == NULL){ + return 1; + } len = ghttp_get_body_len(self->syncRequest); if(len > 511){ len = 510; @@ -232,12 +236,12 @@ static int SinqHttpConfigure(pHistDriver self, SConnection *pCon, httpStatus = ghttp_process(pPriv->syncRequest); confData = (char *)ghttp_get_body(pPriv->syncRequest); if(httpStatus != ghttp_done){ - confData = (char *)ghttp_get_error(pPriv->syncRequest); + confData = (char *)ghttp_get_error(pPriv->syncRequest); snprintf(confCommand,511,"ERROR: http error %s occurred", confData); SCWrite(pCon,confCommand,eError); return 0; - } else { + } else if(confData != NULL){ if(strstr(confData,"ERROR") != NULL){ snprintf(confCommand,511,"%s",confData); SCWrite(pCon,confCommand,eError); @@ -511,6 +515,11 @@ static HistInt *SinqHttpSubSample(pHistDriver self, SConnection *pCon, } len = ghttp_get_body_len(pPriv->syncRequest); + if(len <= 0){ + strncpy(pPriv->hmError,"ERROR: no data returned from subsampling", 511); + pPriv->errorCode = BADSUBSAMPLE; + return NULL; + } resultdata = malloc(len+4); if(resultdata == NULL){ strncpy(pPriv->hmError, diff --git a/slsmagnet.c b/slsmagnet.c index f2c70d8..1aad633 100644 --- a/slsmagnet.c +++ b/slsmagnet.c @@ -896,6 +896,7 @@ static void slsdspCodeToText(int code, char *text, int textlen){ return DEVFAULT; break; case BADECHO: + case TIMEOUT: for(i = 0; i < 10; i++){ iRet = NETAvailable(pMe->pSock,0); if(iRet == 1){ @@ -904,8 +905,6 @@ static void slsdspCodeToText(int code, char *text, int textlen){ } return DEVREDO; break; - case TIMEOUT: - return DEVREDO; default: SLSClose(self); iRet = SLSInit(self); diff --git a/tabledrive.c b/tabledrive.c index 19b7b14..fc2505c 100644 --- a/tabledrive.c +++ b/tabledrive.c @@ -55,7 +55,7 @@ static int TableDriveCheckLimits(void *pData, float fVal, char *error, strncpy(error,"Path Table Not Defined!",25); return 0; } - if(fVal < 0. || fVal > self->tableLength){ + if(fVal < 1. || fVal >= self->tableLength){ strncpy(error,"Out of Range",25); return 0; } @@ -95,23 +95,11 @@ static int findOrientingMotor(pTableDrive self, ptdMotor moti){ return 0; } /*-------------------------------------------------------------------------*/ -static float interpolateLocate(tdEntry lower, tdEntry upper, - float value, int count){ - float diff, result = count -1; - - result = count; - diff = upper.position - lower.position; - value -= lower.position; - if(ABS(diff) > .00001){ - result += value/diff; - } - return result; -} -/*-------------------------------------------------------------------------*/ static float locatePosition(tdMotor moti, SConnection *pCon){ - int status, count = 0; + int status; float value; - tdEntry entry, back; + double diff; + tdEntry lower, upper; status = MotorGetSoftPosition(moti.pMot,pCon,&value); if(!status) { @@ -119,17 +107,37 @@ static float locatePosition(tdMotor moti, SConnection *pCon){ } status = LLDnodePtr2First(moti.table); while(status != 0){ - LLDnodeDataTo(moti.table,&entry); - if(entry.position > value){ - if(count == 0){ - return 1.; - } - LLDnodePtr2Prev(moti.table); - LLDnodeDataTo(moti.table,&back); - return interpolateLocate(back,entry,value, count); - } - count++; - status = LLDnodePtr2Next(moti.table); + LLDnodeDataTo(moti.table,&lower); + status = LLDnodePtr2Next(moti.table); + if(status != 0) { + LLDnodeDataTo(moti.table,&upper); + } else { + /* + * end of table + */ + return lower.tablePos; + } + /** + * we have to deal with ascending and descending tables. This is + * why we have to have some funny logic here + */ + if(upper.position > lower.position){ + /* + * ascending table + */ + if(value >= lower.position && value < upper.position){ + diff = upper.position - lower.position; + return lower.tablePos + (value - lower.position)/diff; + } + } else { + /* + * descending table + */ + if(value <= lower.position && value > upper.position){ + diff = lower.position - upper.position; + return lower.tablePos + ABS(value - lower.position)/diff; + } + } } return -999.99; } @@ -143,7 +151,7 @@ static void findBracket(tdMotor moti, float value, ptdEntry upper, status = LLDnodePtr2First(moti.table); while(status != 0){ LLDnodeDataTo(moti.table,lower); - if(lower->tablePos >= targetCount){ + if(lower->tablePos == targetCount){ LLDnodeDataTo(moti.table,upper); if(LLDnodePtr2Next(moti.table)){ LLDnodeDataTo(moti.table,upper); @@ -161,8 +169,12 @@ static float findTarget(tdMotor moti, float value){ targetCount = (int)floor(value); findBracket(moti,value,&upper,&lower); - diff = upper.position - lower.position; - return (float)lower.position + (value - targetCount)*diff; + if(ABS(targetCount - value) < .00001){ + return lower.position; + } else { + diff = upper.position - lower.position; + return (float)lower.position + (value - targetCount)*diff; + } } /*-------------------------------------------------------------------------*/ static void checkSync(pTableDrive self, SConnection *pCon, float value){ @@ -212,6 +224,14 @@ static float TableDriveGetValue(void *pData, SConnection *pCon){ self->currentPosition = value; return value; } +/*------------------------------------------------------------------------*/ +static void tableSetPar(pMotor pMot, char *name, float value){ + ObPar *ob = NULL; + + ob = ObParFind(pMot->ParArray,name); + assert(ob != NULL); + ob->fVal = value; +} /*------------------------------------------------------------------------ * Before I can drive the motors, I have to release the software limits.. -------------------------------------------------------------------------*/ @@ -225,8 +245,9 @@ static void liberateMotors(pTableDrive self, SConnection *pCon){ LLDnodeDataTo(self->motorTable,&moti); MotorGetPar(moti.pMot,"hardupperlim",&upper); MotorGetPar(moti.pMot,"hardlowerlim",&lower); - MotorSetPar(moti.pMot,pCon,"softupperlim",upper); - MotorSetPar(moti.pMot,pCon,"softlowerlim",lower); + + tableSetPar(moti.pMot,"softupperlim",upper); + tableSetPar(moti.pMot,"softlowerlim",lower); status = LLDnodePtr2Next(self->motorTable); } } @@ -249,8 +270,8 @@ static void closeMotors(pTableDrive self, SConnection *pCon){ upper = tdLower.upper + (self->currentPosition - targetCount)*diff; diff = tdUpper.lower - tdLower.lower; lower = tdLower.lower + (self->currentPosition - targetCount)*diff; - MotorSetPar(moti.pMot,pCon,"softupperlim",upper); - MotorSetPar(moti.pMot,pCon,"softlowerlim",lower); + tableSetPar(moti.pMot,"softupperlim",upper); + tableSetPar(moti.pMot,"softlowerlim",lower); status = LLDnodePtr2Next(self->motorTable); } } @@ -381,6 +402,8 @@ static int TableDriveCheckStatus(void *pData, SConnection *pCon){ TableDriveGetValue(self,pCon); closeMotors(self,pCon); return status; + } else { + return HWBusy; } break; case OUTOFSYNC: