25 #ifndef ACE_SEGMENT_SCANNING_MODULE_H
26 #define ACE_SEGMENT_SCANNING_MODULE_H
30 #include <AceCommon.h>
31 #include "../hw/ClockInterface.h"
32 #include "../LedModule.h"
34 class ScanningModuleTest_isAnyDigitDirty;
35 class ScanningModuleTest_isBrightnessDirty;
37 namespace ace_segment {
80 uint8_t T_SUBFIELDS = 1,
81 typename T_CI = ClockInterface>
96 const T_LM& ledMatrix,
97 uint8_t framesPerSecond
100 mLedMatrix(ledMatrix),
101 mFramesPerSecond(framesPerSecond)
112 memset(mPatterns, 0, T_DIGITS);
116 mLastRenderFieldMicros = T_CI::micros();
120 mPrevDigit = T_DIGITS - 1;
121 mCurrentSubField = 0;
125 mIsDigitBrightnessDirty =
false;
127 if (T_SUBFIELDS > 1) {
167 if (pos >= T_DIGITS)
return;
168 mBrightnesses[pos] = (brightness >= T_SUBFIELDS)
169 ? T_SUBFIELDS : brightness;
170 mIsDigitBrightnessDirty =
true;
203 uint16_t now = T_CI::micros();
204 uint16_t elapsedMicros = now - mLastRenderFieldMicros;
205 if (elapsedMicros >= mMicrosPerField) {
207 mLastRenderFieldMicros = now;
225 if (T_SUBFIELDS > 1) {
226 displayCurrentFieldModulated();
228 displayCurrentFieldPlain();
233 friend class ::ScanningModuleTest_isAnyDigitDirty;
234 friend class ::ScanningModuleTest_isBrightnessDirty;
241 void displayCurrentFieldPlain() {
242 const uint8_t pattern = mPatterns[mCurrentDigit];
243 mLedMatrix.draw(mCurrentDigit, pattern);
244 mPrevDigit = mCurrentDigit;
245 ace_common::incrementMod(mCurrentDigit, T_DIGITS);
249 void displayCurrentFieldModulated() {
251 const uint8_t brightness = mBrightnesses[mCurrentDigit];
263 const uint8_t pattern = (mCurrentSubField < brightness)
264 ? mPatterns[mCurrentDigit]
267 if (pattern != mPattern || mCurrentDigit != mPrevDigit) {
268 mLedMatrix.draw(mCurrentDigit, pattern);
273 mPrevDigit = mCurrentDigit;
274 if (mCurrentSubField >= T_SUBFIELDS) {
275 ace_common::incrementMod(mCurrentDigit, T_DIGITS);
276 mCurrentSubField = 0;
284 void updateBrightness() {
286 for (uint8_t i = 0; i < T_DIGITS; i++) {
300 const T_LM& mLedMatrix;
303 uint8_t mPatterns[T_DIGITS];
306 uint8_t mBrightnesses[T_DIGITS];
314 uint16_t mMicrosPerField;
317 uint16_t mLastRenderFieldMicros;
320 uint8_t
const mFramesPerSecond;
328 bool mIsDigitBrightnessDirty;
335 uint8_t mCurrentDigit;
350 uint8_t mCurrentSubField;