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:
2021-09-16 12:35:06 +02:00
parent 21299efa80
commit f16d738b4a
10 changed files with 607 additions and 80 deletions

46
ease.c
View File

@ -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);
}