summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/file_sys/vfs.cpp6
-rw-r--r--src/core/hid/emulated_console.cpp5
-rw-r--r--src/core/hid/emulated_controller.cpp20
-rw-r--r--src/core/hle/service/nifm/nifm.cpp88
4 files changed, 76 insertions, 43 deletions
diff --git a/src/core/file_sys/vfs.cpp b/src/core/file_sys/vfs.cpp
index 0f6618b31..639842401 100644
--- a/src/core/file_sys/vfs.cpp
+++ b/src/core/file_sys/vfs.cpp
@@ -194,9 +194,9 @@ std::size_t VfsFile::WriteBytes(const std::vector<u8>& data, std::size_t offset)
std::string VfsFile::GetFullPath() const {
if (GetContainingDirectory() == nullptr)
- return "/" + GetName();
+ return '/' + GetName();
- return GetContainingDirectory()->GetFullPath() + "/" + GetName();
+ return GetContainingDirectory()->GetFullPath() + '/' + GetName();
}
VirtualFile VfsDirectory::GetFileRelative(std::string_view path) const {
@@ -435,7 +435,7 @@ std::string VfsDirectory::GetFullPath() const {
if (IsRoot())
return GetName();
- return GetParentDirectory()->GetFullPath() + "/" + GetName();
+ return GetParentDirectory()->GetFullPath() + '/' + GetName();
}
bool ReadOnlyVfsDirectory::IsWritable() const {
diff --git a/src/core/hid/emulated_console.cpp b/src/core/hid/emulated_console.cpp
index 30c2e9d17..1c91bbe40 100644
--- a/src/core/hid/emulated_console.cpp
+++ b/src/core/hid/emulated_console.cpp
@@ -40,6 +40,11 @@ void EmulatedConsole::SetTouchParams() {
touch_params[index++] = std::move(touchscreen_param);
}
+ if (Settings::values.touch_from_button_maps.empty()) {
+ LOG_WARNING(Input, "touch_from_button_maps is unset by frontend config");
+ return;
+ }
+
const auto button_index =
static_cast<u64>(Settings::values.touch_from_button_map_index.GetValue());
const auto& touch_buttons = Settings::values.touch_from_button_maps[button_index].buttons;
diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp
index 5587ee097..71364c323 100644
--- a/src/core/hid/emulated_controller.cpp
+++ b/src/core/hid/emulated_controller.cpp
@@ -11,6 +11,11 @@
namespace Core::HID {
constexpr s32 HID_JOYSTICK_MAX = 0x7fff;
constexpr s32 HID_TRIGGER_MAX = 0x7fff;
+// Use a common UUID for TAS and Virtual Gamepad
+constexpr Common::UUID TAS_UUID =
+ Common::UUID{{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xA5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}};
+constexpr Common::UUID VIRTUAL_UUID =
+ Common::UUID{{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}};
EmulatedController::EmulatedController(NpadIdType npad_id_type_) : npad_id_type(npad_id_type_) {}
@@ -348,10 +353,6 @@ void EmulatedController::ReloadInput() {
}
}
- // Use a common UUID for TAS
- static constexpr Common::UUID TAS_UUID = Common::UUID{
- {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xA5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}};
-
// Register TAS devices. No need to force update
for (std::size_t index = 0; index < tas_button_devices.size(); ++index) {
if (!tas_button_devices[index]) {
@@ -377,10 +378,6 @@ void EmulatedController::ReloadInput() {
});
}
- // Use a common UUID for Virtual Gamepad
- static constexpr Common::UUID VIRTUAL_UUID = Common::UUID{
- {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}};
-
// Register virtual devices. No need to force update
for (std::size_t index = 0; index < virtual_button_devices.size(); ++index) {
if (!virtual_button_devices[index]) {
@@ -780,7 +777,12 @@ void EmulatedController::SetStick(const Common::Input::CallbackStatus& callback,
// Only read stick values that have the same uuid or are over the threshold to avoid flapping
if (controller.stick_values[index].uuid != uuid) {
- if (!stick_value.down && !stick_value.up && !stick_value.left && !stick_value.right) {
+ const bool is_tas = uuid == TAS_UUID;
+ if (is_tas && stick_value.x.value == 0 && stick_value.y.value == 0) {
+ return;
+ }
+ if (!is_tas && !stick_value.down && !stick_value.up && !stick_value.left &&
+ !stick_value.right) {
return;
}
}
diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp
index 4fa9f51a6..5d32adf64 100644
--- a/src/core/hle/service/nifm/nifm.cpp
+++ b/src/core/hle/service/nifm/nifm.cpp
@@ -22,15 +22,19 @@ namespace {
namespace Service::NIFM {
+// This is nn::nifm::RequestState
enum class RequestState : u32 {
NotSubmitted = 1,
- Error = 1, ///< The duplicate 1 is intentional; it means both not submitted and error on HW.
- Pending = 2,
- Connected = 3,
+ Invalid = 1, ///< The duplicate 1 is intentional; it means both not submitted and error on HW.
+ OnHold = 2,
+ Accepted = 3,
+ Blocking = 4,
};
-enum class InternetConnectionType : u8 {
- WiFi = 1,
+// This is nn::nifm::NetworkInterfaceType
+enum class NetworkInterfaceType : u32 {
+ Invalid = 0,
+ WiFi_Ieee80211 = 1,
Ethernet = 2,
};
@@ -42,14 +46,23 @@ enum class InternetConnectionStatus : u8 {
Connected,
};
+// This is nn::nifm::NetworkProfileType
+enum class NetworkProfileType : u32 {
+ User,
+ SsidList,
+ Temporary,
+};
+
+// This is nn::nifm::IpAddressSetting
struct IpAddressSetting {
bool is_automatic{};
- Network::IPv4Address current_address{};
+ Network::IPv4Address ip_address{};
Network::IPv4Address subnet_mask{};
- Network::IPv4Address gateway{};
+ Network::IPv4Address default_gateway{};
};
static_assert(sizeof(IpAddressSetting) == 0xD, "IpAddressSetting has incorrect size.");
+// This is nn::nifm::DnsSetting
struct DnsSetting {
bool is_automatic{};
Network::IPv4Address primary_dns{};
@@ -57,18 +70,26 @@ struct DnsSetting {
};
static_assert(sizeof(DnsSetting) == 0x9, "DnsSetting has incorrect size.");
+// This is nn::nifm::AuthenticationSetting
+struct AuthenticationSetting {
+ bool is_enabled{};
+ std::array<char, 0x20> user{};
+ std::array<char, 0x20> password{};
+};
+static_assert(sizeof(AuthenticationSetting) == 0x41, "AuthenticationSetting has incorrect size.");
+
+// This is nn::nifm::ProxySetting
struct ProxySetting {
- bool enabled{};
+ bool is_enabled{};
INSERT_PADDING_BYTES(1);
u16 port{};
std::array<char, 0x64> proxy_server{};
- bool automatic_auth_enabled{};
- std::array<char, 0x20> user{};
- std::array<char, 0x20> password{};
+ AuthenticationSetting authentication{};
INSERT_PADDING_BYTES(1);
};
static_assert(sizeof(ProxySetting) == 0xAA, "ProxySetting has incorrect size.");
+// This is nn::nifm::IpSettingData
struct IpSettingData {
IpAddressSetting ip_address_setting{};
DnsSetting dns_setting{};
@@ -101,6 +122,7 @@ static_assert(sizeof(NifmWirelessSettingData) == 0x70,
"NifmWirelessSettingData has incorrect size.");
#pragma pack(push, 1)
+// This is nn::nifm::detail::sf::NetworkProfileData
struct SfNetworkProfileData {
IpSettingData ip_setting_data{};
u128 uuid{};
@@ -114,13 +136,14 @@ struct SfNetworkProfileData {
};
static_assert(sizeof(SfNetworkProfileData) == 0x17C, "SfNetworkProfileData has incorrect size.");
+// This is nn::nifm::NetworkProfileData
struct NifmNetworkProfileData {
u128 uuid{};
std::array<char, 0x40> network_name{};
- u32 unknown_1{};
- u32 unknown_2{};
- u8 unknown_3{};
- u8 unknown_4{};
+ NetworkProfileType network_profile_type{};
+ NetworkInterfaceType network_interface_type{};
+ bool is_auto_connect{};
+ bool is_large_capacity{};
INSERT_PADDING_BYTES(2);
NifmWirelessSettingData wireless_setting_data{};
IpSettingData ip_setting_data{};
@@ -184,6 +207,7 @@ public:
event1 = CreateKEvent(service_context, "IRequest:Event1");
event2 = CreateKEvent(service_context, "IRequest:Event2");
+ state = RequestState::NotSubmitted;
}
~IRequest() override {
@@ -196,7 +220,7 @@ private:
LOG_WARNING(Service_NIFM, "(STUBBED) called");
if (state == RequestState::NotSubmitted) {
- UpdateState(RequestState::Pending);
+ UpdateState(RequestState::OnHold);
}
IPC::ResponseBuilder rb{ctx, 2};
@@ -219,14 +243,14 @@ private:
switch (state) {
case RequestState::NotSubmitted:
return has_connection ? ResultSuccess : ResultNetworkCommunicationDisabled;
- case RequestState::Pending:
+ case RequestState::OnHold:
if (has_connection) {
- UpdateState(RequestState::Connected);
+ UpdateState(RequestState::Accepted);
} else {
- UpdateState(RequestState::Error);
+ UpdateState(RequestState::Invalid);
}
return ResultPendingConnection;
- case RequestState::Connected:
+ case RequestState::Accepted:
default:
return ResultSuccess;
}
@@ -338,9 +362,9 @@ void IGeneralService::GetCurrentNetworkProfile(Kernel::HLERequestContext& ctx) {
.ip_setting_data{
.ip_address_setting{
.is_automatic{true},
- .current_address{Network::TranslateIPv4(net_iface->ip_address)},
+ .ip_address{Network::TranslateIPv4(net_iface->ip_address)},
.subnet_mask{Network::TranslateIPv4(net_iface->subnet_mask)},
- .gateway{Network::TranslateIPv4(net_iface->gateway)},
+ .default_gateway{Network::TranslateIPv4(net_iface->gateway)},
},
.dns_setting{
.is_automatic{true},
@@ -348,12 +372,14 @@ void IGeneralService::GetCurrentNetworkProfile(Kernel::HLERequestContext& ctx) {
.secondary_dns{1, 0, 0, 1},
},
.proxy_setting{
- .enabled{false},
+ .is_enabled{false},
.port{},
.proxy_server{},
- .automatic_auth_enabled{},
- .user{},
- .password{},
+ .authentication{
+ .is_enabled{},
+ .user{},
+ .password{},
+ },
},
.mtu{1500},
},
@@ -370,7 +396,7 @@ void IGeneralService::GetCurrentNetworkProfile(Kernel::HLERequestContext& ctx) {
// When we're connected to a room, spoof the hosts IP address
if (auto room_member = network.GetRoomMember().lock()) {
if (room_member->IsConnected()) {
- network_profile_data.ip_setting_data.ip_address_setting.current_address =
+ network_profile_data.ip_setting_data.ip_address_setting.ip_address =
room_member->GetFakeIpAddress();
}
}
@@ -444,9 +470,9 @@ void IGeneralService::GetCurrentIpConfigInfo(Kernel::HLERequestContext& ctx) {
return IpConfigInfo{
.ip_address_setting{
.is_automatic{true},
- .current_address{Network::TranslateIPv4(net_iface->ip_address)},
+ .ip_address{Network::TranslateIPv4(net_iface->ip_address)},
.subnet_mask{Network::TranslateIPv4(net_iface->subnet_mask)},
- .gateway{Network::TranslateIPv4(net_iface->gateway)},
+ .default_gateway{Network::TranslateIPv4(net_iface->gateway)},
},
.dns_setting{
.is_automatic{true},
@@ -459,7 +485,7 @@ void IGeneralService::GetCurrentIpConfigInfo(Kernel::HLERequestContext& ctx) {
// When we're connected to a room, spoof the hosts IP address
if (auto room_member = network.GetRoomMember().lock()) {
if (room_member->IsConnected()) {
- ip_config_info.ip_address_setting.current_address = room_member->GetFakeIpAddress();
+ ip_config_info.ip_address_setting.ip_address = room_member->GetFakeIpAddress();
}
}
@@ -480,7 +506,7 @@ void IGeneralService::GetInternetConnectionStatus(Kernel::HLERequestContext& ctx
LOG_WARNING(Service_NIFM, "(STUBBED) called");
struct Output {
- InternetConnectionType type{InternetConnectionType::WiFi};
+ u8 type{static_cast<u8>(NetworkInterfaceType::WiFi_Ieee80211)};
u8 wifi_strength{3};
InternetConnectionStatus state{InternetConnectionStatus::Connected};
};