21 unsigned int MATCH(
unsigned int measured,
unsigned int desired) {
22 Serial.print(
"Testing: ");
25 Serial.print(measured, DEC);
31 unsigned int MATCH_MARK(
unsigned int measured_ticks,
unsigned int desired_us) {
32 Serial.print(
"Testing mark ");
35 Serial.print(desired_us, DEC);
39 Serial.print(measured_ticks, DEC);
45 unsigned int MATCH_SPACE(
unsigned int measured_ticks,
unsigned int desired_us) {
46 Serial.print(
"Testing space ");
49 Serial.print(desired_us, DEC);
53 Serial.print(measured_ticks, DEC);
62 unsigned int MATCH(
unsigned int measured,
unsigned int desired) {
return measured >= TICKS_LOW(desired) && measured <= TICKS_HIGH(desired);}
63 unsigned int MATCH_MARK(
unsigned int measured_ticks,
unsigned int desired_us) {
return MATCH(measured_ticks, (desired_us + MARK_EXCESS));}
64 unsigned int MATCH_SPACE(
unsigned int measured_ticks,
unsigned int desired_us) {
return MATCH(measured_ticks, (desired_us - MARK_EXCESS));}
75 for (
int i = 0; i < nbits; i++) {
97 for (
int i = 0; i < nbits; i++) {
115 for(
char bit=0;bit<8;bit++)
130 for(
char i=0;i<5;i++)
144 sendDaikinByte(0x11);
145 sendDaikinByte(0xDA);
146 sendDaikinByte(0x27);
147 sendDaikinByte(0x00);
148 sendDaikinByte(0xC5);
149 sendDaikinByte(0x10);
150 sendDaikinByte(0x00);
151 sendDaikinByte(0xE7);
159 sendDaikinByte(0x11);
160 sendDaikinByte(0xDA);
161 sendDaikinByte(0x27);
162 sendDaikinByte(0x00);
163 sendDaikinByte(0x42);
164 sendDaikinByte(0x25);
165 sendDaikinByte(0x14);
166 sendDaikinByte(0x8D);
177 sendDaikinByte(0x11);
178 sendDaikinByte(0xDA);
179 sendDaikinByte(0x27);
180 sendDaikinByte(0x00);
181 sendDaikinByte(0x42);
182 sendDaikinByte(0x25);
183 sendDaikinByte(0x14);
184 sendDaikinByte(0x8D);
189 sendDaikinByte(0x11);
190 sendDaikinByte(0xDA);
191 sendDaikinByte(0x27);
192 sendDaikinByte(0x00);
193 sendDaikinByte(0x00);
197 sendDaikinByte(0x38);
198 sendDaikinByte(0x50);
200 sendDaikinByte(0x00);
201 sendDaikinByte(0xA0);
202 sendDaikinByte(0x00);
203 sendDaikinByte(0x06);
204 sendDaikinByte(0x60);
206 sendDaikinByte(0x00);
207 sendDaikinByte(0x00);
208 sendDaikinByte(0xC1);
210 sendDaikinByte(0x80);
211 sendDaikinByte(0x00);
216 #define DAIKIN_ONE_SPACE 1270
217 #define DAIKIN_ZERO_SPACE 425
251 data = data << (32 - nbits);
252 for (
int i = 0; i < nbits; i++) {
269 for (
int i = 0; i < len; i++) {
285 data = data << (32 - nbits);
289 for (
int i = 0; i < nbits; i++) {
309 data = data << (32 - nbits);
315 for (
int i = 0; i < nbits; i++) {
344 for(
int i=0;i<16;i++)
347 if (address & 0x8000) {
354 for (
int i=0; i < 32; i++) {
371 data = data << (32 - nbits);
376 for (
int i = 0; i < nbits; i++) {
395 uint8_t cicli=micros/16383;
396 unsigned int resto=micros%16383;
397 for(uint8_t i=0;i<cicli;i++) delayMicroseconds(16383);
398 delayMicroseconds(resto);
400 else delayMicroseconds(micros);
418 #ifdef USE_DAIKIN_FTX 419 LongMicroDelay(time+20);
426 Serial.println(time, DEC);
437 #ifdef USE_DAIKIN_FTX 438 LongMicroDelay(time+20);
444 Serial.println(time, DEC);
477 irparams.recvpin = recvpin;
478 irparams.blinkflag = 0;
502 pinMode(irparams.recvpin, INPUT);
508 irparams.blinkflag = blinkflag;
524 uint8_t irdata = (uint8_t)digitalRead(irparams.recvpin);
527 if (irparams.rawlen >=
RAWBUF) {
531 switch(irparams.rcvstate) {
542 irparams.rawbuf[irparams.rawlen++] = irparams.timer;
549 if (irdata ==
SPACE) {
550 irparams.rawbuf[irparams.rawlen++] = irparams.timer;
556 if (irdata ==
MARK) {
557 irparams.rawbuf[irparams.rawlen++] = irparams.timer;
572 if (irdata ==
MARK) {
578 if (irparams.blinkflag) {
579 if (irdata ==
MARK) {
606 Serial.println(
"Attempting NEC decode");
608 if (decodeNEC(results))
return DECODED;
613 Serial.println(
"Attempting Sony decode");
615 if (decodeSony(results))
return DECODED;
618 #ifdef USE_MITSUBISHI
620 Serial.println(
"Attempting Mitsubishi decode");
622 if (decodeMitsubishi(results))
return DECODED;
627 Serial.println(
"Attempting RC5 decode");
629 if (decodeRC5(results))
return DECODED;
634 Serial.println(
"Attempting RC6 decode");
636 if (decodeRC6(results))
return DECODED;
641 Serial.println(
"Attempting Samsung decode");
643 if (decodeSamsung(results))
return DECODED;
648 Serial.println(
"Attempting Panasonic decode");
650 if (decodePanasonic(results))
return DECODED;
654 Serial.println(
"Attempting JVC decode");
656 if (decodeJVC(results))
return DECODED;
661 Serial.println(
"Attempting Sanyo decode");
663 if (decodeSanyo(results))
return DECODED;
667 #ifdef USE_DAIKIN_FTX 669 Serial.println(
"Attempting Daikin decode");
671 if (decodeDaikin(results))
return DECODED;
679 if (decodeHash(results)) {
714 for (
int i = 0; i <
NEC_BITS; i++) {
720 data = (data << 1) | 1;
765 data = (data << 1) | 1;
783 #ifdef USE_DAIKIN_FTX 784 long IRrecv::decodeDaikin(decode_results *results) {
785 unsigned int localbit = 0;
786 unsigned int offset = 1;
789 if (irparams.rawlen < 2 * DAIKIN_BITS + 4)
791 Serial.print(
"Err lunghezza ingresso - rawlen is: ");
792 Serial.print(irparams.rawlen, DEC);
793 Serial.print(
" vs ");
794 Serial.println( 2 * DAIKIN_BITS + 4, DEC);
799 Serial.println(
"OK lunghezza ingresso ");
803 for (
int i = 0; i < irparams.rawlen; i++) {Serial.print(USECPERTICK*results->rawbuf[i], DEC);Serial.print(
" "); }
808 for(
int i=0;i<37;i++) results->DaikinBuffer[i]=0;
811 for (
int i = 0; i < DAIKIN_BITS; i++)
813 if (MATCH_MARK(results->rawbuf[offset], DAIKIN_MARK)) {err=1;}
814 else if(MATCH_MARK(results->rawbuf[offset], DAIKIN_LONG_MARK)){err=1;}
820 if (MATCH_SPACE(results->rawbuf[offset], DAIKIN_ZERO_SPACE)) {
822 SetBitN(results->DaikinBuffer,localbit,0);
825 else if (MATCH_SPACE(results->rawbuf[offset], DAIKIN_ONE_SPACE)) {
826 SetBitN(results->DaikinBuffer,localbit,1);
829 else if (MATCH_SPACE(results->rawbuf[offset], DAIKIN_POST_SPACE)) {
830 SetBitN(results->DaikinBuffer,localbit,1);
834 else if (MATCH_SPACE(results->rawbuf[offset], DAIKIN_LONG_SPACE)) {
836 SetBitN(results->DaikinBuffer,localbit,1);
841 else if (MATCH_SPACE(results->rawbuf[offset], DAIKIN_VERY_LONG_SPACE)) {
843 SetBitN(results->DaikinBuffer,localbit,1);
853 Serial.println(
"ERROR MACH SPACE:");
855 Serial.println(
"TIKS: ");
856 Serial.print(results->rawbuf[offset], DEC);
857 Serial.println(
"TIME: ");
858 Serial.print(USECPERTICK*results->rawbuf[offset], DEC);
859 Serial.println(
"--");
868 results->bits = DAIKIN_BITS;
870 results->decode_type = DAIKIN;
878 long IRrecv::decodeSony(decode_results *results) {
880 if (irparams.rawlen < 2 * SONY_BITS + 2) {
887 if (results->rawbuf[offset] < SONY_DOUBLE_SPACE_USECS) {
890 results->value = REPEAT;
891 results->decode_type = SANYO;
897 if (!MATCH_MARK(results->rawbuf[offset], SONY_HDR_MARK)) {
902 while (offset + 1 < irparams.rawlen) {
903 if (!MATCH_SPACE(results->rawbuf[offset], SONY_HDR_SPACE)) {
907 if (MATCH_MARK(results->rawbuf[offset], SONY_ONE_MARK)) {
908 data = (data << 1) | 1;
910 else if (MATCH_MARK(results->rawbuf[offset], SONY_ZERO_MARK)) {
920 results->bits = (offset - 1) / 2;
921 if (results->bits < 12) {
925 results->value = data;
926 results->decode_type = SONY;
974 data = (data << 1) | 1;
986 results
->bits = (offset - 1) / 2;
999 #ifdef USE_MITSUBISHI
1036 data = (data << 1) | 1;
1054 results
->bits = (offset - 1) / 2;
1077 int width = results
->rawbuf[*offset];
1078 int val = ((*offset) % 2) ?
MARK :
SPACE;
1082 if (
MATCH(width
, t1 + correction
)) {
1085 else if (
MATCH(width
, 2*t1 + correction
)) {
1088 else if (
MATCH(width
, 3*t1 + correction
)) {
1096 if (*used >= avail) {
1102 Serial.println(
"MARK");
1105 Serial.println(
"SPACE");
1119 if (getRClevel(results, &offset, &used,
RC5_T1) !=
MARK)
return ERR;
1120 if (getRClevel(results, &offset, &used,
RC5_T1) !=
SPACE)
return ERR;
1121 if (getRClevel(results, &offset, &used,
RC5_T1) !=
MARK)
return ERR;
1124 int levelA = getRClevel(results, &offset, &used,
RC5_T1);
1125 int levelB = getRClevel(results, &offset, &used,
RC5_T1);
1126 if (levelA ==
SPACE && levelB ==
MARK) {
1128 data = (data << 1) | 1;
1130 else if (levelA ==
MARK && levelB ==
SPACE) {
1165 if (getRClevel(results, &offset, &used,
RC6_T1) !=
MARK)
return ERR;
1166 if (getRClevel(results, &offset, &used,
RC6_T1) !=
SPACE)
return ERR;
1168 for (nbits = 0; offset < results
->rawlen; nbits++) {
1170 levelA = getRClevel(results, &offset, &used,
RC6_T1);
1173 if (levelA != getRClevel(results, &offset, &used,
RC6_T1))
return ERR;
1175 levelB = getRClevel(results, &offset, &used,
RC6_T1);
1178 if (levelB != getRClevel(results, &offset, &used,
RC6_T1))
return ERR;
1180 if (levelA ==
MARK && levelB ==
SPACE) {
1182 data = (data << 1) | 1;
1184 else if (levelA ==
SPACE && levelB ==
MARK) {
1199 #ifdef USE_PANASONIC
1201 unsigned long long data = 0;
1219 data = (data << 1) | 1;
1227 results
->value = (
unsigned long)data;
1260 for (
int i = 0; i <
JVC_BITS; i++) {
1266 data = (data << 1) | 1;
1305 int IRrecv::compare(
unsigned int oldval,
unsigned int newval) {
1306 if (newval < oldval * .8) {
1309 else if (oldval < newval * .8) {
1318 #define FNV_PRIME_32 16777619
1319 #define FNV_BASIS_32 2166136261
1331 for (
int i = 1; i+2 < results
->rawlen; i++) {
1367 for (
int i = 0; i < nbits; i++) {
1368 if (data & 0x4000) {
1382 for (
int i = 0; i < nbits; i++) {
1383 if (invertdata & 0x4000) {
1404 for (
int i = 0; i < nbits; i++) {
void sendSharp(unsigned long data, int nbits)
#define SAMSUNG_HDR_SPACE
#define PANASONIC_HDR_MARK
#define DAIKIN_POST_SPACE
#define DAIKIN_LONG_SPACE
#define PANASONIC_ZERO_SPACE
#define DAIKIN_VERY_LONG_SPACE
#define TIMER_ENABLE_INTR
#define TIMER_CONFIG_KHZ(val)
void enableIROut(int khz)
#define PANASONIC_BIT_MARK
void sendDaikinByte(uint8_t)
volatile unsigned int * rawbuf
void sendRC5(unsigned long data, int nbits)
#define TIMER_DISABLE_PWM
#define MITSUBISHI_ZERO_MARK
#define MITSUBISHI_ONE_MARK
void sendRaw(unsigned int buf[], int len, int hz)
#define SHARP_TOGGLE_MASK
#define DAIKIN_ZERO_SPACE
void sendDISH(unsigned long data, int nbits)
#define TIMER_DISABLE_INTR
#define PANASONIC_ONE_SPACE
void blink13(int blinkflag)
unsigned int MATCH_SPACE(unsigned int measured_ticks, unsigned int desired_us)
#define TIMER_CONFIG_NORMAL()
void sendPanasonic(unsigned int address, unsigned long data)
void sendJVC(unsigned long data, int nbits, int repeat)
unsigned int MATCH_MARK(unsigned int measured_ticks, unsigned int desired_us)
unsigned int panasonicAddress
#define SAMSUNG_ONE_SPACE
void sendSony(unsigned long data, int nbits)
volatile irparams_t irparams
unsigned int MATCH(unsigned int measured, unsigned int desired)
void sendRC6(unsigned long data, int nbits)
VIRTUAL void space(unsigned int usec)
int decode(decode_results *results)
VIRTUAL void mark(unsigned int usec)
void LongMicroDelay(unsigned int micros)
#define PANASONIC_HDR_SPACE
#define SAMSUNG_ZERO_SPACE
void sendSamsung(unsigned long data, int nbits)
#define SANYO_DOUBLE_SPACE_USECS
#define MITSUBISHI_HDR_SPACE
unsigned int rawbuf[RAWBUF]
void sendNEC(unsigned long data, int nbits)