void MD_PZone::effectClose(bool bLightBar, bool bIn) // Dissolve the current message in/out { if (bIn) { switch (_fsmState) { case INITIALISE: case GET_FIRST_CHAR: case GET_NEXT_CHAR: PRINT_STATE("I CLOSE"); _nextPos = 0; zoneClear(); if (bLightBar) { _MX->setColumn(_limitLeft, LIGHT_BAR); _MX->setColumn(_limitRight,LIGHT_BAR); } _fsmState = PUT_CHAR; // fall through case PUT_CHAR: PRINT_STATE("I CLOSE"); FSMPRINT(" - offset ", _nextPos); zoneClear(); commonPrint(); { const int16_t halfWidth = (_limitLeft - _limitRight)/2; if (_nextPos > halfWidth) { _fsmState = PAUSE; } else { for (int16_t i = _limitRight + _nextPos + 1; i < _limitLeft - _nextPos; i++) _MX->setColumn(i, EMPTY_BAR); _nextPos++; if (bLightBar && (_nextPos <= halfWidth)) { _MX->setColumn(_limitLeft - _nextPos, LIGHT_BAR); _MX->setColumn(_limitRight + _nextPos, LIGHT_BAR); } } } break; default: PRINT_STATE("I CLOSE"); _fsmState = PAUSE; } } else // exiting { switch (_fsmState) { case PAUSE: case GET_FIRST_CHAR: case GET_NEXT_CHAR: PRINT_STATE("O CLOSE"); FSMPRINT(" - limits R:", _limitRight); FSMPRINT(" L:", _limitLeft); _nextPos = (_limitLeft-_limitRight)/2; FSMPRINT(" O:", _nextPos); zoneClear(); commonPrint(); if (bLightBar) { _MX->setColumn(_limitLeft - _nextPos, LIGHT_BAR); _MX->setColumn(_limitRight + _nextPos, LIGHT_BAR); } _fsmState = PUT_CHAR; break; case PUT_CHAR: PRINT_STATE("O CLOSE"); FSMPRINT(" - offset ", _nextPos); if (_nextPos < 0) { _fsmState = END; } else { _MX->setColumn(_limitLeft - _nextPos, EMPTY_BAR); _MX->setColumn(_limitRight + _nextPos, EMPTY_BAR); _nextPos--; if (bLightBar && (_nextPos >= 0)) { _MX->setColumn(_limitLeft - _nextPos, LIGHT_BAR); _MX->setColumn(_limitRight + _nextPos, LIGHT_BAR); } } break; default: PRINT_STATE("O CLOSE"); _fsmState = END; } } }
void MD_PZone::effectSlice(bool bIn) { if (bIn) { switch(_fsmState) { case INITIALISE: case GET_FIRST_CHAR: PRINT_STATE("I SLICE"); if ((_charCols = getFirstChar()) == 0) { _fsmState = END; break; } zoneClear(); _countCols = 0; _nextPos = ZONE_START_COL(_zoneStart); _endPos = _limitLeft; _fsmState = PUT_CHAR; break; case GET_NEXT_CHAR: // Load the next character from the font table PRINT_STATE("I SLICE"); // have we reached the end of the characters string? if ((_charCols = getNextChar()) == 0) { _fsmState = PAUSE; break; } _countCols = 0; _fsmState = PUT_CHAR; // !! fall through to next state to start displaying case PUT_CHAR: // display the next part of the character PRINT_STATE("I SLICE"); FSMPRINT(" - Next ", _endPos); FSMPRINT(", anim ", _nextPos); if (_cBuf[_countCols] == 0) { _nextPos = _endPos; // pretend we just animated it! } else { // clear the column and animate the next one if (_nextPos != _endPos) _MX->setColumn(_nextPos, EMPTY_BAR); _nextPos++; _MX->setColumn(_nextPos, DATA_BAR(_cBuf[_countCols])); } // set up for the next time if (_nextPos == _endPos) { _nextPos = ZONE_START_COL(_zoneStart); _countCols++; _endPos--; } if (_countCols == _charCols) _fsmState = GET_NEXT_CHAR; break; default: _fsmState = PAUSE; } } else // exiting { switch(_fsmState) { case PAUSE: PRINT_STATE("O SLICE"); _nextPos = _endPos = _limitLeft; _fsmState = PUT_CHAR; // fall through case GET_FIRST_CHAR: case GET_NEXT_CHAR: case PUT_CHAR: PRINT_STATE("O SLICE"); FSMPRINT(" - Next ", _endPos); FSMPRINT(", anim ", _nextPos); while(_MX->getColumn(_nextPos) == EMPTY_BAR && _endPos >= _limitRight) _nextPos = _endPos--; // pretend we just animated it! if (_endPos <= _limitRight) _fsmState = END; //reached the end else { // Move the column over to the left and blank out previous position if (_nextPos < ZONE_END_COL(_zoneEnd)) _MX->setColumn(_nextPos+1, _MX->getColumn(_nextPos)); _MX->setColumn(_nextPos, EMPTY_BAR); _nextPos++; // set up for the next time if (_nextPos == ZONE_END_COL(_zoneEnd)+1) _nextPos = _endPos--; } break; default: _fsmState = END; } } }