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