forked from xiaozhi/xiaozhi-esp32
增加无名科技星智铝合金 wifi版本 的board支持 (#1352)
* 增加无名科技星智铝合金 wifi版本 的board支持 * 删除多余头文件 * 星智铝合金:触摸单击时间改为200ms --------- Co-authored-by: Limh2017 <wenwen19115>
This commit is contained in:
90
main/boards/xingzhi-metal-1.54-wifi/cst816x.h
Normal file
90
main/boards/xingzhi-metal-1.54-wifi/cst816x.h
Normal file
@@ -0,0 +1,90 @@
|
||||
#ifndef _CST816X_H_
|
||||
#define _CST816X_H_
|
||||
|
||||
#include "esp_log.h"
|
||||
#include "esp_err.h"
|
||||
#include "driver/i2c.h"
|
||||
#include "i2c_device.h"
|
||||
#include <driver/i2c_master.h>
|
||||
#include <sys/time.h>
|
||||
#include <array>
|
||||
|
||||
#define ES8311_VOL_MIN 0
|
||||
#define ES8311_VOL_MAX 100
|
||||
|
||||
enum class TouchEventType {
|
||||
SINGLE_CLICK, // 单击事件
|
||||
DOUBLE_CLICK, // 双击事件
|
||||
LONG_PRESS_START,// 长按开始事件
|
||||
LONG_PRESS_END // 长按结束事件
|
||||
};
|
||||
|
||||
struct TouchEvent {
|
||||
TouchEventType type;
|
||||
int x;
|
||||
int y;
|
||||
};
|
||||
|
||||
class Cst816x : public I2cDevice {
|
||||
private:
|
||||
struct TouchPoint_t {
|
||||
int num = 0;
|
||||
int x = -1;
|
||||
int y = -1;
|
||||
};
|
||||
|
||||
struct TouchThresholdConfig {
|
||||
int x; // 目标X坐标
|
||||
int y; // 目标Y坐标
|
||||
int64_t single_click_thresh_us; // 单击最大时长(us)
|
||||
int64_t double_click_window_us; // 双击窗口(us)
|
||||
int64_t long_press_thresh_us; // 长按阈值(us)
|
||||
};
|
||||
|
||||
const TouchThresholdConfig DEFAULT_THRESHOLD = {
|
||||
.x = -1, .y = -1,
|
||||
.single_click_thresh_us = 120000, // 150ms
|
||||
.double_click_window_us = 240000, // 150ms
|
||||
.long_press_thresh_us = 4000000 // 4000ms
|
||||
};
|
||||
|
||||
const std::array<TouchThresholdConfig, 3> TOUCH_THRESHOLD_TABLE = {
|
||||
{
|
||||
{20, 600, 200000, 240000, 2000000}, // 音量+
|
||||
{40, 600, 200000, 240000, 4000000}, // boot按键
|
||||
{60, 600, 200000, 240000, 2000000} // 音量-
|
||||
}
|
||||
};
|
||||
|
||||
const TouchThresholdConfig& getThresholdConfig(int x, int y);
|
||||
|
||||
uint8_t* read_buffer_ = nullptr;
|
||||
TouchPoint_t tp_;
|
||||
|
||||
bool is_touching_ = false;
|
||||
int64_t touch_start_time_ = 0; // 触摸开始时间(us)
|
||||
int64_t last_release_time_ = 0; // 上次释放时间(us)
|
||||
int click_count_ = 0; // 单击计数(双击检测用)
|
||||
bool long_press_started_ = false; // 长按是否已触发
|
||||
|
||||
bool is_volume_long_pressing_ = false; // 是否处于音量长按调整中
|
||||
int volume_long_press_dir_ = 0; // 调整方向:1=递增,-1=递减
|
||||
int64_t last_volume_adjust_time_ = 0; // 上次调整音量的时间(us)
|
||||
const int64_t VOL_ADJ_INTERVAL_US = 200000; // 音量调整间隔(100ms)
|
||||
const int VOL_ADJ_STEP = 5; // 每次调整步长
|
||||
|
||||
int64_t getCurrentTimeUs();
|
||||
|
||||
public:
|
||||
Cst816x(i2c_master_bus_handle_t i2c_bus, uint8_t addr);
|
||||
~Cst816x();
|
||||
|
||||
void InitCst816d();
|
||||
void UpdateTouchPoint();
|
||||
void resetTouchCounters();
|
||||
static void touchpad_daemon(void* param);
|
||||
|
||||
const TouchPoint_t& GetTouchPoint() { return tp_; }
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user