4 Commits

Author SHA1 Message Date
Rafi Khan
222630922f Added example test file for recs80 2017-09-09 19:46:13 -04:00
Rafi Khan
9b39a2f7dc Completed adding recs80 sending and decoding
I have tested it using two arduinos (one for sending and the other for
receiving) and have achieved a 90% (estimate) success rate.
2017-09-09 19:43:32 -04:00
Rafi Khan
42b791f9ad Fixed bugs and added defines
Ready for testing
2017-08-18 17:10:23 -06:00
Rafi Khan
c43d221a7b Added sending for RECS80
Has not yet been tested
2017-08-17 18:04:06 -06:00
33 changed files with 220 additions and 2634 deletions

2417
Doxyfile

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ This library enables you to send and receive using infra-red signals on an Ardui
Tutorials and more information will be made available on [the official homepage](http://z3t0.github.io/Arduino-IRremote/).
## Version - 2.5.0b
## Version - 2.4.0b
## Installation
1. Navigate to the [Releases](https://github.com/z3t0/Arduino-IRremote/releases) page.
@@ -43,7 +43,7 @@ We are open to suggestions for adding support to new boards, however we highly r
| [ATtiny84](https://github.com/SpenceKonde/ATTinyCore) | **6** | **1** |
| [ATtiny85](https://github.com/SpenceKonde/ATTinyCore) | **1** | **TINY0** |
| [ATmega8](https://github.com/MCUdude/MiniCore) | **9** | **1** |
| Atmega32u4 | 5, **9**, 13 | 1, 3, **4** |
| Atmega32u4 | 5, 9, **13** | 1, 3, **4** |
| [ATmega48, ATmega88, ATmega168, ATmega328](https://github.com/MCUdude/MiniCore) | **3**, 9 | 1, **2** |
| [ATmega1284](https://github.com/MCUdude/MightyCore) | 13, 14, 6 | 1, **2**, 3 |
| [ATmega164, ATmega324, ATmega644](https://github.com/MCUdude/MightyCore) | 13, **14** | 1, **2** |
@@ -68,20 +68,6 @@ The table above lists the currently supported timers and corresponding send pins
## Usage
- TODO (Check examples for now)
## API documentation
This project documents the library API using [Doxygen](http://www.doxygen.org).
It is planned to make generated and up-to-date API documentation available online.
To generate the API documentation,
Doxygen, as well as [Graphviz](http://www.graphviz.org/) should be installed.
(Note that on Windows, it may be necessary to add the Graphviz binary directory
(something like `C:\Program Files\Graphviz2.38\bin`)
to the `PATH` variable manually.)
With Doxygen and Graphviz installed, issue the command
`doxygen` from the command line in the main project directory, which will
generate the API documentation in HTML format.
The just generated `api-doc/index.html` can now be opened in a browser.
## Contributing
If you want to contribute to this project:
- Report bugs and errors

View File

@@ -1,6 +1,3 @@
## 2.5.0
- Added Philips Extended RC-5 protocol support [PR #522] (https://github.com/z3t0/Arduino-IRremote/pull/522)
## 2.4.0 - 2017/08/10
- Cleanup of hardware dependencies. Merge in SAM support [PR #437](https://github.com/z3t0/Arduino-IRremote/pull/437)

View File

@@ -56,6 +56,7 @@ void encoding (decode_results *results)
case AIWA_RC_T501: Serial.print("AIWA_RC_T501"); break ;
case PANASONIC: Serial.print("PANASONIC"); break ;
case DENON: Serial.print("Denon"); break ;
case RECS80: Serial.print("RECS80"); break ;
}
}

View File

@@ -0,0 +1,16 @@
#include <IRremote.h>
IRsend irsend;
void setup()
{
delay(2000);
}
void loop() {
for (int i = 0; i < 512; i++) {
irsend.sendRECS80(i);
delay(5000); //5 second delay between each signal burst
}
}

View File

@@ -10,6 +10,7 @@
*/
#include <IRremote.h>
#include <IRremoteInt.h>
// Dumps out the decode_results structure.
// Call this after IRrecv::decode()

View File

@@ -4,6 +4,7 @@
*/
#include <IRremote.h>
#include <IRremoteInt.h>
IRsend irsend;

View File

@@ -3,7 +3,7 @@ version=2.4.0
author=shirriff, z3t0
maintainer=z3t0
sentence=Send and receive infrared signals with multiple protocols
paragraph=Find more information at https://github.com/z3t0/Arduino-IRremote
paragraph=See more at https://github.com/z3t0/Arduino-IRremote
category=Communication
url=https://github.com/z3t0/Arduino-IRremote
architectures=*

View File

@@ -21,6 +21,7 @@
// Defining IR_GLOBAL here allows us to declare the instantiation of global variables
#define IR_GLOBAL
# include "IRremote.h"
# include "IRremoteInt.h"
#undef IR_GLOBAL
#ifdef HAS_AVR_INTERRUPT_H
@@ -51,11 +52,10 @@ int MATCH (int measured, int desired)
DBG_PRINT(TICKS_HIGH(desired), DEC);
bool passed = ((measured >= TICKS_LOW(desired)) && (measured <= TICKS_HIGH(desired)));
if (passed) {
if (passed)
DBG_PRINTLN(F("?; passed"));
} else {
else
DBG_PRINTLN(F("?; FAILED"));
}
return passed;
}
@@ -78,11 +78,10 @@ int MATCH_MARK (int measured_ticks, int desired_us)
bool passed = ((measured_ticks >= TICKS_LOW (desired_us + MARK_EXCESS))
&& (measured_ticks <= TICKS_HIGH(desired_us + MARK_EXCESS)));
if (passed) {
if (passed)
DBG_PRINTLN(F("?; passed"));
} else {
else
DBG_PRINTLN(F("?; FAILED"));
}
return passed;
}
@@ -105,11 +104,10 @@ int MATCH_SPACE (int measured_ticks, int desired_us)
bool passed = ((measured_ticks >= TICKS_LOW (desired_us - MARK_EXCESS))
&& (measured_ticks <= TICKS_HIGH(desired_us - MARK_EXCESS)));
if (passed) {
if (passed)
DBG_PRINTLN(F("?; passed"));
} else {
else
DBG_PRINTLN(F("?; FAILED"));
}
return passed;
}

View File

@@ -1,7 +1,3 @@
/**
* @file IRremote.h
* @brief Public API to the library.
*/
//******************************************************************************
// IRremote
@@ -25,7 +21,7 @@
//------------------------------------------------------------------------------
// The ISR header contains several useful macros the user may wish to use
//
#include "private/IRremoteInt.h"
#include "IRremoteInt.h"
//------------------------------------------------------------------------------
// Supported IR protocols
@@ -83,6 +79,9 @@
#define DECODE_LEGO_PF 0 // NOT WRITTEN
#define SEND_LEGO_PF 1
#define DECODE_RECS80 1 // NOT WRITTEN
#define SEND_RECS80 1 // Still being tested
//------------------------------------------------------------------------------
// When sending a Pronto code we request to send either the "once" code
// or the "repeat" code
@@ -98,10 +97,10 @@
#define PRONTO_FALLBACK true
#define PRONTO_NOFALLBACK false
/**
* An enum consisting of all supported formats.
* You do NOT need to remove entries from this list when disabling protocols!
*/
//------------------------------------------------------------------------------
// An enumerated list of all supported formats
// You do NOT need to remove entries from this list when disabling protocols!
//
typedef
enum {
UNKNOWN = -1,
@@ -123,12 +122,13 @@ typedef
DENON,
PRONTO,
LEGO_PF,
RECS80,
}
decode_type_t;
/**
* Set DEBUG to 1 for lots of lovely debug output.
*/
//------------------------------------------------------------------------------
// Set DEBUG to 1 for lots of lovely debug output
//
#define DEBUG 0
//------------------------------------------------------------------------------
@@ -138,13 +138,7 @@ decode_type_t;
# define DBG_PRINT(...) Serial.print(__VA_ARGS__)
# define DBG_PRINTLN(...) Serial.println(__VA_ARGS__)
#else
/**
* If DEBUG, print the arguments, otherwise do nothing.
*/
# define DBG_PRINT(...)
/**
* If DEBUG, print the arguments as a line, otherwise do nothing.
*/
# define DBG_PRINTLN(...)
#endif
@@ -155,71 +149,39 @@ int MATCH (int measured, int desired) ;
int MATCH_MARK (int measured_ticks, int desired_us) ;
int MATCH_SPACE (int measured_ticks, int desired_us) ;
/**
* Results returned from the decoder
*/
//------------------------------------------------------------------------------
// Results returned from the decoder
//
class decode_results
{
public:
decode_type_t decode_type; ///< UNKNOWN, NEC, SONY, RC5, ...
unsigned int address; ///< Used by Panasonic & Sharp [16-bits]
unsigned long value; ///< Decoded value [max 32-bits]
int bits; ///< Number of bits in decoded value
volatile unsigned int *rawbuf; ///< Raw intervals in 50uS ticks
int rawlen; ///< Number of records in rawbuf
int overflow; ///< true iff IR raw code too long
decode_type_t decode_type; // UNKNOWN, NEC, SONY, RC5, ...
unsigned int address; // Used by Panasonic & Sharp [16-bits]
unsigned long value; // Decoded value [max 32-bits]
int bits; // Number of bits in decoded value
volatile unsigned int *rawbuf; // Raw intervals in 50uS ticks
int rawlen; // Number of records in rawbuf
int overflow; // true iff IR raw code too long
};
/**
* Decoded value for NEC when a repeat code is received
*/
//------------------------------------------------------------------------------
// Decoded value for NEC when a repeat code is received
//
#define REPEAT 0xFFFFFFFF
/**
* Main class for receiving IR
*/
//------------------------------------------------------------------------------
// Main class for receiving IR
//
class IRrecv
{
public:
/**
* Instantiate the IRrecv class. Multiple instantiation is not supported.
* @param recvpin Arduino pin to use. No sanity check is made.
*/
IRrecv (int recvpin) ;
/**
* Instantiate the IRrecv class. Multiple instantiation is not supported.
* @param recvpin Arduino pin to use, where a demodulating IR receiver is connected.
* @param blinkpin pin to blink when receiving IR. Not supported by all hardware. No sanity check is made.
*/
IRrecv (int recvpin, int blinkpin);
/**
* TODO: Why is this public???
* @param blinkflag
*/
void blink13 (int blinkflag) ;
/**
* Attempt to decode the recently receive IR signal
* @param results decode_results instance returning the decode, if any.
* @return success of operation. TODO: convert to bool
*/
int decode (decode_results *results) ;
/**
* Enable IR reception.
*/
void enableIRIn ( ) ;
/**
* Returns status of reception
* @return true if no reception is on-going.
*/
bool isIdle ( ) ;
/**
* Called to re-enable IR reception.
*/
void resume ( ) ;
private:
@@ -228,17 +190,10 @@ class IRrecv
//......................................................................
# if (DECODE_RC5 || DECODE_RC6)
/**
* This helper function is shared by RC5 and RC6
*/
// This helper function is shared by RC5 and RC6
int getRClevel (decode_results *results, int *offset, int *used, int t1) ;
# endif
# if DECODE_RC5
/**
* Try to decode the recently received IR signal as an RC5 signal-
* @param results decode_results instance returning the decode, if any.
* @return Success of the operation.
*/
bool decodeRC5 (decode_results *results) ;
# endif
# if DECODE_RC6
@@ -300,11 +255,15 @@ class IRrecv
# if DECODE_LEGO_PF
bool decodeLegoPowerFunctions (decode_results *results) ;
# endif
# if DECODE_RECS80
bool decodeRECS80(decode_results *results);
# endif
} ;
/**
* Main class for sending IR
*/
//------------------------------------------------------------------------------
// Main class for sending IR
//
class IRsend
{
public:
@@ -330,7 +289,6 @@ class IRsend
//......................................................................
# if SEND_RC5
void sendRC5 (unsigned long data, int nbits) ;
void sendRC5ext (unsigned long addr, unsigned long cmd, boolean toggle);
# endif
# if SEND_RC6
void sendRC6 (unsigned long data, int nbits) ;
@@ -400,6 +358,10 @@ class IRsend
# if SEND_LEGO_PF
void sendLegoPowerFunctions (uint16_t data, bool repeat = true) ;
# endif
//......................................................................
# if SEND_RECS80
void sendRECS80 (uint16_t data) ;
# endif
#ifdef USE_SOFT_CARRIER
private:

View File

@@ -34,22 +34,19 @@
//------------------------------------------------------------------------------
// Information for the Interrupt Service Routine
//
#define RAWBUF 101 ///< Maximum length of raw duration buffer. Must be odd.
#define RAWBUF 101 // Maximum length of raw duration buffer
/**
* This struct is used to communicate with the ISR (interrupt service routine).
*/
typedef
struct {
// The fields are ordered to reduce memory over caused by struct-padding
uint8_t rcvstate; ///< State Machine state
uint8_t recvpin; ///< Pin connected to IR data from detector
uint8_t rcvstate; // State Machine state
uint8_t recvpin; // Pin connected to IR data from detector
uint8_t blinkpin;
uint8_t blinkflag; ///< true -> enable blinking of pin on IR processing
uint8_t rawlen; ///< counter of entries in rawbuf
unsigned int timer; ///< State timer, counts 50uS ticks.
unsigned int rawbuf[RAWBUF]; ///< raw data
uint8_t overflow; ///< Raw buffer overflow occurred
uint8_t blinkflag; // true -> enable blinking of pin on IR processing
uint8_t rawlen; // counter of entries in rawbuf
unsigned int timer; // State timer, counts 50uS ticks.
unsigned int rawbuf[RAWBUF]; // raw data
uint8_t overflow; // Raw buffer overflow occurred
}
irparams_t;
@@ -60,11 +57,9 @@ irparams_t;
#define STATE_STOP 5
#define STATE_OVERFLOW 6
/**
* Allow all parts of the code access to the ISR data
* NB. The data can be changed by the ISR at any time, even mid-function
* Therefore we declare it as "volatile" to stop the compiler/CPU caching it
*/
// Allow all parts of the code access to the ISR data
// NB. The data can be changed by the ISR at any time, even mid-function
// Therefore we declare it as "volatile" to stop the compiler/CPU caching it
EXTERN volatile irparams_t irparams;
//------------------------------------------------------------------------------
@@ -84,12 +79,8 @@ EXTERN volatile irparams_t irparams;
// Pulse parameters in uSec
//
/**
* When received, marks tend to be too long and
* spaces tend to be too short.
* To compensate for this, MARK_EXCESS is subtracted from all marks,
* and added to all spaces.
*/
// Due to sensor lag, when received, Marks tend to be 100us too long and
// Spaces tend to be 100us too short
#define MARK_EXCESS 100
// Upper and Lower percentage tolerances in measurements
@@ -98,7 +89,7 @@ EXTERN volatile irparams_t irparams;
#define UTOL (1.0 + (TOLERANCE/100.))
// Minimum gap between IR transmissions
#define _GAP 5000
#define _GAP 8000
#define GAP_TICKS (_GAP/USECPERTICK)
#define TICKS_LOW(us) ((int)(((us)*LTOL/USECPERTICK)))

View File

@@ -85,7 +85,7 @@
# undef HAS_AVR_INTERRUPT_H
// Sending not implemented
# undef SENDING_SUPPORTED
# undef SENDING_SUPPORTED#
// Supply own enbleIRIn
# undef USE_DEFAULT_ENABLE_IR_IN
@@ -131,8 +131,8 @@
// Teensy 2.0
#elif defined(__AVR_ATmega32U4__)
//#define IR_USE_TIMER1 // tx = pin 14
#define IR_USE_TIMER3 // tx = pin 9
//#define IR_USE_TIMER4_HS // tx = pin 10
//#define IR_USE_TIMER3 // tx = pin 9
#define IR_USE_TIMER4_HS // tx = pin 10
// Teensy 3.0 / Teensy 3.1
#elif defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__)

View File

@@ -3,6 +3,7 @@
// This file contains functions specific to the ESP32.
#include "IRremote.h"
#include "IRremoteInt.h"
// "Idiot check"
#ifdef USE_DEFAULT_ENABLE_IR_IN

View File

@@ -1,4 +1,5 @@
#include "IRremote.h"
#include "IRremoteInt.h"
//+=============================================================================
// Decodes the received IR message
@@ -84,6 +85,11 @@ int IRrecv::decode (decode_results *results)
if (decodeLegoPowerFunctions(results)) return true ;
#endif
#if DECODE_RECS80
DBG_PRINTLN("Attempting RECS80 decode");
if (decodeRECS80(results)) return true;
#endif
// decodeHash returns a hash on any input.
// Thus, it needs to be last in the list.
// If you add any decodes, add them before this.

View File

@@ -1,4 +1,5 @@
#include "IRremote.h"
#include "IRremoteInt.h"
#ifdef SENDING_SUPPORTED
//+=============================================================================

View File

@@ -1,4 +1,5 @@
#include "IRremote.h"
#include "IRremoteInt.h"
//==============================================================================
// AAA IIIII W W AAA

View File

@@ -1,4 +1,5 @@
#include "IRremote.h"
#include "IRremoteInt.h"
// Reverse Engineered by looking at RAW dumps generated by IRremote

View File

@@ -1,4 +1,5 @@
#include "IRremote.h"
#include "IRremoteInt.h"
//==============================================================================
// DDDD IIIII SSSS H H

View File

@@ -1,4 +1,5 @@
#include "IRremote.h"
#include "IRremoteInt.h"
//==============================================================================
// JJJJJ V V CCCC

View File

@@ -1,4 +1,5 @@
#include "IRremote.h"
#include "IRremoteInt.h"
//==============================================================================
// L GGGG

View File

@@ -1,4 +1,5 @@
#include "IRremote.h"
#include "IRremoteInt.h"
#include "ir_Lego_PF_BitStreamEncoder.h"
//==============================================================================

View File

@@ -1,4 +1,5 @@
#include "IRremote.h"
#include "IRremoteInt.h"
//==============================================================================
// MMMMM IIIII TTTTT SSSS U U BBBB IIIII SSSS H H IIIII

View File

@@ -1,4 +1,5 @@
#include "IRremote.h"
#include "IRremoteInt.h"
//==============================================================================
// N N EEEEE CCCC

View File

@@ -1,4 +1,5 @@
#include "IRremote.h"
#include "IRremoteInt.h"
//==============================================================================
// PPPP AAA N N AAA SSSS OOO N N IIIII CCCC

View File

@@ -1,4 +1,5 @@
#include "IRremote.h"
#include "IRremoteInt.h"
//+=============================================================================
// Gets one undecoded level at a time from the raw buffer.
@@ -77,73 +78,6 @@ void IRsend::sendRC5 (unsigned long data, int nbits)
space(0); // Always end with the LED off
}
void IRsend::sendRC5ext (unsigned long addr, unsigned long cmd, boolean toggle)
{
// Set IR carrier frequency
enableIROut(36);
unsigned long addressBits = 5;
unsigned long commandBits = 7;
unsigned long nbits = addressBits + commandBits;
// Start
mark(RC5_T1);
// Bit #6 of the command part, but inverted!
unsigned long cmdBit6 = (1UL << (commandBits-1)) & cmd;
if (cmdBit6) {
// Inverted (1 -> 0 = mark-to-space)
mark(RC5_T1);
space(RC5_T1);
} else {
space(RC5_T1);
mark(RC5_T1);
}
commandBits--;
// Toggle bit
static int toggleBit = 1;
if (toggle) {
if (toggleBit == 0) {
toggleBit = 1;
} else {
toggleBit = 0;
}
}
if (toggleBit) {
space(RC5_T1);
mark(RC5_T1);
} else {
mark(RC5_T1);
space(RC5_T1);
}
// Address
for (unsigned long mask = 1UL << (addressBits - 1); mask; mask >>= 1) {
if (addr & mask) {
space(RC5_T1); // 1 is space, then mark
mark(RC5_T1);
} else {
mark(RC5_T1);
space(RC5_T1);
}
}
// Command
for (unsigned long mask = 1UL << (commandBits - 1); mask; mask >>= 1) {
if (cmd & mask) {
space(RC5_T1); // 1 is space, then mark
mark(RC5_T1);
} else {
mark(RC5_T1);
space(RC5_T1);
}
}
space(0); // Always end with the LED off
}
#endif
//+=============================================================================

92
src/ir_RECS80.cpp Normal file
View File

@@ -0,0 +1,92 @@
#include "IRremote.h"
#include "IRremoteInt.h"
// RECS80
// Documentation : http://www.sbprojects.com/knowledge/ir/recs80.php
#define RECS80_MARK 158
#define RECS80_ONE_SPACE 7432
#define RECS80_ZERO_SPACE 4902
#define RECS80_BITS 12
#define RECS80_BITS_DATA 9
#define RECS80_ADDRESS_BITS 3
#define RECS80_COMMAND_BITS 6
#if SEND_RECS80
void IRsend::sendRECS80 (uint16_t data) {
// Set IR carrier frequency
enableIROut(38);
// Header
mark(RECS80_MARK);
space(RECS80_ONE_SPACE);
// Data: address and command
for (uint16_t mask = 1 << (RECS80_COMMAND_BITS + RECS80_ADDRESS_BITS - 1); mask; mask >>=1) {
mark(RECS80_MARK);
if (data & mask) {
space(RECS80_ONE_SPACE);
} else {
space(RECS80_ZERO_SPACE);
}
}
mark(RECS80_MARK);
space(0);
}
#endif // SEND_RECS80
#if DECODE_RECS80
bool IRrecv::decodeRECS80 (decode_results *results)
{
long data = 0;
long offset = 1;
// Check that there is enough data
if (irparams.rawlen < (2 * RECS80_BITS) - 2) {
DBG_PRINTLN("Not long enough");
DBG_PRINTLN(irparams.rawlen);
return false;
}
// Initial mark and space
if (!MATCH_MARK(results->rawbuf[offset++], RECS80_MARK)) return false;
if (!MATCH_SPACE(results->rawbuf[offset++], RECS80_ONE_SPACE)) return false;
// Data: Address and command stored as one variable
for (int i = 0; i < (RECS80_ADDRESS_BITS + RECS80_COMMAND_BITS); i++) {
if (!MATCH_MARK(results->rawbuf[offset++], RECS80_MARK)) return false;
// One
if (MATCH_MARK(results->rawbuf[offset], RECS80_ONE_SPACE))
data = (data << 1) | 1;
// Zero
else if (MATCH_MARK(results->rawbuf[offset], RECS80_ZERO_SPACE))
data = (data << 1) | 0;
else return false;
offset++;
}
if (!MATCH_MARK(results->rawbuf[offset], RECS80_MARK)) return false;
// Success
results->decode_type = RECS80;
results->bits = RECS80_BITS_DATA;
results->value = data;
return true;
}
#endif

View File

@@ -1,4 +1,5 @@
#include "IRremote.h"
#include "IRremoteInt.h"
//==============================================================================
// SSSS AAA MMM SSSS U U N N GGGG

View File

@@ -1,4 +1,5 @@
#include "IRremote.h"
#include "IRremoteInt.h"
//==============================================================================
// SSSS AAA N N Y Y OOO

View File

@@ -1,4 +1,5 @@
#include "IRremote.h"
#include "IRremoteInt.h"
//==============================================================================
// SSSS H H AAA RRRR PPPP

View File

@@ -1,4 +1,5 @@
#include "IRremote.h"
#include "IRremoteInt.h"
//==============================================================================
// SSSS OOO N N Y Y

View File

@@ -92,6 +92,7 @@ Regards,
*/
#include "IRremote.h"
#include "IRremoteInt.h"
//==============================================================================
//

View File

@@ -1,4 +1,5 @@
#include "IRremote.h"
#include "IRremoteInt.h"
//==============================================================================
// W W H H Y Y N N TTTTT EEEEE RRRRR

View File

@@ -1,6 +1,7 @@
// Support routines for SAM processor boards
#include "IRremote.h"
#include "IRremoteInt.h"
#if defined(ARDUINO_ARCH_SAM) || defined(ARDUINO_ARCH_SAMD)