mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-28 05:06:32 +00:00
picture buttons part 2
This commit is contained in:
parent
448daed0d1
commit
5d8b10141a
@ -29,9 +29,27 @@ uint8_t red, grn, blu;
|
|||||||
uint16_t b , g, r;
|
uint16_t b , g, r;
|
||||||
|
|
||||||
for (uint32_t cnt=0; cnt<len; cnt++) {
|
for (uint32_t cnt=0; cnt<len; cnt++) {
|
||||||
red = *in++;
|
|
||||||
grn = *in++;
|
|
||||||
blu = *in++;
|
blu = *in++;
|
||||||
|
grn = *in++;
|
||||||
|
red = *in++;
|
||||||
|
|
||||||
|
b = (blu >> 3) & 0x1f;
|
||||||
|
g = ((grn >> 2) & 0x3f) << 5;
|
||||||
|
r = ((red >> 3) & 0x1f) << 11;
|
||||||
|
*out++ = (r | g | b);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void rgb888_to_565i(uint8_t *in, uint16_t *out, uint32_t len) {
|
||||||
|
uint8_t red, grn, blu;
|
||||||
|
uint16_t b , g, r;
|
||||||
|
|
||||||
|
for (uint32_t cnt=0; cnt<len; cnt++) {
|
||||||
|
blu = 255-*in++;
|
||||||
|
grn = 255-*in++;
|
||||||
|
red = 255-*in++;
|
||||||
|
|
||||||
b = (blu >> 3) & 0x1f;
|
b = (blu >> 3) & 0x1f;
|
||||||
g = ((grn >> 2) & 0x3f) << 5;
|
g = ((grn >> 2) & 0x3f) << 5;
|
||||||
r = ((red >> 3) & 0x1f) << 11;
|
r = ((red >> 3) & 0x1f) << 11;
|
||||||
|
@ -503,7 +503,7 @@ void DisplayText(void)
|
|||||||
if (ep) {
|
if (ep) {
|
||||||
*ep=0;
|
*ep=0;
|
||||||
ep++;
|
ep++;
|
||||||
Draw_RGB_Bitmap(cp,disp_xpos,disp_ypos);
|
Draw_RGB_Bitmap(cp,disp_xpos,disp_ypos, false);
|
||||||
cp=ep;
|
cp=ep;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1540,20 +1540,39 @@ void CmndDisplayRows(void)
|
|||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
* optional drivers
|
* optional drivers
|
||||||
\*********************************************************************************************/
|
\*********************************************************************************************/
|
||||||
|
|
||||||
|
#ifdef USE_TOUCH_BUTTONS
|
||||||
|
// very limited path size, so, add .jpg
|
||||||
|
void draw_picture(char *path, uint32_t xp, uint32_t yp, uint32_t xs, uint32_t ys, bool inverted) {
|
||||||
|
char ppath[16];
|
||||||
|
strcpy(ppath, path);
|
||||||
|
uint8_t plen = strlen(path) -1;
|
||||||
|
if (ppath[plen]=='1') {
|
||||||
|
// index mode
|
||||||
|
if (inverted) {
|
||||||
|
ppath[plen] = '2';
|
||||||
|
}
|
||||||
|
inverted = false;
|
||||||
|
}
|
||||||
|
strcat(ppath, ".jpg");
|
||||||
|
Draw_RGB_Bitmap(ppath, xp, yp, inverted);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
#ifdef JPEG_PICTS
|
#ifdef JPEG_PICTS
|
||||||
#include "img_converters.h"
|
#include "img_converters.h"
|
||||||
#include "esp_jpg_decode.h"
|
#include "esp_jpg_decode.h"
|
||||||
bool jpg2rgb888(const uint8_t *src, size_t src_len, uint8_t * out, jpg_scale_t scale);
|
bool jpg2rgb888(const uint8_t *src, size_t src_len, uint8_t * out, jpg_scale_t scale);
|
||||||
char get_jpeg_size(unsigned char* data, unsigned int data_size, unsigned short *width, unsigned short *height);
|
char get_jpeg_size(unsigned char* data, unsigned int data_size, unsigned short *width, unsigned short *height);
|
||||||
void rgb888_to_565(uint8_t *in, uint16_t *out, uint32_t len);
|
|
||||||
#endif // JPEG_PICTS
|
#endif // JPEG_PICTS
|
||||||
#endif // ESP32
|
#endif // ESP32
|
||||||
|
|
||||||
#if defined(USE_SCRIPT_FATFS) && defined(USE_SCRIPT)
|
#if defined(USE_SCRIPT_FATFS) && defined(USE_SCRIPT) && defined(USE_DISPLAY)
|
||||||
extern FS *fsp;
|
extern FS *fsp;
|
||||||
#define XBUFF_LEN 128
|
#define XBUFF_LEN 128
|
||||||
void Draw_RGB_Bitmap(char *file,uint16_t xp, uint16_t yp) {
|
void Draw_RGB_Bitmap(char *file,uint16_t xp, uint16_t yp, bool inverted ) {
|
||||||
if (!renderer) return;
|
if (!renderer) return;
|
||||||
File fp;
|
File fp;
|
||||||
char *ending = strrchr(file,'.');
|
char *ending = strrchr(file,'.');
|
||||||
@ -1602,11 +1621,10 @@ void Draw_RGB_Bitmap(char *file,uint16_t xp, uint16_t yp) {
|
|||||||
// jpeg files on ESP32 with more memory
|
// jpeg files on ESP32 with more memory
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
#ifdef JPEG_PICTS
|
#ifdef JPEG_PICTS
|
||||||
if (psramFound()) {
|
|
||||||
fp=fsp->open(file,FILE_READ);
|
fp=fsp->open(file,FILE_READ);
|
||||||
if (!fp) return;
|
if (!fp) return;
|
||||||
uint32_t size = fp.size();
|
uint32_t size = fp.size();
|
||||||
uint8_t *mem = (uint8_t *)heap_caps_malloc(size+4, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
|
uint8_t *mem = (uint8_t *)special_malloc(size+4);
|
||||||
if (mem) {
|
if (mem) {
|
||||||
uint8_t res=fp.read(mem, size);
|
uint8_t res=fp.read(mem, size);
|
||||||
if (res) {
|
if (res) {
|
||||||
@ -1614,22 +1632,30 @@ void Draw_RGB_Bitmap(char *file,uint16_t xp, uint16_t yp) {
|
|||||||
uint16_t ysize;
|
uint16_t ysize;
|
||||||
if (mem[0]==0xff && mem[1]==0xd8) {
|
if (mem[0]==0xff && mem[1]==0xd8) {
|
||||||
get_jpeg_size(mem, size, &xsize, &ysize);
|
get_jpeg_size(mem, size, &xsize, &ysize);
|
||||||
//Serial.printf(" x,y %d - %d\n",xsize, ysize );
|
//Serial.printf(" x,y,fs %d - %d - %d\n",xsize, ysize, size );
|
||||||
if (xsize && ysize) {
|
if (xsize && ysize) {
|
||||||
uint8_t *out_buf = (uint8_t *)heap_caps_malloc((xsize*ysize*3)+4, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
|
uint8_t *out_buf = (uint8_t *)special_malloc((xsize*ysize*3)+4);
|
||||||
if (out_buf) {
|
if (out_buf) {
|
||||||
|
uint16_t *pixb = (uint16_t *)special_malloc((xsize*2)+4);
|
||||||
|
if (pixb) {
|
||||||
uint8_t *ob=out_buf;
|
uint8_t *ob=out_buf;
|
||||||
jpg2rgb888(mem, size, out_buf, (jpg_scale_t)JPG_SCALE_NONE);
|
if (jpg2rgb888(mem, size, out_buf, (jpg_scale_t)JPG_SCALE_NONE)) {
|
||||||
uint16_t pixels=xsize*ysize/XBUFF_LEN;
|
|
||||||
renderer->setAddrWindow(xp,yp,xp+xsize,yp+ysize);
|
renderer->setAddrWindow(xp,yp,xp+xsize,yp+ysize);
|
||||||
for(int32_t j=0; j<pixels; j++) {
|
for(int32_t j=0; j<ysize; j++) {
|
||||||
uint16_t rbuff[XBUFF_LEN*2];
|
if (inverted==false) {
|
||||||
rgb888_to_565(ob, rbuff, XBUFF_LEN);
|
rgb888_to_565(ob, pixb, xsize);
|
||||||
ob+=XBUFF_LEN*3;
|
} else {
|
||||||
renderer->pushColors(rbuff,XBUFF_LEN,true);
|
rgb888_to_565i(ob, pixb, xsize);
|
||||||
|
}
|
||||||
|
ob+=xsize*3;
|
||||||
|
renderer->pushColors(pixb, xsize, true);
|
||||||
OsWatchLoop();
|
OsWatchLoop();
|
||||||
}
|
}
|
||||||
renderer->setAddrWindow(0,0,0,0);
|
renderer->setAddrWindow(0,0,0,0);
|
||||||
|
}
|
||||||
|
free(out_buf);
|
||||||
|
free(pixb);
|
||||||
|
} else {
|
||||||
free(out_buf);
|
free(out_buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -83,6 +83,7 @@ void EpdInitDriver29(void) {
|
|||||||
|
|
||||||
#ifdef SHOW_SPLASH
|
#ifdef SHOW_SPLASH
|
||||||
// Welcome text
|
// Welcome text
|
||||||
|
delay(100);
|
||||||
renderer->setTextFont(1);
|
renderer->setTextFont(1);
|
||||||
renderer->DrawStringAt(50, 50, "Waveshare E-Paper Display!", COLORED,0);
|
renderer->DrawStringAt(50, 50, "Waveshare E-Paper Display!", COLORED,0);
|
||||||
renderer->Updateframe();
|
renderer->Updateframe();
|
||||||
|
@ -112,14 +112,8 @@ void ST7789_InitDriver(void) {
|
|||||||
#ifdef SHOW_SPLASH
|
#ifdef SHOW_SPLASH
|
||||||
// Welcome text
|
// Welcome text
|
||||||
renderer->setTextColor(ST7789_WHITE,ST7789_BLACK);
|
renderer->setTextColor(ST7789_WHITE,ST7789_BLACK);
|
||||||
int fontSize = 2;
|
|
||||||
renderer->setTextFont(2);
|
renderer->setTextFont(2);
|
||||||
if (Settings.display_width<240) {
|
renderer->DrawStringAt(30, (Settings.display_height-12)/2, "ST7789 TFT!", ST7789_WHITE,0);
|
||||||
fontSize = 1;
|
|
||||||
}
|
|
||||||
renderer->setTextFont(fontSize);
|
|
||||||
int fontHeight = 12 * fontSize;
|
|
||||||
renderer->DrawStringAt(30, (Settings.display_height-fontHeight)/2, "ST7789 TFT!", ST7789_WHITE,0);
|
|
||||||
delay(1000);
|
delay(1000);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -95,9 +95,8 @@ void ILI9341_2_InitDriver()
|
|||||||
// Welcome text
|
// Welcome text
|
||||||
renderer->setTextFont(2);
|
renderer->setTextFont(2);
|
||||||
renderer->setTextColor(ILI9341_2_WHITE, ILI9341_2_BLACK);
|
renderer->setTextColor(ILI9341_2_WHITE, ILI9341_2_BLACK);
|
||||||
renderer->DrawStringAt(20, 140, "ILI9341 TFT!", ILI9341_2_RED,0);
|
renderer->DrawStringAt(30, (Settings.display_height/2)-12, "ILI9341 TFT!", ILI9341_2_WHITE, 0);
|
||||||
delay(1000);
|
delay(1000);
|
||||||
renderer->clearDisplay();
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
color_type = COLOR_COLOR;
|
color_type = COLOR_COLOR;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user