/* Parse5A.h * Revised: 2005 May 09, JAB */ #ifndef PARSE5A #define PARSE5A #define MAXSCANS 1024 /* Maximum number of scans in SDir */ #define MAXLENGTH 64 /* Maximum length of a scan's extended name +1 */ #define MAXNAME 128 /* Maximum length of a file name */ #define BUFFL 249856 /* Buffer length for XLRRead(), long words */ /* To cover 5 * 2520 * 9 / 8 * 64 = 907200 bytes, worst case. * That's five track frames for 64 tracks VLBA with parity. * 249856 long words is 999424 (16384 * 61) SS bytes. * We need to keep this under 1000000 bytes for the present * version of scan_check and for the Field System, each of * which backs up 1000000 bytes from the end of a scan. */ #define SOCBUF 131072 /* To send() to socket, bytes */ /* (To match the socket buffer??) */ #define SSPAT 0x11223344 /* SS Test patterns */ #define SERIAL FALSE /* Use RS-232 serial port? */ #define FILL_PATTERN 0x11223344 #define _GNU_SOURCE 1 /* GNU extensions (e.g., strcasestr()) */ #define DSKIP 2.0 /* Duration of net2out skip, seconds */ #define DOT "." /* Dot */ #define UNL "_" /* Underline */ #define SYNC 0xabaddeed /* Mark5B: A bad deed? */ #define CYCLE 32767L /* = 2^15 - 1 for TVG */ #define MAXWD 5010 /* Mark5B: Maximum number of words to search for SYNC */ /* (That's two full frames plus) */ #include #include #include /* For toupper(), isalpha(), etc. */ #include /* For atoi(), etc. */ #include /* For stat() and open() */ #include /* For socket() and connect() */ #include /* For socket() with PF_INET */ /* For ntohl(), ntohs(), etc. */ // #include /* For IP_MTU in getsockopt() */ #define IP_MTU 14 /* From */ #include /* For struct sockaddr_ll */ #include /* For getservbyname() and gethostbyname() */ #include /* For gethostname() and close() */ #include /* For perror(), etc. */ extern int h_errno; /* From gethostbyname() for herror() */ #include /* For stat() and open() */ #include /* For open() */ #include /* For gettimeofday() */ #include /* For ftime() */ #include /* For localtime() */ #include /* For ABS(), TRUE, etc. */ #include /* For pthread_create() */ #include /* For fabs() */ double fabs(double x); /* Why isn't this in ? */ #include /* For poll() in Net2out() */ #include /* For semaphores with multi-buffer FIFO */ /* For Conduant XLR functions: */ #include "xlrapi.h" /* Needs also xlrtypes.h */ /* N.B.: Adding "-I ." on the gcc line should get xlrapi.h, xlrtypes.h * because these have symbolic links in ~/C * You'll need either "-L . -lssapi -lpthread" to include StreamStor or * stubs5A.c otherwise */ /* * My stuff follows * */ struct Dict { /* Dictionary entry */ char * key; /* Keyword name */ char * (* fun)(); /* Function to do it */ }; #define SET 2 #define GET 3 struct outB { /* Output board parameters */ char mode[8]; /* vlbi, st, tvr, or ? */ double freq; /* Clock frequency, MHz */ int active; /* TRUE or FALSE */ int synced; /* TRUE or FALSE */ int trka; /* Decoder channel A */ int trkb; /* Decoder channel B */ int tmode; /* VLBI track mode, 8, 16, 32, 64, or 0 if unknown */ int numrs; /* Number of re-syncs */ int throt; /* Throttled (recording suspend flag), TRUE of FALSE */ char formt[8]; /* mark4, vlba, tvr, or null if unknown */ }; extern struct outB outb; struct inB { /* Input board parameters */ char mode[8]; /* Input mode, vlbi, mark4, vlba, st, tvg, or test */ int ntracks; /* Number of tracks, 8, 16, 32, or 64 */ int notclock; /* No clock, TRUE or FALSE, normal FALSE */ int errb; /* Error bit(s) */ }; extern struct inB inb; struct SDir { /* Directory of recorded scans, etc. */ int nscans; /* Number of scans herein */ int n; /* Next scan to be accessed by "next_scan" */ char scanName[MAXSCANS][MAXLENGTH]; /* Extended name */ unsigned long long start[MAXSCANS]; /* Start byte position */ unsigned long long length[MAXSCANS]; /* Length in bytes */ unsigned long long recpnt; /* Record offset, bytes (not a pointer) */ long long plapnt; /* Play offset, bytes */ /* Beware: Some folks call these indices "pointers" */ double playRate; /* Playback clock rate, MHz */ /* (sizeof(struct SDir) must be less than XLR_MAX_UDIR_LENGTH) */ }; /* End of struct SDir */ extern struct SDir * sdir; struct LDir { /* Directory of last scans and file names, etc. */ char filenam[MAXNAME]; /* Default set by Set_scan() */ char d2ffile[MAXNAME]; /* Last file name written by Disc_2file() */ char f2dfile[MAXNAME]; /* Last file name read by File2disc() */ int scann; /* Last scan in Set_scan() */ int reclstn; /* Last scan created by Record() */ int f2dlstn; /* Last scan created by File2disc() */ int n2dlstn; /* Last scan created by Net2disc() */ int i2ndoing; /* What In2net() is doing */ int d2ndoing; /* What Disc2net() is doing */ int n2ddoing; /* What Net2disc() is doing */ int n2odoing; /* What Net2out() is doing */ int d2fdoing; /* What Disc2file() is doing */ int f2ddoing; /* What File2disc() is doing */ /* Boolean status info: */ int iob; /* Do we have an I/O board? */ int mounted; /* Are disks mounted? */ int bmode; /* Bank mode? */ int abmode; /* Auto-switching-banks mode? */ int dfifo; /* Disk-FIFO mode? */ int delayed; /* Delayed completion pending? */ int recording; /* Should we be recording? */ int playing; /* Should we be playing? */ int scanplaying; /* Should be be scan_playing? */ int doOff; /* Do offPlay() on halted? */ int dsmask; /* Disk-state mask for DMS updates */ }; /* End of struct LDir */ extern struct LDir ldir; typedef struct date { /* From mk4_typedefs.h */ short year; short day; /* Of the year */ short hour; short minute; double second; /* (Formerly float) */ } date_struct; struct DTim { /* Information for data_time */ struct date timet; /* Data time from header */ unsigned long long offset; /* Byte offset to frame header */ double timep; /* Track frame period in seconds */ unsigned long long period; /* Track frame period in bytes */ }; /* End of struct DTim */ struct Vsn { /* VSN plus serial numbers, etc. */ char vsn[64]; /* VSN */ S_DRIVEINFO dinfo[8]; /* Model, Serial, etc. */ }; /* End of struct Vsn */ struct Header { /* Mark5B: Decoded frame headers */ unsigned short userspec; /* User-specified 16 bits */ int t; /* T bit, presumably TRUE or FALSE */ unsigned short frameno; /* Frame# within second (starting at 0) */ char tcword1[10]; /* VLBA BCD Time Code Word 1 ('JJJSSSSS') */ char tcword2[6]; /* VLBA BCD Time Code Word 2 (.'SSSS') */ unsigned short crcc; /* 16-bit CRCC */ }; /* End of struct Header */ extern struct Header header, header0, header64; /* Mark5B */ extern struct Vsn * pvsn; extern XLR_ERROR_CODE error; /* Return from error request */ extern char messg[XLR_ERROR_LENGTH]; /* Error message as a string */ extern struct DTim dattime; extern SSHANDLE dev; /* xlrDevice */ extern UINT indx; extern S_DIR dir; /* Directory */ extern S_DRIVEINFO dinfo[]; /* Drive information */ extern S_DRIVESTATS dstats[]; /* Drive stats */ extern S_DEVINFO devinfo; /* Device information */ extern S_READDESC readdesc; /* Read description */ extern S_XLRSWREV swrev; /* Software and firmware versions, etc. */ extern S_BANKSTATUS bkstat; /* Bank status */ extern S_DEVSTATUS devstatus; /* Device status, devStatus */ extern int drive; /* SS drive number, 0 ... 15 */ extern unsigned long rbuff[4 * BUFFL]; /* Read buffer */ extern unsigned long long * rbuf; /* From calloc() for FIFO buffers */ /* (Do not confuse rbuff[] and rbuf[]) */ extern unsigned int socbuf; /* Size of buffer to send to socket, bytes */ extern int nbuf; /* Number of socbuf-size blocks in rbuf[] FIFO */ extern int wind; /* Write block index into rbuf[] */ extern int rind; /* Read block index into rbuf[] */ extern unsigned long task_id; /* Which task now? */ extern int ports[]; /* Sockets */ extern FILE * fports[]; /* Each of ports[] open also as a stream */ extern UINT bank; /* Which bank */ extern volatile int datah; /* Status of ports[0], data socket, if any */ extern unsigned int sndbufs; /* Socket send buffer size, bytes */ extern unsigned int rcvbufs; /* Socket receive buffer size, bytes */ extern unsigned long long startbyte; /* Used by disc2net, etc. */ extern unsigned long long endbyte; extern unsigned long long nowbyte; extern unsigned long long orpntr; /* Old value of record pointer or nowbyte */ extern char * me; /* My name */ extern int msglev; /* Debug message level */ extern int forml; /* Formal parsing in Parse5A()? */ extern struct timeval tvROT; /* Time at which ROT is valid */ extern double rot; /* ROT at time tvROT */ extern double rot_rate; /* To be 32.0e6 * speed_up */ extern volatile unsigned short * idr; /* Input design revision, I/O board */ extern volatile unsigned short * odr; /* Output design revision, I/O board */ extern char * smod[]; /* For tcp or udp */ extern sem_t semtoX; /* Semaphore for toX() */ extern pthread_t threadtoX; /* For toX() */ extern sem_t semXto; /* Semaphore for Xto() */ extern pthread_t threadXto; /* For Xto() */ // extern unsigned long inbuf[MAXWD + 6]; /* Mark5B: Input buffer */ extern unsigned long * inbuf; /* Mark5B: Input buffer */ extern unsigned long * pdata; /* Mark5B: Input data */ extern int found; /* 0 = not found, 1 = Mark-5A board, 2 = Mark-5B */ char * Parse5A(char * instring); /* Parse input string, return answer */ int checkDisks(); /* Check disks and get disk info */ int outBoard(int SoG); /* Set or get output board parameters */ int inBoard(int SoG); /* Set or get input board parameters */ int FFHeader(PS_READDESC prdesc, struct DTim * pdtime, int st, int ntracks, int trk); /* Decode some information from the track buffer */ int PatScan(PS_READDESC prdesc); /* Look for other patterns */ char * date2string(struct date ind); /* Date to string */ double AddTime(char * instring); /* Time string to add seconds */ int ScanInfo(); /* Get information (from start of a scan) */ int crcc(unsigned char * idata, int len, int mask, int cycl); /* CRCC */ unsigned long tvg(int init); /* Test-vector generator */ int errors(); /* For XLR errors */ int mksock(char * service, char * machine, int datahh); /* Make sockets */ int CheckBanks(); /* Check bank status, correct if necessary */ int setrot(); /* Set up to read ROT broadcasts */ void * Xto(void * null); /* Input data transfers */ void * toX(void * null); /* Output data transfers */ int readdir(); /* Read directory from SS disks */ int writedir(); /* Write directory to SS disks */ int offPlay(); /* Housekeeping after play is halted */ extern "C" { /* From FORTRAN */ void daze_(int * year, int * day, int * mo, int * mda, int * nwd, int * juld); void dazl_(int * juld, int * nyr, int * mo, int * nda, int * nyrd, int * nwd); } #endif