typedef struct Msg Msg; typedef struct X10 X10; typedef struct Addr Addr; // device address typedef struct Dev Dev; // device /* * X10 messages */ enum { Dimmax = 22, // 100% dims Ndevs = 16, // Msg.hdr: dim:Hsync:Hfunc|Haddr:Hext|Hstd Hsync = 0x4, Hfunc = 0x2, Haddr = 0x0, Hext = 0x1, Hstd = 0x0, // Extended msg header Xhdr = Hsync|Hfunc|Hext, // Msg.code: :| // X10 Functions Falloff = 0x0, Flightson = 0x1, Fon = 0x2, Foff = 0x3, Fdim = 0x4, Fbright = 0x5, Flightsoff = 0x6, Fext = 0x7, Fhailreq = 0x8, Fhailack = 0x9, Fpsdim1 = 0xa, Fpsdim2 = 0xb, Fextxfer = 0xc, Fstson = 0xd, Fstsoff = 0xe, Fstsreq = 0xf, Fmax, }; struct Msg{ uchar hdr; union { // regular message struct { uchar code; }; // extended message struct { uchar func; uchar unit; uchar data; uchar cmd; }; }; }; enum { // PC requests/replies Pack = 0x00, // sum ok Ppoll = 0xc3, // Ok to upload Ptmr = 0x9b, // Timer download Psts = 0x8b, // CM11 sts request Peeprom = 0xfb, // starting to download eeprom Pringe = 0xeb, // enable the ring Pringd = 0xdb, // disable the ring // Interface requests/replies Irtr = 0x55, // ready to receive Itmr = 0xa5, // set timer (power fail) Ipoll = 0x5a, // poll to PC (upload events) // eeprom Eblksz = 16, // download block data size }; /* * X10 user interface */ struct Addr { uchar hc; // house code uchar dc; // device code, if != 0 }; struct Dev { Addr; int on; int dim; }; extern char* x10fnames[]; extern int debug; extern int interactive; extern char logf[]; X10* x10open(char* dev, char hc); void x10close(X10* x); void x10print(int fd, X10* x); int x10req(X10* x, Msg* m); int x10reqaddr(X10* x, char hc, char dc); int x10reqfunc(X10* x, int fn, int dim); int x10reqsts(X10* x); Dev* x10devs(X10* x); uchar dctoint(uchar c); uchar hctochr(uchar c); uchar inttodc(uchar dc); char* fntostr(uchar f); uchar chrtohc(uchar hc); /* * file system */ void fs(X10* p, char hc, char* conf, char* srv, char* mnt); void pfs(X10* p, char hc, char* conf); int runfunc(X10* x, int nargs, char** args); void cm11sprint(X10* x, char* buf, int len);