#ifndef ASH_SENSOR_INFO_SENSOR_PROVIDER_H_
#define ASH_SENSOR_INFO_SENSOR_PROVIDER_H_
#include <map>
#include <memory>
#include <string>
#include <vector>
#include "ash/accelerometer/accel_gyro_samples_observer.h"
#include "ash/accelerometer/accelerometer_constants.h"
#include "ash/ash_export.h"
#include "ash/sensor_info/sensor_types.h"
#include "base/gtest_prod_util.h"
#include "base/observer_list.h"
#include "chromeos/components/sensors/mojom/cros_sensor_service.mojom.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
namespace ash {
class SensorProviderTest;
class ASH_EXPORT SensorProvider
: public chromeos::sensors::mojom::SensorHalClient,
public chromeos::sensors::mojom::SensorServiceNewDevicesObserver {
public:
class DeviceState {
public:
DeviceState();
~DeviceState();
DeviceState(const DeviceState&) = delete;
DeviceState& operator=(const DeviceState&) = delete;
bool AllSensorsFound() const;
void Reset();
bool CompareUpdate(SensorUpdate update) const;
void AddSource(SensorType source);
void RemoveSource(SensorType source);
bool GetSource(SensorType source) const;
std::vector<bool> GetStatesForTesting() const;
private:
std::vector<bool> present_;
};
struct SensorData {
SensorData();
~SensorData();
bool ignored = false;
mojo::Remote<chromeos::sensors::mojom::SensorDevice> remote;
std::optional<SensorLocation> location;
std::optional<float> scale;
std::unique_ptr<ash::AccelGyroSamplesObserver> samples_observer;
};
SensorProvider();
SensorProvider(const SensorProvider&) = delete;
SensorProvider& operator=(const SensorProvider&) = delete;
~SensorProvider() override;
void SetUpChannel(mojo::PendingRemote<chromeos::sensors::mojom::SensorService>
pending_remote) override;
void OnNewDeviceAdded(
int32_t iio_device_id,
const std::vector<chromeos::sensors::mojom::DeviceType>& types) override;
void AddObserver(SensorObserver* observer);
void RemoveObserver(SensorObserver* observer);
void EnableSensorReading();
void StopSensorReading();
std::vector<bool> GetStateForTesting();
private:
FRIEND_TEST_ALL_PREFIXES(SensorProviderTest, CheckNoScale);
FRIEND_TEST_ALL_PREFIXES(SensorProviderTest, CheckNoLocation);
FRIEND_TEST_ALL_PREFIXES(SensorProviderTest, GetSamplesOfLidAccel);
FRIEND_TEST_ALL_PREFIXES(SensorProviderTest, GetSamplesOfLidAngleAndLidAccel);
FRIEND_TEST_ALL_PREFIXES(SensorProviderTest, GetSamplesOfBaseGyroscope);
FRIEND_TEST_ALL_PREFIXES(SensorProviderTest,
GetSamplesOfBaseGyroscopeAndBaseAccel);
FRIEND_TEST_ALL_PREFIXES(SensorProviderTest, AddSensorsWhileSampling);
FRIEND_TEST_ALL_PREFIXES(SensorProviderTest, GetSamplesOfAccelGyroDevices);
void QueryDevices();
void OnLidAngleIds(const std::vector<int32_t>& lid_angle_ids);
void OnAccelerometerIds(const std::vector<int32_t>& accelerometer_ids);
void OnGyroscopeIds(const std::vector<int32_t>& gyroscope_ids);
void RegisterSensorClient();
void OnSensorServiceDisconnect();
void OnSensorHalClientFailure();
void ResetSensorService();
void ResetStates();
void SetNewDevicesObserver();
void OnNewDevicesObserverDisconnect();
void RegisterSensor(chromeos::sensors::mojom::DeviceType device_type,
int32_t id);
void IgnoreSensor(chromeos::sensors::mojom::DeviceType device_type,
int32_t id);
void EnableSensorReadingInternal();
void OnSensorRemoteDisconnect(
chromeos::sensors::mojom::DeviceType device_type,
int32_t id,
uint32_t custom_reason_code,
const std::string& description);
void OnLidAngleValue(const std::vector<std::optional<std::string>>& values);
void OnAttributes(chromeos::sensors::mojom::DeviceType device_type,
int32_t id,
const std::vector<std::optional<std::string>>& values);
void CreateSensorSamplesObserver(
chromeos::sensors::mojom::DeviceType device_type,
int32_t id);
void OnSampleUpdatedCallback(chromeos::sensors::mojom::DeviceType device_type,
int iio_device_id,
std::vector<float> sample);
void NotifySensorUpdated(SensorUpdate update);
bool CheckSensorSamplesObserver();
void GetLidAngleUpdate();
std::map<SensorType, int32_t> type_to_sensor_id_;
std::map<int32_t, std::map<chromeos::sensors::mojom::DeviceType, SensorData>>
sensors_;
DeviceState current_state_;
mojo::Receiver<chromeos::sensors::mojom::SensorHalClient> sensor_hal_client_{
this};
mojo::Remote<chromeos::sensors::mojom::SensorService> sensor_service_remote_;
mojo::Receiver<chromeos::sensors::mojom::SensorServiceNewDevicesObserver>
new_devices_observer_{this};
SensorUpdate update_;
bool sensor_read_on_ = false;
base::ObserverList<SensorObserver> observers_;
base::WeakPtrFactory<SensorProvider> weak_ptr_factory_{this};
};
}
#endif