/* System	: 二足歩行ロボット(walk)
* File		: switch.c
* function	: スイッチ入力検知
* Version	: 1.0
* Date		: 2019/5/7
* CPU		: RL78/G12 ROM:16KB RAM:1.5KB fCLK:24MHz
* IDE		: CS+ for CC V6.01.00 [01 Dec 2017]
* Programmer	: Hajime Sugiyama
* Note		: */

/* 特殊機能レジスタ（SFR）へのアクセス記述を使用する(RL78/R5F1026A) */
#include "iodefine.h"
#include "switch.h"
			
struct _F_SWITCH f_switch = {0,0};			/* スイッチ押下確定情報 */

struct _F_SWLEVEL{
	unsigned char now:1;				/* スイッチ入力レベルの確定値 */
	unsigned char before:1;				/* 前回のスイッチ入力レベルの確定値 */
	unsigned char bit2_7:6;				/* padding(詰物)1バイトの空き領域2〜8ビット目を埋める */
};
static struct _F_SWLEVEL f_level = {1,1,0};		/* スイッチ入力レベル確定値をオフに */

/* P12.1 は設定固定のためポート設定初期化は不要 */

/* スイッチ入力検知処理ユニット */
void switch_input(void){
	static unsigned char switch_tmp = 0xFFU;	/* スイッチ入力の一次記憶値 */

	/* チャタリング除去 (SE12) (SE12) */
	switch_tmp = (switch_tmp << 1) + P12_bit.no1;	/* スイッチ状態の履歴保存 (SE10) */
	if((switch_tmp & 0x0FU) == 0x0FU){		/* 最近４回連続スイッチオフ (SE11) */
		f_level.now = 1U;			/* スイッチレベルHigh確定 */
	}else if((switch_tmp & 0x0FU) == 0x00U){	/* 最近４回連続スイッチオン */
		f_level.now = 0U;			/* スイッチレベルLow確定 */
	}

	/* スイッチ押下判定 */
	if(f_level.now != f_level.before){		/* スイッチ確定レベルが変化 */
		f_level.before = f_level.now;		/* 前回スイッチレベルの更新 */
		if(f_level.now == 0U){			/* High から Low に変化 */
			f_switch.start_stop = 1U;	/* スイッチ押下確定 */
		}
	}
}
