/*
 * XPT2046_TP_Key_In.c
 *
 *  Created on: 2025/02/25
 *      Author: egaono-electronics
 */

#include "XPT2046_TP_Key_In.h"

#include "ILI9341_SPI_Draw.h"
#include "ILI9341_Display_Clear.h"
#include "ILI9341_Display_HEX.h"
#include "ILI9341_Display_ASCII.h"

#include "Generate_Beep.h"
#include def_H_Detect_USW

#include "XPT2046_TP_Access.h"
#include "XPT2046_TP_Adjust.h"
#include "XPT2046_TP_Draw_SW.h"


#include <string.h>



uint8_t GLB_uint8_aTP_Key_In_Char[64];
                                // TP 入力データキャラクタ
int16_t GLB_int16_aTP_Key_In_Buffer[
                            def_Size_TP_Key_Data_Buffer];
                                // TP Key入力データバッファ

int16_t GLB_int16_Count_TP_Key_In;
                                // TP Key入力データ数
uint16_t GLB_uint16_Position_TP_Key_In;
                                // TP Key入力データ位置


//------------------------------------------
// Alpha Numeric/HEX フラグ
//------------------------------------------
//    0 : Alpha Numeric
//    1 : HEX
//------------------------------------------
int16_t GLB_int16_Flag_AN_HEX = 0;


//----------------------------------------------
// Upper case/Lower case フラグ : 大文字/小文字
//----------------------------------------------
//    0 : Upper case
//    1 : Lower case
//----------------------------------------------
int16_t GLB_int16_Flag_U_L = 0;



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

// int16_t int16_Num_SW : スイッチ番号

// uint8_t uint8_R : 反転表示フラグ
//    0 : 通常表示
//    1 : 反転表示

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


// 戻り値;
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Draw_TP_SW(uint8_t *puint8_JobNum,
                   int16_t int16_Num_SW,
                   uint8_t uint8_R,
                   struct sParam_TP_SW *pstructParam_TP_SW)
{
  static uint8_t STC_uint8_JobNum_LCD;

  static uint16_t STC_uint16_Font;
  static uint32_t STC_uint32_Color;
  static uint16_t STC_uint16_Pos_X;
  static uint16_t STC_uint16_Pos_Y;
  static uint16_t STC_uint16_Length;
  static uint8_t STC_uint8_aData[8];


  int16_t int16_I;
  int16_t int16_Return;


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


    //----------------------------------------------------------
    // TPスイッチ表示パラメータセット
    //----------------------------------------------------------
    STC_uint16_Font = pstructParam_TP_SW->
                            uint16_aFont_TP_SW[int16_Num_SW];
    STC_uint32_Color = pstructParam_TP_SW->
                            uint32_aColor_TP_SW[int16_Num_SW];
    STC_uint16_Pos_X
        = pstructParam_TP_SW->
                        int16_aPos_X_Draw_TP_SW[int16_Num_SW];
    STC_uint16_Pos_Y
        = pstructParam_TP_SW->
                        int16_aPos_Y_Draw_TP_SW[int16_Num_SW];
    STC_uint16_Length = (uint16_t)strlen(
          (char *)pstructParam_TP_SW->
                        uint8_aDraw_Data_TP_SW[int16_Num_SW]);

    if(pstructParam_TP_SW->
            int16_aFlag_Detect_TP_SW[int16_Num_SW] == 1){
      strcpy((char *)STC_uint8_aData,
             (char *)pstructParam_TP_SW->
                    uint8_aDraw_Data_TP_SW[int16_Num_SW]);
    }
    else{
      for(int16_I = 0;
                int16_I < STC_uint16_Length; int16_I++){
        STC_uint8_aData[int16_I] = ' ';
      }

      STC_uint8_aData[STC_uint16_Length] = (uint8_t)'\0';
    }
    //----------------------------------------------------------


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

  case 1:
    // 描画/消去 フラグ判定
    if(pstructParam_TP_SW->
            int16_aFlag_Detect_TP_SW[int16_Num_SW] == 1){
      (*puint8_JobNum)++;  // スイッチ描画処理に移行する。
    }
    else{
      (*puint8_JobNum) += 2;  // スイッチ消去処理に移行する。
    }

    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_LCD,
                            (uint8_t)def_Dir_Disp_LCD_Sel,
                            STC_uint16_Font,
                            uint8_R, STC_uint32_Color,
                            STC_uint16_Pos_X, STC_uint16_Pos_Y,
                            STC_uint16_Length, STC_uint8_aData);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


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

  case 3:
    //--------------------------------------------------
    // スイッチ消去
    //--------------------------------------------------
    //--------------------------------------------------
    // 横長表示 右
    //--------------------------------------------------
    //----------------------------------------------------------
    // 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,
                            STC_uint16_Font,
                            (uint8_t)def_Dir_Disp_LCD_Sel, 0,
                            STC_uint32_Color,
                            STC_uint16_Pos_X, STC_uint16_Pos_Y,
                            STC_uint16_Length, STC_uint8_aData);
    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 : 処理番号を格納する変数のポインタ

// int16_t int16_Num_SW : スイッチ番号


// 戻り値;
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Erase_TP_SW(uint8_t *puint8_JobNum,
                    int16_t int16_Num_SW)
{
  static uint8_t STC_uint8_JobNum_LCD;

  static uint16_t STC_uint16_Font;
  static uint32_t STC_uint32_Color;
  static uint16_t STC_uint16_Pos_X;
  static uint16_t STC_uint16_Pos_Y;
  static uint16_t STC_uint16_Length;
  static uint8_t STC_uint8_aData[8];


  int16_t int16_I;
  int16_t int16_Return;


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


    //----------------------------------------------------------
    // TPスイッチ表示パラメータセット
    //----------------------------------------------------------
    STC_uint16_Font = GLB_structParam_TP_SW.
                            uint16_aFont_TP_SW[int16_Num_SW];
    STC_uint32_Color = (uint32_t)def_Color_Black;
    STC_uint16_Pos_X = GLB_structParam_TP_SW.
                        int16_aPos_X_Draw_TP_SW[int16_Num_SW];
    STC_uint16_Pos_Y = GLB_structParam_TP_SW.
                        int16_aPos_Y_Draw_TP_SW[int16_Num_SW];
    STC_uint16_Length
        = (uint16_t)strlen((char *)GLB_structParam_TP_SW.
                        uint8_aDraw_Data_TP_SW[int16_Num_SW]);

    for(int16_I = 0; int16_I < STC_uint16_Length; int16_I++){
      STC_uint8_aData[int16_I] = ' ';
    }

    STC_uint8_aData[STC_uint16_Length] = (uint8_t)'\0';
    //----------------------------------------------------------


    (*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,
                            STC_uint16_Font,
                            (uint8_t)def_Dir_Disp_LCD_Sel, 0,
                            STC_uint32_Color,
                            STC_uint16_Pos_X, STC_uint16_Pos_Y,
                            STC_uint16_Length, STC_uint8_aData);
    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 : 処理番号を格納する変数のポインタ

// int16_t int16_Num_SW_Start : 開始スイッチ番号
// int16_t int16_Num_SW_End : 終了スイッチ番号

// uint8_t uint8_R : 反転表示フラグ
//    0 : 通常表示
//    1 : 反転表示


// 戻り値;
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Print_TP_SW_Num(uint8_t *puint8_JobNum,
                        int16_t int16_Num_SW_Start,
                        int16_t int16_Num_SW_End,
                        uint8_t uint8_R)
{
  static uint8_t STC_uint8_JobNum_LCD;  // LCD表示処理番号

  static int16_t STC_int16_Num_SW;


  int16_t int16_Return;


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

    STC_int16_Num_SW = int16_Num_SW_Start;
                                // 開始スイッチ番号をセット


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

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

    // int16_t int16_Num_SW : スイッチ番号

    // uint8_t uint8_R : 反転表示フラグ
    //    0 : 通常表示
    //    1 : 反転表示

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


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


    STC_int16_Num_SW++;  // スイッチ番号インクリメント
    if(STC_int16_Num_SW <= int16_Num_SW_End){
      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 : 処理番号を格納する変数のポインタ

// int16_t int16_Num_SW_Start : 開始スイッチ番号
// int16_t int16_Num_SW_End : 終了スイッチ番号


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

  static int16_t STC_int16_Num_SW;


  int16_t int16_Return;

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

    STC_int16_Num_SW = int16_Num_SW_Start;
                                // 開始スイッチ番号セット


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

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

    // int16_t int16_Num_SW : スイッチ番号

    // uint8_t uint8_R : 反転表示フラグ
    //    0 : 通常表示
    //    1 : 反転表示


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


    STC_int16_Num_SW++;  // スイッチ番号インクリメント
    if(STC_int16_Num_SW <= int16_Num_SW_End){
      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持
    }


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

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

  return(int16_Return);
}



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


// 戻り値;
//    なし
//----------------------------------------------------------
void Set_Char_TP_SW_In(int16_t int16_U_L)
{
  uint8_t uint8_Code;
  uint8_t uint8_I;


  // '0' ～ '9' の値をセット
  for(uint8_I = (uint8_t)def_Num_TP_SW_Key_0;
      uint8_I <= (uint8_t)def_Num_TP_SW_Key_9; uint8_I++){
    GLB_uint8_aTP_Key_In_Char[uint8_I] = (uint8_t)'0' + uint8_I;
  }


  if(int16_U_L == 0){
    uint8_Code = 'A';
  }
  else{
    uint8_Code = 'a';
  }

  // 'A' ～ 'Z' または 'a' ～ 'z' の値をセット
  for(uint8_I = (uint8_t)def_Num_TP_SW_Key_A;
      uint8_I <= (uint8_t)def_Num_TP_SW_Key_Z; uint8_I++){
    GLB_uint8_aTP_Key_In_Char[uint8_I]
      = uint8_Code + (uint8_I - (uint8_t)def_Num_TP_SW_Key_A);
  }


  // Space, CR, LF の値をセット
  GLB_uint8_aTP_Key_In_Char[(uint8_t)def_Num_TP_SW_Key_SP]
        = (uint8_t)' ';
  GLB_uint8_aTP_Key_In_Char[(uint8_t)def_Num_TP_SW_Key_CR]
        = (uint8_t)0x0D;
  GLB_uint8_aTP_Key_In_Char[(uint8_t)def_Num_TP_SW_Key_LF]
        = (uint8_t)0x0A;
}



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

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

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

// int16_t int16_Sel : 動作選択
//    0 : Alpha Numeric
//    1 : HEX_In

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


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


  if(int16_Sel == 0){
    //----------------------------------------------------------
    // タッチパネル Alpha Numeric Key入力
    //----------------------------------------------------------

    //----------------------------------------------------------
    // タッチパネル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_Return = TP_SW_In(puint8_JobNum,
                            pstructParam_Position_TP,
                            pstructParam_TP_SW,
                            int16_Max_Num_SW);
  }
  else{
    //----------------------------------------------------------
    // タッチパネル HEX Key入力
    //----------------------------------------------------------
    // 引数;
    // 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 : 処理中
    //    def_Num_TP_SW_Func_BK ～ def_Num_TP_SW_Func_CL :
    //                                      OK : Function Key
    //    0x100以上 : OK : HEXデータ
    //----------------------------------------------------------
    int16_Return = TP_HEX_Key_In(puint8_JobNum,
                                 pstructParam_Position_TP,
                                 pstructParam_TP_SW,
                                 int16_Max_Num_SW);
  }


  return(int16_Return);
}



//----------------------------------------------------------
// TP Key入力データをBufferにセットする。
//----------------------------------------------------------
// 引数;
// int16_t int16_Type : 動作選択
//  -1 : BK : 戻る
//   0 : Key In : Keyデータ入力
//   1 : FW : 進む

// uint8_t uint8_Data : Key入力データ
// uint16_t *puint16_Position : 入力データの位置変数のポインタ
// int16_t *pint16_Buffer :
//                  入力データを格納するバッファのポインタ
// int16_t *pint16_Count : データ数変数のポインタ
// int16_t int16_Size_Buffer : Bufferのサイズ


// 戻り値;
//   -1 : Buffer Empty
//    0 : OK
//    1 : Buffer Full
//    2 : End Position
//    3 : NG
//----------------------------------------------------------
int16_t Put_TP_Key_In_Data(int16_t int16_Type,
                           uint8_t uint8_Data,
                           uint16_t *puint16_Position,
                           int16_t *pint16_Buffer,
                           int16_t *pint16_Count,
                           int16_t int16_Size_Buffer)
{
  int16_t int16_I;


  if(int16_Type == (int16_t)def_Type_TP_Key_In_BK){
    //--------------------------------------
    // Back : 戻る
    //--------------------------------------
    if(*pint16_Count <= 0){
      *pint16_Count = 0;
      return(-1);  // Buffer Empty
    }

    (*puint16_Position)--;
  }
  else if(int16_Type == (int16_t)def_Type_TP_Key_In_Data){
    //----------------------------------------------
    // Key In : データ入力
    //----------------------------------------------
    if(*pint16_Count >= int16_Size_Buffer){
      if(*puint16_Position == int16_Size_Buffer - 1){
        //----------------------------------
        // 最後の位置にデータ入力
        //----------------------------------
        pint16_Buffer[*puint16_Position] = (int16_t)uint8_Data;
        return(0);  // OK
      }

      return(1);  // Buffer Full
    }


    if((uint16_t)*pint16_Count == *puint16_Position){
      //--------------------------------
      // データ入力
      //--------------------------------
      pint16_Buffer[*puint16_Position] = (int16_t)uint8_Data;

      if(*puint16_Position < int16_Size_Buffer - 1){
        (*puint16_Position)++;  // 入力データ位置 + 1
      }
    }
    else{
      //--------------------------------
      // 挿入
      //--------------------------------
      for(int16_I = *pint16_Count - 1;
          int16_I >= (int16_t)*puint16_Position; int16_I--){
        pint16_Buffer[int16_I + 1] = pint16_Buffer[int16_I];
      }

      // データ入力 : 挿入
      pint16_Buffer[*puint16_Position] = (int16_t)uint8_Data;

      (*puint16_Position)++;  // データ位置 + 1
    }

    (*pint16_Count)++;  // 入力データ数 + 1
  }
  else if(int16_Type == (int16_t)def_Type_TP_Key_In_FW){
    //--------------------------------------
    // Forward : 進む
    //--------------------------------------
    if(*pint16_Count >= int16_Size_Buffer){
      if(*puint16_Position == int16_Size_Buffer - 1){
        return(2);  // End Point
      }
    }

    if((uint16_t)*pint16_Count == *puint16_Position){
      return(2);  // End Position
    }

    (*puint16_Position)++;  // データ位置 + 1
  }
  else if(int16_Type == (int16_t)def_Type_TP_Key_In_BS){
    //--------------------------------------
    // Back Space
    //--------------------------------------
    if(*pint16_Count <= 0){
      return(-1);  // Buffer Empty
    }


    if((uint16_t)*pint16_Count != *puint16_Position){
      for(int16_I = (int16_t)*puint16_Position;
                int16_I < *pint16_Count; int16_I++){
        pint16_Buffer[int16_I - 1] = pint16_Buffer[int16_I];
      }
    }


    (*pint16_Count)--;  // 入力データ数 - 1

    pint16_Buffer[*pint16_Count] = -1;  // データなしをセット

    (*puint16_Position)--;
  }
  else if(int16_Type == (int16_t)def_Type_TP_Key_In_DL){
    //--------------------------------------
    // Delete : 削除
    //--------------------------------------
    if(*pint16_Count <= 0){
      return(-1);  // Buffer Empty
    }

    if((uint16_t)*pint16_Count == *puint16_Position){
      return(2);  // End Position
    }


    if(*pint16_Count == 1){
      pint16_Buffer[0] = -1;
      *puint16_Position = 0;
    }
    else{
      for(int16_I = (int16_t)*puint16_Position;
              int16_I < *pint16_Count - 1; int16_I++){
        pint16_Buffer[int16_I] = pint16_Buffer[int16_I + 1];
      }
    }

    (*pint16_Count)--;  // 入力データ数 - 1

    pint16_Buffer[*pint16_Count] = -1;  // データなしをセット
  }
  else if(int16_Type == (int16_t)def_Type_TP_Key_In_CL){
    //--------------------------------------
    // Clear
    //--------------------------------------
    // Key In Buffer初期化
    for(int16_I = 0; int16_I < int16_Size_Buffer; int16_I++){
      pint16_Buffer[int16_I] = -1;
    }

    *pint16_Count = 0;
    *puint16_Position = 0;
  }
  else{
    return(3);  // NG
  }


  return(0);
}



//----------------------------------------------------------
// TP Key入力データ表示
//----------------------------------------------------------
// 引数;
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

// int16_t int16_Type : 表示選択
//  0 : ASCII
//  1 : HEX

// int16_t int16_Invert : 反転表示選択
//  0 : 通常表示
//  1 : 反転表示

// uint16_t uint16_Offset_Draw_Y : 表示位置オフセット Y

// int16_t *pint16_aData :
//          入力データが格納されているバッファのポインタ
// uint16_t uint16_Position : 入力データの位置


// 戻り値;
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Draw_TP_Key_In_Data(uint8_t *puint8_JobNum,
                            int16_t int16_Type,
                            int16_t int16_Invert,
                            uint16_t uint16_Offset_Draw_Y,
                            int16_t *pint16_aData,
                            uint16_t uint16_Position)
{
  static uint8_t STC_uint8_JobNum_LCD;

  static uint16_t STC_uint16_Pos_X;  // 表示位置 X
  static uint16_t STC_uint16_Pos_Y;  // 表示位置 Y
  static uint8_t STC_uint8_Data;  // 表示データ : ASCII
  static int16_t STC_int16_Data;  // 表示データ : HEX

  static int16_t STC_int16_Invert;  // 反転表示選択

  uint16_t uint16_Clearance;

  int16_t int16_Return;


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

    STC_int16_Invert = int16_Invert;


    STC_uint16_Pos_X
        = uint16_Position % (uint16_t)def_Num_Col_TP_Key_In;
    uint16_Clearance
        = def_Clearance_TP_Data_X_Top
        + def_Clearance_TP_Data_X * STC_uint16_Pos_X;
    STC_uint16_Pos_X *= (uint16_t)def_Width_TP_Data_In;
    STC_uint16_Pos_X += uint16_Clearance;


    STC_uint16_Pos_Y
        = uint16_Position / (uint16_t)def_Num_Col_TP_Key_In;
    uint16_Clearance
        = def_Clearance_TP_Data_Y * STC_uint16_Pos_Y;
    STC_uint16_Pos_Y *= (uint16_t)def_Height_TP_Data_In;
    STC_uint16_Pos_Y += uint16_Clearance;

    STC_uint16_Pos_Y += uint16_Offset_Draw_Y;
                            // 表示位置オフセットを加算する。


    //----------------------------------------------------------
    // ASCIIデータセット
    //----------------------------------------------------------
    if(pint16_aData[uint16_Position] >= 0){
      STC_uint8_Data = (uint8_t)pint16_aData[uint16_Position];
      if(STC_uint8_Data > 0x7F){
        // Dataが0x7F以上の場合、xxを表示する。
        STC_uint8_Data = 0x80;
      }
    }
    else{
      STC_uint8_Data = ' ';
    }
    //----------------------------------------------------------

    //--------------------------------------------------
    // HEXデータセット
    //--------------------------------------------------
    STC_int16_Data = pint16_aData[uint16_Position];
    //--------------------------------------------------


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

  case 1:
    if(int16_Type == 0){
      //------------------------------------------------
      // ASCII表示
      //------------------------------------------------

      //------------------------------------------------
      // 横長表示 右
      //------------------------------------------------
      //--------------------------------------------------------
      // 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,
                            STC_int16_Invert,
                            (uint32_t)def_Color_TP_Key_In_Data,
                            STC_uint16_Pos_X, STC_uint16_Pos_Y,
                            1, &STC_uint8_Data);
    }
    else{
      //------------------------------------------------
      // HEX表示
      //------------------------------------------------

      //------------------------------------------------
      // 横長表示 右
      //------------------------------------------------
      //--------------------------------------------------------
      // LCD文字表示 : ILI9341 : 16 x 16 HEX
      //--------------------------------------------------------
      // 引数;
      // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

      // 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 : 表示文字数
      // int16_t *pint16_aData :
      //        表示文字コードが格納されているBufferのポインタ


      // 戻り値;
      //   -1 : 処理中
      //    0 : OK終了
      //    1 : NG終了
      //--------------------------------------------------------
      int16_Return = ILI9341_SPI_Display_HEX(
                            &STC_uint8_JobNum_LCD,
                            (uint8_t)def_Dir_Disp_LCD_Sel,
                            STC_int16_Invert,
                            (uint32_t)def_Color_TP_Key_In_Data,
                            STC_uint16_Pos_X, STC_uint16_Pos_Y,
                            (uint16_t)1, &STC_int16_Data);
    }
    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);
}



//----------------------------------------------------------
// ASC/HEX表示
//----------------------------------------------------------
// 引数;
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

// int16_t int16_Sel : 表示選択
//   -1 : ASCII : ASC without UL
//    0 : ASCII : ASC
//    1 : HEX : HEX 1
//    2 : HEX : HEX 2


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

  static uint8_t STC_uint8_aData[8];


  int16_t int16_Return;


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


    if(int16_Sel <= 0){
      // "ASC"表示
      strcpy((char *)STC_uint8_aData,
             (char *)def_aStr_Label_ASCII);
    }
    else{
      // "HEX"表示
      strcpy((char *)STC_uint8_aData,
             (char *)def_aStr_Label_HEX);
    }


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

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


    // 戻り値;
    //    なし
    //----------------------------------------------------------
    Set_TP_SW_Value_Upper_Lower(int16_Sel,
                                &GLB_structParam_TP_SW);


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

  case 1:
    //--------------------------------------------------
    // ASC/HEX Message表示
    //--------------------------------------------------
    //--------------------------------------------------
    // 横長表示 右
    //--------------------------------------------------
    //----------------------------------------------------------
    // 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, 0,
                            (uint32_t)def_Color_Msg_ASC_HEX,
                            (uint16_t)def_Pos_X_Msg_ASC_HEX,
                            (uint16_t)def_Pos_Y_Msg_ASC_HEX,
                    (uint16_t)strlen((char *)STC_uint8_aData),
                            STC_uint8_aData);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


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

  case 2:
    // A - F
    // または
    // A - Z, Space, CR, LF を表示する。
    //----------------------------------------------------------
    // タッチパネルのスイッチ表示 :
    //    開始スイッチ番号から終了スイッチ番号までを表示する。
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // int16_t int16_Num_SW_Start : 開始スイッチ番号
    // int16_t int16_Num_SW_End : 終了スイッチ番号

    // uint8_t uint8_R : 反転表示フラグ
    //    0 : 通常表示
    //    1 : 反転表示


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


    if(int16_Sel == -1){
      // ASCIIモードなら終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


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

  case 3:
    // Upper/Lower スイッチ表示(UL) :
    //                          モードにより表示または消去
    //----------------------------------------------------------
    // タッチパネルのスイッチ表示 :
    //    開始スイッチ番号から終了スイッチ番号までを表示する。
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // int16_t int16_Num_SW_Start : 開始スイッチ番号
    // int16_t int16_Num_SW_End : 終了スイッチ番号

    // uint8_t uint8_R : 反転表示フラグ
    //    0 : 通常表示
    //    1 : 反転表示


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


    if(int16_Sel == 0){
      // ASCIIモードなら終了
      *puint8_JobNum = 0;
      // int16_Return : 結果
      break;
    }


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

  case 4:
    //----------------------------------------------------------
    // HEX入力回数表示
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // int16_t int16_Sel : 表示選択
    //  0 : " "
    //  1 : "1"
    //  2 : "2"


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


    *puint8_JobNum = 0;  // 処理番号初期化
    // int16_Return : 結果
    break;

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

  return(int16_Return);
}



//----------------------------------------------------------
// HEX入力回数表示
//----------------------------------------------------------
// 引数;
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

// int16_t int16_Sel : 表示選択
//  0 : " "
//  1 : "1"
//  2 : "2"


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

  static uint8_t STC_uint8_aData[4];


  int16_t int16_Return;


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


    if(int16_Sel == 0){
      // " " 表示
      strcpy((char *)STC_uint8_aData, " ");
    }
    else if(int16_Sel == 1){
      // "1" 表示
      strcpy((char *)STC_uint8_aData, "1");
    }
    else if(int16_Sel == 2){
      // "2" 表示
      strcpy((char *)STC_uint8_aData, "2");
    }
    else{
      int16_Return = 1;  // NG
      break;
    }


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

  case 1:
    //--------------------------------------------------
    // HEX入力回数表示
    //--------------------------------------------------
    //--------------------------------------------------
    // 横長表示 右
    //--------------------------------------------------
    //----------------------------------------------------------
    // 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, 0,
                            (uint32_t)def_Color_Msg_ASC_HEX,
                            (uint16_t)def_Pos_X_Num_HEX,
                            (uint16_t)def_Pos_Y_Num_HEX,
                    (uint16_t)strlen((char *)STC_uint8_aData),
                            STC_uint8_aData);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }



    *puint8_JobNum = 0;  // 処理番号初期化
    // int16_Return : 結果
    break;

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

  return(int16_Return);
}



//----------------------------------------------------------
// タッチパネル HEX Key入力
//----------------------------------------------------------
// 引数;
// 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 : 処理中
//    def_Num_TP_SW_Func_BK ～ def_Num_TP_SW_Func_CL :
//                                      OK : Function Key
//    0x100以上 : OK : HEXデータ
//----------------------------------------------------------
int16_t TP_HEX_Key_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 uint8_t STC_uint8_JobNum_TP;  // TP処理番号

  static int16_t STC_int16_Num_SW_0;
  static int16_t STC_int16_Num_SW_1;

  static int16_t STC_int16_Data_HEX;


  int16_t int16_Return;


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

    STC_int16_Num_SW_0 = -1;
    STC_int16_Num_SW_1 = -1;

    STC_int16_Data_HEX = -1;


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

  case 1:
    //----------------------------------------------------------
    // タッチパネル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_Return = TP_SW_In(&STC_uint8_JobNum_TP,
                            pstructParam_Position_TP,
                            pstructParam_TP_SW,
                            int16_Max_Num_SW);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

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

    // TP SW番号チェック
    if((int16_Return >= (int16_t)def_Num_TP_SW_Key_G)
        && (int16_Return <= (int16_t)def_Num_TP_SW_Al_Nu)){
      // 該当なし
      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持 : 現在の処理番号をループ
    }

    // Function SW番号チェック
    if((int16_Return >= (int16_t)def_Num_TP_SW_Func_BK)
              && (int16_Return <= int16_Max_Num_SW)){
      // Function Key
      *puint8_JobNum = 0;  // 処理番号初期化
      break;  // 終了
    }


    STC_int16_Num_SW_0 = int16_Return;  // Key番号セット

    GLB_int16_Flag_AN_HEX = 2;  // HEX 2


    *puint8_JobNum = 3;
                // ASC/HEX表示処理に移行する。 : case 3:
    int16_Return = -1;   // 処理継続
    break;

  case 2:
    //----------------------------------------------------------
    // タッチパネル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_Return = TP_SW_In(&STC_uint8_JobNum_TP,
                            pstructParam_Position_TP,
                            pstructParam_TP_SW,
                            int16_Max_Num_SW);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

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

    if((int16_Return >= (int16_t)def_Num_TP_SW_Key_G)
        && (int16_Return <= (int16_t)def_Num_TP_SW_Al_Nu)){
      // Switch番号 : 該当なし
      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持 : 現在の処理番号をループ
    }

    if((int16_Return >= (int16_t)def_Num_TP_SW_Func_BK)
              && (int16_Return <= int16_Max_Num_SW)){
      // Switch番号がFunction Keyの場合
      *puint8_JobNum = 0;  // 処理番号初期化
      break;  // 終了
    }


    STC_int16_Num_SW_1 = int16_Return;  // Key番号セット


    STC_int16_Data_HEX = (STC_int16_Num_SW_0 << 4)
                | STC_int16_Num_SW_1 | 0x0100;  // HEXデータ

    GLB_int16_Flag_AN_HEX = 1;  // HEX 1


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
                         //         : ASC/HEX表示 : case 3:
    int16_Return = -1;   // 処理継続
    break;

  case 3:
    //----------------------------------------------------------
    // ASC/HEX表示
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // int16_t int16_Sel : 表示選択
    //  -1 : ASCII : ASC without UL
    //  0 : ASCII : ASC
    //  1 : HEX : HEX 1
    //  2 : HEX : HEX 2


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

    if(STC_int16_Num_SW_0 == -1){
      *puint8_JobNum = 1;
            // STC_int16_Num_SW_0入力 : case 1: に移行する。
      int16_Return = -1;  // 処理継続
      break;
    }

    if(STC_int16_Data_HEX == -1){
      *puint8_JobNum = 2;
            // STC_int16_Num_SW_1入力 : case 2: に移行する。
      int16_Return = -1;  // 処理継続
      break;
    }


    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = STC_int16_Data_HEX;  // HEXデータをセット
    break;  // 終了

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

  return(int16_Return);
}
