void MD_PZone::effectDissolve(bool bIn)
// Dissolve the current message in/out
{
	switch (_fsmState)
	{
	case INITIALISE:	// bIn = true
	case PAUSE:			// bIn = false
	case GET_FIRST_CHAR:	// first stage dissolve
		PRINT_STATE("IO DISS");
		for (uint16_t i=ZONE_START_COL(_zoneStart); i<=ZONE_END_COL(_zoneEnd); i++)
		{
			uint8_t	col = DATA_BAR(_MX->getColumn(i));
				
			col |= (i&1 ? 0x55 : 0xaa);	// checkerboard pattern
			_MX->setColumn(i, DATA_BAR(col));
		}
		_fsmState = GET_NEXT_CHAR;
		break;

	case GET_NEXT_CHAR:		// second stage dissolve
		PRINT_STATE("IO DISS");
		zoneClear();
		if (bIn) commonPrint();
		for (uint16_t i=ZONE_START_COL(_zoneStart); i<=ZONE_END_COL(_zoneEnd); i++)
		{
			uint8_t	col = DATA_BAR(_MX->getColumn(i));
				
			col |= (i&1 ? 0xaa : 0x55);	// alternate checkerboard pattern
			_MX->setColumn(i, DATA_BAR(col));
		}
		_fsmState = PUT_CHAR;
		break;

	case PUT_CHAR:
		PRINT_STATE("IO DISS");
		zoneClear();
		if (bIn) commonPrint();
		_fsmState = (bIn ? PAUSE : END);
		break;

	default:
		PRINT_STATE("IO DISS");
		_fsmState = (bIn ? PAUSE : END);
	}
}
void MD_PZone::effectPrint(bool bIn)
// Just print the message in the justification selected
{
	if (bIn)	// incoming
	{
		commonPrint();
		_fsmState = PAUSE;
	}
	else	//exiting
	{
		zoneClear();
		_fsmState = END;
	}
}
void MD_PZone::effectVScroll(bool bUp, bool bIn)
// Scroll the display horizontally up of down, depending on the selected effect
{
	if (bIn)	// incoming
	{
		switch (_fsmState)
		{
		case INITIALISE:
			PRINT_STATE("I VSCROLL");
			_nextPos = 0;
			_MX->control(_zoneStart, _zoneEnd, MD_MAX72XX::WRAPAROUND, MD_MAX72XX::OFF);
			_fsmState = PUT_CHAR;
			// fall through to next state

		case GET_FIRST_CHAR:
		case GET_NEXT_CHAR:
		case PUT_CHAR:
		case PAUSE:
			PRINT_STATE("I VSCROLL");

			zoneClear();
			commonPrint();

			for (uint8_t i = _nextPos; i < 7; i++)
				// scroll the whole display so that the message appears to be animated
				// Note: Directions are reversed because we start with the message in the 
				// middle position thru commonPrint() and to see it animated move DOWN we 
				// need to scroll it UP, and vice versa.
				_MX->transform(_zoneStart, _zoneEnd, bUp ? MD_MAX72XX::TSD : MD_MAX72XX::TSU);

			// check if we have finished
			if (_nextPos == 7) _fsmState = PAUSE;

			_nextPos++;
			break;

		default:
			PRINT_STATE("I VSCROLL");
			_fsmState = PAUSE;
		}
	}
	else	// exiting
	{
		switch (_fsmState)
		{
		case PAUSE:
		case INITIALISE:
			PRINT_STATE("O VSCROLL");
			_nextPos = 0;
			_fsmState = PUT_CHAR;
			// fall through to next state

		case GET_FIRST_CHAR:
		case GET_NEXT_CHAR:
		case PUT_CHAR:
			PRINT_STATE("O VSCROLL");

			_MX->transform(_zoneStart, _zoneEnd, bUp ? MD_MAX72XX::TSU : MD_MAX72XX::TSD);

			// check if we have finished
			if (_nextPos == 7) _fsmState = END;

			_nextPos++;
			break;

		default:
			PRINT_STATE("O VSCROLL");
			_fsmState = END;
			break;
		}
	}
}
Exemplo n.º 4
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;
    }
  }
}