25 #ifndef ACE_SEGMENT_TM1637_MODULE_H
26 #define ACE_SEGMENT_TM1637_MODULE_H
29 #include <AceCommon.h>
30 #include "../LedModule.h"
32 class Tm1637ModuleTest_flushIncremental;
33 class Tm1637ModuleTest_flush;
35 namespace ace_segment {
47 static const uint16_t kDefaultTm1637DelayMicros = 100;
62 extern const uint8_t kDigitRemapArray6Tm1637[6];
74 template <
typename T_TMII, u
int8_t T_DIGITS>
86 const T_TMII& tmiInterface,
87 const uint8_t* remapArray =
nullptr
90 mTmiInterface(tmiInterface),
91 mRemapArray(remapArray)
105 memset(mPatterns, 0, T_DIGITS);
147 mTmiInterface.startCondition();
148 mTmiInterface.sendByte(kBrightnessCmd
149 | (mDisplayOn ? kBrightnessLevelOn : 0x0)
151 mTmiInterface.stopCondition();
154 mTmiInterface.startCondition();
155 mTmiInterface.sendByte(kDataCmdAutoAddress);
156 mTmiInterface.stopCondition();
158 mTmiInterface.startCondition();
159 mTmiInterface.sendByte(kAddressCmd);
160 for (uint8_t chipPos = 0; chipPos < T_DIGITS; ++chipPos) {
165 uint8_t physicalPos = remapLogicalToPhysical(chipPos);
166 uint8_t effectivePattern = mPatterns[physicalPos];
167 mTmiInterface.sendByte(effectivePattern);
169 mTmiInterface.stopCondition();
209 if (mFlushStage == T_DIGITS) {
212 mTmiInterface.startCondition();
213 mTmiInterface.sendByte(kBrightnessCmd
214 | (mDisplayOn ? kBrightnessLevelOn : 0x0)
216 mTmiInterface.stopCondition();
224 const uint8_t chipPos = mFlushStage;
225 const uint8_t physicalPos = remapLogicalToPhysical(chipPos);
228 mTmiInterface.startCondition();
229 mTmiInterface.sendByte(kDataCmdFixedAddress);
230 mTmiInterface.stopCondition();
232 mTmiInterface.startCondition();
233 mTmiInterface.sendByte(kAddressCmd | chipPos);
234 mTmiInterface.sendByte(mPatterns[physicalPos]);
235 mTmiInterface.stopCondition();
241 ace_common::incrementMod(mFlushStage, (uint8_t) (T_DIGITS + 1));
246 uint8_t remapLogicalToPhysical(uint8_t pos)
const {
247 return mRemapArray ? mRemapArray[pos] : pos;
252 friend class ::Tm1637ModuleTest_flushIncremental;
253 friend class ::Tm1637ModuleTest_flush;
256 static uint8_t
const kDataCmdWriteDisplay = 0b01000000;
257 static uint8_t
const kDataCmdReadKeys = 0b01000010;
258 static uint8_t
const kDataCmdAutoAddress = 0b01000000;
259 static uint8_t
const kDataCmdFixedAddress = 0b01000100;
260 static uint8_t
const kAddressCmd = 0b11000000;
261 static uint8_t
const kBrightnessCmd = 0b10000000;
262 static uint8_t
const kBrightnessLevelOn = 0b00001000;
269 const T_TMII mTmiInterface;
271 const uint8_t*
const mRemapArray;
272 uint8_t mPatterns[T_DIGITS];