/**
 * @file   IB36config.c
 * @author StepTechnica
 * @date   Jan 21 2023
 * 
 * @brief Evaluation Board 用ソースファイル「IB36ボード設定」
 * 
 * @copyright (C) 2022- StepTechnica Co.,Ltd.
 * 
 * このソフトウェアは、コピー利用、配布、変更の追加、変更を加えたもの再配布、商用利用、有料販売など、どなたも自由にお使いいただくことができます。
 * このソフトウェアには保証はついていません。
 * このソフトウェアを利用したことで問題が起きた際に、ソフトウェアの製作者は一切の責任を負いません。
 * 
 */

/* -----------------------------------------------------------------------------
 * #include
 */

#include "main.h"
#include <IB36config.h>
#include "stm32f4xx_hal.h"
#include <stdbool.h>

/* -----------------------------------------------------------------------------
 * 変数定義
 */
static EN_MKY_BUS __mky_bus = MKY_BUS_UNKNOWN;
static EN_MKY_ENDIAN __mky_endian = MKY_ENDIAN_UNKNOWN;
static AccessEndian en = AccessEndianLittle;
static char	sw5[8];

static short gCntBlink=0;

/* -----------------------------------------------------------------------------
 * 関数宣言
 */
EN_MKY_BUS ReadMkyBus(void);
EN_MKY_BUS GetMkyBus(void);
EN_MKY_ENDIAN GetMkyEndian(void);
void SetAccessEndian(AccessEndian endian);
AccessEndian GetAccessEndian();

char readSW5_1(void);
char readSW5_2(void);
char readSW5_3(void);
char readSW5_4(void);
char readSW5_5(void);
char readSW5_6(void);
char readSW5_7(void);
char readSW5_8(void);

void drvLED6 (char sw);
void drvLED7 (char sw);
void drvLED8 (char sw);
void drvLED9 (char sw);
void drvLED10(char sw);
void drvLED11(char sw);
void drvLED12(char sw);
void drvLED13(char sw);

void drvMKYRESET(char sw);

char readInt0(void);
char readInt1(void);
void setSPI2_CS(char sw);
void setSPI4_CS(char sw);

void LedSw_main(void);

/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief： IB-xx基板のハードウェア設定を読みだす
 * 
 * @note： SWAP・WB 端子の状態を読み込み基板構成を返答する
 * 
 * @param  none
 * @retval EN_MKY_BUS __mky_bus
 * 
 */
EN_MKY_BUS ReadMkyBus(void)
{
	switch( HAL_GPIO_ReadPin(WB_GPIO_Port, WB_Pin) )
	{
	case GPIO_PIN_SET:
		__mky_bus = MKY_BUS_16;
		break;
	case GPIO_PIN_RESET:
		__mky_bus = MKY_BUS_8;
		//エンディアンも読む。
		switch( HAL_GPIO_ReadPin(SWAP_GPIO_Port, SWAP_Pin) )
		{
		case GPIO_PIN_SET:
			__mky_endian = MKY_ENDIAN_LITTLE;
			break;
		case GPIO_PIN_RESET:
			__mky_endian = MKY_ENDIAN_BIG;
			break;
		}
		switch( __mky_endian )
		{
		case MKY_ENDIAN_LITTLE:
			SetAccessEndian(AccessEndianLittle);
			break;
		case MKY_ENDIAN_BIG:
			SetAccessEndian(AccessEndianBig);
			break;
		default:
			break;
		}
		break;
	}
	//バスを返す
	return __mky_bus;
}

/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：MKYデバイスがどのバスでつながっているかを返す
 * 
 * @note： 現在の基板構成を返答する
 * 
 * @param  none
 * @retval EN_MKY_BUS __mky_bus
 * 
 */
EN_MKY_BUS GetMkyBus(void)
{
	return __mky_bus;
}

/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：エンディアン設定を返す
 * 
 * @note： WB端子から得た値を返答する
 * 
 * @param  none
 * @retval EN_MKY_ENDIAN __mky_endian
 * 
 */
EN_MKY_ENDIAN GetMkyEndian(void)
{
	return __mky_endian;
}


/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：コマンドからアクセスする時のエンディアンを設定する
 * 
 * @note： 
 * 
 * @param  AccessEndian endian
 * @retval none
 * 
 */
void SetAccessEndian(AccessEndian endian)
{
	en = endian;
}

/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：コマンドからアクセスする時のエンディアンを返答する
 * 
 * @note： WB端子から得た値を返答する
 * 
 * @param  none
 * @retval AccessEndian en
 * 
 */
AccessEndian GetAccessEndian(void)
{
	return en;
}

	/* ----- Port-A -------------------------
		PA0  : CN60-28 = SW5-1     
		PA1  : CN60-30 = SW5-2     
		PA2  : CN61-35 = SW5-3     
		PA3  : CN61-37 = SW5-4     
		PA4  : CN60-32 = SW5-5     
		PA5  : CN61-11 = SW5-6     
		PA6  : CN61-13 = SW5-7     
		PA7  : CN61-15 = SW5-8     
	 */
/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：SW5-1読出し
 * 
 * @note： 
 * 
 * @param  none
 * @retval false ： SW OFF
 * @retval true  ： SW ON
 * 
 */
char readSW5_1(void)
{
	return((HAL_GPIO_ReadPin(SW5_1_GPIO_Port, SW5_1_Pin) == GPIO_PIN_SET)? false : true);
}

/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：SW5-2読出し
 * 
 * @note： 
 * 
 * @param  none
 * @retval false ： SW OFF
 * @retval true  ： SW ON
 * 
 */
char readSW5_2(void)
{
	return((HAL_GPIO_ReadPin(SW5_2_GPIO_Port, SW5_2_Pin) == GPIO_PIN_SET)? false : true);
}

/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：SW5-3読出し
 * 
 * @note： 
 * 
 * @param  none
 * @retval false ： SW OFF
 * @retval true  ： SW ON
 * 
 */
char readSW5_3(void)
{
	return((HAL_GPIO_ReadPin(SW5_3_GPIO_Port, SW5_3_Pin) == GPIO_PIN_SET)? false : true);
}

/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：SW5-4読出し
 * 
 * @note： 
 * 
 * @param  none
 * @retval false ： SW OFF
 * @retval true  ： SW ON
 * 
 */
char readSW5_4(void)
{
	return((HAL_GPIO_ReadPin(SW5_4_GPIO_Port, SW5_4_Pin) == GPIO_PIN_SET)? false : true);
}

/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：SW5-5読出し
 * 
 * @note： 
 * 
 * @param  none
 * @retval false ： SW OFF
 * @retval true  ： SW ON
 * 
 */
char readSW5_5(void)
{
	return((HAL_GPIO_ReadPin(SW5_5_GPIO_Port, SW5_5_Pin) == GPIO_PIN_SET)? false : true);
}

/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：SW5-6読出し
 * 
 * @note： 
 * 
 * @param  none
 * @retval false ： SW OFF
 * @retval true  ： SW ON
 * 
 */
char readSW5_6(void)
{
	return((HAL_GPIO_ReadPin(SW5_6_GPIO_Port, SW5_6_Pin) == GPIO_PIN_SET)? false : true);
}

/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：SW5-7読出し
 * 
 * @note： 
 * 
 * @param  none
 * @retval false ： SW OFF
 * @retval true  ： SW ON
 * 
 */
char readSW5_7(void)
{
	return((HAL_GPIO_ReadPin(SW5_7_GPIO_Port, SW5_7_Pin) == GPIO_PIN_SET)? false : true);
}

/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：SW5-8読出し
 * 
 * @note： 
 * 
 * @param  none
 * @retval false ： SW OFF
 * @retval true  ： SW ON
 * 
 */
char readSW5_8(void)
{
	return((HAL_GPIO_ReadPin(SW5_8_GPIO_Port, SW5_8_Pin) == GPIO_PIN_SET)? false : true);
}

	/* ----- Port-B -------------------------
		PB0  : CN60-34 = LD1       : Nucleo
		PB4  : CN61-27 = LED6      
		PB5  : CN61-29 = LED7      
		PB6  : CN61-17 = LED8      
		PB7  : CN60-21 = LED9(LD2) ( Nucleo)
		PB8  : CN61-3  = LED10     
		PB9  : CN61-5  = LED11     
		PB10 : CN61-25 = LED12     
		PB11 : CN61-18 = LED13     
		PB14 : CN61-28 = LD3       : Nucleo
	 */

/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：LED6 の制御
 * 
 * @note： 
 * 
 * @param  char sw ： false = 消灯、true = 点灯
 * @retval none
 * 
 */
void drvLED6(char sw)
{
	HAL_GPIO_WritePin(LED6_GPIO_Port, LED6_Pin , sw );
}

/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：LED7 の制御
 * 
 * @note： 
 * 
 * @param  char sw ： false = 消灯、true = 点灯
 * @retval none
 * 
 */
void drvLED7(char sw)
{
	HAL_GPIO_WritePin(LED7_GPIO_Port, LED7_Pin , sw );
}

/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：LED8 の制御
 * 
 * @note： 
 * 
 * @param  char sw ： false = 消灯、true = 点灯
 * @retval none
 * 
 */
void drvLED8(char sw)
{
	HAL_GPIO_WritePin(LED8_GPIO_Port, LED8_Pin , sw );
}

/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：LED9 の制御
 * 
 * @note： 
 * 
 * @param  char sw ： false = 消灯、true = 点灯
 * @retval none
 * 
 */
void drvLED9(char sw)
{
	HAL_GPIO_WritePin(LED9_GPIO_Port, LED9_Pin , sw );
}

/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：LED10 の制御
 * 
 * @note： 
 * 
 * @param  char sw ： false = 消灯、true = 点灯
 * @retval none
 * 
 */
void drvLED10(char sw)
{
	HAL_GPIO_WritePin(LED10_GPIO_Port, LED10_Pin , sw );
}

/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：LED11 の制御
 * 
 * @note： 
 * 
 * @param  char sw ： false = 消灯、true = 点灯
 * @retval none
 * 
 */
void drvLED11(char sw)
{
	HAL_GPIO_WritePin(LED11_GPIO_Port, LED11_Pin , sw );
}

/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：LED12 の制御
 * 
 * @note： 
 * 
 * @param  char sw ： false = 消灯、true = 点灯
 * @retval none
 * 
 */
void drvLED12(char sw)
{
	HAL_GPIO_WritePin(LED12_GPIO_Port, LED12_Pin, sw );
}

/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：LED13 の制御
 * 
 * @note： 
 * 
 * @param  char sw ： false = 消灯、true = 点灯
 * @retval none
 * 
 */
void drvLED13(char sw)
{
	HAL_GPIO_WritePin(LED13_GPIO_Port, LED13_Pin, sw );
}

/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief： Reset MKY Device
 *
 * @note：
 *
 * @param  char sw ： false = Reset、true = Normal
 * @retval none
 *
 */
void drvMKYRESET(char sw)
{
	HAL_GPIO_WritePin(MKYRESET_GPIO_Port, MKYRESET_Pin, sw );
}


/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：INT0 読出し
 * 
 * @note： INT0 : PG15 
 * 
 * @param  none
 * @retval false ： Port=High, no interrupt
 * @retval true  ： Port=Low,  interrupt
 * 
 */
char isInt0on(void)
{
	return((HAL_GPIO_ReadPin(INT0_GPIO_Port, INT0_Pin) == GPIO_PIN_SET)? false : true);
}


/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：INT1 読出し
 * 
 * @note： INT1 : PG10 
 * 
 * @param  none
 * @retval false ： Port=High, no interrupt
 * @retval true  ： Port=Low,  interrupt
 * 
 */
char isInt1on(void)
{
	return((HAL_GPIO_ReadPin(INT1_GPIO_Port, INT1_Pin) == GPIO_PIN_SET)? false : true);
}


/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：SPI2 CS 端子設定
 * 
 * @note： SPI2_NSS : PB12
 * 
 * @param  char sw ： false = output Low、true = output High
 * @retval none
 * 
 */
void setSPI2_CS(char sw)
{
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, sw );
}


/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：SPI4 CS 端子設定
 * 
 * @note： SPI4_NSS : PE4
 * 
 * @param  char sw ： false = output Low、true = output High
 * @retval none
 * 
 */
void setSPI4_CS(char sw)
{
	HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, sw );
}


/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief：LED SW処理
 * 
 * @note： main()から呼ぼれるメインルーチン
 *         SW5 の値を読んで、対応するLEDを制御する
 * 
 * @param  none
 * @retval none
 * 
 */
void LedSw_main(void)
{
	// Raed SW data
	sw5[0] = readSW5_1();
	sw5[1] = readSW5_2();
	sw5[2] = readSW5_3();
	sw5[3] = readSW5_4();
	sw5[4] = readSW5_5();
	sw5[5] = readSW5_6();
	sw5[6] = readSW5_7();
	sw5[7] = readSW5_8();

	// LED Control
	// drvLED13( sw5[0] );
	drvLED12( sw5[1] );
	drvLED11( sw5[2] );
	drvLED10( sw5[3] );
	drvLED9 ( sw5[4] );
	drvLED8 ( sw5[5] );
	drvLED7 ( sw5[6] );
	drvLED6 ( sw5[7] );
}

void blinkLED1(void)
{
	gCntBlink++;

	if (gCntBlink == 5) {
		drvLED13(true);
	} else if (gCntBlink == 10) {
		drvLED13(false);
		gCntBlink = 0;
	}
}
