From f2a10df78b75bb5f33dcc20d9f6037fc7ff53824 Mon Sep 17 00:00:00 2001 From: cvs Date: Wed, 17 Nov 2004 11:26:26 +0000 Subject: [PATCH] imporved simulation driver M.Z. --- simdriv.c | 44 ++++++++++++++++++++++++-------------------- simev.c | 2 +- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/simdriv.c b/simdriv.c index de8e948f..d8112738 100644 --- a/simdriv.c +++ b/simdriv.c @@ -61,11 +61,25 @@ /*---------------------------------------------------------------------------*/ static int RunComplete(SIMDriv *self) { - time_t tD; - if(time(&tD) > self->iTime) - { + int sign; + time_t now; + + if (self->iTime == 0) { return 1; } + now=time(NULL); + /* move */ + if (self->fTarget > self->fPos) { + sign=1; + } else { + sign=-1; + } + self->fPos += sign * self->fSpeed * (now - self->iTime); + self->iTime = now; + if (sign*(self->fPos - self->fTarget) > 0) { + self->fPos = self->fTarget; + return 1; + } return 0; } /*----------------------------------------------------------------------------*/ @@ -91,23 +105,13 @@ return HWFault; } - if(RunComplete(pDriv)) - { - *fPos = pDriv->fPos; - } - else /* simulate a mispositioned motor */ - { - *fPos = pDriv->fPos - 1.; - return OKOK; - } + *fPos = pDriv->fPos; return OKOK; } /*----------------------------------------------------------------------------*/ static int SimRun(void *self, float fVal) { SIMDriv *pDriv; - float fDiff; - time_t tD; assert(self); pDriv = (SIMDriv *)self; @@ -122,10 +126,9 @@ } - /* calculate time for completion */ - fDiff = fVal - pDriv->fPos; - if(fDiff < .0) fDiff = -fDiff; - pDriv->iTime = time(&tD) + (long)(fDiff/pDriv->fSpeed); + /* set start time */ + pDriv->fTarget = fVal; + pDriv->iTime = time(NULL); /* in a fifth the failures, simply die, else simply do not find pos */ if(SimRandom() < (pDriv->fFailure/5)) @@ -139,7 +142,7 @@ } else { - pDriv->fPos = fVal; + /* pDriv->fPos = fVal; */ return OKOK; } } @@ -350,7 +353,8 @@ static int SimSetPar(void *self, SConnection *pCon, char *name, float newValue) /* calculate current position, initialise func pters */ - pDriv->fPos = (pDriv->fUpper - pDriv->fLower)/2.; + pDriv->fPos = (pDriv->fUpper + pDriv->fLower)/2.; + pDriv->fTarget = pDriv->fPos; pDriv->name = strdup("Simulant"); pDriv->GetPosition = GetSimPos; pDriv->RunTo = SimRun; diff --git a/simev.c b/simev.c index b862a4bc..c77f3c6a 100644 --- a/simev.c +++ b/simev.c @@ -108,7 +108,7 @@ if(pMe->fFailure < .0){ *fPos = pMe->fTarget; } else { - *fPos = pMe->fTarget + SimRandom(); + *fPos = pMe->fTarget + SimRandom()/50-1.0; } } else /* simulate a mispositioned motor */