Merge pull request #23 from lioncash/sorta-large-input-cleanup

Larger cleanup to input-related source files (this time using unique_ptr).
This commit is contained in:
Pierre Bourdon
2014-02-02 15:11:15 -08:00
30 changed files with 635 additions and 786 deletions
+12 -12
View File
@@ -55,31 +55,31 @@ GCPad::GCPad(const unsigned int index) : m_index(index)
int const mic_hax = index > 1;
// buttons
groups.push_back(m_buttons = new Buttons(_trans("Buttons")));
groups.emplace_back(m_buttons = new Buttons(_trans("Buttons")));
for (unsigned int i=0; i < sizeof(named_buttons)/sizeof(*named_buttons) - mic_hax; ++i)
m_buttons->controls.push_back(new ControlGroup::Input(named_buttons[i]));
m_buttons->controls.emplace_back(new ControlGroup::Input(named_buttons[i]));
// sticks
groups.push_back(m_main_stick = new AnalogStick(_trans("Main Stick")));
groups.push_back(m_c_stick = new AnalogStick(_trans("C-Stick")));
groups.emplace_back(m_main_stick = new AnalogStick(_trans("Main Stick")));
groups.emplace_back(m_c_stick = new AnalogStick(_trans("C-Stick")));
// triggers
groups.push_back(m_triggers = new MixedTriggers(_trans("Triggers")));
groups.emplace_back(m_triggers = new MixedTriggers(_trans("Triggers")));
for (auto& named_trigger : named_triggers)
m_triggers->controls.push_back(new ControlGroup::Input(named_trigger));
m_triggers->controls.emplace_back(new ControlGroup::Input(named_trigger));
// rumble
groups.push_back(m_rumble = new ControlGroup(_trans("Rumble")));
m_rumble->controls.push_back(new ControlGroup::Output(_trans("Motor")));
groups.emplace_back(m_rumble = new ControlGroup(_trans("Rumble")));
m_rumble->controls.emplace_back(new ControlGroup::Output(_trans("Motor")));
// dpad
groups.push_back(m_dpad = new Buttons(_trans("D-Pad")));
groups.emplace_back(m_dpad = new Buttons(_trans("D-Pad")));
for (auto& named_direction : named_directions)
m_dpad->controls.push_back(new ControlGroup::Input(named_direction));
m_dpad->controls.emplace_back(new ControlGroup::Input(named_direction));
// options
groups.push_back(m_options = new ControlGroup(_trans("Options")));
m_options->settings.push_back(new ControlGroup::Setting(_trans("Background Input"), false));
groups.emplace_back(m_options = new ControlGroup(_trans("Options")));
m_options->settings.emplace_back(new ControlGroup::Setting(_trans("Background Input"), false));
}
std::string GCPad::GetName() const
@@ -43,5 +43,5 @@ void Attachment::Reset()
void ControllerEmu::Extension::GetState( u8* const data, const bool focus )
{
((WiimoteEmu::Attachment*)attachments[ active_extension ])->GetState( data, focus );
((WiimoteEmu::Attachment*)attachments[active_extension].get())->GetState( data, focus );
}
@@ -14,14 +14,14 @@ namespace WiimoteEmu
class Attachment : public ControllerEmu
{
public:
Attachment( const char* const _name, WiimoteEmu::ExtensionReg& _reg );
Attachment(const char* const _name, WiimoteEmu::ExtensionReg& _reg);
virtual void GetState( u8* const data, const bool focus = true ) {}
virtual void GetState(u8* const data, const bool focus = true) {}
void Reset();
std::string GetName() const override;
const char* const name;
WiimoteEmu::ExtensionReg& reg;
const char* const name;
WiimoteEmu::ExtensionReg& reg;
u8 id[6];
u8 calibration[0x10];
@@ -30,7 +30,7 @@ public:
class None : public Attachment
{
public:
None( WiimoteEmu::ExtensionReg& _reg );
None(WiimoteEmu::ExtensionReg& _reg);
};
}
@@ -56,23 +56,23 @@ static const u16 classic_dpad_bitmasks[] =
Classic::Classic(WiimoteEmu::ExtensionReg& _reg) : Attachment(_trans("Classic"), _reg)
{
// buttons
groups.push_back(m_buttons = new Buttons("Buttons"));
groups.emplace_back(m_buttons = new Buttons("Buttons"));
for (auto& classic_button_name : classic_button_names)
m_buttons->controls.push_back(new ControlGroup::Input(classic_button_name));
m_buttons->controls.emplace_back(new ControlGroup::Input(classic_button_name));
// sticks
groups.push_back(m_left_stick = new AnalogStick(_trans("Left Stick")));
groups.push_back(m_right_stick = new AnalogStick(_trans("Right Stick")));
groups.emplace_back(m_left_stick = new AnalogStick(_trans("Left Stick")));
groups.emplace_back(m_right_stick = new AnalogStick(_trans("Right Stick")));
// triggers
groups.push_back(m_triggers = new MixedTriggers("Triggers"));
groups.emplace_back(m_triggers = new MixedTriggers("Triggers"));
for (auto& classic_trigger_name : classic_trigger_names)
m_triggers->controls.push_back(new ControlGroup::Input(classic_trigger_name));
m_triggers->controls.emplace_back(new ControlGroup::Input(classic_trigger_name));
// dpad
groups.push_back(m_dpad = new Buttons("D-Pad"));
groups.emplace_back(m_dpad = new Buttons("D-Pad"));
for (auto& named_direction : named_directions)
m_dpad->controls.push_back(new ControlGroup::Input(named_direction));
m_dpad->controls.emplace_back(new ControlGroup::Input(named_direction));
// set up register
// calibration
@@ -11,34 +11,34 @@ class Classic : public Attachment
{
public:
Classic(WiimoteEmu::ExtensionReg& _reg);
void GetState( u8* const data, const bool focus );
void GetState(u8* const data, const bool focus) override;
enum
{
PAD_RIGHT = 0x80,
PAD_DOWN = 0x40,
TRIGGER_L = 0x20,
PAD_RIGHT = 0x80,
PAD_DOWN = 0x40,
TRIGGER_L = 0x20,
BUTTON_MINUS = 0x10,
BUTTON_HOME = 0x08,
BUTTON_PLUS = 0x04,
TRIGGER_R = 0x02,
NOTHING = 0x01,
BUTTON_ZL = 0x8000,
BUTTON_B = 0x4000,
BUTTON_Y = 0x2000,
BUTTON_A = 0x1000,
BUTTON_X = 0x0800,
BUTTON_ZR = 0x0400,
PAD_LEFT = 0x0200,
PAD_UP = 0x0100,
BUTTON_HOME = 0x08,
BUTTON_PLUS = 0x04,
TRIGGER_R = 0x02,
NOTHING = 0x01,
BUTTON_ZL = 0x8000,
BUTTON_B = 0x4000,
BUTTON_Y = 0x2000,
BUTTON_A = 0x1000,
BUTTON_X = 0x0800,
BUTTON_ZR = 0x0400,
PAD_LEFT = 0x0200,
PAD_UP = 0x0100,
};
private:
Buttons* m_buttons;
MixedTriggers* m_triggers;
Buttons* m_dpad;
AnalogStick* m_left_stick;
AnalogStick* m_right_stick;
Buttons* m_buttons;
MixedTriggers* m_triggers;
Buttons* m_dpad;
AnalogStick* m_left_stick;
AnalogStick* m_right_stick;
};
@@ -35,17 +35,17 @@ static const u16 drum_button_bitmasks[] =
Drums::Drums(WiimoteEmu::ExtensionReg& _reg) : Attachment(_trans("Drums"), _reg)
{
// pads
groups.push_back(m_pads = new Buttons(_trans("Pads")));
groups.emplace_back(m_pads = new Buttons(_trans("Pads")));
for (auto& drum_pad_name : drum_pad_names)
m_pads->controls.push_back(new ControlGroup::Input(drum_pad_name));
m_pads->controls.emplace_back(new ControlGroup::Input(drum_pad_name));
// stick
groups.push_back(m_stick = new AnalogStick("Stick"));
groups.emplace_back(m_stick = new AnalogStick("Stick"));
// buttons
groups.push_back(m_buttons = new Buttons("Buttons"));
m_buttons->controls.push_back(new ControlGroup::Input("-"));
m_buttons->controls.push_back(new ControlGroup::Input("+"));
groups.emplace_back(m_buttons = new Buttons("Buttons"));
m_buttons->controls.emplace_back(new ControlGroup::Input("-"));
m_buttons->controls.emplace_back(new ControlGroup::Input("+"));
// set up register
// id
@@ -11,25 +11,25 @@ class Drums : public Attachment
{
public:
Drums(WiimoteEmu::ExtensionReg& _reg);
void GetState( u8* const data, const bool focus );
void GetState(u8* const data, const bool focus) override;
enum
{
BUTTON_PLUS = 0x04,
BUTTON_PLUS = 0x04,
BUTTON_MINUS = 0x10,
PAD_BASS = 0x0400,
PAD_BLUE = 0x0800,
PAD_GREEN = 0x1000,
PAD_YELLOW = 0x2000,
PAD_RED = 0x4000,
PAD_ORANGE = 0x8000,
PAD_BASS = 0x0400,
PAD_BLUE = 0x0800,
PAD_GREEN = 0x1000,
PAD_YELLOW = 0x2000,
PAD_RED = 0x4000,
PAD_ORANGE = 0x8000,
};
private:
Buttons* m_buttons;
Buttons* m_pads;
AnalogStick* m_stick;
Buttons* m_buttons;
Buttons* m_pads;
AnalogStick* m_stick;
};
@@ -39,26 +39,26 @@ static const u16 guitar_strum_bitmasks[] =
Guitar::Guitar(WiimoteEmu::ExtensionReg& _reg) : Attachment(_trans("Guitar"), _reg)
{
// frets
groups.push_back(m_frets = new Buttons(_trans("Frets")));
groups.emplace_back(m_frets = new Buttons(_trans("Frets")));
for (auto& guitar_fret_name : guitar_fret_names)
m_frets->controls.push_back(new ControlGroup::Input(guitar_fret_name));
m_frets->controls.emplace_back(new ControlGroup::Input(guitar_fret_name));
// strum
groups.push_back(m_strum = new Buttons(_trans("Strum")));
m_strum->controls.push_back(new ControlGroup::Input("Up"));
m_strum->controls.push_back(new ControlGroup::Input("Down"));
groups.emplace_back(m_strum = new Buttons(_trans("Strum")));
m_strum->controls.emplace_back(new ControlGroup::Input("Up"));
m_strum->controls.emplace_back(new ControlGroup::Input("Down"));
// buttons
groups.push_back(m_buttons = new Buttons("Buttons"));
m_buttons->controls.push_back(new ControlGroup::Input("-"));
m_buttons->controls.push_back(new ControlGroup::Input("+"));
groups.emplace_back(m_buttons = new Buttons("Buttons"));
m_buttons->controls.emplace_back(new ControlGroup::Input("-"));
m_buttons->controls.emplace_back(new ControlGroup::Input("+"));
// stick
groups.push_back(m_stick = new AnalogStick(_trans("Stick")));
groups.emplace_back(m_stick = new AnalogStick(_trans("Stick")));
// whammy
groups.push_back(m_whammy = new Triggers(_trans("Whammy")));
m_whammy->controls.push_back(new ControlGroup::Input(_trans("Bar")));
groups.emplace_back(m_whammy = new Triggers(_trans("Whammy")));
m_whammy->controls.emplace_back(new ControlGroup::Input(_trans("Bar")));
// set up register
// id
@@ -11,28 +11,28 @@ class Guitar : public Attachment
{
public:
Guitar(WiimoteEmu::ExtensionReg& _reg);
void GetState( u8* const data, const bool focus ) override;
void GetState(u8* const data, const bool focus) override;
enum
{
BUTTON_PLUS = 0x04,
BUTTON_PLUS = 0x04,
BUTTON_MINUS = 0x10,
BAR_DOWN = 0x40,
BAR_DOWN = 0x40,
BAR_UP = 0x0100,
FRET_YELLOW = 0x0800,
FRET_GREEN = 0x1000,
FRET_BLUE = 0x2000,
FRET_RED = 0x4000,
FRET_ORANGE = 0x8000,
BAR_UP = 0x0100,
FRET_YELLOW = 0x0800,
FRET_GREEN = 0x1000,
FRET_BLUE = 0x2000,
FRET_RED = 0x4000,
FRET_ORANGE = 0x8000,
};
private:
Buttons* m_buttons;
Buttons* m_frets;
Buttons* m_strum;
Triggers* m_whammy;
AnalogStick* m_stick;
Buttons* m_buttons;
Buttons* m_frets;
Buttons* m_strum;
Triggers* m_whammy;
AnalogStick* m_stick;
};
@@ -35,24 +35,24 @@ Nunchuk::Nunchuk(UDPWrapper *wrp, WiimoteEmu::ExtensionReg& _reg)
: Attachment(_trans("Nunchuk"), _reg) , m_udpWrap(wrp)
{
// buttons
groups.push_back(m_buttons = new Buttons("Buttons"));
m_buttons->controls.push_back(new ControlGroup::Input("C"));
m_buttons->controls.push_back(new ControlGroup::Input("Z"));
groups.emplace_back(m_buttons = new Buttons("Buttons"));
m_buttons->controls.emplace_back(new ControlGroup::Input("C"));
m_buttons->controls.emplace_back(new ControlGroup::Input("Z"));
// stick
groups.push_back(m_stick = new AnalogStick("Stick"));
groups.emplace_back(m_stick = new AnalogStick("Stick"));
// swing
groups.push_back(m_swing = new Force("Swing"));
groups.emplace_back(m_swing = new Force("Swing"));
// tilt
groups.push_back(m_tilt = new Tilt("Tilt"));
groups.emplace_back(m_tilt = new Tilt("Tilt"));
// shake
groups.push_back(m_shake = new Buttons("Shake"));
m_shake->controls.push_back(new ControlGroup::Input("X"));
m_shake->controls.push_back(new ControlGroup::Input("Y"));
m_shake->controls.push_back(new ControlGroup::Input("Z"));
groups.emplace_back(m_shake = new Buttons("Shake"));
m_shake->controls.emplace_back(new ControlGroup::Input("X"));
m_shake->controls.emplace_back(new ControlGroup::Input("Y"));
m_shake->controls.emplace_back(new ControlGroup::Input("Z"));
// set up register
// calibration
@@ -159,24 +159,24 @@ void Nunchuk::GetState(u8* const data, const bool focus)
void Nunchuk::LoadDefaults(const ControllerInterface& ciface)
{
// ugly macroooo
#define set_control(group, num, str) (group)->controls[num]->control_ref->expression = (str)
#define set_control(group, num, str) (group)->controls[num]->control_ref->expression = (str)
// Stick
set_control(m_stick, 0, "W"); // up
set_control(m_stick, 1, "S"); // down
set_control(m_stick, 2, "A"); // left
set_control(m_stick, 3, "D"); // right
set_control(m_stick, 0, "W"); // up
set_control(m_stick, 1, "S"); // down
set_control(m_stick, 2, "A"); // left
set_control(m_stick, 3, "D"); // right
// Buttons
#ifdef _WIN32
set_control(m_buttons, 0, "LCONTROL"); // C
set_control(m_buttons, 1, "LSHIFT"); // Z
set_control(m_buttons, 0, "LCONTROL"); // C
set_control(m_buttons, 1, "LSHIFT"); // Z
#elif __APPLE__
set_control(m_buttons, 0, "Left Control"); // C
set_control(m_buttons, 1, "Left Shift"); // Z
set_control(m_buttons, 0, "Left Control"); // C
set_control(m_buttons, 1, "Left Shift"); // Z
#else
set_control(m_buttons, 0, "Control_L"); // C
set_control(m_buttons, 1, "Shift_L"); // Z
set_control(m_buttons, 0, "Control_L"); // C
set_control(m_buttons, 1, "Shift_L"); // Z
#endif
}
@@ -17,7 +17,7 @@ class Nunchuk : public Attachment
public:
Nunchuk(UDPWrapper * wrp, WiimoteEmu::ExtensionReg& _reg);
virtual void GetState( u8* const data, const bool focus ) override;
virtual void GetState(u8* const data, const bool focus) override;
enum
{
@@ -28,15 +28,15 @@ public:
void LoadDefaults(const ControllerInterface& ciface) override;
private:
Tilt* m_tilt;
Force* m_swing;
Tilt* m_tilt;
Force* m_swing;
Buttons* m_shake;
Buttons* m_shake;
Buttons* m_buttons;
AnalogStick* m_stick;
Buttons* m_buttons;
AnalogStick* m_stick;
u8 m_shake_step[3];
u8 m_shake_step[3];
UDPWrapper* const m_udpWrap;
};
@@ -33,23 +33,23 @@ static const char* const turntable_button_names[] =
Turntable::Turntable(WiimoteEmu::ExtensionReg& _reg) : Attachment(_trans("Turntable"), _reg)
{
// buttons
groups.push_back(m_buttons = new Buttons("Buttons"));
groups.emplace_back(m_buttons = new Buttons("Buttons"));
for (auto& turntable_button_name : turntable_button_names)
m_buttons->controls.push_back(new ControlGroup::Input(turntable_button_name));
m_buttons->controls.emplace_back(new ControlGroup::Input(turntable_button_name));
// turntables
groups.push_back(m_left_table = new Slider(_trans("Table Left")));
groups.push_back(m_right_table = new Slider(_trans("Table Right")));
groups.emplace_back(m_left_table = new Slider(_trans("Table Left")));
groups.emplace_back(m_right_table = new Slider(_trans("Table Right")));
// stick
groups.push_back(m_stick = new AnalogStick("Stick"));
groups.emplace_back(m_stick = new AnalogStick("Stick"));
// effect dial
groups.push_back(m_effect_dial = new Triggers(_trans("Effect")));
m_effect_dial->controls.push_back(new ControlGroup::Input(_trans("Dial")));
groups.emplace_back(m_effect_dial = new Triggers(_trans("Effect")));
m_effect_dial->controls.emplace_back(new ControlGroup::Input(_trans("Dial")));
// crossfade
groups.push_back(m_crossfade = new Slider(_trans("Crossfade")));
groups.emplace_back(m_crossfade = new Slider(_trans("Crossfade")));
// set up register
// id
@@ -17,23 +17,25 @@ public:
{
BUTTON_EUPHORIA = 0x1000,
BUTTON_L_GREEN = 0x0800,
BUTTON_L_RED = 0x20,
BUTTON_L_BLUE = 0x8000,
BUTTON_L_GREEN = 0x0800,
BUTTON_L_RED = 0x20,
BUTTON_L_BLUE = 0x8000,
BUTTON_R_GREEN = 0x2000,
BUTTON_R_RED = 0x02,
BUTTON_R_BLUE = 0x0400,
BUTTON_R_GREEN = 0x2000,
BUTTON_R_RED = 0x02,
BUTTON_R_BLUE = 0x0400,
BUTTON_MINUS = 0x10,
BUTTON_PLUS = 0x04,
BUTTON_MINUS = 0x10,
BUTTON_PLUS = 0x04,
};
private:
Buttons* m_buttons;
AnalogStick* m_stick;
Triggers *m_effect_dial;
Slider *m_left_table, *m_right_table, *m_crossfade;
Buttons* m_buttons;
AnalogStick* m_stick;
Triggers* m_effect_dial;
Slider* m_left_table;
Slider* m_right_table;
Slider* m_crossfade;
};
@@ -852,7 +852,7 @@ void Wiimote::HandleExtensionSwap()
m_extension->active_extension = m_extension->switch_extension;
// reset register
((WiimoteEmu::Attachment*)m_extension->attachments[m_extension->active_extension])->Reset();
((WiimoteEmu::Attachment*)m_extension->attachments[m_extension->active_extension].get())->Reset();
}
}
+26 -26
View File
@@ -268,53 +268,53 @@ Wiimote::Wiimote( const unsigned int index )
// ---- set up all the controls ----
// buttons
groups.push_back(m_buttons = new Buttons("Buttons"));
groups.emplace_back(m_buttons = new Buttons("Buttons"));
for (auto& named_button : named_buttons)
m_buttons->controls.push_back(new ControlGroup::Input( named_button));
m_buttons->controls.emplace_back(new ControlGroup::Input( named_button));
// udp
groups.push_back(m_udp = new UDPWrapper(m_index, _trans("UDP Wiimote")));
groups.emplace_back(m_udp = new UDPWrapper(m_index, _trans("UDP Wiimote")));
// ir
groups.push_back(m_ir = new Cursor(_trans("IR")));
groups.emplace_back(m_ir = new Cursor(_trans("IR")));
// swing
groups.push_back(m_swing = new Force(_trans("Swing")));
groups.emplace_back(m_swing = new Force(_trans("Swing")));
// tilt
groups.push_back(m_tilt = new Tilt(_trans("Tilt")));
groups.emplace_back(m_tilt = new Tilt(_trans("Tilt")));
// shake
groups.push_back(m_shake = new Buttons(_trans("Shake")));
m_shake->controls.push_back(new ControlGroup::Input("X"));
m_shake->controls.push_back(new ControlGroup::Input("Y"));
m_shake->controls.push_back(new ControlGroup::Input("Z"));
groups.emplace_back(m_shake = new Buttons(_trans("Shake")));
m_shake->controls.emplace_back(new ControlGroup::Input("X"));
m_shake->controls.emplace_back(new ControlGroup::Input("Y"));
m_shake->controls.emplace_back(new ControlGroup::Input("Z"));
// extension
groups.push_back(m_extension = new Extension(_trans("Extension")));
m_extension->attachments.push_back(new WiimoteEmu::None(m_reg_ext));
m_extension->attachments.push_back(new WiimoteEmu::Nunchuk(m_udp, m_reg_ext));
m_extension->attachments.push_back(new WiimoteEmu::Classic(m_reg_ext));
m_extension->attachments.push_back(new WiimoteEmu::Guitar(m_reg_ext));
m_extension->attachments.push_back(new WiimoteEmu::Drums(m_reg_ext));
m_extension->attachments.push_back(new WiimoteEmu::Turntable(m_reg_ext));
groups.emplace_back(m_extension = new Extension(_trans("Extension")));
m_extension->attachments.emplace_back(new WiimoteEmu::None(m_reg_ext));
m_extension->attachments.emplace_back(new WiimoteEmu::Nunchuk(m_udp, m_reg_ext));
m_extension->attachments.emplace_back(new WiimoteEmu::Classic(m_reg_ext));
m_extension->attachments.emplace_back(new WiimoteEmu::Guitar(m_reg_ext));
m_extension->attachments.emplace_back(new WiimoteEmu::Drums(m_reg_ext));
m_extension->attachments.emplace_back(new WiimoteEmu::Turntable(m_reg_ext));
m_extension->settings.push_back(new ControlGroup::Setting(_trans("Motion Plus"), 0, 0, 1));
m_extension->settings.emplace_back(new ControlGroup::Setting(_trans("Motion Plus"), 0, 0, 1));
// rumble
groups.push_back(m_rumble = new ControlGroup(_trans("Rumble")));
m_rumble->controls.push_back(new ControlGroup::Output(_trans("Motor")));
groups.emplace_back(m_rumble = new ControlGroup(_trans("Rumble")));
m_rumble->controls.emplace_back(new ControlGroup::Output(_trans("Motor")));
// dpad
groups.push_back(m_dpad = new Buttons("D-Pad"));
groups.emplace_back(m_dpad = new Buttons("D-Pad"));
for (auto& named_direction : named_directions)
m_dpad->controls.push_back(new ControlGroup::Input(named_direction));
m_dpad->controls.emplace_back(new ControlGroup::Input(named_direction));
// options
groups.push_back( m_options = new ControlGroup(_trans("Options")));
m_options->settings.push_back(new ControlGroup::Setting(_trans("Background Input"), false));
m_options->settings.push_back(new ControlGroup::Setting(_trans("Sideways Wiimote"), false));
m_options->settings.push_back(new ControlGroup::Setting(_trans("Upright Wiimote"), false));
groups.emplace_back( m_options = new ControlGroup(_trans("Options")));
m_options->settings.emplace_back(new ControlGroup::Setting(_trans("Background Input"), false));
m_options->settings.emplace_back(new ControlGroup::Setting(_trans("Sideways Wiimote"), false));
m_options->settings.emplace_back(new ControlGroup::Setting(_trans("Upright Wiimote"), false));
// TODO: This value should probably be re-read if SYSCONF gets changed
m_sensor_bar_on_top = SConfig::GetInstance().m_SYSCONF->GetData<u8>("BT.BAR") != 0;
+69 -72
View File
@@ -18,11 +18,11 @@
#include <queue>
// Registry sizes
#define WIIMOTE_EEPROM_SIZE (16*1024)
#define WIIMOTE_EEPROM_FREE_SIZE 0x1700
#define WIIMOTE_REG_SPEAKER_SIZE 10
#define WIIMOTE_REG_EXT_SIZE 0x100
#define WIIMOTE_REG_IR_SIZE 0x34
#define WIIMOTE_EEPROM_SIZE (16*1024)
#define WIIMOTE_EEPROM_FREE_SIZE 0x1700
#define WIIMOTE_REG_SPEAKER_SIZE 10
#define WIIMOTE_REG_EXT_SIZE 0x100
#define WIIMOTE_REG_IR_SIZE 0x34
namespace WiimoteReal
{
@@ -49,26 +49,26 @@ struct ADPCMState
struct ExtensionReg
{
u8 unknown1[0x08];
u8 unknown1[0x08];
// address 0x08
u8 controller_data[0x06];
u8 unknown2[0x12];
u8 controller_data[0x06];
u8 unknown2[0x12];
// address 0x20
u8 calibration[0x10];
u8 unknown3[0x10];
u8 calibration[0x10];
u8 unknown3[0x10];
// address 0x40
u8 encryption_key[0x10];
u8 unknown4[0xA0];
u8 encryption_key[0x10];
u8 unknown4[0xA0];
// address 0xF0
u8 encryption;
u8 unknown5[0x9];
u8 encryption;
u8 unknown5[0x9];
// address 0xFA
u8 constant_id[6];
u8 constant_id[6];
};
extern const ReportFeatures reporting_mode_features[];
@@ -104,21 +104,21 @@ public:
enum
{
PAD_LEFT = 0x01,
PAD_RIGHT = 0x02,
PAD_DOWN = 0x04,
PAD_UP = 0x08,
BUTTON_PLUS = 0x10,
PAD_LEFT = 0x01,
PAD_RIGHT = 0x02,
PAD_DOWN = 0x04,
PAD_UP = 0x08,
BUTTON_PLUS = 0x10,
BUTTON_TWO = 0x0100,
BUTTON_ONE = 0x0200,
BUTTON_B = 0x0400,
BUTTON_A = 0x0800,
BUTTON_MINUS = 0x1000,
BUTTON_HOME = 0x8000,
BUTTON_TWO = 0x0100,
BUTTON_ONE = 0x0200,
BUTTON_B = 0x0400,
BUTTON_A = 0x0800,
BUTTON_MINUS = 0x1000,
BUTTON_HOME = 0x8000,
};
Wiimote( const unsigned int index );
Wiimote(const unsigned int index);
std::string GetName() const;
void Update();
@@ -147,9 +147,9 @@ protected:
private:
struct ReadRequest
{
//u16 channel;
unsigned int address, size, position;
u8* data;
//u16 channel;
u32 address, size, position;
u8* data;
};
void Reset();
@@ -164,88 +164,85 @@ private:
bool NetPlay_GetWiimoteData(int wiimote, u8* data, u8 size);
// control groups
Buttons *m_buttons, *m_dpad, *m_shake;
Cursor* m_ir;
Tilt* m_tilt;
Force* m_swing;
ControlGroup* m_rumble;
Extension* m_extension;
ControlGroup* m_options;
Buttons *m_buttons, *m_dpad, *m_shake;
Cursor* m_ir;
Tilt* m_tilt;
Force* m_swing;
ControlGroup* m_rumble;
Extension* m_extension;
ControlGroup* m_options;
// WiiMote accel data
AccelData m_accel;
AccelData m_accel;
// wiimote index, 0-3
const u8 m_index;
const u8 m_index;
double ir_sin, ir_cos; //for the low pass filter
double ir_sin, ir_cos; //for the low pass filter
UDPWrapper* m_udp;
bool m_rumble_on;
bool m_speaker_mute;
bool m_motion_plus_present;
bool m_motion_plus_active;
bool m_rumble_on;
bool m_speaker_mute;
bool m_motion_plus_present;
bool m_motion_plus_active;
bool m_reporting_auto;
u8 m_reporting_mode;
u16 m_reporting_channel;
bool m_reporting_auto;
u8 m_reporting_mode;
u16 m_reporting_channel;
u8 m_shake_step[3];
u8 m_shake_step[3];
bool m_sensor_bar_on_top;
bool m_sensor_bar_on_top;
wm_status_report m_status;
wm_status_report m_status;
ADPCMState m_adpcm_state;
// read data request queue
// maybe it isn't actually a queue
// maybe read requests cancel any current requests
std::queue< ReadRequest > m_read_requests;
std::queue<ReadRequest> m_read_requests;
wiimote_key m_ext_key;
wiimote_key m_ext_key;
u8 m_eeprom[WIIMOTE_EEPROM_SIZE];
u8 m_eeprom[WIIMOTE_EEPROM_SIZE];
struct MotionPlusReg
{
u8 unknown[0xF0];
// address 0xF0
u8 activated;
u8 activated;
u8 unknown2[9];
// address 0xFA
u8 ext_identifier[6];
} m_reg_motion_plus;
u8 ext_identifier[6];
} m_reg_motion_plus;
struct IrReg
{
u8 data[0x33];
u8 mode;
} m_reg_ir;
u8 data[0x33];
u8 mode;
} m_reg_ir;
ExtensionReg m_reg_ext;
struct SpeakerReg
{
u8 unused_0;
u8 unk_1;
u8 format;
u8 unused_0;
u8 unk_1;
u8 format;
// seems to always play at 6khz no matter what this is set to?
// or maybe it only applies to pcm input
u16 sample_rate;
u8 volume;
u8 unk_6;
u8 unk_7;
u8 play;
u8 unk_9;
} m_reg_speaker;
u16 sample_rate;
u8 volume;
u8 unk_6;
u8 unk_7;
u8 play;
u8 unk_9;
} m_reg_speaker;
};
void Spy(Wiimote* wm_, const void* data_, size_t size_);
+64 -100
View File
@@ -31,8 +31,7 @@ void GamepadPage::ConfigExtension(wxCommandEvent& event)
wxBoxSizer* const main_szr = new wxBoxSizer(wxVERTICAL);
const std::size_t orig_size = control_groups.size();
ControlGroupsSizer* const szr =
new ControlGroupsSizer(ex->attachments[ex->switch_extension], &dlg, this, &control_groups);
ControlGroupsSizer* const szr = new ControlGroupsSizer(ex->attachments[ex->switch_extension].get(), &dlg, this, &control_groups);
main_szr->Add(szr, 0, wxLEFT, 5);
main_szr->Add(dlg.CreateButtonSizer(wxOK), 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);
dlg.SetSizerAndFit(main_szr);
@@ -49,13 +48,10 @@ PadSettingExtension::PadSettingExtension(wxWindow* const parent, ControllerEmu::
: PadSetting(new wxChoice(parent, -1))
, extension(ext)
{
std::vector<ControllerEmu*>::const_iterator
i = extension->attachments.begin(),
e = extension->attachments.end();
for (; i!=e; ++i)
((wxChoice*)wxcontrol)->Append(wxGetTranslation(StrToWxStr((*i)->GetName())));
for (auto& attachment : extension->attachments)
{
((wxChoice*)wxcontrol)->Append(wxGetTranslation(StrToWxStr(attachment->GetName())));
}
UpdateGUI();
}
@@ -152,29 +148,25 @@ void InputConfigDialog::UpdateProfileComboBox()
const CFileSearch::XStringVector& sv = cfs.GetFileNames();
wxArrayString strs;
CFileSearch::XStringVector::const_iterator si = sv.begin(),
se = sv.end();
for (; si!=se; ++si)
for (auto si = sv.cbegin(); si != sv.cend(); ++si)
{
std::string str(si->begin() + si->find_last_of('/') + 1 , si->end() - 4) ;
strs.push_back(StrToWxStr(str));
}
std::vector< GamepadPage* >::iterator i = m_padpages.begin(),
e = m_padpages.end();
for (; i != e; ++i)
for (GamepadPage* page : m_padpages)
{
(*i)->profile_cbox->Clear();
(*i)->profile_cbox->Append(strs);
page->profile_cbox->Clear();
page->profile_cbox->Append(strs);
}
}
void InputConfigDialog::UpdateControlReferences()
{
std::vector< GamepadPage* >::iterator i = m_padpages.begin(),
e = m_padpages.end();
for (; i != e; ++i)
(*i)->controller->UpdateReferences(g_controller_interface);
for (GamepadPage* page : m_padpages)
{
page->controller->UpdateReferences(g_controller_interface);
}
}
void InputConfigDialog::ClickSave(wxCommandEvent& event)
@@ -192,21 +184,17 @@ void ControlDialog::UpdateListContents()
{
if (control_reference->is_input)
{
// for inputs
std::vector<Device::Input*>::const_iterator
i = dev->Inputs().begin(),
e = dev->Inputs().end();
for (; i!=e; ++i)
control_lbox->Append(StrToWxStr((*i)->GetName()));
for (Device::Input* input : dev->Inputs())
{
control_lbox->Append(StrToWxStr(input->GetName()));
}
}
else
else // It's an output
{
// for outputs
std::vector<Device::Output*>::const_iterator
i = dev->Outputs().begin(),
e = dev->Outputs().end();
for (; i!=e; ++i)
control_lbox->Append(StrToWxStr((*i)->GetName()));
for (Device::Output* output : dev->Outputs())
{
control_lbox->Append(StrToWxStr(output->GetName()));
}
}
}
}
@@ -246,24 +234,19 @@ void GamepadPage::UpdateGUI()
{
device_cbox->SetValue(StrToWxStr(controller->default_device.ToString()));
std::vector< ControlGroupBox* >::const_iterator g = control_groups.begin(),
ge = control_groups.end();
for (; g!=ge; ++g)
for (ControlGroupBox* cgBox : control_groups)
{
// buttons
std::vector<ControlButton*>::const_iterator i = (*g)->control_buttons.begin()
, e = (*g)->control_buttons.end();
for (; i!=e; ++i) {
wxString expr = StrToWxStr((*i)->control_reference->expression);
for (ControlButton* button : cgBox->control_buttons)
{
wxString expr = StrToWxStr(button->control_reference->expression);
expr.Replace("&", "&&");
(*i)->SetLabel(expr);
button->SetLabel(expr);
}
// cboxes
std::vector<PadSetting*>::const_iterator si = (*g)->options.begin()
, se = (*g)->options.end();
for (; si!=se; ++si)
(*si)->UpdateGUI();
for (PadSetting* padSetting : cgBox->options)
{
padSetting->UpdateGUI();
}
}
}
@@ -342,9 +325,10 @@ void ControlDialog::ClearControl(wxCommandEvent&)
inline bool IsAlphabetic(wxString &str)
{
for (wxString::const_iterator it = str.begin(); it != str.end(); ++it)
if (!isalpha(*it))
for (wxUniChar c : str)
if (!isalpha(c))
return false;
return true;
}
@@ -423,7 +407,9 @@ void ControlDialog::AppendControl(wxCommandEvent& event)
expr = wxString::Format("%c(%s)", op, selection);
}
else
{
expr = wxString::Format(" %c %s", op, device_expr);
}
textctrl->WriteText(expr);
control_reference->expression = textctrl->GetValue();
@@ -605,7 +591,7 @@ wxStaticBoxSizer* ControlDialog::CreateControlChooser(GamepadPage* const parent)
void GamepadPage::GetProfilePath(std::string& path)
{
const wxString& name = profile_cbox->GetValue();
if (false == name.empty())
if (!name.empty())
{
// TODO: check for dumb characters maybe
@@ -623,7 +609,7 @@ void GamepadPage::LoadProfile(wxCommandEvent&)
std::string fname;
GamepadPage::GetProfilePath(fname);
if (false == File::Exists(fname))
if (!File::Exists(fname))
return;
IniFile inifile;
@@ -642,7 +628,7 @@ void GamepadPage::SaveProfile(wxCommandEvent&)
GamepadPage::GetProfilePath(fname);
File::CreateFullPath(fname);
if (false == fname.empty())
if (!fname.empty())
{
IniFile inifile;
controller->SaveConfig(inifile.GetOrCreateSection("Profile"));
@@ -675,21 +661,18 @@ void GamepadPage::DeleteProfile(wxCommandEvent&)
void InputConfigDialog::UpdateDeviceComboBox()
{
std::vector< GamepadPage* >::iterator i = m_padpages.begin(),
e = m_padpages.end();
DeviceQualifier dq;
for (; i != e; ++i)
for (GamepadPage* page : m_padpages)
{
(*i)->device_cbox->Clear();
std::vector<Device*>::const_iterator
di = g_controller_interface.Devices().begin(),
de = g_controller_interface.Devices().end();
for (; di!=de; ++di)
page->device_cbox->Clear();
for (Device* d : g_controller_interface.Devices())
{
dq.FromDevice(*di);
(*i)->device_cbox->Append(StrToWxStr(dq.ToString()));
dq.FromDevice(d);
page->device_cbox->Append(StrToWxStr(dq.ToString()));
}
(*i)->device_cbox->SetValue(StrToWxStr((*i)->controller->default_device.ToString()));
page->device_cbox->SetValue(StrToWxStr(page->controller->default_device.ToString()));
}
}
@@ -710,11 +693,8 @@ void GamepadPage::RefreshDevices(wxCommandEvent&)
ControlGroupBox::~ControlGroupBox()
{
std::vector<PadSetting*>::const_iterator
i = options.begin(),
e = options.end();
for (; i!=e; ++i)
delete *i;
for (PadSetting* padSetting : options)
delete padSetting;
}
ControlGroupBox::ControlGroupBox(ControllerEmu::ControlGroup* const group, wxWindow* const parent, GamepadPage* const eventsink)
@@ -724,20 +704,16 @@ ControlGroupBox::ControlGroupBox(ControllerEmu::ControlGroup* const group, wxWin
static_bitmap = NULL;
wxFont m_SmallFont(7, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
std::vector<ControllerEmu::ControlGroup::Control*>::iterator
ci = group->controls.begin(),
ce = group->controls.end();
for (; ci != ce; ++ci)
for (auto& control : group->controls)
{
wxStaticText* const label = new wxStaticText(parent, -1, wxGetTranslation(StrToWxStr(control->name)));
wxStaticText* const label = new wxStaticText(parent, -1, wxGetTranslation(StrToWxStr((*ci)->name)));
ControlButton* const control_button = new ControlButton(parent, (*ci)->control_ref, 80);
ControlButton* const control_button = new ControlButton(parent, control->control_ref.get(), 80);
control_button->SetFont(m_SmallFont);
control_buttons.push_back(control_button);
if ((*ci)->control_ref->is_input)
if (control->control_ref->is_input)
{
control_button->SetToolTip(_("Left-click to detect input.\nMiddle-click to clear.\nRight-click for more options."));
control_button->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &GamepadPage::DetectControl, eventsink);
@@ -774,17 +750,13 @@ ControlGroupBox::ControlGroupBox(ControllerEmu::ControlGroup* const group, wxWin
dc.Clear();
static_bitmap = new wxStaticBitmap(parent, -1, bitmap, wxDefaultPosition, wxDefaultSize, wxBITMAP_TYPE_BMP);
std::vector< ControllerEmu::ControlGroup::Setting* >::const_iterator
i = group->settings.begin(),
e = group->settings.end();
wxBoxSizer* const szr = new wxBoxSizer(wxVERTICAL);
for (; i!=e; ++i)
for (auto& groupSetting : group->settings)
{
PadSettingSpin* setting = new PadSettingSpin(parent, *i);
PadSettingSpin* setting = new PadSettingSpin(parent, groupSetting.get());
setting->wxcontrol->Bind(wxEVT_COMMAND_SPINCTRL_UPDATED, &GamepadPage::AdjustSetting, eventsink);
options.push_back(setting);
szr->Add(new wxStaticText(parent, -1, wxGetTranslation(StrToWxStr((*i)->name))));
szr->Add(new wxStaticText(parent, -1, wxGetTranslation(StrToWxStr(groupSetting->name))));
szr->Add(setting->wxcontrol, 0, wxLEFT, 0);
}
@@ -802,7 +774,7 @@ ControlGroupBox::ControlGroupBox(ControllerEmu::ControlGroup* const group, wxWin
dc.Clear();
static_bitmap = new wxStaticBitmap(parent, -1, bitmap, wxDefaultPosition, wxDefaultSize, wxBITMAP_TYPE_BMP);
PadSettingSpin* const threshold_cbox = new PadSettingSpin(parent, group->settings[0]);
PadSettingSpin* const threshold_cbox = new PadSettingSpin(parent, group->settings[0].get());
threshold_cbox->wxcontrol->Bind(wxEVT_COMMAND_SPINCTRL_UPDATED, &GamepadPage::AdjustSetting, eventsink);
threshold_cbox->wxcontrol->SetToolTip(_("Adjust the analog control pressure required to activate buttons."));
@@ -836,16 +808,13 @@ ControlGroupBox::ControlGroupBox(ControllerEmu::ControlGroup* const group, wxWin
dc.Clear();
static_bitmap = new wxStaticBitmap(parent, -1, bitmap, wxDefaultPosition, wxDefaultSize, wxBITMAP_TYPE_BMP);
std::vector<ControllerEmu::ControlGroup::Setting*>::const_iterator
i = group->settings.begin(),
e = group->settings.end();
for (; i!=e; ++i)
for (auto& groupSetting : group->settings)
{
PadSettingSpin* setting = new PadSettingSpin(parent, *i);
PadSettingSpin* setting = new PadSettingSpin(parent, groupSetting.get());
setting->wxcontrol->Bind(wxEVT_COMMAND_SPINCTRL_UPDATED, &GamepadPage::AdjustSetting, eventsink);
options.push_back(setting);
wxBoxSizer* const szr = new wxBoxSizer(wxHORIZONTAL);
szr->Add(new wxStaticText(parent, -1, wxGetTranslation(StrToWxStr((*i)->name))), 0, wxCENTER|wxRIGHT, 3);
szr->Add(new wxStaticText(parent, -1, wxGetTranslation(StrToWxStr(groupSetting->name))), 0, wxCENTER|wxRIGHT, 3);
szr->Add(setting->wxcontrol, 0, wxRIGHT, 3);
Add(szr, 0, wxALL|wxCENTER, 3);
}
@@ -877,18 +846,13 @@ ControlGroupBox::ControlGroupBox(ControllerEmu::ControlGroup* const group, wxWin
default:
{
//options
std::vector<ControllerEmu::ControlGroup::Setting*>::const_iterator
i = group->settings.begin(),
e = group->settings.end();
for (; i!=e; ++i)
for (auto& groupSetting : group->settings)
{
PadSettingCheckBox* setting_cbox = new PadSettingCheckBox(parent, (*i)->value, (*i)->name);
PadSettingCheckBox* setting_cbox = new PadSettingCheckBox(parent, groupSetting->value, groupSetting->name);
setting_cbox->wxcontrol->Bind(wxEVT_COMMAND_CHECKBOX_CLICKED, &GamepadPage::AdjustSetting, eventsink);
options.push_back(setting_cbox);
Add(setting_cbox->wxcontrol, 0, wxALL|wxLEFT, 5);
}
}
break;
@@ -905,9 +869,9 @@ ControlGroupsSizer::ControlGroupsSizer(ControllerEmu* const controller, wxWindow
size_t col_size = 0;
wxBoxSizer* stacked_groups = NULL;
for (ControllerEmu::ControlGroup* group : controller->groups)
for (auto& group : controller->groups)
{
ControlGroupBox* control_group_box = new ControlGroupBox(group, parent, eventsink);
ControlGroupBox* control_group_box = new ControlGroupBox(group.get(), parent, eventsink);
wxStaticBoxSizer *control_group =
new wxStaticBoxSizer(wxVERTICAL, parent, wxGetTranslation(StrToWxStr(group->name)));
control_group->Add(control_group_box);
+74 -158
View File
@@ -8,95 +8,33 @@
#include <X11/Xlib.h>
#endif
ControllerEmu::~ControllerEmu()
{
// control groups
std::vector<ControlGroup*>::const_iterator
i = groups.begin(),
e = groups.end();
for (; i!=e; ++i)
delete *i;
}
ControllerEmu::ControlGroup::~ControlGroup()
{
// controls
std::vector<Control*>::const_iterator
ci = controls.begin(),
ce = controls.end();
for (; ci!=ce; ++ci)
delete *ci;
// settings
std::vector<Setting*>::const_iterator
si = settings.begin(),
se = settings.end();
for (; si!=se; ++si)
delete *si;
}
ControllerEmu::Extension::~Extension()
{
// attachments
std::vector<ControllerEmu*>::const_iterator
ai = attachments.begin(),
ae = attachments.end();
for (; ai!=ae; ++ai)
delete *ai;
}
ControllerEmu::ControlGroup::Control::~Control()
{
delete control_ref;
}
void ControllerEmu::UpdateReferences(ControllerInterface& devi)
{
std::vector<ControlGroup*>::const_iterator
i = groups.begin(),
e = groups.end();
for (; i!=e; ++i)
for (auto& ctrlGroup : groups)
{
std::vector<ControlGroup::Control*>::const_iterator
ci = (*i)->controls.begin(),
ce = (*i)->controls.end();
for (; ci!=ce; ++ci)
devi.UpdateReference((*ci)->control_ref, default_device);
for (auto& control : ctrlGroup->controls)
devi.UpdateReference(control->control_ref.get(), default_device);
// extension
if (GROUP_TYPE_EXTENSION == (*i)->type)
if (ctrlGroup->type == GROUP_TYPE_EXTENSION)
{
std::vector<ControllerEmu*>::const_iterator
ai = ((Extension*)*i)->attachments.begin(),
ae = ((Extension*)*i)->attachments.end();
for (; ai!=ae; ++ai)
(*ai)->UpdateReferences(devi);
for (auto& attachment : ((Extension*)ctrlGroup.get())->attachments)
attachment->UpdateReferences(devi);
}
}
}
void ControllerEmu::UpdateDefaultDevice()
{
std::vector<ControlGroup*>::const_iterator
i = groups.begin(),
e = groups.end();
for (; i!=e; ++i)
for (auto& ctrlGroup : groups)
{
//std::vector<ControlGroup::Control*>::const_iterator
//ci = (*i)->controls.begin(),
//ce = (*i)->controls.end();
//for (; ci!=ce; ++ci)
//(*ci)->control_ref->device_qualifier = default_device;
// extension
if (GROUP_TYPE_EXTENSION == (*i)->type)
if (ctrlGroup->type == GROUP_TYPE_EXTENSION)
{
std::vector<ControllerEmu*>::const_iterator
ai = ((Extension*)*i)->attachments.begin(),
ae = ((Extension*)*i)->attachments.end();
for (; ai!=ae; ++ai)
for (auto& ai : ((Extension*)ctrlGroup.get())->attachments)
{
(*ai)->default_device = default_device;
(*ai)->UpdateDefaultDevice();
ai->default_device = default_device;
ai->UpdateDefaultDevice();
}
}
}
@@ -107,50 +45,42 @@ void ControllerEmu::ControlGroup::LoadConfig(IniFile::Section *sec, const std::s
std::string group(base + name); group += "/";
// settings
std::vector<ControlGroup::Setting*>::const_iterator
si = settings.begin(),
se = settings.end();
for (; si!=se; ++si)
for (auto& s : settings)
{
sec->Get((group+(*si)->name).c_str(), &(*si)->value, (*si)->default_value*100);
(*si)->value /= 100;
sec->Get((group + s->name).c_str(), &s->value, s->default_value * 100);
s->value /= 100;
}
// controls
std::vector<ControlGroup::Control*>::const_iterator
ci = controls.begin(),
ce = controls.end();
for (; ci!=ce; ++ci)
for (auto& c : controls)
{
// control expression
sec->Get((group + (*ci)->name).c_str(), &(*ci)->control_ref->expression, "");
sec->Get((group + c->name).c_str(), &c->control_ref->expression, "");
// range
sec->Get((group+(*ci)->name+"/Range").c_str(), &(*ci)->control_ref->range, 100.0f);
(*ci)->control_ref->range /= 100;
sec->Get((group + c->name + "/Range").c_str(), &c->control_ref->range, 100.0f);
c->control_ref->range /= 100;
}
// extensions
if (GROUP_TYPE_EXTENSION == type)
if (type == GROUP_TYPE_EXTENSION)
{
Extension* const ex = ((Extension*)this);
Extension* const ext = ((Extension*)this);
ex->switch_extension = 0;
ext->switch_extension = 0;
unsigned int n = 0;
std::string extname;
sec->Get((base + name).c_str(), &extname, "");
std::vector<ControllerEmu*>::const_iterator
ai = ((Extension*)this)->attachments.begin(),
ae = ((Extension*)this)->attachments.end();
for (; ai!=ae; ++ai,++n)
for (auto& ai : ext->attachments)
{
(*ai)->default_device.FromString(defdev);
(*ai)->LoadConfig(sec, base + (*ai)->GetName() + "/");
ai->default_device.FromString(defdev);
ai->LoadConfig(sec, base + ai->GetName() + "/");
if ((*ai)->GetName() == extname)
ex->switch_extension = n;
if (ai->GetName() == extname)
ext->switch_extension = n;
n++;
}
}
}
@@ -163,47 +93,35 @@ void ControllerEmu::LoadConfig(IniFile::Section *sec, const std::string& base)
sec->Get((base + "Device").c_str(), &defdev, "");
default_device.FromString(defdev);
}
std::vector<ControlGroup*>::const_iterator i = groups.begin(),
e = groups.end();
for (; i!=e; ++i)
(*i)->LoadConfig(sec, defdev, base);
for (auto& cg : groups)
cg->LoadConfig(sec, defdev, base);
}
void ControllerEmu::ControlGroup::SaveConfig(IniFile::Section *sec, const std::string& defdev, const std::string& base)
{
std::string group(base + name); group += "/";
// settings
std::vector<ControlGroup::Setting*>::const_iterator
si = settings.begin(),
se = settings.end();
for (; si!=se; ++si)
sec->Set((group+(*si)->name).c_str(), (*si)->value*100.0f, (*si)->default_value*100.0f);
for (auto& s : settings)
sec->Set((group + s->name).c_str(), s->value*100.0f, s->default_value*100.0f);
// controls
std::vector<ControlGroup::Control*>::const_iterator
ci = controls.begin(),
ce = controls.end();
for (; ci!=ce; ++ci)
for (auto& c : controls)
{
// control expression
sec->Set((group+(*ci)->name).c_str(), (*ci)->control_ref->expression, "");
sec->Set((group + c->name).c_str(), c->control_ref->expression, "");
// range
sec->Set((group+(*ci)->name+"/Range").c_str(), (*ci)->control_ref->range*100.0f, 100.0f);
sec->Set((group + c->name + "/Range").c_str(), c->control_ref->range*100.0f, 100.0f);
}
// extensions
if (GROUP_TYPE_EXTENSION == type)
if (type == GROUP_TYPE_EXTENSION)
{
Extension* const ext = ((Extension*)this);
sec->Set((base + name).c_str(), ext->attachments[ext->switch_extension]->GetName(), "None");
std::vector<ControllerEmu*>::const_iterator
ai = ((Extension*)this)->attachments.begin(),
ae = ((Extension*)this)->attachments.end();
for (; ai!=ae; ++ai)
(*ai)->SaveConfig(sec, base + (*ai)->GetName() + "/");
for (auto& ai : ext->attachments)
ai->SaveConfig(sec, base + ai->GetName() + "/");
}
}
@@ -213,60 +131,58 @@ void ControllerEmu::SaveConfig(IniFile::Section *sec, const std::string& base)
if (base.empty())
sec->Set((/*std::string(" ") +*/ base + "Device").c_str(), defdev, "");
std::vector<ControlGroup*>::const_iterator i = groups.begin(),
e = groups.end();
for (; i!=e; ++i)
(*i)->SaveConfig(sec, defdev, base);
for (auto& ctrlGroup : groups)
ctrlGroup->SaveConfig(sec, defdev, base);
}
ControllerEmu::AnalogStick::AnalogStick(const char* const _name) : ControlGroup(_name, GROUP_TYPE_STICK)
{
for (auto& named_direction : named_directions)
controls.push_back(new Input(named_direction));
controls.emplace_back(new Input(named_direction));
controls.push_back(new Input(_trans("Modifier")));
controls.emplace_back(new Input(_trans("Modifier")));
settings.push_back(new Setting(_trans("Radius"), 0.7f, 0, 100));
settings.push_back(new Setting(_trans("Dead Zone"), 0, 0, 50));
settings.push_back(new Setting(_trans("Square Stick"), 0));
settings.emplace_back(new Setting(_trans("Radius"), 0.7f, 0, 100));
settings.emplace_back(new Setting(_trans("Dead Zone"), 0, 0, 50));
settings.emplace_back(new Setting(_trans("Square Stick"), 0));
}
ControllerEmu::Buttons::Buttons(const char* const _name) : ControlGroup(_name, GROUP_TYPE_BUTTONS)
{
settings.push_back(new Setting(_trans("Threshold"), 0.5f));
settings.emplace_back(new Setting(_trans("Threshold"), 0.5f));
}
ControllerEmu::MixedTriggers::MixedTriggers(const char* const _name) : ControlGroup(_name, GROUP_TYPE_MIXED_TRIGGERS)
{
settings.push_back(new Setting(_trans("Threshold"), 0.9f));
settings.emplace_back(new Setting(_trans("Threshold"), 0.9f));
}
ControllerEmu::Triggers::Triggers(const char* const _name) : ControlGroup(_name, GROUP_TYPE_TRIGGERS)
{
settings.push_back(new Setting(_trans("Dead Zone"), 0, 0, 50));
settings.emplace_back(new Setting(_trans("Dead Zone"), 0, 0, 50));
}
ControllerEmu::Slider::Slider(const char* const _name) : ControlGroup(_name, GROUP_TYPE_SLIDER)
{
controls.push_back(new Input("Left"));
controls.push_back(new Input("Right"));
controls.emplace_back(new Input("Left"));
controls.emplace_back(new Input("Right"));
settings.push_back(new Setting(_trans("Dead Zone"), 0, 0, 50));
settings.emplace_back(new Setting(_trans("Dead Zone"), 0, 0, 50));
}
ControllerEmu::Force::Force(const char* const _name) : ControlGroup(_name, GROUP_TYPE_FORCE)
{
memset(m_swing, 0, sizeof(m_swing));
controls.push_back(new Input(_trans("Up")));
controls.push_back(new Input(_trans("Down")));
controls.push_back(new Input(_trans("Left")));
controls.push_back(new Input(_trans("Right")));
controls.push_back(new Input(_trans("Forward")));
controls.push_back(new Input(_trans("Backward")));
controls.emplace_back(new Input(_trans("Up")));
controls.emplace_back(new Input(_trans("Down")));
controls.emplace_back(new Input(_trans("Left")));
controls.emplace_back(new Input(_trans("Right")));
controls.emplace_back(new Input(_trans("Forward")));
controls.emplace_back(new Input(_trans("Backward")));
settings.push_back(new Setting(_trans("Dead Zone"), 0, 0, 50));
settings.emplace_back(new Setting(_trans("Dead Zone"), 0, 0, 50));
}
ControllerEmu::Tilt::Tilt(const char* const _name)
@@ -274,16 +190,16 @@ ControllerEmu::Tilt::Tilt(const char* const _name)
{
memset(m_tilt, 0, sizeof(m_tilt));
controls.push_back(new Input("Forward"));
controls.push_back(new Input("Backward"));
controls.push_back(new Input("Left"));
controls.push_back(new Input("Right"));
controls.emplace_back(new Input("Forward"));
controls.emplace_back(new Input("Backward"));
controls.emplace_back(new Input("Left"));
controls.emplace_back(new Input("Right"));
controls.push_back(new Input(_trans("Modifier")));
controls.emplace_back(new Input(_trans("Modifier")));
settings.push_back(new Setting(_trans("Dead Zone"), 0, 0, 50));
settings.push_back(new Setting(_trans("Circle Stick"), 0));
settings.push_back(new Setting(_trans("Angle"), 0.9f, 0, 180));
settings.emplace_back(new Setting(_trans("Dead Zone"), 0, 0, 50));
settings.emplace_back(new Setting(_trans("Circle Stick"), 0));
settings.emplace_back(new Setting(_trans("Angle"), 0.9f, 0, 180));
}
ControllerEmu::Cursor::Cursor(const char* const _name)
@@ -291,14 +207,14 @@ ControllerEmu::Cursor::Cursor(const char* const _name)
, m_z(0)
{
for (auto& named_direction : named_directions)
controls.push_back(new Input(named_direction));
controls.push_back(new Input("Forward"));
controls.push_back(new Input("Backward"));
controls.push_back(new Input(_trans("Hide")));
controls.emplace_back(new Input(named_direction));
controls.emplace_back(new Input("Forward"));
controls.emplace_back(new Input("Backward"));
controls.emplace_back(new Input(_trans("Hide")));
settings.push_back(new Setting(_trans("Center"), 0.5f));
settings.push_back(new Setting(_trans("Width"), 0.5f));
settings.push_back(new Setting(_trans("Height"), 0.5f));
settings.emplace_back(new Setting(_trans("Center"), 0.5f));
settings.emplace_back(new Setting(_trans("Width"), 0.5f));
settings.emplace_back(new Setting(_trans("Height"), 0.5f));
}
+38 -38
View File
@@ -9,6 +9,7 @@
#define NOMINMAX
#include <cmath>
#include <memory>
#include <vector>
#include <string>
#include <algorithm>
@@ -42,7 +43,7 @@ enum
SETTING_SQUARE,
};
const char * const named_directions[] =
const char* const named_directions[] =
{
"Up",
"Down",
@@ -61,13 +62,13 @@ public:
class Control
{
protected:
Control(ControllerInterface::ControlReference* const _ref, const char * const _name)
: control_ref(_ref), name(_name){}
public:
Control(ControllerInterface::ControlReference* const _ref, const char* const _name)
: control_ref(_ref), name(_name) {}
virtual ~Control();
ControllerInterface::ControlReference* const control_ref;
const char * const name;
public:
virtual ~Control() {}
std::unique_ptr<ControllerInterface::ControlReference> const control_ref;
const char* const name;
};
@@ -75,18 +76,16 @@ public:
{
public:
Input(const char * const _name)
Input(const char* const _name)
: Control(new ControllerInterface::InputReference, _name) {}
};
class Output : public Control
{
public:
Output(const char * const _name)
Output(const char* const _name)
: Control(new ControllerInterface::OutputReference, _name) {}
};
class Setting
@@ -94,30 +93,30 @@ public:
public:
Setting(const char* const _name, const ControlState def_value
, const unsigned int _low = 0, const unsigned int _high = 100 )
, const unsigned int _low = 0, const unsigned int _high = 100)
: name(_name)
, value(def_value)
, default_value(def_value)
, low(_low)
, high(_high){}
const char* const name;
ControlState value;
const ControlState default_value;
const unsigned int low, high;
const char* const name;
ControlState value;
const ControlState default_value;
const unsigned int low, high;
};
ControlGroup(const char* const _name, const unsigned int _type = GROUP_TYPE_OTHER) : name(_name), type(_type) {}
virtual ~ControlGroup();
virtual ~ControlGroup() {}
virtual void LoadConfig(IniFile::Section *sec, const std::string& defdev = "", const std::string& base = "" );
virtual void SaveConfig(IniFile::Section *sec, const std::string& defdev = "", const std::string& base = "" );
const char* const name;
const unsigned int type;
const char* const name;
const unsigned int type;
std::vector< Control* > controls;
std::vector< Setting* > settings;
std::vector<std::unique_ptr<Control>> controls;
std::vector<std::unique_ptr<Setting>> settings;
};
@@ -194,14 +193,12 @@ public:
template <typename C>
void GetState(C* const buttons, const C* bitmasks)
{
std::vector<Control*>::iterator
i = controls.begin(),
e = controls.end();
for (; i!=e; ++i, ++bitmasks)
for (auto& control : controls)
{
if ((*i)->control_ref->State() > settings[0]->value) // threshold
if (control->control_ref->State() > settings[0]->value) // threshold
*buttons |= *bitmasks;
bitmasks++;
}
}
@@ -287,12 +284,13 @@ public:
tmpf = ((state - (deadzone * sign(state))) / (1 - deadzone));
float &ax = m_swing[i >> 1];
*axis++ = (C)((tmpf - ax) * range + base);
*axis++ = (C)((tmpf - ax) * range + base);
ax = tmpf;
}
}
private:
float m_swing[3];
float m_swing[3];
};
class Tilt : public ControlGroup
@@ -370,8 +368,9 @@ public:
*y = C(m_tilt[1] * angle * range + base);
*x = C(m_tilt[0] * angle * range + base);
}
private:
float m_tilt[2];
float m_tilt[2];
};
class Cursor : public ControlGroup
@@ -415,7 +414,7 @@ public:
}
}
float m_z;
float m_z;
};
class Extension : public ControlGroup
@@ -425,17 +424,18 @@ public:
: ControlGroup(_name, GROUP_TYPE_EXTENSION)
, switch_extension(0)
, active_extension(0) {}
~Extension();
~Extension() {}
void GetState(u8* const data, const bool focus = true);
std::vector<ControllerEmu*> attachments;
std::vector<std::unique_ptr<ControllerEmu>> attachments;
int switch_extension;
int active_extension;
int switch_extension;
int active_extension;
};
virtual ~ControllerEmu();
virtual ~ControllerEmu() {}
virtual std::string GetName() const = 0;
@@ -447,9 +447,9 @@ public:
void UpdateReferences(ControllerInterface& devi);
std::vector< ControlGroup* > groups;
std::vector<std::unique_ptr<ControlGroup>> groups;
DeviceQualifier default_device;
DeviceQualifier default_device;
};
@@ -38,9 +38,9 @@ const float INPUT_DETECT_THRESHOLD = 0.55f;
ControllerInterface g_controller_interface;
//
// Init
// Init
//
// detect devices and inputs outputs / will make refresh function later
// Detect devices and inputs outputs / will make refresh function later
//
void ControllerInterface::Initialize()
{
@@ -79,31 +79,26 @@ if (GLWin.platform == EGL_PLATFORM_X11) {
}
//
// DeInit
// DeInit
//
// remove all devices/ call library cleanup functions
// Remove all devices/ call library cleanup functions
//
void ControllerInterface::Shutdown()
{
if (false == m_is_init)
if (!m_is_init)
return;
std::vector<Device*>::const_iterator
d = m_devices.begin(),
de = m_devices.end();
for ( ;d != de; ++d )
for (Device* d : m_devices)
{
std::vector<Device::Output*>::const_iterator
o = (*d)->Outputs().begin(),
oe = (*d)->Outputs().end();
// set outputs to ZERO before destroying device
for ( ;o!=oe; ++o)
(*o)->SetState(0);
// update output
(*d)->UpdateOutput();
// Set outputs to ZERO before destroying device
for (Device::Output* o : d->Outputs())
o->SetState(0);
//delete device
delete *d;
// Update output
d->UpdateOutput();
// Delete device
delete d;
}
m_devices.clear();
@@ -132,9 +127,9 @@ void ControllerInterface::Shutdown()
}
//
// SetHwnd
// SetHwnd
//
// sets the hwnd used for some crap when initializing, use before calling Init
// Sets the hwnd used for some crap when initializing, use before calling Init
//
void ControllerInterface::SetHwnd( void* const hwnd )
{
@@ -142,9 +137,9 @@ void ControllerInterface::SetHwnd( void* const hwnd )
}
//
// UpdateInput
// UpdateInput
//
// update input for all devices, return true if all devices returned successful
// Update input for all devices, return true if all devices returned successful
//
bool ControllerInterface::UpdateInput(const bool force)
{
@@ -153,16 +148,13 @@ bool ControllerInterface::UpdateInput(const bool force)
if (force)
lk.lock();
else if (!lk.try_lock())
return false;
return false;
size_t ok_count = 0;
std::vector<Device*>::const_iterator
d = m_devices.begin(),
e = m_devices.end();
for ( ;d != e; ++d )
for (Device* d : m_devices)
{
if ((*d)->UpdateInput())
if (d->UpdateInput())
++ok_count;
//else
// disabled. it might be causing problems
@@ -173,9 +165,9 @@ bool ControllerInterface::UpdateInput(const bool force)
}
//
// UpdateOutput
// UpdateOutput
//
// update output for all devices, return true if all devices returned successful
// Update output for all devices, return true if all devices returned successful
//
bool ControllerInterface::UpdateOutput(const bool force)
{
@@ -188,9 +180,9 @@ bool ControllerInterface::UpdateOutput(const bool force)
size_t ok_count = 0;
for (auto d = m_devices.cbegin(); d != m_devices.cend(); ++d)
for (Device* d : m_devices)
{
if ((*d)->UpdateOutput())
if (d->UpdateOutput())
++ok_count;
}
@@ -198,9 +190,9 @@ bool ControllerInterface::UpdateOutput(const bool force)
}
//
// InputReference :: State
// InputReference :: State
//
// get the state of an input reference
// Gets the state of an input reference
// override function for ControlReference::State ...
//
ControlState ControllerInterface::InputReference::State( const ControlState ignore )
@@ -212,11 +204,11 @@ ControlState ControllerInterface::InputReference::State( const ControlState igno
}
//
// OutputReference :: State
// OutputReference :: State
//
// set the state of all binded outputs
// overrides ControlReference::State .. combined them so i could make the gui simple / inputs == same as outputs one list
// i was lazy and it works so watever
// Set the state of all binded outputs
// overrides ControlReference::State .. combined them so I could make the GUI simple / inputs == same as outputs one list
// I was lazy and it works so watever
//
ControlState ControllerInterface::OutputReference::State(const ControlState state)
{
@@ -226,9 +218,9 @@ ControlState ControllerInterface::OutputReference::State(const ControlState stat
}
//
// UpdateReference
// UpdateReference
//
// updates a controlreference's binded devices/controls
// Updates a controlreference's binded devices/controls
// need to call this to re-parse a control reference's expression after changing it
//
void ControllerInterface::UpdateReference(ControllerInterface::ControlReference* ref
@@ -242,9 +234,9 @@ void ControllerInterface::UpdateReference(ControllerInterface::ControlReference*
}
//
// InputReference :: Detect
// InputReference :: Detect
//
// wait for input on all binded devices
// Wait for input on all binded devices
// supports not detecting inputs that were held down at the time of Detect start,
// which is useful for those crazy flightsticks that have certain buttons that are always held down
// or some crazy axes or something
@@ -294,7 +286,7 @@ Device::Control* ControllerInterface::InputReference::Detect(const unsigned int
}
//
// OutputReference :: Detect
// OutputReference :: Detect
//
// Totally different from the inputReference detect / I have them combined so it was simpler to make the GUI.
// The GUI doesn't know the difference between an input and an output / it's odd but I was lazy and it was easy

Some files were not shown because too many files have changed in this diff Show More