Skip to content
Snippets Groups Projects
Select Git revision
  • d550b880dd36e23491e9cf9d182b39920d7c113c
  • master default protected
2 results

display.cpp

Blame
  • display.cpp 2.91 KiB
    #include <Arduino.h>
    #include "gameoflife.h"
    #include "display.h"
    
    #define COLOR_DEPTH 24                                        // known working: 24, 48 - If the sketch uses type `rgb24` directly, COLOR_DEPTH must be 24
    const uint8_t kMatrixWidth = 64;                              // known working: 32, 64, 96, 128
    const uint8_t kMatrixHeight = 64;                             // known working: 16, 32, 48, 64
    const uint8_t kRefreshDepth = 24;                             // known working: 24, 36, 48
    const uint8_t kDmaBufferRows = 2;                             // known working: 2-4, use 2 to save memory, more to keep from dropping frames and automatically lowering refresh rate
    const uint8_t kPanelType = SMARTMATRIX_HUB75_64ROW_MOD32SCAN; // use SMARTMATRIX_HUB75_16ROW_MOD8SCAN for common 16x32 panels
    const uint8_t kMatrixOptions = (SMARTMATRIX_OPTIONS_NONE);    // see http://docs.pixelmatix.com/SmartMatrix for options
    const uint8_t kBackgroundLayerOptions = (SM_BACKGROUND_OPTIONS_NONE);
    const uint8_t kIndexedLayerOptions = (SM_INDEXED_OPTIONS_NONE);
    
    const int defaultBrightness = (brightnessPercent * 255) / 100;
    
    rgb24 colorWhite = {0xff, 0xff, 0xff};
    rgb24 colorBlack = {0x00, 0x00, 0x00};
    
    SMARTMATRIX_ALLOCATE_BUFFERS(matrix, kMatrixWidth, kMatrixHeight, kRefreshDepth, kDmaBufferRows, kPanelType, kMatrixOptions);
    SMARTMATRIX_ALLOCATE_BACKGROUND_LAYER(backgroundLayer, kMatrixWidth, kMatrixHeight, COLOR_DEPTH, kBackgroundLayerOptions);
    SMARTMATRIX_ALLOCATE_INDEXED_LAYER(indexedLayer, kMatrixWidth, kMatrixHeight, COLOR_DEPTH, kIndexedLayerOptions);
    
    void setupDisplay()
    {
      matrix.addLayer(&backgroundLayer);
      matrix.addLayer(&indexedLayer);
      matrix.begin();
      matrix.setBrightness(defaultBrightness);
      backgroundLayer.setBrightness(255);
      backgroundLayer.enableColorCorrection(true);
    }
    
    void displayLoop()
    {
      if (runGame)
      {
        for (int i = 0; i < SCREEN_HEIGHT; i++)
        {
          for (int j = 0; j < SCREEN_WIDTH; j++)
          {
            backgroundLayer.drawPixel(j, i, g[i][j] ? colorWhite : colorBlack);
          }
        }
        backgroundLayer.swapBuffers();
      }
    }
    
    void showEndScreen(int ticks) {
      showEvolutions(ticks);
    }
    
    void fadeOutGame(int brightness) {
      brightness = lightPowerMap8bit[brightness];
      backgroundLayer.setBrightness(brightness);
      backgroundLayer.swapBuffers();
    }
    
    void showEvolutions(int ticks)
    {
      char msg[15] = "Life has ended";
      char evolutions[17];
      sprintf(evolutions, "Evolutions: %d", ticks);
      indexedLayer.setFont(font3x5);
      indexedLayer.drawString((matrix.getScreenWidth() / 2) - (strlen(msg) * 4) / 2, (matrix.getScreenHeight() / 2) - 2 - 5 , 1, msg);
      indexedLayer.drawString((matrix.getScreenWidth() / 2) - (strlen(evolutions) * 4) / 2, (matrix.getScreenHeight() / 2) + 2, 1, evolutions);
      indexedLayer.swapBuffers();
      indexedLayer.fillScreen(0);
    }