- improvements in protocols and drivers
This commit is contained in:
79
ease.c
79
ease.c
@ -15,6 +15,7 @@ Markus Zolliker, March 2005
|
||||
#include <fortify.h>
|
||||
#include <ctype.h>
|
||||
#include <math.h>
|
||||
#include <errno.h>
|
||||
#include "sics.h"
|
||||
#include "splitter.h"
|
||||
#include "ease.h"
|
||||
@ -50,10 +51,16 @@ EaseDriv *EaseDrivCast(void *object)
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void EaseStop(EaseBase * eab)
|
||||
void EaseStop(EaseBase * eab, char *reason)
|
||||
{
|
||||
FsmStop(eab->task, eab->idle);
|
||||
closeRS232(eab->ser);
|
||||
if (eab->state >= EASE_idle) {
|
||||
FsmStop(eab->task, eab->idle);
|
||||
closeRS232(eab->ser);
|
||||
}
|
||||
if (reason != NULL) {
|
||||
snprintf(eab->msg, sizeof eab->msg, "offline (%s)", reason);
|
||||
ParPrintf(eab, eLogError, "ERROR: %s", eab->msg);
|
||||
}
|
||||
eab->state = EASE_notconnected;
|
||||
}
|
||||
|
||||
@ -92,7 +99,7 @@ void EaseWriteError(EaseBase * eab)
|
||||
case EASE_DEV_CHANGED:
|
||||
ParPrintf(eab, eError, "ERROR: controller was exchanged on %s",
|
||||
eab->p.name);
|
||||
/* EaseStop(eab); */
|
||||
EaseStop(eab, "controller exchanged");
|
||||
break;
|
||||
case EASE_FAULT:
|
||||
ParPrintf(eab, eError, "ERROR: error on %s", eab->p.name);
|
||||
@ -112,7 +119,11 @@ void EaseWrite(EaseBase * eab, char *cmd)
|
||||
char trash[64];
|
||||
int l;
|
||||
|
||||
if (eab->errCode || eab->state == EASE_expect)
|
||||
if (eab->errCode) {
|
||||
eab->state = EASE_abort;
|
||||
return;
|
||||
}
|
||||
if (eab->state == EASE_expect || eab->state == EASE_abort)
|
||||
return;
|
||||
while (availableRS232(eab->ser) == 1) {
|
||||
l = sizeof(trash);
|
||||
@ -129,7 +140,7 @@ void EaseWrite(EaseBase * eab, char *cmd)
|
||||
if (iRet < 0) {
|
||||
FsmStop(eab->task, eab->idle);
|
||||
snprintf(eab->msg, sizeof eab->msg,
|
||||
"connection to %s:%d lost", eab->ser->pHost, eab->ser->iPort);
|
||||
"offline (connection to %s:%d lost)", eab->ser->pHost, eab->ser->iPort);
|
||||
ParPrintf(eab, eError, "ERROR: %s", eab->msg);
|
||||
closeRS232(eab->ser);
|
||||
eab->state = EASE_notconnected;
|
||||
@ -143,6 +154,7 @@ void EaseWrite(EaseBase * eab, char *cmd)
|
||||
}
|
||||
eab->state = EASE_expect;
|
||||
eab->cmdtime = time(NULL);
|
||||
eab->chktime = time(NULL) + 5;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@ -222,8 +234,10 @@ static int EaseRestart(EaseBase * eab)
|
||||
EaseWriteError(eab);
|
||||
return -1;
|
||||
}
|
||||
snprintf(eab->msg, sizeof eab->msg,
|
||||
"connecting to %s:%d", eab->ser->pHost, eab->ser->iPort);
|
||||
if (eab->cmdtime == 0) {
|
||||
snprintf(eab->msg, sizeof eab->msg,
|
||||
"connecting to %s:%d", eab->ser->pHost, eab->ser->iPort);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -232,7 +246,7 @@ int EaseHandler(EaseBase * eab)
|
||||
{
|
||||
EaseDriv *ead = EaseDrivCast(eab);;
|
||||
int iret;
|
||||
|
||||
|
||||
EaseSavePars();
|
||||
if (ead && ead->stopped && ead->hwstate == HWBusy) {
|
||||
ead->stopped = 0;
|
||||
@ -243,6 +257,9 @@ int EaseHandler(EaseBase * eab)
|
||||
}
|
||||
}
|
||||
|
||||
if (eab->state == EASE_offline) {
|
||||
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",
|
||||
@ -254,6 +271,9 @@ int EaseHandler(EaseBase * eab)
|
||||
snprintf(eab->msg, sizeof eab->msg, "no response");
|
||||
}
|
||||
if (eab->state == EASE_notconnected) {
|
||||
if (time(0) >= eab->cmdtime + 10) {
|
||||
EaseRestart(eab);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
if (eab->state == EASE_connecting) {
|
||||
@ -261,11 +281,19 @@ int EaseHandler(EaseBase * eab)
|
||||
if (iret == 0)
|
||||
return 0; /* waiting for connection */
|
||||
if (iret < 0) {
|
||||
snprintf(eab->msg, sizeof eab->msg,
|
||||
"connection for %s failed", eab->p.name);
|
||||
ParPrintf(eab, eError, "%s", eab->msg);
|
||||
if (errno == ECONNREFUSED) {
|
||||
snprintf(eab->msg, sizeof eab->msg,
|
||||
"Connection refused");
|
||||
} else {
|
||||
snprintf(eab->msg, sizeof eab->msg,
|
||||
"Connection failed (%s)", strerror(errno));
|
||||
}
|
||||
if (eab->cmdtime == 0) {
|
||||
ParPrintf(eab, eError, "%s: %s", eab->p.name, eab->msg);
|
||||
}
|
||||
closeRS232(eab->ser);
|
||||
eab->state = EASE_notconnected;
|
||||
eab->cmdtime = time(0);
|
||||
return 0;
|
||||
} else {
|
||||
if (eab->tmo > 20) {
|
||||
@ -278,10 +306,13 @@ int EaseHandler(EaseBase * eab)
|
||||
}
|
||||
if (eab->errCode) {
|
||||
if (eab->errCode == BADSEND) {
|
||||
eab->cmdtime = 0; /* means: this is not a repeated restart */
|
||||
EaseRestart(eab);
|
||||
return 0;
|
||||
}
|
||||
EaseWriteError(eab);
|
||||
if (eab->state != EASE_abort) {
|
||||
EaseWriteError(eab);
|
||||
}
|
||||
eab->errCode = 0;
|
||||
if (ead) {
|
||||
ead->hwstate = HWFault;
|
||||
@ -379,6 +410,9 @@ static long EaseIdle(long pc, void *object)
|
||||
case __LINE__: /**********************************/
|
||||
|
||||
eab->startOk = 1;
|
||||
if (eab->state == EASE_abort) {
|
||||
eab->state = EASE_idle;
|
||||
}
|
||||
rd:
|
||||
/*
|
||||
if (eab->state == EASE_lost) {
|
||||
@ -475,7 +509,7 @@ int EaseGetUpdate(void *object, int flag)
|
||||
assert(flag <= eab->maxflag);
|
||||
i = flag / EASE_FLAGBITS;
|
||||
if ((1 << (flag % EASE_FLAGBITS)) & eab->updateFlags[i]) {
|
||||
return flag;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -673,7 +707,9 @@ static int EaseStdHandler(void *object)
|
||||
if (eab->state < EASE_idle)
|
||||
goto quit;
|
||||
if (availableNetRS232(eab->ser) || availableRS232(eab->ser)) {
|
||||
eab->msg[0] = '\0';
|
||||
if (strncmp(eab->msg, "ERROR:", 6) != 0) {
|
||||
eab->msg[0] = '\0';
|
||||
}
|
||||
l = sizeof(eab->ans);
|
||||
iret = readRS232TillTerm(eab->ser, eab->ans, &l);
|
||||
if (eab->state != EASE_expect && eab->state != EASE_lost) {
|
||||
@ -781,7 +817,6 @@ static int EaseInit(SConnection * pCon, EaseBase * eab, int argc,
|
||||
|
||||
eab->startOk = 0;
|
||||
eab->errCode = 0;
|
||||
eab->cmdtime = 0;
|
||||
eab->version[0] = '\0';
|
||||
eab->maxflag = maxflag;
|
||||
eab->sendCmd = NULL;
|
||||
@ -799,6 +834,7 @@ static int EaseInit(SConnection * pCon, EaseBase * eab, int argc,
|
||||
setRS232Debug(eab->ser, 0);
|
||||
|
||||
eab->task = NULL;
|
||||
eab->cmdtime = 0; /* means: this is not a repeated restart */
|
||||
if (EaseRestart(eab) < 0)
|
||||
return -1;
|
||||
eab->task = FsmStartTask(eab, eab->handler, eab->idle, eab->p.name);
|
||||
@ -920,6 +956,7 @@ void EaseMsgPar(void *object)
|
||||
assert(eab);
|
||||
|
||||
ParName("status");
|
||||
ParAccess(usUser);
|
||||
ParLogAs(NULL);
|
||||
if (eab->msg[0] == '\0') {
|
||||
ParList(""); /* do not list when empty */
|
||||
@ -976,8 +1013,9 @@ int EaseRestartWrapper(void *object, void *userarg, int argc, char *argv[])
|
||||
eab->ser->iPort = port;
|
||||
}
|
||||
if (eab->task) {
|
||||
EaseStop(eab);
|
||||
EaseStop(eab, NULL);
|
||||
}
|
||||
eab->cmdtime = 0; /* means: this is not a repeated restart */
|
||||
EaseRestart(eab);
|
||||
return 0;
|
||||
}
|
||||
@ -987,9 +1025,10 @@ int EaseDisconnectWrapper(void *object, void *userarg, int argc, char *argv[])
|
||||
{
|
||||
EaseBase *eab = EaseBaseCast(object);
|
||||
|
||||
ParPrintf(object, eWarning, "%s disabled (enable with: %s restart)",
|
||||
eab->p.name, eab->p.name);
|
||||
EaseStop(eab);
|
||||
snprintf(eab->msg, sizeof eab->msg, "disconnected");
|
||||
ParPrintf(object, eWarning, "%s", eab->msg);
|
||||
EaseStop(eab, NULL);
|
||||
eab->state = EASE_offline;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user