ver 1.3.6 buttons driver update

This commit is contained in:
fsender
2024-03-11 21:54:20 +08:00
parent 7bb2ba77f0
commit 558b847a3d
12 changed files with 60 additions and 51 deletions

View File

@@ -1,3 +1,9 @@
## Release 1.3.6 - 2024/3/11
1. 按键功能: 正式更新特殊操作按法, 此按法可用于切换输入法或菜单定位等功能. 同时更新ex03演示, 演示更清晰.
2. 修复其他bug, 比如示例wifi-text-show中, 中文网页无法在windows系统上呈现等...
## Release 1.3.5 - 2024/3/4
1. 2024/2/25更新: 修复了按键bug, 双按键有时候识别不灵, 三按键不支持移植到拨轮硬件操作, 现在全修好了

View File

@@ -4,7 +4,7 @@
<img src="extra/artset/readguy_theme3.png" width="30%" height="auto">
**版本1.3.5正式发布欢迎分享、star和fork~** 上面的图是项目看板娘, 盖. 可爱的盖姐在等你哟~
**版本1.3.6正式发布欢迎分享、star和fork~** 上面的图是项目看板娘, 盖. 可爱的盖姐在等你哟~
**即将发布7个全新的屏幕驱动: 欢迎支持! (详见后面的驱动表格)**

View File

@@ -6,10 +6,15 @@
*
* @file ex03_buttons.ino
* @author FriendshipEnder (f_ender@163.com), Bilibili: FriendshipEnder
* @version 1.1 增加了新的手势功能
* @version 1.2 增加了新的手势功能
*
* @date created: 2023-10-20 last modify: 2024-02-25
* @date created: 2023-10-20 modify: 2024-02-25 last modify: 2024-03-11
* @brief ReadGuy 按键功能演示. ReadGuy自带的按键驱动程序是非常好用的
以下内容为按键个数与手势操作的对应关系.
//行为 下一个 上一个 确定 返回/退出 特殊操作(如切换输入法)
//1个按键 返回 1=点按 2=双击 4=长按 8=三击 3=点按后接长按
//2个按键 返回 1=左键点按 2=左键长按 4=右键点按 8=右键长按 3=按住左键点按右键
//3个按键 返回 1=右键点按 2=左键点按 4=中键点按 8=中键长按 3=中间按键双击(需手动开启)
* @attention
* Copyright (c) 2022-2023 FriendshipEnder
@@ -44,38 +49,36 @@ void setup(){
Serial.println(F("[readguy] Button demo")); //显示文本 默认是不支持中文显示的.
guy.println("Button demo"); //显示文本 默认是不支持中文显示的.
guy.display();//刷新墨水屏.
guy.setButtonSpecial(true);//对于三按键系统,打开此模式将会允许双击进行特殊操作(如切换键盘)
}
void loop(){
int val = guy.getBtn(); //此函数用于获取按键状态 没有按键按下时 返回0.
//1个按键 返回 1=点按 2=双击 3=长按 4=三击
//2个按键 返回 1=左键点按 2=左键长按 3=右键点按 4=右键长按
//3个按键 返回 1=左键点按 2=右键点按 3=中键点按 4=中键长按
if(val>0){
int c = guy.getButtonsCount(); //此函数用于返回设备有多少个按键. [最近更新的函数]
switch (val){
case 1:
case 1: //下一个 手势
if(c==1) guy.println("key single clicked!");
else if(c==2) guy.println("Left key clicked!");
else if(c==3) guy.println("Left key clicked!");
break;
case 2:
if(c==1) guy.println("key double clicked!");
else if(c==2) guy.println("Left key long pressed!");
else if(c==3) guy.println("Right key clicked!");
break;
case 3:
if(c==1) guy.println("key triple clicked!");
case 2: //上一个 手势
if(c==1) guy.println("key long pressed!");
else if(c==2) guy.println("Left key long pressed!");
else if(c==3) guy.println("Left key clicked!");
break;
case 3: //特殊 手势
if(c==1) guy.println("key clicked and pressed!");
else if(c==2) guy.println("Right clicked at left pressing!");
else if(c==3) guy.println("Centre key double clicked!");
break;
case 4:
if(c==1) guy.println("key long pressed!");
case 4: //确定 手势
if(c==1) guy.println("key double clicked!");
else if(c==2) guy.println("Right key clicked!");
else if(c==3) guy.println("Centre key clicked!");
break;
case 8:
case 8: //返回 手势
if(c==1) guy.println("key triple clicked!");
else if(c==2) guy.println("Right key long pressed!");
else if(c==3) guy.println("Centre key long pressed!");

View File

@@ -51,9 +51,9 @@ typedef ReadguyDriver::ReadguyWebServer* server_t; //类型名太长太繁琐,
typedef ReadguyDriver::serveFunc event_t ; //存储一个WiFi功能事件.
const PROGMEM char textShowHtml[]= R"EOF(<!DOCTYPE html>
<html lang=\"zh-cn\">
<html lang="zh-cn">
<head>
<meta charset=\"utf-8\">
<meta charset="utf-8">
<title>WiFi传文字</title>
</head>
<body>

View File

@@ -11,7 +11,7 @@
"type": "git",
"url": "https://github.com/fsender/readguy"
},
"version": "1.3.5",
"version": "1.3.6",
"frameworks": "arduino",
"platforms": ["espressif32", "espressif8266"],
"headers": "readguy.h",
@@ -19,7 +19,7 @@
"libArchive": false
},
"license": "Apache-2.0",
"homepage": "b站视频",
"homepage": "https://www.bilibili.com/video/BV1f94y187wz/",
"dependencies": {
"name": "lovyan03/LovyanGFX",
"version": ">=1.1.9"

View File

@@ -1,5 +1,5 @@
name=readguy
version=1.3.5
version=1.3.6
author=fsender <f_ender@163.com>
maintainer=fsender <f_ender@163.com>
sentence=A free E-paper display driver library supports 16-level greyscale.

View File

@@ -79,7 +79,7 @@ void guy_button::begin(uint8_t _pin, std_U8_function_U8 f, bool activeLow /* = t
min_debounce =25; //去抖时间
long_press_ms =300; //长按持续时间+双击识别间隔最大时间
long_repeat_ms =200; //长按连按间隔时间
multibtn =0;
scanDT =1; // =1识别双击或三击, =0则不识别双击或三击等需要延时返回的情况
lk=0;
}
bool guy_button::isPressedRaw() {
@@ -144,7 +144,7 @@ void guy_button::loop() {
longclick_detected = true;
}
// is the button released and the time has passed for multiple clicks?
} else if (now - click_ms > (multibtn?min_debounce:long_press_ms)) {
} else if (now - click_ms > (scanDT?long_press_ms:min_debounce)) {
// was there a longclick?
if (longclick_detected) {
// was it part of a combination?
@@ -157,17 +157,14 @@ void guy_button::loop() {
// determine the number of single clicks
} else if (click_count > 0) {
if(scanDT){
switch (click_count) {
case 1:
last_click_type = GUYBUTTON_single_click;
break;
case 2:
last_click_type = GUYBUTTON_double_click;
break;
case 3:
last_click_type = GUYBUTTON_triple_click;
break;
case 1: last_click_type = GUYBUTTON_single_click; break;
case 2: last_click_type = GUYBUTTON_double_click; break;
case 3: last_click_type = GUYBUTTON_triple_click;
}
}
else last_click_type = GUYBUTTON_single_click; //此时若click_count>1 视为抖动
was_pressed = true;
}
// clean up

View File

@@ -92,7 +92,7 @@ class guy_button{
uint8_t prev_state;
uint8_t click_count = 0;
uint8_t _pressedState;
uint8_t multibtn; //是否为多个按钮, 可自己设置
uint8_t scanDT; //是否为多个按钮, 可自己设置
uint8_t last_click_type = GUYBUTTON_empty;
volatile uint8_t lk = 255;
//int id;
@@ -123,7 +123,7 @@ class guy_button{
uint8_t getType() const { return last_click_type; }
uint8_t read();
void loop();
void setMultiBtn(uint8_t btns) { multibtn = btns; }
void enScanDT(uint8_t scan) { scanDT = scan; }
/* void setMinDebounce(short n) { min_debounce =n;} //去抖时间
void setLongPressMs(short n) { long_press_ms =n;} //长按持续时间+双击识别间隔最大时间
void setLongRepeat(short n) { long_repeat_ms =n;} //长按连按间隔时间

View File

@@ -41,9 +41,9 @@
//另外, 在提交新版本之前, 不要忘记在github上创建release, 否则Arduino IDE会读不到
#define READGUY_V_MAJOR 1
#define READGUY_V_MINOR 3
#define READGUY_V_PATCH 5
#define READGUY_V_PATCH 6
#define READGUY_VERSION_VAL (READGUY_V_MAJOR*1000+READGUY_V_MINOR*100+READGUY_V_PATCH*10)
#define READGUY_VERSION "1.3.5"
#define READGUY_VERSION "1.3.6"
#ifdef ESP8266
#define _READGUY_PLATFORM "ESP8266"

View File

@@ -516,6 +516,7 @@ void ReadguyDriver::handlePinSetup(){
#if defined(ESP8266)
for(int i=2;i<12;i++){
if(i>=6 && i<=8) continue;
s += F("<br/>");
#else
for(int i=0;i<12;i++){
s += F("<br/>");
@@ -711,13 +712,13 @@ const PROGMEM char ReadguyDriver::verify_html[] =
const PROGMEM char ReadguyDriver::verify2_html[] =
"<br/><hr/>完成上述4个操作之后屏幕上将会展现出验证码,输入验证码即可完成硬件配置.<br/></p><form action=\"/fin"
"al\" method=\"POST\"><input type=\'text\' name=\'t_verify\' maxlength=\"6";
const PROGMEM char ReadguyDriver::verifybtn_html[3][200] = {
"一个按键, 操作可能比较繁琐, 但功能还都可以的.<br/>"
"点按: 下一个/向下翻页<br/>双击: 确定/选择<br/>三连击: 返回/切换输入法<br/>长按: 上一个/向上翻页",
const PROGMEM char ReadguyDriver::verifybtn_html[3][224] = {
"一个按键, 功能全保留, 操作可能比较繁琐.<br/>"
"点按:下一个/向下翻页<br/>双击:确定/选择<br/>三连击:返回/退格<br/>长按半秒:上一个/向上翻页<br/>点按紧接着长按: 特殊操作",
"两个按键, 操作可以满足需求.<br/>"
"按键1点按: 下一个/向下翻页<br/>按键1长按: 上一个/向上翻页<br/>按键2点按: 确定/选择<br/>按键2长按: 返回/切换输入法",
"三个按键, 操作非常流畅.<br/>"
"按键1: 上一个/向上翻页<br/>按键2点按: 确定/选择<br/>按键2长按: 返回/切换输入法<br/>按键3: 下一个/向下翻页"
"按键1点按:下一个/向下翻页<br/>按键1长按:上一个/向上翻页<br/>按键2点按:确定/选择<br/>按键2长按:返回/退格<br/>按住按键1点按2:特殊操作",
"三个按键, 操作非常方便流畅.<br/>"
"按键1:上一个/向上翻页<br/>按键2点按:确定/选择<br/>按键2长按: 返回/退格<br/>按键3:下一个/向下翻页<br/>双击点按2:切换输入法等特殊操作"
};
const PROGMEM char ReadguyDriver::final_html[] =
"欢迎使用 readguy</title></head><body><h1>readguy ";

View File

@@ -7,7 +7,7 @@
* @author FriendshipEnder (f_ender@163.com), Bilibili: FriendshipEnder
* @brief readguy 基础功能源代码文件.
* @version 1.0
* @date 2023-09-21
* @date created: 2023-09-21 last modify: 2024-03-11
* @attention
* Copyright (c) 2022-2023 FriendshipEnder
@@ -408,15 +408,15 @@ void ReadguyDriver::setButtonDriver(){
btn_rd[0].setLongRepeatMode(1); //允许连按
//}
if(READGUY_buttons==2){
btn_rd[0].setMultiBtn(1); //设置为多个按钮,不识别双击或三击
btn_rd[0].enScanDT(0); //不识别双击或三击
//btn_rd[0].setLongRepeatMode(1); //双按键 选择按键 设置为允许连按
btn_rd[1].setMultiBtn(1); //设置为多个按钮,不识别双击或三击
btn_rd[1].enScanDT(0); //不识别双击或三击
btn_rd[1].setLongRepeatMode(0); //双按键 确定按键 设置为不允许连按
}
else if(READGUY_buttons==3){
btn_rd[0].long_press_ms = 20; //不识别双击三击, 只有按一下或者长按, 并且开启连按
//btn_rd[0].setLongRepeatMode(1);
//btn_rd[1].setMultiBtn(1); //设置为多个按钮,不识别双击或三击 2024/2/25更新:需要支持连按适配拨轮
btn_rd[1].enScanDT(0); //不识别双击或三击(默认) 2024/2/25更新:需要支持连按适配拨轮
btn_rd[1].setLongRepeatMode(0); //三按键 确定按键 设置为不允许连按
btn_rd[2].long_press_ms = 20; //不识别双击三击, 只有按一下或者长按, 并且开启连按
btn_rd[2].setLongRepeatMode(1);
@@ -434,7 +434,7 @@ void ReadguyDriver::setButtonDriver(){
btn_rd[0].setLongPressMs(1); //不识别双击三击, 只有按一下或者长按, 并且开启连按
btn_rd[0].begin(33,rd_btn_f);
btn_rd[0].setLongRepeatMode(1);
btn_rd[1].setMultiBtn(1); //设置为多个按钮,不识别双击或三击
btn_rd[1].enScanDT(1); //设置为多个按钮,不识别双击或三击
btn_rd[1].begin(32,rd_btn_f);
btn_rd[1].setLongRepeatMode(0);
btn_rd[2].setLongPressMs(1); //不识别双击三击, 只有按一下或者长按, 并且开启连按

View File

@@ -283,6 +283,8 @@ class ReadguyDriver: public LGFX_Sprite{ // readguy 基础类
uint8_t getBtn() { return (READGUY_cali==127)?getBtn_impl():0; }
/// @brief [此函数已弃用 非常不建议使用] 根据按钮ID来检查按钮. 注意这里如果按下返回0, 没按下或者按钮无效返回1
//uint8_t getBtn(int btnID){return btnID<getButtonsCount()?(!(btn_rd[btnID].isPressedRaw())):1;}
void setButtonSpecial(bool en = 1) { if(READGUY_buttons==3) btn_rd[1].enScanDT(en); }
/** @brief 返回可用的文件系统. 当SD卡可用时, 返回SD卡. 否则根据情况返回最近的可用文件系统
* @param initSD 2:总是重新初始化SD卡; 1:若SD卡不可用则初始化; 0:SD卡不可用则返回LittleFS. */
fs::FS &guyFS(uint8_t initSD = 0);
@@ -359,7 +361,7 @@ class ReadguyDriver: public LGFX_Sprite{ // readguy 基础类
static const PROGMEM char index_cn_html16[];
static const PROGMEM char verify_html[];
static const PROGMEM char verify2_html[];
static const PROGMEM char verifybtn_html[3][200];
static const PROGMEM char verifybtn_html[3][224];
static const PROGMEM char final_html[];
static const PROGMEM char afterConfig_html[];
static const PROGMEM char home_html[];