mirror of
https://github.com/fsender/readguy.git
synced 2025-12-13 05:18:11 +08:00
update api for arduino-esp32 3.x
This commit is contained in:
@@ -8,9 +8,43 @@
|
||||
* @author FriendshipEnder (f_ender@163.com), Bilibili: FriendshipEnder
|
||||
* @version 1.0
|
||||
* @date create: 2023-11-01
|
||||
* last modify: 2023-11-06
|
||||
* @brief ReadGuy 图片显示功能演示.
|
||||
* last modify: 2024-12-04
|
||||
*
|
||||
* @note 重要消息: 这是一个实验性功能. 可能你所使用的LGFX库版本较旧而无法通过编译.
|
||||
*
|
||||
* (ESPxxxx系列可无视此行) 对于不支持fs::FS的设备 (如PC) 来说, 请前往 guy_image.h 文件并更改第34行的注释
|
||||
*
|
||||
* 如果你的项目中无法成功编译源码中的setBuffer, 请更改LovyanGFX库的函数!
|
||||
* 位于文件 LovyanGFX/src/lgfx/v1/LGFX_Sprite.hpp
|
||||
* 第155行 void setBuffer 函数:
|
||||
* 添加为如下内容并保存 (不建议修改库里原有的函数, 保证库的兼容性)
|
||||
*
|
||||
``` C++
|
||||
void setBuffer(void* buffer, int32_t w, int32_t h, color_depth_t bpp)
|
||||
{
|
||||
deleteSprite();
|
||||
if (bpp != 0) {
|
||||
_write_conv.setColorDepth(bpp);
|
||||
_read_conv = _write_conv;
|
||||
_panel_sprite.setColorDepth(bpp);
|
||||
}
|
||||
|
||||
_panel_sprite.setBuffer(buffer, w, h, &_write_conv);
|
||||
_img = _panel_sprite.getBuffer();
|
||||
|
||||
_sw = w;
|
||||
_clip_r = w - 1;
|
||||
_xpivot = w >> 1;
|
||||
|
||||
_sh = h;
|
||||
_clip_b = h - 1;
|
||||
_ypivot = h >> 1;
|
||||
}
|
||||
```
|
||||
* 完成后请再次尝试编译
|
||||
* [已经向lovyan03/LovyanGFX发布issue, 等待解决]
|
||||
*
|
||||
* @brief ReadGuy 图片显示功能演示.
|
||||
* - 演示如何将比较大的图片通过多种方法显示到屏幕上.
|
||||
* - 运行的会很缓慢, 因为示例的图片文件比较大.
|
||||
* 1. 在运行过ex01或者ex02的开发板上 编译烧录本程序.
|
||||
@@ -106,37 +140,6 @@
|
||||
* 为了简化程序调用过程并提高调用速度, 此处的像素坐标位置参数为一个整数(而不是两个)
|
||||
* 至于该怎么调用这个函数, 并不是你需要了解的事情.
|
||||
*
|
||||
* @note 重要消息: 这是一个实验性功能. 可能你所使用的LGFX库版本较旧而无法通过编译.
|
||||
* 如果你的项目中无法成功编译源码中的setBuffer, 请更改LovyanGFX库的函数!
|
||||
* 位于文件 LovyanGFX/src/lgfx/v1/LGFX_Sprite.hpp
|
||||
* 第155行 void setBuffer 函数:
|
||||
* 修改为如下内容并保存
|
||||
*
|
||||
``` C++
|
||||
void setBuffer(void* buffer, int32_t w, int32_t h, color_depth_t bpp = rgb565_2Byte)
|
||||
{
|
||||
deleteSprite();
|
||||
if (bpp != 0) {
|
||||
_write_conv.setColorDepth(bpp);
|
||||
_read_conv = _write_conv;
|
||||
_panel_sprite.setColorDepth(bpp);
|
||||
}
|
||||
|
||||
_panel_sprite.setBuffer(buffer, w, h, &_write_conv);
|
||||
_img = _panel_sprite.getBuffer();
|
||||
|
||||
_sw = w;
|
||||
_clip_r = w - 1;
|
||||
_xpivot = w >> 1;
|
||||
|
||||
_sh = h;
|
||||
_clip_b = h - 1;
|
||||
_ypivot = h >> 1;
|
||||
}
|
||||
```
|
||||
* 完成后请再次尝试编译
|
||||
* [已经向lovyan03/LovyanGFX发布issue, 等待解决]
|
||||
*
|
||||
* @attention
|
||||
* Copyright (c) 2022-2023 FriendshipEnder
|
||||
*
|
||||
@@ -263,7 +266,9 @@ void setup(){
|
||||
readguyImage im(guy); //定义一个绘制器, 此类中的函数用于绘制图片.
|
||||
//所有的绘制图片的参数均需要放入此结构内
|
||||
//直接更改im内的数据即可设置绘制参数. (就像结构体一样用它)
|
||||
#ifdef FS_POINTER //对于不支持fs::FS的设备来说, 请前往 guy_image.h 文件并更改第34行的注释
|
||||
im.baseFs=&guy.guyFS(); //在此处就是设置文件系统.
|
||||
#endif
|
||||
|
||||
im.filename=BMP_FILE; //在此直接设置文件路径和文件名.
|
||||
|
||||
|
||||
@@ -9,6 +9,40 @@
|
||||
* @version 1.0
|
||||
* @date 2023-11-01
|
||||
|
||||
* @note 重要消息: 这是一个实验性功能. 可能你所使用的LGFX库版本较旧而无法通过编译.
|
||||
*
|
||||
* (ESPxxxx系列可无视此行) 对于不支持fs::FS的设备 (如PC) 来说, 请前往 guy_image.h 文件并更改第34行的注释
|
||||
*
|
||||
* 如果你的项目中无法成功编译源码中的setBuffer, 请更改LovyanGFX库的函数!
|
||||
* 位于文件 LovyanGFX/src/lgfx/v1/LGFX_Sprite.hpp
|
||||
* 第155行 void setBuffer 函数:
|
||||
* 添加为如下内容并保存 (不建议修改库里原有的函数, 保证库的兼容性)
|
||||
*
|
||||
``` C++
|
||||
void setBuffer(void* buffer, int32_t w, int32_t h, color_depth_t bpp)
|
||||
{
|
||||
deleteSprite();
|
||||
if (bpp != 0) {
|
||||
_write_conv.setColorDepth(bpp);
|
||||
_read_conv = _write_conv;
|
||||
_panel_sprite.setColorDepth(bpp);
|
||||
}
|
||||
|
||||
_panel_sprite.setBuffer(buffer, w, h, &_write_conv);
|
||||
_img = _panel_sprite.getBuffer();
|
||||
|
||||
_sw = w;
|
||||
_clip_r = w - 1;
|
||||
_xpivot = w >> 1;
|
||||
|
||||
_sh = h;
|
||||
_clip_b = h - 1;
|
||||
_ypivot = h >> 1;
|
||||
}
|
||||
```
|
||||
* 完成后请再次尝试编译
|
||||
* [已经向lovyan03/LovyanGFX发布issue, 等待解决]
|
||||
*
|
||||
* @attention
|
||||
* Copyright (c) 2022-2023 FriendshipEnder
|
||||
*
|
||||
@@ -78,15 +112,33 @@ uint8_t readguyImage::drawImgHandler(int r, LGFX_Sprite *spr){
|
||||
spr->setRotation(rot);
|
||||
switch(format&3){
|
||||
case 1:
|
||||
spr->drawBmpFile(*baseFs,filename,_x,_y,0,0,offsetx+xd,offsety+yd,scalex,scaley,datum);
|
||||
spr->drawBmpFile(
|
||||
#ifdef FS_POINTER
|
||||
*baseFs
|
||||
#else
|
||||
guy->guyFS()
|
||||
#endif
|
||||
,filename,_x,_y,0,0,offsetx+xd,offsety+yd,scalex,scaley,datum);
|
||||
break;
|
||||
#ifndef ESP8266
|
||||
case 2:
|
||||
spr->drawPngFile(*baseFs,filename,_x,_y,0,0,offsetx+xd,offsety+yd,scalex,scaley,datum);
|
||||
spr->drawPngFile(
|
||||
#ifdef FS_POINTER
|
||||
*baseFs
|
||||
#else
|
||||
guy->guyFS()
|
||||
#endif
|
||||
,filename,_x,_y,0,0,offsetx+xd,offsety+yd,scalex,scaley,datum);
|
||||
break;
|
||||
#endif
|
||||
case 3:
|
||||
spr->drawJpgFile(*baseFs,filename,_x,_y,0,0,offsetx+xd,offsety+yd,scalex,scaley,datum);
|
||||
spr->drawJpgFile(
|
||||
#ifdef FS_POINTER
|
||||
*baseFs
|
||||
#else
|
||||
guy->guyFS()
|
||||
#endif
|
||||
,filename,_x,_y,0,0,offsetx+xd,offsety+yd,scalex,scaley,datum);
|
||||
break;
|
||||
}
|
||||
spr->setRotation(0);
|
||||
@@ -219,7 +271,11 @@ uint8_t readguyImage::getExName(const char* fname, char* exname, size_t exname_l
|
||||
|
||||
/// @brief 显示图像
|
||||
void readguyImage::drawImageFile(bool use16grey){
|
||||
if(filename == nullptr || filename[0] == 0 || !(baseFs->exists(filename))) return; //文件不存在
|
||||
if(filename == nullptr || filename[0] == 0
|
||||
#ifdef FS_POINTER
|
||||
|| !(baseFs->exists(filename))
|
||||
#endif
|
||||
) return; //文件不存在
|
||||
char ex[8]; //保存文件的扩展名
|
||||
getExName(filename,ex,7); //获取文件的扩展名.最后一个参数用于防止数组越界
|
||||
format = 0; //16灰度模式
|
||||
@@ -243,6 +299,7 @@ void readguyImage::drawImageFile(bool use16grey){
|
||||
LGFX_Sprite bmpspr;
|
||||
//首先, 需要获取到内部显存的地址, 用于建立图片分块绘制缓存.
|
||||
//获取屏幕缓存, 随后分配图片解码所需的内存.
|
||||
//此处如果出现 convert from `lgfx::v1::color_depth_t` to `uint8_t` 警告(或错误) 请查看本文开头重要消息
|
||||
bmpspr.setBuffer(_pool,w,_h,lgfx::v1::color_depth_t::grayscale_8bit);
|
||||
//bmpspr.createSprite(guy_width,(guy_height+7)&0x7ffffff8);
|
||||
|
||||
@@ -286,7 +343,11 @@ void readguyImage::drawImageFile(bool use16grey){
|
||||
}
|
||||
|
||||
uint8_t readguyImage::drawImageToBuffer(){
|
||||
if(filename == nullptr || filename[0] == 0 || !(baseFs->exists(filename))) return 1; //文件不存在
|
||||
if(filename == nullptr || filename[0] == 0
|
||||
#ifdef FS_POINTER
|
||||
|| !(baseFs->exists(filename))
|
||||
#endif
|
||||
) return 1; //文件不存在
|
||||
if( w==0 || h==0 || w>=0x8000 || h>=0x8000 || exPool==nullptr || exPoolSize<1024) return 3; //内存不足
|
||||
char ex[8]; //保存文件的扩展名
|
||||
format = 0; //16灰度模式
|
||||
@@ -309,20 +370,39 @@ uint8_t readguyImage::drawImageToBuffer(){
|
||||
if(_h==0 || GUY_STAGES>8) return 3; //内存不足以在显示8次之内就... 总之就是内存不够
|
||||
|
||||
LGFX_Sprite spr;
|
||||
//此处如果出现 convert from `lgfx::v1::color_depth_t` to `uint8_t` 警告(或错误) 请查看本文开头重要消息
|
||||
spr.setBuffer(_pool,w,_h,lgfx::v1::color_depth_t::grayscale_8bit);
|
||||
for(int i=0;i<GUY_STAGES;i++){
|
||||
spr.fillScreen(background?0xffff:0);
|
||||
switch(format&3){
|
||||
case 1:
|
||||
spr.drawBmpFile(*baseFs,filename,0,0,0,0,offsetx,offsety+_h*i,scalex,scaley);
|
||||
spr.drawBmpFile(
|
||||
#ifdef FS_POINTER
|
||||
*baseFs
|
||||
#else
|
||||
guy->guyFS()
|
||||
#endif
|
||||
,filename,0,0,0,0,offsetx,offsety+_h*i,scalex,scaley);
|
||||
break;
|
||||
#ifndef ESP8266
|
||||
case 2:
|
||||
spr.drawPngFile(*baseFs,filename,0,0,0,0,offsetx,offsety+_h*i,scalex,scaley);
|
||||
spr.drawPngFile(
|
||||
#ifdef FS_POINTER
|
||||
*baseFs
|
||||
#else
|
||||
guy->guyFS()
|
||||
#endif
|
||||
,filename,0,0,0,0,offsetx,offsety+_h*i,scalex,scaley);
|
||||
break;
|
||||
#endif
|
||||
case 3:
|
||||
spr.drawJpgFile(*baseFs,filename,0,0,0,0,offsetx,offsety+_h*i,scalex,scaley);
|
||||
spr.drawJpgFile(
|
||||
#ifdef FS_POINTER
|
||||
*baseFs
|
||||
#else
|
||||
guy->guyFS()
|
||||
#endif
|
||||
,filename,0,0,0,0,offsetx,offsety+_h*i,scalex,scaley);
|
||||
break;
|
||||
}
|
||||
guy->drawImageStage(spr,x,y+_h*i,i,GUY_STAGES);
|
||||
|
||||
@@ -9,6 +9,40 @@
|
||||
* @version 1.0
|
||||
* @date 2023-11-01
|
||||
|
||||
* @note 重要消息: 这是一个实验性功能. 可能你所使用的LGFX库版本较旧而无法通过编译.
|
||||
*
|
||||
* (ESPxxxx系列可无视此行) 对于不支持fs::FS的设备 (如PC) 来说, 请前往 guy_image.h 文件并更改第34行的注释
|
||||
*
|
||||
* 如果你的项目中无法成功编译源码中的setBuffer, 请更改LovyanGFX库的函数!
|
||||
* 位于文件 LovyanGFX/src/lgfx/v1/LGFX_Sprite.hpp
|
||||
* 第155行 void setBuffer 函数:
|
||||
* 添加为如下内容并保存 (不建议修改库里原有的函数, 保证库的兼容性)
|
||||
*
|
||||
``` C++
|
||||
void setBuffer(void* buffer, int32_t w, int32_t h, color_depth_t bpp)
|
||||
{
|
||||
deleteSprite();
|
||||
if (bpp != 0) {
|
||||
_write_conv.setColorDepth(bpp);
|
||||
_read_conv = _write_conv;
|
||||
_panel_sprite.setColorDepth(bpp);
|
||||
}
|
||||
|
||||
_panel_sprite.setBuffer(buffer, w, h, &_write_conv);
|
||||
_img = _panel_sprite.getBuffer();
|
||||
|
||||
_sw = w;
|
||||
_clip_r = w - 1;
|
||||
_xpivot = w >> 1;
|
||||
|
||||
_sh = h;
|
||||
_clip_b = h - 1;
|
||||
_ypivot = h >> 1;
|
||||
}
|
||||
```
|
||||
* 完成后请再次尝试编译
|
||||
* [已经向lovyan03/LovyanGFX发布issue, 等待解决]
|
||||
*
|
||||
* @attention
|
||||
* Copyright (c) 2022-2023 FriendshipEnder
|
||||
*
|
||||
@@ -30,15 +64,11 @@
|
||||
#ifndef _GUY_IMAGE_H_FILE
|
||||
#define _GUY_IMAGE_H_FILE
|
||||
|
||||
#define FS_POINTER //如果你的系统不是ESP系列, 没有FS.h文件也没有File类则注释掉它
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <SPI.h>
|
||||
#include <FS.h>
|
||||
|
||||
#define LGFX_USE_V1
|
||||
#include <LovyanGFX.hpp>
|
||||
#include "readguy.h"
|
||||
|
||||
|
||||
class readguyImage{
|
||||
public:
|
||||
readguyImage(ReadguyDriver &_guy):guy(&_guy){
|
||||
@@ -67,7 +97,9 @@ class readguyImage{
|
||||
/// @brief 获取文件的扩展名.
|
||||
static uint8_t getExName(const char* fname, char* exname, size_t exname_len);
|
||||
|
||||
#ifdef FS_POINTER
|
||||
fs::FS *baseFs = nullptr;/// // / //要绘制的图片所属的文件系统
|
||||
#endif
|
||||
const char *filename = nullptr; // / //要绘制的图片的文件名和文件路径
|
||||
int32_t x = 0; //// // / //绘制位置坐标X
|
||||
int32_t y = 0; //// // / //绘制位置坐标Y
|
||||
|
||||
@@ -71,12 +71,12 @@
|
||||
#define DYNAMIC_PIN_SETTINGS
|
||||
|
||||
/// @brief 启用WIFI配网功能.必须先启用 #define DYNAMIC_PIN_SETTINGS. 此选项对 ESP32xx 会减少大量可用flash.
|
||||
#define READGUY_ENABLE_WIFI
|
||||
#define READGUY_ENABLE_WIFI //会破坏跨平台特性
|
||||
|
||||
/** @brief 启用I2C功能. 可用于联网时钟, 温度计, 陀螺仪等外设. 目前暂不支持库内使用类似函数. 仅可以提供引脚定义
|
||||
/ @note 现在库提供了获取已存的I2C引脚的接口, 使用时请使用 getI2cSda() 和 getI2cScl() 函数获取I2C的引脚.
|
||||
/ 本库内不提供任何I2C驱动, 只提供引脚定义的存储和读取, 这几乎不增加多少代码. 因此本宏不再使用 */
|
||||
//#define READGUY_ENABLE_I2C
|
||||
//#define READGUY_ENABLE_I2C //已经弃用
|
||||
|
||||
/** @brief 启用SD卡功能. 开启此功能将会使用内置SD卡管理功能. 关闭后仅可保存SD卡用到的引脚.
|
||||
/ @note 会破坏兼容性. 若没有启用通用的SD卡驱动程序, 那么那些跨屏台编译的程序将无法用guyFS读取到SD卡.
|
||||
@@ -152,7 +152,7 @@
|
||||
/// @brief debug专用, 请保持处于注释状态. 正常开机从NVS读取引脚配置数据, 取消注释则每次开机需要重新配置
|
||||
//#define READGUY_INDEV_DEBUG 1
|
||||
|
||||
/// @brief 串口显示刷屏功能等的信息. 建议开启, 如果是对flash要求十分敏感 可以关闭
|
||||
/// @brief 串口显示刷屏功能等的信息. 如果是对flash大小要求十分敏感, 或者希望减少串口数据, 可以关闭
|
||||
#define READGUY_SERIAL_DEBUG
|
||||
|
||||
#ifndef DYNAMIC_PIN_SETTINGS
|
||||
|
||||
@@ -28,9 +28,9 @@
|
||||
*/
|
||||
|
||||
#include "readguy.h"
|
||||
/* #if (!defined(ESP8266)) //for ESP32, ESP32S2, ESP32S3, ESP32C3
|
||||
#if (!defined(ESP8266)) //for ESP32, ESP32S2, ESP32S3, ESP32C3
|
||||
#include "esp_flash.h"
|
||||
#endif */
|
||||
#endif
|
||||
|
||||
#ifdef READGUY_ESP_ENABLE_WIFI
|
||||
static const PROGMEM char NOT_SUPPORTED[] = "(不支持此屏幕)";
|
||||
|
||||
2017
src/readguy.cpp
2017
src/readguy.cpp
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user