diff --git a/site_ansto/counterdriv.c b/site_ansto/counterdriv.c index 992bdbd3..d0ca7022 100644 --- a/site_ansto/counterdriv.c +++ b/site_ansto/counterdriv.c @@ -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;