IRremote
ir_Lego_PF_BitStreamEncoder.h
Go to the documentation of this file.
1 //==============================================================================
2 // L EEEEEE EEEE OOOO
3 // L E E O O
4 // L EEEE E EEE O O
5 // L E E E O O LEGO Power Functions
6 // LLLLLL EEEEEE EEEE OOOO Copyright (c) 2016, 2017 Philipp Henkel
7 //==============================================================================
8 
9 //+=============================================================================
10 //
11 
13 private:
14  uint16_t data;
15  bool repeatMessage;
16  uint8_t messageBitIdx;
17  uint8_t repeatCount;
18  uint16_t messageLength;
19 
20 public:
21  // HIGH data bit = IR mark + high pause
22  // LOW data bit = IR mark + low pause
23  static const uint16_t LOW_BIT_DURATION = 421;
24  static const uint16_t HIGH_BIT_DURATION = 711;
25  static const uint16_t START_BIT_DURATION = 1184;
26  static const uint16_t STOP_BIT_DURATION = 1184;
27  static const uint8_t IR_MARK_DURATION = 158;
32  static const uint8_t MESSAGE_BITS = 18;
33  static const uint16_t MAX_MESSAGE_LENGTH = 16000;
34 
35  void reset(uint16_t data, bool repeatMessage) {
36  this->data = data;
37  this->repeatMessage = repeatMessage;
38  messageBitIdx = 0;
39  repeatCount = 0;
40  messageLength = getMessageLength();
41  }
42 
43  int getChannelId() const {
44  return 1 + ((data >> 12) & 0x3);
45  }
46 
47  uint16_t getMessageLength() const {
48  // Sum up all marks
49  uint16_t length = MESSAGE_BITS * IR_MARK_DURATION;
50 
51  // Sum up all pauses
52  length += START_PAUSE_DURATION;
53  for (unsigned long mask = 1UL << 15; mask; mask >>= 1) {
54  if (data & mask) {
55  length += HIGH_PAUSE_DURATION;
56  } else {
57  length += LOW_PAUSE_DURATION;
58  }
59  }
60  length += STOP_PAUSE_DURATION;
61  return length;
62  }
63 
64  boolean next() {
65  messageBitIdx++;
66  if (messageBitIdx >= MESSAGE_BITS) {
67  repeatCount++;
68  messageBitIdx = 0;
69  }
70  if (repeatCount >= 1 && !repeatMessage) {
71  return false;
72  } else if (repeatCount >= 5) {
73  return false;
74  } else {
75  return true;
76  }
77  }
78 
79  uint8_t getMarkDuration() const {
80  return IR_MARK_DURATION;
81  }
82 
83  uint32_t getPauseDuration() const {
84  if (messageBitIdx == 0)
85  return START_PAUSE_DURATION;
86  else if (messageBitIdx < MESSAGE_BITS - 1) {
87  return getDataBitPause();
88  } else {
89  return getStopPause();
90  }
91  }
92 
93 private:
94  uint16_t getDataBitPause() const {
95  const int pos = MESSAGE_BITS - 2 - messageBitIdx;
96  const bool isHigh = data & (1 << pos);
97  return isHigh ? HIGH_PAUSE_DURATION : LOW_PAUSE_DURATION;
98  }
99 
100  uint32_t getStopPause() const {
101  if (repeatMessage) {
102  return getRepeatStopPause();
103  } else {
104  return STOP_PAUSE_DURATION;
105  }
106  }
107 
108  uint32_t getRepeatStopPause() const {
109  if (repeatCount == 0 || repeatCount == 1) {
110  return STOP_PAUSE_DURATION + (uint32_t) 5 * MAX_MESSAGE_LENGTH - messageLength;
111  } else if (repeatCount == 2 || repeatCount == 3) {
112  return STOP_PAUSE_DURATION + (uint32_t) (6 + 2 * getChannelId()) * MAX_MESSAGE_LENGTH - messageLength;
113  } else {
114  return STOP_PAUSE_DURATION;
115  }
116  }
117 };
LegoPfBitStreamEncoder::HIGH_PAUSE_DURATION
static const uint16_t HIGH_PAUSE_DURATION
Definition: ir_Lego_PF_BitStreamEncoder.h:28
LegoPfBitStreamEncoder::reset
void reset(uint16_t data, bool repeatMessage)
Definition: ir_Lego_PF_BitStreamEncoder.h:35
LegoPfBitStreamEncoder::LOW_PAUSE_DURATION
static const uint16_t LOW_PAUSE_DURATION
Definition: ir_Lego_PF_BitStreamEncoder.h:29
LegoPfBitStreamEncoder::getMarkDuration
uint8_t getMarkDuration() const
Definition: ir_Lego_PF_BitStreamEncoder.h:79
LegoPfBitStreamEncoder::LOW_BIT_DURATION
static const uint16_t LOW_BIT_DURATION
Definition: ir_Lego_PF_BitStreamEncoder.h:23
LegoPfBitStreamEncoder::MAX_MESSAGE_LENGTH
static const uint16_t MAX_MESSAGE_LENGTH
Definition: ir_Lego_PF_BitStreamEncoder.h:33
LegoPfBitStreamEncoder::HIGH_BIT_DURATION
static const uint16_t HIGH_BIT_DURATION
Definition: ir_Lego_PF_BitStreamEncoder.h:24
LegoPfBitStreamEncoder::STOP_PAUSE_DURATION
static const uint16_t STOP_PAUSE_DURATION
Definition: ir_Lego_PF_BitStreamEncoder.h:31
LegoPfBitStreamEncoder::getPauseDuration
uint32_t getPauseDuration() const
Definition: ir_Lego_PF_BitStreamEncoder.h:83
LegoPfBitStreamEncoder::getChannelId
int getChannelId() const
Definition: ir_Lego_PF_BitStreamEncoder.h:43
LegoPfBitStreamEncoder::START_BIT_DURATION
static const uint16_t START_BIT_DURATION
Definition: ir_Lego_PF_BitStreamEncoder.h:25
LegoPfBitStreamEncoder::getMessageLength
uint16_t getMessageLength() const
Definition: ir_Lego_PF_BitStreamEncoder.h:47
LegoPfBitStreamEncoder
Definition: ir_Lego_PF_BitStreamEncoder.h:12
LegoPfBitStreamEncoder::STOP_BIT_DURATION
static const uint16_t STOP_BIT_DURATION
Definition: ir_Lego_PF_BitStreamEncoder.h:26
LegoPfBitStreamEncoder::next
boolean next()
Definition: ir_Lego_PF_BitStreamEncoder.h:64
LegoPfBitStreamEncoder::MESSAGE_BITS
static const uint8_t MESSAGE_BITS
Definition: ir_Lego_PF_BitStreamEncoder.h:32
LegoPfBitStreamEncoder::IR_MARK_DURATION
static const uint8_t IR_MARK_DURATION
Definition: ir_Lego_PF_BitStreamEncoder.h:27
LegoPfBitStreamEncoder::START_PAUSE_DURATION
static const uint16_t START_PAUSE_DURATION
Definition: ir_Lego_PF_BitStreamEncoder.h:30