/* wiiuseを使ったプログラムの簡単な例 */
#include <stdio.h>
#include <stdlib.h>
#include "wiiuse.h"

/* Wiiリモコンを接続する最大数 */
#define MAX_WIIMOTES (4)

/**
 *  Wiiリモコンのイベント処理関数
 *
 */
void handle_event (struct wiimote_t* wm)
{
    printf ("\n\n--- EVENT [id %i] ---\n", wm->unid);

    /* ボタンが押されたときにメッセージを表示 */
    if (IS_PRESSED (wm, WIIMOTE_BUTTON_A))
        printf ("A pressed\n");
    if (IS_PRESSED (wm, WIIMOTE_BUTTON_B))
        printf ("B pressed\n");

    /*
     *	Pressing plus will tell the wiimote we are interested in movement.
     */
    if (IS_JUST_PRESSED (wm, WIIMOTE_BUTTON_PLUS))
        wiiuse_motion_sensing (wm, 1);

    /* 加速度センサの表示 */
    if (WIIUSE_USING_ACC (wm)) {
        printf ("ロール = %f [%f]\n", wm->orient.roll, wm->orient.a_roll);
        printf ("ピッチ = %f [%f]\n", wm->orient.pitch, wm->orient.a_pitch);
        printf ("　ヨー = %f\n", wm->orient.yaw);
    }
    /* 赤外LEDの位置の表示 */
    if (WIIUSE_USING_IR (wm)) {
        int i;
        /* go through each of the 4 possible IR sources */
        for (i=0; i < 4; i++) {
            /* それぞれの赤外LEDが見えてるかチェック */
            if (wm->ir.dot[i].visible)
                printf ("IR source %i: (%u, %u)\n", i, wm->ir.dot[i].x, wm->ir.dot[i].y);
        }
        printf ("IR cursor: (%u, %u)\n", wm->ir.x, wm->ir.y);
        printf ("IR z distance: %f\n", wm->ir.z);
    }
}

/* main関数 */
int main (int argc, char** argv)
{
    /* wiimote構造体を確保するポインタ */
    wiimote** wiimotes;
    int found, connected;

    /* 接続されるwiiリモコンの最大数を指定してwiimote構造体の配列を初期化する。*/
    wiimotes = wiiuse_init (MAX_WIIMOTES);

    /* wiiリモコンの最大数と制限時間(5秒)を指定してwiiリモコンを探して見つかった数を得る。*/
    found = wiiuse_find (wiimotes, MAX_WIIMOTES, 5);
    if (!found) {
        printf ("No wiimotes found.");
        return 0;
    }
    /* wiiリモコンの最大数を指定してwiiリモコンに接続し、接続に成功した数を返す */
    connected = wiiuse_connect (wiimotes, MAX_WIIMOTES);
    if (connected) {
        printf ("Connected to %i wiimotes (of %i found).\n", connected, found);
    }
    else {
        printf ("Failed to connect to any wiimote.\n");
        return 0;
    }
    /* LEDを点灯させる */
    wiiuse_set_leds (wiimotes[0], WIIMOTE_LED_1);
    wiiuse_set_leds (wiimotes[1], WIIMOTE_LED_2);
    wiiuse_set_leds (wiimotes[2], WIIMOTE_LED_3);
    wiiuse_set_leds (wiimotes[3], WIIMOTE_LED_4);

    /* wiiリモコン(0,1)のバイブレータを始動する */
    wiiuse_rumble (wiimotes[0], 1);
    wiiuse_rumble (wiimotes[1], 1);
    /* 0.2秒間待つ */
    Sleep (200);
    /* wiiリモコン(0,1)のバイブレータを停止する */
    wiiuse_rumble (wiimotes[0], 0);
    wiiuse_rumble (wiimotes[1], 0);

    /* Wiiリモコンの赤外センサをONにする */
    wiiuse_set_ir (wiimotes[0], 1);
    wiiuse_set_ir (wiimotes[1], 1);

    /* Wiiリモコンのモーションセンサ（加速度センサ）をONにする */
    wiiuse_motion_sensing (wiimotes[0], 1);
    wiiuse_motion_sensing (wiimotes[1], 1);

    /* wiiリモコン(0)の情報（バッテリ,LED,拡張装置など）を表示する */
    wiiuse_status (wiimotes[0]);

    /* メインループ：wiiuse_poll関数を定期的に呼び出す */
    while (1) {
        /* wiiリモコン情報を更新する。Wiiリモコンの最大数を指定する。 */
        if (wiiuse_poll (wiimotes, MAX_WIIMOTES)) {
            int i;
            /* wiiリモコンごとにイベントを確認する */
            for (i=0; i < MAX_WIIMOTES; i++) {
                switch (wiimotes[i]->event) {
                case WIIUSE_EVENT:
                    /* 通常イベント(ボタンが押された、IRセンサが反応した等) */
                    handle_event (wiimotes[i]);
                    break;
                default:
                    break;
                }
            }
        }
    }
    /* wiiリモコンの解除 */
    wiiuse_cleanup (wiimotes, MAX_WIIMOTES);
    return 0;
}
