mirror of
https://github.com/fsender/readguy.git
synced 2026-03-31 08:29:52 +08:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2aca106448 | ||
|
|
d24639a962 |
16
CHANGELOG.md
16
CHANGELOG.md
@@ -1,3 +1,19 @@
|
|||||||
|
## Release 1.3.2 - 2023/11/8
|
||||||
|
|
||||||
|
1. 按键驱动 (guy_button) 获得新操作更新: (New button gesture)
|
||||||
|
|
||||||
|
- 单按键操作更新: 现在双击效果为选择/确定, 三击效果为返回, 长按效果为向上翻页;
|
||||||
|
|
||||||
|
- 单按键新增点按后长按操作;
|
||||||
|
|
||||||
|
- 双按键新增按住按键1点按按键2操作;
|
||||||
|
|
||||||
|
- 三按键新增按住按键1点按按键3操作.
|
||||||
|
|
||||||
|
2. 新增获取系统内存的API函数 getFreeMem().
|
||||||
|
|
||||||
|
3. 修复若干驱动层bug.
|
||||||
|
|
||||||
## Release 1.3.1 - 2023/11/7
|
## Release 1.3.1 - 2023/11/7
|
||||||
|
|
||||||
1. 增加了分步绘制的支持. 可以使用 READGUY_FAST_START 等绘制选项来控制绘制过程:
|
1. 增加了分步绘制的支持. 可以使用 READGUY_FAST_START 等绘制选项来控制绘制过程:
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
<img src="extra/artset/readguy_theme3.png" width="30%" height="auto">
|
<img src="extra/artset/readguy_theme3.png" width="30%" height="auto">
|
||||||
|
|
||||||
**版本1.3.1正式发布!欢迎分享、star和fork~** 上面的图是项目看板娘, 盖. 可爱的盖姐在等你哟~
|
**版本1.3.2正式发布!欢迎分享、star和fork~** 上面的图是项目看板娘, 盖. 可爱的盖姐在等你哟~
|
||||||
|
|
||||||
欢迎克隆, 项目交流QQ群: 926824162 (萌新可以进来问问题的哟), 项目的 Bilibili 主页: [BV1f94y187wz](https://www.bilibili.com/video/BV1f94y187wz/) 记得三连+关注我这个宝藏up主哦~
|
欢迎克隆, 项目交流QQ群: 926824162 (萌新可以进来问问题的哟), 项目的 Bilibili 主页: [BV1f94y187wz](https://www.bilibili.com/video/BV1f94y187wz/) 记得三连+关注我这个宝藏up主哦~
|
||||||
|
|
||||||
|
|||||||
@@ -61,16 +61,16 @@ uint8_t readguyImage::drawImgHandler(int r, LGFX_Sprite *spr){
|
|||||||
//_x=y-r/stage*_h; yd=0;
|
//_x=y-r/stage*_h; yd=0;
|
||||||
//_y=x;//(widthDiv8<<3)-x-1;
|
//_y=x;//(widthDiv8<<3)-x-1;
|
||||||
_x=x-r/stage*_h;
|
_x=x-r/stage*_h;
|
||||||
_y=y; yd=0;
|
_y=y+w-guy->drvWidth(); yd=0;
|
||||||
if(_x<0){ xd=-_x; _x=0; }
|
if(_x<0){ xd=-_x; _x=0; }
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
_x=x; xd=0;
|
_x=x+w-guy->drvWidth(); xd=0;
|
||||||
_y=y-(GUY_STAGES-r/stage-1)*_h;
|
_y=y+(r/stage+1)*_h-h;
|
||||||
if(_y<0){ yd=-_y; _y=0; }
|
if(_y<0){ yd=-_y; _y=0; }
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
_x=x-(GUY_STAGES-r/stage-1)*_h;
|
_x=x+(r/stage+1)*_h-h;
|
||||||
_y=y; yd=0;
|
_y=y; yd=0;
|
||||||
if(_x<0){ xd=-_x; _x=0; }
|
if(_x<0){ xd=-_x; _x=0; }
|
||||||
break;
|
break;
|
||||||
@@ -234,7 +234,7 @@ void readguyImage::drawImageFile(bool use16grey){
|
|||||||
_pool=exPool;
|
_pool=exPool;
|
||||||
}
|
}
|
||||||
if(_pool==nullptr) {
|
if(_pool==nullptr) {
|
||||||
_h=(h+7)>>3; //设置缓存区的高度. 更多内存将可以更快显示
|
_h=h>>3; //设置缓存区的高度. 更多内存将可以更快显示
|
||||||
_pool=(uint8_t *)guy->getBuffer();
|
_pool=(uint8_t *)guy->getBuffer();
|
||||||
}
|
}
|
||||||
//(guy->guyMemoryHeight()+7)>>3 返回高度,并补齐后右移三位 (等效于除以2³, 分成8份)
|
//(guy->guyMemoryHeight()+7)>>3 返回高度,并补齐后右移三位 (等效于除以2³, 分成8份)
|
||||||
@@ -275,7 +275,7 @@ void readguyImage::drawImageFile(bool use16grey){
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// ************* 提示: 编写此示例时的最新版本LovyanGFX库不提供此函数. 请看ex06_Image.ino文件开头的解决方法!
|
// ************* 提示: 编写此示例时的最新版本LovyanGFX库不提供此函数. 请看ex06_Image.ino文件开头的解决方法!
|
||||||
guy->display(std::bind(&readguyImage::drawImgHandler,this,std::placeholders::_1,&bmpspr));
|
guy->display(std::bind(&readguyImage::drawImgHandler,this,std::placeholders::_1,&bmpspr),READGUY_FAST);
|
||||||
// 此函数过不了编译 需要改库.
|
// 此函数过不了编译 需要改库.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/fsender/readguy"
|
"url": "https://github.com/fsender/readguy"
|
||||||
},
|
},
|
||||||
"version": "1.3.1",
|
"version": "1.3.2",
|
||||||
"frameworks": "arduino",
|
"frameworks": "arduino",
|
||||||
"platforms": ["espressif32", "espressif8266"],
|
"platforms": ["espressif32", "espressif8266"],
|
||||||
"headers": "readguy.h",
|
"headers": "readguy.h",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name=readguy
|
name=readguy
|
||||||
version=1.3.1
|
version=1.3.2
|
||||||
author=fsender <f_ender@163.com>
|
author=fsender <f_ender@163.com>
|
||||||
maintainer=fsender <f_ender@163.com>
|
maintainer=fsender <f_ender@163.com>
|
||||||
sentence=A free E-paper display driver library supports 16-level greyscale.
|
sentence=A free E-paper display driver library supports 16-level greyscale.
|
||||||
|
|||||||
@@ -78,11 +78,18 @@ void guy_button::begin(uint8_t _pin, std_U8_function_U8 f, bool activeLow /* = t
|
|||||||
state = get_state_cb(pin);
|
state = get_state_cb(pin);
|
||||||
min_debounce =25; //去抖时间
|
min_debounce =25; //去抖时间
|
||||||
long_press_ms =300; //长按持续时间+双击识别间隔最大时间
|
long_press_ms =300; //长按持续时间+双击识别间隔最大时间
|
||||||
long_repeat_ms =150; //长按连按间隔时间
|
long_repeat_ms =200; //长按连按间隔时间
|
||||||
multibtn =0;
|
multibtn =0;
|
||||||
lk=0;
|
lk=0;
|
||||||
}
|
}
|
||||||
|
bool guy_button::isPressedRaw() {
|
||||||
|
int mi=millis();
|
||||||
|
while(lk) if(millis()-mi>GUYBTN_READ_TIMEOUT) return 0; //等待数据读完
|
||||||
|
lk=3;
|
||||||
|
bool willreturn = (get_state_cb(pin) == _pressedState);
|
||||||
|
lk=0;
|
||||||
|
return willreturn;
|
||||||
|
}
|
||||||
uint8_t guy_button::read() { //注意ticker不能在此触发
|
uint8_t guy_button::read() { //注意ticker不能在此触发
|
||||||
int mi=millis();
|
int mi=millis();
|
||||||
while(lk) if(millis()-mi>GUYBTN_READ_TIMEOUT) return 0; //等待数据读完
|
while(lk) if(millis()-mi>GUYBTN_READ_TIMEOUT) return 0; //等待数据读完
|
||||||
@@ -91,13 +98,14 @@ uint8_t guy_button::read() { //注意ticker不能在此触发
|
|||||||
if(state == _pressedState && n - down_ms>= long_press_ms && long_clicked < n){
|
if(state == _pressedState && n - down_ms>= long_press_ms && long_clicked < n){
|
||||||
long_clicked = trig_mode?(n+long_repeat_ms):0xfffffffful;
|
long_clicked = trig_mode?(n+long_repeat_ms):0xfffffffful;
|
||||||
lk=0;
|
lk=0;
|
||||||
return GUYBUTTON_long_click;
|
return (click_count>=3)?GUYBUTTON_xxlong_click:\
|
||||||
|
((click_count==2)?GUYBUTTON_xlong_click:GUYBUTTON_long_click);
|
||||||
}
|
}
|
||||||
uint8_t res = last_click_type;
|
uint8_t res = last_click_type;
|
||||||
last_click_type = GUYBUTTON_empty;
|
last_click_type = GUYBUTTON_empty;
|
||||||
was_pressed = false;
|
was_pressed = false;
|
||||||
lk=0;
|
lk=0;
|
||||||
return (res==GUYBUTTON_long_click)?GUYBUTTON_empty:res;
|
return (res>=GUYBUTTON_long_click)?GUYBUTTON_empty:res;
|
||||||
}
|
}
|
||||||
|
|
||||||
void guy_button::loop() {
|
void guy_button::loop() {
|
||||||
@@ -140,8 +148,9 @@ void guy_button::loop() {
|
|||||||
// was there a longclick?
|
// was there a longclick?
|
||||||
if (longclick_detected) {
|
if (longclick_detected) {
|
||||||
// was it part of a combination?
|
// was it part of a combination?
|
||||||
if (click_count == 1) {
|
if (click_count) {
|
||||||
last_click_type = GUYBUTTON_long_click;
|
last_click_type = (click_count>=3)?GUYBUTTON_xxlong_click:\
|
||||||
|
((click_count==2)?GUYBUTTON_xlong_click:GUYBUTTON_long_click);
|
||||||
was_pressed = true;
|
was_pressed = true;
|
||||||
}
|
}
|
||||||
longclick_detected = false;
|
longclick_detected = false;
|
||||||
|
|||||||
@@ -76,14 +76,17 @@ SOFTWARE.
|
|||||||
#define GUYBUTTON_double_click 2
|
#define GUYBUTTON_double_click 2
|
||||||
#define GUYBUTTON_triple_click 3
|
#define GUYBUTTON_triple_click 3
|
||||||
#define GUYBUTTON_long_click 4
|
#define GUYBUTTON_long_click 4
|
||||||
|
#define GUYBUTTON_xlong_click 5
|
||||||
|
#define GUYBUTTON_xxlong_click 6
|
||||||
#define GUYBTN_READ_TIMEOUT 100
|
#define GUYBTN_READ_TIMEOUT 100
|
||||||
#define GUYBTN_LOOP_TIMEOUT 10
|
#define GUYBTN_LOOP_TIMEOUT 10
|
||||||
|
|
||||||
class guy_button{
|
class guy_button{
|
||||||
protected:
|
public:
|
||||||
uint16_t min_debounce ; //去抖时间
|
uint16_t min_debounce ; //去抖时间
|
||||||
uint16_t long_press_ms ; //长按持续时间+双击识别间隔最大时间
|
uint16_t long_press_ms ; //长按持续时间+双击识别间隔最大时间
|
||||||
uint16_t long_repeat_ms ; //长按连按间隔时间
|
uint16_t long_repeat_ms ; //长按连按间隔时间
|
||||||
|
protected:
|
||||||
uint8_t pin = 255; //未定义引脚
|
uint8_t pin = 255; //未定义引脚
|
||||||
uint8_t state;
|
uint8_t state;
|
||||||
uint8_t prev_state;
|
uint8_t prev_state;
|
||||||
@@ -114,16 +117,19 @@ class guy_button{
|
|||||||
void setLongRepeatMode(bool trigMode) { trig_mode = trigMode; }
|
void setLongRepeatMode(bool trigMode) { trig_mode = trigMode; }
|
||||||
unsigned int wasPressedFor() const { return down_time_ms; }
|
unsigned int wasPressedFor() const { return down_time_ms; }
|
||||||
bool isPressed() const { return (state == _pressedState); }
|
bool isPressed() const { return (state == _pressedState); }
|
||||||
bool isPressedRaw() { return (get_state_cb(pin) == _pressedState); }
|
bool isPressedRaw(); // { return (get_state_cb(pin) == _pressedState); }
|
||||||
bool wasPressed(){ if(was_pressed){ was_pressed = false; return true; } return false; }
|
bool wasPressed(){ if(was_pressed){ was_pressed = false; return true; } return false; }
|
||||||
uint8_t getNumberOfClicks() const{ return click_count;}
|
uint8_t getNumberOfClicks() const{ return click_count;}
|
||||||
uint8_t getType() const { return last_click_type; }
|
uint8_t getType() const { return last_click_type; }
|
||||||
uint8_t read();
|
uint8_t read();
|
||||||
void loop();
|
void loop();
|
||||||
void setMultiBtn(uint8_t btns) { multibtn = btns; }
|
void setMultiBtn(uint8_t btns) { multibtn = btns; }
|
||||||
void setMinDebounce(short n) { min_debounce =n;} //去抖时间
|
/* void setMinDebounce(short n) { min_debounce =n;} //去抖时间
|
||||||
void setLongPressMs(short n) { long_press_ms =n;} //长按持续时间+双击识别间隔最大时间
|
void setLongPressMs(short n) { long_press_ms =n;} //长按持续时间+双击识别间隔最大时间
|
||||||
void setLongRepeat(short n) { long_repeat_ms =n;} //长按连按间隔时间
|
void setLongRepeat(short n) { long_repeat_ms =n;} //长按连按间隔时间
|
||||||
|
void getMinDebounce(short n) { min_debounce =n;} //去抖时间
|
||||||
|
void getLongPressMs(short n) { long_press_ms =n;} //长按持续时间+双击识别间隔最大时间
|
||||||
|
void getLongRepeat(short n) { long_repeat_ms =n;} //长按连按间隔时间 */
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* END OF FILE. ReadGuy project. */
|
#endif /* END OF FILE. ReadGuy project. */
|
||||||
@@ -148,10 +148,10 @@ void drv::drv_dispWriter(std::function<uint8_t(int)> f,uint8_t m){ //单色刷
|
|||||||
lastRefresh=millis();
|
lastRefresh=millis();
|
||||||
}
|
}
|
||||||
if(m&2){//stage 2
|
if(m&2){//stage 2
|
||||||
lastRefresh=0;
|
|
||||||
uint32_t ms=millis()-lastRefresh;
|
uint32_t ms=millis()-lastRefresh;
|
||||||
uint32_t u=epdFull?1600:310;
|
uint32_t u=epdFull?1600:310;
|
||||||
if(ms<u) guy_epdBusy(u-ms);
|
if(ms<u) guy_epdBusy(u-ms);
|
||||||
|
lastRefresh=0;
|
||||||
}
|
}
|
||||||
//guy_epdBusy(epdFull?1600:310);
|
//guy_epdBusy(epdFull?1600:310);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,8 +41,7 @@ void drv::drv_fullpart(bool part){
|
|||||||
partMode=part;
|
partMode=part;
|
||||||
}
|
}
|
||||||
void drv::drv_dispWriter(std::function<uint8_t(int)> f,uint8_t m){ //单色刷新
|
void drv::drv_dispWriter(std::function<uint8_t(int)> f,uint8_t m){ //单色刷新
|
||||||
if(m&1){//stage 1
|
if(!(m&1)) return; //stage 1
|
||||||
if(lastRefresh) drv_dispWriter(f,2);
|
|
||||||
uint16_t dat[8];
|
uint16_t dat[8];
|
||||||
unsigned short xbits=(drv_width()+7)/8;
|
unsigned short xbits=(drv_width()+7)/8;
|
||||||
if(partMode==0){
|
if(partMode==0){
|
||||||
@@ -82,13 +81,6 @@ void drv::drv_dispWriter(std::function<uint8_t(int)> f,uint8_t m){ //单色刷
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lastRefresh=millis();
|
|
||||||
}
|
|
||||||
if(m&2){//stage 2
|
|
||||||
uint32_t ms=millis()-lastRefresh;
|
|
||||||
if(ms<150) DelayMs(150-ms);
|
|
||||||
lastRefresh=0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
void drv::drv_sleep() {}
|
void drv::drv_sleep() {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
* @file guy_version.h
|
* @file guy_version.h
|
||||||
* @author FriendshipEnder (f_ender@163.com), Bilibili: FriendshipEnder
|
* @author FriendshipEnder (f_ender@163.com), Bilibili: FriendshipEnder
|
||||||
* @brief readguy 版本控制文件.
|
* @brief readguy 版本控制文件.
|
||||||
* @version 1.0
|
* @version 1.3.2
|
||||||
* @date 2023-09-21
|
* @date 2023-09-21
|
||||||
|
|
||||||
* @attention
|
* @attention
|
||||||
@@ -41,9 +41,9 @@
|
|||||||
//另外, 在提交新版本之前, 不要忘记在github上创建release, 否则Arduino IDE会读不到
|
//另外, 在提交新版本之前, 不要忘记在github上创建release, 否则Arduino IDE会读不到
|
||||||
#define READGUY_V_MAJOR 1
|
#define READGUY_V_MAJOR 1
|
||||||
#define READGUY_V_MINOR 3
|
#define READGUY_V_MINOR 3
|
||||||
#define READGUY_V_PATCH 1
|
#define READGUY_V_PATCH 2
|
||||||
#define READGUY_VERSION_VAL (READGUY_V_MAJOR*1000+READGUY_V_MINOR*100+READGUY_V_PATCH*10)
|
#define READGUY_VERSION_VAL (READGUY_V_MAJOR*1000+READGUY_V_MINOR*100+READGUY_V_PATCH*10)
|
||||||
#define READGUY_VERSION "1.3.1"
|
#define READGUY_VERSION "1.3.2"
|
||||||
|
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
#define _READGUY_PLATFORM "ESP8266"
|
#define _READGUY_PLATFORM "ESP8266"
|
||||||
|
|||||||
@@ -645,7 +645,7 @@ const PROGMEM char ReadguyDriver::verify2_html[] =
|
|||||||
"al\" method=\"POST\"><input type=\'text\' name=\'t_verify\' maxlength=\"6";
|
"al\" method=\"POST\"><input type=\'text\' name=\'t_verify\' maxlength=\"6";
|
||||||
const PROGMEM char ReadguyDriver::verifybtn_html[3][200] = {
|
const PROGMEM char ReadguyDriver::verifybtn_html[3][200] = {
|
||||||
"一个按键, 操作可能比较繁琐, 但功能还都可以的.<br/>"
|
"一个按键, 操作可能比较繁琐, 但功能还都可以的.<br/>"
|
||||||
"点按: 下一个/向下翻页<br/>双击: 上一个/向上翻页<br/>三连击: 返回/切换输入法<br/>长按: 确定/选择",
|
"点按: 下一个/向下翻页<br/>双击: 确定/选择<br/>三连击: 返回/切换输入法<br/>长按: 上一个/向上翻页",
|
||||||
"两个按键, 操作可以满足需求.<br/>"
|
"两个按键, 操作可以满足需求.<br/>"
|
||||||
"按键1点按: 下一个/向下翻页<br/>按键1长按: 上一个/向上翻页<br/>按键2点按: 确定/选择<br/>按键2长按: 返回/切换输入法",
|
"按键1点按: 下一个/向下翻页<br/>按键1长按: 上一个/向上翻页<br/>按键2点按: 确定/选择<br/>按键2长按: 返回/切换输入法",
|
||||||
"三个按键, 操作非常流畅.<br/>"
|
"三个按键, 操作非常流畅.<br/>"
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ ReadguyDriver::ReadguyDriver(){
|
|||||||
READGUY_sd_ok = 0; //初始默认SD卡未成功初始化
|
READGUY_sd_ok = 0; //初始默认SD卡未成功初始化
|
||||||
READGUY_buttons = 0; //初始情况下没有按钮
|
READGUY_buttons = 0; //初始情况下没有按钮
|
||||||
} //WiFiSet: 是否保持AP服务器一直处于打开状态
|
} //WiFiSet: 是否保持AP服务器一直处于打开状态
|
||||||
uint8_t ReadguyDriver::init(uint8_t WiFiSet,bool initepd/* ,int g_width,int g_height */){
|
uint8_t ReadguyDriver::init(uint8_t WiFiSet, bool initepd){
|
||||||
if(READGUY_cali==127) //已经初始化过了一次了, 为了防止里面一些volatile的东西出现问题....还是退出吧
|
if(READGUY_cali==127) //已经初始化过了一次了, 为了防止里面一些volatile的东西出现问题....还是退出吧
|
||||||
return 0;
|
return 0;
|
||||||
#ifdef DYNAMIC_PIN_SETTINGS
|
#ifdef DYNAMIC_PIN_SETTINGS
|
||||||
@@ -187,7 +187,7 @@ void ReadguyDriver::setEpdDriver(bool initepd/* ,int g_width,int g_height */){
|
|||||||
//创建画布. 根据LovyanGFX的特性, 如果以前有画布会自动重新生成新画布
|
//创建画布. 根据LovyanGFX的特性, 如果以前有画布会自动重新生成新画布
|
||||||
//此外, 即使画布宽度不是8的倍数(如2.13寸单色),也支持自动补全8的倍数 ( 250x122 => 250x128 )
|
//此外, 即使画布宽度不是8的倍数(如2.13寸单色),也支持自动补全8的倍数 ( 250x122 => 250x128 )
|
||||||
//为了保证图片显示功能的正常使用, 高度也必须是8的倍数.
|
//为了保证图片显示功能的正常使用, 高度也必须是8的倍数.
|
||||||
createSprite(guy_dev->drv_width(),(guy_dev->drv_height()+7)&0x7ffffff8);
|
createSprite(guy_dev->drv_width(),guy_dev->drv_height());
|
||||||
//这里发现如果用自定义的内存分配方式会更好一些. 不会导致返回的height不对. 但是因为LovyanGFX库未更新 暂时不能这么用.
|
//这里发现如果用自定义的内存分配方式会更好一些. 不会导致返回的height不对. 但是因为LovyanGFX库未更新 暂时不能这么用.
|
||||||
//setRotation(1); //旋转之后操作更方便
|
//setRotation(1); //旋转之后操作更方便
|
||||||
setRotation(0);
|
setRotation(0);
|
||||||
@@ -279,18 +279,21 @@ void ReadguyDriver::setButtonDriver(){
|
|||||||
if(READGUY_btn1) btn_rd[0].begin(abs(READGUY_btn1)-1,rd_btn_f,(READGUY_btn1>0));
|
if(READGUY_btn1) btn_rd[0].begin(abs(READGUY_btn1)-1,rd_btn_f,(READGUY_btn1>0));
|
||||||
if(READGUY_btn2) btn_rd[1].begin(abs(READGUY_btn2)-1,rd_btn_f,(READGUY_btn2>0));
|
if(READGUY_btn2) btn_rd[1].begin(abs(READGUY_btn2)-1,rd_btn_f,(READGUY_btn2>0));
|
||||||
if(READGUY_btn3) btn_rd[2].begin(abs(READGUY_btn3)-1,rd_btn_f,(READGUY_btn3>0));
|
if(READGUY_btn3) btn_rd[2].begin(abs(READGUY_btn3)-1,rd_btn_f,(READGUY_btn3>0));
|
||||||
|
//if(READGUY_buttons==1){
|
||||||
|
btn_rd[0].setLongRepeatMode(1); //允许连按
|
||||||
|
//}
|
||||||
if(READGUY_buttons==2){
|
if(READGUY_buttons==2){
|
||||||
btn_rd[0].setMultiBtn(1); //设置为多个按钮,不识别双击或三击
|
btn_rd[0].setMultiBtn(1); //设置为多个按钮,不识别双击或三击
|
||||||
btn_rd[0].setLongRepeatMode(1);
|
//btn_rd[0].setLongRepeatMode(1);
|
||||||
btn_rd[1].setMultiBtn(1); //设置为多个按钮,不识别双击或三击
|
btn_rd[1].setMultiBtn(1); //设置为多个按钮,不识别双击或三击
|
||||||
btn_rd[1].setLongRepeatMode(0);
|
btn_rd[1].setLongRepeatMode(0);
|
||||||
}
|
}
|
||||||
else if(READGUY_buttons==3){
|
else if(READGUY_buttons==3){
|
||||||
btn_rd[0].setLongPressMs(1); //不识别双击三击, 只有按一下或者长按, 并且开启连按
|
btn_rd[0].long_press_ms = 150; //不识别双击三击, 只有按一下或者长按, 并且开启连按
|
||||||
btn_rd[0].setLongRepeatMode(1);
|
//btn_rd[0].setLongRepeatMode(1);
|
||||||
btn_rd[1].setMultiBtn(1); //设置为多个按钮,不识别双击或三击
|
btn_rd[1].setMultiBtn(1); //设置为多个按钮,不识别双击或三击
|
||||||
btn_rd[1].setLongRepeatMode(0);
|
btn_rd[1].setLongRepeatMode(0);
|
||||||
btn_rd[2].setLongPressMs(1); //不识别双击三击, 只有按一下或者长按, 并且开启连按
|
btn_rd[2].long_press_ms = 1; //不识别双击三击, 只有按一下或者长按, 并且开启连按
|
||||||
btn_rd[2].setLongRepeatMode(1);
|
btn_rd[2].setLongRepeatMode(1);
|
||||||
}
|
}
|
||||||
#ifdef ESP8266 //对于esp8266, 需要注册到ticker. 这是因为没freertos.
|
#ifdef ESP8266 //对于esp8266, 需要注册到ticker. 这是因为没freertos.
|
||||||
@@ -380,7 +383,7 @@ void ReadguyDriver::display(uint8_t part){
|
|||||||
//in_release(); //恢复
|
//in_release(); //恢复
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void ReadguyDriver::display(const uint8_t *buf, uint8_t part){
|
void ReadguyDriver::displayBuffer(const uint8_t *buf, uint8_t part){
|
||||||
if(READGUY_cali==127){
|
if(READGUY_cali==127){
|
||||||
//in_press(); //暂停, 然后读取按键状态 spibz
|
//in_press(); //暂停, 然后读取按键状态 spibz
|
||||||
guy_dev->drv_fullpart(part&1);
|
guy_dev->drv_fullpart(part&1);
|
||||||
@@ -497,29 +500,47 @@ void ReadguyDriver::nvs_write(){
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint8_t ReadguyDriver::getBtn_impl(){ //按钮不可用, 返回0.
|
uint8_t ReadguyDriver::getBtn_impl(){ //按钮不可用, 返回0.
|
||||||
|
static uint32_t last=0;
|
||||||
uint8_t res1,res2,res3,res4=0;
|
uint8_t res1,res2,res3,res4=0;
|
||||||
switch(READGUY_buttons){
|
switch(READGUY_buttons){
|
||||||
case 1:
|
case 1:
|
||||||
res1=btn_rd[0].read();
|
res1=btn_rd[0].read();
|
||||||
if(res1 == 1) res4 |= 1; //点按
|
if(res1 == 1) res4 |= 1; //点按
|
||||||
else if(res1 == 2) res4 |= 2; //双击
|
else if(res1 == 2) res4 |= 4; //双击-确定
|
||||||
else if(res1 == 4) res4 |= 4; //长按-确定
|
|
||||||
else if(res1 == 3) res4 |= 8; //三击-返回
|
else if(res1 == 3) res4 |= 8; //三击-返回
|
||||||
|
else if(res1 == 4) res4 |= 2; //长按-向上翻页
|
||||||
|
else if(res1 == 5) res4 |= 3; //单击后长按-新增操作(可以连按)
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
res1=btn_rd[0].read(); //两个按钮引脚都读取
|
res1=btn_rd[0].read(); //两个按钮引脚都读取
|
||||||
res2=btn_rd[1].read();
|
res2=btn_rd[1].read();
|
||||||
if(res1 == 1) res4 |= 1; //左键点按-向下翻页
|
if(millis()-last>500){
|
||||||
else if(res1 == 4) res4 |= 2; //左键长按-向上翻页
|
if(res1 == 1) res4 |= 1; //左键点按-向下翻页
|
||||||
if(res2 == 1) res4 |= 4; //右键点按-确定
|
else if(res1 == 4) {
|
||||||
else if(res2 == 4) res4 |= 8; //右键长按-返回
|
res4 |= 2; //左键长按-向上翻页
|
||||||
|
//if(btn_rd[1].isPressedRaw()) res4 |= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(btn_rd[0].isPressedRaw() && res2){
|
||||||
|
res4 |= 3; //右键点按-确定
|
||||||
|
last=millis();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if(res2 == 1) res4 |= 4; //右键点按-确定
|
||||||
|
else if(res2 == 4) res4 |= 8; //右键长按-返回
|
||||||
|
}
|
||||||
|
if(res4==5 || res4==6) res4=3;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
res1=btn_rd[0].read();
|
res1=btn_rd[0].read();
|
||||||
res2=btn_rd[1].read();
|
res2=btn_rd[1].read();
|
||||||
res3=btn_rd[2].read();
|
res3=btn_rd[2].read();
|
||||||
if(res1 == 4) res4 |= 1;
|
if(res1 && millis()-last >= btn_rd[1].long_repeat_ms && (!btn_rd[2].isPressedRaw())) res4 |= 2;
|
||||||
if(res3 == 4) res4 |= 2;
|
if(res3) {
|
||||||
|
res4 |= ((btn_rd[0].isPressedRaw()<<1)|1);
|
||||||
|
last=millis();
|
||||||
|
}
|
||||||
|
//if(res3 && ((millis()-last)<btn_rd[0].long_repeat_ms)) res4 |=3;
|
||||||
if(res2 == 1) res4 |= 4;
|
if(res2 == 1) res4 |= 4;
|
||||||
else if(res2 == 4) res4 |= 8;
|
else if(res2 == 4) res4 |= 8;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -154,9 +154,10 @@ class ReadguyDriver: public LGFX_Sprite{ // readguy 基础类
|
|||||||
/** @brief 初始化readguy
|
/** @brief 初始化readguy
|
||||||
* @param WiFiSet 是否保持AP模式关闭. 0:配网完成自动关WiFi, 1:需要手动调用 WiFi.mode(WIFI_OFF) 关闭WiFi.
|
* @param WiFiSet 是否保持AP模式关闭. 0:配网完成自动关WiFi, 1:需要手动调用 WiFi.mode(WIFI_OFF) 关闭WiFi.
|
||||||
* 2:自动连接到已存的WiFi, 但不等待连接成功
|
* 2:自动连接到已存的WiFi, 但不等待连接成功
|
||||||
|
* @param initepd 是否初始化墨水屏. 初始化后的首次刷屏必为慢刷. 如果是不断电复位, 可以不初始化墨水屏直接刷屏
|
||||||
* @return SD卡是否就绪
|
* @return SD卡是否就绪
|
||||||
*/
|
*/
|
||||||
uint8_t init(uint8_t WiFiSet = 0,bool initepd = 1/* ,int g_width = 0,int g_height = 0 */);
|
uint8_t init(uint8_t WiFiSet = 0, bool initepd = 1);
|
||||||
/// @brief 设置显示亮度
|
/// @brief 设置显示亮度
|
||||||
void setBright(int d);
|
void setBright(int d);
|
||||||
/// @brief 返回显示亮度
|
/// @brief 返回显示亮度
|
||||||
@@ -164,7 +165,7 @@ class ReadguyDriver: public LGFX_Sprite{ // readguy 基础类
|
|||||||
/// @brief 刷新显示到屏幕上
|
/// @brief 刷新显示到屏幕上
|
||||||
void display(uint8_t part = READGUY_FAST);
|
void display(uint8_t part = READGUY_FAST);
|
||||||
/// @brief 刷新显示到屏幕上
|
/// @brief 刷新显示到屏幕上
|
||||||
void display(const uint8_t *buf, uint8_t part = READGUY_FAST);
|
void displayBuffer(const uint8_t *buf, uint8_t part);
|
||||||
/** @brief 刷新显示到屏幕上, 可以自定义读取指定位置像素的函数
|
/** @brief 刷新显示到屏幕上, 可以自定义读取指定位置像素的函数
|
||||||
* @param f 自定义的函数. 此函数将在读取像素并输出到墨水屏时被调用.
|
* @param f 自定义的函数. 此函数将在读取像素并输出到墨水屏时被调用.
|
||||||
* 每次调用需要返回 "参数对应位置" 的8个像素的颜色信息(凑成一字节). 其中左侧应在高位,右侧应在低位.
|
* 每次调用需要返回 "参数对应位置" 的8个像素的颜色信息(凑成一字节). 其中左侧应在高位,右侧应在低位.
|
||||||
@@ -179,7 +180,7 @@ class ReadguyDriver: public LGFX_Sprite{ // readguy 基础类
|
|||||||
* @endcode
|
* @endcode
|
||||||
* 该函数会将参数从0开始,每次逐渐增加1的顺序来被调用. 即先调用f(0),再f(1),f(2),f(3)... 以此类推.
|
* 该函数会将参数从0开始,每次逐渐增加1的顺序来被调用. 即先调用f(0),再f(1),f(2),f(3)... 以此类推.
|
||||||
*/
|
*/
|
||||||
void display(std::function<uint8_t(int)> f, uint8_t part = READGUY_FAST);
|
void display(std::function<uint8_t(int)> f, uint8_t part);
|
||||||
/// @brief 显示图片, 使用抖动算法. 可以用省内存的方法显示, 可以缩放到指定的宽度和高度
|
/// @brief 显示图片, 使用抖动算法. 可以用省内存的方法显示, 可以缩放到指定的宽度和高度
|
||||||
void drawImage(LGFX_Sprite &spr,uint16_t x,uint16_t y,uint16_t zoomw=0, uint16_t zoomh=0){
|
void drawImage(LGFX_Sprite &spr,uint16_t x,uint16_t y,uint16_t zoomw=0, uint16_t zoomh=0){
|
||||||
if(READGUY_cali==127) drawImage(*this,spr,x,y,zoomw,zoomh);
|
if(READGUY_cali==127) drawImage(*this,spr,x,y,zoomw,zoomh);
|
||||||
@@ -249,6 +250,8 @@ class ReadguyDriver: public LGFX_Sprite{ // readguy 基础类
|
|||||||
bool SDinside(bool check=true) { return check?setSDcardDriver():READGUY_sd_ok; };
|
bool SDinside(bool check=true) { return check?setSDcardDriver():READGUY_sd_ok; };
|
||||||
/// @brief 检查按钮. 当配置未完成时,按钮不可用, 返回0.
|
/// @brief 检查按钮. 当配置未完成时,按钮不可用, 返回0.
|
||||||
uint8_t getBtn() { return (READGUY_cali==127)?getBtn_impl():0; }
|
uint8_t getBtn() { return (READGUY_cali==127)?getBtn_impl():0; }
|
||||||
|
/// @brief 根据按钮ID来检查按钮. 注意这里如果按下返回0, 没按下或者按钮无效返回1
|
||||||
|
//uint8_t getBtn(unsigned int btnID){return btnID<getButtonsCount()?(!(btn_rd[0].isPressedRaw())):1;}
|
||||||
/** @brief 返回可用的文件系统. 当SD卡可用时, 返回SD卡. 否则根据情况返回最近的可用文件系统
|
/** @brief 返回可用的文件系统. 当SD卡可用时, 返回SD卡. 否则根据情况返回最近的可用文件系统
|
||||||
* @param initSD 2:总是重新初始化SD卡; 1:若SD卡不可用则初始化; 0:SD卡不可用则返回LittleFS. */
|
* @param initSD 2:总是重新初始化SD卡; 1:若SD卡不可用则初始化; 0:SD卡不可用则返回LittleFS. */
|
||||||
fs::FS &guyFS(uint8_t initSD = 0);
|
fs::FS &guyFS(uint8_t initSD = 0);
|
||||||
@@ -337,14 +340,18 @@ class ReadguyDriver: public LGFX_Sprite{ // readguy 基础类
|
|||||||
static uint8_t rd_btn_f(uint8_t btn);
|
static uint8_t rd_btn_f(uint8_t btn);
|
||||||
uint8_t getBtn_impl(); //按钮不可用, 返回0.
|
uint8_t getBtn_impl(); //按钮不可用, 返回0.
|
||||||
static void in_press(){ //SPI开始传输屏幕数据
|
static void in_press(){ //SPI开始传输屏幕数据
|
||||||
#ifndef ESP8266
|
#ifdef ESP8266
|
||||||
|
if(!spibz) SPI.beginTransaction(SPISettings(ESP8266_SPI_FREQUENCY, MSBFIRST, SPI_MODE0));
|
||||||
|
#else
|
||||||
if(!spibz) epd_spi->beginTransaction(SPISettings(ESP32_DISP_FREQUENCY, MSBFIRST, SPI_MODE0));
|
if(!spibz) epd_spi->beginTransaction(SPISettings(ESP32_DISP_FREQUENCY, MSBFIRST, SPI_MODE0));
|
||||||
#endif
|
#endif
|
||||||
spibz ++;
|
spibz ++;
|
||||||
}
|
}
|
||||||
static void in_release(){//SPI结束传输屏幕数据
|
static void in_release(){//SPI结束传输屏幕数据
|
||||||
spibz --;
|
spibz --;
|
||||||
#ifndef ESP8266
|
#ifdef ESP8266
|
||||||
|
if(!spibz) SPI.endTransaction();
|
||||||
|
#else
|
||||||
if(!spibz) epd_spi->endTransaction();
|
if(!spibz) epd_spi->endTransaction();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -377,8 +384,15 @@ class ReadguyDriver: public LGFX_Sprite{ // readguy 基础类
|
|||||||
//constexpr int memHeight () const { return guy_height ; } //返回显存高度(不是画幅高度),不会随着画布旋转改变
|
//constexpr int memHeight () const { return guy_height ; } //返回显存高度(不是画幅高度),不会随着画布旋转改变
|
||||||
int drvWidth () const { return READGUY_cali==127?guy_dev->drv_width():0; } //返回显示屏硬件宽度(不是画幅宽度)
|
int drvWidth () const { return READGUY_cali==127?guy_dev->drv_width():0; } //返回显示屏硬件宽度(不是画幅宽度)
|
||||||
int drvHeight() const { return READGUY_cali==127?guy_dev->drv_height():0; } //返回显示屏硬件高度(不是画幅高度)
|
int drvHeight() const { return READGUY_cali==127?guy_dev->drv_height():0; } //返回显示屏硬件高度(不是画幅高度)
|
||||||
int width () const { return (getRotation()&1)?drvHeight():drvWidth(); }
|
//int width () const { return (getRotation()&1)?drvHeight():drvWidth(); }
|
||||||
int height() const { return (getRotation()&1)?drvWidth():drvHeight(); }
|
//int height() const { return (getRotation()&1)?drvWidth():drvHeight(); }
|
||||||
|
size_t getFreeMem() const { return
|
||||||
|
#ifdef ESP8266
|
||||||
|
ESP.getFreeHeap();
|
||||||
|
#else
|
||||||
|
esp_get_free_heap_size();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
// private:
|
// private:
|
||||||
void implBeginTransfer() { guy_dev->BeginTransfer(); } //此函数用于开启SPI传输, 只能在自定义刷屏函数中使用!!
|
void implBeginTransfer() { guy_dev->BeginTransfer(); } //此函数用于开启SPI传输, 只能在自定义刷屏函数中使用!!
|
||||||
void implEndTransfer() { guy_dev->EndTransfer(); } //此函数用于开启SPI传输, 只能在自定义刷屏函数中使用!!
|
void implEndTransfer() { guy_dev->EndTransfer(); } //此函数用于开启SPI传输, 只能在自定义刷屏函数中使用!!
|
||||||
|
|||||||
Reference in New Issue
Block a user