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
7 changed files with 129 additions and 2 deletions

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

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

View File

@@ -79,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
@@ -119,13 +122,14 @@ typedef
DENON,
PRONTO,
LEGO_PF,
RECS80,
}
decode_type_t;
//------------------------------------------------------------------------------
// Set DEBUG to 1 for lots of lovely debug output
//
#define DEBUG 0
#define DEBUG 0
//------------------------------------------------------------------------------
// Debug directives
@@ -251,6 +255,10 @@ class IRrecv
# if DECODE_LEGO_PF
bool decodeLegoPowerFunctions (decode_results *results) ;
# endif
# if DECODE_RECS80
bool decodeRECS80(decode_results *results);
# endif
} ;
//------------------------------------------------------------------------------
@@ -350,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

@@ -89,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,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.

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