Update to latest master

This commit is contained in:
german
2021-02-07 00:08:43 -06:00
parent e2523c3828
commit d4a28bbb74
4 changed files with 94 additions and 67 deletions

View File

@@ -112,7 +112,7 @@ void Joycons::SetJoyStickCal(std::vector<u8> buffer, JoyStick& axis1, JoyStick&
}
void Joycons::SetImuCal(Joycon& jc, std::vector<u8> buffer) {
for (size_t i = 0; i < jc.imu.size(); ++i) {
for (std::size_t i = 0; i < jc.imu.size(); ++i) {
jc.imu[i].acc.offset = (u16)(buffer[0 + (i * 2)] | (buffer[1 + (i * 2)] << 8));
jc.imu[i].acc.scale = (u16)(buffer[0 + 6 + (i * 2)] | (buffer[1 + 6 + (i * 2)] << 8));
jc.imu[i].gyr.offset = (u16)(buffer[0 + 12 + (i * 2)] | (buffer[1 + 12 + (i * 2)] << 8));
@@ -139,6 +139,8 @@ void Joycons::GetUserCalibrationData(Joycon& jc) {
buffer = ReadSPI(jc.handle, CalAddr::USER_RIGHT_DATA, 9);
SetJoyStickCal(buffer, jc.axis[2], jc.axis[3], false);
break;
case JoyControllerTypes::None:
break;
}
buffer = ReadSPI(jc.handle, CalAddr::USER_IMU_DATA, 24);
@@ -165,6 +167,8 @@ void Joycons::GetFactoryCalibrationData(Joycon& jc) {
buffer = ReadSPI(jc.handle, CalAddr::FACT_RIGHT_DATA, 9);
SetJoyStickCal(buffer, jc.axis[2], jc.axis[3], false);
break;
case JoyControllerTypes::None:
break;
}
buffer = ReadSPI(jc.handle, CalAddr::FACT_IMU_DATA, 24);
@@ -172,7 +176,7 @@ void Joycons::GetFactoryCalibrationData(Joycon& jc) {
hid_set_nonblocking(jc.handle, 1);
}
s16 Joycons::GetRawIMUValues(size_t sensor, size_t axis, std::vector<u8> buffer) {
s16 Joycons::GetRawIMUValues(std::size_t sensor, size_t axis, std::vector<u8> buffer) {
const size_t offset = (sensor * 6) + (axis * 2);
return static_cast<s16>(buffer[13 + offset] | (buffer[14 + offset] << 8));
}
@@ -210,12 +214,12 @@ f32 Joycons::TransformGyrValue(s16 raw, ImuData cal, GyrSensitivity sen) {
}
void Joycons::GetIMUValues(Joycon& jc, std::vector<u8> buffer) {
for (size_t i = 0; i < jc.imu.size(); ++i) {
for (std::size_t i = 0; i < jc.imu.size(); ++i) {
jc.imu[i].gyr.value = 0;
jc.imu[i].acc.value = 0;
}
for (size_t i = 0; i < jc.imu.size(); ++i) {
for (size_t sample = 0; sample < 3; ++sample) {
for (std::size_t i = 0; i < jc.imu.size(); ++i) {
for (std::size_t sample = 0; sample < 3; ++sample) {
const s16 raw_gyr = GetRawIMUValues((sample * 2) + 1, i, buffer);
const s16 raw_acc = GetRawIMUValues(sample * 2, i, buffer);
switch (i) {
@@ -276,7 +280,7 @@ void Joycons::GetProPadInput(Joycon& jc, std::vector<u8> buffer) {
jc.axis[3].value = static_cast<u16>((buffer[10] >> 4) | (buffer[11] << 4));
}
void Joycons::SetRumble(int port, f32 amp_high, f32 amp_low, f32 freq_high, f32 freq_low) {
void Joycons::SetRumble(std::size_t port, f32 amp_high, f32 amp_low, f32 freq_high, f32 freq_low) {
if (!DeviceConnected(port) || !joycon[port].rumble_enabled) {
return;
}
@@ -295,7 +299,7 @@ void Joycons::SetRumble(int port, f32 amp_high, f32 amp_low, f32 freq_high, f32
}
}
void Joycons::SendRumble(int port) {
void Joycons::SendRumble(std::size_t port) {
std::vector<u8> buffer(max_resp_size);
buffer[port] = static_cast<u8>(Output::RUMBLE_ONLY);
@@ -314,7 +318,7 @@ void Joycons::SendRumble(int port) {
u8 encoded_lamp =
static_cast<u8>(EncodeRumbleAmplification(joycon[port].hd_rumble.amp_low));
for (int i = 0; i < 2; ++i) {
for (u8 i = 0; i < 2; ++i) {
const u8 amplitude = i == 0 ? encoded_lamp : encoded_hamp;
const u8 offset = i * 4;
u32 encoded_amp = amplitude >> 1;
@@ -347,76 +351,76 @@ const f32 Joycons::EncodeRumbleAmplification(f32 amplification) {
return roundf((log2f(amplification) * 64) + 200);
}
const f32 Joycons::GetTemperatureCelcius(int port) {
const f32 Joycons::GetTemperatureCelcius(std::size_t port) {
if (!DeviceConnected(port)) {
return 0.0f;
}
return 25.0f + joycon[port].temperature * 0.0625f;
}
const f32 Joycons::GetTemperatureFahrenheit(int port) {
const f32 Joycons::GetTemperatureFahrenheit(std::size_t port) {
if (!DeviceConnected(port)) {
return 0.0f;
}
return GetTemperatureCelcius(port) * 1.8f + 32;
}
const u8 Joycons::GetBatteryLevel(int port) {
const u8 Joycons::GetBatteryLevel(std::size_t port) {
if (!DeviceConnected(port)) {
return 0x0;
}
return joycon[port].battery;
}
const std::array<u8, 15> Joycons::GetSerialNumber(int port) {
const std::array<u8, 15> Joycons::GetSerialNumber(std::size_t port) {
if (!DeviceConnected(port)) {
return {};
}
return joycon[port].serial_number;
}
const f32 Joycons::GetVersion(int port) {
const f32 Joycons::GetVersion(std::size_t port) {
if (!DeviceConnected(port)) {
return 0x0;
}
return joycon[port].version;
}
const JoyControllerTypes Joycons::GetDeviceType(int port) {
const JoyControllerTypes Joycons::GetDeviceType(std::size_t port) {
if (!DeviceConnected(port)) {
return JoyControllerTypes::None;
}
return joycon[port].type;
}
const std::array<u8, 6> Joycons::GetMac(int port) {
const std::array<u8, 6> Joycons::GetMac(std::size_t port) {
if (!DeviceConnected(port)) {
return {};
}
return joycon[port].mac;
}
const u32 Joycons::GetBodyColor(int port) {
const u32 Joycons::GetBodyColor(std::size_t port) {
if (!DeviceConnected(port)) {
return 0x0;
}
return joycon[port].color.body;
}
const u32 Joycons::GetButtonColor(int port) {
const u32 Joycons::GetButtonColor(std::size_t port) {
if (!DeviceConnected(port)) {
return 0x0;
}
return joycon[port].color.buttons;
}
const u32 Joycons::GetLeftGripColor(int port) {
const u32 Joycons::GetLeftGripColor(std::size_t port) {
if (!DeviceConnected(port)) {
return 0x0;
}
return joycon[port].color.left_grip;
}
const u32 Joycons::GetRightGripColor(int port) {
const u32 Joycons::GetRightGripColor(std::size_t port) {
if (!DeviceConnected(port)) {
return 0x0;
}
@@ -427,7 +431,7 @@ void Joycons::SetSerialNumber(Joycon& jc) {
std::vector<u8> buffer;
hid_set_nonblocking(jc.handle, 0);
buffer = ReadSPI(jc.handle, CalAddr::SERIAL_NUMBER, 16);
for (int i = 0; i < 15; i++) {
for (int i = 0; i < 15; ++i) {
jc.serial_number[i] = buffer[i + 1];
}
hid_set_nonblocking(jc.handle, 1);
@@ -457,7 +461,7 @@ void Joycons::SetMac(Joycon& jc) {
hid_get_serial_number_string(jc.handle, mac, std::size(mac));
for (int i = 0; i < 6; ++i) {
wchar_t value[3] = {mac[i * 2], mac[(i * 2) + 1]};
jc.mac[i] = std::stoi(value, 0, 16);
jc.mac[i] = static_cast<u8>(std::stoi(value, 0, 16));
}
}
@@ -532,6 +536,8 @@ void Joycons::UpdateJoyconData(Joycon& jc, std::vector<u8> buffer) {
jc.imu[2].acc.value = -jc.imu[2].acc.value;
}
break;
case JoyControllerTypes::None:
break;
}
const auto now = std::chrono::system_clock::now();
u64 difference =
@@ -540,7 +546,7 @@ void Joycons::UpdateJoyconData(Joycon& jc, std::vector<u8> buffer) {
Common::Vec3f acceleration =
Common::Vec3f(jc.imu[0].acc.value, jc.imu[1].acc.value, jc.imu[2].acc.value);
jc.motion->SetAcceleration(acceleration);
for (int i = 0; i < 3; i++) {
for (int i = 0; i < 3; ++i) {
jc.motion->SetGyroscope(jc.gyro[i]);
jc.motion->UpdateRotation(difference / 3);
jc.motion->UpdateOrientation(difference / 3);
@@ -548,14 +554,14 @@ void Joycons::UpdateJoyconData(Joycon& jc, std::vector<u8> buffer) {
jc.battery = buffer[2] >> 4;
}
void Joycons::UpdateYuzuSettings(Joycon& jc, int port) {
void Joycons::UpdateYuzuSettings(Joycon& jc, std::size_t port) {
if (DeviceConnected(port) && configuring) {
JCPadStatus pad;
if (jc.button != 0) {
pad.button = jc.button;
pad_queue[port].Push(pad);
}
for (size_t i = 0; i < jc.axis.size(); ++i) {
for (std::size_t i = 0; i < jc.axis.size(); ++i) {
const u16 value = jc.axis[i].value;
const u16 origin = jc.axis[i].center;
if (value != 0) {
@@ -566,7 +572,7 @@ void Joycons::UpdateYuzuSettings(Joycon& jc, int port) {
}
}
}
for (size_t i = 0; i < jc.imu.size(); ++i) {
for (std::size_t i = 0; i < jc.imu.size(); ++i) {
const f32 value = jc.imu[i].gyr.value;
const f32 value2 = jc.imu[i].acc.value;
if (value > 6.0f || value < -6.0f) {
@@ -589,8 +595,8 @@ void Joycons::JoyconToState(Joycon& jc, JCState& state) {
state.buttons.insert_or_assign(button_value, jc.button & button_value);
}
for (size_t i = 0; i < jc.axis.size(); ++i) {
f32 axis_value = jc.axis[i].value - jc.axis[i].center;
for (std::size_t i = 0; i < jc.axis.size(); ++i) {
f32 axis_value = static_cast<f32>(jc.axis[i].value - jc.axis[i].center);
if (axis_value > 0) {
axis_value = axis_value / jc.axis[i].max;
} else {
@@ -639,7 +645,7 @@ void Joycons::ReadLoop() {
std::vector<u8> buffer(max_resp_size);
while (adapter_thread_running) {
for (int port = 0; port < joycon.size(); ++port) {
for (std::size_t port = 0; port < joycon.size(); ++port) {
if (joycon[port].type != JoyControllerTypes::None) {
const int status =
@@ -665,7 +671,7 @@ void Joycons::ReadLoop() {
joycon[port].imu[1].acc.value, joycon[port].imu[2].acc.value,
joycon[port].imu[0].gyr.value, joycon[port].imu[1].gyr.value,
joycon[port].imu[2].gyr.value);
for (int i = 0; i < 7; i++) {
for (int i = 0; i < 7; ++i) {
printf("%02hx ", buffer[i]);
}
printf("\n");*/
@@ -678,12 +684,12 @@ void Joycons::ReadLoop() {
void Joycons::Setup() {
// Initialize all controllers as unplugged
for (size_t port = 0; port < joycon.size(); ++port) {
for (std::size_t port = 0; port < joycon.size(); ++port) {
joycon[port].type = JoyControllerTypes::None;
for (size_t i = 0; i < joycon[port].axis.size(); ++i) {
for (std::size_t i = 0; i < joycon[port].axis.size(); ++i) {
joycon[port].axis[i].value = 0;
}
for (size_t i = 0; i < joycon[port].imu.size(); ++i) {
for (std::size_t i = 0; i < joycon[port].imu.size(); ++i) {
joycon[port].imu[i].acc.value = 0;
joycon[port].imu[i].gyr.value = 0;
}
@@ -692,7 +698,7 @@ void Joycons::Setup() {
joycon[port].hd_rumble.freq_high = 160.0f;
joycon[port].hd_rumble.freq_low = 80.0f;
}
int port = 0;
std::size_t port = 0;
hid_device_info* devs = hid_enumerate(0x057e, 0x2006);
hid_device_info* cur_dev = devs;
@@ -760,7 +766,7 @@ void Joycons::Setup() {
GetJCEndpoint();
}
bool Joycons::CheckDeviceAccess(int port, hid_device_info* device) {
bool Joycons::CheckDeviceAccess(std::size_t port, hid_device_info* device) {
if (device->vendor_id != 0x057e ||
!(device->product_id == 0x2006 || device->product_id == 0x2007 ||
device->product_id == 0x2009)) {
@@ -841,10 +847,16 @@ std::string Joycons::JoyconName(std::size_t port) const {
switch (joycon[port].type) {
case JoyControllerTypes::Left:
return "Left Joycon";
break;
case JoyControllerTypes::Right:
return "Right Joycon";
break;
case JoyControllerTypes::Pro:
return "Pro Controller";
break;
case JoyControllerTypes::None:
return "Unknow Joycon";
break;
}
return "Unknow Joycon";
}

View File

@@ -197,19 +197,19 @@ public:
bool DeviceConnected(std::size_t port) const;
void SetRumble(int port, f32 amp_high, f32 amp_low, f32 freq_high, f32 freq_low);
void SetRumble(std::size_t port, f32 amp_high, f32 amp_low, f32 freq_high, f32 freq_low);
const f32 GetTemperatureCelcius(int port);
const f32 GetTemperatureFahrenheit(int port);
const u8 GetBatteryLevel(int port);
const std::array<u8, 15> GetSerialNumber(int port);
const f32 GetVersion(int port);
const JoyControllerTypes GetDeviceType(int port);
const std::array<u8, 6> GetMac(int port);
const u32 GetBodyColor(int port);
const u32 GetButtonColor(int port);
const u32 GetLeftGripColor(int port);
const u32 GetRightGripColor(int port);
const f32 GetTemperatureCelcius(std::size_t port);
const f32 GetTemperatureFahrenheit(std::size_t port);
const u8 GetBatteryLevel(std::size_t port);
const std::array<u8, 15> GetSerialNumber(std::size_t port);
const f32 GetVersion(std::size_t port);
const JoyControllerTypes GetDeviceType(std::size_t port);
const std::array<u8, 6> GetMac(std::size_t port);
const u32 GetBodyColor(std::size_t port);
const u32 GetButtonColor(std::size_t port);
const u32 GetLeftGripColor(std::size_t port);
const u32 GetRightGripColor(std::size_t port);
std::array<Common::SPSCQueue<JCPadStatus>, 4>& GetPadQueue();
const std::array<Common::SPSCQueue<JCPadStatus>, 4>& GetPadQueue() const;
@@ -314,7 +314,7 @@ private:
AccPerformance afrec);
// Sends rumble state
void SendRumble(int port);
void SendRumble(std::size_t port);
const f32 EncodeRumbleAmplification(f32 amplification);
// Reads color values
@@ -333,7 +333,7 @@ private:
void SetReportMode(Joycon& jc, ReportMode mode);
void UpdateJoyconData(Joycon& jc, std::vector<u8> buffer);
void UpdateYuzuSettings(Joycon& jc, int port);
void UpdateYuzuSettings(Joycon& jc, std::size_t port);
void JoyconToState(Joycon& jc, JCState& state);
std::string JoyconName(std::size_t port) const;
void ReadLoop();
@@ -342,7 +342,7 @@ private:
void ResetDeviceType(std::size_t port);
/// Returns true if we successfully gain access to JC Adapter
bool CheckDeviceAccess(int port, hid_device_info* device);
bool CheckDeviceAccess(std::size_t port, hid_device_info* device);
/// Captures JC Adapter endpoint address,
void GetJCEndpoint();

View File

@@ -231,8 +231,10 @@ void JCButtonFactory::EndConfiguration() {
class JCAnalog final : public Input::AnalogDevice {
public:
JCAnalog(int port_, int axis_x_, int axis_y_, float deadzone_, JCAdapter::Joycons* adapter)
: port(port_), axis_x(axis_x_), axis_y(axis_y_), deadzone(deadzone_), jcadapter(adapter) {}
JCAnalog(int port_, int axis_x_, int axis_y_, bool invert_x_, bool invert_y_, float deadzone_,
float range_, JCAdapter::Joycons* adapter)
: port(port_), axis_x(axis_x_), axis_y(axis_y_), invert_x(invert_x_), invert_y(invert_y_),
deadzone(deadzone_), range(range_), jcadapter(adapter) {}
float GetAxis(int axis) const {
if (jcadapter->DeviceConnected(port)) {
@@ -246,10 +248,15 @@ public:
return 0.0f;
}
std::pair<float, float> GetAnalog(int axis_x, int axis_y) const {
float x = GetAxis(axis_x);
float y = GetAxis(axis_y);
std::pair<float, float> GetAnalog(u32 analog_axis_x, u32 analog_axis_y) const {
float x = GetAxis(analog_axis_x);
float y = GetAxis(analog_axis_y);
if (invert_x) {
x = -x;
}
if (invert_y) {
y = -y;
}
// Make sure the coordinates are in the unit circle,
// otherwise normalize it.
float r = x * x + y * y;
@@ -292,7 +299,10 @@ private:
const int port;
const int axis_x;
const int axis_y;
const bool invert_x;
const bool invert_y;
const float deadzone;
const float range;
JCAdapter::Joycons* jcadapter;
mutable std::mutex mutex;
};
@@ -309,12 +319,18 @@ JCAnalogFactory::JCAnalogFactory(std::shared_ptr<JCAdapter::Joycons> adapter_)
* - "axis_y": the index of the axis to be bind as y-axis
*/
std::unique_ptr<Input::AnalogDevice> JCAnalogFactory::Create(const Common::ParamPackage& params) {
const int port = params.Get("port", 0);
const int axis_x = params.Get("axis_x", 0);
const int axis_y = params.Get("axis_y", 1);
const float deadzone = std::clamp(params.Get("deadzone", 0.0f), 0.0f, .99f);
const auto port = static_cast<u32>(params.Get("port", 0));
const auto axis_x = static_cast<u32>(params.Get("axis_x", 0));
const auto axis_y = static_cast<u32>(params.Get("axis_y", 1));
const auto deadzone = std::clamp(params.Get("deadzone", 0.0f), 0.0f, 1.0f);
const auto range = std::clamp(params.Get("range", 1.0f), 0.50f, 1.50f);
const std::string invert_x_value = params.Get("invert_x", "+");
const std::string invert_y_value = params.Get("invert_y", "+");
const bool invert_x = invert_x_value == "-";
const bool invert_y = invert_y_value == "-";
return std::make_unique<JCAnalog>(port, axis_x, axis_y, deadzone, adapter.get());
return std::make_unique<JCAnalog>(port, axis_x, axis_y, invert_x, invert_y, deadzone, range,
adapter.get());
}
void JCAnalogFactory::BeginConfiguration() {
@@ -340,7 +356,7 @@ Common::ParamPackage JCAnalogFactory::GetNextInput() {
analog_x_axis = axis;
controller_number = static_cast<int>(port);
} else if (analog_y_axis == -1 && analog_x_axis != axis &&
controller_number == port) {
controller_number == static_cast<int>(port)) {
analog_y_axis = axis;
}
} else if (pad.motion != JCAdapter::PadMotion::Undefined &&
@@ -350,7 +366,7 @@ Common::ParamPackage JCAnalogFactory::GetNextInput() {
analog_x_axis = axis;
controller_number = static_cast<int>(port);
} else if (analog_y_axis == -1 && analog_x_axis != axis &&
controller_number == port) {
controller_number == static_cast<int>(port)) {
analog_y_axis = axis;
}
}

View File

@@ -906,10 +906,9 @@ void ConfigureInputPlayer::UpdateUI() {
int slider_value;
auto& param = analogs_param[analog_id];
const bool is_controller = param.Get("engine", "") == "sdl" ||
param.Get("engine", "") == "gcpad" ||
param.Get("engine", "") == "mouse" ||
param.Get("engine", "") == "jcpad";
const bool is_controller =
param.Get("engine", "") == "sdl" || param.Get("engine", "") == "gcpad" ||
param.Get("engine", "") == "mouse" || param.Get("engine", "") == "jcpad";
if (is_controller) {
if (!param.Has("deadzone")) {
@@ -1270,7 +1269,7 @@ void ConfigureInputPlayer::SetPollingResult(const Common::ParamPackage& params,
input_subsystem->GetJCButtons()->EndConfiguration();
input_subsystem->GetJCAnalogs()->EndConfiguration();
input_subsystem->GetJCMotions()->EndConfiguration();
if (!abort) {
(*input_setter)(params);
}