Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * RemoteSwitch library v2.3.0 (20121229) made by Randy Simons http://randysimons.nl/
- * See RemoteTransmitter.h for details.
- *
- * License: GPLv3. See license.txt
- */
- #include "RemoteTransmitter.h"
- #include "gpio.h"
- #include "user_config.h"
- #include "ets_sys.h"
- #include "osapi.h"
- #include "os_type.h"
- #include "user_interface.h"
- #include "driver/uart.h"
- #include "espconn.h"
- #include "mem.h"
- #include "user_config.h"
- extern "C" void ets_delay_us(int us);
- /************
- * RemoteTransmitter
- ************/
- RemoteTransmitter::RemoteTransmitter(uint8_t pin, unsigned int periodusec, uint8_t repeats)
- {
- _pin=pin;
- _periodusec=periodusec;
- _repeats=repeats;
- //Change to ESP8266 Call
- //pinMode(_pin, OUTPUT);
- }
- unsigned long RemoteTransmitter::encodeTelegram(uint8_t trits[])
- {
- unsigned long data = 0;
- // Encode data
- for (uint8_t i=0;i<12;i++) {
- data*=3;
- data+=trits[i];
- }
- // Encode period duration
- data |= (unsigned long)_periodusec << 23;
- // Encode repeats
- data |= (unsigned long)_repeats << 20;
- return data;
- }
- void RemoteTransmitter::sendTelegram(uint8_t trits[])
- {
- sendTelegram(encodeTelegram(trits),_pin);
- }
- /**
- * Format data:
- * pppppppp|prrrdddd|dddddddd|dddddddd (32 bit)
- * p = perioud (9 bit unsigned int
- * r = repeats as 2log. Thus, if r = 3, then signal is sent 2^3=8 times
- * d = data
- */
- void RemoteTransmitter::sendTelegram(unsigned long data, uint8_t pin)
- {
- unsigned int periodusec = (unsigned long)data >> 23;
- uint8_t repeats = ((unsigned long)data >> 20) & 7;
- sendCode(pin, data, periodusec, repeats);
- }
- void RemoteTransmitter::sendCode(uint8_t pin, unsigned long code, unsigned int periodusec, uint8_t repeats)
- {
- code &= 0xfffff; // Truncate to 20 bit ;
- // Convert the base3-code to base4, to avoid lengthy calculations when transmitting.. Messes op timings.
- // Also note this swaps endianess in the process. The MSB must be transmitted first, but is converted to
- // LSB here. This is easier when actually transmitting later on.
- unsigned long dataBase4 = 0;
- for (uint8_t i=0; i<12; i++) {
- dataBase4<<=2;
- dataBase4|=(code%3);
- code/=3;
- }
- repeats = 1 << (repeats & 7); // repeats := 2^repeats;
- for (uint8_t j=0;j<repeats;j++) {
- // Sent one telegram
- // Recycle code as working var to save memory
- code=dataBase4;
- for (uint8_t i=0; i<12; i++) {
- switch (code & 3) {
- case 0:
- //digitalWrite(pin, HIGH);
- GPIO_OUTPUT_SET(pin, 1);
- //delayMicroseconds(periodusec);
- os_delay_us(periodusec);
- //digitalWrite(pin, LOW);
- GPIO_OUTPUT_SET(pin, 0);
- //delayMicroseconds(periodusec*3);
- os_delay_us(periodusec * 3);
- //digitalWrite(pin, HIGH);
- GPIO_OUTPUT_SET(pin, 1);
- //delayMicroseconds(periodusec);
- os_delay_us(periodusec);
- //digitalWrite(pin, LOW);
- GPIO_OUTPUT_SET(pin, 0);
- //delayMicroseconds(periodusec*3);
- os_delay_us(periodusec * 3);
- break;
- case 1:
- //digitalWrite(pin, HIGH);
- GPIO_OUTPUT_SET(pin, 1);
- //delayMicroseconds(periodusec*3);
- os_delay_us(periodusec * 3);
- //digitalWrite(pin, LOW);
- GPIO_OUTPUT_SET(pin, 0);
- //delayMicroseconds(periodusec);
- os_delay_us(periodusec);
- //digitalWrite(pin, HIGH);
- GPIO_OUTPUT_SET(pin, 1);
- //delayMicroseconds(periodusec*3);
- os_delay_us(periodusec * 3);
- //digitalWrite(pin, LOW);
- GPIO_OUTPUT_SET(pin, 0);
- //delayMicroseconds(periodusec);
- os_delay_us(periodusec);
- break;
- case 2: // KA: X or float
- //digitalWrite(pin, HIGH);
- GPIO_OUTPUT_SET(pin, 1);
- //delayMicroseconds(periodusec);
- os_delay_us(periodusec);
- //digitalWrite(pin, LOW);
- GPIO_OUTPUT_SET(pin, 0);
- //delayMicroseconds(periodusec*3);
- os_delay_us(periodusec * 3);
- //digitalWrite(pin, HIGH);
- GPIO_OUTPUT_SET(pin, 1);
- //delayMicroseconds(periodusec*3);
- os_delay_us(periodusec * 3);
- //digitalWrite(pin, LOW);
- GPIO_OUTPUT_SET(pin, 0);
- //delayMicroseconds(periodusec);
- os_delay_us(periodusec);
- break;
- }
- // Next trit
- code>>=2;
- }
- // Send termination/synchronization-signal. Total length: 32 periods
- //digitalWrite(pin, HIGH);
- GPIO_OUTPUT_SET(pin, 1);
- //delayMicroseconds(periodusec);
- os_delay_us(periodusec);
- //digitalWrite(pin, LOW);
- GPIO_OUTPUT_SET(pin, 0);
- //delayMicroseconds(periodusec*31);
- os_delay_us(periodusec * 31);
- }
- }
- int RemoteTransmitter::isSameCode(unsigned long encodedTelegram, unsigned long receivedData)
- {
- return (receivedData==(encodedTelegram & 0xFFFFF)); // compare the 20 LSB's
- }
- /************
- * KaKuTransmitter
- ************/
- KaKuTransmitter::KaKuTransmitter(uint8_t pin, unsigned int periodusec, uint8_t repeats) : RemoteTransmitter(pin,periodusec,repeats)
- {
- // Call constructor
- }
- void KaKuTransmitter::sendSignal(char address, uint8_t device, int on)
- {
- sendTelegram(getTelegram(address, device, on), _pin);
- }
- unsigned long KaKuTransmitter::getTelegram(char address, uint8_t device, int on)
- {
- uint8_t trits[12];
- address-=65;
- device-=1;
- for (char i=0; i<4; i++) {
- // Trits 0-3 contain address (2^4 = 16 addresses)
- trits[i]=(address & 1)?2:0;
- address>>=1;
- // Trits 4-8 contain device (2^4 = 16 addresses)
- trits[i+4]=(device & 1)?2:0;
- device>>=1;
- }
- // Trits 8-10 seem to be fixed
- trits[8]=0;
- trits[9]=2;
- trits[10]=2;
- // Switch on or off
- trits[11]=(on?2:0);
- return encodeTelegram(trits);
- }
- void KaKuTransmitter::sendSignal(char address, uint8_t group, uint8_t device, int on)
- {
- sendTelegram(getTelegram(address, group, on), _pin);
- }
- unsigned long KaKuTransmitter::getTelegram(char address, uint8_t group, uint8_t device, int on)
- {
- uint8_t trits[12], i;
- address-=65;
- group-=1;
- device-=1;
- // Address. M3E Pin A0-A3
- for (i=0; i<4; i++) {
- // Trits 0-3 contain address (2^4 = 16 addresses)
- trits[i]=(address & 1)?2:0;
- address>>=1;
- }
- // Device. M3E Pin A4-A5
- for (; i<6; i++) {
- trits[i]=(device & 1)?2:0;
- device>>=1;
- }
- // Group. M3E Pin A6-A7
- for (; i<8; i++) {
- trits[i]=(group & 1)?2:0;
- group>>=1;
- }
- // Trits 8-10 are be fixed. M3E Pin A8/D0-A10/D2
- trits[8]=0;
- trits[9]=2;
- trits[10]=2;
- // Switch on or off, M3E Pin A11/D3
- trits[11]=(on?2:0);
- return encodeTelegram(trits);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement