diff --git a/devser.c b/devser.c index 73fa4372..e4df4b31 100644 --- a/devser.c +++ b/devser.c @@ -22,6 +22,7 @@ struct DevSer { DevAction *actions; /* the action queue */ DevAction *toKill; /* list of actions to be killed */ int steps; + AsconStatus status; double startTime; /* fields for statistics */ double comCount; long nComCount; @@ -228,7 +229,6 @@ void DevAsconStatistics(DevSer *self, double *avg, \ static int DevQueueTask(void *ds) { DevSer *devser = ds; - AsconStatus status; DevAction *action; char *sendData; char *replyData = NULL; @@ -245,10 +245,10 @@ static int DevQueueTask(void *ds) } while (action != NULL) { - StartAscon(devser); - status = AsconTask(devser->ascon); + StartAscon(devser); + devser->status = AsconTask(devser->ascon); AsconLog(devser); - if (status == AsconFailure) { + if (devser->status >= AsconFailure) { replyData = AsconGetError(devser->ascon); /** * TODO: this may be a place to record the end time @@ -258,7 +258,7 @@ static int DevQueueTask(void *ds) } else { /* This is a follow up error and should not go into statistics */ } - } else if (status == AsconReady) { + } else if (devser->status == AsconReady) { replyData = AsconRead(devser->ascon); if(replyData != NULL){ LogResponse(devser,0); @@ -269,7 +269,7 @@ static int DevQueueTask(void *ds) if (devser->steps > 0) { /* debugging mode */ devser->steps--; } - sendData = action->hdl(action->data, replyData, (status == AsconFailure)); + sendData = action->hdl(action->data, replyData, (devser->status != AsconReady)); if (sendData != NULL) { AsconWrite(devser->ascon, sendData, 0); LogStart(devser); @@ -304,6 +304,7 @@ DevSer *DevMake(SConnection * con, int argc, char *argv[]) devser->actions = NULL; devser->toKill = NULL; devser->steps = -1; /* no debugging by default */ + devser->status = AsconUnconnected; devser->startTime = -1; TaskRegister(pServ->pTasker, DevQueueTask, NULL, NULL, devser, 0); return devser; @@ -347,11 +348,12 @@ void DevDisconnect(DevSer * devser) if (devser->ascon) { AsconDisconnect(devser->ascon); } + devser->status = AsconOffline; } void DevReconnect(DevSer * devser, char *hostport) { - DevReset(devser); + /* DevReset(devser); */ if (devser->ascon) { AsconReconnect(devser->ascon, hostport); } @@ -563,3 +565,33 @@ char * DevList(DevSer * devser) { DeleteDynString(result); return str; } + +char *DevHostport(DevSer *devser) { + return AsconHostport(devser->ascon); +} + +char *DevStatus(DevSer *devser) { + char *str, *pos; + static char buf[64]; + + switch (devser->status) { + case AsconOffline: return "disconnected"; + case AsconUnconnected: return "unconnected"; + /* + case AsconPending: return "busy"; + case AsconReady: return "ready"; + case AsconFailure: return AsconGetError(devser->ascon); + */ + } + str = AsconGetError(devser->ascon); + if (strncmp(str, "ASCERR: ", 8) == 0) { + str += 8; + } + pos = strchr(str, '('); + if (pos != 0) { + snprintf(buf, sizeof buf, "%s", str); + buf[pos-str] = 0; + str = buf; + } + return str; +} diff --git a/devser.h b/devser.h index a66b34b8..9f77b784 100644 --- a/devser.h +++ b/devser.h @@ -183,4 +183,19 @@ void DevStatistics(DevSer *devser, double *avg, double *max, */ void DevAsconStatistics(DevSer *self, double *avg, double *max, int *maxState, int *longCount); + +/** + * \brief return host:port + * \param devser The device serializer to query + * \return the host and port + */ +char *DevHostport(DevSer *devser); + +/** + * \brief return status of device server ("offline", "unconnected", "") + * \param devser The device serializer to query + * \return the status + */ +char *DevStatus(DevSer *devser); + #endif