Web Server and send X10 RF orders to X10 RF transceivers Switch On/Off Appliance No weather Rx at the moment...

Dependencies:   EthernetNetIf mbed HTTPServer

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers x10rf.cpp Source File

x10rf.cpp

00001 // Interface Lib to X10 RF transmiter
00002 
00003 #include "mbed.h"
00004 
00005 DigitalOut led_2(LED2, "led2");
00006 DigitalOut led_3(LED3, "led3");
00007 
00008 DigitalOut RF_TX(p19);
00009 DigitalOut RF_Alim(p18);
00010 
00011 void SendX10RF_bit(unsigned int databit);
00012 void SendX10byte(unsigned int data8);
00013 void SendX10Cmd(unsigned int data);
00014 void SendX10RF();
00015 
00016 
00017 //-----------------------------------------------------------------------------
00018 // http://idobartana.com/hakb/x10rf.htm
00019 // ftp://ftp.x10.com/pub/manuals/cm17a_protocol.txt
00020 unsigned int EncodeX10rf(char houseCode, int numberCode, int action)
00021 {// action : 1 : On, 0 : Off, 2 : BRIGHT , 3 : DIM
00022 unsigned int order, add;
00023     switch (houseCode)
00024         {
00025         case 'A' : order= 0x6000; break;
00026         case 'B' : order= 0xE000; break;
00027         case 'C' : order= 0x2000; break;
00028         case 'D' : order= 0xA000; break;
00029         case 'E' : order= 0x1000; break;
00030         case 'F' : order= 0x9000; break;
00031         case 'G' : order= 0x5000; break;
00032         case 'H' : order= 0xD000; break;
00033         case 'I' : order= 0x7000; break;
00034         case 'J' : order= 0xF000; break;
00035         case 'K' : order= 0x3000; break;
00036         case 'L' : order= 0xB000; break;
00037         case 'M' : order= 0x0000; break;
00038         case 'N' : order= 0x8000; break;
00039         case 'O' : order= 0x4000; break;
00040         case 'P' : order= 0xC000; break;
00041         }
00042     switch (numberCode)
00043         {
00044         case 1 : add= 0x0000; break;
00045         case 2 : add= 0x0010; break;
00046         case 3 : add= 0x0008; break;
00047         case 4 : add= 0x0018; break;
00048         case 5 : add= 0x0040; break;
00049         case 6 : add= 0x0050; break;
00050         case 7 : add= 0x0048; break;
00051         case 8 : add= 0x0058; break;
00052         case 9 : add= 0x0400; break;
00053         case 10: add= 0x0410; break;
00054         case 11: add= 0x0408; break;
00055         case 12: add= 0x0418; break;
00056         case 13: add= 0x0440; break;
00057         case 14: add= 0x0450; break;
00058         case 15: add= 0x0448; break;
00059         case 16: add= 0x0458; break;
00060         }
00061      order |= add;
00062     if (action==0) order |= 0x0020;
00063     return order;   
00064 }
00065 //-----------------------------------------------------------------------------
00066 void SendX10rf(char houseCode, int numberCode, int action)
00067 {   // action : 1 : On, 0 : Off, 2 : BRIGHT , 3 : DIM
00068     printf( "h=%c U=%d R=%d    Order=%X\r\n", houseCode, numberCode, action, EncodeX10rf(houseCode, numberCode, action));
00069 //    SendX10Cmd(0x6010);        // A2 ON
00070 //    SendX10Cmd(0x6000);        // A1 ON
00071     SendX10Cmd( EncodeX10rf(houseCode, numberCode, action));
00072 }
00073 //-----------------------------------------------------------------------------
00074 void SendX10RF_bit(unsigned int databit)
00075 {
00076     // envoi un 1
00077     RF_TX=1;
00078     wait_us(560);        // 0.56 ms
00079     RF_TX=0;
00080     wait_us(560);        // 0.56 ms
00081     // si c'est un 0
00082     if (!databit)        wait_us(1120);        // 0.56*2 = 1.12 ms si un zero
00083 }
00084 //-----------------------------------------------------------------------------
00085 void SendX10byte(unsigned int data8)
00086 {
00087 unsigned int j, k;
00088     for (j=0; j<8; j++)
00089         {
00090         k=(data8 & 0x0080 )==0x0080;
00091         SendX10RF_bit(k);
00092         data8=data8 << 1;
00093         }
00094 }
00095 //-----------------------------------------------------------------------------
00096 void SendX10Cmd(unsigned int data)
00097 {
00098 unsigned int Cmd8;
00099     RF_Alim=1;            // Alimente le transmetteur RE8=ON
00100 //    wait_ms(20);        // >20 ms
00101     wait_ms(10);        // >10 ms
00102     wait_ms(10);        // >10 ms
00103 // en-tête
00104     RF_TX=1;
00105     wait_us(8960);        // 8.96 ms
00106     RF_TX=0;
00107     wait_us(4500);        // 4.5 ms
00108     Cmd8=data>>8;                    // send les Hi
00109     SendX10byte(~Cmd8);
00110     SendX10byte(Cmd8);
00111     Cmd8=(data) & 0xFF;        // send les Low
00112     SendX10byte(~Cmd8);
00113     SendX10byte(Cmd8);
00114     SendX10RF_bit(1);            // 1 à la fin ??
00115     wait_us(1120);        // 1.12 ms
00116     RF_Alim=0;            // Eteint transmetteur RE8=OFF
00117 }
00118 //-----------------------------------------------------------------------------
00119 void SendX10RF()
00120 {
00121 //    SendX10Cmd(0x6000);        // A1 ON
00122 //    SendX10Cmd(0x6020);        // A1 OFF
00123     SendX10Cmd(0x6010);        // A2 ON
00124 //    SendX10Cmd(0x6030);        // A2 OFF
00125 //    SendX10Cmd(0x6090);        // A2 DIM+
00126 //    SendX10Cmd(0x60B0);        // A2 DIM-
00127 
00128 //http://idobartana.com/hakb/x10rf.htm
00129 //10101111 11011101 01010101 11011111 10101101 01010101 <-A1 OFF cmd (as seen on RF, RIGHT bit first !)
00130 //00000100 11111011 00000110 11111001    A1 OFF (as RIGHT bit first !)
00131 // byte 1   byte 2   byte 3   byte 4
00132 //bit  function
00133 //0    always 0
00134 //1    always 0
00135 //2    always 0                               
00136 //3    bit B1 of unit number
00137 //4    bit B0 of unit number    
00138 //5    1 for OFF command.                    DIM B2 ON/OFF B0 B1 <--(unit number -1= 0bB2B1B0  )
00139 //6    bit B2 of unit number ------------------>|
00140 //7    1 for DIM (if bit 5=1) or BRIGHT (if bit 5=0) command
00141 
00142 // à l'envers aussi mais bytes inversées
00143 //A- 00001 ON
00144 //00032: 11111001 00000110 11111111 00000000    0x6000
00145 //A- 00001 OFF
00146 //00032: 11111001 00000110 11111011 00000100    0x6020
00147 //A- 00002 ON
00148 //00032: 11111001 00000110 11110111 00001000    0x6080
00149 //A- 00002 OFF
00150 //00032: 11111001 00000110 11110011 00001100    0x60C0
00151 //A- 00002 DIM+
00152 //00032: 11111001 00000110 11110111 00001000    0x6090
00153 //http://camelspit.org/modified-x10-rf-transmitter/
00154 }
00155 //---------------------------------------------------------------------