Files
sicspsi/sinqhm/sinqhm_ctrl.c
cvs 064ec37e9a - Rearranged directory structure for forking out ANSTO
- Refactored site specific stuff into a site module
- PSI specific stuff is now in the PSI directory.
- The old version has been tagged with pre-ansto
2003-06-20 10:18:47 +00:00

2039 lines
72 KiB
C
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#define IDENT "1A14"
/*---------------------------------------------------------------------------*/
#ifdef __DECC
#pragma module sinqhm_ctrl IDENT
#endif
/*
** Link_options - Here is the Linker Option File
**! sinqhm_ctrl
**! tas_src:[lib]sinq/lib
**! sys$share:decw$xlibshr/share
**!!
**!! To build sinqhm_ctrl on LNSA09
**!!
**!! $ import tasmad
**!! $ define/job deltat_c_tlb sinq_c_tlb
**!! $ sss := tas_src:[sinqhm]
**!! $ bui 'sss'sinqhm_ctrl debug
** Link_options_end
**
** Building on Alpha OSF/1:
**
cc -std1 -g -o ~/bin/sinqhm_ctrl -I/public/lib/include \
-transitive_link -L/public/lib -lsinq -lrt \
~/SinqHM/sinqhm_ctrl.c
**
** +--------------------------------------------------------------+
** | Paul Scherrer Institute |
** | Computing Section |
** | |
** | This software may be used freely by non-profit organizations.|
** | It may be copied provided that the name of P.S.I. and of the |
** | author is included. Neither P.S.I. nor the author assume any |
** | responsibility for the use of this software outside of P.S.I.|
** +--------------------------------------------------------------+
**
** Module Name . . . . . . . . : TAS_SRC:[SINQHM]sinqhm_ctrl.c
**
** Author . . . . . . . . . . : D. Maden
** Date of creation . . . . . . : Dec 1996
**
** Purpose
** =======
** sinqhm_ctrl.c is an Internet Client which can be used to send control
** messages to a front-end processor running the SINQHM histogram
** memory server process. Control messages may be sent to configure,
** de-configure, rundown, set the level of debug printing, start data
** acquisition, stop data acquisition, show the status of SINQHM_SRV, or
** zero the histogram memory.
**
** 1) Configure:
** =========
** The configuration information is obtained from options on the command
** line. Use the "-help config" option for details.
**
** Once the configuration information has been checked, a connection is
** made to the SINQHM_SRV root process on the front-end and a configure
** message is sent. SINQHM_SRV will check the information, start up a child
** process, FILLER, which will do the work of filling histograms, and then
** send a reply.
**
** Note: If SINQHM_SRV has already been successfully configured, i.e. it
** already has an active FILLER child process, it must be
** de-configured first.
**
** 2) Debug:
** ======
** The level of debug printing in the SINQHM_SRV root process can be set. The
** higher the level, the more print-out on the front-end processor's console
** occurs. The debug level is inherited by any server children (or FILLER)
** which subsequently get started.
**
** 3) De-configure:
** ============
** "De-configuration" involves terminating any child processes of the
** SINQHM_SRV root process. Normally, it is expected that the server children
** will have been terminated via the protocol between the servers and their
** clients so that a de-configure involves simply the termination of FILLER.
** This is a so-called "gentle" de-configure. However, in order to facilitate
** the recovery from error situations, it is possible to specify a "harsh"
** de-configure in which any active server children will also be terminated.
** A gentle de-configure will fail if there are active children.
**
** 4) Rundown:
** =======
** "Rundown" implies the termination not only of the SINQHM_SRV children but
** also of the root process itself. Once a rundown has been performed,
** intervention will be required on the front-end (e.g. reboot or creation
** of a new SINQHM_SRV root job from the front-end console) before SINQHM_SRV
** can be used again.
**
** 5) Show-Status:
** ===========
** The status of SINQHM_SRV is illicited and printed out.
**
** 6) Start-Data-Acquisition
** ======================
** The SinqHM-Filler process in the HM is instructed to start data-acq.
**
** 7) Stop-Data-Acquisition
** =====================
** The SinqHM-Filler process in the HM is instructed to stop data-acq.
**
** 8) Zero:
** ====
** The complete histogram area is set to zero.
**
** Use:
** ===
** Define the foreign command:
**
** $ sinqhm_ctrl :== $mad_exe:sinqhm_ctrl
**
** Then issue the command:
**
** $ sinqhm_ctrl <cmnd> <modifier>
**
** where <cmnd> may be "CONFIG", "DEBUG", "DECONFIG", "GO", "HELP",
** "RUNDOWN", "STATUS", "STOP" or "ZERO". If <cmnd> is omitted or none of
** the above or if any error occurs obtaining the configuration
** information for the "CONFIG" command, a "HELP" command will be assumed.
**
** For the "CONFIG" command, <modifier> may be specified as "SUSPEND".
** If so, the filler task in the front-end will suspend as soon as it
** starts so that it can be debugged. Note that the same action can be
** achieved by specifying "DEBUG" as a token in SINQHM_MODE.
**
** For the "DEBUG" command, <modifier> is an integer specifying the debug
** level. <modifier> may also be specified as "ON" or "OFF", corresponding
** to levels 1 and 0 respectively. If <modifier> is anything else (or
** absent), "ON" is assumed.
**
** For the "DECONFIG" command, <modifier> is used to specify the
** "harshness" of the de-configure. If <modifier> is specified as
** "HARSH", the de-configure will be "harsh". If <modifier> is anything
** else (or absent) the de-configure will be gentle.
**
** Communication between sinqhm_ctrl and the server is via TCP/IP protocol.
**
** Updates:
** 1A01 18-Dec-1996 DM. Initial version.
**====================================================================
*/
#include <errno.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#ifdef __VMS
#include <ucx$inetdef.h>
#else
#include <netinet/tcp.h>
#include <unistd.h>
#endif
#include <netinet/in.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <math.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/types.h>
#include <X11/Intrinsic.h>
/*
**==================== Global Definitions =====================================
*/
#include <sinq_prototypes.h>
#include "SinqHM_def.h"
#define SUCCESS 1
#define ERROR 0
#define NIL '\0'
#define HM_SIZE 65536 /* Number of Bins in Hist Mem */
/*
**==================== Some functions and structures =====================
**
** Fixed-Length Descriptor:
*/
struct dsc__descriptor_s {
unsigned short dsc__w_length; /* length of data item in bytes */
unsigned char dsc__b_dtype; /* data type code */
unsigned char dsc__b_class; /* descriptor class code */
char *dsc__a_pointer; /* address of data storage */
};
/*
**==================== Global Variables ======================================
*/
int My_errno, My_vaxc_errno;
struct req_buff_struct Req_buff;
struct rply_buff_struct Rply_buff;
int Verbose;
char Rmt_host[32];
int Rmt_port;
int Pkt_size;
int Do_config;
int Do_debug;
int Do_deconfig;
int Do_go;
int Do_rundown;
int Do_status;
int Do_stop;
int Do_zero;
int Dbg_level;
int Be_harsh; /* Set to True if -harsh option specified */
char Mode[64]; /* The "-mode" option */
int Hm_mode; /* The histogramming mode */
int Nhist; /* The number of histograms to fill */
int Nbins; /* The number of bins to fill */
int Lo_bin; /* The first bin */
int Compress; /* The bin compression factor */
int Bytes_per_bin; /* The number of bytes per bin */
int Ncntrs; /* The number of counters (TOF mode) */
int Lo_cntr; /* The first counter */
int Span; /* The time span per bin */
int Delay_time_to_start; /* The DTS for the MDI in TOF mode */
int Nbuff; /* The # buffers in TRANS mode */
int Buff_size; /* The buffer size in TRANS mode */
int xOff; /* X Offset in PSD mode */
int yOff; /* Y Offset in PSD mode */
int xFac; /* X factor in PSD mode */
int yFac; /* Y factor in PSD mode */
int xSize; /* xSize in PSD mode */
int ySize; /* ySize in PSD mode */
struct dsc__descriptor_s Name_desc;
static XrmOptionDescRec OpTable_0[] = {
{"-name", ".name", XrmoptionSepArg, (XPointer) NULL},
{"-h", ".sqhmHelp", XrmoptionNoArg, (XPointer) "1"},
{"-he", ".sqhmHelp", XrmoptionNoArg, (XPointer) "1"},
{"-hel", ".sqhmHelp", XrmoptionNoArg, (XPointer) "1"},
{"-help", ".sqhmHelp", XrmoptionNoArg, (XPointer) "1"},
{"-?", ".sqhmHelp", XrmoptionNoArg, (XPointer) "1"},
{"-ho", ".sqhmHost", XrmoptionSepArg, (XPointer) NULL},
{"-hos", ".sqhmHost", XrmoptionSepArg, (XPointer) NULL},
{"-host", ".sqhmHost", XrmoptionSepArg, (XPointer) NULL},
{"-port", ".sqhmPort", XrmoptionSepArg, (XPointer) NULL},
{"-size", ".sqhmPktSize", XrmoptionSepArg, (XPointer) NULL},
{"-v", ".sqhmVerbose", XrmoptionNoArg, (XPointer) "1"},
{"-config", ".sqhmConfig", XrmoptionNoArg, (XPointer) "1"},
{"-debug", ".sqhmDebug", XrmoptionSepArg, (XPointer) NULL},
{"-deconfig", ".sqhmDeconfig", XrmoptionNoArg, (XPointer) "1"},
{"-go", ".sqhmGo", XrmoptionNoArg, (XPointer) "1"},
{"-rundown", ".sqhmRundown", XrmoptionNoArg, (XPointer) "1"},
{"-show", ".sqhmStatus", XrmoptionNoArg, (XPointer) "1"},
{"-status", ".sqhmStatus", XrmoptionNoArg, (XPointer) "1"},
{"-stop", ".sqhmStop", XrmoptionNoArg, (XPointer) "1"},
{"-zero", ".sqhmZero", XrmoptionNoArg, (XPointer) "1"},
{"-mode", ".sqhmMode", XrmoptionSepArg, (XPointer) NULL},
{"-nhist", ".sqhmNhist", XrmoptionSepArg, (XPointer) NULL},
{"-nbins", ".sqhmNbins", XrmoptionSepArg, (XPointer) NULL},
{"-lo_bin", ".sqhmLoBin", XrmoptionSepArg, (XPointer) NULL},
{"-compress", ".sqhmCompress", XrmoptionSepArg, (XPointer) NULL},
{"-bpb", ".sqhmBpb", XrmoptionSepArg, (XPointer) NULL},
{"-ncntr", ".sqhmNcntr", XrmoptionSepArg, (XPointer) NULL},
{"-lo_cntr", ".sqhmLoCntr", XrmoptionSepArg, (XPointer) NULL},
{"-span", ".sqhmSpan", XrmoptionSepArg, (XPointer) NULL},
{"-delay", ".sqhmDelay", XrmoptionSepArg, (XPointer) NULL},
{"-nbuff", ".sqhmNbuff", XrmoptionSepArg, (XPointer) NULL},
{"-buff_size",".sqhmBuffSize", XrmoptionSepArg, (XPointer) NULL},
{"-harsh", ".sqhmHarsh", XrmoptionNoArg, (XPointer) "1"},
{"-xoff", ".sqhmxoff", XrmoptionNoArg, (XPointer) "1"},
{"-yoff", ".sqhmyoff", XrmoptionNoArg, (XPointer) "1"},
{"-xfac", ".sqhmxfac", XrmoptionNoArg, (XPointer) "1"},
{"-yfac", ".sqhmyfac", XrmoptionNoArg, (XPointer) "1"},
{"-xsize", ".sqhmxsize", XrmoptionNoArg, (XPointer) "1"},
{"-ysize", ".sqhmyszie", XrmoptionNoArg, (XPointer) "1"},
};
extern int C_gbl_status; /* Return status from C_... routines */
/*
**=============================================================================
** Local routines.
**
** show_help : Display the help text.
**----------------------------------------------------------------------------
** Prototypes
*/
int getCheckStatusResponse (
int skt,
struct rply_buff_struct *reply,
int rlen);
int get_check_resources (
XrmDatabase *db,
char *appName,
int *argc,
char *argv[],
int verbose);
int get_no_arg_resource (
XrmDatabase *db,
char *appName,
int *argc,
char *argv[],
char *resource,
char *cmnd,
int min_len);
int open_socket (
char *host,
int port);
void print_HM_mode (uint mode);
void print_uptime (FILE *lun, char *prefix, int secs, char *suffix);
int setup_xrm_database (XrmDatabase *db,
char *name[],
int *argc,
char *argv[],
int verbose);
void show_help (char *mod0, char *mod1);
/*
**--------------------------------------------------------------------------*/
int getCheckStatusResponse (
/* ======================
** Wait for the status response from SinqHM and
** check it for errors.
**
*/ int skt, /* The socket for recv */
struct rply_buff_struct *reply, /* The buffer to use */
int rlen) { /* Size of buffer */
int status;
status = recv (skt, (char *) reply, rlen, 0);
if (status == -1) {
FailInet ("\n\007sinqhm_ctrl -- recv error");
return ERROR;
} else if (status != rlen) {
printf ("\007"
"sinqhm_ctrl -- recv error - unexpected byte count: %d/%d\n",
rlen, status);
return ERROR;
}
if (ntohl (reply->bigend) != 0x12345678) {
printf ("\007"
"sinqhm_ctrl -- big-endian/little-endian problem!\n"
" Buffer received in non-network byte order!\n");
return ERROR;
}
status = ntohl (reply->status);
if (status == KER__SUCCESS) {
return SUCCESS;
}else if (status == KER__BAD_CREATE) {
printf ("\007 Status response is KER__BAD_CREATE\n");
printf (" Sub-status = %d\n", ntohl (reply->sub_status));
}else if (status == KER__BAD_STATE) {
printf ("\007 Status response is KER__BAD_STATE\n");
}else if (status == KER__BAD_VALUE) {
printf ("\007 Status response is KER__BAD_VALUE\n");
}else if (status == KER__BAD_RECV) {
printf ("\007 Status response is KER__BAD_RECV\n");
}else if (status == KER__BAD_ALLOC) {
printf ("\007 Status response is KER__BAD_ALLOC\n");
}else {
printf ("\007 Bad and unrecognised status response: 0x%x\n",
status);
}
if (reply->u.message[0] != NIL) {
printf (" Message = \"%s\"\n", &reply->u.message[0]);
}
return ERROR;
}
/*
**---------------------------------------------------------------------------
** get_check_resources - get and check our resources
*/
int get_check_resources (
/* ===================
*/ XrmDatabase *db,
char *appName,
int *argc,
char *argv[],
int verbose) {
int i, status, len;
char buff[80];
char *type;
XrmValue value;
time_t time_now;
float tmp_secs;
/*---------------------------------------------------------- -help */
status = get_no_arg_resource (db, appName, argc, argv,
".sqhmHelp", "help", 1);
if (status) {
if (*argc <= 1) {
show_help (NULL, NULL);
}else if (*argc <= 2) {
show_help (argv[1], NULL);
}else {
show_help (argv[1], argv[2]);
}
exit (EXIT_SUCCESS);
}
/*---------------------------------------------------------- -v */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmVerbose"),
"ProgramName.Values",
&type, &value);
Verbose = verbose = (status) ? True : False;
/*---------------------------------------------------------- -host */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmHost"),
"ProgramName.Values",
&type, &value);
if (status) {
StrJoin (Rmt_host, sizeof (Rmt_host), value.addr, "");
}else {
if (*argc >= 2) {
StrJoin (Rmt_host, sizeof (Rmt_host), argv[1], "");
(*argc)--;
for (i = 1; i < *argc; i++) argv[i] = argv[i+1];
}else {
printf ("\n"
" Target host not specified, there is no default!\n");
show_help (NULL, NULL);
exit (EXIT_FAILURE);
}
}
if (verbose) printf ("Target host is \"%s\".\n", Rmt_host);
/*---------------------------------------------------------- -port */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmPort"),
"ProgramName.Values",
&type, &value);
if (!status || (sscanf (value.addr, "%d", &Rmt_port) != 1)) {
Rmt_port = 2400;
if (verbose) printf ("Using the default TCP/IP port number of ");
}else {
if (verbose) printf ("TCP/IP port number = ");
}
if (verbose) printf ("%d\n", Rmt_port);
/*---------------------------------------------------------- -size */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmPktSize"),
"ProgramName.Values",
&type, &value);
if (!status || (sscanf (value.addr, "%d", &Pkt_size) != 1)) {
Pkt_size = 8192;
if (verbose) printf ("Using the default packet size of ");
}else {
if (verbose) printf ("Packet size = ");
}
if (verbose) printf ("%d\n", Pkt_size);
/*----------------------------------------------------------*/
Do_config = get_no_arg_resource (db, appName, argc, argv,
".sqhmConfig", "config", 1);
Do_deconfig = get_no_arg_resource (db, appName, argc, argv,
".sqhmDeconfig", "deconfig", 8);
Do_go = get_no_arg_resource (db, appName, argc, argv,
".sqhmGo", "go", 2);
Do_rundown = get_no_arg_resource (db, appName, argc, argv,
".sqhmRundown", "rundown", 7);
Do_status = get_no_arg_resource (db, appName, argc, argv,
".sqhmStatus", "status", 1);
if (!Do_status) Do_status = get_no_arg_resource (db, appName, argc, argv,
".sqhmStatus", "show", 1);
Do_stop = get_no_arg_resource (db, appName, argc, argv,
".sqhmStop", "stop", 4);
Do_zero = get_no_arg_resource (db, appName, argc, argv,
".sqhmZero", "zero", 4);
Be_harsh = get_no_arg_resource (db, appName, argc, argv,
".sqhmHarsh", "harsh", 5);
/*---------------------------------------------------------- -debug */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmDebug"),
"ProgramName.Values",
&type, &value);
if (!status) {
Do_debug = False;
}else {
if (StrMatch (value.addr, "ON", 2)) {
Dbg_level = 0x0001;
}else if (StrMatch (value.addr, "OFF", 2)) {
Dbg_level = 0x0000;
}else if ((sscanf (value.addr, "%i", &Dbg_level) != 1) ||
(Dbg_level < 0) ||
(Dbg_level > 0x0ff)) {
printf ("\n"
" \"-debug %s\" is invalid!\n"
"\n", value.addr);
show_help ("debug", NULL);
exit (EXIT_FAILURE);
}
Do_debug = True;
}
/*---------------------------------------------------------- -mode */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmMode"),
"ProgramName.Values",
&type, &value);
if (status) {
StrJoin (Mode, sizeof (Rmt_host), value.addr, "");
if (verbose) printf ("-mode is \"%s\"\n", Mode);
}else {
StrJoin (Mode, sizeof (Rmt_host), "", "");
}
/*---------------------------------------------------------- -nhist */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmNhist"),
"ProgramName.Values",
&type, &value);
if (!status) {
Nhist = 1;
}else if (sscanf (value.addr, "%d", &Nhist) != 1) {
printf (" \"-nhist %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}else if (Nhist <= 0) {
printf (" \"-nhist %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}
/*---------------------------------------------------------- -nbins */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmNbins"),
"ProgramName.Values",
&type, &value);
if (!status) {
Nbins = 0;
}else if (sscanf (value.addr, "%d", &Nbins) != 1) {
printf (" \"-nbins %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}else if (Nbins <= 0) {
printf (" \"-nbins %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}
/*---------------------------------------------------------- -lo_bin */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmLoBin"),
"ProgramName.Values",
&type, &value);
if (!status) {
Lo_bin = 0;
}else if (sscanf (value.addr, "%d", &Lo_bin) != 1) {
printf ("\"-lo_bin %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}else if (Lo_bin < 0) {
printf ("\"-lo_bin %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}
/*---------------------------------------------------------- -compress */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmCompress"),
"ProgramName.Values",
&type, &value);
if (!status) {
Compress = 1;
}else if (sscanf (value.addr, "%d", &Compress) != 1) {
printf (" \"-compress %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}else if (Compress <= 0) {
printf (" \"-compress %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}
/*---------------------------------------------------------- -bpb */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmBpb"),
"ProgramName.Values",
&type, &value);
if (!status) {
Bytes_per_bin = 4;
}else if (sscanf (value.addr, "%d", &Bytes_per_bin) != 1) {
printf (" \"-bpb %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}else if ((Bytes_per_bin != 1) ||
(Bytes_per_bin != 2) ||
(Bytes_per_bin != 4)) {
printf (" \"-bpb %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}
/*---------------------------------------------------------- -ncntr */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmNcntr"),
"ProgramName.Values",
&type, &value);
if (!status) {
Ncntrs = 0;
}else if (sscanf (value.addr, "%d", &Ncntrs) != 1) {
printf (" \"-ncntr %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}else if (Ncntrs <= 0) {
printf (" \"-ncntr %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}
/*---------------------------------------------------------- -lo_cntr */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmLoCntr"),
"ProgramName.Values",
&type, &value);
if (!status) {
Lo_cntr = 0;
}else if (sscanf (value.addr, "%d", &Lo_cntr) != 1) {
printf (" \"-lo_cntr %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}else if (Lo_cntr < 0) {
printf (" \"-lo_cntr %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}
/*---------------------------------------------------------- -span */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmSpan"),
"ProgramName.Values",
&type, &value);
if (!status) {
Span = -1;
}else if (sscanf (value.addr, "%d", &Span) != 1) {
printf (" \"-span %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}else if (Span <= 0) {
printf (" \"-span %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}
/*---------------------------------------------------------- -delay */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmDelay"),
"ProgramName.Values",
&type, &value);
if (!status) {
Delay_time_to_start = 0;
}else if (sscanf (value.addr, "%d", &Delay_time_to_start) != 1) {
printf (" \"-delay %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}else if (Delay_time_to_start <= 0) {
printf (" \"-delay %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}
/*---------------------------------------------------------- -nbuff */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmNbuff"),
"ProgramName.Values",
&type, &value);
if (!status) {
Nbuff = 5;
}else if (sscanf (value.addr, "%d", &Nbuff) != 1) {
printf (" \"-nbuff %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}else if (Nbuff <= 0) {
printf (" \"-nbuff %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}
/*---------------------------------------------------------- -buff_size */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmBuffSize"),
"ProgramName.Values",
&type, &value);
if (!status) {
Buff_size = 8192;
}else if (sscanf (value.addr, "%d", &Buff_size) != 1) {
printf (" \"-buff_size %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}else if (Buff_size <= 0) {
printf (" \"-buff_size %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}
/*---------------------------------------------------------- -xoff */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmxoff"),
"ProgramName.Values",
&type, &value);
if (!status) {
xOff = 100;
}else if (sscanf (value.addr, "%d", &xOff) != 1) {
printf (" \"-xoff %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}else if (xOff <= 0) {
printf (" \"-xoff %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}
/*---------------------------------------------------------- -yoff */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmyoff"),
"ProgramName.Values",
&type, &value);
if (!status) {
yOff = 100;
}else if (sscanf (value.addr, "%d", &yOff) != 1) {
printf (" \"-yoff %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}else if (yOff <= 0) {
printf (" \"-yoff %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}
/*---------------------------------------------------------- -yfac */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmyfac"),
"ProgramName.Values",
&type, &value);
if (!status) {
yFac = 10;
}else if (sscanf (value.addr, "%d", &yFac) != 1) {
printf (" \"-yfac %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}else if (yFac <= 0) {
printf (" \"-yfac %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}
/*---------------------------------------------------------- -xfac */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmxfac"),
"ProgramName.Values",
&type, &value);
if (!status) {
xFac = 10;
}else if (sscanf (value.addr, "%d", &xFac) != 1) {
printf (" \"-xfac %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}else if (xFac <= 0) {
printf (" \"-xfac %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}
/*---------------------------------------------------------- -xsize */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmxsize"),
"ProgramName.Values",
&type, &value);
if (!status) {
xSize = 256;
}else if (sscanf (value.addr, "%d", &xSize) != 1) {
printf (" \"-xsize %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}else if (xSize <= 0) {
printf (" \"-xsize %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}
/*---------------------------------------------------------- -ysize */
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff),
appName, ".sqhmxsize"),
"ProgramName.Values",
&type, &value);
if (!status) {
ySize = 256;
}else if (sscanf (value.addr, "%d", &ySize) != 1) {
printf (" \"-ysize %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}else if (ySize <= 0) {
printf (" \"-ysize %s\" is invalid!\n", value.addr);
exit (EXIT_FAILURE);
}
/*----------------------------------------------------------------------*/
return True;
}
/*
**---------------------------------------------------------------------------
** get_no_arg_resource - get a resource with no args
*/
int get_no_arg_resource (
/* ===================
*/ XrmDatabase *db,
char *appName,
int *argc,
char *argv[],
char *resource,
char *cmnd,
int min_len) {
int i, status;
char buff[80];
char *type;
XrmValue value;
status = XrmGetResource (*db,
StrJoin (buff, sizeof (buff), appName, resource),
"ProgramName.Values",
&type, &value);
if (status) {
return True;
}else {
if ((*argc >= 2) && StrMatch (argv[1], cmnd, min_len)) {
(*argc)--;
for (i = 1; i < *argc; i++) argv[i] = argv[i+1];
return True;
}
}
return False;
}
/*
**---------------------------------------------------------------------------
** Function: open_socket ()
**
** Description:
** Create a "stream" socket and connect to a given Host/Port combination.
**
** Return value is socket.
** If an error is detected, a message will be printed and return value = 0.
*/
int open_socket (
/* ===========
*/
char *host, /* The host's name */
int port) { /* The port on the host to connect to */
int status, my_skt, my_port;
char old_time_out[4];
union {
char chars[4];
int val;
} time_out;
unsigned int oto_status;
struct sockaddr_in lcl_sockname;
struct sockaddr_in rmt_sockname;
struct in_addr rmt_inet_addr;
struct in_addr *rmt_inet_addr_pntr;
struct hostent *rmt_hostent;
int rmt_sockname_len;
#ifdef __VMS
unsigned int oto_len;
int tcp_option = UCX$C_TCP_PROBE_IDLE;
#else
int oto_len;
#ifdef LINUX
int tcp_option = 0;
#else
int tcp_option = TCP_KEEPINIT;
#endif
#endif
/*------------------------------------------------------------------*/
/*
** Get the Internet address of the Host
*/
rmt_inet_addr.s_addr = inet_addr (host);
if (rmt_inet_addr.s_addr != -1) {
rmt_inet_addr_pntr = &rmt_inet_addr;
}else {
rmt_hostent = gethostbyname (host);
if (rmt_hostent == NULL) {
printf ("failed!\n\n"
" Host name, \"%s\", is not a known "
"Internet address.\n", host);
return 0;
}
rmt_inet_addr_pntr = (struct in_addr *) rmt_hostent->h_addr_list[0];
}
/*---------------------------
** Create a TCP/IP socket for connecting to server and bind it.
*/
my_skt = socket (AF_INET, SOCK_STREAM, 0);
if (my_skt <= 0) {
printf ("failed!\n\n"
" Could not create a socket.\n\n");
perror ("OpenSocket");
return 0;
}
lcl_sockname.sin_family = AF_INET;
lcl_sockname.sin_port = htons (0);
lcl_sockname.sin_addr.s_addr = 0;
status = bind (my_skt, (struct sockaddr *) &lcl_sockname,
sizeof (lcl_sockname));
if (status == -1) {
close (my_skt);
printf ("failed!\n\n"
" Could not bind the socket.\n\n");
perror ("OpenSocket");
return 0;
}
/*---------------------------
** Set short time-out
*/
oto_len = sizeof (old_time_out); /* Save current time-out first */
oto_status = getsockopt (my_skt, IPPROTO_TCP, tcp_option,
old_time_out, &oto_len);
if (oto_status == 0) {
time_out.val = 5; /* Set new time-out */
status = setsockopt (my_skt, IPPROTO_TCP, tcp_option,
time_out.chars, sizeof (time_out));
}
/*---------------------------
** Connect to host
*/
my_port = port;
rmt_sockname_len = sizeof (rmt_sockname);
rmt_sockname.sin_family = AF_INET;
rmt_sockname.sin_port = htons (my_port);
rmt_sockname.sin_addr.s_addr = rmt_inet_addr_pntr->s_addr;
status = connect (my_skt, (struct sockaddr *) &rmt_sockname,
sizeof (rmt_sockname));
if (status != 0) {
close (my_skt);
printf ("failed!\n\n"
" Could not connect to Host %s, Port %d.\n\n",
host, my_port);
perror ("OpenSocket");
return 0;
}
/*---------------------------
** Restore time-out
*/
if (oto_status == 0) {
setsockopt (my_skt, IPPROTO_TCP, tcp_option,
old_time_out, oto_len);
}
return my_skt;
}
/*
**--------------------------------------------------------------------------
*/
void print_HM_mode (
/* =============
** Interpret the HM configuration.
**
*/ uint mode) { /* The configuration to be interpreted */
uint my_mode;
printf (" Histogramming Mode = 0x%x", mode);
my_mode = mode & (~SQHM__SUB_MODE_MSK);
if (my_mode == SQHM__TRANS) printf (" SQHM__TRANS");
if (my_mode == SQHM__HM_DIG) printf (" SQHM__HM_DIG");
if (my_mode == SQHM__TOF) printf (" SQHM__TOF");
if (my_mode == SQHM__HM_PSD) printf (" SQHM__HM_PSD");
if (my_mode == SQHM__HRPT) printf (" SQHM__HRPT");
if ((mode & SQHM__DEBUG) != 0) printf ("/DEBUG");
if ((mode & SQHM__UD) != 0) printf ("/UD");
if ((mode & SQHM__STROBO) != 0) printf ("/STROBO");
if ((mode & SQHM__REFLECT) != 0) printf ("/REFLECT");
if ((mode & SQHM__NO_STAT) != 0) printf ("/NO_FILLER_STATUS");
printf ("\n Bin overflow mode = ");
my_mode = mode & SQHM__BO_MSK;
if (my_mode == SQHM__BO_IGN) {
printf ("\"Ignore\"\n");
}else if (my_mode == SQHM__BO_SMAX) {
printf ("\"Stop-at-Max\"\n");
}else if (my_mode == SQHM__BO_CNT) {
printf ("\"Count\"");
}else {
printf ("\"Unrecognised\" = 0x%x\n", my_mode);
}
}
/*
**--------------------------------------------------------------------------*/
void print_uptime (
/* ============
** Print out the up-time
*/
FILE *lun, /* The output stream */
char *prefix, /* A message prefix */
int secs, /* The up-time in seconds */
char *suffix) { /* A message suffix */
int mins, hrs, days;
mins = secs/60; secs -= mins * 60;
hrs = mins/60; mins -= hrs * 60;
days = hrs/24; hrs -= days * 24;
fprintf (lun, "%s", prefix);
if (days > 0) {
printf (" %d days, %d%02d%02d%s", days, hrs, mins, secs, suffix);
}else if (hrs > 0) {
printf (" %d hrs, %d mins, %d secs%s", hrs, mins, secs, suffix);
}else if (mins > 0) {
printf (" %d mins, %d secs%s", mins, secs, suffix);
}else {
printf (" %d secs%s", secs, suffix);
}
}
/*
**---------------------------------------------------------------------------
** setup_xrm_database - setup Resource Manager Database
*/
int setup_xrm_database (
/* ==================
*/ XrmDatabase *db,
char *name[],
int *argc,
char *argv[],
int verbose) {
static char our_name[80] = "Unknown"; /* This holds the program name */
static char lkup_name[80] = "Unknown"; /* Name for looking in database */
int status, i, first = True;
char text[80];
char full_nm0[80];
char full_nm1[80];
char *p_fil[] = {0,0,0,0,0,0,0,0,0,0};
char *my_name;
char *my_name_last;
char *name_type;
XrmValue name_value;
XrmDatabase cmnd_line_db = NULL;
XrmDatabase lcl_db = NULL;
/*-----------------------------------------------------
** This routine merges some resource databases with options specified on
** the command line. Resources can then be looked up using XrmGetResource.
** This is a bit like the X-toolkit routine XtAppInitialize does for the
** extraction of resources by XtGetApplicationResources.
**
** I can't help but think that there's a simpler way of doing this but I
** can't find it in the X manuals. Basically, the problem arises with wanting
** to avoid the calling program being associated with an X-display, i.e. it
** is intended for use by "command-line oriented" programs. All the nice,
** easy-to-use resource/command-line setup routines in Xlib or Xtlib seem to
** assume one is going to use a display -- not surprising, I suppose,
** since the concept of Xlib is for writing window based applications!
**
** Anyway, the point is that the following way turns out to be lacking
** when it gets tested in anger.
*/
status = True; /* Assume success */
our_name[0] = NIL;
/*
** Make a list of the databases to be merged, highest priority first.
*/
#ifdef __VMS
p_fil[0] = "decw$user_defaults:SinQ_rc.dat";
p_fil[1] = "decw$group_defaults:SinQ_rc.dat";
p_fil[2] = "decw$system_defaults:SinQ_rc.dat";
p_fil[3] = "decw$user_defaults:decw$xdefaults.dat";
p_fil[4] = "decw$group_defaults:decw$xdefaults.dat";
p_fil[5] = "decw$system_defaults:decw$xdefaults.dat";
p_fil[6] = NULL;
if (*argc > 0) { /* Find out what we are called - parse file nm */
my_name = strstr (argv[0], "]"); /* Find end of directory, i.e. "]" */
my_name++; /* Skip over "]" */
if (my_name[0] == '[') { /* Handle possible concealed device */
my_name = strstr (my_name, "]");
my_name++;
}
i = sizeof (our_name);
StrEdit (our_name, my_name, "lowercase", &i); /* Copy the rest */
strtok (our_name, "."); /* Close it off at "." */
}
#else
p_fil[0] = StrJoin (full_nm0, sizeof (full_nm0),
getenv ("HOME"), "/SinQ_rc");
p_fil[1] = "/usr/lib/X11/app-defaults/SinQ_rc";
p_fil[2] = StrJoin (full_nm1, sizeof (full_nm1),
getenv ("HOME"), "/.Xdefaults");
p_fil[3] = "/usr/lib/X11/app-defaults/Xdefaults";
p_fil[4] = NULL;
if (*argc > 0) { /* Find out what we are called - parse file nm */
/* Find end of directories */
my_name = argv[0] - 1;
while (my_name != NULL) {
my_name_last = my_name;
my_name_last++;
my_name = strstr (my_name_last, "/");
}
StrJoin (our_name, sizeof (our_name), my_name_last, "");
}
#endif
if (verbose) printf ("My name is \"%s\"\n", our_name);
/*
** Initialise and combine all databases
*/
XrmInitialize ();
for (i = 0; i < XtNumber (p_fil); i++) {
if (p_fil[i] == NULL) break;
status = XrmCombineFileDatabase (p_fil[i], &lcl_db, False);
if ((status != 0) && verbose) {
if (first)
printf ("Resource database created from file %s.\n", p_fil[i]);
if (!first)
printf ("File %s merged into resource database.\n", p_fil[i]);
first = False;
}
}
/*----------------------------------------------------------------
** See if there's anything specified on cmnd line, incl "name".
*/
XrmParseCommand (&cmnd_line_db,
OpTable_0, XtNumber(OpTable_0), our_name, argc, argv);
if (cmnd_line_db != NULL) {
/*
** There was at least 1 item on cmnd line. Process the line.
** If -name was specified, adopt it.
*/
status = XrmGetResource (cmnd_line_db, /* See if a name was specified */
StrJoin (text, sizeof (text), our_name, ".name"),
"ProgramName.Values",
&name_type, &name_value);
if (status) {
i = sizeof (lkup_name);
StrEdit (lkup_name, name_value.addr, "lowercase", &i);
printf ("Option list name is \"%s\"\n", lkup_name);
}else {
strcpy (lkup_name, our_name);
}
/*
** Loop over all items in OpTable_0 and merge them into database,
** taking care of any possible name changes.
*/
for (i = 0; i < XtNumber (OpTable_0); i++) {
if (strcmp (OpTable_0[i].option, "-name") == 0) continue;
status = XrmGetResource (cmnd_line_db,
StrJoin (text, sizeof (text),
our_name, OpTable_0[i].specifier),
"ProgramName.Values",
&name_type, &name_value);
if (status) {
StrJoin (text, sizeof (text), lkup_name, OpTable_0[i].specifier);
XrmPutResource (&lcl_db, text, "String", &name_value);
}
}
}
/*----------------------------------------------------------------
*/
*name = lkup_name;
*db = lcl_db;
if ((lcl_db == NULL) && verbose)
printf ("\007Warning -- no resource database found.\n");
XrmDestroyDatabase (cmnd_line_db);
/*
** XrmPutFileDatabase (lcl_db, "sinqhm_client.db");
*/
return status;
}
/*
**--------------------------------------------------------------------------*/
void show_help (char *mod0, char *mod1) {
/* =========
*/
int len;
len = (mod0 == NULL) ? 0 : strlen (mod0);
if (len == 0) goto sh_basic;
if (StrMatch (mod0, "host", 1)) goto sh_host;
if (StrMatch (mod0, "resources", 2)) goto sh_resources;
if (StrMatch (mod0, "config", 1)) goto sh_config;
if (StrMatch (mod0, "debug", 3)) goto sh_debug;
if (StrMatch (mod0, "deconfig", 3)) goto sh_deconfig;
if (StrMatch (mod0, "go", 1)) goto sh_go;
if (StrMatch (mod0, "rundown", 2)) goto sh_rundown;
if (StrMatch (mod0, "show", 1)) goto sh_show;
if (StrMatch (mod0, "status", 2)) goto sh_status;
if (StrMatch (mod0, "stop", 3)) goto sh_stop;
if (StrMatch (mod0, "zero", 1)) goto sh_zero;
printf ("\n"
" \"%s\" in an unrecognised help option. Here are some\n"
" hints on using sinqhm_ctrl:\n", mod0);
sh_basic:
printf ("\n"
" The following major command options are recognised by sinqhm_ctrl:\n"
"\n"
" -host ... - specifies the target histogram memory.\n"
"\n"
" -config ... - configure the hist memory.\n"
" -debug <level> - sets the debug level.\n"
" -deconfig - de-configure the hist memory.\n"
" -go - start data acquisition.\n"
" -rundown - run down SinqHM server.\n"
" -status (or -show) - get status of hist memory.\n"
" -stop - stop data acquisition.\n"
" -zero - zero the HM buffer.\n"
"\n"
" In order to use sinqhm_ctrl on a VMS system, the DCL$PATH logical\n"
" name must be defined, e.g:\n"
" $ define/job dcl$path mad_exe:\n"
"\n"
" To get more help, issue the command: sinqhm_ctrl -help <subject>\n"
"\n"
" where <subject> may be any of\n"
"\n"
" host\n"
" config debug deconfig go\n"
" rundown status stop zero\n"
" resources\n"
"\n");
return;
sh_host:
printf ("\n -host\n"
"\n"
" The histogram memory with which sinqhm_ctrl is to communicate is\n"
" specified on the command line, thus:\n"
"\n"
" -host <host> -port <port> -size <pkt-size>\n"
"\n"
" <host> is the Internet name of the histogram memory specified as\n"
" a name or in the normal Internet dot notation. There is no default.\n"
"\n"
" <port> defaults to 2400 and is the Internet port number at which "
"the\n"
" SinqHM server in <host> is accepting connections.\n"
"\n"
" <pkt-size> defaults to 8192 and is the maximum size to be used "
"in send/recv\n"
" calls for transmitting messegas and data between the client and "
"<host>.\n"
" It is not recommended to make this value too large since it causes "
"the\n"
" network software to reserve too much dynamic memory.\n"
"\n");
return;
sh_resources:
printf ("\n"
" Sorry, \"-help resources\" is not yet available.\n\n");
sh_config:
len = (mod1 == NULL) ? 0 : strlen (mod1);
if (len == 0) goto shc_basic;
if (StrMatch (mod1, "hm_dig", 4)) goto shmc_hm_dig;
if (StrMatch (mod1, "tof", 2)) goto shmc_tof;
if (StrMatch (mod1, "hrpt", 2)) goto shmc_hrpt;
if (StrMatch (mod1, "hm_psd", 4)) goto shmc_psd;
if (StrMatch (mod1, "trans", 2)) goto shmc_trans;
printf ("\n"
" \"%s\" in an unrecognised \"-help config\" option. Here is\n"
" the basic \"-help config\" information:\n", mod1);
shc_basic:
printf ("\n -config Configure the histogram memory.\n"
"\n"
" When the -config option is used to configure the histogram memory,\n"
" the -mode option must also be given to specify the histogramming mode.\n"
" The -mode option takes the form:\n"
"\n"
" -mode <main-mode>[/<sub-mode>][/<sub-mode>]...\n"
" \n"
" <main-mode> specifies the histogramming mode. Recognised values are:\n"
" HM_DIG = Digitised histogramming mode (e.g. DMC or SANS)\n"
" TOF = Time-of-Flight mode\n"
" HRPT = HRPT mode\n"
" HM_PSD = Position-Sensitive-Detector mode\n"
" TRANS = Transparent mode\n"
"\n"
" <sub-mode> specifies extra options for the mode. Recognised values are:\n"
" DEBUG - debug mode. The filler task will suspend itself as\n"
" soon as it is started so that it can be debugged.\n"
" UD - Up/Down mode.\n"
" BO_IGN - Ignore bin overflows when histogramming.\n"
" BO_SMAX - If a bin overflows, stop at maximum value.\n"
" BO_CNT - Keep a count of bin overflows (not yet available).\n"
" STROBO - Stroboscopic (gummi) mode.\n"
" REFLECT - histograms are reflected (used on HRPT)\n"
" NO_STAT - Suppress status information from the filler task.\n"
"\n"
" Further options must also be specified depending on the value of <main-mode>.\n"
" To get more help, issue the command:\n"
"\n"
" sinqhm_ctrl -help config <main-mode>\n"
"\n"
" where <main-mode> may be any of HM_DIG, TOF, HRPT, HM_PSD or TRANS.\n"
"\n"
" The configuring of the histogram memory results in the starting up\n"
" of the filler process.\n"
"\n");
return;
shmc_hm_dig:
printf ("\n -config -mode HM_DIG Digitised histogramming mode.\n"
"\n"
" The following options are required to define the HM_DIG mode:\n");
goto shmc_hm_dig_hrpt_comn;
shmc_hrpt:
printf ("\n -config -mode HRPT HRPT histogramming mode.\n"
"\n"
" The following options are required to define the HRPT mode:\n");
shmc_hm_dig_hrpt_comn:
printf ("\n"
" -nhist <#-hists> (Dflt = 1) = Number of histograms.\n"
" -nbins <#-bins> (Dflt = none) = Number of bins.\n"
" -bpb <bpb> (Dflt = 4) = Bytes per bin.\n"
" -lo_bin <lo_bin> (Dflt = 0) = Number of lowest bin.\n"
" -compress <cmprs> (Dflt = 1) = Bin compression factor.\n"
"\n");
return;
shmc_tof:
printf ("\n -config -mode TOF Time-of-Flight histogramming mode.\n"
"\n"
" The following options are required to define the TOF mode:\n"
" -ncntr <#-cntrs> (Dflt = none) = Number of counters.\n"
" -nbins <#-bins> (Dflt = none) = Number of bins.\n"
" -lo_bin <lo_bin> (Dflt = 0) = Tick value of first bin.\n"
" -lo_cntr <lo_cntr> (Dflt = 0) = Number of first counter.\n"
" -bpb <bpb> (Dflt = 4) = Bytes per bin.\n"
" -span <span> (Dflt = none) = Number of ticks spanned by a bin.\n"
" -delay <delay> (Dflt = 0) = Delay time to start\n"
"\n");
return;
shmc_psd:
printf ("\n -config -mode HM_PSD PSD histogramming mode.\n"
"\n"
" Not yet available!\n"
"\n");
return;
shmc_trans:
printf ("\n -config -mode TRANS Transparent mode.\n"
"\n"
" The following options are required to define the Transparent mode:\n"
" -nbuff <#-buff> (Dflt = 5) = Number of buffers.\n"
" -buff_size <size> (Dflt = 8192) = Size in bytes of each buffer.\n"
"\n");
return;
sh_debug:
printf ("\n -debug <level> Set the level of debug messages.\n"
"\n"
" The value of <level> sets the verbosity of the SinqHM system\n"
" in generating messages to the COM1 port of the histogram\n"
" memory.\n"
"\n"
" <level> may be set to \"OFF\", \"ON\", 0, 1, 2 or 3.\n"
"\n"
" \"OFF\" is equivalent to 0\n"
" \"ON\" is equivalent to 1\n"
" The default is \"ON\".\n"
"\n");
return;
sh_deconfig:
printf ("\n -deconfig <harshness> De-configure the hist memory.\n"
"\n"
" If <harshness> is not specified, there must be no active clients\n"
" for the command to be accepted.\n"
"\n"
" If <harshness> is specified as \"HARSH\", any active clients will\n"
" be killed.\n"
"\n"
" The filler task is also terminated.\n"
"\n");
return;
sh_go:
printf ("\n -go Start data acquisition by SinqHM-filler\n"
"\n"
" An SQHM_DAQ/DAQ__GO command will be sent to SinqHM-master to cause\n"
" SinqHM-filler to start data acquisition.\n"
"\n");
return;
sh_rundown:
printf ("\n -rundown Runs down SinqHM\n"
"\n"
" +------------------+\n"
" | USE WITH CAUTION |\n"
" +------------------+\n"
"\n"
" SinqHM-master, SinqHM-filler and all SinqHM-servers will\n"
" be terminated.\n"
"\n"
" After issuing this command, manual intervention on the\n"
" histogram memory will be necessary in order to restart\n"
" SinqHM.\n"
"\n");
return;
sh_show:
printf ("\n -show Same as -status\n"
"\n"
" Get and display the status of the hist memory.\n"
"\n");
return;
sh_status:
printf ("\n -status Get and display the status of the hist memory.\n"
"\n");
return;
sh_stop:
printf ("\n -stop Stop data acquisition by SinqHM-filler\n"
"\n"
" An SQHM_DAQ/DAQ__STOP command will be sent to SinqHM-master to cause\n"
" SinqHM-filler to stop data acquisition.\n"
"\n");
return;
sh_zero:
printf ("\n -zero Zero the histogram memory buffer\n"
"\n"
" An SQHM_ZERO command will be sent to SinqHM-master. The values of\n"
" hist_no, first_bin and n_bins will be set to -1 so that the entire\n"
" histogram memory buffer will be set to zero.\n"
"\n");
return;
}
/*
**==========================================================================
**
** Main line program
** ------------------
**==========================================================================*/
main (int argc, char *argv[]) {
/*==========================================================================*/
int i, j, k, status, cmnd_len, mod_len;
int is1, is2, mode;
int nh, ch, bph, bpb, span;
int tsi_status, tsi_flags, dt_or_dts, num_bad_ev;
char *p_addr, *opt, tmp_ch;
char buff[64], my_cmnd[32], my_mod[32];
char *token;
unsigned int daq_state_now;
unsigned int daq_state_was;
unsigned int filler_mask;
unsigned int server_mask;
XrmDatabase my_db;
char *appName;
int cnct_skt; /* Connect socket */
struct sockaddr_in lcl_sockname;
struct sockaddr_in rmt_sockname;
int rmt_inet_addr;
struct in_addr *rmt_inet_addr_pntr;
struct hostent *rmt_hostent;
int rmt_sockname_len;
int oto_status;
char old_time_out[4];
union {
char chars[4];
int val;
} time_out;
/*============================================================================*/
printf ("sinqhm_ctrl ident %s.\n", IDENT);
/*-------------------------------------------------------------
** Setup the resource database and look up the resources.
*/
Verbose = False;
for (i = 1; i < argc; i++) if (strcmp ("-v", argv[i]) == 0) Verbose = True;
setup_xrm_database (&my_db, &appName, &argc, argv, Verbose);
status = get_check_resources (&my_db, appName, &argc, argv, Verbose);
if (!status) return False;
if (Verbose) printf (" Server is %s ", Rmt_host);
if (Verbose) printf ("(%s),", inet_ntoa (*rmt_inet_addr_pntr));
if (Verbose) printf (" Port %d.\n", Rmt_port);
/*============================================================================
** Execute the user's wish.
*/
i = 0;
if (Do_config) i++;
if (Do_debug) i++;
if (Do_deconfig) i++;
if (Do_go) i++;
if (Do_rundown) i++;
if (Do_status) i++;
if (Do_stop) i++;
if (Do_zero) i++;
if (i == 0) {
printf ("No action has been specified. Assume \"-status\" ...\n");
Do_status = True;
}else if (i != 1) {
printf ("Only one action may be specified on the command line.\n");
show_help (NULL, NULL); exit (EXIT_FAILURE);
}
/*============================================================================
** Switch according to value of <cmnd>
*/
if (Do_config) goto config;
if (Do_debug) goto debug;
if (Do_deconfig) goto deconfig;
if (Do_go) goto go;
if (Do_rundown) goto rundown;
if (Do_status) goto status;
if (Do_stop) goto stop;
if (Do_zero) goto zero;
goto status;
/*============================================================================*/
config:
/*====== Configure - Extract values from the logical names.
*/
Hm_mode = 0;
StrJoin (buff, sizeof (buff), Mode, "");
token = strtok (buff, "/"); /* Split up the tokens */
while (token != NULL) {
if (StrMatch (token, "HM_DIG", 4)) {
Hm_mode = (Hm_mode & ~SQHM__SUB_MODE_MSK) | SQHM__HM_DIG;
}else if (StrMatch (token, "TOF", 3)) {
Hm_mode = (Hm_mode & ~SQHM__SUB_MODE_MSK) | SQHM__TOF;
}else if (StrMatch (token, "HRPT", 3)) {
Hm_mode = (Hm_mode & ~SQHM__SUB_MODE_MSK) | SQHM__HRPT;
}else if (StrMatch (token, "TRANS", 3)) {
Hm_mode = (Hm_mode & ~SQHM__SUB_MODE_MSK) | SQHM__TRANS;
}else if (StrMatch (token, "HM_PSD", 4)) {
Hm_mode = (Hm_mode & ~SQHM__SUB_MODE_MSK) | SQHM__HM_PSD;
}else if (StrMatch (token, "DEBUG", 3)) {
Hm_mode |= SQHM__DEBUG;
}else if (StrMatch (token, "UD", 2)) {
Hm_mode |= SQHM__UD;
}else if (StrMatch (token, "BO_IGN", 4)) {
Hm_mode = (Hm_mode & ~SQHM__BO_MSK ) | SQHM__BO_IGN;
}else if (StrMatch (token, "BO_SMAX", 4)) {
Hm_mode = (Hm_mode & ~SQHM__BO_MSK ) | SQHM__BO_SMAX;
}else if (StrMatch (token, "BO_CNT", 4)) {
Hm_mode = (Hm_mode & ~SQHM__BO_MSK ) | SQHM__BO_CNT;
}else if (StrMatch (token, "STROBO", 3)) {
Hm_mode |= SQHM__STROBO;
}else if (StrMatch (token, "REFLECT", 4)) {
Hm_mode |= SQHM__REFLECT;
}else if (StrMatch (token, "NO_STAT", 4)) {
Hm_mode |= SQHM__NO_STAT;
}else {
printf ("\007 The -mode option is not valid.\n");
printf (" Here is some help ...\n");
show_help ("config", NULL);
return EXIT_FAILURE;
}
token = strtok (NULL, "/");
}
is1 = EXIT_SUCCESS;
if (((Hm_mode & ~SQHM__SUB_MODE_MSK) == SQHM__HM_DIG) ||
((Hm_mode & ~SQHM__SUB_MODE_MSK) == SQHM__HRPT)) {
if (Nbins <= 0) {is1 = !EXIT_SUCCESS; opt = "-nbins";}
}else if ((Hm_mode & ~SQHM__SUB_MODE_MSK) == SQHM__TOF) {
if (Ncntrs <= 0) {
is1 = !EXIT_SUCCESS;
opt = "-ncntr";
}else if (Nbins <= 0) {
is1 = !EXIT_SUCCESS;
opt = "-nbins";
}else if (Span < 0) {
is1 = !EXIT_SUCCESS;
opt = "-span";
}
}else if((Hm_mode & ~SQHM__SUB_MODE_MSK) == SQHM__HM_PSD){
if(xSize <= 0) {
is1 = !EXIT_SUCCESS;
opt = "-xsize";
}else if(ySize <= 0) {
is1 = !EXIT_SUCCESS;
opt = "-ysize";
}
}else if ((Hm_mode & ~SQHM__SUB_MODE_MSK) == SQHM__TRANS) {
}else {
is1 = !EXIT_SUCCESS;
opt = "-mode";
}
if (is1 != EXIT_SUCCESS) {
printf ("\007 The configuration is not defined or not complete.\n");
printf (" Here is some help ...\n");
show_help ("config", NULL);
printf (" The problem is with %s\n", opt);
printf ("\n");
return EXIT_FAILURE;
}
/*
** The configuration seems to be OK. Connect to the target.
*/
cnct_skt = open_socket (Rmt_host, Rmt_port);
if (cnct_skt <= 0) exit (EXIT_FAILURE);
/*
** Set up and send the configure message.
*/
Req_buff.bigend = htonl (0x12345678);
Req_buff.cmnd = htonl (SQHM_CONFIG);
Req_buff.u.cnfg.mode = htonl (Hm_mode);
if ((Hm_mode & ~SQHM__SUB_MODE_MSK) == SQHM__HM_DIG) {
Req_buff.u.cnfg.u.hm_dig.n_hists = htonl (Nhist);
Req_buff.u.cnfg.u.hm_dig.lo_bin = htonl (Lo_bin);
Req_buff.u.cnfg.u.hm_dig.num_bins = htonl (Nbins);
Req_buff.u.cnfg.u.hm_dig.bytes_per_bin = htonl (Bytes_per_bin);
Req_buff.u.cnfg.u.hm_dig.compress = htonl (Compress);
}else if ((Hm_mode & ~SQHM__SUB_MODE_MSK) == SQHM__TOF) {
Req_buff.u.cnfg.u.tof.n_extra_bytes = htonl (0);
Req_buff.u.cnfg.u.tof.n_edges = htons (1);
Req_buff.u.cnfg.u.tof.n_banks = htons (1);
Req_buff.u.cnfg.u.tof.edge_0.n_bins = htonl (Nbins);
Req_buff.u.cnfg.u.tof.edge_0.flag = htonl (0); /* Fixed bin span */
Req_buff.u.cnfg.u.tof.edge_0.edges[0] = htonl (Lo_bin);
Req_buff.u.cnfg.u.tof.edge_0.edges[1] = htonl (Lo_bin+Span);
Req_buff.u.cnfg.u.tof.preset_delay = htonl (Delay_time_to_start);
Req_buff.u.cnfg.u.tof.bank_0.first = htons (Lo_cntr);
Req_buff.u.cnfg.u.tof.bank_0.n_cntrs = htons (Ncntrs);
Req_buff.u.cnfg.u.tof.bank_0.edge_indx = htons (0);
Req_buff.u.cnfg.u.tof.bank_0.bytes_per_bin = htons (Bytes_per_bin);
}else if ((Hm_mode & ~SQHM__SUB_MODE_MSK) == SQHM__HM_PSD) {
Req_buff.u.cnfg.u.psd.n_extra_bytes = htonl (0);
Req_buff.u.cnfg.u.psd.n_edges = htons (1);
Req_buff.u.cnfg.u.psd.n_banks = htons (1);
Req_buff.u.cnfg.u.psd.xOffset = htons (xOff);
Req_buff.u.cnfg.u.psd.yOffset = htons (yOff);
Req_buff.u.cnfg.u.psd.xFactor = htons (xFac);
Req_buff.u.cnfg.u.psd.yFactor = htons (yFac);
Req_buff.u.cnfg.u.psd.xSize = htons (xSize);
Req_buff.u.cnfg.u.psd.ySize = htons (ySize);
Req_buff.u.cnfg.u.psd.edge_0.n_bins = htonl (Nbins);
Req_buff.u.cnfg.u.psd.edge_0.flag = htonl (0); /* Fixed bin span */
Req_buff.u.cnfg.u.psd.edge_0.edges[0] = htonl (0);
Req_buff.u.cnfg.u.psd.edge_0.edges[1] = htonl (Span);
Req_buff.u.cnfg.u.psd.preset_delay = htonl (Delay_time_to_start);
Req_buff.u.cnfg.u.psd.bank_0.first = htons (Lo_cntr);
Req_buff.u.cnfg.u.psd.bank_0.n_cntrs = htons (xSize*ySize);
Req_buff.u.cnfg.u.psd.bank_0.edge_indx = htons (0);
Req_buff.u.cnfg.u.psd.bank_0.bytes_per_bin = htons (Bytes_per_bin);
}else if ((Hm_mode & ~SQHM__SUB_MODE_MSK) == SQHM__TRANS) {
Req_buff.u.cnfg.u.trans.n_buffs = htonl (Nbuff);
Req_buff.u.cnfg.u.trans.n_bytes = htons (Buff_size);
}
printf (" Configuration:\n"
" Histogramming mode is 0x%08x", Hm_mode);
if ((Hm_mode & ~SQHM__SUB_MODE_MSK) == SQHM__HM_DIG) {
printf (" = HM_DIG");
}else if ((Hm_mode & ~SQHM__SUB_MODE_MSK) == SQHM__HM_PSD) {
printf (" = HM_PSD");
}else if ((Hm_mode & ~SQHM__SUB_MODE_MSK) == SQHM__HRPT) {
printf (" = HRPT");
}else if ((Hm_mode & ~SQHM__SUB_MODE_MSK) == SQHM__TRANS) {
printf (" = TRANS");
}else if ((Hm_mode & ~SQHM__SUB_MODE_MSK) == SQHM__TOF) {
printf (" = TOF");
}
if ((Hm_mode & SQHM__DEBUG) != 0) printf (" + DEBUG");
printf ("\n");
if ((Hm_mode & ~SQHM__SUB_MODE_MSK) != SQHM__TOF) {
printf (" Number of histograms = %5d\n"
" Index of first bin = %5d\n"
" Number of bins per histogram = %5d\n"
" Number of bytes per bin = %5d\n"
" Bin compression factor = %5d\n",
Nhist, Lo_bin, Nbins, Bytes_per_bin, Compress);
} else if (((Hm_mode & ~SQHM__SUB_MODE_MSK) != SQHM__HM_DIG) ||
((Hm_mode & ~SQHM__SUB_MODE_MSK) != SQHM__HRPT)) {
printf (" Number of counters = %5d\n"
" First counter = %5d\n"
" Number of bins per histogram = %5d\n"
" Lower edge of first bin = %5d\n"
" Bin width = %5d\n"
" Number of bytes per bin = %5d\n"
" Delay-Time-to-Start = %5d\n",
Ncntrs, Lo_cntr, Nbins, Lo_bin, Span, Bytes_per_bin,
Delay_time_to_start);
}
if ((Hm_mode & SQHM__DEBUG) != 0)
printf ("\007\n Warning -- DEBUG suspend flag is set!\n\n");
printf (" Configuring ..."); fflush (NULL);
status = send (cnct_skt, (char *) &Req_buff, sizeof (Req_buff), 0);
if (status == -1) FailInet ("\nsinqhm_ctrl -- send error");
if (status != sizeof (Req_buff)) {
printf ("\nsinqhm_ctrl -- wrong number of bytes sent: %d", status);
return EXIT_FAILURE;
}
/*
** Wait for the status response.
*/
status = getCheckStatusResponse (cnct_skt, &Rply_buff, sizeof (Rply_buff));
if (status == SUCCESS) {
printf (" done.\n");
}
/*
** Close the connection.
*/
status = close (cnct_skt);
if ((status != 0) && (errno != ECONNRESET))
FailInet ("\nsinqhm_ctrl -- close error");
return EXIT_SUCCESS;
/*============================================================================*/
debug:
/*===== Debug. Set up the debug level of the front-end..
*/
printf (" Setting SinqHM debug mask = 0x%04x ...", Dbg_level); fflush (NULL);
Req_buff.bigend = htonl (0x12345678);
Req_buff.cmnd = htonl (SQHM_DBG);
Req_buff.u.dbg.mask = htonl (Dbg_level);
cnct_skt = open_socket (Rmt_host, Rmt_port);
if (cnct_skt <= 0) exit (EXIT_FAILURE);
status = send (cnct_skt, (char *) &Req_buff, sizeof (Req_buff), 0);
if (status == -1) FailInet ("\nsinqhm_ctrl -- send error");
if (status != sizeof (Req_buff)) {
printf ("sinqhm_ctrl -- wrong number of bytes sent: %d", status);
status = close (cnct_skt);
return EXIT_FAILURE;
}
/*
** Wait for the status response.
*/
status = getCheckStatusResponse (cnct_skt, &Rply_buff, sizeof (Rply_buff));
if (status == SUCCESS) {
printf (" done.\n");
}
/*
** Close the connection.
*/
status = close (cnct_skt);
if ((status != 0) && (errno != ECONNRESET))
FailInet ("\nsinqhm_ctrl -- close error");
return EXIT_SUCCESS;
/*============================================================================*/
deconfig:
/*======== De-configure. Set up and send the deconfig message.
*/
Req_buff.bigend = htonl (0x12345678);
Req_buff.cmnd = htonl (SQHM_DECONFIG);
Req_buff.u.decnfg.sub_code = 0; /* Be gentle, by default */
if (Be_harsh) {
Req_buff.u.decnfg.sub_code = htonl (1); /* But be harsh, if ordered */
printf (" Deconfiguring (mit Gewalt!) ...");
}else {
printf (" Deconfiguring ...");
}
fflush (NULL);
cnct_skt = open_socket (Rmt_host, Rmt_port);
if (cnct_skt <= 0) exit (EXIT_FAILURE);
status = send (cnct_skt, (char *) &Req_buff, sizeof (Req_buff), 0);
if (status == -1) FailInet ("\nsinqhm_ctrl -- send error");
if (status != sizeof (Req_buff)) {
printf ("sinqhm_ctrl -- wrong number of bytes sent: %d", status);
status = close (cnct_skt);
return EXIT_FAILURE;
}
/*
** Wait for the status response.
*/
status = getCheckStatusResponse (cnct_skt, &Rply_buff, sizeof (Rply_buff));
if (status == SUCCESS) {
printf (" done.\n");
}
/*
** Close the connection.
*/
status = close (cnct_skt);
if ((status != 0) && (errno != ECONNRESET))
FailInet ("\nsinqhm_ctrl -- close error");
return EXIT_SUCCESS;
/*============================================================================*/
go:
/*== Go. Get SinqHM-filler to start taking data.
*/
printf (" Starting data acquisition ..."); fflush (NULL);
Req_buff.bigend = htonl (0x12345678);
Req_buff.cmnd = htonl (SQHM_DAQ);
Req_buff.u.daq.sub_cmnd = htonl (DAQ__GO);
cnct_skt = open_socket (Rmt_host, Rmt_port);
if (cnct_skt <= 0) exit (EXIT_FAILURE);
status = send (cnct_skt, (char *) &Req_buff, sizeof (Req_buff), 0);
if (status == -1) FailInet ("\nsinqhm_ctrl -- send error");
if (status != sizeof (Req_buff)) {
printf ("sinqhm_ctrl -- wrong number of bytes sent: %d", status);
status = close (cnct_skt);
return EXIT_FAILURE;
}
/*
** Wait for the status response.
*/
status = getCheckStatusResponse (cnct_skt, &Rply_buff, sizeof (Rply_buff));
if (status == SUCCESS) {
daq_state_now = ntohs (Rply_buff.u.daq.daq_now);
daq_state_was = ntohs (Rply_buff.u.daq.daq_was);
filler_mask = ntohs (Rply_buff.u.daq.filler_mask);
server_mask = ntohs (Rply_buff.u.daq.server_mask);
if (daq_state_now == 0) {
if (daq_state_was == 0) {
printf (" done. It was already active!\n");
}else {
printf (" done.\n");
}
}else {
printf ("\n\007 Data acquisition is still disabled.\n"
" Daq-state-now is 0x%04x\n"
" Filler-mask is 0x%04x\n", daq_state_now, filler_mask);
}
}
/*
** Close the connection.
*/
status = close (cnct_skt);
if ((status != 0) && (errno != ECONNRESET))
FailInet ("\nsinqhm_ctrl -- close error");
return EXIT_SUCCESS;
/*============================================================================*/
rundown:
/*======= Rundown. Set up and send the rundown message.
*/
printf (" Sending SQHM_EXIT command to SinqHM ..."); fflush (NULL);
Req_buff.bigend = htonl (0x12345678);
Req_buff.cmnd = htonl (SQHM_EXIT);
cnct_skt = open_socket (Rmt_host, Rmt_port);
if (cnct_skt <= 0) exit (EXIT_FAILURE);
status = send (cnct_skt, (char *) &Req_buff, sizeof (Req_buff), 0);
if (status == -1) FailInet ("\nsinqhm_ctrl -- send error");
if (status != sizeof (Req_buff)) {
printf ("sinqhm_ctrl -- wrong number of bytes sent: %d", status);
status = close (cnct_skt);
return EXIT_FAILURE;
}
/*
** Wait for the status response.
*/
status = getCheckStatusResponse (cnct_skt, &Rply_buff, sizeof (Rply_buff));
if (status == SUCCESS) {
printf (" done.\n");
}
/*
** Close the connection.
*/
status = close (cnct_skt);
if ((status != 0) && (errno != ECONNRESET))
FailInet ("\nsinqhm_ctrl -- close error");
return EXIT_SUCCESS;
/*============================================================================*/
status:
/*====== Show-status. Set up and send the status message.
*/
printf (" Getting status of SinqHM ..."); fflush (NULL);
Req_buff.bigend = htonl (0x12345678);
Req_buff.cmnd = htonl (SQHM_STATUS);
cnct_skt = open_socket (Rmt_host, Rmt_port);
if (cnct_skt <= 0) exit (EXIT_FAILURE);
status = send (cnct_skt, (char *) &Req_buff, sizeof (Req_buff), 0);
if (status == -1) FailInet ("\nsinqhm_ctrl -- send error");
if (status != sizeof (Req_buff)) {
printf ("sinqhm_ctrl -- wrong number of bytes sent: %d", status);
status = close (cnct_skt);
return EXIT_FAILURE;
}
/*
** Wait for the status response.
*/
status = getCheckStatusResponse (cnct_skt, &Rply_buff, sizeof (Rply_buff));
if (status == SUCCESS) {
/*
** Display the status obtained.
*/
memcpy (buff, (char *) &Rply_buff.sub_status, 4); /* Get SinqHM Ident */
buff[4] = '\0';
printf ("\n"
" SinqHM Identifier is \"%s\"\n", buff);
printf (" Maximum number of histograms = %d\n",
ntohl (Rply_buff.u.status.max_n_hists));
printf (" Maximum number of bins per histogram = %d\n",
ntohl (Rply_buff.u.status.max_num_bins));
printf (" Maximum number of active connections supported = %d\n",
Rply_buff.u.status.max_srvrs);
printf (" Maximum space available for histograms = %d bytes\n",
ntohl (Rply_buff.u.status.max_block));
print_uptime (stdout, " Up-time = ",
ntohl (Rply_buff.u.status.up_time), "\n\n");
if (Rply_buff.u.status.cfg_state == 0) {
printf (" SINQHM has not yet been configured.\n");
}else {
mode = ntohl (Rply_buff.u.status.cfg_state);
print_HM_mode (mode);
printf ("\n");
nh = ntohs (Rply_buff.u.status.n_hists);
ch = ntohs (Rply_buff.u.status.curr_hist);
bph = ntohl (Rply_buff.u.status.num_bins);
bpb = Rply_buff.u.status.bytes_per_bin;
span = Rply_buff.u.status.compress;
tsi_status = ntohs (Rply_buff.u.status.tsi_status);
tsi_flags = ntohs (Rply_buff.u.status.flags);
dt_or_dts = ntohl (Rply_buff.u.status.dt_or_dts.both);
num_bad_ev = ntohl (Rply_buff.u.status.num_bad_events);
if (((mode & ~SQHM__SUB_MODE_MSK) == SQHM__HM_DIG) ||
((mode & ~SQHM__SUB_MODE_MSK) == SQHM__HRPT)) {
if (nh != 0) {
printf (" Number of histograms = %d\n", nh);
printf (" Current histogram = %d\n", ch);
}
printf (" Number of bins per histogram = %d\n", bph);
printf (" Number of bytes per bin = %d\n", bpb);
if (span > 1) printf (" Bin compression factor = %d\n", span);
if (dt_or_dts != 0)
printf (" Dead-Time = %u\n", dt_or_dts);
}else if ((mode & ~SQHM__SUB_MODE_MSK) == SQHM__TOF) {
nh = ntohs (Rply_buff.u.status.n_hists);
printf (" Number of counters = %d\n", nh);
printf (" Number of bins per histogram = %d\n", bph);
printf (" Number of bytes per bin = %d\n", bpb);
if (span > 1) printf (" Time span per bin = %d\n", span);
if (dt_or_dts != 0)
printf (" Delay-Time-to-Start = %u\n", dt_or_dts);
}else if ((mode & ~SQHM__SUB_MODE_MSK) == SQHM__HM_PSD) {
}else if ((mode & ~SQHM__SUB_MODE_MSK) == SQHM__TRANS) {
printf (" Number of buffers = %d\n", nh);
printf (" Current buffer = %d\n", ch);
printf (" Number of bytes per buffer = %d\n", bph);
}
printf (" Number of active connections = %d\n",
Rply_buff.u.status.act_srvrs);
if (Rply_buff.u.status.daq_now == 0) {
printf (" Data acquisition is active\n");
}else {
printf (" Data acquisition is not active\n");
}
if ((tsi_status != 0) || (tsi_flags != 0)) {
if (tsi_flags != 0) {
printf (" TSI Flags = 0x%04x", tsi_flags);
if ((tsi_flags & STATUS_FLAGS__PF) != 0) printf ("/PF");
if ((tsi_flags & STATUS_FLAGS__SWC) != 0) printf ("/SWC");
if ((tsi_flags & STATUS_FLAGS__NRL) != 0) printf ("/NRL");
if ((tsi_flags & STATUS_FLAGS__DAQ) != 0) printf ("/DAQ");
if ((tsi_flags & STATUS_FLAGS__SYNC3) != 0) printf ("/SYNC3");
if ((tsi_flags & STATUS_FLAGS__SYNC2) != 0) printf ("/SYNC2");
if ((tsi_flags & STATUS_FLAGS__SYNC1) != 0) printf ("/SYNC1");
if ((tsi_flags & STATUS_FLAGS__SYNC0) != 0) printf ("/SYNC0");
if ((tsi_flags & STATUS_FLAGS__UD) != 0) printf ("/UD");
if ((tsi_flags & STATUS_FLAGS__GU) != 0) printf ("/GU");
}
printf ("\n");
}
if (num_bad_ev != 0)
printf (" Number-of-Bad-Events = %u\n", num_bad_ev);
}
}
/*
** Close the connection.
*/
status = close (cnct_skt);
if ((status != 0) && (errno != ECONNRESET))
FailInet ("\nsinqhm_ctrl -- close error");
return EXIT_SUCCESS;
/*============================================================================*/
stop:
/*==== Stop. Get SinqHM-filler to stop taking data.
*/
printf (" Stopping data acquisition ..."); fflush (NULL);
Req_buff.bigend = htonl (0x12345678);
Req_buff.cmnd = htonl (SQHM_DAQ);
Req_buff.u.daq.sub_cmnd = htonl (DAQ__STOP);
cnct_skt = open_socket (Rmt_host, Rmt_port);
if (cnct_skt <= 0) exit (EXIT_FAILURE);
status = send (cnct_skt, (char *) &Req_buff, sizeof (Req_buff), 0);
if (status == -1) FailInet ("\nsinqhm_ctrl -- send error");
if (status != sizeof (Req_buff)) {
printf ("sinqhm_ctrl -- wrong number of bytes sent: %d", status);
status = close (cnct_skt);
return EXIT_FAILURE;
}
/*
** Wait for the status response.
*/
status = getCheckStatusResponse (cnct_skt, &Rply_buff, sizeof (Rply_buff));
if (status == SUCCESS) {
daq_state_now = ntohs (Rply_buff.u.daq.daq_now);
daq_state_was = ntohs (Rply_buff.u.daq.daq_was);
filler_mask = ntohs (Rply_buff.u.daq.filler_mask);
server_mask = ntohs (Rply_buff.u.daq.server_mask);
if (daq_state_now != 0) {
if (daq_state_was == 0) {
printf (" done.\n");
}else {
printf (" done. It was already stopped!\n");
}
}else {
printf ("\n\007 Data acquisition is still enabled!\n"
" Daq-state-now is 0x%04x\n"
" Filler-mask is 0x%04x\n", daq_state_now, filler_mask);
}
}
/*
** Close the connection.
*/
status = close (cnct_skt);
if ((status != 0) && (errno != ECONNRESET))
FailInet ("\nsinqhm_ctrl -- close error");
return EXIT_SUCCESS;
/*============================================================================*/
zero:
/*==== Zero. Zero the complete histogram buffer
*/
Req_buff.bigend = htonl (0x12345678);
Req_buff.cmnd = htonl (SQHM_ZERO);
Req_buff.u.zero.hist_no = htonl (-1);
Req_buff.u.zero.first_bin = htonl (-1);
Req_buff.u.zero.n_bins = htonl (-1);
printf (" Zeroing the histogram memory buffer ..."); fflush (NULL);
cnct_skt = open_socket (Rmt_host, Rmt_port);
if (cnct_skt <= 0) exit (EXIT_FAILURE);
status = send (cnct_skt, (char *) &Req_buff, sizeof (Req_buff), 0);
if (status == -1) FailInet ("\nsinqhm_ctrl -- send error");
if (status != sizeof (Req_buff)) {
printf ("\nsinqhm_ctrl -- wrong number of bytes sent: %d", status);
status = close (cnct_skt);
return EXIT_FAILURE;
}
/*
** Wait for the status response.
*/
status = getCheckStatusResponse (cnct_skt, &Rply_buff, sizeof (Rply_buff));
if (status == SUCCESS) {
printf (" done.\n");
}
/*
** Close the connection.
*/
status = close (cnct_skt);
if ((status != 0) && (errno != ECONNRESET))
FailInet ("\nsinqhm_ctrl -- close error");
return EXIT_SUCCESS;
}
/*================================================ End of SINQHM_CTRL.C =====*/