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@*/
|
/*@-incondefs@*/
|
||||||
/*@observer@*//*@dependent@*/ Tcl_Interp *InterpGetTcl(SicsInterp *pSics);
|
/*@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);
|
/*@observer@*//*@dependent@*/ pCounterDriver CreateCounterDriver(char *name, char *type);
|
||||||
void KillRS232(/*@only@ frees pData */ void *pData);
|
void KillRS232(/*@only@ frees pData */ void *pData);
|
||||||
/*@+incondefs@*/
|
/*@+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 {
|
typedef struct {
|
||||||
int length;
|
int length;
|
||||||
@@ -71,6 +41,7 @@ typedef struct {
|
|||||||
prs232 controller;
|
prs232 controller;
|
||||||
int state;
|
int state;
|
||||||
int errorCode;
|
int errorCode;
|
||||||
|
char *errorMsg; /**< Points to memory for error messages */
|
||||||
char *host;
|
char *host;
|
||||||
int iPort;
|
int iPort;
|
||||||
float dummy_threshold;
|
float dummy_threshold;
|
||||||
@@ -116,9 +87,7 @@ static int MonWrite(pBeamMon self, char* text) {
|
|||||||
if (len > 0)
|
if (len > 0)
|
||||||
flog('>', text);
|
flog('>', text);
|
||||||
|
|
||||||
/*@+matchanyintegral@ let size_t from strlen match int */
|
|
||||||
status = writeRS232(self->controller, text, len);
|
status = writeRS232(self->controller, text, len);
|
||||||
/*@-matchanyintegral@*/
|
|
||||||
if (status != 1) {
|
if (status != 1) {
|
||||||
self->errorCode = status;
|
self->errorCode = status;
|
||||||
return FAILURE;
|
return FAILURE;
|
||||||
@@ -429,13 +398,36 @@ static int MonReadValues(CounterDriver *cntrData) {
|
|||||||
* \param *iCode error code returned to logical counter.
|
* \param *iCode error code returned to logical counter.
|
||||||
* \param *error error message
|
* \param *error error message
|
||||||
* \param iErrLen maximum error message length allowed.
|
* \param iErrLen maximum error message length allowed.
|
||||||
|
* \return SUCCESS or FAILURE
|
||||||
*/
|
*/
|
||||||
static int MonGetError(CounterDriver *cntrData, int *iCode, char *error, int iErrLen) {
|
static int MonGetError(CounterDriver *cntrData, int *iCode, char *error, int iErrLen) {
|
||||||
BeamMon *self = NULL;
|
BeamMon *self = NULL;
|
||||||
|
|
||||||
flog('.', "MonGetError");
|
flog('.', "MonGetError");
|
||||||
self = (BeamMon *) cntrData->pData;
|
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;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -458,7 +450,10 @@ static int MonTryAndFixIt(CounterDriver *cntrData, int iCode) {
|
|||||||
case NOTCONNECTED:
|
case NOTCONNECTED:
|
||||||
initRS232(self->controller);
|
initRS232(self->controller);
|
||||||
return COREDO;
|
return COREDO;
|
||||||
/* TODO*/
|
case BADSEND:
|
||||||
|
case TIMEOUT:
|
||||||
|
case BADMEMORY: /* Won't happen if MonConnect sets the send terminator */
|
||||||
|
return COREDO;
|
||||||
}
|
}
|
||||||
return COTERM;
|
return COTERM;
|
||||||
}
|
}
|
||||||
@@ -521,7 +516,8 @@ static void KillMon(pCounterDriver cntrData) {
|
|||||||
if (self) {
|
if (self) {
|
||||||
if (self->host)
|
if (self->host)
|
||||||
free(self->host);
|
free(self->host);
|
||||||
/* TODO*/
|
if (self->errorMsg)
|
||||||
|
free(self->errorMsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -574,6 +570,9 @@ static void KillMon(pCounterDriver cntrData) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
newCtr->controller = NULL;
|
newCtr->controller = NULL;
|
||||||
|
newCtr->state = HWIdle;
|
||||||
|
newCtr->errorCode = 0;
|
||||||
|
newCtr->errorMsg = NULL;
|
||||||
newCtr->host = NULL;
|
newCtr->host = NULL;
|
||||||
newCtr->iPort = 0;
|
newCtr->iPort = 0;
|
||||||
newCtr->dummy_threshold = 0;
|
newCtr->dummy_threshold = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user