animated gif

This commit is contained in:
charles 2023-08-31 17:26:23 -04:00
parent 046ab5f73c
commit bfa78086c8
3 changed files with 34 additions and 41 deletions

4
.gitignore vendored
View File

@ -1,2 +1,4 @@
build build
.vscode .vscode
AnimatedGIF.cpp
AnimatedGIF.h

View File

@ -149,8 +149,11 @@ typedef struct gif_image_tag
unsigned short pPalette[384]; // can hold RGB565 or RGB888 - set in begin() unsigned short pPalette[384]; // can hold RGB565 or RGB888 - set in begin()
unsigned short pLocalPalette[384]; // color palettes for GIF images unsigned short pLocalPalette[384]; // color palettes for GIF images
unsigned char ucLZW[LZW_BUF_SIZE]; // holds 6 chunks (6x255) of GIF LZW data packed together unsigned char ucLZW[LZW_BUF_SIZE]; // holds 6 chunks (6x255) of GIF LZW data packed together
// Modified from the original library
// unsigned short usGIFTable[4096]; // unsigned short usGIFTable[4096];
unsigned short *usGIFTable; unsigned short *usGIFTable;
unsigned char ucGIFPixels[8192]; unsigned char ucGIFPixels[8192];
unsigned char bEndOfFrame; unsigned char bEndOfFrame;
unsigned char ucGIFBits, ucBackground, ucTransparent, ucCodeStart, ucMap, bUseLocalPalette; unsigned char ucGIFBits, ucBackground, ucTransparent, ucCodeStart, ucMap, bUseLocalPalette;

View File

@ -19,9 +19,9 @@
#include "images/bb8.h" #include "images/bb8.h"
// Adjust this value based on the number of displays // Adjust this value based on the number of displays
const int NUM_DISPLAYS = 6; const int NUM_DISPLAYS = 1;
// Add more CS pins if you have more displays, each display must have a dedicated pin // Add more CS pins if you have more displays, each display must have a dedicated pin
const int CS_PINS[NUM_DISPLAYS] = {19, 22, 21, 32, 33, 26}; const int CS_PINS[NUM_DISPLAYS] = { 19 };
int currentScreenIndex = 0; int currentScreenIndex = 0;
AnimatedGIF gif_1; AnimatedGIF gif_1;
@ -31,74 +31,62 @@ AnimatedGIF gif_4;
AnimatedGIF gif_5; AnimatedGIF gif_5;
AnimatedGIF gif_6; AnimatedGIF gif_6;
TFT_eSPI tft = TFT_eSPI(); TFT_eSPI tft = TFT_eSPI();
unsigned long lastFrameSpeed = 0; unsigned long lastFrameSpeed = 0;
void setup() void setup() {
{
Serial.begin(115200); Serial.begin(115200);
tft.init(); tft.init();
for (int i = 0; i < NUM_DISPLAYS; i++) for (int i = 0; i < NUM_DISPLAYS; i++) {
{
pinMode(CS_PINS[i], OUTPUT); pinMode(CS_PINS[i], OUTPUT);
digitalWrite(CS_PINS[i], LOW); // select the display digitalWrite(CS_PINS[i], LOW); // select the display
tft.fillScreen(TFT_BLACK); tft.fillScreen(TFT_BLACK);
tft.setRotation(2); // Adjust Rotation of your screen (0-3) tft.setRotation(2); // Adjust Rotation of your screen (0-3)
digitalWrite(CS_PINS[i], HIGH); // Deselect the display digitalWrite(CS_PINS[i], HIGH); // Deselect the display
} }
// openGif(&gif_1, hyperspace, sizeof(hyperspace));
openGif(&gif_1, hyperspace, sizeof(hyperspace)); // openGif(&gif_2, hud_6, sizeof(hud_6));
openGif(&gif_2, hud_6, sizeof(hud_6)); // openGif(&gif_3, nostromo, sizeof(nostromo));
openGif(&gif_3, nostromo, sizeof(nostromo));
openGif(&gif_4, x_wing, sizeof(x_wing)); openGif(&gif_4, x_wing, sizeof(x_wing));
openGif(&gif_5, hud_2, sizeof(hud_2)); // openGif(&gif_5, hud_2, sizeof(hud_2));
openGif(&gif_6, bb8, sizeof(bb8)); // openGif(&gif_6, bb8, sizeof(bb8));
} }
void loop() void loop() {
{ // playGif(&gif_1, 0);
playGif(&gif_1, 0); // playGif(&gif_2, 1);
playGif(&gif_2, 1); // playGif(&gif_3, 2);
playGif(&gif_3, 2); // playGif(&gif_4, 3);
playGif(&gif_4, 3); // playGif(&gif_5, 4);
playGif(&gif_5, 4); playGif(&gif_4, 0);
playGif(&gif_6, 5);
} }
void openGif(AnimatedGIF *gif, const uint8_t *gifImage, int gifSize) void openGif(AnimatedGIF *gif, const uint8_t *gifImage, int gifSize) {
{
gif->begin(BIG_ENDIAN_PIXELS); gif->begin(BIG_ENDIAN_PIXELS);
if (!gif->open((uint8_t *)gifImage, gifSize, GIFDraw)) if (!gif->open((uint8_t *)gifImage, gifSize, GIFDraw)) {
{
Serial.printf("Could not open gif \n"); Serial.printf("Could not open gif \n");
} }
} }
void playGif(AnimatedGIF *gif, int screenIndex) void playGif(AnimatedGIF *gif, int screenIndex) {
{
currentScreenIndex = screenIndex; currentScreenIndex = screenIndex;
int res = gif->playFrame(false, NULL); int res = gif->playFrame(false, NULL);
if (res == 0) if (res == 0) {
{
// If no more frames are available, reset the GIF to the beginning // If no more frames are available, reset the GIF to the beginning
gif->reset(); gif->reset();
gif->playFrame(false, NULL); gif->playFrame(false, NULL);
} }
if (res == -1) if (res == -1) {
{
Serial.printf("Gif Error = %d on screen %d\n", gif->getLastError(), screenIndex); Serial.printf("Gif Error = %d on screen %d\n", gif->getLastError(), screenIndex);
} }
if (screenIndex == 0) if (screenIndex == 0) {
{ if (lastFrameSpeed == 0) {
if (lastFrameSpeed == 0)
{
lastFrameSpeed = millis(); lastFrameSpeed = millis();
} } else {
else
{
Serial.printf("Screen 0 FPS=%f\n", 1000.0f / (millis() - lastFrameSpeed)); Serial.printf("Screen 0 FPS=%f\n", 1000.0f / (millis() - lastFrameSpeed));
lastFrameSpeed = millis(); lastFrameSpeed = millis();
} }