diff --git a/site_ansto/hardsup/nhq200util.c b/site_ansto/hardsup/nhq200util.c index 99a2337c..2208fe27 100644 --- a/site_ansto/hardsup/nhq200util.c +++ b/site_ansto/hardsup/nhq200util.c @@ -101,6 +101,16 @@ static int NHQ_Rx(void* ctx, int rxchar) int iRet = 1; pCommand myCmd = (pCommand) ctx; + if (rxchar == MCC_TIMEOUT) { + /* TODO: handle command timeout */ + if (myCmd->func) + iRet = myCmd->func(myCmd->cntx, NULL, MCC_TIMEOUT); + free(myCmd->out_buf); + free(myCmd->inp_buf); + free(myCmd); + return MCC_POP_CMD; + } + switch (myCmd->cstate) { case 0: /* send with echo */ if (rxchar != myCmd->out_buf[myCmd->out_idx]) { @@ -148,6 +158,7 @@ static int NHQ_Rx(void* ctx, int rxchar) free(myCmd->out_buf); free(myCmd->inp_buf); free(myCmd); + return MCC_POP_CMD; } return iRet; } @@ -190,6 +201,11 @@ static void NHQ_Notify(void* context, int event) pNHQ200 self = (pNHQ200) context; switch (event) { + case MCC_DISCONNECT: + if (self->transWait == 1) { + self->transWait = NHQ200__FAULT; + strcpy(self->pAns, "DISCONNECTED"); + } case MCC_RECONNECT: do { mkChannel* sock = MultiChanGetSocket(self->mcc); @@ -290,50 +306,56 @@ static int InitCallback(void* ctx, const char* resp, int resp_len) { char cmd[20]; int cmd_len; - /* TODO: FIXME finish initialisation */ pNHQ200 self = (pNHQ200) ctx; - switch (self->iState) { - case 0: /* Initial */ - cmd_len = snprintf(cmd, sizeof(cmd), "#"); - NHQ_SendCmd(self->mcc, cmd, cmd_len, InitCallback, self, 80); - self->iState = STATE_HASH; - break; - case STATE_HASH: /* # */ - parse_hash(self, resp, resp_len); - cmd_len = snprintf(cmd, sizeof(cmd), "S%d", self->iControl); - NHQ_SendCmd(self->mcc, cmd, cmd_len, InitCallback, self, 80); - self->iState = STATE_SX; - break; - case STATE_SX: /* Sx */ - parse_Sx(self, resp, resp_len); - cmd_len = snprintf(cmd, sizeof(cmd), "T%d", self->iControl); - NHQ_SendCmd(self->mcc, cmd, cmd_len, InitCallback, self, 80); - self->iState = STATE_TX; - break; - case STATE_TX: /* Tx */ - parse_Tx(self, resp, resp_len); - cmd_len = snprintf(cmd, sizeof(cmd), "M%d", self->iControl); - NHQ_SendCmd(self->mcc, cmd, cmd_len, InitCallback, self, 80); - self->iState = STATE_MX; - break; - case STATE_MX: /* Mx */ - parse_Mx(self, resp, resp_len); - cmd_len = snprintf(cmd, sizeof(cmd), "N%d", self->iControl); - NHQ_SendCmd(self->mcc, cmd, cmd_len, InitCallback, self, 80); - self->iState = STATE_NX; - break; - case STATE_NX: /* Nx */ - parse_Nx(self, resp, resp_len); - cmd_len = snprintf(cmd, sizeof(cmd), "V%d", self->iControl); - NHQ_SendCmd(self->mcc, cmd, cmd_len, InitCallback, self, 80); - self->iState = STATE_VX; - break; - case STATE_VX: /* Vx */ - parse_Vx(self, resp, resp_len); - self->iState = STATE_END; - break; - case STATE_END: - break; + /* TODO: FIXME finish initialisation */ + if (resp_len < 0) { + self->iError = NHQ200__BADSET; + self->iState = 0; + } + else { + switch (self->iState) { + case 0: /* Initial */ + cmd_len = snprintf(cmd, sizeof(cmd), "#"); + NHQ_SendCmd(self->mcc, cmd, cmd_len, InitCallback, self, 80); + self->iState = STATE_HASH; + break; + case STATE_HASH: /* # */ + parse_hash(self, resp, resp_len); + cmd_len = snprintf(cmd, sizeof(cmd), "S%d", self->iControl); + NHQ_SendCmd(self->mcc, cmd, cmd_len, InitCallback, self, 80); + self->iState = STATE_SX; + break; + case STATE_SX: /* Sx */ + parse_Sx(self, resp, resp_len); + cmd_len = snprintf(cmd, sizeof(cmd), "T%d", self->iControl); + NHQ_SendCmd(self->mcc, cmd, cmd_len, InitCallback, self, 80); + self->iState = STATE_TX; + break; + case STATE_TX: /* Tx */ + parse_Tx(self, resp, resp_len); + cmd_len = snprintf(cmd, sizeof(cmd), "M%d", self->iControl); + NHQ_SendCmd(self->mcc, cmd, cmd_len, InitCallback, self, 80); + self->iState = STATE_MX; + break; + case STATE_MX: /* Mx */ + parse_Mx(self, resp, resp_len); + cmd_len = snprintf(cmd, sizeof(cmd), "N%d", self->iControl); + NHQ_SendCmd(self->mcc, cmd, cmd_len, InitCallback, self, 80); + self->iState = STATE_NX; + break; + case STATE_NX: /* Nx */ + parse_Nx(self, resp, resp_len); + cmd_len = snprintf(cmd, sizeof(cmd), "V%d", self->iControl); + NHQ_SendCmd(self->mcc, cmd, cmd_len, InitCallback, self, 80); + self->iState = STATE_VX; + break; + case STATE_VX: /* Vx */ + parse_Vx(self, resp, resp_len); + self->iState = STATE_END; + break; + case STATE_END: + break; + } } return 0; } @@ -353,14 +375,19 @@ static int GetCallback(void* ctx, const char* resp, int resp_len) float fRead; pNHQ200 self = (pNHQ200) ctx; - iRet = sscanf(resp,"%g",&fRead); - if(iRet != 1) { // Not a number, probably an error response + if (resp_len < 0) { self->iError = NHQ200__BADREAD; } else { - if (fRead < 0) - fRead = -fRead; - self->fValue = fRead; + iRet = sscanf(resp,"%g",&fRead); + if(iRet != 1) { // Not a number, probably an error response + self->iError = NHQ200__BADREAD; + } + else { + if (fRead < 0) + fRead = -fRead; + self->fValue = fRead; + } } self->iGetOut = 0; return 0; @@ -373,9 +400,15 @@ static int TransCallback(void* ctx, const char* resp, int resp_len) { pNHQ200 self = (pNHQ200) ctx; - memcpy(self->transReply, resp, resp_len); - self->transReply[resp_len] = '\0'; - self->transWait = 0; + if (resp_len < 0) { + self->transReply[0] = '\0'; + self->transWait = -1; + } + else { + memcpy(self->transReply, resp, resp_len); + self->transReply[resp_len] = '\0'; + self->transWait = 0; + } return 0; } @@ -389,8 +422,10 @@ int transactNHQ200(pNHQ200 self, void *send, int sendLen, NHQ_SendCmd(self->mcc, send, sendLen, TransCallback, self, replyLen); - while (self->transWait) + while (self->transWait == 1) TaskYield(pServ->pTasker); + if (self->transWait < 0) + return self->transWait; return 1; } @@ -651,74 +686,3 @@ void NHQ200_ErrorTxt(pNHQ200 *pData,int iCode, char *pError, int iLen) break; } } - -static int GALIL_Tx(void* ctx) -{ - int iRet = 1; - pCommand myCmd = (pCommand) ctx; - - if (myCmd) { - iRet = MultiChanWrite(myCmd->unit, myCmd->out_buf, myCmd->out_len); - /* TODO handle errors */ - if (iRet < 0) { /* TODO: EOF */ - iRet = MultiChanReconnect(myCmd->unit); - if (iRet == 0) - return 0; - } - } - return 1; -} - -static int GALIL_Rx(void* ctx, int rxchar) -{ - int iRet = 1; - pCommand myCmd = (pCommand) ctx; - - switch (myCmd->cstate) { - case 0: /* first character */ - if (rxchar == ':') { - /* normal prompt */ - myCmd->cstate = 99; - } - else if (rxchar == '?') { - /* TODO: error prompt, send TC1 */ - myCmd->cstate = 99; - } - else { - /* normal data */ - myCmd->cstate = 1; - } - /* note fallthrough */ - case 1: /* receiving reply */ - if (myCmd->inp_idx < myCmd->inp_len) - myCmd->inp_buf[myCmd->inp_idx++] = rxchar; - if (rxchar == 0x0D) - myCmd->cstate = 2; - break; - case 2: /* received CR and looking for LF */ - if (myCmd->inp_idx < myCmd->inp_len) - myCmd->inp_buf[myCmd->inp_idx++] = rxchar; - if (rxchar == 0x0A) { - myCmd->cstate = 99; - /* end of line */ - } - else - myCmd->cstate = 1; - break; - } - if (myCmd->cstate == 99) { - myCmd->inp_buf[myCmd->inp_idx] = '\0'; - if (myCmd->func) - iRet = myCmd->func(myCmd->cntx, myCmd->inp_buf, myCmd->inp_idx); - else - iRet = 0; - myCmd->cstate = 0; - myCmd->inp_idx = 0; - } - if (iRet == 0) { /* end of command */ - free(myCmd->out_buf); - free(myCmd->inp_buf); - free(myCmd); - } - return iRet; -} diff --git a/site_ansto/safetyplc.c b/site_ansto/safetyplc.c index d8649c17..ec0e860b 100644 --- a/site_ansto/safetyplc.c +++ b/site_ansto/safetyplc.c @@ -92,6 +92,16 @@ static int PLC_Rx(void* ctx, int rxchar) int iRet = 1; pCommand myCmd = (pCommand) ctx; + if (rxchar == MCC_TIMEOUT) { + /* TODO: handle command timeout */ + if (myCmd->func) + iRet = myCmd->func(myCmd->cntx, NULL, MCC_TIMEOUT); + free(myCmd->out_buf); + free(myCmd->inp_buf); + free(myCmd); + return MCC_POP_CMD; + } + switch (myCmd->cstate) { case 0: /* first character */ /* normal data */ @@ -127,6 +137,7 @@ static int PLC_Rx(void* ctx, int rxchar) free(myCmd->out_buf); free(myCmd->inp_buf); free(myCmd); + return MCC_POP_CMD; } return iRet; } @@ -194,22 +205,27 @@ static int GetCallback(void* ctx, const char* resp, int resp_len) int iRet; unsigned int iRead; pSafetyPLCController self = (pSafetyPLCController) ctx; - iRet = sscanf(resp,"READ %x", &iRead); - if(iRet != 1) { // Not a number, probably an error response - self->iValue = 0; + if (resp_len < 0) { + DMC2280MotionControl = -1; } else { - if ((iRead & LAMP_TEST_BIT) == 0) - self->iValue = iRead; + iRet = sscanf(resp,"READ %x", &iRead); + if(iRet != 1) { // Not a number, probably an error response + self->iValue = 0; + } + else { + if ((iRead & LAMP_TEST_BIT) == 0) + self->iValue = iRead; + } + if ((self->iValue & MOTOR_BOTH_BITS) == 0) /* neither */ + DMC2280MotionControl = -1; + else if ((self->iValue & MOTOR_BOTH_BITS) == MOTOR_BOTH_BITS) /* both */ + DMC2280MotionControl = -1; + else if ((self->iValue & MOTOR_ENABLED_BIT)) /* enabled */ + DMC2280MotionControl = 1; + else /* disabled */ + DMC2280MotionControl = 0; } - if ((self->iValue & MOTOR_BOTH_BITS) == 0) /* neither */ - DMC2280MotionControl = -1; - else if ((self->iValue & MOTOR_BOTH_BITS) == MOTOR_BOTH_BITS) /* both */ - DMC2280MotionControl = -1; - else if ((self->iValue & MOTOR_ENABLED_BIT)) /* enabled */ - DMC2280MotionControl = 1; - else /* disabled */ - DMC2280MotionControl = 0; self->iGetOut = 0; return 0;