Lumitronix_Iflex_Pro_Workshop
Library to interact with the iFlexPro
LumitronixIFlexBrightnessBus.h
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2 LumitronixIFlexBus library wrapper template class that provides overall brightness control
3 
4 Written by Michael C. Miller.
5 
6 I invest time and resources providing this open source code,
7 please support me by dontating (see https://github.com/Makuna)
8 
9 -------------------------------------------------------------------------
10 This file is part of the LUMITRONIX_iFlex_Workshop library.
11 
12 LumitronixIFlexBus is free software: you can redistribute it and/or modify
13 it under the terms of the GNU Lesser General Public License as
14 published by the Free Software Foundation, either version 3 of
15 the License, or (at your option) any later version.
16 
17 LumitronixIFlexBus is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU Lesser General Public License for more details.
21 
22 You should have received a copy of the GNU Lesser General Public
23 License along with LumitronixIFlex. If not, see
24 <http://www.gnu.org/licenses/>.
25 -------------------------------------------------------------------------*/
26 
27 #pragma once
28 
29 #include "LumitronixIFlexBus.h"
30 
31 
32 template<typename T_COLOR_FEATURE, typename T_METHOD> class [[deprecated("Use LumitronixIFlexBusLg instead.")]] LumitronixIFlexBrightnessBus :
33  public LumitronixIFlexBus<T_COLOR_FEATURE, T_METHOD>
34 {
35 private:
36 
37  void ScaleColor(uint16_t scale, typename T_COLOR_FEATURE::ColorObject* color)
38  {
39  // This is the similiar as calling Dim on the color object
40  // there is an assumption that all color elements are byte aligned
41  // so if any future color object gets introduced that is not it will
42  // cause a problem
43  uint8_t* ptr = (uint8_t*)color;
44  uint8_t* ptrEnd = ptr + sizeof(typename T_COLOR_FEATURE::ColorObject);
45 
46  while (ptr != ptrEnd)
47  {
48  uint16_t value = *ptr;
49  *ptr++ = (value * scale) >> 8;
50  }
51  }
52 
53  void ConvertColor(typename T_COLOR_FEATURE::ColorObject* color)
54  {
55  // This is the same as calling Dim on the color object
56  uint16_t scale = _brightness + 1;
57  ScaleColor(scale, color);
58  }
59 
60  void RecoverColor(typename T_COLOR_FEATURE::ColorObject* color) const
61  {
62  // this is the same as calling Brighton on the color object
63  // there is an assumption that all color elements are byte aligned
64  // so if any future color object gets introduced that is not it will
65  // cause a problem
66  uint8_t* ptr = (uint8_t*)color;
67  uint8_t* ptrEnd = ptr + sizeof(typename T_COLOR_FEATURE::ColorObject);
68  uint16_t scale = _brightness + 1;
69 
70  while (ptr != ptrEnd)
71  {
72  uint16_t value = *ptr;
73  *ptr++ = (value << 8) / scale;
74  }
75  }
76 
77 public:
78  LumitronixIFlexBrightnessBus(uint16_t countPixels, uint8_t pin) :
79  LumitronixIFlexBus<T_COLOR_FEATURE, T_METHOD>(countPixels, pin),
80  _brightness(255)
81  {
82  }
83 
84  LumitronixIFlexBrightnessBus(uint16_t countPixels, uint8_t pin, NeoBusChannel channel) :
85  LumitronixIFlexBus<T_COLOR_FEATURE, T_METHOD>(countPixels, pin, channel),
86  _brightness(255)
87  {
88  }
89 
90  LumitronixIFlexBrightnessBus(uint16_t countPixels, uint8_t pinClock, uint8_t pinData) :
91  LumitronixIFlexBus<T_COLOR_FEATURE, T_METHOD>(countPixels, pinClock, pinData),
92  _brightness(255)
93  {
94  }
95 
96  LumitronixIFlexBrightnessBus(uint16_t countPixels, uint8_t pinClock, uint8_t pinData, uint8_t pinLatch, uint8_t pinOutputEnable = NOT_A_PIN) :
97  LumitronixIFlexBus<T_COLOR_FEATURE, T_METHOD>(countPixels, pinClock, pinData, pinLatch, pinOutputEnable),
98  _brightness(255)
99  {
100  }
101 
102  LumitronixIFlexBrightnessBus(uint16_t countPixels) :
103  LumitronixIFlexBus<T_COLOR_FEATURE, T_METHOD>(countPixels),
104  _brightness(255)
105  {
106  }
107 
108  void SetBrightness(uint8_t brightness)
109  {
110  // Only update if there is a change
111  if (brightness != _brightness)
112  {
113  uint16_t scale = ((static_cast<uint16_t>(brightness) + 1) << 8) / (static_cast<uint16_t>(_brightness) + 1);
114 
115  // scale existing pixels
116  //
117  for (uint16_t indexPixel = 0; indexPixel < LumitronixIFlexBus<T_COLOR_FEATURE, T_METHOD>::PixelCount(); indexPixel++)
118  {
119  typename T_COLOR_FEATURE::ColorObject color = LumitronixIFlexBus<T_COLOR_FEATURE, T_METHOD>::GetPixelColor(indexPixel);
120  ScaleColor(scale, &color);
122  }
123 
124  _brightness = brightness;
125  this->Dirty();
126  }
127  }
128 
129  uint8_t GetBrightness() const
130  {
131  return _brightness;
132  }
133 
134  void SetPixelColor(uint16_t indexPixel, typename T_COLOR_FEATURE::ColorObject color)
135  {
136  ConvertColor(&color);
138  }
139 
140  typename T_COLOR_FEATURE::ColorObject GetPixelColor(uint16_t indexPixel) const
141  {
142  typename T_COLOR_FEATURE::ColorObject color = LumitronixIFlexBus<T_COLOR_FEATURE, T_METHOD>::GetPixelColor(indexPixel);
143  RecoverColor(&color);
144  return color;
145  }
146 
147  void ClearTo(typename T_COLOR_FEATURE::ColorObject color)
148  {
149  ConvertColor(&color);
151  };
152 
153  void ClearTo(typename T_COLOR_FEATURE::ColorObject color, uint16_t first, uint16_t last)
154  {
155  ConvertColor(&color);
157  }
158 
159 
160 protected:
161  uint8_t _brightness;
162 };
163 
164 
NeoBusChannel
Definition: NeoBusChannel.h:12
Definition: LumitronixIFlexBrightnessBus.h:34
LumitronixIFlexBrightnessBus(uint16_t countPixels, uint8_t pin, NeoBusChannel channel)
Definition: LumitronixIFlexBrightnessBus.h:84
LumitronixIFlexBrightnessBus(uint16_t countPixels)
Definition: LumitronixIFlexBrightnessBus.h:102
uint8_t GetBrightness() const
Definition: LumitronixIFlexBrightnessBus.h:129
void SetPixelColor(uint16_t indexPixel, typename T_COLOR_FEATURE::ColorObject color)
Definition: LumitronixIFlexBrightnessBus.h:134
void ClearTo(typename T_COLOR_FEATURE::ColorObject color)
Definition: LumitronixIFlexBrightnessBus.h:147
T_COLOR_FEATURE::ColorObject GetPixelColor(uint16_t indexPixel) const
Definition: LumitronixIFlexBrightnessBus.h:140
uint8_t _brightness
Definition: LumitronixIFlexBrightnessBus.h:161
void ClearTo(typename T_COLOR_FEATURE::ColorObject color, uint16_t first, uint16_t last)
Definition: LumitronixIFlexBrightnessBus.h:153
LumitronixIFlexBrightnessBus(uint16_t countPixels, uint8_t pin)
Definition: LumitronixIFlexBrightnessBus.h:78
LumitronixIFlexBrightnessBus(uint16_t countPixels, uint8_t pinClock, uint8_t pinData)
Definition: LumitronixIFlexBrightnessBus.h:90
LumitronixIFlexBrightnessBus(uint16_t countPixels, uint8_t pinClock, uint8_t pinData, uint8_t pinLatch, uint8_t pinOutputEnable=NOT_A_PIN)
Definition: LumitronixIFlexBrightnessBus.h:96
void SetBrightness(uint8_t brightness)
Definition: LumitronixIFlexBrightnessBus.h:108
Definition: LumitronixIFlexBusLg.h:42
Definition: LumitronixIFlexBus.h:47
void Dirty()
Definition: LumitronixIFlexBus.h:146
T_COLOR_FEATURE::ColorObject GetPixelColor(uint16_t indexPixel) const
Definition: LumitronixIFlexBus.h:185
void SetPixelColor(uint16_t indexPixel, typename T_COLOR_FEATURE::ColorObject color)
Definition: LumitronixIFlexBus.h:176
void ClearTo(typename T_COLOR_FEATURE::ColorObject color)
Definition: LumitronixIFlexBus.h:199