/* System	: 二足歩行ロボット(walk)
* File		: led.c
* function	: LED表示制御
* 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 "led.h"

#define LIGHT_ON 0U							/* LED 点灯 */
#define LIGHT_OFF 1U							/* LED 消灯 */

#define BLINK_TIME 6							/* 0.12秒 = 20ms × 13 */
#define PULSE_ON_TIME 5							/* 0.1秒 = 20ms × 5  */
#define PULSE_OFF_TIME 70/* 1.4秒 = 20ms × 70*/

enum LED_OUTPUT led_out = LED_OFF;					/* LED表示指示 */

/* LED表示制御初期化処理ユニット (SE13) */
void led_initialize(void){
	P1_bit.no4 = LIGHT_OFF;						/* ポート14の出力をLED消灯High(1)に設定 */
	PMC1_bit.no4 = 0U;						/* ポート14をデジタル入出力に設定 */
	PM1_bit.no4 = 0U;						/* ポート14を出力に設定 */
}

/* LED表示制御処理ユニット (LED14) */
void led(void){
	static unsigned int blink_counter = 0;
	static unsigned int off_counter = 0;
	switch(led_out){
		case LED_OFF:						/* LED消灯 */
			P1_bit.no4 = LIGHT_OFF;				/* ポート14の出力をLow(0)に設定 */
			blink_counter = 0;				/* 点滅開始時反転させるため */
			break;
		case LED_ON:						/* LED点灯 */
			P1_bit.no4 = LIGHT_ON;				/* ポート14の出力をLow(0)に設定 */
			blink_counter = 0;				/* 点滅開始時反転させるため */
			break;
		case LED_BLINK:						/* LED点滅 */
			/* 0.5秒毎にLEDの点灯・消灯を切替える */
			if(blink_counter > 0){				/* カウンタが0より大きければ */
				blink_counter = blink_counter - 1;	/* カウンタをカウントダウン */
			}else{						/* カウンタが0になったら */
				P1_bit.no4 = ~P1_bit.no4;		/* LED出力を反転（消灯⇔点灯） */
				blink_counter = BLINK_TIME;		/* カウンタを0.5秒に設定 */
			}
			break;
		case LED_PULSE:						/* LEDパルス点灯 */
			if(blink_counter > 0){				/* 点灯(0.1s) */
				blink_counter = blink_counter - 1;
				P1_bit.no4 = LIGHT_ON;
			}else if(off_counter > 0){			/* LED消灯 */
				off_counter = off_counter -1;		/* 消灯(1.4s) */
				P1_bit.no4 = LIGHT_OFF;
			}else{
				blink_counter = PULSE_ON_TIME;		/* パルス点灯時間設定 */
				off_counter = PULSE_OFF_TIME;		/* 消灯時間設定 */
			}
			break;
	}
}
