Forked LEDMatrix and added horizontal scrolling
Fork of LEDMatrix by
Diff: LEDMatrix.cpp
- Revision:
- 3:1e06e89bc0c9
- Parent:
- 2:cd2da920cf98
- Child:
- 4:40d4afefcd74
--- a/LEDMatrix.cpp Thu Jan 14 12:57:59 2016 +0000 +++ b/LEDMatrix.cpp Thu Jan 14 16:52:04 2016 +0000 @@ -53,12 +53,18 @@ for (int i = 0; i < LED_MATRIX_MAX_LINES; i++) { _lineScrollInc[i] = 0; + _lineAlert[i] = false; + _lineInvert[i] = false; } _isBusy = false; _charSeparation = 1; + _flashCounter = 0; + _flashRate = 8; + _flashState = false; } -void LEDMatrix::begin(uint8_t *_pDisplayBuf, uint16_t width, uint16_t height, uint16_t dispBufWidth, uint16_t numLines, int charSeparation) +void LEDMatrix::begin(uint8_t *_pDisplayBuf, uint16_t width, uint16_t height, uint16_t dispBufWidth, + uint16_t numLines, int charSeparation, int flashRate) { ASSERT(0 == (width % LED_MATRIX_LEDS_HORIZONTALLY)); ASSERT(0 == (scroll_width % LED_MATRIX_LEDS_HORIZONTALLY)); @@ -70,6 +76,7 @@ this->dispBufWidth = dispBufWidth; this->numLines = numLines; this->_charSeparation = charSeparation; + this->_flashRate = flashRate; if (numLines > LED_MATRIX_MAX_LINES) this->numLines = LED_MATRIX_MAX_LINES; for (int i = 0; i < LED_MATRIX_LEDS_VERTICALLY; i++) @@ -167,6 +174,17 @@ // Calculate buffer position within this unit uint8_t *pBuf = pBufBase + rowIdx * (dispBufWidth / 8) * LED_MATRIX_LEDS_VERTICALLY; + // Work out which display line we're in + uint8_t dispMask = mask; + bool invertRow = false; + int rowsInLine = (height/numLines); + int dispLine = scanRowIdx / rowsInLine; + if (dispLine < numLines) + { + if (_lineInvert[dispLine]) + dispMask = ~dispMask; + } + // Work along the display row sending out data as we go // Noting that the first data we send out will be shunted to the end of the row int hScrollPos = _hScrollPos[scanRowIdx]; @@ -182,7 +200,7 @@ uint8_t pixels = ((*pByte1) << bitOffset) + (((*pByte2) >> (8 - bitOffset)) % 256); // Reverse the bits so they come out in the right order - pixels = reverseBits(pixels) ^ mask; // reverse: mask = 0xff, normal: mask =0x00 + pixels = reverseBits(pixels) ^ dispMask; // reverse: mask = 0xff, normal: mask =0x00 for (uint8_t bit = 0; bit < 8; bit++) { clk = 0; @@ -319,27 +337,54 @@ { _hScrollPos[i] = 0; _hScrollWidth[i] = scrollWidth; - _lineScrollInc[i] = scrollInc; } -// int rowsInALine = height / numLines; -// for (int i = 0; i < rowsInALine; i++) -// _hScrollWidth[lineIdx*rowsInALine + i] = scrollWidth; + // Store the scroll increment + int startLine = 0; + int linesToProcess = numLines; + if (lineIdx != -1) + { + if ((lineIdx < 0) || (lineIdx >= numLines)) + return; + startLine = lineIdx; + linesToProcess = 1; + } + for (int i = 0; i < linesToProcess; i++) + _lineScrollInc[i+startLine] = scrollInc; } -//void LEDMatrix::setLineScrollInc(int lineIdx, int scrollInc) -//{ -// if ((lineIdx < 0) || (lineIdx >= numLines)) -// return; -// int rowsInALine = height / numLines; -// for (int i = 0; i < rowsInALine; i++) -// _lineScrollInc[lineIdx*rowsInALine + i] = scrollInc; -//} - +void LEDMatrix::setAlert(int lineIdx, bool alertOn) +{ + // Store the alert status + int startLine = 0; + int linesToProcess = numLines; + if (lineIdx != -1) + { + if ((lineIdx < 0) || (lineIdx >= numLines)) + return; + startLine = lineIdx; + linesToProcess = 1; + } + for (int i = 0; i < linesToProcess; i++) + _lineAlert[i+startLine] = alertOn; +} + void LEDMatrix::serviceEffects() { - for (int i = 0; i < LED_MATRIX_MAX_LINES; i++) + // Scroll / flash logic + int rowsInLine = (height / numLines); + for (int i = 0; i < numLines; i++) { - _hScrollPos[i] += _lineScrollInc[i]; + for (int j = 0; j < rowsInLine; j++) + _hScrollPos[i*rowsInLine+j] += _lineScrollInc[i]; + _lineInvert[i] = _lineAlert[i] ? _flashState : false; + } + + // Update flash state + _flashCounter++; + if (_flashCounter >= _flashRate) + { + _flashCounter = 0; + _flashState = !_flashState; } }