Merge commit 'refs/merge-requests/1' of ssh://gitorious.psi.ch/sinqdev/sics into merge-requests/1
First merge with ANSTO which compiles Conflicts: SICSmain.c asynnet.c confvirtualmot.c counter.c devexec.c drive.c exebuf.c hipadaba.c interface.h make_gen motor.c nserver.c nwatch.c ofac.c protocol.c sicshipadaba.c
This commit is contained in:
47
motor.c
47
motor.c
@ -81,6 +81,8 @@
|
||||
#define IGNOREFAULT 10
|
||||
#define MOVECOUNT 11
|
||||
|
||||
extern double DoubleTime(void);
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
static void SetMotorError(pMotor self, char *text)
|
||||
{
|
||||
@ -351,8 +353,9 @@ static int checkPosition(pMotor self, SConnection * pCon)
|
||||
SCWrite(pCon, pBueffel, eWarning);
|
||||
return HWFault;
|
||||
}
|
||||
snprintf(pBueffel, 131, "WARNING: %s off position by %f",
|
||||
self->name, absf(fHard - self->fTarget));
|
||||
snprintf(pBueffel, 131, "WARNING: %s off position by %f%s",
|
||||
self->name, absf(fHard - self->fTarget),
|
||||
self->fTarget > fHard ? "-" : "");
|
||||
SCWrite(pCon, pBueffel, eLog);
|
||||
status = statusRunTo(self, pCon);
|
||||
return status;
|
||||
@ -361,16 +364,19 @@ static int checkPosition(pMotor self, SConnection * pCon)
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------*/
|
||||
static void finishDriving(pMotor self, SConnection * pCon)
|
||||
void finishDriving(pMotor self, SConnection * pCon)
|
||||
{
|
||||
MotCallback sCall;
|
||||
MotorGetSoftPosition(self, pCon, &sCall.fVal);
|
||||
sCall.pName = self->name;
|
||||
self->fPosition = sCall.fVal;
|
||||
self->fPosition = sCall.fVal;
|
||||
InvokeCallBack(self->pCall, MOTDRIVE, &sCall); /* send also very last position */
|
||||
InvokeCallBack(self->pCall, MOTEND, &sCall);
|
||||
tracePar(self->name,"%f",sCall.fVal);
|
||||
if (self->moving) {
|
||||
InvokeCallBack(self->pCall, MOTDRIVE, &sCall); /* send also very last position */
|
||||
InvokeCallBack(self->pCall, MOTEND, &sCall);
|
||||
tracePar(self->name,"%f",sCall.fVal);
|
||||
}
|
||||
self->moving = 0;
|
||||
self->running = 0;
|
||||
}
|
||||
|
||||
@ -474,13 +480,15 @@ static void handleMoveCallback(pMotor self, SConnection * pCon)
|
||||
{
|
||||
MotCallback sCall;
|
||||
|
||||
self->posCount++;
|
||||
if (self->posCount >= ObVal(self->ParArray, MOVECOUNT)) {
|
||||
double current_time, skip_time;
|
||||
current_time = DoubleTime();
|
||||
skip_time = 0.001 * ObVal(self->ParArray,MOVECOUNT);
|
||||
if(self->last_report_time + skip_time <= current_time) {
|
||||
MotorGetSoftPosition(self, pCon, &sCall.fVal);
|
||||
sCall.pName = self->name;
|
||||
InvokeCallBack(self->pCall, MOTDRIVE, &sCall);
|
||||
tracePar(self->name,"%f",sCall.fVal);
|
||||
self->posCount = 0;
|
||||
self->last_report_time = current_time;
|
||||
}
|
||||
}
|
||||
|
||||
@ -749,8 +757,10 @@ static long MotorRunImpl(void *sulf, SConnection * pCon, float fNew)
|
||||
self->posFaultCount = 0;
|
||||
self->retryCount = 0;
|
||||
self->stopped = 0;
|
||||
self->moving = 1;
|
||||
self->fTarget = fHard;
|
||||
InvokeCallBack(self->pCall, HDBVAL, self);
|
||||
self->last_report_time = 0.0;
|
||||
self->posCount = 0;
|
||||
iRet = self->pDriver->RunTo(self->pDriver, fHard);
|
||||
if (iRet != OKOK) { /* try three times to fix it */
|
||||
@ -824,7 +834,7 @@ pMotor MotorInit(char *drivername, char *name, MotorDriver * pDriv)
|
||||
ObParInit(pM->ParArray, ECOUNT, "failafter", 3.0, usMugger);
|
||||
ObParInit(pM->ParArray, POSCOUNT, "maxretry", 3.0, usMugger);
|
||||
ObParInit(pM->ParArray, IGNOREFAULT, "ignorefault", 0.0, usMugger);
|
||||
ObParInit(pM->ParArray, MOVECOUNT, "movecount", 10.0, usMugger);
|
||||
ObParInit(pM->ParArray, MOVECOUNT, "movecount", 500.0, usMugger);
|
||||
pDriv->GetPosition(pDriv, &(pM->fPosition));
|
||||
pM->fTarget = pM->fPosition;
|
||||
pM->endScriptID = 0;
|
||||
@ -1226,6 +1236,20 @@ static int EndScriptCallback(int iEvent, void *pEvent, void *pUser)
|
||||
return iRet;
|
||||
}
|
||||
|
||||
/*
|
||||
* Context test function for callback removal
|
||||
*/
|
||||
int CheckMotiMatch(const void* context, const void* pUserData)
|
||||
{
|
||||
pMotInfo pMoti = (pMotInfo) pUserData;
|
||||
SConnection *pCon = (SConnection*) context;
|
||||
if (VerifyConnection(pCon) && VerifyConnection(pMoti->pCon)) {
|
||||
if (pMoti->pCon->ident == pCon->ident)
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
The wrapper function for a motor. Commands currently supported are:
|
||||
|
||||
@ -1321,13 +1345,14 @@ int MotorAction(SConnection * pCon, SicsInterp * pSics, void *pData,
|
||||
}
|
||||
pMoti->lastValue = fValue;
|
||||
|
||||
RemoveCallbackUsr(self->pCall, InterestCallback, CheckMotiMatch, pCon); /* only this one */
|
||||
lID = RegisterCallback(self->pCall, MOTDRIVE, InterestCallback,
|
||||
pMoti, KillInfo);
|
||||
DeleteTokenList(pList);
|
||||
SCSendOK(pCon);
|
||||
return 1;
|
||||
} else if (strcmp(pCurrent->text, "uninterest") == 0) {
|
||||
RemoveCallbackCon(self->pCall, pCon);
|
||||
RemoveCallbackUsr(self->pCall, InterestCallback, CheckMotiMatch, pCon); /* only this one */
|
||||
SCSendOK(pCon);
|
||||
DeleteTokenList(pList);
|
||||
return 1;
|
||||
|
Reference in New Issue
Block a user