25 #ifndef ACE_SEGMENT_SCANNING_MODULE_H
26 #define ACE_SEGMENT_SCANNING_MODULE_H
29 #include <AceCommon.h>
30 #include "../hw/ClockInterface.h"
31 #include "../LedModule.h"
33 class ScanningModuleTest_isAnyDigitDirty;
34 class ScanningModuleTest_isBrightnessDirty;
36 namespace ace_segment {
79 uint8_t T_SUBFIELDS = 1,
80 typename T_CI = ClockInterface>
95 const T_LM& ledMatrix,
96 uint8_t framesPerSecond
99 mLedMatrix(ledMatrix),
100 mFramesPerSecond(framesPerSecond)
114 mLastRenderFieldMicros = T_CI::micros();
118 mPrevDigit = T_DIGITS - 1;
119 mCurrentSubField = 0;
123 mIsDigitBrightnessDirty =
false;
125 if (T_SUBFIELDS > 1) {
165 if (pos >= T_DIGITS)
return;
166 mBrightnesses[pos] = (brightness >= T_SUBFIELDS)
167 ? T_SUBFIELDS : brightness;
168 mIsDigitBrightnessDirty =
true;
201 uint16_t now = T_CI::micros();
202 uint16_t elapsedMicros = now - mLastRenderFieldMicros;
203 if (elapsedMicros >= mMicrosPerField) {
205 mLastRenderFieldMicros = now;
223 if (T_SUBFIELDS > 1) {
224 displayCurrentFieldModulated();
226 displayCurrentFieldPlain();
231 friend class ::ScanningModuleTest_isAnyDigitDirty;
232 friend class ::ScanningModuleTest_isBrightnessDirty;
239 void displayCurrentFieldPlain() {
240 const uint8_t pattern = mPatterns[mCurrentDigit];
241 mLedMatrix.draw(mCurrentDigit, pattern);
242 mPrevDigit = mCurrentDigit;
243 ace_common::incrementMod(mCurrentDigit, T_DIGITS);
247 void displayCurrentFieldModulated() {
249 const uint8_t brightness = mBrightnesses[mCurrentDigit];
261 const uint8_t pattern = (mCurrentSubField < brightness)
262 ? mPatterns[mCurrentDigit]
265 if (pattern != mPattern || mCurrentDigit != mPrevDigit) {
266 mLedMatrix.draw(mCurrentDigit, pattern);
271 mPrevDigit = mCurrentDigit;
272 if (mCurrentSubField >= T_SUBFIELDS) {
273 ace_common::incrementMod(mCurrentDigit, T_DIGITS);
274 mCurrentSubField = 0;
282 void updateBrightness() {
284 for (uint8_t i = 0; i < T_DIGITS; i++) {
298 const T_LM& mLedMatrix;
301 uint8_t mPatterns[T_DIGITS];
304 uint8_t mBrightnesses[T_DIGITS];
312 uint16_t mMicrosPerField;
315 uint16_t mLastRenderFieldMicros;
318 uint8_t
const mFramesPerSecond;
326 bool mIsDigitBrightnessDirty;
333 uint8_t mCurrentDigit;
348 uint8_t mCurrentSubField;