timeout handling
r1661 | dcl | 2007-03-16 09:06:29 +1100 (Fri, 16 Mar 2007) | 2 lines
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user