style: refactored esense_input into global singleton
This commit is contained in:
		
							parent
							
								
									947570755e
								
							
						
					
					
						commit
						c5cee0cb9d
					
				
							
								
								
									
										83
									
								
								lib/esense_input.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								lib/esense_input.dart
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,83 @@
 | 
				
			||||||
 | 
					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);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,10 +1,9 @@
 | 
				
			||||||
import 'dart:io';
 | 
					import 'dart:io';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import 'package:esense_flutter/esense.dart';
 | 
					 | 
				
			||||||
import 'package:file_picker/file_picker.dart';
 | 
					import 'package:file_picker/file_picker.dart';
 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
import 'package:permission_handler/permission_handler.dart';
 | 
					 | 
				
			||||||
import 'package:sense_the_rhythm/esense_connect_dialog.dart';
 | 
					import 'package:sense_the_rhythm/esense_connect_dialog.dart';
 | 
				
			||||||
 | 
					import 'package:sense_the_rhythm/esense_input.dart';
 | 
				
			||||||
import 'package:sense_the_rhythm/simfile.dart';
 | 
					import 'package:sense_the_rhythm/simfile.dart';
 | 
				
			||||||
import 'package:shared_preferences/shared_preferences.dart';
 | 
					import 'package:shared_preferences/shared_preferences.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,88 +20,12 @@ class _LevelSelectionState extends State<LevelSelection> {
 | 
				
			||||||
  String? stepmaniaCoursesPath;
 | 
					  String? stepmaniaCoursesPath;
 | 
				
			||||||
  List<Simfile> stepmaniaCoursesFolders = [];
 | 
					  List<Simfile> stepmaniaCoursesFolders = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  String eSenseDeviceName = '';
 | 
					 | 
				
			||||||
  ESenseManager? eSenseManager;
 | 
					 | 
				
			||||||
  ValueNotifier<String> _deviceStatus = ValueNotifier('');
 | 
					 | 
				
			||||||
  // String _deviceStatus = '';
 | 
					 | 
				
			||||||
  bool connected = false;
 | 
					 | 
				
			||||||
  bool sampling = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  void initState() {
 | 
					  void initState() {
 | 
				
			||||||
    super.initState();
 | 
					    super.initState();
 | 
				
			||||||
    _listenToESense();
 | 
					 | 
				
			||||||
    loadFolderPath();
 | 
					    loadFolderPath();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Future<void> _askForPermissions() async {
 | 
					 | 
				
			||||||
    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.');
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Future<void> _listenToESense() async {
 | 
					 | 
				
			||||||
    await _askForPermissions();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // if you want to get the connection events when connecting,
 | 
					 | 
				
			||||||
    // set up the listener BEFORE connecting...
 | 
					 | 
				
			||||||
    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();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      setState(() {
 | 
					 | 
				
			||||||
        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...');
 | 
					 | 
				
			||||||
      setState(() {
 | 
					 | 
				
			||||||
        eSenseDeviceName = deviceName;
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
      print(eSenseDeviceName);
 | 
					 | 
				
			||||||
      eSenseManager = ESenseManager(eSenseDeviceName);
 | 
					 | 
				
			||||||
      connected = await eSenseManager!.connect();
 | 
					 | 
				
			||||||
      print('success!');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      setState(() {
 | 
					 | 
				
			||||||
        _deviceStatus.value = connected ? 'connecting...' : 'connection failed';
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Future<void> loadFolderPath() async {
 | 
					  Future<void> loadFolderPath() async {
 | 
				
			||||||
    SharedPreferences prefs = await SharedPreferences.getInstance();
 | 
					    SharedPreferences prefs = await SharedPreferences.getInstance();
 | 
				
			||||||
| 
						 | 
					@ -163,9 +86,9 @@ class _LevelSelectionState extends State<LevelSelection> {
 | 
				
			||||||
                    context: context,
 | 
					                    context: context,
 | 
				
			||||||
                    builder: (BuildContext context) {
 | 
					                    builder: (BuildContext context) {
 | 
				
			||||||
                      return ESenseConnectDialog(
 | 
					                      return ESenseConnectDialog(
 | 
				
			||||||
                          deviceStatus: _deviceStatus,
 | 
					                          deviceStatus: ESenseInput.instance.deviceStatus,
 | 
				
			||||||
                          connect: (String name) {
 | 
					                          connect: (String name) {
 | 
				
			||||||
                            _connectToESense(name);
 | 
					                            ESenseInput.instance.connectToESense(name);
 | 
				
			||||||
                          });
 | 
					                          });
 | 
				
			||||||
                    },
 | 
					                    },
 | 
				
			||||||
                  ),
 | 
					                  ),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue