/*
 * Modules_Lib.c
 *
 *  Created on: 2026/01/21
 *      Author: egaono-electronics
 */

#include "Modules_Lib.h"


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


//----------------------------------------------------------
// ASCII文字 2byte を Binary 1byteに変換 :
//          例 ASCII文字 2byte "0D" --> Binary 1byte 0x0D
//----------------------------------------------------------
// 引数;
// uint8_t *puint8_Buff :
//          ASCII文字 2byteが格納されているBufferのポインタ
// uint8_t *puint8_aData :
//          変換した Binary 1byte を格納する変数のポインタ


// 戻り値:
//    なし
//----------------------------------------------------------
void commonConv2CharToByte(uint8_t *puint8_Buff,
                           uint8_t *puint8_aData)
{
  if(puint8_Buff[0] <= '9'){
    *puint8_aData = puint8_Buff[0] & 0x0f;
  }
  else{
    *puint8_aData = puint8_Buff[0] - 55;
  }

  *puint8_aData <<= 4;

  if(puint8_Buff[1] <= '9'){
    *puint8_aData |= puint8_Buff[1] & 0x0f;
  }
  else{
    *puint8_aData |= puint8_Buff[1] - 55;
  }
}



//----------------------------------------------------------
// 配列の要素を交換する。
//----------------------------------------------------------
// 引数:
// int16_t *pint16_aData : データ配列のポインタ

// int16_t int16_I : 交換位置 I
// int16_t int16_J : 交換位置 J


// 戻り値:
//    なし
//----------------------------------------------------------
void Swap_Array(int16_t *pint16_aData,
                int16_t int16_I, int16_t int16_J)
{
  int16_t int16_Temp;


  int16_Temp = pint16_aData[int16_I];
  pint16_aData[int16_I] = pint16_aData[int16_J];
  pint16_aData[int16_J] = int16_Temp;
}



//----------------------------------------------------------
// 小さい順に並べる。
//----------------------------------------------------------
// 引数;
// int16_t int16_Number : データ数
// int16_t *pint16_aData :
//              データが格納されているBufferのポインタ


// 戻り値:
//    なし
//----------------------------------------------------------
void Sort_Small_to_Large(int16_t int16_Number,
                         int16_t *pint16_aData)
{
  int16_t int16_I;
  int16_t int16_J;

  int16_t int16_Count;


  int16_Count = int16_Number -1;
  for(int16_I = 0; int16_I < int16_Number - 1; int16_I++){
    for(int16_J = 0; int16_J < int16_Count; int16_J++){
      if(pint16_aData[int16_J] > pint16_aData[int16_J + 1]){
        Swap_Array(pint16_aData, int16_J, int16_J + 1);
      }
    }

    int16_Count--;
  }
}



//-----------------------------------------------------------
// Convert float to ASCII : floatをASCII文字列に変換
//-----------------------------------------------------------
// 引数:
// float flt_Value : floatデータ
// uint8_t *puint8_Convert : 変換文字列を格納するBufferのポインタ


// 戻り値:
//    変換文字数
//-----------------------------------------------------------
int16_t Convert_Float_to_ASCII(float flt_Value,
                              uint8_t *puint8_Convert)
{
  uint32_t int32_Integer;
  float flt_Decimals;

  int16_t int16_Result = 0;
  int16_t int16_Length = 0;


  if(flt_Value >= 0){
    int32_Integer = (int32_t)flt_Value;

    // 小数点以下
    flt_Decimals = flt_Value - (float)int32_Integer;
  }
  else{
    int32_Integer = (int32_t)(-flt_Value);

    // 小数点以下
    flt_Decimals = flt_Value + (float)int32_Integer;
  }

  if(flt_Value < 0){
    flt_Decimals *= -1;
  }


  if(flt_Value < 0){
    int32_Integer *= -1;
  }
  int16_Result = (int16_t)sprintf((char *)puint8_Convert, "%ld",
                        (long)int32_Integer);

  if(flt_Decimals != 0){
    // 小数点以下がある場合、追加する。
    puint8_Convert[int16_Result] = '.';
    int16_Result++;

    flt_Decimals *= 100000000;

    if(flt_Decimals < 10000000){
      puint8_Convert[int16_Result] = '0';
      int16_Result++;
    }
    if(flt_Decimals < 1000000){
      puint8_Convert[int16_Result] = '0';
      int16_Result++;
    }
    if(flt_Decimals < 100000){
      puint8_Convert[int16_Result] = '0';
      int16_Result++;
    }
    if(flt_Decimals < 10000){
      puint8_Convert[int16_Result] = '0';
      int16_Result++;
    }
    if(flt_Decimals < 1000){
      puint8_Convert[int16_Result] = '0';
      int16_Result++;
    }
    if(flt_Decimals < 100){
      puint8_Convert[int16_Result] = '0';
      int16_Result++;
    }
    if(flt_Decimals < 10){
      puint8_Convert[int16_Result] = '0';
      int16_Result++;
    }

    int16_Length
      = (int16_t)sprintf((char *)&puint8_Convert[int16_Result], "%lu",
              (unsigned long)flt_Decimals);
  }

  int16_Length += int16_Result;

  if(flt_Value >= 0){
    if(int16_Length > 10){
      int16_Length = 10;
    }
  }
  else{
    if(int16_Length > 11){
      int16_Length = 11;
    }
  }

  puint8_Convert[int16_Length] = '\0';

  return(int16_Length);
}



//------------------------------------------------------------------
// 数字を3桁の文字列に変換 : ASCII
//------------------------------------------------------------------
// 引数：
// uint16_t uint16_Num : 数字

// uint8_t *puint8_aString :
//          3桁の文字列に変換したデータを格納するバッファのポインタ

// 戻り値：
//    なし
//------------------------------------------------------------------
void Conv_Num_String_3_ASCII(
                    uint16_t uint16_Num, uint8_t *puint8_aString)
{
  if(uint16_Num > 999){
    // NG
    return;
  }


  if(uint16_Num < 10){
    puint8_aString[0] = (uint8_t)'0';
    puint8_aString[1] = (uint8_t)'0';

    puint8_aString[2] = 0x30 | (uint8_t)uint16_Num;
  }
  else if(uint16_Num < 100){
    puint8_aString[0] = (uint8_t)'0';

    puint8_aString[1] = 0x30 | (uint8_t)(uint16_Num / 10);

    puint8_aString[2] = 0x30 | (uint8_t)(uint16_Num % 10);
  }
  else{
    puint8_aString[0] = 0x30 | (uint8_t)(uint16_Num / 100);

    puint8_aString[1] = 0x30 | (uint8_t)((uint16_Num / 10) % 10);

    puint8_aString[2] = 0x30 | (uint8_t)(uint16_Num % 10);
  }
}
