Skip to content

Commit e03a593

Browse files
committed
mitra changes
Conflicts: IRremote.cpp IRremote.h IRremoteInt.h keywords.txt
1 parent 072b2c3 commit e03a593

File tree

4 files changed

+213
-21
lines changed

4 files changed

+213
-21
lines changed

IRremote.cpp

Lines changed: 158 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
* For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
66
*
77
* Modified by Paul Stoffregen <paul@pjrc.com> to support other boards and timers
8+
* Modified by Mitra Ardron <mitra@mitra.biz>
9+
* Added Sanyo and Mitsubishi controllers
10+
* Modified Sony to spot the repeat codes that some Sony's send
811
*
912
* Interrupt code based on NECIRrcv by Joe Knapp
1013
* http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1210243556
@@ -400,6 +403,18 @@ int IRrecv::decode(decode_results *results) {
400403
if (decodeSony(results)) {
401404
return DECODED;
402405
}
406+
#ifdef DEBUG
407+
Serial.println("Attempting Sanyo decode");
408+
#endif
409+
if (decodeSanyo(results)) {
410+
return DECODED;
411+
}
412+
#ifdef DEBUG
413+
Serial.println("Attempting Mitsubishi decode");
414+
#endif
415+
if (decodeMitsubishi(results)) {
416+
return DECODED;
417+
}
403418
#ifdef DEBUG
404419
Serial.println("Attempting RC5 decode");
405420
#endif
@@ -435,6 +450,7 @@ int IRrecv::decode(decode_results *results) {
435450
return ERR;
436451
}
437452

453+
// NECs have a repeat only 4 items long
438454
long IRrecv::decodeNEC(decode_results *results) {
439455
long data = 0;
440456
int offset = 1; // Skip first space
@@ -488,7 +504,19 @@ long IRrecv::decodeSony(decode_results *results) {
488504
if (irparams.rawlen < 2 * SONY_BITS + 2) {
489505
return ERR;
490506
}
491-
int offset = 1; // Skip first space
507+
int offset = 0; // Dont skip first space, check its size
508+
509+
// Some Sony's deliver repeats fast after first
510+
// unfortunately can't spot difference from of repeat from two fast clicks
511+
if (results->rawbuf[offset] < SONY_DOUBLE_SPACE_USECS) {
512+
// Serial.print("IR Gap found: ");
513+
results->bits = 0;
514+
results->value = REPEAT;
515+
results->decode_type = SANYO;
516+
return DECODED;
517+
}
518+
offset++;
519+
492520
// Initial mark
493521
if (!MATCH_MARK(results->rawbuf[offset], SONY_HDR_MARK)) {
494522
return ERR;
@@ -523,6 +551,135 @@ long IRrecv::decodeSony(decode_results *results) {
523551
return DECODED;
524552
}
525553

554+
// I think this is a Sanyo decoder - serial = SA 8650B
555+
// Looks like Sony except for timings, 48 chars of data and time/space different
556+
long IRrecv::decodeSanyo(decode_results *results) {
557+
long data = 0;
558+
if (irparams.rawlen < 2 * SANYO_BITS + 2) {
559+
return ERR;
560+
}
561+
int offset = 0; // Skip first space
562+
// Initial space
563+
/* Put this back in for debugging - note can't use #DEBUG as if Debug on we don't see the repeat cos of the delay
564+
Serial.print("IR Gap: ");
565+
Serial.println( results->rawbuf[offset]);
566+
Serial.println( "test against:");
567+
Serial.println(results->rawbuf[offset]);
568+
*/
569+
if (results->rawbuf[offset] < SANYO_DOUBLE_SPACE_USECS) {
570+
// Serial.print("IR Gap found: ");
571+
results->bits = 0;
572+
results->value = REPEAT;
573+
results->decode_type = SANYO;
574+
return DECODED;
575+
}
576+
offset++;
577+
578+
// Initial mark
579+
if (!MATCH_MARK(results->rawbuf[offset], SANYO_HDR_MARK)) {
580+
return ERR;
581+
}
582+
offset++;
583+
584+
// Skip Second Mark
585+
if (!MATCH_MARK(results->rawbuf[offset], SANYO_HDR_MARK)) {
586+
return ERR;
587+
}
588+
offset++;
589+
590+
while (offset + 1 < irparams.rawlen) {
591+
if (!MATCH_SPACE(results->rawbuf[offset], SANYO_HDR_SPACE)) {
592+
break;
593+
}
594+
offset++;
595+
if (MATCH_MARK(results->rawbuf[offset], SANYO_ONE_MARK)) {
596+
data = (data << 1) | 1;
597+
}
598+
else if (MATCH_MARK(results->rawbuf[offset], SANYO_ZERO_MARK)) {
599+
data <<= 1;
600+
}
601+
else {
602+
return ERR;
603+
}
604+
offset++;
605+
}
606+
607+
// Success
608+
results->bits = (offset - 1) / 2;
609+
if (results->bits < 12) {
610+
results->bits = 0;
611+
return ERR;
612+
}
613+
results->value = data;
614+
results->decode_type = SANYO;
615+
return DECODED;
616+
}
617+
618+
// Looks like Sony except for timings, 48 chars of data and time/space different
619+
long IRrecv::decodeMitsubishi(decode_results *results) {
620+
// Serial.print("?!? decoding Mitsubishi:");Serial.print(irparams.rawlen); Serial.print(" want "); Serial.println( 2 * MITSUBISHI_BITS + 2);
621+
long data = 0;
622+
if (irparams.rawlen < 2 * MITSUBISHI_BITS + 2) {
623+
return ERR;
624+
}
625+
int offset = 0; // Skip first space
626+
// Initial space
627+
/* Put this back in for debugging - note can't use #DEBUG as if Debug on we don't see the repeat cos of the delay
628+
Serial.print("IR Gap: ");
629+
Serial.println( results->rawbuf[offset]);
630+
Serial.println( "test against:");
631+
Serial.println(results->rawbuf[offset]);
632+
*/
633+
/* Not seeing double keys from Mitsubishi
634+
if (results->rawbuf[offset] < MITSUBISHI_DOUBLE_SPACE_USECS) {
635+
// Serial.print("IR Gap found: ");
636+
results->bits = 0;
637+
results->value = REPEAT;
638+
results->decode_type = MITSUBISHI;
639+
return DECODED;
640+
}
641+
*/
642+
offset++;
643+
644+
// Typical
645+
// 14200 7 41 7 42 7 42 7 17 7 17 7 18 7 41 7 18 7 17 7 17 7 18 7 41 8 17 7 17 7 18 7 17 7
646+
647+
// Initial Space
648+
if (!MATCH_MARK(results->rawbuf[offset], MITSUBISHI_HDR_SPACE)) {
649+
return ERR;
650+
}
651+
offset++;
652+
while (offset + 1 < irparams.rawlen) {
653+
if (MATCH_MARK(results->rawbuf[offset], MITSUBISHI_ONE_MARK)) {
654+
data = (data << 1) | 1;
655+
}
656+
else if (MATCH_MARK(results->rawbuf[offset], MITSUBISHI_ZERO_MARK)) {
657+
data <<= 1;
658+
}
659+
else {
660+
// Serial.println("A"); Serial.println(offset); Serial.println(results->rawbuf[offset]);
661+
return ERR;
662+
}
663+
offset++;
664+
if (!MATCH_SPACE(results->rawbuf[offset], MITSUBISHI_HDR_SPACE)) {
665+
// Serial.println("B"); Serial.println(offset); Serial.println(results->rawbuf[offset]);
666+
break;
667+
}
668+
offset++;
669+
}
670+
671+
// Success
672+
results->bits = (offset - 1) / 2;
673+
if (results->bits < MITSUBISHI_BITS) {
674+
results->bits = 0;
675+
return ERR;
676+
}
677+
results->value = data;
678+
results->decode_type = MITSUBISHI;
679+
return DECODED;
680+
}
681+
682+
526683
// Gets one undecoded level at a time from the raw buffer.
527684
// The RC5/6 decoding is easier if the data is broken into time intervals.
528685
// E.g. if the buffer has MARK for 2 time intervals and SPACE for 1,

IRremote.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Version 0.1 July, 2009
44
* Copyright 2009 Ken Shirriff
55
* For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.htm http://arcfn.com
6+
* Edited by Mitra to add new controller SANYO
67
*
78
* Interrupt code based on NECIRrcv by Joe Knapp
89
* http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1210243556
@@ -42,6 +43,8 @@ class decode_results {
4243
#define SHARP 6
4344
#define PANASONIC 7
4445
#define JVC 8
46+
#define SANYO 9
47+
#define MITSUBISHI 10
4548
#define UNKNOWN -1
4649

4750
// Decoded value for NEC when a repeat code is received
@@ -61,6 +64,8 @@ class IRrecv
6164
int getRClevel(decode_results *results, int *offset, int *used, int t1);
6265
long decodeNEC(decode_results *results);
6366
long decodeSony(decode_results *results);
67+
long decodeSanyo(decode_results *results);
68+
long decodeMitsubishi(decode_results *results);
6469
long decodeRC5(decode_results *results);
6570
long decodeRC6(decode_results *results);
6671
long decodePanasonic(decode_results *results);
@@ -84,6 +89,9 @@ class IRsend
8489
IRsend() {}
8590
void sendNEC(unsigned long data, int nbits);
8691
void sendSony(unsigned long data, int nbits);
92+
// Neither Sanyo nor Mitsubishi send is implemented yet
93+
// void sendSanyo(unsigned long data, int nbits);
94+
// void sendMitsubishi(unsigned long data, int nbits);
8795
void sendRaw(unsigned int buf[], int len, int hz);
8896
void sendRC5(unsigned long data, int nbits);
8997
void sendRC6(unsigned long data, int nbits);

IRremoteInt.h

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@
8787
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
8888
#endif
8989

90-
90+
// Pulse parms are *50-100 for the Mark and *50+100 for the space
91+
// First MARK is the one after the long gap
9192
// pulse parameters in usec
9293
#define NEC_HDR_MARK9000
9394
#define NEC_HDR_SPACE4500
@@ -101,6 +102,26 @@
101102
#define SONY_ONE_MARK1200
102103
#define SONY_ZERO_MARK600
103104
#define SONY_RPT_LENGTH 45000
105+
#define SONY_DOUBLE_SPACE_USECS 500 // usually ssee 713 - not using ticks as get number wrapround
106+
107+
// SA 8650B
108+
#define SANYO_HDR_MARK3500 // seen range 3500
109+
#define SANYO_HDR_SPACE950 // seen 950
110+
#define SANYO_ONE_MARK2400 // seen 2400
111+
#define SANYO_ZERO_MARK 700 // seen 700
112+
#define SANYO_DOUBLE_SPACE_USECS 800 // usually ssee 713 - not using ticks as get number wrapround
113+
#define SANYO_RPT_LENGTH 45000
114+
115+
// Mitsubishi RM 75501
116+
// 14200 7 41 7 42 7 42 7 17 7 17 7 18 7 41 7 18 7 17 7 17 7 18 7 41 8 17 7 17 7 18 7 17 7
117+
118+
// #define MITSUBISHI_HDR_MARK 250 // seen range 3500
119+
#define MITSUBISHI_HDR_SPACE350 // 7*50+100
120+
#define MITSUBISHI_ONE_MARK1950 // 41*50-100
121+
#define MITSUBISHI_ZERO_MARK 750 // 17*50-100
122+
// #define MITSUBISHI_DOUBLE_SPACE_USECS 800 // usually ssee 713 - not using ticks as get number wrapround
123+
// #define MITSUBISHI_RPT_LENGTH 45000
124+
104125

105126
#define RC5_T1889
106127
#define RC5_RPT_LENGTH46000
@@ -186,6 +207,8 @@ extern volatile irparams_t irparams;
186207

187208
#define NEC_BITS 32
188209
#define SONY_BITS 12
210+
#define SANYO_BITS 12
211+
#define MITSUBISHI_BITS 16
189212
#define MIN_RC5_SAMPLES 11
190213
#define MIN_RC6_SAMPLES 1
191214
#define PANASONIC_BITS 48

keywords.txt

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,26 @@
66
# Datatypes (KEYWORD1)
77
#######################################
88

9-
decode_results KEYWORD1
10-
IRrecv KEYWORD1
11-
IRsend KEYWORD1
9+
decode_resultsKEYWORD1
10+
IRrecvKEYWORD1
11+
IRsendKEYWORD1
1212

1313
#######################################
1414
# Methods and Functions (KEYWORD2)
1515
#######################################
1616

17-
blink13 KEYWORD2
18-
decode KEYWORD2
19-
enableIRIn KEYWORD2
20-
resume KEYWORD2
21-
enableIROut KEYWORD2
22-
sendNEC KEYWORD2
23-
sendSony KEYWORD2
24-
sendRaw KEYWORD2
25-
sendRC5 KEYWORD2
26-
sendRC6 KEYWORD2
17+
blink13 KEYWORD2
18+
decode KEYWORD2
19+
enableIRIn KEYWORD2
20+
resume KEYWORD2
21+
enableIROut KEYWORD2
22+
sendNEC KEYWORD2
23+
sendSony KEYWORD2
24+
sendSanyo KEYWORD2
25+
sendMitsubishi KEYWORD2
26+
sendRaw KEYWORD2
27+
sendRC5 KEYWORD2
28+
sendRC6 KEYWORD2
2729
sendDISH KEYWORD2
2830
sendSharp KEYWORD2
2931
sendPanasonic KEYWORD2
@@ -34,13 +36,15 @@ sendJVC KEYWORD2
3436
# Constants (LITERAL1)
3537
#######################################
3638

37-
NEC LITERAL1
38-
SONY LITERAL1
39-
RC5 LITERAL1
40-
RC6 LITERAL1
39+
NEC LITERAL1
40+
SONY LITERAL1
41+
SANYO LITERAL1
42+
MITSUBISHI LITERAL1
43+
RC5 LITERAL1
44+
RC6 LITERAL1
4145
DISH LITERAL1
4246
SHARP LITERAL1
4347
PANASONIC LITERAL1
4448
JVC LITERAL1
45-
UNKNOWN LITERAL1
46-
REPEAT LITERAL1
49+
UNKNOWNLITERAL1
50+
REPEATLITERAL1

0 commit comments

Comments
 (0)