Verified Commit 3b6944c8 authored by Paul-Louis Harraud's avatar Paul-Louis Harraud 🖕🏻
Browse files

Merge branch 'master' of gitlab.ensimag.fr:harraudp/escalade

parents d357f557 af180e20
A0 01 1
A1 02 1
A2 03 0
A3 0A 0
/* =========================================================
* ==== WARNING ===
* =========================================================
* The code in this tab has been generated from the GUI form
* designer and care should be taken when editing this file.
* Only add/edit code inside the event handlers i.e. only
* use lines between the matching comment tags. e.g.
void myBtnEvents(GButton button) { //_CODE_:button1:12356:
// It is safe to enter your event code here
} //_CODE_:button1:12356:
* Do not rename this tab!
* =========================================================
*/
public void button1_click1(GButton source, GEvent event) { //_CODE_:button1:906837:
println("button1 - GButton >> GEvent." + event + " @ " + millis());
} //_CODE_:button1:906837:
// ---------- Fonction appellée lorsque le bouton "Sauvegarder la configuration" est cliqué -------
public void save_config(GButton source, GEvent event) { //_CODE_:b_Save:995187:
sauvegardeAdresses();
println("Données sauvegardées");
} //_CODE_:b_Save:995187:
// ---------- Fonction appellée lorsque le bouton "Charger la Voie 1" est cliqué -------
public void set_Voie1(GButton source, GEvent event) { //_CODE_:b_Voie1:611257:
setVoie1();
println("Voie 1 initialisée");
} //_CODE_:b_Voie1:611257:
// ---------- Fonction appellée lorsque le bouton "Ajoutez des prises" est cliqué -------
public void ajouter_prises(GButton source, GEvent event) { //_CODE_:b_Ajout:247512:
window1.setVisible(true); // Rend la fenêtre permettant de configurer les nouvelles prises visibles
} //_CODE_:b_Ajout:247512:
// ---------- Fonction appellée lorsque le bouton "Envoyez vers le STM32" est cliqué -------
public void envoi_arduino(GButton source, GEvent event) { //_CODE_:b_Envoi:312698:
println("Bouton Envoi Cliqué");
String nbPrisesFormat = "";
// ---------- On souhaite envoyer le nombre de prises sous le format de 3 digit -------
if (nbPrises < 10 ) {
nbPrisesFormat = "00" + String.valueOf(nbPrises);
} else if (nbPrises > 9 && nbPrises < 100) {
nbPrisesFormat = "0" + String.valueOf(nbPrises);
} else {
nbPrisesFormat = String.valueOf(nbPrises);
}
Data2Send = nbPrisesFormat; // On définit la chaîne de caractère à envoyer avec le nombre de prises
// ---------- On ajoute ensuite l'état et l'adresse à la suite pour chaque prise -------
for (Bouton button : b) {
Data2Send +=button.etat + button.adresse;
}
println("Adresses des Prises : " + Data2Send);
myPort.write(Data2Send); // On envoie la chaîne de caractère au travers du port série
Data2Send ="";
} //_CODE_:b_Envoi:312698:
public void supprimer_prises(GButton source, GEvent event) { //_CODE_:bSupprimer:978499:
window2.setVisible(true); // Rend la fenêtre permettant de configurer la suppression des prises visibles
} //_CODE_:bSupprimer:978499:
synchronized public void win_draw1(PApplet appc, GWinData data) { //_CODE_:window1:240638:
appc.background(230);
} //_CODE_:window1:240638:
public void textarea1_change1(GTextArea source, GEvent event) { //_CODE_:textarea_prises:555065:
println("textarea1 - GTextArea >> GEvent." + event + " @ " + millis());
} //_CODE_:textarea_prises:555065:
// ---------- Fonction appellée lorsque le bouton "Ajoutez" de la fenêtre gérant l'ajout des prises est cliqué -------
public void click_ajoutez(GButton source, GEvent event) { //_CODE_:b_Ajoutez:718187:
//Reprend la structure de la fonction de LectureAdresses()
String line;
StringDict adresses = new StringDict();
int k=0;
do {
line = textarea_prises.getText(k);
if (textarea_prises.getTextLength(k,true) <= 1) {
k++;
continue;
} else {
String[] data = split(line, " ");
if(data.length >= 2) adresses.set(data[0], data[2] + data[1]);
}
k++;
} while (line != "");
// ---------- On recherche une place pour ajouter la nouvelle prise en balayant toutes les positions et en comparant la couleur du pixel avec celle d'une prise allumée ou éteinte -------
for (int w = 0; w < adresses.size(); w++) {
loadPixels();
boolean coord_trouve = false;
int j = 25;
int i = 25;
while( j<= 720 && coord_trouve == false){
while(i <= 650 && coord_trouve == false){
if(get(i,j) != color(255) && get(i,j)!=color(246,254,0)){
coord_trouve = true;
println(coord_trouve);
x = i -5 ;y=j - 5;
}
i+=125;
}
j+=135;
}
//On instancie une prise avec les coordonnées trouvés précedemment puis on l'ajoute à la liste
Bouton btampon = new Bouton(x, y, color(0), color(220), adresses.keyArray()[w], adresses.valueArray()[w].substring(1), adresses.valueArray()[w].substring(0, 1));
b.add(btampon);
if (x >= 650) {
y +=135;
x = 20;
} else {
x = x+ 125;
}
}
nbPrises += adresses.size(); // On n'oublie pas d'incrémenter le nombre de prises
window1.setVisible(false);// On "ferme" la fenêtre
} //_CODE_:b_Ajoutez:718187:
public void annuler_Window1(GButton source, GEvent event) { //_CODE_:annuler_window1:882487:
window1.setVisible(false); //On ferme la fenêtre pour ajouter les prises lorsqu'on appuie sur Annuler
} //_CODE_:annuler_window1:882487:
synchronized public void win_draw2(PApplet appc, GWinData data) { //_CODE_:window2:819819:
appc.background(230);
} //_CODE_:window2:819819:
public void textarea_suppr(GTextArea source, GEvent event) { //_CODE_:textarea_supprimer:735456:
} //_CODE_:textarea_supprimer:735456:
// ---------- Fonction appellée lorsque le bouton "Supprimez des prises" est cliqué -------
public void suppr_prise(GButton source, GEvent event) { //_CODE_:b_Suppr:704533:
window3.setVisible(true);
} //_CODE_:b_Suppr:704533:
public void annuler_Window2(GButton source, GEvent event) { //_CODE_:annuler_window2:733096:
window2.setVisible(false);
} //_CODE_:annuler_window2:733096:
synchronized public void win_draw4(PApplet appc, GWinData data) { //_CODE_:window3:786944:
appc.background(230);
} //_CODE_:window3:786944:
// ---------- Fonction qui gère la suppression de la prise-------
public void confirmer_Suppr(GButton source, GEvent event) { //_CODE_:b_Confirmer_Suppr:415305:
String line;
int k=0;
Iterator itr; //On utilise un iterator pour permettre la suppression de plusieurs prises sans causer de problème de Segmentation Fault
do {
line = textarea_supprimer.getText(k); //On récupère la ligne k se trouvant le champ de caractère
if (textarea_supprimer.getTextLength(k,true) <= 1) {
k++;
continue;
} else {
String[] data = split(line, ","); // Permet de segmenter dans un tableau de chaine de caractère chaque prise séparée par des virgules
for(String nom : data){
itr = b.iterator();
while(itr.hasNext()){
Bouton button = (Bouton)itr.next();
if(button.nom.equals(nom)) itr.remove();
}
}
k++;
}
} while (line != "");
nbPrises = b.size();
window3.setVisible(false);
window2.setVisible(false);
} //_CODE_:b_Confirmer_Suppr:415305:
public void annuler_suppr(GButton source, GEvent event) { //_CODE_:b_Annuler_Suppr:815943:
window3.setVisible(false);
window2.setVisible(false);
} //_CODE_:b_Annuler_Suppr:815943:
// ---------- La fonction createGUI a été générée par l'outil G4P GUI Builder Tool -------
// Create all the GUI controls.
// autogenerated do not edit
public void createGUI(){
G4P.messagesEnabled(false);
G4P.setGlobalColorScheme(GCScheme.BLUE_SCHEME);
G4P.setMouseOverEnabled(false);
G4P.setDisplayFont("Roboto", G4P.PLAIN, 12);
G4P.setInputFont("Roboto", G4P.PLAIN, 12);
G4P.setSliderFont("Roboto", G4P.PLAIN, 11);
surface.setTitle("Sketch Window");
button1 = new GButton(this, -427, 376, 80, 30);
button1.setText("Face text");
button1.setLocalColorScheme(GCScheme.BLUE_SCHEME);
button1.addEventHandler(this, "button1_click1");
b_Save = new GButton(this, 240, 630, 150, 50);
b_Save.setText("Sauvegarder la configuration");
b_Save.addEventHandler(this, "save_config");
b_Voie1 = new GButton(this, 440, 630, 150, 50);
b_Voie1.setText("Charger la Voie 1");
b_Voie1.addEventHandler(this, "set_Voie1");
b_Ajout = new GButton(this, 640, 630, 150, 50);
b_Ajout.setText("Ajoutez des prises");
b_Ajout.addEventHandler(this, "ajouter_prises");
b_Envoi = new GButton(this, 40, 630, 150, 50);
b_Envoi.setText("Envoyer vers l'Arduino");
b_Envoi.setLocalColorScheme(GCScheme.GREEN_SCHEME);
b_Envoi.addEventHandler(this, "envoi_arduino");
bSupprimer = new GButton(this, 830, 630, 150, 50);
bSupprimer.setText("Supprimer des prises");
bSupprimer.setLocalColorScheme(GCScheme.RED_SCHEME);
bSupprimer.addEventHandler(this, "supprimer_prises");
window1 = GWindow.getWindow(this, "Ajout Prise(s)", 0, 0, 500, 500, JAVA2D);
window1.setVisible(false);
window1.noLoop();
window1.setActionOnClose(G4P.KEEP_OPEN);
window1.addDrawHandler(this, "win_draw1");
label1 = new GLabel(window1, 70, 10, 360, 100);
label1.setTextAlign(GAlign.CENTER, GAlign.MIDDLE);
label1.setText("Veuillez entrer les informations relatives à une ou plusieurs prises sous la forme : A0 01 1\nA0 : l'identifiant de la prise \n01 : l'adresse de la prise \n1 : l'état de la prise (1: allumée , 0: éteinte)\nRemarque: Pour l'ajout de plusieurs prises, allez à la ligne.");
label1.setLocalColorScheme(GCScheme.BLUE_SCHEME);
label1.setOpaque(false);
textarea_prises = new GTextArea(window1, 70, 120, 360, 290, G4P.SCROLLBARS_VERTICAL_ONLY | G4P.SCROLLBARS_AUTOHIDE);
textarea_prises.setLocalColorScheme(GCScheme.BLUE_SCHEME);
textarea_prises.setOpaque(true);
textarea_prises.addEventHandler(this, "textarea1_change1");
b_Ajoutez = new GButton(window1, 70, 430, 150, 50);
b_Ajoutez.setText("Ajoutez");
b_Ajoutez.setLocalColorScheme(GCScheme.GREEN_SCHEME);
b_Ajoutez.addEventHandler(this, "click_ajoutez");
annuler_window1 = new GButton(window1, 280, 430, 150, 50);
annuler_window1.setText("Annuler");
annuler_window1.setLocalColorScheme(GCScheme.RED_SCHEME);
annuler_window1.addEventHandler(this, "annuler_Window1");
window2 = GWindow.getWindow(this, "Supprimer Prise(s)", 0, 0, 500, 300, JAVA2D);
window2.setVisible(false);
window2.noLoop();
window2.setActionOnClose(G4P.KEEP_OPEN);
window2.addDrawHandler(this, "win_draw2");
label2 = new GLabel(window2, 70, 10, 360, 70);
label2.setTextAlign(GAlign.CENTER, GAlign.MIDDLE);
label2.setText("Veuillez renseigner les prises que vous souhaitez supprimer d'après leur nom séparés par des virgules\nExemple : A0,A1,...,An");
label2.setOpaque(false);
textarea_supprimer = new GTextArea(window2, 70, 100, 360, 50, G4P.SCROLLBARS_NONE);
textarea_supprimer.setOpaque(true);
textarea_supprimer.addEventHandler(this, "textarea_suppr");
b_Suppr = new GButton(window2, 70, 180, 150, 50);
b_Suppr.setText("Supprimer");
b_Suppr.setLocalColorScheme(GCScheme.GREEN_SCHEME);
b_Suppr.addEventHandler(this, "suppr_prise");
annuler_window2 = new GButton(window2, 280, 180, 150, 50);
annuler_window2.setText("Annuler");
annuler_window2.setLocalColorScheme(GCScheme.RED_SCHEME);
annuler_window2.addEventHandler(this, "annuler_Window2");
window3 = GWindow.getWindow(this, "Confirmer Suppression", 0, 0, 240, 120, JAVA2D);
window3.setVisible(false);
window3.noLoop();
window3.setActionOnClose(G4P.KEEP_OPEN);
window3.addDrawHandler(this, "win_draw4");
label3 = new GLabel(window3, 40, 20, 160, 30);
label3.setTextAlign(GAlign.CENTER, GAlign.MIDDLE);
label3.setText("Êtes-vous sûr de supprimer les prises renseignées ?");
label3.setOpaque(false);
b_Confirmer_Suppr = new GButton(window3, 30, 70, 80, 30);
b_Confirmer_Suppr.setText("Confirmer");
b_Confirmer_Suppr.setLocalColorScheme(GCScheme.GREEN_SCHEME);
b_Confirmer_Suppr.addEventHandler(this, "confirmer_Suppr");
b_Annuler_Suppr = new GButton(window3, 130, 70, 80, 30);
b_Annuler_Suppr.setText("Annuler");
b_Annuler_Suppr.setLocalColorScheme(GCScheme.RED_SCHEME);
b_Annuler_Suppr.addEventHandler(this, "annuler_suppr");
window1.loop();
window2.loop();
window3.loop();
}
// Variable declarations
// autogenerated do not edit
GButton button1;
GButton b_Save;
GButton b_Voie1;
GButton b_Ajout;
GButton b_Envoi;
GButton bSupprimer;
GWindow window1;
GLabel label1;
GTextArea textarea_prises;
GButton b_Ajoutez;
GButton annuler_window1;
GWindow window2;
GLabel label2;
GTextArea textarea_supprimer;
GButton b_Suppr;
GButton annuler_window2;
GWindow window3;
GLabel label3;
GButton b_Confirmer_Suppr;
GButton b_Annuler_Suppr;
// ------- Bibliothèques ---- //<>//
import processing.serial.*;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.util.*;
import g4p_controls.*; // ATTENTION IL FAUT INSTALLER LA LIBRAIRIE G4P SUR Processing AVANT !
// ---------- DÉBUT DE LA DÉFINITION DE LA CLASSE BOUTON -------
class Bouton {
String nom, adresse; // Chaînes de caractères qui stockent le nom et l'adresse de la prise
int posX,posY; // Entiers qui stockent la position de la prise sur l'interface
boolean rectOver= false; // rectOver = true => la souris est au-dessus de la prise; false sinon
int etat = 0; // 0 = LED éteinte, 1 = LED allumée
color couleur, highlight; // Objets propres à Processing qui stockent la couleur de base et la couleur lors du passage de la souris
// ---------- Constructeur de la classe Bouton, permet d'instancier les objets représentant les prises -------
Bouton(int x, int y,color co,color hl,String name, String adress, String etatLed){
posX= x;
posY = y;
highlight = hl;
nom = name;
adresse = adress;
etat = parseInt(etatLed);
initColor();
}
// ---------- Méthode qui est appellée pour vérifier si la souris est au-dessus de la prise -------
boolean overRect() {
return (mouseX >= posX && mouseX <= posX+size && mouseY >= posY && mouseY <= posY+size);
}
// ---------- Méthode qui est appellée pour mettre à jour la variable rectOver de la prise selon si la souris est au-dessus ou non -------
void update(){
//Si la souris est au-dessus du bouton
if(this.overRect()){
rectOver = true;
} else {
rectOver = false;
}
}
// ---------- Méthode qui est appellée pour mettre à jour le visuel de la prise dans l'interface -------
void squareOver(){
if(rectOver){
fill(highlight);
}
else{
fill(couleur);
}
square(posX,posY,size);
stroke(0);
}
// ---------- Méthode qui est appellée pour mettre à jour l'état et le visuel de la prise -------
void clickedButton(int i){
if(rectOver){
println("Bouton LED n°"+i+ " cliqué"+"\n");
if(etat == 0){
etat = 1; //Si la led est allumée elle devient éteinte et inversement
couleur = color(246,254,0);
}
else{
etat = 0;
couleur = color(255);
}
print("Etat de la LED n°"+i+" : "+ etat+ "\n");
}
}
// ---------- Méthode qui est appellée pour initialiser la couleur de la prise lors de son instanciation -------
void initColor(){
if(etat == 1){
couleur = color(246,254,0);
}
else{
couleur = color(255);
}
}
}
// ---------- FIN DE LA DÉFINITION DE LA CLASSE BOUTON -------
// ---------- Déclaration des variables globales -------
Serial myPort; // Déclaration du BUS Serie
String Data2Send; // Chaine à envoyer par le BUS Serie
int size; //Taille des boutons sur l'interface
int nbPrises; // Nombre de prises
color currentColor; // Couleur de l'arrière-plan de l'interface
int x, y; // Coordonnées permettant de stocker la position du dernier bouton
List<Bouton> b; // Définition de la liste dynamique d'objets Bouton
StringDict adresses_prises; // Définition d'un dictionnaire de chaîne de caractère contenant les informations des prises : nom, adresse et état
// ---------- Initialisation de l'interface -------
void setup(){
createGUI(); // On initialise la fenêtre graphique à partir de la librairie G4P
size(1024,720); // On définit la taille de cette fenêtre
// ---------- Initialisation des variables -------
adresses_prises = lectureAdresses(); // On lit les adresses dans le fichier texte que l'on stocke dans une variable
myPort = new Serial(this, Serial.list()[2], 9600);
Data2Send = ""; //Initialisation de la chaîne de caractère à envoyer par le port Série
size = 90; // La taille est en pixels
nbPrises = adresses_prises.size(); // Nombre de prises = nombre de prises récupéré à partir du fichier texte
currentColor = color(100);
x = 20;
y = 20;
// ---------- Initialisation de la liste dynamique et instanciations des prises -------
b = new ArrayList<Bouton>();
//Création des objets représentant les prises
for(int k = 0; k < nbPrises;k++){
Bouton btampon = new Bouton(x,y,color(0),color(220),adresses_prises.keyArray()[k],adresses_prises.valueArray()[k].substring(1),adresses_prises.valueArray()[k].substring(0,1));
b.add(btampon); // On ajoute le nouvel objet créé à notre liste dynamique d'objets
// On change la valeur de x et/ou de y afin que les prises soient bien positionnées sur l'écran
if (x >= 775) {
y +=135;
x = 20;
} else {
x = x+ 125;
}
}
}
// ---------- Fonction propre à Processing qui sera appellée continuellement afin de rafraîchir l'écran -------
void draw(){
for (Bouton button : b) button.update();
background(currentColor); fill(255);
for (Bouton button : b){
button.squareOver();
text(button.nom,button.posX+ 35,button.posY - 2);
}
}
void mousePressed(){
for (Bouton button : b) button.clickedButton(b.indexOf(button));
}
// ---------- Fonction qui s'occupe de lire le fichier texte afin d'en extraire le nombre de prise et les informations des prises -------
StringDict lectureAdresses (){
BufferedReader reader; //La classe BufferedReader lit du texte à partir d'un flux d'entrée de caractères en mettant en mémoire tampon les caractères
String line; // Chaîne de caractère stockant la ligne du texte en cours
reader = createReader("adresses.txt");
StringDict adresses = new StringDict(); // Définition d'un dictionnaire de chaîne de caractère contenant les informations des prises : nom, adresse et état
// ---------- On utilise une boucle pour lire tout le fichier -------
do{
// ---------- On emploie la structure try...catch afin de gérer les erreurs de lecture -------
try {
line = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
line = null;
}
if (line == null) {
continue;
} else {
String[] data = split(line, " ");
adresses.set(data[0],data[2] + data[1]);
}
} while (line != null);
try {
reader.close();
} catch (IOException e) {
System.err.println(e);
}
return adresses;
}
// ---------- Fonction qui s'occupe de lire le fichier texte contenant la voie prédéfinie et modifie la liste dynamique de prises -------
void setVoie1(){
// ---------- Elle reprend la même structure que la fonction de lecture du fichier texte d'origine -------
BufferedReader reader;
String line;
reader = createReader("voie1.txt");
StringDict adresses = new StringDict();
do{
try {
line = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
line = null;
}
if (line == null) {
continue;
} else {
String[] data = split(line, " ");
adresses.set(data[0],data[2] + data[1]);
}
} while (line != null);
try {
reader.close();
} catch (IOException e) {
System.err.println(e);
}
nbPrises = adresses.size(); // On modifie le nombre de prise initial avec celui lut dans la voie
b.clear(); // On supprime toutes les prises de l'interface car la voie prédéfinie pour les réajouter les nouvelles prises liées à la voie
x = 20;
y= 20;
for(int k = 0; k < nbPrises;k++){
Bouton btampon = new Bouton(x,y,color(0),color(220),adresses.keyArray()[k],adresses.valueArray()[k].substring(1),adresses.valueArray()[k].substring(0,1));
b.add(btampon);
if (x >= 775) {
y +=135;
x = 20;
} else {
x = x+ 125;
}
}
}
// ---------- Fonction permettant de stocker dans un dictionnaire de chaîne de caractère les informations relatives aux prises actuellement affichées sur l'interface -------
StringDict setAdresses(){
StringDict adresses = new StringDict();
for(Bouton button : b){
adresses.set(button.nom, button.etat + button.adresse);
}
println(adresses);
return adresses;
}
// ---------- Fonction qui sauvegarde dans le fichier original la configuration des prises actuelle -------
void sauvegardeAdresses (){
PrintWriter output;
try{
output = createWriter("adresses.txt");
StringDict adresses = setAdresses();
for(int i = 0; i< adresses.size() ; i++){
output.println(adresses.keyArray()[i] + " " + adresses.valueArray()[i].substring(1) + " " + adresses.valueArray()[i].substring(0,1)); //Stocke les prises sous la forme "nom adresse etat"
}
output.flush();
output.close();
}catch(Exception e){
System.out.println("Exception : "+e);
}
}
A0 01 1
A1 02 1
A2 03 0
A3 0A 1
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment