''' Etude de la décharge d'un condensateur et détermination de la constante de temps
par linéarisation de la tension
adapté par Leroy-Bury (2022)'''
#-------------------------------------------------------------------------------
# importation des bibliothèques et modules
import sys
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
from matplotlib.gridspec import GridSpec
import numpy as np
from Lecture_csv import LectureCSV
#-------------------------------------------------------------------------------
# Etablissement de la fonction d'actualisation
def update(val):
    ''' Fonction qui permet d'actualiser la droite de modélisation et
    son équation, en fonction de la valeur du curseur
    '''
    y_reg = [b.val - a.val*instant for instant in date]
    # actualisation des valeurs de y_reg et de son tracé
    p.set_ydata(y_reg)
     # actualisation de l'équation de la droite
    equa.set_text('$\ln u_{\mathrm{C}}$ = '+str(round(float(b.val),2))+" - "+str(round(float(a.val),2))+'t')
#-------------------------------------------------------------------------------
# Choix du fichier de données et lecture du fichier (format CSV)
fichier=input("Quel est le nom du fichier de données (sans l'extension .csv) ?")+".csv"
 # La première colonne du fichier csv correspond à la tension
 # La seconde colonne du fichier csv correspond à la durée de l'expérience
tension,date=LectureCSV(fichier)
#-------------------------------------------------------------------------------
 #Calcul du logarithme néperien
lntension=[]
#lntension=np.log(tension) # à décommenter pour la linéarisation

#-------------------------------------------------------------------------------
# Affichage de la courbe uc=f(t) ou ln(uc)=f(t)
G = GridSpec(10, 10)           # Création d'une grille de 10×10
fig, ax = plt.subplots()       # Permettra d'insérer un curseur dans la figure

# ne s'execute que si la liste lntension est vide
if len(lntension)==0 :
    plt.plot(date, tension, 'r+',label='points expérimentaux')          # Tracé des points de mesure
    plt.axis([min(date),max(date)*1.15,min(tension),max(tension)*1.15]) # Echelles sur les axes

    plt.xlabel('t en s'); plt.ylabel('$ u_{\mathrm{C}}$ (V)')           # légendes sur les axes
    plt.title('$u_{\mathrm{C}}=f(t)$')                                  # Titre du graphique
    plt.grid()                                                          # Affichage d'une grille pour le graphique
    plt.legend()                                                        # Affichage des légendes des graphiques
    plt.show()

# ne s'execute que si la liste lntension n'est pas vide
else :
    initial_b = 1.00                                                    # Valeur initiale du coefficient directeur
    initial_a = 2.00                                                    # Valeur initiale du coefficient directeur
    y_reg = [initial_b - initial_a*instant for instant in date]         # Calcul de y avec ce coefficient directeur
    axes_1 = plt.subplot(G[:-2, :])                                     # Création d'une zone pour le graphique, amputée d'une ligne (:-1) pour y insérer le curseur
    plt.plot(date, lntension, 'r+',label='points expérimentaux')        # Tracé des points de mesure
    plt.axis([min(date),max(date)*1.15,min(lntension),max(lntension)*1.15])   # Echelles sur les axes

    plt.xlabel('t en s'); plt.ylabel('$\ln u_{\mathrm{C}}$')            # légendes sur les axes
    plt.title('$\ln u_{\mathrm{C}}=f(t)$')                              # Titre du graphique
    plt.grid()                                                          # Affichage d'une grille pour le graphique
    # Affichage de l'équation de la droite de modélisation
    equa = axes_1.text(max(date)*0.05,max(lntension)*0.15,'$\ln u_{\mathrm{C}}$ = '+str(initial_b)+" - "+str(initial_a)+' t',fontsize = 16, color="green", backgroundcolor = "#FFFF55")
    p, = plt.plot(date, y_reg, '-g',label='modélisation')               # Tracé de la droite de modélisation
    plt.legend()                                                        # Affichage des légendes des graphiques
    # Création d'un curseur, noté a, avec la position et les dimensions de ce curseur (rectangle)
    rectangle_a = plt.axes([0.25, 0.1, 0.5, 0.02])
    a = Slider(rectangle_a, 'coeff directeur', 0,40, valinit=initial_a)
    # Création d'un curseur, noté b, avec la position et les dimensions de ce curseur (rectangle)
    rectangle_b = plt.axes([0.25, 0.155, 0.5, 0.02])
    b = Slider(rectangle_b, 'ordonnée origine', -2, 3, valinit=initial_b)
    a.on_changed(update)                                                 # appel de la fonction update lorsque le curseur est actionné
    b.on_changed(update)
    plt.show()

sys.exit()


