y
Larry Campbell
campbell at maynard.UUCP
Sun Sep 14 12:44:29 AEST 1986
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
# data.c
# date.c
# delete.c
# diagnostic.c
# dump.c
# fdump.c
# finfo.c
# fload.c
# info.c
# getslot.c
# message.c
# miniexch.c
# monitor.c
# prints.c
# readid.c
# reset.c
# schedule.c
# setclock.c
# tty.c
# unit.c
# x10.c
# xread.c
# This archive created: Sat Sep 13 22:38:59 1986
export PATH; PATH=/bin:/usr/bin:$PATH
if test -f 'data.c'
then
echo shar: "will not over-write existing file 'data.c'"
else
cat << \SHAR_EOF > 'data.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#include <ctype.h>
#include "x10.h"
extern int tty;
extern char flag;
extern struct hstruct
housetab[];
c_data(argc, argv)
char *argv[];
{
unsigned datano, id, unit;
unsigned char buf[6];
char hletter;
int n, hcode;
if (argc != 5) usage(E_WNA);
/* parse the housecode */
hletter = argv[2][0];
if (isupper(hletter)) hletter = tolower(hletter);
for (n = 0, hcode = -1; n < 16; n++)
if (housetab[n].h_letter == hletter)
{
hcode = housetab[n].h_code;
break;
}
if (hcode == -1) error("invalid house code");
/* parse the unit number */
if (!sscanf(&argv[2][1], "%d", &unit) || unit < 1 || unit > 16)
error("bad unit number, must be between 1 and 16");
/* parse the description id */
if (!sscanf(argv[4], "%d", &id) || id < 1 || id > 255)
error("bad description id, must be a number between 1 and 255");
/* parse the state */
if (strcmp(argv[3], "on") == 0)
id |= 0x80;
else if (strcmp(argv[3], "off") == 0);
else error("bad state, must be 'on' or 'off'");
/* get first available slot number from the x10 */
datano = getslot(GETDATA);
/* get descriptions for all id's */
readid();
buf[0] = DATALOAD;
buf[1] = datano << 1;
buf[2] = datano >> 7 | 0x4;
buf[3] = hcode | unit - 1;
buf[4] = id;
buf[5] = 0;
for (n = 3; n < DICMD - 1; n++) /* compute checksum */
buf[DICMD - 1] += buf[n];
sendsync();
(void) write(tty, (char *) buf, sizeof(buf));
chkack();
flag = 0; /* header wanted */
pdata(&buf[3], datano); /* reassure user */
}
SHAR_EOF
fi
if test -f 'date.c'
then
echo shar: "will not over-write existing file 'date.c'"
else
cat << \SHAR_EOF > 'date.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#include <time.h>
#ifdef SYSV
#include <sys/types.h>
#endif
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <sys/param.h>
#include <sys/filsys.h>
#include "x10.h"
extern struct tm *localtime();
extern long lseek();
extern int
Idays,
Ihours,
Iminutes;
/* ARGSUSED */
c_date(argc, argv)
char *argv[];
{
struct filsys f;
int rf, today;
struct tm *tp;
if (argc != 2) usage(E_2MANY);
rf = open(ROOTNAME, 0);
if (rf < 0) error("can't open root filesystem");
if (lseek(rf, 512L, 0) == -1L) error("can't lseek on root");
if (read(rf, (char *) &f, 512) != 512) error("can't read root");
(void) close(rf);
if (f.s_time < 515000000L) error("root has unreasonable timestamp");
tp = localtime(&f.s_time);
today = dowX2U(Idays);
while (tp->tm_wday % 7 != today)
tp->tm_wday++, tp->tm_mday++;
#ifdef VENIX
(void) printf("%2d%02d%02d%02d%02d\n",
tp->tm_year, tp->tm_mon+1, tp->tm_mday, Ihours, Iminutes);
#else
(void) printf("%02d%02d%02d%02d%2d\n",
tp->tm_mon+1, tp->tm_mday, Ihours, Iminutes, tp->tm_year);
#endif
}
SHAR_EOF
fi
if test -f 'delete.c'
then
echo shar: "will not over-write existing file 'delete.c'"
else
cat << \SHAR_EOF > 'delete.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#include "x10.h"
extern int tty;
c_delete(argc, argv)
char *argv[];
{
register unsigned cmdsize, n, arg;
unsigned number;
char buf[12];
if (argc < 4) usage(E_NMA);
if (strncmp(argv[2], EVENTS, sizeof(EVENTS) - 2) == 0)
cmdsize = EVCMD;
else if (strcmp(argv[2], DATA) == 0)
cmdsize = DICMD;
else error("unknown delete request");
buf[0] = DATALOAD;
for (arg = 3; arg < argc; arg++)
{
if (!sscanf(argv[arg], "%d", &number))
(void) fprintf(stderr,
"ignored non-numeric event number\n");
if (cmdsize == EVCMD)
{
if (number > ETOTAL - 1)
{
(void) fprintf(stderr,
"ignored event number greater than 127\n");
continue;
}
buf[1] = number << 3;
buf[2] = (number >> 5) & 0x3;
}
else
{
if (number > DTOTAL - 1)
{
(void) fprintf(stderr,
"ignored data slot number greater than 255\n");
continue;
}
buf[1] = number << 1;
buf[2] = (number >> 7) | 0x4;
}
for (n = 3; n < cmdsize; n++)
buf[n] = 0;
sendsync();
(void) write(tty, buf, cmdsize);
chkack();
}
}
SHAR_EOF
fi
if test -f 'diagnostic.c'
then
echo shar: "will not over-write existing file 'diagnostic.c'"
else
cat << \SHAR_EOF > 'diagnostic.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#include "x10.h"
extern int tty, timeout;
/* ARGSUSED */
c_diagnostic(argc, argv)
char *argv[];
{
char buf[1];
if (argc != 2) usage(E_2MANY);
buf[0] = DIAGNOSE;
sendsync();
(void) write(tty, buf, 1);
timeout = DTIMEOUT;
chkack();
timeout = TIMEOUT;
}
SHAR_EOF
fi
if test -f 'dump.c'
then
echo shar: "will not over-write existing file 'dump.c'"
else
cat << \SHAR_EOF > 'dump.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#include "x10.h"
extern char flag;
extern int tty, timeout;
extern int pevent();
extern int pdata();
extern struct id id[];
c_dump(argc, argv)
char *argv[];
{
if (argc != 3) usage(E_WNA);
if (strcmp(argv[2], EVENTS) == 0)
dumpcontents(pevent, GETEVENTS);
else if (strcmp(argv[2], DATA) == 0)
dumpcontents(pdata, GETDATA);
else if (strcmp(argv[2], "all") == 0)
{
dumpcontents(pdata, GETDATA);
(void) putchar('\n');
dumpcontents(pevent, GETEVENTS);
}
else error("unknown dump request");
}
dumpcontents(handler, type)
int (*handler) ();
{
register unsigned i, total;
register scnt, dcnt;
char *msgstr;
unsigned char buf[8];
unsigned n, cksum, count;
flag = 0; /* set print header indicator */
if (type == GETEVENTS)
{
scnt = ETOTAL;
dcnt = ESIZE;
msgstr = EVENTS;
}
else
{
readid();
scnt = DTOTAL;
dcnt = DSIZE;
msgstr = DATA;
}
sendsync();
buf[0] = type;
(void) write(tty, (char *) buf, 1);
getsync();
n = xread(tty, buf, 1, timeout);
if (n != 1) error("UPLOAD: no response");
cksum = 0;
count = 0;
total = 0;
for (i = 0; i < scnt; i++)
{
n = xread(tty, buf, 1, timeout);
if (n != 1) error("UPLOAD: reply truncated");
total++;
if (buf[0] == 0xFF) continue;
n = xread(tty, &buf[1], dcnt - 1, timeout);
if (n != dcnt - 1) error("UPLOAD: information truncated");
for (n = 0; n < dcnt; n++)
cksum += buf[n];
(*handler) (buf, i, dcnt);
count++;
}
n = xread(tty, buf, 1, timeout);
if (n != 1) error("UPLOAD: checksum not received");
if (count && (cksum & 0xFF) != buf[0]) error("UPLOAD: bad checksum received");
if (! count)
(void) printf("No %s currently stored in interface (%d replies)\n",
msgstr, total);
}
SHAR_EOF
fi
if test -f 'fdump.c'
then
echo shar: "will not over-write existing file 'fdump.c'"
else
cat << \SHAR_EOF > 'fdump.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#include "x10.h"
int dcontents();
c_fdump(argc, argv)
char *argv[];
{
if (argc != 3) usage(E_WNA);
if (strcmp(argv[2], EVENTS) == 0)
dumpcontents(dcontents, GETEVENTS);
else if (strcmp(argv[2], DATA) == 0)
dumpcontents(dcontents, GETDATA);
else error("unknown fdump request");
}
dcontents(buf, i, n)
unsigned char *buf;
unsigned i, n;
{
(void) write(1, (char *) &i, sizeof(unsigned));
(void) write(1, (char *) buf, n);
}
SHAR_EOF
fi
if test -f 'finfo.c'
then
echo shar: "will not over-write existing file 'finfo.c'"
else
cat << \SHAR_EOF > 'finfo.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#include "x10.h"
struct evitem event;
struct ditem data;
c_finfo(argc, argv)
char *argv[];
{
if (argc != 3) usage(E_WNA);
if (strcmp(argv[2], EVENTS) == 0)
while (read(0, (char *) &event, EVSIZE) == EVSIZE)
{
if (event.e_buf[0] & 0xF0) error("invalid MODE field in file");
if (event.e_buf[1] & 0x80) error("invalid DAYS field in file");
if (event.e_buf[2] > 23) error("invalid HOUR field in file");
if (event.e_buf[3] > 59) error("invalid MINUTE field in file");
if (event.e_buf[6] & 0x0F) error("invalid HOUSECODE field in file");
pevent(event.e_buf, event.e_num);
}
else if (strcmp(argv[2], DATA) == 0)
{
readid();
while (read(0, (char *) &data, DISIZE) == DISIZE)
pdata(data.d_buf, data.d_num);
}
else error("unknown finfo request");
}
SHAR_EOF
fi
if test -f 'fload.c'
then
echo shar: "will not over-write existing file 'fload.c'"
else
cat << \SHAR_EOF > 'fload.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#include "x10.h"
extern int tty;
struct evitem event;
struct ditem data;
c_fload(argc, argv)
char *argv[];
{
unsigned char buf[12];
char *cptr;
register unsigned i, size, cmdsize;
if (argc != 3) usage(E_WNA);
if (strcmp(argv[2], EVENTS) == 0)
{
size = EVSIZE;
cmdsize = EVCMD;
cptr = (char *) &event;
}
else if (strcmp(argv[2], DATA) == 0)
{
size = DISIZE;
cmdsize = DICMD;
cptr = (char *) &data;
}
else error("unknown fload request");
while (read(0, cptr, size) == size)
{
buf[0] = DATALOAD;
if (size == EVSIZE)
{
if (event.e_buf[0] & 0xF0) error("invalid MODE field in file");
if (event.e_buf[1] & 0x80) error("invalid DAYS field in file");
if (event.e_buf[2] > 23) error("invalid HOUR field in file");
if (event.e_buf[3] > 59) error("invalid MINUTE field in file");
if (event.e_buf[6] & 0x0F) error("invalid HOUSECODE field in file");
buf[1] = event.e_num << 3;
buf[2] = (event.e_num >> 5) & 0x3;
for (i = 0; i < ESIZE; i++)
buf[i+3] = event.e_buf[i];
}
else
{
buf[1] = data.d_num << 1;
buf[2] = data.d_num >> 7 | 0x4;
buf[3] = data.d_buf[0];
buf[4] = data.d_buf[1];
}
buf[cmdsize - 1] = 0;
for (i = 3; i < cmdsize - 1; i++) /* compute checksum */
buf[cmdsize - 1] += buf[i];
sendsync();
(void) write(tty, (char *) buf, cmdsize);
chkack();
}
}
SHAR_EOF
fi
if test -f 'info.c'
then
echo shar: "will not over-write existing file 'info.c'"
else
cat << \SHAR_EOF > 'info.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#include "x10.h"
extern char hc2char();
extern int
Iloaded,
Idays,
Ihours,
Iminutes;
extern unsigned char
Ihcode;
extern char *wdays[];
/* ARGSUSED */
c_info(argc, argv)
char *argv[];
{
if (argc != 2) usage(E_2MANY);
if (Iloaded)
(void) printf("Interface clock: %s, %2d:%02d\n",
wdays[dowX2U(Idays)], Ihours, Iminutes);
else
(void) printf("Interface clock not yet set\n");
(void) printf("Housecode = %c\n", hc2char(Ihcode));
}
SHAR_EOF
fi
if test -f 'getslot.c'
then
echo shar: "will not over-write existing file 'getslot.c'"
else
cat << \SHAR_EOF > 'getslot.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#include "x10.h"
extern int
tty,
timeout;
getslot(type)
{
register scnt, dcnt;
unsigned char buf[8];
unsigned i, n, cksum, count;
int firstfree;
if (type == GETEVENTS)
{
scnt = ETOTAL;
dcnt = ESIZE;
}
else
{
scnt = DTOTAL;
dcnt = DSIZE;
}
sendsync();
buf[0] = type;
(void) write(tty, (char *) buf, 1);
getsync();
n = xread(tty, buf, 1, timeout);
if (n != 1) error("UPLOAD: no response");
cksum = 0;
count = 0;
firstfree = -1;
for (i = 0; i < scnt; i++)
{
n = xread(tty, buf, 1, timeout);
if (n != 1) error("UPLOAD: reply truncated");
if (buf[0] == 0xFF)
{
if (firstfree == -1) firstfree = i;
continue;
}
n = xread(tty, &buf[1], dcnt - 1, timeout);
if (n != dcnt - 1) error("UPLOAD: information truncated");
for (n = 0; n < dcnt; n++)
cksum += buf[n];
}
n = xread(tty, buf, 1, timeout);
if (n != 1) error("UPLOAD: checksum not received");
if (count && (cksum & 0xFF) != buf[0]) error("UPLOAD: bad checksum received");
if (firstfree == -1) error("No more storage slots available");
return(firstfree);
}
SHAR_EOF
fi
if test -f 'message.c'
then
echo shar: "will not over-write existing file 'message.c'"
else
cat << \SHAR_EOF > 'message.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#include "x10.h"
char *E_2MANY = EM_2MANY;
char *E_INVCN = EM_INVCN;
char *E_WNA = EM_WNA;
char *E_NMA = EM_NMA;
char *E_NOCMD = EM_NOCMD;
void exit();
usage(s)
char *s;
{
/*
* Don't combine the two calls to fputs or my compiler will
* gag with "token too long"
*/
(void) fprintf(stderr, "Command error: %s\n", s);
(void) fputs("Usage:\n\
x10 data ann on|off id store id with housecode a, unit nn and state\n\
x10 date returns date in date(1) input format\n\
x10 delete events|data nums deletes specified events or data slots\n\
x10 diagnostic run interface self-test diagnostics\n\
x10 dump events|data|all dumps events or data or both\n\
x10 fdump events|data dumps binary events or data to stdout\n", stderr);
(void) fputs("\
x10 finfo events|data displays contents of event or data file on stdin\n\
x10 fload events|data loads interface from event file on stdin\n\
x10 info gets current settings\n\
x10 monitor monitor X10 activity (end with <BREAK>)\n\
x10 reset [housecode] reset interface to 'A' or specified housecode\n\
x10 schedule ann[,nn...] mode [day] hh:mm on|off|dim [vv] schedule event\n\
x10 setclock sets X10 clock to system clock\n\
x10 unit ann[,nn...] on|off|dim [vv] turns unit nn, housecode a, to state\n\
", stderr);
exit(1);
}
error(s)
char *s;
{
(void) fprintf(stderr, "x10: %s\n", s);
quit();
}
SHAR_EOF
fi
if test -f 'miniexch.c'
then
echo shar: "will not over-write existing file 'miniexch.c'"
else
cat << \SHAR_EOF > 'miniexch.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#include <sgtty.h>
#include "x10.h"
extern int tty;
/*
* mxconnect(port)
*
* Connect to specified port on DEC Mini-Exchange
*/
#ifdef MINIEXCH
mxconnect(port)
{
static char
mx1[] = "//",
mx2[] = " P", /* port number goes here before P */
mx3[] = "\r";
#define PORTID mx2[0]
#define MXLEN sizeof(mxmsg)
#define MRLEN 5
#define MRACKOFFSET (MRLEN-1)
unsigned char
mxrply[MRLEN];
int n;
sleep(SMALLPAUSE);
PORTID = '0' + port;
(void) write(tty, mx1, 2);
sleep(SMALLPAUSE);
(void) write(tty, mx2, 2);
sleep(SMALLPAUSE);
(void) write(tty, mx3, 1);
n = xread(tty, mxrply, MRLEN, 3); /* 2-second timeout */
if (n != MRLEN)
{
(void) fprintf(stderr, "Mini-exchange replied with %d bytes\n", n);
for (n = 0; n < MRLEN; n++)
(void) fprintf(stderr, "reply[%2d] = 0x%x\n", n, mxrply[n]);
error("Mini-exchange timeout");
}
if (mxrply[MRACKOFFSET] != 'A') error("Port 3 busy or disconnected");
}
#endif
SHAR_EOF
fi
if test -f 'monitor.c'
then
echo shar: "will not over-write existing file 'monitor.c'"
else
cat << \SHAR_EOF > 'monitor.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
#include "x10.h"
extern int timeout;
void iquit();
jmp_buf mjb;
void iquit()
{
longjmp(mjb, 1);
}
c_monitor()
{
(void) signal(SIGINT, iquit);
timeout = 0;
if (setjmp(mjb))
return;
while (1)
chkrpt(1);
}
SHAR_EOF
fi
if test -f 'prints.c'
then
echo shar: "will not over-write existing file 'prints.c'"
else
cat << \SHAR_EOF > 'prints.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#ifdef SYSV
#include <string.h>
#else
#include <strings.h>
#endif
#include "x10.h"
extern char flag, hc2char();
extern struct nstruct dtab[];
extern struct hstruct housetab[];
extern struct id id[];
/*
* print unit numbers as specified in bitmap
* bitmap is jammed into int backwards from X10 manual depiction:
*
* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
*
* instead of
*
* 9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8
*/
punits(bitmap)
unsigned bitmap;
{
register nf, unitno, saveno, seq;
char c;
saveno = -1;
for (unitno = 1, nf = seq = 0; unitno <= 16; unitno++)
if ((1 << (16 - unitno)) & bitmap)
{
if (seq++) c = '-';
else c = ',';
if (saveno + 1 != unitno)
{
if (nf++) (void) printf("%c", c);
if (seq == 1) (void) printf("%d", unitno);
else (void) printf("%d,%d", saveno, unitno);
seq = 0;
}
saveno = unitno;
}
if (seq) (void) printf("-%d", saveno);
}
/*
* Names must have a capitalized first letter for mode2code().
* C_schedule() expects the first two modes listed to require
* an argument of specific days.
*/
struct nstruct
modnames[] =
{
"Normal", 0x08,
"Security", 0x09,
"Today", 0x04,
"Tomorrow", 0x02,
"", 0x00
},
funcnames[] =
{
"On", 0x02,
"Off", 0x03,
"DIM", 0x04,
"Dim", 0x05,
"", 0x00
};
/*
* Print out an event
*/
pevent(p, i)
unsigned i;
unsigned char p[];
{
char *modestr, *funcstr, *daystr, levelstr[8];
int j, mode, func;
/* decode mode */
mode = p[0] & 0x0F;
for (j = 0, modestr = NULL; modnames[j].n_code != 0; j++)
if (modnames[j].n_code == mode)
modestr = modnames[j].n_name;
if (modestr == NULL)
modestr = "Unknown";
/* decode state */
func = p[7] & 0x0F;
for (j = 0, funcstr = NULL; funcnames[j].n_code != 0; j++)
if (funcnames[j].n_code == func)
funcstr = funcnames[j].n_name;
if (funcstr == NULL)
funcstr = "Unknown";
if (func == 4 || func == 5)
{
(void) strcpy(levelstr, funcstr);
(void) sprintf(levelstr+3, " %2d", (p[7] >> 4) & 0x0f);
funcstr = levelstr;
}
/* decode days */
for (j = 0, daystr = NULL; dtab[j].n_code != 0; j++)
if (dtab[j].n_code == p[1])
daystr = dtab[j].n_name;
/* print timer event header first */
if (!flag)
(void) printf(
" EVENT STATE MODE DAYS TIME UNITS\n");
flag++; /* indicate header was printed */
/* print timer event */
(void) printf(" %3d %-7s %-8s %-9s %2d:%02d %c",
i, funcstr, modestr, daystr, p[2], p[3], hc2char(p[6]));
punits((p[4] << 8) | p[5]);
(void) printf("\n");
}
/*
* Print out graphics data
*/
pdata(p, i)
unsigned i;
unsigned char p[];
{
char hletter, ucode, *state, icode;
unsigned char hcode;
int j;
hcode = p[0] & 0xf0;
for (j = 0; housetab[j].h_code != hcode; j++);
hletter = housetab[j].h_letter;
ucode = (p[0] & 0x0f) + 1;
if (p[1] & 0x80) state = funcnames[0].n_name;
else state = funcnames[1].n_name;
icode = p[1] & 0x7f;
if (!flag)
(void) printf(" SLOT UNIT STATE ID DESCRIPTION\n");
flag++;
(void) printf(" %3d %c%-2d %-3s %03d %s\n",
i, hletter, ucode, state, icode, id[icode].describe);
}
SHAR_EOF
fi
if test -f 'readid.c'
then
echo shar: "will not over-write existing file 'readid.c'"
else
cat << \SHAR_EOF > 'readid.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#ifdef SYSV
#include <string.h>
#else
#include <strings.h>
#endif
#include "x10.h"
struct id id[DTOTAL];
readid()
{
register n, cnt = 0, c;
unsigned num;
char xfile[100];
int noskip;
FILE *idfile;
(void) strcat(strcpy(xfile, XDIR), IDFILE);
if ((idfile = fopen(xfile, "r")) == NULL)
{
(void) fprintf(stderr,
"Warning: cannot open description file %s\n", xfile);
return;
}
while(++cnt)
{
if (fscanf(idfile, "%d%*[ \t]", &num) == EOF)
break;
if (num < 1 || num > DTOTAL -1) (void) fprintf(stderr,
"Warning: id number out of range, ignored line %d in %s\n",
cnt, xfile), noskip = 0;
else noskip = 1;
for (n = 0; (c = fgetc(idfile)) != EOF; n++)
{
if (c == '\n') break;
if (n < DLENGTH - 1 && noskip)
id[num].describe[n] = (char) c;
}
if (n >= DLENGTH - 1) (void) fprintf(stderr,
"Warning: description truncated, line %d in %s\n",
cnt, xfile);
}
(void) fclose(idfile);
}
SHAR_EOF
fi
if test -f 'reset.c'
then
echo shar: "will not over-write existing file 'reset.c'"
else
cat << \SHAR_EOF > 'reset.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#include <ctype.h>
#include "x10.h"
extern int tty;
extern struct hstruct
housetab[];
/* ARGSUSED */
c_reset(argc, argv)
char *argv[];
{
int hcode, hletter, n;
char buf[2];
if (argc > 3) usage(E_WNA);
buf[0] = SETHCODE;
buf[1] = HC_A; /* default house code */
if (argc == 3)
{
hletter = argv[2][0];
if (isupper(hletter)) hletter = tolower(hletter);
for (n = 0, hcode = -1; n < 16; n++)
if (housetab[n].h_letter == hletter)
{
buf[1] = hcode = housetab[n].h_code;
break;
}
if (hcode == -1) error("invalid house code");
}
sendsync();
(void) write(tty, buf, 2);
chkack();
}
SHAR_EOF
fi
if test -f 'schedule.c'
then
echo shar: "will not over-write existing file 'schedule.c'"
else
cat << \SHAR_EOF > 'schedule.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#include <ctype.h>
#include "x10.h"
extern int tty;
extern char flag;
extern struct hstruct
housetab[];
c_schedule(argc, argv)
char *argv[];
{
register n;
int bits, daybits = 0, hcode, dim, mode;
unsigned eventno, hh, mm;
unsigned char buf[12];
char hletter;
if (argc < 6 || argc > 8) usage(EM_WNA);
/* parse the housecode */
hletter = argv[2][0];
if (isupper(hletter)) hletter = tolower(hletter);
for (n = 0, hcode = -1; n < 16; n++)
if (housetab[n].h_letter == hletter)
{
hcode = housetab[n].h_code;
break;
}
if (hcode == -1) error("invalid house code");
/* parse the unit numbers */
bits = getunits(&argv[2][1]);
/* parse the mode */
n = 3; /* used because argv[4] to argv[8] can vary by one */
mode = mode2code(argv[n++]);
/* parse the day if mode requires it */
if (flag < 2) /* first two modes require days */
daybits = day2bits(argv[n++]);
/* parse the time */
if (sscanf(argv[n++], "%d:%d", &hh, &mm) != 2)
error("bad time format");
if (hh > 23) error("bad hours, must be between 0 and 23");
if (mm > 59) error("bad minutes, must be between 0 and 59");
/* parse the state */
dim = dimstate(argv[n], argc == n+2 ? argv[n+1] : "");
/* get first available event number from the X10 */
eventno = getslot(GETEVENTS);
buf[0] = DATALOAD;
buf[1] = eventno << 3;
buf[2] = (eventno >> 5) & 0x3;
buf[3] = mode;
buf[4] = daybits;
buf[5] = hh;
buf[6] = mm;
buf[7] = bits >> 8;
buf[8] = bits & 0xFF;
buf[9] = hcode;
buf[10]= dim;
buf[11]= 0;
for (n = 3; n <= 10; n++) /* compute checksum */
buf[11] += buf[n];
sendsync();
(void) write(tty, (char *) buf, sizeof(buf));
chkack();
flag = 0; /* header wanted */
pevent(&buf[3], eventno); /* reassure user */
}
SHAR_EOF
fi
if test -f 'setclock.c'
then
echo shar: "will not over-write existing file 'setclock.c'"
else
cat << \SHAR_EOF > 'setclock.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#include <time.h>
#include "x10.h"
extern struct tm *localtime();
extern long time();
extern int tty;
extern char *wdays[];
/* ARGSUSED */
c_setclock(argc, argv)
char *argv[];
{
unsigned char data[5];
struct tm *tp;
long dtime;
if (argc != 2) usage(E_2MANY);
dtime = time((long *) 0);
tp = localtime(&dtime);
data[0] = SETCLK;
data[1] = tp->tm_min;
data[2] = tp->tm_hour;
data[3] = dowU2X(tp->tm_wday);
data[4] = CHKSUM(data);
sendsync();
(void) write(tty, (char *) data, 5);
chkack();
(void) printf("X10 clock set to %s, %d:%02d\n",
wdays[tp->tm_wday], tp->tm_hour, tp->tm_min);
}
SHAR_EOF
fi
if test -f 'tty.c'
then
echo shar: "will not over-write existing file 'tty.c'"
else
cat << \SHAR_EOF > 'tty.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#ifndef SYSV
#include <sgtty.h>
#else
#include <termio.h>
#endif
#include "x10.h"
void exit();
int tty = -1;
#ifndef SYSV
struct sgttyb
#else
struct termio
#endif
oldsb,
newsb;
setup_tty()
{
tty = open(DEVNAME, 2);
if (tty < 0) error("can't open terminal line (line probably in use)");
#ifndef SYSV
(void) ioctl(tty, TIOCFLUSH, (struct sgttyb *) NULL);
(void) ioctl(tty, TIOCGETP, &oldsb);
newsb = oldsb;
newsb.sg_flags |= RAW;
newsb.sg_flags &= ~(ECHO|EVENP|ODDP);
hangup();
newsb.sg_ispeed = newsb.sg_ospeed = B600; /* raise DTR & set speed */
(void) ioctl(tty, TIOCSETN, &newsb);
#else
(void) ioctl(tty, TCGETA, &oldsb);
newsb = oldsb;
newsb.c_lflag &= ~(ICANON | ECHO | ECHONL | ISIG);
newsb.c_oflag &= ~OPOST;
newsb.c_iflag &= ~(ISTRIP | IXON | IXOFF);
newsb.c_cflag &= ~(CBAUD | PARENB);
newsb.c_cflag |= (B600 | CS8 | CREAD);
newsb.c_cc[VEOF] = 1;
newsb.c_cc[VEOL] = 0;
(void) ioctl(tty, TCSETAF, &newsb);
#endif
}
restore_tty()
{
#ifndef SYSV
hangup();
(void) ioctl(tty, TIOCSETN, &oldsb);
#else
(void) ioctl(tty, TCSETAF, &oldsb);
#endif
}
#ifndef SYSV
hangup()
{
newsb.sg_ispeed = newsb.sg_ospeed = B0; /* drop DTR */
(void) ioctl(tty, TIOCSETN, &newsb);
sleep(SMALLPAUSE);
}
#endif
quit()
{
if (tty == -1) exit(1);
restore_tty();
exit(1);
}
SHAR_EOF
fi
if test -f 'unit.c'
then
echo shar: "will not over-write existing file 'unit.c'"
else
cat << \SHAR_EOF > 'unit.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#include <ctype.h>
#include "x10.h"
extern int tty;
extern struct hstruct
housetab[];
c_unit(argc, argv)
char *argv[];
{
register n;
int hcode, hletter, dim, bits;
unsigned char buf[6];
if (argc < 4 || argc > 5) usage(E_WNA);
hletter = argv[2][0];
if (isupper(hletter)) hletter = tolower(hletter);
bits = getunits(&argv[2][1]);
for (n = 0, hcode = -1; n < 16; n++)
if (housetab[n].h_letter == hletter)
{
hcode = housetab[n].h_code;
break;
}
if (hcode == -1) error("invalid house code");
dim = dimstate(argv[3], (argc == 5) ? argv[4] : "");
buf[0] = DIRCMD;
buf[1] = dim;
buf[2] = hcode;
buf[3] = bits & 0xFF;;
buf[4] = bits >> 8;
buf[5] = CHKSUM(buf);
sendsync();
(void) write(tty, (char *) buf, sizeof(buf));
chkack();
chkrpt(0);
}
SHAR_EOF
fi
if test -f 'x10.c'
then
echo shar: "will not over-write existing file 'x10.c'"
else
cat << \SHAR_EOF > 'x10.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#include <ctype.h>
#ifdef SYSV
#include <string.h>
#else
#include <strings.h>
#endif
#include <time.h>
#include "x10.h"
extern long time();
extern struct tm *localtime();
extern struct nstruct modnames[];
extern int tty;
void sigtimer();
char hc2char();
char
syncmsg[SYNCN],
flag;
struct hstruct /* table to map housecodes into letters */
housetab[] =
{
{HC_A, 'a'}, {HC_B, 'b'}, {HC_C, 'c'}, {HC_D, 'd'},
{HC_E, 'e'}, {HC_F, 'f'}, {HC_G, 'g'}, {HC_H, 'h'},
{HC_I, 'i'}, {HC_J, 'j'}, {HC_K, 'k'}, {HC_L, 'l'},
{HC_M, 'm'}, {HC_N, 'n'}, {HC_O, 'o'}, {HC_P, 'p'}
};
char *wdays[] = {"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "<day not set>"};
unsigned char /* table to map unit numbers into unit bit mask */
maphibyt[] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
},
maplobyt[] =
{
0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
int
timeout = TIMEOUT,
Iloaded,
Iminutes,
Ihours,
Idays;
unsigned char
Ihcode;
extern int
c_data(),
c_date(),
c_delete(),
c_diagnostic(),
c_dump(),
c_fdump(),
c_finfo(),
c_fload(),
c_info(),
c_monitor(),
c_reset(),
c_schedule(),
c_setclock(),
c_unit();
struct cmdentry
{
char *cmd_name;
int (*cmd_routine) ();
} cmdtab[] =
{
"data", c_data,
"date", c_date,
"delete", c_delete,
"diagnostic", c_diagnostic,
"dump", c_dump,
"fdump", c_fdump,
"finfo", c_finfo,
"fload", c_fload,
"info", c_info,
"monitor", c_monitor,
"reset", c_reset,
"schedule", c_schedule,
"setclock", c_setclock,
"unit", c_unit,
"", NULL
};
main(argc, argv)
char *argv[];
{
register i;
int (*rtn) ();
struct cmdentry *c;
if (argc < 2) usage(E_NOCMD);
rtn = NULL;
for (c = cmdtab; c->cmd_routine != NULL; c++)
if (strcmp(argv[1], c->cmd_name) == 0)
{
rtn = c->cmd_routine;
break;
}
if (rtn == NULL) usage(E_INVCN);
setup_tty();
#ifdef MINIEXCH
mxconnect(MINIXPORT);
#endif
for (i = 0; i < SYNCN; i++)
syncmsg[i] = i < 11 ? 0xEF : 0xFF;
init();
(*rtn) (argc, argv);
restore_tty();
return 0;
}
/*
* Convert X10-style day of week (bit map, bit 0=monday, 6=sunday)
* to UNIX localtime(3) style day of week (integer, 0=sunday)
*/
dowX2U(b)
register char b;
{
register n;
for (n = 1; (! (b & 1)) && n < 8; n++, b = b >> 1)
;
if (n == 7) n = 0;
if (n == 8) n = 7;
return(n);
}
dowU2X(d)
register d;
{
if (d == 0) d = 7;
return(1 << (d-1));
}
init()
{
int n;
unsigned char buf[6];
sendsync();
(void) write(tty, "\004", 1); /* GETINFO command */
getsync();
n = xread(tty, buf, 6, timeout);
if (n != 6)
error("invalid Clock and Base Housecode message length");
if (CHKSUM(buf) != buf[5])
error("checksum error");
Iloaded = buf[0] & 1;
Iminutes = buf[1];
Ihours = buf[2];
Idays = buf[3];
Ihcode = buf[4];
}
chkack()
{
unsigned char buf[7];
int n;
n = xread(tty, buf, 7, timeout);
if (n != 7)
{
int i;
(void) fprintf(stderr, "chkack dump (%d bytes):\n", n);
for (i = 0; i < n; i++)
(void) fprintf(stderr, "buf[%d] = 0x%x\n", i, buf[i]);
error("timeout while awaiting ACK message");
}
}
/*
* Check command report ("Command Upload", the manual calls it).
* If argument supplied is non-zero, print the report in human-readable
* form.
*/
chkrpt(printflag)
{
static char *statetab[] = {"?", "?", "ON", "OFF", "DIM", "DIM", "?", "?"};
int n;
unsigned char buf[6];
long dtime;
struct tm *tp;
getsync();
n = xread(tty, buf, 6, timeout);
if (n != 6)
error("chkrpt: invalid event report length");
if (CHKSUM(buf) != buf[5])
{
(void) fprintf(stderr,
"Checksum computed: 0x%x, received: 0x%x\n", CHKSUM(buf), buf[5]);
error("chkrpt: checksum error");
}
if (! printflag) return;
dtime = time((long *) 0);
tp = localtime(&dtime);
(void) printf("%2d:%02d:%02d: housecode %c, units: ",
tp->tm_hour, tp->tm_min, tp->tm_sec, hc2char(buf[1] & 0xF0));
punits((buf[3] << 8) | buf[2]);
(void) printf(", state %s\n", statetab[buf[1] & 0x07]);
}
getsync()
{
unsigned char buf[RCVSYNC];
if (xread(tty, buf, RCVSYNC, timeout) < RCVSYNC)
error("Failed to get sync characters");
}
sendsync()
{
(void) write(tty, syncmsg, SYNCN);
}
chksum(buf, size)
unsigned char *buf;
{
register i, sum;
for (i = 1, sum = 0; i < (size-1); i++)
sum += buf[i];
return(sum & 0xFF);
}
char hc2char(code)
unsigned code;
{
register i;
for (i = 0; i < 16; i++)
if (housetab[i].h_code == code)
return (housetab[i].h_letter);
return('?');
}
/*
* Parse string of comma-separated unit numbers and return bitmap
* (big-endian) of units specified. '*' means "all units".
*/
getunits(p)
register char *p;
{
#define DIGBUFN 80
unsigned lobits, hibits, n, unit;
char digbuf[DIGBUFN];
lobits = 0;
hibits = 0;
while (*p)
{
if (*p == '*')
{
lobits = 0xFF;
hibits = 0xFF;
break;
}
for (n = 0; n < DIGBUFN && isdigit(*p); n++, p++)
digbuf[n] = *p;
digbuf[n] = '\0';
if ((unit = atoi(digbuf)) < 1 || unit > 16)
error("bad unit code, must be between 1 and 16");
lobits |= maplobyt[unit-1];
hibits |= maphibyt[unit-1];
if (*p)
if (*p != ',')
error("bad unit separator, use comma please");
else
p++;
}
return((lobits << 8) | hibits);
}
dimstate(p, level)
register char *p, *level;
{
unsigned levelnum;
if (strcmp(p, "on") == 0) return(2);
if (strcmp(p, "off") == 0) return(3);
if (strcmp(p, "dim") != 0) error("bad state keyword");
if (sscanf(level, "%d", &levelnum) == 0) error("dim value must be numeric");
if (levelnum > 15) error("dim value out of range, must be between 0 and 15");
timeout = DTIMEOUT;
return((levelnum << 4) | 5);
}
/* names must have first letter capitalized for day2bits() */
struct nstruct
dtab[] =
{
"Monday", 0x01,
"Tuesday", 0x02,
"Wednesday", 0x04,
"Thursday", 0x08,
"Friday", 0x10,
"Saturday", 0x20,
"Sunday", 0x40,
"Everyday", 0x7f,
"Weekdays", 0x1f,
"Weekend", 0x60,
"", 0x00
};
day2bits(p)
char *p;
{
char c, buf[4];
int n, mask, length;
n = 0;
while (n < 5)
if (c = *p++)
{
if (n) {if (isupper(c)) c = tolower(c);}
else if (islower(c)) c = toupper(c);
buf[n++] = c;
}
else
break;
buf[n] = '\0';
length = strlen(buf);
mask = 0;
for (n = 0; dtab[n].n_code != 0; n++)
{
if (strncmp(dtab[n].n_name, buf, length) == 0)
{
if (mask != 0) error("ambiguous day abbreviation");
mask = dtab[n].n_code;
}
}
if (mask == 0) error("bad day keyword");
return(mask);
}
mode2code(p)
char *p;
{
char *np, *sp;
int n, mode, pos;
sp = p;
for (mode = n = 0; *modnames[n].n_name != 0; n++)
{
p = sp;
np = modnames[n].n_name; /* names have first letter capitalized */
if ((isupper(*p) ? *p : toupper(*p)) != *np) continue;
for (p++, np++; *p; p++, np++)
if ((isupper(*p) ? tolower(*p) : *p) != *np) break;
if (*p == 0)
{
if (mode) error("ambiguous mode abbreviation");
mode = modnames[n].n_code;
pos = n;
}
}
if (mode == 0) error("bad mode keyword");
flag = pos; /* position of function name in table */
return(mode);
}
SHAR_EOF
fi
if test -f 'xread.c'
then
echo shar: "will not over-write existing file 'xread.c'"
else
cat << \SHAR_EOF > 'xread.c'
/*
* Copyright 1986 by Larry Campbell, 73 Concord Street, Maynard MA 01754 USA
* (maynard!campbell). You may freely copy, use, and distribute this software
* subject to the following restrictions:
*
* 1) You may not charge money for it.
* 2) You may not remove or alter this copyright notice.
* 3) You may not claim you wrote it.
* 4) If you make improvements (or other changes), you are requested
* to send them to me, so there's a focal point for distributing
* improved versions.
*
* John Chmielewski (tesla!jlc until 9/1/86, then rogue!jlc) assisted
* by doing the System V port and adding some nice features. Thanks!
*/
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
#include "x10.h"
unsigned alarm();
void sigtimer();
/*
* xread(fd, buf, count, timeout)
*
* Timed read. Works just like read(2) but gives up after
* timeout seconds, returning whatever's been read so far.
*/
static jmp_buf jb;
xread(fd, buf, count, timeout)
unsigned char *buf;
{
int total;
total = 0;
if (setjmp(jb))
return(total);
(void) signal(SIGALRM, sigtimer);
(void) alarm((unsigned) timeout);
while (count--)
{
if (read(fd, (char *) buf, 1) < 1)
{
(void) alarm(0);
(void) signal(SIGALRM, SIG_IGN);
return(total);
}
buf++;
total++;
}
(void) alarm(0);
(void) signal(SIGALRM, SIG_IGN);
return(total);
}
void
sigtimer()
{
longjmp(jb, 1);
}
SHAR_EOF
fi
exit 0
# End of shell archive
--
Larry Campbell The Boston Software Works, Inc.
ARPA: campbell%maynard.uucp at harvard.ARPA 120 Fulton Street, Boston MA 02109
UUCP: {alliant,wjh12}!maynard!campbell (617) 367-6846
More information about the Comp.sources.unix
mailing list