6 changed files with 423 additions and 3 deletions
-
1src/core/CMakeLists.txt
-
59src/core/hid/emulated_controller.cpp
-
40src/core/hid/emulated_controller.h
-
14src/core/hid/input_converter.cpp
-
8src/core/hid/input_converter.h
-
304src/core/hid/irs_types.h
@ -0,0 +1,304 @@ |
|||||
|
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project |
||||
|
// SPDX-License-Identifier: GPL-3.0-or-later |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include "common/common_funcs.h" |
||||
|
#include "common/common_types.h" |
||||
|
#include "core/hid/hid_types.h" |
||||
|
|
||||
|
namespace Core::IrSensor { |
||||
|
|
||||
|
// This is nn::irsensor::CameraAmbientNoiseLevel |
||||
|
enum class CameraAmbientNoiseLevel : u32 { |
||||
|
Low, |
||||
|
Medium, |
||||
|
High, |
||||
|
Unkown3, // This level can't be reached |
||||
|
}; |
||||
|
|
||||
|
// This is nn::irsensor::CameraLightTarget |
||||
|
enum class CameraLightTarget : u32 { |
||||
|
AllLeds, |
||||
|
BrightLeds, |
||||
|
DimLeds, |
||||
|
None, |
||||
|
}; |
||||
|
|
||||
|
// This is nn::irsensor::PackedCameraLightTarget |
||||
|
enum class PackedCameraLightTarget : u8 { |
||||
|
AllLeds, |
||||
|
BrightLeds, |
||||
|
DimLeds, |
||||
|
None, |
||||
|
}; |
||||
|
|
||||
|
// This is nn::irsensor::AdaptiveClusteringMode |
||||
|
enum class AdaptiveClusteringMode : u32 { |
||||
|
StaticFov, |
||||
|
DynamicFov, |
||||
|
}; |
||||
|
|
||||
|
// This is nn::irsensor::AdaptiveClusteringTargetDistance |
||||
|
enum class AdaptiveClusteringTargetDistance : u32 { |
||||
|
Near, |
||||
|
Middle, |
||||
|
Far, |
||||
|
}; |
||||
|
|
||||
|
// This is nn::irsensor::ImageTransferProcessorFormat |
||||
|
enum class ImageTransferProcessorFormat : u32 { |
||||
|
Size320x240, |
||||
|
Size160x120, |
||||
|
Size80x60, |
||||
|
Size40x30, |
||||
|
Size20x15, |
||||
|
}; |
||||
|
|
||||
|
// This is nn::irsensor::PackedImageTransferProcessorFormat |
||||
|
enum class PackedImageTransferProcessorFormat : u8 { |
||||
|
Size320x240, |
||||
|
Size160x120, |
||||
|
Size80x60, |
||||
|
Size40x30, |
||||
|
Size20x15, |
||||
|
}; |
||||
|
|
||||
|
// This is nn::irsensor::IrCameraStatus |
||||
|
enum class IrCameraStatus : u32 { |
||||
|
Available, |
||||
|
Unsupported, |
||||
|
Unconnected, |
||||
|
}; |
||||
|
|
||||
|
// This is nn::irsensor::IrCameraInternalStatus |
||||
|
enum class IrCameraInternalStatus : u32 { |
||||
|
Stopped, |
||||
|
FirmwareUpdateNeeded, |
||||
|
Unkown2, |
||||
|
Unkown3, |
||||
|
Unkown4, |
||||
|
FirmwareVersionRequested, |
||||
|
FirmwareVersionIsInvalid, |
||||
|
Ready, |
||||
|
Setting, |
||||
|
}; |
||||
|
|
||||
|
// This is nn::irsensor::detail::StatusManager::IrSensorMode |
||||
|
enum class IrSensorMode : u64 { |
||||
|
None, |
||||
|
MomentProcessor, |
||||
|
ClusteringProcessor, |
||||
|
ImageTransferProcessor, |
||||
|
PointingProcessorMarker, |
||||
|
TeraPluginProcessor, |
||||
|
IrLedProcessor, |
||||
|
}; |
||||
|
|
||||
|
// This is nn::irsensor::ImageProcessorStatus |
||||
|
enum ImageProcessorStatus : u32 { |
||||
|
Stopped, |
||||
|
Running, |
||||
|
}; |
||||
|
|
||||
|
// This is nn::irsensor::HandAnalysisMode |
||||
|
enum class HandAnalysisMode : u32 { |
||||
|
None, |
||||
|
Silhouette, |
||||
|
Image, |
||||
|
SilhoueteAndImage, |
||||
|
SilhuetteOnly, |
||||
|
}; |
||||
|
|
||||
|
// This is nn::irsensor::IrSensorFunctionLevel |
||||
|
enum class IrSensorFunctionLevel : u8 { |
||||
|
unknown0, |
||||
|
unknown1, |
||||
|
unknown2, |
||||
|
unknown3, |
||||
|
unknown4, |
||||
|
}; |
||||
|
|
||||
|
// This is nn::irsensor::MomentProcessorPreprocess |
||||
|
enum class MomentProcessorPreprocess : u32 { |
||||
|
Unkown0, |
||||
|
Unkown1, |
||||
|
}; |
||||
|
|
||||
|
// This is nn::irsensor::PackedMomentProcessorPreprocess |
||||
|
enum class PackedMomentProcessorPreprocess : u8 { |
||||
|
Unkown0, |
||||
|
Unkown1, |
||||
|
}; |
||||
|
|
||||
|
// This is nn::irsensor::PointingStatus |
||||
|
enum class PointingStatus : u32 { |
||||
|
Unkown0, |
||||
|
Unkown1, |
||||
|
}; |
||||
|
|
||||
|
struct IrsRect { |
||||
|
s16 x; |
||||
|
s16 y; |
||||
|
s16 width; |
||||
|
s16 height; |
||||
|
}; |
||||
|
|
||||
|
struct IrsCentroid { |
||||
|
f32 x; |
||||
|
f32 y; |
||||
|
}; |
||||
|
|
||||
|
struct CameraConfig { |
||||
|
u64 exposure_time; |
||||
|
CameraLightTarget light_target; |
||||
|
u32 gain; |
||||
|
bool is_negative_used; |
||||
|
INSERT_PADDING_BYTES(7); |
||||
|
}; |
||||
|
static_assert(sizeof(CameraConfig) == 0x18, "CameraConfig is an invalid size"); |
||||
|
|
||||
|
struct PackedCameraConfig { |
||||
|
u64 exposure_time; |
||||
|
PackedCameraLightTarget light_target; |
||||
|
u8 gain; |
||||
|
bool is_negative_used; |
||||
|
INSERT_PADDING_BYTES(5); |
||||
|
}; |
||||
|
static_assert(sizeof(PackedCameraConfig) == 0x10, "PackedCameraConfig is an invalid size"); |
||||
|
|
||||
|
// This is nn::irsensor::IrCameraHandle |
||||
|
struct IrCameraHandle { |
||||
|
u8 npad_id{}; |
||||
|
Core::HID::NpadStyleIndex npad_type{Core::HID::NpadStyleIndex::None}; |
||||
|
INSERT_PADDING_BYTES(2); |
||||
|
}; |
||||
|
static_assert(sizeof(IrCameraHandle) == 4, "IrCameraHandle is an invalid size"); |
||||
|
|
||||
|
// This is nn::irsensor::PackedMcuVersion |
||||
|
struct PackedMcuVersion { |
||||
|
u16 major; |
||||
|
u16 minor; |
||||
|
}; |
||||
|
static_assert(sizeof(PackedMcuVersion) == 4, "PackedMcuVersion is an invalid size"); |
||||
|
|
||||
|
// This is nn::irsensor::PackedMomentProcessorConfig |
||||
|
struct PackedMomentProcessorConfig { |
||||
|
PackedCameraConfig camera_config; |
||||
|
IrsRect window_of_interest; |
||||
|
PackedMcuVersion required_mcu_version; |
||||
|
PackedMomentProcessorPreprocess preprocess; |
||||
|
u8 preprocess_intensity_threshold; |
||||
|
INSERT_PADDING_BYTES(2); |
||||
|
}; |
||||
|
static_assert(sizeof(PackedMomentProcessorConfig) == 0x20, |
||||
|
"PackedMomentProcessorConfig is an invalid size"); |
||||
|
|
||||
|
// This is nn::irsensor::PackedClusteringProcessorConfig |
||||
|
struct PackedClusteringProcessorConfig { |
||||
|
PackedCameraConfig camera_config; |
||||
|
IrsRect window_of_interest; |
||||
|
PackedMcuVersion required_mcu_version; |
||||
|
u32 pixel_count_min; |
||||
|
u32 pixel_count_max; |
||||
|
u32 object_intensity_min; |
||||
|
bool is_external_light_filter_enabled; |
||||
|
INSERT_PADDING_BYTES(2); |
||||
|
}; |
||||
|
static_assert(sizeof(PackedClusteringProcessorConfig) == 0x30, |
||||
|
"PackedClusteringProcessorConfig is an invalid size"); |
||||
|
|
||||
|
// This is nn::irsensor::PackedImageTransferProcessorConfig |
||||
|
struct PackedImageTransferProcessorConfig { |
||||
|
PackedCameraConfig camera_config; |
||||
|
PackedMcuVersion required_mcu_version; |
||||
|
PackedImageTransferProcessorFormat format; |
||||
|
INSERT_PADDING_BYTES(3); |
||||
|
}; |
||||
|
static_assert(sizeof(PackedImageTransferProcessorConfig) == 0x18, |
||||
|
"PackedImageTransferProcessorConfig is an invalid size"); |
||||
|
|
||||
|
// This is nn::irsensor::PackedTeraPluginProcessorConfig |
||||
|
struct PackedTeraPluginProcessorConfig { |
||||
|
PackedMcuVersion required_mcu_version; |
||||
|
u8 mode; |
||||
|
u8 unknown_1; |
||||
|
u8 unknown_2; |
||||
|
u8 unknown_3; |
||||
|
}; |
||||
|
static_assert(sizeof(PackedTeraPluginProcessorConfig) == 0x8, |
||||
|
"PackedTeraPluginProcessorConfig is an invalid size"); |
||||
|
|
||||
|
// This is nn::irsensor::PackedPointingProcessorConfig |
||||
|
struct PackedPointingProcessorConfig { |
||||
|
IrsRect window_of_interest; |
||||
|
PackedMcuVersion required_mcu_version; |
||||
|
}; |
||||
|
static_assert(sizeof(PackedPointingProcessorConfig) == 0xC, |
||||
|
"PackedPointingProcessorConfig is an invalid size"); |
||||
|
|
||||
|
// This is nn::irsensor::PackedFunctionLevel |
||||
|
struct PackedFunctionLevel { |
||||
|
IrSensorFunctionLevel function_level; |
||||
|
INSERT_PADDING_BYTES(3); |
||||
|
}; |
||||
|
static_assert(sizeof(PackedFunctionLevel) == 0x4, "PackedFunctionLevel is an invalid size"); |
||||
|
|
||||
|
// This is nn::irsensor::PackedImageTransferProcessorExConfig |
||||
|
struct PackedImageTransferProcessorExConfig { |
||||
|
PackedCameraConfig camera_config; |
||||
|
PackedMcuVersion required_mcu_version; |
||||
|
PackedImageTransferProcessorFormat origin_format; |
||||
|
PackedImageTransferProcessorFormat trimming_format; |
||||
|
u16 trimming_start_x; |
||||
|
u16 trimming_start_y; |
||||
|
bool is_external_light_filter_enabled; |
||||
|
INSERT_PADDING_BYTES(5); |
||||
|
}; |
||||
|
static_assert(sizeof(PackedImageTransferProcessorExConfig) == 0x20, |
||||
|
"PackedImageTransferProcessorExConfig is an invalid size"); |
||||
|
|
||||
|
// This is nn::irsensor::PackedIrLedProcessorConfig |
||||
|
struct PackedIrLedProcessorConfig { |
||||
|
PackedMcuVersion required_mcu_version; |
||||
|
u8 light_target; |
||||
|
INSERT_PADDING_BYTES(3); |
||||
|
}; |
||||
|
static_assert(sizeof(PackedIrLedProcessorConfig) == 0x8, |
||||
|
"PackedIrLedProcessorConfig is an invalid size"); |
||||
|
|
||||
|
// This is nn::irsensor::HandAnalysisConfig |
||||
|
struct HandAnalysisConfig { |
||||
|
HandAnalysisMode mode; |
||||
|
}; |
||||
|
static_assert(sizeof(HandAnalysisConfig) == 0x4, "HandAnalysisConfig is an invalid size"); |
||||
|
|
||||
|
// This is nn::irsensor::detail::ProcessorState |
||||
|
struct ProcessorState { |
||||
|
u64 start{}; |
||||
|
u32 count{}; |
||||
|
INSERT_PADDING_BYTES(4); |
||||
|
std::array<u8, 0xE10> processor_raw_data{}; |
||||
|
}; |
||||
|
static_assert(sizeof(ProcessorState) == 0xE20, "ProcessorState is an invalid size"); |
||||
|
|
||||
|
// This is nn::irsensor::detail::DeviceFormat |
||||
|
struct DeviceFormat { |
||||
|
Core::IrSensor::IrCameraStatus camera_status{Core::IrSensor::IrCameraStatus::Unconnected}; |
||||
|
Core::IrSensor::IrCameraInternalStatus camera_internal_status{ |
||||
|
Core::IrSensor::IrCameraInternalStatus::Ready}; |
||||
|
Core::IrSensor::IrSensorMode mode{Core::IrSensor::IrSensorMode::None}; |
||||
|
ProcessorState state{}; |
||||
|
}; |
||||
|
static_assert(sizeof(DeviceFormat) == 0xE30, "DeviceFormat is an invalid size"); |
||||
|
|
||||
|
// This is nn::irsensor::ImageTransferProcessorState |
||||
|
struct ImageTransferProcessorState { |
||||
|
u64 sampling_number; |
||||
|
Core::IrSensor::CameraAmbientNoiseLevel ambient_noise_level; |
||||
|
INSERT_PADDING_BYTES(4); |
||||
|
}; |
||||
|
static_assert(sizeof(ImageTransferProcessorState) == 0x10, |
||||
|
"ImageTransferProcessorState is an invalid size"); |
||||
|
|
||||
|
} // namespace Core::IrSensor |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue