diff --git a/SerialPrograms/Source/Controllers/ControllerStateTable.cpp b/SerialPrograms/Source/Controllers/ControllerStateTable.cpp index 64bfcd114..0516b25c3 100644 --- a/SerialPrograms/Source/Controllers/ControllerStateTable.cpp +++ b/SerialPrograms/Source/Controllers/ControllerStateTable.cpp @@ -11,6 +11,7 @@ #include "ControllerTypeStrings.h" #include "ControllerStateTable.h" +#include "NintendoSwitch/Controllers/NintendoSwitch_ControllerButtons.h" #include "NintendoSwitch/Controllers/Procon/NintendoSwitch_ProControllerTable.h" #include "NintendoSwitch/Controllers/Joycon/NintendoSwitch_JoyconTable.h" @@ -367,6 +368,46 @@ EnumDropdownDatabase ControllerCommandTables::make_database( +std::string get_joystick_direction(uint8_t x, uint8_t y){ + std::string direction = ""; + if (x > NintendoSwitch::STICK_CENTER){ + if (y > NintendoSwitch::STICK_CENTER){ + // right-down + direction = "\u2198"; + }else if (y == NintendoSwitch::STICK_CENTER){ + // right + direction = "\u2192"; + }else{ // y < STICK_CENTER + // right-up + direction = "\u2197"; + } + }else if (x == NintendoSwitch::STICK_CENTER){ + if (y > NintendoSwitch::STICK_CENTER){ + // down + direction = "\u2193"; + }else if (y == NintendoSwitch::STICK_CENTER){ + // neutral + direction = "neutral"; + }else{ // y < STICK_CENTER + // up + direction = "\u2191"; + } + + }else { // x < STICK_CENTER + if (y > NintendoSwitch::STICK_CENTER){ + // left-down + direction = "\u2199"; + }else if (y == NintendoSwitch::STICK_CENTER){ + // left + direction = "\u2190"; + }else{ // y < STICK_CENTER + // left-up + direction = "\u2196"; + } + } + + return direction; +} diff --git a/SerialPrograms/Source/Controllers/ControllerStateTable.h b/SerialPrograms/Source/Controllers/ControllerStateTable.h index b74f4351d..760c6d5e0 100644 --- a/SerialPrograms/Source/Controllers/ControllerStateTable.h +++ b/SerialPrograms/Source/Controllers/ControllerStateTable.h @@ -122,7 +122,7 @@ class ControllerCommandTables : public GroupOption, public ConfigOption::Listene }; - +std::string get_joystick_direction(uint8_t x, uint8_t y); diff --git a/SerialPrograms/Source/NintendoSwitch/Controllers/Joycon/NintendoSwitch_JoyconTable.cpp b/SerialPrograms/Source/NintendoSwitch/Controllers/Joycon/NintendoSwitch_JoyconTable.cpp index 9eb2994a2..b5267f7b8 100644 --- a/SerialPrograms/Source/NintendoSwitch/Controllers/Joycon/NintendoSwitch_JoyconTable.cpp +++ b/SerialPrograms/Source/NintendoSwitch/Controllers/Joycon/NintendoSwitch_JoyconTable.cpp @@ -53,6 +53,7 @@ void register_joycon_tables(){ ControllerCommandTable::make_row, { "Milliseconds", + "Action", "Buttons", "Joystick (X)", "Joystick (Y)", @@ -63,6 +64,7 @@ void register_joycon_tables(){ ControllerCommandTable::make_row, { "Milliseconds", + "Action", "Buttons", "Joystick (X)", "Joystick (Y)", @@ -71,6 +73,12 @@ void register_joycon_tables(){ } +JoyconStateRow::~JoyconStateRow(){ + DURATION.remove_listener(*this); + BUTTONS.remove_listener(*this); + JOYSTICK_X.remove_listener(*this); + JOYSTICK_Y.remove_listener(*this); +} @@ -87,11 +95,19 @@ JoyconStateRow::JoyconStateRow(EditableTableOption& parent_table) ) , JOYSTICK_X(LockMode::UNLOCK_WHILE_RUNNING, 128, 0, 255) , JOYSTICK_Y(LockMode::UNLOCK_WHILE_RUNNING, 128, 0, 255) + , ACTION(false, LockMode::UNLOCK_WHILE_RUNNING, "", "") { PA_ADD_OPTION(DURATION); + PA_ADD_OPTION(ACTION); PA_ADD_OPTION(BUTTONS); PA_ADD_OPTION(JOYSTICK_X); PA_ADD_OPTION(JOYSTICK_Y); + + JoyconStateRow::on_config_value_changed(this); + DURATION.add_listener(*this); + BUTTONS.add_listener(*this); + JOYSTICK_X.add_listener(*this); + JOYSTICK_Y.add_listener(*this); } std::unique_ptr JoyconStateRow::clone() const{ @@ -145,7 +161,37 @@ std::unique_ptr JoyconStateRow::get_state(Milliseconds& duratio +void JoyconStateRow::on_config_value_changed(void* object){ + JoyconState state; + get_state(state); + + ACTION.set(get_controller_action(state)); +} + + + +std::string get_controller_action(JoyconState& state){ + std::string action = ""; + if (state.buttons != BUTTON_NONE){ + action += "Button"; + } + + if (state.joystick_x != STICK_CENTER || state.joystick_y != STICK_CENTER){ + if (action != ""){ + action += ", "; + } + action += "Joystick"; + action += " " + get_joystick_direction(state.joystick_x, state.joystick_y); + + } + + if (action == ""){ + return "Wait"; + } + + return action; +} diff --git a/SerialPrograms/Source/NintendoSwitch/Controllers/Joycon/NintendoSwitch_JoyconTable.h b/SerialPrograms/Source/NintendoSwitch/Controllers/Joycon/NintendoSwitch_JoyconTable.h index 2a11004f8..8aced4f04 100644 --- a/SerialPrograms/Source/NintendoSwitch/Controllers/Joycon/NintendoSwitch_JoyconTable.h +++ b/SerialPrograms/Source/NintendoSwitch/Controllers/Joycon/NintendoSwitch_JoyconTable.h @@ -10,6 +10,7 @@ #include "Common/Cpp/Options/SimpleIntegerOption.h" #include "Common/Cpp/Options/TimeDurationOption.h" #include "Common/Cpp/Options/CheckboxDropdownOption.h" +#include "Common/Cpp/Options/StringOption.h" #include "Controllers/ControllerStateTable.h" #include "NintendoSwitch_JoyconState.h" @@ -19,8 +20,9 @@ namespace NintendoSwitch{ -class JoyconStateRow : public ControllerStateRow{ +class JoyconStateRow : public ControllerStateRow, public ConfigOption::Listener{ public: + ~JoyconStateRow(); JoyconStateRow(EditableTableOption& parent_table); virtual std::unique_ptr clone() const override; @@ -31,16 +33,23 @@ class JoyconStateRow : public ControllerStateRow{ void get_state(JoyconState& state) const; virtual std::unique_ptr get_state(Milliseconds& duration) const override; +private: + virtual void on_config_value_changed(void* object) override; + + private: MillisecondsCell DURATION; CheckboxDropdownCell