27 #include "StyledPattern.h" 35 uint16_t nowMicros = mHardware->
micros();
46 mLastRenderFieldMicros = nowMicros;
52 memset(mActiveStyles, 0,
kNumStyles *
sizeof(uint8_t));
53 mActiveStyles[0] = mNumDigits;
57 if (digit >= mNumDigits)
return;
60 if (style > 0 && mStylers[style] ==
nullptr)
return;
63 styledPattern.pattern = pattern;
65 mActiveStyles[styledPattern.style]--;
66 mActiveStyles[style]++;
67 styledPattern.style = style;
71 if (digit >= mNumDigits)
return;
73 styledPattern.pattern = pattern;
77 if (digit >= mNumDigits)
return;
80 if (style > 0 && mStylers[style] ==
nullptr)
return;
84 mActiveStyles[styledPattern.style]--;
85 mActiveStyles[style]++;
86 styledPattern.style = style;
90 if (digit >= mNumDigits)
return;
93 styledPattern.setDecimalPoint();
95 styledPattern.clearDecimalPoint();
99 for (uint8_t i = 0; i < mNumDigits; i++) {
100 mStyledPatterns[i].pattern = 0;
105 uint16_t now = mHardware->
micros();
106 uint16_t elapsedMicros = now - mLastRenderFieldMicros;
107 if (elapsedMicros >= mMicrosPerField) {
109 mLastRenderFieldMicros = now;
117 uint16_t now = mHardware->
micros();
118 if (mCurrentField == 0) {
124 uint16_t duration = mHardware->
micros() - now;
125 mStats.update(duration);
128 void Renderer::updateFrame() {
130 renderStyledPatterns();
131 if (mStatsResetInterval > 0 &&
132 mStats.
getCount() >= mStatsResetInterval) {
137 void Renderer::updateStylers() {
140 for (uint8_t style = 1; style <
kNumStyles; style++) {
141 if (mActiveStyles[style] > 0) {
142 Styler* styler = mStylers[style];
151 if (styler ==
nullptr)
return false;
153 return mIsBrightnessEnabled;
163 void Renderer::renderStyledPatterns() {
164 for (uint8_t digit = 0; digit < mNumDigits; digit++) {
167 uint8_t pattern = styledPattern.pattern;
168 uint8_t brightness = mBrightness;
170 uint8_t style = styledPattern.style;
172 Styler* styler = mStylers[style];
174 styler->
apply(&pattern, &brightness);
177 mDriver->
setPattern(digit, pattern, brightness);
bool renderFieldWhenReady()
Display one field of a frame when the time is right.
TimingStats getTimingStats()
Return stats.
virtual void displayCurrentField()=0
Display the current field of the frame.
static const uint8_t kNumStyles
Maximum number of styles.
bool isStylerSupported(Styler *styler)
Return true if the given Styler is supported by the current Driver.
void writePatternAt(uint8_t digit, uint8_t pattern, uint8_t style)
Write the pattern and style for a given digit.
void renderField()
Render the current field immediately.
void writeStyleAt(uint8_t digit, uint8_t style)
Write the style for a given digit, leaving pattern unchanged.
virtual unsigned long micros()
Get the current micros.
virtual void calcForFrame()=0
Called once per frame to update the internal variables of the object.
virtual void configure()
Configure the driver with the parameters given by in the constructor.
virtual bool isBrightnessSupported()=0
Returns true if the driver supports brightness.
uint16_t getCount() const
Number of times update() was called since last reset.
void clear()
Clear all digits, preserving the styles at each digit.
uint16_t getFieldsPerSecond()
Return the fields per second.
void writeDecimalPointAt(uint8_t digit, bool state=true)
Write the decimal point for the digit.
void setPattern(uint8_t digit, SegmentPatternType pattern, uint8_t brightness=DimmablePattern::kOn)
Set the pattern for a given digit.
virtual bool requiresBrightness()=0
Requires driver support for brightness control if true.
virtual void apply(uint8_t *pattern, uint8_t *brightness)=0
Changes updates the brightness for current frame.
Data structure that keeps track of the state of each digit (its segment bit pattern and its style)...
Interface for classes which apply a style to the given bit pattern and brightness.
static void incrementMod(T &i, T m)
Increment i modulo m, avoiding expensive % operator on some 8-bit processors like AVR...
virtual uint16_t getFieldsPerFrame()=0
Return number of fields per frame.