2010-04-13 05:15:38 +00:00
|
|
|
#ifndef _CONEMU_WIIMOTE_H_
|
|
|
|
#define _CONEMU_WIIMOTE_H_
|
|
|
|
|
|
|
|
#include <ControllerEmu.h>
|
|
|
|
|
|
|
|
#include "WiimoteHid.h"
|
|
|
|
#include "Encryption.h"
|
|
|
|
|
|
|
|
#include <vector>
|
2010-04-22 07:11:49 +00:00
|
|
|
#include <queue>
|
2010-04-13 05:15:38 +00:00
|
|
|
|
|
|
|
#define PI 3.14159265358979323846
|
|
|
|
|
|
|
|
// Registry sizes
|
|
|
|
#define WIIMOTE_EEPROM_SIZE (16*1024)
|
|
|
|
#define WIIMOTE_EEPROM_FREE_SIZE 0x16ff
|
|
|
|
#define WIIMOTE_REG_SPEAKER_SIZE 10
|
|
|
|
#define WIIMOTE_REG_EXT_SIZE 0x100
|
|
|
|
#define WIIMOTE_REG_IR_SIZE 0x34
|
|
|
|
|
2010-04-22 07:11:49 +00:00
|
|
|
extern SWiimoteInitialize g_WiimoteInitialize;
|
|
|
|
|
2010-04-13 05:15:38 +00:00
|
|
|
namespace WiimoteEmu
|
|
|
|
{
|
|
|
|
|
|
|
|
extern const u8 shake_data[8];
|
|
|
|
|
|
|
|
class Wiimote : public ControllerEmu
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
2010-04-22 07:11:49 +00:00
|
|
|
struct ReadRequest
|
|
|
|
{
|
|
|
|
unsigned int address, size, position;
|
|
|
|
u8* data;
|
|
|
|
};
|
|
|
|
|
|
|
|
Wiimote( const unsigned int index );
|
2010-04-13 05:15:38 +00:00
|
|
|
void Reset();
|
|
|
|
|
|
|
|
void Update();
|
2010-04-22 07:11:49 +00:00
|
|
|
void InterruptChannel(const u16 _channelID, const void* _pData, u32 _Size);
|
|
|
|
void ControlChannel(const u16 _channelID, const void* _pData, u32 _Size);
|
2010-04-13 05:15:38 +00:00
|
|
|
|
2010-04-22 07:11:49 +00:00
|
|
|
void ReportMode(const u16 _channelID, wm_report_mode* dr);
|
|
|
|
void HidOutputReport(const u16 _channelID, wm_report* sr);
|
|
|
|
void SendAck(const u16 _channelID, u8 _reportID);
|
|
|
|
void RequestStatus(const u16 _channelID, wm_request_status* rs = NULL);
|
2010-04-13 05:15:38 +00:00
|
|
|
|
2010-04-22 07:11:49 +00:00
|
|
|
void WriteData(const u16 _channelID, wm_write_data* wd);
|
|
|
|
void ReadData(const u16 _channelID, wm_read_data* rd);
|
|
|
|
void SendReadDataReply(const u16 _channelID, ReadRequest& _request);
|
2010-04-13 05:15:38 +00:00
|
|
|
|
|
|
|
std::string GetName() const;
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
Buttons* m_buttons;
|
|
|
|
Buttons* m_dpad;
|
|
|
|
Buttons* m_shake;
|
2010-04-22 07:11:49 +00:00
|
|
|
Cursor* m_ir;
|
2010-04-13 05:15:38 +00:00
|
|
|
Tilt* m_tilt;
|
|
|
|
Force* m_swing;
|
|
|
|
ControlGroup* m_rumble;
|
|
|
|
Extension* m_extension;
|
|
|
|
// TODO: add ir
|
|
|
|
|
|
|
|
const unsigned int m_index;
|
|
|
|
|
2010-04-22 07:11:49 +00:00
|
|
|
bool m_rumble_on;
|
|
|
|
|
2010-04-13 05:15:38 +00:00
|
|
|
bool m_reporting_auto;
|
|
|
|
unsigned int m_reporting_mode;
|
|
|
|
unsigned int m_reporting_channel;
|
|
|
|
|
2010-04-22 07:11:49 +00:00
|
|
|
unsigned int m_shake_step;
|
|
|
|
|
2010-04-13 05:15:38 +00:00
|
|
|
wm_status_report m_status;
|
|
|
|
|
|
|
|
class Register : public std::map< size_t, std::vector<u8> >
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
void Write( size_t address, void* src, size_t length );
|
|
|
|
void Read( size_t address, void* dst, size_t length );
|
|
|
|
|
|
|
|
} m_register;
|
|
|
|
|
2010-04-22 07:11:49 +00:00
|
|
|
// read data request queue
|
|
|
|
// maybe it isn't actualy a queue
|
|
|
|
// maybe read requests cancel any current requests
|
|
|
|
std::queue< ReadRequest > m_read_requests;
|
|
|
|
|
2010-04-13 05:15:38 +00:00
|
|
|
//u8 m_eeprom[WIIMOTE_EEPROM_SIZE];
|
|
|
|
u8 m_eeprom[WIIMOTE_EEPROM_SIZE];
|
|
|
|
|
|
|
|
//u8* m_reg_speaker;
|
|
|
|
//u8* m_reg_motion_plus;
|
2010-04-22 07:11:49 +00:00
|
|
|
u8* m_reg_ir;
|
2010-04-13 05:15:38 +00:00
|
|
|
u8* m_reg_ext;
|
|
|
|
|
|
|
|
wiimote_key m_ext_key;
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|