44// L E E O O
55// L EEEE E EEE O O
66// L E E E O O LEGO Power Functions
7- // LLLLLL EEEEEE EEEE OOOO Copyright (c) 2016 Philipp Henkel
7+ // LLLLLL EEEEEE EEEE OOOO Copyright (c) 2016, 2017 Philipp Henkel
88// ==============================================================================
99
1010// +=============================================================================
@@ -14,25 +14,25 @@ class LegoPfBitStreamEncoder {
1414 private:
1515 uint16_t data;
1616 bool repeatMessage;
17- int messageBitIdx;
18- int repeatCount;
19- int messageLength;
17+ uint8_t messageBitIdx;
18+ uint8_t repeatCount;
19+ uint16_t messageLength;
2020
21+ public:
2122 // HIGH data bit = IR mark + high pause
2223 // LOW data bit = IR mark + low pause
23- static const int LOW_BIT_DURATION = 421 ;
24- static const int HIGH_BIT_DURATION = 711 ;
25- static const int START_BIT_DURATION = 1184 ;
26- static const int STOP_BIT_DURATION = 1184 ;
27- static const int IR_MARK_DURATION = 158 ;
28- static const int HIGH_PAUSE_DURATION = HIGH_BIT_DURATION - IR_MARK_DURATION;
29- static const int LOW_PAUSE_DURATION = LOW_BIT_DURATION - IR_MARK_DURATION;
30- static const int START_PAUSE_DURATION = START_BIT_DURATION - IR_MARK_DURATION;
31- static const int STOP_PAUSE_DURATION = STOP_BIT_DURATION - IR_MARK_DURATION;
32- static const int MESSAGE_BITS = 18 ;
33- static const int MAX_MESSAGE_LENGTH = 16000 ;
24+ static const uint16_t LOW_BIT_DURATION = 421 ;
25+ static const uint16_t HIGH_BIT_DURATION = 711 ;
26+ static const uint16_t START_BIT_DURATION = 1184 ;
27+ static const uint16_t STOP_BIT_DURATION = 1184 ;
28+ static const uint8_t IR_MARK_DURATION = 158 ;
29+ static const uint16_t HIGH_PAUSE_DURATION = HIGH_BIT_DURATION - IR_MARK_DURATION;
30+ static const uint16_t LOW_PAUSE_DURATION = LOW_BIT_DURATION - IR_MARK_DURATION;
31+ static const uint16_t START_PAUSE_DURATION = START_BIT_DURATION - IR_MARK_DURATION;
32+ static const uint16_t STOP_PAUSE_DURATION = STOP_BIT_DURATION - IR_MARK_DURATION;
33+ static const uint8_t MESSAGE_BITS = 18 ;
34+ static const uint16_t MAX_MESSAGE_LENGTH = 16000 ;
3435
35- public:
3636 void reset (uint16_t data, bool repeatMessage) {
3737 this ->data = data;
3838 this ->repeatMessage = repeatMessage;
@@ -43,9 +43,9 @@ class LegoPfBitStreamEncoder {
4343
4444 int getChannelId () const { return 1 + ((data >> 12 ) & 0x3 ); }
4545
46- int getMessageLength () const {
46+ uint16_t getMessageLength () const {
4747 // Sum up all marks
48- int length = MESSAGE_BITS * IR_MARK_DURATION;
48+ uint16_t length = MESSAGE_BITS * IR_MARK_DURATION;
4949
5050 // Sum up all pauses
5151 length += START_PAUSE_DURATION;
@@ -75,9 +75,9 @@ class LegoPfBitStreamEncoder {
7575 }
7676 }
7777
78- int getMarkDuration () const { return IR_MARK_DURATION; }
78+ uint8_t getMarkDuration () const { return IR_MARK_DURATION; }
7979
80- int getPauseDuration () const {
80+ uint32_t getPauseDuration () const {
8181 if (messageBitIdx == 0 )
8282 return START_PAUSE_DURATION;
8383 else if (messageBitIdx < MESSAGE_BITS - 1 ) {
@@ -88,26 +88,26 @@ class LegoPfBitStreamEncoder {
8888 }
8989
9090 private:
91- int getDataBitPause () const {
91+ uint16_t getDataBitPause () const {
9292 const int pos = MESSAGE_BITS - 2 - messageBitIdx;
9393 const bool isHigh = data & (1 << pos);
9494 return isHigh ? HIGH_PAUSE_DURATION : LOW_PAUSE_DURATION;
9595 }
9696
97- int getStopPause () const {
97+ uint32_t getStopPause () const {
9898 if (repeatMessage) {
9999 return getRepeatStopPause ();
100100 } else {
101101 return STOP_PAUSE_DURATION;
102102 }
103103 }
104104
105- int getRepeatStopPause () const {
105+ uint32_t getRepeatStopPause () const {
106106 if (repeatCount == 0 || repeatCount == 1 ) {
107- return STOP_PAUSE_DURATION + 5 * MAX_MESSAGE_LENGTH - messageLength;
107+ return STOP_PAUSE_DURATION + ( uint32_t ) 5 * MAX_MESSAGE_LENGTH - messageLength;
108108 } else if (repeatCount == 2 || repeatCount == 3 ) {
109109 return STOP_PAUSE_DURATION
110- + (6 + 2 * getChannelId ()) * MAX_MESSAGE_LENGTH - messageLength;
110+ + (uint32_t )( 6 + 2 * getChannelId ()) * MAX_MESSAGE_LENGTH - messageLength;
111111 } else {
112112 return STOP_PAUSE_DURATION;
113113 }
0 commit comments