diff --git a/CHANGELOG.md b/CHANGELOG.md
index ba76dc6..c9153a8 100644
--- a/CHANGELOG.md
+++ b/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
1. 增加了分步绘制的支持. 可以使用 READGUY_FAST_START 等绘制选项来控制绘制过程:
diff --git a/README.md b/README.md
index 5aa0be1..b0b23f3 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
-**版本1.3.1正式发布!欢迎分享、star和fork~** 上面的图是项目看板娘, 盖. 可爱的盖姐在等你哟~
+**版本1.3.2正式发布!欢迎分享、star和fork~** 上面的图是项目看板娘, 盖. 可爱的盖姐在等你哟~
欢迎克隆, 项目交流QQ群: 926824162 (萌新可以进来问问题的哟), 项目的 Bilibili 主页: [BV1f94y187wz](https://www.bilibili.com/video/BV1f94y187wz/) 记得三连+关注我这个宝藏up主哦~
diff --git a/library.json b/library.json
index 5f5635b..be1a4cd 100644
--- a/library.json
+++ b/library.json
@@ -11,7 +11,7 @@
"type": "git",
"url": "https://github.com/fsender/readguy"
},
- "version": "1.3.1",
+ "version": "1.3.2",
"frameworks": "arduino",
"platforms": ["espressif32", "espressif8266"],
"headers": "readguy.h",
diff --git a/library.properties b/library.properties
index af05a19..9fd2d9a 100644
--- a/library.properties
+++ b/library.properties
@@ -1,5 +1,5 @@
name=readguy
-version=1.3.1
+version=1.3.2
author=fsender
maintainer=fsender
sentence=A free E-paper display driver library supports 16-level greyscale.
diff --git a/src/guy_button.cpp b/src/guy_button.cpp
index acae506..451775a 100644
--- a/src/guy_button.cpp
+++ b/src/guy_button.cpp
@@ -78,11 +78,18 @@ void guy_button::begin(uint8_t _pin, std_U8_function_U8 f, bool activeLow /* = t
state = get_state_cb(pin);
min_debounce =25; //去抖时间
long_press_ms =300; //长按持续时间+双击识别间隔最大时间
- long_repeat_ms =150; //长按连按间隔时间
+ long_repeat_ms =200; //长按连按间隔时间
multibtn =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不能在此触发
int mi=millis();
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){
long_clicked = trig_mode?(n+long_repeat_ms):0xfffffffful;
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;
last_click_type = GUYBUTTON_empty;
was_pressed = false;
lk=0;
- return (res==GUYBUTTON_long_click)?GUYBUTTON_empty:res;
+ return (res>=GUYBUTTON_long_click)?GUYBUTTON_empty:res;
}
void guy_button::loop() {
@@ -140,8 +148,9 @@ void guy_button::loop() {
// was there a longclick?
if (longclick_detected) {
// was it part of a combination?
- if (click_count == 1) {
- last_click_type = GUYBUTTON_long_click;
+ if (click_count) {
+ last_click_type = (click_count>=3)?GUYBUTTON_xxlong_click:\
+ ((click_count==2)?GUYBUTTON_xlong_click:GUYBUTTON_long_click);
was_pressed = true;
}
longclick_detected = false;
diff --git a/src/guy_button.h b/src/guy_button.h
index 3dae40f..91fb89b 100644
--- a/src/guy_button.h
+++ b/src/guy_button.h
@@ -76,14 +76,17 @@ SOFTWARE.
#define GUYBUTTON_double_click 2
#define GUYBUTTON_triple_click 3
#define GUYBUTTON_long_click 4
+#define GUYBUTTON_xlong_click 5
+#define GUYBUTTON_xxlong_click 6
#define GUYBTN_READ_TIMEOUT 100
#define GUYBTN_LOOP_TIMEOUT 10
class guy_button{
- protected:
+ public:
uint16_t min_debounce ; //去抖时间
uint16_t long_press_ms ; //长按持续时间+双击识别间隔最大时间
uint16_t long_repeat_ms ; //长按连按间隔时间
+ protected:
uint8_t pin = 255; //未定义引脚
uint8_t state;
uint8_t prev_state;
@@ -114,16 +117,19 @@ class guy_button{
void setLongRepeatMode(bool trigMode) { trig_mode = trigMode; }
unsigned int wasPressedFor() const { return down_time_ms; }
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; }
uint8_t getNumberOfClicks() const{ return click_count;}
uint8_t getType() const { return last_click_type; }
uint8_t read();
void loop();
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 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. */
\ No newline at end of file
diff --git a/src/guy_epaper/lcdDebug/lcdDebug.cpp b/src/guy_epaper/lcdDebug/lcdDebug.cpp
index 6312b93..dda12be 100644
--- a/src/guy_epaper/lcdDebug/lcdDebug.cpp
+++ b/src/guy_epaper/lcdDebug/lcdDebug.cpp
@@ -41,8 +41,7 @@ void drv::drv_fullpart(bool part){
partMode=part;
}
void drv::drv_dispWriter(std::function f,uint8_t m){ //单色刷新
- if(m&1){//stage 1
- if(lastRefresh) drv_dispWriter(f,2);
+ if(!(m&1)) return; //stage 1
uint16_t dat[8];
unsigned short xbits=(drv_width()+7)/8;
if(partMode==0){
@@ -82,13 +81,6 @@ void drv::drv_dispWriter(std::function 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() {}
}
diff --git a/src/guy_version.h b/src/guy_version.h
index 1b5193d..d4f8207 100644
--- a/src/guy_version.h
+++ b/src/guy_version.h
@@ -6,7 +6,7 @@
* @file guy_version.h
* @author FriendshipEnder (f_ender@163.com), Bilibili: FriendshipEnder
* @brief readguy 版本控制文件.
- * @version 1.0
+ * @version 1.3.2
* @date 2023-09-21
* @attention
@@ -41,9 +41,9 @@
//另外, 在提交新版本之前, 不要忘记在github上创建release, 否则Arduino IDE会读不到
#define READGUY_V_MAJOR 1
#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 "1.3.1"
+#define READGUY_VERSION "1.3.2"
#ifdef ESP8266
#define _READGUY_PLATFORM "ESP8266"
diff --git a/src/guy_wireless.cpp b/src/guy_wireless.cpp
index 968cf41..da530c7 100644
--- a/src/guy_wireless.cpp
+++ b/src/guy_wireless.cpp
@@ -645,7 +645,7 @@ const PROGMEM char ReadguyDriver::verify2_html[] =
"al\" method=\"POST\">"
-"点按: 下一个/向下翻页
双击: 上一个/向上翻页
三连击: 返回/切换输入法
长按: 确定/选择",
+"点按: 下一个/向下翻页
双击: 确定/选择
三连击: 返回/切换输入法
长按: 上一个/向上翻页",
"两个按键, 操作可以满足需求.
"
"按键1点按: 下一个/向下翻页
按键1长按: 上一个/向上翻页
按键2点按: 确定/选择
按键2长按: 返回/切换输入法",
"三个按键, 操作非常流畅.
"
diff --git a/src/readguy.cpp b/src/readguy.cpp
index 53d3786..99230dd 100644
--- a/src/readguy.cpp
+++ b/src/readguy.cpp
@@ -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_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_buttons==1){
+ btn_rd[0].setLongRepeatMode(1); //允许连按
+ //}
if(READGUY_buttons==2){
btn_rd[0].setMultiBtn(1); //设置为多个按钮,不识别双击或三击
- btn_rd[0].setLongRepeatMode(1);
+ //btn_rd[0].setLongRepeatMode(1);
btn_rd[1].setMultiBtn(1); //设置为多个按钮,不识别双击或三击
btn_rd[1].setLongRepeatMode(0);
}
else if(READGUY_buttons==3){
- btn_rd[0].setLongPressMs(1); //不识别双击三击, 只有按一下或者长按, 并且开启连按
- btn_rd[0].setLongRepeatMode(1);
+ btn_rd[0].long_press_ms = 150; //不识别双击三击, 只有按一下或者长按, 并且开启连按
+ //btn_rd[0].setLongRepeatMode(1);
btn_rd[1].setMultiBtn(1); //设置为多个按钮,不识别双击或三击
btn_rd[1].setLongRepeatMode(0);
- btn_rd[2].setLongPressMs(1); //不识别双击三击, 只有按一下或者长按, 并且开启连按
+ btn_rd[2].long_press_ms = 1; //不识别双击三击, 只有按一下或者长按, 并且开启连按
btn_rd[2].setLongRepeatMode(1);
}
#ifdef ESP8266 //对于esp8266, 需要注册到ticker. 这是因为没freertos.
@@ -497,29 +500,47 @@ void ReadguyDriver::nvs_write(){
#endif
uint8_t ReadguyDriver::getBtn_impl(){ //按钮不可用, 返回0.
+ static uint32_t last=0;
uint8_t res1,res2,res3,res4=0;
switch(READGUY_buttons){
case 1:
res1=btn_rd[0].read();
if(res1 == 1) res4 |= 1; //点按
- else if(res1 == 2) res4 |= 2; //双击
- else if(res1 == 4) res4 |= 4; //长按-确定
+ else if(res1 == 2) res4 |= 4; //双击-确定
else if(res1 == 3) res4 |= 8; //三击-返回
+ else if(res1 == 4) res4 |= 2; //长按-向上翻页
+ else if(res1 == 5) res4 |= 3; //单击后长按-新增操作(可以连按)
break;
case 2:
res1=btn_rd[0].read(); //两个按钮引脚都读取
res2=btn_rd[1].read();
- if(res1 == 1) res4 |= 1; //左键点按-向下翻页
- else if(res1 == 4) res4 |= 2; //左键长按-向上翻页
- if(res2 == 1) res4 |= 4; //右键点按-确定
- else if(res2 == 4) res4 |= 8; //右键长按-返回
+ if(millis()-last>500){
+ if(res1 == 1) res4 |= 1; //左键点按-向下翻页
+ else if(res1 == 4) {
+ 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;
case 3:
res1=btn_rd[0].read();
res2=btn_rd[1].read();
res3=btn_rd[2].read();
- if(res1 == 4) res4 |= 1;
- if(res3 == 4) res4 |= 2;
+ if(res1 && millis()-last >= btn_rd[1].long_repeat_ms && (!btn_rd[2].isPressedRaw())) res4 |= 2;
+ if(res3) {
+ res4 |= ((btn_rd[0].isPressedRaw()<<1)|1);
+ last=millis();
+ }
+ //if(res3 && ((millis()-last)drv_height():0; } //返回显示屏硬件高度(不是画幅高度)
//int width () const { return (getRotation()&1)?drvHeight():drvWidth(); }
//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:
void implBeginTransfer() { guy_dev->BeginTransfer(); } //此函数用于开启SPI传输, 只能在自定义刷屏函数中使用!!
void implEndTransfer() { guy_dev->EndTransfer(); } //此函数用于开启SPI传输, 只能在自定义刷屏函数中使用!!