/*
 *
 * FocalTech TouchScreen driver.
 *
 * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved.
 *
 * This software is licensed under the terms of the GNU General Public
 * License version 2, as published by the Free Software Foundation, and
 * may be copied, distributed, and modified under those terms.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 */

/*****************************************************************************
*
* File Name: focaltech_point_report_check.c
*
*    Author: WangTao
*
*   Created: 2016-11-16
*
*  Abstract: point report check function
*
*   Version: v1.0
*
* Revision History:
*        v1.0:
*            First release. By WangTao 2016-11-16
*****************************************************************************/

/*****************************************************************************
* Included header files
*****************************************************************************/
#include "focaltech_core.h"

#if FTS_POINT_REPORT_CHECK_EN
/*****************************************************************************
* Private constant and macro definitions using #define
*****************************************************************************/
#define POINT_REPORT_CHECK_WAIT_TIME              200    /* ms */

/*****************************************************************************
* Private enumerations, structures and unions using typedef
*****************************************************************************/

/*****************************************************************************
* Static variables
*****************************************************************************/
static struct delayed_work fts_point_report_check_work;
static struct workqueue_struct *fts_point_report_check_workqueue;

/*****************************************************************************
* Global variable or extern global variabls/functions
*****************************************************************************/

/*****************************************************************************
* Static function prototypes
*****************************************************************************/

/*****************************************************************************
* functions body
*****************************************************************************/


/*****************************************************************************
*  Name: fts_point_report_check_func
*  Brief:
*  Input:
*  Output:
*  Return:
*****************************************************************************/
static void fts_point_report_check_func(struct work_struct *work)
{

#if FTS_MT_PROTOCOL_B_EN
	unsigned int finger_count = 0;
#endif

	FTS_FUNC_ENTER();
	mutex_lock(&fts_wq_data->report_mutex);

#if FTS_MT_PROTOCOL_B_EN
	for (finger_count = 0;
		finger_count < fts_wq_data->pdata->max_touch_number;
		finger_count++) {
		input_mt_slot(fts_input_dev, finger_count);
		input_mt_report_slot_state(fts_input_dev,
				MT_TOOL_FINGER, false);
	}
#else
	input_mt_sync(fts_input_dev);
#endif
	input_report_key(fts_input_dev, BTN_TOUCH, 0);
	input_sync(fts_input_dev);

	mutex_unlock(&fts_wq_data->report_mutex);

	FTS_FUNC_EXIT();
}

void fts_point_report_check_queue_work(void)
{
	cancel_delayed_work(&fts_point_report_check_work);
	queue_delayed_work(fts_point_report_check_workqueue,
			&fts_point_report_check_work,
			msecs_to_jiffies(POINT_REPORT_CHECK_WAIT_TIME));
}

/*****************************************************************************
*  Name: fts_point_report_check_init
*  Brief:
*  Input:
*  Output:
*  Return: < 0: Fail to create esd check queue
*****************************************************************************/
int fts_point_report_check_init(void)
{
	FTS_FUNC_ENTER();

	INIT_DELAYED_WORK(&fts_point_report_check_work,
			fts_point_report_check_func);
	fts_point_report_check_workqueue =
		create_workqueue("fts_point_report_check_func_wq");
	if (fts_point_report_check_workqueue == NULL)
		FTS_ERROR("[POINT_REPORT]: Failed to create workqueue!!");
	else
		FTS_DEBUG("[POINT_REPORT]: Success to create workqueue!!");

	FTS_FUNC_EXIT();

	return 0;
}

/*****************************************************************************
*  Name: fts_point_report_check_exit
*  Brief:
*  Input:
*  Output:
*  Return:
*****************************************************************************/
int fts_point_report_check_exit(void)
{
	FTS_FUNC_ENTER();

	destroy_workqueue(fts_point_report_check_workqueue);

	FTS_FUNC_EXIT();
	return 0;
}
#endif /* FTS_POINT_REPORT_CHECK_EN */

