/*
 * XPT2046_TP_Detect.h
 *
 *  Created on: 2026/01/18
 *      Author: egaono-electronics
 */

#ifndef XPT2046_TP_DETECT_H_
#define XPT2046_TP_DETECT_H_

#include "Dev_Conf.h"

#include def_Header_HAL

#include "XPT2046_TP_Adjust.h"



// タッチパネル上のスイッチ表示数最大値
#define def_Max_Number_of_TP_SW    64


// タッチパネル上のスイッチ名称の最大長
#define def_Max_Length_Name_TP_SW    8


//------------------------------------------
// Key_InのSwitchの不感帯の比率の定義 : %
//------------------------------------------
#define def_Ratio_X_Button_Key_In_L    5
#define def_Ratio_X_Button_Key_In_R    5

#define def_Ratio_Y_Button_Key_In_U   40
#define def_Ratio_Y_Button_Key_In_D  -10
//------------------------------------------



//------------------------------------------------------
// タッチパネルスイッチ用パラメータの構造体
//------------------------------------------------------
struct sParam_TP_SW{
  // タッチパネルスイッチの表示名称の配列
  uint8_t uint8_aDraw_Data_TP_SW[
        def_Max_Number_of_TP_SW][def_Max_Length_Name_TP_SW];


  // タッチパネルスイッチの表示位置の配列
  int16_t int16_aPos_X_Draw_TP_SW[def_Max_Number_of_TP_SW];
  int16_t int16_aPos_Y_Draw_TP_SW[def_Max_Number_of_TP_SW];


  // タッチパネルスイッチの幅Xの配列
  int16_t int16_aWidth_TP_SW[def_Max_Number_of_TP_SW];

  // タッチパネルスイッチの高さYの配列
  int16_t int16_aHeight_TP_SW[def_Max_Number_of_TP_SW];


  // タッチパネルスイッチ表示Fontの配列
  uint16_t uint16_aFont_TP_SW[def_Max_Number_of_TP_SW];
  // タッチパネルスイッチ表示色の配列
  uint32_t uint32_aColor_TP_SW[def_Max_Number_of_TP_SW];


  // タッチパネル上のスイッチ位置を保存する変数の配列
  int16_t int16_aPosition_X_TP_SW_Min[def_Max_Number_of_TP_SW];
                                        // TP SW X位置 最小値
  int16_t int16_aPosition_X_TP_SW_Max[def_Max_Number_of_TP_SW];
                                        // TP SW X位置 最大値

  int16_t int16_aPosition_Y_TP_SW_Min[def_Max_Number_of_TP_SW];
                                        // TP SW Y位置 最小値
  int16_t int16_aPosition_Y_TP_SW_Max[def_Max_Number_of_TP_SW];
                                        // TP SW Y位置 最大値

  // タッチパネルスイッチ検出フラグの配列
  int16_t int16_aFlag_Detect_TP_SW[def_Max_Number_of_TP_SW];
};



//----------------------------------------------------------
// TP SW Alpha Numericの値を設定
//----------------------------------------------------------
// 引数:
// int16_t int16_A_H : ASCII/HEX選択
//    0 : ASCII
//    1 : HEX

// int16_t int16_U_L : Upper case/Lower case 選択 :
//                                  大文字/小文字 選択
//    0 : Upper case : 大文字
//    1 : Lower case : 小文字

// struct sParam_TP_SW *pstructParam_TP_SW :
//          タッチパネルスイッチ用パラメータの構造体のポインタ


// 戻り値;
//    なし
//----------------------------------------------------------
void Set_TP_SW_Value_Alpha_Numeric(int16_t int16_A_H,
                                   int16_t int16_U_L,
                    struct sParam_TP_SW *pstructParam_TP_SW);



//----------------------------------------------------------
// TP SW Upper case/Lower caseの値を設定 : UL
//----------------------------------------------------------
// 引数:
// int16_t int16_Sel : 表示選択
//    0 : 表示 : ASCII
//    1 : 消去 : HEX

// struct sParam_TP_SW *pstructParam_TP_SW :
//          タッチパネルスイッチ用パラメータの構造体のポインタ


// 戻り値;
//    なし
//----------------------------------------------------------
void Set_TP_SW_Value_Upper_Lower(int16_t int16_Sel,
                   struct sParam_TP_SW *pstructParam_TP_SW);



//----------------------------------------------------------
// タッチパネル上のスイッチのXY位置を算出 : Alpha Numeric
//----------------------------------------------------------
// タッチパネル上のスイッチ位置を保存する
//                          グローバル変数にセットする。
//----------------------------------------------------------
// 引数:
// int16_t int16_Num_SW_Start : 開始スイッチ番号
// int16_t int16_Num_SW_End : 終了スイッチ番号

// struct sParam_Adjust_TP *pstructParam_Adjust_TP :
//          タッチパネル位置調整用パラメータ構造体のポインタ

// struct sParam_TP_SW *pstructParam_TP_SW :
//          タッチパネルスイッチ用パラメータの構造体のポインタ


// 戻り値;
//    なし
//----------------------------------------------------------
void Calc_TP_SW_XY(int16_t int16_Num_SW_Start,
                   int16_t int16_Num_SW_End,
           struct sParam_Adjust_TP *pstructParam_Adjust_TP,
                   struct sParam_TP_SW *pstructParam_TP_SW);



//----------------------------------------------------------
// タッチパネルの範囲算出 : スイッチサイズ指定 :
//     スイッチの不感帯の比率を X : 左右, Y : 上下指定
//----------------------------------------------------------
//引数:
// struct sParam_Adjust_TP *pstructParam_Adjust_TP :
//          タッチパネル位置調整用パラメータ構造体のポインタ

// struct sParam_TP_SW *pstructParam_TP_SW :
//          タッチパネルスイッチ用パラメータの構造体のポインタ
// int16_t int16_Index_TP_SW :
//          タッチパネルスイッチ用パラメータのインデックス

// int16_t int16_Ratio_X_SW_L : スイッチの不感帯の比率X 左 : %
// int16_t int16_Ratio_X_SW_R : スイッチの不感帯の比率X 右 : %
// int16_t int16_Ratio_Y_SW_U : スイッチの不感帯の比率Y 上 : %
// int16_t int16_Ratio_Y_SW_D : スイッチの不感帯の比率Y 下 : %


// 戻り値;
//    なし
//----------------------------------------------------------
void Calc_Area_TP_SW(
            struct sParam_Adjust_TP *pstructParam_Adjust_TP,
                     struct sParam_TP_SW *pstructParam_TP_SW,
                     int16_t int16_Index,
                     int16_t int16_Ratio_X_SW_L,
                     int16_t int16_Ratio_X_SW_R,
                     int16_t int16_Ratio_Y_SW_U,
                     int16_t int16_Ratio_Y_SW_D);



//----------------------------------------------------------
// タッチパネル上のスイッチのXY位置を算出 : Alpha Numeric
//----------------------------------------------------------
// タッチパネル上のスイッチ位置を保存する
//                          グローバル変数にセットする。
//----------------------------------------------------------
// 引数:
// int16_t int16_Num_SW_Start : 開始スイッチ番号
// int16_t int16_Num_SW_End : 終了スイッチ番号

// int16_t int16_Ratio_X_SW_L : スイッチの不感帯の比率X 左 : %
// int16_t int16_Ratio_X_SW_R : スイッチの不感帯の比率X 右 : %
// int16_t int16_Ratio_Y_SW_U : スイッチの不感帯の比率Y 上 : %
// int16_t int16_Ratio_Y_SW_D : スイッチの不感帯の比率Y 下 : %


// 戻り値;
//    なし
//----------------------------------------------------------
void Calc_TP_SW_XY_with_Ratio(int16_t int16_Num_SW_Start,
                              int16_t int16_Num_SW_End,
                              int16_t int16_Ratio_X_SW_L,
                              int16_t int16_Ratio_X_SW_R,
                              int16_t int16_Ratio_Y_SW_U,
                              int16_t int16_Ratio_Y_SW_D);



//----------------------------------------------------------
// タッチパネルのスイッチ番号取得 : TP SW検出
//----------------------------------------------------------
// 引数;
// uint16_t uint16_Position_X : X位置
// uint16_t uint16_Position_Y : Y位置

// int16_t int16_Num_SW : TP SW数

// struct sParam_TP_SW *pstructParam_TP_SW :
//          タッチパネルスイッチ用パラメータの構造体のポインタ


// 戻り値;
// スイッチ番号 : 0 between (int16_Num_SW - 1)

// 該当なし : -1
//----------------------------------------------------------
int16_t Detect_TP_SW(uint16_t uint16_Position_X,
                     uint16_t uint16_Position_Y,
                     int16_t int16_Num_SW,
                     struct sParam_TP_SW *pstructParam_TP_SW);



//----------------------------------------------------------
// タッチパネルSW入力
//----------------------------------------------------------
// 引数;
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

// struct sParam_Position_TP *pstructParam_Position_TP :
//          タッチパネル位置取得用パラメータの構造体のポインタ

// struct sParam_TP_SW *pstructParam_TP_SW :
//          タッチパネルスイッチ用パラメータの構造体のポインタ

// int16_t int16_Max_Num_SW : スイッチ番号最大値


// 戻り値;
//    -2 : NG終了
//    -1 : 処理中
// 0以上 : OK : Switch番号
//----------------------------------------------------------
int16_t TP_SW_In(uint8_t *puint8_JobNum,
        struct sParam_Position_TP *pstructParam_Position_TP,
                 struct sParam_TP_SW *pstructParam_TP_SW,
                 int16_t int16_Max_Num_SW);



//------------------------------------------------------
// タッチパネルスイッチ用パラメータの構造体の宣言
//------------------------------------------------------
extern struct sParam_TP_SW GLB_structParam_TP_SW;



#endif /* XPT2046_TP_DETECT_H_ */
