/**************************************************************************/
/*!
@file FT6336U.h
Author: Atsushi Sasaki(https://github.com/aselectroworks)
License: MIT (see LICENSE)
@brief ESP-IDF C driver for FT6336U CTP controller
@note Ported from Arduino C++ library to ESP-IDF C
*/
/**************************************************************************/
#ifndef _FT6336U_H
#define _FT6336U_H
#include <stdint.h>
#include <stdbool.h>
#include "esp_err.h"
#include "driver/i2c_master.h"
#include "driver/gpio.h"
#define I2C_ADDR_FT6336U 0x38
// Touch Parameter
#define FT6336U_PRES_DOWN 0x2
#define FT6336U_COORD_UD 0x1
// Registers
#define FT6336U_ADDR_DEVICE_MODE 0x00
typedef enum {
working_mode = 0b000,
factory_mode = 0b100,
} DEVICE_MODE_Enum;
#define FT6336U_ADDR_GESTURE_ID 0x01
#define FT6336U_ADDR_TD_STATUS 0x02
#define FT6336U_ADDR_TOUCH1_EVENT 0x03
#define FT6336U_ADDR_TOUCH1_ID 0x05
#define FT6336U_ADDR_TOUCH1_X 0x03
#define FT6336U_ADDR_TOUCH1_Y 0x05
#define FT6336U_ADDR_TOUCH1_WEIGHT 0x07
#define FT6336U_ADDR_TOUCH1_MISC 0x08
#define FT6336U_ADDR_TOUCH2_EVENT 0x09
#define FT6336U_ADDR_TOUCH2_ID 0x0B
#define FT6336U_ADDR_TOUCH2_X 0x09
#define FT6336U_ADDR_TOUCH2_Y 0x0B
#define FT6336U_ADDR_TOUCH2_WEIGHT 0x0D
#define FT6336U_ADDR_TOUCH2_MISC 0x0E
#define FT6336U_ADDR_THRESHOLD 0x80
#define FT6336U_ADDR_FILTER_COE 0x85
#define FT6336U_ADDR_CTRL 0x86
typedef enum {
keep_active_mode = 0,
switch_to_monitor_mode = 1,
} CTRL_MODE_Enum;
#define FT6336U_ADDR_TIME_ENTER_MONITOR 0x87
#define FT6336U_ADDR_ACTIVE_MODE_RATE 0x88
#define FT6336U_ADDR_MONITOR_MODE_RATE 0x89
#define FT6336U_ADDR_RADIAN_VALUE 0x91
#define FT6336U_ADDR_OFFSET_LEFT_RIGHT 0x92
#define FT6336U_ADDR_OFFSET_UP_DOWN 0x93
#define FT6336U_ADDR_DISTANCE_LEFT_RIGHT 0x94
#define FT6336U_ADDR_DISTANCE_UP_DOWN 0x95
#define FT6336U_ADDR_DISTANCE_ZOOM 0x96
#define FT6336U_ADDR_LIBRARY_VERSION_H 0xA1
#define FT6336U_ADDR_LIBRARY_VERSION_L 0xA2
#define FT6336U_ADDR_CHIP_ID 0xA3
#define FT6336U_ADDR_G_MODE 0xA4
typedef enum {
pollingMode = 0,
triggerMode = 1,
} G_MODE_Enum;
#define FT6336U_ADDR_POWER_MODE 0xA5
#define FT6336U_ADDR_FIRMARE_ID 0xA6
#define FT6336U_ADDR_FOCALTECH_ID 0xA8
#define FT6336U_ADDR_RELEASE_CODE_ID 0xAF
#define FT6336U_ADDR_STATE 0xBC
// Function Specific Type
typedef enum {
touch = 0,
stream,
release,
} TouchStatusEnum;
typedef struct {
TouchStatusEnum status;
uint16_t x;
uint16_t y;
} TouchPointType;
typedef struct {
uint8_t touch_count;
TouchPointType tp[2];
} FT6336U_TouchPointType;
/**
* @brief FT6336U device handle structure
* This replaces the C++ class object
*/
typedef struct {
i2c_master_dev_handle_t i2c_dev; // I2C device handle
gpio_num_t int_n; // Interrupt pin
gpio_num_t rst_n; // Reset pin
FT6336U_TouchPointType touch_point; // Internal state for scan
} ft6336u_dev_t;
/**
* @brief Initialize the FT6336U device
*
* @param dev Pointer to the device handle structure
* @param bus_handle Handle to the I2C master bus
* @param rst_n GPIO pin number for Reset
* @param int_n GPIO pin number for Interrupt
* @return esp_err_t ESP_OK on success
*/
esp_err_t ft6336u_init(ft6336u_dev_t *dev, i2c_master_bus_handle_t bus_handle, gpio_num_t rst_n, gpio_num_t int_n);
/**
* @brief De-initialize the FT6336U device
*
* @param dev Pointer to the device handle structure
* @return esp_err_t ESP_OK on success
*/
esp_err_t ft6336u_deinit(ft6336u_dev_t *dev);
// --- Public API Functions (mirrors C++ class) ---
esp_err_t ft6336u_read_device_mode(ft6336u_dev_t *dev, uint8_t *mode);
esp_err_t ft6336u_write_device_mode(ft6336u_dev_t *dev, DEVICE_MODE_Enum mode);
esp_err_t ft6336u_read_gesture_id(ft6336u_dev_t *dev, uint8_t *gesture_id);
esp_err_t ft6336u_read_td_status(ft6336u_dev_t *dev, uint8_t *td_status);
esp_err_t ft6336u_read_touch_number(ft6336u_dev_t *dev, uint8_t *touch_num);
esp_err_t ft6336u_read_touch1_x(ft6336u_dev_t *dev, uint16_t *x);
esp_err_t ft6336u_read_touch1_y(ft6336u_dev_t *dev, uint16_t *y);
esp_err_t ft6336u_read_touch1_event(ft6336u_dev_t *dev, uint8_t *event);
esp_err_t ft6336u_read_touch1_id(ft6336u_dev_t *dev, uint8_t *id);
esp_err_t ft6336u_read_touch1_weight(ft6336u_dev_t *dev, uint8_t *weight);
esp_err_t ft6336u_read_touch1_misc(ft6336u_dev_t *dev, uint8_t *misc);
esp_err_t ft6336u_read_touch2_x(ft6336u_dev_t *dev, uint16_t *x);
esp_err_t ft6336u_read_touch2_y(ft6336u_dev_t *dev, uint16_t *y);
esp_err_t ft6336u_read_touch2_event(ft6336u_dev_t *dev, uint8_t *event);
esp_err_t ft6336u_read_touch2_id(ft6336u_dev_t *dev, uint8_t *id);
esp_err_t ft6336u_read_touch2_weight(ft6336u_dev_t *dev, uint8_t *weight);
esp_err_t ft6336u_read_touch2_misc(ft6336u_dev_t *dev, uint8_t *misc);
// Mode Parameter Register
esp_err_t ft6336u_read_touch_threshold(ft6336u_dev_t *dev, uint8_t *threshold);
esp_err_t ft6336u_read_filter_coefficient(ft6336u_dev_t *dev, uint8_t *coeff);
esp_err_t ft6336u_read_ctrl_mode(ft6336u_dev_t *dev, uint8_t *mode);
esp_err_t ft6336u_write_ctrl_mode(ft6336u_dev_t *dev, CTRL_MODE_Enum mode);
esp_err_t ft6336u_read_time_period_enter_monitor(ft6336u_dev_t *dev, uint8_t *time);
esp_err_t ft6336u_read_active_rate(ft6336u_dev_t *dev, uint8_t *rate);
esp_err_t ft6336u_read_monitor_rate(ft6336u_dev_t *dev, uint8_t *rate);
// Gesture Parameter Register
esp_err_t ft6336u_read_radian_value(ft6336u_dev_t *dev, uint8_t *val);
esp_err_t ft6336u_write_radian_value(ft6336u_dev_t *dev, uint8_t val);
esp_err_t ft6336u_read_offset_left_right(ft6336u_dev_t *dev, uint8_t *val);
esp_err_t ft6336u_write_offset_left_right(ft6336u_dev_t *dev, uint8_t val);
esp_err_t ft6336u_read_offset_up_down(ft6336u_dev_t *dev, uint8_t *val);
esp_err_t ft6336u_write_offset_up_down(ft6336u_dev_t *dev, uint8_t val);
esp_err_t ft6336u_read_distance_left_right(ft6336u_dev_t *dev, uint8_t *val);
esp_err_t ft6336u_write_distance_left_right(ft6336u_dev_t *dev, uint8_t val);
esp_err_t ft6336u_read_distance_up_down(ft6336u_dev_t *dev, uint8_t *val);
esp_err_t ft6336u_write_distance_up_down(ft6336u_dev_t *dev, uint8_t val);
esp_err_t ft6336u_read_distance_zoom(ft6336u_dev_t *dev, uint8_t *val);
esp_err_t ft6336u_write_distance_zoom(ft6336u_dev_t *dev, uint8_t val);
// System Information
esp_err_t ft6336u_read_library_version(ft6336u_dev_t *dev, uint16_t *version);
esp_err_t ft6336u_read_chip_id(ft6336u_dev_t *dev, uint8_t *chip_id);
esp_err_t ft6336u_read_g_mode(ft6336u_dev_t *dev, uint8_t *mode);
esp_err_t ft6336u_write_g_mode(ft6336u_dev_t *dev, G_MODE_Enum mode);
esp_err_t ft6336u_read_pwrmode(ft6336u_dev_t *dev, uint8_t *mode);
esp_err_t ft6336u_read_firmware_id(ft6336u_dev_t *dev, uint8_t *id);
esp_err_t ft6336u_read_focaltech_id(ft6336u_dev_t *dev, uint8_t *id);
esp_err_t ft6336u_read_release_code_id(ft6336u_dev_t *dev, uint8_t *id);
esp_err_t ft6336u_read_state(ft6336u_dev_t *dev, uint8_t *state);
// Scan Function
/**
* @brief Scan the touch panel for touch points
*
* @param dev Pointer to the device handle structure
* @param touch_data Pointer to a struct to store the touch data
* @return esp_err_t ESP_OK on success
*/
esp_err_t ft6336u_scan(ft6336u_dev_t *dev, FT6336U_TouchPointType *touch_data);
#endif