improvements:
- added is_running to driveable ease objects - ighdriv.c: try <maxtry> times when status reply failes - ipsdriv.c: fix trainedTo parameter - reduced SEA version of SICS
This commit is contained in:
46
ease.c
46
ease.c
@ -19,6 +19,7 @@ Markus Zolliker, March 2005
|
||||
#include "sics.h"
|
||||
#include "splitter.h"
|
||||
#include "ease.h"
|
||||
#include "sicshipadaba.h"
|
||||
|
||||
#define EASE_FLAGBITS (8*sizeof(long))
|
||||
|
||||
@ -242,16 +243,29 @@ static int EaseRestart(EaseBase * eab)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void EaseUpdateHwstate(void *object, int drivStatus) {
|
||||
EaseDriv *ead = EaseDrivCast(object);
|
||||
int is_running = drivStatus == HWBusy;
|
||||
|
||||
ead->hwstate = drivStatus;
|
||||
|
||||
if (ead->is_running != is_running) {
|
||||
ead->is_running = is_running;
|
||||
ParUpdateAll(ead);
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int EaseHandler(EaseBase * eab)
|
||||
{
|
||||
EaseDriv *ead = EaseDrivCast(eab);;
|
||||
EaseDriv *ead = EaseDrivCast(eab);
|
||||
int iret;
|
||||
|
||||
EaseSavePars();
|
||||
if (ead && ead->stopped && ead->hwstate == HWBusy) {
|
||||
ead->stopped = 0;
|
||||
ead->hwstate = HWIdle;
|
||||
EaseUpdateHwstate(ead, HWIdle);
|
||||
if (FsmStop(eab->task, eab->doit)) {
|
||||
ParPrintf(eab, eWarning, "%s stopped", eab->p.name);
|
||||
return 0;
|
||||
@ -314,7 +328,7 @@ int EaseHandler(EaseBase * eab)
|
||||
}
|
||||
eab->errCode = 0;
|
||||
if (ead) {
|
||||
ead->hwstate = HWFault;
|
||||
EaseUpdateHwstate(ead, HWFault);
|
||||
FsmStop(eab->task, eab->doit);
|
||||
}
|
||||
return 0;
|
||||
@ -563,7 +577,8 @@ static long EaseRun(void *obj, SConnection * pCon, float fVal)
|
||||
ead->stopped = 0;
|
||||
/* eab->todo = eab->doit; */
|
||||
EaseSetUpdate(eab, EASE_RUN, 1);
|
||||
ead->hwstate = HWBusy;
|
||||
ead->is_running = -1; /* force update of is_running even when not changed */
|
||||
EaseUpdateHwstate(ead, HWBusy);
|
||||
if (ead->maxwait >= 0) {
|
||||
ead->timeout = time(NULL) + ead->maxwait;
|
||||
} else {
|
||||
@ -633,12 +648,15 @@ static int EaseCheckStatus(void *obj, SConnection * pCon)
|
||||
ParSaveConn(ead, pCon);
|
||||
if (ead->stopped) {
|
||||
return HWIdle;
|
||||
} else if (!ead->is_running) {
|
||||
ead->stopped = 1;
|
||||
return HWIdle;
|
||||
}
|
||||
now = time(NULL);
|
||||
if (now > ead->timeout) {
|
||||
ParPrintf(obj, eWarning, "maxwait expired when driving %s",
|
||||
ead->b.p.name);
|
||||
ead->hwstate = HWIdle;
|
||||
EaseUpdateHwstate(ead, HWIdle);
|
||||
} else if (EaseIsInTol(obj)) {
|
||||
if (ead->finish == 0) {
|
||||
ead->finish = now - ead->usedSettle;
|
||||
@ -649,7 +667,7 @@ static int EaseCheckStatus(void *obj, SConnection * pCon)
|
||||
}
|
||||
if (now > ead->finish + ead->settle && ead->hwstate != HWIdle) {
|
||||
ParPrintf(obj, eWarning, "%s has reached target", ead->b.p.name);
|
||||
ead->hwstate = HWIdle;
|
||||
EaseUpdateHwstate(ead, HWIdle);
|
||||
}
|
||||
} else if (ead->finish != 0) {
|
||||
ead->usedSettle = now - ead->finish;
|
||||
@ -930,7 +948,6 @@ void *EaseMakeDriv(SConnection * con, void *class, int argc, char *argv[],
|
||||
ead->evInt->IsInTolerance = EaseIsInTol;
|
||||
ead->evInt->HandleError = EaseErrHandler;
|
||||
|
||||
ead->hwstate = HWIdle;
|
||||
ead->drivInt->Halt = EaseHalt;
|
||||
ead->drivInt->CheckLimits = EaseCheckLimits;
|
||||
ead->drivInt->SetValue = EaseRun;
|
||||
@ -943,7 +960,9 @@ void *EaseMakeDriv(SConnection * con, void *class, int argc, char *argv[],
|
||||
ead->settle = 0;
|
||||
ead->tolerance = 1;
|
||||
ead->targetValue = 0;
|
||||
ead->is_running = 0;
|
||||
|
||||
EaseUpdateHwstate(ead, HWIdle);
|
||||
/* EMon interface to be implemented */
|
||||
return ead;
|
||||
}
|
||||
@ -1113,6 +1132,17 @@ void EaseKillDriv(EaseDriv * ead)
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void EaseRunPar(void *object)
|
||||
{
|
||||
EaseDriv *ead;
|
||||
|
||||
assert(ead = EaseDrivCast(object));
|
||||
|
||||
ParName("is_running");
|
||||
ParInt(&ead->is_running, 0);
|
||||
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void EaseDrivPar(void *object, char *fmt, char *unit)
|
||||
{
|
||||
@ -1164,6 +1194,8 @@ void EaseDrivPar(void *object, char *fmt, char *unit)
|
||||
ParTail(unit);
|
||||
ParFloat(&ead->targetValue, PAR_NAN);
|
||||
|
||||
EaseRunPar(ead);
|
||||
|
||||
if (ParActionIs(PAR_KILL)) {
|
||||
EaseKillDriv(ead);
|
||||
}
|
||||
|
Reference in New Issue
Block a user