diff --git a/RCSwitch.cpp b/RCSwitch.cpp index 391393601368dba78c357acd537b581d6e89411b..fc7c7a354ce11bfc9f314cb9b24c31d5f5a9ab06 100644 --- a/RCSwitch.cpp +++ b/RCSwitch.cpp @@ -1,9 +1,9 @@ -/* - 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 +/* + 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=46 - Dominik Fischer / dom_fischer(at)web(dot)de @@ -12,47 +12,47 @@ 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" - + 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" + #if not defined( RCSwitchDisableReceiving ) -unsigned long RCSwitch::nReceivedValue = NULL; -unsigned int RCSwitch::nReceivedBitlength = 0; -unsigned int RCSwitch::nReceivedDelay = 0; -unsigned int RCSwitch::nReceivedProtocol = 0; -int RCSwitch::nReceiveTolerance = 60; +unsigned long RCSwitch::nReceivedValue = NULL; +unsigned int RCSwitch::nReceivedBitlength = 0; +unsigned int RCSwitch::nReceivedDelay = 0; +unsigned int RCSwitch::nReceivedProtocol = 0; +int RCSwitch::nReceiveTolerance = 60; #endif -unsigned int RCSwitch::timings[RCSWITCH_MAX_CHANGES]; - -RCSwitch::RCSwitch() { - this->nTransmitterPin = -1; - this->setPulseLength(350); - this->setRepeatTransmit(10); - this->setProtocol(1); +unsigned int RCSwitch::timings[RCSWITCH_MAX_CHANGES]; + +RCSwitch::RCSwitch() { + this->nTransmitterPin = -1; + this->setPulseLength(350); + this->setRepeatTransmit(10); + this->setProtocol(1); #if not defined( RCSwitchDisableReceiving ) - this->nReceiverInterrupt = -1; - this->setReceiveTolerance(60); - RCSwitch::nReceivedValue = NULL; + this->nReceiverInterrupt = -1; + this->setReceiveTolerance(60); + RCSwitch::nReceivedValue = NULL; #endif -} - -/** - * Sets the protocol to send. - */ +} + +/** + * Sets the protocol to send. + */ void RCSwitch::setProtocol(int nProtocol) { this->nProtocol = nProtocol; if (nProtocol == 1){ @@ -66,8 +66,8 @@ void RCSwitch::setProtocol(int nProtocol) { } } -/** - * Sets the protocol to send with pulse length in microseconds. +/** + * Sets the protocol to send with pulse length in microseconds. */ void RCSwitch::setProtocol(int nProtocol, int nPulseLength) { this->nProtocol = nProtocol; @@ -75,50 +75,50 @@ void RCSwitch::setProtocol(int nProtocol, int 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; -} - -/** - * Set Receiving Tolerance - */ +/** + * Sets pulse length in microseconds + */ +void RCSwitch::setPulseLength(int nPulseLength) { + this->nPulseLength = nPulseLength; +} + +/** + * Sets Repeat Transmits + */ +void RCSwitch::setRepeatTransmit(int nRepeatTransmit) { + this->nRepeatTransmit = nRepeatTransmit; +} + +/** + * Set Receiving Tolerance + */ #if not defined( RCSwitchDisableReceiving ) -void RCSwitch::setReceiveTolerance(int nPercent) { - RCSwitch::nReceiveTolerance = nPercent; -} +void RCSwitch::setReceiveTolerance(int nPercent) { + RCSwitch::nReceiveTolerance = nPercent; +} #endif - - -/** - * Enable transmissions - * - * @param nTransmitterPin Arduino Pin to which the sender is connected to - */ -void RCSwitch::enableTransmit(int nTransmitterPin) { - this->nTransmitterPin = nTransmitterPin; - pinMode(this->nTransmitterPin, OUTPUT); -} - -/** - * Disable transmissions - */ -void RCSwitch::disableTransmit() { - this->nTransmitterPin = -1; -} + + +/** + * Enable transmissions + * + * @param nTransmitterPin Arduino Pin to which the sender is connected to + */ +void RCSwitch::enableTransmit(int nTransmitterPin) { + this->nTransmitterPin = nTransmitterPin; + pinMode(this->nTransmitterPin, OUTPUT); +} + +/** + * Disable transmissions + */ +void RCSwitch::disableTransmit() { + this->nTransmitterPin = -1; +} /** * Switch a remote switch on (Type D REV) - * + * * @param sGroup Code of the switch group (A,B,C,D) * @param nDevice Number of the switch itself (1..3) */ @@ -128,7 +128,7 @@ void RCSwitch::switchOn(char sGroup, int nDevice) { /** * Switch a remote switch off (Type D REV) - * + * * @param sGroup Code of the switch group (A,B,C,D) * @param nDevice Number of the switch itself (1..3) */ @@ -136,209 +136,209 @@ void RCSwitch::switchOff(char sGroup, int nDevice) { this->sendTriState( this->getCodeWordD(sGroup, nDevice, false) ); } -/** - * 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) ); -} - -/** - * 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) ); -} - -/** - * 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) ); -} - -/** - * Deprecated, use switchOn(char* sGroup, char* sDevice) instead! - * 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..5) - */ -void RCSwitch::switchOn(char* sGroup, int nChannel) { - char* code[6] = { "00000", "10000", "01000", "00100", "00010", "00001" }; - this->switchOn(sGroup, code[nChannel]); -} - -/** - * Deprecated, use switchOff(char* sGroup, char* sDevice) instead! - * 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..5) - */ -void RCSwitch::switchOff(char* sGroup, int nChannel) { - char* code[6] = { "00000", "10000", "01000", "00100", "00010", "00001" }; - this->switchOff(sGroup, code[nChannel]); -} - -/** - * 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 sDevice Code of the switch device (refers to DIP switches 6..10 (A..E) where "1" = on and "0" = off, if all DIP switches are on it's "11111") - */ -void RCSwitch::switchOn(char* sGroup, char* sDevice) { - this->sendTriState( this->getCodeWordA(sGroup, sDevice, true) ); -} - -/** - * 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 sDevice Code of the switch device (refers to DIP switches 6..10 (A..E) where "1" = on and "0" = off, if all DIP switches are on it's "11111") - */ -void RCSwitch::switchOff(char* sGroup, char* sDevice) { - this->sendTriState( this->getCodeWordA(sGroup, sDevice, false) ); -} - -/** - * 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]; - - char* code[5] = { "FFFF", "0FFF", "F0FF", "FF0F", "FFF0" }; - if (nAddressCode < 1 || nAddressCode > 4 || nChannelCode < 1 || nChannelCode > 4) { - return '\0'; - } - for (int i = 0; i<4; i++) { - sReturn[nReturnPos++] = code[nAddressCode][i]; - } - - for (int i = 0; i<4; i++) { - sReturn[nReturnPos++] = code[nChannelCode][i]; - } - - sReturn[nReturnPos++] = 'F'; - sReturn[nReturnPos++] = 'F'; - sReturn[nReturnPos++] = 'F'; - - if (bStatus) { - sReturn[nReturnPos++] = 'F'; - } else { - sReturn[nReturnPos++] = '0'; - } - - sReturn[nReturnPos] = '\0'; - - return sReturn; -} - -/** - * Returns a char[13], representing the Code Word to be send. - * - * getCodeWordA(char*, char*) - * - */ -char* RCSwitch::getCodeWordA(char* sGroup, char* sDevice, boolean bOn) { - static char sDipSwitches[13]; - int i = 0; - int j = 0; - - for (i=0; i < 5; i++) { - if (sGroup[i] == '0') { - sDipSwitches[j++] = 'F'; - } else { - sDipSwitches[j++] = '0'; - } - } - - for (i=0; i < 5; i++) { - if (sDevice[i] == '0') { - sDipSwitches[j++] = 'F'; - } else { - sDipSwitches[j++] = '0'; - } - } - - if ( bOn ) { - sDipSwitches[j++] = '0'; - sDipSwitches[j++] = 'F'; - } else { - sDipSwitches[j++] = 'F'; - sDipSwitches[j++] = '0'; - } - - sDipSwitches[j] = '\0'; - - return sDipSwitches; -} - -/** - * Like getCodeWord (Type C = Intertechno) - */ -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 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) ); +} + +/** + * 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) ); +} + +/** + * 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) ); +} + +/** + * Deprecated, use switchOn(char* sGroup, char* sDevice) instead! + * 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..5) + */ +void RCSwitch::switchOn(char* sGroup, int nChannel) { + char* code[6] = { "00000", "10000", "01000", "00100", "00010", "00001" }; + this->switchOn(sGroup, code[nChannel]); +} + +/** + * Deprecated, use switchOff(char* sGroup, char* sDevice) instead! + * 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..5) + */ +void RCSwitch::switchOff(char* sGroup, int nChannel) { + char* code[6] = { "00000", "10000", "01000", "00100", "00010", "00001" }; + this->switchOff(sGroup, code[nChannel]); +} + +/** + * 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 sDevice Code of the switch device (refers to DIP switches 6..10 (A..E) where "1" = on and "0" = off, if all DIP switches are on it's "11111") + */ +void RCSwitch::switchOn(char* sGroup, char* sDevice) { + this->sendTriState( this->getCodeWordA(sGroup, sDevice, true) ); +} + +/** + * 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 sDevice Code of the switch device (refers to DIP switches 6..10 (A..E) where "1" = on and "0" = off, if all DIP switches are on it's "11111") + */ +void RCSwitch::switchOff(char* sGroup, char* sDevice) { + this->sendTriState( this->getCodeWordA(sGroup, sDevice, false) ); +} + +/** + * 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]; + + char* code[5] = { "FFFF", "0FFF", "F0FF", "FF0F", "FFF0" }; + if (nAddressCode < 1 || nAddressCode > 4 || nChannelCode < 1 || nChannelCode > 4) { + return '\0'; + } + for (int i = 0; i<4; i++) { + sReturn[nReturnPos++] = code[nAddressCode][i]; + } + + for (int i = 0; i<4; i++) { + sReturn[nReturnPos++] = code[nChannelCode][i]; + } + + sReturn[nReturnPos++] = 'F'; + sReturn[nReturnPos++] = 'F'; + sReturn[nReturnPos++] = 'F'; + + if (bStatus) { + sReturn[nReturnPos++] = 'F'; + } else { + sReturn[nReturnPos++] = '0'; + } + + sReturn[nReturnPos] = '\0'; + + return sReturn; +} + +/** + * Returns a char[13], representing the Code Word to be send. + * + * getCodeWordA(char*, char*) + * + */ +char* RCSwitch::getCodeWordA(char* sGroup, char* sDevice, boolean bOn) { + static char sDipSwitches[13]; + int i = 0; + int j = 0; + + for (i=0; i < 5; i++) { + if (sGroup[i] == '0') { + sDipSwitches[j++] = 'F'; + } else { + sDipSwitches[j++] = '0'; + } + } + + for (i=0; i < 5; i++) { + if (sDevice[i] == '0') { + sDipSwitches[j++] = 'F'; + } else { + sDipSwitches[j++] = '0'; + } + } + + if ( bOn ) { + sDipSwitches[j++] = '0'; + sDipSwitches[j++] = 'F'; + } else { + sDipSwitches[j++] = 'F'; + sDipSwitches[j++] = '0'; + } + + sDipSwitches[j] = '\0'; + + return sDipSwitches; +} + +/** + * Like getCodeWord (Type C = Intertechno) + */ +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; +} /** * Decoding for the REV Switch Type @@ -357,13 +357,13 @@ char* RCSwitch::getCodeWordC(char sFamily, int nGroup, int nDevice, boolean bSta * @param sGroup Name of the switch group (A..D, resp. a..d) * @param nDevice Number of the switch itself (1..3) * @param bStatus Wether to switch on (true) or off (false) - * - * @return char[13] - */ + * + * @return char[13] + */ char* RCSwitch::getCodeWordD(char sGroup, int nDevice, boolean bStatus){ static char sReturn[13]; - int nReturnPos = 0; + int nReturnPos = 0; // Building 4 bits address // (Potential problem if dec2binWcharfill not returning correct string) @@ -423,88 +423,88 @@ char* RCSwitch::getCodeWordD(char sGroup, int nDevice, boolean bStatus){ return sReturn; } - -/** - * @param sCodeWord /^[10FS]*$/ -> see getCodeWord - */ -void RCSwitch::sendTriState(char* sCodeWord) { - for (int nRepeat=0; nRepeat<nRepeatTransmit; nRepeat++) { - int i = 0; - while (sCodeWord[i] != '\0') { - switch(sCodeWord[i]) { - case '0': - this->sendT0(); - 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; nRepeat<nRepeatTransmit; nRepeat++) { - int i = 0; - while (sCodeWord[i] != '\0') { - switch(sCodeWord[i]) { - case '0': - this->send0(); - break; - case '1': - this->send1(); - break; - } - i++; - } - this->sendSync(); - } -} - -void RCSwitch::transmit(int nHighPulses, int nLowPulses) { + +/** + * @param sCodeWord /^[10FS]*$/ -> see getCodeWord + */ +void RCSwitch::sendTriState(char* sCodeWord) { + for (int nRepeat=0; nRepeat<nRepeatTransmit; nRepeat++) { + int i = 0; + while (sCodeWord[i] != '\0') { + switch(sCodeWord[i]) { + case '0': + this->sendT0(); + 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; nRepeat<nRepeatTransmit; nRepeat++) { + int i = 0; + while (sCodeWord[i] != '\0') { + switch(sCodeWord[i]) { + case '0': + this->send0(); + break; + case '1': + this->send1(); + break; + } + i++; + } + this->sendSync(); + } +} + +void RCSwitch::transmit(int nHighPulses, int nLowPulses) { #if not defined ( RCSwitchDisableReceiving ) - boolean disabled_Receive = false; - int nReceiverInterrupt_backup = nReceiverInterrupt; + boolean disabled_Receive = false; + int nReceiverInterrupt_backup = nReceiverInterrupt; #endif - if (this->nTransmitterPin != -1) { + if (this->nTransmitterPin != -1) { #if not defined( RCSwitchDisableReceiving ) - if (this->nReceiverInterrupt != -1) { - this->disableReceive(); - disabled_Receive = true; + if (this->nReceiverInterrupt != -1) { + this->disableReceive(); + disabled_Receive = true; } #endif - digitalWrite(this->nTransmitterPin, HIGH); - delayMicroseconds( this->nPulseLength * nHighPulses); - digitalWrite(this->nTransmitterPin, LOW); - delayMicroseconds( this->nPulseLength * nLowPulses); + digitalWrite(this->nTransmitterPin, HIGH); + delayMicroseconds( this->nPulseLength * nHighPulses); + digitalWrite(this->nTransmitterPin, LOW); + delayMicroseconds( this->nPulseLength * nLowPulses); #if not defined( RCSwitchDisableReceiving ) - if(disabled_Receive){ - this->enableReceive(nReceiverInterrupt_backup); - } + if(disabled_Receive){ + this->enableReceive(nReceiverInterrupt_backup); + } #endif - } -} -/** - * Sends a "0" Bit - * _ - * Waveform Protocol 1: | |___ - * _ - * Waveform Protocol 2: | |__ - */ -void RCSwitch::send0() { - if (this->nProtocol == 1){ - this->transmit(1,3); - } + } +} +/** + * Sends a "0" Bit + * _ + * Waveform Protocol 1: | |___ + * _ + * Waveform Protocol 2: | |__ + */ +void RCSwitch::send0() { + if (this->nProtocol == 1){ + this->transmit(1,3); + } else if (this->nProtocol == 2) { this->transmit(1,2); } @@ -514,16 +514,16 @@ void RCSwitch::send0() { } /** - * Sends a "1" Bit - * ___ - * Waveform Protocol 1: | |_ - * __ - * Waveform Protocol 2: | |_ - */ -void RCSwitch::send1() { - if (this->nProtocol == 1){ - this->transmit(3,1); - } + * Sends a "1" Bit + * ___ + * Waveform Protocol 1: | |_ + * __ + * Waveform Protocol 2: | |_ + */ +void RCSwitch::send1() { + if (this->nProtocol == 1){ + this->transmit(3,1); + } else if (this->nProtocol == 2) { this->transmit(2,1); } @@ -533,48 +533,48 @@ void RCSwitch::send1() { } -/** - * Sends a Tri-State "0" Bit - * _ _ - * Waveform: | |___| |___ - */ -void RCSwitch::sendT0() { - this->transmit(1,3); - this->transmit(1,3); -} - -/** - * Sends a Tri-State "1" Bit - * ___ ___ - * Waveform: | |_| |_ - */ -void RCSwitch::sendT1() { - this->transmit(3,1); - this->transmit(3,1); -} - -/** - * Sends a Tri-State "F" Bit - * _ ___ - * Waveform: | |___| |_ - */ -void RCSwitch::sendTF() { - this->transmit(1,3); - this->transmit(3,1); -} - -/** - * Sends a "Sync" Bit - * _ - * Waveform Protocol 1: | |_______________________________ - * _ - * Waveform Protocol 2: | |__________ - */ -void RCSwitch::sendSync() { - - if (this->nProtocol == 1){ - this->transmit(1,31); - } +/** + * Sends a Tri-State "0" Bit + * _ _ + * Waveform: | |___| |___ + */ +void RCSwitch::sendT0() { + this->transmit(1,3); + this->transmit(1,3); +} + +/** + * Sends a Tri-State "1" Bit + * ___ ___ + * Waveform: | |_| |_ + */ +void RCSwitch::sendT1() { + this->transmit(3,1); + this->transmit(3,1); +} + +/** + * Sends a Tri-State "F" Bit + * _ ___ + * Waveform: | |___| |_ + */ +void RCSwitch::sendTF() { + this->transmit(1,3); + this->transmit(3,1); +} + +/** + * Sends a "Sync" Bit + * _ + * Waveform Protocol 1: | |_______________________________ + * _ + * Waveform Protocol 2: | |__________ + */ +void RCSwitch::sendSync() { + + if (this->nProtocol == 1){ + this->transmit(1,31); + } else if (this->nProtocol == 2) { this->transmit(1,10); } @@ -585,127 +585,127 @@ void RCSwitch::sendSync() { #if not defined( RCSwitchDisableReceiving ) /** - * 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; - attachInterrupt(this->nReceiverInterrupt, handleInterrupt, CHANGE); - } -} - -/** - * Disable receiving data - */ -void RCSwitch::disableReceive() { - detachInterrupt(this->nReceiverInterrupt); - 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<changeCount ; i=i+2) { - - if (RCSwitch::timings[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; - } - } - 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; - } - - if (code == 0){ - return false; - }else if (code != 0){ - return true; - } - - -} - -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<changeCount ; i=i+2) { - - if (RCSwitch::timings[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; + * 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; + attachInterrupt(this->nReceiverInterrupt, handleInterrupt, CHANGE); + } +} + +/** + * Disable receiving data + */ +void RCSwitch::disableReceive() { + detachInterrupt(this->nReceiverInterrupt); + 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<changeCount ; i=i+2) { + + if (RCSwitch::timings[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; + } + } + 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; + } + + if (code == 0){ + return false; + }else if (code != 0){ + return true; + } + + +} + +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<changeCount ; i=i+2) { + + if (RCSwitch::timings[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; } } @@ -756,15 +756,15 @@ bool RCSwitch::receiveProtocol3(unsigned int changeCount){ void RCSwitch::handleInterrupt() { static unsigned int duration; - static unsigned int changeCount; - static unsigned long lastTime; - static unsigned int repeatCount; - - - long time = micros(); - duration = time - lastTime; - - if (duration > 5000 && duration > RCSwitch::timings[0] - 200 && duration < RCSwitch::timings[0] + 200) { + static unsigned int changeCount; + static unsigned long lastTime; + static unsigned int repeatCount; + + + long time = micros(); + duration = time - lastTime; + + if (duration > 5000 && duration > RCSwitch::timings[0] - 200 && duration < RCSwitch::timings[0] + 200) { repeatCount++; changeCount--; if (repeatCount == 2) { @@ -778,46 +778,46 @@ void RCSwitch::handleInterrupt() { repeatCount = 0; } changeCount = 0; - } else if (duration > 5000) { - changeCount = 0; - } - - if (changeCount >= RCSWITCH_MAX_CHANGES) { - changeCount = 0; - repeatCount = 0; - } - RCSwitch::timings[changeCount++] = duration; - lastTime = time; -} -#endif - -/** - * Turns a decimal value to its binary representation - */ -char* RCSwitch::dec2binWzerofill(unsigned long Dec, unsigned int bitLength){ + } else if (duration > 5000) { + changeCount = 0; + } + + if (changeCount >= RCSWITCH_MAX_CHANGES) { + changeCount = 0; + repeatCount = 0; + } + RCSwitch::timings[changeCount++] = duration; + lastTime = time; +} +#endif + +/** + * Turns a decimal value to its binary representation + */ +char* RCSwitch::dec2binWzerofill(unsigned long Dec, unsigned int bitLength){ return dec2binWcharfill(Dec, bitLength, '0'); } char* RCSwitch::dec2binWcharfill(unsigned long Dec, unsigned int bitLength, char fill){ - static char bin[64]; - unsigned int i=0; - - while (Dec > 0) { - bin[32+i++] = ((Dec & 1) > 0) ? '1' : fill; - 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] = fill; - } - } - bin[bitLength] = '\0'; - - return bin; -} - - - + static char bin[64]; + unsigned int i=0; + + while (Dec > 0) { + bin[32+i++] = ((Dec & 1) > 0) ? '1' : fill; + 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] = fill; + } + } + bin[bitLength] = '\0'; + + return bin; +} + + + diff --git a/RCSwitch.h b/RCSwitch.h index 957ed1a2e61ce77f8da599997dc4f50b23db8e3a..16dd0dfce9ac3687b9d198325df96debdbcd3121 100644 --- a/RCSwitch.h +++ b/RCSwitch.h @@ -1,40 +1,40 @@ -/* - 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=46 - - Dominik Fischer / dom_fischer(at)web(dot)de - - Frank Oltmanns / <first name>.<last name>(at)gmail(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" -#elif defined(ENERGIA) // LaunchPad, FraunchPad and StellarPad specific - #include "Energia.h" -#else - #include "WProgram.h" -#endif +/* + 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=46 + - Dominik Fischer / dom_fischer(at)web(dot)de + - Frank Oltmanns / <first name>.<last name>(at)gmail(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" +#elif defined(ENERGIA) // LaunchPad, FraunchPad and StellarPad specific + #include "Energia.h" +#else + #include "WProgram.h" +#endif // At least for the ATTiny X4/X5, receiving has to be disabled due to @@ -42,8 +42,8 @@ #if defined( __AVR_ATtinyX5__ ) or defined ( __AVR_ATtinyX4__ ) #define RCSwitchDisableReceiving #endif - -// Number of maximum High/Low changes per packet. + +// 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 @@ -55,12 +55,12 @@ class RCSwitch { - public: - RCSwitch(); - - void switchOn(int nGroupNumber, int nSwitchNumber); - void switchOff(int nGroupNumber, int nSwitchNumber); - void switchOn(char* sGroup, int nSwitchNumber); + public: + 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); @@ -71,10 +71,10 @@ class RCSwitch { void sendTriState(char* Code); void send(unsigned long Code, unsigned int length); - void send(char* Code); - + void send(char* Code); + #if not defined( RCSwitchDisableReceiving ) - void enableReceive(int interrupt); + void enableReceive(int interrupt); void enableReceive(); void disableReceive(); bool available(); @@ -88,7 +88,7 @@ class RCSwitch { #endif void enableTransmit(int nTransmitterPin); - void disableTransmit(); + void disableTransmit(); void setPulseLength(int nPulseLength); void setRepeatTransmit(int nRepeatTransmit); #if not defined( RCSwitchDisableReceiving ) @@ -99,18 +99,18 @@ class RCSwitch { private: char* getCodeWordB(int nGroupNumber, int nSwitchNumber, boolean bStatus); - char* getCodeWordA(char* sGroup, int nSwitchNumber, boolean bStatus); - char* getCodeWordA(char* sGroup, char* sDevice, boolean bStatus); - char* getCodeWordC(char sFamily, int nGroup, int nDevice, boolean bStatus); - char* getCodeWordD(char group, int nDevice, boolean bStatus); - void sendT0(); - void sendT1(); - void sendTF(); - void send0(); - void send1(); - void sendSync(); - void transmit(int nHighPulses, int nLowPulses); - + char* getCodeWordA(char* sGroup, int nSwitchNumber, boolean bStatus); + char* getCodeWordA(char* sGroup, char* sDevice, boolean bStatus); + char* getCodeWordC(char sFamily, int nGroup, int nDevice, boolean bStatus); + char* getCodeWordD(char group, int nDevice, boolean bStatus); + void sendT0(); + void sendT1(); + void sendTF(); + void send0(); + void send1(); + void sendSync(); + void transmit(int nHighPulses, int nLowPulses); + static char* dec2binWzerofill(unsigned long dec, unsigned int length); static char* dec2binWcharfill(unsigned long dec, unsigned int length, char fill); @@ -139,6 +139,6 @@ class RCSwitch { static unsigned int timings[RCSWITCH_MAX_CHANGES]; -}; - -#endif +}; + +#endif diff --git a/examples/ReceiveDemo_Advanced/ReceiveDemo_Advanced.pde b/examples/ReceiveDemo_Advanced/ReceiveDemo_Advanced.pde index a345535683e812204975125ee17cacc9ce64ee31..89cbbc9141b4d8a674684851f52c0f26e7095faf 100644 --- a/examples/ReceiveDemo_Advanced/ReceiveDemo_Advanced.pde +++ b/examples/ReceiveDemo_Advanced/ReceiveDemo_Advanced.pde @@ -21,4 +21,4 @@ void loop() { output(mySwitch.getReceivedValue(), mySwitch.getReceivedBitlength(), mySwitch.getReceivedDelay(), mySwitch.getReceivedRawdata(),mySwitch.getReceivedProtocol()); mySwitch.resetAvailable(); } -} +} diff --git a/examples/ReceiveDemo_Advanced/helperfunctions.ino b/examples/ReceiveDemo_Advanced/helperfunctions.ino index d12db43b6659f80291bc966704a1614a19b4b6e4..56f3c0cb53e973132ac6ac913afe33ff6fe09b9e 100644 --- a/examples/ReceiveDemo_Advanced/helperfunctions.ino +++ b/examples/ReceiveDemo_Advanced/helperfunctions.ino @@ -17,4 +17,4 @@ static char * dec2binWzerofill(unsigned long Dec, unsigned int bitLength){ bin[bitLength] = '\0'; return bin; -} +} diff --git a/examples/ReceiveDemo_Advanced/output.ino b/examples/ReceiveDemo_Advanced/output.ino index dfa49cc229f132c5e4059bcfe7af08c2b4536175..b8b8cf80bd4da385ace04b447fdedfe22ebddf59 100644 --- a/examples/ReceiveDemo_Advanced/output.ino +++ b/examples/ReceiveDemo_Advanced/output.ino @@ -49,4 +49,4 @@ static char* bin2tristate(char* bin) { returnValue[pos2] = '\0'; return returnValue; } - + diff --git a/examples/ReceiveDemo_Simple/ReceiveDemo_Simple.pde b/examples/ReceiveDemo_Simple/ReceiveDemo_Simple.pde index ebd5a2542d5331b98ce4f2dcfc0435e1cf587f89..b55e5d7d09920ce40314ca9ff3965fcabe10156e 100644 --- a/examples/ReceiveDemo_Simple/ReceiveDemo_Simple.pde +++ b/examples/ReceiveDemo_Simple/ReceiveDemo_Simple.pde @@ -32,4 +32,4 @@ void loop() { mySwitch.resetAvailable(); } -} +} diff --git a/examples/TypeA_WithDIPSwitches/TypeA_WithDIPSwitches.pde b/examples/TypeA_WithDIPSwitches/TypeA_WithDIPSwitches.pde index c5b7b574da105b1b7f306b1159221063197def0d..b36215181bce86b6da78eb5ecf545cbf71326134 100644 --- a/examples/TypeA_WithDIPSwitches/TypeA_WithDIPSwitches.pde +++ b/examples/TypeA_WithDIPSwitches/TypeA_WithDIPSwitches.pde @@ -37,4 +37,4 @@ void loop() { // Wait another second delay(1000); -} +} diff --git a/examples/TypeA_WithDIPSwitches_Lightweight/TypeA_WithDIPSwitches_Lightweight.ino b/examples/TypeA_WithDIPSwitches_Lightweight/TypeA_WithDIPSwitches_Lightweight.ino index 8b76cd083f0fe3037c08b8aca20955a53536baa2..5796624b11967adcfe9b823dde9218a45aba556b 100644 --- a/examples/TypeA_WithDIPSwitches_Lightweight/TypeA_WithDIPSwitches_Lightweight.ino +++ b/examples/TypeA_WithDIPSwitches_Lightweight/TypeA_WithDIPSwitches_Lightweight.ino @@ -1,43 +1,43 @@ -/* - This is a minimal sketch without using the library at all but only works for - the 10 pole dip switch sockets. It saves a lot of memory and thus might be - very useful to use with ATTinys :) - - http://code.google.com/p/rc-switch/ -*/ - -int RCLpin = 7; - -void setup() { - pinMode(RCLpin, OUTPUT); -} - -void loop() { - RCLswitch(0b010001000001); // DIPs an Steckdose: 0100010000 An:01 - delay(2000); - - RCLswitch(0b010001000010); // DIPs an Steckdose: 0100010000 Aus:10 - delay(2000); -} - -void RCLswitch(uint16_t code) { - for (int nRepeat=0; nRepeat<6; nRepeat++) { - for (int i=4; i<16; i++) { - RCLtransmit(1,3); - if (((code << (i-4)) & 2048) > 0) { - RCLtransmit(1,3); - } else { - RCLtransmit(3,1); - } - } - RCLtransmit(1,31); - } -} - -void RCLtransmit(int nHighPulses, int nLowPulses) { - digitalWrite(RCLpin, HIGH); - delayMicroseconds( 350 * nHighPulses); - digitalWrite(RCLpin, LOW); - delayMicroseconds( 350 * nLowPulses); -} - +/* + This is a minimal sketch without using the library at all but only works for + the 10 pole dip switch sockets. It saves a lot of memory and thus might be + very useful to use with ATTinys :) + + http://code.google.com/p/rc-switch/ +*/ + +int RCLpin = 7; + +void setup() { + pinMode(RCLpin, OUTPUT); +} + +void loop() { + RCLswitch(0b010001000001); // DIPs an Steckdose: 0100010000 An:01 + delay(2000); + + RCLswitch(0b010001000010); // DIPs an Steckdose: 0100010000 Aus:10 + delay(2000); +} + +void RCLswitch(uint16_t code) { + for (int nRepeat=0; nRepeat<6; nRepeat++) { + for (int i=4; i<16; i++) { + RCLtransmit(1,3); + if (((code << (i-4)) & 2048) > 0) { + RCLtransmit(1,3); + } else { + RCLtransmit(3,1); + } + } + RCLtransmit(1,31); + } +} + +void RCLtransmit(int nHighPulses, int nLowPulses) { + digitalWrite(RCLpin, HIGH); + delayMicroseconds( 350 * nHighPulses); + digitalWrite(RCLpin, LOW); + delayMicroseconds( 350 * nLowPulses); +} + diff --git a/examples/TypeC_Intertechno/TypeC_Intertechno.pde b/examples/TypeC_Intertechno/TypeC_Intertechno.pde index 05596d84b85de14a16cf5bd85c04dc45be3024e1..012a93a6645aef03b8fb49d8090e85f4ab74bc1e 100644 --- a/examples/TypeC_Intertechno/TypeC_Intertechno.pde +++ b/examples/TypeC_Intertechno/TypeC_Intertechno.pde @@ -1,40 +1,40 @@ -/* - Example for Intertechno outlets - - http://code.google.com/p/rc-switch/ -*/ - -#include <RCSwitch.h> - -RCSwitch mySwitch = RCSwitch(); - -void setup() { - - // Transmitter is connected to Arduino Pin #10 - mySwitch.enableTransmit(10); - - // Optional set pulse length. - // mySwitch.setPulseLength(320); - -} - -void loop() { - - // Switch on: - // The first parameter represents the familycode (a, b, c, ... f) - // The second parameter represents the group number - // The third parameter represents the device number - // - // In this example it's family 'b', group #3, device #2 - mySwitch.switchOn('b', 3, 2); - - // Wait a second - delay(1000); - - // Switch off - mySwitch.switchOff('b', 3, 2); - - // Wait another second - delay(1000); - +/* + Example for Intertechno outlets + + http://code.google.com/p/rc-switch/ +*/ + +#include <RCSwitch.h> + +RCSwitch mySwitch = RCSwitch(); + +void setup() { + + // Transmitter is connected to Arduino Pin #10 + mySwitch.enableTransmit(10); + + // Optional set pulse length. + // mySwitch.setPulseLength(320); + +} + +void loop() { + + // Switch on: + // The first parameter represents the familycode (a, b, c, ... f) + // The second parameter represents the group number + // The third parameter represents the device number + // + // In this example it's family 'b', group #3, device #2 + mySwitch.switchOn('b', 3, 2); + + // Wait a second + delay(1000); + + // Switch off + mySwitch.switchOff('b', 3, 2); + + // Wait another second + delay(1000); + } \ No newline at end of file diff --git a/keywords.txt b/keywords.txt index 48fd797117eec8a4951e54068bab0892ba9d2343..2474367c43e764b8a36012e34eb53ff7d0552f28 100644 --- a/keywords.txt +++ b/keywords.txt @@ -1,57 +1,57 @@ -####################################### -# Syntax Coloring Map For RCSwitch -####################################### - -####################################### -# Datatypes (KEYWORD1) -####################################### - -RCSwitch KEYWORD1 - -####################################### -# Methods and Functions (KEYWORD2) -####################################### - -########## -#SENDS Begin -########## -switchOn KEYWORD2 -switchOff KEYWORD2 -sendTriState KEYWORD2 -send KEYWORD2 -########## -#SENDS End -########## - -########## -#RECEIVE Begin -########## -enableReceive KEYWORD2 -disableReceive KEYWORD2 -available KEYWORD2 -resetAvailable KEYWORD2 -setReceiveTolerance KEYWORD2 -getReceivedValue KEYWORD2 -getReceivedBitlength KEYWORD2 -getReceivedDelay KEYWORD2 -getReceivedProtocol KEYWORD2 -getReceivedRawdata KEYWORD2 -########## -#RECEIVE End -########## - -########## -#OTHERS Begin -########## -enableTransmit KEYWORD2 -disableTransmit KEYWORD2 -setPulseLength KEYWORD2 -setProtocol KEYWORD2 -setRepeatTransmit KEYWORD2 -########## -#OTHERS End -########## - -####################################### -# Constants (LITERAL1) -####################################### +####################################### +# Syntax Coloring Map For RCSwitch +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +RCSwitch KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +########## +#SENDS Begin +########## +switchOn KEYWORD2 +switchOff KEYWORD2 +sendTriState KEYWORD2 +send KEYWORD2 +########## +#SENDS End +########## + +########## +#RECEIVE Begin +########## +enableReceive KEYWORD2 +disableReceive KEYWORD2 +available KEYWORD2 +resetAvailable KEYWORD2 +setReceiveTolerance KEYWORD2 +getReceivedValue KEYWORD2 +getReceivedBitlength KEYWORD2 +getReceivedDelay KEYWORD2 +getReceivedProtocol KEYWORD2 +getReceivedRawdata KEYWORD2 +########## +#RECEIVE End +########## + +########## +#OTHERS Begin +########## +enableTransmit KEYWORD2 +disableTransmit KEYWORD2 +setPulseLength KEYWORD2 +setProtocol KEYWORD2 +setRepeatTransmit KEYWORD2 +########## +#OTHERS End +########## + +####################################### +# Constants (LITERAL1) +#######################################