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;
53 template <
typename T_SPII>
66 const T_SPII& spiInterface,
67 uint8_t elementOnPattern,
68 uint8_t groupOnPattern,
70 const uint8_t* remapArrayInverted =
nullptr
73 mSpiInterface(spiInterface),
74 mRemapArrayInverted(remapArrayInverted),
106 void draw(uint8_t group, uint8_t elementPattern)
const {
109 uint8_t logicalGroup = remapPhysicalToLogical(group);
110 uint8_t groupPattern = 0x1 << logicalGroup;
112 drawPatterns(groupPattern, elementPattern);
113 mPrevElementPattern = elementPattern;
121 draw(group, mPrevElementPattern);
127 drawPatterns(0x00, 0x00);
133 drawPatterns(0x00, 0x00);
134 mPrevElementPattern = 0x00;
144 void drawPatterns(uint8_t groupPattern, uint8_t elementPattern)
const {
145 uint8_t actualGroupPattern = (groupPattern ^ mGroupXorMask);
146 uint8_t actualElementPattern = (elementPattern ^ mElementXorMask);
147 uint16_t data = (mByteOrder == kByteOrderGroupHighElementLow)
148 ? actualGroupPattern << 8 | actualElementPattern
149 : actualElementPattern << 8 | actualGroupPattern;
150 mSpiInterface.send16(data);
154 uint8_t remapPhysicalToLogical(uint8_t pos)
const {
155 return mRemapArrayInverted ? mRemapArrayInverted[pos] : pos;
159 friend class ::LedMatrixDualHc595Test_draw;
160 friend class ::LedMatrixDualHc595Test_enableGroup;
161 friend class ::LedMatrixDualHc595Test_disableGroup;
163 const T_SPII& mSpiInterface;
169 const uint8_t*
const mRemapArrayInverted;
172 const uint8_t mByteOrder;
178 mutable uint8_t mPrevElementPattern;