Advertisement
Guest User

Untitled

a guest
Mar 24th, 2015
532
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.33 KB | None | 0 0
  1. /*
  2.  * RemoteSwitch library v2.3.0 (20121229) made by Randy Simons http://randysimons.nl/
  3.  * See RemoteTransmitter.h for details.
  4.  *
  5.  * License: GPLv3. See license.txt
  6.  */
  7.  
  8. #include "RemoteTransmitter.h"
  9. #include "gpio.h"
  10. #include "user_config.h"
  11. #include "ets_sys.h"
  12. #include "osapi.h"
  13. #include "os_type.h"
  14. #include "user_interface.h"
  15. #include "driver/uart.h"
  16. #include "espconn.h"
  17. #include "mem.h"
  18. #include "user_config.h"
  19.  
  20. extern "C" void ets_delay_us(int us);
  21.  
  22. /************
  23. * RemoteTransmitter
  24. ************/
  25.  
  26. RemoteTransmitter::RemoteTransmitter(uint8_t pin, unsigned int periodusec, uint8_t repeats)
  27. {
  28.     _pin=pin;
  29.     _periodusec=periodusec;
  30.     _repeats=repeats;
  31.  
  32.     //Change to ESP8266 Call
  33.     //pinMode(_pin, OUTPUT);
  34.  
  35. }
  36.  
  37. unsigned long RemoteTransmitter::encodeTelegram(uint8_t trits[])
  38. {
  39.     unsigned long data = 0;
  40.  
  41.     // Encode data
  42.     for (uint8_t i=0;i<12;i++) {
  43.         data*=3;
  44.         data+=trits[i];
  45.     }
  46.  
  47.     // Encode period duration
  48.     data |= (unsigned long)_periodusec << 23;
  49.  
  50.     // Encode repeats
  51.     data |= (unsigned long)_repeats << 20;
  52.  
  53.     return data;
  54. }
  55.  
  56. void RemoteTransmitter::sendTelegram(uint8_t trits[])
  57. {
  58.     sendTelegram(encodeTelegram(trits),_pin);
  59. }
  60.  
  61. /**
  62. * Format data:
  63. * pppppppp|prrrdddd|dddddddd|dddddddd (32 bit)
  64. * p = perioud (9 bit unsigned int
  65. * r = repeats as 2log. Thus, if r = 3, then signal is sent 2^3=8 times
  66. * d = data
  67. */
  68. void RemoteTransmitter::sendTelegram(unsigned long data, uint8_t pin)
  69. {
  70.     unsigned int periodusec = (unsigned long)data >> 23;
  71.     uint8_t repeats = ((unsigned long)data >> 20) & 7;
  72.  
  73.     sendCode(pin, data, periodusec, repeats);
  74. }
  75.  
  76. void RemoteTransmitter::sendCode(uint8_t pin, unsigned long code, unsigned int periodusec, uint8_t repeats)
  77. {
  78.     code &= 0xfffff; // Truncate to 20 bit ;
  79.     // Convert the base3-code to base4, to avoid lengthy calculations when transmitting.. Messes op timings.
  80.     // Also note this swaps endianess in the process. The MSB must be transmitted first, but is converted to
  81.     // LSB here. This is easier when actually transmitting later on.
  82.     unsigned long dataBase4 = 0;
  83.  
  84.     for (uint8_t i=0; i<12; i++) {
  85.         dataBase4<<=2;
  86.         dataBase4|=(code%3);
  87.         code/=3;
  88.     }
  89.  
  90.     repeats = 1 << (repeats & 7); // repeats := 2^repeats;
  91.  
  92.     for (uint8_t j=0;j<repeats;j++) {
  93.         // Sent one telegram
  94.  
  95.         // Recycle code as working var to save memory
  96.         code=dataBase4;
  97.         for (uint8_t i=0; i<12; i++) {
  98.             switch (code & 3) {
  99.                 case 0:
  100.                     //digitalWrite(pin, HIGH);
  101.                     GPIO_OUTPUT_SET(pin, 1);
  102.                     //delayMicroseconds(periodusec);
  103.                     os_delay_us(periodusec);
  104.                     //digitalWrite(pin, LOW);
  105.                     GPIO_OUTPUT_SET(pin, 0);
  106.                     //delayMicroseconds(periodusec*3);
  107.                     os_delay_us(periodusec * 3);
  108.                     //digitalWrite(pin, HIGH);
  109.                     GPIO_OUTPUT_SET(pin, 1);
  110.                     //delayMicroseconds(periodusec);
  111.                     os_delay_us(periodusec);
  112.                     //digitalWrite(pin, LOW);
  113.                     GPIO_OUTPUT_SET(pin, 0);
  114.                     //delayMicroseconds(periodusec*3);
  115.                     os_delay_us(periodusec * 3);
  116.                     break;
  117.                 case 1:
  118.                     //digitalWrite(pin, HIGH);
  119.                     GPIO_OUTPUT_SET(pin, 1);
  120.                     //delayMicroseconds(periodusec*3);
  121.                     os_delay_us(periodusec * 3);
  122.                     //digitalWrite(pin, LOW);
  123.                     GPIO_OUTPUT_SET(pin, 0);
  124.                     //delayMicroseconds(periodusec);
  125.                     os_delay_us(periodusec);
  126.                     //digitalWrite(pin, HIGH);
  127.                     GPIO_OUTPUT_SET(pin, 1);
  128.                     //delayMicroseconds(periodusec*3);
  129.                     os_delay_us(periodusec * 3);
  130.                     //digitalWrite(pin, LOW);
  131.                     GPIO_OUTPUT_SET(pin, 0);
  132.                     //delayMicroseconds(periodusec);
  133.                     os_delay_us(periodusec);
  134.                     break;
  135.                 case 2: // KA: X or float
  136.                     //digitalWrite(pin, HIGH);
  137.                     GPIO_OUTPUT_SET(pin, 1);
  138.                     //delayMicroseconds(periodusec);
  139.                     os_delay_us(periodusec);
  140.                     //digitalWrite(pin, LOW);
  141.                     GPIO_OUTPUT_SET(pin, 0);
  142.                     //delayMicroseconds(periodusec*3);
  143.                     os_delay_us(periodusec * 3);
  144.                     //digitalWrite(pin, HIGH);
  145.                     GPIO_OUTPUT_SET(pin, 1);
  146.                     //delayMicroseconds(periodusec*3);
  147.                     os_delay_us(periodusec * 3);
  148.                     //digitalWrite(pin, LOW);
  149.                     GPIO_OUTPUT_SET(pin, 0);
  150.                     //delayMicroseconds(periodusec);
  151.                     os_delay_us(periodusec);
  152.                     break;
  153.             }
  154.             // Next trit
  155.             code>>=2;
  156.         }
  157.  
  158.         // Send termination/synchronization-signal. Total length: 32 periods
  159.         //digitalWrite(pin, HIGH);
  160.         GPIO_OUTPUT_SET(pin, 1);
  161.         //delayMicroseconds(periodusec);
  162.         os_delay_us(periodusec);
  163.         //digitalWrite(pin, LOW);
  164.         GPIO_OUTPUT_SET(pin, 0);
  165.         //delayMicroseconds(periodusec*31);
  166.         os_delay_us(periodusec * 31);
  167.     }
  168. }
  169.  
  170. int RemoteTransmitter::isSameCode(unsigned long encodedTelegram, unsigned long receivedData)
  171. {
  172.     return (receivedData==(encodedTelegram & 0xFFFFF)); // compare the 20 LSB's
  173. }
  174.  
  175. /************
  176. * KaKuTransmitter
  177. ************/
  178.  
  179. KaKuTransmitter::KaKuTransmitter(uint8_t pin, unsigned int periodusec, uint8_t repeats) : RemoteTransmitter(pin,periodusec,repeats)
  180. {
  181.     // Call constructor
  182. }
  183.  
  184. void KaKuTransmitter::sendSignal(char address, uint8_t device, int on)
  185. {
  186.     sendTelegram(getTelegram(address, device, on), _pin);
  187. }
  188.  
  189. unsigned long KaKuTransmitter::getTelegram(char address, uint8_t device, int on)
  190. {
  191.     uint8_t trits[12];
  192.  
  193.     address-=65;
  194.     device-=1;
  195.  
  196.     for (char i=0; i<4; i++) {
  197.         // Trits 0-3 contain address (2^4 = 16 addresses)
  198.         trits[i]=(address & 1)?2:0;
  199.         address>>=1;
  200.  
  201.         // Trits 4-8 contain device (2^4 = 16 addresses)
  202.         trits[i+4]=(device & 1)?2:0;
  203.         device>>=1;
  204.     }
  205.  
  206.     // Trits 8-10 seem to be fixed
  207.     trits[8]=0;
  208.     trits[9]=2;
  209.     trits[10]=2;
  210.  
  211.     // Switch on or off
  212.     trits[11]=(on?2:0);
  213.  
  214.     return encodeTelegram(trits);
  215. }
  216.  
  217. void KaKuTransmitter::sendSignal(char address, uint8_t group, uint8_t device, int on)
  218. {
  219.     sendTelegram(getTelegram(address, group, on), _pin);
  220. }
  221.  
  222. unsigned long KaKuTransmitter::getTelegram(char address, uint8_t group, uint8_t device, int on)
  223. {
  224.     uint8_t trits[12], i;
  225.  
  226.     address-=65;
  227.     group-=1;
  228.     device-=1;
  229.  
  230.     // Address. M3E Pin A0-A3
  231.     for (i=0; i<4; i++) {
  232.         // Trits 0-3 contain address (2^4 = 16 addresses)
  233.         trits[i]=(address & 1)?2:0;
  234.         address>>=1;
  235.     }
  236.  
  237.     // Device. M3E Pin A4-A5
  238.     for (; i<6; i++) {
  239.         trits[i]=(device & 1)?2:0;
  240.         device>>=1;
  241.     }
  242.  
  243.     // Group. M3E Pin A6-A7
  244.     for (; i<8; i++) {
  245.         trits[i]=(group & 1)?2:0;
  246.         group>>=1;
  247.     }
  248.  
  249.     // Trits 8-10 are be fixed. M3E Pin A8/D0-A10/D2
  250.     trits[8]=0;
  251.     trits[9]=2;
  252.     trits[10]=2;
  253.  
  254.     // Switch on or off, M3E Pin A11/D3
  255.     trits[11]=(on?2:0);
  256.  
  257.     return encodeTelegram(trits);
  258. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement