/*
 * XPT2046_TP_Adjust.c
 *
 *  Created on: 2025/02/26
 *      Author: egaono-electronics
 */

#include "XPT2046_TP_Adjust.h"

#include "Draw_Buffer_Graphic.h"
#include "Color_Code.h"

#include "XPT2046_TP_Correct_Pos.h"

#include "ILI9341_Display_Clear.h"
#include "ILI9341_Display_ASCII.h"
#include "ILI9341_Display_Graph.h"

#include def_H_Periph_FLASH
#include def_H_Detect_USW
#include def_H_Tester_Save_Load

#include "Time_Interval.h"


#include <stdio.h>
#include <string.h>



//------------------------------------------------------
// タッチパネル位置調整用パラメータの構造体の宣言
//------------------------------------------------------
struct sParam_Adjust_TP GLB_structParam_Adjust_TP;



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

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

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


// 戻り値;
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Adjust_TP(uint8_t *puint8_JobNum,
        struct sParam_Adjust_TP *pstructParam_Adjust_TP,
        struct sParam_Position_TP *pstructParam_Position_TP)
{
  //----------------------------------------------------
  // 呼び出す関数の引数に使用する処理番号は、
  // 必ず 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_LCD;  // LCD表示処理番号


  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    STC_uint8_JobNum_LCD = 0;   // LCD表示処理番号初期化


    pstructParam_Adjust_TP->uint8_Num_Pos = 'x';
    pstructParam_Adjust_TP->int16_Pos_Ave = 0;


    //----------------------------------------------------------
    // タッチパネルの位置調整用のXY検出値初期化
    //----------------------------------------------------------
    pstructParam_Adjust_TP->int16_Adjust_TP_X_1 = -1;
                            // タッチパネル調整位置_X_1初期化
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_1 = -1;
                            // タッチパネル調整位置_Y_1初期化

    pstructParam_Adjust_TP->int16_Adjust_TP_X_2 = -1;
                            // タッチパネル調整位置_X_2初期化
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_2 = -1;
                            // タッチパネル調整位置_Y_2初期化

    pstructParam_Adjust_TP->int16_Adjust_TP_X_3 = -1;
                            // タッチパネル調整位置_X_3初期化
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_3 = -1;
                            // タッチパネル調整位置_Y_3初期化

    pstructParam_Adjust_TP->int16_Adjust_TP_X_4 = -1;
                            // タッチパネル調整位置_X_4初期化
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_4 = -1;
                            // タッチパネル調整位置_Y_4初期化
    //----------------------------------------------------------


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

  case 1:
    //----------------------------------------------------------
    // 画面表示をクリアする。
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ


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


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

  case 2:
    //----------------------------------------------------------
    // タッチパネル調整用タッチ位置表示: コーナー 4箇所
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ


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


    pstructParam_Adjust_TP->int16_Count_Repeat = 0;
                                        // 繰り返し回数初期化
    pstructParam_Adjust_TP->int16_Count_Repeat_Finish = 0;
                            // 終了チェック用繰り返し回数初期化


    //----------------------------------------------------------
    // TP位置取得パラメータセット : 調整用
    //----------------------------------------------------------
    pstructParam_Position_TP->int16_Number_TP_Idle
                    = (int16_t)def_Number_Adjust_TP_Idle;

    pstructParam_Position_TP->int16_Size_TP_Buffer
                    = (int16_t)def_Size_Adjust_TP_Buffer;

    pstructParam_Position_TP->int16_Number_Get_TP_XY
                    = (int16_t)def_Number_Get_Adjust_TP_XY;

    pstructParam_Position_TP->int16_Number_TP_Average
                    = (int16_t)def_Number_Adjust_TP_Average;

    pstructParam_Position_TP->int16_Number_TP_Except_F
                    = (int16_t)def_Number_Adjust_TP_Except_F;

    pstructParam_Position_TP->int16_Start_TP_Average
                    = (int16_t)def_Start_Adjust_TP_Average;

    pstructParam_Position_TP->int16_End_TP_Average
                    = (int16_t)def_End_Adjust_TP_Average;
    //----------------------------------------------------------


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

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

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

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


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


    //----------------------------------------------------------
    // タッチパネル調整終了
    //----------------------------------------------------------

    //----------------------------------------------------------
    // タッチパネルの位置情報保存
    //----------------------------------------------------------
    // 引数;
    // struct sParam_Adjust_TP *pstructParam_Adjust_TP :
    //          タッチパネル位置調整用パラメータ構造体のポインタ


    // 戻り値;
    //    なし
    //----------------------------------------------------------
    Save_Param_Pos_TP(pstructParam_Adjust_TP);


    //----------------------------------------------------------
    // タッチパネルのY位置補正係数算出
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

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


    // 戻り値;
    //    なし
    //----------------------------------------------------------
    Calc_Correction_Coefficent_Pos_TP_Y(pstructParam_Adjust_TP);


    //----------------------------------------------------------
    // タッチパネル調整値をFlash Memoryに保存する。
    //----------------------------------------------------------
    // 引数;
    // struct sParam_Adjust_TP *pstructParam_Adjust_TP :
    //          タッチパネル位置調整用パラメータ構造体のポインタ


    // 戻り値:
    //    0 : OK
    //    1 : NG
    //----------------------------------------------------------
    Save_Adjust_TP(pstructParam_Adjust_TP);


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


    (*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 = 0;  // 処理番号初期化
    int16_Return = 0;    // OK終了
    break;

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

  return(int16_Return);
}



//----------------------------------------------------------
// タッチパネル調整用タッチ位置表示
//----------------------------------------------------------
// タッチ位置番号 1 - 4 を反転表示する。: コーナー 4箇所
//----------------------------------------------------------
// 引数;
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ


// 戻り値;
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Draw_Adjust_Position(uint8_t *puint8_JobNum)
{
  static uint8_t STC_uint8_JobNum_LCD;  // LCD処理番号

  static uint16_t STC_uint16_StartX;
  static uint16_t STC_uint16_StartY;

  static uint16_t STC_uint16_Length;

  static uint8_t STC_uint8_aData[32];

  uint16_t uint16_Position_Rect = 0;
  uint16_t uint16_Position_DrawBuffer = 0;

  int16_t int16_I;
  int16_t int16_Return;


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

    STC_uint8_aData[0] = '1';  // 表示データをセット


    // タッチパネル上のタッチ位置 1  の番号表示位置を指定する。
    STC_uint16_StartX = (uint16_t)def_Position_X_Touch_N_1;
    STC_uint16_StartY = (uint16_t)def_Position_Y_Touch_N_1;


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

  case 1:
    //----------------------------------
    // タッチ位置番号を反転表示する。
    //----------------------------------

    //----------------------------------------------------------
    // LCD文字表示 : ASCII : Font指定 : ILI9341
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // int16_t int16_Check_Semaphore : セマフォチェック有無
    //    0 : チェックなし
    //    1 : チェックあり

    // 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_Oblong : 縦長/横長
    //    0 : Lengthwise : 縦長 左
    //    1 : Lengthwise : 縦長 右
    //    2 : WidthwiseL : 横長 左
    //    3 : WidthwiseR : 横長 右

    // uint8_t uint8_Type : 表示選択
    //      0 : 通常表示
    //      1 : 反転表示
    //      2 : 通常表示の上書き
    //      3 : 反転表示の上書き

    // 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 = ILI9341_SPI_Display_ASCII(
                            &STC_uint8_JobNum_LCD,
                            1,
                            (uint16_t)def_Font_ASCII_8x8,
                            (uint8_t)def_Dir_Disp_LCD_Sel, 1,
                            (uint32_t)def_Code_Yellow,
                            STC_uint16_StartX, STC_uint16_StartY,
                            1, STC_uint8_aData);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    STC_uint8_aData[0]++;  // タッチ位置番号インクリメント
    if(STC_uint8_aData[0] > '4'){
      // 1 - 4 の番号表示終了

      (*puint8_JobNum)++;  // 次の処理番号に移行する。
                        // : 1 - 4 の位置の四角表示に移行する。
      int16_Return = -1;   // 処理継続
      break;
    }


    if(STC_uint8_aData[0] == '2'){
      // タッチパネル上のタッチ位置 2  の番号表示位置を指定する。
      STC_uint16_StartX = (uint16_t)def_Position_X_Touch_N_2;
      STC_uint16_StartY = (uint16_t)def_Position_Y_Touch_N_2;
    }
    else if(STC_uint8_aData[0] == '3'){
      // タッチパネル上のタッチ位置 3  の番号表示位置を指定する。
      STC_uint16_StartX = (uint16_t)def_Position_X_Touch_N_3;
      STC_uint16_StartY = (uint16_t)def_Position_Y_Touch_N_3;
    }
    else if(STC_uint8_aData[0] == '4'){
      // タッチパネル上のタッチ位置 4  の番号表示位置を指定する。
      STC_uint16_StartX = (uint16_t)def_Position_X_Touch_N_4;
      STC_uint16_StartY = (uint16_t)def_Position_Y_Touch_N_4;
    }
    else{
      // あり得ない番号
      *puint8_JobNum = 0;  // 処理番号初期化
      int16_Return = 1;    // NG終了
      break;
    }


    //--------------------------------------------------
    // 1 ～ 4 のタッチ位置番号を描画するまで繰り返す。
    //--------------------------------------------------
    // 次のタッチ位置番号表示
    //--------------------------------------------------
    int16_Return = -1;   // 処理継続
    break;  // 処理番号維持 : 現在の処理番号をループ

  case 2:
    //------------------------------------------------------
    // タッチパネル上のタッチ位置 1 - 4  の四角表示
    //------------------------------------------------------

    //--------------------------------------------------
    // セマフォチェック
    //--------------------------------------------------
    if(GLB_int8_Semaphore_LCD != 0){
      // 他のモジュールがセマフォを使用中
      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持 : 現在の処理番号をループ
    }

    GLB_int8_Semaphore_LCD = 1;  // セマフォ取得
    //--------------------------------------------------


    // 描画Bufferクリア
    for(int16_I = 0; int16_I < 64; int16_I++){
      GLB_uint8_aDrawBuffer_LCD[int16_I] = 0;
    }

    //--------------------------------------
    // 4 x 4 dots の四角の描画を行う。
    //--------------------------------------

    //----------------------------------------------------------
    // 描画Bufferに四角を描く(塗りつぶす)
    //----------------------------------------------------------
    // int16_StartX : 開始位置X(X座標)
    // int16_StartY : 開始位置Y(Y座標)

    // int16_EndX : 終了位置X(X座標)
    // int16_EndY : 終了位置Y(Y座標)

    // int16_Type :
    //    0 : 描画dot OFF
    //    1 : 描画dot ON

    // int16_t int16_AreaWidth : 描画領域の幅
    // int16_t int16_AreaHeight : 描画領域の高さ

    // uint8_t *puint8_aDrawBuffer : 描画Bufferのポインタ
    //----------------------------------------------------------
    DrawRectP((int16_t)0, (int16_t)0,
              (int16_t)3, (int16_t)3,
              1,
              (int16_t)4, (int16_t)4,
              GLB_uint8_aDrawBuffer_LCD);


    // 描画高さ分の送信データを作成する。
    for(int16_I = 0; int16_I < 4; int16_I++){
      //--------------------------------------------------------
      // LCD表示用送信データ作成(カラーコード指定)  : RGB 2byte
      //--------------------------------------------------------
      // uint32_t uint32_ColorCode : カラーコード

      // uint16_t uint16_Width : 表示領域の幅
      // uint16_t uint16_Position : DrawDataの位置
      // uint8_t *puint8_aDrawData :
      //                Drawデータが格納されたBufferのポインタ
      // uint8_t *puint8_aSendData :
      //                送信データを格納するBufferのポインタ
      //--------------------------------------------------------
      MakeSendData_1Line_ColorCode_2byte(
                          (uint32_t)def_Code_Magenta,
                          (uint16_t)4, uint16_Position_Rect,
                          GLB_uint8_aDrawBuffer_LCD,
        &GLB_uint8_aWork_1Line_LCD[uint16_Position_DrawBuffer]);

      uint16_Position_Rect += (uint16_t)1;
                            // 次のグラフデータの位置に進める。

      // RGBデータを格納する次の位置を算出
      uint16_Position_DrawBuffer += (uint16_t)4 * def_RGB_byte;
    }


    //----------------------------------------------------------
    // 最初に描画する位置の番号と表示位置
    //----------------------------------------------------------
    STC_uint8_aData[0] = 1;  // 四角表示位置の番号をセット

    // タッチパネル上のタッチ位置 1  の四角表示位置を指定する。
    STC_uint16_StartX = (uint16_t)def_Position_X_Touch_S_1;
    STC_uint16_StartY = (uint16_t)def_Position_Y_Touch_S_1;
    //----------------------------------------------------------


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

  case 3:
    //----------------------------------------------------------
    // LCDにグラフデータを送信する。: ILI_9341
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

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

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

    // uint16_t uint16_Width : 表示幅
    // uint16_t uint16_Height : 表示高さ

    // uint8_t *puint8_aGraphData :
    //              Graphデータが格納されているBufferのポインタ


    // 戻り値;
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = ILI9341_SPI_Send_GraphData(
                                &STC_uint8_JobNum_LCD,
                                (uint8_t)def_Dir_Disp_LCD_Sel,
                        STC_uint16_StartX, STC_uint16_StartY,
                                (uint16_t)4, (uint16_t)4,
                                GLB_uint8_aWork_1Line_LCD);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

    STC_uint8_aData[0]++;  // 四角表示位置の番号インクリメント
    if(STC_uint8_aData[0] > 4){
      // 1 - 4 の位置の四角表示終了

      // 表示コメントをセット
      strcpy((char *)STC_uint8_aData, "Adjust a TP");
      STC_uint16_Length
                = (uint16_t)strlen((char *)STC_uint8_aData);

      // コメント表示位置指定
      STC_uint16_StartX = (uint16_t)def_Position_X_Comment_1;
      STC_uint16_StartY = (uint16_t)def_Position_Y_Comment_1;


      //------------------------------------------------
      GLB_int8_Semaphore_LCD = 0;  // セマフォ解放
      //------------------------------------------------


      (*puint8_JobNum)++;  // 次の処理番号に移行する。
                           // : コメント表示に移行する。
      int16_Return = -1;   // 処理継続
      break;
    }


    if(STC_uint8_aData[0] == 2){
      // タッチパネル上のタッチ位置 2  の四角表示位置を指定する。
      STC_uint16_StartX = (uint16_t)def_Position_X_Touch_S_2;
      STC_uint16_StartY = (uint16_t)def_Position_Y_Touch_S_2;
    }
    else if(STC_uint8_aData[0] == 3){
      // タッチパネル上のタッチ位置 3  の四角表示位置を指定する。
      STC_uint16_StartX = (uint16_t)def_Position_X_Touch_S_3;
      STC_uint16_StartY = (uint16_t)def_Position_Y_Touch_S_3;
    }
    else if(STC_uint8_aData[0] == 4){
      // タッチパネル上のタッチ位置 4  の四角表示位置を指定する。
      STC_uint16_StartX = (uint16_t)def_Position_X_Touch_S_4;
      STC_uint16_StartY = (uint16_t)def_Position_Y_Touch_S_4;
    }
    else{
      // あり得ない番号
      //------------------------------------------------
      GLB_int8_Semaphore_LCD = 0;  // セマフォ解放
      //------------------------------------------------

      *puint8_JobNum = 0;  // 処理番号初期化
      int16_Return = 1;    // NG終了
      break;
    }


    //----------------------------------------------
    // 1 ～ 4 のタッチ位置を描画するまで繰り返す。
    //----------------------------------------------
    // 次のタッチ位置表示
    //----------------------------------------------
    int16_Return = -1;   // 処理継続
    break;  // 処理番号維持 : 現在の処理番号をループ

  case 4:
    //------------------------------------------
    // "Adjust a TP" を表示する。
    //------------------------------------------
    //----------------------------------------------------------
    // LCD文字表示 : ASCII : Font選択 : ILI9341
    //----------------------------------------------------------
    int16_Return = ILI9341_SPI_Display_ASCII(
                            &STC_uint8_JobNum_LCD,
                            1,
                            (uint16_t)def_Font_ASCII_16x16,
                            (uint8_t)def_Dir_Disp_LCD_Sel, 0,
                            (uint32_t)def_Code_Cyan,
                        STC_uint16_StartX, STC_uint16_StartY,
                        STC_uint16_Length, STC_uint8_aData);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    strcpy((char *)STC_uint8_aData, "Click 1 to 4.");
    STC_uint16_Length
            = (uint16_t)strlen((char *)STC_uint8_aData);

    // コメント表示位置指定
    STC_uint16_StartX = (uint16_t)def_Position_X_Comment_2;
    STC_uint16_StartY = (uint16_t)def_Position_Y_Comment_2;


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

  case 5:
    //------------------------------------------
    // "Click 1 to 4." を表示する。
    //------------------------------------------
    //----------------------------------------------------------
    // LCD文字表示 : ASCII : Font選択 : ILI9341
    //----------------------------------------------------------
    int16_Return = ILI9341_SPI_Display_ASCII(
                            &STC_uint8_JobNum_LCD,
                            1,
                            (uint16_t)def_Font_ASCII_16x16,
                            (uint8_t)def_Dir_Disp_LCD_Sel, 0,
                            (uint32_t)def_Code_Cyan,
                        STC_uint16_StartX, STC_uint16_StartY,
                        STC_uint16_Length, STC_uint8_aData);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    strcpy((char *)STC_uint8_aData, "-");
    STC_uint16_Length
                = (uint16_t)strlen((char *)STC_uint8_aData);

    // コメント表示位置指定
    STC_uint16_StartX = (uint16_t)def_Position_X_Num;
    STC_uint16_StartY = (uint16_t)def_Position_Y_Num;


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

  case 6:
    //----------------------------------------------
    // "-" を表示する。 : 押された番号を表示する部分
    //----------------------------------------------
    //----------------------------------------------------------
    // LCD文字表示 : ASCII : Font選択 : ILI9341
    //----------------------------------------------------------
    int16_Return = ILI9341_SPI_Display_ASCII(
                            &STC_uint8_JobNum_LCD,
                            1,
                            (uint16_t)def_Font_ASCII_16x16,
                            (uint8_t)def_Dir_Disp_LCD_Sel, 0,
                            (uint32_t)def_Code_Cyan,
                        STC_uint16_StartX, STC_uint16_StartY,
                        STC_uint16_Length, STC_uint8_aData);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


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

  case 7:
    //------------------------------------------
    // "X :" : 16 x 16 dot
    //------------------------------------------
    //--------------------------------------------------
    // 横長表示 右
    //--------------------------------------------------
    //----------------------------------------------------------
    // LCD文字表示 : ASCII : Font選択 : ILI9341
    //----------------------------------------------------------
    int16_Return = ILI9341_SPI_Display_ASCII(
                            &STC_uint8_JobNum_LCD,
                            1,
                            (uint16_t)def_Font_ASCII_16x16,
                            (uint8_t)def_Dir_Disp_LCD_Sel, 0,
                            (uint32_t)def_Code_Lime,
                            (uint16_t)def_Position_X_TP_X_Item,
                            (uint16_t)def_Position_Y_TP_X_Item,
                            3, (uint8_t *)"X :");
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


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

  case 8:
    //------------------------------------------
    // "Y :" : 16 x 16 dot
    //------------------------------------------
    //--------------------------------------------------
    // 横長表示 右
    //--------------------------------------------------
    //----------------------------------------------------------
    // LCD文字表示 : ASCII : Font選択 : ILI9341
    //----------------------------------------------------------
    int16_Return = ILI9341_SPI_Display_ASCII(
                            &STC_uint8_JobNum_LCD,
                            1,
                            (uint16_t)def_Font_ASCII_16x16,
                            (uint8_t)def_Dir_Disp_LCD_Sel, 0,
                            (uint32_t)def_Code_Lime,
                            (uint16_t)def_Position_X_TP_Y_Item,
                            (uint16_t)def_Position_Y_TP_Y_Item,
                            3, (uint8_t *)"Y :");
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 0;    // OK終了
    break;

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG終了
    break;
  }

  return(int16_Return);
}



//----------------------------------------------------------
// タッチパネルのXY位置表示
//----------------------------------------------------------
// 引数;
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

// uint16_t uint16_X : X位置
// uint16_t uint16_Y : Y位置

// uint16_t uint16_Pos_X_X : X表示位置 X
// uint16_t uint16_Pos_Y_X : X表示位置 Y

// uint16_t uint16_Pos_X_Y : Y表示位置 X
// uint16_t uint16_Pos_Y_Y : Y表示位置 Y


// 戻り値;
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Display_TP_XY(uint8_t *puint8_JobNum,
            uint16_t uint16_X, uint16_t uint16_Y,
            uint16_t uint16_Pos_X_X, uint16_t uint16_Pos_Y_X,
            uint16_t uint16_Pos_X_Y, uint16_t uint16_Pos_Y_Y)
{
  static uint8_t STC_uint8_JobNum_LCD;  // LCD処理番号

  static uint8_t STC_uint8_aX[16];  // X位置表示用Buffer
  static uint8_t STC_uint8_aY[16];  // Y位置表示用Buffer


  int16_t int16_Return;


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


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

  case 1:
    // X位置セット
    sprintf((char *)STC_uint8_aX, "%4u",
                            (unsigned int)uint16_X);

    // Y位置セット
    sprintf((char *)STC_uint8_aY, "%4u",
                            (unsigned int)uint16_Y);


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

  case 2:
    //------------------
    // X位置表示
    //------------------
    //--------------------------------------------------
    // 横長表示 右 : 16 x 16 dot
    //--------------------------------------------------
    //----------------------------------------------------------
    // LCD文字表示 : ASCII : Font選択 : ILI9341
    //----------------------------------------------------------
    int16_Return = ILI9341_SPI_Display_ASCII(
                            &STC_uint8_JobNum_LCD,
                            1,
                            (uint16_t)def_Font_ASCII_16x16,
                            (uint8_t)def_Dir_Disp_LCD_Sel, 0,
                            (uint32_t)def_Code_White,
                            uint16_Pos_X_X,
                            uint16_Pos_Y_X,
                            4, STC_uint8_aX);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


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

  case 3:
    //------------------
    // Y位置表示
    //------------------
    //--------------------------------------------------
    // 横長表示 右 : 16 x 16 dot
    //--------------------------------------------------
    //----------------------------------------------------------
    // LCD文字表示 : ASCII : Font選択 : ILI9341
    //----------------------------------------------------------
    int16_Return = ILI9341_SPI_Display_ASCII(
                                &STC_uint8_JobNum_LCD,
                                1,
                                (uint16_t)def_Font_ASCII_16x16,
                                (uint8_t)def_Dir_Disp_LCD_Sel, 0,
                                (uint32_t)def_Code_White,
                                uint16_Pos_X_Y,
                                uint16_Pos_Y_Y,
                                4, STC_uint8_aY);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 0;    // OK終了
    break;

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG終了
    break;
  }

  return(int16_Return);
}



//----------------------------------------------------------
// タッチ位置番号 1 - 4 と x, y 位置を表示する。
//----------------------------------------------------------
// 引数;
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

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

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


// 戻り値;
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//    2 : 該当なし
//----------------------------------------------------------
int16_t Draw_Num_Pos(uint8_t *puint8_JobNum,
        struct sParam_Adjust_TP *pstructParam_Adjust_TP,
        struct sParam_Position_TP *pstructParam_Position_TP)
{
  static uint8_t STC_uint8_JobNum_LCD;  // LCD処理番号
  static uint8_t STC_uint8_JobNum_TP;  // TP処理番号


  int16_t int16_Return;
  int16_t int16_I;


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


    pstructParam_Adjust_TP->uint8_Num_Pos = 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
      pstructParam_Adjust_TP->int16_Count_Repeat = 0;
                                        // 繰り返し回数初期化
      int16_Return = -1;  // 処理中
      break;  // 処理番号維持 : 処理継続
    }


    // 長手方向を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];


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

  case 2:
    //----------------------------------------------------------
    // タッチパネルのXY位置表示
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // uint16_t uint16_X : X位置
    // uint16_t uint16_Y : Y位置

    // uint16_t uint16_Pos_X_X : X表示位置 X
    // uint16_t uint16_Pos_Y_X : X表示位置 Y

    // uint16_t uint16_Pos_X_Y : Y表示位置 X
    // uint16_t uint16_Pos_Y_Y : Y表示位置 Y


    // 戻り値;
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Display_TP_XY(&STC_uint8_JobNum_LCD,
                    pstructParam_Position_TP->
                                        uint16_Position_TP_X,
                    pstructParam_Position_TP->
                                        uint16_Position_TP_Y,
                    (uint16_t)def_Position_X_TP_X_Value,
                    (uint16_t)def_Position_Y_TP_X_Value,
                    (uint16_t)def_Position_X_TP_Y_Value,
                    (uint16_t)def_Position_Y_TP_Y_Value);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    //----------------------------------------------------------
    // XY調整位置の判定とセット
    //----------------------------------------------------------
    // 引数;
    // uint16_t uint16_Position_TP_X : X位置
    // uint16_t uint16_Position_TP_Y : Y位置

    // struct sParam_Adjust_TP *pstructParam_Adjust_TP
    //                 : 調整用パラメータ構造体のポインタ

    // 戻り値;
    //   -2 : 繰り返し回数が達していない
    //    0 : OK終了
    //    2 : 該当なし
    //----------------------------------------------------------
    int16_Return = Check_Pos_XY(
                   pstructParam_Position_TP->
                                        uint16_Position_TP_X,
                   pstructParam_Position_TP->
                                        uint16_Position_TP_Y,
                   pstructParam_Adjust_TP);
    if(int16_Return == -2){
      // 繰り返し回数が達していない
      int16_Return = -1;   // 処理継続
      (*puint8_JobNum)--;  // 処理番号デクリメント
                    // Touch Panel 位置検出に戻る。: case 1:
      break;
    }
    else if(int16_Return == 2){
      // 該当なしの場合、戻り値を返す。
      *puint8_JobNum = 0;  // 処理番号初期化
      break;  // 終了
    }
    // OK終了の場合、次の処理番号に移行する。


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

  case 3:
    //------------------------------------------
    // 押された番号とXY平均値を表示する。
    //------------------------------------------
    //----------------------------------------------------------
    // タッチパネルの調整位置番号とXY位置表示
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

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


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


    pstructParam_Adjust_TP->uint8_Num_Pos = '\0';
                                        // 表示番号クリア

    pstructParam_Adjust_TP->int16_Count_Repeat = 0;
                                        // 繰り返し回数初期化

    pstructParam_Adjust_TP->int16_Pos_Ave = 0;
                                        // 格納位置クリア

    // X位置格納Bufferクリア
    for(int16_I = 0;
        int16_I < (int16_t)def_Ave_TP_Adjust; int16_I++){
      pstructParam_Adjust_TP->uint16_aPos_Buf_X[int16_I] = 0;
    }

    // Y位置格納Bufferクリア
    for(int16_I = 0;
        int16_I < (int16_t)def_Ave_TP_Adjust; int16_I++){
      pstructParam_Adjust_TP->uint16_aPos_Buf_Y[int16_I] = 0;
    }


    pstructParam_Adjust_TP->int16_Count_Repeat_Finish = 0;
                                // 調整終了繰り返し回数クリア

    pstructParam_Adjust_TP->uint8_Num_Pos = 0;
                                    // 調整位置の番号を初期化


    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 0;    // OK終了
    break;

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG終了
    break;
  }

  return(int16_Return);
}



//----------------------------------------------------------
// XY調整位置の判定とセット
//----------------------------------------------------------
// 引数;
// uint16_t uint16_Position_TP_X : X位置
// uint16_t uint16_Position_TP_Y : Y位置

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

// 戻り値;
//   -2 : 繰り返し回数が達していない
//    0 : OK終了
//    2 : 該当なし
//----------------------------------------------------------
int16_t Check_Pos_XY(uint16_t uint16_Position_TP_X,
                     uint16_t uint16_Position_TP_Y,
            struct sParam_Adjust_TP *pstructParam_Adjust_TP)
{
  int16_t int16_Return = 0;

  int16_t int16_I;
  uint32_t uint32_Work;


  int16_Return = -2;

  //----------------------------------------
  // XY調整位置の判定とセット
  //----------------------------------------
  if((uint16_Position_TP_X < (uint16_t)def_Adjust_X_1)
        && (uint16_Position_TP_Y < (uint16_t)def_Adjust_Y_1))
  {
    //--------------------------------------------------
    // 調整位置 1 が押されている場合の処理
    //--------------------------------------------------
    //----------------------------------------------------------
    // 調整位置チェック
    //----------------------------------------------------------
    // 引数;
    // uint8_t uint8_Num : 調整位置番号

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


    // 戻り値;
    //   -2 : 繰り返し回数が達していない。
    //    0 : OK終了
    //----------------------------------------------------------
    int16_Return = Check_Adust_Position('1',
                                        pstructParam_Adjust_TP);
  }
  else if((uint16_Position_TP_X > (uint16_t)def_Adjust_X_2)
        && (uint16_Position_TP_Y < (uint16_t)def_Adjust_Y_2))
  {
    //--------------------------------------------------
    // 調整位置 2 が押されている場合の処理
    //--------------------------------------------------
    //----------------------------------------------------------
    // 調整位置チェック
    //----------------------------------------------------------
    // 引数;
    // uint8_t uint8_Num : 調整位置番号

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


    // 戻り値;
    //   -2 : 繰り返し回数が達していない。
    //    0 : OK終了
    //----------------------------------------------------------
    int16_Return = Check_Adust_Position('2',
                                        pstructParam_Adjust_TP);
  }
  else if((uint16_Position_TP_X < (uint16_t)def_Adjust_X_3)
        && (uint16_Position_TP_Y > (uint16_t)def_Adjust_Y_3))
  {
    //--------------------------------------------------
    // 調整位置 3 が押されている場合の処理
    //--------------------------------------------------
    //----------------------------------------------------------
    // 調整位置チェック
    //----------------------------------------------------------
    // 引数;
    // uint8_t uint8_Num : 調整位置番号

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


    // 戻り値;
    //   -2 : 繰り返し回数が達していない。
    //    0 : OK終了
    //----------------------------------------------------------
    int16_Return = Check_Adust_Position('3',
                                        pstructParam_Adjust_TP);
  }
  else if((uint16_Position_TP_X > (uint16_t)def_Adjust_X_4)
        && (uint16_Position_TP_Y > (uint16_t)def_Adjust_Y_4))
  {
    //--------------------------------------------------
    // 調整位置 4 が押されている場合の処理
    //--------------------------------------------------
    //----------------------------------------------------------
    // 調整位置チェック
    //----------------------------------------------------------
    // 引数;
    // uint8_t uint8_Num : 調整位置番号

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


    // 戻り値;
    //   -2 : 繰り返し回数が達していない。
    //    0 : OK終了
    //----------------------------------------------------------
    int16_Return = Check_Adust_Position('4',
                                        pstructParam_Adjust_TP);
  }
  else{
    pstructParam_Adjust_TP->int16_Count_Repeat = 0;
                                    // 繰り返し回数初期化
    pstructParam_Adjust_TP->uint8_Num_Pos = 0;
                                    // 調整位置の番号を初期化

    return(2);   // 該当なし
  }


  //--------------------------------------------------------
  // 調整位置のいずれかがタッチされている場合の処理
  //--------------------------------------------------------

  //--------------------------------------------------------
  // 平均値算出用バッファに X位置 と Y位置 をセット
  //--------------------------------------------------------
  pstructParam_Adjust_TP->
    uint16_aPos_Buf_X[pstructParam_Adjust_TP->int16_Pos_Ave]
                             = uint16_Position_TP_X;
  pstructParam_Adjust_TP->
    uint16_aPos_Buf_Y[pstructParam_Adjust_TP->int16_Pos_Ave]
                             = uint16_Position_TP_Y;


  pstructParam_Adjust_TP->int16_Pos_Ave++;
                                // バッファのセット位置を更新
  if(pstructParam_Adjust_TP->int16_Pos_Ave
                          >= (int16_t)def_Ave_TP_Adjust){
    pstructParam_Adjust_TP->int16_Pos_Ave = 0;
  }


  // 戻り値をチェック
  if(int16_Return == -2){
    return(-2);  // 繰り返し回数が達していない。
                 // (検出回数に達していない。)
  }


  //--------------------------------------------------------
  // 調整位置のいずれかが検出回数に達した場合の処理
  //--------------------------------------------------------

  //------------------------------------------------------------
  // X位置セット
  //------------------------------------------------------------
  // 平均値算出
  //------------------------------------------------------------
  uint32_Work = 0;

  for(int16_I = 0;
          int16_I < (int16_t)def_Ave_TP_Adjust; int16_I++){
    uint32_Work += (uint32_t)pstructParam_Adjust_TP->
                                    uint16_aPos_Buf_X[int16_I];
  }

  pstructParam_Adjust_TP->int16_Adjust_TP_X
       = (int16_t)(uint32_Work / (int16_t)def_Ave_TP_Adjust);
  //------------------------------------------------------------


  //------------------------------------------------------------
  // Y位置セット
  //------------------------------------------------------------
  // 平均値算出
  //------------------------------------------------------------
  uint32_Work = 0;

  for(int16_I = 0;
          int16_I < (int16_t)def_Ave_TP_Adjust; int16_I++){
    uint32_Work += (uint32_t)pstructParam_Adjust_TP->
                                    uint16_aPos_Buf_Y[int16_I];
  }

  pstructParam_Adjust_TP->int16_Adjust_TP_Y
       = (int16_t)(uint32_Work / (int16_t)def_Ave_TP_Adjust);
  //------------------------------------------------------------


  if(pstructParam_Adjust_TP->uint8_Num_Pos == '1'){
    // XY 1 位置セット
    pstructParam_Adjust_TP->int16_Adjust_TP_X_1
        = pstructParam_Adjust_TP->int16_Adjust_TP_X;  // X位置
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_1
        = pstructParam_Adjust_TP->int16_Adjust_TP_Y;  // Y位置
  }
  else if(pstructParam_Adjust_TP->uint8_Num_Pos == '2'){
    // XY 2 位置セット
    pstructParam_Adjust_TP->int16_Adjust_TP_X_2
        = pstructParam_Adjust_TP->int16_Adjust_TP_X;  // X位置
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_2
        = pstructParam_Adjust_TP->int16_Adjust_TP_Y;  // Y位置
  }
  else if(pstructParam_Adjust_TP->uint8_Num_Pos == '3'){
    // XY 3 位置セット
    pstructParam_Adjust_TP->int16_Adjust_TP_X_3
        = pstructParam_Adjust_TP->int16_Adjust_TP_X;  // X位置
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_3
        = pstructParam_Adjust_TP->int16_Adjust_TP_Y;  // Y位置
  }
  else if(pstructParam_Adjust_TP->uint8_Num_Pos == '4'){
    // XY 4 位置セット
    pstructParam_Adjust_TP->int16_Adjust_TP_X_4
        = pstructParam_Adjust_TP->int16_Adjust_TP_X;  // X位置
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_4
        = pstructParam_Adjust_TP->int16_Adjust_TP_Y;  // Y位置
  }


  pstructParam_Adjust_TP->int16_Count_Repeat = 0;
                                        // 繰り返し回数初期化


  return(0);  // OK終了
}



//----------------------------------------------------------
// 調整位置チェック
//----------------------------------------------------------
// 引数;
// uint8_t uint8_Num : 調整位置番号

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


// 戻り値;
//   -2 : 繰り返し回数が達していない。
//    0 : OK終了
//----------------------------------------------------------
int16_t Check_Adust_Position(uint8_t uint8_Num,
            struct sParam_Adjust_TP *pstructParam_Adjust_TP)
{
  int16_t int16_Return;


  // 以前の調整位置をチェック
  if(pstructParam_Adjust_TP->uint8_Num_Pos != uint8_Num){
    pstructParam_Adjust_TP->int16_Count_Repeat = 0;
                                    // 繰り返し回数初期化
    pstructParam_Adjust_TP->uint8_Num_Pos = uint8_Num;
                                    // 調整位置の番号をセット
  }

  pstructParam_Adjust_TP->int16_Count_Repeat++;
                            // 繰り返し回数をインクリメント
  if(pstructParam_Adjust_TP->int16_Count_Repeat
                < (int16_t)def_Repeat_TP_Adjust){
    // 繰り返し回数が達していない。
    int16_Return = -2;   // 戻り値に -2 をセット
  }
  else{
    int16_Return = 0;  // OKをセット
  }

  return(int16_Return);
}


//----------------------------------------------------------
// タッチパネルの調整位置番号とXY位置表示
//----------------------------------------------------------
// 引数;
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

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


// 戻り値;
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Print_TP_Num_XY(uint8_t *puint8_JobNum,
            struct sParam_Adjust_TP *pstructParam_Adjust_TP)
{
  static uint8_t STC_uint8_JobNum_LCD;  // LCD処理番号

  static uint16_t STC_uint16_Pos_X_X;
  static uint16_t STC_uint16_Pos_Y_X;
  static uint16_t STC_uint16_Pos_X_Y;
  static uint16_t STC_uint16_Pos_Y_Y;


  int16_t int16_Return;


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


    if(pstructParam_Adjust_TP->uint8_Num_Pos == '1'){
      // 調整位置番号 1 の XY値 表示位置セット
      STC_uint16_Pos_X_X = (uint16_t)def_Pos_X_Num_1_X;
      STC_uint16_Pos_Y_X = (uint16_t)def_Pos_Y_Num_1_X;
      STC_uint16_Pos_X_Y = (uint16_t)def_Pos_X_Num_1_Y;
      STC_uint16_Pos_Y_Y = (uint16_t)def_Pos_Y_Num_1_Y;
    }
    else if(pstructParam_Adjust_TP->uint8_Num_Pos == '2'){
      // 調整位置番号 2 の XY値 表示位置セット
      STC_uint16_Pos_X_X = (uint16_t)def_Pos_X_Num_2_X;
      STC_uint16_Pos_Y_X = (uint16_t)def_Pos_Y_Num_2_X;
      STC_uint16_Pos_X_Y = (uint16_t)def_Pos_X_Num_2_Y;
      STC_uint16_Pos_Y_Y = (uint16_t)def_Pos_Y_Num_2_Y;
    }
    else if(pstructParam_Adjust_TP->uint8_Num_Pos == '3'){
      // 調整位置番号 3 の XY値 表示位置セット
      STC_uint16_Pos_X_X = (uint16_t)def_Pos_X_Num_3_X;
      STC_uint16_Pos_Y_X = (uint16_t)def_Pos_Y_Num_3_X;
      STC_uint16_Pos_X_Y = (uint16_t)def_Pos_X_Num_3_Y;
      STC_uint16_Pos_Y_Y = (uint16_t)def_Pos_Y_Num_3_Y;
    }
    else if(pstructParam_Adjust_TP->uint8_Num_Pos == '4'){
      // 調整位置番号 4 の XY値 表示位置セット
      STC_uint16_Pos_X_X = (uint16_t)def_Pos_X_Num_4_X;
      STC_uint16_Pos_Y_X = (uint16_t)def_Pos_Y_Num_4_X;
      STC_uint16_Pos_X_Y = (uint16_t)def_Pos_X_Num_4_Y;
      STC_uint16_Pos_Y_Y = (uint16_t)def_Pos_Y_Num_4_Y;
    }
    else{
      int16_Return = 1;  // NG(該当なし)
      break;  // NG終了
    }


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

  case 1:
    //------------------------------
    // 調整位置番号を表示
    //------------------------------
    //----------------------------------------------------------
    // LCD文字表示 : ASCII : Font指定 : ILI9341
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // 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_Oblong : 縦長/横長
    //    0 : Lengthwise : 縦長 左
    //    1 : Lengthwise : 縦長 右
    //    2 : WidthwiseL : 横長 左
    //    3 : WidthwiseR : 横長 右

    // uint8_t uint8_Type : 表示選択
    //      0 : 通常表示
    //      1 : 反転表示
    //      2 : 通常表示の上書き
    //      3 : 反転表示の上書き

    // 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 = ILI9341_SPI_Display_ASCII(
                            &STC_uint8_JobNum_LCD,
                            1,
                            (uint16_t)def_Font_ASCII_Expand_32x32,
                            (uint8_t)def_Dir_Disp_LCD_Sel, 0,
                            (uint32_t)def_Code_Cyan,
                            (uint16_t)def_Position_X_Num,
                            (uint16_t)def_Position_Y_Num,
                    1, &pstructParam_Adjust_TP->uint8_Num_Pos);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


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

  case 2:
    //----------------------------------------------------------
    // タッチパネルのXY位置表示
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // uint16_t uint16_X : X位置
    // uint16_t uint16_Y : Y位置

    // uint16_t uint16_Pos_X_X : X表示位置 X
    // uint16_t uint16_Pos_Y_X : X表示位置 Y

    // uint16_t uint16_Pos_X_Y : Y表示位置 X
    // uint16_t uint16_Pos_Y_Y : Y表示位置 Y


    // 戻り値;
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Display_TP_XY(&STC_uint8_JobNum_LCD,
                        pstructParam_Adjust_TP->int16_Adjust_TP_X,
                        pstructParam_Adjust_TP->int16_Adjust_TP_Y,
                        STC_uint16_Pos_X_X,
                        STC_uint16_Pos_Y_X,
                        STC_uint16_Pos_X_Y,
                        STC_uint16_Pos_Y_Y);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 0;    // OK終了
    break;

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG終了
    break;
  }

  return(int16_Return);
}



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

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

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


// 戻り値;
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Execute_Adjust_TP(uint8_t *puint8_JobNum,
        struct sParam_Adjust_TP *pstructParam_Adjust_TP,
        struct sParam_Position_TP *pstructParam_Position_TP)
{
  static uint8_t STC_uint8_JobNum_LCD;  // LCD処理番号
  static uint8_t STC_uint8_JobNum_Check_Finish;
                                // TP調整終了チェック処理番号


  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    STC_uint8_JobNum_LCD = 0;  // LCD処理番号初期化
    STC_uint8_JobNum_Check_Finish = 0;
                          // TP調整終了チェック処理番号初期化


    pstructParam_Adjust_TP->int16_Count_Repeat = 0;
                                        // 繰り返し回数初期化
    pstructParam_Adjust_TP->int16_Count_Repeat_Finish = 0;
                        // 終了チェック用繰り返し回数初期化


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

  case 1:
    //----------------------------------------------------------
    // タッチ位置番号 1 - 4 と x, y 位置を表示する。
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // struct sParam_Adjust_TP *pstructParam_Adjust_TP
    //             : 調整用パラメータ構造体のポインタ

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


    // 戻り値;
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //    2 : 該当なし
    //----------------------------------------------------------
    int16_Return = Draw_Num_Pos(&STC_uint8_JobNum_LCD,
                                pstructParam_Adjust_TP,
                                pstructParam_Position_TP);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }
    else if(int16_Return == 1){
      // NG終了
      int16_Return = -1;   // 処理継続
      break;  // 処理番号維持 : 現在の処理番号をループ
    }
    //----------------------------------------------------------
    // 該当なし の場合は、
    //      次の処理番号の Check_Finish_Adjust_TP を実行する。
    //----------------------------------------------------------


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

  case 2:
    //--------------------------------------------------
    // タッチパネル調整終了チェックに使用する変数、
    // pstructParam_Adjust_TP->int16_Adjust_TP_X_x と
    // pstructParam_Adjust_TP->int16_Adjust_TP_Y_x は
    // モジュール Draw_Num_Pos 内でセットされる。
    //--------------------------------------------------

    //----------------------------------------------------------
    // タッチパネル調整終了チェック
    //----------------------------------------------------------
    // タッチ位置番号 1 - 4 : コーナー 4箇所を全てタッチした後、
    // 調整終了位置が押されたことをチェックする。
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

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

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


    // 戻り値;
    //   -2 : 処理番号をデクリメント :
    //                      Touch Panel 位置検出処理に戻る。
    //   -1 : 処理中 : "Finish" 表示中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Check_Finish_Adjust_TP(
                                &STC_uint8_JobNum_Check_Finish,
                                pstructParam_Adjust_TP,
                                pstructParam_Position_TP);
    if(int16_Return == -1){
      // 処理中 : "Finish" 表示中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }
    else if((int16_Return == -2) || (int16_Return == 1)){
      // 処理番号をデクリメント or NG終了
      int16_Return = -1;   // 処理継続
      (*puint8_JobNum)--;  // ひとつ前の処理番号に移行する。
      // タッチ位置番号 1 - 4 と x, y 位置を表示する。: case 1:
      break;
    }


    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 0;    // OK終了
    break;

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG終了
    break;
  }

  return(int16_Return);
}



//----------------------------------------------------------
// タッチパネル調整終了チェック
//----------------------------------------------------------
// タッチ位置番号 1 - 4 : コーナー 4箇所を全てタッチした後、
// 調整終了位置が押されたことをチェックする。
//----------------------------------------------------------
// 引数;
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

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

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


// 戻り値;
//   -2 : 処理番号をデクリメント :
//                      Touch Panel 位置検出処理に戻る。
//   -1 : 処理中 : "Finish" 表示中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Check_Finish_Adjust_TP(uint8_t *puint8_JobNum,
        struct sParam_Adjust_TP *pstructParam_Adjust_TP,
        struct sParam_Position_TP *pstructParam_Position_TP)
{
  static uint8_t STC_uint8_JobNum_LCD;  // LCD表示処理番号

  uint16_t uint16_X_End_L;
  uint16_t uint16_X_End_R;
  uint16_t uint16_Y_End_U;
  uint16_t uint16_Y_End_D;

  uint32_t uint32_Work;

  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    STC_uint8_JobNum_LCD = 0;  // LCD表示処理番号初期化


    pstructParam_Adjust_TP->int16_Count_Repeat_Finish = 0;
                                // 調整終了繰り返し回数クリア


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

  case 1:
  //----------------------------------------
  // XY調整位置 1 が押されたか判定
  //----------------------------------------
  if((pstructParam_Adjust_TP->int16_Adjust_TP_X_1 == -1)
      || (pstructParam_Adjust_TP->int16_Adjust_TP_Y_1 == -1)){
    // 押されていない。
    int16_Return = -2;   // 戻り値 : 処理番号をデクリメント
    break;
  }

  //----------------------------------------
  // XY調整位置 2 が押されたか判定
  //----------------------------------------
  if((pstructParam_Adjust_TP->int16_Adjust_TP_X_2 == -1)
      || (pstructParam_Adjust_TP->int16_Adjust_TP_Y_2 == -1)){
    // 押されていない。
    int16_Return = -2;   // 戻り値 : 処理番号をデクリメント
    break;
  }

  //----------------------------------------
  // XY調整位置 3 が押されたか判定
  //----------------------------------------
  if((pstructParam_Adjust_TP->int16_Adjust_TP_X_3 == -1)
      || (pstructParam_Adjust_TP->int16_Adjust_TP_Y_3 == -1)){
    // 押されていない。
    int16_Return = -2;   // 戻り値 : 処理番号をデクリメント
    break;
  }

  //----------------------------------------
  // XY調整位置 4 が押されたか判定
  //----------------------------------------
  if((pstructParam_Adjust_TP->int16_Adjust_TP_X_4 == -1)
      || (pstructParam_Adjust_TP->int16_Adjust_TP_Y_4 == -1)){
    // 押されていない。
    int16_Return = -2;   // 戻り値 : 処理番号をデクリメント
    break;
  }
  //--------------------------------------------------------
  // XY位置調整用の 1 - 4 が全て押されたら、下の処理に行く。
  //--------------------------------------------------------


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

  case 2:
    //------------------------------
    // "Finish" を反転表示
    //------------------------------
    //----------------------------------------------------------
    // LCD文字表示 : ASCII : Font指定 : ILI9341
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // int16_t int16_Check_Semaphore : セマフォチェック有無
    //    0 : チェックなし
    //    1 : チェックあり

    // 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_Oblong : 縦長/横長
    //    0 : Lengthwise : 縦長 左
    //    1 : Lengthwise : 縦長 右
    //    2 : WidthwiseL : 横長 左
    //    3 : WidthwiseR : 横長 右

    // uint8_t uint8_Type : 表示選択
    //      0 : 通常表示
    //      1 : 反転表示
    //      2 : 通常表示の上書き
    //      3 : 反転表示の上書き

    // 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 = ILI9341_SPI_Display_ASCII(
                                &STC_uint8_JobNum_LCD,
                                1,
                                (uint16_t)def_Font_ASCII_16x16,
                                (uint8_t)def_Dir_Disp_LCD_Sel,
                                1,
                                (uint32_t)def_Code_Hotpink,
                        (uint16_t)def_Position_X_Check_Finish,
                        (uint16_t)def_Position_Y_Check_Finish,
                                6, (uint8_t *)"Finish");
    if(int16_Return == -1){
      // 処理中 :  "Finish" 表示中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


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

  case 3:
  //------------------------------------------------------------
  // 調整終了の位置を算出
  //------------------------------------------------------------
  uint32_Work = (pstructParam_Adjust_TP->int16_Adjust_TP_X_2
      - pstructParam_Adjust_TP->int16_Adjust_TP_X_1) / 20;
  uint16_X_End_L = pstructParam_Adjust_TP->int16_Adjust_TP_X_1
      + (uint16_t)(uint32_Work * 7);
  uint16_X_End_R = pstructParam_Adjust_TP->int16_Adjust_TP_X_1
      + (uint16_t)(uint32_Work * 13);

  uint32_Work = (pstructParam_Adjust_TP->int16_Adjust_TP_Y_3
      - pstructParam_Adjust_TP->int16_Adjust_TP_Y_1) / 15;
  uint16_Y_End_U = pstructParam_Adjust_TP->int16_Adjust_TP_Y_1
      + (uint16_t)(uint32_Work * 5);
  uint16_Y_End_D = pstructParam_Adjust_TP->int16_Adjust_TP_Y_1
      + (uint16_t)(uint32_Work * 10);
  //------------------------------------------------------------


  //------------------------------------------------------------
  // 調整終了の位置を押されているか判定する。
  //------------------------------------------------------------
  // 画面中央付近を押し続けるとタッチパネルの調整が終了する。
  //------------------------------------------------------------
  if((pstructParam_Position_TP->uint16_Position_TP_X
                                            < uint16_X_End_L)
  || (pstructParam_Position_TP->uint16_Position_TP_X
                                            > uint16_X_End_R)
  || (pstructParam_Position_TP->uint16_Position_TP_Y
                                            < uint16_Y_End_U)
  || (pstructParam_Position_TP->uint16_Position_TP_Y
                                            > uint16_Y_End_D))
  {
    pstructParam_Adjust_TP->int16_Count_Repeat_Finish = 0;
                                // 調整終了繰り返し回数クリア

    int16_Return = -2;   // 処理番号をデクリメント
    break;
  }
  //------------------------------------------------------------


  //------------------------------------------------------------
  // 繰り返し回数の判定
  //------------------------------------------------------------
  pstructParam_Adjust_TP->int16_Count_Repeat_Finish++;
                        // 調整終了繰り返し回数インクリメント
  //------------------------------------------------------------
  // 検出の制度を高めるため、
  //        最後に押した番号のXY位置検出後10回繰り返す。
  //-------------------------------------------------------------
  if(pstructParam_Adjust_TP->int16_Count_Repeat_Finish < 10){
    int16_Return = -2;   // 処理番号をデクリメント
    break;
  }
  //-------------------------------------------------------------


    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 0;    // OK終了
    break;

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG終了
    break;
  }

  return(int16_Return);
}



//----------------------------------------------------------
// タッチパネルの位置情報保存
//----------------------------------------------------------
// 引数;
// struct sParam_Adjust_TP *pstructParam_Adjust_TP :
//          タッチパネル位置調整用パラメータ構造体のポインタ


// 戻り値;
//    なし
//----------------------------------------------------------
void Save_Param_Pos_TP(
            struct sParam_Adjust_TP *pstructParam_Adjust_TP)
{
  //--------------------------------------------
  // XY位置の最小値と最大値をセット
  //--------------------------------------------

  // X位置の最小値
  pstructParam_Adjust_TP->int16_Adjust_TP_X_MIN
      = (pstructParam_Adjust_TP->int16_Adjust_TP_X_1
           + pstructParam_Adjust_TP->int16_Adjust_TP_X_3) / 2;

  // Y位置の最小値
  pstructParam_Adjust_TP->int16_Adjust_TP_Y_MIN
      = pstructParam_Adjust_TP->int16_Adjust_TP_Y_1;



  // X位置の最大値
  pstructParam_Adjust_TP->int16_Adjust_TP_X_MAX
       = (pstructParam_Adjust_TP->int16_Adjust_TP_X_2
           + pstructParam_Adjust_TP->int16_Adjust_TP_X_4) / 2;

  // Y位置の最大値
  pstructParam_Adjust_TP->int16_Adjust_TP_Y_MAX
      = pstructParam_Adjust_TP->int16_Adjust_TP_Y_3;
}



//----------------------------------------------------------
// タッチパネル調整値をFlash Memoryから読み込む。
//----------------------------------------------------------
// 引数;
// struct sParam_Adjust_TP *pstructParam_Adjust_TP :
//          タッチパネル位置調整用パラメータ構造体のポインタ


// 戻り値:
//    0 : OK
//    1 : NG
//----------------------------------------------------------
int16_t Load_Adjust_TP(
            struct sParam_Adjust_TP *pstructParam_Adjust_TP)
{
  uint8_t uint8_Word[16];
  int16_t int16_Min_Max[16];
  int16_t int16_Work = 0;

  int16_t int16_I;

  int16_t int16_Return;


  // TP調整済みフラグを読み込む
  memcpy(uint8_Word,
         (uint8_t *)(uint32_t)def_Address_Adjust_TP,
         strlen((char *)def_aFlag_Str_Adjust_TP));

  // TP調整済みフラグチェック
  int16_Return = (int16_t)memcmp(uint8_Word,
                      (char *)def_aFlag_Str_Adjust_TP,
                      strlen((char *)def_aFlag_Str_Adjust_TP));
  if(int16_Return != 0){
    // TP調整値が保存されていない。
    pstructParam_Adjust_TP->int16_Adjust_TP_X_MIN = -1;
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_MIN = -1;
    pstructParam_Adjust_TP->int16_Adjust_TP_X_MAX = -1;
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_MAX = -1;

    pstructParam_Adjust_TP->int16_Adjust_TP_Y_1 = -1;
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_2 = -1;
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_3 = -1;
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_4 = -1;

    return(1);  // NG
  }

  //------------------------------------------------------------
  // TP調整値を読み込む
  //------------------------------------------------------------
  // int16_t x (8 + 1) : パラメータ + チェックサム : 18bytes
  //------------------------------------------------------------
  memcpy(int16_Min_Max,
         (uint8_t *)(uint32_t)def_Address_Min_Max_TP,
         def_Num_All_Adust_TP);

  // チェックサム計算
  int16_Work = 0;
  for(int16_I = 0;
        int16_I < (int16_t)def_Num_Param_Adjust_TP; int16_I++){
    int16_Work += int16_Min_Max[int16_I];
  }

  if(int16_Work
        != int16_Min_Max[(int16_t)def_Num_Param_Adjust_TP]){
    // チェックサムが一致しない。
    pstructParam_Adjust_TP->int16_Adjust_TP_X_MIN = -1;
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_MIN = -1;
    pstructParam_Adjust_TP->int16_Adjust_TP_X_MAX = -1;
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_MAX = -1;

    pstructParam_Adjust_TP->int16_Adjust_TP_Y_1 = -1;
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_2 = -1;
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_3 = -1;
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_4 = -1;

    return(1);  // NG
  }


  // タッチパネル調整用最小値最大値変数セット
  pstructParam_Adjust_TP->int16_Adjust_TP_X_MIN
                                        = int16_Min_Max[0];
  pstructParam_Adjust_TP->int16_Adjust_TP_Y_MIN
                                        = int16_Min_Max[1];
  pstructParam_Adjust_TP->int16_Adjust_TP_X_MAX
                                        = int16_Min_Max[2];
  pstructParam_Adjust_TP->int16_Adjust_TP_Y_MAX
                                        = int16_Min_Max[3];

  pstructParam_Adjust_TP->int16_Adjust_TP_Y_1 = int16_Min_Max[4];
  pstructParam_Adjust_TP->int16_Adjust_TP_Y_2 = int16_Min_Max[5];
  pstructParam_Adjust_TP->int16_Adjust_TP_Y_3 = int16_Min_Max[6];
  pstructParam_Adjust_TP->int16_Adjust_TP_Y_4 = int16_Min_Max[7];


  return(0);  // OK
}



//----------------------------------------------------------
// タッチパネル調整値をFlash Memoryに保存する。
//----------------------------------------------------------
// 引数;
// struct sParam_Adjust_TP *pstructParam_Adjust_TP :
//          タッチパネル位置調整用パラメータ構造体のポインタ


// 戻り値:
//    0 : OK
//    1 : NG
//----------------------------------------------------------
int16_t Save_Adjust_TP(
            struct sParam_Adjust_TP *pstructParam_Adjust_TP)
{
  int16_t int16_Min_Max[16];
  int16_t int16_Work;

  int16_t int16_I;

  int16_t int16_Return;


  // TP調整済みかチェック
  if(pstructParam_Adjust_TP->int16_Adjust_TP_X_MIN == -1){
    // 調整済みでない
    return(1);  // NG
  }


  // Flash Memoryのデータ保存 :
  //                        その他のパラメータを保存しておく。
  // def_Address_Param_SCT から 256bytes
  memcpy(GLB_uint8_aParam_SCT,
         (uint8_t *)(uint32_t)def_Address_Param_SCT,
         def_Size_Param_SCT);


  // TP調整値保存データBufferクリア
  for(int16_I = (int16_t)def_Offset_Adjust_TP;
    int16_I < ((int16_t)def_Offset_Adjust_TP
                        + (int16_t)def_Num_Area_Adjust_TP);
    int16_I++){
    GLB_uint8_aParam_SCT[int16_I] = 0;
  }

  // TP調整値をセット
  int16_Min_Max[0]
            = pstructParam_Adjust_TP->int16_Adjust_TP_X_MIN;
  int16_Min_Max[1]
            = pstructParam_Adjust_TP->int16_Adjust_TP_Y_MIN;
  int16_Min_Max[2]
            = pstructParam_Adjust_TP->int16_Adjust_TP_X_MAX;
  int16_Min_Max[3]
            = pstructParam_Adjust_TP->int16_Adjust_TP_Y_MAX;

  int16_Min_Max[4] = pstructParam_Adjust_TP->int16_Adjust_TP_Y_1;
  int16_Min_Max[5] = pstructParam_Adjust_TP->int16_Adjust_TP_Y_2;
  int16_Min_Max[6] = pstructParam_Adjust_TP->int16_Adjust_TP_Y_3;
  int16_Min_Max[7] = pstructParam_Adjust_TP->int16_Adjust_TP_Y_4;


  // チェックサム計算
  int16_Work = 0;
  for(int16_I = 0;
        int16_I < (int16_t)def_Num_Param_Adjust_TP; int16_I++){
    int16_Work += int16_Min_Max[int16_I];
  }

  // チェックサムをセット
  int16_Min_Max[(int16_t)def_Num_Param_Adjust_TP] = int16_Work;

  // TP調整済みフラグをセット
  memcpy(&GLB_uint8_aParam_SCT[def_Offset_Adjust_TP],
               (char *)def_aFlag_Str_Adjust_TP,
               strlen((char *)def_aFlag_Str_Adjust_TP));

  // TP調整値パラメータをセット
  memcpy(&GLB_uint8_aParam_SCT[def_Offset_Adjust_TP
                                        + def_Pos_Min_Max_TP],
         int16_Min_Max, def_Num_All_Adust_TP);


  // Set Data and Write to FLASH :
  //                        Flash Memoryにデータを書き込む。
  //------------------------------------------------------------
  // Flash Memoryをイレースする。
  int16_Return = def_EraseFLASH((uint32_t)def_Address_Param_SCT,
                                (uint32_t)(def_Address_Param_SCT
                                    + def_Size_Param_SCT - 1));
  if(int16_Return != 0){
    return(1);  // NG
  }

  // Flash Memoryに書き込む。
  int16_Return = def_SetDataAndWriteFLASH(
                                (uint32_t)def_Address_Param_SCT,
                                (int16_t)def_Size_Param_SCT,
                                GLB_uint8_aParam_SCT);
  //------------------------------------------------------------


  return(int16_Return);
}



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

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

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


// 戻り値;
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Transact_Adjust_TP(uint8_t *puint8_JobNum,
        struct sParam_Position_TP *pstructParam_Position_TP,
        struct sParam_Adjust_TP *pstructParam_Adjust_TP)
{
  static uint8_t STC_uint8_JobNum_USW;  // USERスイッチ処理番号
  static uint8_t STC_uint8_JobNum_TP;   // タッチパネル処理番号


  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    STC_uint8_JobNum_USW = 0;  // USERスイッチ処理番号初期化
    STC_uint8_JobNum_TP = 0;   // タッチパネル処理番号初期化


    // XPT2046初期化済みフラグをチェック
    if(pstructParam_Adjust_TP->int16_Initialize_XPT2046 == 0){
      // 初期化されていない場合

      //------------------------------------------------
      // USERスイッチ入力ピン初期化
      //------------------------------------------------
      def_M_Initialize_USW();


      //------------------------------------
      // XPT2046初期化
      //------------------------------------
      Initialize_XPT2046();


      pstructParam_Adjust_TP->int16_Initialize_XPT2046 = 1;
                            // XPT2046初期化済みフラグをセット
    }


    //--------------------------------------------------
    // タッチパネル調整用変数チェック
    //--------------------------------------------------
    // Flash Memoryのタッチパネル変数エリアを参照して、
    //      調整済みなら、変数をセットする。
    //--------------------------------------------------

    //----------------------------------------------------------
    // タッチパネル調整値をFlash Memoryから読み込む。
    //----------------------------------------------------------
    // 引数;
    // struct sParam_Adjust_TP *pstructParam_Adjust_TP :
    //          タッチパネル位置調整用パラメータ構造体のポインタ


    // 戻り値:
    //    0 : OK
    //    1 : NG
    //----------------------------------------------------------
    Load_Adjust_TP(pstructParam_Adjust_TP);


    //----------------------------------------------------------
    // TP位置取得パラメータセット : 通常用
    //----------------------------------------------------------
    pstructParam_Position_TP->int16_Number_TP_Idle
                            = (int16_t)def_Number_TP_Idle;

    pstructParam_Position_TP->int16_Size_TP_Buffer
                            = (int16_t)def_Size_TP_Buffer;

    pstructParam_Position_TP->int16_Number_Get_TP_XY
                            = (int16_t)def_Number_Get_TP_XY;

    pstructParam_Position_TP->int16_Number_TP_Average
                            = (int16_t)def_Number_TP_Average;

    pstructParam_Position_TP->int16_Number_TP_Except_F
                            = (int16_t)def_Number_TP_Except_F;

    pstructParam_Position_TP->int16_Start_TP_Average
                            = (int16_t)def_Start_TP_Average;

    pstructParam_Position_TP->int16_End_TP_Average
                            = (int16_t)def_End_TP_Average;
    //----------------------------------------------------------


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

  case 1:
    //----------------------------------------------------------
    // USERスイッチ入力検出
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ


    // 戻り値;
    //  -1 : 検出なし
    //  0 : 検出あり
    //----------------------------------------------------------
    int16_Return = def_M_Detect_USW(&STC_uint8_JobNum_USW);
    if(int16_Return == 0){
      // USERスイッチ検出あり
      STC_uint8_JobNum_TP = 0;  // タッチパネル処理番号初期化

      (*puint8_JobNum)++;  // 次の処理番号に移行する。
                        // : タッチパネル調整処理番号に移行する。
      int16_Return = -1;   // 処理継続
      break;
    }


    //----------------------------------------------------------
    // LCD画面がタッチされるのを待つ。
    //----------------------------------------------------------

    //----------------------------------------------------------
    // 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;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    // タッチパネル調整用変数をチェック
    if(pstructParam_Adjust_TP->int16_Adjust_TP_X_MIN == -1){
      // タッチパネル調整済みでない場合
      (*puint8_JobNum)++;  // 次の処理番号に移行する。
                        // : タッチパネル調整処理番号に移行する。
      int16_Return = -1;   // 処理継続
      break;
    }


    //----------------------------------------------------------
    // タッチパネルのY位置補正係数算出
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

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


    // 戻り値;
    //    なし
    //----------------------------------------------------------
    Calc_Correction_Coefficent_Pos_TP_Y(pstructParam_Adjust_TP);


    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 0;    // OK終了
    break;

  case 2:
    //----------------------------------------------------------
    // タッチパネルの位置調整
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // struct sParam_Adjust_TP *pstructParam_Adjust_TP :
    //                          調整用パラメータ構造体のポインタ

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


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


    //----------------------------------------------------------
    // TP位置取得パラメータセット : 通常用
    //----------------------------------------------------------
    pstructParam_Position_TP->int16_Number_TP_Idle
                            = (int16_t)def_Number_TP_Idle;

    pstructParam_Position_TP->int16_Size_TP_Buffer
                            = (int16_t)def_Size_TP_Buffer;

    pstructParam_Position_TP->int16_Number_Get_TP_XY
                            = (int16_t)def_Number_Get_TP_XY;

    pstructParam_Position_TP->int16_Number_TP_Average
                            = (int16_t)def_Number_TP_Average;

    pstructParam_Position_TP->int16_Number_TP_Except_F
                            = (int16_t)def_Number_TP_Except_F;

    pstructParam_Position_TP->int16_Start_TP_Average
                            = (int16_t)def_Start_TP_Average;

    pstructParam_Position_TP->int16_End_TP_Average
                            = (int16_t)def_End_TP_Average;
    //----------------------------------------------------------


    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 0;    // OK終了
    break;

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG終了
    break;
  }

  return(int16_Return);
}
