Library to switch 433MHz remote controlled sockets.
Diff: RCSwitch.h
- Revision:
- 0:6f4be1a7962c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RCSwitch.h Sun Oct 12 09:57:12 2014 +0000 @@ -0,0 +1,364 @@ +/** + *@section DESCRIPTION + * RCSwitch - Ported from the Arduino libary for remote control outlet switches + * 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 + * - Chris Dick / Porting to mbed + * + * Project home: http://code.google.com/p/rc-switch/ + * @section LICENSE + * Copyright (c) 2011 Suat Özgür. All right reserved. + * + * 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 + * Permission is hereby granted, free of charge, to any person obtaining a copy + * @file "RCSwitch.h" + */ +#ifndef _RCSwitch_h +#define _RCSwitch_h +#include "mbed.h" + +// might need to change this... +// We can handle up to (unsigned long) => 32 bit * 2 H/L changes per bit + 2 for sync +#define RCSWITCH_MAX_CHANGES 67 /**< Number of maximum High/Low changes per packet. */ + +#define PROTOCOL3_SYNC_FACTOR 71 /**< Protocol 3 Sync Factor */ +#define PROTOCOL3_0_HIGH_CYCLES 4 /**< Protocol 3 number of high cycles in a 0 */ +#define PROTOCOL3_0_LOW_CYCLES 11 /**< Protocol 3 number of low cycles in a 0*/ +#define PROTOCOL3_1_HIGH_CYCLES 9 /**< Protocol 3 number of high cycles in a 1*/ +#define PROTOCOL3_1_LOW_CYCLES 6 /**< Protocol 3 number of low cycles in a 1*/ +/** RCSwitch Class + * + * Example: + * @code + * #include "mbed.h" + * #include "RCSwitch.h" + * + * // This Example should only do one of either transmit or receive + * //#define TRANSMIT + * #define RECEIVE + * + * Serial pc(USBTX, USBRX); // tx, rx + * RCSwitch mySwitch = RCSwitch( p11, p21 ); //tx, rx + * + * int main() + * { + * pc.printf("Setup"); + * while(1) { + * #ifdef RECEIVE + * if (mySwitch.available()) { + * + * int value = mySwitch.getReceivedValue(); + * + * if (value == 0) { + * pc.printf("Unknown encoding"); + * } else { + * pc.printf("Received %d \n\r", mySwitch.getReceivedValue()); + * pc.printf(" bit %d \n\r", mySwitch.getReceivedBitlength()); + * pc.printf(" Protocol: %d \n\r", mySwitch.getReceivedProtocol()); + * } + * mySwitch.resetAvailable(); + * } + * #endif + * #ifdef TRANSMIT + * // Example: TypeA_WithDIPSwitches + * mySwitch.switchOn("11111", "00010"); + * wait(1); + * mySwitch.switchOn("11111", "00010"); + * wait(1); + * + * // Same switch as above, but using decimal code + * mySwitch.send(5393, 24); + * wait(1); + * mySwitch.send(5396, 24); + * wait(1); + * + * // Same switch as above, but using binary code + * mySwitch.send("000000000001010100010001"); + * wait(1); + * mySwitch.send("000000000001010100010100"); + * wait(1); + * + * // Same switch as above, but tri-state code + * mySwitch.sendTriState("00000FFF0F0F"); + * wait(1); + * mySwitch.sendTriState("00000FFF0FF0"); + * wait(1); + * #endif + * } + * } + * + * @endcode + */ + + /** + * + * + */ +class RCSwitch { + + public: + /** Class constructor. + * The constructor assigns the specified pinout, attatches + * an Interrupt to the receive pin. for the LPC1768 this must not + * be pins 19 and 20. For the KL25Z, the pin must be on ports A or C + * @param tx Transmitter pin of the RF module. + * @param rx Receiver pin of the RF module. + */ + RCSwitch(PinName tx, PinName rx); + /** Class constructor. + * The constructor assigns the specified pinout, attatches + * an Interrupt to the receive pin. for the LPC1768 this must not + * be pins 19 and 20. For the KL25Z, the pin must be on ports A or C + * @param tx Transmitter pin of the RF module. + * @param rx Receiver pin of the RF module. + * @param tx_en Enable pin of the transmitter + */ + RCSwitch(PinName tx, PinName rx, PinName rx_en); +/** + * Set protocol to be used in transmission + * @param nProtocol Protocol type ot transmit + */ + void setProtocol(int nProtocol); +/** + * Set protocol to be used in transmission + * @param nProtocol Protocol type ot transmit + * @param nPulseLength Length of each pulse + */ + void setProtocol(int nProtocol, int nPulseLength); +/** + * 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 switchOn(char* sGroup, char* sDevice); +/** + * 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 switchOff(char* sGroup, char* sDevice); +/** + * 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 switchOn(char* sGroup, int nChannelCode); +/** + * 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 switchOff(char* sGroup, int nChannelCode); +/** + * 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 switchOn(int nAddressCode, int nChannelCode); +/** + * 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 switchOff(int nAddressCode, int nChannelCode); +/** + * 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 switchOn(char sFamily, int nGroup, int nDevice); +/** + * 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 switchOff(char sFamily, int nGroup, 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) + */ + void switchOn(char sGroup, int nDevice); +/** + * 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) + */ + void switchOff(char sGroup, int nDevice); +/** + * Sends a codeword + * @param sCodeWord Codeword to be sent + */ + void sendTriState(char* Code); +/** + * Converts a CodeWord to a set Length and sends it + * @param Code CodeWord to be sent + * @param length Length of CodeWord to send + */ + void send(unsigned long Code, unsigned int length); +/** + * Sends a CodeWord + * @param Code CodeWord to send + */ + void send(char* Code); +/** + * Enable receiving data This clear message storage + * and enables the interrupt, which may enable the port + */ + void enableReceive(); +/** + * Disable receiving data This disables the interrupt + * which may disable the port + */ + void disableReceive(); +/** + * Message availiable + * @return bool Message availiability + */ + bool available(); +/** + * Clear Messages + */ + void resetAvailable(); +/** + * Get Message Value + * @return unsigned long The value of the message received + */ + unsigned long getReceivedValue(); +/** + * Get bit length + * @return unsigned int Number of bits received + */ + unsigned int getReceivedBitlength(); +/** + * Get the delay + * @Return unsigned int The delay + */ + unsigned int getReceivedDelay(); +/** + * Get Protocol + * @return unsigned int The protocol used in the message + */ + unsigned int getReceivedProtocol(); +/** + * Get Raw data + * @return unsinged int The raw data of the message recieved + */ + unsigned int* getReceivedRawdata(); +/** + * Enable the transmitter + */ + void enableTransmit(); +/** + * Disable the transmitter + */ + void disableTransmit(); +/** + * Set pulse length in micro seconds + * @param nPulseLength the Length of the pulse + */ + void setPulseLength(int nPulseLength); +/** + * Set number of times to repeat transmission + * @param nRepeat Number of repeats + */ + void setRepeatTransmit(int nRepeatTransmit); +/** + * Set receive tolerance + * @param nPercent Percentage tolerance of the receiver + */ + void setReceiveTolerance(int nPercent); + + static int nReceiveTolerance; /**< Tolerance of the receiver */ + static unsigned long nReceivedValue; /**< Value Recieved */ + static unsigned int nReceivedBitlength; /**< Length in bits of value reveived */ + static unsigned int nReceivedDelay; /**< Delay in receive */ + static unsigned int nReceivedProtocol; /**< Protocol of message recieved */ + static bool ReceiveEnabled; /**< Receive enabled */ + static bool TransmitEnable; /**< Transmit enabled */ + static bool TransmitEnablePin; /**< Pin of transmitter enable pin */ + static unsigned int timings[RCSWITCH_MAX_CHANGES]; /**< timings[0] contains sync timing, followed by a number of bits */ + + private: + DigitalOut _tx; + InterruptIn _rx; + DigitalOut _tx_en; + + char* getCodeWordB(int nGroupNumber, int nSwitchNumber, bool bStatus); + + char* getCodeWordA(char* sGroup, int nSwitchNumber, bool bStatus); + + char* getCodeWordA(char* sGroup, char* sDevice, bool bStatus); + + char* getCodeWordC(char sFamily, int nGroup, int nDevice, bool bStatus); + + char* getCodeWordD(char group, int nDevice, bool bStatus); + + void sendT0(); + + void sendT1(); + + void sendTF(); + + void send0(); + + void send1(); + + void sendSync(); + + void transmit(int nHighPulses, int nLowPulses); + + void RCSwitchRxPinChange(); + + static char* dec2binWzerofill(unsigned long dec, unsigned int length); + + static char* dec2binWcharfill(unsigned long dec, unsigned int length, char fill); + + static void handleInterrupt(); + + static bool receiveProtocol1(unsigned int changeCount); + + static bool receiveProtocol2(unsigned int changeCount); + + static bool receiveProtocol3(unsigned int changeCount); + + int nReceiverInterrupt; + int nTransmitterPin; + int nPulseLength; + int nRepeatTransmit; + char nProtocol; + Timer timer; +}; + +#endif