Browse Source

Merge branch 'sensors_qt' into 'master'

[sensors-plus] Implement sensors_plus plugin. OMP#OS-17084

See merge request non-oss/flutter/flutter-plugins!27
merge-requests/27/merge
Vitaliy Zarubin 2 years ago
parent
commit
2e4dbeef19
  1. 96
      example/app_run.sh
  2. 2
      example/aurora/desktop/ru.auroraos.flutter_example_packages.desktop
  3. 2
      example/aurora/main.cpp
  4. 1
      example/aurora/rpm/ru.auroraos.flutter_example_packages.spec
  5. 20
      example/lib/l10n/app_en.arb
  6. 20
      example/lib/l10n/app_ru.arb
  7. 2
      example/lib/packages/flutter_keyboard_visibility/page.dart
  8. 2
      example/lib/packages/packages.dart
  9. 11
      example/lib/packages/sensors_plus/model.dart
  10. 26
      example/lib/packages/sensors_plus/package.dart
  11. 209
      example/lib/packages/sensors_plus/page.dart
  12. 2
      example/lib/packages/translator/page.dart
  13. 10
      example/lib/widgets/blocks/block_item.dart
  14. 1159
      example/pubspec.lock
  15. 6
      example/pubspec.yaml
  16. 30
      packages/sensors_plus/sensors_plus_aurora/.gitignore
  17. 30
      packages/sensors_plus/sensors_plus_aurora/.metadata
  18. 135
      packages/sensors_plus/sensors_plus_aurora/README.md
  19. 4
      packages/sensors_plus/sensors_plus_aurora/analysis_options.yaml
  20. 34
      packages/sensors_plus/sensors_plus_aurora/aurora/CMakeLists.txt
  21. 15
      packages/sensors_plus/sensors_plus_aurora/aurora/include/sensors_plus_aurora/globals.h
  22. 84
      packages/sensors_plus/sensors_plus_aurora/aurora/include/sensors_plus_aurora/sensors_plus_aurora_plugin.h
  23. 524
      packages/sensors_plus/sensors_plus_aurora/aurora/sensors_plus_aurora_plugin.cpp
  24. 11
      packages/sensors_plus/sensors_plus_aurora/lib/events/als_event.dart
  25. 13
      packages/sensors_plus/sensors_plus_aurora/lib/events/compass_event.dart
  26. 25
      packages/sensors_plus/sensors_plus_aurora/lib/events/orientation_event.dart
  27. 11
      packages/sensors_plus/sensors_plus_aurora/lib/events/proximity_event.dart
  28. 53
      packages/sensors_plus/sensors_plus_aurora/lib/events/tap_event.dart
  29. 93
      packages/sensors_plus/sensors_plus_aurora/lib/sensors_plus_aurora.dart
  30. 148
      packages/sensors_plus/sensors_plus_aurora/lib/sensors_plus_aurora_method_channel.dart
  31. 66
      packages/sensors_plus/sensors_plus_aurora/lib/sensors_plus_aurora_platform_interface.dart
  32. 28
      packages/sensors_plus/sensors_plus_aurora/pubspec.yaml

96
example/app_run.sh

@ -0,0 +1,96 @@
#!/bin/bash
# SPDX-FileCopyrightText: 2023 Open Mobile Platform LLC <community@omp.ru>
# SPDX-License-Identifier: BSD-3-Clause
## Build example, sign rpm, upload/install/run rpm to device
## Usage
##
## chmod +x ./run.sh
##
## ./run.sh \
## -d <ip>:<password> \
## -s /home/user/sign/folder
sudo echo 'Start...';
## Flutter path
FLUTTER="$HOME/.local/opt/flutter/bin/flutter"
## https://developer.auroraos.ru/doc/software_development/psdk/setup
## Install Platform SDK path
## You may not have set the PSDK_DIR environment variable.
## export PSDK_DIR=$HOME/AuroraPlatformSDK/sdks/aurora_psdk
while getopts d:s: flag; do
case "${flag}" in
d) device=${OPTARG} ;;
s) sign=${OPTARG} ;;
*)
echo "usage: $0 [-d] [-s]" >&2
exit 1
;;
esac
done
## Update dependency
$FLUTTER pub get
## Generate internationalizing
$FLUTTER pub run build_runner build
## Run ffigen
# $FLUTTER pub run ffigen
## Build aurora example app
{
$FLUTTER build aurora --release
} || {
exit 1;
}
if [ -n "$sign" ]; then
key=$(ls "$sign"/*key.pem)
if [ -z "$key" ]; then
echo "Key *key.pem not found."
exit
fi
cert=$(ls "$sign"/*cert.pem)
if [ -z "$cert" ]; then
echo "Key *cert.pem not found."
exit
fi
## Sign rpm system key
"$PSDK_DIR"/sdk-chroot rpmsign-external sign \
--key "$key" \
--cert "$cert" \
build/aurora/arm/release/RPMS/*.rpm
fi
if [ -n "$device" ]; then
PACKAGE="ru.auroraos.flutter_example_packages"
IFS=':' read -ra ADDR <<< "$device"
D_IP="${ADDR[0]}"
D_PASS="${ADDR[1]}"
# shellcheck disable=SC2012
rpm=$(ls "$PWD"/build/aurora/arm/release/RPMS/*.rpm | sort -r | head -n 1)
# upload rpm
scp "$rpm" defaultuser@"$D_IP:/home/defaultuser/Downloads"
# install rpm
ssh -t defaultuser@"$D_IP" "echo $D_PASS | devel-su pkcon -y install-local /home/defaultuser/Downloads/$PACKAGE*.rpm"
# run application
ssh -t defaultuser@"$D_IP" "/usr/bin/$PACKAGE"
fi

2
example/aurora/desktop/ru.auroraos.flutter_example_packages.desktop

@ -7,6 +7,6 @@ Exec=/usr/bin/ru.auroraos.flutter_example_packages
X-Nemo-Application-Type=silica-qt5
[X-Application]
Permissions=DeviceInfo,UserDirs
Permissions=DeviceInfo,UserDirs,Sensors
OrganizationName=ru.auroraos
ApplicationName=flutter_example_packages

2
example/aurora/main.cpp

@ -3,10 +3,12 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <flutter/application.h>
#include <flutter/compatibility.h>
#include "generated_plugin_registrant.h"
int main(int argc, char *argv[]) {
Application::Initialize(argc, argv);
EnableQtCompatibility();
RegisterPlugins();
Application::Launch();
return 0;

1
example/aurora/rpm/ru.auroraos.flutter_example_packages.spec

@ -11,6 +11,7 @@ Source0: %{name}-%{version}.tar.zst
BuildRequires: cmake
BuildRequires: pkgconfig(sqlite3)
BuildRequires: pkgconfig(flutter-embedder)
BuildRequires: pkgconfig(sensord-qt5)
%description
%{summary}.

20
example/lib/l10n/app_en.arb

@ -1,4 +1,24 @@
{
"@_SENSORS_PLUS": {},
"sensorsPlusTitleOrientation": "Orientation",
"sensorsPlusTitleAccelerometer": "Accelerometer",
"sensorsPlusTitleCompass": "Compass",
"sensorsPlusTitleTap": "Tap",
"sensorsPlusTitleALS": "ALS",
"sensorsPlusTitleProximity": "Proximity",
"sensorsPlusTitleGyroscope": "Gyroscope",
"sensorsPlusTitleMagnetometer": "Magnetometer",
"sensorsPlusNotFound": "Sensor not found",
"sensorsPlusSubtitle": "Sensor key: {name}",
"@sensorsPlusSubtitle": {
"placeholders": {
"name": {
"type": "String",
"example": "orientationsensor"
}
}
},
"@_PROVIDER": {},
"providerTitle": "Provider",
"providerSubtitle": "Simple example use provider package",

20
example/lib/l10n/app_ru.arb

@ -1,4 +1,24 @@
{
"@_SENSORS_PLUS": {},
"sensorsPlusTitleOrientation": "Ориентация",
"sensorsPlusTitleAccelerometer": "Акселерометр",
"sensorsPlusTitleCompass": "Компас",
"sensorsPlusTitleTap": "Нажмите",
"sensorsPlusTitleALS": "ALS",
"sensorsPlusTitleProximity": "Датчик приближения",
"sensorsPlusTitleGyroscope": "Гироскоп",
"sensorsPlusTitleMagnetometer": "Магнитометр",
"sensorsPlusNotFound": "Датчик не найден",
"sensorsPlusSubtitle": "Ключ датчика: {name}",
"@sensorsPlusSubtitle": {
"placeholders": {
"name": {
"type": "String",
"example": "orientationsensor"
}
}
},
"@_PROVIDER": {},
"providerTitle": "Provider",
"providerSubtitle": "Простой пример использования пакета provider",

2
example/lib/packages/flutter_keyboard_visibility/page.dart

@ -99,7 +99,7 @@ class _FlutterKeyboardVisibilityPageState
title: l10n.flutterKeyboardVisibilityTitleHeight,
desc: l10n.flutterKeyboardVisibilityDescHeight,
value: _keyboardHeight,
builder: (value) => value.toInt().toString(),
builder: (value) => value?.toInt().toString(),
),
),
const SizedBox(height: 20),

2
example/lib/packages/packages.dart

@ -29,6 +29,7 @@ import 'package:flutter_example_packages/packages/provider/package.dart';
import 'package:flutter_example_packages/packages/qr_flutter/package.dart';
import 'package:flutter_example_packages/packages/rxdart/package.dart';
import 'package:flutter_example_packages/packages/scoped_model/package.dart';
import 'package:flutter_example_packages/packages/sensors_plus/package.dart';
import 'package:flutter_example_packages/packages/shared_preferences/package.dart';
import 'package:flutter_example_packages/packages/sqflite/package.dart';
import 'package:flutter_example_packages/packages/translator/package.dart';
@ -66,6 +67,7 @@ final packages = <Package>[
packageQrFlutter,
packageRxdart,
packageScopedModel,
packageSensorsPlus,
packageSharedPreferences,
packageSqflite,
packageTranslator,

11
example/lib/packages/sensors_plus/model.dart

@ -0,0 +1,11 @@
// SPDX-FileCopyrightText: 2023 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/widgets.dart';
import 'package:scoped_model/scoped_model.dart';
/// Model for [SensorsPlusPage]
class SensorsPlusModel extends Model {
/// Get [ScopedModel]
static SensorsPlusModel of(BuildContext context) =>
ScopedModel.of<SensorsPlusModel>(context);
}

26
example/lib/packages/sensors_plus/package.dart

@ -0,0 +1,26 @@
// SPDX-FileCopyrightText: 2023 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter_example_packages/base/package/package_page.dart';
import 'package:get_it/get_it.dart';
import 'model.dart';
import 'page.dart';
/// Package values
final packageSensorsPlus = PackagePage(
key: 'sensors_plus',
descEN: '''
A Flutter plugin to access the accelerometer, gyroscope,
and magnetometer sensors.
''',
descRU: '''
Плагин Flutter для доступа к датчикам акселерометра,
гироскопа и магнитометра.
''',
version: '3.0.2',
isPlatformDependent: true,
page: () => SensorsPlusPage(),
init: () {
GetIt.instance.registerFactory<SensorsPlusModel>(() => SensorsPlusModel());
},
);

209
example/lib/packages/sensors_plus/page.dart

@ -0,0 +1,209 @@
// SPDX-FileCopyrightText: 2023 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/material.dart';
import 'package:flutter_example_packages/base/di/app_di.dart';
import 'package:flutter_example_packages/base/package/package.dart';
import 'package:flutter_example_packages/widgets/base/export.dart';
import 'package:flutter_example_packages/widgets/blocks/block_info_package.dart';
import 'package:flutter_example_packages/widgets/blocks/block_item.dart';
import 'package:flutter_example_packages/widgets/layouts/block_layout.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:sensors_plus/sensors_plus.dart';
import 'package:sensors_plus_aurora/events/als_event.dart';
import 'package:sensors_plus_aurora/events/compass_event.dart';
import 'package:sensors_plus_aurora/events/orientation_event.dart';
import 'package:sensors_plus_aurora/events/proximity_event.dart';
import 'package:sensors_plus_aurora/events/tap_event.dart';
import 'package:sensors_plus_aurora/sensors_plus_aurora.dart';
import 'model.dart';
import 'package.dart';
class SensorsPlusPage extends AppStatefulWidget {
SensorsPlusPage({
super.key,
});
final Package package = packageSensorsPlus;
@override
State<SensorsPlusPage> createState() => _SensorsPlusPageState();
}
class _SensorsPlusPageState extends AppState<SensorsPlusPage> {
Stream<OrientationEvent>? _orientationEvents;
Stream<AccelerometerEvent>? _accelerometerEvents;
Stream<CompassEvent>? _compassEvents;
Stream<TapEvent>? _tapEvents;
Stream<ALSEvent>? _alsEvents;
Stream<ProximityEvent>? _proximityEvents;
Stream<GyroscopeEvent>? _gyroscopeEvents;
Stream<MagnetometerEvent>? _magnetometerEvents;
@override
void initState() {
super.initState();
try {
_orientationEvents = orientationEvents;
} catch (e) {
debugPrint(e.toString());
}
try {
_accelerometerEvents = accelerometerEvents;
} catch (e) {
debugPrint(e.toString());
}
try {
_compassEvents = compassEvents;
} catch (e) {
debugPrint(e.toString());
}
try {
_tapEvents = tapEvents;
} catch (e) {
debugPrint(e.toString());
}
try {
_alsEvents = alsEvents;
} catch (e) {
debugPrint(e.toString());
}
try {
_proximityEvents = proximityEvents;
} catch (e) {
debugPrint(e.toString());
}
try {
_gyroscopeEvents = gyroscopeEvents;
} catch (e) {
debugPrint(e.toString());
}
try {
_magnetometerEvents = magnetometerEvents;
} catch (e) {
debugPrint(e.toString());
}
}
@override
Widget buildWide(
BuildContext context,
MediaQueryData media,
AppLocalizations l10n,
) {
return BlockLayout<SensorsPlusModel>(
model: getIt<SensorsPlusModel>(),
title: widget.package.key,
builder: (context, child, model) {
return SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
BlockInfoPackage(widget.package),
Visibility(
visible: _orientationEvents != null,
child: BlockItem(
isShowProgress: false,
title: l10n.sensorsPlusTitleOrientation,
desc: l10n.sensorsPlusSubtitle('orientationsensor'),
stream: _orientationEvents,
builder: (value) => value == null
? l10n.sensorsPlusNotFound
: value.toString(),
),
),
Visibility(
visible: _accelerometerEvents != null,
child: BlockItem(
isShowProgress: false,
title: l10n.sensorsPlusTitleAccelerometer,
desc: l10n.sensorsPlusSubtitle('accelerometersensor'),
stream: _accelerometerEvents,
builder: (value) => value == null
? l10n.sensorsPlusNotFound
: value.toString(),
),
),
Visibility(
visible: _compassEvents != null,
child: BlockItem(
isShowProgress: false,
title: l10n.sensorsPlusTitleCompass,
desc: l10n.sensorsPlusSubtitle('compasssensor'),
stream: _compassEvents,
builder: (value) => value == null
? l10n.sensorsPlusNotFound
: value.toString(),
),
),
Visibility(
visible: _tapEvents != null,
child: BlockItem(
isShowProgress: false,
title: l10n.sensorsPlusTitleTap,
desc: l10n.sensorsPlusSubtitle('tapsensor'),
stream: _tapEvents,
builder: (value) => value == null
? l10n.sensorsPlusNotFound
: value.toString(),
),
),
Visibility(
visible: _alsEvents != null,
child: BlockItem(
isShowProgress: false,
title: l10n.sensorsPlusTitleALS,
desc: l10n.sensorsPlusSubtitle('alssensor'),
stream: _alsEvents,
builder: (value) => value == null
? l10n.sensorsPlusNotFound
: value.toString(),
),
),
Visibility(
visible: _proximityEvents != null,
child: BlockItem(
isShowProgress: false,
title: l10n.sensorsPlusTitleProximity,
desc: l10n.sensorsPlusSubtitle('proximitysensor'),
stream: _proximityEvents,
builder: (value) => value == null
? l10n.sensorsPlusNotFound
: value.toString(),
),
),
Visibility(
visible: _gyroscopeEvents != null,
child: BlockItem(
isShowProgress: false,
title: l10n.sensorsPlusTitleGyroscope,
desc: l10n.sensorsPlusSubtitle('rotationsensor'),
stream: _gyroscopeEvents,
builder: (value) => value == null
? l10n.sensorsPlusNotFound
: value.toString(),
),
),
Visibility(
visible: _magnetometerEvents != null,
child: BlockItem(
isShowProgress: false,
title: l10n.sensorsPlusTitleMagnetometer,
desc: l10n.sensorsPlusSubtitle('magnetometersensor'),
stream: _magnetometerEvents,
builder: (value) => value == null
? l10n.sensorsPlusNotFound
: value.toString(),
),
),
],
),
),
);
},
);
}
}

2
example/lib/packages/translator/page.dart

@ -45,7 +45,7 @@ class _TranslatorPageState extends AppState<TranslatorPage> {
title: l10n.translatorTitle,
desc: l10n.translatorSubtitle,
future: model.translate(l10n.translatorText),
builder: (value) => value.text,
builder: (value) => value?.text,
),
],
),

10
example/lib/widgets/blocks/block_item.dart

@ -15,6 +15,7 @@ class BlockItem<T> extends AppStatelessWidget {
this.future,
this.stream,
this.builder,
this.isShowProgress = true,
});
final String? title;
@ -22,7 +23,8 @@ class BlockItem<T> extends AppStatelessWidget {
final T? value;
final Stream<T>? stream;
final Future<T>? future;
final Function(T)? builder;
final Function(T?)? builder;
final bool isShowProgress;
AsyncWidgetBuilder<T?> get widgetBuilder =>
(BuildContext context, AsyncSnapshot<T?> snapshot) {
@ -47,14 +49,14 @@ class BlockItem<T> extends AppStatelessWidget {
],
),
),
if (snapshot.hasData)
if (!isShowProgress)
TextBodyMedium(
builder == null
? snapshot.data.toString()
: builder?.call(snapshot.data as T),
: builder?.call(snapshot.data),
fontWeight: FontWeight.bold,
),
if (!snapshot.hasData)
if (isShowProgress)
const SizedBox(
width: 16,
height: 16,

1159
example/pubspec.lock

File diff suppressed because it is too large Load Diff

6
example/pubspec.yaml

@ -154,6 +154,12 @@ dependencies:
ref: master
path: packages/sqflite/sqflite_aurora
## https://pub.dev/packages/sensors_plus
sensors_plus: ^3.0.3
## https://os-git.omprussia.ru/non-oss/flutter/flutter-plugins/-/tree/master/packages/sensors_plus/sensors_plus_aurora
sensors_plus_aurora:
path: ../packages/sensors_plus/sensors_plus_aurora
dev_dependencies:
flutter_test:
sdk:

30
packages/sensors_plus/sensors_plus_aurora/.gitignore vendored

@ -0,0 +1,30 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
migrate_working_dir/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Flutter/Dart/Pub related
# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock.
/pubspec.lock
**/doc/api/
.dart_tool/
.packages
build/

30
packages/sensors_plus/sensors_plus_aurora/.metadata

@ -0,0 +1,30 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled.
version:
revision: 135454af32477f815a7525073027a3ff9eff1bfd
channel: aurora
project_type: plugin
# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: 135454af32477f815a7525073027a3ff9eff1bfd
base_revision: 135454af32477f815a7525073027a3ff9eff1bfd
- platform: aurora
create_revision: 135454af32477f815a7525073027a3ff9eff1bfd
base_revision: 135454af32477f815a7525073027a3ff9eff1bfd
# User provided section
# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'

135
packages/sensors_plus/sensors_plus_aurora/README.md

@ -0,0 +1,135 @@
# sensors_plus_aurora
The Aurora implementation of [`sensors_plus`](https://pub.dev/packages/sensors_plus).
## Usage
This package is not an _endorsed_ implementation of `sensors_plus`.
Therefore, you have to include `sensors_plus_aurora` alongside `sensors_plus` as dependencies in your `pubspec.yaml` file.
**pubspec.yaml**
```yaml
dependencies:
sensors_plus: ^3.0.2
sensors_plus_aurora:
path: # path to folder with plugin
```
## Features
- accelerometerEvents - A broadcast stream of events from the device accelerometer.
- gyroscopeEvents - A broadcast stream of events from the device gyroscope.
- magnetometerEvents - A broadcast stream of events from the device magnetometer.
- orientationEvents - A broadcast stream of events from the Aurora OS device orientation.
- compassEvents - A broadcast stream of events from the Aurora OS device compass.
- tapEvents - A broadcast stream of events from the Aurora OS device tap.
- alsEvents - A broadcast stream of events from the Aurora OS device ALS.
- proximityEvents - A broadcast stream of events from the Aurora OS device proximity.
***.desktop**
```desktop
Permissions=Sensors
```
***.spec**
```spec
BuildRequires: pkgconfig(sensord-qt5)
```
***.dart**
```dart
import 'package:sensors_plus/sensors_plus.dart';
import 'package:sensors_plus_aurora/events/als_event.dart';
import 'package:sensors_plus_aurora/events/compass_event.dart';
import 'package:sensors_plus_aurora/events/orientation_event.dart';
import 'package:sensors_plus_aurora/events/proximity_event.dart';
import 'package:sensors_plus_aurora/events/tap_event.dart';
import 'package:sensors_plus_aurora/sensors_plus_aurora.dart';
/// Package sensors_plus
///
/// A broadcast stream of events from the device accelerometer.
accelerometerEvents.listen(
(AccelerometerEvent event) {
debugPrint(event.toString());
},
onError: (error) {
debugPrint(error.toString());
}
);
/// A broadcast stream of events from the device gyroscope.
gyroscopeEvents.listen(
(GyroscopeEvent event) {
debugPrint(event.toString());
},
onError: (error) {
debugPrint(error.toString());
}
);
/// A broadcast stream of events from the device magnetometer.
magnetometerEvents.listen(
(MagnetometerEvent event) {
debugPrint(event.toString());
},
onError: (error) {
debugPrint(error.toString());
}
);
/// Custom Aurora OS events
///
/// A broadcast stream of events from the Aurora OS device orientation.
orientationEvents?.listen(
(OrientationEvent event) {
debugPrint(event.toString());
},
onError: (error) {
debugPrint(error.toString());
}
);
/// A broadcast stream of events from the Aurora OS device compass.
compassEvents?.listen(
(CompassEvent event) {
debugPrint(event.toString());
},
onError: (error) {
debugPrint(error.toString());
}
);
/// A broadcast stream of events from the Aurora OS device tap.
tapEvents?.listen(
(TapEvent event) {
debugPrint(event.toString());
},
onError: (error) {
debugPrint(error.toString());
}
);
/// A broadcast stream of events from the Aurora OS device ALS.
alsEvents?.listen(
(ALSEvent event) {
debugPrint(event.toString());
},
onError: (error) {
debugPrint(error.toString());
}
);
/// A broadcast stream of events from the Aurora OS device proximity.
proximityEvents?.listen(
(ProximityEvent event) {
debugPrint(event.toString());
},
onError: (error) {
debugPrint(error.toString());
}
);
```

4
packages/sensors_plus/sensors_plus_aurora/analysis_options.yaml

@ -0,0 +1,4 @@
# SPDX-FileCopyrightText: 2023 Open Mobile Platform LLC <community@omp.ru>
# SPDX-License-Identifier: BSD-3-Clause
include: package:flutter_lints/flutter.yaml

34
packages/sensors_plus/sensors_plus_aurora/aurora/CMakeLists.txt

@ -0,0 +1,34 @@
# SPDX-FileCopyrightText: 2023 Open Mobile Platform LLC <community@omp.ru>
# SPDX-License-Identifier: BSD-3-Clause
cmake_minimum_required(VERSION 3.10)
set(PROJECT_NAME sensors_plus_aurora)
set(PLUGIN_NAME sensors_plus_aurora_platform_plugin)
project(${PROJECT_NAME} LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS "-Wall -Wextra -Wno-psabi")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
find_package(PkgConfig REQUIRED)
find_package(Qt5 COMPONENTS Core Network DBus REQUIRED)
pkg_check_modules(FlutterEmbedder REQUIRED IMPORTED_TARGET flutter-embedder)
pkg_check_modules(SensordQt5 REQUIRED IMPORTED_TARGET sensord-qt5)
add_library(${PLUGIN_NAME} SHARED sensors_plus_aurora_plugin.cpp)
set_target_properties(${PLUGIN_NAME} PROPERTIES CXX_VISIBILITY_PRESET hidden AUTOMOC ON)
target_link_libraries(${PLUGIN_NAME} PRIVATE PkgConfig::FlutterEmbedder)
target_link_libraries(${PLUGIN_NAME} PUBLIC Qt5::Core Qt5::Network Qt5::DBus)
target_link_libraries(${PLUGIN_NAME} PUBLIC PkgConfig::SensordQt5)
target_include_directories(${PLUGIN_NAME} PRIVATE ${FLUTTER_DIR})
target_include_directories(${PLUGIN_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_include_directories(${PLUGIN_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include/${PROJECT_NAME})
target_compile_definitions(${PLUGIN_NAME} PRIVATE PLUGIN_IMPL)

15
packages/sensors_plus/sensors_plus_aurora/aurora/include/sensors_plus_aurora/globals.h

@ -0,0 +1,15 @@
/**
* SPDX-FileCopyrightText: 2023 Open Mobile Platform LLC <community@omp.ru>
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef FLUTTER_PLUGIN_SENSORS_PLUS_AURORA_PLUGIN_GLOBALS_H
#define FLUTTER_PLUGIN_SENSORS_PLUS_AURORA_PLUGIN_GLOBALS_H
#ifdef PLUGIN_IMPL
#define PLUGIN_EXPORT __attribute__((visibility("default")))
#else
#define PLUGIN_EXPORT
#endif
#endif /* FLUTTER_PLUGIN_SENSORS_PLUS_AURORA_PLUGIN_GLOBALS_H */

84
packages/sensors_plus/sensors_plus_aurora/aurora/include/sensors_plus_aurora/sensors_plus_aurora_plugin.h

@ -0,0 +1,84 @@
/**
* SPDX-FileCopyrightText: 2023 Open Mobile Platform LLC <community@omp.ru>
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef FLUTTER_PLUGIN_SENSORS_PLUS_AURORA_PLUGIN_H
#define FLUTTER_PLUGIN_SENSORS_PLUS_AURORA_PLUGIN_H
#include <flutter/plugin-interface.h>
#include <sensors_plus_aurora/globals.h>
#include <QtCore>
#include <sensormanagerinterface.h>
#include <orientationsensor_i.h>
#include <accelerometersensor_i.h>
#include <compasssensor_i.h>
#include <tapsensor_i.h>
#include <alssensor_i.h>
#include <proximitysensor_i.h>
#include <rotationsensor_i.h>
#include <magnetometersensor_i.h>
class PLUGIN_EXPORT SensorsPlusAuroraPlugin final
: public QObject,
public PluginInterface
{
Q_OBJECT
public:
void RegisterWithRegistrar(PluginRegistrar &registrar) override;
public slots:
void EventSensorOrientation(const Unsigned &data);
void EventSensorAccelerometer(const XYZ &data);
void EventSensorCompass(const Compass &data);
void EventSensorTap(const Tap &data);
void EventSensorALS(const Unsigned &data);
void EventSensorProximity(const Proximity &data);
void EventSensorRotation(const XYZ &data);
void EventSensorMagnetometer(const MagneticField &data);
private:
template <typename T>
bool RegisterSensorInterface(QString sensor);
void EventChannelNull(std::string channel);
void EventChannelData(std::string channel, std::vector<Encodable> result);
void EnableSensorOrientation();
void DisableSensorOrientation();
void EnableSensorAccelerometer();
void DisableSensorAccelerometer();
void EnableSensorCompass();
void DisableSensorCompass();
void EnableSensorTap();
void DisableSensorTap();
void EnableSensorALS();
void DisableSensorALS();
void EnableSensorProximity();
void DisableSensorProximity();
void EnableSensorRotation();
void DisableSensorRotation();
void EnableSensorMagnetometer();
void DisableSensorMagnetometer();
private:
OrientationSensorChannelInterface *m_ifaceOrientation = nullptr;
AccelerometerSensorChannelInterface *m_ifaceAccelerometer = nullptr;
CompassSensorChannelInterface *m_ifaceCompass = nullptr;
TapSensorChannelInterface *m_ifaceTap = nullptr;
ALSSensorChannelInterface *m_ifaceALS = nullptr;
ProximitySensorChannelInterface *m_ifaceProximity = nullptr;
RotationSensorChannelInterface *m_ifaceRotation = nullptr;
MagnetometerSensorChannelInterface *m_ifaceMagnetometer = nullptr;
};
#endif /* FLUTTER_PLUGIN_SENSORS_PLUS_AURORA_PLUGIN_H */

524
packages/sensors_plus/sensors_plus_aurora/aurora/sensors_plus_aurora_plugin.cpp

@ -0,0 +1,524 @@
/**
* SPDX-FileCopyrightText: 2023 Open Mobile Platform LLC <community@omp.ru>
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <sensors_plus_aurora/sensors_plus_aurora_plugin.h>
#include <flutter/method-channel.h>
#include <QDebug>
#include <sensormanagerinterface.h>
#include <orientationsensor_i.h>
#include <accelerometersensor_i.h>
#include <compasssensor_i.h>
#include <tapsensor_i.h>
#include <alssensor_i.h>
#include <proximitysensor_i.h>
#include <rotationsensor_i.h>
#include <magnetometersensor_i.h>
namespace KeyChannel
{
constexpr auto Orientation = "sensors_plus_aurora_orientationsensor";
constexpr auto Accelerometer = "sensors_plus_aurora_accelerometersensor";
constexpr auto Compass = "sensors_plus_aurora_compasssensor";
constexpr auto Tap = "sensors_plus_aurora_tapsensor";
constexpr auto ALS = "sensors_plus_aurora_alssensor";
constexpr auto Proximity = "sensors_plus_aurora_proximitysensor";
constexpr auto Rotation = "sensors_plus_aurora_rotationsensor";
constexpr auto Magnetometer = "sensors_plus_aurora_magnetometersensor";
}
namespace KeySensor
{
constexpr auto Orientation = "orientationsensor";
constexpr auto Accelerometer = "accelerometersensor";
constexpr auto Compass = "compasssensor";
constexpr auto Tap = "tapsensor";
constexpr auto ALS = "alssensor";
constexpr auto Proximity = "proximitysensor";
constexpr auto Rotation = "rotationsensor";
constexpr auto Magnetometer = "magnetometersensor";
} /* namespace */
void SensorsPlusAuroraPlugin::RegisterWithRegistrar(PluginRegistrar &registrar)
{
registrar.RegisterEventChannel(
KeyChannel::Orientation, MethodCodecType::Standard,
[this](const Encodable &)
{ EnableSensorOrientation(); return EventResponse(); },
[this](const Encodable &)
{ DisableSensorOrientation(); return EventResponse(); });
registrar.RegisterEventChannel(
KeyChannel::Accelerometer, MethodCodecType::Standard,
[this](const Encodable &)
{ EnableSensorAccelerometer(); return EventResponse(); },
[this](const Encodable &)
{ DisableSensorAccelerometer(); return EventResponse(); });
registrar.RegisterEventChannel(
KeyChannel::Compass, MethodCodecType::Standard,
[this](const Encodable &)
{ EnableSensorCompass(); return EventResponse(); },
[this](const Encodable &)
{ DisableSensorCompass(); return EventResponse(); });
registrar.RegisterEventChannel(
KeyChannel::Tap, MethodCodecType::Standard,
[this](const Encodable &)
{ EnableSensorTap(); return EventResponse(); },
[this](const Encodable &)
{ DisableSensorTap(); return EventResponse(); });
registrar.RegisterEventChannel(
KeyChannel::ALS, MethodCodecType::Standard,
[this](const Encodable &)
{ EnableSensorALS(); return EventResponse(); },
[this](const Encodable &)
{ DisableSensorALS(); return EventResponse(); });
registrar.RegisterEventChannel(
KeyChannel::Proximity, MethodCodecType::Standard,
[this](const Encodable &)
{ EnableSensorProximity(); return EventResponse(); },
[this](const Encodable &)
{ DisableSensorProximity(); return EventResponse(); });
registrar.RegisterEventChannel(
KeyChannel::Rotation, MethodCodecType::Standard,
[this](const Encodable &)
{ EnableSensorRotation(); return EventResponse(); },
[this](const Encodable &)
{ DisableSensorRotation(); return EventResponse(); });
registrar.RegisterEventChannel(
KeyChannel::Magnetometer, MethodCodecType::Standard,
[this](const Encodable &)
{ EnableSensorMagnetometer(); return EventResponse(); },
[this](const Encodable &)
{ DisableSensorMagnetometer(); return EventResponse(); });
}
template <typename T>
bool SensorsPlusAuroraPlugin::RegisterSensorInterface(QString sensor)
{
SensorManagerInterface &sm = SensorManagerInterface::instance();
if (!sm.isValid())
{
return false;
}
QDBusReply<bool> reply(sm.loadPlugin(sensor));
if (!reply.isValid() || !reply.value())
{
return false;
}
sm.registerSensorInterface<T>(sensor);
return true;
}
void SensorsPlusAuroraPlugin::EventChannelNull(std::string channel)
{
EventChannel(channel, MethodCodecType::Standard).SendEvent(nullptr);
}
void SensorsPlusAuroraPlugin::EventChannelData(std::string channel, std::vector<Encodable> result)
{
EventChannel(channel, MethodCodecType::Standard).SendEvent(result);
}
/**
* Orientation
*/
void SensorsPlusAuroraPlugin::EnableSensorOrientation()
{
if (m_ifaceOrientation == nullptr)
{
if (!RegisterSensorInterface<OrientationSensorChannelInterface>(KeySensor::Orientation))
{
EventChannelNull(KeyChannel::Orientation);
return;
}
m_ifaceOrientation = OrientationSensorChannelInterface::interface(KeySensor::Orientation);
if (!m_ifaceOrientation)
{
EventChannelNull(KeyChannel::Orientation);
return;
}
connect(m_ifaceOrientation,
SIGNAL(orientationChanged(const Unsigned &)),
this,
SLOT(EventSensorOrientation(const Unsigned &)));
}
m_ifaceOrientation->start();
EventSensorOrientation(m_ifaceOrientation->orientation());
}
void SensorsPlusAuroraPlugin::DisableSensorOrientation()
{
if (m_ifaceOrientation == nullptr)
{
return;
}
m_ifaceOrientation->stop();
}
void SensorsPlusAuroraPlugin::EventSensorOrientation(const Unsigned &data)
{
std::vector<Encodable> result;
result.push_back(data.x());
EventChannelData(KeyChannel::Orientation, result);
}
/**
* Accelerometer
*/
void SensorsPlusAuroraPlugin::EnableSensorAccelerometer()
{
if (m_ifaceAccelerometer == nullptr)
{
if (!RegisterSensorInterface<AccelerometerSensorChannelInterface>(KeySensor::Accelerometer))
{
EventChannelNull(KeyChannel::Accelerometer);
return;
}
m_ifaceAccelerometer = AccelerometerSensorChannelInterface::interface(KeySensor::Accelerometer);
if (!m_ifaceAccelerometer)
{
EventChannelNull(KeyChannel::Accelerometer);
return;
}
connect(m_ifaceAccelerometer,
SIGNAL(dataAvailable(const XYZ &)),
this,
SLOT(EventSensorAccelerometer(const XYZ &)));
}
m_ifaceAccelerometer->start();
EventSensorAccelerometer(m_ifaceAccelerometer->get());
}
void SensorsPlusAuroraPlugin::DisableSensorAccelerometer()
{
if (m_ifaceAccelerometer == nullptr)
{
return;
}
m_ifaceAccelerometer->stop();
}
void SensorsPlusAuroraPlugin::EventSensorAccelerometer(const XYZ &data)
{
std::vector<Encodable> result;
result.push_back(data.x());
result.push_back(data.y());
result.push_back(data.z());
EventChannelData(KeyChannel::Accelerometer, result);
}
/**
* Compass
*/
void SensorsPlusAuroraPlugin::EnableSensorCompass()
{
if (m_ifaceCompass == nullptr)
{
if (!RegisterSensorInterface<CompassSensorChannelInterface>(KeySensor::Compass))
{
EventChannelNull(KeyChannel::Compass);
return;
}
m_ifaceCompass = CompassSensorChannelInterface::interface(KeySensor::Compass);
if (!m_ifaceCompass)
{
EventChannelNull(KeyChannel::Compass);
return;
}
connect(m_ifaceCompass,
SIGNAL(dataAvailable(const Compass &)),
this,
SLOT(EventSensorCompass(const Compass &)));
}
m_ifaceCompass->start();
EventSensorCompass(m_ifaceCompass->get());
}
void SensorsPlusAuroraPlugin::DisableSensorCompass()
{
if (m_ifaceCompass == nullptr)
{
return;
}
m_ifaceCompass->stop();
}
void SensorsPlusAuroraPlugin::EventSensorCompass(const Compass &data)
{
std::vector<Encodable> result;
result.push_back(data.degrees());
result.push_back(data.level());
EventChannelData(KeyChannel::Compass, result);
}
/**
* Tap
*/
void SensorsPlusAuroraPlugin::EnableSensorTap()
{
if (m_ifaceTap == nullptr)
{
if (!RegisterSensorInterface<TapSensorChannelInterface>(KeySensor::Tap))
{
EventChannelNull(KeyChannel::Tap);
return;
}
m_ifaceTap = TapSensorChannelInterface::interface(KeySensor::Tap);
if (!m_ifaceTap)
{
EventChannelNull(KeyChannel::Tap);
return;
}
connect(m_ifaceTap,
SIGNAL(dataAvailable(const Tap &)),
this,
SLOT(EventSensorTap(const Tap &)));
}
m_ifaceTap->start();
}
void SensorsPlusAuroraPlugin::DisableSensorTap()
{
if (m_ifaceTap == nullptr)
{
return;
}
m_ifaceTap->stop();
}
void SensorsPlusAuroraPlugin::EventSensorTap(const Tap &data)
{
std::vector<Encodable> result;
result.push_back(static_cast<int>(data.direction()));
result.push_back(static_cast<int>(data.type()));
EventChannelData(KeyChannel::Tap, result);
}
/**
* ALS
*/
void SensorsPlusAuroraPlugin::EnableSensorALS()
{
if (m_ifaceALS == nullptr)
{
if (!RegisterSensorInterface<ALSSensorChannelInterface>(KeySensor::ALS))
{
EventChannelNull(KeyChannel::ALS);
return;
}
m_ifaceALS = ALSSensorChannelInterface::interface(KeySensor::ALS);
if (!m_ifaceALS)
{
EventChannelNull(KeyChannel::ALS);
return;
}
connect(m_ifaceALS,
SIGNAL(ALSChanged(const Unsigned &)),
this,
SLOT(EventSensorALS(const Unsigned &)));
}
m_ifaceALS->start();
EventSensorALS(m_ifaceALS->lux());
}
void SensorsPlusAuroraPlugin::DisableSensorALS()
{
if (m_ifaceALS == nullptr)
{
return;
}
m_ifaceALS->stop();
}
void SensorsPlusAuroraPlugin::EventSensorALS(const Unsigned &data)
{
std::vector<Encodable> result;
result.push_back(data.x());
EventChannelData(KeyChannel::ALS, result);
}
/**
* Proximity
*/
void SensorsPlusAuroraPlugin::EnableSensorProximity()
{
if (m_ifaceProximity == nullptr)
{
if (!RegisterSensorInterface<ProximitySensorChannelInterface>(KeySensor::Proximity))
{
EventChannelNull(KeyChannel::Proximity);
return;
}
m_ifaceProximity = ProximitySensorChannelInterface::interface(KeySensor::Proximity);
if (!m_ifaceProximity)
{
EventChannelNull(KeyChannel::Proximity);
return;
}
connect(m_ifaceProximity,
SIGNAL(reflectanceDataAvailable(const Proximity &)),
this,
SLOT(EventSensorProximity(const Proximity &)));
}
m_ifaceProximity->start();
EventSensorProximity(m_ifaceProximity->proximityReflectance());
}
void SensorsPlusAuroraPlugin::DisableSensorProximity()
{
if (m_ifaceProximity == nullptr)
{
return;
}
m_ifaceProximity->stop();
}
void SensorsPlusAuroraPlugin::EventSensorProximity(const Proximity &data)
{
std::vector<Encodable> result;
result.push_back(data.withinProximity() ? 1 : 0);
EventChannelData(KeyChannel::Proximity, result);
}
/**
* Rotation
*/
void SensorsPlusAuroraPlugin::EnableSensorRotation()
{
if (m_ifaceRotation == nullptr)
{
if (!RegisterSensorInterface<RotationSensorChannelInterface>(KeySensor::Rotation))
{
EventChannelNull(KeyChannel::Rotation);
return;
}
m_ifaceRotation = RotationSensorChannelInterface::interface(KeySensor::Rotation);
if (!m_ifaceRotation)
{
EventChannelNull(KeyChannel::Rotation);
return;
}
connect(m_ifaceRotation,
SIGNAL(dataAvailable(const XYZ &)),
this,
SLOT(EventSensorRotation(const XYZ &)));
}
m_ifaceRotation->start();
EventSensorRotation(m_ifaceRotation->rotation());
}
void SensorsPlusAuroraPlugin::DisableSensorRotation()
{
if (m_ifaceRotation == nullptr)
{
return;
}
m_ifaceRotation->stop();
}
void SensorsPlusAuroraPlugin::EventSensorRotation(const XYZ &data)
{
std::vector<Encodable> result;
result.push_back(data.x());
result.push_back(data.y());
result.push_back(data.z());
EventChannelData(KeyChannel::Rotation, result);
}
/**
* Magnetometer
*/
void SensorsPlusAuroraPlugin::EnableSensorMagnetometer()
{
if (m_ifaceMagnetometer == nullptr)
{
if (!RegisterSensorInterface<MagnetometerSensorChannelInterface>(KeySensor::Magnetometer))
{
EventChannelNull(KeyChannel::Magnetometer);
return;
}
m_ifaceMagnetometer = MagnetometerSensorChannelInterface::interface(KeySensor::Magnetometer);
if (!m_ifaceMagnetometer)
{
EventChannelNull(KeyChannel::Magnetometer);
return;
}
connect(m_ifaceMagnetometer,
SIGNAL(dataAvailable(const MagneticField &)),
this,
SLOT(EventSensorMagnetometer(const MagneticField &)));
}
m_ifaceMagnetometer->start();
EventSensorMagnetometer(m_ifaceMagnetometer->magneticField());
}
void SensorsPlusAuroraPlugin::DisableSensorMagnetometer()
{
if (m_ifaceMagnetometer == nullptr)
{
return;
}
m_ifaceMagnetometer->stop();
}
void SensorsPlusAuroraPlugin::EventSensorMagnetometer(const MagneticField &data)
{
std::vector<Encodable> result;
result.push_back(data.x());
result.push_back(data.y());
result.push_back(data.z());
EventChannelData(KeyChannel::Magnetometer, result);
}
#include "moc_sensors_plus_aurora_plugin.cpp"

11
packages/sensors_plus/sensors_plus_aurora/lib/events/als_event.dart

@ -0,0 +1,11 @@
// SPDX-FileCopyrightText: Copyright 2023 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
class ALSEvent {
ALSEvent(this.degrees);
final int degrees;
@override
String toString() => '[ALSEvent (degrees: $degrees)]';
}

13
packages/sensors_plus/sensors_plus_aurora/lib/events/compass_event.dart

@ -0,0 +1,13 @@
// SPDX-FileCopyrightText: Copyright 2023 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
class CompassEvent {
CompassEvent(this.degrees, this.level);
final int degrees;
final int level;
@override
String toString() => '[CompassEvent (degrees: $degrees, level: $level)]';
}

25
packages/sensors_plus/sensors_plus_aurora/lib/events/orientation_event.dart

@ -0,0 +1,25 @@
// SPDX-FileCopyrightText: Copyright 2023 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
enum OrientationEvent {
/// The orientation is unknown.
undefined,
/// The Top edge of the device is pointing up.
topUp,
/// The Top edge of the device is pointing down.
topDown,
/// The Left edge of the device is pointing up.
leftUp,
/// The Right edge of the device is pointing up.
rightUp,
/// The Face of the device is pointing up.
faceUp,
/// The Face of the device is pointing down.
faceDown
}

11
packages/sensors_plus/sensors_plus_aurora/lib/events/proximity_event.dart

@ -0,0 +1,11 @@
// SPDX-FileCopyrightText: Copyright 2023 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
class ProximityEvent {
ProximityEvent(this.withinProximity);
final bool withinProximity;
@override
String toString() => '[ProximityEvent (withinProximity: $withinProximity)]';
}

53
packages/sensors_plus/sensors_plus_aurora/lib/events/tap_event.dart

@ -0,0 +1,53 @@
// SPDX-FileCopyrightText: Copyright 2023 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
/// Direction of tap. The last six directions may not be supported
/// depending on hardware.
enum TapDirection {
/// Left or right side tapped
x,
/// Top or down side tapped
y,
/// Face or bottom tapped
z,
/// Tapped from left to right
leftRight,
/// Tapped from right to left
rightLeft,
/// Tapped from top to bottom
topBottom,
/// Tapped from bottom to top
bottomTop,
/// Tapped from face to back
faceBack,
/// Tapped from back to face
backFace
}
/// Type of tap.
enum TapType {
/// Double tap
doubleTap,
/// Single tap.
singleTap
}
class TapEvent {
TapEvent(this.direction, this.type);
final TapDirection direction;
final TapType type;
@override
String toString() => '[TapEvent (direction: $direction, level: $type)]';
}

93
packages/sensors_plus/sensors_plus_aurora/lib/sensors_plus_aurora.dart

@ -0,0 +1,93 @@
// SPDX-FileCopyrightText: Copyright 2023 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/foundation.dart';
import 'package:sensors_plus_aurora/events/als_event.dart';
import 'package:sensors_plus_aurora/events/compass_event.dart';
import 'package:sensors_plus_aurora/events/orientation_event.dart';
import 'package:sensors_plus_aurora/events/proximity_event.dart';
import 'package:sensors_plus_aurora/events/tap_event.dart';
import 'package:sensors_plus_platform_interface/sensors_plus_platform_interface.dart';
import 'sensors_plus_aurora_platform_interface.dart';
/// A broadcast stream of events from the Aurora OS device orientation.
Stream<OrientationEvent>? get orientationEvents {
if (TargetPlatform.aurora == defaultTargetPlatform) {
return SensorsPlusAurora().onChangeOrientation;
}
return null;
}
/// A broadcast stream of events from the Aurora OS device compass.
Stream<CompassEvent>? get compassEvents {
if (TargetPlatform.aurora == defaultTargetPlatform) {
return SensorsPlusAurora().onChangeCompass;
}
return null;
}
/// A broadcast stream of events from the Aurora OS device tap.
Stream<TapEvent>? get tapEvents {
if (TargetPlatform.aurora == defaultTargetPlatform) {
return SensorsPlusAurora().onChangeTap;
}
return null;
}
/// A broadcast stream of events from the Aurora OS device ALS.
Stream<ALSEvent>? get alsEvents {
if (TargetPlatform.aurora == defaultTargetPlatform) {
return SensorsPlusAurora().onChangeALS;
}
return null;
}
/// A broadcast stream of events from the Aurora OS device proximity.
Stream<ProximityEvent>? get proximityEvents {
if (TargetPlatform.aurora == defaultTargetPlatform) {
return SensorsPlusAurora().onChangeProximity;
}
return null;
}
class SensorsPlusAurora extends SensorsPlatform {
static void registerWith() {
SensorsPlatform.instance = SensorsPlusAurora();
}
/// orientationsensor
Stream<OrientationEvent> get onChangeOrientation =>
SensorsPlusAuroraPlatform.instance.onChangeOrientation();
/// accelerometersensor
@override
Stream<AccelerometerEvent> get accelerometerEvents =>
SensorsPlusAuroraPlatform.instance.onChangeAccelerometer();
/// compasssensor
Stream<CompassEvent> get onChangeCompass =>
SensorsPlusAuroraPlatform.instance.onChangeCompass();
/// tapsensor
Stream<TapEvent> get onChangeTap =>
SensorsPlusAuroraPlatform.instance.onChangeTap();
/// alssensor
Stream<ALSEvent> get onChangeALS =>
SensorsPlusAuroraPlatform.instance.onChangeALS();
/// proximitysensor
Stream<ProximityEvent> get onChangeProximity =>
SensorsPlusAuroraPlatform.instance.onChangeProximity();
/// rotationsensor
@override
Stream<GyroscopeEvent> get gyroscopeEvents =>
SensorsPlusAuroraPlatform.instance.onChangeRotation();
/// magnetometersensor
@override
Stream<MagnetometerEvent> get magnetometerEvents =>
SensorsPlusAuroraPlatform.instance.onChangeMagnetometer();
}

148
packages/sensors_plus/sensors_plus_aurora/lib/sensors_plus_aurora_method_channel.dart

@ -0,0 +1,148 @@
// SPDX-FileCopyrightText: Copyright 2023 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:sensors_plus_aurora/events/als_event.dart';
import 'package:sensors_plus_aurora/events/compass_event.dart';
import 'package:sensors_plus_aurora/events/orientation_event.dart';
import 'package:sensors_plus_aurora/events/proximity_event.dart';
import 'package:sensors_plus_aurora/events/tap_event.dart';
import 'package:sensors_plus_platform_interface/sensors_plus_platform_interface.dart';
import 'sensors_plus_aurora_platform_interface.dart';
/// An implementation of [SensorsPlusAuroraPlatform] that uses method channels.
class MethodChannelSensorsPlusAurora extends SensorsPlusAuroraPlatform {
/// The method channel used to interact with the native platform.
@visibleForTesting
final methodChannel = const MethodChannel('sensors_plus_aurora');
List<int> _loadData(dynamic data, String key) {
if (data == null) {
throw "Failed to load sensor '$key'";
}
return (data as List<Object?>).map((e) => int.parse(e.toString())).toList();
}
@override
Stream<OrientationEvent> onChangeOrientation() async* {
await for (final data
in const EventChannel('sensors_plus_aurora_orientationsensor')
.receiveBroadcastStream()) {
switch (_loadData(data, 'orientationsensor')[0]) {
case 1:
yield OrientationEvent.rightUp;
break;
case 2:
yield OrientationEvent.leftUp;
break;
case 3:
yield OrientationEvent.topDown;
break;
case 4:
yield OrientationEvent.topUp;
break;
case 5:
yield OrientationEvent.faceDown;
break;
case 6:
yield OrientationEvent.faceUp;
break;
default:
yield OrientationEvent.undefined;
}
}
}
@override
Stream<AccelerometerEvent> onChangeAccelerometer() async* {
await for (final data
in const EventChannel('sensors_plus_aurora_accelerometersensor')
.receiveBroadcastStream()) {
final result = _loadData(data, 'accelerometersensor');
yield AccelerometerEvent(
result[0].toDouble(),
result[1].toDouble(),
result[2].toDouble(),
);
}
}
@override
Stream<CompassEvent> onChangeCompass() async* {
await for (final data
in const EventChannel('sensors_plus_aurora_compasssensor')
.receiveBroadcastStream()) {
final result = _loadData(data, 'compasssensor');
yield CompassEvent(
result[0],
result[1],
);
}
}
@override
Stream<TapEvent> onChangeTap() async* {
await for (final data in const EventChannel('sensors_plus_aurora_tapsensor')
.receiveBroadcastStream()) {
final result = _loadData(data, 'tapsensor');
yield TapEvent(
TapDirection.values[result[0]],
TapType.values[result[1]],
);
}
}
@override
Stream<ALSEvent> onChangeALS() async* {
await for (final data in const EventChannel('sensors_plus_aurora_alssensor')
.receiveBroadcastStream()) {
final result = _loadData(data, 'alssensor');
yield ALSEvent(
result[0],
);
}
}
@override
Stream<ProximityEvent> onChangeProximity() async* {
await for (final data
in const EventChannel('sensors_plus_aurora_proximitysensor')
.receiveBroadcastStream()) {
final result = _loadData(data, 'proximitysensor');
yield ProximityEvent(
result[0] == 1,
);
}
}
@override
Stream<GyroscopeEvent> onChangeRotation() async* {
await for (final data
in const EventChannel('sensors_plus_aurora_rotationsensor')
.receiveBroadcastStream()) {
final result = _loadData(data, 'rotationsensor');
yield GyroscopeEvent(
result[0].toDouble(),
result[1].toDouble(),
result[2].toDouble(),
);
}
}
@override
Stream<MagnetometerEvent> onChangeMagnetometer() async* {
await for (final data
in const EventChannel('sensors_plus_aurora_magnetometersensor')
.receiveBroadcastStream()) {
final result = _loadData(data, 'magnetometersensor');
yield MagnetometerEvent(
result[0].toDouble(),
result[1].toDouble(),
result[2].toDouble(),
);
}
}
}

66
packages/sensors_plus/sensors_plus_aurora/lib/sensors_plus_aurora_platform_interface.dart

@ -0,0 +1,66 @@
// SPDX-FileCopyrightText: Copyright 2023 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
import 'package:sensors_plus_aurora/events/als_event.dart';
import 'package:sensors_plus_aurora/events/compass_event.dart';
import 'package:sensors_plus_aurora/events/orientation_event.dart';
import 'package:sensors_plus_aurora/events/proximity_event.dart';
import 'package:sensors_plus_aurora/events/tap_event.dart';
import 'package:sensors_plus_platform_interface/sensors_plus_platform_interface.dart';
import 'sensors_plus_aurora_method_channel.dart';
abstract class SensorsPlusAuroraPlatform extends PlatformInterface {
/// Constructs a SensorsPlusAuroraPlatform.
SensorsPlusAuroraPlatform() : super(token: _token);
static final Object _token = Object();
static SensorsPlusAuroraPlatform _instance = MethodChannelSensorsPlusAurora();
/// The default instance of [SensorsPlusAuroraPlatform] to use.
///
/// Defaults to [MethodChannelSensorsPlusAurora].
static SensorsPlusAuroraPlatform get instance => _instance;
/// Platform-specific implementations should set this with their own
/// platform-specific class that extends [SensorsPlusAuroraPlatform] when
/// they register themselves.
static set instance(SensorsPlusAuroraPlatform instance) {
PlatformInterface.verifyToken(instance, _token);
_instance = instance;
}
Stream<OrientationEvent> onChangeOrientation() {
throw UnimplementedError('onChangeOrientation() has not been implemented.');
}
Stream<AccelerometerEvent> onChangeAccelerometer() {
throw UnimplementedError('onChangeAccelerometer() has not been implemented.');
}
Stream<CompassEvent> onChangeCompass() {
throw UnimplementedError('onChangeCompass() has not been implemented.');
}
Stream<TapEvent> onChangeTap() {
throw UnimplementedError('onChangeTap() has not been implemented.');
}
Stream<ALSEvent> onChangeALS() {
throw UnimplementedError('onChangeALS() has not been implemented.');
}
Stream<ProximityEvent> onChangeProximity() {
throw UnimplementedError('onChangeProximity() has not been implemented.');
}
Stream<GyroscopeEvent> onChangeRotation() {
throw UnimplementedError('onChangeRotation() has not been implemented.');
}
Stream<MagnetometerEvent> onChangeMagnetometer() {
throw UnimplementedError('onChangeMagnetometer() has not been implemented.');
}
}

28
packages/sensors_plus/sensors_plus_aurora/pubspec.yaml

@ -0,0 +1,28 @@
# SPDX-FileCopyrightText: 2023 Open Mobile Platform LLC <community@omp.ru>
# SPDX-License-Identifier: BSD-3-Clause
name: sensors_plus_aurora
description: A new Flutter plugin project.
version: 0.0.1
environment:
sdk: '>=2.18.6 <3.0.0'
flutter: ">=3.0.0"
dependencies:
flutter:
sdk: flutter
plugin_platform_interface: ^2.0.2
sensors_plus_platform_interface: ^1.1.3
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^2.0.0
flutter:
plugin:
platforms:
aurora:
pluginClass: SensorsPlusAuroraPlugin
dartPluginClass: SensorsPlusAurora
Loading…
Cancel
Save