Handle communications faults.

r1054 | ffr | 2006-08-10 12:00:11 +1000 (Thu, 10 Aug 2006) | 2 lines
This commit is contained in:
Ferdi Franceschini
2006-08-10 12:00:11 +10:00
committed by Douglas Clowes
parent 497fe0e060
commit d316f5950c

View File

@@ -25,42 +25,12 @@
/*@-incondefs@*/
/*@observer@*//*@dependent@*/ Tcl_Interp *InterpGetTcl(SicsInterp *pSics);
int readRS232(prs232 self, /*@out@*/void *data, /*@out@*/int *dataLen);
void getRS232Error(int iCode, /*@out@*/ char *errorBuffer, int errorBufferLen);
/*@observer@*//*@dependent@*/ pCounterDriver CreateCounterDriver(char *name, char *type);
void KillRS232(/*@only@ frees pData */ void *pData);
/*@+incondefs@*/
#if 0
typedef struct __COUNTDRIV {
char *name;
char *type;
CounterMode eMode;
float fPreset;
float fLastCurrent;
float fTime;
int iNoOfMonitors;
long lCounts[MAXCOUNT];
int iPause;
int iErrorCode;
int (*GetStatus)(CounterDriver *cntrData, float *fControl);
int (*Start)(CounterDriver *cntrData);
int (*Pause)(CounterDriver *cntrData);
int (*Continue)(CounterDriver *cntrData);
int (*Halt)(CounterDriver *cntrData);
int (*ReadValues)(CounterDriver *cntrData);
int (*GetError)(CounterDriver *cntrData, int *iCode, char *error, int iErrLen);
int (*TryAndFixIt)(CounterDriver *cntrData, int iCode);
int (*Set)(CounterDriver *cntrData,char *name, int iCter, float fVal);
int (*Get)(CounterDriver *cntrData,char *name, int iCter, float *fVal);
int (*Send)(CounterDriver *cntrData, char *pText, char *pReply, int iReplyLen);
void (*KillPrivate)(CounterDriver *cntrData);
void *pData; /* counter specific data */
/*@observer@*//*@dependent@*/SConnection *pCon;
prs232 controller;
} CountDriv, *BeamMon;
#endif
typedef struct {
int length;
@@ -71,6 +41,7 @@ typedef struct {
prs232 controller;
int state;
int errorCode;
char *errorMsg; /**< Points to memory for error messages */
char *host;
int iPort;
float dummy_threshold;
@@ -116,9 +87,7 @@ static int MonWrite(pBeamMon self, char* text) {
if (len > 0)
flog('>', text);
/*@+matchanyintegral@ let size_t from strlen match int */
status = writeRS232(self->controller, text, len);
/*@-matchanyintegral@*/
if (status != 1) {
self->errorCode = status;
return FAILURE;
@@ -429,13 +398,36 @@ static int MonReadValues(CounterDriver *cntrData) {
* \param *iCode error code returned to logical counter.
* \param *error error message
* \param iErrLen maximum error message length allowed.
* \return SUCCESS or FAILURE
*/
static int MonGetError(CounterDriver *cntrData, int *iCode, char *error, int iErrLen) {
BeamMon *self = NULL;
flog('.', "MonGetError");
self = (BeamMon *) cntrData->pData;
/* TODO*/
/* Allocate iErrLen bytes for error messages */
if (self->errorMsg == NULL) {
self->errorMsg = (char *) malloc(iErrLen);
if (self->errorMsg == NULL) {
return FAILURE;
}
}
error = self->errorMsg;
*iCode = self->errorCode;
switch (*iCode) {
case 0:
strncpy(error, "UNKNOWN ERROR: counterdriv did not set an errorcode.", iErrLen);
break;
case NOTCONNECTED:
case TIMEOUT:
case BADSEND:
case BADMEMORY:
getRS232Error(*iCode, error, iErrLen);
break;
default:
snprintf(error, iErrLen, "Unknown error code: %d, returned from counterdriv", *iCode);
}
self->errorCode = 0;
return SUCCESS;
}
@@ -458,7 +450,10 @@ static int MonTryAndFixIt(CounterDriver *cntrData, int iCode) {
case NOTCONNECTED:
initRS232(self->controller);
return COREDO;
/* TODO*/
case BADSEND:
case TIMEOUT:
case BADMEMORY: /* Won't happen if MonConnect sets the send terminator */
return COREDO;
}
return COTERM;
}
@@ -521,7 +516,8 @@ static void KillMon(pCounterDriver cntrData) {
if (self) {
if (self->host)
free(self->host);
/* TODO*/
if (self->errorMsg)
free(self->errorMsg);
}
}
@@ -574,6 +570,9 @@ static void KillMon(pCounterDriver cntrData) {
return NULL;
}
newCtr->controller = NULL;
newCtr->state = HWIdle;
newCtr->errorCode = 0;
newCtr->errorMsg = NULL;
newCtr->host = NULL;
newCtr->iPort = 0;
newCtr->dummy_threshold = 0;