diff --git a/mobile/android/app/src/main/AndroidManifest.xml b/mobile/android/app/src/main/AndroidManifest.xml
index 515ad969..98c8e964 100644
--- a/mobile/android/app/src/main/AndroidManifest.xml
+++ b/mobile/android/app/src/main/AndroidManifest.xml
@@ -44,4 +44,8 @@
android:name="flutterEmbedding"
android:value="2" />
+
+
+
+
diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart
index bf09ebe1..e048b141 100644
--- a/mobile/lib/main.dart
+++ b/mobile/lib/main.dart
@@ -1,7 +1,6 @@
import 'package:flutter/material.dart';
-
import 'src/app.dart';
-void main() async {
+void main() {
runApp(App());
}
diff --git a/mobile/lib/src/app.dart b/mobile/lib/src/app.dart
index be3bfef4..f8056bce 100644
--- a/mobile/lib/src/app.dart
+++ b/mobile/lib/src/app.dart
@@ -1,7 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:polydodo/src/presentation/bluetooth_route/bluetoothSelector_route.dart';
+import 'package:polydodo/src/presentation/wallets/wallets_route.dart';
-import 'presentation/wallets/wallets_route.dart';
import 'locator.dart';
import 'theme.dart';
@@ -18,10 +19,10 @@ class App extends StatelessWidget {
child: MaterialApp(
title: 'PolyDodo',
theme: theme,
- home: WalletsRoute(),
- initialRoute: WalletsRoute.name,
+ initialRoute: BluetoothSelectorRoute.name,
routes: {
WalletsRoute.name: (context) => WalletsRoute(),
+ BluetoothSelectorRoute.name: (context) => BluetoothSelectorRoute(),
},
),
);
diff --git a/mobile/lib/src/application/device/device_selector_cubit.dart b/mobile/lib/src/application/device/device_selector_cubit.dart
new file mode 100644
index 00000000..6d876880
--- /dev/null
+++ b/mobile/lib/src/application/device/device_selector_cubit.dart
@@ -0,0 +1,45 @@
+import 'dart:async';
+
+import 'package:bloc/bloc.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:polydodo/src/domain/acquisition_device/acquisition_device.dart';
+import 'package:polydodo/src/domain/acquisition_device/i_acquisition_device_repository.dart';
+import 'device_selector_state.dart';
+
+class DeviceSelectorCubit extends Cubit {
+ final IAcquisitionDeviceRepository _deviceRepository;
+
+ StreamSubscription> _acquisitionDeviceStream;
+
+ DeviceSelectorCubit(this._deviceRepository) : super(DeviceInitial()) {
+ startSearching();
+ }
+
+ void startSearching() {
+ _deviceRepository.initializeRepository();
+
+ if (_acquisitionDeviceStream == null) {
+ _acquisitionDeviceStream = _deviceRepository
+ .watch()
+ .asBroadcastStream()
+ .listen((devices) => emit(DeviceSearchInProgress(devices)),
+ onError: (e) => emit(DeviceSearchFailure(e)));
+ }
+ }
+
+ void connect(AcquisitionDevice device) async {
+ emit(DeviceConnectionInProgress());
+
+ _deviceRepository.connect(device).then(
+ (value) => {
+ _acquisitionDeviceStream.cancel(),
+ emit(DeviceConnectionSuccess())
+ },
+ onError: (e) => {emit(DeviceConnectionFailure(e)), resetSearch()});
+ }
+
+ void resetSearch() {
+ _deviceRepository.disconnect();
+ startSearching();
+ }
+}
diff --git a/mobile/lib/src/application/device/device_selector_state.dart b/mobile/lib/src/application/device/device_selector_state.dart
new file mode 100644
index 00000000..76677bb6
--- /dev/null
+++ b/mobile/lib/src/application/device/device_selector_state.dart
@@ -0,0 +1,27 @@
+import 'package:polydodo/src/domain/acquisition_device/acquisition_device.dart';
+
+abstract class DeviceState {}
+
+class DeviceInitial extends DeviceState {}
+
+class DeviceSearchInProgress extends DeviceState {
+ final List devices;
+
+ DeviceSearchInProgress(this.devices);
+}
+
+class DeviceSearchFailure extends DeviceState {
+ final Exception cause;
+
+ DeviceSearchFailure(this.cause);
+}
+
+class DeviceConnectionInProgress extends DeviceState {}
+
+class DeviceConnectionSuccess extends DeviceState {}
+
+class DeviceConnectionFailure extends DeviceState {
+ final Exception cause;
+
+ DeviceConnectionFailure(this.cause);
+}
diff --git a/mobile/lib/src/application/eeg_data/data_cubit.dart b/mobile/lib/src/application/eeg_data/data_cubit.dart
new file mode 100644
index 00000000..5f06fa8f
--- /dev/null
+++ b/mobile/lib/src/application/eeg_data/data_cubit.dart
@@ -0,0 +1,27 @@
+import 'package:polydodo/src/domain/acquisition_device/i_acquisition_device_repository.dart';
+import 'package:polydodo/src/domain/eeg_data/i_eeg_data_repository.dart';
+
+import 'data_states.dart';
+import 'package:bloc/bloc.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+class DataCubit extends Cubit {
+ final IAcquisitionDeviceRepository _deviceRepository;
+ final IEEGDataRepository _eegDataRepository;
+
+ DataCubit(this._deviceRepository, this._eegDataRepository)
+ : super(DataStateInitial());
+
+ void startStreaming() {
+ emit(DataStateRecording());
+ _deviceRepository
+ .startDataStream()
+ .then((stream) => _eegDataRepository.createRecordingFromStream(stream));
+ }
+
+ void stopStreaming() {
+ emit(DataStateInitial());
+ _deviceRepository.stopDataStream();
+ _eegDataRepository.stopRecordingFromStream();
+ }
+}
diff --git a/mobile/lib/src/application/eeg_data/data_states.dart b/mobile/lib/src/application/eeg_data/data_states.dart
new file mode 100644
index 00000000..69453e90
--- /dev/null
+++ b/mobile/lib/src/application/eeg_data/data_states.dart
@@ -0,0 +1,5 @@
+abstract class DataState {}
+
+class DataStateInitial extends DataState {}
+
+class DataStateRecording extends DataState {}
diff --git a/mobile/lib/src/domain/acquisition_device/acquisition_device.dart b/mobile/lib/src/domain/acquisition_device/acquisition_device.dart
new file mode 100644
index 00000000..f15efc14
--- /dev/null
+++ b/mobile/lib/src/domain/acquisition_device/acquisition_device.dart
@@ -0,0 +1,13 @@
+import 'package:equatable/equatable.dart';
+import 'package:polydodo/src/domain/entity.dart';
+
+import '../unique_id.dart';
+
+class AcquisitionDevice extends Entity {
+ final String name;
+
+ AcquisitionDevice(
+ id,
+ this.name,
+ ) : super(id);
+}
diff --git a/mobile/lib/src/domain/acquisition_device/i_acquisition_device_repository.dart b/mobile/lib/src/domain/acquisition_device/i_acquisition_device_repository.dart
new file mode 100644
index 00000000..04067b8e
--- /dev/null
+++ b/mobile/lib/src/domain/acquisition_device/i_acquisition_device_repository.dart
@@ -0,0 +1,13 @@
+import 'acquisition_device.dart';
+
+abstract class IAcquisitionDeviceRepository {
+ void initializeRepository();
+
+ Future connect(AcquisitionDevice device);
+ void disconnect();
+
+ Future>> startDataStream();
+ void stopDataStream();
+
+ Stream> watch();
+}
diff --git a/mobile/lib/src/domain/eeg_data/eeg_data.dart b/mobile/lib/src/domain/eeg_data/eeg_data.dart
new file mode 100644
index 00000000..4f6b38ab
--- /dev/null
+++ b/mobile/lib/src/domain/eeg_data/eeg_data.dart
@@ -0,0 +1,16 @@
+// EEGData can be extended later to add our metrics
+import '../unique_id.dart';
+
+class EEGData {
+ UniqueId id;
+ List _values;
+ int sampleCounter = 0;
+
+ EEGData(this.id, this._values)
+ : assert(id != null),
+ assert(_values != null);
+
+ List get values => _values;
+
+ String get fileName => id.toString();
+}
diff --git a/mobile/lib/src/domain/eeg_data/i_eeg_data_repository.dart b/mobile/lib/src/domain/eeg_data/i_eeg_data_repository.dart
new file mode 100644
index 00000000..d1e12b38
--- /dev/null
+++ b/mobile/lib/src/domain/eeg_data/i_eeg_data_repository.dart
@@ -0,0 +1,8 @@
+abstract class IEEGDataRepository {
+ void createRecordingFromStream(Stream> stream);
+ void stopRecordingFromStream();
+
+ // todo: implement export and import
+ void importData();
+ void exportData();
+}
diff --git a/mobile/lib/src/domain/entity.dart b/mobile/lib/src/domain/entity.dart
new file mode 100644
index 00000000..844514b4
--- /dev/null
+++ b/mobile/lib/src/domain/entity.dart
@@ -0,0 +1,11 @@
+import 'package:equatable/equatable.dart';
+import 'package:polydodo/src/domain/unique_id.dart';
+
+abstract class Entity extends Equatable {
+ final UniqueId id;
+
+ Entity(this.id);
+
+ @override
+ List