diff --git a/eve.c b/eve.c index ab2ca2a..7bcd04e 100644 --- a/eve.c +++ b/eve.c @@ -770,14 +770,18 @@ int EveIdle(long pc, Eve *eve) { FSM_BEGIN idle: - if (!eve->todo) goto rd; + if (!eve->todo) { + if (eve->hwstate == HWBusy) { + eve->hwstate = HWIdle; + } + goto rd; + } doit: todo = eve->todo; eve->todo = NULL; FSM_CALL(todo); - + rd: - if (eve->hwstate == HWBusy) eve->hwstate = HWIdle; FSM_CALL(eve->read); EveLog(eve); /* just for the case EveLog was not included in the read function */ if (eve->logtime == 0) eve->logtime = 1; @@ -816,10 +820,10 @@ int EveRun(pEVDriver driver, float fVal) { EvePrintf(eve, -1, "can not run %s", eve->evc->pName); return 0; } + eve->todo = eve->run; if (FsmStop(eve->task, eve->run)) { EvePrintf(eve, -1, "running %s cancelled", eve->evc->pName); } - eve->todo = eve->run; eve->hwstate = HWBusy; return 1; } diff --git a/ipsdriv.c b/ipsdriv.c index dead06d..b5cee6a 100644 --- a/ipsdriv.c +++ b/ipsdriv.c @@ -138,9 +138,13 @@ void IpsStatus(IpsDriv *me) { /*----------------------------------------------------------------------------*/ static void IpsSetField(IpsDriv *me, float val) { char buf[128]; + SConnection *pCon; + if (me->eve.value != val && me->eve.evc != NULL) { snprintf(buf, sizeof(buf), "%s = %g", me->eve.evc->pName, val); InvokeCallBack(me->eve.evc->pCall, VALUECHANGE, buf); + pCon = SCLoad(&me->eve.evc->conn); + if (pCon) SCparChange(pCon); } if (me->perswitch) { me->current = val; @@ -258,7 +262,7 @@ static int IpsChangeField(long pc, IpsDriv *me) { EveWrite(eve, "X"); FSM_NEXT IpsStatus(me); - if (time(NULL) < me->tim + 3) goto stab2; /* stabilize */ + if (time(NULL) < me->tim + 10) goto stab2; /* stabilize */ switch_on: if (me->perswitch) goto wait_open; @@ -332,6 +336,10 @@ static int IpsChangeField(long pc, IpsDriv *me) { me->tim = time(NULL); stab3: FSM_WAIT(1) + EveWrite(eve, "R18"); /* read persistant field in Tesla */ + FSM_NEXT + IpsSetField(me, OiGetFlt(eve, 3, NULL)); + me->lastfield = me->persfield; EveWrite(eve, "X"); FSM_NEXT IpsStatus(me); /* just check for errors */ @@ -349,6 +357,10 @@ static int IpsChangeField(long pc, IpsDriv *me) { EvePrintf(eve, -1, "IPS: wait 30 sec to close switch"); wait_closed: + EveWrite(eve, "R18"); /* read persistant field in Tesla */ + FSM_NEXT + IpsSetField(me, OiGetFlt(eve, 3, NULL)); + me->lastfield = me->persfield; FSM_WAIT(1) EveWrite(eve, "X"); FSM_NEXT