Add inter-command delay, fix compiler warning
r1612 | dcl | 2007-03-08 13:28:58 +1100 (Thu, 08 Mar 2007) | 2 lines
This commit is contained in:
75
multichan.c
75
multichan.c
@@ -10,6 +10,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <sys/time.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <sics.h>
|
||||
#include <rs232controller.h>
|
||||
@@ -41,6 +42,8 @@ struct __MultiChanController {
|
||||
pObjectDescriptor pDes;
|
||||
char* pHost;
|
||||
int iPort;
|
||||
int iDelay; /* intercommand delay in milliseconds */
|
||||
struct timeval tvLastCmd; /* time of completion of last command */
|
||||
int unit_count; /* number of units connected */
|
||||
pMultiChan units; /* head of unit chain */
|
||||
prs232 controller; /* associated RS232 controller object */
|
||||
@@ -96,6 +99,31 @@ static int StartCommand(pMultiChanController self)
|
||||
if (self->nw_tmr)
|
||||
NetWatchRemoveTimer(self->nw_tmr);
|
||||
|
||||
/*
|
||||
* Implement the inter-command delay
|
||||
*/
|
||||
if (self->iDelay) {
|
||||
struct timeval now, when;
|
||||
gettimeofday(&now, NULL);
|
||||
if (self->tvLastCmd.tv_sec == 0)
|
||||
self->tvLastCmd = now;
|
||||
when.tv_sec = self->tvLastCmd.tv_sec;
|
||||
when.tv_usec = self->tvLastCmd.tv_usec + 1000 * self->iDelay;
|
||||
if (when.tv_usec >= 1000000) {
|
||||
when.tv_sec += when.tv_usec / 1000000;
|
||||
when.tv_usec %= 1000000;
|
||||
}
|
||||
if (when.tv_sec > now.tv_sec ||
|
||||
(when.tv_sec == now.tv_sec && when.tv_usec > now.tv_usec)) {
|
||||
int delay = when.tv_sec - now.tv_sec;
|
||||
delay *= 1000;
|
||||
delay += (when.tv_usec - now.tv_usec + (1000 - 1)) / 1000;
|
||||
NetWatchRegisterTimer(&self->nw_tmr, delay,
|
||||
CommandTimeout, self);
|
||||
return OKOK;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Discard any input before sending command
|
||||
*/
|
||||
@@ -150,6 +178,7 @@ static int PopCommand(pMultiChanController self)
|
||||
if (self->nw_tmr)
|
||||
NetWatchRemoveTimer(self->nw_tmr);
|
||||
self->nw_tmr = 0;
|
||||
gettimeofday(&self->tvLastCmd, NULL);
|
||||
/*
|
||||
* If this is not the last in queue, start transmission
|
||||
*/
|
||||
@@ -252,6 +281,21 @@ void MultiChanSetNotify(pMultiChan unit, void* context, MCC_Notify notify)
|
||||
unit->notify_cntx = context;
|
||||
}
|
||||
|
||||
int MultiChanGetDelay(pMultiChan unit)
|
||||
{
|
||||
assert(unit);
|
||||
return unit->mcc->iDelay;
|
||||
}
|
||||
|
||||
int MultiChanSetDelay(pMultiChan unit, int iDelay)
|
||||
{
|
||||
int old_iDelay;
|
||||
assert(unit);
|
||||
old_iDelay = unit->mcc->iDelay;
|
||||
unit->mcc->iDelay = iDelay;
|
||||
return old_iDelay;
|
||||
}
|
||||
|
||||
int MultiChanGetTimeout(pMultiChan unit)
|
||||
{
|
||||
assert(unit);
|
||||
@@ -270,7 +314,35 @@ int MultiChanSetTimeout(pMultiChan unit, int timeout)
|
||||
int MultiChanAction(SConnection *pCon, SicsInterp *pSics,
|
||||
void *pData, int argc, char *argv[])
|
||||
{
|
||||
char line[132];
|
||||
pMultiChanController self = (pMultiChanController) pData;
|
||||
if (strcasecmp(argv[1], "delay") == 0) {
|
||||
if (argc > 2) {
|
||||
int delay;
|
||||
int iRet;
|
||||
iRet = sscanf(argv[2], "%d", &delay);
|
||||
if (iRet != 1) {
|
||||
snprintf(line, 132, "Invalid argument: %s", argv[2]);
|
||||
SCWrite(pCon, line, eError);
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
if (delay < 0 || delay > 30000) {
|
||||
snprintf(line, 132, "Value out of range: %d", delay);
|
||||
SCWrite(pCon, line, eError);
|
||||
return 0;
|
||||
}
|
||||
self->iDelay = delay;
|
||||
return OKOK;
|
||||
}
|
||||
}
|
||||
else {
|
||||
snprintf(line, 132, "%s.delay = %d", argv[0], self->iDelay);
|
||||
SCWrite(pCon, line, eStatus);
|
||||
return OKOK;
|
||||
}
|
||||
return OKOK;
|
||||
}
|
||||
/* TODO: handle private stuff */
|
||||
return RS232Action(pCon, pSics, self->controller, argc, argv);
|
||||
}
|
||||
@@ -324,9 +396,10 @@ static int MC_Init(pMultiChanController self)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void MC_Kill(pMultiChanController self)
|
||||
static void MC_Kill(void* pData)
|
||||
{
|
||||
int i;
|
||||
pMultiChanController self = (pMultiChanController) pData;
|
||||
for (i = 0; i < mcc_index; ++i)
|
||||
if (mcc_array[i] == self) {
|
||||
--mcc_index;
|
||||
|
||||
Reference in New Issue
Block a user