Guest User

gree.cpp

a guest
Jan 13th, 2017
267
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.27 KB | None | 0 0
  1. #include    <Arduino.h>
  2.  
  3. #include    "../../shared/data_types.h"
  4. #include    "IRremoteESP8266/IRremoteESP8266.h"
  5. #include    "gree.h"
  6.  
  7. namespace GREE {
  8.  
  9. TEMP temp[TEMP_CNT]             = {TEMP_16C, TEMP_17C, TEMP_18C, TEMP_19C, TEMP_20C, TEMP_21C, TEMP_22C, TEMP_23C, TEMP_24C, TEMP_25C, TEMP_26C, TEMP_27C, TEMP_28C, TEMP_29C, TEMP_30C};
  10.  
  11. void
  12. send_ac_packet                  (const packet packet, IRsend &irsend) {
  13.     u32 temp_id                 = u32_max;
  14.     u32 temp_id_shifted         = u32_max;
  15.  
  16.     for (u32 i = 0; i < TEMP_CNT; ++i) {
  17.         if (temp[i] == packet.bit.temp) {
  18.             temp_id             = i;
  19.             break;
  20.         }
  21.     }
  22.  
  23.     u32 tail                    = 0b00000000000001000000000000000000;
  24.  
  25.     u32 shift                   = SHIFT_INVALID;
  26.     u32 unique_temp_id          = UNIQUE_TEMP_INVALID;
  27.     u32 unique_temp_shifted_id  = UNIQUE_TEMP_SHIFTED_INVALID;
  28.  
  29.     switch (packet.bit.mode) {
  30.     case MODE_AUTO: {
  31.         shift                   = SHIFT_AUTO;
  32.         unique_temp_id          = UNIQUE_TEMP_AUTO;
  33.         unique_temp_shifted_id  = UNIQUE_TEMP_SHIFTED_AUTO;
  34.     } break;
  35.     case MODE_COOL: {
  36.         shift                   = SHIFT_COOL;
  37.         unique_temp_id          = UNIQUE_TEMP_COOL;
  38.         unique_temp_shifted_id  = UNIQUE_TEMP_SHIFTED_COOL;
  39.     } break;
  40.     case MODE_DRY: {
  41.         shift                   = SHIFT_DRY;
  42.         unique_temp_id          = UNIQUE_TEMP_DRY;
  43.         unique_temp_shifted_id  = UNIQUE_TEMP_SHIFTED_DRY;
  44.     } break;
  45.     case MODE_FAN: {
  46.         shift                   = SHIFT_FAN;
  47.         unique_temp_id          = UNIQUE_TEMP_FAN;
  48.         unique_temp_shifted_id  = UNIQUE_TEMP_SHIFTED_FAN;
  49.     } break;
  50.     case MODE_HEAT: {
  51.         shift                   = SHIFT_HEAT;
  52.         unique_temp_id          = UNIQUE_TEMP_HEAT;
  53.         unique_temp_shifted_id  = UNIQUE_TEMP_SHIFTED_HEAT;
  54.     } break;
  55.  
  56.     default:
  57.         break;
  58.     }
  59.  
  60.     temp_id_shifted             = temp_id + shift;
  61.  
  62.     if (TEMP_RANGE <= temp_id_shifted) {
  63.         temp_id_shifted         = temp_id_shifted - TEMP_RANGE;
  64.     }
  65.  
  66.     if (packet.bit.swing) {
  67.         tail                    |= 0b10001000000000000000000000000000;
  68.  
  69.         ++temp_id_shifted;
  70.         ++unique_temp_id;
  71.     }
  72.  
  73.     if (unique_temp_id == temp_id) {
  74.         tail                    |= TEMP_UNIQUE;
  75.     } else if (packet.bit.swing && TEMP_RANGE == temp_id) {
  76.         tail                    |= temp[unique_temp_shifted_id];
  77.     } else {
  78.         tail                    |= temp[temp_id_shifted];
  79.     }
  80.  
  81.     if (!packet.bit.power) {
  82.         tail                    ^= 0x000001;
  83.     }
  84.  
  85.     //
  86.     //
  87.     //
  88.  
  89.     u32 data                    = packet.storage;
  90.     u32 data_mask               = 0x80000000;
  91.  
  92.     irsend.enableIROut          (38);
  93.     delay                       (10);
  94.  
  95.     irsend.mark                 (HDR_MARK);
  96.     irsend.space                (HDR_SPACE);
  97.  
  98.     for (u32 i = 0; i < 22; ++i) {
  99.         if (data & data_mask) {
  100.             irsend.mark         (BIT_MARK);
  101.             irsend.space        (ONE_SPACE);
  102.         } else {
  103.             irsend.mark         (BIT_MARK);
  104.             irsend.space        (ZERO_SPACE);
  105.         }
  106.         data_mask               >>= 1;
  107.     }
  108.  
  109.     cu16 fixed_tail             = 0b0001000001010010;   //13 bits
  110.     u16 fixed_tail_mask         = 0b0001000000000000;
  111.  
  112.     for (u32 i = 0; i < 13; ++i) {
  113.         if (fixed_tail & fixed_tail_mask) {
  114.             irsend.mark         (BIT_MARK);
  115.             irsend.space        (ONE_SPACE);
  116.         } else {
  117.             irsend.mark         (BIT_MARK);
  118.             irsend.space        (ZERO_SPACE);
  119.         }
  120.         fixed_tail_mask         >>= 1;
  121.     }
  122.  
  123.     irsend.mark                 (BIT_MARK);
  124.     irsend.space                (TAIL_SPACE);
  125.  
  126.     u32 tail_mask               = 0x80000000; //32 bits
  127.  
  128.     for (u32 i = 0; i < 32; ++i) {
  129.         if (tail & tail_mask) {
  130.             irsend.mark         (BIT_MARK);
  131.             irsend.space        (ONE_SPACE);
  132.  
  133.         } else {
  134.             irsend.mark         (BIT_MARK);
  135.             irsend.space        (ZERO_SPACE);
  136.         }
  137.  
  138.         tail_mask               >>= 1;
  139.     }
  140.  
  141.  
  142.     irsend.mark                 (BIT_MARK);
  143.     irsend.space                (0);
  144. }
  145.  
  146. }; // namespace GREE
  147.  
  148. //
  149. //
  150. //
Add Comment
Please, Sign In to add comment