Skip to content

Commit

Permalink
Merge pull request #20 from mario-bermonti:data-manager
Browse files Browse the repository at this point in the history
Create a data manager
  • Loading branch information
mario-bermonti authored Jan 15, 2024
2 parents 6cad4f0 + 94d2420 commit 9646598
Show file tree
Hide file tree
Showing 13 changed files with 166 additions and 10 deletions.
81 changes: 81 additions & 0 deletions lib/src/data_manager/data_manager.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import 'package:cognitive_data/data.dart';
import 'package:path_provider/path_provider.dart';

class DataManager {
final String participantID;
final String sessionID;
late final DataBase _dataBase;

/// TODO add type
final data;

DataManager({
required this.participantID,
required this.sessionID,
required this.data,
});

Future<void> initDB({required String name}) async {
final dir = await getApplicationDocumentsDirectory();
final String dbPath = "${dir.path}/$name.sqlite3";

_dataBase = DataBase(path: dbPath);
}

/// Helper method that adds the necessary device data to db
void addDeviceData() {
_dataBase.addDeviceData(
participantId: participantID,
sessionID: sessionID,
);
}

/// Helper method that adds the necessary session metadata to db
void addSessionMetaData() {
_dataBase.addSessionMetaData(
participantId: participantID,
sessionID: sessionID,
timeStart: data.sessionData.startTime,
timeEnd: data.sessionData.endTime,
);
}

/// Adds data from practice trials to db
void addPracticeTrialData() {
_addTrialData(
trialType: TrialType.practice,
trialData: data.trialData,
);
}

/// Adds data from experimental trials to db
/// Requires the experimental trials [trialData]
void addExperimentalTrialData({required dynamic trialData}) {
_addTrialData(
trialType: TrialType.experimental,
trialData: trialData,
);
}

/// Helper method to add the data from trials to db
/// TODO specify type
void _addTrialData({
required TrialType trialType,
required dynamic trialData,
}) {
for (var trial in trialData) {
_dataBase.addTrialData(
participantId: participantID,
stim: trial.stim,
resp: trial.response,
trialType: trialType,
sessionID: sessionID,
);
}
}

/// Save session metadata, device and trial data to db
Future<void> saveDataDB() async {
await _dataBase.saveData();
}
}
6 changes: 6 additions & 0 deletions lib/src/data_manager/session_id_creator.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
String createSessionID(
{required String participantID, required String startTime}) {
final String sessionID = participantID + startTime;

return sessionID;
}
6 changes: 3 additions & 3 deletions lib/src/digit_span_tasks/task_runners/run_dsb.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ import 'package:digit_span_tasks/digit_span_tasks.dart';
import 'package:get/get.dart';
import '../config/config_dsb.dart';

void runDigitSpanBackwards() async {
Future<DigitSpanTasksData> runDigitSpanBackwards() async {
DigitSpanTasksData data = await Get.to(() => DigitSpanBackwards(
config: configDSB,
));
// ignore: avoid_print
print('\n\n\nBAKWARDS data \n $data');

return data;
}
6 changes: 3 additions & 3 deletions lib/src/digit_span_tasks/task_runners/run_dsf.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ import 'package:digit_span_tasks/digit_span_tasks.dart';
import 'package:get/get.dart';
import '../config/config_dsf.dart';

void runDigitSpanForward() async {
Future<DigitSpanTasksData> runDigitSpanForward() async {
DigitSpanTasksData data = await Get.to(() => DigitSpanForward(
config: configDSF,
));
// ignore: avoid_print
print('\n\n\nFORWARD data \n $data');

return data;
}
26 changes: 26 additions & 0 deletions lib/src/services/data_processor.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import 'package:cognitive_data/data.dart';

import '../data_manager/data_manager.dart';

/// Process data from a single session and save it to the db
Future<void> processData({
required String participantID,
required String sessionID,
required dynamic practiceData,
required dynamic experimentalData,
required String dbName,
required TrialType trialType,
}) async {
DataManager dataManager = DataManager(
participantID: participantID,
sessionID: sessionID,
data: practiceData,
);

await dataManager.initDB(name: dbName);
dataManager.addDeviceData();
dataManager.addSessionMetaData();
dataManager.addPracticeTrialData();
dataManager.addExperimentalTrialData(trialData: experimentalData.trialData);
await dataManager.saveDataDB();
}
28 changes: 26 additions & 2 deletions lib/src/services/run_session.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,33 @@
import 'package:cognitive_data/trial_type.dart';
import 'package:digit_span_tasks/digit_span_tasks.dart';
import 'package:mdigit_span_tasks/src/data_manager/data_manager.dart';
import 'package:mdigit_span_tasks/src/data_manager/session_id_creator.dart';
import 'package:mdigit_span_tasks/src/services/data_processor.dart';

import '../participant_info/participant_info_dialog.dart';

/// Run a data collection session
/// Running a session includes configuring everything needed and running a
/// cognitive task specificed with [taskRunner].
void runSession({required Function taskRunner}) async {
void runSession({required Function taskRunner, required String dbName}) async {
final String participantID = await showParticipantInfoDialog();
taskRunner();
DigitSpanTasksData data = await taskRunner();

/// We use the startTime for the practice session to create a single
/// session id for both practice and experimental data.
final String sessionID = createSessionID(
participantID: participantID,
startTime: data.practiceData.sessionData.startTime.toString(),
);

/// TODO Specify type
final dataPractice = data.practiceData;
await processData(
participantID: participantID,
sessionID: sessionID,
practiceData: dataPractice,
experimentalData: data.experimentalData,
dbName: dbName,
trialType: TrialType.practice,
);
}
6 changes: 4 additions & 2 deletions lib/src/task_list/view/task_buttons.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ class DSBButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () => runSession(taskRunner: runDigitSpanBackwards),
onPressed: () =>
runSession(taskRunner: runDigitSpanBackwards, dbName: 'ds_backwards'),
child: Text(
'Digit Span Backwards',
style: Theme.of(context).textTheme.titleLarge,
Expand All @@ -28,7 +29,8 @@ class DSFButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () => runSession(taskRunner: runDigitSpanForward),
onPressed: () =>
runSession(taskRunner: runDigitSpanForward, dbName: 'ds_forward'),
child: Text(
'Digit Span Forward',
style: Theme.of(context).textTheme.titleLarge,
Expand Down
4 changes: 4 additions & 0 deletions linux/flutter/generated_plugin_registrant.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@

#include "generated_plugin_registrant.h"

#include <sqlite3_flutter_libs/sqlite3_flutter_libs_plugin.h>

void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) sqlite3_flutter_libs_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "Sqlite3FlutterLibsPlugin");
sqlite3_flutter_libs_plugin_register_with_registrar(sqlite3_flutter_libs_registrar);
}
1 change: 1 addition & 0 deletions linux/flutter/generated_plugins.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#

list(APPEND FLUTTER_PLUGIN_LIST
sqlite3_flutter_libs
)

list(APPEND FLUTTER_FFI_PLUGIN_LIST
Expand Down
4 changes: 4 additions & 0 deletions macos/Flutter/GeneratedPluginRegistrant.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,12 @@
import FlutterMacOS
import Foundation

import path_provider_foundation
import shared_preferences_foundation
import sqlite3_flutter_libs

func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
Sqlite3FlutterLibsPlugin.register(with: registry.registrar(forPlugin: "Sqlite3FlutterLibsPlugin"))
}
4 changes: 4 additions & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ dependencies:
digit_span_tasks:
git:
url: https://github.com/mario-bermonti/digit_span_tasks.git
cognitive_data:
git:
url: https://github.com/mario-bermonti/cognitive_data.git
path_provider: ^2.0.15

dev_dependencies:
flutter_test:
Expand Down
3 changes: 3 additions & 0 deletions windows/flutter/generated_plugin_registrant.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,11 @@
#include "generated_plugin_registrant.h"

#include <permission_handler_windows/permission_handler_windows_plugin.h>
#include <sqlite3_flutter_libs/sqlite3_flutter_libs_plugin.h>

void RegisterPlugins(flutter::PluginRegistry* registry) {
PermissionHandlerWindowsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin"));
Sqlite3FlutterLibsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("Sqlite3FlutterLibsPlugin"));
}
1 change: 1 addition & 0 deletions windows/flutter/generated_plugins.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

list(APPEND FLUTTER_PLUGIN_LIST
permission_handler_windows
sqlite3_flutter_libs
)

list(APPEND FLUTTER_FFI_PLUGIN_LIST
Expand Down

0 comments on commit 9646598

Please sign in to comment.