blob: 0b6f1b5a606758dcc964393cabf0426126e8b1b6 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'package:flutter/services.dart';
const EventChannel _accelerometerEventChannel =
EventChannel('plugins.flutter.io/sensors/accelerometer');
const EventChannel _userAccelerometerEventChannel =
EventChannel('plugins.flutter.io/sensors/user_accel');
const EventChannel _gyroscopeEventChannel =
EventChannel('plugins.flutter.io/sensors/gyroscope');
/// Discrete reading from an accelerometer. Accelerometers measure the velocity
/// of the device. Note that these readings include the effects of gravity. Put
/// simply, you can use accelerometer readings to tell if the device is moving in
/// a particular direction.
class AccelerometerEvent {
/// Contructs an instance with the given [x], [y], and [z] values.
AccelerometerEvent(this.x, this.y, this.z);
/// Acceleration force along the x axis (including gravity) measured in m/s^2.
///
/// When the device is held upright facing the user, positive values mean the
/// device is moving to the right and negative mean it is moving to the left.
final double x;
/// Acceleration force along the y axis (including gravity) measured in m/s^2.
///
/// When the device is held upright facing the user, positive values mean the
/// device is moving towards the sky and negative mean it is moving towards
/// the ground.
final double y;
/// Acceleration force along the z axis (including gravity) measured in m/s^2.
///
/// This uses a right-handed coordinate system. So when the device is held
/// upright and facing the user, positive values mean the device is moving
/// towards the user and negative mean it is moving away from them.
final double z;
@override
String toString() => '[AccelerometerEvent (x: $x, y: $y, z: $z)]';
}
/// Discrete reading from a gyroscope. Gyroscopes measure the rate or rotation of
/// the device in 3D space.
class GyroscopeEvent {
/// Contructs an instance with the given [x], [y], and [z] values.
GyroscopeEvent(this.x, this.y, this.z);
/// Rate of rotation around the x axis measured in rad/s.
///
/// When the device is held upright, this can also be thought of as describing
/// "pitch". The top of the device will tilt towards or away from the
/// user as this value changes.
final double x;
/// Rate of rotation around the y axis measured in rad/s.
///
/// When the device is held upright, this can also be thought of as describing
/// "yaw". The lengthwise edge of the device will rotate towards or away from
/// the user as this value changes.
final double y;
/// Rate of rotation around the z axis measured in rad/s.
///
/// When the device is held upright, this can also be thought of as describing
/// "roll". When this changes the face of the device should remain facing
/// forward, but the orientation will change from portrait to landscape and so
/// on.
final double z;
@override
String toString() => '[GyroscopeEvent (x: $x, y: $y, z: $z)]';
}
/// Like [AccelerometerEvent], this is a discrete reading from an accelerometer
/// and measures the velocity of the device. However, unlike
/// [AccelerometerEvent], this event does not include the effects of gravity.
class UserAccelerometerEvent {
/// Contructs an instance with the given [x], [y], and [z] values.
UserAccelerometerEvent(this.x, this.y, this.z);
/// Acceleration force along the x axis (excluding gravity) measured in m/s^2.
///
/// When the device is held upright facing the user, positive values mean the
/// device is moving to the right and negative mean it is moving to the left.
final double x;
/// Acceleration force along the y axis (excluding gravity) measured in m/s^2.
///
/// When the device is held upright facing the user, positive values mean the
/// device is moving towards the sky and negative mean it is moving towards
/// the ground.
final double y;
/// Acceleration force along the z axis (excluding gravity) measured in m/s^2.
///
/// This uses a right-handed coordinate system. So when the device is held
/// upright and facing the user, positive values mean the device is moving
/// towards the user and negative mean it is moving away from them.
final double z;
@override
String toString() => '[UserAccelerometerEvent (x: $x, y: $y, z: $z)]';
}
AccelerometerEvent _listToAccelerometerEvent(List<double> list) {
return AccelerometerEvent(list[0], list[1], list[2]);
}
UserAccelerometerEvent _listToUserAccelerometerEvent(List<double> list) {
return UserAccelerometerEvent(list[0], list[1], list[2]);
}
GyroscopeEvent _listToGyroscopeEvent(List<double> list) {
return GyroscopeEvent(list[0], list[1], list[2]);
}
Stream<AccelerometerEvent> _accelerometerEvents;
Stream<GyroscopeEvent> _gyroscopeEvents;
Stream<UserAccelerometerEvent> _userAccelerometerEvents;
/// A broadcast stream of events from the device accelerometer.
Stream<AccelerometerEvent> get accelerometerEvents {
if (_accelerometerEvents == null) {
_accelerometerEvents = _accelerometerEventChannel
.receiveBroadcastStream()
.map(
(dynamic event) => _listToAccelerometerEvent(event.cast<double>()));
}
return _accelerometerEvents;
}
/// A broadcast stream of events from the device gyroscope.
Stream<GyroscopeEvent> get gyroscopeEvents {
if (_gyroscopeEvents == null) {
_gyroscopeEvents = _gyroscopeEventChannel
.receiveBroadcastStream()
.map((dynamic event) => _listToGyroscopeEvent(event.cast<double>()));
}
return _gyroscopeEvents;
}
/// Events from the device accelerometer with gravity removed.
Stream<UserAccelerometerEvent> get userAccelerometerEvents {
if (_userAccelerometerEvents == null) {
_userAccelerometerEvents = _userAccelerometerEventChannel
.receiveBroadcastStream()
.map((dynamic event) =>
_listToUserAccelerometerEvent(event.cast<double>()));
}
return _userAccelerometerEvents;
}