kopia lustrzana https://github.com/Aircoookie/WLED
88 wiersze
2.0 KiB
C++
88 wiersze
2.0 KiB
C++
#include "wled.h"
|
|
#include <PNGdec.h>
|
|
|
|
void * openFile(const char *filename, int32_t *size) {
|
|
f = WLED_FS.open(filename);
|
|
*size = f.size();
|
|
return &f;
|
|
}
|
|
|
|
void closeFile(void *handle) {
|
|
if (f) f.close();
|
|
}
|
|
|
|
int32_t readFile(PNGFILE *pFile, uint8_t *pBuf, int32_t iLen)
|
|
{
|
|
int32_t iBytesRead;
|
|
iBytesRead = iLen;
|
|
File *f = static_cast<File *>(pFile->fHandle);
|
|
// Note: If you read a file all the way to the last byte, seek() stops working
|
|
if ((pFile->iSize - pFile->iPos) < iLen)
|
|
iBytesRead = pFile->iSize - pFile->iPos - 1; // <-- ugly work-around
|
|
if (iBytesRead <= 0)
|
|
return 0;
|
|
iBytesRead = (int32_t)f->read(pBuf, iBytesRead);
|
|
pFile->iPos = f->position();
|
|
return iBytesRead;
|
|
}
|
|
|
|
int32_t seekFile(PNGFILE *pFile, int32_t iPosition)
|
|
{
|
|
int i = micros();
|
|
File *f = static_cast<File *>(pFile->fHandle);
|
|
f->seek(iPosition);
|
|
pFile->iPos = (int32_t)f->position();
|
|
i = micros() - i;
|
|
return pFile->iPos;
|
|
}
|
|
|
|
void draw(PNGDRAW *pDraw) {
|
|
uint16_t usPixels[SEGLEN];
|
|
png.getLineAsRGB565(pDraw, usPixels, PNG_RGB565_LITTLE_ENDIAN, 0xffffffff);
|
|
for(int x=0; x < SEGLEN; x++) {
|
|
uint16_t color = usPixels[x];
|
|
byte r = ((color >> 11) & 0x1F);
|
|
byte g = ((color >> 5) & 0x3F);
|
|
byte b = (color & 0x1F);
|
|
SEGMENT.setPixelColor(x, RGBW32(r,g,b,0));
|
|
}
|
|
strip.show();
|
|
}
|
|
|
|
uint16_t mode_pov_image(void) {
|
|
const char * filepath = SEGMENT.name;
|
|
int rc = png.open(filepath, openFile, closeFile, readFile, seekFile, draw);
|
|
if (rc == PNG_SUCCESS) {
|
|
rc = png.decode(NULL, 0);
|
|
png.close();
|
|
return FRAMETIME;
|
|
}
|
|
return FRAMETIME;
|
|
}
|
|
|
|
class PovDisplayUsermod : public Usermod
|
|
{
|
|
public:
|
|
static const char _data_FX_MODE_POV_IMAGE[] PROGMEM = "POV Image@!;;;1";
|
|
|
|
PNG png;
|
|
File f;
|
|
|
|
void setup() {
|
|
strip.addEffect(255, &mode_pov_image, _data_FX_MODE_POV_IMAGE);
|
|
}
|
|
|
|
void loop() {
|
|
}
|
|
|
|
uint16_t getId()
|
|
{
|
|
return USERMOD_ID_POV_DISPLAY;
|
|
}
|
|
|
|
void connected() {}
|
|
};
|
|
|
|
|
|
static PovDisplayUsermod pov_display;
|
|
REGISTER_USERMOD(pov_display); |