package fr.esir.regulation;

import android.app.Fragment;
import android.os.AsyncTask;
import android.util.Log;
import fr.esir.fragments.MainFragment;
import fr.esir.maintasks.MyActivity;
import fr.esir.maintasks.R;

public class Regulator extends AsyncTask<Void, Void, Void> {

    // recuperer valeur capteur sur contexte
    double temp_int = MyActivity.lastTemp_in; // temperature interieur, fixée pour test
    // récuperer valeur consigne sur contexte ou optimisateur directement
    double temp_cons = 21; // temperature de consigne, fixée pour test
    private double Kp; // coefficient proportionnel
    private double Ki; // coefficient integrateur
    private double Kd; // coefficient dérivateur
    private boolean activated;

    public Regulator() {
        this.Kp = 1;
        this.Ki = 1;
        this.Kd = 1;

    }

    public Regulator(double m_Kp) {
        this.Kp = m_Kp;
        this.Ki = 0;
        this.Kd = 0;
    }

    public Regulator(double m_Kp, double m_Ki) {
        this.Kp = m_Kp;
        this.Ki = m_Ki;
        this.Kd = 0;
    }

    public Regulator(double m_Kp, double m_Ki, double m_Kd) {
        this.Kp = m_Kp;
        this.Ki = m_Ki;
        this.Kd = m_Kd;
    }

    @Override
    protected Void doInBackground(Void... params) {
        double diff_temp = 0; // erreur : différence entre temperature désirée
        // et température mesurée
        double valeur_sortie = 0; // valeur de sortie
        double somme_erreurs = 0; // somme des erreurs (répéter à chaque
        // itération)
        double variation_erreur = 0; // différence entre erreur actuelle et
        // erreur précédente
        boolean on = false;
        while (!this.isCancelled()) {
            somme_erreurs = somme_erreurs + diff_temp; // calcule la nouvelle somme des erreurs
            variation_erreur = temp_cons - temp_int - diff_temp; // calcule la différence entre la nouvelle erreur et la précédente
            diff_temp = temp_cons - temp_int; // calcul la nouvelle erreur
            // calcule de la nouvelle valeur de sortie ::: régulation PID,dépend du constructeur utilisé
            valeur_sortie = diff_temp * this.Kp + somme_erreurs * this.Ki
                    + variation_erreur * Kd;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            // envoyer valeur de sortie vers KNX
            Fragment currentFragment = MyActivity.act.getFragmentManager().findFragmentById(R.id.containerMain);
            if (currentFragment instanceof MainFragment) {
                if (valeur_sortie > 0 && !on) {
                    MainFragment.iaf.setImage(true);
                    log.i("Valeur regulation", valeur_sortie);
                } else if (valeur_sortie < 0 && on)
                    MainFragment.iaf.setImage(false);
            }
        }

        return null;
    }

    public void setConsigne(double consigne) {
        this.temp_cons = consigne;
        Log.i("New Consigne Regul", consigne + "");
    }

    public void setTempInterieur(double tempInt) {
        this.temp_int = tempInt;
    }

}

@@ -2277,17 +2277,18 @@
 d.sleep(
-1
+30
 000);%0A  
@@ -2483,16 +2483,192 @@
 ers KNX%0A
+%0A            double newValue = valeur_sortie;%0A            if (newValue %3E 100)%0A                newValue = 100;%0A            else if (newValue %3C 0)%0A                newValue = 0;%0A%0A
         
@@ -2851,28 +2851,23 @@
     if (
-valeur_sorti
+newValu
 e %3E 0 &&
@@ -2951,49 +2951,17 @@
     
-log.i(%22Valeur regulation%22, valeur_sortie)
+on = true
 ;%0A  
@@ -2989,23 +2989,19 @@
 if (
-valeur_sorti
+newValu
 e %3C
+=
  0 &
@@ -3005,16 +3005,18 @@
 0 && on)
+ %7B
 %0A       
@@ -3058,24 +3058,74 @@
 age(false);%0A
+                    on = false;%0A                %7D%0A
             

change regul