[examples] Remove bluetooth examples
TEST=None, removed code only
Change-Id: I9ecb94497abf2fb9f0744ea3f8827b575c430b79
diff --git a/README.md b/README.md
index 3eb00e0..31cabce 100644
--- a/README.md
+++ b/README.md
@@ -23,3 +23,4 @@
* topaz/tools/dartfmt_extras: acc1f05718af2bcfbba3317a456f82b67eec4e42
* topaz/tools/mod: acc1f05718af2bcfbba3317a456f82b67eec4e42
* topaz/tools/widget_explorer: acc1f05718af2bcfbba3317a456f82b67eec4e42
+* topaz/examples/bluetooth: f4287c5ae0e9b099983121b41be66e1994b83a02
diff --git a/examples/bluetooth/MAINTAINERS b/examples/bluetooth/MAINTAINERS
deleted file mode 100644
index 9ef7655..0000000
--- a/examples/bluetooth/MAINTAINERS
+++ /dev/null
@@ -1,3 +0,0 @@
-armansito@google.com
-bwb@google.com
-ejia@google.com
diff --git a/examples/bluetooth/ble_rect/BUILD.gn b/examples/bluetooth/ble_rect/BUILD.gn
deleted file mode 100644
index ed193f3..0000000
--- a/examples/bluetooth/ble_rect/BUILD.gn
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//topaz/runtime/flutter_runner/flutter_app.gni")
-
-flutter_app("ble_rect") {
- package_name = "ble_rect"
-
- main_dart = "lib/main.dart"
-
- deps = [
- "//garnet/public/fidl/fuchsia.bluetooth.gatt",
- "//garnet/public/fidl/fuchsia.bluetooth.le",
- "//peridot/public/fidl/fuchsia.modular",
- "//third_party/dart-pkg/git/flutter/packages/flutter",
- "//topaz/public/dart/fidl",
- "//topaz/public/lib/app/dart",
- "//topaz/public/lib/app_driver/dart",
- "//topaz/public/lib/widgets/dart",
- ]
-}
diff --git a/examples/bluetooth/ble_rect/README.md b/examples/bluetooth/ble_rect/README.md
deleted file mode 100644
index 786f58c..0000000
--- a/examples/bluetooth/ble_rect/README.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# BLE Rect
-
-This is a Flutter application that displays a square which can be
-remotely manipulated using Bluetooth Low Energy.
-
-The application publishes a GATT (Generic Attribute Profile) service
-that provides three control points to modify different aspects of the
-square.
-
-
-## Service Definition
-
-This application publishes a custom GATT service which is identified by the
-128-bit UUID `548c2932-f58c-4c0b-9a4d-92110695a591`. The application advertises
-this service UUID along with a name ("BLE Rect") while listening for a client to
-connect.
-
-A simple WebBluetooth client to interact with this service can be found
-[here](https://armansito.github.io/ble_square_client/).
-
-This service contains the following characteristics:
-
-### Color
-
-Field | Definition
---- | :---:
-*UUID* | `2bf96f76-f872-422e-8dbd-d2b425850d91`
-*properties* | `write`
-*format* | `uint8[3]`
-*description* | RGB components of the color
-
-### Scale
-
-Field | Definition
---- | :---:
-UUID | `4939518b-b222-404d-90b5-7f675f13f27f`
-properties | `write`
-*format* | `uint8` (0-255)
-*description* | The current scale as percentage
-
-### Rotation
-
-Field | Definition
---- | :---:
-*UUID* | `f1121828-32b3-4675-a46e-db826531c348`
-*properties* | `write`
-*format* | `uint16` (0-360)
-*description* | The current rotation in degrees
diff --git a/examples/bluetooth/ble_rect/analysis_options.yaml b/examples/bluetooth/ble_rect/analysis_options.yaml
deleted file mode 100644
index 7415796..0000000
--- a/examples/bluetooth/ble_rect/analysis_options.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-include: ../../../tools/analysis_options.yaml
diff --git a/examples/bluetooth/ble_rect/lib/main.dart b/examples/bluetooth/ble_rect/lib/main.dart
deleted file mode 100644
index 02a046f..0000000
--- a/examples/bluetooth/ble_rect/lib/main.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'package:flutter/material.dart';
-import 'package:lib.app.dart/logging.dart';
-import 'package:lib.widgets.dart/model.dart';
-import 'package:lib.app_driver.dart/module_driver.dart';
-
-import 'src/models/ble_rect_model.dart';
-import 'src/screen.dart';
-
-void main() {
- setupLogger();
-
- final model = BLERectModel();
- final driver = ModuleDriver(onTerminate: model.onTerminate);
-
- runApp(
- MaterialApp(
- home: ScopedModel<BLERectModel>(
- model: model,
- child: BLERectScreen(),
- ),
- ),
- );
-
- driver.start().then((_) {
- model.start(driver.environmentServices);
- }).catchError(log.severe);
-}
diff --git a/examples/bluetooth/ble_rect/lib/src/models/ble_rect_model.dart b/examples/bluetooth/ble_rect/lib/src/models/ble_rect_model.dart
deleted file mode 100644
index b1b6f46..0000000
--- a/examples/bluetooth/ble_rect/lib/src/models/ble_rect_model.dart
+++ /dev/null
@@ -1,341 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:math' as math;
-import 'dart:typed_data';
-import 'dart:ui';
-
-import 'package:fidl_fuchsia_bluetooth/fidl.dart' as bt;
-import 'package:fidl_fuchsia_bluetooth_gatt/fidl.dart' as gatt;
-import 'package:fidl_fuchsia_bluetooth_le/fidl.dart' as ble;
-import 'package:lib.app.dart/app.dart';
-import 'package:lib.app.dart/logging.dart';
-import 'package:lib.widgets.dart/model.dart';
-
-/// The [Model] for the GATT Server example.
-class BLERectModel extends Model
- implements ble.PeripheralDelegate, gatt.LocalServiceDelegate {
- // Custom UUID for our service.
- static const String _serviceUuid = '548c2932-f58c-4c0b-9a4d-92110695a591';
-
- // Our service exposes 3 characteristics to control the color, rotation, and
- // scale, transforms of our square. Each characteristic comes with a
- // descriptor that describes the characteristic's function in a human readable
- // form.
- static const String _colorUuid = '2bf96f76-f872-422e-8dbd-d2b425850d91';
- static const int _colorId = 0;
- static const int _colorDescId = 1;
- static const String _colorDesc = 'RGB triplet (3 octets)';
-
- static const String _scaleUuid = '4939518b-b222-404d-90b5-7f675f13f27f';
- static const int _scaleId = 2;
- static const int _scaleDescId = 3;
- static const String _scaleDesc = 'scale percentage (uint8)';
-
- static const String _rotateUuid = 'f1121828-32b3-4675-a46e-db826531c348';
- static const int _rotateId = 4;
- static const int _rotateDescId = 5;
- static const String _rotateDesc = 'rotation in degrees (uint16)';
-
- // UUID for the "Characteristic User Description" descriptor.
- static const String _descUuid = '00002901-0000-1000-8000-00805F9B34FB';
-
- /// Returns the last FIDL status.
- bt.Status get lastStatus => _lastStatus;
-
- /// Returns true if a Central device is currently connected to us.
- bool get isCentralConnected => _currentCentral != null;
-
- /// Returns the name of the currently connected central, or null if not
- /// available.
- String get connectedCentralId => _currentCentral?.identifier;
-
- // The low_energy.Peripheral service is used to accept connections from
- // centrals.
- final ble.PeripheralProxy _peripheral = new ble.PeripheralProxy();
- final ble.PeripheralDelegateBinding _peripheralDelegate =
- new ble.PeripheralDelegateBinding();
-
- // The gatt.Server service is used to publish our service.
- final gatt.ServerProxy _server = new gatt.ServerProxy();
-
- // The delegate binding.
- final gatt.LocalServiceDelegateBinding _serviceDelegate =
- new gatt.LocalServiceDelegateBinding();
-
- // The gatt.LocalService interface can be used to perform service actions,
- // such as sending characteristic value notifications.
- final gatt.LocalServiceProxy _service = new gatt.LocalServiceProxy();
-
- // The currently connected BLE central, if any.
- ble.RemoteDevice _currentCentral;
-
- // The most recent request status. We use this to display an error when
- // something goes wrong.
- bt.Status _lastStatus;
-
- /// The current color.
- Color get color => _color;
- Color _color = const Color(0xFF00FF00);
-
- /// The current scale factor.
- double get scale => _scale;
- double _scale = 1.0;
-
- /// The current rotation in radians.
- double get radians => _radians;
- double _radians = 0.0;
-
- // Publishes our GATT service.
- void _publishService() {
- // Our characteristics have the lowest security requirement.
- const gatt.SecurityRequirements sec = const gatt.SecurityRequirements(
- encryptionRequired: false,
- authenticationRequired: false,
- authorizationRequired: false,
- );
-
- // Reads are allowed without security. Writes are not allowed.
- const gatt.AttributePermissions readOnlyPermissions =
- const gatt.AttributePermissions(read: sec);
-
- // Writes are allowed without security. Reads are not allowed.
- const gatt.AttributePermissions writeOnlyPermissions =
- const gatt.AttributePermissions(write: sec);
-
- // Color
- const gatt.Characteristic color = const gatt.Characteristic(
- id: _colorId,
- type: _colorUuid,
- properties: gatt.kPropertyWrite | gatt.kPropertyReliableWrite,
- permissions: writeOnlyPermissions,
- descriptors: <gatt.Descriptor>[
- const gatt.Descriptor(
- id: _colorDescId,
- type: _descUuid,
- permissions: readOnlyPermissions)
- ]);
-
- // Scale
- const gatt.Characteristic scale = const gatt.Characteristic(
- id: _scaleId,
- type: _scaleUuid,
- properties: gatt.kPropertyWrite,
- permissions: writeOnlyPermissions,
- descriptors: <gatt.Descriptor>[
- const gatt.Descriptor(
- id: _scaleDescId,
- type: _descUuid,
- permissions: readOnlyPermissions)
- ]);
-
- // Rotate
- const gatt.Characteristic rotate = const gatt.Characteristic(
- id: _rotateId,
- type: _rotateUuid,
- properties: gatt.kPropertyWriteWithoutResponse,
- permissions: writeOnlyPermissions,
- descriptors: <gatt.Descriptor>[
- const gatt.Descriptor(
- id: _rotateDescId,
- type: _descUuid,
- permissions: readOnlyPermissions)
- ]);
-
- const gatt.ServiceInfo service = const gatt.ServiceInfo(
- id: 0,
- primary: true,
- type: _serviceUuid,
- characteristics: <gatt.Characteristic>[color, scale, rotate]);
-
- _service.ctrl.close();
- _serviceDelegate.close();
-
- _server.publishService(
- service, _serviceDelegate.wrap(this), _service.ctrl.request(),
- (bt.Status status) {
- if (status.error != null) {
- _lastStatus = status;
- }
- log.info('publishService (status: $status)');
- notifyListeners();
- });
- }
-
- // Initiates LE advertising.
- void _startAdvertising() {
- _currentCentral = null;
-
- const ble.AdvertisingData data = const ble.AdvertisingData(
- name: 'BLE Rect',
- serviceUuids: const <String>[_serviceUuid],
- );
-
- // Unbind if the delegate was previously bound.
- _peripheralDelegate.close();
-
- // Make this app connectable by providing a peripheral delegate.
- _peripheral
- .startAdvertising(data, null, _peripheralDelegate.wrap(this), 60, false,
- (bt.Status status, String advertisementId) {
- log.info('startAdverising status: $status');
- if (status.error != null) {
- _lastStatus = status;
- }
-
- notifyListeners();
- });
-
- notifyListeners();
- }
-
- /// Connect to the BLE environment services and bootstrap the GATT service.
- void start(ServiceProviderProxy environmentServices) {
- connectToService(environmentServices, _server.ctrl);
- connectToService(environmentServices, _peripheral.ctrl);
-
- _publishService();
- _startAdvertising();
- }
-
- /// Call this method when the model needs to terminate to allow it to close
- /// any open connections
- void onTerminate() {
- _peripheral.ctrl.close();
- _server.ctrl.close();
- _service.ctrl.close();
-
- _peripheralDelegate.close();
- _serviceDelegate.close();
- }
-
- // ble.PeripheralDelegate overrides:
-
- @override
- void onCentralConnected(String advertisementId, ble.RemoteDevice central) {
- log.info('Central connected: $central');
- _currentCentral = central;
- notifyListeners();
- }
-
- @override
- void onCentralDisconnected(String deviceId) {
- log.info('Central disconnected: $deviceId');
-
- if (deviceId == _currentCentral?.identifier) {
- // Start listening for new incoming connections.
- _startAdvertising();
- }
- }
-
- // gatt.ServiceDelegate overrides:
-
- @override
- void onCharacteristicConfiguration(
- int characteristicId,
- String peerId,
- // ignore: avoid_positional_boolean_parameters
- bool notify,
- bool indicate) {}
-
- @override
- void onReadValue(int id, int offset,
- void callback(Uint8List value, gatt.ErrorCode status)) {
- if (offset != 0) {
- callback(null, gatt.ErrorCode.invalidOffset);
- return;
- }
-
- String description;
- switch (id) {
- case _colorDescId:
- description = _colorDesc;
- break;
- case _scaleDescId:
- description = _scaleDesc;
- break;
- case _rotateDescId:
- description = _rotateDesc;
- break;
- default:
- callback(null, gatt.ErrorCode.notPermitted);
- return;
- }
-
- callback(description.runes.toList(), gatt.ErrorCode.noError);
- }
-
- bool _writeColor(final List<int> value) {
- if (value.length != 3) {
- log.info('Malformed color value (size: ${value.length})');
- return false;
- }
-
- _color = new Color.fromARGB(255, value[0], value[1], value[2]);
-
- return true;
- }
-
- bool _writeScale(final List<int> value) {
- if (value.length != 1) {
- log.info('Malformed scale value (size: ${value.length})');
- return false;
- }
-
- _scale = value[0].toDouble() / 100.0;
-
- return true;
- }
-
- bool _writeRotate(final List<int> value) {
- if (value.length != 2) {
- log.info('Malformed rotation angle (size: ${value.length})');
- return false;
- }
-
- ByteBuffer buffer = new Uint8List.fromList(value).buffer;
- ByteData bdata = new ByteData.view(buffer);
- double angle = bdata.getUint16(0, Endian.little).toDouble();
- _radians = angle * math.pi / 180.0;
-
- return true;
- }
-
- @override
- void onWriteValue(int id, int offset, List<int> value,
- void callback(gatt.ErrorCode status)) {
- if (offset != 0) {
- callback(gatt.ErrorCode.invalidOffset);
- return;
- }
-
- bool Function(List<int> value) func;
- if (id == _colorId) {
- func = _writeColor;
- } else if (id == _scaleId) {
- func = _writeScale;
- }
-
- if (!func(value)) {
- callback(gatt.ErrorCode.invalidValueLength);
- return;
- }
-
- callback(gatt.ErrorCode.noError);
- notifyListeners();
- }
-
- @override
- void onWriteWithoutResponse(int id, int offset, List<int> value) {
- if (offset != 0) {
- return;
- }
-
- if (!_writeRotate(value)) {
- return;
- }
-
- notifyListeners();
- }
-}
diff --git a/examples/bluetooth/ble_rect/lib/src/screen.dart b/examples/bluetooth/ble_rect/lib/src/screen.dart
deleted file mode 100644
index 686e7cb..0000000
--- a/examples/bluetooth/ble_rect/lib/src/screen.dart
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// ignore_for_file: public_member_api_docs
-
-import 'package:flutter/material.dart';
-import 'package:lib.widgets.dart/model.dart';
-
-import 'models/ble_rect_model.dart';
-
-/// Custom painter for that draws the square
-class SquarePainter extends CustomPainter {
- final Color _color;
- double _scale;
- double _radians;
-
- SquarePainter(this._color, this._scale, this._radians);
-
- @override
- void paint(Canvas canvas, Size size) {
- // Draw the square in the center of the canvas.
- double edge = size.shortestSide / 2.0;
- double x0 = size.width / 2.0;
- double y0 = size.height / 2.0;
- canvas
- ..translate(x0, y0)
- ..rotate(_radians)
- ..scale(_scale, _scale)
- ..drawRect(
- new Rect.fromLTWH(-edge / 2.0, -edge / 2.0, edge, edge),
- new Paint()..color = _color,
- );
- }
-
- @override
- bool shouldRepaint(SquarePainter oldDelegate) =>
- oldDelegate._color != _color ||
- oldDelegate._scale != _scale ||
- oldDelegate._radians != _radians;
-
- @override
- bool hitTest(Offset position) => false;
-}
-
-class BLERectScreen extends StatelessWidget {
- Widget _bottomText(BLERectModel model) {
- if (model.lastStatus?.error != null) {
- return new Text('Error: ${model.lastStatus.error.description}',
- style: const TextStyle(color: const Color(0xFFFFC0EB)));
- }
-
- if (!model.isCentralConnected) {
- return new Row(children: const <Widget>[
- const Text('Waiting for connection...'),
- const CircularProgressIndicator(),
- ]);
- }
-
- // TODO(armansito): Show name here instead when we perform name discovery on
- // centrals.
- return new Align(
- alignment: Alignment.centerLeft,
- child: new Text('Connected: ${model.connectedCentralId}'));
- }
-
- @override
- Widget build(BuildContext context) {
- return new ScopedModelDescendant<BLERectModuleModel>(builder: (
- BuildContext context,
- Widget child,
- BLERectModuleModel model,
- ) {
- return new Scaffold(
- appBar: new AppBar(
- title: const Text('BLE Rect'),
- bottom: new PreferredSize(
- child: new Container(
- color: Colors.white, child: _bottomText(model)),
- preferredSize: const Size.fromHeight(10.0))),
- body: model.isCentralConnected
- ? new RepaintBoundary(
- child: new CustomPaint(
- child: new Container(),
- painter: new SquarePainter(
- model.color, model.scale, model.radians)))
- : new Container(color: Colors.grey));
- });
- }
-}
diff --git a/examples/bluetooth/ble_rect/pubspec.yaml b/examples/bluetooth/ble_rect/pubspec.yaml
deleted file mode 100644
index d41fc66..0000000
--- a/examples/bluetooth/ble_rect/pubspec.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-name: BLE Rect
-
-flutter:
- uses-material-design: true
diff --git a/examples/bluetooth/ble_scanner/BUILD.gn b/examples/bluetooth/ble_scanner/BUILD.gn
deleted file mode 100644
index 845ca4c..0000000
--- a/examples/bluetooth/ble_scanner/BUILD.gn
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//topaz/runtime/flutter_runner/flutter_app.gni")
-
-flutter_app("ble_scanner") {
- deprecated_bare_package_url = "//build"
-
- package_name = "ble_scanner"
-
- main_dart = "lib/main.dart"
-
- meta = [
- {
- path = rebase_path("meta/ble_scanner.cmx")
- dest = "ble_scanner.cmx"
- },
- ]
-
- deps = [
- "//garnet/public/fidl/fuchsia.bluetooth",
- "//garnet/public/fidl/fuchsia.bluetooth.gatt",
- "//garnet/public/fidl/fuchsia.bluetooth.le",
- "//peridot/public/fidl/fuchsia.modular",
- "//third_party/dart-pkg/git/flutter/packages/flutter",
- "//topaz/public/dart/fidl",
- "//topaz/public/lib/app/dart",
- "//topaz/public/lib/app_driver/dart",
- "//topaz/public/lib/widgets/dart",
- ]
-}
diff --git a/examples/bluetooth/ble_scanner/analysis_options.yaml b/examples/bluetooth/ble_scanner/analysis_options.yaml
deleted file mode 100644
index 7415796..0000000
--- a/examples/bluetooth/ble_scanner/analysis_options.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-include: ../../../tools/analysis_options.yaml
diff --git a/examples/bluetooth/ble_scanner/lib/main.dart b/examples/bluetooth/ble_scanner/lib/main.dart
deleted file mode 100644
index f450b49..0000000
--- a/examples/bluetooth/ble_scanner/lib/main.dart
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'package:flutter/material.dart';
-import 'package:flutter/widgets.dart';
-import 'package:lib.app.dart/logging.dart';
-import 'package:lib.widgets.dart/model.dart';
-
-import 'src/models/ble_scanner_model.dart';
-import 'src/screen.dart';
-
-void main() {
- setupLogger();
- runApp(
- MaterialApp(
- home: ScopedModel<BLEScannerModel>(
- model: BLEScannerModel(),
- child: BLEScannerScreen(),
- ),
- ),
- );
-}
diff --git a/examples/bluetooth/ble_scanner/lib/src/manufacturer_names.dart b/examples/bluetooth/ble_scanner/lib/src/manufacturer_names.dart
deleted file mode 100644
index 3331f3f..0000000
--- a/examples/bluetooth/ble_scanner/lib/src/manufacturer_names.dart
+++ /dev/null
@@ -1,1197 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:core';
-
-List<String> _manufacturerNames = <String>[
- /* 0x0000 */ 'Ericsson Technology Licensing',
- /* 0x0001 */ 'Nokia Mobile Phones',
- /* 0x0002 */ 'Intel Corp.',
- /* 0x0003 */ 'IBM Corp.',
- /* 0x0004 */ 'Toshiba Corp.',
- /* 0x0005 */ '3Com',
- /* 0x0006 */ 'Microsoft',
- /* 0x0007 */ 'Lucent',
- /* 0x0008 */ 'Motorola',
- /* 0x0009 */ 'Infineon Technologies AG',
- /* 0x000A */ 'Cambridge Silicon Radio',
- /* 0x000B */ 'Silicon Wave',
- /* 0x000C */ 'Digianswer A/S',
- /* 0x000D */ 'Texas Instruments Inc.',
- /* 0x000E */ 'Parthus Technologies Inc.',
- /* 0x000F */ 'Broadcom Corporation',
- /* 0x0010 */ 'Mitel Semiconductor',
- /* 0x0011 */ 'Widcomm, Inc.',
- /* 0x0012 */ 'Zeevo, Inc.',
- /* 0x0013 */ 'Atmel Corporation',
- /* 0x0014 */ 'Mitsubishi Electric Corporation',
- /* 0x0015 */ 'RTX Telecom A/S',
- /* 0x0016 */ 'KC Technology Inc.',
- /* 0x0017 */ 'Newlogic',
- /* 0x0018 */ 'Transilica, Inc.',
- /* 0x0019 */ 'Rohde & Schwarz GmbH & Co. KG',
- /* 0x001A */ 'TTPCom Limited',
- /* 0x001B */ 'Signia Technologies, Inc.',
- /* 0x001C */ 'Conexant Systems Inc.',
- /* 0x001D */ 'Qualcomm',
- /* 0x001E */ 'Inventel',
- /* 0x001F */ 'AVM Berlin',
- /* 0x0020 */ 'BandSpeed, Inc.',
- /* 0x0021 */ 'Mansella Ltd',
- /* 0x0022 */ 'NEC Corporation',
- /* 0x0023 */ 'WavePlus Technology Co., Ltd.',
- /* 0x0024 */ 'Alcatel',
- /* 0x0025 */ 'NXP Semiconductors (formerly Philips Semiconductors)',
- /* 0x0026 */ 'C Technologies',
- /* 0x0027 */ 'Open Interface',
- /* 0x0028 */ 'R F Micro Devices',
- /* 0x0029 */ 'Hitachi Ltd',
- /* 0x002A */ 'Symbol Technologies, Inc.',
- /* 0x002B */ 'Tenovis',
- /* 0x002C */ 'Macronix International Co. Ltd.',
- /* 0x002D */ 'GCT Semiconductor',
- /* 0x002E */ 'Norwood Systems',
- /* 0x002F */ 'MewTel Technology Inc.',
- /* 0x0030 */ 'ST Microelectronics',
- /* 0x0031 */ 'Synopsys, Inc.',
- /* 0x0032 */ 'Red-M (Communications) Ltd',
- /* 0x0033 */ 'Commil Ltd',
- /* 0x0034 */ 'Computer Access Technology Corporation (CATC)',
- /* 0x0035 */ 'Eclipse (HQ Espana) S.L.',
- /* 0x0036 */ 'Renesas Electronics Corporation',
- /* 0x0037 */ 'Mobilian Corporation',
- /* 0x0038 */ 'Terax',
- /* 0x0039 */ 'Integrated System Solution Corp.',
- /* 0x003A */ 'Matsushita Electric Industrial Co., Ltd.',
- /* 0x003B */ 'Gennum Corporation',
- /* 0x003C */ 'BlackBerry Limited (formerly Research In Motion)',
- /* 0x003D */ 'IPextreme, Inc.',
- /* 0x003E */ 'Systems and Chips, Inc',
- /* 0x003F */ 'Bluetooth SIG, Inc',
- /* 0x0040 */ 'Seiko Epson Corporation',
- /* 0x0041 */ 'Integrated Silicon Solution Taiwan, Inc.',
- /* 0x0042 */ 'CONWISE Technology Corporation Ltd',
- /* 0x0043 */ 'PARROT SA',
- /* 0x0044 */ 'Socket Mobile',
- /* 0x0045 */ 'Atheros Communications, Inc.',
- /* 0x0046 */ 'MediaTek, Inc.',
- /* 0x0047 */ 'Bluegiga',
- /* 0x0048 */ 'Marvell Technology Group Ltd.',
- /* 0x0049 */ '3DSP Corporation',
- /* 0x004A */ 'Accel Semiconductor Ltd.',
- /* 0x004B */ 'Continental Automotive Systems',
- /* 0x004C */ 'Apple, Inc.',
- /* 0x004D */ 'Staccato Communications, Inc.',
- /* 0x004E */ 'Avago Technologies',
- /* 0x004F */ 'APT Ltd.',
- /* 0x0050 */ 'SiRF Technology, Inc.',
- /* 0x0051 */ 'Tzero Technologies, Inc.',
- /* 0x0052 */ 'J&M Corporation',
- /* 0x0053 */ 'Free2move AB',
- /* 0x0054 */ '3DiJoy Corporation',
- /* 0x0055 */ 'Plantronics, Inc.',
- /* 0x0056 */ 'Sony Ericsson Mobile Communications',
- /* 0x0057 */ 'Harman International Industries, Inc.',
- /* 0x0058 */ 'Vizio, Inc.',
- /* 0x0059 */ 'Nordic Semiconductor ASA',
- /* 0x005A */ 'EM Microelectronic-Marin SA',
- /* 0x005B */ 'Ralink Technology Corporation',
- /* 0x005C */ 'Belkin International, Inc.',
- /* 0x005D */ 'Realtek Semiconductor Corporation',
- /* 0x005E */ 'Stonestreet One, LLC',
- /* 0x005F */ 'Wicentric, Inc.',
- /* 0x0060 */ 'RivieraWaves S.A.S',
- /* 0x0061 */ 'RDA Microelectronics',
- /* 0x0062 */ 'Gibson Guitars',
- /* 0x0063 */ 'MiCommand Inc.',
- /* 0x0064 */ 'Band XI International, LLC',
- /* 0x0065 */ 'Hewlett-Packard Company',
- /* 0x0066 */ '9Solutions Oy',
- /* 0x0067 */ 'GN Netcom A/S',
- /* 0x0068 */ 'General Motors',
- /* 0x0069 */ 'A&D Engineering, Inc.',
- /* 0x006A */ 'MindTree Ltd.',
- /* 0x006B */ 'Polar Electro OY',
- /* 0x006C */ 'Beautiful Enterprise Co., Ltd.',
- /* 0x006D */ 'BriarTek, Inc',
- /* 0x006E */ 'Summit Data Communications, Inc.',
- /* 0x006F */ 'Sound ID',
- /* 0x0070 */ 'Monster, LLC',
- /* 0x0071 */ 'connectBlue AB',
- /* 0x0072 */ 'ShangHai Super Smart Electronics Co. Ltd.',
- /* 0x0073 */ 'Group Sense Ltd.',
- /* 0x0074 */ 'Zomm, LLC',
- /* 0x0075 */ 'Samsung Electronics Co. Ltd.',
- /* 0x0076 */ 'Creative Technology Ltd.',
- /* 0x0077 */ 'Laird Technologies',
- /* 0x0078 */ 'Nike, Inc.',
- /* 0x0079 */ 'lesswire AG',
- /* 0x007A */ 'MStar Semiconductor, Inc.',
- /* 0x007B */ 'Hanlynn Technologies',
- /* 0x007C */ 'A & R Cambridge',
- /* 0x007D */ 'Seers Technology Co., Ltd.',
- /* 0x007E */ 'Sports Tracking Technologies Ltd.',
- /* 0x007F */ 'Autonet Mobile',
- /* 0x0080 */ 'DeLorme Publishing Company, Inc.',
- /* 0x0081 */ 'WuXi Vimicro',
- /* 0x0082 */ 'Sennheiser Communications A/S',
- /* 0x0083 */ 'TimeKeeping Systems, Inc.',
- /* 0x0084 */ 'Ludus Helsinki Ltd.',
- /* 0x0085 */ 'BlueRadios, Inc.',
- /* 0x0086 */ 'Equinux AG',
- /* 0x0087 */ 'Garmin International, Inc.',
- /* 0x0088 */ 'Ecotest',
- /* 0x0089 */ 'GN ReSound A/S',
- /* 0x008A */ 'Jawbone',
- /* 0x008B */ 'Topcon Positioning Systems, LLC',
- /* 0x008C */ 'Gimbal Inc. (formerly Qualcomm Labs, Inc. and Qualcomm Retail Solutions, Inc.)',
- /* 0x008D */ 'Zscan Software',
- /* 0x008E */ 'Quintic Corp',
- /* 0x008F */ 'Telit Wireless Solutions GmbH (formerly Stollmann E+V GmbH)',
- /* 0x0090 */ 'Funai Electric Co., Ltd.',
- /* 0x0091 */ 'Advanced PANMOBIL systems GmbH & Co. KG',
- /* 0x0092 */ 'ThinkOptics, Inc.',
- /* 0x0093 */ 'Universal Electronics, Inc.',
- /* 0x0094 */ 'Airoha Technology Corp.',
- /* 0x0095 */ 'NEC Lighting, Ltd.',
- /* 0x0096 */ 'ODM Technology, Inc.',
- /* 0x0097 */ 'ConnecteDevice Ltd.',
- /* 0x0098 */ 'zero1.tv GmbH',
- /* 0x0099 */ 'i.Tech Dynamic Global Distribution Ltd.',
- /* 0x009A */ 'Alpwise',
- /* 0x009B */ 'Jiangsu Toppower Automotive Electronics Co., Ltd.',
- /* 0x009C */ 'Colorfy, Inc.',
- /* 0x009D */ 'Geoforce Inc.',
- /* 0x009E */ 'Bose Corporation',
- /* 0x009F */ 'Suunto Oy',
- /* 0x00A0 */ 'Kensington Computer Products Group',
- /* 0x00A1 */ 'SR-Medizinelektronik',
- /* 0x00A2 */ 'Vertu Corporation Limited',
- /* 0x00A3 */ 'Meta Watch Ltd.',
- /* 0x00A4 */ 'LINAK A/S',
- /* 0x00A5 */ 'OTL Dynamics LLC',
- /* 0x00A6 */ 'Panda Ocean Inc.',
- /* 0x00A7 */ 'Visteon Corporation',
- /* 0x00A8 */ 'ARP Devices Limited',
- /* 0x00A9 */ 'Magneti Marelli S.p.A',
- /* 0x00AA */ 'CAEN RFID srl',
- /* 0x00AB */ 'Ingenieur-Systemgruppe Zahn GmbH',
- /* 0x00AC */ 'Green Throttle Games',
- /* 0x00AD */ 'Peter Systemtechnik GmbH',
- /* 0x00AE */ 'Omegawave Oy',
- /* 0x00AF */ 'Cinetix',
- /* 0x00B0 */ 'Passif Semiconductor Corp',
- /* 0x00B1 */ 'Saris Cycling Group, Inc',
- /* 0x00B2 */ 'Bekey A/S',
- /* 0x00B3 */ 'Clarinox Technologies Pty. Ltd.',
- /* 0x00B4 */ 'BDE Technology Co., Ltd.',
- /* 0x00B5 */ 'Swirl Networks',
- /* 0x00B6 */ 'Meso international',
- /* 0x00B7 */ 'TreLab Ltd',
- /* 0x00B8 */ 'Qualcomm Innovation Center, Inc. (QuIC)',
- /* 0x00B9 */ 'Johnson Controls, Inc.',
- /* 0x00BA */ 'Starkey Laboratories Inc.',
- /* 0x00BB */ 'S-Power Electronics Limited',
- /* 0x00BC */ 'Ace Sensor Inc',
- /* 0x00BD */ 'Aplix Corporation',
- /* 0x00BE */ 'AAMP of America',
- /* 0x00BF */ 'Stalmart Technology Limited',
- /* 0x00C0 */ 'AMICCOM Electronics Corporation',
- /* 0x00C1 */ 'Shenzhen Excelsecu Data Technology Co.,Ltd',
- /* 0x00C2 */ 'Geneq Inc.',
- /* 0x00C3 */ 'adidas AG',
- /* 0x00C4 */ 'LG Electronics',
- /* 0x00C5 */ 'Onset Computer Corporation',
- /* 0x00C6 */ 'Selfly BV',
- /* 0x00C7 */ 'Quuppa Oy.',
- /* 0x00C8 */ 'GeLo Inc',
- /* 0x00C9 */ 'Evluma',
- /* 0x00CA */ 'MC10',
- /* 0x00CB */ 'Binauric SE',
- /* 0x00CC */ 'Beats Electronics',
- /* 0x00CD */ 'Microchip Technology Inc.',
- /* 0x00CE */ 'Elgato Systems GmbH',
- /* 0x00CF */ 'ARCHOS SA',
- /* 0x00D0 */ 'Dexcom, Inc.',
- /* 0x00D1 */ 'Polar Electro Europe B.V.',
- /* 0x00D2 */ 'Dialog Semiconductor B.V.',
- /* 0x00D3 */ 'Taixingbang Technology (HK) Co,. LTD.',
- /* 0x00D4 */ 'Kawantech',
- /* 0x00D5 */ 'Austco Communication Systems',
- /* 0x00D6 */ 'Timex Group USA, Inc.',
- /* 0x00D7 */ 'Qualcomm Technologies, Inc.',
- /* 0x00D8 */ 'Qualcomm Connected Experiences, Inc.',
- /* 0x00D9 */ 'Voyetra Turtle Beach',
- /* 0x00DA */ 'txtr GmbH',
- /* 0x00DB */ 'Biosentronics',
- /* 0x00DC */ 'Procter & Gamble',
- /* 0x00DD */ 'Hosiden Corporation',
- /* 0x00DE */ 'Muzik LLC',
- /* 0x00DF */ 'Misfit Wearables Corp',
- /* 0x00E0 */ 'Google',
- /* 0x00E1 */ 'Danlers Ltd',
- /* 0x00E2 */ 'Semilink Inc',
- /* 0x00E3 */ 'inMusic Brands, Inc',
- /* 0x00E4 */ 'L.S. Research Inc.',
- /* 0x00E5 */ 'Eden Software Consultants Ltd.',
- /* 0x00E6 */ 'Freshtemp',
- /* 0x00E7 */ 'KS Technologies',
- /* 0x00E8 */ 'ACTS Technologies',
- /* 0x00E9 */ 'Vtrack Systems',
- /* 0x00EA */ 'Nielsen-Kellerman Company',
- /* 0x00EB */ 'Server Technology Inc.',
- /* 0x00EC */ 'BioResearch Associates',
- /* 0x00ED */ 'Jolly Logic, LLC',
- /* 0x00EE */ 'Above Average Outcomes, Inc.',
- /* 0x00EF */ 'Bitsplitters GmbH',
- /* 0x00F0 */ 'PayPal, Inc.',
- /* 0x00F1 */ 'Witron Technology Limited',
- /* 0x00F2 */ 'Morse Project Inc.',
- /* 0x00F3 */ 'Kent Displays Inc.',
- /* 0x00F4 */ 'Nautilus Inc.',
- /* 0x00F5 */ 'Smartifier Oy',
- /* 0x00F6 */ 'Elcometer Limited',
- /* 0x00F7 */ 'VSN Technologies, Inc.',
- /* 0x00F8 */ 'AceUni Corp., Ltd.',
- /* 0x00F9 */ 'StickNFind',
- /* 0x00FA */ 'Crystal Code AB',
- /* 0x00FB */ 'KOUKAAM a.s.',
- /* 0x00FC */ 'Delphi Corporation',
- /* 0x00FD */ 'ValenceTech Limited',
- /* 0x00FE */ 'Stanley Black and Decker',
- /* 0x00FF */ 'Typo Products, LLC',
- /* 0x0100 */ 'TomTom International BV',
- /* 0x0101 */ 'Fugoo, Inc.',
- /* 0x0102 */ 'Keiser Corporation',
- /* 0x0103 */ 'Bang & Olufsen A/S',
- /* 0x0104 */ 'PLUS Location Systems Pty Ltd',
- /* 0x0105 */ 'Ubiquitous Computing Technology Corporation',
- /* 0x0106 */ 'Innovative Yachtter Solutions',
- /* 0x0107 */ 'William Demant Holding A/S',
- /* 0x0108 */ 'Chicony Electronics Co., Ltd.',
- /* 0x0109 */ 'Atus BV',
- /* 0x010A */ 'Codegate Ltd',
- /* 0x010B */ 'ERi, Inc',
- /* 0x010C */ 'Transducers Direct, LLC',
- /* 0x010D */ 'Fujitsu Ten LImited',
- /* 0x010E */ 'Audi AG',
- /* 0x010F */ 'HiSilicon Technologies Col, Ltd.',
- /* 0x0110 */ 'Nippon Seiki Co., Ltd.',
- /* 0x0111 */ 'Steelseries ApS',
- /* 0x0112 */ 'Visybl Inc.',
- /* 0x0113 */ 'Openbrain Technologies, Co., Ltd.',
- /* 0x0114 */ 'Xensr',
- /* 0x0115 */ 'e.solutions',
- /* 0x0116 */ '10AK Technologies',
- /* 0x0117 */ 'Wimoto Technologies Inc',
- /* 0x0118 */ 'Radius Networks, Inc.',
- /* 0x0119 */ 'Wize Technology Co., Ltd.',
- /* 0x011A */ 'Qualcomm Labs, Inc.',
- /* 0x011B */ 'Aruba Networks',
- /* 0x011C */ 'Baidu',
- /* 0x011D */ 'Arendi AG',
- /* 0x011E */ 'Skoda Auto a.s.',
- /* 0x011F */ 'Volkswagen AG',
- /* 0x0120 */ 'Porsche AG',
- /* 0x0121 */ 'Sino Wealth Electronic Ltd.',
- /* 0x0122 */ 'AirTurn, Inc.',
- /* 0x0123 */ 'Kinsa, Inc',
- /* 0x0124 */ 'HID Global',
- /* 0x0125 */ 'SEAT es',
- /* 0x0126 */ 'Promethean Ltd.',
- /* 0x0127 */ 'Salutica Allied Solutions',
- /* 0x0128 */ 'GPSI Group Pty Ltd',
- /* 0x0129 */ 'Nimble Devices Oy',
- /* 0x012A */ 'Changzhou Yongse Infotech Co., Ltd.',
- /* 0x012B */ 'SportIQ',
- /* 0x012C */ 'TEMEC Instruments B.V.',
- /* 0x012D */ 'Sony Corporation',
- /* 0x012E */ 'ASSA ABLOY',
- /* 0x012F */ 'Clarion Co. Inc.',
- /* 0x0130 */ 'Warehouse Innovations',
- /* 0x0131 */ 'Cypress Semiconductor',
- /* 0x0132 */ 'MADS Inc',
- /* 0x0133 */ 'Blue Maestro Limited',
- /* 0x0134 */ 'Resolution Products, Ltd.',
- /* 0x0135 */ 'Aireware LLC',
- /* 0x0136 */ 'Seed Labs, Inc. (formerly ETC sp. z.o.o.)',
- /* 0x0137 */ 'Prestigio Plaza Ltd.',
- /* 0x0138 */ 'NTEO Inc.',
- /* 0x0139 */ 'Focus Systems Corporation',
- /* 0x013A */ 'Tencent Holdings Ltd.',
- /* 0x013B */ 'Allegion',
- /* 0x013C */ 'Murata Manufacturing Co., Ltd.',
- /* 0x013D */ 'WirelessWERX',
- /* 0x013E */ 'Nod, Inc.',
- /* 0x013F */ 'B&B Manufacturing Company',
- /* 0x0140 */ 'Alpine Electronics (China) Co., Ltd',
- /* 0x0141 */ 'FedEx Services',
- /* 0x0142 */ 'Grape Systems Inc.',
- /* 0x0143 */ 'Bkon Connect',
- /* 0x0144 */ 'Lintech GmbH',
- /* 0x0145 */ 'Novatel Wireless',
- /* 0x0146 */ 'Ciright',
- /* 0x0147 */ 'Mighty Cast, Inc.',
- /* 0x0148 */ 'Ambimat Electronics',
- /* 0x0149 */ 'Perytons Ltd.',
- /* 0x014A */ 'Tivoli Audio, LLC',
- /* 0x014B */ 'Master Lock',
- /* 0x014C */ 'Mesh-Net Ltd',
- /* 0x014D */ 'HUIZHOU DESAY SV AUTOMOTIVE CO., LTD.',
- /* 0x014E */ 'Tangerine, Inc.',
- /* 0x014F */ 'B&W Group Ltd.',
- /* 0x0150 */ 'Pioneer Corporation',
- /* 0x0151 */ 'OnBeep',
- /* 0x0152 */ 'Vernier Software & Technology',
- /* 0x0153 */ 'ROL Ergo',
- /* 0x0154 */ 'Pebble Technology',
- /* 0x0155 */ 'NETATMO',
- /* 0x0156 */ 'Accumulate AB',
- /* 0x0157 */ 'Anhui Huami Information Technology Co., Ltd.',
- /* 0x0158 */ 'Inmite s.r.o.',
- /* 0x0159 */ 'ChefSteps, Inc.',
- /* 0x015A */ 'micas AG',
- /* 0x015B */ 'Biomedical Research Ltd.',
- /* 0x015C */ 'Pitius Tec S.L.',
- /* 0x015D */ 'Estimote, Inc.',
- /* 0x015E */ 'Unikey Technologies, Inc.',
- /* 0x015F */ 'Timer Cap Co.',
- /* 0x0160 */ 'AwoX',
- /* 0x0161 */ 'yikes',
- /* 0x0162 */ 'MADSGlobalNZ Ltd.',
- /* 0x0163 */ 'PCH International',
- /* 0x0164 */ 'Qingdao Yeelink Information Technology Co., Ltd.',
- /* 0x0165 */ 'Milwaukee Tool (Formally Milwaukee Electric Tools)',
- /* 0x0166 */ 'MISHIK Pte Ltd',
- /* 0x0167 */ 'Bayer HealthCare',
- /* 0x0168 */ 'Spicebox LLC',
- /* 0x0169 */ 'emberlight',
- /* 0x016A */ 'Cooper-Atkins Corporation',
- /* 0x016B */ 'Qblinks',
- /* 0x016C */ 'MYSPHERA',
- /* 0x016D */ 'LifeScan Inc',
- /* 0x016E */ 'Volantic AB',
- /* 0x016F */ 'Podo Labs, Inc',
- /* 0x0170 */ 'Roche Diabetes Care AG',
- /* 0x0171 */ 'Amazon Fulfillment Service',
- /* 0x0172 */ 'Connovate Technology Private Limited',
- /* 0x0173 */ 'Kocomojo, LLC',
- /* 0x0174 */ 'EveryKey LLC',
- /* 0x0175 */ 'Dynamic Controls',
- /* 0x0176 */ 'SentriLock',
- /* 0x0177 */ 'I-SYST inc.',
- /* 0x0178 */ 'CASIO COMPUTER CO., LTD.',
- /* 0x0179 */ 'LAPIS Semiconductor Co., Ltd.',
- /* 0x017A */ 'Telemonitor, Inc.',
- /* 0x017B */ 'taskit GmbH',
- /* 0x017C */ 'Daimler AG',
- /* 0x017D */ 'BatAndCat',
- /* 0x017E */ 'BluDotz Ltd',
- /* 0x017F */ 'XTel Wireless ApS',
- /* 0x0180 */ 'Gigaset Communications GmbH',
- /* 0x0181 */ 'Gecko Health Innovations, Inc.',
- /* 0x0182 */ 'HOP Ubiquitous',
- /* 0x0183 */ 'Walt Disney',
- /* 0x0184 */ 'Nectar',
- /* 0x0185 */ 'bel\'apps LLC',
- /* 0x0186 */ 'CORE Lighting Ltd',
- /* 0x0187 */ 'Seraphim Sense Ltd',
- /* 0x0188 */ 'Unico RBC',
- /* 0x0189 */ 'Physical Enterprises Inc.',
- /* 0x018A */ 'Able Trend Technology Limited',
- /* 0x018B */ 'Konica Minolta, Inc.',
- /* 0x018C */ 'Wilo SE',
- /* 0x018D */ 'Extron Design Services',
- /* 0x018E */ 'Fitbit, Inc.',
- /* 0x018F */ 'Fireflies Systems',
- /* 0x0190 */ 'Intelletto Technologies Inc.',
- /* 0x0191 */ 'FDK CORPORATION',
- /* 0x0192 */ 'Cloudleaf, Inc',
- /* 0x0193 */ 'Maveric Automation LLC',
- /* 0x0194 */ 'Acoustic Stream Corporation',
- /* 0x0195 */ 'Zuli',
- /* 0x0196 */ 'Paxton Access Ltd',
- /* 0x0197 */ 'WiSilica Inc.',
- /* 0x0198 */ 'VENGIT Korlatolt Felelossegu Tarsasag',
- /* 0x0199 */ 'SALTO SYSTEMS S.L.',
- /* 0x019A */ 'TRON Forum (formerly T-Engine Forum)',
- /* 0x019B */ 'CUBETECH s.r.o.',
- /* 0x019C */ 'Cokiya Incorporated',
- /* 0x019D */ 'CVS Health',
- /* 0x019E */ 'Ceruus',
- /* 0x019F */ 'Strainstall Ltd',
- /* 0x01A0 */ 'Channel Enterprises (HK) Ltd.',
- /* 0x01A1 */ 'FIAMM',
- /* 0x01A2 */ 'GIGALANE.CO.,LTD',
- /* 0x01A3 */ 'EROAD',
- /* 0x01A4 */ 'Mine Safety Appliances',
- /* 0x01A5 */ 'Icon Health and Fitness',
- /* 0x01A6 */ 'Asandoo GmbH',
- /* 0x01A7 */ 'ENERGOUS CORPORATION',
- /* 0x01A8 */ 'Taobao',
- /* 0x01A9 */ 'Canon Inc.',
- /* 0x01AA */ 'Geophysical Technology Inc.',
- /* 0x01AB */ 'Facebook, Inc.',
- /* 0x01AC */ 'Nipro Diagnostics, Inc.',
- /* 0x01AD */ 'FlightSafety International',
- /* 0x01AE */ 'Earlens Corporation',
- /* 0x01AF */ 'Sunrise Micro Devices, Inc.',
- /* 0x01B0 */ 'Star Micronics Co., Ltd.',
- /* 0x01B1 */ 'Netizens Sp. z o.o.',
- /* 0x01B2 */ 'Nymi Inc.',
- /* 0x01B3 */ 'Nytec, Inc.',
- /* 0x01B4 */ 'Trineo Sp. z o.o.',
- /* 0x01B5 */ 'Nest Labs Inc.',
- /* 0x01B6 */ 'LM Technologies Ltd',
- /* 0x01B7 */ 'General Electric Company',
- /* 0x01B8 */ 'i+D3 S.L.',
- /* 0x01B9 */ 'HANA Micron',
- /* 0x01BA */ 'Stages Cycling LLC',
- /* 0x01BB */ 'Cochlear Bone Anchored Solutions AB',
- /* 0x01BC */ 'SenionLab AB',
- /* 0x01BD */ 'Syszone Co., Ltd',
- /* 0x01BE */ 'Pulsate Mobile Ltd.',
- /* 0x01BF */ 'Hong Kong HunterSun Electronic Limited',
- /* 0x01C0 */ 'pironex GmbH',
- /* 0x01C1 */ 'BRADATECH Corp.',
- /* 0x01C2 */ 'Transenergooil AG',
- /* 0x01C3 */ 'Bunch',
- /* 0x01C4 */ 'DME Microelectronics',
- /* 0x01C5 */ 'Bitcraze AB',
- /* 0x01C6 */ 'HASWARE Inc.',
- /* 0x01C7 */ 'Abiogenix Inc.',
- /* 0x01C8 */ 'Poly-Control ApS',
- /* 0x01C9 */ 'Avi-on',
- /* 0x01CA */ 'Laerdal Medical AS',
- /* 0x01CB */ 'Fetch My Pet',
- /* 0x01CC */ 'Sam Labs Ltd.',
- /* 0x01CD */ 'Chengdu Synwing Technology Ltd',
- /* 0x01CE */ 'HOUWA SYSTEM DESIGN, k.k.',
- /* 0x01CF */ 'BSH',
- /* 0x01D0 */ 'Primus Inter Pares Ltd',
- /* 0x01D1 */ 'August Home, Inc',
- /* 0x01D2 */ 'Gill Electronics',
- /* 0x01D3 */ 'Sky Wave Design',
- /* 0x01D4 */ 'Newlab S.r.l.',
- /* 0x01D5 */ 'ELAD srl',
- /* 0x01D6 */ 'G-wearables inc.',
- /* 0x01D7 */ 'Squadrone Systems Inc.',
- /* 0x01D8 */ 'Code Corporation',
- /* 0x01D9 */ 'Savant Systems LLC',
- /* 0x01DA */ 'Logitech International SA',
- /* 0x01DB */ 'Innblue Consulting',
- /* 0x01DC */ 'iParking Ltd.',
- /* 0x01DD */ 'Koninklijke Philips Electronics N.V.',
- /* 0x01DE */ 'Minelab Electronics Pty Limited',
- /* 0x01DF */ 'Bison Group Ltd.',
- /* 0x01E0 */ 'Widex A/S',
- /* 0x01E1 */ 'Jolla Ltd',
- /* 0x01E2 */ 'Lectronix, Inc.',
- /* 0x01E3 */ 'Caterpillar Inc',
- /* 0x01E4 */ 'Freedom Innovations',
- /* 0x01E5 */ 'Dynamic Devices Ltd',
- /* 0x01E6 */ 'Technology Solutions (UK) Ltd',
- /* 0x01E7 */ 'IPS Group Inc.',
- /* 0x01E8 */ 'STIR',
- /* 0x01E9 */ 'Sano, Inc.',
- /* 0x01EA */ 'Advanced Application Design, Inc.',
- /* 0x01EB */ 'AutoMap LLC',
- /* 0x01EC */ 'Spreadtrum Communications Shanghai Ltd',
- /* 0x01ED */ 'CuteCircuit LTD',
- /* 0x01EE */ 'Valeo Service',
- /* 0x01EF */ 'Fullpower Technologies, Inc.',
- /* 0x01F0 */ 'KloudNation',
- /* 0x01F1 */ 'Zebra Technologies Corporation',
- /* 0x01F2 */ 'Itron, Inc.',
- /* 0x01F3 */ 'The University of Tokyo',
- /* 0x01F4 */ 'UTC Fire and Security',
- /* 0x01F5 */ 'Cool Webthings Limited',
- /* 0x01F6 */ 'DJO Global',
- /* 0x01F7 */ 'Gelliner Limited',
- /* 0x01F8 */ 'Anyka (Guangzhou) Microelectronics Technology Co, LTD',
- /* 0x01F9 */ 'Medtronic Inc.',
- /* 0x01FA */ 'Gozio Inc.',
- /* 0x01FB */ 'Form Lifting, LLC',
- /* 0x01FC */ 'Wahoo Fitness, LLC',
- /* 0x01FD */ 'Kontakt Micro-Location Sp. z o.o.',
- /* 0x01FE */ 'Radio Systems Corporation',
- /* 0x01FF */ 'Freescale Semiconductor, Inc.',
- /* 0x0200 */ 'Verifone Systems Pte Ltd. Taiwan Branch',
- /* 0x0201 */ 'AR Timing',
- /* 0x0202 */ 'Rigado LLC',
- /* 0x0203 */ 'Kemppi Oy',
- /* 0x0204 */ 'Tapcentive Inc.',
- /* 0x0205 */ 'Smartbotics Inc.',
- /* 0x0206 */ 'Otter Products, LLC',
- /* 0x0207 */ 'STEMP Inc.',
- /* 0x0208 */ 'LumiGeek LLC',
- /* 0x0209 */ 'InvisionHeart Inc.',
- /* 0x020A */ 'Macnica Inc.',
- /* 0x020B */ 'Jaguar Land Rover Limited',
- /* 0x020C */ 'CoroWare Technologies, Inc',
- /* 0x020D */ 'Simplo Technology Co., LTD',
- /* 0x020E */ 'Omron Healthcare Co., LTD',
- /* 0x020F */ 'Comodule GMBH',
- /* 0x0210 */ 'ikeGPS',
- /* 0x0211 */ 'Telink Semiconductor Co. Ltd',
- /* 0x0212 */ 'Interplan Co., Ltd',
- /* 0x0213 */ 'Wyler AG',
- /* 0x0214 */ 'IK Multimedia Production srl',
- /* 0x0215 */ 'Lukoton Experience Oy',
- /* 0x0216 */ 'MTI Ltd',
- /* 0x0217 */ 'Tech4home, Lda',
- /* 0x0218 */ 'Hiotech AB',
- /* 0x0219 */ 'DOTT Limited',
- /* 0x021A */ 'Blue Speck Labs, LLC',
- /* 0x021B */ 'Cisco Systems, Inc',
- /* 0x021C */ 'Mobicomm Inc',
- /* 0x021D */ 'Edamic',
- /* 0x021E */ 'Goodnet, Ltd',
- /* 0x021F */ 'Luster Leaf Products Inc',
- /* 0x0220 */ 'Manus Machina BV',
- /* 0x0221 */ 'Mobiquity Networks Inc',
- /* 0x0222 */ 'Praxis Dynamics',
- /* 0x0223 */ 'Philip Morris Products S.A.',
- /* 0x0224 */ 'Comarch SA',
- /* 0x0225 */ 'Nestl Nespresso S.A.',
- /* 0x0226 */ 'Merlinia A/S',
- /* 0x0227 */ 'LifeBEAM Technologies',
- /* 0x0228 */ 'Twocanoes Labs, LLC',
- /* 0x0229 */ 'Muoverti Limited',
- /* 0x022A */ 'Stamer Musikanlagen GMBH',
- /* 0x022B */ 'Tesla Motors',
- /* 0x022C */ 'Pharynks Corporation',
- /* 0x022D */ 'Lupine',
- /* 0x022E */ 'Siemens AG',
- /* 0x022F */ 'Huami (Shanghai) Culture Communication CO., LTD',
- /* 0x0230 */ 'Foster Electric Company, Ltd',
- /* 0x0231 */ 'ETA SA',
- /* 0x0232 */ 'x-Senso Solutions Kft',
- /* 0x0233 */ 'Shenzhen SuLong Communication Ltd',
- /* 0x0234 */ 'FengFan (BeiJing) Technology Co, Ltd',
- /* 0x0235 */ 'Qrio Inc',
- /* 0x0236 */ 'Pitpatpet Ltd',
- /* 0x0237 */ 'MSHeli s.r.l.',
- /* 0x0238 */ 'Trakm8 Ltd',
- /* 0x0239 */ 'JIN CO, Ltd',
- /* 0x023A */ 'Alatech Tehnology',
- /* 0x023B */ 'Beijing CarePulse Electronic Technology Co, Ltd',
- /* 0x023C */ 'Awarepoint',
- /* 0x023D */ 'ViCentra B.V.',
- /* 0x023E */ 'Raven Industries',
- /* 0x023F */ 'WaveWare Technologies Inc.',
- /* 0x0240 */ 'Argenox Technologies',
- /* 0x0241 */ 'Bragi GmbH',
- /* 0x0242 */ '16Lab Inc',
- /* 0x0243 */ 'Masimo Corp',
- /* 0x0244 */ 'Iotera Inc',
- /* 0x0245 */ 'Endress+Hauser',
- /* 0x0246 */ 'ACKme Networks, Inc.',
- /* 0x0247 */ 'FiftyThree Inc.',
- /* 0x0248 */ 'Parker Hannifin Corp',
- /* 0x0249 */ 'Transcranial Ltd',
- /* 0x024A */ 'Uwatec AG',
- /* 0x024B */ 'Orlan LLC',
- /* 0x024C */ 'Blue Clover Devices',
- /* 0x024D */ 'M-Way Solutions GmbH',
- /* 0x024E */ 'Microtronics Engineering GmbH',
- /* 0x024F */ 'Schneider Schreibgerte GmbH',
- /* 0x0250 */ 'Sapphire Circuits LLC',
- /* 0x0251 */ 'Lumo Bodytech Inc.',
- /* 0x0252 */ 'UKC Technosolution',
- /* 0x0253 */ 'Xicato Inc.',
- /* 0x0254 */ 'Playbrush',
- /* 0x0255 */ 'Dai Nippon Printing Co., Ltd.',
- /* 0x0256 */ 'G24 Power Limited',
- /* 0x0257 */ 'AdBabble Local Commerce Inc.',
- /* 0x0258 */ 'Devialet SA',
- /* 0x0259 */ 'ALTYOR',
- /* 0x025A */ 'University of Applied Sciences Valais/Haute Ecole Valaisanne',
- /* 0x025B */ 'Five Interactive, LLC dba Zendo',
- /* 0x025C */ 'NetEaseHangzhouNetwork co.Ltd.',
- /* 0x025D */ 'Lexmark International Inc.',
- /* 0x025E */ 'Fluke Corporation',
- /* 0x025F */ 'Yardarm Technologies',
- /* 0x0260 */ 'SensaRx',
- /* 0x0261 */ 'SECVRE GmbH',
- /* 0x0262 */ 'Glacial Ridge Technologies',
- /* 0x0263 */ 'Identiv, Inc.',
- /* 0x0264 */ 'DDS, Inc.',
- /* 0x0265 */ 'SMK Corporation',
- /* 0x0266 */ 'Schawbel Technologies LLC',
- /* 0x0267 */ 'XMI Systems SA',
- /* 0x0268 */ 'Cerevo',
- /* 0x0269 */ 'Torrox GmbH & Co KG',
- /* 0x026A */ 'Gemalto',
- /* 0x026B */ 'DEKA Research & Development Corp.',
- /* 0x026C */ 'Domster Tadeusz Szydlowski',
- /* 0x026D */ 'Technogym SPA',
- /* 0x026E */ 'FLEURBAEY BVBA',
- /* 0x026F */ 'Aptcode Solutions',
- /* 0x0270 */ 'LSI ADL Technology',
- /* 0x0271 */ 'Animas Corp',
- /* 0x0272 */ 'Alps Electric Co., Ltd.',
- /* 0x0273 */ 'OCEASOFT',
- /* 0x0274 */ 'Motsai Research',
- /* 0x0275 */ 'Geotab',
- /* 0x0276 */ 'E.G.O. Elektro-Gertebau GmbH',
- /* 0x0277 */ 'bewhere inc',
- /* 0x0278 */ 'Johnson Outdoors Inc',
- /* 0x0279 */ 'steute Schaltgerate GmbH & Co. KG',
- /* 0x027A */ 'Ekomini inc.',
- /* 0x027B */ 'DEFA AS',
- /* 0x027C */ 'Aseptika Ltd',
- /* 0x027D */ 'HUAWEI Technologies Co., Ltd. ( )',
- /* 0x027E */ 'HabitAware, LLC',
- /* 0x027F */ 'ruwido austria gmbh',
- /* 0x0280 */ 'ITEC corporation',
- /* 0x0281 */ 'StoneL',
- /* 0x0282 */ 'Sonova AG',
- /* 0x0283 */ 'Maven Machines, Inc.',
- /* 0x0284 */ 'Synapse Electronics',
- /* 0x0285 */ 'Standard Innovation Inc.',
- /* 0x0286 */ 'RF Code, Inc.',
- /* 0x0287 */ 'Wally Ventures S.L.',
- /* 0x0288 */ 'Willowbank Electronics Ltd',
- /* 0x0289 */ 'SK Telecom',
- /* 0x028A */ 'Jetro AS',
- /* 0x028B */ 'Code Gears LTD',
- /* 0x028C */ 'NANOLINK APS',
- /* 0x028D */ 'IF, LLC',
- /* 0x028E */ 'RF Digital Corp',
- /* 0x028F */ 'Church & Dwight Co., Inc',
- /* 0x0290 */ 'Multibit Oy',
- /* 0x0291 */ 'CliniCloud Inc',
- /* 0x0292 */ 'SwiftSensors',
- /* 0x0293 */ 'Blue Bite',
- /* 0x0294 */ 'ELIAS GmbH',
- /* 0x0295 */ 'Sivantos GmbH',
- /* 0x0296 */ 'Petzl',
- /* 0x0297 */ 'storm power ltd',
- /* 0x0298 */ 'EISST Ltd',
- /* 0x0299 */ 'Inexess Technology Simma KG',
- /* 0x029A */ 'Currant, Inc.',
- /* 0x029B */ 'C2 Development, Inc.',
- /* 0x029C */ 'Blue Sky Scientific, LLC',
- /* 0x029D */ 'ALOTTAZS LABS, LLC',
- /* 0x029E */ 'Kupson spol. s r.o.',
- /* 0x029F */ 'Areus Engineering GmbH',
- /* 0x02A0 */ 'Impossible Camera GmbH',
- /* 0x02A1 */ 'InventureTrack Systems',
- /* 0x02A2 */ 'LockedUp',
- /* 0x02A3 */ 'Itude',
- /* 0x02A4 */ 'Pacific Lock Company',
- /* 0x02A5 */ 'Tendyron Corporation ( )',
- /* 0x02A6 */ 'Robert Bosch GmbH',
- /* 0x02A7 */ 'Illuxtron international B.V.',
- /* 0x02A8 */ 'miSport Ltd.',
- /* 0x02A9 */ 'Chargelib',
- /* 0x02AA */ 'Doppler Lab',
- /* 0x02AB */ 'BBPOS Limited',
- /* 0x02AC */ 'RTB Elektronik GmbH & Co. KG',
- /* 0x02AD */ 'Rx Networks, Inc.',
- /* 0x02AE */ 'WeatherFlow, Inc.',
- /* 0x02AF */ 'Technicolor USA Inc.',
- /* 0x02B0 */ 'Bestechnic(Shanghai),Ltd',
- /* 0x02B1 */ 'Raden Inc',
- /* 0x02B2 */ 'JouZen Oy',
- /* 0x02B3 */ 'CLABER S.P.A.',
- /* 0x02B4 */ 'Hyginex, Inc.',
- /* 0x02B5 */ 'HANSHIN ELECTRIC RAILWAY CO.,LTD.',
- /* 0x02B6 */ 'Schneider Electric',
- /* 0x02B7 */ 'Oort Technologies LLC',
- /* 0x02B8 */ 'Chrono Therapeutics',
- /* 0x02B9 */ 'Rinnai Corporation',
- /* 0x02BA */ 'Swissprime Technologies AG',
- /* 0x02BB */ 'Koha.,Co.Ltd',
- /* 0x02BC */ 'Genevac Ltd',
- /* 0x02BD */ 'Chemtronics',
- /* 0x02BE */ 'Seguro Technology Sp. z o.o.',
- /* 0x02BF */ 'Redbird Flight Simulations',
- /* 0x02C0 */ 'Dash Robotics',
- /* 0x02C1 */ 'LINE Corporation',
- /* 0x02C2 */ 'Guillemot Corporation',
- /* 0x02C3 */ 'Techtronic Power Tools Technology Limited',
- /* 0x02C4 */ 'Wilson Sporting Goods',
- /* 0x02C5 */ 'Lenovo (Singapore) Pte Ltd. ( )',
- /* 0x02C6 */ 'Ayatan Sensors',
- /* 0x02C7 */ 'Electronics Tomorrow Limited',
- /* 0x02C8 */ 'VASCO Data Security International, Inc.',
- /* 0x02C9 */ 'PayRange Inc.',
- /* 0x02CA */ 'ABOV Semiconductor',
- /* 0x02CB */ 'AINA-Wireless Inc.',
- /* 0x02CC */ 'Eijkelkamp Soil & Water',
- /* 0x02CD */ 'BMA ergonomics b.v.',
- /* 0x02CE */ 'Teva Branded Pharmaceutical Products R&D, Inc.',
- /* 0x02CF */ 'Anima',
- /* 0x02D0 */ '3M',
- /* 0x02D1 */ 'Empatica Srl',
- /* 0x02D2 */ 'Afero, Inc.',
- /* 0x02D3 */ 'Powercast Corporation',
- /* 0x02D4 */ 'Secuyou ApS',
- /* 0x02D5 */ 'OMRON Corporation',
- /* 0x02D6 */ 'Send Solutions',
- /* 0x02D7 */ 'NIPPON SYSTEMWARE CO.,LTD.',
- /* 0x02D8 */ 'Neosfar',
- /* 0x02D9 */ 'Fliegl Agrartechnik GmbH',
- /* 0x02DA */ 'Gilvader',
- /* 0x02DB */ 'Digi International Inc (R)',
- /* 0x02DC */ 'DeWalch Technologies, Inc.',
- /* 0x02DD */ 'Flint Rehabilitation Devices, LLC',
- /* 0x02DE */ 'Samsung SDS Co., Ltd.',
- /* 0x02DF */ 'Blur Product Development',
- /* 0x02E0 */ 'University of Michigan',
- /* 0x02E1 */ 'Victron Energy BV',
- /* 0x02E2 */ 'NTT docomo',
- /* 0x02E3 */ 'Carmanah Technologies Corp.',
- /* 0x02E4 */ 'Bytestorm Ltd.',
- /* 0x02E5 */ 'Espressif Incorporated ( () )',
- /* 0x02E6 */ 'Unwire',
- /* 0x02E7 */ 'Connected Yard, Inc.',
- /* 0x02E8 */ 'American Music Environments',
- /* 0x02E9 */ 'Sensogram Technologies, Inc.',
- /* 0x02EA */ 'Fujitsu Limited',
- /* 0x02EB */ 'Ardic Technology',
- /* 0x02EC */ 'Delta Systems, Inc',
- /* 0x02ED */ 'HTC Corporation',
- /* 0x02EE */ 'Citizen Holdings Co., Ltd.',
- /* 0x02EF */ 'SMART-INNOVATION.inc',
- /* 0x02F0 */ 'Blackrat Software',
- /* 0x02F1 */ 'The Idea Cave, LLC',
- /* 0x02F2 */ 'GoPro, Inc.',
- /* 0x02F3 */ 'AuthAir, Inc',
- /* 0x02F4 */ 'Vensi, Inc.',
- /* 0x02F5 */ 'Indagem Tech LLC',
- /* 0x02F6 */ 'Intemo Technologies',
- /* 0x02F7 */ 'DreamVisions co., Ltd.',
- /* 0x02F8 */ 'Runteq Oy Ltd',
- /* 0x02F9 */ 'IMAGINATION TECHNOLOGIES LTD',
- /* 0x02FA */ 'CoSTAR TEchnologies',
- /* 0x02FB */ 'Clarius Mobile Health Corp.',
- /* 0x02FC */ 'Shanghai Frequen Microelectronics Co., Ltd.',
- /* 0x02FD */ 'Uwanna, Inc.',
- /* 0x02FE */ 'Lierda Science & Technology Group Co., Ltd.',
- /* 0x02FF */ 'Silicon Laboratories',
- /* 0x0300 */ 'World Moto Inc.',
- /* 0x0301 */ 'Giatec Scientific Inc.',
- /* 0x0302 */ 'Loop Devices, Inc',
- /* 0x0303 */ 'IACA electronique',
- /* 0x0304 */ 'Martians Inc',
- /* 0x0305 */ 'Swipp ApS',
- /* 0x0306 */ 'Life Laboratory Inc.',
- /* 0x0307 */ 'FUJI INDUSTRIAL CO.,LTD.',
- /* 0x0308 */ 'Surefire, LLC',
- /* 0x0309 */ 'Dolby Labs',
- /* 0x030A */ 'Ellisys',
- /* 0x030B */ 'Magnitude Lighting Converters',
- /* 0x030C */ 'Hilti AG',
- /* 0x030D */ 'Devdata S.r.l.',
- /* 0x030E */ 'Deviceworx',
- /* 0x030F */ 'Shortcut Labs',
- /* 0x0310 */ 'SGL Italia S.r.l.',
- /* 0x0311 */ 'PEEQ DATA',
- /* 0x0312 */ 'Ducere Technologies Pvt Ltd',
- /* 0x0313 */ 'DiveNav, Inc.',
- /* 0x0314 */ 'RIIG AI Sp. z o.o.',
- /* 0x0315 */ 'Thermo Fisher Scientific',
- /* 0x0316 */ 'AG Measurematics Pvt. Ltd.',
- /* 0x0317 */ 'CHUO Electronics CO., LTD.',
- /* 0x0318 */ 'Aspenta International',
- /* 0x0319 */ 'Eugster Frismag AG',
- /* 0x031A */ 'Amber wireless GmbH',
- /* 0x031B */ 'HQ Inc',
- /* 0x031C */ 'Lab Sensor Solutions',
- /* 0x031D */ 'Enterlab ApS',
- /* 0x031E */ 'Eyefi, Inc.',
- /* 0x031F */ 'MetaSystem S.p.A.',
- /* 0x0320 */ 'SONO ELECTRONICS. CO., LTD',
- /* 0x0321 */ 'Jewelbots',
- /* 0x0322 */ 'Compumedics Limited',
- /* 0x0323 */ 'Rotor Bike Components',
- /* 0x0324 */ 'Astro, Inc.',
- /* 0x0325 */ 'Amotus Solutions',
- /* 0x0326 */ 'Healthwear Technologies (Changzhou)Ltd',
- /* 0x0327 */ 'Essex Electronics',
- /* 0x0328 */ 'Grundfos A/S',
- /* 0x0329 */ 'Eargo, Inc.',
- /* 0x032A */ 'Electronic Design Lab',
- /* 0x032B */ 'ESYLUX',
- /* 0x032C */ 'NIPPON SMT.CO.,Ltd',
- /* 0x032D */ 'BM innovations GmbH',
- /* 0x032E */ 'indoormap',
- /* 0x032F */ 'OttoQ Inc',
- /* 0x0330 */ 'North Pole Engineering',
- /* 0x0331 */ '3flares Technologies Inc.',
- /* 0x0332 */ 'Electrocompaniet A.S.',
- /* 0x0333 */ 'Mul-T-Lock',
- /* 0x0334 */ 'Corentium AS',
- /* 0x0335 */ 'Enlighted Inc',
- /* 0x0336 */ 'GISTIC',
- /* 0x0337 */ 'AJP2 Holdings, LLC',
- /* 0x0338 */ 'COBI GmbH',
- /* 0x0339 */ 'Blue Sky Scientific, LLC',
- /* 0x033A */ 'Appception, Inc.',
- /* 0x033B */ 'Courtney Thorne Limited',
- /* 0x033C */ 'Virtuosys',
- /* 0x033D */ 'TPV Technology Limited',
- /* 0x033E */ 'Monitra SA',
- /* 0x033F */ 'Automation Components, Inc.',
- /* 0x0340 */ 'Letsense s.r.l.',
- /* 0x0341 */ 'Etesian Technologies LLC',
- /* 0x0342 */ 'GERTEC BRASIL LTDA.',
- /* 0x0343 */ 'Drekker Development Pty. Ltd.',
- /* 0x0344 */ 'Whirl Inc',
- /* 0x0345 */ 'Locus Positioning',
- /* 0x0346 */ 'Acuity Brands Lighting, Inc',
- /* 0x0347 */ 'Prevent Biometrics',
- /* 0x0348 */ 'Arioneo',
- /* 0x0349 */ 'VersaMe',
- /* 0x034A */ 'Vaddio',
- /* 0x034B */ 'Libratone A/S',
- /* 0x034C */ 'HM Electronics, Inc.',
- /* 0x034D */ 'TASER International, Inc.',
- /* 0x034E */ 'SafeTrust Inc.',
- /* 0x034F */ 'Heartland Payment Systems',
- /* 0x0350 */ 'Bitstrata Systems Inc.',
- /* 0x0351 */ 'Pieps GmbH',
- /* 0x0352 */ 'iRiding(Xiamen)Technology Co.,Ltd.',
- /* 0x0353 */ 'Alpha Audiotronics, Inc.',
- /* 0x0354 */ 'TOPPAN FORMS CO.,LTD.',
- /* 0x0355 */ 'Sigma Designs, Inc.',
- /* 0x0356 */ 'Spectrum Brands, Inc.',
- /* 0x0357 */ 'Polymap Wireless',
- /* 0x0358 */ 'MagniWare Ltd.',
- /* 0x0359 */ 'Novotec Medical GmbH',
- /* 0x035A */ 'Medicom Innovation Partner a/s',
- /* 0x035B */ 'Matrix Inc.',
- /* 0x035C */ 'Eaton Corporation',
- /* 0x035D */ 'KYS',
- /* 0x035E */ 'Naya Health, Inc.',
- /* 0x035F */ 'Acromag',
- /* 0x0360 */ 'Insulet Corporation',
- /* 0x0361 */ 'Wellinks Inc.',
- /* 0x0362 */ 'ON Semiconductor',
- /* 0x0363 */ 'FREELAP SA',
- /* 0x0364 */ 'Favero Electronics Srl',
- /* 0x0365 */ 'BioMech Sensor LLC',
- /* 0x0366 */ 'BOLTT Sports technologies Private limited',
- /* 0x0367 */ 'Saphe International',
- /* 0x0368 */ 'Metormote AB',
- /* 0x0369 */ 'littleBits',
- /* 0x036A */ 'SetPoint Medical',
- /* 0x036B */ 'BRControls Products BV',
- /* 0x036C */ 'Zipcar',
- /* 0x036D */ 'AirBolt Pty Ltd',
- /* 0x036E */ 'KeepTruckin Inc',
- /* 0x036F */ 'Motiv, Inc.',
- /* 0x0370 */ 'Wazombi Labs O',
- /* 0x0371 */ 'ORBCOMM',
- /* 0x0372 */ 'Nixie Labs, Inc.',
- /* 0x0373 */ 'AppNearMe Ltd',
- /* 0x0374 */ 'Holman Industries',
- /* 0x0375 */ 'Expain AS',
- /* 0x0376 */ 'Electronic Temperature Instruments Ltd',
- /* 0x0377 */ 'Plejd AB',
- /* 0x0378 */ 'Propeller Health',
- /* 0x0379 */ 'Shenzhen iMCO Electronic Technology Co.,Ltd',
- /* 0x037A */ 'Algoria',
- /* 0x037B */ 'Apption Labs Inc.',
- /* 0x037C */ 'Cronologics Corporation',
- /* 0x037D */ 'MICRODIA Ltd.',
- /* 0x037E */ 'lulabytes S.L.',
- /* 0x037F */ 'Nestec S.A.',
- /* 0x0380 */ 'LLC \"MEGA-F service\"',
- /* 0x0381 */ 'Sharp Corporation',
- /* 0x0382 */ 'Precision Outcomes Ltd',
- /* 0x0383 */ 'Kronos Incorporated',
- /* 0x0384 */ 'OCOSMOS Co., Ltd.',
- /* 0x0385 */ 'Embedded Electronic Solutions Ltd. dba e2Solutions',
- /* 0x0386 */ 'Aterica Inc.',
- /* 0x0387 */ 'BluStor PMC, Inc.',
- /* 0x0388 */ 'Kapsch TrafficCom AB',
- /* 0x0389 */ 'ActiveBlu Corporation',
- /* 0x038A */ 'Kohler Mira Limited',
- /* 0x038B */ 'Noke',
- /* 0x038C */ 'Appion Inc.',
- /* 0x038D */ 'Resmed Ltd',
- /* 0x038E */ 'Crownstone B.V.',
- /* 0x038F */ 'Xiaomi Inc.',
- /* 0x0390 */ 'INFOTECH s.r.o.',
- /* 0x0391 */ 'Thingsquare AB',
- /* 0x0392 */ 'T&D',
- /* 0x0393 */ 'LAVAZZA S.p.A.',
- /* 0x0394 */ 'Netclearance Systems, Inc.',
- /* 0x0395 */ 'SDATAWAY',
- /* 0x0396 */ 'BLOKS GmbH',
- /* 0x0397 */ 'LEGO System A/S',
- /* 0x0398 */ 'Thetatronics Ltd',
- /* 0x0399 */ 'Nikon Corporation',
- /* 0x039A */ 'NeST',
- /* 0x039B */ 'South Silicon Valley Microelectronics',
- /* 0x039C */ 'ALE International',
- /* 0x039D */ 'CareView Communications, Inc.',
- /* 0x039E */ 'SchoolBoard Limited',
- /* 0x039F */ 'Molex Corporation',
- /* 0x03A0 */ 'IVT Wireless Limited',
- /* 0x03A1 */ 'Alpine Labs LLC',
- /* 0x03A2 */ 'Candura Instruments',
- /* 0x03A3 */ 'SmartMovt Technology Co., Ltd',
- /* 0x03A4 */ 'Token Zero Ltd',
- /* 0x03A5 */ 'ACE CAD Enterprise Co., Ltd. (ACECAD)',
- /* 0x03A6 */ 'Medela, Inc',
- /* 0x03A7 */ 'AeroScout',
- /* 0x03A8 */ 'Esrille Inc.',
- /* 0x03A9 */ 'THINKERLY SRL',
- /* 0x03AA */ 'Exon Sp. z o.o.',
- /* 0x03AB */ 'Meizu Technology Co., Ltd.',
- /* 0x03AC */ 'Smablo LTD',
- /* 0x03AD */ 'XiQ',
- /* 0x03AE */ 'Allswell Inc.',
- /* 0x03AF */ 'Comm-N-Sense Corp DBA Verigo',
- /* 0x03B0 */ 'VIBRADORM GmbH',
- /* 0x03B1 */ 'Otodata Wireless Network Inc.',
- /* 0x03B2 */ 'Propagation Systems Limited',
- /* 0x03B3 */ 'Midwest Instruments & Controls',
- /* 0x03B4 */ 'Alpha Nodus, inc.',
- /* 0x03B5 */ 'petPOMM, Inc',
- /* 0x03B6 */ 'Mattel',
- /* 0x03B7 */ 'Airbly Inc.',
- /* 0x03B8 */ 'A-Safe Limited',
- /* 0x03B9 */ 'FREDERIQUE CONSTANT SA',
- /* 0x03BA */ 'Maxscend Microelectronics Company Limited',
- /* 0x03BB */ 'Abbott Diabetes Care',
- /* 0x03BC */ 'ASB Bank Ltd',
- /* 0x03BD */ 'amadas',
- /* 0x03BE */ 'Applied Science, Inc.',
- /* 0x03BF */ 'iLumi Solutions Inc.',
- /* 0x03C0 */ 'Arch Systems Inc.',
- /* 0x03C1 */ 'Ember Technologies, Inc.',
- /* 0x03C2 */ 'Snapchat Inc',
- /* 0x03C3 */ 'Casambi Technologies Oy',
- /* 0x03C4 */ 'Pico Technology Inc.',
- /* 0x03C5 */ 'St. Jude Medical, Inc.',
- /* 0x03C6 */ 'Intricon',
- /* 0x03C7 */ 'Structural Health Systems, Inc.',
- /* 0x03C8 */ 'Avvel International',
- /* 0x03C9 */ 'Gallagher Group',
- /* 0x03CA */ 'In2things Automation Pvt. Ltd.',
- /* 0x03CB */ 'SYSDEV Srl',
- /* 0x03CC */ 'Vonkil Technologies Ltd',
- /* 0x03CD */ 'Wynd Technologies, Inc.',
- /* 0x03CE */ 'CONTRINEX S.A.',
- /* 0x03CF */ 'MIRA, Inc.',
- /* 0x03D0 */ 'Watteam Ltd',
- /* 0x03D1 */ 'Density Inc.',
- /* 0x03D2 */ 'IOT Pot India Private Limited',
- /* 0x03D3 */ 'Sigma Connectivity AB',
- /* 0x03D4 */ 'PEG PEREGO SPA',
- /* 0x03D5 */ 'Wyzelink Systems Inc.',
- /* 0x03D6 */ 'Yota Devices LTD',
- /* 0x03D7 */ 'FINSECUR',
- /* 0x03D8 */ 'Zen-Me Labs Ltd',
- /* 0x03D9 */ '3IWare Co., Ltd.',
- /* 0x03DA */ 'EnOcean GmbH',
- /* 0x03DB */ 'Instabeat, Inc',
- /* 0x03DC */ 'Nima Labs',
- /* 0x03DD */ 'Andreas Stihl AG & Co. KG',
- /* 0x03DE */ 'Nathan Rhoades LLC',
- /* 0x03DF */ 'Grob Technologies, LLC',
- /* 0x03E0 */ 'Actions (Zhuhai) Technology Co., Limited',
- /* 0x03E1 */ 'SPD Development Company Ltd',
- /* 0x03E2 */ 'Sensoan Oy',
- /* 0x03E3 */ 'Qualcomm Life Inc',
- /* 0x03E4 */ 'Chip-ing AG',
- /* 0x03E5 */ 'ffly4u',
- /* 0x03E6 */ 'IoT Instruments Oy',
- /* 0x03E7 */ 'TRUE Fitness Technology',
- /* 0x03E8 */ 'Reiner Kartengeraete GmbH & Co. KG.',
- /* 0x03E9 */ 'SHENZHEN LEMONJOY TECHNOLOGY CO., LTD.',
- /* 0x03EA */ 'Hello Inc.',
- /* 0x03EB */ 'Evollve Inc.',
- /* 0x03EC */ 'Jigowatts Inc.',
- /* 0x03ED */ 'BASIC MICRO.COM,INC.',
- /* 0x03EE */ 'CUBE TECHNOLOGIES',
- /* 0x03EF */ 'foolography GmbH',
- /* 0x03F0 */ 'CLINK',
- /* 0x03F1 */ 'Hestan Smart Cooking Inc.',
- /* 0x03F2 */ 'WindowMaster A/S',
- /* 0x03F3 */ 'Flowscape AB',
- /* 0x03F4 */ 'PAL Technologies Ltd',
- /* 0x03F5 */ 'WHERE, Inc.',
- /* 0x03F6 */ 'Iton Technology Corp.',
- /* 0x03F7 */ 'Owl Labs Inc.',
- /* 0x03F8 */ 'Rockford Corp.',
- /* 0x03F9 */ 'Becon Technologies Co.,Ltd.',
- /* 0x03FA */ 'Vyassoft Technologies Inc',
- /* 0x03FB */ 'Nox Medical',
- /* 0x03FC */ 'Kimberly-Clark',
- /* 0x03FD */ 'Trimble Navigation Ltd.',
- /* 0x03FE */ 'Littelfuse',
- /* 0x03FF */ 'Withings',
- /* 0x0400 */ 'i-developer IT Beratung UG',
- /* 0x0401 */ '(unassigned)',
- /* 0x0402 */ 'Sears Holdings Corporation',
- /* 0x0403 */ 'Gantner Electronic GmbH',
- /* 0x0404 */ 'Authomate Inc',
- /* 0x0405 */ 'Vertex International, Inc.',
- /* 0x0406 */ 'Airtago',
- /* 0x0407 */ 'Swiss Audio SA',
- /* 0x0408 */ 'ToGetHome Inc.',
- /* 0x0409 */ 'AXIS',
- /* 0x040A */ 'Openmatics',
- /* 0x040B */ 'Jana Care Inc.',
- /* 0x040C */ 'Senix Corporation',
- /* 0x040D */ 'NorthStar Battery Company, LLC',
- /* 0x040E */ 'SKF (U.K.) Limited',
- /* 0x040F */ 'CO-AX Technology, Inc.',
- /* 0x0410 */ 'Fender Musical Instruments',
- /* 0x0411 */ 'Luidia Inc',
- /* 0x0412 */ 'SEFAM',
- /* 0x0413 */ 'Wireless Cables Inc',
- /* 0x0414 */ 'Lightning Protection International Pty Ltd',
- /* 0x0415 */ 'Uber Technologies Inc',
- /* 0x0416 */ 'SODA GmbH',
- /* 0x0417 */ 'Fatigue Science',
- /* 0x0418 */ 'Alpine Electronics Inc.',
- /* 0x0419 */ 'Novalogy LTD',
- /* 0x041A */ 'Friday Labs Limited',
- /* 0x041B */ 'OrthoAccel Technologies',
- /* 0x041C */ 'WaterGuru, Inc.',
- /* 0x041D */ 'Benning Elektrotechnik und Elektronik GmbH & Co. KG',
- /* 0x041E */ 'Dell Computer Corporation',
- /* 0x041F */ 'Kopin Corporation',
- /* 0x0420 */ 'TecBakery GmbH',
- /* 0x0421 */ 'Backbone Labs, Inc.',
- /* 0x0422 */ 'DELSEY SA',
- /* 0x0423 */ 'Chargifi Limited',
- /* 0x0424 */ 'Trainesense Ltd.',
- /* 0x0425 */ 'Unify Software and Solutions GmbH & Co. KG',
- /* 0x0426 */ 'Husqvarna AB',
- /* 0x0427 */ 'Focus fleet and fuel management inc',
- /* 0x0428 */ 'SmallLoop, LLC',
- /* 0x0429 */ 'Prolon Inc.',
- /* 0x042A */ 'BD Medical',
- /* 0x042B */ 'iMicroMed Incorporated',
- /* 0x042C */ 'Ticto N.V.',
- /* 0x042D */ 'Meshtech AS',
- /* 0x042E */ 'MemCachier Inc.',
- /* 0x042F */ 'Danfoss A/S',
- /* 0x0430 */ 'SnapStyk Inc.',
- /* 0x0431 */ 'Amyway Corporation',
- /* 0x0432 */ 'Silk Labs, Inc.',
- /* 0x0433 */ 'Pillsy Inc.',
- /* 0x0434 */ 'Hatch Baby, Inc.',
- /* 0x0435 */ 'Blocks Wearables Ltd.',
- /* 0x0436 */ 'Drayson Technologies (Europe) Limited',
- /* 0x0437 */ 'eBest IOT Inc.',
- /* 0x0438 */ 'Helvar Ltd',
- /* 0x0439 */ 'Radiance Technologies',
- /* 0x043A */ 'Nuheara Limited',
- /* 0x043B */ 'Appside co., ltd.',
- /* 0x043C */ 'DeLaval',
- /* 0x043D */ 'Coiler Corporation',
- /* 0x043E */ 'Thermomedics, Inc.',
- /* 0x043F */ 'Tentacle Sync GmbH',
- /* 0x0440 */ 'Valencell, Inc.',
- /* 0x0441 */ 'iProtoXi Oy',
- /* 0x0442 */ 'SECOM CO., LTD.',
- /* 0x0443 */ 'Tucker International LLC',
- /* 0x0444 */ 'Metanate Limited',
- /* 0x0445 */ 'Kobian Canada Inc.',
- /* 0x0446 */ 'NETGEAR, Inc.',
- /* 0x0447 */ 'Fabtronics Australia Pty Ltd',
- /* 0x0448 */ 'Grand Centrix GmbH',
- /* 0x0449 */ '1UP USA.com llc',
- /* 0x044A */ 'SHIMANO INC.',
- /* 0x044B */ 'Nain Inc.',
- /* 0x044C */ 'LifeStyle Lock, LLC',
- /* 0x044D */ 'VEGA Grieshaber KG',
- /* 0x044E */ 'Xtrava Inc.',
- /* 0x044F */ 'TTS Tooltechnic Systems AG & Co. KG',
- /* 0x0450 */ 'Teenage Engineering AB',
- /* 0x0451 */ 'Tunstall Nordic AB',
- /* 0x0452 */ 'Svep Design Center AB',
- /* 0x0453 */ 'GreenPeak Technologies BV',
- /* 0x0454 */ 'Sphinx Electronics GmbH & Co KG',
- /* 0x0455 */ 'Atomation',
- /* 0x0456 */ 'Nemik Consulting Inc',
- /* 0x0457 */ 'RF INNOVATION',
- /* 0x0458 */ 'Mini Solution Co., Ltd.',
- /* 0x0459 */ 'Lumenetix, Inc',
- /* 0x045A */ '2048450 Ontario Inc',
- /* 0x045B */ 'SPACEEK LTD',
- /* 0x045C */ 'Delta T Corporation',
- /* 0x045D */ 'Boston Scientific Corporation',
- /* 0x045E */ 'Nuviz, Inc.',
- /* 0x045F */ 'Real Time Automation, Inc.',
- /* 0x0460 */ 'Kolibree',
- /* 0x0461 */ 'vhf elektronik GmbH',
- /* 0x0462 */ 'Bonsai Systems GmbH',
- /* 0x0463 */ 'Fathom Systems Inc.',
- /* 0x0464 */ 'Bellman & Symfon',
- /* 0x0465 */ 'International Forte Group LLC',
- /* 0x0466 */ 'CycleLabs Solutions inc.',
- /* 0x0467 */ 'Codenex Oy',
- /* 0x0468 */ 'Kynesim Ltd',
- /* 0x0469 */ 'Palago AB',
- /* 0x046A */ 'INSIGMA INC.',
- /* 0x046B */ 'PMD Solutions',
- /* 0x046C */ 'Qingdao Realtime Technology Co., Ltd.',
- /* 0x046D */ 'BEGA Gantenbrink-Leuchten KG',
- /* 0x046E */ 'Pambor Ltd.',
- /* 0x046F */ 'Develco Products A/S',
- /* 0x0470 */ 'iDesign s.r.l.',
- /* 0x0471 */ 'TiVo Corp',
- /* 0x0472 */ 'Control-J Pty Ltd',
- /* 0x0473 */ 'Steelcase, Inc.',
- /* 0x0474 */ 'iApartment co., ltd.',
- /* 0x0475 */ 'Icom inc.',
- /* 0x0476 */ 'Oxstren Wearable Technologies Private Limited',
- /* 0x0477 */ 'Blue Spark Technologies',
- /* 0x0478 */ 'FarSite Communications Limited',
- /* 0x0479 */ 'mywerk system GmbH',
- /* 0x047A */ 'Sinosun Technology Co., Ltd.',
- /* 0x047B */ 'MIYOSHI ELECTRONICS CORPORATION',
- /* 0x047C */ 'POWERMAT LTD',
- /* 0x047D */ 'Occly LLC',
- /* 0x047E */ 'OurHub Dev IvS',
- /* 0x047F */ 'Pro-Mark, Inc.',
- /* 0x0480 */ 'Dynometrics Inc.',
- /* 0x0481 */ 'Quintrax Limited',
- /* 0x0482 */ 'POS Tuning Udo Vosshenrich GmbH & Co. KG',
- /* 0x0483 */ 'Multi Care Systems B.V.',
- /* 0x0484 */ 'Revol Technologies Inc',
- /* 0x0485 */ 'SKIDATA AG',
- /* 0x0486 */ 'DEV TECNOLOGIA INDUSTRIA, COMERCIO E MANUTENCAO DE EQUIPAMENTOS LTDA. - ME',
- /* 0x0487 */ 'Centrica Connected Home',
- /* 0x0488 */ 'Automotive Data Solutions Inc',
- /* 0x0489 */ 'Igarashi Engineering',
- /* 0x048A */ 'Taelek Oy',
- /* 0x048B */ 'CP Electronics Limited',
- /* 0x048C */ 'Vectronix AG',
- /* 0x048D */ 'S-Labs Sp. z o.o.',
- /* 0x048E */ 'Companion Medical, Inc.',
- /* 0x048F */ 'BlueKitchen GmbH',
- /* 0x0490 */ 'Matting AB',
- /* 0x0491 */ 'SOREX - Wireless Solutions GmbH',
- /* 0x0492 */ 'ADC Technology, Inc.',
- /* 0x0493 */ 'Lynxemi Pte Ltd',
- /* 0x0494 */ 'SENNHEISER electronic GmbH & Co. KG',
- /* 0x0495 */ 'LMT Mercer Group, Inc',
- /* 0x0496 */ 'Polymorphic Labs LLC',
- /* 0x0497 */ 'Cochlear Limited',
- /* 0x0498 */ 'METER Group, Inc. USA',
- /* 0x0499 */ 'Ruuvi Innovations Ltd.',
- /* 0x049A */ 'Situne AS',
- /* 0x049B */ 'nVisti, LLC',
- /* 0x049C */ 'DyOcean',
- /* 0x049D */ 'Uhlmann & Zacher GmbH',
-];
-
-/// Returns a string containing the name of the manufacturer that matches |identifier|.
-String getManufacturerName(int identifier) {
- if (identifier >= _manufacturerNames.length || identifier < 0)
- return '0x${identifier.toRadixString(16)}';
- return _manufacturerNames[identifier];
-}
diff --git a/examples/bluetooth/ble_scanner/lib/src/models/ble_scanner_model.dart b/examples/bluetooth/ble_scanner/lib/src/models/ble_scanner_model.dart
deleted file mode 100644
index 5a8e2d3..0000000
--- a/examples/bluetooth/ble_scanner/lib/src/models/ble_scanner_model.dart
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'package:fidl_fuchsia_bluetooth/fidl.dart' as bt;
-import 'package:fidl_fuchsia_bluetooth_gatt/fidl.dart' as gatt;
-import 'package:fidl_fuchsia_bluetooth_le/fidl.dart' as ble;
-import 'package:lib.app.dart/app.dart';
-import 'package:lib.app.dart/logging.dart';
-import 'package:lib.widgets.dart/model.dart';
-
-// ignore_for_file: public_member_api_docs
-
-enum ConnectionState { notConnected, connecting, connected }
-
-/// The [Model] for the BLE Scanner example.
-class BLEScannerModel extends Model {
- // Members that maintain the FIDL service connections.
- final ble.CentralProxy _central = new ble.CentralProxy();
-
- // GATT client proxy to the currently connected peripheral.
- final gatt.ClientProxy _gattClient = new gatt.ClientProxy();
-
- // True if we have an active scan session.
- bool _isScanning = false;
-
- // True if a request to start a device scan is currently pending.
- bool _isScanRequestPending = false;
-
- // The current scan filter for current (if scanning) and future scan sessions.
- ble.ScanFilter _scanFilter;
-
- // Devices found during discovery.
- final Map<String, ble.RemoteDevice> _discoveredDevices =
- <String, ble.RemoteDevice>{};
-
- // Devices that are connected.
- final Map<String, ConnectionState> _connectedDevices =
- <String, ConnectionState>{};
-
- BLEScannerModel() {
- _onStart();
- }
-
- /// True if we have an active scan session.
- bool get isScanning => _isScanning;
-
- /// True if a request to start a device scan is currently pending.
- bool get isScanRequestPending => _isScanRequestPending;
-
- /// Sets a scan filter. If scanning, this will immediately apply to the active scan session.
- /// Otherwise, it will be used next time a scan is requested.
- set scanFilter(ble.ScanFilter filter) {
- _scanFilter = filter;
- _discoveredDevices.clear();
- if (isScanning) {
- _restartScan();
- }
- notifyListeners();
- }
-
- /// Returns a list containing information about remote LE devices that have been discovered.
- Iterable<ble.RemoteDevice> get discoveredDevices => _discoveredDevices.values;
-
- /// Starts or stops a scan based on whether or not a scan is currently being performed.
- void toggleScan() {
- // The scan button will be disabled if a request is pending.
- assert(!_isScanRequestPending);
-
- if (isScanning) {
- _central.stopScan();
- return;
- }
-
- _restartScan();
- notifyListeners();
- }
-
- void _restartScan() {
- _isScanRequestPending = true;
- _central.startScan(_scanFilter, (bt.Status status) {
- _isScanRequestPending = false;
- notifyListeners();
- });
- }
-
- /// Returns the connection state for the peripheral with the given identifier.
- ConnectionState getPeripheralState(String id) =>
- _connectedDevices[id] ?? ConnectionState.notConnected;
-
- /// Initiates a connection to the given device.
- void connectPeripheral(String id) {
- if (getPeripheralState(id) != ConnectionState.notConnected) {
- log.info('Peripheral already connected or connecting (id: $id)');
- return;
- }
-
- _connectedDevices[id] = ConnectionState.connecting;
- notifyListeners();
-
- // Close any existing GATT client connection.
- _gattClient.ctrl.close();
-
- _central.connectPeripheral(id, _gattClient.ctrl.request(),
- (bt.Status status) {
- if (status.error != null) {
- log.info(
- 'Failed to connect to device with (id: $id): ${status.error.description}');
- _connectedDevices.remove(id);
- } else {
- _connectedDevices[id] = ConnectionState.connected;
- }
-
- notifyListeners();
- });
- }
-
- /// Disconnects the requested peripheral.
- void disconnectPeripheral(String id) {
- if (getPeripheralState(id) != ConnectionState.connected) {
- log.info('Peripheral not connected (id: $id)');
- return;
- }
-
- _central.disconnectPeripheral(id, (bt.Status status) {
- log.info('Disconnect (id: $id, status: $status)');
-
- // The widgets will be notified by onPeripheralDisconnected.
- });
- }
-
- /// Connects the model to the Bluetooth LE service.
- void _onStart() {
- final startupContext = StartupContext.fromStartupInfo();
- connectToService(startupContext.environmentServices, _central.ctrl);
- _central
- ..onScanStateChanged = _onScanStateChanged
- ..onDeviceDiscovered = _onDeviceDiscovered
- ..onPeripheralDisconnected = _onPeripheralDisconnected;
- }
-
- /// The [terminate] method should be called before the module terminates
- /// allowing it to teardown any open connections it may have
- void terminate() {
- _central.ctrl.close();
- }
-
- // ignore: avoid_positional_boolean_parameters
- void _onScanStateChanged(bool scanning) {
- _isScanning = scanning;
- notifyListeners();
- }
-
- void _onDeviceDiscovered(ble.RemoteDevice device) {
- _discoveredDevices[device.identifier] = device;
- notifyListeners();
- }
-
- void _onPeripheralDisconnected(String id) {
- _connectedDevices.remove(id);
- notifyListeners();
- }
-}
diff --git a/examples/bluetooth/ble_scanner/lib/src/screen.dart b/examples/bluetooth/ble_scanner/lib/src/screen.dart
deleted file mode 100644
index f9d27d1..0000000
--- a/examples/bluetooth/ble_scanner/lib/src/screen.dart
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'package:flutter/material.dart';
-import 'package:lib.widgets.dart/model.dart';
-
-import 'models/ble_scanner_model.dart';
-import 'widgets/scan_filter_button.dart';
-import 'widgets/scan_results_widget.dart';
-
-/// Root Widget of the BLE Scanner module.
-class BLEScannerScreen extends StatelessWidget {
- @override
- Widget build(BuildContext context) {
- return new ScopedModelDescendant<BLEScannerModel>(builder: (
- BuildContext context,
- Widget child,
- BLEScannerModel moduleModel,
- ) {
- return new Scaffold(
- appBar: new AppBar(
- title: const Text('BLE Scanner'),
- bottom: moduleModel.isScanning
- ? const PreferredSize(
- child: const LinearProgressIndicator(),
- preferredSize: Size.zero)
- : null,
- actions: <Widget>[
- new IconButton(
- tooltip: 'Scan for BLE devices',
- onPressed: moduleModel.isScanRequestPending
- ? null
- : () => moduleModel.toggleScan(),
- icon: const Icon(Icons.bluetooth_searching)),
- new ScanFilterButton(),
- ]),
- body: new ScanResultsWidget());
- });
- }
-}
diff --git a/examples/bluetooth/ble_scanner/lib/src/widgets/scan_filter_button.dart b/examples/bluetooth/ble_scanner/lib/src/widgets/scan_filter_button.dart
deleted file mode 100644
index a1ee197..0000000
--- a/examples/bluetooth/ble_scanner/lib/src/widgets/scan_filter_button.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'package:flutter/material.dart';
-import 'package:lib.widgets.dart/model.dart';
-
-import '../models/ble_scanner_model.dart';
-import 'scan_filter_dialog.dart';
-
-/// Button that brings up the scan filter dialog
-class ScanFilterButton extends StatelessWidget {
- @override
- Widget build(BuildContext context) {
- final ThemeData theme = Theme.of(context);
-
- return new ScopedModelDescendant<BLEScannerModel>(builder: (
- BuildContext context,
- Widget child,
- BLEScannerModel moduleModel,
- ) {
- return new FlatButton(
- child: new Text('Add Filter',
- style: theme.textTheme.body1.copyWith(color: Colors.white)),
- onPressed: () {
- Navigator.push(
- context,
- new MaterialPageRoute<DismissDialogAction>(
- builder: (BuildContext context) =>
- new ScanFilterDialog(moduleModel: moduleModel),
- fullscreenDialog: true));
- });
- });
- }
-}
diff --git a/examples/bluetooth/ble_scanner/lib/src/widgets/scan_filter_dialog.dart b/examples/bluetooth/ble_scanner/lib/src/widgets/scan_filter_dialog.dart
deleted file mode 100644
index c71f5ef..0000000
--- a/examples/bluetooth/ble_scanner/lib/src/widgets/scan_filter_dialog.dart
+++ /dev/null
@@ -1,185 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:async';
-
-import 'package:fidl_fuchsia_bluetooth/fidl.dart';
-import 'package:fidl_fuchsia_bluetooth_le/fidl.dart' as ble;
-import 'package:flutter/material.dart';
-import 'package:meta/meta.dart';
-
-import '../manufacturer_names.dart';
-import '../models/ble_scanner_model.dart';
-
-// ignore_for_file: public_member_api_docs
-
-/// Enum values to pass to Navigator.push()
-enum DismissDialogAction {
- /// Cancel the scan filter
- cancel,
-
- /// Apply the scan filter
- save,
-}
-
-/// Widget that contains entry fields to build a BLE scan filter
-class ScanFilterDialog extends StatefulWidget {
- final BLEScannerModel moduleModel;
-
- const ScanFilterDialog({@required this.moduleModel, Key key})
- : super(key: key);
-
- @override
- _ScanFilterDialogState createState() => new _ScanFilterDialogState();
-}
-
-class _ScanFilterDialogState extends State<ScanFilterDialog> {
- int _manufacturerId;
- String _nameSubstring;
- bool _connectable;
-
- bool _saveNeeded = false;
-
- final GlobalKey<FormState> _formKey = new GlobalKey<FormState>();
-
- Future<bool> _onWillPop() async {
- if (!_saveNeeded) {
- return true;
- }
-
- final ThemeData theme = Theme.of(context);
- final TextStyle dialogTextStyle =
- theme.textTheme.subhead.copyWith(color: theme.textTheme.caption.color);
-
- return await showDialog<bool>(
- context: context,
- builder: (BuildContext context) => new AlertDialog(
- content:
- new Text('Discard filters?', style: dialogTextStyle),
- actions: <Widget>[
- new FlatButton(
- child: const Text('CANCEL'),
- onPressed: () {
- Navigator.of(context).pop(false);
- }),
- new FlatButton(
- child: const Text('DISCARD'),
- onPressed: () {
- Navigator.of(context).pop(true);
- })
- ])) ??
- false;
- }
-
- void _handleConnectableChanged(bool newValue) {
- if (_connectable != newValue) {
- setState(() {
- _saveNeeded = true;
- _connectable = newValue;
- });
- }
- }
-
- @override
- Widget build(BuildContext context) {
- final ThemeData theme = Theme.of(context);
- return new Scaffold(
- appBar: new AppBar(title: const Text('Scan Filters'), actions: <Widget>[
- new FlatButton(
- child: new Text('SAVE',
- style: theme.textTheme.body1.copyWith(color: Colors.white)),
- onPressed: () {
- _formKey.currentState.save();
-
- ble.ScanFilter filter = new ble.ScanFilter(
- manufacturerIdentifier: _manufacturerId != null
- ? new UInt16(value: _manufacturerId)
- : null,
- nameSubstring: _nameSubstring?.isNotEmpty ?? false
- ? _nameSubstring
- : null,
- connectable: _connectable != null
- ? new Bool(value: _connectable)
- : null,
- );
-
- widget.moduleModel.scanFilter = filter;
- Navigator.pop(context, DismissDialogAction.save);
- })
- ]),
- body: new Form(
- key: _formKey,
- onWillPop: _onWillPop,
- child: new Container(
- padding: const EdgeInsets.all(36.0),
- child: new Column(
- children: <Widget>[
- new ListTile(
- title: const Text('Connectable'),
- trailing: new Container(
- width: 500.0,
- child: new Column(
- children: <Widget>[
- new RadioListTile<bool>(
- title: const Text('All'),
- value: null,
- groupValue: _connectable,
- onChanged: _handleConnectableChanged),
- new RadioListTile<bool>(
- title: const Text('Connectable devices only'),
- value: true,
- groupValue: _connectable,
- onChanged: _handleConnectableChanged),
- new RadioListTile<bool>(
- title:
- const Text('Non-connectable devices only'),
- value: false,
- groupValue: _connectable,
- onChanged: _handleConnectableChanged),
- ]
- .map((Widget child) =>
- new Expanded(child: child))
- .toList()))),
- new ListTile(
- title: const Text('Manufacturer ID'),
- trailing: new Container(
- width: 500.0,
- child: new DropdownButton<int>(
- value: _manufacturerId,
- onChanged: (int newValue) {
- if (newValue != _manufacturerId) {
- setState(() {
- _saveNeeded = true;
- _manufacturerId = newValue;
- });
- }
- },
- items:
- <int>[null, 0x00E0, 0x004C].map((int value) {
- return new DropdownMenuItem<int>(
- value: value,
- child: new Text(value == null
- ? 'None'
- : getManufacturerName(value)),
- );
- }).toList()))),
- new ListTile(
- title: const Text('Name Substring'),
- trailing: new Container(
- width: 500.0,
- child: new TextFormField(onSaved: (String newValue) {
- if (newValue != _nameSubstring) {
- setState(() {
- _saveNeeded = true;
- _nameSubstring = newValue;
- });
- }
- })))
- ]
- .map((Widget child) => new Container(
- margin: const EdgeInsets.symmetric(vertical: 16.0),
- child: child))
- .toList()))));
- }
-}
diff --git a/examples/bluetooth/ble_scanner/lib/src/widgets/scan_results_widget.dart b/examples/bluetooth/ble_scanner/lib/src/widgets/scan_results_widget.dart
deleted file mode 100644
index dcf7f20..0000000
--- a/examples/bluetooth/ble_scanner/lib/src/widgets/scan_results_widget.dart
+++ /dev/null
@@ -1,254 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:math';
-
-import 'package:fidl_fuchsia_bluetooth_le/fidl.dart' as ble;
-
-import 'package:flutter/material.dart';
-import 'package:lib.widgets.dart/model.dart';
-
-import '../manufacturer_names.dart';
-import '../models/ble_scanner_model.dart' as model;
-
-/// A scrollable view that displays BLE scan results
-class ScanResultsWidget extends StatefulWidget {
- @override
- ScanResultsState createState() => new ScanResultsState();
-}
-
-class _AdvertisingDataEntry {
- final String fieldTitle;
- final WidgetBuilder widgetBuilder;
-
- _AdvertisingDataEntry(this.fieldTitle, this.widgetBuilder);
-}
-
-/// State corresponding to ScanResultsWidget
-class ScanResultsState extends State<ScanResultsWidget> {
- final Map<String, bool> _expandedStateMap = <String, bool>{};
-
- String _connectionStateString(model.ConnectionState connState) {
- switch (connState) {
- case model.ConnectionState.notConnected:
- return 'not connected';
- case model.ConnectionState.connecting:
- return 'connecting...';
- case model.ConnectionState.connected:
- return 'connected';
- }
- return '(unknown)';
- }
-
- Color _connectionStateColor(model.ConnectionState connState) {
- switch (connState) {
- case model.ConnectionState.notConnected:
- return Colors.grey[400];
- case model.ConnectionState.connecting:
- return Colors.amber[400];
- case model.ConnectionState.connected:
- return Colors.green;
- }
- return Colors.black;
- }
-
- Widget _buildHeader(ble.RemoteDevice device) {
- return new ScopedModelDescendant<model.BLEScannerModel>(builder: (
- BuildContext context,
- Widget child,
- model.BLEScannerModel moduleModel,
- ) {
- final model.ConnectionState connState =
- moduleModel.getPeripheralState(device.identifier);
- return new Row(children: <Widget>[
- new Expanded(
- flex: 2,
- child: new Container(
- margin: const EdgeInsets.only(left: 24.0),
- child: new FittedBox(
- fit: BoxFit.scaleDown,
- alignment: FractionalOffset.centerLeft,
- child:
- new Text(device.advertisingData.name ?? '(unknown)')))),
- new Container(
- margin: const EdgeInsets.only(left: 24.0),
- child: new Text(
- device.connectable ? _connectionStateString(connState) : '',
- style: new TextStyle(
- fontStyle: FontStyle.italic,
- color: _connectionStateColor(connState)))),
- new Container(
- margin: const EdgeInsets.only(left: 24.0),
- child: new Text('RSSI: ${device.rssi?.value ?? 'unknown'} dBm'))
- ]);
- });
- }
-
- String _toHexString(final List<int> data) {
- return data
- .map((int byte) => byte.toRadixString(16).padLeft(2, '0'))
- .join(' ');
- }
-
- Widget _buildAdvertisingDataWidget(ble.RemoteDevice device) {
- List<_AdvertisingDataEntry> entries = <_AdvertisingDataEntry>[];
-
- TextStyle textStyle = new TextStyle(
- color: Colors.grey[700], fontWeight: FontWeight.w500, fontSize: 12.0);
-
- int currentMaxTitleLength = 0;
- double textScaleFactor =
- MediaQuery.of(context, nullOk: true)?.textScaleFactor ?? 1.0;
-
- if (device.advertisingData.txPowerLevel != null) {
- const String title = 'Tx Power Level';
- currentMaxTitleLength = max(currentMaxTitleLength, title.length);
- entries.add(new _AdvertisingDataEntry(
- title,
- (BuildContext context) => new Text(
- '${device.advertisingData.txPowerLevel.value} dBm',
- style: textStyle)));
- }
-
- if (device.advertisingData.serviceUuids?.isNotEmpty ?? false) {
- const String title = 'Service UUIDs';
- currentMaxTitleLength = max(currentMaxTitleLength, title.length);
- entries.add(new _AdvertisingDataEntry(
- title,
- (BuildContext context) => new Column(
- children: device.advertisingData.serviceUuids
- .map((String uuid) => new Text(uuid, style: textStyle))
- .toList())));
- }
-
- for (final ble.ServiceDataEntry entry
- in device.advertisingData.serviceData ??
- const <ble.ServiceDataEntry>[]) {
- String title = 'Service Data ($entry.uuid)';
- currentMaxTitleLength = max(currentMaxTitleLength, title.length);
- entries.add(new _AdvertisingDataEntry(
- title,
- (BuildContext context) =>
- new Text(_toHexString(entry.data), style: textStyle)));
- }
-
- for (final ble.ManufacturerSpecificDataEntry entry
- in device.advertisingData.manufacturerSpecificData ??
- const <ble.ManufacturerSpecificDataEntry>[]) {
- String title =
- 'Manufacturer Data (${getManufacturerName(entry.companyId)})';
- currentMaxTitleLength = max(currentMaxTitleLength, title.length);
- entries.add(new _AdvertisingDataEntry(
- title,
- (BuildContext context) =>
- new Text(_toHexString(entry.data), style: textStyle)));
- }
-
- for (String uri in device.advertisingData.uris ?? const <String>[]) {
- const String title = 'URI';
- currentMaxTitleLength = max(currentMaxTitleLength, title.length);
- entries.add(new _AdvertisingDataEntry(
- title, (BuildContext context) => new Text(uri)));
- }
-
- if (entries.isEmpty) {
- return new Text('No data', style: textStyle);
- }
-
- return new Container(
- alignment: FractionalOffset.center,
- child: new Column(
- children: entries
- .map((final _AdvertisingDataEntry entry) => new Padding(
- padding: const EdgeInsets.only(bottom: 5.0),
- child: new Row(children: <Widget>[
- new Container(
- width: currentMaxTitleLength * textScaleFactor * 8.0,
- child: new Text('${entry.fieldTitle}:',
- style: new TextStyle(
- color: Colors.grey[700],
- fontWeight: FontWeight.w600,
- fontSize: 12.0))),
- new Container(
- margin: const EdgeInsets.only(left: 30.0),
- child: new Builder(builder: entry.widgetBuilder))
- ])))
- .toList()));
- }
-
- Widget _buildConnectionWidget(ble.RemoteDevice device) {
- return new ScopedModelDescendant<model.BLEScannerModel>(builder: (
- BuildContext context,
- Widget child,
- model.BLEScannerModel moduleModel,
- ) {
- if (!device.connectable) {
- return const Text('Not connectable');
- }
-
- final model.ConnectionState connState =
- moduleModel.getPeripheralState(device.identifier);
-
- if (connState == model.ConnectionState.connecting) {
- return const Text('Connecting...');
- }
-
- if (connState == model.ConnectionState.notConnected) {
- return new FlatButton(
- onPressed: () => moduleModel.connectPeripheral(device.identifier),
- child: const Text('Connect'),
- textTheme: ButtonTextTheme.accent);
- }
-
- return new FlatButton(
- onPressed: () => moduleModel.disconnectPeripheral(device.identifier),
- child: const Text('Disconnect'),
- textTheme: ButtonTextTheme.accent);
- });
- }
-
- Widget _buildBody(ble.RemoteDevice device) {
- return new Column(children: <Widget>[
- new Container(
- margin: const EdgeInsets.only(left: 40.0, right: 24.0, bottom: 24.0),
- child: new Center(child: _buildAdvertisingDataWidget(device))),
- const Divider(height: 1.0),
- new Container(
- padding: const EdgeInsets.symmetric(vertical: 16.0),
- child: new Container(
- margin: const EdgeInsets.only(right: 8.0),
- child: _buildConnectionWidget(device)))
- ]);
- }
-
- @override
- Widget build(BuildContext context) {
- return new ScopedModelDescendant<model.BLEScannerModel>(builder: (
- BuildContext context,
- Widget child,
- model.BLEScannerModel moduleModel,
- ) {
- if (moduleModel.discoveredDevices.isEmpty) {
- return const Center(child: const Text('No devices found'));
- }
-
- return new SingleChildScrollView(
- child: new ExpansionPanelList(
- expansionCallback: (int index, bool isExpanded) {
- setState(() {
- ble.RemoteDevice device =
- moduleModel.discoveredDevices.elementAt(index);
- _expandedStateMap[device.identifier] = !isExpanded;
- });
- },
- children:
- moduleModel.discoveredDevices.map((ble.RemoteDevice device) {
- return new ExpansionPanel(
- headerBuilder: (_, __) => _buildHeader(device),
- body: _buildBody(device),
- isExpanded: _expandedStateMap[device.identifier] ?? false);
- }).toList()));
- });
- }
-}
diff --git a/examples/bluetooth/ble_scanner/meta/ble_scanner.cmx b/examples/bluetooth/ble_scanner/meta/ble_scanner.cmx
deleted file mode 100644
index 207ff07..0000000
--- a/examples/bluetooth/ble_scanner/meta/ble_scanner.cmx
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "program": {
- "data": "data/ble_scanner"
- },
- "sandbox": {
- "services": [
- "fuchsia.bluetooth.le.Central",
- "fuchsia.cobalt.LoggerFactory",
- "fuchsia.fonts.Provider",
- "fuchsia.logger.LogSink",
- "fuchsia.modular.Clipboard",
- "fuchsia.modular.ContextWriter",
- "fuchsia.modular.ModuleContext",
- "fuchsia.netstack.Netstack",
- "fuchsia.sys.Environment",
- "fuchsia.ui.input.ImeService",
- "fuchsia.ui.policy.Presenter",
- "fuchsia.ui.scenic.Scenic",
- "fuchsia.ui.viewsv1.ViewManager",
- "fuchsia.wlan.service.Wlan"
- ]
- }
-}
diff --git a/examples/bluetooth/ble_scanner/pubspec.yaml b/examples/bluetooth/ble_scanner/pubspec.yaml
deleted file mode 100644
index ee2ebe7..0000000
--- a/examples/bluetooth/ble_scanner/pubspec.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-name: BLE Scanner Example
-
-flutter:
- uses-material-design: true
diff --git a/examples/bluetooth/eddystone_advertiser/BUILD.gn b/examples/bluetooth/eddystone_advertiser/BUILD.gn
deleted file mode 100644
index b29922e..0000000
--- a/examples/bluetooth/eddystone_advertiser/BUILD.gn
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//topaz/runtime/flutter_runner/flutter_app.gni")
-
-flutter_app("eddystone_advertiser") {
- package_name = "eddystone_advertiser"
-
- main_dart = "lib/main.dart"
-
- deps = [
- "//garnet/public/fidl/fuchsia.bluetooth",
- "//garnet/public/fidl/fuchsia.bluetooth.le",
- "//peridot/public/fidl/fuchsia.modular",
- "//third_party/dart-pkg/git/flutter/packages/flutter",
- "//topaz/public/dart/fidl",
- "//topaz/public/lib/app/dart",
- "//topaz/public/lib/app_driver/dart",
- "//topaz/public/lib/widgets/dart",
- ]
-}
diff --git a/examples/bluetooth/eddystone_advertiser/analysis_options.yaml b/examples/bluetooth/eddystone_advertiser/analysis_options.yaml
deleted file mode 100644
index 7415796..0000000
--- a/examples/bluetooth/eddystone_advertiser/analysis_options.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-include: ../../../tools/analysis_options.yaml
diff --git a/examples/bluetooth/eddystone_advertiser/lib/main.dart b/examples/bluetooth/eddystone_advertiser/lib/main.dart
deleted file mode 100644
index 854d6f3..0000000
--- a/examples/bluetooth/eddystone_advertiser/lib/main.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'package:flutter/material.dart';
-import 'package:flutter/widgets.dart';
-import 'package:lib.app.dart/app.dart';
-import 'package:lib.app.dart/logging.dart';
-import 'package:lib.app_driver.dart/module_driver.dart';
-import 'package:lib.widgets.dart/model.dart';
-
-import 'src/models/eddystone_model.dart';
-import 'src/screen.dart';
-
-void main() {
- setupLogger();
-
- runApp(new MaterialApp(home: moduleWidget));
-
- final model = EddystoneModel();
- final driver = ModuleDriver(onTerminate: model.onTerminate);
-
- runApp(
- MaterialApp(
- home: ScopedModel<EddystoneModel>(
- model: model,
- child: EddystoneScreen(),
- ),
- ),
- );
-
- driver.start((_) {
- model.connect(driver.environmentServices);
- }).catchError(log.severe);
-}
diff --git a/examples/bluetooth/eddystone_advertiser/lib/src/models/eddystone_model.dart b/examples/bluetooth/eddystone_advertiser/lib/src/models/eddystone_model.dart
deleted file mode 100644
index 4c9dc02..0000000
--- a/examples/bluetooth/eddystone_advertiser/lib/src/models/eddystone_model.dart
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'dart:async';
-import 'package:fidl_fuchsia_bluetooth/fidl.dart' as bt;
-import 'package:fidl_fuchsia_bluetooth_le/fidl.dart' as ble;
-import 'package:fidl_fuchsia_modular/fidl.dart';
-import 'package:lib.app.dart/app.dart';
-import 'package:lib.app.dart/logging.dart';
-import 'package:lib.widgets.dart/model.dart';
-
-// ignore_for_file: public_member_api_docs
-
-/// The [Model] for the Eddystone advertiser example.
-class EddystoneModel extends Model {
- // Members that maintain the FIDL service connections.
- final ble.PeripheralProxy _peripheral = new ble.PeripheralProxy();
-
- // The set of advertisements that we're adveertising. Maps url => id
- final Map<String, String> _activeAdvertisements = <String, String>{};
-
- static const String kEddystoneUuid = '0000feaa-0000-1000-8000-00805f9b34fb';
-
- /// True if we have an active scan session.
- bool get isAdvertising => _activeAdvertisements.isNotEmpty;
-
- Iterable<String> get advertisedUrls => _activeAdvertisements.keys;
-
- /// Advertises a URL, if possible.
- Future<String> startAdvertising(String url) {
- Completer<String> completer = new Completer<String>();
- log.info('Advertising url: $url');
- ble.AdvertisingData data = new ble.AdvertisingData(
- serviceUuids: const <String>[kEddystoneUuid],
- serviceData: <ble.ServiceDataEntry>[
- new ble.ServiceDataEntry(
- uuid: kEddystoneUuid, data: _eddystoneDataForUrl(url))
- ],
- );
- _peripheral.startAdvertising(data, null, null, 1000, false,
- (bt.Status status, String advertisementId) {
- log.info('StartAdvertising result: $status with $advertisementId');
- if (status.error != null) {
- completer.completeError(status.error.description);
- return;
- }
- _activeAdvertisements[url] = advertisementId;
- notifyListeners();
- completer.complete(advertisementId);
- });
- return completer.future;
- }
-
- void stopAdvertising(String url) {
- if (!_activeAdvertisements.containsKey(url)) {
- return;
- }
- _peripheral.stopAdvertising(_activeAdvertisements[url], (bt.Status status) {
- if (status.error != null) {
- log.info('Error stopping advertising for $url: $status');
- }
- });
- _activeAdvertisements.remove(url);
- notifyListeners();
- }
-
- void connect(ServiceProviderProxy environmentServices) {
- connectToService(startupContext.environmentServices, _peripheral.ctrl);
- }
-
- void onTerminate() {
- _activeAdvertisements.values.forEach(stopAdvertising);
- }
-
- final Map<String, int> _schemes = const <String, int>{
- 'http://www.': 0,
- 'https://www.': 1,
- 'http://': 2,
- 'https://': 3,
- };
-
- String validateEddystoneUrl(final String proposed) {
- bool prefixFound = false;
- for (final String prefix in _schemes.keys) {
- if (proposed.startsWith(prefix)) {
- prefixFound = true;
- }
- }
-
- if (!prefixFound) {
- return 'URL must start with http(s)://';
- }
-
- List<int> encoded = _eddystoneDataForUrl(proposed);
- if (encoded.length > 20) {
- return 'URL too long.';
- }
-
- return null;
- }
-
- List<int> _eddystoneDataForUrl(final String url) {
- List<int> result = <int>[]
- // Eddystone header
- ..add(0x10) // Frame type (Eddystone-URL)
- ..add(0x12); // Faked tx-power (18dBm)
- String left = url;
- // Scheme
-
- const Map<String, int> expansions = const <String, int>{
- '.com/': 0,
- '.org/': 1,
- '.edu/': 2,
- '.net/': 3,
- '.info/': 4,
- '.biz/': 5,
- '.gov/': 6,
- '.com': 7,
- '.org': 8,
- '.edu': 9,
- '.net': 10,
- '.info': 11,
- '.biz': 12,
- '.gov': 13,
- };
-
- for (final String prefix in _schemes.keys) {
- if (left.startsWith(prefix)) {
- left = left.substring(prefix.length);
- result.add(_schemes[prefix]);
- }
- }
-
- while (left.isNotEmpty) {
- bool compacted = false;
- for (final String str in expansions.keys) {
- if (left.startsWith(str)) {
- result.add(expansions[str]);
- left = left.substring(str.length);
- compacted = true;
- break;
- }
- }
- if (compacted) {
- continue;
- }
- result.add(left.codeUnitAt(0));
- left = left.substring(1);
- }
-
- return result;
- }
-}
diff --git a/examples/bluetooth/eddystone_advertiser/lib/src/screen.dart b/examples/bluetooth/eddystone_advertiser/lib/src/screen.dart
deleted file mode 100644
index ca71fb0..0000000
--- a/examples/bluetooth/eddystone_advertiser/lib/src/screen.dart
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'package:flutter/material.dart';
-import 'package:lib.widgets/model.dart';
-import 'package:meta/meta.dart';
-
-import 'modular/module_model.dart';
-
-// ignore_for_file: public_member_api_docs
-
-/// Root Widget of the Eddystone Advertiser module.
-class EddystoneScreen extends StatefulWidget {
- final EddystoneModuleModel moduleModel;
-
- const EddystoneScreen({@required this.moduleModel, Key key})
- : super(key: key);
-
- @override
- _EddystoneState createState() => new _EddystoneState();
-}
-
-typedef RemoveCallback = void Function();
-
-class AdvertisedListItem extends StatelessWidget {
- AdvertisedListItem({this.url, this.onRemove})
- : super(key: new ObjectKey(url));
-
- final String url;
- final RemoveCallback onRemove;
-
- @override
- Widget build(BuildContext context) {
- return new ListTile(
- title: new Text(url),
- trailing:
- new RaisedButton(child: const Text('STOP'), onPressed: onRemove));
- }
-}
-
-class _EddystoneState extends State<EddystoneScreen> {
- //final List<String> _advertisedUrls = [];
-
- final GlobalKey<FormState> _formKey = new GlobalKey<FormState>();
-
- @override
- Widget build(BuildContext context) {
- return new ScopedModelDescendant<EddystoneModuleModel>(builder: (
- BuildContext context,
- Widget child,
- EddystoneModuleModel moduleModel,
- ) {
- Builder b = new Builder(builder: (BuildContext context) {
- Widget advertisingForm = new Form(
- key: _formKey,
- autovalidate: true,
- child: new Container(
- padding: const EdgeInsets.all(36.0),
- child: new Column(children: <Widget>[
- new Row(children: <Widget>[
- new Expanded(
- flex: 1,
- child: new TextFormField(
- decoration: const InputDecoration(
- labelText: 'Advertise URL',
- hintText:
- 'A URL to advertise in an Eddystone-URL beacon',
- ),
- validator: moduleModel.validateEddystoneUrl,
- onSaved: (String newValue) {
- if (moduleModel.advertisedUrls
- .contains(newValue)) {
- return;
- }
- moduleModel.startAdvertising(newValue).catchError(
- (Object error) => Scaffold
- .of(context)
- .showSnackBar(new SnackBar(
- content: new Text(error),
- backgroundColor:
- const Color(0xFFFFC0EB),
- duration:
- const Duration(seconds: 15))));
- })),
- new RaisedButton(
- child: const Text('Advertise'),
- onPressed: () {
- _formKey.currentState.save();
- _formKey.currentState.reset();
- }),
- ]),
- ])));
- List<Widget> widgets = <Widget>[
- advertisingForm,
- const Text('Advertised URLs')
- ]..addAll(moduleModel.advertisedUrls.map((String url) {
- return new AdvertisedListItem(
- url: url,
- onRemove: () {
- moduleModel.stopAdvertising(url);
- });
- }));
- return new Column(children: widgets);
- });
- return new Scaffold(
- appBar: new AppBar(
- title: const Text('Eddystone Beacon'),
- ),
- body: b);
- });
- }
-}
diff --git a/examples/bluetooth/eddystone_advertiser/pubspec.yaml b/examples/bluetooth/eddystone_advertiser/pubspec.yaml
deleted file mode 100644
index ee2ebe7..0000000
--- a/examples/bluetooth/eddystone_advertiser/pubspec.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-name: BLE Scanner Example
-
-flutter:
- uses-material-design: true
diff --git a/packages/examples/all b/packages/examples/all
index 7f6b984..6a5226e 100644
--- a/packages/examples/all
+++ b/packages/examples/all
@@ -1,6 +1,5 @@
{
"imports": [
- "topaz/packages/examples/bluetooth",
"topaz/packages/examples/dart",
"topaz/packages/examples/fidl",
"topaz/packages/examples/flutter_gallery",
diff --git a/packages/examples/bluetooth b/packages/examples/bluetooth
deleted file mode 100644
index b79d05c..0000000
--- a/packages/examples/bluetooth
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "packages": [
- "//topaz/examples/bluetooth/ble_scanner"
- ]
-}