timeout handling

r1661 | dcl | 2007-03-16 09:06:29 +1100 (Fri, 16 Mar 2007) | 2 lines
This commit is contained in:
Douglas Clowes
2007-03-16 09:06:29 +11:00
parent d1500ef0b4
commit 36780e52ea
2 changed files with 116 additions and 136 deletions

View File

@@ -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;
}

View File

@@ -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;