diff options
| -rw-r--r-- | lib/esense_input.dart | 83 | ||||
| -rw-r--r-- | lib/level_selection.dart | 83 | 
2 files changed, 86 insertions, 80 deletions
| diff --git a/lib/esense_input.dart b/lib/esense_input.dart new file mode 100644 index 0000000..705bd5f --- /dev/null +++ b/lib/esense_input.dart @@ -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); +    } +  } +} diff --git a/lib/level_selection.dart b/lib/level_selection.dart index 44cf7ea..08c0f12 100644 --- a/lib/level_selection.dart +++ b/lib/level_selection.dart @@ -1,10 +1,9 @@  import 'dart:io'; -import 'package:esense_flutter/esense.dart';  import 'package:file_picker/file_picker.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_input.dart';  import 'package:sense_the_rhythm/simfile.dart';  import 'package:shared_preferences/shared_preferences.dart'; @@ -21,88 +20,12 @@ class _LevelSelectionState extends State<LevelSelection> {    String? stepmaniaCoursesPath;    List<Simfile> stepmaniaCoursesFolders = []; -  String eSenseDeviceName = ''; -  ESenseManager? eSenseManager; -  ValueNotifier<String> _deviceStatus = ValueNotifier(''); -  // String _deviceStatus = ''; -  bool connected = false; -  bool sampling = false; -    @override    void initState() {      super.initState(); -    _listenToESense();      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 {      SharedPreferences prefs = await SharedPreferences.getInstance(); @@ -163,9 +86,9 @@ class _LevelSelectionState extends State<LevelSelection> {                      context: context,                      builder: (BuildContext context) {                        return ESenseConnectDialog( -                          deviceStatus: _deviceStatus, +                          deviceStatus: ESenseInput.instance.deviceStatus,                            connect: (String name) { -                            _connectToESense(name); +                            ESenseInput.instance.connectToESense(name);                            });                      },                    ), | 
