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传输, 只能在自定义刷屏函数中使用!!