long IRrecvSF::decodeRC5(decode_resultsSF *results) { if (irparamsSF.rawlen < MIN_RC5_SAMPLES + 2) { return ERR; } int offset = 1; // Skip gap space long data = 0; int used = 0; // Get start bits if (getRClevel(results, &offset, &used, RC5_T1) != MARK) return ERR; if (getRClevel(results, &offset, &used, RC5_T1) != SPACE) return ERR; if (getRClevel(results, &offset, &used, RC5_T1) != MARK) return ERR; int nbits; for (nbits = 0; offset < irparamsSF.rawlen; nbits++) { int levelA = getRClevel(results, &offset, &used, RC5_T1); int levelB = getRClevel(results, &offset, &used, RC5_T1); if (levelA == SPACE && levelB == MARK) { // 1 bit data = (data << 1) | 1; } else if (levelA == MARK && levelB == SPACE) { // zero bit data <<= 1; } else { return ERR; } } // Success results->bits = nbits; results->value = data; results->decode_type = RC5; return DECODED; }
bool IRdecodeRC5::decode(void) { ATTEMPT_MESSAGE(F("RC5")); if (rawlen < MIN_RC5_SAMPLES + 2) return RAW_COUNT_ERROR; int offset = 1; // Skip gap space long data = 0; int used = 0; // Get start bits if (getRClevel(&offset, &used, RC5_T1) != MARK) return HEADER_MARK_ERROR; //Note: Original IRremote library incorrectly assumed second bit was always a "1" //bit patterns from this decoder are not backward compatible with patterns produced //by original library. Ucomment the following two lines to maintain backward compatibility. //if (getRClevel(&offset, &used, RC5_T1) != SPACE) return HEADER_SPACE_ERROR; //if (getRClevel(&offset, &used, RC5_T1) != MARK) return HEADER_MARK_ERROR; int nbits; for (nbits = 0; offset < rawlen; nbits++) { RCLevel levelA = getRClevel(&offset, &used, RC5_T1); RCLevel levelB = getRClevel(&offset, &used, RC5_T1); if (levelA == SPACE && levelB == MARK) { // 1 bit data = (data << 1) | 1; } else if (levelA == MARK && levelB == SPACE) { // zero bit data <<= 1; } else return DATA_MARK_ERROR; } // Success bits = 13; value = data; decode_type = RC5; return true; }
bool IRrecv::decodeRC5 (decode_results *results) { int nbits; long data = 0; int used = 0; int offset = 1; // Skip gap space if (irparams.rawlen < MIN_RC5_SAMPLES + 2) return false ; // Get start bits if (getRClevel(results, &offset, &used, RC5_T1) != MARK) return false ; if (getRClevel(results, &offset, &used, RC5_T1) != SPACE) return false ; if (getRClevel(results, &offset, &used, RC5_T1) != MARK) return false ; for (nbits = 0; offset < irparams.rawlen; nbits++) { int levelA = getRClevel(results, &offset, &used, RC5_T1); int levelB = getRClevel(results, &offset, &used, RC5_T1); if ((levelA == SPACE) && (levelB == MARK )) data = (data << 1) | 1 ; else if ((levelA == MARK ) && (levelB == SPACE)) data = (data << 1) | 0 ; else return false ; } // Success results->bits = nbits; results->value = data; results->decode_type = RC5; return true; }
bool IRRemote::decodeRC5(int rawlen) { if (rawlen < MIN_RC5_SAMPLES + 2) { return false; } int offset = 1; // Skip gap space long data = 0; int used = 0; // Get start bits if (getRClevel(&offset, &used, RC5_T1, rawlen) != MARK) return false; else if (getRClevel(&offset, &used, RC5_T1, rawlen) != SPACE) return false; else if (getRClevel(&offset, &used, RC5_T1, rawlen) != MARK) return false; int nbits; for (nbits = 0; offset < rawlen; nbits++) { int levelA = getRClevel(&offset, &used, RC5_T1, rawlen); int levelB = getRClevel(&offset, &used, RC5_T1, rawlen); if (levelA == SPACE && levelB == MARK) { // 1 bit data = (data << 1) | 1; } else if (levelA == MARK && levelB == SPACE) { // zero bit data <<= 1; } else { return false; } } // Success _bits = nbits; _value = data; _decode_type = RC5; return true; }
long IRrecvSF::decodeRC6(decode_resultsSF *results) { if (results->rawlen < MIN_RC6_SAMPLES) { return ERR; } int offset = 1; // Skip first space // Initial mark if (!MATCH_MARK(results->rawbuf[offset], RC6_HDR_MARK)) { return ERR; } offset++; if (!MATCH_SPACE(results->rawbuf[offset], RC6_HDR_SPACE)) { return ERR; } offset++; long data = 0; int used = 0; // Get start bit (1) if (getRClevel(results, &offset, &used, RC6_T1) != MARK) return ERR; if (getRClevel(results, &offset, &used, RC6_T1) != SPACE) return ERR; int nbits; for (nbits = 0; offset < results->rawlen; nbits++) { int levelA, levelB; // Next two levels levelA = getRClevel(results, &offset, &used, RC6_T1); if (nbits == 3) { // T bit is double wide; make sure second half matches if (levelA != getRClevel(results, &offset, &used, RC6_T1)) return ERR; } levelB = getRClevel(results, &offset, &used, RC6_T1); if (nbits == 3) { // T bit is double wide; make sure second half matches if (levelB != getRClevel(results, &offset, &used, RC6_T1)) return ERR; } if (levelA == MARK && levelB == SPACE) { // reversed compared to RC5 // 1 bit data = (data << 1) | 1; } else if (levelA == SPACE && levelB == MARK) { // zero bit data <<= 1; } else { return ERR; // Error } } // Success results->bits = nbits; results->value = data; results->decode_type = RC6; return DECODED; }
bool IRdecodeRC6::decode(void) { IRLIB_ATTEMPT_MESSAGE(F("RC6")); if (rawlen < MIN_RC6_SAMPLES) return RAW_COUNT_ERROR; // Initial mark if (!IgnoreHeader) { if (!MATCH(rawbuf[1], RC6_HDR_MARK)) return HEADER_MARK_ERROR(RC6_HDR_MARK); } if (!MATCH(rawbuf[2], RC6_HDR_SPACE)) return HEADER_SPACE_ERROR(RC6_HDR_SPACE); offset=3;//Skip gap and header data = 0; used = 0; // Get start bit (1) if (getRClevel(&used, RC6_T1) != MARK) return DATA_MARK_ERROR(RC6_T1); if (getRClevel(&used, RC6_T1) != SPACE) return DATA_SPACE_ERROR(RC6_T1); for (nbits = 0; offset < rawlen; nbits++) { RCLevel levelA, levelB; // Next two levels levelA = getRClevel(&used, RC6_T1); if (nbits == 3) { // T bit is double wide; make sure second half matches if (levelA != getRClevel(&used, RC6_T1)) return TRAILER_BIT_ERROR(RC6_T1); } levelB = getRClevel(&used, RC6_T1); if (nbits == 3) { // T bit is double wide; make sure second half matches if (levelB != getRClevel(&used, RC6_T1)) return TRAILER_BIT_ERROR(RC6_T1); } if (levelA == MARK && levelB == SPACE) { // reversed compared to RC5 // 1 bit data = (data << 1) | 1; } else if (levelA == SPACE && levelB == MARK) { // zero bit data <<= 1; } else { return DATA_MARK_ERROR(RC6_T1); } } // Success bits = nbits; value = data; decode_type = RC6; return true; }
bool IRrecv::decodeRC6 (decode_results *results) { int nbits; long data = 0; int used = 0; int offset = 1; // Skip first space if (results->rawlen < MIN_RC6_SAMPLES) return false ; // Initial mark if (!MATCH_MARK(results->rawbuf[offset++], RC6_HDR_MARK)) return false ; if (!MATCH_SPACE(results->rawbuf[offset++], RC6_HDR_SPACE)) return false ; // Get start bit (1) if (getRClevel(results, &offset, &used, RC6_T1) != MARK) return false ; if (getRClevel(results, &offset, &used, RC6_T1) != SPACE) return false ; for (nbits = 0; offset < results->rawlen; nbits++) { int levelA, levelB; // Next two levels levelA = getRClevel(results, &offset, &used, RC6_T1); if (nbits == 3) { // T bit is double wide; make sure second half matches if (levelA != getRClevel(results, &offset, &used, RC6_T1)) return false; } levelB = getRClevel(results, &offset, &used, RC6_T1); if (nbits == 3) { // T bit is double wide; make sure second half matches if (levelB != getRClevel(results, &offset, &used, RC6_T1)) return false; } if ((levelA == MARK ) && (levelB == SPACE)) data = (data << 1) | 1 ; // inverted compared to RC5 else if ((levelA == SPACE) && (levelB == MARK )) data = (data << 1) | 0 ; // ... else return false ; // Error } // Success results->bits = nbits; results->value = data; results->decode_type = RC6; return true; }