#include "IRremote.h" #include "IRremoteInt.h" //============================================================================== // JJJJJ V V CCCC // J V V C // J V V C // J J V V C // J V CCCC //============================================================================== #define JVC_BITS 16 #define JVC_HDR_MARK 8000 #define JVC_HDR_SPACE 4000 #define JVC_BIT_MARK 600 #define JVC_ONE_SPACE 1600 #define JVC_ZERO_SPACE 550 #define JVC_RPT_LENGTH 60000 //+============================================================================= // JVC does NOT repeat by sending a separate code (like NEC does). // The JVC protocol repeats by skipping the header. // To send a JVC repeat signal, send the original code value // and set 'repeat' to true // #if SEND_JVC void IRsend::sendJVC (unsigned long data, int nbits, bool repeat) { // Set IR carrier frequency enableIROut(38); // Only send the Header if this is NOT a repeat command if (!repeat){ mark(JVC_HDR_MARK); space(JVC_HDR_SPACE); } // Data for (unsigned long mask = 1UL << (nbits - 1); mask; mask >>= 1) { if (data & mask) { mark(JVC_BIT_MARK); space(JVC_ONE_SPACE); } else { mark(JVC_BIT_MARK); space(JVC_ZERO_SPACE); } } // Footer mark(JVC_BIT_MARK); space(0); // Always end with the LED off } #endif //+============================================================================= #if DECODE_JVC bool IRrecv::decodeJVC (decode_results *results) { long data = 0; int offset = 1; // Skip first space // Check for repeat if ( (irparams.rawlen - 1 == 33) && MATCH_MARK(results->rawbuf[offset], JVC_BIT_MARK) && MATCH_MARK(results->rawbuf[irparams.rawlen-1], JVC_BIT_MARK) ) { results->bits = 0; results->value = REPEAT; results->decode_type = JVC; return true; } // Initial mark if (!MATCH_MARK(results->rawbuf[offset++], JVC_HDR_MARK)) return false ; if (irparams.rawlen < (2 * JVC_BITS) + 1 ) return false ; // Initial space if (!MATCH_SPACE(results->rawbuf[offset++], JVC_HDR_SPACE)) return false ; for (int i = 0; i < JVC_BITS; i++) { if (!MATCH_MARK(results->rawbuf[offset++], JVC_BIT_MARK)) return false ; if (MATCH_SPACE(results->rawbuf[offset], JVC_ONE_SPACE)) data = (data << 1) | 1 ; else if (MATCH_SPACE(results->rawbuf[offset], JVC_ZERO_SPACE)) data = (data << 1) | 0 ; else return false ; offset++; } // Stop bit if (!MATCH_MARK(results->rawbuf[offset], JVC_BIT_MARK)) return false ; // Success results->bits = JVC_BITS; results->value = data; results->decode_type = JVC; return true; } #endif