Example #1
0
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;
        }
    }
}