/*
 * Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
 * All rights reserved.
 *
 * Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
 * exclusively with CVA's microcontroller products. This file can be freely
 * distributed within development tools that are supporting such microcontroller
 * products.
 *
 * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
 * CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
 * OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
 */

#ifndef _TOUCH_TRX_H_
#define _TOUCH_TRX_H_

/*! \brief Contains public interface to various functions related
 *         to the driver of TOUCH TRX module
 */

/******************************************************************************
 * the includes
 *****************************************************************************/
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include "touch_drv.h"

/*! \addtogroup touch_trx
 *  @{
 */

#ifdef __cplusplus
extern "C" {
#endif

/******************************************************************************
 * the defines
 *****************************************************************************/

/******************************************************************************
 * the typedefs
 *****************************************************************************/
typedef void (*widget_set_cfg)(void *obj, uint8_t *cfg, uint32_t var);

typedef void (*widget_get_cfg)(void *obj, uint8_t *cfg, uint32_t var);

/*! \brief Touch communication interface function pointer prototype
 */
typedef int8_t(*touchIfTx)(uint8_t *packet, uint16_t len);

typedef struct
{
    widget_set_cfg widget_set_cfg_func;

    widget_get_cfg widget_get_cfg_func;
} Trx_Widget_FuncType;

/*! \brief Touch communication command
 */
typedef enum
{
    TOUCH_TRX_CMD_MODE              = 0X00,
    TOUCH_TRX_CMD_MODE_ACK          = 0X01,

    TOUCH_TRX_CMD_REG_RD            = 0X50,
    TOUCH_TRX_CMD_I2C_RD_ACK        = 0X51,

    TOUCH_TRX_CMD_REG_WR            = 0X52,
    TOUCH_TRX_CMD_I2C_WR_ACK        = 0X53,

    TOUCH_TRX_CMD_GET_VER           = 0X56,
    TOUCH_TRX_CMD_GET_VER_ACK       = 0X57,

    TOUCH_TRX_CMD_HOST_CMD          = 0X58,
    TOUCH_TRX_CMD_HOST_CMD_ACK      = 0X59,

    TOUCH_TRX_CMD_GET_EVENT         = 0X5C,
    TOUCH_TRX_CMD_GET_EVENT_ACK     = 0X5D,

    TOUCH_TRX_CMD_SET_FLASH         = 0X7a,
    TOUCH_TRX_CMD_SET_FLASH_ACK     = 0X7b,

    TOUCH_TRX_CMD_GET_FLASH         = 0X80,
    TOUCH_TRX_CMD_GET_FLASH_ACK     = 0X81,

    TOUCH_TRX_CMD_GET_KEY_VAR       = 0X82,
    TOUCH_TRX_CMD_GET_KEY_VAR_ACK   = 0X83,

    TOUCH_TRX_CMD_GET_INFO          = 0X84,
    TOUCH_TRX_CMD_GET_INFO_ACK      = 0X85,

    TOUCH_TRX_CMD_SET_CFG           = 0X86,
    TOUCH_TRX_CMD_SET_CFG_ACK       = 0X87,

    TOUCH_TRX_CMD_GET_CFG           = 0X88,
    TOUCH_TRX_CMD_GET_CFG_ACK       = 0X89,

    TOUCH_TRX_CMD_GET_MISC          = 0X90,
    TOUCH_TRX_CMD_GET_MISC_ACK      = 0X91,
} TouchTrx_CmdType;

/*! \brief Touch communication error code
 */
typedef enum
{
    TOUCH_TRX_PACK_ERR_HEAD =  0x01,
    TOUCH_TRX_PACK_ERR_SIZE =  0x02,
    TOUCH_TRX_PACK_ERR_CRC  =  0x03,
    TOUCH_TRX_PACK_ERR_BSY  =  0x04,
    TOUCH_TRX_PACK_PASS     =  0x55,
} TouchTrx_PackStatusType;

/*! \brief Touch communication mode
 */
typedef enum
{
    TOUCH_TRX_SHOW_EN        =  2,
    TOUCH_TRX_SHOW_DIS       =  3,
} TouchTrx_ModeType;

/*! \brief Touch communication information type
 */
typedef enum
{
    TouchTrx_InfoNone    = 0x00,
    TouchTrx_InfoDiff    = 0x01,
    TouchTrx_InfoRaw     = 0x02,
    TouchTrx_InfoBase    = 0x04,
    TouchTrx_InfoProx    = 0x08,
    TouchTrx_InfoGesture = 0x40,
} TouchTrx_InfoType;


/******************************************************************************
 * the globals
 ******************************************************************************/

/******************************************************************************
 * the function prototypes
 ******************************************************************************/

/*! \brief Parse touch communication stream
 *
 * This function parse communication stream
 *
 * \param[in] data : communication stream data
 */
void TouchTrx_Parse(uint8_t data);

/*! \brief Handle touch communication package
 *
 * This function handle touch communication package
 *
 */
void TouchTrx_Handler(void);

/*! \brief Send touch event
 *
 * This function for sending touch event
 *
 * \param[in] event : touch event
 */
void TouchTrx_SendEvent(uint8_t event);

/*! \brief Send touch information
 *
 * This function for sending touch information, like raw-data/base-data/diff-data etc.
 *
 * \param[in] event : touch event buffer
 * \param[in] len   : touch event buffer length in byte
 */
void TouchTrx_SendInfo(TouchDrv_InfoType *info, uint8_t extInfo[], uint16_t extLen);

/*! \brief regist widget func to touch trx
 *
 * This function for registing widget func to touch trx.
 *
 * \param[in] widget_func : point to func struct for registing
 */
void TouchTrx_RegistFuncCallback(Trx_Widget_FuncType *widget_func);

void TouchTrx_RegisterTxFun(touchIfTx prt);

void TouchTrx_SetVersion(char *version, uint8_t len);

#ifdef __cplusplus
}
#endif /* extern "C" */

/*! @}*/

#endif
