From 129073253a58939e90fc7dbc7fef2801f9732296 Mon Sep 17 00:00:00 2001 From: Enzo Date: Mon, 4 Dec 2023 10:04:16 +0100 Subject: [PATCH] correction import pour mobile et ajout deniv --- lib/modele/data_file.dart | 10 +++ lib/modele/manager_file.dart | 66 +++++++++---------- .../list_activity/list_activity_utile.dart | 34 +++++++--- .../activity/mobile/mobile_list_activity.dart | 4 +- lib/view/activity/web/web_list_activity.dart | 2 +- 5 files changed, 71 insertions(+), 45 deletions(-) create mode 100644 lib/modele/data_file.dart diff --git a/lib/modele/data_file.dart b/lib/modele/data_file.dart new file mode 100644 index 0000000..0486039 --- /dev/null +++ b/lib/modele/data_file.dart @@ -0,0 +1,10 @@ +class DataFile { + final List> csvData; + final String category; + final String startTime; + final double denivelePositif; + final double deniveleNegatif; + + DataFile(this.csvData, this.category, this.startTime, this.denivelePositif, + this.deniveleNegatif); +} diff --git a/lib/modele/manager_file.dart b/lib/modele/manager_file.dart index ff835b0..9f904f0 100644 --- a/lib/modele/manager_file.dart +++ b/lib/modele/manager_file.dart @@ -3,7 +3,7 @@ import 'dart:typed_data'; import 'package:csv/csv.dart'; import 'package:fit_tool/fit_tool.dart'; import 'package:path_provider/path_provider.dart'; -import 'package:tuple/tuple.dart'; +import 'package:smartfit_app_mobile/modele/data_file.dart'; class ManagerFile { // -- Field @@ -18,6 +18,11 @@ class ManagerFile { final String _fieldTotalCalorie = "total_calories"; final String _fieldTemperature = "temperature"; + // -- Not in CSV -- // + final String _session = "session"; + final String _startTime = "start_time"; + final String _sport = "sport"; + // -- Getter field String get fieldTimeStamp => _fieldTimestamp; String get fieldPositionLatitude => _fieldPositionLatitue; @@ -47,20 +52,29 @@ class ManagerFile { ]; } - Tuple3>> convertBytesFitFileIntoCSVList( - Uint8List bytes) { + DataFile convertBytesFitFileIntoCSVList(Uint8List bytes) { FitFile fitFile = FitFile.fromBytes(bytes); // ----------- Lire le fit et extarire les données qu'on choisi ----------- // List>> dataResult = List.empty(growable: true); + // -- Start Time default -- // String startTime = "2000-01-01"; + // -- Category Default -- // String category = "Generic"; + // -- Denivelé positif et négatif -- // + double denivelePositif = 0.0; + double deniveleNegatif = 0.0; + double lastDenivele = 0.0; + + // --------------------------------------- // for (Record element in fitFile.records) { List listeField = element.toRow(); Map> ligneDataResult = {}; + // -- Skip ligne whith no data -- // bool skip = true; + // -- Session -- // bool sesssionLigne = false; if (listeField[0] != "Data") { @@ -69,20 +83,31 @@ class ManagerFile { for (int i = 0; i < listeField.length;) { // -- Check si c'est une ligne session --// - if (i == 0 && listeField[0] == "Data" && listeField[2] == "session") { + if (i == 0 && listeField[2] == _session) { sesssionLigne = true; } // -- Si ligne session && starttime -- // - if (sesssionLigne && listeField[i] == "start_time") { + if (sesssionLigne && listeField[i] == _startTime) { startTime = DateTime.fromMillisecondsSinceEpoch(listeField[i + 1] as int) .toIso8601String(); } // -- Si ligne session && sport -- // - if (sesssionLigne && listeField[i] == "sport") { + if (sesssionLigne && listeField[i] == _sport) { category = _getCategoryById(listeField[i + 1] as int); } + // Calcul denivelé positif et négatif + if (listeField[i] == _fieldAltitude) { + if (listeField[i + 1] > lastDenivele) { + denivelePositif += listeField[i + 1] - lastDenivele; + } else { + deniveleNegatif += (listeField[i + 1] - lastDenivele) * -1; + } + lastDenivele = listeField[i + 1]; + } + //------// + if (allowedFieldWalking.contains(listeField[i])) { Map tmp = {}; tmp["Value"] = listeField[i + 1].toString(); @@ -124,9 +149,8 @@ class ManagerFile { } csvData.insert(0, enteteCSV); // ------- FIN --------------- // - // -- Extraire la catégorie + date début -- // - - return Tuple3(category, startTime, csvData); + return DataFile( + csvData, category, startTime, denivelePositif, deniveleNegatif); } // -- Read the byte of file CSV -- // @@ -134,30 +158,6 @@ class ManagerFile { return const CsvToListConverter().convert(utf8.decode(bytes)); } - // -- Retourne la catégorie et la date d'une activité -- // - Tuple2 getCategoryAndDate(List> contentFile) { - String startTime = "2000-01-01"; - String category = "Generic"; - - // On regarde que les 8 derniers ligne !! - for (int i = contentFile.length - 1; i != contentFile.length - 8; i--) { - if (contentFile[i][0] == "Data" && contentFile[i][0] == "session") { - for (int colonne = 6; colonne < contentFile[i].length; colonne++) { - if (contentFile[i][colonne] == "start_time") { - // Convertir la date timestamp !!! - startTime = DateTime.fromMillisecondsSinceEpoch( - contentFile[i][colonne + 1] as int) - .toIso8601String(); - } - if (contentFile[i][colonne] == "sport") { - category = _getCategoryById(contentFile[i][colonne + 1] as int); - } - } - } - } - return Tuple2(category, startTime); - } - String _getCategoryById(int id) { switch (id) { case 0: diff --git a/lib/modele/utile/list_activity/list_activity_utile.dart b/lib/modele/utile/list_activity/list_activity_utile.dart index 82a25e7..831faa5 100644 --- a/lib/modele/utile/list_activity/list_activity_utile.dart +++ b/lib/modele/utile/list_activity/list_activity_utile.dart @@ -1,11 +1,14 @@ import 'dart:convert'; +import 'dart:io'; import 'dart:typed_data'; import 'package:csv/csv.dart'; +import 'package:fit_tool/fit_tool.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:smartfit_app_mobile/modele/activity.dart'; import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart'; import 'package:smartfit_app_mobile/modele/api/request_api.dart'; +import 'package:smartfit_app_mobile/modele/data_file.dart'; import 'package:smartfit_app_mobile/modele/manager_file.dart'; import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:tuple/tuple.dart'; @@ -61,20 +64,18 @@ class ListActivityUtile { return const Tuple2(true, "Yeah"); } - Future> addFile( + Future> _addFile( Uint8List bytes, String filename, String token) async { // -- Transormer le fit en CSV - Tuple3>> categorieStarttimeCsv = - _managerFile.convertBytesFitFileIntoCSVList(bytes); + DataFile dataFile = _managerFile.convertBytesFitFileIntoCSVList(bytes); - String csvString = - const ListToCsvConverter().convert(categorieStarttimeCsv.item3); + String csvString = const ListToCsvConverter().convert(dataFile.csvData); Uint8List byteCSV = Uint8List.fromList(utf8.encode(csvString)); // --- Save Local // --- Api - Tuple2 result = await _strategy.uploadFileByte(token, byteCSV, - filename, categorieStarttimeCsv.item1, categorieStarttimeCsv.item2); + Tuple2 result = await _strategy.uploadFileByte( + token, byteCSV, filename, dataFile.category, dataFile.startTime); if (result.item1 == false) { return Tuple2(false, result.item2); } @@ -89,12 +90,27 @@ class ListActivityUtile { return true; } - void preAddFile(Uint8List? bytes, String token, String filename, + void addFileWeb(Uint8List? bytes, String token, String filename, BuildContext context) async { if (bytes == null) { return; } - Tuple2 resultAdd = await addFile(bytes, filename, token); + Tuple2 resultAdd = await _addFile(bytes, filename, token); + if (!resultAdd.item1) { + //print("Message error"); + return; + } + Tuple2 resultGet = await getFiles(token, context); + if (!resultGet.item1) { + //print("Message error"); + return; + } + } + + Future addFileMobile( + String path, String token, String filename, BuildContext context) async { + Tuple2 resultAdd = + await _addFile(await File(path).readAsBytes(), filename, token); if (!resultAdd.item1) { //print("Message error"); return; diff --git a/lib/view/activity/mobile/mobile_list_activity.dart b/lib/view/activity/mobile/mobile_list_activity.dart index b5adb06..20af419 100644 --- a/lib/view/activity/mobile/mobile_list_activity.dart +++ b/lib/view/activity/mobile/mobile_list_activity.dart @@ -55,8 +55,8 @@ class _MobileListActivity extends State { await FilePicker.platform.pickFiles(); if (result != null && result.files.isNotEmpty) { // ignore: use_build_context_synchronously - _utile.preAddFile( - result.files.first.bytes, + _utile.addFileMobile( + result.files.single.path!, Provider.of(context, listen: false).token, result.files.first.name, context); diff --git a/lib/view/activity/web/web_list_activity.dart b/lib/view/activity/web/web_list_activity.dart index 2a2d23a..1296842 100644 --- a/lib/view/activity/web/web_list_activity.dart +++ b/lib/view/activity/web/web_list_activity.dart @@ -58,7 +58,7 @@ class _WebListActivityState extends State { FilePickerResult? result = await FilePicker.platform.pickFiles(); if (result != null && result.files.isNotEmpty) { - _utile.preAddFile( + _utile.addFileWeb( result.files.first.bytes, Provider.of(context, listen: false).token, result.files.first.name,