#pragma comment(lib, "winmm.lib")  

#include <stdio.h>
#include <windows.h>
#include <tchar.h>

#define SPEED 100
#define TURN_SPEED 100 

#define COM_NUM_RF "\\\\.\\COM12"  //Arduinoを繋いでるCOMポート12番
#define COM_NUM_RR "\\\\.\\COM11"  //Arduinoを繋いでるCOMポート11番
#define COM_NUM_LF "\\\\.\\COM8"   //Arduinoを繋いでるCOMポート8番
#define COM_NUM_LR "\\\\.\\COM9"   //Arduinoを繋いでるCOMポート9番

void setupSerial() {
//各ポートの状態を取得
	//右前
	HANDLE hPort8 = CreateFileA(
		COM_NUM_RF,          /* シリアルポートの指定 */
		GENERIC_READ | GENERIC_WRITE, /* アクセスモード */
		0,                            /* 共有モード */
		NULL,                         /* セキュリティ属性 */
		OPEN_EXISTING,                /* 作成フラグ */
		FILE_ATTRIBUTE_NORMAL,        /* 属性 */
		NULL                          /* テンプレートのハンドル */
	);

	//右後
	HANDLE hPort9 = CreateFileA(
		COM_NUM_RR,          /* シリアルポートの指定 */
		GENERIC_READ | GENERIC_WRITE, /* アクセスモード */
		0,                            /* 共有モード */
		NULL,                         /* セキュリティ属性 */
		OPEN_EXISTING,                /* 作成フラグ */
		FILE_ATTRIBUTE_NORMAL,        /* 属性 */
		NULL                          /* テンプレートのハンドル */
	);

	//左前
	HANDLE hPort11 = CreateFileA(
		COM_NUM_LF,          /* シリアルポートの指定 */
		GENERIC_READ | GENERIC_WRITE, /* アクセスモード */
		0,                            /* 共有モード */
		NULL,                         /* セキュリティ属性 */
		OPEN_EXISTING,                /* 作成フラグ */
		FILE_ATTRIBUTE_NORMAL,        /* 属性 */
		NULL                          /* テンプレートのハンドル */
	);

	//左後
	HANDLE hPort12 = CreateFileA(
		COM_NUM_LR,          /* シリアルポートの指定 */
		GENERIC_READ | GENERIC_WRITE, /* アクセスモード */
		0,                            /* 共有モード */
		NULL,                         /* セキュリティ属性 */
		OPEN_EXISTING,                /* 作成フラグ */
		FILE_ATTRIBUTE_NORMAL,        /* 属性 */
		NULL                          /* テンプレートのハンドル */
	);

	if (hPort8 == INVALID_HANDLE_VALUE || hPort9 == INVALID_HANDLE_VALUE || hPort11 == INVALID_HANDLE_VALUE || hPort12 == INVALID_HANDLE_VALUE)
	{
		printf("port open error\n");
		exit(0);
	}

	DCB dcb; // シリアルポートの構成情報が入る構造体

	GetCommState(hPort8, &dcb); // 現在の設定値を読み込み
	GetCommState(hPort9, &dcb); // 現在の設定値を読み込み
	GetCommState(hPort11, &dcb); // 現在の設定値を読み込み
	GetCommState(hPort12, &dcb); // 現在の設定値を読み込み

	dcb.BaudRate = 115200; // 速度
	dcb.ByteSize = 8; // データ長
	dcb.Parity = NOPARITY; // パリティ
	dcb.StopBits = ONESTOPBIT; // ストップビット長
	dcb.fOutxCtsFlow = FALSE; // 送信時CTSフロー
	dcb.fRtsControl = RTS_CONTROL_ENABLE; // RTSフロー

	SetCommState(hPort8, &dcb); // 変更した設定値を書き込み
	SetCommState(hPort9, &dcb); // 変更した設定値を書き込み
	SetCommState(hPort11, &dcb); // 変更した設定値を書き込み
	SetCommState(hPort12, &dcb); // 変更した設定値を書き込み

	Sleep(5000); // 受信バッファにメッセージが溜まるまで待つ

	DWORD errors; // エラーが起きた場合、エラーコードが入る
	COMSTAT comStat; // 通信状態バッファ構造体

	ClearCommError(hPort8, &errors, &comStat); // 入出力バッファの情報を通信状態バッファへ取り込む
	ClearCommError(hPort9, &errors, &comStat); // 入出力バッファの情報を通信状態バッファへ取り込む
	ClearCommError(hPort11, &errors, &comStat); // 入出力バッファの情報を通信状態バッファへ取り込む
	ClearCommError(hPort12, &errors, &comStat); // 入出力バッファの情報を通信状態バッファへ取り込む

	int lengthOfRecieved = comStat.cbInQue; // 通信状態バッファ内の受信したメッセージ長を取得する

	return 0;
}
	

void go_advance(int speed) {  //前進

}

void go_back(int speed) {     //後退

}

void stop(int speed) {  //前進

}








int main() {

	//ジョイスティック操作
	JOYINFOEX JoyInfoEx;
	JoyInfoEx.dwSize = sizeof(JOYINFOEX);
	JoyInfoEx.dwFlags = JOY_RETURNALL;

	for (unsigned int i = 0; i < joyGetNumDevs(); i++) {              //サポートされているジョイスティックの数を返す
		if (JOYERR_NOERROR == joyGetPosEx(i, &JoyInfoEx))         //もし
			printf("ジョイスティック No.%d　接続されています\n", i);
	}
	Sleep(1000);

	while (1) {
		if (JOYERR_NOERROR == joyGetPosEx(0, &JoyInfoEx)) {           //0番のジョイスティックの情報を見る
			if (JoyInfoEx.dwYpos == 0x0) {  //前進運動
				go_advance(SPEED);

			}
			else if (JoyInfoEx.dwYpos == 0xffff) {  //後退運動
				go_back(SPEED);

			}
			else if (JoyInfoEx.dwXpos == 0x0) {   //左平行運動
				
			}
			else if (JoyInfoEx.dwXpos == 0xffff) {   //右平行運動
				
			}
			else {
				
			}

			printf("dwXpos = 0x%x\t"
				"dwYpos = 0x%x\t"
				"dwButtons = 0x%x\n",
				JoyInfoEx.dwXpos,
				JoyInfoEx.dwYpos,
				JoyInfoEx.dwButtons);
		}
		else {
			printf("エラー\n");  //コントローラーが接続されていなければエラー表示
		}
		Sleep(100);
	}
	return 0;
}