- improvements in protocols and drivers

This commit is contained in:
zolliker
2012-06-19 07:19:03 +00:00
parent 6c69b59fce
commit 86d225a714
13 changed files with 243 additions and 95 deletions

79
ease.c
View File

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