340 lines
5.3 KiB
C
340 lines
5.3 KiB
C
|
// Copyright (C) 2003 Dolphin Project.
|
||
|
|
||
|
// 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, version 2.0.
|
||
|
|
||
|
// 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 2.0 for more details.
|
||
|
|
||
|
// A copy of the GPL 2.0 should have been included with the program.
|
||
|
// If not, see http://www.gnu.org/licenses/
|
||
|
|
||
|
// Official SVN repository and contact information can be found at
|
||
|
// http://code.google.com/p/dolphin-emu/
|
||
|
|
||
|
#ifndef WIIMOTE_HID_H
|
||
|
#define WIIMOTE_HID_H
|
||
|
|
||
|
#include "CommonTypes.h"
|
||
|
|
||
|
// what is this ?
|
||
|
#ifdef _MSC_VER
|
||
|
#pragma warning(disable:4200)
|
||
|
#endif
|
||
|
#pragma pack(push, 1)
|
||
|
|
||
|
// Source: HID_010_SPC_PFL/1.0 (official HID specification)
|
||
|
|
||
|
struct hid_packet {
|
||
|
u8 param : 4;
|
||
|
u8 type : 4;
|
||
|
u8 data[0];
|
||
|
};
|
||
|
|
||
|
#define HID_TYPE_HANDSHAKE 0
|
||
|
#define HID_TYPE_SET_REPORT 5
|
||
|
#define HID_TYPE_DATA 0xA
|
||
|
|
||
|
#define HID_HANDSHAKE_SUCCESS 0
|
||
|
|
||
|
#define HID_PARAM_INPUT 1
|
||
|
#define HID_PARAM_OUTPUT 2
|
||
|
|
||
|
//source: http://wiibrew.org/wiki/Wiimote
|
||
|
|
||
|
typedef u16 wm_core;
|
||
|
|
||
|
struct wm_accel
|
||
|
{
|
||
|
u8 x, y, z;
|
||
|
};
|
||
|
|
||
|
// Four bytes for two objects. Filled with 0xFF if empty
|
||
|
struct wm_ir_basic
|
||
|
{
|
||
|
u8 x1;
|
||
|
u8 y1;
|
||
|
u8 x2hi : 2;
|
||
|
u8 y2hi : 2;
|
||
|
u8 x1hi : 2;
|
||
|
u8 y1hi : 2;
|
||
|
u8 x2;
|
||
|
u8 y2;
|
||
|
};
|
||
|
|
||
|
// Three bytes for one object
|
||
|
struct wm_ir_extended
|
||
|
{
|
||
|
u8 x;
|
||
|
u8 y;
|
||
|
u8 size : 4;
|
||
|
u8 xhi : 2;
|
||
|
u8 yhi : 2;
|
||
|
};
|
||
|
|
||
|
struct wm_extension
|
||
|
{
|
||
|
u8 jx; // joystick x, y
|
||
|
u8 jy;
|
||
|
u8 ax; // accelerometer
|
||
|
u8 ay;
|
||
|
u8 az;
|
||
|
u8 bt; // buttons
|
||
|
};
|
||
|
|
||
|
struct wm_classic_extension
|
||
|
{
|
||
|
u8 lx : 6; // byte 0
|
||
|
u8 rx3 : 2;
|
||
|
u8 ly : 6; // byte 1
|
||
|
u8 rx2 : 2;
|
||
|
u8 ry : 5; // byte 2
|
||
|
u8 lt2 : 2;
|
||
|
u8 rx1 : 1;
|
||
|
u8 rt : 5; // byte 3
|
||
|
u8 lt1 : 3;
|
||
|
u16 bt; // byte 4, 5
|
||
|
};
|
||
|
|
||
|
struct wm_GH3_extension
|
||
|
{
|
||
|
u8 sx : 6;
|
||
|
u8 pad1 : 2; // 1 on gh3, 0 on ghwt
|
||
|
|
||
|
u8 sy : 6;
|
||
|
u8 pad2 : 2; // 1 on gh3, 0 on ghwt
|
||
|
|
||
|
u8 tb : 5; // not used in gh3
|
||
|
u8 pad3 : 3; // always 0
|
||
|
|
||
|
u8 whammy : 5;
|
||
|
u8 pad4 : 3; // always 0
|
||
|
|
||
|
u8 pad5 : 2; // always 1
|
||
|
u8 plus : 1;
|
||
|
u8 pad6 : 1; // always 1
|
||
|
u8 minus : 1;
|
||
|
u8 pad7 : 1; // always 1
|
||
|
u8 strumdown : 1;
|
||
|
u8 pad8 : 1; // always 1
|
||
|
|
||
|
u8 strumup : 1;
|
||
|
u8 pad9 : 2; // always 1
|
||
|
u8 yellow : 1;
|
||
|
u8 green : 1;
|
||
|
u8 blue : 1;
|
||
|
u8 red : 1;
|
||
|
u8 orange : 1;
|
||
|
};
|
||
|
|
||
|
|
||
|
struct wm_report {
|
||
|
u8 wm;
|
||
|
u8 data[0];
|
||
|
};
|
||
|
|
||
|
#define WM_RUMBLE 0x10
|
||
|
|
||
|
#define WM_LEDS 0x11
|
||
|
struct wm_leds {
|
||
|
u8 rumble : 1;
|
||
|
u8 : 3;
|
||
|
u8 leds : 4;
|
||
|
};
|
||
|
|
||
|
#define WM_REPORT_MODE 0x12
|
||
|
struct wm_report_mode {
|
||
|
u8 rumble : 1;
|
||
|
u8 continuous : 1;
|
||
|
u8 all_the_time : 1;
|
||
|
u8 : 5;
|
||
|
u8 mode;
|
||
|
};
|
||
|
|
||
|
#define WM_IR_PIXEL_CLOCK 0x13
|
||
|
#define WM_IR_LOGIC 0x1A
|
||
|
|
||
|
#define WM_REQUEST_STATUS 0x15
|
||
|
struct wm_request_status {
|
||
|
u8 rumble : 1;
|
||
|
u8 : 7;
|
||
|
};
|
||
|
|
||
|
#define WM_STATUS_REPORT 0x20
|
||
|
struct wm_status_report {
|
||
|
wm_core buttons;
|
||
|
u8 battery_low : 1;
|
||
|
u8 extension : 1;
|
||
|
u8 speaker : 1;
|
||
|
u8 ir : 1;
|
||
|
u8 leds : 4;
|
||
|
u8 padding2[2]; // two 00, TODO: this needs more investigation
|
||
|
u8 battery;
|
||
|
};
|
||
|
|
||
|
#define WM_WRITE_DATA 0x16
|
||
|
struct wm_write_data
|
||
|
{
|
||
|
u8 rumble : 1;
|
||
|
u8 space : 2; //see WM_SPACE_*
|
||
|
u8 : 5;
|
||
|
u8 address[3];
|
||
|
u8 size;
|
||
|
u8 data[16];
|
||
|
};
|
||
|
|
||
|
#define WM_ACK_DATA 0x22
|
||
|
struct wm_acknowledge
|
||
|
{
|
||
|
wm_core buttons;
|
||
|
u8 reportID;
|
||
|
u8 errorID;
|
||
|
};
|
||
|
|
||
|
#define WM_READ_DATA 0x17
|
||
|
struct wm_read_data {
|
||
|
u8 rumble : 1;
|
||
|
u8 space : 2; //see WM_SPACE_*
|
||
|
u8 : 5;
|
||
|
u8 address[3];
|
||
|
u8 size[2];
|
||
|
};
|
||
|
|
||
|
#define WM_SPACE_EEPROM 0
|
||
|
#define WM_SPACE_REGS1 1
|
||
|
#define WM_SPACE_REGS2 2
|
||
|
#define WM_SPACE_INVALID 3
|
||
|
|
||
|
#define WM_READ_DATA_REPLY 0x21
|
||
|
struct wm_read_data_reply {
|
||
|
wm_core buttons;
|
||
|
u8 error : 4; //see WM_RDERR_*
|
||
|
u8 size : 4;
|
||
|
u16 address;
|
||
|
u8 data[16];
|
||
|
};
|
||
|
|
||
|
#define WM_RDERR_WOREG 7
|
||
|
#define WM_RDERR_NOMEM 8
|
||
|
|
||
|
|
||
|
// Data reports
|
||
|
|
||
|
#define WM_REPORT_CORE 0x30
|
||
|
struct wm_report_core {
|
||
|
wm_core c;
|
||
|
};
|
||
|
|
||
|
#define WM_REPORT_CORE_ACCEL 0x31
|
||
|
struct wm_report_core_accel {
|
||
|
wm_core c;
|
||
|
wm_accel a;
|
||
|
};
|
||
|
|
||
|
#define WM_REPORT_CORE_EXT8 0x32
|
||
|
|
||
|
#define WM_REPORT_CORE_ACCEL_IR12 0x33
|
||
|
struct wm_report_core_accel_ir12 {
|
||
|
wm_core c;
|
||
|
wm_accel a;
|
||
|
wm_ir_extended ir[4];
|
||
|
};
|
||
|
|
||
|
#define WM_REPORT_CORE_EXT19 0x34
|
||
|
#define WM_REPORT_CORE_ACCEL_EXT16 0x35
|
||
|
struct wm_report_core_accel_ext16
|
||
|
{
|
||
|
wm_core c;
|
||
|
wm_accel a;
|
||
|
wm_extension ext;
|
||
|
//wm_ir_basic ir[2];
|
||
|
u8 pad[10];
|
||
|
|
||
|
};
|
||
|
|
||
|
#define WM_REPORT_CORE_IR10_EXT9 0x36
|
||
|
|
||
|
#define WM_REPORT_CORE_ACCEL_IR10_EXT6 0x37
|
||
|
struct wm_report_core_accel_ir10_ext6
|
||
|
{
|
||
|
wm_core c;
|
||
|
wm_accel a;
|
||
|
wm_ir_basic ir[2];
|
||
|
//u8 ext[6];
|
||
|
wm_extension ext;
|
||
|
};
|
||
|
|
||
|
#define WM_REPORT_EXT21 0x3d // never used?
|
||
|
struct wm_report_ext21
|
||
|
{
|
||
|
u8 ext[21];
|
||
|
};
|
||
|
|
||
|
#define WM_REPORT_INTERLEAVE1 0x3e
|
||
|
#define WM_REPORT_INTERLEAVE2 0x3f
|
||
|
|
||
|
#define WM_SPEAKER_ENABLE 0x14
|
||
|
#define WM_SPEAKER_MUTE 0x19
|
||
|
#define WM_WRITE_SPEAKER_DATA 0x18
|
||
|
|
||
|
|
||
|
// Custom structs
|
||
|
|
||
|
/**
|
||
|
* @struct accel_t
|
||
|
* @brief Accelerometer struct. For any device with an accelerometer.
|
||
|
*/
|
||
|
struct accel_cal
|
||
|
{
|
||
|
struct
|
||
|
{
|
||
|
u8 x, y, z;
|
||
|
u8 xlo : 2;
|
||
|
u8 ylo : 2;
|
||
|
u8 zlo : 2;
|
||
|
} zero_g;
|
||
|
|
||
|
struct
|
||
|
{
|
||
|
u8 x, y, z;
|
||
|
u8 xlo : 2;
|
||
|
u8 ylo : 2;
|
||
|
u8 zlo : 2;
|
||
|
} one_g;
|
||
|
};
|
||
|
|
||
|
struct nu_js {
|
||
|
u8 max, min, center;
|
||
|
};
|
||
|
struct cc_trigger {
|
||
|
u8 neutral;
|
||
|
};
|
||
|
struct nu_cal
|
||
|
{
|
||
|
wm_accel cal_zero; // zero calibratio
|
||
|
wm_accel cal_g; // g size
|
||
|
nu_js jx; //
|
||
|
nu_js jy; //
|
||
|
};
|
||
|
struct cc_cal
|
||
|
{
|
||
|
nu_js Lx; //
|
||
|
nu_js Ly; //
|
||
|
nu_js Rx; //
|
||
|
nu_js Ry; //
|
||
|
cc_trigger Tl; //
|
||
|
cc_trigger Tr; //
|
||
|
};
|
||
|
struct gh3_cal
|
||
|
{
|
||
|
nu_js Lx;
|
||
|
nu_js Ly;
|
||
|
};
|
||
|
|
||
|
#pragma pack(pop)
|
||
|
|
||
|
#endif //WIIMOTE_HID_H
|