/*
	扇風機アプリケーション(ElectricFan.c)
	作成者: T.Yamaura, Y.Ohmori
*/
#include "ElectricFan.h"
#include <stdio.h>

void initialize() {
	//動作管理ステータスを「アイドルモード」に設定する。
	stsManager = IDLE_MODE;

	//運転管理ステータスを「OFF」に設定する。
	opeStsManager = BTN_OFF;

	//運転モードステータスを「弱」に設定する。
	modeStsManager = LOW_MODE;

	//加減速設定値を50に設定する
	accValue = 50;

	//モータ回転数を0に設定する。
	current_speed = 0;
}
void lowMode() {
	//弱速モードでモード変更ボタンONの場合、中速モードへ遷移
	if (modeBtnStatus == BTN_ON) {
		modeStsManager = MID_MODE;
	}

	if (current_speed < LOW_TGT_SPEED) {
		//低速目標回転数に達しない場合は、回転数を上昇する
		current_speed += accValue;
	}
	else if (current_speed > LOW_TGT_SPEED) {
		//低速目標回転数を超えている場合は、回転数を減少する
		current_speed -= accValue;
	}
}
void midMode() {
	//中速モードでモード変更ボタンONの場合、中速モードへ遷移
	if (modeBtnStatus == BTN_ON) {
		modeStsManager = HIGH_MODE;
	}

	if (current_speed < MID_TGT_SPEED) {
		//中速目標回転数に達しない場合は、回転数を上昇する
		current_speed += accValue;
	}
}
void highMode() {
	//高速モードでモード変更ボタンONの場合、弱速モードへ遷移
	if (modeBtnStatus == BTN_ON) {
		modeStsManager = LOW_MODE;
	}
	//高速目標回転数に達しない場合は、回転数を上昇する
	if (current_speed < HIGH_TGT_SPEED) {
		current_speed += accValue;
	}
}
void decMode() {
	if (current_speed <= 0) {
		//0になった場合は、アイドルモードへ遷移する
		stsManager = IDLE_MODE;
	}
	else {
		//回転数が0以下になるまで、減少する
		current_speed -= accValue;
	}

}
int main()
{
	int index = 0;		//項番
	FILE* fp_input;
	FILE* fp_output;

	//初期化処理を実行する
	initialize();

	//ファイルオープン
	fp_input = fopen("input.csv", "r");
	if (fp_input == NULL) {
		printf("ファイルが開けませんでした\n");
		return 0;
	}

	fp_output = fopen("output.csv", "w");
	if (fp_output == NULL) {
		printf("ファイルが開けませんでした\n");
		return 0;
	}
	
	//ヘッダーを表示
	fprintf(fp_output, "項番,運転ON/OFFボタンステータス(0:OFF 1:ON),モード変更ボタン(0:OFF 1:ON),動作管理ステータス(0:アイドルモード 1:運転モード 2:減速モード),運転管理ステータス(0:OFF 1:ON),運転モードステータス(弱:0 中:1 強:2),モータ回転数\n");

	//入力ファイルがEOFとなるまで下記の処理を実行する
	while (1) {
		index++;
		if (fscanf(fp_input, "%d,%d", &opeBtnStatus, &modeBtnStatus) == EOF) {
			break;
		}

		switch (stsManager) {
		case IDLE_MODE:		
			//アイドルモードで運転ON/OFFボタン押下を入力した場合
			if (opeBtnStatus == BTN_ON) {
				stsManager = OPERATION_MODE;	//動作管理ステータスを運転モード
				opeStsManager = BTN_ON;			//運転ステータスをONに設定
			}
			break;
		case OPERATION_MODE:
			//運転モードで運転ON/OFFボタン押下を入力した場合
			if (opeBtnStatus == BTN_OFF) {
				stsManager = DEC_MODE;			//減速モードに遷移する
				opeStsManager = BTN_OFF;		//運転管理ステータスをOFFに設定
				break;
			}
			
			if (modeStsManager == LOW_MODE) {
				//弱速回転の処理を実行
				lowMode();
			}
			else if (modeStsManager == MID_MODE) {
				//中速回転の処理を実行
				midMode();
			}
			else if (modeStsManager == HIGH_MODE) {
				//高速回転の処理を実行
				highMode();
			}
			break;
		case DEC_MODE:
			//減速モードの処理を実行する
			decMode();
			break;
		}

		//出力ファイルにデータを出力する
		fprintf(fp_output, "%d,%d,%d,%d,%d,%d,%d\n", index,opeBtnStatus, modeBtnStatus,stsManager, opeStsManager, modeStsManager,current_speed);
	}
}
