
import time
import numpy as np
from matplotlib.pyplot import *

class CaracteristiqueTransistor:
    def __init__(self,Rb,Rc,S0_max,S1_max):
        self.Rb = Rb
        self.Rc = Rc
        self.S0_max = S0_max
        self.S1_max = S1_max
        self.delai = 0.01
    def sortie_s0(self,S0):
        pass
    def sortie_s1(self,S1):
        pass
    def entree_e0(self):
        return 0.0
    def entree_e1(self):
        return 0.0
    def entree_e2(self):
        return 0.0
    def entree_e3(self):
        return 0.0
            
    def i_base(self,s0):
        self.sortie_s0(s0)
        time.sleep(self.delai)
        e0 = self.entree_e0()
        e1 = self.entree_e1()
        ib = (e1-e0)/self.Rb*1e6
        return ib
            
    def reglage_ib(self,ib,umin,umax,epsilon):
        u1 = umin
        u2 = umax
        u = (u1+u2)/2
        y = self.i_base(u)-ib
        y2 = 1.0
        y1 = -1.0
        while abs(y) > epsilon:
            if y1*y < 0:
                u2 = u
                y2 = y
            else:
                u1 = u
                y1 = y
            u = (u1+u2)/2
            y = self.i_base(u)-ib
        return [u,y+ib]
            
    def base_emetteur(self,n0):
        delta_S0 = self.S0_max/(n0-1)
        ib_array = np.zeros(n0)
        Vbe_array = np.zeros(n0)
        self.sortie_s1(self.S1_max)
        for k in range(n0):
            S0 = k*delta_S0
            self.sortie_s0(S0)
            time.sleep(self.delai)
            e0 = self.entree_e0()
            e1 = self.entree_e1()
            Vbe = e0
            ib = (e1-e0)/self.Rb*1e6
            ib_array[k] = ib
            Vbe_array[k] = Vbe
        xlabel("Vbe (V)")
        ylabel("ib (muA)")
        plot(Vbe_array,ib_array)
            
    def collecteur_emetteur(self,delta_ib,n1):
        ib_max = self.i_base(self.S0_max)
        ib_max = int(ib_max/10)*10
        nb = int(ib_max/delta_ib)
        Vce_array = np.zeros(n1)
        ic_array = np.zeros(n1)
        delta_S1 = self.S1_max/(n1-1)
        xlabel("Vce (V)")
        ylabel("ic (mA)")
        for j in range(nb):
            ib = j*delta_ib
            epsilon = 0.01
            self.sortie_s1(self.S1_max)
            [s0,ib]=self.reglage_ib(ib,0.0,self.S0_max,epsilon)
            print("ib = %f"%ib)
            for k in range(n1):
                S1 = k*delta_S1
                self.sortie_s1(S1)
                time.sleep(self.delai)
                e2 = self.entree_e2()
                e3 = self.entree_e3()
                Vce = e2
                ic = (e3-e2)/self.Rc*1e3
                Vce_array[k] = Vce
                ic_array[k] = ic
            plot(Vce_array,ic_array,label="ib = "+str(round(ib))+" muA")
            