#ifndef DEVICE_VR_ORIENTATION_ORIENTATION_DEVICE_H_
#define DEVICE_VR_ORIENTATION_ORIENTATION_DEVICE_H_
#include <memory>
#include "base/component_export.h"
#include "base/functional/callback_forward.h"
#include "base/threading/simple_thread.h"
#include "build/build_config.h"
#include "device/vr/public/mojom/vr_service.mojom.h"
#include "device/vr/vr_device_base.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/device/public/mojom/sensor_provider.mojom.h"
#include "ui/gfx/geometry/quaternion.h"
namespace device {
class SensorReadingSharedBufferReader;
class VROrientationSession;
static constexpr mojom::SensorType kOrientationSensorType =
#if BUILDFLAG(IS_WIN)
mojom::SensorType::ABSOLUTE_ORIENTATION_QUATERNION;
#else
mojom::SensorType::RELATIVE_ORIENTATION_QUATERNION;
#endif
class COMPONENT_EXPORT(VR_ORIENTATION) VROrientationDevice
: public VRDeviceBase,
public mojom::SensorClient {
public:
VROrientationDevice(mojom::SensorProvider* sensor_provider,
base::OnceClosure ready_callback);
~VROrientationDevice() override;
void RequestSession(
mojom::XRRuntimeSessionOptionsPtr options,
mojom::XRRuntime::RequestSessionCallback callback) override;
void ShutdownSession(mojom::XRRuntime::ShutdownSessionCallback) override;
bool IsAvailable() const { return available_; }
void EndMagicWindowSession(VROrientationSession* session);
virtual void GetInlineFrameData(
mojom::XRFrameDataProvider::GetFrameDataCallback callback);
private:
void RaiseError() override;
void SensorReadingChanged() override {}
void SensorReady(device::mojom::SensorCreationResult result,
device::mojom::SensorInitParamsPtr params);
void HandleSensorError();
void OnSensorAddConfiguration(bool success);
gfx::Quaternion SensorSpaceToWorldSpace(gfx::Quaternion q);
gfx::Quaternion WorldSpaceToUserOrientedSpace(gfx::Quaternion q);
bool available_ = false;
base::OnceClosure ready_callback_;
std::optional<gfx::Quaternion> base_pose_;
gfx::Quaternion latest_pose_;
mojo::Remote<mojom::Sensor> sensor_;
std::unique_ptr<SensorReadingSharedBufferReader> shared_buffer_reader_;
mojo::Receiver<mojom::SensorClient> receiver_{this};
std::vector<std::unique_ptr<VROrientationSession>> magic_window_sessions_;
};
}
#endif