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.write(kDataCmdAutoAddress);
149 mTmiInterface.stopCondition();
152 mTmiInterface.startCondition();
153 mTmiInterface.write(kAddressCmd);
154 for (uint8_t chipPos = 0; chipPos < T_DIGITS; ++chipPos) {
159 uint8_t physicalPos = remapLogicalToPhysical(chipPos);
160 uint8_t effectivePattern = mPatterns[physicalPos];
161 mTmiInterface.write(effectivePattern);
163 mTmiInterface.stopCondition();
169 mTmiInterface.startCondition();
170 mTmiInterface.write(kBrightnessCmd
171 | (mDisplayOn ? kBrightnessLevelOn : 0x0)
173 mTmiInterface.stopCondition();
213 if (mFlushStage == T_DIGITS) {
216 mTmiInterface.startCondition();
217 mTmiInterface.write(kBrightnessCmd
218 | (mDisplayOn ? kBrightnessLevelOn : 0x0)
220 mTmiInterface.stopCondition();
228 const uint8_t chipPos = mFlushStage;
229 const uint8_t physicalPos = remapLogicalToPhysical(chipPos);
232 mTmiInterface.startCondition();
233 mTmiInterface.write(kDataCmdFixedAddress);
234 mTmiInterface.stopCondition();
236 mTmiInterface.startCondition();
237 mTmiInterface.write(kAddressCmd | chipPos);
238 mTmiInterface.write(mPatterns[physicalPos]);
239 mTmiInterface.stopCondition();
245 ace_common::incrementMod(mFlushStage, (uint8_t) (T_DIGITS + 1));
250 uint8_t remapLogicalToPhysical(uint8_t pos)
const {
251 return mRemapArray ? mRemapArray[pos] : pos;
256 friend class ::Tm1637ModuleTest_flushIncremental;
257 friend class ::Tm1637ModuleTest_flush;
260 static uint8_t
const kDataCmdWriteDisplay = 0b01000000;
261 static uint8_t
const kDataCmdReadKeys = 0b01000010;
262 static uint8_t
const kDataCmdAutoAddress = 0b01000000;
263 static uint8_t
const kDataCmdFixedAddress = 0b01000100;
264 static uint8_t
const kAddressCmd = 0b11000000;
265 static uint8_t
const kBrightnessCmd = 0b10000000;
266 static uint8_t
const kBrightnessLevelOn = 0b00001000;
273 const T_TMII mTmiInterface;
275 const uint8_t*
const mRemapArray;
276 uint8_t mPatterns[T_DIGITS];