25 #ifndef ACE_SEGMENT_TM1638_MODULE_H
26 #define ACE_SEGMENT_TM1638_MODULE_H
29 #include <AceCommon.h>
30 #include "../LedModule.h"
32 class Tm1638ModuleTest_flushIncremental;
33 class Tm1638ModuleTest_flush;
35 namespace ace_segment {
41 static const uint16_t kDefaultTm1638DelayMicros = 1;
52 extern const uint8_t kDigitRemapArray8Tm1638[8];
63 template <
typename T_TMII, u
int8_t T_DIGITS>
75 const T_TMII& tmiInterface,
76 const uint8_t* remapArray =
nullptr
79 mTmiInterface(tmiInterface),
80 mRemapArray(remapArray)
94 memset(mPatterns, 0, T_DIGITS);
144 mTmiInterface.beginTransaction();
145 mTmiInterface.write(kDataCmdAutoAddress);
146 mTmiInterface.endTransaction();
149 mTmiInterface.beginTransaction();
150 mTmiInterface.write(kAddressCmd);
151 for (uint8_t chipPos = 0; chipPos < T_DIGITS; ++chipPos) {
156 uint8_t physicalPos = remapLogicalToPhysical(chipPos);
157 uint8_t effectivePattern = mPatterns[physicalPos];
158 mTmiInterface.write(effectivePattern);
159 mTmiInterface.write(0x00);
161 mTmiInterface.endTransaction();
167 mTmiInterface.beginTransaction();
168 mTmiInterface.write(kBrightnessCmd
169 | (mDisplayOn ? kBrightnessLevelOn : 0x0)
171 mTmiInterface.endTransaction();
179 uint8_t remapLogicalToPhysical(uint8_t pos)
const {
180 return mRemapArray ? mRemapArray[pos] : pos;
185 friend class ::Tm1638ModuleTest_flush;
188 static uint8_t
const kDataCmdWriteDisplay = 0b01000000;
189 static uint8_t
const kDataCmdReadKeys = 0b01000010;
190 static uint8_t
const kDataCmdAutoAddress = 0b01000000;
191 static uint8_t
const kDataCmdFixedAddress = 0b01000100;
192 static uint8_t
const kAddressCmd = 0b11000000;
193 static uint8_t
const kBrightnessCmd = 0b10000000;
194 static uint8_t
const kBrightnessLevelOn = 0b00001000;
201 const T_TMII mTmiInterface;
203 const uint8_t*
const mRemapArray;
204 uint8_t mPatterns[T_DIGITS];