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

/* -----------------------------------------------------------------------------
 * #include
 */
#include <IB36config.h>
#include "HLS.h"

#include <stdbool.h>
#include <stdio.h>
#include "ctrlUART4.h"
#include "Utility.h"

/* -----------------------------------------------------------------------------
 * enumタグ定義 (typedefを同時に行う)
 */
typedef enum _HLSStatus
{
    st_STOP = 0,	// STOP phase
	st_RUN,	        // RUN phase
}HLSStatus;


/* -----------------------------------------------------------------------------
 * 変数定義
 */
HLSStatus        	gHLSState = st_STOP;

/* -----------------------------------------------------------------------------
 * 関数プロトタイプ宣言
 */
void HLS_main(void);
void HLS_initialize(void);


/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief： HLS 処理
 * 
 * @note： main() から呼ばれるメインルーチン
 * 
 * @param  none
 * @retval none
 * 
 */
void HLS_main(void)
{
	unsigned ssr;
	unsigned ccr;
	char s[128];

	ssr = MKY_Read16(OFS_regSSR);
	switch (gHLSState) {
	case st_STOP:
		if( ssr & BIT_regSSR_SCAN )
		{
			print_string("HLS state=<RUN>.\n");
			gHLSState = st_RUN;
		}
		break;
	case st_RUN:
		if (!( ssr & BIT_regSSR_SCAN ) )
		{
			print_string("HLS state=<STOP>.\n");
			gHLSState = st_STOP;
		}
		else
		{
			ccr = MKY_Read16(OFS_regC1CR);
			if ((ccr & 0x00FF) != 0 )
			{
				sprintf(s, "\nHLS Check1 Detected.(%d)\n", ccr);
				print_string(s);
				MKY_Write16(OFS_regC1CR, 0x0001);
			}

			ccr = MKY_Read16(OFS_regC2CR);
			if ((ccr & 0x00FF) != 0 )
			{
				sprintf(s, "\nHLS Check2 Detected.(%d)\n", ccr);
				print_string(s);
				MKY_Write16(OFS_regC2CR, 0x0001);
			}
		}
		break;
	}

}


/**
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * @brief： HLS 初期化
 * 
 * @note： メインループの前に実施する初期化
 * 
 * @param  none
 * @retval none
 * 
 */
void HLS_initialize(void)
{
	unsigned short ssr, bcr, ccr;
	bool	ret, matchCCR;
	int		loop;

	gHLSState = st_STOP;

	// Device Initialize
	ret = MKY_Initialize();
	if (ret == false) {
		// 初期化失敗
		print_string("Device initialize failed.\n");
		return;
	}

	loop = 0;
	do {
		delay_us(100);
		matchCCR = true;
		ccr = MKY_Read16(OFS_regCCR);
		if (ccr != VAL_CCR10)	matchCCR = false;
		ccr = MKY_Read16(OFS_regCCR+2);
		if (ccr != VAL_CCR32)	matchCCR = false;
		ccr = MKY_Read16(OFS_regCCR+4);
		if (ccr != VAL_CCR54)	matchCCR = false;
		loop++;
		if (loop == 10000) {
			// CCR 確認失敗
			print_string("CCR is not correct.\n");
			return;
		}
	} while (matchCCR == false);

	//① MKY36のメモリマップ内のメモリ全域（000H～57FH）を“00H” のライトによって初期化します。
	//前半
	MKY_FillMemory(TOP_CtrlArea, 0, (11*SZ_AREA));

#if defined(MKY_OFS_MEMORY_1) && (MKY_LEN_MEMORY_1 > 0)
	//後半
	MKY_FillMemory(MKY_OFS_MEMORY_1, 0, MKY_LEN_MEMORY_1);
#endif

	// SW5-8 is ON -> Start automatically
	if (readSW5_8() == true)
	{
		// SW5-1 is ON -> auto Start

		ssr = MKY_Read16(OFS_regSSR);
		if( ssr & BIT_regSSR_SCAN )
		{
			//SCANビットが0でない。
			print_string("HLS already Running.\n");
			return;
		}
		
		//②58EHアドレスのBCR（Basic Control Ragister）へ、HLSのスキャン稼働条件の設定値をライトします。
		//(1)ビット0、1（BPS0、BPS1）：転送レートの値を設定します。
		//(2)ビット4（FH）：フルデュプレクス通信方式の時には"1"を、ハーフデュプレクス通信方式の時は"0"を設定します。
		//(3)ビット8～10（LF0～2）：HUBの挿入段数を16進数によって設定します。
		//	なお、HUBを挿入しない場合は、ビット8～10（LF0～2）へ000Hを設定します。
//		bcr = MKY_BCR_BPS_VALUE |		//BPS (12Mbps)
//		      MKY_BCR_FH_VALUE  |		//フルデュプレクス
//		      MKY_BCR_LF_VALUE  ;		//HUBを挿入しない

		bcr = 0;
		if (readSW5_7() == true)
		{
			// フルデュプレクス
			bcr |= BIT_regBCR_FH;
		}
		if (readSW5_6() == true)
		{
			bcr |= BIT_regBCR_BPS1;
		}
		if (readSW5_5() == true)
		{
			bcr |= BIT_regBCR_BPS0;
		}
		MKY_Write16(OFS_regBCR, bcr);

		//連続スキャンを起動します。FS値=63。
		MKY_Write16(OFS_regSCR, MKY_SCR_FS_VALUE);

		// check start
		ssr = MKY_Read16(OFS_regSSR);
		if( ssr & BIT_regSSR_SCAN )
		{
			print_string("HLS state=<RUN>.\n");
			gHLSState = st_RUN;
		}
		else
		{
			print_string("HLS state=<STOP>.\n");
			gHLSState = st_STOP;
		}

		// Clear Check Counter
		MKY_Write16(OFS_regC1CR, 0x0001);
		MKY_Write16(OFS_regC2CR, 0x0001);
	}

}
