- fixed an issue when trying to drive a device not yet started up

This commit is contained in:
zolliker
2005-09-09 14:40:54 +00:00
parent 771b4e6ef1
commit e4aae153f7
2 changed files with 25 additions and 14 deletions

36
ease.c
View File

@ -150,12 +150,19 @@ void EaseSavePars(void) {
}
/*----------------------------------------------------------------------------*/
int EaseHandler(EaseBase *eab) {
EaseDriv *ead;
EaseDriv *ead = EaseDrivCast(eab);;
int iret;
ead = EaseDrivCast(eab);
EaseSavePars();
if (ead && ead->stopped && ead->hwstate == HWBusy) {
ead->stopped = 0;
ead->hwstate = HWIdle;
if (FsmStop(eab->task, eab->doit)) {
ParPrintf(eab, -1, "%s stopped", eab->p.name);
return 0;
}
}
if (eab->state == EASE_expect) {
if (eab->cmdtime !=0 && time(NULL) > eab->cmdtime + eab->p.period*2) {
snprintf(eab->msg, sizeof eab->msg, "no response since %d sec",
@ -200,14 +207,6 @@ int EaseHandler(EaseBase *eab) {
}
return 0;
}
if (ead->stopped && ead->hwstate == HWBusy) {
ead->stopped = 0;
ead->hwstate = HWIdle;
if (FsmStop(eab->task, eab->doit)) {
ParPrintf(eab, -1, "%s stopped", eab->p.name);
return 0;
}
}
} else {
if (eab->state == EASE_lost) {
return 0;
@ -258,6 +257,7 @@ static long EaseIdle(long pc, void *object) {
FsmCall(todo);
return __LINE__; case __LINE__: /**********************************/
eab->startOk = 1;
rd:
/*
if (eab->state == EASE_lost) {
@ -365,15 +365,20 @@ static long EaseRun(void *obj, SConnection *pCon, float fVal) {
assert(ead );
SCSave(&eab->p.conn, pCon);
if (! eab->doit) {
ParPrintf(ead, -1, "missing run function %s", eab->p.name);
ParPrintf(ead, -1, "ERROR: missing run function %s", eab->p.name);
return 0;
}
if (!eab->startOk) {
ParPrintf(ead, -1, "ERROR: %s is not ready to run", eab->p.name);
return 0;
}
if (FsmStop(eab->task, eab->doit)) {
ParPrintf(ead, -1, "running %s cancelled", eab->p.name);
}
if (eab->todo) {
ParPrintf(ead, -1, "%s busy", eab->p.name);
ParPrintf(ead, -1, "ERROR: %s busy", eab->p.name);
return 0;
}
ead->targetValue = fVal;
@ -438,6 +443,9 @@ static int EaseCheckStatus(void *obj, SConnection *pCon) {
assert(ead);
SCSave(&ead->b.p.conn, pCon);
if (ead->stopped) {
return HWIdle;
}
now = time(NULL);
if (now > ead->timeout) {
ParPrintf(obj, eWarning, "maxwait expired when driving %s", ead->b.p.name);
@ -500,6 +508,7 @@ static int EaseRestart(EaseBase *eab) {
FsmStop(eab->task, eab->idle);
FsmRestartTask(eab->task, eab->idle);
}
eab->startOk = 0;
eab->todo = eab->start;
eab->state = EASE_connecting;
iRet = initRS232WithFlags(eab->ser, 3);
@ -579,6 +588,7 @@ static int EaseInit(SConnection *pCon, EaseBase *eab, int argc, char *argv[],
}
eab->ser = ser;
eab->startOk = 0;
eab->errCode = 0;
eab->cmdtime = 0;
eab->version[0] = '\0';

3
ease.h
View File

@ -39,7 +39,7 @@ typedef struct {
int errCode; /* error code of last operation. not changed on success */
EaseState state;
time_t cmdtime;
int syntax; /* not used in ease, may be used by the driver. used by oicom */
int syntax; /* not used in ease, may be used by the driver. used by oxinst.c */
char cmd[32];
char ans[64];
char version[64];
@ -47,6 +47,7 @@ typedef struct {
int maxflag;
time_t readPeriod;
unsigned long *updateFlags;
int startOk;
} EaseBase;
typedef struct {