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 = w/w
    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.58, 0.59, 0.4, 0.4])
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 =6)
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.17, 0.2])
bx0.set_xticklabels([])
bx0.set_yticklabels([])
b0 , b1 =plt.plot([],[],'-k',[],[],'-r')

bx1 = fig.add_axes([0.06, 0.23, 0.17, 0.2])
bx1.set_xticklabels([])
bx1.set_yticklabels([])
b2 , b3 =plt.plot([],[],'-k',[],[],'-r')

bx2 = fig.add_axes([0.06, 0.01, 0.17, 0.2])
bx2.set_xticklabels([])
bx2.set_yticklabels([])
b4 , b5 =plt.plot([],[],'-k',[],[],'-r')

bx3 = fig.add_axes([0.25, 0.45, 0.17, 0.2])
bx3.set_xticklabels([])
bx3.set_yticklabels([])
b6 , b7 =plt.plot([],[],'-k',[],[],'-r')

bx4 = fig.add_axes([0.25, 0.23, 0.17, 0.2])
bx4.set_xticklabels([])
bx4.set_yticklabels([])
b8 , b9 =plt.plot([],[],'-k',[],[],'-r')

bx5 = fig.add_axes([0.25, 0.01, 0.17, 0.2])
bx5.set_xticklabels([])
bx5.set_yticklabels([])
b10 , b11 =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, facecolor='grey')
amplitude0 = Slider(sld_amplitude0, r'$C_0$',-1, 1 , valinit=0)
amplitude0.on_changed(slider_changed)

    
sld_pos_1 = [0.06, 0.96, 0.4, 0.02]
sld_amplitude1 = plt.axes(sld_pos_1, facecolor='grey')
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, facecolor='grey')
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, facecolor='grey')
amplitude3 = Slider(sld_amplitude3, r'$C_2$',0, 2 , valinit = 0)
amplitude3.on_changed(slider_changed)

sld_pos_4  = [0.06, 0.90, 0.4, 0.02]
sld_amplitude4 = plt.axes(sld_pos_4, facecolor='grey')
amplitude4 = Slider(sld_amplitude4, r'$\phi_2$',-3.14, 3.14 , valinit = 0)
amplitude4.on_changed(slider_changed)

sld_pos_5 = [0.06, 0.88, 0.4, 0.02]
sld_amplitude5 = plt.axes(sld_pos_5, facecolor='grey')
amplitude5 = Slider(sld_amplitude5, r'$C_3$',0, 2 , valinit=0)
amplitude5.on_changed(slider_changed)

sld_pos_6  = [0.06, 0.86, 0.4, 0.02]
sld_amplitude6 = plt.axes(sld_pos_6, facecolor='grey')
amplitude6 = Slider(sld_amplitude6, r'$\phi_3$',-3.14, 3.14 , valinit = 0)
amplitude6.on_changed(slider_changed)

sld_pos_7  = [0.06, 0.84, 0.4, 0.02]
sld_amplitude7 = plt.axes(sld_pos_7, facecolor='grey')
amplitude7 = Slider(sld_amplitude7, r'$C_4$',0, 2 , valinit=0)
amplitude7.on_changed(slider_changed)

sld_pos_8 = [0.06, 0.82, 0.4, 0.02]
sld_amplitude8 = plt.axes(sld_pos_8, facecolor='grey')
amplitude8 = Slider(sld_amplitude8, r'$\phi_4$',-3.14, 3.14 , valinit = 0)
amplitude8.on_changed(slider_changed)

sld_pos_9 = [0.06, 0.80, 0.4, 0.02]
sld_amplitude9 = plt.axes(sld_pos_9, facecolor='grey')
amplitude9 = Slider(sld_amplitude9, r'$C_5$',0, 2 , valinit=0)
amplitude9.on_changed(slider_changed)

sld_pos_10 = [0.06, 0.78, 0.4, 0.02]
sld_amplitude10 = plt.axes(sld_pos_10, facecolor='grey')
amplitude10 = Slider(sld_amplitude10, r'$\phi_5$',-3.14, 3.14 , valinit = 0)
amplitude10.on_changed(slider_changed)


sld_pos_11 = [0.06, 0.70, 0.25, 0.02]
sld_amplitude11 = plt.axes(sld_pos_11, facecolor='grey')
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, facecolor='grey')
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
    a5  = amplitude5.val
    a6  = amplitude6.val
    a7  = amplitude7.val
    a8  = amplitude8.val
    a9  = amplitude9.val
    a10 = amplitude10.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*2 + a4 ) +a5*np.cos(omega*t*3 + a6 ) +a7*np.cos(omega*t*4 + a8 ) +a9*np.cos(omega*t*5 + a10 ) 
    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(2,w0,Q))*np.cos(omega*t*2 + a4 + np.angle(F(2,w0,Q))) +  a5*np.abs(F(3,w0,Q))*np.cos(omega*t*3 + a6+  np.angle(F(3,w0,Q)) ) + a7*np.abs(F(4,w0,Q))*np.cos(omega*t*4 + a8 + np.angle(F(4,w0,Q))  ) + a9*np.abs(F(5,w0,Q))*np.cos(omega*t*5 + a10 + np.angle(F(5,w0,Q)) ) 
   
    
    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(2*omega*t + a4 ))
    b5.set_xdata(t)
    b5.set_ydata(a3*np.abs(F(2,w0,Q))*np.cos(2*omega*t + a4 + np.angle(F(2,w0,Q)) ))
    b6.set_xdata(t)
    b6.set_ydata(a5*np.cos(3*omega*t + a6 ))            
    b7.set_xdata(t)
    b7.set_ydata(a5*np.abs(F(3,w0,Q))*np.cos(3*omega*t + a6 + np.angle(F(3,w0,Q)) ))
    b8.set_xdata(t)
    b8.set_ydata(a7*np.cos(4*omega*t + a8 ))
    b9.set_xdata(t)
    b9.set_ydata(a7*np.abs(F(4,w0,Q))*np.cos(4*omega*t + a8 + np.angle(F(4,w0,Q)) ))
    b10.set_xdata(t)
    b10.set_ydata(a9*np.cos(5*omega*t + a10 ))
    b11.set_xdata(t)
    b11.set_ydata(a9*np.abs(F(5,w0,Q))*np.cos(5*omega*t + a10 + np.angle(F(5,w0,Q)) ))
    
    l1.set_xdata(t)
    l1.set_ydata(e)    
    
    l2.set_xdata(t)
    l2.set_ydata(s)
    
    epsilon = 0.045
    
    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([2-epsilon,2-epsilon])
    ll2.set_ydata([0,a3])
    
    ll3.set_xdata([3-epsilon,3-epsilon])
    ll3.set_ydata([0,a5])
    
    ll4.set_xdata([4-epsilon,4-epsilon])
    ll4.set_ydata([0,a7])
    
    ll5.set_xdata([5-epsilon,5-epsilon])
    ll5.set_ydata([0,a9])
    
    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([2+epsilon,2+epsilon])
    ll8.set_ydata([0,a3*np.abs(F(2,w0,Q))])
    
    ll9.set_xdata([3+epsilon,3+epsilon])
    ll9.set_ydata([0,a5*np.abs(F(3,w0,Q))])
    
    ll10.set_xdata([4+epsilon,4+epsilon])
    ll10.set_ydata([0,a7*np.abs(F(4,w0,Q))])
    
    ll11.set_xdata([5+epsilon,5+epsilon])
    ll11.set_ydata([0,a9*np.abs(F(5,w0,Q))])
        
    # w = np.linspace(0.0001,6,100)
    # ll12.set_xdata(w)
    # ll12.set_ydata(np.abs(F(w,w0,Q)))
      
    ax.axes.axis([0,20,-5,5])
    ax2.axes.axis([-epsilon, 6 , 0, 3])
    bx0.axes.axis([0,20,-5,5])
    bx1.axes.axis([0,20,-5,5])
    bx2.axes.axis([0,20,-5,5])
    bx3.axes.axis([0,20,-5,5])
    bx4.axes.axis([0,20,-5,5])
    bx5.axes.axis([0,20,-5,5])
    
    plt.draw()



## 


dessine()

plt.show()