From 5cdd70de5b61e89a60def9c63f8741be6ecff0c9 Mon Sep 17 00:00:00 2001 From: Enzo Date: Mon, 27 Nov 2023 11:43:09 +0100 Subject: [PATCH] methode calcul csv --- Stub/compte.txt | 2 +- lib/common_widget/info.dart | 3 +- lib/common_widget/stats.dart | 3 +- lib/common_widget/steps.dart | 3 +- lib/modele/activity.dart | 260 ++++++++++++++++-- lib/modele/manager_file.dart | 13 +- .../utile/home_view/home_view_util.dart | 15 +- .../list_activity_utile.dart | 6 +- .../activity/mobile/mobile_list_activity.dart | 9 +- lib/view/activity/web/web_list_activity.dart | 31 ++- lib/view/home/mobile/mobile_homeview.dart | 2 +- 11 files changed, 297 insertions(+), 50 deletions(-) diff --git a/Stub/compte.txt b/Stub/compte.txt index d440232..485db0c 100644 --- a/Stub/compte.txt +++ b/Stub/compte.txt @@ -4,4 +4,4 @@ enzo@gmail.com toto toto@gmail.com -1234 \ No newline at end of file +toto \ No newline at end of file diff --git a/lib/common_widget/info.dart b/lib/common_widget/info.dart index c82720b..ac0ff16 100644 --- a/lib/common_widget/info.dart +++ b/lib/common_widget/info.dart @@ -9,7 +9,8 @@ class Info extends StatelessWidget { Widget build(BuildContext context) { String distance = Provider.of(context, listen: false) .listActivity[0] - .getTotalDistance(); + .getTotalDistance() + .toString(); return Row( mainAxisAlignment: MainAxisAlignment.spaceAround, diff --git a/lib/common_widget/stats.dart b/lib/common_widget/stats.dart index 1591d68..013eb8f 100644 --- a/lib/common_widget/stats.dart +++ b/lib/common_widget/stats.dart @@ -17,7 +17,8 @@ class Stats extends StatelessWidget { .toString(); String time = Provider.of(context, listen: false) .listActivity[0] - .getTotalTime(); + .getTotalTime() + .toString(); return Column( children: [ diff --git a/lib/common_widget/steps.dart b/lib/common_widget/steps.dart index 5bee49f..db2370b 100644 --- a/lib/common_widget/steps.dart +++ b/lib/common_widget/steps.dart @@ -9,7 +9,8 @@ class Steps extends StatelessWidget { Widget build(BuildContext context) { String steps = Provider.of(context, listen: false) .listActivity[0] - .getTotalSteps(); + .getTotalSteps() + .toString(); return Padding( padding: const EdgeInsets.symmetric(vertical: 20), child: Column( diff --git a/lib/modele/activity.dart b/lib/modele/activity.dart index 58eb5cd..79d5bf8 100644 --- a/lib/modele/activity.dart +++ b/lib/modele/activity.dart @@ -11,15 +11,15 @@ class ActivityOfUser { late String _nameFile; // ------------ // late String _imageName; - late List> _contentActivity; + late List> _contentActivity; Map enteteCSV = {}; // ManagerFile for the field final ManagerFile _managerFile = ManagerFile(); // -- Getter/Setter -- // - List> get contentActivity => _contentActivity; - set contentActivity(List> content) { + List> get contentActivity => _contentActivity; + set contentActivity(List> content) { _contentActivity = content; for (int i = 0; i < content.first.length; i++) { enteteCSV.addAll({content.first[i]: i}); @@ -46,8 +46,41 @@ class ActivityOfUser { } } - // ----------------- BPM ------------------ // +// -- func utile -- // + bool notNull(int ligne, int colonne) { + if (_contentActivity[ligne][colonne] == "null") { + return false; + } + return true; + } + +// ----------------- X WithTime ------------ // + + List getXWithTime(String field) { + List result = List.empty(growable: true); + + int firstTimestamp = 0; + + for (int i = 0; i < contentActivity.length; i++) { + if (notNull(i, enteteCSV["Value_$field"]!)) { + if (firstTimestamp == 0) { + firstTimestamp = contentActivity[i] + [enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!]; + } + result.add(FlSpot( + (((contentActivity[i][enteteCSV[ + "Value_${_managerFile.fieldTimeStamp}"]!]) - + firstTimestamp) ~/ + 100) + .toDouble(), + contentActivity[i][enteteCSV["Value_$field"]!].toDouble())); + } + } + return result; + } +// ----------------- BPM ------------------ // +/* // Retourne le Temps+BPM (Fichier CSV) List getHeartRateWithTime() { List result = List.empty(growable: true); @@ -70,7 +103,7 @@ class ActivityOfUser { [enteteCSV["Value_${_managerFile.fielBPM}"]!]))); } return result; - } + }*/ /* List getHeartRateWithTime() { @@ -101,16 +134,17 @@ class ActivityOfUser { // Retourne le BPM Max (Fichier CSV) int getMaxBpm() { - int max = int.parse( - contentActivity.first[enteteCSV["Value_${_managerFile.fielBPM}"]!]); - for (int i = 1; i < contentActivity.length; i++) { - int valueTmp = int.parse( - contentActivity[i][enteteCSV["Value_${_managerFile.fielBPM}"]!]); - if (valueTmp > max) { - max = valueTmp; + int max = 0; + for (int i = 0; i < contentActivity.length; i++) { + if (notNull(i, enteteCSV["Value_${_managerFile.fielBPM}"]!)) { + int valueTmp = + contentActivity[i][enteteCSV["Value_${_managerFile.fielBPM}"]!]; + if (valueTmp > max) { + max = valueTmp; + } } } - return 0; + return max; } /* @@ -122,7 +156,22 @@ class ActivityOfUser { } return 0; }*/ +// Retourne le BPM Min (Fichier CSV) + int getMinBpm() { + int min = 300; + for (int i = 0; i < contentActivity.length; i++) { + if (notNull(i, enteteCSV["Value_${_managerFile.fielBPM}"]!)) { + int valueTmp = + contentActivity[i][enteteCSV["Value_${_managerFile.fielBPM}"]!]; + if (valueTmp < min) { + min = valueTmp; + } + } + } + return min; + } + /* int getMinBpm() { for (int i = 0; i < _contentActivity[_dataSession].length; i++) { if (_contentActivity[_dataSession][i] == "min_heart_rate") { @@ -130,8 +179,22 @@ class ActivityOfUser { } } return 0; + }*/ + // Retourne le BPM avg (Fichier CSV) + int getAvgBpm() { + int somme = 0; + int nb = 0; + for (int i = 0; i < contentActivity.length; i++) { + if (notNull(i, enteteCSV["Value_${_managerFile.fielBPM}"]!)) { + somme += contentActivity[i][enteteCSV["Value_${_managerFile.fielBPM}"]!] + as int; + nb++; + } + } + return somme ~/ nb; } + /* int getAvgBpm() { for (int i = 0; i < _contentActivity[_dataSession].length; i++) { if (_contentActivity[_dataSession][i] == "avg_heart_rate") { @@ -139,7 +202,7 @@ class ActivityOfUser { } } return 0; - } + }*/ // -------------------------- FIN BPM ---------------------- // /* // ---------------------- Distance ---------------------- // @@ -159,16 +222,23 @@ class ActivityOfUser { } return result; } - - String getTotalDistance() { - for (int i = 0; i < _contentActivity[_dataSession].length; i++) { - if (_contentActivity[_dataSession][i] == "total_distance") { - return _contentActivity[_dataSession][i + 1].toString(); + */ + + double getTotalDistance() { + double max = 0; + for (int i = contentActivity.length - 1; i != 0; i--) { + if (notNull(i, enteteCSV["Value_${_managerFile.fieldDistance}"]!)) { + double valueTmp = contentActivity[i] + [enteteCSV["Value_${_managerFile.fieldDistance}"]!]; + if (valueTmp > max) { + max = valueTmp; + } } } - return "null"; + return max; } + /* // ---------------------- FIN Distance ---------------------- // // ---------------------- Calories ---------------------- // @@ -188,8 +258,8 @@ class ActivityOfUser { } } return result; - } - + }*/ + /* String getTotalCalorie() { for (int i = 0; i < _contentActivity[_dataSession].length; i++) { if (_contentActivity[_dataSession][i] == "total_calories") { @@ -197,11 +267,16 @@ class ActivityOfUser { } } return "null"; + }*/ + + String getTotalCalorie() { + return "NULL"; } // ---------------------- FIN Calories ---------------------- // // ---------------------- Step ------------------------------// + /* String getTotalSteps() { for (int i = 0; i < _contentActivity[_dataSession].length; i++) { if (_contentActivity[_dataSession][i] == "total_strides") { @@ -209,10 +284,21 @@ class ActivityOfUser { } } return "null"; + }*/ + + int getTotalSteps() { + for (int i = contentActivity.length; i != 0; i--) { + if (notNull(i, enteteCSV["Value_${_managerFile.fieldTotalStep}"]!)) { + return contentActivity[i] + [enteteCSV["Value_${_managerFile.fieldTotalStep}"]!]; + } + } + return 0; } // ----------------------- FIN Step ------------------------ // // ------------------------- Time ----------------------------- // + /* String getTotalTime() { for (int i = 0; i < _contentActivity[_dataSession].length; i++) { if (_contentActivity[_dataSession][i] == "total_elapsed_time") { @@ -220,10 +306,21 @@ class ActivityOfUser { } } return "null"; + }*/ + + int getTotalTime() { + for (int i = contentActivity.length - 1; i != 0; i--) { + if (notNull(i, enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!)) { + return contentActivity[i] + [enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!]; + } + } + return 0; } // ---------------------------- FIN time -------------------- // // ---------------------------------------- Altitude -------------------- // + /* List getAltitudeWithTime() { List result = List.empty(growable: true); int firtTimeStamp = 0; @@ -239,8 +336,23 @@ class ActivityOfUser { } } return result; - } + }*/ + // --- Fichier CSV --- // + double getMaxAltitude() { + double max = 0; + for (int i = 0; i < contentActivity.length; i++) { + if (notNull(i, enteteCSV["Value_${_managerFile.fieldAltitude}"]!)) { + double valueTmp = contentActivity[i] + [enteteCSV["Value_${_managerFile.fieldAltitude}"]!]; + if (valueTmp > max) { + max = valueTmp; + } + } + } + return max; + } + /* double getMaxAltitude() { for (int i = 4; i < _contentActivity[_dataSession].length; i++) { if (_contentActivity[_dataSession][i] == "max_altitude") { @@ -248,8 +360,23 @@ class ActivityOfUser { } } return 0.0; - } + }*/ + // --- Fichier CSV --- // + double getMinAltitude() { + double min = 5000; + for (int i = 0; i < contentActivity.length; i++) { + if (notNull(i, enteteCSV["Value_${_managerFile.fieldAltitude}"]!)) { + double valueTmp = contentActivity[i] + [enteteCSV["Value_${_managerFile.fieldAltitude}"]!]; + if (valueTmp < min) { + min = valueTmp; + } + } + } + return min; + } + /* double getMinAltitude() { for (int i = 4; i < _contentActivity[_dataSession].length; i++) { if (_contentActivity[_dataSession][i] == "min_altitude") { @@ -257,7 +384,9 @@ class ActivityOfUser { } } return 0.0; - } + }*/ + + /* // -------------------------- FIN altitude ---------------------- // // -------------------------- Speed ---------------------- // @@ -283,8 +412,33 @@ class ActivityOfUser { } } return result; - } + }*/ + // -- CSV -- // + List getSpeedWithTimeActivity() { + List result = List.empty(growable: true); + int firstTimestamp = 0; + + for (int i = 0; i < contentActivity.length; i++) { + if (notNull(i, enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!) && + notNull(i, enteteCSV["Value_${_managerFile.fieldSpeed}"]!)) { + if (firstTimestamp == 0) { + firstTimestamp = contentActivity[i] + [enteteCSV["Value_${_managerFile.fieldTimeStamp}"]!]; + } + result.add(DataPoint( + (((contentActivity[i][enteteCSV[ + "Value_${_managerFile.fieldTimeStamp}"]!]) - + firstTimestamp) ~/ + 100) + .toDouble(), + contentActivity[i] + [enteteCSV["Value_${_managerFile.fieldSpeed}"]!])); + } + } + return result; + } + /* List getSpeedWithTimeActivity() { List result = List.empty(growable: true); int firtTimeStamp = 0; @@ -308,8 +462,23 @@ class ActivityOfUser { } } return result; - } + }*/ + // Retourne la Speed Max (Fichier CSV) + double getMaxSpeed() { + double max = 0.00; + for (int i = 0; i < contentActivity.length; i++) { + if (notNull(i, enteteCSV["Value_${_managerFile.fieldSpeed}"]!)) { + double valueTmp = + contentActivity[i][enteteCSV["Value_${_managerFile.fieldSpeed}"]!]; + if (valueTmp > max) { + max = valueTmp; + } + } + } + return max; + } + /* double getMaxSpeed() { for (int i = 4; i < _contentActivity[_dataSession].length; i++) { if (_contentActivity[_dataSession][i] == "max_speed") { @@ -317,8 +486,22 @@ class ActivityOfUser { } } return 0.0; - } + }*/ + // Retourne avg Max (Fichier CSV) + double getAvgSpeed() { + double somme = 0; + int nb = 0; + for (int i = 0; i < contentActivity.length; i++) { + if (notNull(i, enteteCSV["Value_${_managerFile.fieldSpeed}"]!)) { + somme += + contentActivity[i][enteteCSV["Value_${_managerFile.fieldSpeed}"]!]; + nb++; + } + } + return somme / nb; + } + /* double getAvgSpeed() { for (int i = 4; i < _contentActivity[_dataSession].length; i++) { if (_contentActivity[_dataSession][i] == "avg_speed") { @@ -326,12 +509,31 @@ class ActivityOfUser { } } return 0.0; - } + }*/ // -------------------------- FIN Speed ---------------------- // // -------------------------- Localisation ------------------- // + // Retourne les positions (Fichier CSV) + List getPosition() { + List list = List.empty(growable: true); + + for (int i = 0; i < contentActivity.length; i++) { + if (notNull( + i, enteteCSV["Value_${_managerFile.fieldPositionLatitude}"]!) && + notNull( + i, enteteCSV["Value_${_managerFile.fieldPositionLongitude}"]!)) { + list.add(LatLng( + contentActivity[i] + [enteteCSV["Value_${_managerFile.fieldPositionLatitude}"]!], + contentActivity[i] + [enteteCSV["Value_${_managerFile.fieldPositionLongitude}"]!])); + } + } + return list; + } + /* List getPosition() { List list = List.empty(growable: true); diff --git a/lib/modele/manager_file.dart b/lib/modele/manager_file.dart index 1a58ee9..35aa968 100644 --- a/lib/modele/manager_file.dart +++ b/lib/modele/manager_file.dart @@ -11,12 +11,18 @@ class ManagerFile { final String _fieldPositionLongitude = "position_long"; final String _fieldDistance = "distance"; final String _fieldBPM = "heart_rate"; + final String _fieldSpeed = "speed"; + final String _fieldAltitude = "altitude"; + final String _fieldTotalStep = "total_strides"; // -- Getter field String get fieldTimeStamp => _fieldTimestamp; String get fieldPositionLatitude => _fieldPositionLatitue; String get fieldPositionLongitude => _fieldPositionLongitude; String get fieldDistance => _fieldDistance; String get fielBPM => _fieldBPM; + String get fieldSpeed => _fieldSpeed; + String get fieldAltitude => _fieldAltitude; + String get fieldTotalStep => _fieldTotalStep; List allowedFieldWalking = List.empty(growable: true); @@ -26,7 +32,10 @@ class ManagerFile { _fieldPositionLatitue, _fieldPositionLongitude, _fieldDistance, - _fieldBPM + _fieldBPM, + _fieldSpeed, + _fieldAltitude, + _fieldTotalStep ]; } @@ -92,7 +101,7 @@ class ManagerFile { } // -- Read the byte of file CSV -- // - List> convertByteIntoCSV(Uint8List bytes) { + List> convertByteIntoCSV(Uint8List bytes) { return const CsvToListConverter().convert(utf8.decode(bytes)); } diff --git a/lib/modele/utile/home_view/home_view_util.dart b/lib/modele/utile/home_view/home_view_util.dart index f6591d5..c909b31 100644 --- a/lib/modele/utile/home_view/home_view_util.dart +++ b/lib/modele/utile/home_view/home_view_util.dart @@ -2,16 +2,23 @@ import 'package:fl_chart/fl_chart.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/manager_file.dart'; import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/modele/utile/home_view/data_home_view.dart'; class HomeViewUtil { DataHomeView initData(BuildContext context) { - ActivityOfUser activity = Provider.of(context).listActivity[0]; + ManagerFile _managerFile = ManagerFile(); - List bpmSecondes = activity.getHeartRateWithTime(); - List vitesseSecondes = activity.getSpeedWithTime(); - List altitudeSeconde = activity.getAltitudeWithTime(); + ActivityOfUser activity = Provider.of(context).listActivity[0]; + //List bpmSecondes = activity.getHeartRateWithTime(); + List bpmSecondes = activity.getXWithTime(_managerFile.fielBPM); + //List vitesseSecondes = activity.getSpeedWithTime(); + List vitesseSecondes = + activity.getXWithTime(_managerFile.fieldSpeed); + //List altitudeSeconde = activity.getAltitudeWithTime(); + List altitudeSeconde = + activity.getXWithTime(_managerFile.fieldAltitude); List bpmSecondes2 = List.from(bpmSecondes); diff --git a/lib/modele/utile/list_activity.dart/list_activity_utile.dart b/lib/modele/utile/list_activity.dart/list_activity_utile.dart index 596a990..08c8faa 100644 --- a/lib/modele/utile/list_activity.dart/list_activity_utile.dart +++ b/lib/modele/utile/list_activity.dart/list_activity_utile.dart @@ -28,8 +28,9 @@ class ListActivityUtile { Provider.of(context, listen: false).listActivity[0].contentActivity = await _managerFile.readFitFileWhithFile(file); */ + Provider.of(context, listen: false).listActivity[0].contentActivity = - _managerFile.convertByteIntoCSV(result.item2); + List.from(_managerFile.convertByteIntoCSV(result.item2)); } Future getContentOnTheFirstFileWeb(BuildContext context) async { @@ -41,7 +42,8 @@ class ListActivityUtile { //print(result); return; } + /* Provider.of(context, listen: false).listActivity[0].contentActivity = - _managerFile.convertByteIntoCSV(result.item2); + _managerFile.convertByteIntoCSV(result.item2);*/ } } diff --git a/lib/view/activity/mobile/mobile_list_activity.dart b/lib/view/activity/mobile/mobile_list_activity.dart index fee5882..075ffd6 100644 --- a/lib/view/activity/mobile/mobile_list_activity.dart +++ b/lib/view/activity/mobile/mobile_list_activity.dart @@ -70,14 +70,12 @@ class _MobileListActivity extends State { String csvString = const ListToCsvConverter().convert(csv); Uint8List byteCSV = Uint8List.fromList(utf8.encode(csvString)); // --- Save Local - // --- Api String categoryActivity = filename.split("_").first.toLowerCase(); String dateActivity = filename.split("_")[1].split("T").first; Tuple2 result = await _strategy.uploadFileByte( token, byteCSV, filename, categoryActivity, dateActivity); - if (result.item1 == false) { // Afficher msg d'erreur print("Upload - ${result.item2}"); @@ -87,7 +85,9 @@ class _MobileListActivity extends State { } void getFiles(String token) async { + bool check = false; Tuple2 result = await _strategy.getFiles(token); + if (result.item1 == false) { print("GetFiles - ${result.item2}"); // Afficher une message d'erreur @@ -101,8 +101,11 @@ class _MobileListActivity extends State { element["category"].toString(), element["uuid"].toString(), element["filename"].toString())); + check = true; + } + if (check) { + await _utile.getContentOnTheFirstFileMobile(context); } - await _utile.getContentOnTheFirstFileMobile(context); return; } diff --git a/lib/view/activity/web/web_list_activity.dart b/lib/view/activity/web/web_list_activity.dart index 14731ff..3923c10 100644 --- a/lib/view/activity/web/web_list_activity.dart +++ b/lib/view/activity/web/web_list_activity.dart @@ -25,6 +25,8 @@ class _WebListActivityState extends State { IDataStrategy strategy = RequestApi(); final ListActivityUtile _utile = ListActivityUtile(); int firstActivityIndex = 0; + final IDataStrategy _strategy = RequestApi(); + /* void readFile(html.File file) async { ManagerFile x = ManagerFile(); @@ -44,6 +46,17 @@ class _WebListActivityState extends State { }); }*/ + Future deleteFileOnBDD(String token, String fileUuid) async { + Tuple2 result = await _strategy.deleteFile(token, fileUuid); + if (!result.item1) { + print(fileUuid); + print("msg d'erreur"); + print(result.item2); + return false; + } + return true; + } + void addFile(html.File file) async { final reader = html.FileReader(); reader.readAsArrayBuffer(file); @@ -74,6 +87,7 @@ class _WebListActivityState extends State { // -- On doit garder cet fonction dans la page pour pouvoir afficher les msg -- // void getFiles() async { + bool check = false; Tuple2 result = await strategy .getFiles(Provider.of(context, listen: false).token); if (result.item1 == false) { @@ -89,15 +103,17 @@ class _WebListActivityState extends State { element["category"].toString(), element["uuid"].toString(), element["filename"].toString())); + check = true; + } + if (check) { + await _utile.getContentOnTheFirstFileWeb(context); } - await _utile.getContentOnTheFirstFileWeb(context); return; } @override Widget build(BuildContext context) { var media = MediaQuery.of(context).size; - print("tttt"); return Scaffold( backgroundColor: TColor.white, body: SingleChildScrollView( @@ -194,9 +210,14 @@ class _WebListActivityState extends State { }, child: WorkoutRow( wObj: activityMap, - onDelete: () { - Provider.of(context, listen: false) - .removeActivity(activityObj); + onDelete: () async { + if (await deleteFileOnBDD( + Provider.of(context, listen: false) + .token, + activityObj.fileUuid)) { + Provider.of(context, listen: false) + .removeActivity(activityObj); + } }, onClick: () { Provider.of(context, listen: false) diff --git a/lib/view/home/mobile/mobile_homeview.dart b/lib/view/home/mobile/mobile_homeview.dart index b051c31..e5a79ab 100644 --- a/lib/view/home/mobile/mobile_homeview.dart +++ b/lib/view/home/mobile/mobile_homeview.dart @@ -28,6 +28,7 @@ class _MobileHomeView extends State { int maxBpm = context.watch().listActivity[0].getMaxBpm(); int minBpm = context.watch().listActivity[0].getMinBpm(); int avgBpm = context.watch().listActivity[0].getAvgBpm(); + // -- Altitude -- // double minAltitude = context.watch().listActivity[0].getMinAltitude(); double maxAltitude = context.watch().listActivity[0].getMaxAltitude(); @@ -35,7 +36,6 @@ class _MobileHomeView extends State { // -- Speed -- // double maxSpeed = context.watch().listActivity[0].getMaxSpeed(); double avgSpeed = context.watch().listActivity[0].getAvgSpeed(); - data = HomeViewUtil().initData(context); return Scaffold(