/* MD_Parola - Library for modular scrolling text and Effects See header file for comments Copyright (C) 2013 Marco Colli. All rights reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include /** * \file * \brief Implements opening effect */ void MD_PZone::effectOpen(bool bLightBar, bool bIn) // Open the current message in/out { if (bIn) { switch (_fsmState) { case INITIALISE: case GET_FIRST_CHAR: case GET_NEXT_CHAR: PRINT_STATE("I OPEN"); FSMPRINT(" - limits R:", _limitRight); FSMPRINT(" L:", _limitLeft); _nextPos = 1 + (_limitLeft - _limitRight) / 2; FSMPRINT(" O:", _nextPos); if (bLightBar) { _MX->setColumn(_limitLeft - _nextPos, LIGHT_BAR); _MX->setColumn(_limitRight + _nextPos, LIGHT_BAR); } _fsmState = PUT_CHAR; break; case PUT_CHAR: PRINT_STATE("I OPEN"); FSMPRINT(" - offset ", _nextPos); if (_nextPos < 0) { _fsmState = PAUSE; } else { commonPrint(); for (int16_t i = 0; i < _nextPos; i++) { _MX->setColumn(_limitRight + i, EMPTY_BAR); _MX->setColumn(_limitLeft - i, EMPTY_BAR); } _nextPos--; if (bLightBar && (_nextPos >= 0)) { _MX->setColumn(_limitRight + _nextPos, LIGHT_BAR); _MX->setColumn(_limitLeft - _nextPos, LIGHT_BAR); } } break; default: PRINT_STATE("I OPEN"); _fsmState = PAUSE; } } else // exiting { switch (_fsmState) { case PAUSE: case GET_FIRST_CHAR: case GET_NEXT_CHAR: PRINT_STATE("O OPEN"); zoneClear(); commonPrint(); _nextPos = 0; if (bLightBar) { _MX->setColumn(_limitLeft, LIGHT_BAR); _MX->setColumn(_limitRight,LIGHT_BAR); } _fsmState = PUT_CHAR; // fall through case PUT_CHAR: PRINT_STATE("O OPEN"); FSMPRINT(" - offset ", _nextPos); if (_nextPos > (_limitLeft - _limitRight) / 2) { _fsmState = END; } else { _MX->setColumn(_limitLeft - _nextPos, EMPTY_BAR); _MX->setColumn(_limitRight + _nextPos, EMPTY_BAR); _nextPos++; if (bLightBar && (_nextPos <= (_limitLeft - _limitRight) / 2)) { _MX->setColumn(_limitLeft - _nextPos, LIGHT_BAR); _MX->setColumn(_limitRight + _nextPos,LIGHT_BAR); } } break; default: PRINT_STATE("O OPEN"); _fsmState = END; } } }