Skip to content

Commit

Permalink
modif
Browse files Browse the repository at this point in the history
  • Loading branch information
IUT BLAGNAC committed Dec 3, 2024
1 parent 7521952 commit ebc74ad
Show file tree
Hide file tree
Showing 7 changed files with 1,522 additions and 1,627 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.io.File;
import java.io.FileReader;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
Expand All @@ -16,6 +17,7 @@
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import sae.App;
import sae.view.AfficherGraphiqueControllerSolar;

public class AfficherDonneesControllerSolar {

Expand Down Expand Up @@ -92,57 +94,69 @@ private void actionAfficher() {
/**
* Affiche les données filtrées en fonction des attributs sélectionnés
*/
private void afficherDonneesFiltrees(JSONObject solarData, List<String> attributsSelectionnes) {
gridDynamique.getChildren().clear(); // Effacer le contenu précédent de la grille
private void afficherDonneesFiltrees(JSONObject solarData, List<String> attributsSelectionnes) {
gridDynamique.getChildren().clear(); // Effacer le contenu précédent de la grille

JSONObject solar = (JSONObject) solarData.get("solar");
if (solar == null) {
System.out.println("Aucune donnée 'solar' trouvée dans le JSON.");
return;
}

// Titre des colonnes
Label titreCle = new Label("Clé");
Label titreAttribut = new Label("Attribut");
Label titreValeur = new Label("Valeur");
gridDynamique.add(titreCle, 0, 0);
gridDynamique.add(titreAttribut, 1, 0);
gridDynamique.add(titreValeur, 2, 0);

// Mettre en valeur les titres
titreCle.setStyle("-fx-font-weight: bold;");
titreAttribut.setStyle("-fx-font-weight: bold;");
titreValeur.setStyle("-fx-font-weight: bold;");

int rowIndex = 1; // Commence après la ligne des titres

// Utilisation d'un Set pour éviter d'afficher les clés en double
Set<String> displayedKeys = new HashSet<>();

for (Object key : solar.keySet()) {
// Si la clé a déjà été affichée, on la saute
if (displayedKeys.contains(key.toString())) {
continue;
}

JSONObject solarEntry = (JSONObject) solar.get(key);
gridDynamique.add(new Label(key.toString()), 0, rowIndex);
displayedKeys.add(key.toString()); // Ajouter la clé au Set pour éviter les doublons

// Ajouter les attributs sélectionnés
for (String attribut : attributsSelectionnes) {
Object value = solarEntry.get(attribut); // Récupérer la valeur de l'attribut
String texte = attribut + " : " + (value != null ? formatValue(value) : "Non disponible");

// Mettre les données dans des colonnes séparées
gridDynamique.add(new Label(attribut), 1, rowIndex);
gridDynamique.add(new Label(texte), 2, rowIndex++);
}
JSONObject solar = (JSONObject) solarData.get("solar");
if (solar == null) {
System.out.println("Aucune donnée 'solar' trouvée dans le JSON.");
return;
}

// Ajouter un espace après chaque entrée de clé pour un meilleur espacement visuel
gridDynamique.add(new Label(" "), 0, rowIndex++); // Espacement entre les clés
// Titre des colonnes
Label titreCle = new Label("Clé");
Label titreAttribut = new Label("Attribut");
Label titreValeur = new Label("Valeur");
gridDynamique.add(titreCle, 0, 0);
gridDynamique.add(titreAttribut, 1, 0);
gridDynamique.add(titreValeur, 2, 0);

// Mettre en valeur les titres
titreCle.setStyle("-fx-font-weight: bold;");
titreAttribut.setStyle("-fx-font-weight: bold;");
titreValeur.setStyle("-fx-font-weight: bold;");

int rowIndex = 1; // Commence après la ligne des titres

// Utilisation d'un Set pour éviter d'afficher les clés en double
Set<String> displayedKeys = new HashSet<>();

// Trier les entrées par clé dans l'ordre décroissant des valeurs numériques
List<Map.Entry<String, JSONObject>> sortedEntries = new ArrayList<>(solar.entrySet());
sortedEntries.sort((entry1, entry2) -> {
try {
// Convertir les clés en entiers pour effectuer un tri numérique
Integer key1 = Integer.valueOf(entry1.getKey());
Integer key2 = Integer.valueOf(entry2.getKey());
return key2.compareTo(key1); // Ordre décroissant
} catch (NumberFormatException e) {
// Si les clés ne sont pas des entiers valides, les laisser dans l'ordre d'origine
return entry1.getKey().compareTo(entry2.getKey());
}
});

// Ajouter les entrées triées à la grille
for (Map.Entry<String, JSONObject> entry : sortedEntries) {
String key = entry.getKey();
JSONObject solarEntry = entry.getValue();
gridDynamique.add(new Label(key), 0, rowIndex);
displayedKeys.add(key); // Ajouter la clé au Set pour éviter les doublons

// Ajouter les attributs sélectionnés
for (String attribut : attributsSelectionnes) {
Object value = solarEntry.get(attribut); // Récupérer la valeur de l'attribut
String texte = attribut + " : " + (value != null ? formatValue(value) : "Non disponible");

// Mettre les données dans des colonnes séparées
gridDynamique.add(new Label(attribut), 1, rowIndex);
gridDynamique.add(new Label(texte), 2, rowIndex++);
}

// Ajouter un espace après chaque entrée de clé pour un meilleur espacement visuel
gridDynamique.add(new Label(" "), 0, rowIndex++); // Espacement entre les clés
}
}


/**
* Formate la valeur pour éviter d'afficher les accolades des objets JSON
Expand All @@ -155,6 +169,20 @@ private String formatValue(Object value) {
return value != null ? value.toString() : "Non disponible";
}

@FXML
private void actionAfficherGraphique() {
if (solarData == null) {
System.out.println("Aucune donnée disponible pour afficher le graphique !");
return;
}

// Création du contrôleur pour afficher le graphique
AfficherGraphiqueControllerSolar graphController = new AfficherGraphiqueControllerSolar(solarData);
graphController.afficherGraphique(); // Affichage du graphique
}



/**
* Retour à la page précédente
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,154 +1,111 @@
package sae.view;

import java.io.File;
import java.io.FileReader;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Date;

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

import javafx.fxml.FXML;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Button;
import javafx.stage.Stage;
import sae.App;
import javafx.util.StringConverter;
import org.json.simple.JSONObject;
import java.text.SimpleDateFormat;
import java.util.Date;

public class AfficherGraphiqueControllerSolar {

@SuppressWarnings("unused")
private Stage fenetrePrincipale;

private App application;

@FXML
private LineChart<Number, Number> lineChart;
private JSONObject solarData;

@FXML
private Button butRetour;

private JSONObject solarData; // Champ pour stocker les données JSON

/**
* Configure les données de la fenêtre principale et de l'application
*/
public void setDatas(Stage fenetre, App app) {
this.application = app;
this.fenetrePrincipale = fenetre;
// Constructeur qui prend un JSONObject contenant les données
public AfficherGraphiqueControllerSolar(JSONObject solarData) {
this.solarData = solarData;
}

/**
* Appelé lorsque le bouton "Retour" est cliqué
*/
@FXML
private void actionRetour() {
Stage stage = (Stage) butRetour.getScene().getWindow();
stage.close();
}

/**
* Charger les données JSON et afficher le graphique
*/
@FXML
private void actionAfficherGraphique() {
// Charger les données JSON
chargerFichierSolar();

if (solarData == null) {
System.out.println("Aucune donnée chargée depuis le fichier JSON !");
return;
}

// Afficher le graphique basé sur currentPower et lastUpdateTime
afficherGraphique(solarData);
}
// Méthode pour afficher le graphique dans une nouvelle fenêtre
public void afficherGraphique() {
// Exécuter la création du graphique sur le thread JavaFX
Platform.runLater(() -> {
Stage stage = new Stage();
stage.setTitle("Graphique : Current Power vs Time");

// Création des axes
NumberAxis xAxis = new NumberAxis();
xAxis.setLabel("Heure");

// Limiter la plage de l'axe des X à 24 heures (24 * 60 * 60 * 1000 ms)
xAxis.setLowerBound(0); // Plage minimum en millisecondes (00:00:00)
xAxis.setUpperBound(24 * 60 * 60 * 1000); // Plage maximum en millisecondes (23:59:59)
xAxis.setTickUnit(60 * 60 * 1000); // Intervalle de ticks : 1 heure (60 min * 60 s * 1000 ms)

// Ajouter un StringConverter pour formater l'axe des X en heures et minutes
xAxis.setTickLabelFormatter(new StringConverter<Number>() {
private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");

@Override
public String toString(Number value) {
Date date = new Date(value.longValue()); // Convertir la valeur en Date
return sdf.format(date); // Formater l'heure
}

/**
* Affiche le graphique en utilisant lastUpdateTime comme abscisse et currentPower comme ordonnée
*/
private void afficherGraphique(JSONObject solarData) {
// Effacer les données précédentes du graphique
lineChart.getData().clear();

JSONObject solar = (JSONObject) solarData.get("solar");
if (solar == null) {
System.out.println("Aucune donnée 'solar' trouvée dans le JSON.");
return;
}

// Créer une série de données pour le graphique
XYChart.Series<Number, Number> series = new XYChart.Series<>();
series.setName("Current Power");

// Définir le format de la date pour afficher correctement les dates sur l'axe X
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

// Itérer sur les clés de l'objet JSON
int index = 1; // Utiliser un index pour l'axe des X
for (Object key : solar.keySet()) {
JSONObject solarEntry = (JSONObject) solar.get(key);

// Vérifier si l'attribut 'currentPower' existe et a une valeur
if (solarEntry.containsKey("currentPower")) {
JSONObject currentPower = (JSONObject) solarEntry.get("currentPower");
if (currentPower.containsKey("power")) {
Double powerValue = (Double) currentPower.get("power");

// Vérifier si 'lastUpdateTime' existe et le convertir en long (timestamp)
if (solarEntry.containsKey("lastUpdateTime")) {
String lastUpdateTimeStr = (String) solarEntry.get("lastUpdateTime");

try {
// Convertir la chaîne de date en un objet Date et récupérer le timestamp
Date lastUpdateTime = dateFormat.parse(lastUpdateTimeStr);
long timestamp = lastUpdateTime.getTime(); // Obtenir le timestamp en millisecondes

// Ajouter un point à la série
series.getData().add(new XYChart.Data<>(timestamp, powerValue));
} catch (Exception e) {
System.out.println("Erreur lors de l'analyse de la date lastUpdateTime pour la clé " + key);
@Override
public Number fromString(String string) {
return null; // Cette méthode n'est pas nécessaire ici
}
});

// Créer l'axe Y (Current Power)
NumberAxis yAxis = new NumberAxis();
yAxis.setLabel("Current Power");

// Création du graphique
LineChart<Number, Number> lineChart = new LineChart<>(xAxis, yAxis);
lineChart.setTitle("Évolution de Current Power");

// Ajouter des données au graphique
XYChart.Series<Number, Number> series = new XYChart.Series<>();
series.setName("Current Power");

// Récupération des données à partir du JSON
JSONObject solar = (JSONObject) solarData.get("solar");
if (solar != null) {
long firstTimestamp = -1; // Utilisé pour calculer l'écart relatif
for (Object key : solar.keySet()) {
JSONObject entry = (JSONObject) solar.get(key);
try {
// Extraire les données : lastUpdateTime et currentPower
String lastUpdateTimeStr = (String) entry.get("lastUpdateTime");
JSONObject currentPowerObj = (JSONObject) entry.get("currentPower");

if (lastUpdateTimeStr != null && currentPowerObj != null) {
// Convertir la date en timestamp (millisecondes)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(lastUpdateTimeStr);
long timestamp = date.getTime(); // timestamp en millisecondes

// Normalisation du timestamp par rapport à la première date
if (firstTimestamp == -1) {
firstTimestamp = timestamp;
}
long normalizedTimestamp = timestamp - firstTimestamp; // Conversion en nombre de millisecondes depuis le premier point

// Extraire la puissance actuelle
double currentPower = ((Number) currentPowerObj.get("power")).doubleValue();

// Ajouter les données au graphique
series.getData().add(new XYChart.Data<>(normalizedTimestamp, currentPower));
}
} catch (Exception e) {
System.out.println("Erreur lors du traitement des données pour l'entrée " + key + ": " + e.getMessage());
}
}
}
}

// Ajouter la série au graphique
lineChart.getData().add(series);
}

/**
* Charge le fichier JSON et stocke les données dans le champ solarData
*/
public void chargerFichierSolar() {
JSONParser parser = new JSONParser();

try {
// Définir le chemin du fichier solar.json à la racine du projet
File file = new File("Iot/solar.json");

if (!file.exists()) {
System.out.println("Le fichier solar.json est introuvable à la racine du projet.");
return;
}

// Lire et analyser le fichier JSON
FileReader reader = new FileReader(file);
JSONObject json = (JSONObject) parser.parse(reader);

// Stocker les données dans le champ solarData
this.solarData = json;

System.out.println("Données extraites du fichier solar.json :");
System.out.println(json.toJSONString());
reader.close();
// Ajouter la série de données au graphique
lineChart.getData().add(series);

} catch (Exception e) {
System.out.println("Erreur lors du chargement du fichier solar.json : " + e.getMessage());
e.printStackTrace();
}
// Créer une scène et afficher le graphique
Scene scene = new Scene(lineChart, 800, 600);
stage.setScene(scene);
stage.show();
});
}
}
Loading

0 comments on commit ebc74ad

Please sign in to comment.