import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons
from matplotlib import rc

## Déclaration des constantes

omega = 1

type_filtre = 'Aucun'
##

def slider_changed (event):
    dessine()
    
    
def F(w,w0,Q) : 
    if type_filtre == 'Aucun':
        H = 1
    if type_filtre == 'Passe-bas 1er ordre' : 
        H = 1/(1+1j*(w/w0))
    if type_filtre == 'Passe-haut 1er ordre' : 
        H = 1/(1-1j*(w0/w))
    if type_filtre == 'Passe-bas 2ième ordre' :
        H = 1/(1- w**2/w0**2 + 1j*w/(w0*Q) )
    if type_filtre == 'Passe-bande' :
        H = 1/(1+ 1j*Q*(w/w0 -w0/w)  )
    if type_filtre == 'Passe-haut 2ième ordre' :
        H = -(w/w0)**2/(1-(w/w0)**2 + 1j*(w/(Q*w0) ))
    if type_filtre == 'Coupe-bande':
        H = (1-(w/w0)**2)/(1-(w/w0)**2 + 1j*(w/(Q*w0)) )
    return(H)
    
    

def changeFiltre(label):
    global type_filtre
    type_filtre = label
    dessine()
    


## Création de la figure et des axes


fig = plt.figure(figsize=[15,6])

#ax = fig.add_axes([0.58,0.1,0.4,0.4])
#plt.xlabel(r'$t$ (s)',fontsize = 20)
#plt.ylabel(r'$s(t)$',fontsize = 20)
#plt.axis([0,5,-5,100])
#l1 , l2 , l3 , l4 =plt.plot([],[],'-k',[],[],'-r',[],[],'-k',[],[],'-k')



ax2 = fig.add_axes([0.57,0.1,0.4,0.8])
ll0, ll1 , ll2 , ll3 , ll4 , ll5 , ll6, ll7, ll8, ll9, ll10  ,ll11 , ll12 =plt.plot([],[],'-k' , [],[],'-k' ,[],[],'-k',[],[],'-k',[],[],'-k',[],[],'-k',[],[],'-r',[],[],'-r',[],[],'-r',[],[],'-r',[],[],'-r',[],[],'-r',[],[],'--b', lw =5)
plt.xlabel(r'$\omega_n$ (rad/s)',fontsize = 20)
plt.ylabel(r'$C_n$',fontsize = 20)


bx0 = fig.add_axes([0.06,0.45,0.27,0.2])
bx0.set_xticklabels([])
bx0.set_yticklabels([])
b0 , b1 =plt.plot([],[],'-k',[],[],'-r')

bx1 = fig.add_axes([0.06,0.23,0.27,0.2])
bx1.set_xticklabels([])
bx1.set_yticklabels([])
b2 , b3 =plt.plot([],[],'-k',[],[],'-r')

bx2 = fig.add_axes([0.06,0.01,0.27,0.2])
bx2.set_xticklabels([])
bx2.set_yticklabels([])
b4 , b5 =plt.plot([],[],'-k',[],[],'-r')


## Sliders

axBouton       = plt.axes([0.35,0.655,0.17,0.12])
bouton_change_sens = RadioButtons(axBouton, ['Aucun','Passe-bas 1er ordre','Passe-haut 1er ordre', 'Passe-bas 2ième ordre' , 'Passe-haut 2ième ordre', 'Passe-bande', 'Coupe-bande'])
bouton_change_sens.on_clicked(changeFiltre)
    
sld_pos_0  = [0.06, 0.98, 0.4, 0.02]
sld_amplitude0 = plt.axes(sld_pos_0)
amplitude0     = Slider(sld_amplitude0, r'$a_0$',-2, 2 , valinit=1.5)
amplitude0.on_changed(slider_changed)

    
sld_pos_1  = [0.06, 0.96, 0.4, 0.02]
sld_amplitude1 = plt.axes(sld_pos_1)
amplitude1     = Slider(sld_amplitude1, r'$c_1$',0, 2 , valinit=1)
amplitude1.on_changed(slider_changed)

sld_pos_2  = [0.06, 0.94, 0.4, 0.02]
sld_amplitude2 = plt.axes(sld_pos_2)
amplitude2     = Slider(sld_amplitude2, r'$\phi_1$',-3.14, 3.14 , valinit = 0)
amplitude2.on_changed(slider_changed)

sld_pos_3  = [0.06, 0.92, 0.4, 0.02]
sld_amplitude3 = plt.axes(sld_pos_3)
amplitude3     = Slider(sld_amplitude3, r'$c_2$',0, 2 , valinit = 0.4)
amplitude3.on_changed(slider_changed)

sld_pos_4  = [0.06, 0.90, 0.4, 0.02]
sld_amplitude4 = plt.axes(sld_pos_4)
amplitude4     = Slider(sld_amplitude4, r'$\phi_2$',-3.14, 3.14 , valinit = 0)
amplitude4.on_changed(slider_changed)




sld_pos_11  = [0.06, 0.70, 0.25, 0.02]
sld_amplitude11 = plt.axes(sld_pos_11)
amplitude11     = Slider(sld_amplitude11, r'$\omega_0$',0.1, 10 , valinit = 1)
amplitude11.on_changed(slider_changed)

sld_pos_12  = [0.06, 0.68, 0.25, 0.02]
sld_amplitude12 = plt.axes(sld_pos_12)
amplitude12     = Slider(sld_amplitude12, r'$Q$',0.001, 10 , valinit = 1)
amplitude12.on_changed(slider_changed)


## Fonctions de dessin

def dessine():	
    
    a0  = amplitude0.val
    a1  = amplitude1.val
    a2  = amplitude2.val
    a3  = amplitude3.val
    a4  = amplitude4.val
    w0 = amplitude11.val
    Q = amplitude12.val
    
    t=np.linspace(0,20, 1000)
    e=a0 + a1*np.cos(omega*t + a2 )  + a3*np.cos(omega*t*10 + a4 )  
    s=np.abs(F(0.0000000001,w0,Q))*a0 + a1*np.abs(F(1,w0,Q))*np.cos(omega*t + a2 + np.angle(F(1,w0,Q)) )  +  a3*np.abs(F(10,w0,Q))*np.cos(omega*t*10 + a4 + np.angle(F(10,w0,Q))) 
    # s = 0
    # Q= 1
    
    b0.set_xdata(t)
    b0.set_ydata(t*0 + a0)
    b1.set_xdata(t)
    b1.set_ydata(t*0 + np.abs(F(0.0000001,w0,Q))*a0)
    b2.set_xdata(t)
    b2.set_ydata(a1*np.cos(omega*t + a2 ))
    b3.set_xdata(t)
    b3.set_ydata(a1*np.abs(F(1,w0,Q))*np.cos(omega*t + a2 + np.angle(F(1,w0,Q)) ))
    b4.set_xdata(t)
    b4.set_ydata(a3*np.cos(omega*t*10 + a4 ))
    b5.set_xdata(t)
    b5.set_ydata(a3*np.abs(F(10,w0,Q))*np.cos(omega*t*10 + a4 + np.angle(F(10,w0,Q)) ))
    
    
    
    
        
    #l1.set_xdata(t)
    #l1.set_ydata(e)    
    
        
    #l2.set_xdata(t)
    #l2.set_ydata(s)
    
    epsilon = 0.12
    ll0.set_xdata([0-epsilon,0-epsilon])
    ll0.set_ydata([0,np.abs(a0)])    

    ll1.set_xdata([1-epsilon,1-epsilon])
    ll1.set_ydata([0,a1])
    
    ll2.set_xdata([10-epsilon,10-epsilon])
    ll2.set_ydata([0,a3])
    
    
    
    
    ll6.set_xdata([0+epsilon,0+epsilon])
    ll6.set_ydata([0,np.abs(a0)*np.abs(F(0.0000001,w0,Q))])    

    ll7.set_xdata([1+epsilon,1+epsilon])
    ll7.set_ydata([0,a1*np.abs(F(1,w0,Q))])
    
    ll8.set_xdata([10+epsilon,10+epsilon])  
    ll8.set_ydata([0,a3*np.abs(F(10,w0,Q))])
    
    
        
    w = np.linspace(0.0001,20,100)
    ll12.set_xdata(w)
    ll12.set_ydata(np.abs(F(w,w0,Q)))
      
    ax.axes.axis([0,20,-5,5])
    ax2.axes.axis([-2*epsilon, 20 , 0, 2])
    bx0.axes.axis([0,20,-2,2])
    bx1.axes.axis([0,20,-2,2])
    bx2.axes.axis([0,20,-2,2])
    
    
    

    plt.draw()



## 


dessine()

plt.show()