177 lines
5.1 KiB
C++
177 lines
5.1 KiB
C++
/**
|
|
******************************************************************************
|
|
* File Name : STM32TouchController.cpp
|
|
******************************************************************************
|
|
* @attention
|
|
*
|
|
* <h2><center>© Copyright (c) 2021 STMicroelectronics.
|
|
* All rights reserved.</center></h2>
|
|
*
|
|
* This software component is licensed by ST under Ultimate Liberty license
|
|
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at:
|
|
* www.st.com/SLA0044
|
|
*
|
|
******************************************************************************
|
|
*/
|
|
|
|
/* USER CODE BEGIN STM32TouchController */
|
|
|
|
#include <STM32TouchController.hpp>
|
|
#include <TouchGFXHAL.hpp>
|
|
#include <ft5336.h>
|
|
#include <stm32f7xx_hal.h>
|
|
#include <touchgfx/hal/OSWrappers.hpp>
|
|
|
|
static TS_DrvTypeDef* tsDriver;
|
|
extern I2C_HandleTypeDef hi2c3;
|
|
|
|
void STM32TouchController::init()
|
|
{
|
|
/* Initialize the TS driver structure */
|
|
tsDriver = &ft5336_ts_drv;
|
|
|
|
/* Initialize the TS driver */
|
|
tsDriver->Start(TS_I2C_ADDRESS);
|
|
}
|
|
|
|
bool STM32TouchController::sampleTouch(int32_t& x, int32_t& y)
|
|
{
|
|
/**
|
|
* By default sampleTouch returns false,
|
|
* return true if a touch has been detected, otherwise false.
|
|
*
|
|
* Coordinates are passed to the caller by reference by x and y.
|
|
*
|
|
* This function is called by the TouchGFX framework.
|
|
* By default sampleTouch is called every tick, this can be adjusted by HAL::setTouchSampleRate(int8_t);
|
|
*
|
|
*/
|
|
if (tsDriver)
|
|
{
|
|
if (tsDriver->DetectTouch(TS_I2C_ADDRESS))
|
|
{
|
|
/* Get each touch coordinates */
|
|
tsDriver->GetXY(TS_I2C_ADDRESS, (uint16_t*)&y, (uint16_t*)&x);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @brief Manages error callback by re-initializing I2C.
|
|
* @param i2c_handler : I2C handler
|
|
* @param Addr: I2C Address
|
|
* @retval None
|
|
*/
|
|
static void I2Cx_Error(I2C_HandleTypeDef* i2c_handler, uint8_t Addr)
|
|
{
|
|
/* De-initialize the I2C communication bus */
|
|
HAL_I2C_DeInit(i2c_handler);
|
|
|
|
/* Re-Initialize the I2C communication bus */
|
|
//I2Cx_Init(i2c_handler);
|
|
}
|
|
|
|
/**
|
|
* @brief Reads multiple data.
|
|
* @param i2c_handler : I2C handler
|
|
* @param Addr: I2C address
|
|
* @param Reg: Reg address
|
|
* @param MemAddress: Memory address
|
|
* @param Buffer: Pointer to data buffer
|
|
* @param Length: Length of the data
|
|
* @retval Number of read data
|
|
*/
|
|
static HAL_StatusTypeDef I2Cx_ReadMultiple(I2C_HandleTypeDef* i2c_handler,
|
|
uint8_t Addr,
|
|
uint16_t Reg,
|
|
uint16_t MemAddress,
|
|
uint8_t* Buffer,
|
|
uint16_t Length)
|
|
{
|
|
HAL_StatusTypeDef status = HAL_OK;
|
|
|
|
status = HAL_I2C_Mem_Read(i2c_handler, Addr, (uint16_t)Reg, MemAddress, Buffer, Length, 1000);
|
|
|
|
/* Check the communication status */
|
|
if (status != HAL_OK)
|
|
{
|
|
/* I2C error occurred */
|
|
I2Cx_Error(i2c_handler, Addr);
|
|
}
|
|
return status;
|
|
}
|
|
|
|
/**
|
|
* @brief Writes a value in a register of the device through BUS in using DMA mode.
|
|
* @param i2c_handler : I2C handler
|
|
* @param Addr: Device address on BUS Bus.
|
|
* @param Reg: The target register address to write
|
|
* @param MemAddress: Memory address
|
|
* @param Buffer: The target register value to be written
|
|
* @param Length: buffer size to be written
|
|
* @retval HAL status
|
|
*/
|
|
static HAL_StatusTypeDef I2Cx_WriteMultiple(I2C_HandleTypeDef* i2c_handler,
|
|
uint8_t Addr,
|
|
uint16_t Reg,
|
|
uint16_t MemAddress,
|
|
uint8_t* Buffer,
|
|
uint16_t Length)
|
|
{
|
|
HAL_StatusTypeDef status = HAL_OK;
|
|
|
|
status = HAL_I2C_Mem_Write(i2c_handler, Addr, (uint16_t)Reg, MemAddress, Buffer, Length, 1000);
|
|
|
|
/* Check the communication status */
|
|
if (status != HAL_OK)
|
|
{
|
|
/* Re-Initiaize the I2C Bus */
|
|
I2Cx_Error(i2c_handler, Addr);
|
|
}
|
|
return status;
|
|
}
|
|
|
|
/**
|
|
* @brief Writes a single data.
|
|
* @param Addr: I2C address
|
|
* @param Reg: Reg address
|
|
* @param Value: Data to be written
|
|
* @retval None
|
|
*/
|
|
void TS_IO_Write(uint8_t Addr, uint8_t Reg, uint8_t Value)
|
|
{
|
|
I2Cx_WriteMultiple(&hi2c3, Addr, (uint16_t)Reg, I2C_MEMADD_SIZE_8BIT, (uint8_t*)&Value, 1);
|
|
}
|
|
|
|
/**
|
|
* @brief Reads a single data.
|
|
* @param Addr: I2C address
|
|
* @param Reg: Reg address
|
|
* @retval Data to be read
|
|
*/
|
|
uint8_t TS_IO_Read(uint8_t Addr, uint8_t Reg)
|
|
{
|
|
uint8_t read_value = 0;
|
|
|
|
I2Cx_ReadMultiple(&hi2c3, Addr, Reg, I2C_MEMADD_SIZE_8BIT, (uint8_t*)&read_value, 1);
|
|
|
|
return read_value;
|
|
}
|
|
|
|
/**
|
|
* @brief TS delay
|
|
* @param Delay: Delay in ms
|
|
* @retval None
|
|
*/
|
|
void TS_IO_Delay(uint32_t Delay)
|
|
{
|
|
HAL_Delay(Delay);
|
|
}
|
|
|
|
/* USER CODE END STM32TouchController */
|
|
|
|
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|