25 #ifndef ACE_SEGMENT_LED_MATRIX_DUAL_HC595_H
26 #define ACE_SEGMENT_LED_MATRIX_DUAL_HC595_H
28 #include "LedMatrixBase.h"
30 class LedMatrixDualHc595Test_draw;
31 class LedMatrixDualHc595Test_enableGroup;
32 class LedMatrixDualHc595Test_disableGroup;
34 namespace ace_segment {
37 const uint8_t kByteOrderGroupHighElementLow = 0;
40 const uint8_t kByteOrderElementHighGroupLow = 1;
55 template <
typename T_SPII>
69 const T_SPII& spiInterface,
70 uint8_t elementOnPattern,
71 uint8_t groupOnPattern,
73 const uint8_t* remapArrayInverted =
nullptr
76 mSpiInterface(spiInterface),
77 mRemapArrayInverted(remapArrayInverted),
109 void draw(uint8_t group, uint8_t elementPattern)
const {
112 uint8_t logicalGroup = remapPhysicalToLogical(group);
113 uint8_t groupPattern = 0x1 << logicalGroup;
115 drawPatterns(groupPattern, elementPattern);
116 mPrevElementPattern = elementPattern;
124 draw(group, mPrevElementPattern);
130 drawPatterns(0x00, 0x00);
136 drawPatterns(0x00, 0x00);
137 mPrevElementPattern = 0x00;
147 void drawPatterns(uint8_t groupPattern, uint8_t elementPattern)
const {
148 uint8_t actualGroupPattern = (groupPattern ^ mGroupXorMask);
149 uint8_t actualElementPattern = (elementPattern ^ mElementXorMask);
150 uint16_t data = (mByteOrder == kByteOrderGroupHighElementLow)
151 ? actualGroupPattern << 8 | actualElementPattern
152 : actualElementPattern << 8 | actualGroupPattern;
153 mSpiInterface.send16(data);
157 uint8_t remapPhysicalToLogical(uint8_t pos)
const {
158 return mRemapArrayInverted ? mRemapArrayInverted[pos] : pos;
162 friend class ::LedMatrixDualHc595Test_draw;
163 friend class ::LedMatrixDualHc595Test_enableGroup;
164 friend class ::LedMatrixDualHc595Test_disableGroup;
170 const T_SPII mSpiInterface;
176 const uint8_t*
const mRemapArrayInverted;
179 const uint8_t mByteOrder;
185 mutable uint8_t mPrevElementPattern;