forked from xiaozhi/xiaozhi-esp32
* 增加无名科技星智铝合金 wifi版本 的board支持 * 删除多余头文件 * 星智铝合金:触摸单击时间改为200ms --------- Co-authored-by: Limh2017 <wenwen19115>
90 lines
2.7 KiB
C++
90 lines
2.7 KiB
C++
#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 |