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

#include "XPT2046_TP_Detect.h"

#include "XPT2046_TP_Key_In.h"

#include "ILI9341_SPI_Draw.h"

#include "XPT2046_TP_Access.h"
#include "XPT2046_TP_Correct_Pos.h"

#include "XPT2046_TP_Draw_SW.h"

#include "Generate_Beep.h"

#include "Time_Interval.h"

#include <string.h>



//------------------------------------------------------
// タッチパネルスイッチ用パラメータの構造体の宣言
//------------------------------------------------------
struct sParam_TP_SW GLB_structParam_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)
{
  uint8_t uint8_aData[8];

  int16_t int16_Num;
  int16_t int16_I;


  //------------------------------------------------------------
  // 表示データセット
  //------------------------------------------------------------
  //------------------------------------------------
  // 0 - 9
  //------------------------------------------------
  uint8_aData[0] = 0x30;
  uint8_aData[1] = '\0';

  for(int16_I = (int16_t)def_Num_TP_SW_Key_0;
        int16_I <= (int16_t)def_Num_TP_SW_Key_9; int16_I++){
    strcpy((char *)pstructParam_TP_SW->
                            uint8_aDraw_Data_TP_SW[int16_I],
           (char *)uint8_aData);
    uint8_aData[0] += 1;
  }


  //------------------------------------------------
  // A - Z or a - z または A - F
  //------------------------------------------------
  if(int16_A_H == 0){
    // ASCII : A - Z or a - z
    int16_Num = (int16_t)def_Num_TP_SW_Key_Z;
  }
  else{
    // HEX : A - F
    int16_Num = (int16_t)def_Num_TP_SW_Key_F;
  }


  if(int16_A_H == 0){
    // ASCII
    if(int16_U_L == 0){
      // Upper case : 大文字
      uint8_aData[0] = 0x41;
    }
    else{
      // Lower case : 小文字
      uint8_aData[0] = 0x61;
    }
  }
  else{
    // HEX
    // Upper case : 大文字
    uint8_aData[0] = 0x41;
  }

  uint8_aData[1] = '\0';

  for(int16_I = (int16_t)def_Num_TP_SW_Key_A;
                        int16_I <= int16_Num; int16_I++){
    strcpy((char *)pstructParam_TP_SW->
                            uint8_aDraw_Data_TP_SW[int16_I],
           (char *)uint8_aData);
    uint8_aData[0] += 1;
  }


  //------------------------------------------------
  // Control Code : 制御コード
  //------------------------------------------------
  if(int16_A_H == 0){
    // ASCIIの場合のみセット
    strcpy((char *)pstructParam_TP_SW->
        uint8_aDraw_Data_TP_SW[(int16_t)def_Num_TP_SW_Key_SP],
        " ");
    strcpy((char *)pstructParam_TP_SW->
        uint8_aDraw_Data_TP_SW[(int16_t)def_Num_TP_SW_Key_CR],
        "\r");
    strcpy((char *)pstructParam_TP_SW->
        uint8_aDraw_Data_TP_SW[(int16_t)def_Num_TP_SW_Key_LF],
        "\n");
  }



  if(int16_A_H == 0){
    // ASCII
    if(int16_U_L == 0){
      // Upper case : 大文字
      int16_I = 0;
    }
    else{
      // Lower case : 小文字
      // int16_I = 1;
    }
  }
  else{
    // HEX
    int16_I = 0;  // Upper case
  }

  //------------------------------------------------------------
  // TP SW入力キャラクタをセット : 0 - 9, A - Z, Control Code
  //------------------------------------------------------------
  // int16_t int16_U_L : Upper case/Lower case
  //    0 : Upper case
  //    1 : Lower case
  //------------------------------------------------------------
  Set_Char_TP_SW_In(int16_I);



  // TP検出フラグセット : 0 - 9 をTP検出ONにする。
  for(int16_I = (int16_t)def_Num_TP_SW_Key_0;
      int16_I <= (int16_t)def_Num_TP_SW_Key_9; int16_I++){
    pstructParam_TP_SW->int16_aFlag_Detect_TP_SW[int16_I] = 1;
  }


  // TP検出フラグクリア :
  //            A - Z, Space, CR, LF をTP検出OFFにする。
  for(int16_I = (int16_t)def_Num_TP_SW_Key_A;
      int16_I <= (int16_t)def_Num_TP_SW_Al_Nu; int16_I++){
    pstructParam_TP_SW->int16_aFlag_Detect_TP_SW[int16_I] = 0;
  }

  //----------------------------------------
  // TP検出の範囲を指定する。
  //----------------------------------------
  // int16_t int16_A_H : ASCII/HEX選択
  //    0 : ASCII
  //    1 : HEX
  if(int16_A_H == 0){
    // A - Z, Space, CR, LF までを指定
    int16_Num = (int16_t)def_Num_TP_SW_Al_Nu;
  }
  else{
    // A - F までを指定
    int16_Num = (int16_t)def_Num_TP_SW_Key_F;
  }

  // TP検出フラグセット
  for(int16_I = (int16_t)def_Num_TP_SW_Key_A;
                        int16_I <= int16_Num; int16_I++){
    pstructParam_TP_SW->int16_aFlag_Detect_TP_SW[int16_I] = 1;
  }
}



//----------------------------------------------------------
// 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)
{
  if(int16_Sel == 0){
    // 表示
    strcpy((char *)pstructParam_TP_SW->
        uint8_aDraw_Data_TP_SW[(int16_t)def_Num_TP_SW_Func_UL],
        "UL");

    // TP検出フラグセット
    pstructParam_TP_SW->int16_aFlag_Detect_TP_SW[
                        (int16_t)def_Num_TP_SW_Func_UL] = 1;
  }
  else{
    // 消去
    strcpy((char *)pstructParam_TP_SW->
        uint8_aDraw_Data_TP_SW[(int16_t)def_Num_TP_SW_Func_UL],
        "  ");

    // TP検出フラグクリア
    pstructParam_TP_SW->int16_aFlag_Detect_TP_SW[
                        (int16_t)def_Num_TP_SW_Func_UL] = 0;
  }
}



//----------------------------------------------------------
// タッチパネル上のスイッチの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)
{
  int16_t int16_I;


  for(int16_I = int16_Num_SW_Start;
                int16_I <= int16_Num_SW_End; int16_I++){
    //----------------------------------------------------------
    // タッチパネルの範囲算出
    //----------------------------------------------------------
    // 引数:
    // 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 下 : %


    // 戻り値;
    //    なし
    //----------------------------------------------------------
    Calc_Area_TP_SW(pstructParam_Adjust_TP,
                    pstructParam_TP_SW,
                    int16_I,
                    (int16_t)def_Ratio_X_Button_Key_In_L,
                    (int16_t)def_Ratio_X_Button_Key_In_R,
                    (int16_t)def_Ratio_Y_Button_Key_In_U,
                    (int16_t)def_Ratio_Y_Button_Key_In_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)
{
  int16_t int16_I;


  for(int16_I = int16_Num_SW_Start;
                    int16_I <= int16_Num_SW_End; int16_I++){
    //----------------------------------------------------------
    // タッチパネルの範囲算出
    //----------------------------------------------------------
    // 引数:
    // 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 下 : %


    // 戻り値;
    //    なし
    //----------------------------------------------------------
    Calc_Area_TP_SW(&GLB_structParam_Adjust_TP,
                    &GLB_structParam_TP_SW,
                    int16_I,
                    int16_Ratio_X_SW_L,
                    int16_Ratio_X_SW_R,
                    int16_Ratio_Y_SW_U,
                    int16_Ratio_Y_SW_D);
  }
}



//----------------------------------------------------------
// タッチパネルの範囲算出 : スイッチサイズ指定 :
//     スイッチの不感帯の比率を 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)
{
  //------------------------------------
  // LCDの長手方向のタッチパネルサイズX
  //------------------------------------
  int16_t int16_Width_TP_X
            = pstructParam_Adjust_TP->int16_Adjust_TP_X_MAX
            - pstructParam_Adjust_TP->int16_Adjust_TP_X_MIN;

  //------------------------------------
  // LCDの短手方向のタッチパネルサイズY
  //------------------------------------
  int16_t int16_Width_TP_Y
            = pstructParam_Adjust_TP->int16_Adjust_TP_Y_MAX
            - pstructParam_Adjust_TP->int16_Adjust_TP_Y_MIN;


  float flt_Ratio_X_L;  // SWのX方向の比率 : 左
  float flt_Ratio_X_R;  // SWのX方向の比率 : 右
  float flt_Ratio_Y_U;  // SWのY方向の比率 : 上
  float flt_Ratio_Y_D;  // SWのY方向の比率 : 下

  float flt_Work;


  // SWのX方向 : 左の増減率を算出
  flt_Ratio_X_L = (float)int16_Width_TP_X
                * (float)pstructParam_TP_SW->
                            int16_aWidth_TP_SW[int16_Index];
  flt_Ratio_X_L /= (float)def_LCD_Widthwise;
  flt_Ratio_X_L *= ((float)int16_Ratio_X_SW_L / 100);


  // SWのX方向 : 右の増減率を算出
  flt_Ratio_X_R = (float)int16_Width_TP_X
                * (float)pstructParam_TP_SW->
                            int16_aWidth_TP_SW[int16_Index];
  flt_Ratio_X_R /= (float)def_LCD_Widthwise;
  flt_Ratio_X_R *= ((float)int16_Ratio_X_SW_R / 100);


  // SWのY方向 : 上の増減率を算出
  flt_Ratio_Y_U = (float)int16_Width_TP_Y
                * (float)pstructParam_TP_SW->
                            int16_aHeight_TP_SW[int16_Index];
  flt_Ratio_Y_U /= (float)def_LCD_Lengthwise;
  flt_Ratio_Y_U *= ((float)int16_Ratio_Y_SW_U / 100);


  // SWのY方向 : 下の増減率を算出
  flt_Ratio_Y_D = (float)int16_Width_TP_Y
                * (float)pstructParam_TP_SW->
                            int16_aHeight_TP_SW[int16_Index];
  flt_Ratio_Y_D /= (float)def_LCD_Lengthwise;
  flt_Ratio_Y_D *= ((float)int16_Ratio_Y_SW_D / 100);



  //------------------------------------------------------------
  // スイッチのXY位置算出
  //------------------------------------------------------------

  // X開始位置 : 左
  flt_Work = (float)pstructParam_TP_SW->
                        int16_aPos_X_Draw_TP_SW[int16_Index];
  flt_Work *= (float)int16_Width_TP_X;
  flt_Work /= (float)def_LCD_Widthwise;

  pstructParam_TP_SW->int16_aPosition_X_TP_SW_Min[int16_Index]
          = (int16_t)(flt_Work + flt_Ratio_X_L)
            + pstructParam_Adjust_TP->int16_Adjust_TP_X_MIN;


  // X終了位置 : 右
  flt_Work = (float)pstructParam_TP_SW->
                        int16_aPos_X_Draw_TP_SW[int16_Index]
           + (float)pstructParam_TP_SW->
                            int16_aWidth_TP_SW[int16_Index];
  flt_Work *= (float)int16_Width_TP_X;
  flt_Work /= (float)def_LCD_Widthwise;

  pstructParam_TP_SW->int16_aPosition_X_TP_SW_Max[int16_Index]
          = (int16_t)(flt_Work - flt_Ratio_X_R)
            + pstructParam_Adjust_TP->int16_Adjust_TP_X_MIN;


  // Y開始位置 : 上
  flt_Work = (float)pstructParam_TP_SW->
                        int16_aPos_Y_Draw_TP_SW[int16_Index];
  flt_Work *= (float)int16_Width_TP_Y;
  flt_Work /= (float)def_LCD_Lengthwise;

  pstructParam_TP_SW->int16_aPosition_Y_TP_SW_Min[int16_Index]
          = (int16_t)(flt_Work + flt_Ratio_Y_U)
            + pstructParam_Adjust_TP->int16_Adjust_TP_Y_MIN;


  // Y終了位置 : 下
  flt_Work = (float)pstructParam_TP_SW->
                        int16_aPos_Y_Draw_TP_SW[int16_Index]
           + (float)pstructParam_TP_SW->
                            int16_aHeight_TP_SW[int16_Index];
  flt_Work *= (float)int16_Width_TP_Y;
  flt_Work /= (float)def_LCD_Lengthwise;

  pstructParam_TP_SW->int16_aPosition_Y_TP_SW_Max[int16_Index]
          = (int16_t)(flt_Work - flt_Ratio_Y_D)
            + pstructParam_Adjust_TP->int16_Adjust_TP_Y_MIN;
  //------------------------------------------------------------
}



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

// int16_t int16_Num_SW : TP SW数
// int16_t *pint16_aFlag_Detect_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)
{
  int16_t int16_I;
  int16_t int16_Return = -1;


  // タッチ位置の判定
  for(int16_I = 0; int16_I <= int16_Num_SW; int16_I++){
    if(pstructParam_TP_SW->
                    int16_aFlag_Detect_TP_SW[int16_I] == 1){
      if((uint16_Position_X
        >= (uint16_t)pstructParam_TP_SW->
                        int16_aPosition_X_TP_SW_Min[int16_I])
        && (uint16_Position_X
        <= (uint16_t)pstructParam_TP_SW->
                        int16_aPosition_X_TP_SW_Max[int16_I])
        && (uint16_Position_Y
        >= (uint16_t)pstructParam_TP_SW->
                        int16_aPosition_Y_TP_SW_Min[int16_I])
        && (uint16_Position_Y
        <= (uint16_t)pstructParam_TP_SW->
                        int16_aPosition_Y_TP_SW_Max[int16_I]))
      {
        // 該当あり
        int16_Return = int16_I;  // スイッチ番号をセット
        break;
      }
    }
  }

  return(int16_Return);  // スイッチ番号
}



//----------------------------------------------------------
// タッチパネル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)
{
  //----------------------------------------------------
  // 呼び出す関数の引数に使用する処理番号は、
  // 必ず static の変数宣言をしてください。
  //----------------------------------------------------
  static uint8_t STC_uint8_JobNum_Time;  // Time_Interval処理番号

  //--------------------------------------------------------
  // Time_Interval用パラメータの構造体の宣言は、
  // 使用する関数内で、必ず static で宣言してください。
  //--------------------------------------------------------
  // Time_Interval用パラメータの構造体の宣言
  //--------------------------------------------------------
  static struct sParam_Time_Interval STC_structParam_Time_Interval;


  static uint8_t STC_uint8_JobNum_TP;  // TP処理番号

  static int16_t STC_int16_Detect;

  static int16_t STC_int16_Num_SW_Previous;
  static int16_t STC_int16_Num_SW;


  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    STC_uint8_JobNum_TP = 0;    // TP処理番号初期化


    STC_int16_Num_SW_Previous = -1;
    STC_int16_Detect = 0;


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    //----------------------------------------------------------
    // Touch Panel 位置取得
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

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


    // 戻り値;
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Get_Position_TouchPanel(&STC_uint8_JobNum_TP,
                                       pstructParam_Position_TP);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }
    else if(int16_Return == 1){
      // NG
      // 処理番号維持 : NG終了の場合、再度、呼び出され
      // Detect_Position_TouchPanelを実行する。
      int16_Return = -2;  // NG
      break;  // NG終了
    }


    // 長手方向をX位置とするために変数にセットし直す。
    pstructParam_Position_TP->uint16_Position_TP_X
        = pstructParam_Position_TP->uint16_aPosition_TP_XYZ[1];
    pstructParam_Position_TP->uint16_Position_TP_Y
        = pstructParam_Position_TP->uint16_aPosition_TP_XYZ[0];


    //----------------------------------------------------------
    // タッチパネルのY位置補正値算出
    //----------------------------------------------------------
    // 引数;
    // struct sParam_Adjust_TP *pstructParam_Adjust_TP :
    //          タッチパネル位置調整用パラメータ構造体のポインタ


    // 戻り値:
    //  Y位置補正値
    //----------------------------------------------------------
    pstructParam_Position_TP->uint16_Position_TP_Y
        = Correct_Pos_TP_Y(&GLB_structParam_Adjust_TP);


    //--------------------------------------
    // スイッチ番号 反転表示処理開始
    //--------------------------------------

    //----------------------------------------------------------
    // タッチパネルのスイッチ番号取得 : 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
    //----------------------------------------------------------
    STC_int16_Num_SW = Detect_TP_SW(
                pstructParam_Position_TP->uint16_Position_TP_X,
                pstructParam_Position_TP->uint16_Position_TP_Y,
                                    int16_Max_Num_SW,
                                    pstructParam_TP_SW);
    // タッチパネルのスイッチ検出判定
    if((STC_int16_Num_SW < 0)
        || (STC_int16_Num_SW > int16_Max_Num_SW)){
      // 検出なし
      STC_int16_Detect = 0;  // 検出回数クリア

      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持 : 現在の処理番号をループ
    }


    //----------------------------------------------------------
    // 2回連続判定
    //----------------------------------------------------------
    if(STC_int16_Detect < 1){
      STC_int16_Num_SW_Previous = STC_int16_Num_SW;
      STC_int16_Detect++;

      // もう一度、TP位置取得
      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持 : 現在の処理番号をループ
    }

    if(STC_int16_Detect < 2){
      if(STC_int16_Num_SW != STC_int16_Num_SW_Previous){
        STC_int16_Num_SW_Previous = STC_int16_Num_SW;
        STC_int16_Detect = 0;  // 検出回数クリア

        int16_Return = -1;  // 処理継続
        break;  // 処理番号維持 : 現在の処理番号をループ
      }
      else{
        STC_int16_Detect++;

        // もう一度、TP位置取得
        int16_Return = -1;  // 処理継続
        break;  // 処理番号維持
      }
    }

    if(STC_int16_Num_SW != STC_int16_Num_SW_Previous){
      // 前回のSwitch番号と一致しない
      STC_int16_Num_SW_Previous = STC_int16_Num_SW;
      STC_int16_Detect = 0;  // 検出回数クリア

      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持 : 現在の処理番号をループ
    }
    //----------------------------------------------------------


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 2:
    //----------------------------------------------------------
    // タッチパネルのスイッチ表示 : 反転表示
    //----------------------------------------------------------
    //----------------------------------------------------------
    // 文字を四角で囲む。
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // uint8_t uint8_Oblong : 縦長/横長
    //    0 : Lengthwise : 縦長 左
    //    1 : Lengthwise : 縦長 右
    //    2 : WidthwiseL : 横長 左
    //    3 : WidthwiseR : 横長 右

    // uint16_t uint16_Font : font指定
    //    0 : 8 x 8 font : ASCII
    //    1 : 16 x 16 font : ASCII
    //    2 : 32 x 32 font : ASCII
    //    3 : 48 x 48 font : ASCII

    // uint8_t uint8_Type : 表示選択
    //      0 : 通常表示
    //      1 : 反転表示

    // uint32_t uint32_ColorCode : カラーコード

    // uint16_t uint16_StartX : 表示開始位置X
    // uint16_t uint16_StartY : 表示開始位置Y

    // uint16_t uint16_Length : 表示文字数
    // uint8_t *puint8_aData :
    //          表示文字コードが格納されているBufferのポインタ


    // 戻り値;
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = XPT2046_TP_Draw_SW(&STC_uint8_JobNum_TP,
                    (uint8_t)def_Dir_Disp_LCD_Sel,
                    pstructParam_TP_SW->
                        uint16_aFont_TP_SW[STC_int16_Num_SW],
                    (uint8_t)1,
                    pstructParam_TP_SW->
                        uint32_aColor_TP_SW[STC_int16_Num_SW],
                    (uint16_t)pstructParam_TP_SW->
                        int16_aPos_X_Draw_TP_SW[STC_int16_Num_SW],
                    (uint16_t)pstructParam_TP_SW->
                        int16_aPos_Y_Draw_TP_SW[STC_int16_Num_SW],
                    strlen((char *)pstructParam_TP_SW->
                        uint8_aDraw_Data_TP_SW[STC_int16_Num_SW]),
                    pstructParam_TP_SW->
                        uint8_aDraw_Data_TP_SW[STC_int16_Num_SW]);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 3:
    //----------------------------------------------------------
    // ブザーを鳴らす。
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // int16_t int16_Time_Beep : Beepを発生する時間


    // 戻り値;
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Generate_Beep(&STC_uint8_JobNum_TP,
                                 (int16_t)def_Time_Beep);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    STC_uint8_JobNum_Time = 0;  // Time_Interval処理番号初期化
    STC_structParam_Time_Interval.uint32_Interval
                    = (uint32_t)def_Time_Print_TP_SW_Reversal;
                                        // 待ち時間セット


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 4:
    //----------------------------------------------------------
    // 時間待ち : 単位 mSec
    //----------------------------------------------------------
    // 戻り値が -1 以外になるまで、繰り返し呼び出してください。
    //----------------------------------------------------------
    // 引数 :
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // struct sParam_Time_Interval *pstructParam_Time_Interval :
    //              Time_Interval用パラメータの構造体のポインタ

    // 戻り値 :
    //   -1 : 処理中 : 時間が経過していない。
    //    0 : OK終了 : 時間が経過した。
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Time_Interval(&STC_uint8_JobNum_Time,
                                 &STC_structParam_Time_Interval);
    if(int16_Return == -1){
      // 処理中 : 時間が経過していない。
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 5:
    //----------------------------------------------------------
    // タッチパネルのスイッチ表示 : 通常表示
    //----------------------------------------------------------
    int16_Return = XPT2046_TP_Draw_SW(&STC_uint8_JobNum_TP,
                    (uint8_t)def_Dir_Disp_LCD_Sel,
                    pstructParam_TP_SW->
                        uint16_aFont_TP_SW[STC_int16_Num_SW],
                    (uint8_t)0,
                    pstructParam_TP_SW->
                        uint32_aColor_TP_SW[STC_int16_Num_SW],
                    (uint16_t)pstructParam_TP_SW->
                        int16_aPos_X_Draw_TP_SW[STC_int16_Num_SW],
                    (uint16_t)pstructParam_TP_SW->
                        int16_aPos_Y_Draw_TP_SW[STC_int16_Num_SW],
                    strlen((char *)pstructParam_TP_SW->
                        uint8_aDraw_Data_TP_SW[STC_int16_Num_SW]),
                    pstructParam_TP_SW->
                        uint8_aDraw_Data_TP_SW[STC_int16_Num_SW]);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = STC_int16_Num_SW;  // OK : スイッチ番号
    break;

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = -2;   // NG
    break;
  }

  return(int16_Return);
}
