/* This file is part of Clementine.
   Copyright 2010, David Sansome <me@davidsansome.com>

   Clementine is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   Clementine is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with Clementine.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef WIIMOTEDEV_CONSTS_H
#define WIIMOTEDEV_CONSTS_H

#define WIIMOTEDEV_CONFIG_FILE "/etc/wiimotedev/wiimotedev.conf"
#define WIIMOTEDEV_TCP_PORT 50091

#define WIIMOTEDEV_DBUS_SERVICE_NAME "org.wiimotedev.daemon"

#define WIIMOTEDEV_DBUS_IFACE_EVENTS "org.wiimotedev.deviceEvents"
#define WIIMOTEDEV_DBUS_IFACE_SERVICE "org.wiimotedev.service"
#define WIIMOTEDEV_DBUS_OBJECT_EVENTS "/deviceEvents"
#define WIIMOTEDEV_DBUS_OBJECT_SERVICE "/service"

/* Compatibility ------------------------------------------------- */

#define WIIMOTEDEV_DBUS_SERVICE_IFACE "org.wiimotedev.service"
#define WIIMOTEDEV_DBUS_EVENTS_IFACE "org.wiimotedev.deviceEvents"
#define WIIMOTEDEV_DBUS_SERVICE_OBJECT "/service"
#define WIIMOTEDEV_DBUS_EVENTS_OBJECT "/deviceEvents"

/* Typedefs ------------------------------------------------------ */

typedef unsigned long long uint64;
typedef unsigned int uint32;
typedef unsigned short uint16;
typedef unsigned char uint8;

typedef signed long long int64;
typedef signed int int32;
typedef signed short int16;
typedef signed char int8;

/* Wiiremote status  --------------------------------------------- */

const uint8 STATUS_WIIMOTE_DISCONNECTED = 0x00;
const uint8 STATUS_WIIMOTE_CONNECTED = 0x01;
const uint8 STATUS_WIIMOTE_NUNCHUK_CONNECTED = 0x02;
const uint8 STATUS_WIIMOTE_CLASSIC_CONNECTED = 0x04;

#define STATUS_NUNCHUK_CONNECTED STATUS_WIIMOTE_NUNCHUK_CONNECTED
#define STATUS_CLASSIC_CONNECTED STATUS_WIIMOTE_CLASSIC_CONNECTED

/* Structs  --------------------------------------------- */

struct irpoint {
  int16 size;
  uint16 x;
  uint16 y;
};

struct accdata {
  uint8 x;
  uint8 y;
  uint8 z;
  double pitch;
  double roll;
};

struct stickdata {
  uint8 x;
  uint8 y;
};

enum GENERAL_BUTTONS {
  // 1.0 API
  GENERAL_WIIMOTE_BTN_1 = 0,
  GENERAL_WIIMOTE_BTN_2,
  GENERAL_WIIMOTE_BTN_A,
  GENERAL_WIIMOTE_BTN_B,
  GENERAL_WIIMOTE_BTN_MINUS,
  GENERAL_WIIMOTE_BTN_PLUS,
  GENERAL_WIIMOTE_BTN_HOME,
  GENERAL_WIIMOTE_BTN_RIGHT,
  GENERAL_WIIMOTE_BTN_LEFT,
  GENERAL_WIIMOTE_BTN_DOWN,
  GENERAL_WIIMOTE_BTN_UP,
  GENERAL_WIIMOTE_BTN_SHIFT_BACKWARD,
  GENERAL_WIIMOTE_BTN_SHIFT_FORWARD,
  GENERAL_WIIMOTE_BTN_SHIFT_RIGHT,
  GENERAL_WIIMOTE_BTN_SHIFT_LEFT,
  GENERAL_WIIMOTE_BTN_SHIFT_DOWN,
  GENERAL_WIIMOTE_BTN_SHIFT_UP,
  GENERAL_WIIMOTE_BTN_TILT_FRONT,
  GENERAL_WIIMOTE_BTN_TILT_BACK,
  GENERAL_WIIMOTE_BTN_TILT_RIGHT,
  GENERAL_WIIMOTE_BTN_TILT_LEFT,
  GENERAL_NUNCHUK_BTN_C,
  GENERAL_NUNCHUK_BTN_Z,
  GENERAL_NUNCHUK_BTN_STICK_RIGHT,
  GENERAL_NUNCHUK_BTN_STICK_LEFT,
  GENERAL_NUNCHUK_BTN_STICK_DOWN,
  GENERAL_NUNCHUK_BTN_STICK_UP,
  GENERAL_NUNCHUK_BTN_SHIFT_BACKWARD,
  GENERAL_NUNCHUK_BTN_SHIFT_FORWARD,
  GENERAL_NUNCHUK_BTN_SHIFT_RIGHT,
  GENERAL_NUNCHUK_BTN_SHIFT_LEFT,
  GENERAL_NUNCHUK_BTN_SHIFT_DOWN,
  GENERAL_NUNCHUK_BTN_SHIFT_UP,
  GENERAL_NUNCHUK_BTN_TILT_FRONT,
  GENERAL_NUNCHUK_BTN_TILT_BACK,
  GENERAL_NUNCHUK_BTN_TILT_RIGHT,
  GENERAL_NUNCHUK_BTN_TILT_LEFT,
  GENERAL_CLASSIC_BTN_X,
  GENERAL_CLASSIC_BTN_Y,
  GENERAL_CLASSIC_BTN_A,
  GENERAL_CLASSIC_BTN_B,
  GENERAL_CLASSIC_BTN_L,
  GENERAL_CLASSIC_BTN_R,
  GENERAL_CLASSIC_BTN_ZL,
  GENERAL_CLASSIC_BTN_ZR,
  GENERAL_CLASSIC_BTN_MINUS,
  GENERAL_CLASSIC_BTN_PLUS,
  GENERAL_CLASSIC_BTN_HOME,
  GENERAL_CLASSIC_BTN_RIGHT,
  GENERAL_CLASSIC_BTN_LEFT,
  GENERAL_CLASSIC_BTN_DOWN,
  GENERAL_CLASSIC_BTN_UP,
  GENERAL_CLASSIC_BTN_LSTICK_RIGHT,
  GENERAL_CLASSIC_BTN_LSTICK_LEFT,
  GENERAL_CLASSIC_BTN_LSTICK_DOWN,
  GENERAL_CLASSIC_BTN_LSTICK_UP,
  GENERAL_CLASSIC_BTN_RSTICK_RIGHT,
  GENERAL_CLASSIC_BTN_RSTICK_LEFT,
  GENERAL_CLASSIC_BTN_RSTICK_DOWN,
  GENERAL_CLASSIC_BTN_RSTICK_UP,
  // 1.2 API
  GENERAL_WIIMOTE_BTN_SHIFT_SHAKE,
  GENERAL_NUNCHUK_BTN_SHIFT_SHAKE
};

#define calcbit(x) (static_cast<uint64>(true) << x)

const uint64 WIIMOTE_BTN_1 = calcbit(GENERAL_WIIMOTE_BTN_1);
const uint64 WIIMOTE_BTN_2 = calcbit(GENERAL_WIIMOTE_BTN_2);
const uint64 WIIMOTE_BTN_A = calcbit(GENERAL_WIIMOTE_BTN_A);
const uint64 WIIMOTE_BTN_B = calcbit(GENERAL_WIIMOTE_BTN_B);

const uint64 WIIMOTE_BTN_MINUS = calcbit(GENERAL_WIIMOTE_BTN_MINUS);
const uint64 WIIMOTE_BTN_PLUS = calcbit(GENERAL_WIIMOTE_BTN_PLUS);
const uint64 WIIMOTE_BTN_HOME = calcbit(GENERAL_WIIMOTE_BTN_HOME);

const uint64 WIIMOTE_BTN_RIGHT = calcbit(GENERAL_WIIMOTE_BTN_RIGHT);
const uint64 WIIMOTE_BTN_LEFT = calcbit(GENERAL_WIIMOTE_BTN_LEFT);
const uint64 WIIMOTE_BTN_DOWN = calcbit(GENERAL_WIIMOTE_BTN_DOWN);
const uint64 WIIMOTE_BTN_UP = calcbit(GENERAL_WIIMOTE_BTN_UP);

const uint64 WIIMOTE_BTN_SHIFT_BACKWARD =
    calcbit(GENERAL_WIIMOTE_BTN_SHIFT_BACKWARD);
const uint64 WIIMOTE_BTN_SHIFT_FORWARD =
    calcbit(GENERAL_WIIMOTE_BTN_SHIFT_FORWARD);
const uint64 WIIMOTE_BTN_SHIFT_RIGHT = calcbit(GENERAL_WIIMOTE_BTN_SHIFT_RIGHT);
const uint64 WIIMOTE_BTN_SHIFT_LEFT = calcbit(GENERAL_WIIMOTE_BTN_SHIFT_LEFT);
const uint64 WIIMOTE_BTN_SHIFT_DOWN = calcbit(GENERAL_WIIMOTE_BTN_SHIFT_DOWN);
const uint64 WIIMOTE_BTN_SHIFT_UP = calcbit(GENERAL_WIIMOTE_BTN_SHIFT_UP);

const uint64 WIIMOTE_BTN_TILT_FRONT = calcbit(GENERAL_WIIMOTE_BTN_TILT_FRONT);
const uint64 WIIMOTE_BTN_TILT_BACK = calcbit(GENERAL_WIIMOTE_BTN_TILT_BACK);
const uint64 WIIMOTE_BTN_TILT_RIGHT = calcbit(GENERAL_WIIMOTE_BTN_TILT_RIGHT);
const uint64 WIIMOTE_BTN_TILT_LEFT = calcbit(GENERAL_WIIMOTE_BTN_TILT_LEFT);

const uint64 NUNCHUK_BTN_C = calcbit(GENERAL_NUNCHUK_BTN_C);
const uint64 NUNCHUK_BTN_Z = calcbit(GENERAL_NUNCHUK_BTN_Z);

const uint64 NUNCHUK_BTN_STICK_RIGHT = calcbit(GENERAL_NUNCHUK_BTN_STICK_RIGHT);
const uint64 NUNCHUK_BTN_STICK_LEFT = calcbit(GENERAL_NUNCHUK_BTN_STICK_LEFT);
const uint64 NUNCHUK_BTN_STICK_DOWN = calcbit(GENERAL_NUNCHUK_BTN_STICK_DOWN);
const uint64 NUNCHUK_BTN_STICK_UP = calcbit(GENERAL_NUNCHUK_BTN_STICK_UP);

const uint64 NUNCHUK_BTN_SHIFT_BACKWARD =
    calcbit(GENERAL_NUNCHUK_BTN_SHIFT_BACKWARD);
const uint64 NUNCHUK_BTN_SHIFT_FORWARD =
    calcbit(GENERAL_NUNCHUK_BTN_SHIFT_FORWARD);
const uint64 NUNCHUK_BTN_SHIFT_RIGHT = calcbit(GENERAL_NUNCHUK_BTN_SHIFT_RIGHT);
const uint64 NUNCHUK_BTN_SHIFT_LEFT = calcbit(GENERAL_NUNCHUK_BTN_SHIFT_LEFT);
const uint64 NUNCHUK_BTN_SHIFT_DOWN = calcbit(GENERAL_NUNCHUK_BTN_SHIFT_DOWN);
const uint64 NUNCHUK_BTN_SHIFT_UP = calcbit(GENERAL_NUNCHUK_BTN_SHIFT_UP);

const uint64 NUNCHUK_BTN_TILT_FRONT = calcbit(GENERAL_NUNCHUK_BTN_TILT_FRONT);
const uint64 NUNCHUK_BTN_TILT_BACK = calcbit(GENERAL_NUNCHUK_BTN_TILT_BACK);
const uint64 NUNCHUK_BTN_TILT_RIGHT = calcbit(GENERAL_NUNCHUK_BTN_TILT_RIGHT);
const uint64 NUNCHUK_BTN_TILT_LEFT = calcbit(GENERAL_NUNCHUK_BTN_TILT_LEFT);

const uint64 CLASSIC_BTN_X = calcbit(GENERAL_CLASSIC_BTN_X);
const uint64 CLASSIC_BTN_Y = calcbit(GENERAL_CLASSIC_BTN_Y);
const uint64 CLASSIC_BTN_A = calcbit(GENERAL_CLASSIC_BTN_A);
const uint64 CLASSIC_BTN_B = calcbit(GENERAL_CLASSIC_BTN_B);
const uint64 CLASSIC_BTN_L = calcbit(GENERAL_CLASSIC_BTN_L);
const uint64 CLASSIC_BTN_R = calcbit(GENERAL_CLASSIC_BTN_R);
const uint64 CLASSIC_BTN_ZL = calcbit(GENERAL_CLASSIC_BTN_ZL);
const uint64 CLASSIC_BTN_ZR = calcbit(GENERAL_CLASSIC_BTN_ZR);
const uint64 CLASSIC_BTN_MINUS = calcbit(GENERAL_CLASSIC_BTN_MINUS);
const uint64 CLASSIC_BTN_PLUS = calcbit(GENERAL_CLASSIC_BTN_PLUS);
const uint64 CLASSIC_BTN_HOME = calcbit(GENERAL_CLASSIC_BTN_HOME);
const uint64 CLASSIC_BTN_RIGHT = calcbit(GENERAL_CLASSIC_BTN_RIGHT);
const uint64 CLASSIC_BTN_LEFT = calcbit(GENERAL_CLASSIC_BTN_LEFT);
const uint64 CLASSIC_BTN_DOWN = calcbit(GENERAL_CLASSIC_BTN_DOWN);
const uint64 CLASSIC_BTN_UP = calcbit(GENERAL_CLASSIC_BTN_UP);

const uint64 CLASSIC_BTN_LSTICK_RIGHT =
    calcbit(GENERAL_CLASSIC_BTN_LSTICK_RIGHT);
const uint64 CLASSIC_BTN_LSTICK_LEFT = calcbit(GENERAL_CLASSIC_BTN_LSTICK_LEFT);
const uint64 CLASSIC_BTN_LSTICK_DOWN = calcbit(GENERAL_CLASSIC_BTN_LSTICK_DOWN);
const uint64 CLASSIC_BTN_LSTICK_UP = calcbit(GENERAL_CLASSIC_BTN_LSTICK_UP);

const uint64 CLASSIC_BTN_RSTICK_RIGHT =
    calcbit(GENERAL_CLASSIC_BTN_RSTICK_RIGHT);
const uint64 CLASSIC_BTN_RSTICK_LEFT = calcbit(GENERAL_CLASSIC_BTN_RSTICK_LEFT);

const uint64 CLASSIC_BTN_RSTICK_DOWN = calcbit(GENERAL_CLASSIC_BTN_RSTICK_DOWN);
const uint64 CLASSIC_BTN_RSTICK_UP = calcbit(GENERAL_CLASSIC_BTN_RSTICK_UP);

const uint64 WIIMOTE_BTN_SHIFT_SHAKE = calcbit(GENERAL_WIIMOTE_BTN_SHIFT_SHAKE);
const uint64 NUNCHUK_BTN_SHIFT_SHAKE = calcbit(GENERAL_NUNCHUK_BTN_SHIFT_SHAKE);

const uint64 WIIMOTE_BUTTON_MASK =
    WIIMOTE_BTN_1 | WIIMOTE_BTN_2 | WIIMOTE_BTN_A | WIIMOTE_BTN_B |
    WIIMOTE_BTN_MINUS | WIIMOTE_BTN_PLUS | WIIMOTE_BTN_HOME |
    WIIMOTE_BTN_RIGHT | WIIMOTE_BTN_LEFT | WIIMOTE_BTN_DOWN | WIIMOTE_BTN_UP;

const uint64 WIIMOTE_SHIFT_MASK =
    WIIMOTE_BTN_SHIFT_BACKWARD | WIIMOTE_BTN_SHIFT_FORWARD |
    WIIMOTE_BTN_SHIFT_RIGHT | WIIMOTE_BTN_SHIFT_LEFT | WIIMOTE_BTN_SHIFT_DOWN |
    WIIMOTE_BTN_SHIFT_UP | WIIMOTE_BTN_SHIFT_SHAKE;

const uint64 WIIMOTE_TILT_MASK = WIIMOTE_BTN_TILT_FRONT |
                                 WIIMOTE_BTN_TILT_BACK |
                                 WIIMOTE_BTN_TILT_RIGHT | WIIMOTE_BTN_TILT_LEFT;

const uint64 NUNCHUK_BUTTON_MASK = NUNCHUK_BTN_C | NUNCHUK_BTN_Z;

const uint64 NUNCHUK_STICK_MASK = NUNCHUK_BTN_STICK_RIGHT |
                                  NUNCHUK_BTN_STICK_LEFT |
                                  NUNCHUK_BTN_STICK_DOWN | NUNCHUK_BTN_STICK_UP;

const uint64 NUNCHUK_SHIFT_MASK =
    NUNCHUK_BTN_SHIFT_BACKWARD | NUNCHUK_BTN_SHIFT_FORWARD |
    NUNCHUK_BTN_SHIFT_RIGHT | NUNCHUK_BTN_SHIFT_LEFT | NUNCHUK_BTN_SHIFT_DOWN |
    NUNCHUK_BTN_SHIFT_UP | NUNCHUK_BTN_SHIFT_SHAKE;

const uint64 NUNCHUK_TILT_MASK = NUNCHUK_BTN_TILT_FRONT |
                                 NUNCHUK_BTN_TILT_BACK |
                                 NUNCHUK_BTN_TILT_RIGHT | NUNCHUK_BTN_TILT_LEFT;

const uint64 CLASSIC_BUTTON_MASK =
    CLASSIC_BTN_X | CLASSIC_BTN_Y | CLASSIC_BTN_A | CLASSIC_BTN_B |
    CLASSIC_BTN_L | CLASSIC_BTN_R | CLASSIC_BTN_ZL | CLASSIC_BTN_ZR |
    CLASSIC_BTN_MINUS | CLASSIC_BTN_PLUS | CLASSIC_BTN_HOME |
    CLASSIC_BTN_RIGHT | CLASSIC_BTN_LEFT | CLASSIC_BTN_DOWN | CLASSIC_BTN_UP;

const uint64 CLASSIC_LSTICK_MASK =
    CLASSIC_BTN_LSTICK_RIGHT | CLASSIC_BTN_LSTICK_LEFT |
    CLASSIC_BTN_LSTICK_DOWN | CLASSIC_BTN_LSTICK_UP;

const uint64 CLASSIC_RSTICK_MASK =
    CLASSIC_BTN_RSTICK_RIGHT | CLASSIC_BTN_RSTICK_LEFT |
    CLASSIC_BTN_RSTICK_DOWN | CLASSIC_BTN_RSTICK_UP;

const uint64 WIIMOTE_BUTTON_NOTMASK = ~WIIMOTE_BUTTON_MASK;
const uint64 WIIMOTE_SHIFT_NOTMASK = ~WIIMOTE_SHIFT_MASK;
const uint64 WIIMOTE_TILT_NOTMASK = ~WIIMOTE_TILT_MASK;
const uint64 NUNCHUK_BUTTON_NOTMASK = ~NUNCHUK_BUTTON_MASK;
const uint64 NUNCHUK_STICK_NOTMASK = ~NUNCHUK_STICK_MASK;
const uint64 NUNCHUK_SHIFT_NOTMASK = ~NUNCHUK_SHIFT_MASK;
const uint64 NUNCHUK_TILT_NOTMASK = ~NUNCHUK_TILT_MASK;
const uint64 CLASSIC_BUTTON_NOTMASK = ~CLASSIC_BUTTON_MASK;
const uint64 CLASSIC_LSTICK_NOTMASK = ~CLASSIC_LSTICK_MASK;
const uint64 CLASSIC_RSTICK_NOTMASK = ~CLASSIC_RSTICK_MASK;

#endif  // WIIMOTEDEV_CONSTS_H
