84 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'dart:async';
 | |
| import 'dart:io';
 | |
| 
 | |
| import 'package:esense_flutter/esense.dart';
 | |
| import 'package:flutter/material.dart';
 | |
| import 'package:permission_handler/permission_handler.dart';
 | |
| 
 | |
| class ESenseInput {
 | |
|   static final instance = ESenseInput._();
 | |
| 
 | |
|   ESenseManager eSenseManager = ESenseManager('unknown');
 | |
|   ValueNotifier<String> deviceStatus = ValueNotifier('');
 | |
| 
 | |
|   String eSenseDeviceName = '';
 | |
|   bool connected = false;
 | |
|   bool sampling = false;
 | |
| 
 | |
|   ESenseInput._() {
 | |
|     _listenToESense();
 | |
|   }
 | |
| 
 | |
|   Future<void> _askForPermissions() async {
 | |
|     if (!Platform.isAndroid && !Platform.isIOS) return;
 | |
|     if (!(await Permission.bluetoothScan.request().isGranted &&
 | |
|         await Permission.bluetoothConnect.request().isGranted)) {
 | |
|       print(
 | |
|           'WARNING - no permission to use Bluetooth granted. Cannot access eSense device.');
 | |
|     }
 | |
|     // for some strange reason, Android requires permission to location for Bluetooth to work.....?
 | |
|     if (Platform.isAndroid) {
 | |
|       if (!(await Permission.locationWhenInUse.request().isGranted)) {
 | |
|         print(
 | |
|             'WARNING - no permission to access location granted. Cannot access eSense device.');
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   StreamSubscription _listenToESense() {
 | |
|     // if you want to get the connection events when connecting,
 | |
|     // set up the listener BEFORE connecting...
 | |
|     return eSenseManager.connectionEvents.listen((event) {
 | |
|       print('CONNECTION event: $event');
 | |
| 
 | |
|       // when we're connected to the eSense device, we can start listening to events from it
 | |
|       // if (event.type == ConnectionType.connected) _listenToESenseEvents();
 | |
| 
 | |
|       connected = false;
 | |
|       switch (event.type) {
 | |
|         case ConnectionType.connected:
 | |
|           deviceStatus.value = 'connected';
 | |
|           connected = true;
 | |
|           break;
 | |
|         case ConnectionType.unknown:
 | |
|           deviceStatus.value = 'unknown';
 | |
|           break;
 | |
|         case ConnectionType.disconnected:
 | |
|           deviceStatus.value = 'disconnected';
 | |
|           sampling = false;
 | |
|           break;
 | |
|         case ConnectionType.device_found:
 | |
|           deviceStatus.value = 'device_found';
 | |
|           break;
 | |
|         case ConnectionType.device_not_found:
 | |
|           deviceStatus.value = 'device_not_found';
 | |
|           break;
 | |
|       }
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   Future<void> connectToESense(String deviceName) async {
 | |
|     if (!connected) {
 | |
|       await _askForPermissions();
 | |
|       print('Trying to connect to eSense device namend \'$deviceName\'');
 | |
|       eSenseDeviceName = deviceName;
 | |
|       eSenseManager.deviceName = deviceName;
 | |
|       connected = await eSenseManager.connect();
 | |
|       print('Trying to connect to eSense device namend \'${eSenseManager.deviceName}\'');
 | |
| 
 | |
|       deviceStatus.value = connected ? 'connecting...' : 'connection failed';
 | |
|       print(deviceStatus.value);
 | |
|     }
 | |
|   }
 | |
| }
 |