get it to build
This commit is contained in:
25
SICSmain.c
25
SICSmain.c
@ -20,6 +20,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
#include "nserver.h"
|
#include "nserver.h"
|
||||||
#include "servlog.h"
|
#include "servlog.h"
|
||||||
|
|
||||||
@ -32,6 +33,12 @@ pServer pServ = NULL;
|
|||||||
|
|
||||||
#define DEFAULTINIFILE "servo.tcl"
|
#define DEFAULTINIFILE "servo.tcl"
|
||||||
|
|
||||||
|
int usage(const char *name)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "usage: %s [-d] [-nolog] <config.tcl>\n", name);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------
|
/*---------------------------------------------------------------------------
|
||||||
The Servers Main program. May take one argument: the name of an
|
The Servers Main program. May take one argument: the name of an
|
||||||
initialisation file
|
initialisation file
|
||||||
@ -40,22 +47,36 @@ pServer pServ = NULL;
|
|||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int iRet;
|
int iRet;
|
||||||
|
int daemonize = 0;
|
||||||
char *file = NULL;
|
char *file = NULL;
|
||||||
int i;
|
int i, firstArg = 1;
|
||||||
|
|
||||||
|
if (argc < 2)
|
||||||
|
return usage(argv[0]);
|
||||||
|
|
||||||
/* initialise, will die on you if problems */
|
/* initialise, will die on you if problems */
|
||||||
for (i = 1; i < argc; i++) {
|
if (strcasecmp(argv[1], "-d") == 0) {
|
||||||
|
daemonize = 1;
|
||||||
|
firstArg = 2;
|
||||||
|
}
|
||||||
|
for (i = firstArg; i < argc; i++) {
|
||||||
if (strcmp(argv[i], "-nolog") == 0) {
|
if (strcmp(argv[i], "-nolog") == 0) {
|
||||||
SICSLogEnable(0);
|
SICSLogEnable(0);
|
||||||
} else if (file == NULL) {
|
} else if (file == NULL) {
|
||||||
file = argv[i];
|
file = argv[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (file == NULL)
|
||||||
|
return usage(argv[0]);
|
||||||
|
|
||||||
iRet = InitServer(file, &pServ);
|
iRet = InitServer(file, &pServ);
|
||||||
if (!iRet) {
|
if (!iRet) {
|
||||||
printf("Unrecoverable error on server startup, exiting.........\n");
|
printf("Unrecoverable error on server startup, exiting.........\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
if (daemonize == 1)
|
||||||
|
daemon(1, 1);
|
||||||
|
|
||||||
|
|
||||||
RunServer(pServ);
|
RunServer(pServ);
|
||||||
|
92
nwatch.c
92
nwatch.c
@ -67,10 +67,13 @@ typedef struct __netwatchtimer {
|
|||||||
struct timeval tv; /* time when event is due */
|
struct timeval tv; /* time when event is due */
|
||||||
pNWCallback func; /* function to call */
|
pNWCallback func; /* function to call */
|
||||||
void *cntx; /* abstract context to pass to callback */
|
void *cntx; /* abstract context to pass to callback */
|
||||||
long int tick; /* millisecond repeat rate */
|
int msec; /* millisecond delay time */
|
||||||
|
int tick; /* millisecond repeat rate */
|
||||||
long int vrfy; /* integrity check */
|
long int vrfy; /* integrity check */
|
||||||
} NWTimer;
|
} NWTimer;
|
||||||
|
|
||||||
|
static pNWTimer activeTimer = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* \brief private function to insert an entry into the sorted timer queue.
|
* \brief private function to insert an entry into the sorted timer queue.
|
||||||
*
|
*
|
||||||
@ -83,6 +86,7 @@ static int NetWatchTimerInsQue(pNetWatch self, pNWTimer handle)
|
|||||||
if (self->tq_head == NULL) {
|
if (self->tq_head == NULL) {
|
||||||
self->tq_head = self->tq_tail = handle;
|
self->tq_head = self->tq_tail = handle;
|
||||||
handle->next = NULL;
|
handle->next = NULL;
|
||||||
|
handle->vrfy = NWMAGIC;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/* if new one is not earlier than latest one, insert after latest */
|
/* if new one is not earlier than latest one, insert after latest */
|
||||||
@ -92,6 +96,7 @@ static int NetWatchTimerInsQue(pNetWatch self, pNWTimer handle)
|
|||||||
self->tq_tail->next = handle;
|
self->tq_tail->next = handle;
|
||||||
self->tq_tail = handle;
|
self->tq_tail = handle;
|
||||||
handle->next = NULL;
|
handle->next = NULL;
|
||||||
|
handle->vrfy = NWMAGIC;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/* if new one is not later than earliest one, insert before earliest */
|
/* if new one is not later than earliest one, insert before earliest */
|
||||||
@ -100,6 +105,7 @@ static int NetWatchTimerInsQue(pNetWatch self, pNWTimer handle)
|
|||||||
handle->tv.tv_usec <= self->tq_head->tv.tv_usec)) {
|
handle->tv.tv_usec <= self->tq_head->tv.tv_usec)) {
|
||||||
handle->next = self->tq_head;
|
handle->next = self->tq_head;
|
||||||
self->tq_head = handle;
|
self->tq_head = handle;
|
||||||
|
handle->vrfy = NWMAGIC;
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
/* must be in between two so start at the first entry */
|
/* must be in between two so start at the first entry */
|
||||||
@ -113,8 +119,10 @@ static int NetWatchTimerInsQue(pNetWatch self, pNWTimer handle)
|
|||||||
/* slip new one in between this one and the next one */
|
/* slip new one in between this one and the next one */
|
||||||
handle->next = pNxt->next;
|
handle->next = pNxt->next;
|
||||||
pNxt->next = handle;
|
pNxt->next = handle;
|
||||||
|
handle->vrfy = NWMAGIC;
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
return 1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -125,6 +133,7 @@ static int NetWatchTimerInsQue(pNetWatch self, pNWTimer handle)
|
|||||||
*/
|
*/
|
||||||
static int NetWatchTimerRemQue(pNetWatch self, pNWTimer handle)
|
static int NetWatchTimerRemQue(pNetWatch self, pNWTimer handle)
|
||||||
{
|
{
|
||||||
|
assert(handle->vrfy == NWMAGIC);
|
||||||
/* handle the case of first and possibly only */
|
/* handle the case of first and possibly only */
|
||||||
if (handle == self->tq_head) {
|
if (handle == self->tq_head) {
|
||||||
self->tq_head = self->tq_head->next; /* may be NULL */
|
self->tq_head = self->tq_head->next; /* may be NULL */
|
||||||
@ -145,12 +154,14 @@ static int NetWatchTimerRemQue(pNetWatch self, pNWTimer handle)
|
|||||||
if (handle == self->tq_tail)
|
if (handle == self->tq_tail)
|
||||||
self->tq_tail = pNxt;
|
self->tq_tail = pNxt;
|
||||||
}
|
}
|
||||||
|
handle->vrfy = 0;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int NetWatchRegisterTimer(pNWTimer * handle, int mSec,
|
int NetWatchRegisterTimer(pNWTimer * handle, int mSec,
|
||||||
pNWCallback callback, void *context)
|
pNWCallback callback, void *context)
|
||||||
{
|
{
|
||||||
|
assert(callback);
|
||||||
pNetWatch self = instance;
|
pNetWatch self = instance;
|
||||||
if (!self || self->lMagic != NWMAGIC)
|
if (!self || self->lMagic != NWMAGIC)
|
||||||
return 0;
|
return 0;
|
||||||
@ -165,10 +176,10 @@ int NetWatchRegisterTimer(pNWTimer * handle, int mSec,
|
|||||||
pNew->tv.tv_sec++;
|
pNew->tv.tv_sec++;
|
||||||
pNew->tv.tv_usec -= 1000000;
|
pNew->tv.tv_usec -= 1000000;
|
||||||
}
|
}
|
||||||
|
pNew->msec = mSec;
|
||||||
pNew->tick = 0;
|
pNew->tick = 0;
|
||||||
pNew->func = callback;
|
pNew->func = callback;
|
||||||
pNew->cntx = context;
|
pNew->cntx = context;
|
||||||
pNew->vrfy = NWMAGIC;
|
|
||||||
NetWatchTimerInsQue(self, pNew);
|
NetWatchTimerInsQue(self, pNew);
|
||||||
*handle = pNew;
|
*handle = pNew;
|
||||||
return 1;
|
return 1;
|
||||||
@ -178,6 +189,7 @@ int NetWatchRegisterTimerPeriodic(pNWTimer * handle, int mSecInitial,
|
|||||||
int mSecPeriod, pNWCallback callback,
|
int mSecPeriod, pNWCallback callback,
|
||||||
void *context)
|
void *context)
|
||||||
{
|
{
|
||||||
|
assert(callback);
|
||||||
if (NetWatchRegisterTimer(handle, mSecInitial, callback, context)) {
|
if (NetWatchRegisterTimer(handle, mSecInitial, callback, context)) {
|
||||||
pNWTimer pNew = *handle;
|
pNWTimer pNew = *handle;
|
||||||
if (pNew == NULL)
|
if (pNew == NULL)
|
||||||
@ -189,16 +201,36 @@ int NetWatchRegisterTimerPeriodic(pNWTimer * handle, int mSecInitial,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pNWTimer NetWatchGetActiveTimer(void)
|
||||||
|
{
|
||||||
|
return activeTimer;
|
||||||
|
}
|
||||||
|
|
||||||
|
int NetWatchGetTimerInitial(pNWTimer handle)
|
||||||
|
{
|
||||||
|
if (handle == NULL
|
||||||
|
|| (handle->vrfy != NWMAGIC && handle->vrfy != ~NWMAGIC))
|
||||||
|
return 0;
|
||||||
|
return handle->msec;
|
||||||
|
}
|
||||||
|
|
||||||
|
int NetWatchGetTimerDelay(pNWTimer handle)
|
||||||
|
{
|
||||||
|
return NetWatchGetTimerInitial(handle);
|
||||||
|
}
|
||||||
|
|
||||||
int NetWatchGetTimerPeriod(pNWTimer handle)
|
int NetWatchGetTimerPeriod(pNWTimer handle)
|
||||||
{
|
{
|
||||||
if (handle == NULL || handle->vrfy != NWMAGIC)
|
if (handle == NULL
|
||||||
|
|| (handle->vrfy != NWMAGIC && handle->vrfy != ~NWMAGIC))
|
||||||
return 0;
|
return 0;
|
||||||
return handle->tick;
|
return handle->tick;
|
||||||
}
|
}
|
||||||
|
|
||||||
int NetWatchSetTimerPeriod(pNWTimer handle, int mSecPeriod)
|
int NetWatchSetTimerPeriod(pNWTimer handle, int mSecPeriod)
|
||||||
{
|
{
|
||||||
if (handle == NULL || handle->vrfy != NWMAGIC)
|
if (handle == NULL
|
||||||
|
|| (handle->vrfy != NWMAGIC && handle->vrfy != ~NWMAGIC))
|
||||||
return 0;
|
return 0;
|
||||||
handle->tick = mSecPeriod;
|
handle->tick = mSecPeriod;
|
||||||
return 1;
|
return 1;
|
||||||
@ -209,6 +241,8 @@ int NetWatchRemoveTimer(pNWTimer handle)
|
|||||||
pNetWatch self = instance;
|
pNetWatch self = instance;
|
||||||
if (!self || self->lMagic != NWMAGIC)
|
if (!self || self->lMagic != NWMAGIC)
|
||||||
return 0;
|
return 0;
|
||||||
|
if (handle == NULL || handle->vrfy != NWMAGIC)
|
||||||
|
return 0;
|
||||||
NetWatchTimerRemQue(self, handle);
|
NetWatchTimerRemQue(self, handle);
|
||||||
handle->vrfy = 0;
|
handle->vrfy = 0;
|
||||||
free(handle);
|
free(handle);
|
||||||
@ -239,35 +273,10 @@ static int NetWatchContextInsQue(pNetWatch self, pNWContext handle)
|
|||||||
self->cq_tail->next = handle;
|
self->cq_tail->next = handle;
|
||||||
self->cq_tail = handle;
|
self->cq_tail = handle;
|
||||||
}
|
}
|
||||||
|
handle->vrfy = NWMAGIC;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief private function to remove entry from unsorted queue
|
|
||||||
*
|
|
||||||
* \param self singleton
|
|
||||||
* \param handle entry to insert
|
|
||||||
*/
|
|
||||||
static void NetWatchContextRemQue(pNetWatch self, pNWContext handle)
|
|
||||||
{
|
|
||||||
if (handle == self->cq_head) { /* if first */
|
|
||||||
self->cq_head = self->cq_head->next;
|
|
||||||
if (handle == self->cq_tail) /* if also last */
|
|
||||||
self->cq_tail = NULL;
|
|
||||||
} else {
|
|
||||||
pNWContext pNxt = self->cq_head;
|
|
||||||
while (pNxt) {
|
|
||||||
if (handle == pNxt->next) {
|
|
||||||
pNxt->next = pNxt->next->next;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pNxt = pNxt->next;
|
|
||||||
}
|
|
||||||
if (handle == self->cq_tail) /* if last */
|
|
||||||
self->cq_tail = pNxt;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief private function to purge invalid entries
|
* \brief private function to purge invalid entries
|
||||||
@ -286,19 +295,19 @@ static void NetWatchContextPrgQue(pNetWatch self)
|
|||||||
free(tmp);
|
free(tmp);
|
||||||
}
|
}
|
||||||
pNxt = self->cq_head;
|
pNxt = self->cq_head;
|
||||||
while (pNxt) {
|
while (pNxt && pNxt->next) {
|
||||||
if (pNxt->next && pNxt->next->sock < 0) {
|
if (pNxt->next->sock < 0) {
|
||||||
pNWContext tmp = NULL;
|
pNWContext tmp = NULL;
|
||||||
tmp = pNxt->next;
|
tmp = pNxt->next;
|
||||||
pNxt->next = pNxt->next->next;
|
pNxt->next = pNxt->next->next;
|
||||||
tmp->vrfy = 0;
|
tmp->vrfy = 0;
|
||||||
free(tmp);
|
free(tmp);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
pNxt = pNxt->next;
|
pNxt = pNxt->next;
|
||||||
}
|
}
|
||||||
/* if the queue is empty clear the tail */
|
/* if the queue is empty then pNxt is NULL else pNxt points to the tail */
|
||||||
if (self->cq_head == NULL)
|
self->cq_tail = pNxt;
|
||||||
self->cq_tail = pNxt;
|
|
||||||
self->nInvalid = 0;
|
self->nInvalid = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -306,6 +315,7 @@ static void NetWatchContextPrgQue(pNetWatch self)
|
|||||||
int NetWatchRegisterCallback(pNWContext * handle, int iSocket,
|
int NetWatchRegisterCallback(pNWContext * handle, int iSocket,
|
||||||
pNWCallback callback, void *context)
|
pNWCallback callback, void *context)
|
||||||
{
|
{
|
||||||
|
assert(callback);
|
||||||
pNWContext pNew = NULL;
|
pNWContext pNew = NULL;
|
||||||
pNetWatch self = instance;
|
pNetWatch self = instance;
|
||||||
if (!self || self->lMagic != NWMAGIC)
|
if (!self || self->lMagic != NWMAGIC)
|
||||||
@ -320,7 +330,6 @@ int NetWatchRegisterCallback(pNWContext * handle, int iSocket,
|
|||||||
pNew->mode = nwatch_read;
|
pNew->mode = nwatch_read;
|
||||||
pNew->func = callback;
|
pNew->func = callback;
|
||||||
pNew->cntx = context;
|
pNew->cntx = context;
|
||||||
pNew->vrfy = NWMAGIC;
|
|
||||||
*handle = pNew;
|
*handle = pNew;
|
||||||
NetWatchContextInsQue(self, pNew);
|
NetWatchContextInsQue(self, pNew);
|
||||||
return 1;
|
return 1;
|
||||||
@ -333,8 +342,11 @@ int NetWatchRemoveCallback(pNWContext handle)
|
|||||||
return 0;
|
return 0;
|
||||||
if (!self || self->lMagic != NWMAGIC)
|
if (!self || self->lMagic != NWMAGIC)
|
||||||
return 0;
|
return 0;
|
||||||
|
/* mark as invalid */
|
||||||
handle->sock = -1;
|
handle->sock = -1;
|
||||||
|
/* increment count of invalid */
|
||||||
self->nInvalid++;
|
self->nInvalid++;
|
||||||
|
/* leave for garbage collection */
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -375,7 +387,7 @@ int NetWatchTask(void *pData)
|
|||||||
if (self->nInvalid > 0)
|
if (self->nInvalid > 0)
|
||||||
NetWatchContextPrgQue(self);
|
NetWatchContextPrgQue(self);
|
||||||
|
|
||||||
/* build the select mask */
|
/* build the select mask */
|
||||||
FD_ZERO(&rMask);
|
FD_ZERO(&rMask);
|
||||||
FD_ZERO(&wMask);
|
FD_ZERO(&wMask);
|
||||||
pNWC = self->cq_head;
|
pNWC = self->cq_head;
|
||||||
@ -430,7 +442,11 @@ int NetWatchTask(void *pData)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
NetWatchTimerRemQue(self, pNew);
|
NetWatchTimerRemQue(self, pNew);
|
||||||
|
activeTimer = pNew;
|
||||||
|
activeTimer->vrfy = ~NWMAGIC;
|
||||||
iStatus = pNew->func(pNew->cntx, 0);
|
iStatus = pNew->func(pNew->cntx, 0);
|
||||||
|
activeTimer->vrfy = 0;
|
||||||
|
activeTimer = NULL;
|
||||||
/*
|
/*
|
||||||
* If this is a recurrent timer and the function
|
* If this is a recurrent timer and the function
|
||||||
* indicates to keep it going, put it back in
|
* indicates to keep it going, put it back in
|
||||||
|
4
nwatch.h
4
nwatch.h
@ -53,6 +53,10 @@ int NetWatchRegisterTimerPeriodic(pNWTimer * handle, int mSecInitial,
|
|||||||
int mSecPeriod, pNWCallback callback,
|
int mSecPeriod, pNWCallback callback,
|
||||||
void *context);
|
void *context);
|
||||||
|
|
||||||
|
pNWTimer NetWatchGetActiveTimer(void);
|
||||||
|
|
||||||
|
int NetWatchGetTimerDelay(pNWTimer handle);
|
||||||
|
int NetWatchGetTimerInitial(pNWTimer handle);
|
||||||
int NetWatchGetTimerPeriod(pNWTimer handle);
|
int NetWatchGetTimerPeriod(pNWTimer handle);
|
||||||
int NetWatchSetTimerPeriod(pNWTimer handle, int mSecPeriod);
|
int NetWatchSetTimerPeriod(pNWTimer handle, int mSecPeriod);
|
||||||
/**
|
/**
|
||||||
|
274
servlog.c
274
servlog.c
@ -47,12 +47,15 @@
|
|||||||
- NETWrites log message (if enabled) before attempt to write to file
|
- NETWrites log message (if enabled) before attempt to write to file
|
||||||
- uses OpenVerifyLogFile helper function (removed duplicate code)
|
- uses OpenVerifyLogFile helper function (removed duplicate code)
|
||||||
-----------------------------------------------------------------------------*/
|
-----------------------------------------------------------------------------*/
|
||||||
|
#include <stdarg.h>
|
||||||
#include "fortify.h"
|
#include "fortify.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/time.h>
|
||||||
#include <strlutil.h>
|
#include <strlutil.h>
|
||||||
|
|
||||||
#include "ifile.h"
|
#include "ifile.h"
|
||||||
@ -126,7 +129,7 @@ int LogCapture(SConnection * pCon, SicsInterp * pSics, void *pData,
|
|||||||
|
|
||||||
/* check no af args */
|
/* check no af args */
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
snprintf(pBueffel,sizeof(pBueffel)-1, "Insufficient number of argumenst to %s", argv[0]);
|
snprintf(pBueffel,sizeof(pBueffel)-1, "Insufficient number of arguments to %s", argv[0]);
|
||||||
SCWrite(pCon, pBueffel, eError);
|
SCWrite(pCon, pBueffel, eError);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -203,8 +206,32 @@ static int HasLineFeed(char *pText)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
#define MAXLOG 10000
|
static const char* timestamp(struct timeval *tp) {
|
||||||
#define MAXFILES 20
|
static char ts[80];
|
||||||
|
int year, month, day;
|
||||||
|
int hour, min, sec, usec;
|
||||||
|
struct timeval tv;
|
||||||
|
struct tm *time;
|
||||||
|
if (tp)
|
||||||
|
tv = *tp;
|
||||||
|
else
|
||||||
|
gettimeofday(&tv, NULL);
|
||||||
|
time = localtime(&tv.tv_sec);
|
||||||
|
year = 1900 + time->tm_year;
|
||||||
|
month = time->tm_mon + 1;
|
||||||
|
day = time->tm_mday;
|
||||||
|
hour = time->tm_hour;
|
||||||
|
min = time->tm_min;
|
||||||
|
sec = time->tm_sec;
|
||||||
|
usec = (int) tv.tv_usec;
|
||||||
|
snprintf(ts, 80, "%04d-%02d-%02dT%02d:%02d:%02d.%06d",
|
||||||
|
year, month, day, hour, min, sec, usec);
|
||||||
|
return ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#define MAXLOG 100000
|
||||||
|
#define MAXFILES 100
|
||||||
|
|
||||||
static FILE *fLogFile = NULL;
|
static FILE *fLogFile = NULL;
|
||||||
static int iFile = 0;
|
static int iFile = 0;
|
||||||
@ -217,6 +244,10 @@ int OpenVerifyLogFile()
|
|||||||
char pFile[256];
|
char pFile[256];
|
||||||
char filnam[512];
|
char filnam[512];
|
||||||
char *pChar = NULL;
|
char *pChar = NULL;
|
||||||
|
char fPath[1024];
|
||||||
|
|
||||||
|
/* snprintf(fPath, 1023, "%s/", getenv("SICS_INIT_LOGPATH")); */
|
||||||
|
snprintf(fPath, 1023, "%s/", "../log");
|
||||||
|
|
||||||
pChar = IFindOption(pSICSOptions, "LogFileBaseName");
|
pChar = IFindOption(pSICSOptions, "LogFileBaseName");
|
||||||
if (!pChar) { /* Try to write to file "server" in */
|
if (!pChar) { /* Try to write to file "server" in */
|
||||||
@ -224,7 +255,9 @@ int OpenVerifyLogFile()
|
|||||||
} else {
|
} else {
|
||||||
strlcpy(pFile, pChar, 255);
|
strlcpy(pFile, pChar, 255);
|
||||||
}
|
}
|
||||||
snprintf(filnam, 511, "%s%2.2d.log", pFile, iFile);
|
|
||||||
|
snprintf(filnam, 511, "%s%s_%19.19s.%02d.log", fPath, pFile, timestamp(NULL), iFile);
|
||||||
|
|
||||||
fLogFile = fopen(filnam, "w");
|
fLogFile = fopen(filnam, "w");
|
||||||
if (!fLogFile) {
|
if (!fLogFile) {
|
||||||
fprintf(stderr, "ERROR: Cannot open logfile %s for writing\n", pFile);
|
fprintf(stderr, "ERROR: Cannot open logfile %s for writing\n", pFile);
|
||||||
@ -242,23 +275,23 @@ void SICSLogEnable(int flag)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void SICSLogWrite(char *pText, OutCode eOut)
|
static void SICSLogWriteFile(char *pText, OutCode eOut, struct timeval *tp)
|
||||||
{
|
{
|
||||||
char pFile[256];
|
|
||||||
char *pChar = NULL;
|
|
||||||
pCaptureEntry pCurrent;
|
pCaptureEntry pCurrent;
|
||||||
char pBueffel[256];
|
int text_len;
|
||||||
|
|
||||||
#ifdef NOLOG
|
#ifdef NOLOG
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
text_len = strlen(pText);
|
||||||
/* do all captured */
|
/* do all captured */
|
||||||
pCurrent = pCapture;
|
pCurrent = pCapture;
|
||||||
while (pCurrent) {
|
while (pCurrent) {
|
||||||
if ((pCurrent->iOut == eOut) || (pCurrent->iAllFlag == 1)) {
|
if ((pCurrent->iOut == eOut) || (pCurrent->iAllFlag == 1)) {
|
||||||
ANETwrite(pCurrent->pCon->sockHandle, pText, strlen(pText));
|
ANETwrite(pCurrent->pCon->sockHandle, pText, text_len);
|
||||||
ANETwrite(pCurrent->pCon->sockHandle, "\n", 1);
|
if (pText[text_len - 1] != '\n')
|
||||||
|
ANETwrite(pCurrent->pCon->sockHandle, "\n", 1);
|
||||||
}
|
}
|
||||||
pCurrent = pCurrent->pNext;
|
pCurrent = pCurrent->pNext;
|
||||||
}
|
}
|
||||||
@ -277,6 +310,7 @@ void SICSLogWrite(char *pText, OutCode eOut)
|
|||||||
|
|
||||||
/* switch file if too many lines */
|
/* switch file if too many lines */
|
||||||
if (iLineCount >= MAXLOG) {
|
if (iLineCount >= MAXLOG) {
|
||||||
|
fprintf(fLogFile,"%s: <<<close logfile>>>\n", timestamp(NULL));
|
||||||
fclose(fLogFile);
|
fclose(fLogFile);
|
||||||
fLogFile = NULL;
|
fLogFile = NULL;
|
||||||
iFile++;
|
iFile++;
|
||||||
@ -287,9 +321,225 @@ void SICSLogWrite(char *pText, OutCode eOut)
|
|||||||
iLogUsable = OpenVerifyLogFile();
|
iLogUsable = OpenVerifyLogFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (1 == iLogUsable) {
|
if(1 == iLogUsable)
|
||||||
fprintf(fLogFile, "%s\n", pText);
|
{
|
||||||
|
|
||||||
|
if (iLineCount == 0)
|
||||||
|
fprintf(fLogFile,"%s: <<<open logfile>>>\n", timestamp(NULL));
|
||||||
|
fprintf(fLogFile,"%s: ", timestamp(tp));
|
||||||
|
fprintf(fLogFile,"%s", pText);
|
||||||
|
if (text_len < 1 || pText[text_len - 1] != '\n')
|
||||||
|
fprintf(fLogFile,"\n");
|
||||||
fflush(fLogFile);
|
fflush(fLogFile);
|
||||||
iLineCount++;
|
iLineCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SICSLogWriteTime(char *pText, OutCode eOut, struct timeval *tp) {
|
||||||
|
char buf[200];
|
||||||
|
const char *cp = pText;
|
||||||
|
int idx = 0;
|
||||||
|
struct timeval tv;
|
||||||
|
|
||||||
|
if (tp == NULL) {
|
||||||
|
gettimeofday(&tv, NULL);
|
||||||
|
tp = &tv;
|
||||||
|
}
|
||||||
|
while (*cp) {
|
||||||
|
if (*cp == '\n') {
|
||||||
|
buf[idx++] = '\n';
|
||||||
|
buf[idx++] = '\0';
|
||||||
|
SICSLogWriteFile(buf, eOut, tp);
|
||||||
|
idx = 0;
|
||||||
|
}
|
||||||
|
else if (*cp == '\r') {
|
||||||
|
buf[idx++] = '\\';
|
||||||
|
buf[idx++] = 'r';
|
||||||
|
}
|
||||||
|
else if (*cp == '\t') {
|
||||||
|
buf[idx++] = '\\';
|
||||||
|
buf[idx++] = 't';
|
||||||
|
}
|
||||||
|
else if (*cp < ' ' || *cp > '~') {
|
||||||
|
const char hex[] = "0123456789ABCDEF";
|
||||||
|
buf[idx++] = '<';
|
||||||
|
buf[idx++] = hex[(*cp >> 4) & 0xF];
|
||||||
|
buf[idx++] = hex[(*cp) & 0xF];
|
||||||
|
buf[idx++] = '>';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
buf[idx++] = *cp;
|
||||||
|
}
|
||||||
|
cp++;
|
||||||
|
if (idx > 132) {
|
||||||
|
buf[idx++] = '\n';
|
||||||
|
buf[idx++] = '\0';
|
||||||
|
SICSLogWriteFile(buf, eOut, tp);
|
||||||
|
idx = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (idx > 0) {
|
||||||
|
buf[idx++] = '\n';
|
||||||
|
buf[idx++] = '\0';
|
||||||
|
SICSLogWriteFile(buf, eOut, tp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SICSLogWrite(char *pText, OutCode eOut) {
|
||||||
|
struct timeval tv;
|
||||||
|
gettimeofday(&tv, NULL);
|
||||||
|
SICSLogWriteTime(pText, eOut, &tv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SICSLogWriteHexTime(const char* text, int count, OutCode eOut, struct timeval *tp) {
|
||||||
|
const char hex[] = "0123456789ABCDEF";
|
||||||
|
char addr[20], left[80], right[80];
|
||||||
|
char *lp = left;
|
||||||
|
char *rp = right;
|
||||||
|
int i;
|
||||||
|
int duplicates;
|
||||||
|
/* Limit the output */
|
||||||
|
if (count > 1024)
|
||||||
|
count = 1024;
|
||||||
|
duplicates = 0;
|
||||||
|
for (i = 0; i < count; ++i) {
|
||||||
|
if ((i & 0xF) == 0) {
|
||||||
|
if (i > 0) {
|
||||||
|
char line[132];
|
||||||
|
snprintf(line, sizeof(line)-1, "%-6s: %-49s | %-17s |", addr, left, right);
|
||||||
|
SICSLogWriteTime(line, eOut, tp);
|
||||||
|
}
|
||||||
|
snprintf(addr, sizeof(addr)-1, "0x%04X", i);
|
||||||
|
while (i >= 16 && i + 16 < count) {
|
||||||
|
if (memcmp(&text[i-16], &text[i], 16) != 0)
|
||||||
|
break;
|
||||||
|
++duplicates;
|
||||||
|
i += 16;
|
||||||
|
}
|
||||||
|
if (duplicates > 0) {
|
||||||
|
if (duplicates > 1) {
|
||||||
|
char line[132];
|
||||||
|
snprintf(line, sizeof(line)-1, "%-6s: ... (%d duplicates)", addr, duplicates);
|
||||||
|
SICSLogWriteTime(line, eOut, tp);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
char line[132];
|
||||||
|
snprintf(line, sizeof(line)-1, "%-6s: %-49s | %-17s |", addr, left, right);
|
||||||
|
SICSLogWriteTime(line, eOut, tp);
|
||||||
|
}
|
||||||
|
duplicates = 0;
|
||||||
|
}
|
||||||
|
snprintf(addr, sizeof(addr)-1, "0x%04X", i);
|
||||||
|
lp = left;
|
||||||
|
rp = right;
|
||||||
|
}
|
||||||
|
*lp++ = hex[(text[i] >> 4) & 0xF];
|
||||||
|
*lp++ = hex[(text[i]) & 0xF];
|
||||||
|
*lp++ = ' ';
|
||||||
|
if (text[i]>= ' ' && text[i] <= '~')
|
||||||
|
*rp++ = text[i];
|
||||||
|
else
|
||||||
|
*rp++ = '.';
|
||||||
|
/* if we just did slot 7, insert an extra space */
|
||||||
|
if ((i & 0xF) == 7) {
|
||||||
|
*lp++ = ' ';
|
||||||
|
*rp++ = ' ';
|
||||||
|
}
|
||||||
|
*lp = *rp = '\0';
|
||||||
|
}
|
||||||
|
if (i > 0) {
|
||||||
|
char line[132];
|
||||||
|
snprintf(line, sizeof(line)-1, "%-6s: %-49s | %-17s |", addr, left, right);
|
||||||
|
SICSLogWriteTime(line, eOut, tp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SICSLogWriteHex(const char* text, int count, OutCode eOut) {
|
||||||
|
struct timeval tv;
|
||||||
|
gettimeofday(&tv, NULL);
|
||||||
|
SICSLogWriteHexTime(text, count, eOut, &tv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SICSLogTimePrintf(OutCode eOut, struct timeval *tp, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
char buf[256];
|
||||||
|
char *dyn;
|
||||||
|
unsigned int l;
|
||||||
|
int res;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
l = vsnprintf(buf, sizeof buf, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
if (l >= sizeof buf) {
|
||||||
|
/* we have probably a C99 conforming snprintf and
|
||||||
|
need a larger buffer
|
||||||
|
*/
|
||||||
|
dyn = malloc(l+1);
|
||||||
|
if (dyn != NULL) {
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vsnprintf(dyn, l+1, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
SICSLogWriteTime(dyn, eOut, tp);
|
||||||
|
free(dyn);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SICSLogWriteTime(buf, eOut, tp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SICSLogPrintf(OutCode eOut, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
char buf[256];
|
||||||
|
char *dyn;
|
||||||
|
unsigned int l;
|
||||||
|
int res;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
l = vsnprintf(buf, sizeof buf, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
if (l >= sizeof buf) {
|
||||||
|
/* we have probably a C99 conforming snprintf and
|
||||||
|
need a larger buffer
|
||||||
|
*/
|
||||||
|
dyn = malloc(l+1);
|
||||||
|
if (dyn != NULL) {
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vsnprintf(dyn, l+1, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
SICSLogWrite(dyn, eOut);
|
||||||
|
free(dyn);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SICSLogWrite(buf, eOut);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Test of the logging facilities */
|
||||||
|
int testLogCmd(SConnection *pCon, SicsInterp *pInter, void *pData, int argc, char *argv[]) {
|
||||||
|
char lbuf[2048];
|
||||||
|
char sbuf[1000];
|
||||||
|
int i;
|
||||||
|
SICSLogWrite("Multiline:\nLine 1\r\nLine 2\r\nLine 3\r\n", eStatus);
|
||||||
|
memset(lbuf, 0, sizeof(lbuf));
|
||||||
|
memset(sbuf, ' ', sizeof(sbuf));
|
||||||
|
SICSLogPrintf(eStatus, "Hexlog %d all zero bytes", sizeof(lbuf));
|
||||||
|
SICSLogWriteHex(lbuf, sizeof(lbuf), eStatus);
|
||||||
|
for (i = 0; i <= 128; ++i)
|
||||||
|
sbuf[i] = sbuf[sizeof(sbuf)-1 - i] = i;
|
||||||
|
sbuf[sizeof(sbuf)/2] = '!';
|
||||||
|
SICSLogPrintf(eStatus, "Hexlog %d mid space bytes", sizeof(sbuf));
|
||||||
|
SICSLogWriteHex(sbuf, sizeof(sbuf), eStatus);
|
||||||
|
for (i = 0; i < 1000; ++i)
|
||||||
|
sbuf[i] = ' ' + (i % 96);
|
||||||
|
sbuf[sizeof(sbuf)-1] = '\0';
|
||||||
|
SICSLogWrite("Very long line 1000 bytes", eStatus);
|
||||||
|
SICSLogWrite(sbuf, eStatus);
|
||||||
|
SCSendOK(pCon);
|
||||||
|
return OKOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,6 +16,11 @@
|
|||||||
#define SICSLOG
|
#define SICSLOG
|
||||||
#include "Scommon.h"
|
#include "Scommon.h"
|
||||||
void SICSLogWrite(char *ptext, OutCode eOut);
|
void SICSLogWrite(char *ptext, OutCode eOut);
|
||||||
|
void SICSLogWriteTime(char *ptext, OutCode eOut, struct timeval *tp );
|
||||||
|
void SICSLogWriteHex(const char* text, int count, OutCode eOut);
|
||||||
|
void SICSLogWriteHexTime(const char* text, int count, OutCode eOut, struct timeval *tp);
|
||||||
|
void SICSLogPrintf(OutCode eOut, const char*fmt, ...);
|
||||||
|
void SICSLogTimePrintf(OutCode eOut, struct timeval *tp, const char *fmt, ...);
|
||||||
void SICSLogEnable(int flag);
|
void SICSLogEnable(int flag);
|
||||||
int KillCapture(SConnection * pCon);
|
int KillCapture(SConnection * pCon);
|
||||||
|
|
||||||
|
@ -110,7 +110,8 @@ int LFGenWriteStart(Ascon *a) {
|
|||||||
pNewBuffer[bufInd] = CRC;
|
pNewBuffer[bufInd] = CRC;
|
||||||
bufInd++;
|
bufInd++;
|
||||||
//pNewBuffer[bufSize-1] = '\r';
|
//pNewBuffer[bufSize-1] = '\r';
|
||||||
DynStringReplaceWithLen(a->wrBuffer, pNewBuffer, 0, bufInd);
|
DynStringClear(a->wrBuffer);
|
||||||
|
DynStringConcatBytes(a->wrBuffer, pNewBuffer, bufInd);
|
||||||
a->wrPos = 0;
|
a->wrPos = 0;
|
||||||
a->state = AsconWriting;
|
a->state = AsconWriting;
|
||||||
/* if there is only the terminator, do not send it */
|
/* if there is only the terminator, do not send it */
|
||||||
|
@ -168,7 +168,8 @@ int ModbusWriteStart(Ascon *a) {
|
|||||||
if (debug_modbus > 0) {
|
if (debug_modbus > 0) {
|
||||||
dbgprintx("modbus-xo", (unsigned char*)temp, idx);
|
dbgprintx("modbus-xo", (unsigned char*)temp, idx);
|
||||||
}
|
}
|
||||||
DynStringReplaceWithLen(a->wrBuffer, temp, 0, idx);
|
DynStringClear(a->wrBuffer);
|
||||||
|
DynStringConcatBytes(a->wrBuffer, temp, idx);
|
||||||
a->state = AsconWriting;
|
a->state = AsconWriting;
|
||||||
a->wrPos = 0;
|
a->wrPos = 0;
|
||||||
return 1;
|
return 1;
|
||||||
@ -230,7 +231,8 @@ int ModbusReading(Ascon *a) {
|
|||||||
dbgprintx("modbus-xi", cp, blen);
|
dbgprintx("modbus-xi", cp, blen);
|
||||||
}
|
}
|
||||||
dbgprintf("modbus-rd:%s\n", temp);
|
dbgprintf("modbus-rd:%s\n", temp);
|
||||||
DynStringReplaceWithLen(a->rdBuffer, temp, 0, rlen);
|
DynStringClear(a->rdBuffer);
|
||||||
|
DynStringConcatBytes(a->rdBuffer, temp, rlen);
|
||||||
a->state = AsconReadDone;
|
a->state = AsconReadDone;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -153,7 +153,8 @@ int OrdHVPSWriteStart(Ascon *a) {
|
|||||||
pcmdrspfmt++; // skip over the '-' separator into the response format
|
pcmdrspfmt++; // skip over the '-' separator into the response format
|
||||||
cmd_len=pcmd-cmd;
|
cmd_len=pcmd-cmd;
|
||||||
cmd[cmd_len] = '\0';
|
cmd[cmd_len] = '\0';
|
||||||
DynStringReplaceWithLen(a->wrBuffer,cmd,0,cmd_len);
|
DynStringClear(a->wrBuffer);
|
||||||
|
DynStringConcatBytes(a->wrBuffer, cmd, cmd_len);
|
||||||
a->state = AsconWriting;
|
a->state = AsconWriting;
|
||||||
a->wrPos = 0;
|
a->wrPos = 0;
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -1,24 +1,24 @@
|
|||||||
/**
|
/**
|
||||||
* @brief Protocol handler for Mirrotron RF power supplies
|
* @brief Protocol handler for Mirrotron RF power supplies
|
||||||
Author: Ferdi Franceschini
|
Author: Ferdi Franceschini
|
||||||
|
|
||||||
TODO: Provide acknowledgement when setting a parameter
|
TODO: Provide acknowledgement when setting a parameter
|
||||||
"OK", when successful
|
"OK", when successful
|
||||||
"ANSRFAMP: Set failed", on error
|
"ANSRFAMP: Set failed", on error
|
||||||
|
|
||||||
Current should be ramped up in steps of 0.5A but it doesn't
|
Current should be ramped up in steps of 0.5A but it doesn't
|
||||||
have to be ramped down.
|
have to be ramped down.
|
||||||
|
|
||||||
Provides two commands (L)ist and (S)et
|
Provides two commands (L)ist and (S)et
|
||||||
eg,
|
eg,
|
||||||
The following command lists status info from the RF Amp at address 3.
|
The following command lists status info from the RF Amp at address 3.
|
||||||
sct_rfamp send L:3
|
sct_rfamp send L:3
|
||||||
The reply string has the following form
|
The reply string has the following form
|
||||||
address=1|type=L|curr=00|freq=170|voltage=50|K3=1|K2=1|K1=1|O=1|CC=1|CV=0|H=1
|
address=1|type=L|curr=00|freq=170|voltage=50|K3=1|K2=1|K1=1|O=1|CC=1|CV=0|H=1
|
||||||
|
|
||||||
The following command sets the current(I), frequency, switches(K1,K2,K3) and output(O).
|
The following command sets the current(I), frequency, switches(K1,K2,K3) and output(O).
|
||||||
sct_rfamp send S:3:I=5:F=170:K3=0:K2=1:k1=0:O=1
|
sct_rfamp send S:3:I=5:F=170:K3=0:K2=1:k1=0:O=1
|
||||||
NOTE: The current is an integer which equals the desired current x10, ie 71 -> 7.1A
|
NOTE: The current is an integer which equals the desired current x10, ie 71 -> 7.1A
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -87,19 +87,20 @@ int RFAmpWriteStart (Ascon *a)
|
|||||||
switch (ctype) {
|
switch (ctype) {
|
||||||
case 'L':
|
case 'L':
|
||||||
sprintf(data->rfCmd,"%c%c%c%c", 2, address, ctype, 3);
|
sprintf(data->rfCmd,"%c%c%c%c", 2, address, ctype, 3);
|
||||||
DynStringReplaceWithLen(a->wrBuffer, data->rfCmd,0, LCMDLEN);
|
DynStringClear(a->wrBuffer);
|
||||||
|
DynStringConcatBytes(a->wrBuffer, data->rfCmd, LCMDLEN);
|
||||||
a->state = AsconWriting;
|
a->state = AsconWriting;
|
||||||
a->noResponse = 0;
|
a->noResponse = 0;
|
||||||
a->wrPos = 0;
|
a->wrPos = 0;
|
||||||
return 1;
|
return 1;
|
||||||
break;
|
break;
|
||||||
case 'S':
|
case 'S':
|
||||||
if (ret < 8) {
|
if (ret < 8) {
|
||||||
snprintf(errMsg, ERRLEN, "ANSRFAMP: Invalid command string %s", dynStrBuffer);
|
snprintf(errMsg, ERRLEN, "ANSRFAMP: Invalid command string %s", dynStrBuffer);
|
||||||
a->state = AsconWriteDone;
|
a->state = AsconWriteDone;
|
||||||
a->noResponse = 1;
|
a->noResponse = 1;
|
||||||
AsconError(a, errMsg, 0);
|
AsconError(a, errMsg, 0);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (address < '1' || address > '9') {
|
if (address < '1' || address > '9') {
|
||||||
snprintf(errMsg, ERRLEN, "ANSRFAMP: Invalid address %c, it should be between 1 and 9", address);
|
snprintf(errMsg, ERRLEN, "ANSRFAMP: Invalid address %c, it should be between 1 and 9", address);
|
||||||
@ -110,7 +111,7 @@ int RFAmpWriteStart (Ascon *a)
|
|||||||
}
|
}
|
||||||
if (curr < MINCURRSPEC || curr > MAXCURRSPEC) {
|
if (curr < MINCURRSPEC || curr > MAXCURRSPEC) {
|
||||||
snprintf(errMsg, ERRLEN, "ANSRFAMP: Invalid current specifier %d, it should be between %d and %d. NOTE:divide by 10 to convert to Amps", \
|
snprintf(errMsg, ERRLEN, "ANSRFAMP: Invalid current specifier %d, it should be between %d and %d. NOTE:divide by 10 to convert to Amps", \
|
||||||
curr, MINCURRSPEC, MAXCURRSPEC);
|
curr, MINCURRSPEC, MAXCURRSPEC);
|
||||||
a->state = AsconWriteDone;
|
a->state = AsconWriteDone;
|
||||||
a->noResponse = 1;
|
a->noResponse = 1;
|
||||||
AsconError(a, errMsg, 0);
|
AsconError(a, errMsg, 0);
|
||||||
@ -139,21 +140,22 @@ int RFAmpWriteStart (Ascon *a)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
sprintf(data->statusCmd,"%c%c%c%c", 2, address, 'L', 3);
|
sprintf(data->statusCmd,"%c%c%c%c", 2, address, 'L', 3);
|
||||||
DynStringReplaceWithLen(a->wrBuffer, data->statusCmd, 0, LCMDLEN);
|
DynStringClear(a->wrBuffer);
|
||||||
|
DynStringConcatBytes(a->wrBuffer, data->statusCmd, LCMDLEN);
|
||||||
data->transactInProg = txPreSet;
|
data->transactInProg = txPreSet;
|
||||||
data->targetCurrent = curr;
|
data->targetCurrent = curr;
|
||||||
a->state = AsconWriting;
|
a->state = AsconWriting;
|
||||||
a->noResponse = 0;
|
a->noResponse = 0;
|
||||||
a->wrPos = 0;
|
a->wrPos = 0;
|
||||||
return 1;
|
return 1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
snprintf(errMsg, ERRLEN, "ANSRFAMP: Unknown command type %c, allowed types are 'L' or 'S'", ctype);
|
snprintf(errMsg, ERRLEN, "ANSRFAMP: Unknown command type %c, allowed types are 'L' or 'S'", ctype);
|
||||||
a->state = AsconWriteDone;
|
a->state = AsconWriteDone;
|
||||||
a->noResponse = 1;
|
a->noResponse = 1;
|
||||||
AsconError(a, errMsg, 0);
|
AsconError(a, errMsg, 0);
|
||||||
return 1;
|
return 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,62 +174,64 @@ int RFAmpReading (Ascon *a)
|
|||||||
|
|
||||||
if(data->transactInProg == txPostSet){
|
if(data->transactInProg == txPostSet){
|
||||||
|
|
||||||
data->transactInProg = txCheckReply;
|
data->transactInProg = txCheckReply;
|
||||||
|
|
||||||
//Jing: add delay to wait for ramping complete
|
//Jing: add delay to wait for ramping complete
|
||||||
sleep(data->timeout);
|
sleep(data->timeout);
|
||||||
|
|
||||||
DynStringReplaceWithLen(a->wrBuffer, data->statusCmd, 0, LCMDLEN);
|
DynStringClear(a->wrBuffer);
|
||||||
a->state = AsconWriting;
|
DynStringConcatBytes(a->wrBuffer, data->statusCmd, LCMDLEN);
|
||||||
a->noResponse = 0;
|
a->state = AsconWriting;
|
||||||
a->wrPos = 0;
|
a->noResponse = 0;
|
||||||
delay = 0;
|
a->wrPos = 0;
|
||||||
}else{
|
delay = 0;
|
||||||
// Start reading when byte = 2 and stop when 3
|
} else {
|
||||||
while ( ( rdChRet = AsconReadChar(a->fd, &chr) ) > 0) {
|
// Start reading when byte = 2 and stop when 3
|
||||||
a->start = DoubleTime();
|
while ( ( rdChRet = AsconReadChar(a->fd, &chr) ) > 0) {
|
||||||
if (a->readState) {
|
a->start = DoubleTime();
|
||||||
if (a->readState >= LASTBYTENUM) {
|
if (a->readState) {
|
||||||
a->readState = 0;
|
if (a->readState >= LASTBYTENUM) {
|
||||||
if (a->readState > LASTBYTENUM) {
|
a->readState = 0;
|
||||||
snprintf(errMsg, ERRLEN, "ANSRFAMP: Packet larger than expected, size exceeds %d", LASTBYTENUM);
|
if (a->readState > LASTBYTENUM) {
|
||||||
GetReplyFailed = 1;
|
snprintf(errMsg, ERRLEN, "ANSRFAMP: Packet larger than expected, size exceeds %d", LASTBYTENUM);
|
||||||
break;
|
GetReplyFailed = 1;
|
||||||
}
|
break;
|
||||||
if (chr != 3) {
|
}
|
||||||
snprintf(errMsg, ERRLEN, "ANSRFAMP: Unexpected value %X for packet end signal", chr);
|
if (chr != 3) {
|
||||||
GetReplyFailed = 1;
|
snprintf(errMsg, ERRLEN, "ANSRFAMP: Unexpected value %X for packet end signal", chr);
|
||||||
break;
|
GetReplyFailed = 1;
|
||||||
}
|
break;
|
||||||
if (0 == DynStringConcatChar(a->rdBuffer, '\0')) {
|
}
|
||||||
strcpy(errMsg, "ANSRFAMP: DynStringConcatChar failed:");
|
if (0 == DynStringConcatChar(a->rdBuffer, '\0')) {
|
||||||
errNum = ENOMEM;
|
strcpy(errMsg, "ANSRFAMP: DynStringConcatChar failed:");
|
||||||
GetReplyFailed = 1;
|
errNum = ENOMEM;
|
||||||
break;
|
GetReplyFailed = 1;
|
||||||
}
|
break;
|
||||||
address = GetCharArray(a->rdBuffer)[0];
|
}
|
||||||
ctype = GetCharArray(a->rdBuffer)[1];
|
address = GetCharArray(a->rdBuffer)[0];
|
||||||
|
ctype = GetCharArray(a->rdBuffer)[1];
|
||||||
memset(curr, 0, sizeof(curr));
|
memset(curr, 0, sizeof(curr));
|
||||||
memset(freq, 0, sizeof(freq));
|
memset(freq, 0, sizeof(freq));
|
||||||
memset(voltage, 0, sizeof(voltage));
|
memset(voltage, 0, sizeof(voltage));
|
||||||
strncpy(curr, &GetCharArray(a->rdBuffer)[2], 2);
|
strncpy(curr, &GetCharArray(a->rdBuffer)[2], 2);
|
||||||
strncpy(freq, &GetCharArray(a->rdBuffer)[4], 3);
|
strncpy(freq, &GetCharArray(a->rdBuffer)[4], 3);
|
||||||
strncpy(voltage, &GetCharArray(a->rdBuffer)[7], 2);
|
strncpy(voltage, &GetCharArray(a->rdBuffer)[7], 2);
|
||||||
switches = (unsigned char)GetCharArray(a->rdBuffer)[9];
|
switches = (unsigned char)GetCharArray(a->rdBuffer)[9];
|
||||||
opstate = GetCharArray(a->rdBuffer)[10];
|
opstate = GetCharArray(a->rdBuffer)[10];
|
||||||
|
|
||||||
if (data->transactInProg == txPreSet) {
|
if (data->transactInProg == txPreSet) {
|
||||||
data->transactInProg = txPostSet;
|
data->transactInProg = txPostSet;
|
||||||
if (abs(data->targetCurrent - atoi(curr)) <= (5 + data->currTol)) {
|
if (abs(data->targetCurrent - atoi(curr)) <= (5 + data->currTol)) {
|
||||||
DynStringReplaceWithLen(a->wrBuffer, data->rfCmd,0, SCMDLEN);
|
DynStringClear(a->wrBuffer);
|
||||||
delay = round(abs(data->targetCurrent - atoi(curr))/0.5 + 0.5);
|
DynStringConcatBytes(a->wrBuffer, data->rfCmd, SCMDLEN);
|
||||||
a->state = AsconWriting;
|
delay = round(abs(data->targetCurrent - atoi(curr))/0.5 + 0.5);
|
||||||
a->noResponse = 0;
|
a->state = AsconWriting;
|
||||||
a->wrPos = 0;
|
a->noResponse = 0;
|
||||||
} else {
|
a->wrPos = 0;
|
||||||
strcpy(errMsg, "ANSRFAMP: Step size should be <= 5 for current");
|
} else {
|
||||||
GetReplyFailed = 1;
|
strcpy(errMsg, "ANSRFAMP: Step size should be <= 5 for current");
|
||||||
break;
|
GetReplyFailed = 1;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} else if (data->transactInProg == txCheckReply) {
|
} else if (data->transactInProg == txCheckReply) {
|
||||||
// TODO Compare rdBuffer to rfCmd if they match then set replyStr="OK" else set error message
|
// TODO Compare rdBuffer to rfCmd if they match then set replyStr="OK" else set error message
|
||||||
@ -240,13 +244,13 @@ int RFAmpReading (Ascon *a)
|
|||||||
strncpy(tmpFreq, &data->rfCmd[5], 3);
|
strncpy(tmpFreq, &data->rfCmd[5], 3);
|
||||||
tmpSwitchs = (unsigned char)data->rfCmd[8];
|
tmpSwitchs = (unsigned char)data->rfCmd[8];
|
||||||
|
|
||||||
// TODO SICS-405 ffr Removed check because the read values don't immediately match the set values
|
// TODO SICS-405 ffr Removed check because the read values don't immediately match the set values
|
||||||
if( (abs(atoi(curr) - atoi(tmpCurr)) > data->currTol) ||
|
if( (abs(atoi(curr) - atoi(tmpCurr)) > data->currTol) ||
|
||||||
(atoi(freq) != atoi(tmpFreq)) ||
|
(atoi(freq) != atoi(tmpFreq)) ||
|
||||||
((switches & 0x0F) != (tmpSwitchs & 0x0F)) ) {
|
((switches & 0x0F) != (tmpSwitchs & 0x0F)) ) {
|
||||||
strcpy(errMsg, "ANSRFAMP: the (S)ET command failed");
|
strcpy(errMsg, "ANSRFAMP: the (S)ET command failed");
|
||||||
GetReplyFailed = 1;
|
GetReplyFailed = 1;
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
DynStringReplace(a->rdBuffer, "OK", 0);
|
DynStringReplace(a->rdBuffer, "OK", 0);
|
||||||
}
|
}
|
||||||
@ -257,37 +261,38 @@ int RFAmpReading (Ascon *a)
|
|||||||
a->state = AsconReadDone;
|
a->state = AsconReadDone;
|
||||||
data->transactInProg = txNormalRead;
|
data->transactInProg = txNormalRead;
|
||||||
} else if (data->transactInProg == txNormalRead) {
|
} else if (data->transactInProg == txNormalRead) {
|
||||||
K3 = (switches & 0x08) >> 3;
|
K3 = (switches & 0x08) >> 3;
|
||||||
K2 = (switches & 0x04) >> 2;
|
K2 = (switches & 0x04) >> 2;
|
||||||
K1 = (switches & 0x02) >> 1;
|
K1 = (switches & 0x02) >> 1;
|
||||||
outOn = switches & 0x01;
|
outOn = switches & 0x01;
|
||||||
CC = (opstate & 0x04) >> 2;
|
CC = (opstate & 0x04) >> 2;
|
||||||
CV = (opstate & 0x02) >> 1;
|
CV = (opstate & 0x02) >> 1;
|
||||||
heat = opstate & 0x01;
|
heat = opstate & 0x01;
|
||||||
snprintf(replyStr, 128, "address=%c|type=%c|curr=%s|freq=%s|voltage=%s|K3=%d|K2=%d|K1=%d|O=%d|CC=%d|CV=%d|H=%d", \
|
snprintf(replyStr, 128, "address=%c|type=%c|curr=%s|freq=%s|voltage=%s|K3=%d|K2=%d|K1=%d|O=%d|CC=%d|CV=%d|H=%d", \
|
||||||
address, ctype, curr, freq, voltage, K3, K2, K1, outOn, CC, CV, heat);
|
address, ctype, curr, freq, voltage, K3, K2, K1, outOn, CC, CV, heat);
|
||||||
if (0 == DynStringReplaceWithLen(a->rdBuffer, replyStr, 0, 128)) {
|
DynStringClear(a->wrBuffer);
|
||||||
strcpy(errMsg, "ANSRFAMP: DynStringReplace failed:");
|
if (0 == DynStringConcatBytes(a->rdBuffer, replyStr, 128)) {
|
||||||
errNum = ENOMEM;
|
strcpy(errMsg, "ANSRFAMP: DynStringReplace failed:");
|
||||||
GetReplyFailed = 1;
|
errNum = ENOMEM;
|
||||||
break;
|
GetReplyFailed = 1;
|
||||||
}
|
break;
|
||||||
a->state = AsconReadDone;
|
}
|
||||||
}
|
a->state = AsconReadDone;
|
||||||
return 1;
|
}
|
||||||
}
|
return 1;
|
||||||
if (0 == DynStringConcatChar(a->rdBuffer, chr)) {
|
}
|
||||||
strcpy(errMsg, "ANSRFAMP: DynStringConcatChar failed:");
|
if (0 == DynStringConcatChar(a->rdBuffer, chr)) {
|
||||||
errNum = ENOMEM;
|
strcpy(errMsg, "ANSRFAMP: DynStringConcatChar failed:");
|
||||||
GetReplyFailed = 1;
|
errNum = ENOMEM;
|
||||||
break;
|
GetReplyFailed = 1;
|
||||||
}
|
break;
|
||||||
a->readState++;
|
}
|
||||||
} else if (chr == 2) {
|
a->readState++;
|
||||||
a->readState = 1;
|
} else if (chr == 2) {
|
||||||
}
|
a->readState = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (rdChRet < 0) {
|
if (rdChRet < 0) {
|
||||||
AsconError(a, "ANSRFAMP: AsconReadChar failed:", errno);
|
AsconError(a, "ANSRFAMP: AsconReadChar failed:", errno);
|
||||||
return 1;
|
return 1;
|
||||||
@ -318,11 +323,11 @@ int RFAmpProtHandler (Ascon *a)
|
|||||||
case AsconWriteStart:
|
case AsconWriteStart:
|
||||||
ret = RFAmpWriteStart(a);
|
ret = RFAmpWriteStart(a);
|
||||||
return ret;
|
return ret;
|
||||||
break;
|
break;
|
||||||
case AsconReading:
|
case AsconReading:
|
||||||
ret = RFAmpReading(a);
|
ret = RFAmpReading(a);
|
||||||
return ret;
|
return ret;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return AsconStdHandler(a);
|
return AsconStdHandler(a);
|
||||||
}
|
}
|
||||||
@ -345,11 +350,11 @@ int RFAmpInit(Ascon *a, SConnection *con, int argc, char *argv[])
|
|||||||
|
|
||||||
void AddRFAmpProtocol()
|
void AddRFAmpProtocol()
|
||||||
{
|
{
|
||||||
AsconProtocol *prot = NULL;
|
AsconProtocol *prot = NULL;
|
||||||
|
|
||||||
prot = calloc(sizeof(AsconProtocol), 1);
|
prot = calloc(sizeof(AsconProtocol), 1);
|
||||||
prot->name = strdup("rfamp");
|
prot->name = strdup("rfamp");
|
||||||
prot->init = RFAmpInit;
|
prot->init = RFAmpInit;
|
||||||
prot->handler = RFAmpProtHandler;
|
prot->handler = RFAmpProtHandler;
|
||||||
AsconInsertProtocol(prot);
|
AsconInsertProtocol(prot);
|
||||||
}
|
}
|
||||||
|
@ -263,7 +263,8 @@ int TCPMBWriteStart(Ascon *a) {
|
|||||||
PDUlenPlusUID = ADUlen - 6;
|
PDUlenPlusUID = ADUlen - 6;
|
||||||
ADU[4] = (PDUlenPlusUID & 0xFF00) >> 8;
|
ADU[4] = (PDUlenPlusUID & 0xFF00) >> 8;
|
||||||
ADU[5] = PDUlenPlusUID & 0xFF;
|
ADU[5] = PDUlenPlusUID & 0xFF;
|
||||||
DynStringReplaceWithLen(a->wrBuffer, ADU, 0, ADUlen);
|
DynStringClear(a->wrBuffer);
|
||||||
|
DynStringConcatBytes(a->wrBuffer, ADU, ADUlen);
|
||||||
a->state = AsconWriting;
|
a->state = AsconWriting;
|
||||||
a->wrPos = 0;
|
a->wrPos = 0;
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -1,29 +1,29 @@
|
|||||||
# vim: ft=make ts=4 sw=4 noet cindent
|
# vim: ft=make ts=4 sw=4 noet cindent
|
||||||
COBJ = Sclient.o network.o ifile.o intcli.o $(FORTIFYOBJ)
|
COBJ = Sclient.o network.o ifile.o intcli.o $(FORTIFYOBJ)
|
||||||
SOBJ = access.o alias.o anticollider.o ascon.o asyncprotocol.o asyncqueue.o callback.o \
|
SOBJ = alias.o anticollider.o arrayutil.o ascon.o asyncprotocol.o asyncqueue.o asynnet.o background.o callback.o \
|
||||||
cell.o chadapter.o choco.o circular.o commandlog.o cone.o confvirtualmot.o \
|
cell.o chadapter.o choco.o circular.o commandlog.o cone.o confvirtualmot.o \
|
||||||
conman.o costa.o danu.o definealias.o devexec.o devser.o diffscan.o d_mod.o \
|
conman.o costa.o countersec.o danu.o definealias.o devexec.o devser.o diffscan.o d_mod.o \
|
||||||
drive.o d_sign.o dynstring.o emon.o errormsg.o evcontroller.o evdriver.o \
|
drive.o d_sign.o dynstring.o emon.o errormsg.o evcontroller.o evdriver.o \
|
||||||
event.o exebuf.o exeman.o fitcenter.o fomerge.o $(FORTIFYOBJ) fourlib.o \
|
event.o exebuf.o exeman.o fitcenter.o fomerge.o $(FORTIFYOBJ) fourlib.o fourmess.o \
|
||||||
fourtable.o fupa.o gpibcontroller.o help.o hipadaba.o \
|
fourtable.o fupa.o genbinprot.o gpibcontroller.o hdbtable.o help.o hipadaba.o \
|
||||||
histdriv.o histmem.o histregress.o histsim.o hklmot.o hkl.o \
|
histdriv.o histmem.o histmemsec.o histregress.o histsim.o hklmot.o hkl.o \
|
||||||
hmcontrol.o hmdata.o hmslave.o ifile.o initializer.o integrate.o interface.o \
|
hmcontrol.o hmdata.o hmslave.o ifile.o initializer.o integrate.o interface.o \
|
||||||
intserv.o lin2ang.o lld_blob.o lld.o logger.o logreader.o logsetup.o lomax.o \
|
intserv.o lin2ang.o lld_blob.o lld.o logger.o logreader.o logsetup.o lomax.o \
|
||||||
macro.o maximize.o mccontrol.o mcreader.o mcstascounter.o mcstashm.o \
|
macro.o maximize.o mccontrol.o mcreader.o mcstascounter.o mcstashm.o \
|
||||||
moregress.o motorlist.o motreglist.o motreg.o multicounter.o mumoconf.o mumo.o \
|
moregress.o motorlist.o motorsec.o motreglist.o motreg.o multicounter.o mumoconf.o mumo.o \
|
||||||
napi5.o napi.o network.o $(NIOBJ) nread.o nserver.o nwatch.o nxcopy.o \
|
napi5.o napi.o network.o $(NIOBJ) nread.o nserver.o nwatch.o nxcopy.o \
|
||||||
nxdataset.o nxdict.o nxinterhelper.o nxinter_wrap.o nxio.o nxscript.o nxstack.o \
|
nxdataset.o nxdict.o nxinterhelper.o nxinter_wrap.o nxio.o nxscript.o nxstack.o \
|
||||||
nxupdate.o nxutil.o nxxml.o o2t.o obdes.o obpar.o ofac.o optimise.o oscillate.o \
|
nxupdate.o nxutil.o nxxml.o o2t.o obdes.o obpar.o ofac.o optimise.o oscillate.o \
|
||||||
passwd.o perfmon.o polldriv.o protocol.o proxy.o regresscter.o remob.o \
|
passwd.o perfmon.o polldriv.o protocol.o proxy.o reflist.o regresscter.o remob.o \
|
||||||
rmtrail.o rs232controller.o savehdb.o scaldate.o scan.o scanvar.o SCinter.o \
|
rmtrail.o rs232controller.o rwpuffer.o sansbc.o savehdb.o scaldate.o scan.o scanvar.o SCinter.o \
|
||||||
scriptcontext.o script.o sctdriveadapter.o sctdriveobj.o sdynar.o selector.o \
|
scriptcontext.o script.o sctdriveadapter.o sctdriveobj.o sdynar.o selector.o \
|
||||||
selvar.o servlog.o sicscron.o sicsdata.o sicsexit.o sicshdbadapter.o \
|
selvar.o servlog.o sgclib.o sghkl.o sgio.o sicscron.o sicsdata.o sicsexit.o sicshdbadapter.o \
|
||||||
sicshdbfactory.o sicshipadaba.o sicslist.o SICSmain.o sicsobj.o sicspoll.o \
|
sicshdbfactory.o sicshipadaba.o sicslist.o SICSmain.o sicsobj.o sicspoll.o sicsutil.o \
|
||||||
sicvar.o sig_die.o simchop.o simev.o sinfox.o splitter.o s_rnge.o statemon.o \
|
sicvar.o sig_die.o simchop.o simev.o simidx.o simindex.o sinfox.o singlebi.o singlediff.o singlenb.o singlebinb.o singletas.o singlex.o splitter.o s_rnge.o statemon.o \
|
||||||
statistics.o statusfile.o status.o stdscan.o stptok.o stringdict.o strrepl.o \
|
statistics.o statusfile.o status.o stdscan.o stptok.o stringdict.o strlutil.o strrepl.o \
|
||||||
synchronize.o tasdrive.o task.o tasscanub.o tasublib.o tasub.o tcldrivable.o \
|
syncedprot.o synchronize.o tasdrive.o task.o tasscanub.o tasublib.o tasub.o tcldrivable.o \
|
||||||
tclev.o tclintimpl.o telnet.o token.o trigd.o trim.o ubcalc.o \
|
tclev.o tclintimpl.o tclmotdriv.o telnet.o testprot.o token.o trace.o trigd.o trim.o ubcalc.o \
|
||||||
ubfour.o udpquieck.o userscan.o uubuffer.o varlog.o vector.o wwildcard.o \
|
ubfour.o udpquieck.o uselect.o userscan.o uubuffer.o varlog.o vector.o velosec.o wwildcard.o \
|
||||||
xytable.o
|
xytable.o
|
||||||
|
|
||||||
# These are intermediate files generated from .tc files, marking
|
# These are intermediate files generated from .tc files, marking
|
||||||
|
Reference in New Issue
Block a user