From 8778d6cf554fce636c25d32b27c76926d11d176e Mon Sep 17 00:00:00 2001 From: Zabadam <65806473+Zabadam@users.noreply.github.com> Date: Fri, 30 Jul 2021 23:58:24 -0500 Subject: [PATCH 1/9] feat(sensors_plus): add magnetometer support Added necessary Android, iOS, and web API for magnetometer sensor. Adds new `MagnetometerEvent` class (and fixes small typo in constructor of other `FooEvent` classes). Adds new `Stream` called `magnetometerEvents`. --- .../sensors_plus/sensors_plus/CHANGELOG.md | 4 ++ packages/sensors_plus/sensors_plus/README.md | 30 +++++--- .../plus/sensors/SensorsPlugin.java | 11 +++ .../plus/sensors/StreamHandlerImpl.java | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../sensors_plus/example/lib/main.dart | 21 ++++++ .../ios/Classes/FLTSensorsPlusPlugin.h | 3 + .../ios/Classes/FLTSensorsPlusPlugin.m | 27 +++++++ .../sensors_plus/ios/sensors_plus.podspec | 16 ++--- .../sensors_plus/lib/sensors_plus.dart | 5 ++ .../sensors_plus/lib/src/sensors.dart | 6 ++ .../sensors_plus/sensors_plus/pubspec.yaml | 10 +-- .../sensors_plus/test/sensors_test.dart | 12 ++++ .../CHANGELOG.md | 4 ++ .../sensors_plus_platform_interface/README.md | 4 +- .../lib/sensors_plus_platform_interface.dart | 7 ++ .../lib/src/accelerometer_event.dart | 2 +- .../lib/src/gyroscope_event.dart | 2 +- .../lib/src/magnetometer_event.dart | 20 ++++++ .../lib/src/method_channel_sensors.dart | 15 ++++ .../lib/src/user_accelerometer_event.dart | 2 +- .../pubspec.yaml | 2 +- .../sensors_plus_platform_interface_test.dart | 17 +++++ .../sensors_plus_web/CHANGELOG.md | 4 ++ .../sensors_plus/sensors_plus_web/README.md | 4 +- .../lib/sensors_plus_web.dart | 5 ++ .../sensors_plus_web/lib/src/sensors.dart | 70 ++++++++++++++++--- .../sensors_plus_web/lib/src/utils.dart | 15 ++-- .../sensors_plus_web/pubspec.yaml | 4 +- 29 files changed, 284 insertions(+), 47 deletions(-) create mode 100644 packages/sensors_plus/sensors_plus_platform_interface/lib/src/magnetometer_event.dart diff --git a/packages/sensors_plus/sensors_plus/CHANGELOG.md b/packages/sensors_plus/sensors_plus/CHANGELOG.md index fba091e699..28759a258d 100644 --- a/packages/sensors_plus/sensors_plus/CHANGELOG.md +++ b/packages/sensors_plus/sensors_plus/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.0 + +- Adds magnetometer support + ## 1.0.2 - Android: migrate to mavenCentral diff --git a/packages/sensors_plus/sensors_plus/README.md b/packages/sensors_plus/sensors_plus/README.md index c8d35da6c3..5278df0ee9 100644 --- a/packages/sensors_plus/sensors_plus/README.md +++ b/packages/sensors_plus/sensors_plus/README.md @@ -7,20 +7,22 @@

build

-A Flutter plugin to access the accelerometer and gyroscope sensors. + +A Flutter plugin to access the accelerometer, gyroscope, and magnetometer +sensors. ## Platform Support -| Android | iOS | MacOS | Web | Linux | Windows | -| :-----: | :-: | :---: | :-: | :---: | :----: | -| ✔️ | ✔️ | | ✔️ | | | +| Android | iOS | MacOS | Web | Linux | Windows | +| :-----: | :---: | :---: | :---: | :---: | :-----: | +| ✔️ | ✔️ | | ✔️ | | | ## Usage To use this plugin, add `sensors_plus` as a [dependency in your pubspec.yaml file](https://plus.fluttercommunity.dev/docs/overview). -This will expose three classes of sensor events, through three different +This will expose four classes of sensor events through four different streams. - `AccelerometerEvent`s describe the velocity of the device, including the @@ -30,9 +32,12 @@ streams. include gravity. They can also be thought of as just the user's affect on the device. - `GyroscopeEvent`s describe the rotation of the device. +- `MagnetometerEvent`s describe the ambient magnetic field surrounding the + device. A compass is an example usage of this data. Each of these is exposed through a `BroadcastStream`: `accelerometerEvents`, -`userAccelerometerEvents`, and `gyroscopeEvents`, respectively. +`userAccelerometerEvents`, `gyroscopeEvents`, and `magnetometerEvents`, +respectively. ### Example @@ -54,11 +59,20 @@ gyroscopeEvents.listen((GyroscopeEvent event) { }); // [GyroscopeEvent (x: 0.0, y: 0.0, z: 0.0)] +magnetometerEvents.listen((MagnetometerEvent event) { + print(event); +}); +// [MagnetometerEvent (x: -23.6, y: 6.2, z: -34.9)] + ``` Also see the `example` subdirectory for an example application that uses the sensor data. -Check out our documentation website to learn more. [Plus plugins documentation](https://plus.fluttercommunity.dev/docs/overview) +Check out our website to learn more: [Plus Plugins documentation](https://plus.fluttercommunity.dev/docs/overview) -**Important:** As of January 2021, the Flutter team is no longer accepting non-critical PRs for the original set of plugins in `flutter/plugins`, and instead they should be submitted in this project. [You can read more about this announcement here.](https://github.com/flutter/plugins/blob/master/CONTRIBUTING.md#important-note) as well as [in the Flutter 2 announcement blog post.](https://medium.com/flutter/whats-new-in-flutter-2-0-fe8e95ecc65) +**Important:** As of January 2021, the Flutter team is no longer accepting +non-critical PRs for the original set of plugins in `flutter/plugins`, and +instead they should be submitted in this project. +[You can read more about this announcement here](https://github.com/flutter/plugins/blob/master/CONTRIBUTING.md#important-note) +as well as [in the Flutter 2 announcement blog post](https://medium.com/flutter/whats-new-in-flutter-2-0-fe8e95ecc65). diff --git a/packages/sensors_plus/sensors_plus/android/src/main/java/dev/fluttercommunity/plus/sensors/SensorsPlugin.java b/packages/sensors_plus/sensors_plus/android/src/main/java/dev/fluttercommunity/plus/sensors/SensorsPlugin.java index e4d7211ddb..ea32611853 100644 --- a/packages/sensors_plus/sensors_plus/android/src/main/java/dev/fluttercommunity/plus/sensors/SensorsPlugin.java +++ b/packages/sensors_plus/sensors_plus/android/src/main/java/dev/fluttercommunity/plus/sensors/SensorsPlugin.java @@ -20,10 +20,13 @@ public class SensorsPlugin implements FlutterPlugin { "dev.fluttercommunity.plus/sensors/gyroscope"; private static final String USER_ACCELEROMETER_CHANNEL_NAME = "dev.fluttercommunity.plus/sensors/user_accel"; + private static final String MAGNETOMETER_CHANNEL_NAME = + "dev.fluttercommunity.plus/sensors/magnetometer"; private EventChannel accelerometerChannel; private EventChannel userAccelChannel; private EventChannel gyroscopeChannel; + private EventChannel magnetometerChannel; /** Plugin registration. */ public static void registerWith(Registrar registrar) { @@ -63,11 +66,19 @@ private void setupEventChannels(Context context, BinaryMessenger messenger) { (SensorManager) context.getSystemService(context.SENSOR_SERVICE), Sensor.TYPE_GYROSCOPE); gyroscopeChannel.setStreamHandler(gyroScopeStreamHandler); + + magnetometerChannel = new EventChannel(messenger, MAGNETOMETER_CHANNEL_NAME); + final StreamHandlerImpl magnetometerStreamHandler = + new StreamHandlerImpl( + (SensorManager) context.getSystemService(context.SENSOR_SERVICE), + Sensor.TYPE_MAGNETIC_FIELD); + magnetometerChannel.setStreamHandler(magnetometerStreamHandler); } private void teardownEventChannels() { accelerometerChannel.setStreamHandler(null); userAccelChannel.setStreamHandler(null); gyroscopeChannel.setStreamHandler(null); + magnetometerChannel.setStreamHandler(null); } } diff --git a/packages/sensors_plus/sensors_plus/android/src/main/java/dev/fluttercommunity/plus/sensors/StreamHandlerImpl.java b/packages/sensors_plus/sensors_plus/android/src/main/java/dev/fluttercommunity/plus/sensors/StreamHandlerImpl.java index 36a6d6017b..a651822687 100644 --- a/packages/sensors_plus/sensors_plus/android/src/main/java/dev/fluttercommunity/plus/sensors/StreamHandlerImpl.java +++ b/packages/sensors_plus/sensors_plus/android/src/main/java/dev/fluttercommunity/plus/sensors/StreamHandlerImpl.java @@ -24,7 +24,11 @@ class StreamHandlerImpl implements EventChannel.StreamHandler { @Override public void onListen(Object arguments, EventChannel.EventSink events) { sensorEventListener = createSensorEventListener(events); - sensorManager.registerListener(sensorEventListener, sensor, sensorManager.SENSOR_DELAY_NORMAL); + // TODO: Could allow developer to alter rate? + // sensorManager.registerListener(sensorEventListener, sensor, sensorManager.SENSOR_DELAY_FASTEST); // 0 + // sensorManager.registerListener(sensorEventListener, sensor, sensorManager.SENSOR_DELAY_GAME); // 1 + // sensorManager.registerListener(sensorEventListener, sensor, sensorManager.SENSOR_DELAY_UI); // 2 + sensorManager.registerListener(sensorEventListener, sensor, sensorManager.SENSOR_DELAY_NORMAL); // 3 } @Override diff --git a/packages/sensors_plus/sensors_plus/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/sensors_plus/sensors_plus/example/android/gradle/wrapper/gradle-wrapper.properties index 019065d1d6..c9aebbe14f 100644 --- a/packages/sensors_plus/sensors_plus/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/packages/sensors_plus/sensors_plus/example/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip +# distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip diff --git a/packages/sensors_plus/sensors_plus/example/lib/main.dart b/packages/sensors_plus/sensors_plus/example/lib/main.dart index fb33a4a129..72dc809b7f 100644 --- a/packages/sensors_plus/sensors_plus/example/lib/main.dart +++ b/packages/sensors_plus/sensors_plus/example/lib/main.dart @@ -44,6 +44,7 @@ class _MyHomePageState extends State { List? _accelerometerValues; List? _userAccelerometerValues; List? _gyroscopeValues; + List? _magnetometerValues; final _streamSubscriptions = >[]; @override @@ -55,6 +56,8 @@ class _MyHomePageState extends State { final userAccelerometer = _userAccelerometerValues ?.map((double v) => v.toStringAsFixed(1)) .toList(); + final magnetometer = + _magnetometerValues?.map((double v) => v.toStringAsFixed(1)).toList(); return Scaffold( appBar: AppBar( @@ -106,6 +109,15 @@ class _MyHomePageState extends State { ], ), ), + Padding( + padding: const EdgeInsets.all(16.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Magnetometer: $magnetometer'), + ], + ), + ), ], ), ); @@ -149,5 +161,14 @@ class _MyHomePageState extends State { }, ), ); + _streamSubscriptions.add( + magnetometerEvents.listen( + (MagnetometerEvent event) { + setState(() { + _magnetometerValues = [event.x, event.y, event.z]; + }); + }, + ), + ); } } diff --git a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.h b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.h index 1cc3fa3ee0..70e48f9d9d 100644 --- a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.h +++ b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.h @@ -15,3 +15,6 @@ @interface FLTGyroscopeStreamHandlerPlus : NSObject @end + +@interface FLTMagnetometerStreamHandlerPlus : NSObject +@end diff --git a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m index c3c91244bc..79d4113207 100644 --- a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m +++ b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m @@ -28,6 +28,13 @@ + (void)registerWithRegistrar:(NSObject*)registrar { [FlutterEventChannel eventChannelWithName:@"dev.fluttercommunity.plus/sensors/gyroscope" binaryMessenger:[registrar messenger]]; [gyroscopeChannel setStreamHandler:gyroscopeStreamHandler]; + + FLTMagnetometerStreamHandlerPlus* magnetometerStreamHandler = + [[FLTMagnetometerStreamHandlerPlus alloc] init]; + FlutterEventChannel* magnetometerChannel = + [FlutterEventChannel eventChannelWithName:@"dev.fluttercommunity.plus/sensors/magnetometer" + binaryMessenger:[registrar messenger]]; + [magnetometerChannel setStreamHandler:magnetometerStreamHandler]; } @end @@ -113,3 +120,23 @@ - (FlutterError*)onCancelWithArguments:(id)arguments { } @end + +@implementation FLTMagnetometerStreamHandlerPlus + +- (FlutterError*)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink { + _initMotionManager(); + [_motionManager + startMagnetometerUpdatesToQueue:[[NSOperationQueue alloc] init] + withHandler:^(CMMagnetometerData* magData, NSError* error) { + CMMagneticField magneticField = magData.magneticField; + sendTriplet(magneticField.x, magneticField.y, magneticField.z, eventSink); + }]; + return nil; +} + +- (FlutterError*)onCancelWithArguments:(id)arguments { + [_motionManager stopMagnetometerUpdates]; + return nil; +} + +@end diff --git a/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec b/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec index 73c8dd7e87..3e59054339 100644 --- a/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec +++ b/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec @@ -3,21 +3,21 @@ # Pod::Spec.new do |s| s.name = 'sensors_plus' - s.version = '0.0.1' - s.summary = 'Flutter Sensors' + s.version = '0.1.0' + s.summary = 'Flutter Community: Sensors Plus' s.description = <<-DESC -A Flutter plugin to access the accelerometer and gyroscope sensors. +Flutter plugin to access the accelerometer, gyroscope, and magnetometer sensors. DESC - s.homepage = 'https://github.com/flutter/plugins' + # Should update? + s.homepage = 'https://github.com/fluttercommunity/plus_plugins' s.license = { :type => 'BSD', :file => '../LICENSE' } s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' } - s.source = { :http => 'https://github.com/flutter/plugins/tree/main/packages/sensors' } - s.documentation_url = 'https://pub.dev/packages/sensors' + s.source = { :http => 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/sensors_plus' } + s.documentation_url = 'https://pub.dev/documentation/sensors_plus' s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - + s.platform = :ios, '8.0' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } end - diff --git a/packages/sensors_plus/sensors_plus/lib/sensors_plus.dart b/packages/sensors_plus/sensors_plus/lib/sensors_plus.dart index 592a4d6d47..1ace1d9615 100644 --- a/packages/sensors_plus/sensors_plus/lib/sensors_plus.dart +++ b/packages/sensors_plus/sensors_plus/lib/sensors_plus.dart @@ -21,3 +21,8 @@ Stream get gyroscopeEvents { Stream get userAccelerometerEvents { return _sensors.userAccelerometerEvents; } + +/// A broadcast stream of events from the device magnetometer. +Stream get magnetometerEvents { + return _sensors.magnetometerEvents; +} diff --git a/packages/sensors_plus/sensors_plus/lib/src/sensors.dart b/packages/sensors_plus/sensors_plus/lib/src/sensors.dart index 414dea5fd1..59ac78cb8f 100644 --- a/packages/sensors_plus/sensors_plus/lib/src/sensors.dart +++ b/packages/sensors_plus/sensors_plus/lib/src/sensors.dart @@ -30,4 +30,10 @@ class Sensors extends SensorsPlatform { Stream get userAccelerometerEvents { return _platform.userAccelerometerEvents; } + + /// A broadcast stream of events from the device magnetometer. + @override + Stream get magnetometerEvents { + return _platform.magnetometerEvents; + } } diff --git a/packages/sensors_plus/sensors_plus/pubspec.yaml b/packages/sensors_plus/sensors_plus/pubspec.yaml index 9d40c62fc3..e1180b5383 100644 --- a/packages/sensors_plus/sensors_plus/pubspec.yaml +++ b/packages/sensors_plus/sensors_plus/pubspec.yaml @@ -1,6 +1,8 @@ name: sensors_plus -description: Flutter plugin for accessing accelerometer and gyroscope sensors. -version: 1.0.2 +description: > + Flutter plugin for accessing accelerometer, gyroscope, and magnetometer + sensors. +version: 1.1.0 homepage: https://plus.fluttercommunity.dev/ repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/ @@ -18,8 +20,8 @@ flutter: dependencies: flutter: sdk: flutter - sensors_plus_web: ^1.0.0 - sensors_plus_platform_interface: ^1.0.0 + sensors_plus_web: ^1.1.0 + sensors_plus_platform_interface: ^1.1.0 dev_dependencies: test: ^1.16.4 diff --git a/packages/sensors_plus/sensors_plus/test/sensors_test.dart b/packages/sensors_plus/sensors_plus/test/sensors_test.dart index e0ec680257..2a98c1d9fc 100644 --- a/packages/sensors_plus/sensors_plus/test/sensors_test.dart +++ b/packages/sensors_plus/sensors_plus/test/sensors_test.dart @@ -47,6 +47,18 @@ void main() { expect(event.y, sensorData[1]); expect(event.z, sensorData[2]); }); + + test('$magnetometerEvents are streamed', () async { + const channelName = 'dev.fluttercommunity.plus/sensors/magnetometer'; + const sensorData = [8.0, 9.0, 10.0]; + _initializeFakeSensorChannel(channelName, sensorData); + + final event = await magnetometerEvents.first; + + expect(event.x, sensorData[0]); + expect(event.y, sensorData[1]); + expect(event.z, sensorData[2]); + }); } void _initializeFakeSensorChannel(String channelName, List sensorData) { diff --git a/packages/sensors_plus/sensors_plus_platform_interface/CHANGELOG.md b/packages/sensors_plus/sensors_plus_platform_interface/CHANGELOG.md index 2ebb784572..9c993a02fb 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/CHANGELOG.md +++ b/packages/sensors_plus/sensors_plus_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.0 + +- Adds magnetometer support + ## 1.0.1 - Improve documentation diff --git a/packages/sensors_plus/sensors_plus_platform_interface/README.md b/packages/sensors_plus/sensors_plus_platform_interface/README.md index 01bd1838fb..a104664723 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/README.md +++ b/packages/sensors_plus/sensors_plus_platform_interface/README.md @@ -8,5 +8,5 @@ A common platform interface for [`sensors_plus`](https://pub.dev/packages/sensor ## Usage -This package is already included as part of the `sensors_plus` package dependency, and will -be included when using `sensors_plus` as normal. +This package is already included as part of the `sensors_plus` package +dependency, and will be included when using `sensors_plus` as normal. diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/sensors_plus_platform_interface.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/sensors_plus_platform_interface.dart index 1fe8b9c9aa..787e8c7e24 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/lib/sensors_plus_platform_interface.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/sensors_plus_platform_interface.dart @@ -10,10 +10,12 @@ import 'package:sensors_plus_platform_interface/src/method_channel_sensors.dart' import 'src/accelerometer_event.dart'; import 'src/gyroscope_event.dart'; import 'src/user_accelerometer_event.dart'; +import 'src/magnetometer_event.dart'; export 'src/accelerometer_event.dart'; export 'src/gyroscope_event.dart'; export 'src/user_accelerometer_event.dart'; +export 'src/magnetometer_event.dart'; /// The common platform interface for sensors. abstract class SensorsPlatform extends PlatformInterface { @@ -51,4 +53,9 @@ abstract class SensorsPlatform extends PlatformInterface { throw UnimplementedError( 'userAccelerometerEvents has not been implemented.'); } + + /// A broadcast stream of events from the device magnetometer. + Stream get magnetometerEvents { + throw UnimplementedError('magnetometerEvents has not been implemented.'); + } } diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/accelerometer_event.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/accelerometer_event.dart index 4d53329ef5..57d688a4ba 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/accelerometer_event.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/accelerometer_event.dart @@ -7,7 +7,7 @@ /// 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. + /// Constructs 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. diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/gyroscope_event.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/gyroscope_event.dart index 4413421019..59c90e4b85 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/gyroscope_event.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/gyroscope_event.dart @@ -5,7 +5,7 @@ /// 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. + /// Constructs 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. diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/magnetometer_event.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/magnetometer_event.dart new file mode 100644 index 0000000000..f7b4bb0513 --- /dev/null +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/magnetometer_event.dart @@ -0,0 +1,20 @@ +/// Sensor sample from a magnetometer. +/// +/// Magnetometers measure the ambient magnetic field surrounding the sensor, +/// returning values in microteslas ***μT*** for each three-dimensional axis. +/// +/// Consider that these samples may bear effects of Earth's magnetic field as +/// well as local factors such as the metal of the device itself or nearby +/// magnets. +/// +/// A compass is an example of a general utility for magnetometer data. +class MagnetometerEvent { + /// Constructs an instance with the given [x], [y], and [z] values. + MagnetometerEvent(this.x, this.y, this.z); + + /// The ambient magnetic field in this axis in microteslas ***μT***. + final double x, y, z; + + @override + String toString() => '[MagnetometerEvent (x: $x, y: $y, z: $z)]'; +} diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/method_channel_sensors.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/method_channel_sensors.dart index 77862c24fa..6fbeacac5d 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/method_channel_sensors.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/method_channel_sensors.dart @@ -18,9 +18,13 @@ class MethodChannelSensors extends SensorsPlatform { static const EventChannel _gyroscopeEventChannel = EventChannel('dev.fluttercommunity.plus/sensors/gyroscope'); + static const EventChannel _magnetometerEventChannel = + EventChannel('dev.fluttercommunity.plus/sensors/magnetometer'); + Stream? _accelerometerEvents; Stream? _gyroscopeEvents; Stream? _userAccelerometerEvents; + Stream? _magnetometerEvents; /// A broadcast stream of events from the device accelerometer. @override @@ -56,4 +60,15 @@ class MethodChannelSensors extends SensorsPlatform { }); return _userAccelerometerEvents!; } + + /// A broadcast stream of events from the device magnetometer. + @override + Stream get magnetometerEvents { + _magnetometerEvents ??= + _magnetometerEventChannel.receiveBroadcastStream().map((dynamic event) { + final list = event.cast(); + return MagnetometerEvent(list[0]!, list[1]!, list[2]!); + }); + return _magnetometerEvents!; + } } diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/user_accelerometer_event.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/user_accelerometer_event.dart index 3950edb12a..c8d2fa8ded 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/user_accelerometer_event.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/user_accelerometer_event.dart @@ -6,7 +6,7 @@ /// 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. + /// Constructs 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. diff --git a/packages/sensors_plus/sensors_plus_platform_interface/pubspec.yaml b/packages/sensors_plus/sensors_plus_platform_interface/pubspec.yaml index 9443481392..c6790a0920 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/pubspec.yaml +++ b/packages/sensors_plus/sensors_plus_platform_interface/pubspec.yaml @@ -1,6 +1,6 @@ name: sensors_plus_platform_interface description: A common platform interface for the sensors_plus plugin. -version: 1.0.1 +version: 1.1.0 homepage: https://plus.fluttercommunity.dev/ repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/ diff --git a/packages/sensors_plus/sensors_plus_platform_interface/test/sensors_plus_platform_interface_test.dart b/packages/sensors_plus/sensors_plus_platform_interface/test/sensors_plus_platform_interface_test.dart index 6d88e696d8..b7bff2dbf4 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/test/sensors_plus_platform_interface_test.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/test/sensors_plus_platform_interface_test.dart @@ -27,6 +27,11 @@ Stream get userAccelerometerEvents { return methodChannel.userAccelerometerEvents; } +/// A broadcast stream of events from the device magnetometer. +Stream get magnetometerEvents { + return methodChannel.magnetometerEvents; +} + void main() { TestWidgetsFlutterBinding.ensureInitialized(); @@ -65,6 +70,18 @@ void main() { expect(event.y, sensorData[1]); expect(event.z, sensorData[2]); }); + + test('$magnetometerEvents are streamed', () async { + const channelName = 'dev.fluttercommunity.plus/sensors/magnetometer'; + const sensorData = [8.0, 9.0, 10.0]; + _initializeFakeSensorChannel(channelName, sensorData); + + final event = await magnetometerEvents.first; + + expect(event.x, sensorData[0]); + expect(event.y, sensorData[1]); + expect(event.z, sensorData[2]); + }); } void _initializeFakeSensorChannel(String channelName, List sensorData) { diff --git a/packages/sensors_plus/sensors_plus_web/CHANGELOG.md b/packages/sensors_plus/sensors_plus_web/CHANGELOG.md index 2ebb784572..9c993a02fb 100644 --- a/packages/sensors_plus/sensors_plus_web/CHANGELOG.md +++ b/packages/sensors_plus/sensors_plus_web/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.0 + +- Adds magnetometer support + ## 1.0.1 - Improve documentation diff --git a/packages/sensors_plus/sensors_plus_web/README.md b/packages/sensors_plus/sensors_plus_web/README.md index 8b997ae29f..ba4b45df00 100644 --- a/packages/sensors_plus/sensors_plus_web/README.md +++ b/packages/sensors_plus/sensors_plus_web/README.md @@ -8,5 +8,5 @@ The Web implementation of [`sensors_plus`](https://pub.dev/packages/sensors_plus ## Usage -This package is already included as part of the `sensors_plus` package dependency, and will -be included when using `sensors_plus` as normal. +This package is already included as part of the `sensors_plus` package +dependency, and will be included when using `sensors_plus` as normal. diff --git a/packages/sensors_plus/sensors_plus_web/lib/sensors_plus_web.dart b/packages/sensors_plus/sensors_plus_web/lib/sensors_plus_web.dart index 39e5cccaa8..5bfae106cb 100644 --- a/packages/sensors_plus/sensors_plus_web/lib/sensors_plus_web.dart +++ b/packages/sensors_plus/sensors_plus_web/lib/sensors_plus_web.dart @@ -21,3 +21,8 @@ Stream get gyroscopeEvents { Stream get userAccelerometerEvents { return _sensors.userAccelerometerEvents; } + +/// A broadcast stream of events from the device magnetometer. +Stream get magnetometerEvents { + return _sensors.magnetometerEvents; +} diff --git a/packages/sensors_plus/sensors_plus_web/lib/src/sensors.dart b/packages/sensors_plus/sensors_plus_web/lib/src/sensors.dart index 963fc7d1fe..4cce55837b 100644 --- a/packages/sensors_plus/sensors_plus_web/lib/src/sensors.dart +++ b/packages/sensors_plus/sensors_plus_web/lib/src/sensors.dart @@ -1,6 +1,6 @@ import 'dart:async'; import 'dart:html' as html - show LinearAccelerationSensor, Accelerometer, Gyroscope; + show LinearAccelerationSensor, Accelerometer, Gyroscope, Magnetometer; import 'dart:js'; import 'dart:js_util'; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; @@ -8,8 +8,8 @@ import 'package:sensors_plus_platform_interface/sensors_plus_platform_interface. /// The sensors plugin. class SensorsPlugin extends SensorsPlatform { - /// Factory method that initializes the Sensors plugin platform with an instance - /// of the plugin for the web. + /// Factory method that initializes the Sensors plugin platform with an + /// instance of the plugin for the web. static void registerWith(Registrar registrar) { SensorsPlatform.instance = SensorsPlugin(); } @@ -37,11 +37,11 @@ class SensorsPlugin extends SensorsPlatform { /// See the note above about feature policy. print('$apiName construction was blocked by a feature policy.'); - /// if this feature is not supported or Flag is not enabled yet! + /// If this feature is not supported or Flag is not enabled yet } else if (error.toString().contains('ReferenceError')) { print('$apiName is not supported by the User Agent.'); - /// if this is unknown error, rethrow it + /// If this is unknown error, rethrow it } else { rethrow; } @@ -78,7 +78,9 @@ class SensorsPlugin extends SensorsPlatform { _accelerometer.start(); _accelerometer.onError.forEach( - (e) => print('The Api is supported but something is wrong! $e'), + (e) => + print('[SensorsPlugin] API supported but something is wrong: ' + 'Accelerometer $e'), ); }, apiName: 'Accelerometer()', @@ -124,7 +126,9 @@ class SensorsPlugin extends SensorsPlatform { _gyroscope.start(); _gyroscope.onError.forEach( - (e) => print('The Api is supported but something is wrong! $e'), + (e) => + print('[SensorsPlugin] API supported but something is wrong: ' + 'Gyroscope $e'), ); }, apiName: 'Gyroscope()', @@ -171,7 +175,9 @@ class SensorsPlugin extends SensorsPlatform { _linearAccelerationSensor.start(); _linearAccelerationSensor.onError.forEach( - (e) => print('The Api is supported but something is wrong! $e'), + (e) => + print('[SensorsPlugin] API supported but something is wrong: ' + 'LinearAccelerationSensor $e'), ); }, apiName: 'LinearAccelerationSensor()', @@ -187,4 +193,52 @@ class SensorsPlugin extends SensorsPlatform { return _userAccelerometerResultStream; } + + StreamController? _magnetometerStreamController; + late Stream _magnetometerResultStream; + + @override + Stream get magnetometerEvents { + if (_magnetometerStreamController == null) { + _magnetometerStreamController = StreamController(); + _featureDetected( + () { + final _magnetometerSensor = html.Magnetometer(); + + setProperty( + _magnetometerSensor, + 'onreading', + allowInterop( + (_) { + _magnetometerStreamController!.add( + MagnetometerEvent( + _magnetometerSensor.x as double, + _magnetometerSensor.y as double, + _magnetometerSensor.z as double, + ), + ); + }, + ), + ); + + _magnetometerSensor.start(); + + _magnetometerSensor.onError.forEach( + (e) => + print('[SensorsPlugin] API supported but something is wrong: ' + 'Magnetometer $e'), + ); + }, + apiName: 'Magnetometer()', + premissionName: 'magnetometer', + onError: () { + _magnetometerStreamController!.add(MagnetometerEvent(0, 0, 0)); + }, + ); + _magnetometerResultStream = + _magnetometerStreamController!.stream.asBroadcastStream(); + } + + return _magnetometerResultStream; + } } diff --git a/packages/sensors_plus/sensors_plus_web/lib/src/utils.dart b/packages/sensors_plus/sensors_plus_web/lib/src/utils.dart index bd118984c1..e601081a00 100644 --- a/packages/sensors_plus/sensors_plus_web/lib/src/utils.dart +++ b/packages/sensors_plus/sensors_plus_web/lib/src/utils.dart @@ -1,16 +1,16 @@ import 'dart:html' as html; -/// Receive premission status of the API +/// Receive permission status of the API. Future checkPremission( Function initSensor, { String? premissionName, }) async { final _premission = html.window.navigator.permissions; - /// check if browser supports this API or support premission manager + // Check if browser supports this API or supports permission manager if (_premission != null) { try { - /// request for permission or check premission status + // Request for permission or check premission status final premissionStatus = await _premission.query( { 'name': premissionName, @@ -19,22 +19,23 @@ Future checkPremission( if (premissionStatus.state == 'granted') { initSensor(); } else if (premissionStatus.state == 'prompt') { - /// user needs to intract with this + // User needs to intract with this print( 'Premission [$premissionName] still has not been granted or denied.', ); } else { - /// if permission is denied, do not do anything + // If permission is denied, do not do anything print('Permission [$premissionName] to use sensor was denied.'); } } catch (e) { print( - 'Integration with Permissions API is not enabled, still try to start app.', + 'Integration with Permissions API is not enabled; ' + 'still trying to start app.', ); initSensor(); } } else { - print('No Permissions API, still try to start app.'); + print('No Permissions API; still trying to start app.'); initSensor(); } } diff --git a/packages/sensors_plus/sensors_plus_web/pubspec.yaml b/packages/sensors_plus/sensors_plus_web/pubspec.yaml index 6652f578c7..f735b4f3d6 100644 --- a/packages/sensors_plus/sensors_plus_web/pubspec.yaml +++ b/packages/sensors_plus/sensors_plus_web/pubspec.yaml @@ -1,6 +1,6 @@ name: sensors_plus_web description: The web implementation of sensors_plus -version: 1.0.1 +version: 1.1.0 homepage: https://plus.fluttercommunity.dev/ repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/ @@ -18,7 +18,7 @@ flutter: dependencies: flutter: sdk: flutter - sensors_plus_platform_interface: ^1.0.0 + sensors_plus_platform_interface: ^1.1.0 flutter_web_plugins: sdk: flutter From 14386c7108c180ed5594059a1975d65752233531 Mon Sep 17 00:00:00 2001 From: Zabadam <65806473+Zabadam@users.noreply.github.com> Date: Sat, 31 Jul 2021 10:56:31 -0500 Subject: [PATCH 2/9] Revert "feat(sensors_plus): add magnetometer support" This reverts commit 8778d6cf554fce636c25d32b27c76926d11d176e. --- .../sensors_plus/sensors_plus/CHANGELOG.md | 4 -- packages/sensors_plus/sensors_plus/README.md | 30 +++----- .../plus/sensors/SensorsPlugin.java | 11 --- .../plus/sensors/StreamHandlerImpl.java | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../sensors_plus/example/lib/main.dart | 21 ------ .../ios/Classes/FLTSensorsPlusPlugin.h | 3 - .../ios/Classes/FLTSensorsPlusPlugin.m | 27 ------- .../sensors_plus/ios/sensors_plus.podspec | 16 ++--- .../sensors_plus/lib/sensors_plus.dart | 5 -- .../sensors_plus/lib/src/sensors.dart | 6 -- .../sensors_plus/sensors_plus/pubspec.yaml | 10 ++- .../sensors_plus/test/sensors_test.dart | 12 ---- .../CHANGELOG.md | 4 -- .../sensors_plus_platform_interface/README.md | 4 +- .../lib/sensors_plus_platform_interface.dart | 7 -- .../lib/src/accelerometer_event.dart | 2 +- .../lib/src/gyroscope_event.dart | 2 +- .../lib/src/magnetometer_event.dart | 20 ------ .../lib/src/method_channel_sensors.dart | 15 ---- .../lib/src/user_accelerometer_event.dart | 2 +- .../pubspec.yaml | 2 +- .../sensors_plus_platform_interface_test.dart | 17 ----- .../sensors_plus_web/CHANGELOG.md | 4 -- .../sensors_plus/sensors_plus_web/README.md | 4 +- .../lib/sensors_plus_web.dart | 5 -- .../sensors_plus_web/lib/src/sensors.dart | 70 +++---------------- .../sensors_plus_web/lib/src/utils.dart | 15 ++-- .../sensors_plus_web/pubspec.yaml | 4 +- 29 files changed, 47 insertions(+), 284 deletions(-) delete mode 100644 packages/sensors_plus/sensors_plus_platform_interface/lib/src/magnetometer_event.dart diff --git a/packages/sensors_plus/sensors_plus/CHANGELOG.md b/packages/sensors_plus/sensors_plus/CHANGELOG.md index 28759a258d..fba091e699 100644 --- a/packages/sensors_plus/sensors_plus/CHANGELOG.md +++ b/packages/sensors_plus/sensors_plus/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.1.0 - -- Adds magnetometer support - ## 1.0.2 - Android: migrate to mavenCentral diff --git a/packages/sensors_plus/sensors_plus/README.md b/packages/sensors_plus/sensors_plus/README.md index 5278df0ee9..c8d35da6c3 100644 --- a/packages/sensors_plus/sensors_plus/README.md +++ b/packages/sensors_plus/sensors_plus/README.md @@ -7,22 +7,20 @@

build

- -A Flutter plugin to access the accelerometer, gyroscope, and magnetometer -sensors. +A Flutter plugin to access the accelerometer and gyroscope sensors. ## Platform Support -| Android | iOS | MacOS | Web | Linux | Windows | -| :-----: | :---: | :---: | :---: | :---: | :-----: | -| ✔️ | ✔️ | | ✔️ | | | +| Android | iOS | MacOS | Web | Linux | Windows | +| :-----: | :-: | :---: | :-: | :---: | :----: | +| ✔️ | ✔️ | | ✔️ | | | ## Usage To use this plugin, add `sensors_plus` as a [dependency in your pubspec.yaml file](https://plus.fluttercommunity.dev/docs/overview). -This will expose four classes of sensor events through four different +This will expose three classes of sensor events, through three different streams. - `AccelerometerEvent`s describe the velocity of the device, including the @@ -32,12 +30,9 @@ streams. include gravity. They can also be thought of as just the user's affect on the device. - `GyroscopeEvent`s describe the rotation of the device. -- `MagnetometerEvent`s describe the ambient magnetic field surrounding the - device. A compass is an example usage of this data. Each of these is exposed through a `BroadcastStream`: `accelerometerEvents`, -`userAccelerometerEvents`, `gyroscopeEvents`, and `magnetometerEvents`, -respectively. +`userAccelerometerEvents`, and `gyroscopeEvents`, respectively. ### Example @@ -59,20 +54,11 @@ gyroscopeEvents.listen((GyroscopeEvent event) { }); // [GyroscopeEvent (x: 0.0, y: 0.0, z: 0.0)] -magnetometerEvents.listen((MagnetometerEvent event) { - print(event); -}); -// [MagnetometerEvent (x: -23.6, y: 6.2, z: -34.9)] - ``` Also see the `example` subdirectory for an example application that uses the sensor data. -Check out our website to learn more: [Plus Plugins documentation](https://plus.fluttercommunity.dev/docs/overview) +Check out our documentation website to learn more. [Plus plugins documentation](https://plus.fluttercommunity.dev/docs/overview) -**Important:** As of January 2021, the Flutter team is no longer accepting -non-critical PRs for the original set of plugins in `flutter/plugins`, and -instead they should be submitted in this project. -[You can read more about this announcement here](https://github.com/flutter/plugins/blob/master/CONTRIBUTING.md#important-note) -as well as [in the Flutter 2 announcement blog post](https://medium.com/flutter/whats-new-in-flutter-2-0-fe8e95ecc65). +**Important:** As of January 2021, the Flutter team is no longer accepting non-critical PRs for the original set of plugins in `flutter/plugins`, and instead they should be submitted in this project. [You can read more about this announcement here.](https://github.com/flutter/plugins/blob/master/CONTRIBUTING.md#important-note) as well as [in the Flutter 2 announcement blog post.](https://medium.com/flutter/whats-new-in-flutter-2-0-fe8e95ecc65) diff --git a/packages/sensors_plus/sensors_plus/android/src/main/java/dev/fluttercommunity/plus/sensors/SensorsPlugin.java b/packages/sensors_plus/sensors_plus/android/src/main/java/dev/fluttercommunity/plus/sensors/SensorsPlugin.java index ea32611853..e4d7211ddb 100644 --- a/packages/sensors_plus/sensors_plus/android/src/main/java/dev/fluttercommunity/plus/sensors/SensorsPlugin.java +++ b/packages/sensors_plus/sensors_plus/android/src/main/java/dev/fluttercommunity/plus/sensors/SensorsPlugin.java @@ -20,13 +20,10 @@ public class SensorsPlugin implements FlutterPlugin { "dev.fluttercommunity.plus/sensors/gyroscope"; private static final String USER_ACCELEROMETER_CHANNEL_NAME = "dev.fluttercommunity.plus/sensors/user_accel"; - private static final String MAGNETOMETER_CHANNEL_NAME = - "dev.fluttercommunity.plus/sensors/magnetometer"; private EventChannel accelerometerChannel; private EventChannel userAccelChannel; private EventChannel gyroscopeChannel; - private EventChannel magnetometerChannel; /** Plugin registration. */ public static void registerWith(Registrar registrar) { @@ -66,19 +63,11 @@ private void setupEventChannels(Context context, BinaryMessenger messenger) { (SensorManager) context.getSystemService(context.SENSOR_SERVICE), Sensor.TYPE_GYROSCOPE); gyroscopeChannel.setStreamHandler(gyroScopeStreamHandler); - - magnetometerChannel = new EventChannel(messenger, MAGNETOMETER_CHANNEL_NAME); - final StreamHandlerImpl magnetometerStreamHandler = - new StreamHandlerImpl( - (SensorManager) context.getSystemService(context.SENSOR_SERVICE), - Sensor.TYPE_MAGNETIC_FIELD); - magnetometerChannel.setStreamHandler(magnetometerStreamHandler); } private void teardownEventChannels() { accelerometerChannel.setStreamHandler(null); userAccelChannel.setStreamHandler(null); gyroscopeChannel.setStreamHandler(null); - magnetometerChannel.setStreamHandler(null); } } diff --git a/packages/sensors_plus/sensors_plus/android/src/main/java/dev/fluttercommunity/plus/sensors/StreamHandlerImpl.java b/packages/sensors_plus/sensors_plus/android/src/main/java/dev/fluttercommunity/plus/sensors/StreamHandlerImpl.java index a651822687..36a6d6017b 100644 --- a/packages/sensors_plus/sensors_plus/android/src/main/java/dev/fluttercommunity/plus/sensors/StreamHandlerImpl.java +++ b/packages/sensors_plus/sensors_plus/android/src/main/java/dev/fluttercommunity/plus/sensors/StreamHandlerImpl.java @@ -24,11 +24,7 @@ class StreamHandlerImpl implements EventChannel.StreamHandler { @Override public void onListen(Object arguments, EventChannel.EventSink events) { sensorEventListener = createSensorEventListener(events); - // TODO: Could allow developer to alter rate? - // sensorManager.registerListener(sensorEventListener, sensor, sensorManager.SENSOR_DELAY_FASTEST); // 0 - // sensorManager.registerListener(sensorEventListener, sensor, sensorManager.SENSOR_DELAY_GAME); // 1 - // sensorManager.registerListener(sensorEventListener, sensor, sensorManager.SENSOR_DELAY_UI); // 2 - sensorManager.registerListener(sensorEventListener, sensor, sensorManager.SENSOR_DELAY_NORMAL); // 3 + sensorManager.registerListener(sensorEventListener, sensor, sensorManager.SENSOR_DELAY_NORMAL); } @Override diff --git a/packages/sensors_plus/sensors_plus/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/sensors_plus/sensors_plus/example/android/gradle/wrapper/gradle-wrapper.properties index c9aebbe14f..019065d1d6 100644 --- a/packages/sensors_plus/sensors_plus/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/packages/sensors_plus/sensors_plus/example/android/gradle/wrapper/gradle-wrapper.properties @@ -2,5 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -# distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/packages/sensors_plus/sensors_plus/example/lib/main.dart b/packages/sensors_plus/sensors_plus/example/lib/main.dart index 72dc809b7f..fb33a4a129 100644 --- a/packages/sensors_plus/sensors_plus/example/lib/main.dart +++ b/packages/sensors_plus/sensors_plus/example/lib/main.dart @@ -44,7 +44,6 @@ class _MyHomePageState extends State { List? _accelerometerValues; List? _userAccelerometerValues; List? _gyroscopeValues; - List? _magnetometerValues; final _streamSubscriptions = >[]; @override @@ -56,8 +55,6 @@ class _MyHomePageState extends State { final userAccelerometer = _userAccelerometerValues ?.map((double v) => v.toStringAsFixed(1)) .toList(); - final magnetometer = - _magnetometerValues?.map((double v) => v.toStringAsFixed(1)).toList(); return Scaffold( appBar: AppBar( @@ -109,15 +106,6 @@ class _MyHomePageState extends State { ], ), ), - Padding( - padding: const EdgeInsets.all(16.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text('Magnetometer: $magnetometer'), - ], - ), - ), ], ), ); @@ -161,14 +149,5 @@ class _MyHomePageState extends State { }, ), ); - _streamSubscriptions.add( - magnetometerEvents.listen( - (MagnetometerEvent event) { - setState(() { - _magnetometerValues = [event.x, event.y, event.z]; - }); - }, - ), - ); } } diff --git a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.h b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.h index 70e48f9d9d..1cc3fa3ee0 100644 --- a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.h +++ b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.h @@ -15,6 +15,3 @@ @interface FLTGyroscopeStreamHandlerPlus : NSObject @end - -@interface FLTMagnetometerStreamHandlerPlus : NSObject -@end diff --git a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m index 79d4113207..c3c91244bc 100644 --- a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m +++ b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m @@ -28,13 +28,6 @@ + (void)registerWithRegistrar:(NSObject*)registrar { [FlutterEventChannel eventChannelWithName:@"dev.fluttercommunity.plus/sensors/gyroscope" binaryMessenger:[registrar messenger]]; [gyroscopeChannel setStreamHandler:gyroscopeStreamHandler]; - - FLTMagnetometerStreamHandlerPlus* magnetometerStreamHandler = - [[FLTMagnetometerStreamHandlerPlus alloc] init]; - FlutterEventChannel* magnetometerChannel = - [FlutterEventChannel eventChannelWithName:@"dev.fluttercommunity.plus/sensors/magnetometer" - binaryMessenger:[registrar messenger]]; - [magnetometerChannel setStreamHandler:magnetometerStreamHandler]; } @end @@ -120,23 +113,3 @@ - (FlutterError*)onCancelWithArguments:(id)arguments { } @end - -@implementation FLTMagnetometerStreamHandlerPlus - -- (FlutterError*)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink { - _initMotionManager(); - [_motionManager - startMagnetometerUpdatesToQueue:[[NSOperationQueue alloc] init] - withHandler:^(CMMagnetometerData* magData, NSError* error) { - CMMagneticField magneticField = magData.magneticField; - sendTriplet(magneticField.x, magneticField.y, magneticField.z, eventSink); - }]; - return nil; -} - -- (FlutterError*)onCancelWithArguments:(id)arguments { - [_motionManager stopMagnetometerUpdates]; - return nil; -} - -@end diff --git a/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec b/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec index 3e59054339..73c8dd7e87 100644 --- a/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec +++ b/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec @@ -3,21 +3,21 @@ # Pod::Spec.new do |s| s.name = 'sensors_plus' - s.version = '0.1.0' - s.summary = 'Flutter Community: Sensors Plus' + s.version = '0.0.1' + s.summary = 'Flutter Sensors' s.description = <<-DESC -Flutter plugin to access the accelerometer, gyroscope, and magnetometer sensors. +A Flutter plugin to access the accelerometer and gyroscope sensors. DESC - # Should update? - s.homepage = 'https://github.com/fluttercommunity/plus_plugins' + s.homepage = 'https://github.com/flutter/plugins' s.license = { :type => 'BSD', :file => '../LICENSE' } s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' } - s.source = { :http => 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/sensors_plus' } - s.documentation_url = 'https://pub.dev/documentation/sensors_plus' + s.source = { :http => 'https://github.com/flutter/plugins/tree/main/packages/sensors' } + s.documentation_url = 'https://pub.dev/packages/sensors' s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - + s.platform = :ios, '8.0' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } end + diff --git a/packages/sensors_plus/sensors_plus/lib/sensors_plus.dart b/packages/sensors_plus/sensors_plus/lib/sensors_plus.dart index 1ace1d9615..592a4d6d47 100644 --- a/packages/sensors_plus/sensors_plus/lib/sensors_plus.dart +++ b/packages/sensors_plus/sensors_plus/lib/sensors_plus.dart @@ -21,8 +21,3 @@ Stream get gyroscopeEvents { Stream get userAccelerometerEvents { return _sensors.userAccelerometerEvents; } - -/// A broadcast stream of events from the device magnetometer. -Stream get magnetometerEvents { - return _sensors.magnetometerEvents; -} diff --git a/packages/sensors_plus/sensors_plus/lib/src/sensors.dart b/packages/sensors_plus/sensors_plus/lib/src/sensors.dart index 59ac78cb8f..414dea5fd1 100644 --- a/packages/sensors_plus/sensors_plus/lib/src/sensors.dart +++ b/packages/sensors_plus/sensors_plus/lib/src/sensors.dart @@ -30,10 +30,4 @@ class Sensors extends SensorsPlatform { Stream get userAccelerometerEvents { return _platform.userAccelerometerEvents; } - - /// A broadcast stream of events from the device magnetometer. - @override - Stream get magnetometerEvents { - return _platform.magnetometerEvents; - } } diff --git a/packages/sensors_plus/sensors_plus/pubspec.yaml b/packages/sensors_plus/sensors_plus/pubspec.yaml index e1180b5383..9d40c62fc3 100644 --- a/packages/sensors_plus/sensors_plus/pubspec.yaml +++ b/packages/sensors_plus/sensors_plus/pubspec.yaml @@ -1,8 +1,6 @@ name: sensors_plus -description: > - Flutter plugin for accessing accelerometer, gyroscope, and magnetometer - sensors. -version: 1.1.0 +description: Flutter plugin for accessing accelerometer and gyroscope sensors. +version: 1.0.2 homepage: https://plus.fluttercommunity.dev/ repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/ @@ -20,8 +18,8 @@ flutter: dependencies: flutter: sdk: flutter - sensors_plus_web: ^1.1.0 - sensors_plus_platform_interface: ^1.1.0 + sensors_plus_web: ^1.0.0 + sensors_plus_platform_interface: ^1.0.0 dev_dependencies: test: ^1.16.4 diff --git a/packages/sensors_plus/sensors_plus/test/sensors_test.dart b/packages/sensors_plus/sensors_plus/test/sensors_test.dart index 2a98c1d9fc..e0ec680257 100644 --- a/packages/sensors_plus/sensors_plus/test/sensors_test.dart +++ b/packages/sensors_plus/sensors_plus/test/sensors_test.dart @@ -47,18 +47,6 @@ void main() { expect(event.y, sensorData[1]); expect(event.z, sensorData[2]); }); - - test('$magnetometerEvents are streamed', () async { - const channelName = 'dev.fluttercommunity.plus/sensors/magnetometer'; - const sensorData = [8.0, 9.0, 10.0]; - _initializeFakeSensorChannel(channelName, sensorData); - - final event = await magnetometerEvents.first; - - expect(event.x, sensorData[0]); - expect(event.y, sensorData[1]); - expect(event.z, sensorData[2]); - }); } void _initializeFakeSensorChannel(String channelName, List sensorData) { diff --git a/packages/sensors_plus/sensors_plus_platform_interface/CHANGELOG.md b/packages/sensors_plus/sensors_plus_platform_interface/CHANGELOG.md index 9c993a02fb..2ebb784572 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/CHANGELOG.md +++ b/packages/sensors_plus/sensors_plus_platform_interface/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.1.0 - -- Adds magnetometer support - ## 1.0.1 - Improve documentation diff --git a/packages/sensors_plus/sensors_plus_platform_interface/README.md b/packages/sensors_plus/sensors_plus_platform_interface/README.md index a104664723..01bd1838fb 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/README.md +++ b/packages/sensors_plus/sensors_plus_platform_interface/README.md @@ -8,5 +8,5 @@ A common platform interface for [`sensors_plus`](https://pub.dev/packages/sensor ## Usage -This package is already included as part of the `sensors_plus` package -dependency, and will be included when using `sensors_plus` as normal. +This package is already included as part of the `sensors_plus` package dependency, and will +be included when using `sensors_plus` as normal. diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/sensors_plus_platform_interface.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/sensors_plus_platform_interface.dart index 787e8c7e24..1fe8b9c9aa 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/lib/sensors_plus_platform_interface.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/sensors_plus_platform_interface.dart @@ -10,12 +10,10 @@ import 'package:sensors_plus_platform_interface/src/method_channel_sensors.dart' import 'src/accelerometer_event.dart'; import 'src/gyroscope_event.dart'; import 'src/user_accelerometer_event.dart'; -import 'src/magnetometer_event.dart'; export 'src/accelerometer_event.dart'; export 'src/gyroscope_event.dart'; export 'src/user_accelerometer_event.dart'; -export 'src/magnetometer_event.dart'; /// The common platform interface for sensors. abstract class SensorsPlatform extends PlatformInterface { @@ -53,9 +51,4 @@ abstract class SensorsPlatform extends PlatformInterface { throw UnimplementedError( 'userAccelerometerEvents has not been implemented.'); } - - /// A broadcast stream of events from the device magnetometer. - Stream get magnetometerEvents { - throw UnimplementedError('magnetometerEvents has not been implemented.'); - } } diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/accelerometer_event.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/accelerometer_event.dart index 57d688a4ba..4d53329ef5 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/accelerometer_event.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/accelerometer_event.dart @@ -7,7 +7,7 @@ /// simply, you can use accelerometer readings to tell if the device is moving in /// a particular direction. class AccelerometerEvent { - /// Constructs an instance with the given [x], [y], and [z] values. + /// 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. diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/gyroscope_event.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/gyroscope_event.dart index 59c90e4b85..4413421019 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/gyroscope_event.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/gyroscope_event.dart @@ -5,7 +5,7 @@ /// Discrete reading from a gyroscope. Gyroscopes measure the rate or rotation of /// the device in 3D space. class GyroscopeEvent { - /// Constructs an instance with the given [x], [y], and [z] values. + /// 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. diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/magnetometer_event.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/magnetometer_event.dart deleted file mode 100644 index f7b4bb0513..0000000000 --- a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/magnetometer_event.dart +++ /dev/null @@ -1,20 +0,0 @@ -/// Sensor sample from a magnetometer. -/// -/// Magnetometers measure the ambient magnetic field surrounding the sensor, -/// returning values in microteslas ***μT*** for each three-dimensional axis. -/// -/// Consider that these samples may bear effects of Earth's magnetic field as -/// well as local factors such as the metal of the device itself or nearby -/// magnets. -/// -/// A compass is an example of a general utility for magnetometer data. -class MagnetometerEvent { - /// Constructs an instance with the given [x], [y], and [z] values. - MagnetometerEvent(this.x, this.y, this.z); - - /// The ambient magnetic field in this axis in microteslas ***μT***. - final double x, y, z; - - @override - String toString() => '[MagnetometerEvent (x: $x, y: $y, z: $z)]'; -} diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/method_channel_sensors.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/method_channel_sensors.dart index 6fbeacac5d..77862c24fa 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/method_channel_sensors.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/method_channel_sensors.dart @@ -18,13 +18,9 @@ class MethodChannelSensors extends SensorsPlatform { static const EventChannel _gyroscopeEventChannel = EventChannel('dev.fluttercommunity.plus/sensors/gyroscope'); - static const EventChannel _magnetometerEventChannel = - EventChannel('dev.fluttercommunity.plus/sensors/magnetometer'); - Stream? _accelerometerEvents; Stream? _gyroscopeEvents; Stream? _userAccelerometerEvents; - Stream? _magnetometerEvents; /// A broadcast stream of events from the device accelerometer. @override @@ -60,15 +56,4 @@ class MethodChannelSensors extends SensorsPlatform { }); return _userAccelerometerEvents!; } - - /// A broadcast stream of events from the device magnetometer. - @override - Stream get magnetometerEvents { - _magnetometerEvents ??= - _magnetometerEventChannel.receiveBroadcastStream().map((dynamic event) { - final list = event.cast(); - return MagnetometerEvent(list[0]!, list[1]!, list[2]!); - }); - return _magnetometerEvents!; - } } diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/user_accelerometer_event.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/user_accelerometer_event.dart index c8d2fa8ded..3950edb12a 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/user_accelerometer_event.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/user_accelerometer_event.dart @@ -6,7 +6,7 @@ /// and measures the velocity of the device. However, unlike /// [AccelerometerEvent], this event does not include the effects of gravity. class UserAccelerometerEvent { - /// Constructs an instance with the given [x], [y], and [z] values. + /// 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. diff --git a/packages/sensors_plus/sensors_plus_platform_interface/pubspec.yaml b/packages/sensors_plus/sensors_plus_platform_interface/pubspec.yaml index c6790a0920..9443481392 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/pubspec.yaml +++ b/packages/sensors_plus/sensors_plus_platform_interface/pubspec.yaml @@ -1,6 +1,6 @@ name: sensors_plus_platform_interface description: A common platform interface for the sensors_plus plugin. -version: 1.1.0 +version: 1.0.1 homepage: https://plus.fluttercommunity.dev/ repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/ diff --git a/packages/sensors_plus/sensors_plus_platform_interface/test/sensors_plus_platform_interface_test.dart b/packages/sensors_plus/sensors_plus_platform_interface/test/sensors_plus_platform_interface_test.dart index b7bff2dbf4..6d88e696d8 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/test/sensors_plus_platform_interface_test.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/test/sensors_plus_platform_interface_test.dart @@ -27,11 +27,6 @@ Stream get userAccelerometerEvents { return methodChannel.userAccelerometerEvents; } -/// A broadcast stream of events from the device magnetometer. -Stream get magnetometerEvents { - return methodChannel.magnetometerEvents; -} - void main() { TestWidgetsFlutterBinding.ensureInitialized(); @@ -70,18 +65,6 @@ void main() { expect(event.y, sensorData[1]); expect(event.z, sensorData[2]); }); - - test('$magnetometerEvents are streamed', () async { - const channelName = 'dev.fluttercommunity.plus/sensors/magnetometer'; - const sensorData = [8.0, 9.0, 10.0]; - _initializeFakeSensorChannel(channelName, sensorData); - - final event = await magnetometerEvents.first; - - expect(event.x, sensorData[0]); - expect(event.y, sensorData[1]); - expect(event.z, sensorData[2]); - }); } void _initializeFakeSensorChannel(String channelName, List sensorData) { diff --git a/packages/sensors_plus/sensors_plus_web/CHANGELOG.md b/packages/sensors_plus/sensors_plus_web/CHANGELOG.md index 9c993a02fb..2ebb784572 100644 --- a/packages/sensors_plus/sensors_plus_web/CHANGELOG.md +++ b/packages/sensors_plus/sensors_plus_web/CHANGELOG.md @@ -1,7 +1,3 @@ -## 1.1.0 - -- Adds magnetometer support - ## 1.0.1 - Improve documentation diff --git a/packages/sensors_plus/sensors_plus_web/README.md b/packages/sensors_plus/sensors_plus_web/README.md index ba4b45df00..8b997ae29f 100644 --- a/packages/sensors_plus/sensors_plus_web/README.md +++ b/packages/sensors_plus/sensors_plus_web/README.md @@ -8,5 +8,5 @@ The Web implementation of [`sensors_plus`](https://pub.dev/packages/sensors_plus ## Usage -This package is already included as part of the `sensors_plus` package -dependency, and will be included when using `sensors_plus` as normal. +This package is already included as part of the `sensors_plus` package dependency, and will +be included when using `sensors_plus` as normal. diff --git a/packages/sensors_plus/sensors_plus_web/lib/sensors_plus_web.dart b/packages/sensors_plus/sensors_plus_web/lib/sensors_plus_web.dart index 5bfae106cb..39e5cccaa8 100644 --- a/packages/sensors_plus/sensors_plus_web/lib/sensors_plus_web.dart +++ b/packages/sensors_plus/sensors_plus_web/lib/sensors_plus_web.dart @@ -21,8 +21,3 @@ Stream get gyroscopeEvents { Stream get userAccelerometerEvents { return _sensors.userAccelerometerEvents; } - -/// A broadcast stream of events from the device magnetometer. -Stream get magnetometerEvents { - return _sensors.magnetometerEvents; -} diff --git a/packages/sensors_plus/sensors_plus_web/lib/src/sensors.dart b/packages/sensors_plus/sensors_plus_web/lib/src/sensors.dart index 4cce55837b..963fc7d1fe 100644 --- a/packages/sensors_plus/sensors_plus_web/lib/src/sensors.dart +++ b/packages/sensors_plus/sensors_plus_web/lib/src/sensors.dart @@ -1,6 +1,6 @@ import 'dart:async'; import 'dart:html' as html - show LinearAccelerationSensor, Accelerometer, Gyroscope, Magnetometer; + show LinearAccelerationSensor, Accelerometer, Gyroscope; import 'dart:js'; import 'dart:js_util'; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; @@ -8,8 +8,8 @@ import 'package:sensors_plus_platform_interface/sensors_plus_platform_interface. /// The sensors plugin. class SensorsPlugin extends SensorsPlatform { - /// Factory method that initializes the Sensors plugin platform with an - /// instance of the plugin for the web. + /// Factory method that initializes the Sensors plugin platform with an instance + /// of the plugin for the web. static void registerWith(Registrar registrar) { SensorsPlatform.instance = SensorsPlugin(); } @@ -37,11 +37,11 @@ class SensorsPlugin extends SensorsPlatform { /// See the note above about feature policy. print('$apiName construction was blocked by a feature policy.'); - /// If this feature is not supported or Flag is not enabled yet + /// if this feature is not supported or Flag is not enabled yet! } else if (error.toString().contains('ReferenceError')) { print('$apiName is not supported by the User Agent.'); - /// If this is unknown error, rethrow it + /// if this is unknown error, rethrow it } else { rethrow; } @@ -78,9 +78,7 @@ class SensorsPlugin extends SensorsPlatform { _accelerometer.start(); _accelerometer.onError.forEach( - (e) => - print('[SensorsPlugin] API supported but something is wrong: ' - 'Accelerometer $e'), + (e) => print('The Api is supported but something is wrong! $e'), ); }, apiName: 'Accelerometer()', @@ -126,9 +124,7 @@ class SensorsPlugin extends SensorsPlatform { _gyroscope.start(); _gyroscope.onError.forEach( - (e) => - print('[SensorsPlugin] API supported but something is wrong: ' - 'Gyroscope $e'), + (e) => print('The Api is supported but something is wrong! $e'), ); }, apiName: 'Gyroscope()', @@ -175,9 +171,7 @@ class SensorsPlugin extends SensorsPlatform { _linearAccelerationSensor.start(); _linearAccelerationSensor.onError.forEach( - (e) => - print('[SensorsPlugin] API supported but something is wrong: ' - 'LinearAccelerationSensor $e'), + (e) => print('The Api is supported but something is wrong! $e'), ); }, apiName: 'LinearAccelerationSensor()', @@ -193,52 +187,4 @@ class SensorsPlugin extends SensorsPlatform { return _userAccelerometerResultStream; } - - StreamController? _magnetometerStreamController; - late Stream _magnetometerResultStream; - - @override - Stream get magnetometerEvents { - if (_magnetometerStreamController == null) { - _magnetometerStreamController = StreamController(); - _featureDetected( - () { - final _magnetometerSensor = html.Magnetometer(); - - setProperty( - _magnetometerSensor, - 'onreading', - allowInterop( - (_) { - _magnetometerStreamController!.add( - MagnetometerEvent( - _magnetometerSensor.x as double, - _magnetometerSensor.y as double, - _magnetometerSensor.z as double, - ), - ); - }, - ), - ); - - _magnetometerSensor.start(); - - _magnetometerSensor.onError.forEach( - (e) => - print('[SensorsPlugin] API supported but something is wrong: ' - 'Magnetometer $e'), - ); - }, - apiName: 'Magnetometer()', - premissionName: 'magnetometer', - onError: () { - _magnetometerStreamController!.add(MagnetometerEvent(0, 0, 0)); - }, - ); - _magnetometerResultStream = - _magnetometerStreamController!.stream.asBroadcastStream(); - } - - return _magnetometerResultStream; - } } diff --git a/packages/sensors_plus/sensors_plus_web/lib/src/utils.dart b/packages/sensors_plus/sensors_plus_web/lib/src/utils.dart index e601081a00..bd118984c1 100644 --- a/packages/sensors_plus/sensors_plus_web/lib/src/utils.dart +++ b/packages/sensors_plus/sensors_plus_web/lib/src/utils.dart @@ -1,16 +1,16 @@ import 'dart:html' as html; -/// Receive permission status of the API. +/// Receive premission status of the API Future checkPremission( Function initSensor, { String? premissionName, }) async { final _premission = html.window.navigator.permissions; - // Check if browser supports this API or supports permission manager + /// check if browser supports this API or support premission manager if (_premission != null) { try { - // Request for permission or check premission status + /// request for permission or check premission status final premissionStatus = await _premission.query( { 'name': premissionName, @@ -19,23 +19,22 @@ Future checkPremission( if (premissionStatus.state == 'granted') { initSensor(); } else if (premissionStatus.state == 'prompt') { - // User needs to intract with this + /// user needs to intract with this print( 'Premission [$premissionName] still has not been granted or denied.', ); } else { - // If permission is denied, do not do anything + /// if permission is denied, do not do anything print('Permission [$premissionName] to use sensor was denied.'); } } catch (e) { print( - 'Integration with Permissions API is not enabled; ' - 'still trying to start app.', + 'Integration with Permissions API is not enabled, still try to start app.', ); initSensor(); } } else { - print('No Permissions API; still trying to start app.'); + print('No Permissions API, still try to start app.'); initSensor(); } } diff --git a/packages/sensors_plus/sensors_plus_web/pubspec.yaml b/packages/sensors_plus/sensors_plus_web/pubspec.yaml index f735b4f3d6..6652f578c7 100644 --- a/packages/sensors_plus/sensors_plus_web/pubspec.yaml +++ b/packages/sensors_plus/sensors_plus_web/pubspec.yaml @@ -1,6 +1,6 @@ name: sensors_plus_web description: The web implementation of sensors_plus -version: 1.1.0 +version: 1.0.1 homepage: https://plus.fluttercommunity.dev/ repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/ @@ -18,7 +18,7 @@ flutter: dependencies: flutter: sdk: flutter - sensors_plus_platform_interface: ^1.1.0 + sensors_plus_platform_interface: ^1.0.0 flutter_web_plugins: sdk: flutter From 11117d467be6f6b4cd1b30dbe581ea7738bbbf81 Mon Sep 17 00:00:00 2001 From: Zabadam <65806473+Zabadam@users.noreply.github.com> Date: Sat, 31 Jul 2021 11:30:06 -0500 Subject: [PATCH 3/9] feat(sensors_plus): add magnetometer support - Adds necessary Android, iOS, and web API for magnetometer sensor. - Adds new `MagnetometerEvent` class. - Adds new `Stream` called `magnetometerEvents`. (This commit compared to an earlier one reverts any changes that were made that were unrelated to added magnetometer support.) --- .../sensors_plus/sensors_plus/CHANGELOG.md | 4 ++ packages/sensors_plus/sensors_plus/README.md | 30 ++++++++--- .../plus/sensors/SensorsPlugin.java | 11 ++++ .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../sensors_plus/example/lib/main.dart | 21 ++++++++ .../ios/Classes/FLTSensorsPlusPlugin.h | 3 ++ .../ios/Classes/FLTSensorsPlusPlugin.m | 27 ++++++++++ .../sensors_plus/ios/sensors_plus.podspec | 9 ++-- .../sensors_plus/lib/sensors_plus.dart | 5 ++ .../sensors_plus/lib/src/sensors.dart | 6 +++ .../sensors_plus/sensors_plus/pubspec.yaml | 10 ++-- .../sensors_plus/test/sensors_test.dart | 12 +++++ .../CHANGELOG.md | 4 ++ .../lib/sensors_plus_platform_interface.dart | 7 +++ .../lib/src/magnetometer_event.dart | 23 +++++++++ .../lib/src/method_channel_sensors.dart | 15 ++++++ .../pubspec.yaml | 2 +- .../sensors_plus_platform_interface_test.dart | 17 +++++++ .../sensors_plus_web/CHANGELOG.md | 4 ++ .../lib/sensors_plus_web.dart | 5 ++ .../sensors_plus_web/lib/src/sensors.dart | 50 ++++++++++++++++++- .../sensors_plus_web/pubspec.yaml | 4 +- 22 files changed, 250 insertions(+), 22 deletions(-) create mode 100644 packages/sensors_plus/sensors_plus_platform_interface/lib/src/magnetometer_event.dart diff --git a/packages/sensors_plus/sensors_plus/CHANGELOG.md b/packages/sensors_plus/sensors_plus/CHANGELOG.md index fba091e699..28759a258d 100644 --- a/packages/sensors_plus/sensors_plus/CHANGELOG.md +++ b/packages/sensors_plus/sensors_plus/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.0 + +- Adds magnetometer support + ## 1.0.2 - Android: migrate to mavenCentral diff --git a/packages/sensors_plus/sensors_plus/README.md b/packages/sensors_plus/sensors_plus/README.md index c8d35da6c3..5278df0ee9 100644 --- a/packages/sensors_plus/sensors_plus/README.md +++ b/packages/sensors_plus/sensors_plus/README.md @@ -7,20 +7,22 @@

build

-A Flutter plugin to access the accelerometer and gyroscope sensors. + +A Flutter plugin to access the accelerometer, gyroscope, and magnetometer +sensors. ## Platform Support -| Android | iOS | MacOS | Web | Linux | Windows | -| :-----: | :-: | :---: | :-: | :---: | :----: | -| ✔️ | ✔️ | | ✔️ | | | +| Android | iOS | MacOS | Web | Linux | Windows | +| :-----: | :---: | :---: | :---: | :---: | :-----: | +| ✔️ | ✔️ | | ✔️ | | | ## Usage To use this plugin, add `sensors_plus` as a [dependency in your pubspec.yaml file](https://plus.fluttercommunity.dev/docs/overview). -This will expose three classes of sensor events, through three different +This will expose four classes of sensor events through four different streams. - `AccelerometerEvent`s describe the velocity of the device, including the @@ -30,9 +32,12 @@ streams. include gravity. They can also be thought of as just the user's affect on the device. - `GyroscopeEvent`s describe the rotation of the device. +- `MagnetometerEvent`s describe the ambient magnetic field surrounding the + device. A compass is an example usage of this data. Each of these is exposed through a `BroadcastStream`: `accelerometerEvents`, -`userAccelerometerEvents`, and `gyroscopeEvents`, respectively. +`userAccelerometerEvents`, `gyroscopeEvents`, and `magnetometerEvents`, +respectively. ### Example @@ -54,11 +59,20 @@ gyroscopeEvents.listen((GyroscopeEvent event) { }); // [GyroscopeEvent (x: 0.0, y: 0.0, z: 0.0)] +magnetometerEvents.listen((MagnetometerEvent event) { + print(event); +}); +// [MagnetometerEvent (x: -23.6, y: 6.2, z: -34.9)] + ``` Also see the `example` subdirectory for an example application that uses the sensor data. -Check out our documentation website to learn more. [Plus plugins documentation](https://plus.fluttercommunity.dev/docs/overview) +Check out our website to learn more: [Plus Plugins documentation](https://plus.fluttercommunity.dev/docs/overview) -**Important:** As of January 2021, the Flutter team is no longer accepting non-critical PRs for the original set of plugins in `flutter/plugins`, and instead they should be submitted in this project. [You can read more about this announcement here.](https://github.com/flutter/plugins/blob/master/CONTRIBUTING.md#important-note) as well as [in the Flutter 2 announcement blog post.](https://medium.com/flutter/whats-new-in-flutter-2-0-fe8e95ecc65) +**Important:** As of January 2021, the Flutter team is no longer accepting +non-critical PRs for the original set of plugins in `flutter/plugins`, and +instead they should be submitted in this project. +[You can read more about this announcement here](https://github.com/flutter/plugins/blob/master/CONTRIBUTING.md#important-note) +as well as [in the Flutter 2 announcement blog post](https://medium.com/flutter/whats-new-in-flutter-2-0-fe8e95ecc65). diff --git a/packages/sensors_plus/sensors_plus/android/src/main/java/dev/fluttercommunity/plus/sensors/SensorsPlugin.java b/packages/sensors_plus/sensors_plus/android/src/main/java/dev/fluttercommunity/plus/sensors/SensorsPlugin.java index e4d7211ddb..ea32611853 100644 --- a/packages/sensors_plus/sensors_plus/android/src/main/java/dev/fluttercommunity/plus/sensors/SensorsPlugin.java +++ b/packages/sensors_plus/sensors_plus/android/src/main/java/dev/fluttercommunity/plus/sensors/SensorsPlugin.java @@ -20,10 +20,13 @@ public class SensorsPlugin implements FlutterPlugin { "dev.fluttercommunity.plus/sensors/gyroscope"; private static final String USER_ACCELEROMETER_CHANNEL_NAME = "dev.fluttercommunity.plus/sensors/user_accel"; + private static final String MAGNETOMETER_CHANNEL_NAME = + "dev.fluttercommunity.plus/sensors/magnetometer"; private EventChannel accelerometerChannel; private EventChannel userAccelChannel; private EventChannel gyroscopeChannel; + private EventChannel magnetometerChannel; /** Plugin registration. */ public static void registerWith(Registrar registrar) { @@ -63,11 +66,19 @@ private void setupEventChannels(Context context, BinaryMessenger messenger) { (SensorManager) context.getSystemService(context.SENSOR_SERVICE), Sensor.TYPE_GYROSCOPE); gyroscopeChannel.setStreamHandler(gyroScopeStreamHandler); + + magnetometerChannel = new EventChannel(messenger, MAGNETOMETER_CHANNEL_NAME); + final StreamHandlerImpl magnetometerStreamHandler = + new StreamHandlerImpl( + (SensorManager) context.getSystemService(context.SENSOR_SERVICE), + Sensor.TYPE_MAGNETIC_FIELD); + magnetometerChannel.setStreamHandler(magnetometerStreamHandler); } private void teardownEventChannels() { accelerometerChannel.setStreamHandler(null); userAccelChannel.setStreamHandler(null); gyroscopeChannel.setStreamHandler(null); + magnetometerChannel.setStreamHandler(null); } } diff --git a/packages/sensors_plus/sensors_plus/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/sensors_plus/sensors_plus/example/android/gradle/wrapper/gradle-wrapper.properties index 019065d1d6..c9aebbe14f 100644 --- a/packages/sensors_plus/sensors_plus/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/packages/sensors_plus/sensors_plus/example/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip +# distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip diff --git a/packages/sensors_plus/sensors_plus/example/lib/main.dart b/packages/sensors_plus/sensors_plus/example/lib/main.dart index fb33a4a129..72dc809b7f 100644 --- a/packages/sensors_plus/sensors_plus/example/lib/main.dart +++ b/packages/sensors_plus/sensors_plus/example/lib/main.dart @@ -44,6 +44,7 @@ class _MyHomePageState extends State { List? _accelerometerValues; List? _userAccelerometerValues; List? _gyroscopeValues; + List? _magnetometerValues; final _streamSubscriptions = >[]; @override @@ -55,6 +56,8 @@ class _MyHomePageState extends State { final userAccelerometer = _userAccelerometerValues ?.map((double v) => v.toStringAsFixed(1)) .toList(); + final magnetometer = + _magnetometerValues?.map((double v) => v.toStringAsFixed(1)).toList(); return Scaffold( appBar: AppBar( @@ -106,6 +109,15 @@ class _MyHomePageState extends State { ], ), ), + Padding( + padding: const EdgeInsets.all(16.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Magnetometer: $magnetometer'), + ], + ), + ), ], ), ); @@ -149,5 +161,14 @@ class _MyHomePageState extends State { }, ), ); + _streamSubscriptions.add( + magnetometerEvents.listen( + (MagnetometerEvent event) { + setState(() { + _magnetometerValues = [event.x, event.y, event.z]; + }); + }, + ), + ); } } diff --git a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.h b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.h index 1cc3fa3ee0..70e48f9d9d 100644 --- a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.h +++ b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.h @@ -15,3 +15,6 @@ @interface FLTGyroscopeStreamHandlerPlus : NSObject @end + +@interface FLTMagnetometerStreamHandlerPlus : NSObject +@end diff --git a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m index c3c91244bc..79d4113207 100644 --- a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m +++ b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m @@ -28,6 +28,13 @@ + (void)registerWithRegistrar:(NSObject*)registrar { [FlutterEventChannel eventChannelWithName:@"dev.fluttercommunity.plus/sensors/gyroscope" binaryMessenger:[registrar messenger]]; [gyroscopeChannel setStreamHandler:gyroscopeStreamHandler]; + + FLTMagnetometerStreamHandlerPlus* magnetometerStreamHandler = + [[FLTMagnetometerStreamHandlerPlus alloc] init]; + FlutterEventChannel* magnetometerChannel = + [FlutterEventChannel eventChannelWithName:@"dev.fluttercommunity.plus/sensors/magnetometer" + binaryMessenger:[registrar messenger]]; + [magnetometerChannel setStreamHandler:magnetometerStreamHandler]; } @end @@ -113,3 +120,23 @@ - (FlutterError*)onCancelWithArguments:(id)arguments { } @end + +@implementation FLTMagnetometerStreamHandlerPlus + +- (FlutterError*)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink { + _initMotionManager(); + [_motionManager + startMagnetometerUpdatesToQueue:[[NSOperationQueue alloc] init] + withHandler:^(CMMagnetometerData* magData, NSError* error) { + CMMagneticField magneticField = magData.magneticField; + sendTriplet(magneticField.x, magneticField.y, magneticField.z, eventSink); + }]; + return nil; +} + +- (FlutterError*)onCancelWithArguments:(id)arguments { + [_motionManager stopMagnetometerUpdates]; + return nil; +} + +@end diff --git a/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec b/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec index 73c8dd7e87..b75167ce53 100644 --- a/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec +++ b/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec @@ -3,10 +3,10 @@ # Pod::Spec.new do |s| s.name = 'sensors_plus' - s.version = '0.0.1' - s.summary = 'Flutter Sensors' + s.version = '0.1.0' + s.summary = 'Flutter Community: Sensors Plus' s.description = <<-DESC -A Flutter plugin to access the accelerometer and gyroscope sensors. +Flutter plugin to access the accelerometer, gyroscope, and magnetometer sensors. DESC s.homepage = 'https://github.com/flutter/plugins' s.license = { :type => 'BSD', :file => '../LICENSE' } @@ -16,8 +16,7 @@ A Flutter plugin to access the accelerometer and gyroscope sensors. s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - + s.platform = :ios, '8.0' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } end - diff --git a/packages/sensors_plus/sensors_plus/lib/sensors_plus.dart b/packages/sensors_plus/sensors_plus/lib/sensors_plus.dart index 592a4d6d47..1ace1d9615 100644 --- a/packages/sensors_plus/sensors_plus/lib/sensors_plus.dart +++ b/packages/sensors_plus/sensors_plus/lib/sensors_plus.dart @@ -21,3 +21,8 @@ Stream get gyroscopeEvents { Stream get userAccelerometerEvents { return _sensors.userAccelerometerEvents; } + +/// A broadcast stream of events from the device magnetometer. +Stream get magnetometerEvents { + return _sensors.magnetometerEvents; +} diff --git a/packages/sensors_plus/sensors_plus/lib/src/sensors.dart b/packages/sensors_plus/sensors_plus/lib/src/sensors.dart index 414dea5fd1..59ac78cb8f 100644 --- a/packages/sensors_plus/sensors_plus/lib/src/sensors.dart +++ b/packages/sensors_plus/sensors_plus/lib/src/sensors.dart @@ -30,4 +30,10 @@ class Sensors extends SensorsPlatform { Stream get userAccelerometerEvents { return _platform.userAccelerometerEvents; } + + /// A broadcast stream of events from the device magnetometer. + @override + Stream get magnetometerEvents { + return _platform.magnetometerEvents; + } } diff --git a/packages/sensors_plus/sensors_plus/pubspec.yaml b/packages/sensors_plus/sensors_plus/pubspec.yaml index 9d40c62fc3..e1180b5383 100644 --- a/packages/sensors_plus/sensors_plus/pubspec.yaml +++ b/packages/sensors_plus/sensors_plus/pubspec.yaml @@ -1,6 +1,8 @@ name: sensors_plus -description: Flutter plugin for accessing accelerometer and gyroscope sensors. -version: 1.0.2 +description: > + Flutter plugin for accessing accelerometer, gyroscope, and magnetometer + sensors. +version: 1.1.0 homepage: https://plus.fluttercommunity.dev/ repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/ @@ -18,8 +20,8 @@ flutter: dependencies: flutter: sdk: flutter - sensors_plus_web: ^1.0.0 - sensors_plus_platform_interface: ^1.0.0 + sensors_plus_web: ^1.1.0 + sensors_plus_platform_interface: ^1.1.0 dev_dependencies: test: ^1.16.4 diff --git a/packages/sensors_plus/sensors_plus/test/sensors_test.dart b/packages/sensors_plus/sensors_plus/test/sensors_test.dart index e0ec680257..2a98c1d9fc 100644 --- a/packages/sensors_plus/sensors_plus/test/sensors_test.dart +++ b/packages/sensors_plus/sensors_plus/test/sensors_test.dart @@ -47,6 +47,18 @@ void main() { expect(event.y, sensorData[1]); expect(event.z, sensorData[2]); }); + + test('$magnetometerEvents are streamed', () async { + const channelName = 'dev.fluttercommunity.plus/sensors/magnetometer'; + const sensorData = [8.0, 9.0, 10.0]; + _initializeFakeSensorChannel(channelName, sensorData); + + final event = await magnetometerEvents.first; + + expect(event.x, sensorData[0]); + expect(event.y, sensorData[1]); + expect(event.z, sensorData[2]); + }); } void _initializeFakeSensorChannel(String channelName, List sensorData) { diff --git a/packages/sensors_plus/sensors_plus_platform_interface/CHANGELOG.md b/packages/sensors_plus/sensors_plus_platform_interface/CHANGELOG.md index 2ebb784572..9c993a02fb 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/CHANGELOG.md +++ b/packages/sensors_plus/sensors_plus_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.0 + +- Adds magnetometer support + ## 1.0.1 - Improve documentation diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/sensors_plus_platform_interface.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/sensors_plus_platform_interface.dart index 1fe8b9c9aa..0c1d041100 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/lib/sensors_plus_platform_interface.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/sensors_plus_platform_interface.dart @@ -9,10 +9,12 @@ import 'package:sensors_plus_platform_interface/src/method_channel_sensors.dart' import 'src/accelerometer_event.dart'; import 'src/gyroscope_event.dart'; +import 'src/magnetometer_event.dart'; import 'src/user_accelerometer_event.dart'; export 'src/accelerometer_event.dart'; export 'src/gyroscope_event.dart'; +export 'src/magnetometer_event.dart'; export 'src/user_accelerometer_event.dart'; /// The common platform interface for sensors. @@ -51,4 +53,9 @@ abstract class SensorsPlatform extends PlatformInterface { throw UnimplementedError( 'userAccelerometerEvents has not been implemented.'); } + + /// A broadcast stream of events from the device magnetometer. + Stream get magnetometerEvents { + throw UnimplementedError('magnetometerEvents has not been implemented.'); + } } diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/magnetometer_event.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/magnetometer_event.dart new file mode 100644 index 0000000000..7e411ed4d0 --- /dev/null +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/magnetometer_event.dart @@ -0,0 +1,23 @@ +/// A sensor sample from a magnetometer. +/// +/// Magnetometers measure the ambient magnetic field surrounding the sensor, +/// returning values in microteslas ***μT*** for each three-dimensional axis. +/// +/// Consider that these samples may bear effects of Earth's magnetic field as +/// well as local factors such as the metal of the device itself or nearby +/// magnets. +/// +/// A compass is an example of a general utility for magnetometer data. +class MagnetometerEvent { + /// Constructs a new instance with the given [x], [y], and [z] values. + /// + /// See [MagnetometerEvent] for more information. + MagnetometerEvent(this.x, this.y, this.z); + + /// The ambient magnetic field in this axis surrounding the sensor in + /// microteslas ***μT***. + final double x, y, z; + + @override + String toString() => '[MagnetometerEvent (x: $x, y: $y, z: $z)]'; +} diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/method_channel_sensors.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/method_channel_sensors.dart index 77862c24fa..6fbeacac5d 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/method_channel_sensors.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/method_channel_sensors.dart @@ -18,9 +18,13 @@ class MethodChannelSensors extends SensorsPlatform { static const EventChannel _gyroscopeEventChannel = EventChannel('dev.fluttercommunity.plus/sensors/gyroscope'); + static const EventChannel _magnetometerEventChannel = + EventChannel('dev.fluttercommunity.plus/sensors/magnetometer'); + Stream? _accelerometerEvents; Stream? _gyroscopeEvents; Stream? _userAccelerometerEvents; + Stream? _magnetometerEvents; /// A broadcast stream of events from the device accelerometer. @override @@ -56,4 +60,15 @@ class MethodChannelSensors extends SensorsPlatform { }); return _userAccelerometerEvents!; } + + /// A broadcast stream of events from the device magnetometer. + @override + Stream get magnetometerEvents { + _magnetometerEvents ??= + _magnetometerEventChannel.receiveBroadcastStream().map((dynamic event) { + final list = event.cast(); + return MagnetometerEvent(list[0]!, list[1]!, list[2]!); + }); + return _magnetometerEvents!; + } } diff --git a/packages/sensors_plus/sensors_plus_platform_interface/pubspec.yaml b/packages/sensors_plus/sensors_plus_platform_interface/pubspec.yaml index 9443481392..c6790a0920 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/pubspec.yaml +++ b/packages/sensors_plus/sensors_plus_platform_interface/pubspec.yaml @@ -1,6 +1,6 @@ name: sensors_plus_platform_interface description: A common platform interface for the sensors_plus plugin. -version: 1.0.1 +version: 1.1.0 homepage: https://plus.fluttercommunity.dev/ repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/ diff --git a/packages/sensors_plus/sensors_plus_platform_interface/test/sensors_plus_platform_interface_test.dart b/packages/sensors_plus/sensors_plus_platform_interface/test/sensors_plus_platform_interface_test.dart index 6d88e696d8..b7bff2dbf4 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/test/sensors_plus_platform_interface_test.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/test/sensors_plus_platform_interface_test.dart @@ -27,6 +27,11 @@ Stream get userAccelerometerEvents { return methodChannel.userAccelerometerEvents; } +/// A broadcast stream of events from the device magnetometer. +Stream get magnetometerEvents { + return methodChannel.magnetometerEvents; +} + void main() { TestWidgetsFlutterBinding.ensureInitialized(); @@ -65,6 +70,18 @@ void main() { expect(event.y, sensorData[1]); expect(event.z, sensorData[2]); }); + + test('$magnetometerEvents are streamed', () async { + const channelName = 'dev.fluttercommunity.plus/sensors/magnetometer'; + const sensorData = [8.0, 9.0, 10.0]; + _initializeFakeSensorChannel(channelName, sensorData); + + final event = await magnetometerEvents.first; + + expect(event.x, sensorData[0]); + expect(event.y, sensorData[1]); + expect(event.z, sensorData[2]); + }); } void _initializeFakeSensorChannel(String channelName, List sensorData) { diff --git a/packages/sensors_plus/sensors_plus_web/CHANGELOG.md b/packages/sensors_plus/sensors_plus_web/CHANGELOG.md index 2ebb784572..9c993a02fb 100644 --- a/packages/sensors_plus/sensors_plus_web/CHANGELOG.md +++ b/packages/sensors_plus/sensors_plus_web/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.0 + +- Adds magnetometer support + ## 1.0.1 - Improve documentation diff --git a/packages/sensors_plus/sensors_plus_web/lib/sensors_plus_web.dart b/packages/sensors_plus/sensors_plus_web/lib/sensors_plus_web.dart index 39e5cccaa8..5bfae106cb 100644 --- a/packages/sensors_plus/sensors_plus_web/lib/sensors_plus_web.dart +++ b/packages/sensors_plus/sensors_plus_web/lib/sensors_plus_web.dart @@ -21,3 +21,8 @@ Stream get gyroscopeEvents { Stream get userAccelerometerEvents { return _sensors.userAccelerometerEvents; } + +/// A broadcast stream of events from the device magnetometer. +Stream get magnetometerEvents { + return _sensors.magnetometerEvents; +} diff --git a/packages/sensors_plus/sensors_plus_web/lib/src/sensors.dart b/packages/sensors_plus/sensors_plus_web/lib/src/sensors.dart index 963fc7d1fe..e02d742f90 100644 --- a/packages/sensors_plus/sensors_plus_web/lib/src/sensors.dart +++ b/packages/sensors_plus/sensors_plus_web/lib/src/sensors.dart @@ -1,6 +1,6 @@ import 'dart:async'; import 'dart:html' as html - show LinearAccelerationSensor, Accelerometer, Gyroscope; + show LinearAccelerationSensor, Accelerometer, Gyroscope, Magnetometer; import 'dart:js'; import 'dart:js_util'; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; @@ -187,4 +187,52 @@ class SensorsPlugin extends SensorsPlatform { return _userAccelerometerResultStream; } + + StreamController? _magnetometerStreamController; + late Stream _magnetometerResultStream; + + @override + Stream get magnetometerEvents { + if (_magnetometerStreamController == null) { + _magnetometerStreamController = StreamController(); + _featureDetected( + () { + final _magnetometerSensor = html.Magnetometer(); + + setProperty( + _magnetometerSensor, + 'onreading', + allowInterop( + (_) { + _magnetometerStreamController!.add( + MagnetometerEvent( + _magnetometerSensor.x as double, + _magnetometerSensor.y as double, + _magnetometerSensor.z as double, + ), + ); + }, + ), + ); + + _magnetometerSensor.start(); + + _magnetometerSensor.onError.forEach( + (e) => + print('[SensorsPlugin] API supported but something is wrong: ' + 'Magnetometer $e'), + ); + }, + apiName: 'Magnetometer()', + premissionName: 'magnetometer', + onError: () { + _magnetometerStreamController!.add(MagnetometerEvent(0, 0, 0)); + }, + ); + _magnetometerResultStream = + _magnetometerStreamController!.stream.asBroadcastStream(); + } + + return _magnetometerResultStream; + } } diff --git a/packages/sensors_plus/sensors_plus_web/pubspec.yaml b/packages/sensors_plus/sensors_plus_web/pubspec.yaml index 6652f578c7..f735b4f3d6 100644 --- a/packages/sensors_plus/sensors_plus_web/pubspec.yaml +++ b/packages/sensors_plus/sensors_plus_web/pubspec.yaml @@ -1,6 +1,6 @@ name: sensors_plus_web description: The web implementation of sensors_plus -version: 1.0.1 +version: 1.1.0 homepage: https://plus.fluttercommunity.dev/ repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/ @@ -18,7 +18,7 @@ flutter: dependencies: flutter: sdk: flutter - sensors_plus_platform_interface: ^1.0.0 + sensors_plus_platform_interface: ^1.1.0 flutter_web_plugins: sdk: flutter From 976e7fb5e4e87abb1326987556883300dc57a013 Mon Sep 17 00:00:00 2001 From: Zabadam <65806473+Zabadam@users.noreply.github.com> Date: Sat, 31 Jul 2021 15:29:50 -0500 Subject: [PATCH 4/9] typo(sensors_plus) fix typo in `FooEvent` constructors and web API utils "Contructs" -> "Constructs" & "premission" -> "permission" --- .../lib/src/accelerometer_event.dart | 2 +- .../lib/src/gyroscope_event.dart | 2 +- .../lib/src/user_accelerometer_event.dart | 2 +- packages/sensors_plus/sensors_plus_web/lib/src/utils.dart | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/accelerometer_event.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/accelerometer_event.dart index 4d53329ef5..57d688a4ba 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/accelerometer_event.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/accelerometer_event.dart @@ -7,7 +7,7 @@ /// 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. + /// Constructs 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. diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/gyroscope_event.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/gyroscope_event.dart index 4413421019..59c90e4b85 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/gyroscope_event.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/gyroscope_event.dart @@ -5,7 +5,7 @@ /// 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. + /// Constructs 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. diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/user_accelerometer_event.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/user_accelerometer_event.dart index 3950edb12a..c8d2fa8ded 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/user_accelerometer_event.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/user_accelerometer_event.dart @@ -6,7 +6,7 @@ /// 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. + /// Constructs 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. diff --git a/packages/sensors_plus/sensors_plus_web/lib/src/utils.dart b/packages/sensors_plus/sensors_plus_web/lib/src/utils.dart index bd118984c1..dedcd3fd53 100644 --- a/packages/sensors_plus/sensors_plus_web/lib/src/utils.dart +++ b/packages/sensors_plus/sensors_plus_web/lib/src/utils.dart @@ -1,16 +1,16 @@ import 'dart:html' as html; -/// Receive premission status of the API +/// Receive permission status of the API. Future checkPremission( Function initSensor, { String? premissionName, }) async { final _premission = html.window.navigator.permissions; - /// check if browser supports this API or support premission manager + // Check if browser supports this API or supports permission manager if (_premission != null) { try { - /// request for permission or check premission status + // Request for permission or check premission status final premissionStatus = await _premission.query( { 'name': premissionName, @@ -24,7 +24,7 @@ Future checkPremission( 'Premission [$premissionName] still has not been granted or denied.', ); } else { - /// if permission is denied, do not do anything + // If permission is denied, do not do anything print('Permission [$premissionName] to use sensor was denied.'); } } catch (e) { From 2ee2820b75001854731670576173fcdaff702bfd Mon Sep 17 00:00:00 2001 From: Zabadam <65806473+Zabadam@users.noreply.github.com> Date: Wed, 4 Aug 2021 12:25:10 -0500 Subject: [PATCH 5/9] Run `format` and revert `podspec` Attempting to pass PR tests. --- .../sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m | 11 ++++++----- .../sensors_plus/ios/sensors_plus.podspec | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m index 79d4113207..4bc23f547f 100644 --- a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m +++ b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m @@ -125,12 +125,13 @@ @implementation FLTMagnetometerStreamHandlerPlus - (FlutterError*)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink { _initMotionManager(); - [_motionManager startMagnetometerUpdatesToQueue:[[NSOperationQueue alloc] init] - withHandler:^(CMMagnetometerData* magData, NSError* error) { - CMMagneticField magneticField = magData.magneticField; - sendTriplet(magneticField.x, magneticField.y, magneticField.z, eventSink); - }]; + [_motionManager startMagnetometerUpdatesToQueue:[[NSOperationQueue alloc] init] + withHandler:^(CMMagnetometerData* magData, NSError* error) { + CMMagneticField magneticField = magData.magneticField; + sendTriplet(magneticField.x, magneticField.y, + magneticField.z, eventSink); + }]; return nil; } diff --git a/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec b/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec index b75167ce53..1c593746ff 100644 --- a/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec +++ b/packages/sensors_plus/sensors_plus/ios/sensors_plus.podspec @@ -3,8 +3,8 @@ # Pod::Spec.new do |s| s.name = 'sensors_plus' - s.version = '0.1.0' - s.summary = 'Flutter Community: Sensors Plus' + s.version = '0.0.1' + s.summary = 'Flutter Sensors' s.description = <<-DESC Flutter plugin to access the accelerometer, gyroscope, and magnetometer sensors. DESC From 95107711786f502b7922cd7afdda930879628b2e Mon Sep 17 00:00:00 2001 From: Zabadam <65806473+Zabadam@users.noreply.github.com> Date: Thu, 12 Aug 2021 08:23:17 -0500 Subject: [PATCH 6/9] `format` FTLSensorsPlusPlugin.m --- .../sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m index 4bc23f547f..85f2ca6b76 100644 --- a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m +++ b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m @@ -125,7 +125,6 @@ @implementation FLTMagnetometerStreamHandlerPlus - (FlutterError*)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink { _initMotionManager(); - startMagnetometerUpdatesToQueue:[[NSOperationQueue alloc] init] [_motionManager startMagnetometerUpdatesToQueue:[[NSOperationQueue alloc] init] withHandler:^(CMMagnetometerData* magData, NSError* error) { CMMagneticField magneticField = magData.magneticField; From ee9ff5127f7cfbca9a20f2336cc295a2be3b9c16 Mon Sep 17 00:00:00 2001 From: Zabadam <65806473+Zabadam@users.noreply.github.com> Date: Tue, 29 Mar 2022 23:38:38 -0500 Subject: [PATCH 7/9] fix(sensors_plus): iOS calibrated magnetometer As described in #781 the current implementation of **magnetometer** sensor data acquisition for iOS does not use calibrated values evaluated by iOS's `DeviceMotion` sensor, but rather the raw samples straight from the sensor. As the **user acceleration** implementation already employs this *calibrated* `DeviceMotion` sensor, it seems like an appropriate solution to acquiring compensated magnetometer data as well. `melos run format` made changes to a huge number of files across all packages. I discarded all changes outside of `packages\sensors_plus\`. The focus of this PR is the magnetometer implementation at the end of `sensors_plus\sensors_plus\ios\Classes\FLTSensorsPlusPlugin.m`. --- .../sensors_plus/sensors_plus/CHANGELOG.md | 5 ++ .../sensors_plus/example/ios/Runner/main.m | 2 +- .../ios/Classes/FLTSensorsPlusPlugin.m | 67 +++++++++++-------- .../sensors_plus/sensors_plus/pubspec.yaml | 2 +- .../lib/src/magnetometer_event.dart | 2 +- 5 files changed, 46 insertions(+), 32 deletions(-) diff --git a/packages/sensors_plus/sensors_plus/CHANGELOG.md b/packages/sensors_plus/sensors_plus/CHANGELOG.md index 8b0291454f..cfa13277c5 100644 --- a/packages/sensors_plus/sensors_plus/CHANGELOG.md +++ b/packages/sensors_plus/sensors_plus/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.4.0 + +- iOS: Corrects magnetometer implementation, returning calibrated values from + `DeviceMotion` sensor rather than raw sensor samples + ## 1.3.0 - Android: Migrate to Kotlin diff --git a/packages/sensors_plus/sensors_plus/example/ios/Runner/main.m b/packages/sensors_plus/sensors_plus/example/ios/Runner/main.m index dff6597e45..31030600ec 100644 --- a/packages/sensors_plus/sensors_plus/example/ios/Runner/main.m +++ b/packages/sensors_plus/sensors_plus/example/ios/Runner/main.m @@ -2,7 +2,7 @@ #import #import "AppDelegate.h" -int main(int argc, char* argv[]) { +int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } diff --git a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m index 85f2ca6b76..6223346595 100644 --- a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m +++ b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m @@ -7,31 +7,31 @@ @implementation FLTSensorsPlusPlugin -+ (void)registerWithRegistrar:(NSObject*)registrar { - FLTAccelerometerStreamHandlerPlus* accelerometerStreamHandler = ++ (void)registerWithRegistrar:(NSObject *)registrar { + FLTAccelerometerStreamHandlerPlus *accelerometerStreamHandler = [[FLTAccelerometerStreamHandlerPlus alloc] init]; - FlutterEventChannel* accelerometerChannel = + FlutterEventChannel *accelerometerChannel = [FlutterEventChannel eventChannelWithName:@"dev.fluttercommunity.plus/sensors/accelerometer" binaryMessenger:[registrar messenger]]; [accelerometerChannel setStreamHandler:accelerometerStreamHandler]; - FLTUserAccelStreamHandlerPlus* userAccelerometerStreamHandler = + FLTUserAccelStreamHandlerPlus *userAccelerometerStreamHandler = [[FLTUserAccelStreamHandlerPlus alloc] init]; - FlutterEventChannel* userAccelerometerChannel = + FlutterEventChannel *userAccelerometerChannel = [FlutterEventChannel eventChannelWithName:@"dev.fluttercommunity.plus/sensors/user_accel" binaryMessenger:[registrar messenger]]; [userAccelerometerChannel setStreamHandler:userAccelerometerStreamHandler]; - FLTGyroscopeStreamHandlerPlus* gyroscopeStreamHandler = + FLTGyroscopeStreamHandlerPlus *gyroscopeStreamHandler = [[FLTGyroscopeStreamHandlerPlus alloc] init]; - FlutterEventChannel* gyroscopeChannel = + FlutterEventChannel *gyroscopeChannel = [FlutterEventChannel eventChannelWithName:@"dev.fluttercommunity.plus/sensors/gyroscope" binaryMessenger:[registrar messenger]]; [gyroscopeChannel setStreamHandler:gyroscopeStreamHandler]; - FLTMagnetometerStreamHandlerPlus* magnetometerStreamHandler = + FLTMagnetometerStreamHandlerPlus *magnetometerStreamHandler = [[FLTMagnetometerStreamHandlerPlus alloc] init]; - FlutterEventChannel* magnetometerChannel = + FlutterEventChannel *magnetometerChannel = [FlutterEventChannel eventChannelWithName:@"dev.fluttercommunity.plus/sensors/magnetometer" binaryMessenger:[registrar messenger]]; [magnetometerChannel setStreamHandler:magnetometerStreamHandler]; @@ -40,7 +40,7 @@ + (void)registerWithRegistrar:(NSObject*)registrar { @end const double GRAVITY = 9.8; -CMMotionManager* _motionManager; +CMMotionManager *_motionManager; void _initMotionManager() { if (!_motionManager) { @@ -49,7 +49,7 @@ void _initMotionManager() { } static void sendTriplet(Float64 x, Float64 y, Float64 z, FlutterEventSink sink) { - NSMutableData* event = [NSMutableData dataWithCapacity:3 * sizeof(Float64)]; + NSMutableData *event = [NSMutableData dataWithCapacity:3 * sizeof(Float64)]; [event appendBytes:&x length:sizeof(Float64)]; [event appendBytes:&y length:sizeof(Float64)]; [event appendBytes:&z length:sizeof(Float64)]; @@ -58,11 +58,11 @@ static void sendTriplet(Float64 x, Float64 y, Float64 z, FlutterEventSink sink) @implementation FLTAccelerometerStreamHandlerPlus -- (FlutterError*)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink { +- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink { _initMotionManager(); [_motionManager startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc] init] - withHandler:^(CMAccelerometerData* accelerometerData, NSError* error) { + withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) { CMAcceleration acceleration = accelerometerData.acceleration; // Multiply by gravity, and adjust sign values to // align with Android. @@ -72,7 +72,7 @@ - (FlutterError*)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink return nil; } -- (FlutterError*)onCancelWithArguments:(id)arguments { +- (FlutterError *)onCancelWithArguments:(id)arguments { [_motionManager stopAccelerometerUpdates]; return nil; } @@ -81,20 +81,21 @@ - (FlutterError*)onCancelWithArguments:(id)arguments { @implementation FLTUserAccelStreamHandlerPlus -- (FlutterError*)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink { +- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink { _initMotionManager(); [_motionManager startDeviceMotionUpdatesToQueue:[[NSOperationQueue alloc] init] - withHandler:^(CMDeviceMotion* data, NSError* error) { + withHandler:^(CMDeviceMotion *data, NSError *error) { CMAcceleration acceleration = data.userAcceleration; - // Multiply by gravity, and adjust sign values to align with Android. + // Multiply by gravity, and adjust sign values to + // align with Android. sendTriplet(-acceleration.x * GRAVITY, -acceleration.y * GRAVITY, -acceleration.z * GRAVITY, eventSink); }]; return nil; } -- (FlutterError*)onCancelWithArguments:(id)arguments { +- (FlutterError *)onCancelWithArguments:(id)arguments { [_motionManager stopDeviceMotionUpdates]; return nil; } @@ -103,18 +104,18 @@ - (FlutterError*)onCancelWithArguments:(id)arguments { @implementation FLTGyroscopeStreamHandlerPlus -- (FlutterError*)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink { +- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink { _initMotionManager(); [_motionManager startGyroUpdatesToQueue:[[NSOperationQueue alloc] init] - withHandler:^(CMGyroData* gyroData, NSError* error) { + withHandler:^(CMGyroData *gyroData, NSError *error) { CMRotationRate rotationRate = gyroData.rotationRate; sendTriplet(rotationRate.x, rotationRate.y, rotationRate.z, eventSink); }]; return nil; } -- (FlutterError*)onCancelWithArguments:(id)arguments { +- (FlutterError *)onCancelWithArguments:(id)arguments { [_motionManager stopGyroUpdates]; return nil; } @@ -123,19 +124,27 @@ - (FlutterError*)onCancelWithArguments:(id)arguments { @implementation FLTMagnetometerStreamHandlerPlus -- (FlutterError*)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink { +- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink { _initMotionManager(); - [_motionManager startMagnetometerUpdatesToQueue:[[NSOperationQueue alloc] init] - withHandler:^(CMMagnetometerData* magData, NSError* error) { - CMMagneticField magneticField = magData.magneticField; - sendTriplet(magneticField.x, magneticField.y, - magneticField.z, eventSink); + // Allow iOS to present calibration interaction + _motionManager.showsDeviceMovementDisplay = YES; + [_motionManager + startDeviceMotionUpdatesUsingReferenceFrame: + CMAttitudeReferenceFrameXArbitraryCorrectedZVertical + ToQueue:[[NSOperationQueue alloc] init] + withHandler:^(CMDeviceMotion *motionData, NSError *error) { + // The `magneticField` from CMDeviceMotion + // is of type CMCalibratedMagneticField + // which has an `accuracy` and a standard + // CMMagneticField `field`. + CMMagneticField field = motionData.magneticField.field; + sendTriplet(field.x, field.y, field.z, eventSink); }]; return nil; } -- (FlutterError*)onCancelWithArguments:(id)arguments { - [_motionManager stopMagnetometerUpdates]; +- (FlutterError *)onCancelWithArguments:(id)arguments { + [_motionManager stopDeviceMotionUpdates]; return nil; } diff --git a/packages/sensors_plus/sensors_plus/pubspec.yaml b/packages/sensors_plus/sensors_plus/pubspec.yaml index a19cab6a79..3c623a1957 100644 --- a/packages/sensors_plus/sensors_plus/pubspec.yaml +++ b/packages/sensors_plus/sensors_plus/pubspec.yaml @@ -2,7 +2,7 @@ name: sensors_plus description: > Flutter plugin for accessing accelerometer, gyroscope, and magnetometer sensors. -version: 1.3.0 +version: 1.4.0 homepage: https://plus.fluttercommunity.dev/ repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/ diff --git a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/magnetometer_event.dart b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/magnetometer_event.dart index 7e411ed4d0..b17eef1507 100644 --- a/packages/sensors_plus/sensors_plus_platform_interface/lib/src/magnetometer_event.dart +++ b/packages/sensors_plus/sensors_plus_platform_interface/lib/src/magnetometer_event.dart @@ -5,7 +5,7 @@ /// /// Consider that these samples may bear effects of Earth's magnetic field as /// well as local factors such as the metal of the device itself or nearby -/// magnets. +/// magnets, though most devices compensate for these factors. /// /// A compass is an example of a general utility for magnetometer data. class MagnetometerEvent { From e4fcebb037b5bbba259f70affbed1d482db47b66 Mon Sep 17 00:00:00 2001 From: Zabadam <65806473+Zabadam@users.noreply.github.com> Date: Sat, 24 Sep 2022 16:58:28 -0500 Subject: [PATCH 8/9] melos `format` While prior merge conflict was resolved via github.com, this push ran true melos format command. Abbreviations were made to comment to accommodate the smaller formatted space. --- .../ios/Classes/FLTSensorsPlusPlugin.m | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m index 44441e802a..7f6f3dd897 100644 --- a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m +++ b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m @@ -223,12 +223,15 @@ - (FlutterError *)onListenWithArguments:(id)arguments [_motionManager startDeviceMotionUpdatesUsingReferenceFrame: CMAttitudeReferenceFrameXArbitraryCorrectedZVertical - ToQueue:[[NSOperationQueue alloc] init] - withHandler:^(CMDeviceMotion *motionData, NSError *error) { - // The `magneticField` is CMCalibratedMagneticField - // which has an `accuracy` and a CMMagneticField. - CMMagneticField field = motionData.magneticField.field; - sendTriplet(field.x, field.y, field.z, eventSink); + ToQueue:[[NSOperationQueue alloc] + init] + withHandler:^(CMDeviceMotion *motionData, + NSError *error) { + // The `magneticField` is a + // CMCalibratedMagneticField. + CMMagneticField b = + motionData.magneticField.field; + sendTriplet(b.x, b.y, b.z, eventSink); }]; return nil; } @@ -242,4 +245,4 @@ - (void)dealloc { _cleanUp(); } -@end \ No newline at end of file +@end From 89afe676bc0c59519d930045a2ad4cbf436a6e73 Mon Sep 17 00:00:00 2001 From: Zabadam <65806473+Zabadam@users.noreply.github.com> Date: Mon, 26 Sep 2022 15:27:19 -0500 Subject: [PATCH 9/9] Fixing uncaught XCode warning and error (typo) Also altering reference frame from `XArbitraryCorrectedZVertical` to `XMagneticNorthZVertical` which may or may not impact the effectiveness of the magnetometer calibration. --- .../sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m index 7f6f3dd897..11b63e809c 100644 --- a/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m +++ b/packages/sensors_plus/sensors_plus/ios/Classes/FLTSensorsPlusPlugin.m @@ -92,7 +92,7 @@ static void _cleanUp() { const double GRAVITY = 9.8; CMMotionManager *_motionManager; -void _initMotionManager() { +void _initMotionManager(void) { if (!_motionManager) { _motionManager = [[CMMotionManager alloc] init]; } @@ -222,8 +222,12 @@ - (FlutterError *)onListenWithArguments:(id)arguments _motionManager.showsDeviceMovementDisplay = YES; [_motionManager startDeviceMotionUpdatesUsingReferenceFrame: - CMAttitudeReferenceFrameXArbitraryCorrectedZVertical - ToQueue:[[NSOperationQueue alloc] + // https://developer.apple.com/documentation/coremotion/cmattitudereferenceframe?language=objc + // "Using this reference frame may require device movement to + // calibrate the magnetometer," which is desired to ensure the + // DeviceMotion actually has updated, calibrated geomagnetic data. + CMAttitudeReferenceFrameXMagneticNorthZVertical + toQueue:[[NSOperationQueue alloc] init] withHandler:^(CMDeviceMotion *motionData, NSError *error) { @@ -231,6 +235,9 @@ - (FlutterError *)onListenWithArguments:(id)arguments // CMCalibratedMagneticField. CMMagneticField b = motionData.magneticField.field; + if (_isCleanUp) { + return; + } sendTriplet(b.x, b.y, b.z, eventSink); }]; return nil;