/*
 * XPT2046_TP_Draw_SW.c
 *
 *  Created on: 2025/03/23
 *      Author: egaono-electronics
 */

#include "XPT2046_TP_Draw_SW.h"

#include "Draw_Buffer_Graphic.h"
#include "ILI9341_SPI_Draw.h"

#include "ILI9341_Display_ASCII.h"


//----------------------------------------------------------
// タッチパネルのスイッチ描画
//----------------------------------------------------------
// 文字を四角で囲む。
//----------------------------------------------------------
// 引数;
// 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_t XPT2046_TP_Draw_SW(uint8_t *puint8_JobNum,
            uint8_t uint8_Oblong, uint16_t uint16_Font,
            uint8_t uint8_Type, uint32_t uint32_ColorCode,
            uint16_t uint16_StartX, uint16_t uint16_StartY,
            uint16_t uint16_Length, uint8_t *puint8_aData)
{
  static uint8_t STC_uint8_JobNum_LCD;  // LCD処理番号


  int16_t int16_Return;

  int16_t int16_Size;

  int16_t int16_Width;
  int16_t int16_Height;

  int16_t int16_StartX;
  int16_t int16_StartY;

  int16_t int16_EndX;
  int16_t int16_EndY;

  uint16_t uint16_DataSize;
  uint16_t uint16_Position_Rect = 0;
  uint16_t uint16_Position_DrawBuffer = 0;

  int16_t int16_ClearSize;

  int16_t int16_I;


  switch(*puint8_JobNum){
  case 0:
    // 描画の有無判定
    if(puint8_aData[0] == 0){
      // 描画なしの場合、何もしないで抜ける。
      int16_Return = 0;  // OK終了
      break;
    }


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

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


    STC_uint8_JobNum_LCD = 0;  // LCD処理番号初期化


    // フォントを判定して、サイズをセットする。
    if(uint16_Font == (uint16_t)def_Font_ASCII_8x8){
      int16_Size = 8;
    }
    else if(uint16_Font == (uint16_t)def_Font_ASCII_16x16){
      int16_Size = 16;
    }
    else if(uint16_Font
                == (uint16_t)def_Font_ASCII_Expand_32x32){
      int16_Size = 32;
    }
    else if(uint16_Font
                == (uint16_t)def_Font_ASCII_Expand_48x48){
      int16_Size = 48;
    }
    else{
      return(1);  // NG
    }


    // 文字を囲む幅と高さをセット
    int16_Width = int16_Size * (int16_t)uint16_Length;
    int16_Height = int16_Size;


    int16_StartX = 0;
    int16_StartY = 0;

    int16_EndX = int16_Width - 1;
    int16_EndY = int16_Height - 1;


    // 描画幅のバイト数をセット
    uint16_DataSize = (uint16_t)int16_Width / 8;
    if((int16_Width % 8) > 0){
      uint16_DataSize++;
    }


    //----------------------------------------------------------
    // 描画領域Bufferのクリア
    //----------------------------------------------------------
    int16_ClearSize = (int16_t)uint16_DataSize * int16_Height;

    for(int16_I = 0; int16_I < int16_ClearSize; int16_I++){
      GLB_uint8_aDrawBuffer_LCD[int16_I] = 0;
    }



    //----------------------------------------------------------
    // 描画領域のクリア
    //----------------------------------------------------------
    int16_ClearSize = int16_Width * def_RGB_byte;
    int16_ClearSize *= int16_Height;

    for(int16_I = 0; int16_I < int16_ClearSize; int16_I++){
      GLB_uint8_aWork_1Line_LCD[int16_I] = 0;
    }


    //----------------------------------------------------------
    // 描画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のポインタ
    //----------------------------------------------------------
    DrawRect(int16_StartX, int16_StartY,
             int16_EndX, int16_EndY,
             1,
             int16_Width, int16_Height,
             GLB_uint8_aDrawBuffer_LCD);


    // 描画高さ分の送信データを作成する。
    for(int16_I = 0; int16_I < int16_Height; 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_ColorCode,
                   (uint16_t)int16_Width, uint16_Position_Rect,
                   GLB_uint8_aDrawBuffer_LCD,
        &GLB_uint8_aWork_1Line_LCD[uint16_Position_DrawBuffer]);

      uint16_Position_Rect += uint16_DataSize;
      uint16_Position_DrawBuffer
                    += (uint16_t)int16_Width * def_RGB_byte;
    }


    (*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,
                                0,
                                uint16_Font,
                                uint8_Oblong, (uint8_Type + 2),
                                uint32_ColorCode,
                                uint16_StartX, uint16_StartY,
                                uint16_Length, puint8_aData);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


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


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

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

  return(int16_Return);
}
