403 lines
9.1 KiB
C
403 lines
9.1 KiB
C
/**************************************************************************
|
||
GTA PROJECT AT division
|
||
Copyright, 1990-1994, The Regents of the University of California.
|
||
Los Alamos National Laboratory
|
||
seq_qry.c,v 1.2 1995/06/27 15:26:02 wright Exp
|
||
|
||
DESCRIPTION: Task querry & debug routines for run-time sequencer:
|
||
seqShow - prints state set info.
|
||
seqChanShow - printf channel (pv) info.
|
||
|
||
ENVIRONMENT: VxWorks
|
||
HISTORY:
|
||
25nov91,ajk Display task names(s) with id(s).
|
||
Display logfile name and file descriptor.
|
||
Moved wait_rtn() to top of loop.
|
||
09dec91,ajk Modified to used state program linked list.
|
||
Added option to display all programs when tid=0.
|
||
19dec91,ajk Allow task name as well as task id.
|
||
25feb92,ajk V5.0 accepts 0 as a valid task id: fixed it.
|
||
26feb92,ajk Fixed formatting of task/program listing.
|
||
29apr92,ajk Modified to interpret encoded options.
|
||
21may92,ajk Modified format for listing programs & tasks.
|
||
21feb93,ajk Some minor code cleanup.
|
||
01mar94,ajk Major changes to print more meaningful information.
|
||
***************************************************************************/
|
||
|
||
/*#define DEBUG 1*/
|
||
|
||
#include "seq.h"
|
||
#include "usrLib.h"
|
||
#include "tickLib.h"
|
||
#include "string.h"
|
||
|
||
/* User functions */
|
||
int seqShow(int);
|
||
int seqChanShow(int, char *);
|
||
|
||
LOCAL int wait_rtn();
|
||
LOCAL VOID printValue(char *, int, int);
|
||
LOCAL SPROG *seqQryFind(int);
|
||
LOCAL void seqShowAll();
|
||
|
||
/*
|
||
* seqShow() - Querry the sequencer for state information.
|
||
* If a non-zero task id is specified then print the information about
|
||
* the state program, otherwise print a brief summary of all state programs
|
||
*/
|
||
int seqShow(tid)
|
||
int tid;
|
||
{
|
||
SPROG *pSP;
|
||
SSCB *pSS;
|
||
STATE *pST;
|
||
int nss, status;
|
||
float time;
|
||
char file_name[100];
|
||
|
||
/* convert (possible) name to task id */
|
||
if (tid != 0)
|
||
{
|
||
tid = taskIdFigure(tid);
|
||
if (tid == ERROR)
|
||
return 0;
|
||
}
|
||
pSP = seqQryFind(tid);
|
||
if (pSP == NULL)
|
||
return 0;
|
||
|
||
/* Print info about state program */
|
||
printf("State Program: \"%s\"\n", pSP->pProgName);
|
||
printf(" initial task id=%lu=0x%lx\n",
|
||
(unsigned long) pSP->taskId, (unsigned long) pSP->taskId);
|
||
printf(" task priority=%ld\n", pSP->taskPriority);
|
||
printf(" number of state sets=%ld\n", pSP->numSS);
|
||
printf(" number of channels=%ld\n", pSP->numChans);
|
||
printf(" number of channels assigned=%ld\n", pSP->assignCount);
|
||
printf(" number of channels connected=%ld\n", pSP->connCount);
|
||
printf(" options: async=%d, debug=%d, newef=%d, reent=%d, conn=%d\n",
|
||
((pSP->options & OPT_ASYNC) != 0), ((pSP->options & OPT_DEBUG) != 0),
|
||
((pSP->options & OPT_NEWEF) != 0), ((pSP->options & OPT_REENT) != 0),
|
||
((pSP->options & OPT_CONN) != 0) );
|
||
if ((pSP->options & OPT_REENT) != 0)
|
||
printf(" user variables: address=%lu=0x%lx, length=%ld=0x%lx bytes\n",
|
||
(unsigned long)pSP->pVar, (unsigned long)pSP->pVar,
|
||
pSP->varSize, pSP->varSize);
|
||
printf(" log file fd=%ld\n", pSP->logFd);
|
||
status = ioctl(pSP->logFd, FIOGETNAME, (int)file_name);
|
||
if (status != ERROR)
|
||
printf(" log file name=\"%s\"\n", file_name);
|
||
|
||
printf("\n");
|
||
|
||
/* Print state set info */
|
||
for (nss = 0, pSS = pSP->pSS; nss < pSP->numSS; nss++, pSS++)
|
||
{
|
||
printf(" State Set: \"%s\"\n", pSS->pSSName);
|
||
|
||
printf(" task name=%s; ", taskName(pSS->taskId));
|
||
|
||
printf(" task id=%lu=0x%lx\n",
|
||
(unsigned long) pSS->taskId, (unsigned long) pSS->taskId);
|
||
|
||
pST = pSS->pStates;
|
||
printf(" First state = \"%s\"\n", pST->pStateName);
|
||
|
||
pST = pSS->pStates + pSS->currentState;
|
||
printf(" Current state = \"%s\"\n", pST->pStateName);
|
||
|
||
pST = pSS->pStates + pSS->prevState;
|
||
printf(" Previous state = \"%s\"\n", pST->pStateName);
|
||
|
||
time = (tickGet() - pSS->timeEntered)/60.0;
|
||
printf("\tElapsed time since state was entered = %.1f seconds)\n",
|
||
time);
|
||
#ifdef DEBUG
|
||
printf(" Queued time delays:\n");
|
||
for (n = 0; n < pSS->numDelays; n++)
|
||
{
|
||
printf("\tdelay[%2d]=%d", n, pSS->delay[n]);
|
||
if (pSS->delayExpired[n])
|
||
printf(" - expired");
|
||
printf("\n");
|
||
}
|
||
#endif /*DEBUG*/
|
||
printf("\n");
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
/*
|
||
* seqChanShow() - Show channel information for a state program.
|
||
*/
|
||
int seqChanShow(tid, pStr)
|
||
int tid; /* task id or name */
|
||
char *pStr; /* optional pattern matching string */
|
||
{
|
||
SPROG *pSP;
|
||
CHAN *pDB;
|
||
int nch, n;
|
||
char tsBfr[50], connQual;
|
||
int match, showAll;
|
||
|
||
/* convert (possible) name to task id */
|
||
if (tid != 0)
|
||
{
|
||
tid = taskIdFigure(tid);
|
||
if (tid == ERROR)
|
||
return 0;
|
||
}
|
||
pSP = seqQryFind(tid);
|
||
if (tid == NULL)
|
||
return 0;
|
||
|
||
printf("State Program: \"%s\"\n", pSP->pProgName);
|
||
printf("Number of channels=%ld\n", pSP->numChans);
|
||
|
||
if (pStr != NULL)
|
||
{
|
||
connQual = pStr[0];
|
||
/* Check for channel connect qualifier */
|
||
if ((connQual == '+') || (connQual == '-'))
|
||
{
|
||
pStr += 1;
|
||
}
|
||
}
|
||
else
|
||
connQual = 0;
|
||
|
||
pDB = pSP->pChan;
|
||
for (nch = 0; nch < pSP->numChans; )
|
||
{
|
||
if (pStr != NULL)
|
||
{
|
||
/* Check for channel connect qualifier */
|
||
if (connQual == '+')
|
||
showAll = pDB->connected; /* TRUE if connected */
|
||
else if (connQual == '-')
|
||
showAll = !pDB->connected; /* TRUE if NOT connected */
|
||
else
|
||
showAll = TRUE; /* Always TRUE */
|
||
|
||
/* Check for pattern match if specified */
|
||
match = (pStr[0] == 0) || (strstr(pDB->dbName, pStr) != NULL);
|
||
if (!(match && showAll))
|
||
{
|
||
pDB += 1;
|
||
nch += 1;
|
||
continue; /* skip this channel */
|
||
}
|
||
}
|
||
printf("\n#%d of %ld:\n", nch+1, pSP->numChans);
|
||
printf("Channel name: \"%s\"\n", pDB->dbName);
|
||
printf(" Unexpanded (assigned) name: \"%s\"\n", pDB->dbAsName);
|
||
printf(" Variable name: \"%s\"\n", pDB->pVarName);
|
||
printf(" address = %lu = 0x%lx\n",
|
||
(unsigned long)pDB->pVar, (unsigned long)pDB->pVar);
|
||
printf(" type = %s\n", pDB->pVarType);
|
||
printf(" count = %ld\n", pDB->count);
|
||
printValue(pDB->pVar, pDB->putType, pDB->count);
|
||
printf(" Monitor flag=%d\n", pDB->monFlag);
|
||
|
||
if (pDB->monitored)
|
||
printf(" Monitored\n");
|
||
else
|
||
printf(" Not monitored\n");
|
||
|
||
if (pDB->assigned)
|
||
printf(" Assigned\n");
|
||
else
|
||
printf(" Not assigned\n");
|
||
|
||
if(pDB->connected)
|
||
printf(" Connected\n");
|
||
else
|
||
printf(" Not connected\n");
|
||
|
||
if(pDB->getComplete)
|
||
printf(" Last get completed\n");
|
||
else
|
||
printf(" Get not completed or no get issued\n");
|
||
|
||
printf(" Status=%d\n", pDB->status);
|
||
printf(" Severity=%d\n", pDB->severity);
|
||
|
||
/* Print time stamp in text format: "mm/dd/yy hh:mm:ss.nano-sec" */
|
||
tsStampToText(&pDB->timeStamp, TS_TEXT_MMDDYY, tsBfr);
|
||
if (tsBfr[2] == '/') /* valid t-s? */
|
||
printf(" Time stamp = %s\n", tsBfr);
|
||
|
||
n = wait_rtn();
|
||
if (n == 0)
|
||
return 0;
|
||
nch += n;
|
||
if (nch < 0)
|
||
nch = 0;
|
||
pDB = pSP->pChan + nch;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
/* Read from console until a RETURN is detected */
|
||
LOCAL int wait_rtn()
|
||
{
|
||
char bfr[10];
|
||
int i, n;
|
||
|
||
printf("Next? (+/- skip count)\n");
|
||
for (i = 0; i < 10; i++)
|
||
{
|
||
read(STD_IN, &bfr[i], 1);
|
||
if (bfr[i] == '\n')
|
||
break;
|
||
}
|
||
bfr[i] = 0;
|
||
if (bfr[0] == 'q')
|
||
return 0; /* quit */
|
||
|
||
n = atoi(bfr);
|
||
if (n == 0)
|
||
n = 1;
|
||
return n;
|
||
}
|
||
|
||
/* Print the current internal value of a database channel */
|
||
LOCAL VOID printValue(pVal, type, count)
|
||
char *pVal;
|
||
int count, type;
|
||
{
|
||
int i;
|
||
char *c;
|
||
short *s;
|
||
long *l;
|
||
float *f;
|
||
double *d;
|
||
|
||
if (count > 5)
|
||
count = 5;
|
||
|
||
printf(" Value =");
|
||
for (i = 0; i < count; i++)
|
||
{
|
||
switch (type)
|
||
{
|
||
case DBR_STRING:
|
||
c = (char *)pVal;
|
||
for (i = 0; i < count; i++, c += MAX_STRING_SIZE)
|
||
{
|
||
printf(" %s", c);
|
||
}
|
||
break;
|
||
|
||
case DBR_CHAR:
|
||
c = (char *)pVal;
|
||
for (i = 0; i < count; i++, c++)
|
||
{
|
||
printf(" %d", *c);
|
||
}
|
||
break;
|
||
|
||
case DBR_SHORT:
|
||
s = (short *)pVal;
|
||
for (i = 0; i < count; i++, s++)
|
||
{
|
||
printf(" %d", *s);
|
||
}
|
||
break;
|
||
|
||
case DBR_LONG:
|
||
l = (long *)pVal;
|
||
for (i = 0; i < count; i++, l++)
|
||
{
|
||
printf(" %ld", *l);
|
||
}
|
||
break;
|
||
|
||
case DBR_FLOAT:
|
||
f = (float *)pVal;
|
||
for (i = 0; i < count; i++, f++)
|
||
{
|
||
printf(" %g", *f);
|
||
}
|
||
break;
|
||
|
||
case DBR_DOUBLE:
|
||
d = (double *)pVal;
|
||
for (i = 0; i < count; i++, d++)
|
||
{
|
||
printf(" %g", *d);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
printf("\n");
|
||
}
|
||
|
||
/* Find a state program associated with a given task id */
|
||
LOCAL SPROG *seqQryFind(tid)
|
||
int tid;
|
||
{
|
||
SPROG *pSP;
|
||
extern SPROG *seqFindProg();
|
||
|
||
if (tid == 0)
|
||
{
|
||
seqShowAll();
|
||
return NULL;
|
||
}
|
||
|
||
/* Find a state program that has this task id */
|
||
pSP = seqFindProg(tid);
|
||
if (pSP == NULL)
|
||
{
|
||
printf("No state program exists for task id %d\n", tid);
|
||
return NULL;
|
||
}
|
||
|
||
return pSP;
|
||
}
|
||
|
||
LOCAL int seqProgCount;
|
||
|
||
/* This routine is called by seqTraverseProg() for seqShowAll() */
|
||
LOCAL void seqShowSP(pSP)
|
||
SPROG *pSP;
|
||
{
|
||
SSCB *pSS;
|
||
int nss;
|
||
char *progName, *ptaskName;;
|
||
|
||
if (seqProgCount++ == 0)
|
||
printf("Program Name Task ID Task Name SS Name\n\n");
|
||
|
||
progName = pSP->pProgName;
|
||
for (nss = 0, pSS = pSP->pSS; nss < pSP->numSS; nss++, pSS++)
|
||
{
|
||
if (pSS->taskId == 0)
|
||
ptaskName = "(no task)";
|
||
else
|
||
ptaskName = taskName(pSS->taskId);
|
||
printf("%-16s %-10lu %-16s %-16s\n",
|
||
progName, (unsigned long) pSS->taskId,
|
||
ptaskName, pSS->pSSName );
|
||
progName = "";
|
||
}
|
||
printf("\n");
|
||
}
|
||
|
||
/* The seqTraverseProg function is in seq_prog.c */
|
||
STATUS seqTraverseProg(VOID (*pFunc)(), VOID *param);
|
||
|
||
/* Print a brief summary of all state programs */
|
||
LOCAL void seqShowAll()
|
||
{
|
||
|
||
seqProgCount = 0;
|
||
seqTraverseProg(seqShowSP, 0);
|
||
if (seqProgCount == 0)
|
||
printf("No active state programs\n");
|
||
return;
|
||
}
|