Skip to content

Commit

Permalink
Added TinyPico display shield example
Browse files Browse the repository at this point in the history
  • Loading branch information
Laurence Bank authored and Laurence Bank committed Jul 7, 2021
1 parent cb62d16 commit fe83bbb
Show file tree
Hide file tree
Showing 3 changed files with 27,816 additions and 1 deletion.
137 changes: 137 additions & 0 deletions examples/TinyPico_Display_GIF/TinyPico_Display_GIF.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
//
// Example sketch to play animated GIF images on
// The TinyPico + IPS Display Shield
//
// written by Larry Bank ([email protected])
//
#include <bb_spi_lcd.h>
#include <AnimatedGIF.h>
#include "homer_small_car.h"

// These pin numbers are for the TinyPico board
#ifdef ARDUINO_TINYPICO
#define LED_PIN 14
#define CS_PIN 5
#define DC_PIN 15
#define MOSI_PIN 23
#define SCK_PIN 18
#define MISO_PIN -1
#else
// For the TinyS2, use these pins
#define LED_PIN 5
#define CS_PIN 14
#define DC_PIN 6
#define MOSI_PIN 35
#define MISO_PIN 36
#define SCK_PIN 37
#endif
#define RESET_PIN -1

// ST7735 width
#define DISPLAY_WIDTH 160
AnimatedGIF gif;
SPILCD lcd;

// Draw a line of image directly on the LCD
void GIFDraw(GIFDRAW *pDraw)
{
uint8_t *s;
uint16_t *d, *usPalette, usTemp[320];
int x, y, iWidth;

usPalette = pDraw->pPalette;
y = pDraw->iY + pDraw->y; // current line
iWidth = pDraw->iWidth;
if (iWidth > DISPLAY_WIDTH)
iWidth = DISPLAY_WIDTH;
s = pDraw->pPixels;
if (pDraw->ucDisposalMethod == 2) // restore to background color
{
for (x=0; x<iWidth; x++)
{
if (s[x] == pDraw->ucTransparent)
s[x] = pDraw->ucBackground;
}
pDraw->ucHasTransparency = 0;
}
// Apply the new pixels to the main image
if (pDraw->ucHasTransparency) // if transparency used
{
uint8_t *pEnd, c, ucTransparent = pDraw->ucTransparent;
int x, iCount;
pEnd = s + iWidth;
x = 0;
iCount = 0; // count non-transparent pixels
while(x < iWidth)
{
c = ucTransparent-1;
d = usTemp;
while (c != ucTransparent && s < pEnd)
{
c = *s++;
if (c == ucTransparent) // done, stop
{
s--; // back up to treat it like transparent
}
else // opaque
{
*d++ = usPalette[c];
iCount++;
}
} // while looking for opaque pixels
if (iCount) // any opaque pixels?
{
spilcdSetPosition(&lcd, pDraw->iX+x, y, iCount, 1, DRAW_TO_LCD);
spilcdWriteDataBlock(&lcd, (uint8_t *)usTemp, iCount*2, DRAW_TO_LCD);
x += iCount;
iCount = 0;
}
// no, look for a run of transparent pixels
c = ucTransparent;
while (c == ucTransparent && s < pEnd)
{
c = *s++;
if (c == ucTransparent)
iCount++;
else
s--;
}
if (iCount)
{
x += iCount; // skip these
iCount = 0;
}
}
}
else
{
s = pDraw->pPixels;
// Translate the 8-bit pixels through the RGB565 palette (already byte reversed)
for (x=0; x<iWidth; x++)
usTemp[x] = usPalette[*s++];
spilcdSetPosition(&lcd, pDraw->iX, y, iWidth, 1, DRAW_TO_LCD);
spilcdWriteDataBlock(&lcd, (uint8_t *)usTemp, iWidth*2, DRAW_TO_LCD);
}
} /* GIFDraw() */

void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("Starting...");
spilcdInit(&lcd, LCD_ST7735S_B, FLAGS_INVERT | FLAGS_SWAP_RB, 20000000, CS_PIN, DC_PIN, RESET_PIN, LED_PIN, MISO_PIN, MOSI_PIN, SCK_PIN);
spilcdSetOrientation(&lcd, LCD_ORIENTATION_90);
spilcdFill(&lcd, 0, DRAW_TO_LCD);

gif.begin(BIG_ENDIAN_PIXELS);
}

void loop() {
if (gif.open((uint8_t *)homer_car_small, sizeof(homer_car_small), GIFDraw))
{
Serial.printf("Successfully opened GIF; Canvas size = %d x %d\n", gif.getCanvasWidth(), gif.getCanvasHeight());
while (gif.playFrame(true, NULL))
{
}
gif.close();
}
}
Loading

0 comments on commit fe83bbb

Please sign in to comment.