mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
201 lines
9.5 KiB
C
201 lines
9.5 KiB
C
/*
|
|
* SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "touch_element/touch_element.h"
|
|
#include "touch_element/touch_button.h"
|
|
#include "touch_element/touch_slider.h"
|
|
#include "touch_element/touch_matrix.h"
|
|
#include "esp_pm.h"
|
|
#include "sdkconfig.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define TE_TAG "Touch Element"
|
|
#define TE_DEBUG_TAG "Touch Element Debug"
|
|
#define TE_UNUSED(arg) (void)arg
|
|
|
|
#define TE_CHECK(cond, ret_val) ({ \
|
|
if (!(cond)) { \
|
|
ESP_LOGE(TE_TAG, "%s(%d)", __FUNCTION__, __LINE__); \
|
|
return (ret_val); \
|
|
} \
|
|
})
|
|
|
|
#define TE_CHECK_GOTO(cond, label) ({ \
|
|
if (!(cond)) { \
|
|
goto label; \
|
|
} \
|
|
})
|
|
|
|
#define TE_FREE_AND_NULL(ptr) ({ \
|
|
free(ptr); \
|
|
(ptr) = NULL; \
|
|
})
|
|
|
|
#define TE_DEFAULT_THRESHOLD_DIVIDER(obj) ((obj)->global_config->threshold_divider)
|
|
#define TE_DEFAULT_LONGPRESS_TIME(obj) ((obj)->global_config->default_lp_time)
|
|
|
|
typedef enum {
|
|
TE_STATE_IDLE = 0,
|
|
TE_STATE_PRESS,
|
|
TE_STATE_RELEASE,
|
|
} te_state_t;
|
|
|
|
typedef te_state_t te_dev_state_t;
|
|
typedef touch_elem_type_t te_dev_type_t;
|
|
|
|
typedef struct {
|
|
float sens; //!< Touch channel sensitivity
|
|
touch_pad_t channel; //!< Touch channel number(index)
|
|
te_dev_type_t type; //!< Touch channel type TODO: need to refactor as te_class_type_t
|
|
te_dev_state_t state; //!< Touch channel current state
|
|
bool is_use_last_threshold;
|
|
} te_dev_t;
|
|
|
|
typedef enum {
|
|
TE_CLS_TYPE_BUTTON = 0,
|
|
TE_CLS_TYPE_SLIDER,
|
|
TE_CLS_TYPE_MATRIX,
|
|
TE_CLS_TYPE_MAX //TODO: add waterproof class
|
|
} te_class_type_t;
|
|
|
|
typedef struct {
|
|
touch_elem_handle_t handle;
|
|
bool (*check_channel) (touch_pad_t);
|
|
esp_err_t (*set_threshold) (void);
|
|
void (*process_state) (void);
|
|
void (*update_state) (touch_pad_t, te_state_t);
|
|
} te_object_methods_t;
|
|
|
|
/* -------------------------------------------- Waterproof basic type --------------------------------------------- */
|
|
struct te_waterproof_s {
|
|
te_dev_t *guard_device; //Waterproof guard channel device
|
|
touch_elem_handle_t *mask_handle; //Waterproof masked handle array
|
|
touch_pad_t shield_channel; //Waterproof shield channel
|
|
bool is_shield_level_set; //Waterproof shield level setting bit
|
|
};
|
|
typedef struct te_waterproof_s* te_waterproof_handle_t;
|
|
/* -------------------------------------------- Sleep basic type --------------------------------------------- */
|
|
struct te_sleep_s {
|
|
touch_elem_handle_t wakeup_handle;
|
|
#ifdef CONFIG_PM_ENABLE
|
|
esp_pm_lock_handle_t pm_lock;
|
|
#endif
|
|
uint32_t *non_volatile_threshold;
|
|
};
|
|
|
|
typedef struct te_sleep_s* te_sleep_handle_t;
|
|
/* -------------------------------------------- Button basic type --------------------------------------------- */
|
|
typedef struct {
|
|
touch_elem_dispatch_t dispatch_method; //Button dispatch method
|
|
touch_button_callback_t callback; //Button callback routine
|
|
uint32_t event_mask; //Button subscribed event mask
|
|
void *arg; //User input argument
|
|
} te_button_handle_config_t;
|
|
|
|
typedef te_state_t te_button_state_t; //TODO: add Long Press state
|
|
|
|
struct te_button_s {
|
|
te_button_handle_config_t *config; //Button configuration
|
|
te_dev_t *device; //Base device information
|
|
te_button_state_t current_state; //Button current state
|
|
te_button_state_t last_state; //Button last state
|
|
touch_button_event_t event; //Button outside state(for application layer)
|
|
uint32_t trigger_cnt; //Button long time trigger counter
|
|
uint32_t trigger_thr; //Button long time trigger counter threshold
|
|
};
|
|
|
|
typedef struct te_button_s* te_button_handle_t;
|
|
/* -------------------------------------------- Slider basic type --------------------------------------------- */
|
|
typedef struct {
|
|
touch_elem_dispatch_t dispatch_method; //Slider dispatch method
|
|
touch_slider_callback_t callback; //Slider callback routine
|
|
uint32_t event_mask; //Slider subscribed event mask
|
|
void *arg; //User input argument
|
|
} te_slider_handle_config_t;
|
|
|
|
typedef te_state_t te_slider_state_t;
|
|
|
|
struct te_slider_s {
|
|
te_slider_handle_config_t *config; //Slider configuration
|
|
te_dev_t **device; //Base device information set
|
|
te_slider_state_t current_state; //Slider current state
|
|
te_slider_state_t last_state; //Slider last state
|
|
touch_slider_event_t event; //Slider outside state(for application layer)
|
|
float position_scale; //Slider position scale(step size)
|
|
float *quantify_signal_array; //Slider re-quantization array
|
|
uint32_t *channel_bcm; //Channel benchmark array
|
|
uint32_t channel_bcm_update_cnt; //Channel benchmark update counter
|
|
uint32_t filter_reset_cnt; //Slider reset counter
|
|
uint32_t last_position; //Slider last position
|
|
touch_slider_position_t position; //Slider position
|
|
uint8_t position_range; //Slider position range([0, position_range])
|
|
uint8_t channel_sum; //Slider channel sum
|
|
uint8_t *pos_filter_window; //Slider position moving average filter window
|
|
uint8_t pos_window_idx; //Slider position moving average filter window index
|
|
bool is_first_sample; //Slider first time sample record bit
|
|
};
|
|
|
|
typedef struct te_slider_s* te_slider_handle_t;
|
|
/* -------------------------------------------- Matrix basic type --------------------------------------------- */
|
|
typedef struct {
|
|
touch_elem_dispatch_t dispatch_method; //Matrix button dispatch method
|
|
touch_matrix_callback_t callback; //Matrix button callback routine
|
|
uint32_t event_mask; //Matrix button subscribed event mask
|
|
void *arg; //User input argument
|
|
} te_matrix_handle_config_t;
|
|
|
|
typedef te_state_t te_matrix_state_t; //TODO: add Long Press state
|
|
|
|
struct te_matrix_s {
|
|
te_matrix_handle_config_t *config; //Matrix button configuration
|
|
te_dev_t **device; //Base device information
|
|
te_matrix_state_t current_state; //Matrix button current state
|
|
te_matrix_state_t last_state; //Matrix button current state
|
|
touch_matrix_event_t event; //Matrix button outside state(for application layer)
|
|
uint32_t trigger_cnt; //Matrix button long time trigger counter
|
|
uint32_t trigger_thr; //Matrix button long time trigger counter threshold
|
|
touch_matrix_position_t position; //Matrix button position
|
|
uint8_t x_channel_num; //The number of touch sensor channel in x axis
|
|
uint8_t y_channel_num; //The number of touch sensor channel in y axis
|
|
};
|
|
|
|
typedef struct te_matrix_s* te_matrix_handle_t;
|
|
/* ------------------------------------------------------------------------------------------------------------------ */
|
|
|
|
/* --------------------------------------------- Global system methods ---------------------------------------------- */
|
|
uint32_t te_read_smooth_signal(touch_pad_t channel_num);
|
|
bool te_system_check_state(void);
|
|
//TODO: Refactor this function with function overload
|
|
esp_err_t te_dev_init(te_dev_t **device, uint8_t device_num, te_dev_type_t type, const touch_pad_t *channel, const float *sens, float divider);
|
|
void te_dev_deinit(te_dev_t **device, uint8_t device_num);
|
|
esp_err_t te_dev_set_threshold(te_dev_t *device);
|
|
esp_err_t te_event_give(touch_elem_message_t te_message);
|
|
uint8_t te_get_timer_period(void);
|
|
void te_object_method_register(te_object_methods_t *object_methods, te_class_type_t object_type);
|
|
void te_object_method_unregister(te_class_type_t object_type);
|
|
bool te_object_check_channel(const touch_pad_t *channel_array, uint8_t channel_sum);
|
|
bool waterproof_check_mask_handle(touch_elem_handle_t te_handle);
|
|
bool te_is_touch_dsleep_wakeup(void);
|
|
touch_pad_t te_get_sleep_channel(void);
|
|
|
|
bool is_button_object_handle(touch_elem_handle_t element_handle);
|
|
bool is_slider_object_handle(touch_elem_handle_t element_handle);
|
|
bool is_matrix_object_handle(touch_elem_handle_t element_handle);
|
|
|
|
void button_enable_wakeup_calibration(te_button_handle_t button_handle, bool en);
|
|
void slider_enable_wakeup_calibration(te_slider_handle_t slider_handle, bool en);
|
|
void matrix_enable_wakeup_calibration(te_matrix_handle_t matrix_handle, bool en);
|
|
/* ------------------------------------------------------------------------------------------------------------------ */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|