Handle communications faults.
r1054 | ffr | 2006-08-10 12:00:11 +1000 (Thu, 10 Aug 2006) | 2 lines
This commit is contained in:
committed by
Douglas Clowes
parent
497fe0e060
commit
d316f5950c
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user