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

#include "ILI9341_Display_ASCII.h"

#include def_H_Periph_SPI

#include def_H_Font_ASCII_8x8
#include def_H_Font_ASCII_16x16

#include "Draw_Buffer_ASCII_8x8.h"
#include "Draw_Buffer_ASCII_16x16.h"
#include "Draw_Buffer_ASCII_Expand_32x32.h"
#include "Draw_Buffer_ASCII_Expand_48x48.h"



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


// 戻り値;
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t ILI9341_SPI_Display_ASCII(uint8_t *puint8_JobNum,
                                  int16_t int16_Check_Semaphore,
                                  uint16_t uint16_Font,
                                  uint8_t uint8_Oblong,
                                  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 struct sFrame_LCD STC_structFrame_LCD;

  static uint8_t STC_uint8_JobNum;  // 表示処理番号

  static uint16_t STC_uint16_Width;
  static uint16_t STC_uint16_Height;

  static uint16_t STC_uint16_SendLength;
  static uint16_t STC_uint16_Position;
  static uint16_t STC_uint16_SendCount;
  static uint16_t STC_uint16_DataSize;

  static uint16_t STC_uint16_Position_DrawBuffer;

  static int16_t STC_int16_Value_Wait_SPI_TxRx;
                                    // SPI送受信待ちの値


  int16_t int16_I;
  uint16_t uint16_I;

  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    // セマフォチェック有無判定
    if(int16_Check_Semaphore == 1){
      // セマフォチェックありの場合
      //------------------------------------------------
      // セマフォチェック
      //------------------------------------------------
      if(GLB_int8_Semaphore_LCD != 0){
        // 他のモジュールがセマフォを使用中
        int16_Return = -1;  // 処理継続
        break;  // 処理番号維持 : 現在の処理番号をループ
      }

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


    STC_uint8_JobNum = 0;  // 表示処理番号初期化

    STC_uint16_Position = 0;
    STC_uint16_SendCount = 0;

    STC_uint16_Position_DrawBuffer = 0;


    //----------------------------------------------------------
    // 描画Frameの構造体設定 : ASCII
    //----------------------------------------------------------
    // 引数;
    // 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

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

    // uint16_t uint16_Length : 表示文字数

    // struct sFrame_LCD *pstructFrame_LCD :
    //              表示パラメータ構造体のポインタ


    // 戻り値;
    //    0 : OK
    //    1 : NG
    //----------------------------------------------------------
    int16_Return = Set_structFrame_ASCII(uint16_Font,
                                         uint16_StartX,
                                         uint16_StartY,
                                         uint16_Length,
                                         &STC_structFrame_LCD);
    if(int16_Return != 0){
      break;  // NG終了
    }


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

  case 1:
    //----------------------------------------------------------
    // 表示Frame設定
    //----------------------------------------------------------
    // 表示する向きと表示位置を設定する。
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // uint16_t uint16_Oblong : 縦長/横長 選択
    //    0 : Lengthwise : 縦長 左
    //    1 : Lengthwise : 縦長 右
    //    2 : WidthwiseL : 横長 左
    //    3 : WidthwiseR : 横長 右

    // struct sFrame_LCD *pstructFrame_LCD :
    //                      表示パラメータ構造体のポインタ


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

    if(int16_Return != 0){
      GLB_int8_Semaphore_LCD = 0;  // セマフォ解放

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


    //----------------------------------------------------------
    // 描画Buffer設定 : ASCII
    //----------------------------------------------------------
    // 引数;
    // 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 : 反転表示
    //      2 : 通常表示の上書き
    //      3 : 反転表示の上書き

    // uint16_t uint16_Length : 表示文字数

    // uint8_t *puint8_aChar :
    //              文字コードが格納されたBufferのポインタ
    // uint8_t *puint8_aBuffer : 描画Bufferのポインタ

    // uint16_t *puint16_Width : 文字の幅の変数のポインタ
    // uint16_t *puint16_Height : 文字の高さの変数のポインタ


    // 戻り値;
    //    なし
    //----------------------------------------------------------
    Set_Draw_Buffer_ASCII(uint16_Font,
                          uint8_Type,
                          uint16_Length,
                          puint8_aData, GLB_uint8_aDrawBuffer_LCD,
                          &STC_uint16_Width, &STC_uint16_Height);


    STC_uint16_DataSize = STC_uint16_Width / 8;
    if((STC_uint16_Width % 8) > 0){
      STC_uint16_DataSize++;
    }


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

  case 2:
    //----------------------------------------------------------
    // 表示Data送信 : case 2: ～ case 5: で、
    //                  送信データの作成と送信を行う。
    //----------------------------------------------------------
    if(uint8_Type < 0x02){
      // 0 : 通常表示
      // 1 : 反転表示
      for(int16_I = 0;
          int16_I < (int16_t)(STC_uint16_Width * def_RGB_byte);
          int16_I++){
        GLB_uint8_aBuffer_1Line_LCD[int16_I] = 0;
      }

      //--------------------------------------------------------
      // 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,
                                         STC_uint16_Width,
                                         STC_uint16_Position,
                                    GLB_uint8_aDrawBuffer_LCD,
                                    GLB_uint8_aBuffer_1Line_LCD);
    }
    else{
      // 2 : 通常表示の上書き
      // 3 : 反転表示の上書き
      MakeSendData_1Line_ColorCode_2byte(uint32_ColorCode,
                                         STC_uint16_Width,
                                         STC_uint16_Position,
                                    GLB_uint8_aDrawBuffer_LCD,
                        &GLB_uint8_aWork_1Line_LCD[
                                STC_uint16_Position_DrawBuffer]);
    }

    // 送信データ数セット
    STC_uint16_SendLength = STC_uint16_Width * def_RGB_byte;


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

  case 3:
    //----------------------------------------------------------
    // ILI9341のレジスタ設定と表示Data送信
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // int16_t int16_NSS_OnOff :
    //                      設定データ送信終了時NSS ON/OFF選択
    //    0 : 送信後 NSSをOFFにする。
    //    1 : 送信後 NSSをONのままにする。

    // uint16_t uint16_Length : 送信データ数
    // uint8_t *puint8_aData :
    //              送信データが格納されているBufferのポインタ


    // 戻り値;
    //   -1 : 処理中
    //    0 : OK
    //    1 : NG
    //----------------------------------------------------------
    if(uint8_Type < 0x02){
      // 0 : 通常表示
      // 1 : 反転表示
      int16_Return = ILI9341_SPI_SendData(&STC_uint8_JobNum,
                                          1,
                                          STC_uint16_SendLength,
                                    GLB_uint8_aBuffer_1Line_LCD);
    }
    else{
      // 2 : 通常表示の上書き
      // 3 : 反転表示の上書き
      int16_Return = ILI9341_SPI_SendData(&STC_uint8_JobNum,
                                          1,
                                          STC_uint16_SendLength,
                        &GLB_uint8_aWork_1Line_LCD[
                                STC_uint16_Position_DrawBuffer]);
    }
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

    if(int16_Return != 0){
      GLB_int8_Semaphore_LCD = 0;  // セマフォ解放

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


    STC_uint16_SendCount++;  // 送信カウントをインクリメント
    STC_uint16_Position += STC_uint16_DataSize;
                                    // 次のデータ位置をセット
    STC_uint16_Position_DrawBuffer += STC_uint16_SendLength;
                                    // 描画Bufferの位置を更新


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

  case 4:
    if(uint8_Type < 0x02){
      // 0 : 通常表示
      // 1 : 反転表示
      for(int16_I = 0;
          int16_I < (int16_t)(STC_uint16_Width * def_RGB_byte);
          int16_I++){
        GLB_uint8_aSPI1_TxBuffer[int16_I] = 0;
      }

      //--------------------------------------------------------
      // 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,
                                         STC_uint16_Width,
                                         STC_uint16_Position,
                                    GLB_uint8_aDrawBuffer_LCD,
                                    GLB_uint8_aSPI1_TxBuffer);
    }
    else{
      // 2 : 通常表示の上書き
      // 3 : 反転表示の上書き
      MakeSendData_1Line_ColorCode_2byte(uint32_ColorCode,
                                         STC_uint16_Width,
                                         STC_uint16_Position,
                                    GLB_uint8_aDrawBuffer_LCD,
                        &GLB_uint8_aWork_1Line_LCD[
                                STC_uint16_Position_DrawBuffer]);

      for(uint16_I = 0;
          uint16_I < (STC_uint16_Width * def_RGB_byte);
          uint16_I++){
        GLB_uint8_aSPI1_TxBuffer[uint16_I]
          = GLB_uint8_aWork_1Line_LCD[
                    STC_uint16_Position_DrawBuffer + uint16_I];
      }
    }


    // 送信データ数セット
    GLB_structParam_Handle_SPI1.int16_vSPI_TxNumber
                            = STC_uint16_Width * def_RGB_byte;


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

  case 5:
    // SPI送信 : データのみ送信
    if(STC_uint16_SendCount == STC_uint16_Height - 1){
      //----------------------------------------------------------
      // SPIx  Master送受信
      //----------------------------------------------------------
      // 引数;
      // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

      // SPI_HandleTypeDef *pHandle_SPIx : SPI handler declaration

      // IRQn_Type DMA_Stream_IRQn_Transmit_SPIx : SPI DMA Transmit IRQn
      // IRQn_Type DMA_Stream_IRQn_Receive_SPIx : SPI DMA Receive IRQn

      // struct sParam_Handle_SPIx *pstructParam_Handle_SPIx :
      //              Handle SPI用パラメータの構造体のポインタ

      // GPIO_TypeDef *pGPIOx_SPIx_NSS : SPIx_NSS のGPIOポート
      // uint16_t uint16_GPIO_Pin_x_SPIx_NSS : SPIx_NSS のGPIOピン

      // int16_t int16_Value_Wait_SPI_TxRx : SPI送受信待ちの値

      // int16_t int16_NSS_OnOff : 送信終了時NSS ON/OFF選択
      //    0 : 送信後 NSSをOFFにする。
      //    1 : 送信後 NSSをONのままにする。


      // 戻り値;
      //   -1 : 処理中
      //    0 : OK
      //    1 : NG
      //----------------------------------------------------------
      int16_Return = SPIx_Master_TxRxByte(&STC_uint8_JobNum,
                                          &Handle_SPI1,
                                          DMA2_Stream3_IRQn,
                                          DMA2_Stream2_IRQn,
                                          &GLB_structParam_Handle_SPI1,
                                          def_GPIOx_SPI1_NSS,
                                          def_GPIO_PIN_x_SPI1_NSS,
                                          STC_int16_Value_Wait_SPI_TxRx,
                                          0);
    }
    else{
      int16_Return = SPIx_Master_TxRxByte(&STC_uint8_JobNum,
                                          &Handle_SPI1,
                                          DMA2_Stream3_IRQn,
                                          DMA2_Stream2_IRQn,
                                          &GLB_structParam_Handle_SPI1,
                                          def_GPIOx_SPI1_NSS,
                                          def_GPIO_PIN_x_SPI1_NSS,
                                          STC_int16_Value_Wait_SPI_TxRx,
                                          1);
    }
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

    if(int16_Return != 0){
      GLB_int8_Semaphore_LCD = 0;  // セマフォ解放

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

    // 終了判定
    STC_uint16_SendCount++;  // 送信カウントをインクリメント
    if(STC_uint16_SendCount < STC_uint16_Height){
      STC_uint16_Position += STC_uint16_DataSize;
                                    // 次のデータ位置をセット
      STC_uint16_Position_DrawBuffer += STC_uint16_SendLength;
                                    // 描画Bufferの位置を更新

      (*puint8_JobNum)--;  // 処理番号をデクリメント :
                    // ひとつ前の処理番号に移行する。: case 4:
      int16_Return = -1;   // 処理継続
      break;
    }


    // End : NSS OFF
    HAL_GPIO_WritePin(def_GPIOx_LCD_SPI_NSS,
                      def_GPIO_PIN_x_LCD_SPI_NSS,
                      GPIO_PIN_SET);


    //----------------------------------------------
    // セマフォチェック有無判定
    //----------------------------------------------
    if(int16_Check_Semaphore == 1){
      // セマフォチェックありの場合
      GLB_int8_Semaphore_LCD = 0;  // セマフォ解放
    }
    //----------------------------------------------


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

  default:
    //----------------------------------------------
    // セマフォチェック有無判定
    //----------------------------------------------
    if(int16_Check_Semaphore == 1){
      // セマフォチェックありの場合
      GLB_int8_Semaphore_LCD = 0;  // セマフォ解放
    }
    //----------------------------------------------

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

  return(int16_Return);
}


//----------------------------------------------------------
// 描画Frameの構造体設定 : ASCII
//----------------------------------------------------------
// 引数;
// 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

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

// uint16_t uint16_Length : 表示文字数

// struct sFrame_LCD *pstructFrame_LCD :
//                      表示パラメータ構造体のポインタ


// 戻り値;
//    0 : OK
//    1 : NG
//----------------------------------------------------------
int16_t Set_structFrame_ASCII(uint16_t uint16_Font,
                              uint16_t uint16_StartX,
                              uint16_t uint16_StartY,
                              uint16_t uint16_Length,
                        struct sFrame_LCD *pstructFrame_LCD)
{
  uint16_t uint16_DotWidthwise;
  uint16_t uint16_DotLengthwise;


  //----------------------------------------
  // 表示Frame位置を構造体に設定
  //----------------------------------------
  if(uint16_Font == (uint16_t)def_Font_ASCII_8x8){
    uint16_DotWidthwise
                    = (uint16_t)def_DotWidthwise_Font8x8;
    uint16_DotLengthwise
                    = (uint16_t)def_DotLengthwise_Font8x8;
  }
  else if(uint16_Font == (uint16_t)def_Font_ASCII_16x16){
    uint16_DotWidthwise
                    = (uint16_t)def_DotWidthwise_Font16x16;
    uint16_DotLengthwise
                    = (uint16_t)def_DotLengthwise_Font16x16;
  }
  else if(uint16_Font
                == (uint16_t)def_Font_ASCII_Expand_32x32){
    uint16_DotWidthwise
                    = (uint16_t)def_DotWidthwise_Font32x32;
    uint16_DotLengthwise
                    = (uint16_t)def_DotLengthwise_Font32x32;
  }
  else if(uint16_Font
                == (uint16_t)def_Font_ASCII_Expand_48x48){
    uint16_DotWidthwise
                    = (uint16_t)def_DotWidthwise_Font48x48;
    uint16_DotLengthwise
                    = (uint16_t)def_DotLengthwise_Font48x48;
  }
  else{
    return(1);  // NG
  }


  pstructFrame_LCD->uint16_SC = uint16_StartX;
  pstructFrame_LCD->uint16_EC = uint16_StartX
                    + uint16_Length * uint16_DotWidthwise - 1;

  pstructFrame_LCD->uint16_SP = uint16_StartY;
  pstructFrame_LCD->uint16_EP = uint16_StartY
                              + uint16_DotLengthwise - 1;


  return(0);  // OK
}


//----------------------------------------------------------
// 描画Buffer設定 : ASCII
//----------------------------------------------------------
// 引数;
// 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 : 反転表示
//      2 : 通常表示の上書き
//      3 : 反転表示の上書き

// uint16_t uint16_Length : 表示文字数

// uint8_t *puint8_aChar :
//                  文字コードが格納されたBufferのポインタ
// uint8_t *puint8_aBuffer : 描画Bufferのポインタ

// uint16_t *puint16_Width : 文字の幅の変数のポインタ
// uint16_t *puint16_Height : 文字の高さの変数のポインタ


// 戻り値;
//    なし
//----------------------------------------------------------
void Set_Draw_Buffer_ASCII(uint16_t uint16_Font,
                           uint8_t uint8_Type,
                           uint16_t uint16_Length,
                           uint8_t *puint8_aChar,
                           uint8_t *puint8_aBuffer,
                           uint16_t *puint16_Width,
                           uint16_t *puint16_Height)
{
  uint16_t uint16_aCode[32];

  uint16_t uint16_I;


  for(uint16_I = 0; uint16_I < uint16_Length; uint16_I++){
    uint16_aCode[uint16_I] = (uint16_t)puint8_aChar[uint16_I];
  }


  if(uint16_Font == (uint16_t)def_Font_ASCII_8x8){
    //----------------------------------------------------------
    // 描画Bufferに Font 8 x 8 文字をセット : ASCII
    //----------------------------------------------------------
    // 引数;
    //  int16_t int16_Type :
    //      0 : 通常表示
    //      1 : 反転表示

    // uint8_t *puint8_Address_font : フォント配列のポインタ

    //  uint16_t uint16_Length : 文字数
    //  uint16_t *puint16_aCode :
    //              文字コードが格納されたBufferのポインタ
    //  uint8_t *puint8_aBuffer : 描画Bufferのポインタ


  // 戻り値:
  //  なし
    //----------------------------------------------------------
    Draw_Buffer_ASCII_8x8((uint8_Type & 0x01),
                          (uint8_t *)def_Font_ASCII_8x8_Array,
                          uint16_Length,
                          uint16_aCode,
                          puint8_aBuffer);
  }
  else if(uint16_Font == (uint16_t)def_Font_ASCII_16x16){
    //----------------------------------------------------------
    // 描画Bufferに Font 16 x 16 文字をセット
    //----------------------------------------------------------
    // 引数;
    //  int16_t int16_Type :
    //      0 : 通常表示
    //      1 : 反転表示

    // uint8_t *puint8_Address_font : フォント配列のポインタ

    //  uint16_t uint16_Length : 文字数
    //  uint16_t *puint16_aCode :
    //                  文字コードが格納されたBufferのポインタ
    //  uint8_t *puint8_aBuffer : 描画Bufferのポインタ


    // 戻り値:
    //  なし
    //----------------------------------------------------------
    Draw_Buffer_ASCII_16x16((uint8_Type & 0x01),
                            (uint8_t *)def_Font_ASCII_16x16_Array,
                            uint16_Length,
                            uint16_aCode,
                            puint8_aBuffer);
  }
  else if(uint16_Font
                    == (uint16_t)def_Font_ASCII_Expand_32x32){
    //----------------------------------------------------------
    // 描画Bufferに Font 32 x 32 の文字をセット
    //----------------------------------------------------------
    // 16 x 16 fontテーブルのデータを使用して、
    // 縦と横をそれぞれ2倍に引き伸ばし
    //                      32 x 32 fontの文字を作成する。
    //----------------------------------------------------------
    // 引数;
    // int16_t int16_Type :
    //      0 : 通常表示
    //      1 : 反転表示

    // uint8_t *puint8_Address_font : フォント配列のポインタ

    // uint16_t uint16_Length : 文字数
    // uint16_t *puint16_aCode :
    //                  文字コードが格納されたBufferのポインタ
    // uint8_t *puint8_aBuffer : 描画Bufferのポインタ


    // 戻り値:
    //  なし
    //----------------------------------------------------------
    Draw_Buffer_ASCII_Expand_32x32((uint8_Type & 0x01),
                        (uint8_t *)def_Font_ASCII_16x16_Array,
                                   uint16_Length,
                                   uint16_aCode,
                                   puint8_aBuffer);
  }
  else if(uint16_Font
                    == (uint16_t)def_Font_ASCII_Expand_48x48){
    //----------------------------------------------------------
    // 描画Bufferに Font 48 x 48 の文字をセット
    //----------------------------------------------------------
    // 16 x 16 fontテーブルのデータを使用して、
    // 縦と横をそれぞれ3倍に引き伸ばし
    //                      48 x 48 fontの文字を作成する。
    //----------------------------------------------------------
    // 引数;
    // int16_t int16_Type :
    //      0 : 通常表示
    //      1 : 反転表示

    // uint8_t *puint8_Address_font : フォント配列のポインタ

    // uint16_t uint16_Length : 文字数
    // uint16_t *puint16_aCode :
    //                  文字コードが格納されたBufferのポインタ
    // uint8_t *puint8_aBuffer : 描画Bufferのポインタ


    // 戻り値:
    //  なし
    //----------------------------------------------------------
    Draw_Buffer_ASCII_Expand_48x48((uint8_Type & 0x01),
                        (uint8_t *)def_Font_ASCII_16x16_Array,
                                   uint16_Length,
                                   uint16_aCode,
                                   puint8_aBuffer);
  }


  // 送信データ数セット
  if(uint16_Font == (uint16_t)def_Font_ASCII_8x8){
    *puint16_Width
            = uint16_Length * def_DotWidthwise_Font8x8;
    *puint16_Height = def_DotLengthwise_Font8x8;
  }
  else if(uint16_Font == (uint16_t)def_Font_ASCII_16x16){
    *puint16_Width
            = uint16_Length * def_DotWidthwise_Font16x16;
    *puint16_Height = def_DotLengthwise_Font16x16;
  }
  else if(uint16_Font
                == (uint16_t)def_Font_ASCII_Expand_32x32){
    *puint16_Width
            = uint16_Length * def_DotWidthwise_Font32x32;
    *puint16_Height = def_DotLengthwise_Font32x32;
  }
  else if(uint16_Font
                == (uint16_t)def_Font_ASCII_Expand_48x48){
    *puint16_Width
            = uint16_Length * def_DotWidthwise_Font48x48;
    *puint16_Height = def_DotLengthwise_Font48x48;
  }
}
