getData ActivityInfo

pull/4/head
Enzo 2 years ago
parent 8a92895371
commit 6036337e90

@ -81,7 +81,7 @@ class WorkoutRow extends StatelessWidget {
), ),
), ),
Text( Text(
"Dénivelé positif : ${wObj["denivelePositif"].toString()}", "Dénivelé positif : ${wObj["DenivelePositif"].toString()}",
style: TextStyle( style: TextStyle(
color: TColor.black, color: TColor.black,
fontSize: 12, fontSize: 12,

@ -18,10 +18,22 @@ class WebBpmByTime extends StatefulWidget {
class _WebBpmByTime extends State<WebBpmByTime> { class _WebBpmByTime extends State<WebBpmByTime> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final double maxY = final double maxY = context
context.watch<User>().managerSelectedActivity.getMaxBpm() + 2; .watch<User>()
final double minY = .managerSelectedActivity
context.watch<User>().managerSelectedActivity.getMinBpm() - 2; .activitySelected
.first
.activityInfo
.bpmMax +
2;
final double minY = context
.watch<User>()
.managerSelectedActivity
.activitySelected
.first
.activityInfo
.bpmMin -
2;
final double maxX = final double maxX =
widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x; widget.data.bpmSecondes[widget.data.bpmSecondes.length - 1].x;
const double minX = 0.0; const double minX = 0.0;

@ -1,4 +1,3 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/modele/user.dart'; import 'package:smartfit_app_mobile/modele/user.dart';
@ -15,7 +14,10 @@ class Stats extends StatelessWidget {
.toString(); .toString();
String heartrate = Provider.of<User>(context, listen: false) String heartrate = Provider.of<User>(context, listen: false)
.managerSelectedActivity .managerSelectedActivity
.getAvgBpm() .activitySelected
.first
.activityInfo
.bpmAvg
.toString(); .toString();
String time = Provider.of<User>(context, listen: false) String time = Provider.of<User>(context, listen: false)
.managerSelectedActivity .managerSelectedActivity

@ -1,12 +1,11 @@
import 'package:smartfit_app_mobile/modele/activity_info/activity_info.dart';
class ActivityOfUser { class ActivityOfUser {
final ActivityInfo _activityInfo;
// A afficher // A afficher
final String _categorie; final String _categorie;
final String _date;
final String _fileUuid; final String _fileUuid;
final String _nameFile; final String _nameFile;
final double _timeActivity;
final double _denivelePositif;
final double _deniveleNegatif;
// ------------ // // ------------ //
late String _imageName; late String _imageName;
@ -16,9 +15,7 @@ class ActivityOfUser {
String get fileUuid => _fileUuid; String get fileUuid => _fileUuid;
String get nameFile => _nameFile; String get nameFile => _nameFile;
String get category => _categorie; String get category => _categorie;
double get time => _timeActivity; ActivityInfo get activityInfo => _activityInfo;
double get denivelePos => _denivelePositif;
double get deniveleNeg => _deniveleNegatif;
Map<String, int> get enteteCSV => _enteteCSV; Map<String, int> get enteteCSV => _enteteCSV;
// -- Getter/Setter -- Ancien // // -- Getter/Setter -- Ancien //
@ -31,8 +28,8 @@ class ActivityOfUser {
_contentActivity.removeAt(0); _contentActivity.removeAt(0);
} }
ActivityOfUser(this._categorie, this._date, this._fileUuid, this._nameFile, ActivityOfUser(
this._timeActivity, this._denivelePositif, this._deniveleNegatif) { this._activityInfo, this._categorie, this._fileUuid, this._nameFile) {
// Mettre dans une fonction appart // Mettre dans une fonction appart
if (_categorie == "Walking") { if (_categorie == "Walking") {
_imageName = "assets/img/workout1.svg"; _imageName = "assets/img/workout1.svg";
@ -45,13 +42,14 @@ class ActivityOfUser {
// -------------------------- FIN Localisation ---------------------- // // -------------------------- FIN Localisation ---------------------- //
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {
return { Map<String, dynamic> map = {
'categorie': _categorie, 'categorie': _categorie,
'image': _imageName, 'image': _imageName,
'date': _date, 'date': _activityInfo.startTime,
'time': _timeActivity, 'time': _activityInfo.timeOfActivity,
"denivelePositif": _denivelePositif,
"deniveleNegatif": _deniveleNegatif,
}; };
map.addAll(_activityInfo.toMap());
return map;
} }
} }

@ -1,5 +1,9 @@
import 'package:smartfit_app_mobile/modele/manager_file.dart';
abstract class ActivityInfo { abstract class ActivityInfo {
// -- Time -- // ManagerFile managerFile = ManagerFile();
// -- Time -- // Ne pas calculer (Ligne session)
String startTime = "2000-01-01"; String startTime = "2000-01-01";
double timeOfActivity = 0.0; double timeOfActivity = 0.0;
@ -9,7 +13,54 @@ abstract class ActivityInfo {
int bpmAvg = 0; int bpmAvg = 0;
// -- Fonction pour lire le csv et remplir la classe -- // // -- Fonction pour lire le csv et remplir la classe -- //
ActivityInfo getData(List<List<String>> csv); ActivityInfo getData(List<List<String>> csv) {
// -- BPM -- //
int bpmSomme = 0;
int bpmNb = 0;
Map<String, int> enteteCSV = getEntete(csv.first);
for (int i = 1; i < csv.length; i++) {
// -- BPM -- //
if (!isNull(enteteCSV["Value_${managerFile.fielBPM}"]!, csv[i])) {
int value =
int.parse(csv[i][enteteCSV["Value_${managerFile.fielBPM}"]!]);
bpmSomme += value;
bpmNb += 1;
if (value > bpmMax) {
bpmMax = value;
}
if (value < bpmMin) {
bpmMin = value;
}
}
}
// -- BPM -- //
bpmAvg = bpmSomme ~/ bpmNb;
return this;
}
Map<String, int> getEntete(List<dynamic> content) {
Map<String, int> enteteCSV = {};
for (int i = 0; i < content.length; i++) {
enteteCSV.addAll({content[i]: i});
}
return enteteCSV;
}
bool isNull(int colonne, List<dynamic> ligne) {
return ligne[colonne] == "null";
}
String toJson(); String toJson();
Map<String, dynamic> toMap();
ActivityInfo.fromJson(Map<String, dynamic>? map) {
if (map == null) {
return;
}
startTime = map["startTime"];
timeOfActivity = map["timeOfActivity"].toDouble();
bpmAvg = map["bpmAvg"];
bpmMax = map["bpmMax"];
bpmMin = map["bpmMin"];
}
} }

@ -2,27 +2,16 @@ import 'dart:convert';
import 'package:smartfit_app_mobile/modele/activity_info/activity_info.dart'; import 'package:smartfit_app_mobile/modele/activity_info/activity_info.dart';
class ActivityInfoGeneric implements ActivityInfo { class ActivityInfoGeneric extends ActivityInfo {
ActivityInfoGeneric.fromJson(super.map) : super.fromJson();
ActivityInfoGeneric() : super.fromJson(null);
// ------- Ajout --------- // // ------- Ajout --------- //
// ------- Activity Info -------- // // ------- Activity Info -------- //
@override
late int bpmAvg;
@override
late int bpmMax;
@override
late int bpmMin;
@override
late String startTime;
@override
late double timeOfActivity;
@override @override
ActivityInfo getData(List<List<String>> csv) { ActivityInfo getData(List<List<String>> csv) {
super.getData(csv);
return this; return this;
} }
@ -38,4 +27,9 @@ class ActivityInfoGeneric implements ActivityInfo {
}; };
return jsonEncode(jsonMap); return jsonEncode(jsonMap);
} }
@override
Map<String, dynamic> toMap() {
return {};
}
} }

@ -2,32 +2,41 @@ import 'dart:convert';
import 'package:smartfit_app_mobile/modele/activity_info/activity_info.dart'; import 'package:smartfit_app_mobile/modele/activity_info/activity_info.dart';
class ActivityInfoWalking implements ActivityInfo { class ActivityInfoWalking extends ActivityInfo {
ActivityInfoWalking.fromJson(map) : super.fromJson(map) {
deniveleNegatif = map["deniveleNegatif"].toDouble();
denivelePositif = map["denivelePositif"].toDouble();
}
ActivityInfoWalking() : super.fromJson(null);
// ------- Ajout --------- // // ------- Ajout --------- //
// -- Denivelé -- // // -- Denivelé -- //
double denivelePositif = 0.0; double denivelePositif = 0.0;
double deniveleNegatif = 0.0; double deniveleNegatif = 0.0;
// ------- Activity Info -------- //
@override
int bpmAvg = 0;
@override
int bpmMax = 0;
@override
int bpmMin = 0;
@override @override
String startTime = "2000-01-01"; ActivityInfo getData(List<List<String>> csv) {
super.getData(csv);
@override Map<String, int> enteteCSV = getEntete(csv.first);
double timeOfActivity = 0.0; // -- Denivelé -- //
double lastDenivele = 0.0;
@override // -- Lecture du corps -- //
ActivityInfo getData(List<List<String>> csv) { for (int i = 1; i < csv.length; i++) {
for (int i = 0; i < csv.length; i++) {} // -- Denivele -- //
if (!isNull(enteteCSV["Value_${managerFile.fieldAltitude}"]!, csv[i])) {
double value = double.parse(
csv[i][enteteCSV["Value_${managerFile.fieldAltitude}"]!]);
if (value > lastDenivele) {
denivelePositif += value - lastDenivele;
} else {
deniveleNegatif += (value - lastDenivele) * -1;
}
lastDenivele = value;
}
}
return this; return this;
} }
@ -35,14 +44,25 @@ class ActivityInfoWalking implements ActivityInfo {
// Méthode pour convertir les attributs en JSON // Méthode pour convertir les attributs en JSON
String toJson() { String toJson() {
Map<String, dynamic> jsonMap = { Map<String, dynamic> jsonMap = {
// Unique
'denivelePositif': denivelePositif, 'denivelePositif': denivelePositif,
'deniveleNegatif': deniveleNegatif, 'deniveleNegatif': deniveleNegatif,
// All
'bpmAvg': bpmAvg, 'bpmAvg': bpmAvg,
'bpmMax': bpmMax, 'bpmMax': bpmMax,
'bpmMin': bpmMin, 'bpmMin': bpmMin,
// Ligne session
'startTime': startTime, 'startTime': startTime,
'timeOfActivity': timeOfActivity, 'timeOfActivity': timeOfActivity,
}; };
return jsonEncode(jsonMap); return jsonEncode(jsonMap);
} }
@override
Map<String, dynamic> toMap() {
return {
"DenivelePositif": denivelePositif,
"DeniveleNegatif": denivelePositif
};
}
} }

@ -1,6 +1,7 @@
import 'dart:io'; import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:smartfit_app_mobile/modele/activity_info/activity_info.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
abstract class IDataStrategy { abstract class IDataStrategy {
@ -19,8 +20,13 @@ abstract class IDataStrategy {
// Upload file on BDD // Upload file on BDD
Future<Tuple2<bool, String>> uploadFile(String token, File file); Future<Tuple2<bool, String>> uploadFile(String token, File file);
Future<Tuple2<bool, String>> uploadFileByte(String token, Future<Tuple2<bool, String>> uploadFileByte(
Uint8List contentFile, String nameFile, String category, String date); String token,
Uint8List contentFile,
String nameFile,
String category,
String date,
ActivityInfo activityInfo);
// Get one file by id // Get one file by id
Future<Tuple2> getFile(String token, String fileUuid); Future<Tuple2> getFile(String token, String fileUuid);

@ -2,11 +2,12 @@ import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:smartfit_app_mobile/modele/activity_info/activity_info.dart';
import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart'; import 'package:smartfit_app_mobile/modele/api/i_data_strategy.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
class RequestApi extends IDataStrategy { class RequestApi implements IDataStrategy {
// Faire attention au URL // Faire attention au URL
String urlApi = String urlApi =
"https://codefirst.iut.uca.fr/containers/SmartFit-smartfit_api"; "https://codefirst.iut.uca.fr/containers/SmartFit-smartfit_api";
@ -32,8 +33,6 @@ class RequestApi extends IDataStrategy {
if ((response.statusCode == 404)) { if ((response.statusCode == 404)) {
return const Tuple2(false, "404 - NOT FOUND"); return const Tuple2(false, "404 - NOT FOUND");
} }
print(response.statusCode);
print(response.body);
return const Tuple2(false, "Fail"); return const Tuple2(false, "Fail");
} }
@ -193,7 +192,8 @@ class RequestApi extends IDataStrategy {
Uint8List contentFile, Uint8List contentFile,
String nameFile, String nameFile,
String category, String category,
String date) async { String date,
ActivityInfo activityInfo) async {
final uri = Uri.parse('$urlApi/user/files'); final uri = Uri.parse('$urlApi/user/files');
Map<String, String> headers = {'Authorization': token}; Map<String, String> headers = {'Authorization': token};
@ -207,6 +207,7 @@ class RequestApi extends IDataStrategy {
request.headers.addAll(headers); request.headers.addAll(headers);
request.fields["SmartFit_Category"] = category; request.fields["SmartFit_Category"] = category;
request.fields["SmartFit_Date"] = date; request.fields["SmartFit_Date"] = date;
request.fields["info"] = activityInfo.toJson();
final response = await request.send(); final response = await request.send();

@ -1,4 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:csv/csv.dart'; import 'package:csv/csv.dart';
import 'package:fit_tool/fit_tool.dart'; import 'package:fit_tool/fit_tool.dart';
@ -25,7 +26,7 @@ class ManagerFile {
static const String _session = "session"; static const String _session = "session";
static const String _startTime = "start_time"; static const String _startTime = "start_time";
static const String _sport = "sport"; static const String _sport = "sport";
static const String _timeActivity = "total_elapsed_time"; //static const String _timeActivity = "total_elapsed_time";
// -- Getter field // -- Getter field
String get fieldTimeStamp => _fieldTimestamp; String get fieldTimeStamp => _fieldTimestamp;

@ -80,7 +80,7 @@ class ManagerSelectedActivity {
} }
// ----------------- BPM ------------------ // // ----------------- BPM ------------------ //
/*
// Retourne le BPM Max (Fichier CSV) // Retourne le BPM Max (Fichier CSV)
int getMaxBpm() { int getMaxBpm() {
int max = 0; int max = 0;
@ -98,8 +98,8 @@ class ManagerSelectedActivity {
} }
return max; return max;
} }*/
/*
// Retourne le BPM Min (Fichier CSV) // Retourne le BPM Min (Fichier CSV)
int getMinBpm() { int getMinBpm() {
int min = 300; int min = 300;
@ -134,7 +134,7 @@ class ManagerSelectedActivity {
} }
} }
return somme ~/ nb; return somme ~/ nb;
} }*/
double getAvgAltitude() { double getAvgAltitude() {
double somme = 0; double somme = 0;

@ -1,6 +1,6 @@
import 'package:flutter/material.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/activity.dart';
import 'package:smartfit_app_mobile/modele/activity_info/activity_info_walking.dart';
import 'package:smartfit_app_mobile/modele/manager_selected_activity.dart'; import 'package:smartfit_app_mobile/modele/manager_selected_activity.dart';
class User extends ChangeNotifier { class User extends ChangeNotifier {
@ -31,7 +31,7 @@ class User extends ChangeNotifier {
double getTotalTimeAllActivity() { double getTotalTimeAllActivity() {
double totalTime = 0.0; double totalTime = 0.0;
for (ActivityOfUser activity in listActivity) { for (ActivityOfUser activity in listActivity) {
totalTime += activity.time; totalTime += activity.activityInfo.timeOfActivity;
} }
return totalTime; return totalTime;
} }
@ -39,7 +39,12 @@ class User extends ChangeNotifier {
double getTotalDenivelePositif() { double getTotalDenivelePositif() {
double totalDevPos = 0.0; double totalDevPos = 0.0;
for (ActivityOfUser activity in listActivity) { for (ActivityOfUser activity in listActivity) {
totalDevPos += activity.denivelePos; try {
totalDevPos +=
(activity.activityInfo as ActivityInfoWalking).denivelePositif;
} catch (e) {
//print(e);
}
} }
return totalDevPos; return totalDevPos;
} }
@ -47,7 +52,12 @@ class User extends ChangeNotifier {
double getTotalDeniveleNegatif() { double getTotalDeniveleNegatif() {
double totalDevNeg = 0.0; double totalDevNeg = 0.0;
for (ActivityOfUser activity in listActivity) { for (ActivityOfUser activity in listActivity) {
totalDevNeg += activity.denivelePos; try {
totalDevNeg +=
(activity.activityInfo as ActivityInfoWalking).deniveleNegatif;
} catch (e) {
//print(e);
}
} }
return totalDevNeg; return totalDevNeg;
} }

@ -6,6 +6,7 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:smartfit_app_mobile/modele/activity.dart'; import 'package:smartfit_app_mobile/modele/activity.dart';
import 'package:smartfit_app_mobile/modele/activity_info/activity_info.dart'; import 'package:smartfit_app_mobile/modele/activity_info/activity_info.dart';
import 'package:smartfit_app_mobile/modele/activity_info/activity_info_walking.dart';
import 'package:smartfit_app_mobile/modele/api/i_data_strategy.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/api/request_api.dart';
import 'package:smartfit_app_mobile/modele/manager_file.dart'; import 'package:smartfit_app_mobile/modele/manager_file.dart';
@ -50,18 +51,13 @@ class ListActivityUtile {
Provider.of<User>(context, listen: false).listActivity.clear(); Provider.of<User>(context, listen: false).listActivity.clear();
notZero = true; notZero = true;
} }
// -- connaitre le type de categorie pour changer le type d'info -- //
Provider.of<User>(context, listen: false).addActivity(ActivityOfUser( Provider.of<User>(context, listen: false).addActivity(ActivityOfUser(
ActivityInfoWalking.fromJson(element["info"]),
element["category"].toString(), element["category"].toString(),
element["creation_date"].toString(),
element["uuid"].toString(), element["uuid"].toString(),
element["filename"].toString(), element["filename"].toString()));
/*
element["timeActivity"],
element["denivelePositif"],
element["deniveleNegatif"]*/
0.0,
0.0,
0.0));
} }
/* /*
if (notZero) { if (notZero) {
@ -80,11 +76,16 @@ class ListActivityUtile {
Uint8List byteCSV = Uint8List.fromList(utf8.encode(csvString)); Uint8List byteCSV = Uint8List.fromList(utf8.encode(csvString));
// --- Save Local // --- Save Local
// --- Api // --- Api
print("Start"); //ManagerFile x = ManagerFile();
print(resultData.item3.toJson()); //await File("${await x.localPath}\\test.csv").writeAsString(csvString);
Tuple2<bool, String> result = await _strategy.uploadFileByte( Tuple2<bool, String> result = await _strategy.uploadFileByte(
token, byteCSV, filename, resultData.item4, resultData.item3.startTime); token,
byteCSV,
filename,
resultData.item4,
resultData.item3.startTime,
resultData.item3);
if (result.item1 == false) { if (result.item1 == false) {
return Tuple2(false, result.item2); return Tuple2(false, result.item2);
} }

@ -30,9 +30,12 @@ class _MobileHomeView extends State<MobileHomeView> {
data = HomeViewUtil().initData(context); data = HomeViewUtil().initData(context);
// -- BPM -- // // -- BPM -- //
data.maxBPM = managerSelectedActivity.getMaxBpm(); data.maxBPM =
data.minBPM = managerSelectedActivity.getMinBpm(); managerSelectedActivity.activitySelected.first.activityInfo.bpmMax;
int avgBpm = managerSelectedActivity.getAvgBpm(); data.minBPM =
managerSelectedActivity.activitySelected.first.activityInfo.bpmMin;
int avgBpm =
managerSelectedActivity.activitySelected.first.activityInfo.bpmAvg;
// -- Altitude -- // // -- Altitude -- //
double minAltitude = managerSelectedActivity.getMinAltitude(); double minAltitude = managerSelectedActivity.getMinAltitude();

@ -22,8 +22,27 @@ class _StatAtivities extends State<StatAtivities> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
var media = MediaQuery.of(context).size; var media = MediaQuery.of(context).size;
data = HomeViewUtil().initData(context); data = HomeViewUtil().initData(context);
int maxBpm = context.watch<User>().managerSelectedActivity.getMaxBpm(); int maxBpm = context
int avgBpm = context.watch<User>().managerSelectedActivity.getAvgBpm(); .watch<User>()
.managerSelectedActivity
.activitySelected
.first
.activityInfo
.bpmMax;
int minBpm = context
.watch<User>()
.managerSelectedActivity
.activitySelected
.first
.activityInfo
.bpmMin;
int avgBpm = context
.watch<User>()
.managerSelectedActivity
.activitySelected
.first
.activityInfo
.bpmAvg;
double getTotalDistance = double getTotalDistance =
context.watch<User>().managerSelectedActivity.getTotalDistance(); context.watch<User>().managerSelectedActivity.getTotalDistance();
int totalSteps = int totalSteps =
@ -54,8 +73,6 @@ class _StatAtivities extends State<StatAtivities> {
double minTemperature = double minTemperature =
context.watch<User>().managerSelectedActivity.getMinTemperature(); context.watch<User>().managerSelectedActivity.getMinTemperature();
int minBpm = context.watch<User>().managerSelectedActivity.getMinBpm();
return Scaffold( return Scaffold(
backgroundColor: TColor.white, backgroundColor: TColor.white,
body: SingleChildScrollView( body: SingleChildScrollView(

@ -25,9 +25,27 @@ class _WebHomeView extends State<WebHomeView> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
var media = MediaQuery.of(context).size; var media = MediaQuery.of(context).size;
// -- BPM -- // // -- BPM -- //
int maxBpm = context.watch<User>().managerSelectedActivity.getMaxBpm(); int maxBpm = context
int minBpm = context.watch<User>().managerSelectedActivity.getMinBpm(); .watch<User>()
int avgBpm = context.watch<User>().managerSelectedActivity.getAvgBpm(); .managerSelectedActivity
.activitySelected
.first
.activityInfo
.bpmMax;
int minBpm = context
.watch<User>()
.managerSelectedActivity
.activitySelected
.first
.activityInfo
.bpmMin;
int avgBpm = context
.watch<User>()
.managerSelectedActivity
.activitySelected
.first
.activityInfo
.bpmAvg;
// -- Altitude -- // // -- Altitude -- //
double minAltitude = double minAltitude =
context.watch<User>().managerSelectedActivity.getMinAltitude(); context.watch<User>().managerSelectedActivity.getMinAltitude();

Loading…
Cancel
Save