Infrared remote library for Arduino: send and receive infrared signals with multiple protocols Port from Arduino-IRremote https://github.com/z3t0/Arduino-IRremote

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ir_JVC.cpp Source File

ir_JVC.cpp

00001 #include "IRremote.h"
00002 #include "IRremoteInt.h"
00003 
00004 //==============================================================================
00005 //                             JJJJJ  V   V   CCCC
00006 //                               J    V   V  C
00007 //                               J     V V   C
00008 //                             J J     V V   C
00009 //                              J       V     CCCC
00010 //==============================================================================
00011 
00012 #define JVC_BITS           16
00013 #define JVC_HDR_MARK     8000
00014 #define JVC_HDR_SPACE    4000
00015 #define JVC_BIT_MARK      600
00016 #define JVC_ONE_SPACE    1600
00017 #define JVC_ZERO_SPACE    550
00018 #define JVC_RPT_LENGTH  60000
00019 
00020 //+=============================================================================
00021 // JVC does NOT repeat by sending a separate code (like NEC does).
00022 // The JVC protocol repeats by skipping the header.
00023 // To send a JVC repeat signal, send the original code value
00024 //   and set 'repeat' to true
00025 //
00026 #if SEND_JVC
00027 void  IRsend::sendJVC (unsigned long data,  int nbits,  bool repeat)
00028 {
00029     // Set IR carrier frequency
00030     enableIROut(38);
00031 
00032     // Only send the Header if this is NOT a repeat command
00033     if (!repeat){
00034         mark(JVC_HDR_MARK);
00035         space(JVC_HDR_SPACE);
00036     }
00037 
00038     // Data
00039     for (unsigned long  mask = 1UL << (nbits - 1);  mask;  mask >>= 1) {
00040         if (data & mask) {
00041             mark(JVC_BIT_MARK);
00042             space(JVC_ONE_SPACE);
00043         } else {
00044             mark(JVC_BIT_MARK);
00045             space(JVC_ZERO_SPACE);
00046         }
00047     }
00048 
00049     // Footer
00050     mark(JVC_BIT_MARK);
00051     space(0);  // Always end with the LED off
00052 }
00053 #endif
00054 
00055 //+=============================================================================
00056 #if DECODE_JVC
00057 bool  IRrecv::decodeJVC (decode_results *results)
00058 {
00059     long  data   = 0;
00060     int   offset = 1; // Skip first space
00061 
00062     // Check for repeat
00063     if (  (irparams.rawlen - 1 == 33)
00064         && MATCH_MARK(results->rawbuf[offset], JVC_BIT_MARK)
00065         && MATCH_MARK(results->rawbuf[irparams.rawlen-1], JVC_BIT_MARK)
00066        ) {
00067         results->bits        = 0;
00068         results->value       = REPEAT;
00069         results->decode_type = JVC;
00070         return true;
00071     }
00072 
00073     // Initial mark
00074     if (!MATCH_MARK(results->rawbuf[offset++], JVC_HDR_MARK))  return false ;
00075 
00076     if (irparams.rawlen < (2 * JVC_BITS) + 1 )  return false ;
00077 
00078     // Initial space
00079     if (!MATCH_SPACE(results->rawbuf[offset++], JVC_HDR_SPACE))  return false ;
00080 
00081     for (int i = 0;  i < JVC_BITS;  i++) {
00082         if (!MATCH_MARK(results->rawbuf[offset++], JVC_BIT_MARK))  return false ;
00083 
00084         if      (MATCH_SPACE(results->rawbuf[offset], JVC_ONE_SPACE))   data = (data << 1) | 1 ;
00085         else if (MATCH_SPACE(results->rawbuf[offset], JVC_ZERO_SPACE))  data = (data << 1) | 0 ;
00086         else                                                            return false ;
00087         offset++;
00088     }
00089 
00090     // Stop bit
00091     if (!MATCH_MARK(results->rawbuf[offset], JVC_BIT_MARK))  return false ;
00092 
00093     // Success
00094     results->bits        = JVC_BITS;
00095     results->value       = data;
00096     results->decode_type = JVC;
00097 
00098     return true;
00099 }
00100 #endif
00101