00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <stdio.h>
00011 #include <string.h>
00012 #include <unistd.h>
00013 #include <errno.h>
00014 #include <time.h>
00015 #include <assert.h>
00016
00017 #include "X10Interface.h"
00018 #include "BitOp.h"
00019 #include "SerialOp.h"
00020
00021
00022
00023 namespace rwil {
00024 using namespace BitOp;
00025 using namespace SerialOp;
00026 namespace X10 {
00027
00028
00029 void send_init()
00030 {
00031 int n=0;
00032 char buf[10];
00033 time_t temp;
00034
00035 temp = time(0);
00036
00037 if(fd==0)
00038 {
00039 open_port();
00040 configure_port();
00041 }
00042
00043 writetwo:
00044 sleep(1);
00045
00046 while(n<1)
00047 { n=write(fd, "\002", 1);
00048 if(n < 1) printf("Write \\x02 failed"); }
00049
00050
00051 buf[0]=0x20;
00052 while(buf[0]!=0x06)
00053 {
00054 if((time(0)-temp) > 5) return;
00055 n=read(fd, buf, 1);
00056 errno=0;
00057 if(buf[0]==0x15) goto writetwo;
00058
00059 }
00060 while((buf[0]!=CARRIAGE) &&(buf[0]!=0xa))
00061 {
00062 n=read(fd, buf, 1);
00063 if(buf[0]!=CARRIAGE && n ==1 &&(buf[0]!=0xa)) printf("Expected CARRIAGE got 0x%x\n", (int) buf[0]);
00064 if((time(0)-temp) > 5) return;
00065 }
00066 }
00067
00068
00069 void send_X10(char realhouse, char realnumber, char command)
00070 {
00071 int n, x;
00072 char buf[11];
00073 time_t temp;
00074 temp = time(0);
00075
00076 send_init();
00077
00078
00079
00080
00081 buf[0] = 0x63;
00082 buf[1] = realhouse;
00083 buf[2] = realnumber;
00084 buf[3] = command;
00085 buf[4] = 0x41;
00086
00087
00088
00089 n= write(fd, buf, 5);
00090 if(n!=5) printf("Write failed\n");
00091
00092 buf[2] = 0;
00093 while(buf[2] != command)
00094 {
00095 n = 0;
00096 while(n<5)
00097 {
00098 x= read(fd, buf+n, 1);
00099 if((time(0)-temp) > 5) return;
00100 if(x ==1)
00101 {
00102
00103 n++;
00104 }
00105 }
00106 }
00107 }
00108
00109
00110
00111
00112
00113
00114 int createCompAndAddSig(char* input, char *output, int inputlength)
00115 {
00116 int inPos= 0;
00117 int outPos = 0;
00118 int bitLength = inputlength;
00119
00120 SetBit(output, 0, 1);
00121 SetBit(output, 1, 1);
00122 SetBit(output, 2, 1);
00123 SetBit(output, 3, 0);
00124
00125 outPos = 4;
00126
00127 for(;inPos < bitLength; inPos++)
00128 {
00129 SetBit(output, outPos, input[inPos/8] & (1 << (7-inPos%8)) ? 1 : 0);
00130 outPos++;
00131 SetBit(output, outPos, input[inPos/8] & (1 << (7-inPos%8)) ? 0 : 1);
00132 outPos++;
00133 }
00134 return outPos;
00135 }
00136
00138 void send_Dim_X10(char realhouse, char realnumber, int percent)
00139 {
00140 char data[10], output[20], realout[20];
00141 int loc;
00142 int brightsend;
00143 time_t temp;
00144
00145 temp = time(0);
00146
00147 send_init();
00148
00149
00150 SetBits(data, 0, 4, realhouse - 0x40);
00151
00152 SetBits(data, 4, 5, 0x0F);
00153
00154
00155 SetBits(data, 9, 4, (realnumber - 0x40) >> 1);
00156
00157
00158 if(percent < 0) brightsend = 0;
00159 else if(percent > 100) brightsend = 0x3f;
00160 else brightsend = percent * 62 /100;
00161
00162
00163 SetBits(data, 13, 8, brightsend);
00164
00165 SetBits(data, 21, 8, 0x31);
00166
00167 send_arbitrary(data, 29);
00168
00169 loc = createCompAndAddSig(data, output, 29);
00170 SetBits(output, loc, 20, 0);
00171
00172
00173 memcpy(realout, "\x80\x09", 2);
00174 memcpy(realout+2, output, 10);
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187 }
00188
00189
00190 int stripSigAndCompress(char * input, char* output, int inputlength)
00191 {
00192 int inPos = 12;
00193 int outPos = 0;
00194
00195 for(;inPos < inputlength; inPos+=2)
00196 {
00197 SetBit(output, outPos, input[inPos/8] & (1 << (7-inPos%8)) ? 1 : 0);
00198 outPos++;
00199 }
00200 return outPos;
00201 }
00202
00203 void send_arbitrary(char data[10], int sizebits)
00204 {
00205 char output[25];
00206 int loc;
00207 time_t temp;
00208
00209 temp = time(0);
00210
00211 send_init();
00212
00213 loc = createCompAndAddSig(data, output + 2, sizebits);
00214 SetBits(output + 2, loc, 16, 0);
00215 output[0] = 0x80;
00216 output[1] = loc / 8 + 1;
00217
00218
00219 write(fd, output, loc / 8 + 4);
00220
00221 while(1)
00222 {
00223 if((time(0)-temp) > 5) return;
00224 loc = read(fd, data, 1);
00225 if((loc==1) && ((data[0] == CARRIAGE)|| (data[0] == 0xa)))
00226 break;
00227
00228 }
00229 }
00230
00231
00232
00233
00234
00235
00237
00238 {
00239 char data[10], output[250];
00240 int n;
00241 int loc;
00242 n=0;
00243 data[0] = 0;
00244 while(1)
00245 {
00246 loc = read(fd, data, 1);
00247 if(loc==1)
00248 {
00249
00250 if(data[0] == CARRIAGE)
00251 break;
00252 output[n] = data[0];
00253 n++;
00254 if(n>=bufSize*2) break;
00255 }
00256 }
00257
00258 return stripSigAndCompress(output, buffer, 8 * n);
00259 }
00260
00261
00262
00263
00264
00265 int get_status_X10(char realhouse, char realnumber)
00266 {
00267 char data[10], output[20], realout[20];
00268 int loc;
00269 int n;
00270 time_t temp;
00271
00272 temp = time(0);
00273
00274 send_init();
00275
00276
00277 SetBits(data, 0, 4, realhouse - 0x40);
00278
00279 SetBits(data, 4, 5, 0x0F);
00280
00281
00282 SetBits(data, 9, 4, (realnumber - 0x40) >> 1);
00283
00284
00285 SetBits(data, 13, 8, 0x00);
00286
00287 SetBits(data, 21, 8, 0x37);
00288
00289
00290 loc = createCompAndAddSig(data, output, 29);
00291 SetBits(output, loc, 20, 0);
00292
00293
00294 memcpy(realout, "\x80\x09", 2);
00295 memcpy(realout+2, output, 10);
00296
00297 write(fd, realout, 12);
00298
00299 while(1)
00300 {
00301 if((time(0)-temp) > 10) return -1;
00302 loc = read(fd, data, 1);
00303
00304 if((loc==1) && ((data[0] == CARRIAGE)|| (data[0] == 0xa)))
00305 break;
00306 }
00307
00308 n=0;
00309 data[0] = 0;
00310 while(1)
00311 {
00312 if((time(0)-temp) > 10) return -1;
00313 loc = read(fd, data, 1);
00314 if(loc==1)
00315 {
00316
00317 if((data[0] == CARRIAGE)|| (data[0] == 0xa))
00318 break;
00319 output[n] = data[0];
00320 n++;
00321 }
00322 }
00323 stripSigAndCompress(output, realout, 56);
00324
00325 return GetBits(realout, 15,6)*100/62;
00326 }
00327
00328 }
00329 }