24 #include <MD_Parola.h>
25 #include <MD_Parola_lib.h>
26 #include <MD_MAX72xx.h>
29 _D(dataPin, clkPin, csPin, numDevices),
30 _fsmState(END), _suspend(false),
36 _D.control(MD_MAX72XX::SHUTDOWN, MD_MAX72XX::OFF);
37 _D.control(MD_MAX72XX::INTENSITY, MAX_INTENSITY/2);
38 _D.control(MD_MAX72XX::UPDATE, MD_MAX72XX::ON);
49 _D.setFont(MD_MAX72XX::SYS_VAR);
81 if (((_fsmState == PAUSE) && (millis() - _lastRunTime < _pauseTime)) ||
82 (millis() - _lastRunTime < _tickTime) ||
88 _lastRunTime = millis();
91 _D.update(MD_MAX72XX::OFF);
99 PRINT_STATE(
"ANIMATE");
103 PRINT_STATE(
"ANIMATE");
105 setInitialConditions();
110 switch (_moveIn ? _effectIn : _effectOut)
112 case PRINT: effectPrint(_moveIn);
break;
113 case SLICE: effectSlice(_moveIn);
break;
114 case WIPE: effectWipe(
false, _moveIn);
break;
115 case WIPE_CURSOR: effectWipe(
true, _moveIn);
break;
116 case OPENING: effectOpen(
false, _moveIn);
break;
118 case CLOSING: effectClose(
false, _moveIn);
break;
120 case BLINDS: effectBlinds(_moveIn);
break;
121 case DISSOLVE: effectDissolve(_moveIn);
break;
123 case SCROLL_DOWN: effectVScroll((_moveIn ? _effectIn : _effectOut), _moveIn);
break;
125 case SCROLL_RIGHT: effectHScroll((_moveIn ? _effectIn : _effectOut), _moveIn);
break;
131 _moveIn = _moveIn && !(_fsmState == PAUSE);
136 TIME_PROFILE(
"\nAnimation time ");
139 _D.update(MD_MAX72XX::ON);
141 TIME_PROFILE(
": Cycle time ");
143 return(_fsmState == END);
149 _fsmState = INITIALISE;
152 void MD_Parola::setInitialConditions(
void)
155 PRINTS(
"\nsetInitialConditions");
161 _limitOverflow = !calcTextLimits(_pText);
164 uint16_t MD_Parola::getTextWidth(
char *p)
170 PRINTS(
"\ngetTextWidth");
174 sum += _D.getChar(*p++, ARRAY_SIZE(_cBuf), _cBuf);
184 bool MD_Parola::calcTextLimits(
char *p)
190 uint16_t displayWidth = _D.getColumnCount();
192 _textLen = getTextWidth(p);
194 PRINTS(
"\ncalcTextLimits");
196 switch (_textAlignment)
199 _limitLeft = displayWidth-1;
200 if (_textLen > displayWidth)
207 _limitRight = _limitLeft - _textLen;
213 if (_textLen > displayWidth)
215 _limitLeft = displayWidth-1;
220 _limitLeft = _limitRight + _textLen;
225 if (_textLen > displayWidth)
227 _limitLeft = displayWidth-1;
233 _limitRight = (displayWidth - _textLen)/2;
234 _limitLeft = _limitRight + _textLen;
239 PRINT(
" L:", _limitLeft);
240 PRINT(
" R:", _limitRight);
246 uint8_t MD_Parola::makeChar(
char c)
251 PRINTX(
"\nmakeChar 0x", c);
253 len = _D.getChar(c, ARRAY_SIZE(_cBuf), _cBuf);
254 for (uint8_t i = 0; i<_charSpacing; i++)
256 if (len < ARRAY_SIZE(_cBuf))
260 PRINT(
", len=", len);
265 uint8_t MD_Parola::reverseBuf(uint8_t *p, uint8_t size)
269 for (uint8_t i=0; i<size/2; i++)
279 #define SFX(s) ((_moveIn && _effectIn == (s)) || (!_moveIn && _effectOut == (s)))
281 void MD_Parola::moveTextPointer(
void)
293 _endOfText = (_pCurChar == _pText);
300 _endOfText = (*_pCurChar ==
'\0');
303 PRINT(
": endOfText ", _endOfText);
306 uint8_t MD_Parola::getFirstChar(
void)
312 PRINTS(
"\ngetFirst");
316 if ((_pCurChar == NULL) || (*_pCurChar ==
'\0'))
323 _pCurChar += strlen(_pText) - 1;
326 len = makeChar(*_pCurChar);
329 reverseBuf(_cBuf, len);
336 uint8_t MD_Parola::getNextChar(
void)
342 PRINTS(
"\ngetNext ");
347 len = makeChar(*_pCurChar);
350 reverseBuf(_cBuf, len);