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_Panasonic.cpp Source File

ir_Panasonic.cpp

00001 #include "IRremote.h"
00002 #include "IRremoteInt.h"
00003 
00004 //==============================================================================
00005 //       PPPP    AAA   N   N   AAA    SSSS   OOO   N   N  IIIII   CCCC
00006 //       P   P  A   A  NN  N  A   A  S      O   O  NN  N    I    C
00007 //       PPPP   AAAAA  N N N  AAAAA   SSS   O   O  N N N    I    C
00008 //       P      A   A  N  NN  A   A      S  O   O  N  NN    I    C
00009 //       P      A   A  N   N  A   A  SSSS    OOO   N   N  IIIII   CCCC
00010 //==============================================================================
00011 
00012 #define PANASONIC_BITS          48
00013 #define PANASONIC_HDR_MARK    3502
00014 #define PANASONIC_HDR_SPACE   1750
00015 #define PANASONIC_BIT_MARK     502
00016 #define PANASONIC_ONE_SPACE   1244
00017 #define PANASONIC_ZERO_SPACE   400
00018 
00019 //+=============================================================================
00020 #if SEND_PANASONIC
00021 void  IRsend::sendPanasonic (unsigned int address,  unsigned long data)
00022 {
00023     // Set IR carrier frequency
00024     enableIROut(35);
00025 
00026     // Header
00027     mark(PANASONIC_HDR_MARK);
00028     space(PANASONIC_HDR_SPACE);
00029 
00030     // Address
00031     for (unsigned long  mask = 1UL << (16 - 1);  mask;  mask >>= 1) {
00032         mark(PANASONIC_BIT_MARK);
00033         if (address & mask)  space(PANASONIC_ONE_SPACE) ;
00034         else                 space(PANASONIC_ZERO_SPACE) ;
00035     }
00036 
00037     // Data
00038     for (unsigned long  mask = 1UL << (32 - 1);  mask;  mask >>= 1) {
00039         mark(PANASONIC_BIT_MARK);
00040         if (data & mask)  space(PANASONIC_ONE_SPACE) ;
00041         else              space(PANASONIC_ZERO_SPACE) ;
00042     }
00043 
00044     // Footer
00045     mark(PANASONIC_BIT_MARK);
00046     space(0);  // Always end with the LED off
00047 }
00048 #endif
00049 
00050 //+=============================================================================
00051 #if DECODE_PANASONIC
00052 bool  IRrecv::decodePanasonic (decode_results *results)
00053 {
00054     unsigned long long  data   = 0;
00055     int                 offset = 1;
00056 
00057     if (!MATCH_MARK(results->rawbuf[offset++], PANASONIC_HDR_MARK ))  return false ;
00058     if (!MATCH_MARK(results->rawbuf[offset++], PANASONIC_HDR_SPACE))  return false ;
00059 
00060     // decode address
00061     for (int i = 0;  i < PANASONIC_BITS;  i++) {
00062         if (!MATCH_MARK(results->rawbuf[offset++], PANASONIC_BIT_MARK))  return false ;
00063 
00064         if      (MATCH_SPACE(results->rawbuf[offset],PANASONIC_ONE_SPACE ))  data = (data << 1) | 1 ;
00065         else if (MATCH_SPACE(results->rawbuf[offset],PANASONIC_ZERO_SPACE))  data = (data << 1) | 0 ;
00066         else                                                                 return false ;
00067         offset++;
00068     }
00069 
00070     results->value       = (unsigned long)data;
00071     results->address     = (unsigned int)(data >> 32);
00072     results->decode_type = PANASONIC;
00073     results->bits        = PANASONIC_BITS;
00074 
00075     return true;
00076 }
00077 #endif
00078