/* $Id: wiimote.h 53 2007-03-10 14:46:36Z bja $ * * Copyright (C) 2007, Joel Andersson <bja@kth.se> * * This program 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 2 of the License, or * (at your option) any later version. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _WIIMOTE_H #define _WIIMOTE_H #include <stdint.h> /* Status and error codes. */ #define WIIMOTE_OK 0 #define WIIMOTE_ERROR -1 #define WIIMOTE_NONE NULL #define WIIMOTE_ENABLE 1 #define WIIMOTE_DISABLE 0 #define WIIMOTE_INIT {{{ 0 }}} /* * These are the modes supported by the wiimote. */ enum { WIIMOTE_MODE_DEFAULT=0x30, /* 0x30 */ WIIMOTE_MODE_ACC, /* 0x31 */ WIIMOTE_MODE_IR, /* 0x32 */ WIIMOTE_MODE_ACC_IR, /* 0x33 */ WIIMOTE_MODE_EXT, /* 0x34 */ WIIMOTE_MODE_ACC_EXT, /* 0x35 */ WIIMOTE_MODE_IR_EXT, /* 0x36 */ WIIMOTE_MODE_ACC_IR_EXT, /* 0x37 */ WIIMOTE_MODE_FULL1, /* 0x3e */ WIIMOTE_MODE_FULL2, /* 0x3f */ }; /* * Wiimote link status. */ enum { WIIMOTE_STATUS_UNDEFINED=-1, WIIMOTE_STATUS_DISCONNECTED=0, WIIMOTE_STATUS_CONNECTED=1 }; /* * Wiimote mode structure. */ typedef union { struct { uint8_t acc : 1; /* Accelerometer enable bit. */ uint8_t ir : 1; /* IR camera enable bit. */ uint8_t ext : 1; /* Extension port enable bit. */ uint8_t foo : 1; uint8_t unused : 4; } __attribute__((packed)); uint8_t bits; } __attribute__((packed)) wiimote_mode_t; /* * Wiimote key states. */ typedef union { struct { uint16_t left : 1; uint16_t right : 1; uint16_t down : 1; uint16_t up : 1; uint16_t plus : 1; uint16_t reserved1: 3; uint16_t two : 1; uint16_t one : 1; uint16_t b : 1; uint16_t a : 1; uint16_t minus: 1; uint16_t reserved2 : 2; uint16_t home : 1; } __attribute__((packed)); uint16_t bits; } __attribute__((packed)) wiimote_keys_t; /* * Wiimote led structure. */ typedef union { struct { uint8_t one : 1; uint8_t two : 1; uint8_t three : 1; uint8_t four : 1; uint8_t rumble : 4; } __attribute__((packed)); uint8_t bits; } __attribute__((packed)) wiimote_led_t; /* * A point in 3-space. */ typedef struct { uint8_t x; uint8_t y; uint8_t z; } __attribute__((packed)) wiimote_point3_t; typedef struct { float x; float y; float z; } wiimote_float3_t; /* * A point returned from the IR camera. */ typedef struct { uint8_t x; /* Position of point on x-axis.*/ uint8_t y; /* Position of point on y-axis. */ uint8_t ss : 4; /* Size of point. */ uint8_t xx : 2; /* Most significant bits of x. */ uint8_t yy : 2; /* Most significant bits of y. */ } __attribute__((packed)) wiimote_point2_t; typedef struct { uint32_t x : 12; /* Position of point on x-axis.*/ uint32_t y : 12; /* Position of point on y-axis. */ uint32_t size : 4; /* Size of point. */ } __attribute__((packed)) wiimote_ir_t; /* * Wiimote link structure. */ typedef struct { char r_addr[19]; /* Bluetooth address of the wiimote. */ char l_addr[19]; /* Bluetooth address of the local host. */ int status; /* Current connection status. */ int device; /* Bluetooth device number (1-HCI_MAX_DEV). */ int s_intr; /* HID interrupt socket. */ int s_ctrl; /* HID control socket. */ } wiimote_link_t; typedef struct { uint8_t x_zero; uint8_t y_zero; uint8_t z_zero; uint8_t reserved1; uint8_t x_scale; uint8_t y_scale; uint8_t z_scale; uint8_t reserved2; uint8_t joyx_max; uint8_t joyx_min; uint8_t joyx_center; uint8_t joyy_max; uint8_t joyy_min; uint8_t joyy_center; uint8_t reserved3; uint8_t reserved4; } __attribute__((packed)) nunchuk_cal_t; typedef struct { uint8_t joyx; uint8_t joyy; wiimote_point3_t axis; union { struct { uint8_t z : 1; uint8_t c : 1; uint8_t reserved : 6; } __attribute__((packed)); uint8_t bits; } __attribute__((packed)) keys; nunchuk_cal_t cal; } __attribute__((packed)) nunchuk_t; typedef uint8_t wiimote_classic_cal_t[16]; /* * Note: This structure does not map directly to the data * returned from the wiimote. */ typedef struct { uint8_t joyx1; uint8_t joyy1; uint8_t joyx2; uint8_t joyy2; uint8_t l; uint8_t r; union { struct { uint16_t left : 1; uint16_t right : 1; uint16_t up : 1; uint16_t down : 1; uint16_t l : 1; uint16_t r : 1; uint16_t zl : 1; uint16_t zr : 1; uint16_t minus : 1; uint16_t plus : 1; uint16_t home : 1; uint16_t y : 1; uint16_t x : 1; uint16_t a : 1; uint16_t b : 1; uint16_t unused: 1; } __attribute__((packed)); uint16_t bits; } __attribute__((packed)) keys; wiimote_classic_cal_t cal; } __attribute__((packed)) wiimote_classic_t; typedef struct { uint16_t id; union { nunchuk_t nunchuk; wiimote_classic_t classic; }; } wiimote_ext_port_t; typedef struct { uint8_t x_zero; uint8_t y_zero; uint8_t z_zero; uint8_t reserved; uint8_t x_scale; uint8_t y_scale; uint8_t z_scale; } __attribute__((packed)) wiimote_cal_t; /* * The wiimote data structure. This structure is designed to be * read directly from a hid report. The first part maps directly * to a 0x30-0x33 mode report. The order of the entries in the * second part is not important. */ typedef struct { wiimote_mode_t mode; /* Current report mode of wiimote. */ wiimote_keys_t keys; /* Current key state. */ wiimote_point3_t axis; /* Current accelerometer data. */ wiimote_ir_t ir1; /* First detected IR source. */ wiimote_ir_t ir2; /* Second detecterd IR source. */ wiimote_ir_t ir3; /* Third detected IR source. */ wiimote_ir_t ir4; /* Fourth detected IR source. */ wiimote_cal_t cal; /* Wiimote calibration data */ wiimote_ext_port_t ext; /* Current extension port state. */ wiimote_link_t link; /* Current link state. */ wiimote_led_t led; /* Current state of the leds. */ uint8_t rumble; /* Current state of rumble. */ uint8_t speaker; /* ... */ uint8_t battery; /* Current battery status. */ #ifdef _ENABLE_TILT wiimote_float3_t tilt; /* The tilt of the wiimote in degrees. */ #endif #ifdef _ENABLE_FORCE wiimote_float3_t force; /* The force in g on each axis. */ #endif struct { wiimote_mode_t mode; wiimote_keys_t keys; wiimote_led_t led; uint8_t rumble; } old; } __attribute__((packed)) wiimote_t; #endif /* _WIIMOTE_H */