25 #ifndef ACE_SEGMENT_SCANNING_DISPLAY_H
26 #define ACE_SEGMENT_SCANNING_DISPLAY_H
30 #include <AceCommon.h>
31 #include "LedDisplay.h"
33 class ScanningDisplayTest_displayCurrentField;
35 namespace ace_segment {
74 template <
typename HW,
typename LM, u
int8_t DIGITS, u
int8_t SUBFIELDS = 1>
92 uint8_t framesPerSecond
96 mLedMatrix(ledMatrix),
97 mFramesPerSecond(framesPerSecond)
109 mLastRenderFieldMicros = mHardware.micros();
113 mPrevDigit = DIGITS - 1;
114 mCurrentSubField = 0;
124 mPreparedToSleep =
false;
146 if (pos >= DIGITS)
return;
147 mPatterns[pos] = pattern;
151 uint8_t len)
override {
152 for (uint8_t i = 0; i < len; i++) {
153 if (pos >= DIGITS)
break;
154 mPatterns[pos++] = patterns[i];
159 uint8_t len)
override {
160 for (uint8_t i = 0; i < len; i++) {
161 if (pos >= DIGITS)
break;
162 mPatterns[pos++] = pgm_read_byte(patterns + i);
188 if (pos >= DIGITS)
return;
189 mBrightnesses[pos] = (brightness >= SUBFIELDS) ? SUBFIELDS : brightness;
194 if (pos >= DIGITS)
return;
195 uint8_t pattern = mPatterns[pos];
201 mPatterns[pos] = pattern;
212 for (uint8_t i = 0; i < DIGITS; i++) {
219 for (uint8_t i = 0; i < DIGITS; i++) {
233 uint16_t now = mHardware.micros();
234 uint16_t elapsedMicros = now - mLastRenderFieldMicros;
235 if (elapsedMicros >= mMicrosPerField) {
237 mLastRenderFieldMicros = now;
254 if (mPreparedToSleep)
return;
257 displayCurrentFieldModulated();
259 displayCurrentFieldPlain();
268 mPreparedToSleep =
true;
276 friend class ::ScanningDisplayTest_displayCurrentField;
283 void displayCurrentFieldPlain() {
284 const uint8_t pattern = mPatterns[mCurrentDigit];
285 mLedMatrix.draw(mCurrentDigit, pattern);
286 mPrevDigit = mCurrentDigit;
287 ace_common::incrementMod(mCurrentDigit, DIGITS);
291 void displayCurrentFieldModulated() {
293 const uint8_t brightness = mBrightnesses[mCurrentDigit];
305 const uint8_t pattern = (mCurrentSubField < brightness)
306 ? mPatterns[mCurrentDigit]
309 if (pattern != mPattern || mCurrentDigit != mPrevDigit) {
310 mLedMatrix.draw(mCurrentDigit, pattern);
315 mPrevDigit = mCurrentDigit;
316 if (mCurrentSubField >= SUBFIELDS) {
317 ace_common::incrementMod(mCurrentDigit, DIGITS);
318 mCurrentSubField = 0;
329 const LM& mLedMatrix;
332 uint8_t mPatterns[DIGITS];
335 uint8_t mBrightnesses[DIGITS];
343 uint16_t mMicrosPerField;
346 uint16_t mLastRenderFieldMicros;
349 uint8_t
const mFramesPerSecond;
361 uint8_t mCurrentDigit;
376 uint8_t mCurrentSubField;
390 volatile bool mPreparedToSleep;