25 #ifndef ACE_SEGMENT_TM1638_MODULE_H
26 #define ACE_SEGMENT_TM1638_MODULE_H
31 #include "../LedModule.h"
33 class Tm1638ModuleTest_flushIncremental;
34 class Tm1638ModuleTest_flush;
36 namespace ace_segment {
42 static const uint16_t kDefaultTm1638DelayMicros = 1;
53 extern const uint8_t kDigitRemapArray8Tm1638[8];
64 template <
typename T_TMII, u
int8_t T_DIGITS>
76 const T_TMII& tmiInterface,
77 const uint8_t* remapArray =
nullptr
80 mTmiInterface(tmiInterface),
81 mRemapArray(remapArray)
95 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();
188 mTmiInterface.beginTransaction();
189 mTmiInterface.write(kDataCmdReadKeys);
195 delayMicroseconds(3);
197 uint8_t byte1 = mTmiInterface.read();
198 uint8_t byte2 = mTmiInterface.read();
199 uint8_t byte3 = mTmiInterface.read();
200 uint8_t byte4 = mTmiInterface.read();
201 mTmiInterface.endTransaction();
203 uint32_t data = ((uint32_t) byte4 << 24)
204 | ((uint32_t) byte3 << 16)
205 | ((uint32_t) byte2 << 8)
212 uint8_t remapLogicalToPhysical(uint8_t pos)
const {
213 return mRemapArray ? mRemapArray[pos] : pos;
218 friend class ::Tm1638ModuleTest_flush;
221 static uint8_t
const kDataCmdWriteDisplay = 0b01000000;
222 static uint8_t
const kDataCmdReadKeys = 0b01000010;
223 static uint8_t
const kDataCmdAutoAddress = 0b01000000;
224 static uint8_t
const kDataCmdFixedAddress = 0b01000100;
225 static uint8_t
const kAddressCmd = 0b11000000;
226 static uint8_t
const kBrightnessCmd = 0b10000000;
227 static uint8_t
const kBrightnessLevelOn = 0b00001000;
234 const T_TMII mTmiInterface;
236 const uint8_t*
const mRemapArray;
237 uint8_t mPatterns[T_DIGITS];