diff --git a/RCSwitch.cpp b/RCSwitch.cpp index 6c19fde..c7c2427 100644 --- a/RCSwitch.cpp +++ b/RCSwitch.cpp @@ -1,90 +1,198 @@ -#include -#include -#include -#include -#include +/* + RCSwitch - Arduino libary for remote control outlet switches + Copyright (c) 2011 Suat Özgür. All right reserved. + + Contributors: + - Andre Koehler / info(at)tomate-online(dot)de + - Gordeev Andrey Vladimirovich / gordeev(at)openpyro(dot)com + - Skineffect / http://forum.ardumote.com/viewtopic.php?f=2&t=48 + + Project home: http://code.google.com/p/rc-switch/ + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + #include "RCSwitch.h" -/** - * Create new RCSwitch Object - */ +unsigned long RCSwitch::nReceivedValue = NULL; +unsigned int RCSwitch::nReceivedBitlength = 0; +unsigned int RCSwitch::nReceivedDelay = 0; +unsigned int RCSwitch::nReceivedProtocol = 0; +unsigned int RCSwitch::timings[RCSWITCH_MAX_CHANGES]; +int RCSwitch::nReceiveTolerance = 60; + RCSwitch::RCSwitch() { - if(wiringPiSetupGpio() == -1) - exit(1); this->nReceiverInterrupt = -1; - this->nRepeatTransmit = 10; this->nTransmitterPin = -1; - this->nProtocol = 1; + RCSwitch::nReceivedValue = NULL; this->setPulseLength(350); + this->setRepeatTransmit(10); + this->setReceiveTolerance(60); + this->setProtocol(1); +} + +/** + * Sets the protocol to send. + */ +void RCSwitch::setProtocol(int nProtocol) { + this->nProtocol = nProtocol; + if (nProtocol == 1){ + this->setPulseLength(350); + } + else if (nProtocol == 2) { + this->setPulseLength(650); + } +} + +/** + * Sets the protocol to send with pulse length in microseconds. + */ +void RCSwitch::setProtocol(int nProtocol, int nPulseLength) { + this->nProtocol = nProtocol; + if (nProtocol == 1){ + this->setPulseLength(nPulseLength); + } + else if (nProtocol == 2) { + this->setPulseLength(nPulseLength); + } +} + + +/** + * Sets pulse length in microseconds + */ +void RCSwitch::setPulseLength(int nPulseLength) { + this->nPulseLength = nPulseLength; } /** * Sets Repeat Transmits -*/ + */ void RCSwitch::setRepeatTransmit(int nRepeatTransmit) { this->nRepeatTransmit = nRepeatTransmit; } /** - * Sets pulse length in microseconds -*/ -void RCSwitch::setPulseLength(int nPulseLength) { - this->nPulseLength = nPulseLength; + * Set Receiving Tolerance + */ +void RCSwitch::setReceiveTolerance(int nPercent) { + RCSwitch::nReceiveTolerance = nPercent; } + /** * Enable transmissions - * @param nTransmitterPin Raspberry GPIO to which the sender is connected to + * + * @param nTransmitterPin Arduino Pin to which the sender is connected to */ void RCSwitch::enableTransmit(int nTransmitterPin) { - this->nTransmitterPin = nTransmitterPin; - pinMode(this->nTransmitterPin, OUTPUT); + this->nTransmitterPin = nTransmitterPin; + pinMode(this->nTransmitterPin, OUTPUT); } /** - * Like getCodeWord (Type A) - */ -char* RCSwitch::getCodeWordA(char* sGroup, int nSwitchNumber, bool bStatus) { - int nReturnPos = 0; - static char sReturn[13]; - - const char* code[6] = { "FFFFF", "0FFFF", "F0FFF", "FF0FF", "FFF0F", "FFFF0" }; + * Disable transmissions + */ +void RCSwitch::disableTransmit() { + this->nTransmitterPin = -1; +} - if (strlen(sGroup) != 5 || nSwitchNumber < 1 || nSwitchNumber > 5) { - return '\0'; - } +/** + * Switch a remote switch on (Type C Intertechno) + * + * @param sFamily Familycode (a..f) + * @param nGroup Number of group (1..4) + * @param nDevice Number of device (1..4) + */ +void RCSwitch::switchOn(char sFamily, int nGroup, int nDevice) { + this->sendTriState( this->getCodeWordC(sFamily, nGroup, nDevice, true) ); +} +/** + * Switch a remote switch off (Type C Intertechno) + * + * @param sFamily Familycode (a..f) + * @param nGroup Number of group (1..4) + * @param nDevice Number of device (1..4) + */ +void RCSwitch::switchOff(char sFamily, int nGroup, int nDevice) { + this->sendTriState( this->getCodeWordC(sFamily, nGroup, nDevice, false) ); +} - for (int i = 0; i<5; i++) { - if (sGroup[i] == '0') { - sReturn[nReturnPos++] = 'F'; - } else { - sReturn[nReturnPos++] = '0'; - } - } +/** + * Switch a remote switch on (Type B with two rotary/sliding switches) + * + * @param nAddressCode Number of the switch group (1..4) + * @param nChannelCode Number of the switch itself (1..4) + */ +void RCSwitch::switchOn(int nAddressCode, int nChannelCode) { + this->sendTriState( this->getCodeWordB(nAddressCode, nChannelCode, true) ); +} - for (int i=0; i<5; i++) { - sReturn[nReturnPos++] = code[nSwitchNumber][i]; - } +/** + * Switch a remote switch off (Type B with two rotary/sliding switches) + * + * @param nAddressCode Number of the switch group (1..4) + * @param nChannelCode Number of the switch itself (1..4) + */ +void RCSwitch::switchOff(int nAddressCode, int nChannelCode) { + this->sendTriState( this->getCodeWordB(nAddressCode, nChannelCode, false) ); +} - if (bStatus) { - sReturn[nReturnPos++] = '0'; - sReturn[nReturnPos++] = 'F'; - } else { - sReturn[nReturnPos++] = 'F'; - sReturn[nReturnPos++] = '0'; - } +/** + * Switch a remote switch on (Type A with 10 pole DIP switches) + * + * @param sGroup Code of the switch group (refers to DIP switches 1..5 where "1" = on and "0" = off, if all DIP switches are on it's "11111") + * @param nChannelCode Number of the switch itself (1..4) + */ +void RCSwitch::switchOn(char* sGroup, int nChannel) { + this->sendTriState( this->getCodeWordA(sGroup, nChannel, true) ); +} - return sReturn; +/** + * Switch a remote switch off (Type A with 10 pole DIP switches) + * + * @param sGroup Code of the switch group (refers to DIP switches 1..5 where "1" = on and "0" = off, if all DIP switches are on it's "11111") + * @param nChannelCode Number of the switch itself (1..4) + */ +void RCSwitch::switchOff(char* sGroup, int nChannel) { + this->sendTriState( this->getCodeWordA(sGroup, nChannel, false) ); } -char* RCSwitch::getCodeWordB(int nAddressCode, int nChannelCode, bool bStatus) { +/** + * Returns a char[13], representing the Code Word to be send. + * A Code Word consists of 9 address bits, 3 data bits and one sync bit but in our case only the first 8 address bits and the last 2 data bits were used. + * A Code Bit can have 4 different states: "F" (floating), "0" (low), "1" (high), "S" (synchronous bit) + * + * +-------------------------------+--------------------------------+-----------------------------------------+-----------------------------------------+----------------------+------------+ + * | 4 bits address (switch group) | 4 bits address (switch number) | 1 bit address (not used, so never mind) | 1 bit address (not used, so never mind) | 2 data bits (on|off) | 1 sync bit | + * | 1=0FFF 2=F0FF 3=FF0F 4=FFF0 | 1=0FFF 2=F0FF 3=FF0F 4=FFF0 | F | F | on=FF off=F0 | S | + * +-------------------------------+--------------------------------+-----------------------------------------+-----------------------------------------+----------------------+------------+ + * + * @param nAddressCode Number of the switch group (1..4) + * @param nChannelCode Number of the switch itself (1..4) + * @param bStatus Wether to switch on (true) or off (false) + * + * @return char[13] + */ +char* RCSwitch::getCodeWordB(int nAddressCode, int nChannelCode, boolean bStatus) { int nReturnPos = 0; static char sReturn[13]; - const char* code[5] = { "FFFF", "0FFF", "F0FF", "FF0F", "FFF0" }; + char* code[5] = { "FFFF", "0FFF", "F0FF", "FF0F", "FFF0" }; if (nAddressCode < 1 || nAddressCode > 4 || nChannelCode < 1 || nChannelCode > 4) { - printf("0\n"); return '\0'; } for (int i = 0; i<4; i++) { @@ -110,50 +218,174 @@ char* RCSwitch::getCodeWordB(int nAddressCode, int nChannelCode, bool bStatus) { return sReturn; } + /** - * Switch a remote switch on (Type B with two rotary/sliding switches) - * - * @param nGroupNumber Number of the switch group (1..4) - * @param nSwitchNumber Number of the switch itself (1..4) + * Like getCodeWord (Type A) */ -void RCSwitch::switchOn(int nGroupNumber, int nSwitchNumber) { - printf("switchOn nGroupNumber: %d, SwitchNumber: %d\n", nGroupNumber, nSwitchNumber); - this->sendTriState( this->getCodeWordB(nGroupNumber, nSwitchNumber, true) ); +char* RCSwitch::getCodeWordA(char* sGroup, int nChannelCode, boolean bStatus) { + int nReturnPos = 0; + static char sReturn[13]; + + char* code[6] = { "FFFFF", "0FFFF", "F0FFF", "FF0FF", "FFF0F", "FFFF0" }; + + if (nChannelCode < 1 || nChannelCode > 5) { + return '\0'; + } + + for (int i = 0; i<5; i++) { + if (sGroup[i] == '0') { + sReturn[nReturnPos++] = 'F'; + } else if (sGroup[i] == '1') { + sReturn[nReturnPos++] = '0'; + } else { + return '\0'; + } + } + + for (int i = 0; i<5; i++) { + sReturn[nReturnPos++] = code[ nChannelCode ][i]; + } + + if (bStatus) { + sReturn[nReturnPos++] = '0'; + sReturn[nReturnPos++] = 'F'; + } else { + sReturn[nReturnPos++] = 'F'; + sReturn[nReturnPos++] = '0'; + } + sReturn[nReturnPos] = '\0'; + + return sReturn; } /** - * Switch a remote switch off (Type B with two rotary/sliding switches) - * - * @param nGroupNumber Number of the switch group (1..4) - * @param nSwitchNumber Number of the switch itself (1..4) + * Like getCodeWord (Type C = Intertechno) */ -void RCSwitch::switchOff(int nGroupNumber, int nSwitchNumber) { - printf("switchOff nGroupNumber: %d, SwitchNumber: %d\n", nGroupNumber, nSwitchNumber); - this->sendTriState( this->getCodeWordB(nGroupNumber, nSwitchNumber, false) ); +char* RCSwitch::getCodeWordC(char sFamily, int nGroup, int nDevice, boolean bStatus) { + static char sReturn[13]; + int nReturnPos = 0; + + if ( (byte)sFamily < 97 || (byte)sFamily > 112 || nGroup < 1 || nGroup > 4 || nDevice < 1 || nDevice > 4) { + return '\0'; + } + + char* sDeviceGroupCode = dec2binWzerofill( (nDevice-1) + (nGroup-1)*4, 4 ); + char familycode[16][5] = { "0000", "F000", "0F00", "FF00", "00F0", "F0F0", "0FF0", "FFF0", "000F", "F00F", "0F0F", "FF0F", "00FF", "F0FF", "0FFF", "FFFF" }; + for (int i = 0; i<4; i++) { + sReturn[nReturnPos++] = familycode[ (int)sFamily - 97 ][i]; + } + for (int i = 0; i<4; i++) { + sReturn[nReturnPos++] = (sDeviceGroupCode[3-i] == '1' ? 'F' : '0'); + } + sReturn[nReturnPos++] = '0'; + sReturn[nReturnPos++] = 'F'; + sReturn[nReturnPos++] = 'F'; + if (bStatus) { + sReturn[nReturnPos++] = 'F'; + } else { + sReturn[nReturnPos++] = '0'; + } + sReturn[nReturnPos] = '\0'; + return sReturn; } /** - * Switch a remote switch on (Type A with 10 pole DIP switches) - * - * @param sGroup Code of the switch group (refers to DIP switches 1..5 where "1" = on and "0" = off, if all DIP switches are on it's "11111") - * @param nSwitchNumber Number of the switch itself (1..4) + * Sends a Code Word + * @param sCodeWord /^[10FS]*$/ -> see getCodeWord + */ +void RCSwitch::sendTriState(char* sCodeWord) { + for (int nRepeat=0; nRepeatsendT0(); + break; + case 'F': + this->sendTF(); + break; + case '1': + this->sendT1(); + break; + } + i++; + } + this->sendSync(); + } +} + +void RCSwitch::send(unsigned long Code, unsigned int length) { + this->send( this->dec2binWzerofill(Code, length) ); +} + +void RCSwitch::send(char* sCodeWord) { + for (int nRepeat=0; nRepeatsend0(); + break; + case '1': + this->send1(); + break; + } + i++; + } + this->sendSync(); + } +} + +void RCSwitch::transmit(int nHighPulses, int nLowPulses) { + boolean disabled_Receive = false; + int nReceiverInterrupt_backup = nReceiverInterrupt; + if (this->nTransmitterPin != -1) { + if (this->nReceiverInterrupt != -1) { + this->disableReceive(); + disabled_Receive = true; + } + digitalWrite(this->nTransmitterPin, HIGH); + delayMicroseconds( this->nPulseLength * nHighPulses); + digitalWrite(this->nTransmitterPin, LOW); + delayMicroseconds( this->nPulseLength * nLowPulses); + if(disabled_Receive){ + this->enableReceive(nReceiverInterrupt_backup); + } + } +} +/** + * Sends a "0" Bit + * _ + * Waveform Protocol 1: | |___ + * _ + * Waveform Protocol 2: | |__ */ -void RCSwitch::switchOn(char* sGroup, int nSwitchNumber) { - printf("switchOn sGroup: %s channel: %d\n", sGroup, nSwitchNumber); - this->sendTriState( this->getCodeWordA(sGroup, nSwitchNumber, true) ); +void RCSwitch::send0() { + if (this->nProtocol == 1){ + this->transmit(1,3); + } + else if (this->nProtocol == 2) { + this->transmit(1,2); + } } /** - * Switch a remote switch off (Type A with 10 pole DIP switches) - * - * @param sGroup Code of the switch group (refers to DIP switches 1..5 where "1" = on and "0" = off, if all DIP switches are on it's "11111") - * @param nSwitchNumber Number of the switch itself (1..4) + * Sends a "1" Bit + * ___ + * Waveform Protocol 1: | |_ + * __ + * Waveform Protocol 2: | |_ */ -void RCSwitch::switchOff(char* sGroup, int nSwitchNumber) { - printf("switchOff sGroup: %s channel: %d\n", sGroup, nSwitchNumber); - this->sendTriState( this->getCodeWordA(sGroup, nSwitchNumber, false) ); +void RCSwitch::send1() { + if (this->nProtocol == 1){ + this->transmit(3,1); + } + else if (this->nProtocol == 2) { + this->transmit(2,1); + } } + /** * Sends a Tri-State "0" Bit * _ _ @@ -192,7 +424,8 @@ void RCSwitch::sendTF() { * Waveform Protocol 2: | |__________ */ void RCSwitch::sendSync() { - if (this->nProtocol == 1){ + + if (this->nProtocol == 1){ this->transmit(1,31); } else if (this->nProtocol == 2) { @@ -200,35 +433,151 @@ void RCSwitch::sendSync() { } } -void RCSwitch::sendTriState(char* sCodeWord) { - // printf("sendTriState sCodeWord: %s\n", sCodeWord); - for (int nRepeat=0; nRepeatsendT0(); - break; - case 'F': - this->sendTF(); - break; - case '1': - this->sendT1(); - break; +/** + * Enable receiving data + */ +void RCSwitch::enableReceive(int interrupt) { + this->nReceiverInterrupt = interrupt; + this->enableReceive(); +} + +void RCSwitch::enableReceive() { + if (this->nReceiverInterrupt != -1) { + RCSwitch::nReceivedValue = NULL; + RCSwitch::nReceivedBitlength = NULL; + } +} + +/** + * Disable receiving data + */ +void RCSwitch::disableReceive() { + this->nReceiverInterrupt = -1; +} + +bool RCSwitch::available() { + return RCSwitch::nReceivedValue != NULL; +} + +void RCSwitch::resetAvailable() { + RCSwitch::nReceivedValue = NULL; +} + +unsigned long RCSwitch::getReceivedValue() { + return RCSwitch::nReceivedValue; +} + +unsigned int RCSwitch::getReceivedBitlength() { + return RCSwitch::nReceivedBitlength; +} + +unsigned int RCSwitch::getReceivedDelay() { + return RCSwitch::nReceivedDelay; +} + +unsigned int RCSwitch::getReceivedProtocol() { + return RCSwitch::nReceivedProtocol; +} + +unsigned int* RCSwitch::getReceivedRawdata() { + return RCSwitch::timings; +} + +/** + * + */ +bool RCSwitch::receiveProtocol1(unsigned int changeCount){ + + unsigned long code = 0; + unsigned long delay = RCSwitch::timings[0] / 31; + unsigned long delayTolerance = delay * RCSwitch::nReceiveTolerance * 0.01; + + for (int i = 1; i delay-delayTolerance && RCSwitch::timings[i] < delay+delayTolerance && RCSwitch::timings[i+1] > delay*3-delayTolerance && RCSwitch::timings[i+1] < delay*3+delayTolerance) { + code = code << 1; + } else if (RCSwitch::timings[i] > delay*3-delayTolerance && RCSwitch::timings[i] < delay*3+delayTolerance && RCSwitch::timings[i+1] > delay-delayTolerance && RCSwitch::timings[i+1] < delay+delayTolerance) { + code+=1; + code = code << 1; + } else { + // Failed + i = changeCount; + code = 0; + } } - i++; + code = code >> 1; + if (changeCount > 6) { // ignore < 4bit values as there are no devices sending 4bit values => noise + RCSwitch::nReceivedValue = code; + RCSwitch::nReceivedBitlength = changeCount / 2; + RCSwitch::nReceivedDelay = delay; + RCSwitch::nReceivedProtocol = 1; } - this->sendSync(); + + if (code == 0){ + return false; + }else if (code != 0){ + return true; } + + } -void RCSwitch::transmit(int nHighPulses, int nLowPulses) { - digitalWrite(this->nTransmitterPin, HIGH); - delayMicroseconds( this->nPulseLength * nHighPulses); - digitalWrite(this->nTransmitterPin, LOW); - delayMicroseconds( this->nPulseLength * nLowPulses); +bool RCSwitch::receiveProtocol2(unsigned int changeCount){ + + unsigned long code = 0; + unsigned long delay = RCSwitch::timings[0] / 10; + unsigned long delayTolerance = delay * RCSwitch::nReceiveTolerance * 0.01; + + for (int i = 1; i delay-delayTolerance && RCSwitch::timings[i] < delay+delayTolerance && RCSwitch::timings[i+1] > delay*2-delayTolerance && RCSwitch::timings[i+1] < delay*2+delayTolerance) { + code = code << 1; + } else if (RCSwitch::timings[i] > delay*2-delayTolerance && RCSwitch::timings[i] < delay*2+delayTolerance && RCSwitch::timings[i+1] > delay-delayTolerance && RCSwitch::timings[i+1] < delay+delayTolerance) { + code+=1; + code = code << 1; + } else { + // Failed + i = changeCount; + code = 0; + } + } + code = code >> 1; + if (changeCount > 6) { // ignore < 4bit values as there are no devices sending 4bit values => noise + RCSwitch::nReceivedValue = code; + RCSwitch::nReceivedBitlength = changeCount / 2; + RCSwitch::nReceivedDelay = delay; + RCSwitch::nReceivedProtocol = 2; + } + + if (code == 0){ + return false; + }else if (code != 0){ + return true; + } + } -void RCSwitch::delayMicroseconds(int msec) { - usleep(msec); +/** + * Turns a decimal value to its binary representation + */ +char* RCSwitch::dec2binWzerofill(unsigned long Dec, unsigned int bitLength){ + static char bin[64]; + unsigned int i=0; + + while (Dec > 0) { + bin[32+i++] = ((Dec & 1) > 0) ? '1' : '0'; + Dec = Dec >> 1; + } + + for (unsigned int j = 0; j< bitLength; j++) { + if (j >= bitLength - i) { + bin[j] = bin[ 31 + i - (j - (bitLength - i)) ]; + }else { + bin[j] = '0'; + } + } + bin[bitLength] = '\0'; + + return bin; } + diff --git a/RCSwitch.h b/RCSwitch.h index b4954b3..a638a8e 100644 --- a/RCSwitch.h +++ b/RCSwitch.h @@ -1,42 +1,122 @@ +/* + RCSwitch - Arduino libary for remote control outlet switches + Copyright (c) 2011 Suat Özgür. All right reserved. + + Contributors: + - Andre Koehler / info(at)tomate-online(dot)de + - Gordeev Andrey Vladimirovich / gordeev(at)openpyro(dot)com + + Project home: http://code.google.com/p/rc-switch/ + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ +#ifndef _RCSwitch_h +#define _RCSwitch_h + +#if defined(ARDUINO) && ARDUINO >= 100 + #include "Arduino.h" +#else + #include + #include + #define NULL 0 + #define CHANGE 1 +#ifdef __cplusplus +extern "C"{ +#endif +typedef uint8_t boolean; +typedef uint8_t byte; + +#if !defined(NULL) +#endif +#ifdef __cplusplus +} +#endif +#endif + + +// Number of maximum High/Low changes per packet. +// We can handle up to (unsigned long) => 32 bit * 2 H/L changes per bit + 2 for sync +#define RCSWITCH_MAX_CHANGES 67 + + class RCSwitch { + public: - // Attributes - int nReceiverInterrupt; - int nTransmitterPin; - int nRepeatTransmit; - char nProtocol; - int nPulseLength; - static unsigned long nReceivedValue; + RCSwitch(); + + void switchOn(int nGroupNumber, int nSwitchNumber); + void switchOff(int nGroupNumber, int nSwitchNumber); + void switchOn(char* sGroup, int nSwitchNumber); + void switchOff(char* sGroup, int nSwitchNumber); + void switchOn(char sFamily, int nGroup, int nDevice); + void switchOff(char sFamily, int nGroup, int nDevice); - //int LOW=0; - //int HIGH=1; + void sendTriState(char* Code); + void send(unsigned long Code, unsigned int length); + void send(char* Code); - RCSwitch(); + void enableReceive(int interrupt); + void enableReceive(); + void disableReceive(); + bool available(); + void resetAvailable(); + unsigned long getReceivedValue(); + unsigned int getReceivedBitlength(); + unsigned int getReceivedDelay(); + unsigned int getReceivedProtocol(); + unsigned int* getReceivedRawdata(); void enableTransmit(int nTransmitterPin); void disableTransmit(); void setPulseLength(int nPulseLength); void setRepeatTransmit(int nRepeatTransmit); + void setReceiveTolerance(int nPercent); + void setProtocol(int nProtocol); + void setProtocol(int nProtocol, int nPulseLength); - char* getCodeWordA(char* sGroup, int nSwitchNumber, bool bStatus); - char* getCodeWordB(int nAddressCode, int nChannelCode, bool bStatus); - - // TriState - void sendTriState(char* sCodeWord); - void sendSync(); + private: + char* getCodeWordB(int nGroupNumber, int nSwitchNumber, boolean bStatus); + char* getCodeWordA(char* sGroup, int nSwitchNumber, boolean bStatus); + char* getCodeWordC(char sFamily, int nGroup, int nDevice, boolean bStatus); void sendT0(); void sendT1(); void sendTF(); - + void send0(); + void send1(); + void sendSync(); void transmit(int nHighPulses, int nLowPulses); - void switchOn(int nGroupNumber, int nSwitchNumber); - void switchOff(int nGroupNumber, int nSwitchNumber); - void switchOn(char* sGroup, int nSwitchNumber); - void switchOff(char* sGroup, int nSwitchNumber); + static char* dec2binWzerofill(unsigned long dec, unsigned int length); + + static void handleInterrupt(); + static bool receiveProtocol1(unsigned int changeCount); + static bool receiveProtocol2(unsigned int changeCount); + int nReceiverInterrupt; + int nTransmitterPin; + int nPulseLength; + int nRepeatTransmit; + char nProtocol; + + static int nReceiveTolerance; + static unsigned long nReceivedValue; + static unsigned int nReceivedBitlength; + static unsigned int nReceivedDelay; + static unsigned int nReceivedProtocol; + static unsigned int timings[RCSWITCH_MAX_CHANGES]; - // TODO - //void digitalWrite(int nPin, int nValue); - void delayMicroseconds(int mUsec); }; + +#endif diff --git a/test.cpp b/test.cpp deleted file mode 100644 index 88acf16..0000000 --- a/test.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Testing RCSwitch adaptation for the - * raspberry pi - * - * Setup - * Power to pin4 - * GND to pin6 - * DATA to pin7/gpio4 - */ - -#include "RCSwitch.h" -#include -#include -#include - -int main(void) { - /** - * setup - */ - RCSwitch mySwitch = RCSwitch(); - usleep(50000); - mySwitch.enableTransmit(4); - usleep(50000); - - /** - * blink LED - */ - //digitalWrite(4, HIGH); - //usleep(50000); - //digitalWrite(4, LOW); - - /** - * Try to switch something on - */ - //mySwitch.switchOn("00001", 1); - mySwitch.switchOn("00001", 2); - //mySwitch.switchOn("00001", 3); - //mySwitch.switchOn("00001", 4); - - /** - * wait a moment - */ - usleep(3000000); - - /** - * Try to switch something off - */ - //mySwitch.switchOff("00001", 1); - mySwitch.switchOff("00001", 2); - //mySwitch.switchOff("00001", 3); - //mySwitch.switchOff("00001", 4); -}