/*
 * RDA5807_Control.c
 *
 *  Created on: 2026/02/06
 *      Author: egaono-electronics
 */

#include "RDA5807_Control.h"

#include "RDA5807_Operation.h"
#include "Time_Interval.h"



//----------------------------------------------------------
// RDA5807 初期化
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Initialize_RDA5807(uint8_t *puint8_JobNum,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  static uint8_t STC_uint8_JobNum_RDA5807;  // RDA5807処理番号


  int16_t int16_Return;


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


    //----------------------------------------------------------
    // Handle I2C用パラメータの構造体を初期化
    //----------------------------------------------------------
    // 引数：
    // struct sParam_Handle_I2Cx  *pstructParam_Handle_I2Cx
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値：
    //    なし
    //----------------------------------------------------------
    Initialize_Parameter_I2Cx(pstructParam_Handle_I2Cx);


    // 送信Bufferのポインタをセット
    pstructParam_Handle_I2Cx->puint8_aI2C_TxBuffer
                                = GLB_uint8_aI2C1_TxBuffer;

    // 受信Bufferのポインタをセット
    pstructParam_Handle_I2Cx->puint8_aI2C_RxBuffer
                                = GLB_uint8_aI2C1_RxBuffer;


    //----------------------------------------------------------
    // Addressing Mode指定
    //----------------------------------------------------------
    // RDA5807 の Addressing Mode
    // Specifies if 7-bit or 10-bit addressing mode is selected.
    //                        7bit : I2C_ADDRESSINGMODE_7BIT
    //                       10bit : I2C_ADDRESSINGMODE_10BIT
    pstructParam_Handle_I2Cx->uint32_AddressingMode
                        = (uint32_t)I2C_ADDRESSINGMODE_7BIT;
    //----------------------------------------------------------


    //----------------------------------------------------------
    // Slave Address指定
    //----------------------------------------------------------
    // RDA5807 の Slave Address
    pstructParam_Handle_I2Cx->uint16_vI2C_SlaveAddress
                        = (uint16_t)def_SlaveAddress_RDA5807;
    //----------------------------------------------------------


    //----------------------------------------------------------
    // Clock Speed指定
    //----------------------------------------------------------
    // RDA5807 の Clock Speed
    pstructParam_Handle_I2Cx->uint32_vI2C_Clock_Speed
                        = (uint32_t)def_I2C_CLOCK_SPEED_100k;
    //----------------------------------------------------------


    //----------------------------------------------------------
    // Master/Slave指定
    //----------------------------------------------------------
    pstructParam_Handle_I2Cx->int16_vI2C_Master_Slave
                        = (int16_t)def_I2C_Master;
    //----------------------------------------------------------


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

  case 1:
    //----------------------------------------------------------
    // I2C1 初期化
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx
    //              Handle I2C用パラメータの構造体のポインタ


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


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

  case 2:
    //----------------------------------------------------------
    // RDA5807 の初期設定を行う。
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Initial_Setting_RDA5807(&STC_uint8_JobNum_RDA5807,
                                             pstructParam_Handle_I2Cx);
    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);
}



//----------------------------------------------------------
// I2C1 初期化
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Initialize_I2C1(uint8_t *puint8_JobNum,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  //----------------------------------------------------
  // 呼び出す関数の引数に使用する処理番号は、
  // 必ず static の変数宣言をしてください。
  //----------------------------------------------------
  static uint8_t STC_uint8_JobNum_Time;  // Time_Interval処理番号

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


  GPIO_InitTypeDef GPIO_InitStruct;


  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    //----------------------------------------------
    // 初期化済みでない場合、初期化する。
    //----------------------------------------------
    if(pstructParam_Handle_I2Cx->int16_vI2C_Initialize_Done == 1){
      // 初期化済みの場合、なにもしないで終了する。
      int16_Return = 0;  // OK
      break;  // 処理終了
    }


    //----------------------------------------------
    // 初期化済みでない場合、初期化処理を行う。
    //----------------------------------------------

    //----------------------------------------------------------
    // SCL と SDA を Low にする。
    //----------------------------------------------------------

    //------------------------------------------------------
    // I2C GPIO pin configuration
    //------------------------------------------------------

    // Enable GPIO Clocks
    __HAL_RCC_GPIOB_CLK_ENABLE();


    //------------------
    // I2C1_SCL
    //------------------
    HAL_GPIO_WritePin(def_GPIOx_I2C1_SCL,
                      def_GPIO_PIN_I2C1_SCL, GPIO_PIN_RESET);

    GPIO_InitStruct.Pin       = def_GPIO_PIN_I2C1_SCL;
    GPIO_InitStruct.Mode      = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull      = GPIO_NOPULL;
    GPIO_InitStruct.Speed     = GPIO_SPEED_HIGH;

    HAL_GPIO_Init(def_GPIOx_I2C1_SCL, &GPIO_InitStruct);


    //------------------
    // I2C1_SDA
    //------------------
    HAL_GPIO_WritePin(def_GPIOx_I2C1_SDA,
                      def_GPIO_PIN_I2C1_SDA, GPIO_PIN_RESET);

    GPIO_InitStruct.Pin       = def_GPIO_PIN_I2C1_SDA;

    HAL_GPIO_Init(def_GPIOx_I2C1_SDA, &GPIO_InitStruct);
    //------------------------------------------------------

    //----------------------------------------------------------


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


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

  case 1:
    //----------------------------------------------------------
    // 時間待ち : 単位 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;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    //----------------------------------------------------------
    // I2Cx 初期化
    //----------------------------------------------------------
    // 引数:
    // I2C_TypeDef *I2Cx :
    //      where x can be 1 or 2 to select the I2C peripheral.
    // I2C_HandleTypeDef *pHandle_I2C : I2C handler declaration

    // uint32_t uint32_AddressingMode :
    //      Specifies if 7-bit or 10-bit addressing mode
    //                                              is selected.
    //                7bit : I2C_ADDRESSINGMODE_7BIT
    //                10bit : I2C_ADDRESSINGMODE_10BIT

    // uint32_t uint32_ClockSpeed : Specifies the clock frequency.
    //      This parameter must be set to a value lower than 400kHz.

    // uint32_t uint32_I2C_Address :
    //            Specifies the first device own address.
    //            This parameter can be a 7-bit or 10-bit address.


    // 戻り値:
    //    0 : OK
    //    1 : NG
    //----------------------------------------------------------
    int16_Return = Initialize_I2Cx(I2C1,
                                   &Handle_I2C1,
                                   pstructParam_Handle_I2Cx->
                                        uint32_AddressingMode,
                                   pstructParam_Handle_I2Cx->
                                        uint32_vI2C_Clock_Speed,
                                   (uint32_t)def_I2C1_OwnAddress);

    //----------------------------------------------------------
    // アクセスするデバイスのためのSlave Addressは
    //    RDA5807 にアクセスするときに指定する。
    //----------------------------------------------------------


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

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

  return(int16_Return);
}



//----------------------------------------------------------
// RDA5807 の初期設定を行う。
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Initial_Setting_RDA5807(uint8_t *puint8_JobNum,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  //----------------------------------------------------
  // 呼び出す関数の引数に使用する処理番号は、
  // 必ず 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_RDA5807;  // RDA5807処理番号

  static uint16_t STC_uint16_Value_Register;  // Register値


  int16_t int16_Return;


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


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

  case 1:
    //----------------------------------------------------------
    // Reset : Register 02H
    //----------------------------------------------------------
    // RDA5807 レジスタ書き込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t uint16_Data : 書き込みデータ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


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

    if(int16_Return != 0){
      // NG終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


    STC_uint8_JobNum_Time = 0;  // Time_Interval処理番号初期化

    // 電源ON時の待ち時間セット
    STC_structParam_Time_Interval.uint32_Interval = (uint32_t)50;
                                // 待ち時間セット : 50mSec


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

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

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


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


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

  case 3:
    //----------------------------------------------------------
    // Register 02H 初期化
    //----------------------------------------------------------
    // bit 15 : DHIZ : Audio Output High-Z Disable.
    // 1 = Normal operation をセット

    // bit 14 : DMUTE : Mute Disable.
    // 1 = Normal operation をセット

    // bit 0 : ENABLE : Power Up Enable.
    // 1 = Enabled  をセット
    //----------------------------------------------------------
    // RDA5807 レジスタ書き込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t uint16_Data : 書き込みデータ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


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

    if(int16_Return != 0){
      // NG終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


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

  case 4:
    //----------------------------------------------------------
    // Register 03H 初期化
    //----------------------------------------------------------
    // RDA5807 レジスタ書き込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t uint16_Data : 書き込みデータ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


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

    if(int16_Return != 0){
      // NG終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


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

  case 5:
    //----------------------------------------------------------
    // Register 04H 初期化
    //----------------------------------------------------------
    // RDA5807 レジスタ書き込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t uint16_Data : 書き込みデータ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


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

    if(int16_Return != 0){
      // NG終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


    //-------------------------------------
    // Register 05H の値をセット
    //-------------------------------------
    STC_uint16_Value_Register = 0x8080;
    STC_uint16_Value_Register |= (uint16_t)def_Default_SEEKTH << 8;  // SEEKTH
    STC_uint16_Value_Register |= (uint16_t)def_Default_VOLUME;  // VOLUME


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

  case 6:
    //----------------------------------------------------------
    // Register 05H 初期化
    //----------------------------------------------------------
    // bit[11:8] : SEEKTH[3:0] : Seek SNR threshold value
    // 0100 をセット
    //----------------------------------------------------------
    // RDA5807 レジスタ書き込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t uint16_Data : 書き込みデータ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


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

    if(int16_Return != 0){
      // NG終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


    //-------------------------------------
    // Register 07H の値をセット
    //-------------------------------------
    STC_uint16_Value_Register = 0x0202;
    STC_uint16_Value_Register
        |= (uint16_t)def_Default_TH_SOFRBLEND << 10;  // TH_SOFRBLEND


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

  case 7:
    //----------------------------------------------------------
    // Register 07H 初期化
    //----------------------------------------------------------
    // RDA5807 レジスタ書き込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t uint16_Data : 書き込みデータ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


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

    if(int16_Return != 0){
      // NG終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


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

  case 8:
    // Power OFF
    //----------------------------------------------------------
    // Register 02H
    // bit 0 : ENABLE : Power Up Enable.
    // 0 = Disabled  をセット
    //----------------------------------------------------------
    // Power ON/OFF
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // int16_t int16_OFF_ON : Power ON/OFF
    //  0 : OFF
    //  1 : ON

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


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


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

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

  return(int16_Return);
}



//----------------------------------------------------------
// RDA5807 レジスタ読み込み
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

// uint8_t uint8_Address_Register : レジスタアドレス
// uint16_t *puint16_Data : 読み込みデータを格納する変数のポインタ

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Read_Register_RDA5807(uint8_t *puint8_JobNum,
                                uint8_t uint8_Address_Register,
                                uint16_t *puint16_Data,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  static uint8_t STC_uint8_JobNum_I2C;  // I2C処理番号


  uint16_t uint16_Register;

  int16_t int16_Return;


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


    //----------------------------------------------------------
    // レジスタアドレス送信
    //----------------------------------------------------------
    // I2C送信データセット : レジスタアドレス
    pstructParam_Handle_I2Cx->puint8_aI2C_TxBuffer[0]
                               = uint8_Address_Register;

    // 送信数セット
    pstructParam_Handle_I2Cx->uint16_vI2C_TxNumber
                                = (volatile uint16_t)1;
    //----------------------------------------------------------


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

  case 1:
    //----------------------------------------------------------
    // I2Cx Master送信 : NO STOP
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号

    // I2C_HandleTypeDef *pHandle_I2Cx : I2C handler declaration

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx
    //              Handle I2C用パラメータの構造体のポインタ


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

    if(int16_Return != 0){
      // NG終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


    // 受信数セット
    pstructParam_Handle_I2Cx->uint16_vI2C_RxNumber
                                = (volatile uint16_t)2;


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

  case 2:
    //----------------------------------------------------------
    // I2Cx Master受信 : OTHER_AND_LAST_FRAME
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号

    // I2C_HandleTypeDef *pHandle_I2Cx : I2C handler declaration

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx
    //              Handle I2C用パラメータの構造体のポインタ


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

    if(int16_Return != 0){
      // NG終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


    uint16_Register
        = (((uint16_t)pstructParam_Handle_I2Cx->
                                puint8_aI2C_RxBuffer[0]) << 8);
                                            // data high byte

    uint16_Register
      |= ((uint16_t)pstructParam_Handle_I2Cx->
                                puint8_aI2C_RxBuffer[1]) & 0x00ff;
                                            // data low byte

    *puint16_Data = uint16_Register;


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

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

  return(int16_Return);
}



//----------------------------------------------------------
// RDA5807 レジスタ書き込み
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

// uint8_t uint8_Address_Register : レジスタアドレス
// uint16_t uint16_Data : 書き込みデータ

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Write_Register_RDA5807(uint8_t *puint8_JobNum,
                                 uint8_t uint8_Address_Register,
                                 uint16_t uint16_Data,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  static uint8_t STC_uint8_JobNum_I2C;  // I2C処理番号


  int16_t int16_Return;


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


    //----------------------------------------------------------
    // I2C送信データセット
    //----------------------------------------------------------

    //----------------------------------------------------------
    // レジスタアドレス セット
    //----------------------------------------------------------
    // I2C送信データセット : レジスタアドレス
    pstructParam_Handle_I2Cx->puint8_aI2C_TxBuffer[0]
                               = uint8_Address_Register;

    //----------------------------------------------------------
    // レジスタデータセット
    //----------------------------------------------------------
    pstructParam_Handle_I2Cx->puint8_aI2C_TxBuffer[1]
                               = (uint8_t)(uint16_Data >> 8);
                                            // data high byte

    pstructParam_Handle_I2Cx->puint8_aI2C_TxBuffer[2]
                               = (uint8_t)(uint16_Data & 0x00ff);
                                            // data low byte

    //----------------------------------------------------------
    // 送信数セット
    //----------------------------------------------------------
    pstructParam_Handle_I2Cx->uint16_vI2C_TxNumber
                                = (volatile uint16_t)3;


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

  case 1:
    //----------------------------------------------------------
    // I2Cx Master送信
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号

    // I2C_HandleTypeDef *pHandle_I2Cx : I2C handler declaration

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx
    //              Handle I2C用パラメータの構造体のポインタ


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

    if(int16_Return != 0){
      // NG終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


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

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

  return(int16_Return);
}



//----------------------------------------------------------
// Power ON/OFF
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

// int16_t int16_OFF_ON : Power ON/OFF
//  0 : OFF
//  1 : ON

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t OFF_ON_Power(uint8_t *puint8_JobNum,
            int16_t int16_OFF_ON,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  static uint8_t STC_uint8_JobNum_Register;  // Register処理番号

  static uint16_t STC_uint16_Register_Data;  // Registerデータ


  int16_t int16_Return;


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


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

  case 1:
    //----------------------------------------------------------
    // レジスタ02H の 値を読み込む。
    //----------------------------------------------------------
    // RDA5807 レジスタ読み込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t *puint16_Data : 読み込みデータを格納する変数のポインタ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


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

    if(int16_Return != 0){
      // NG終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


    //--------------------------------------
    // PowerをON/OFFする。
    //--------------------------------------
    // Power ON/OFF の指定を判定
    if(int16_OFF_ON == 0){
      // Power OFF
      STC_uint16_Register_Data &= ~((uint16_t)def_bit_ENABLE);
    }
    else{
      // Power ON
      STC_uint16_Register_Data |= (uint16_t)def_bit_ENABLE;
    }


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

  case 2:
    //----------------------------------------------------------
    // レジスタ02H の 値を書き込む。
    //----------------------------------------------------------
    // RDA5807 レジスタ書き込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t uint16_Data : 書き込みデータ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


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


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

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

  return(int16_Return);
}



//----------------------------------------------------------
// 音量を調整する。
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

// int16_t int16_Direction : 音量調整の方向
//  0 : 小さくする。
//  1 : 大きくする。

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Adjust_Volume(uint8_t *puint8_JobNum,
            int16_t int16_Direction,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  static uint8_t STC_uint8_JobNum_Register;  // Register処理番号

  static uint16_t STC_uint16_Register_Data;  // Registerデータ


  uint16_t uint16_Volume;

  int16_t int16_Return;


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


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

  case 1:
    //----------------------------------------------------------
    // レジスタ05H の Volume値を読み込む。
    //----------------------------------------------------------
    // RDA5807 レジスタ読み込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t *puint16_Data : 読み込みデータを格納する変数のポインタ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


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


    uint16_Volume
        = STC_uint16_Register_Data & (uint16_t)def_bit_Mask_VOLUME;
                                            // Volume値を取得
    STC_uint16_Register_Data &= ~((uint16_t)def_bit_Mask_VOLUME);
                // Register値のVolume値の部分を0にする。

    //--------------------------------------
    // Volume値を加減する。
    //--------------------------------------
    // 音量の増減を判定
    if(int16_Direction == 0){
      // 音量を小さくする。
      if(uint16_Volume > 0){
        // 0 より大きければデクリメントする。
        uint16_Volume--;
      }
      else{
        *puint8_JobNum = 0;  // 処理番号初期化
        int16_Return = 0;  // OK
        break;  // 処理終了
      }
    }
    else{
      // 音量を大きくする。
      if(uint16_Volume < 0x000F){
        // 0x000F より小さければインクリメントする。
        uint16_Volume++;
      }
      else{
        *puint8_JobNum = 0;  // 処理番号初期化
        int16_Return = 0;  // OK
        break;  // 処理終了
      }
    }


    // レジスタ値にVolume値をセット
    STC_uint16_Register_Data |= uint16_Volume;


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

  case 2:
    //----------------------------------------------------------
    // レジスタ05H の Volume値を書き込む。
    //----------------------------------------------------------
    // RDA5807 レジスタ書き込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t uint16_Data : 書き込みデータ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


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


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

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

  return(int16_Return);
}



//----------------------------------------------------------
// 放送局を検出する。
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

// int16_t int16_Direction : 検出の方向
//  0 : 周波数の低い方向に検出する。
//  1 : 周波数の高い方向に検出する。

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Seek_Channel(uint8_t *puint8_JobNum,
                    int16_t int16_Direction,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  //----------------------------------------------------
  // 呼び出す関数の引数に使用する処理番号は、
  // 必ず 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_Register;  // Register処理番号

  static uint16_t STC_uint16_Register_Data;  // Registerデータ
  static uint16_t STC_uint16_Count_Timer;


  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    STC_uint8_JobNum_Register = 0;  // Register処理番号初期化
    STC_uint16_Count_Timer = 0;


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

  case 1:
    //----------------------------------------------------------
    // レジスタ02H の値を読み込む。
    //----------------------------------------------------------
    // RDA5807 レジスタ読み込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t *puint16_Data : 読み込みデータを格納する変数のポインタ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


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


    //--------------------------------------
    // SEEKUPビットの設定
    //--------------------------------------
    // 検出の方向を判定
    if(int16_Direction == 0){
      // 周波数の低い方向に検出する。
      // SEEKUPビットを 0 にする。
      STC_uint16_Register_Data &= ~((uint16_t)def_bit_SEEKUP);
    }
    else{
      // 周波数の高い方向に検出する。
      // SEEKUPビットを 1 にする。
      STC_uint16_Register_Data |= (uint16_t)def_bit_SEEKUP;
    }


    // SEEKビットをONにする。
    STC_uint16_Register_Data |= (uint16_t)def_bit_SEEK;


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

  case 2:
    //----------------------------------------------------------
    // レジスタ02H に 値を書き込む。
    //----------------------------------------------------------
    // RDA5807 レジスタ書き込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t uint16_Data : 書き込みデータ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


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


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

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


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

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

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


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


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

  case 5:
    //----------------------------------------------------------
    // レジスタ02H の値を読み込む。
    //----------------------------------------------------------
    // RDA5807 レジスタ読み込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t *puint16_Data : 読み込みデータを格納する変数のポインタ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


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


    // SEEKビットをの判定
    if((STC_uint16_Register_Data & (uint16_t)def_bit_SEEK) != 0)
    {
      STC_uint16_Count_Timer++;
      if(STC_uint16_Count_Timer > 2000){
        // Timeout
        *puint8_JobNum = 0;  // 処理番号初期化
        int16_Return = 2;  // Timeout終了
        break;  // 処理終了
      }

      // SEEKが終了していない場合
      *puint8_JobNum = 3;  // 次の処理番号に移行する。
                           //       : case 3: - case 5: をループ
      int16_Return = -1;   // 処理継続
      break;
    }


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

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

  return(int16_Return);
}



//----------------------------------------------------------
// RDA5807 周波数取得
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

// uint32_t *puint32_Frequency : 読み込み周波数を格納する変数のポインタ

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Get_Frequency_RDA5807(uint8_t *puint8_JobNum,
                                uint32_t *puint32_Frequency,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  static uint8_t STC_uint8_JobNum_Register;  // Register処理番号


  uint16_t uint16_Register_Data;  // Registerデータ

  uint32_t uint32_Frequency_Lower_Limit = 76000;  // 周波数下限値 : kHz
  uint32_t uint32_Channel_Spacing = 100;  // 周波数間隔 : kHz

  int16_t int16_Return;


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


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

  case 1:
    //----------------------------------------------------------
    // レジスタ0AH の値を読み込む。
    //----------------------------------------------------------
    // bit[9:0] : READCHAN[9:0] : Read Channel.
    //----------------------------------------------------------
    // RDA5807 レジスタ読み込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t *puint16_Data : 読み込みデータを格納する変数のポインタ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


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


    // RDA5807 レジスタ読み込み の戻り値を判定する。
    if(int16_Return == 0){
      // OK終了の場合
      //------------------------------------------------------------
      // 周波数を計算する。
      //------------------------------------------------------------
      *puint32_Frequency
        = (uint32_t)(uint16_Register_Data & (uint16_t)def_bit_Mask_READCHAN)
                         * uint32_Channel_Spacing
                         + uint32_Frequency_Lower_Limit;
      //------------------------------------------------------------
    }


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

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

  return(int16_Return);
}



//----------------------------------------------------------
// 放送局を同調する。
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Tune_Channel(uint8_t *puint8_JobNum,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  //----------------------------------------------------
  // 呼び出す関数の引数に使用する処理番号は、
  // 必ず 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_Register;  // Register処理番号

  static uint16_t STC_uint16_Register_Data;  // Registerデータ
  static uint16_t STC_uint16_Count_Timer;


  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    STC_uint8_JobNum_Register = 0;  // Register処理番号初期化
    STC_uint16_Count_Timer = 0;


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

  case 1:
    //----------------------------------------------------------
    // レジスタ03H の値を読み込む。
    //----------------------------------------------------------
    // RDA5807 レジスタ読み込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t *puint16_Data : 読み込みデータを格納する変数のポインタ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


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


    // TUNEビットをONにする。
    STC_uint16_Register_Data |= (uint16_t)def_bit_TUNE;


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

  case 2:
    //----------------------------------------------------------
    // レジスタ03H に 値を書き込む。
    //----------------------------------------------------------
    // RDA5807 レジスタ書き込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t uint16_Data : 書き込みデータ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


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


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

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


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

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

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


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


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

  case 5:
    //----------------------------------------------------------
    // レジスタ03H の値を読み込む。
    //----------------------------------------------------------
    // RDA5807 レジスタ読み込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t *puint16_Data : 読み込みデータを格納する変数のポインタ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


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


    // TUNEビットをの判定
    if((STC_uint16_Register_Data & (uint16_t)def_bit_TUNE) != 0)
    {
      STC_uint16_Count_Timer++;
      if(STC_uint16_Count_Timer > 2000){
        // Timeout
        *puint8_JobNum = 0;  // 処理番号初期化
        int16_Return = 2;  // Timeout終了
        break;  // 処理終了
      }

      // TUNEが終了していない場合
      *puint8_JobNum = 3;  // 次の処理番号に移行する。
                           //       : case 3: - case 5: をループ
      int16_Return = -1;   // 処理継続
      break;
    }


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

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

  return(int16_Return);
}
