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);
146 mTmiInterface.startCondition();
147 mTmiInterface.write(kDataCmdAutoAddress);
148 mTmiInterface.stopCondition();
151 mTmiInterface.startCondition();
152 mTmiInterface.write(kAddressCmd);
153 for (uint8_t chipPos = 0; chipPos < T_DIGITS; ++chipPos) {
158 uint8_t physicalPos = remapLogicalToPhysical(chipPos);
159 uint8_t effectivePattern = mPatterns[physicalPos];
160 mTmiInterface.write(effectivePattern);
162 mTmiInterface.stopCondition();
168 mTmiInterface.startCondition();
169 mTmiInterface.write(kBrightnessCmd
170 | (mDisplayOn ? kBrightnessLevelOn : 0x0)
172 mTmiInterface.stopCondition();
212 if (mFlushStage == T_DIGITS) {
215 mTmiInterface.startCondition();
216 mTmiInterface.write(kBrightnessCmd
217 | (mDisplayOn ? kBrightnessLevelOn : 0x0)
219 mTmiInterface.stopCondition();
227 const uint8_t chipPos = mFlushStage;
228 const uint8_t physicalPos = remapLogicalToPhysical(chipPos);
231 mTmiInterface.startCondition();
232 mTmiInterface.write(kDataCmdFixedAddress);
233 mTmiInterface.stopCondition();
235 mTmiInterface.startCondition();
236 mTmiInterface.write(kAddressCmd | chipPos);
237 mTmiInterface.write(mPatterns[physicalPos]);
238 mTmiInterface.stopCondition();
244 ace_common::incrementMod(mFlushStage, (uint8_t) (T_DIGITS + 1));
266 mTmiInterface.startCondition();
267 mTmiInterface.write(kDataCmdReadKeys);
268 uint8_t data = mTmiInterface.read();
269 mTmiInterface.stopCondition();
275 uint8_t remapLogicalToPhysical(uint8_t pos)
const {
276 return mRemapArray ? mRemapArray[pos] : pos;
281 friend class ::Tm1637ModuleTest_flushIncremental;
282 friend class ::Tm1637ModuleTest_flush;
285 static uint8_t
const kDataCmdWriteDisplay = 0b01000000;
286 static uint8_t
const kDataCmdReadKeys = 0b01000010;
287 static uint8_t
const kDataCmdAutoAddress = 0b01000000;
288 static uint8_t
const kDataCmdFixedAddress = 0b01000100;
289 static uint8_t
const kAddressCmd = 0b11000000;
290 static uint8_t
const kBrightnessCmd = 0b10000000;
291 static uint8_t
const kBrightnessLevelOn = 0b00001000;
298 const T_TMII mTmiInterface;
300 const uint8_t*
const mRemapArray;
301 uint8_t mPatterns[T_DIGITS];