diff --git a/Processus/exJoinAliveEtc.py b/Processus/exJoinAliveEtc.py
new file mode 100644
index 0000000000000000000000000000000000000000..a228b05376f74f5e4426a8e7d96378b0de348a3d
--- /dev/null
+++ b/Processus/exJoinAliveEtc.py
@@ -0,0 +1,42 @@
+import threading
+# inspire de http://www.xavierdupre.fr/app/teachpyx/helpsphinx/c_parallelisation/thread.html#premier-thread
+class MyThread1(threading.Thread):
+
+    def __init__(self):
+        threading.Thread.__init__(self)  # ne pas oublier cette ligne
+        # (appel au constructeur de la classe mère)
+        self.nom="A" # self.name exite deja
+
+    def run(self):
+        print('debut ',self.nom)
+
+        print ('milieu ',self.nom)
+
+        print ('fin ',self.nom)
+
+class MyThread2(threading.Thread):
+
+    def __init__(self):
+        threading.Thread.__init__(self)  # ne pas oublier cette ligne
+        # (appel au constructeur de la classe mère)
+        self.nom="B" # self.name exite deja
+
+    def run(self):
+        print('debut ',self.nom)
+
+        print ('milieu ',self.nom)
+
+        print ('fin ',self.nom)
+
+
+
+def test():
+    a = MyThread1()
+    b=MyThread2()
+    print(a.is_alive())
+    a.start()
+    print("2",a.is_alive())
+    b.start()
+    a.join()
+    b.join()
+    print(a.is_alive())
\ No newline at end of file
diff --git a/Processus/exclumutPb.py b/Processus/exclumutPb.py
new file mode 100644
index 0000000000000000000000000000000000000000..2cac23e2fd506d688081fb9e0af7dde7d38c5752
--- /dev/null
+++ b/Processus/exclumutPb.py
@@ -0,0 +1,36 @@
+import threading
+
+class Sdpartagee():
+    def __init__(self,taille):
+        self.ouEstCe=0
+        self.data=[0]*taille
+
+class Producteur(threading.Thread):
+    def __init__(self,nom,tablo,nbLecture):
+        # ne pas oublier cette ligne
+        # (appel au constructeur de la classe mère)
+        threading.Thread.__init__(self)
+        self.nom=nom # self.name exite deja
+        self.SD=tablo
+        self.nbLecture=nbLecture
+    def run(self):
+        print('debut ',self.nom)
+        for i in range(self.nbLecture):
+            ou=self.SD.ouEstCe
+            self.SD.data[ou]=self.nom
+            ou+=1
+            self.SD.ouEstCe=ou
+        print('fin',self.nom)
+
+
+nbP=5
+nbL=1000000
+sd=Sdpartagee(nbP*nbL)
+stat = dict()
+stat[0]=0
+for i in range(nbP):
+     Producteur("Nom"+str(i),sd,nbL).start()
+     stat["Nom"+str(i)]=0 # init° des stat
+
+for i in range(nbP*nbL):
+    stat[sd.data[i]]+=1
\ No newline at end of file
diff --git a/Processus/exclumutPbSemaphore.py b/Processus/exclumutPbSemaphore.py
new file mode 100644
index 0000000000000000000000000000000000000000..e4a43fe1aae564e5eb5a6168390e9e8a3a1e9e8e
--- /dev/null
+++ b/Processus/exclumutPbSemaphore.py
@@ -0,0 +1,40 @@
+import threading
+
+class Sdpartagee():
+    def __init__(self,taille):
+        self.ouEstCe=0
+        self.data=[0]*taille
+
+class Producteur(threading.Thread):
+    def __init__(self,nom,tablo,nbLecture,mutex):
+        # ne pas oublier cette ligne
+        # (appel au constructeur de la classe mère)
+        threading.Thread.__init__(self)
+        self.nom=nom # self.name exite deja
+        self.SD=tablo
+        self.nbLecture=nbLecture
+        self.mutex=mutex
+    def run(self):
+        print('debut ',self.nom)
+        for i in range(self.nbLecture):
+            self.mutex.acquire()
+            ou=self.SD.ouEstCe
+            self.SD.data[ou]=self.nom
+            ou+=1
+            self.SD.ouEstCe=ou
+            self.mutex.release()
+        print('fin',self.nom)
+
+
+nbP=5
+nbL=1000000
+mutex= threading.Semaphore(1)
+sd=Sdpartagee(nbP*nbL)
+stat = dict()
+stat[0]=0
+for i in range(nbP):
+     Producteur("Nom"+str(i),sd,nbL,mutex).start()
+     stat["Nom"+str(i)]=0 # init° des stat
+
+for i in range(nbP*nbL):
+    stat[sd.data[i]]+=1
\ No newline at end of file
diff --git a/Processus/lancement.py b/Processus/lancement.py
new file mode 100644
index 0000000000000000000000000000000000000000..55cd137747a597f695dd668ed3c63bb30d3110f5
--- /dev/null
+++ b/Processus/lancement.py
@@ -0,0 +1,38 @@
+# inspire de http://www.xavierdupre.fr/app/teachpyx/helpsphinx/c_parallelisation/thread.html#premier-thread
+
+import threading
+
+class MyThread1(threading.Thread):
+    def __init__(self):
+        threading.Thread.__init__(self)  # ne pas oublier cette ligne (appel au constructeur de la classe mère)
+        self.nom="A" # self.name exite deja
+    def run(self):
+        print('debut ',self.nom)
+        print ('milieu ',self.nom)
+        print ('fin ',self.nom)
+
+def test1():
+    a = MyThread1()
+    print("test1 avant start")
+    a.start()
+    print("test1 apres start")
+
+class MyThread2(threading.Thread):
+
+    def __init__(self):
+        threading.Thread.__init__(self)  # ne pas oublier cette ligne
+        # (appel au constructeur de la classe mère)
+        self.nom="B" # self.name exite deja
+
+    def run(self):
+        print('debut ',self.nom)
+
+        print ('milieu ',self.nom)
+
+        print ('fin ',self.nom)
+
+def test():
+    a = MyThread1()
+    b=MyThread2()
+    a.start()
+    b.start()
\ No newline at end of file
diff --git a/Processus/partageObj.py b/Processus/partageObj.py
new file mode 100644
index 0000000000000000000000000000000000000000..83ba4ca689358d76bef14c608525b5609d70e073
--- /dev/null
+++ b/Processus/partageObj.py
@@ -0,0 +1,27 @@
+import threading
+
+class Objetpartage():
+    def __init__(self,v):
+        self.v=v
+    def myMeth(self,val):
+        self.v+=val
+
+class UtilisateurObjetPartage(threading.Thread):
+    def __init__(self,objToShare,id):
+        threading.Thread.__init__(self)
+        self.obj=objToShare
+        self.id=id
+    def doStg(self):
+        self.obj.myMeth(self.id)
+    def run(self):
+        self.doStg()
+def test():
+    o=Objetpartage(2)
+    util1=UtilisateurObjetPartage(o,11)
+    util2 = UtilisateurObjetPartage(o,22)
+    util1.start()
+    util2.start()
+    print("valeur avant join", o.v)
+    util1.join()
+    util2.join()
+    print("valeur à la fin",o.v)
diff --git a/Processus/pingpong.py b/Processus/pingpong.py
new file mode 100644
index 0000000000000000000000000000000000000000..efc5fb5e54b65dd357d119e71f4dbc76ecd41859
--- /dev/null
+++ b/Processus/pingpong.py
@@ -0,0 +1,42 @@
+
+import threading
+# inspire de http://www.xavierdupre.fr/app/teachpyx/helpsphinx/c_parallelisation/thread.html#premier-thread
+class Ping(threading.Thread):
+
+    def __init__(self,name,semaphore1,semaphore2):
+        threading.Thread.__init__(self)  # ne pas oublier cette ligne
+        # (appel au constructeur de la classe mère)
+        self.nom=name # self.name exite deja
+        self.s1 = semaphore1
+        self.s2 = semaphore2
+
+    def run(self):
+        for i in range (10):
+            self.s1.acquire()
+            print('Ping ',self.nom)
+            self.s2.release()
+
+
+class Pong(threading.Thread):
+
+    def __init__(self, name, semaphore1, semaphore2):
+        threading.Thread.__init__(self)  # ne pas oublier cette ligne
+        # (appel au constructeur de la classe mère)
+        self.nom = name  # self.name exite deja
+        self.s1 = semaphore1
+        self.s2 = semaphore2
+
+    def run(self):
+        for i in range(10):
+            self.s1.acquire()
+            print('Pong ', self.nom)
+            self.s2.release()
+
+def test():
+    s1= threading.Semaphore(1)
+    s2=threading.Semaphore(0)
+    ping=Ping('ppp',s1,s2)
+    pong = Pong('gg', s2, s1)
+    ping.start()
+    pong.start()
+
diff --git a/TP1/TP2/.gitkeep b/TP1/TP2/.gitkeep
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/TP2/Armoire5.py b/TP2/Armoire5.py
new file mode 100644
index 0000000000000000000000000000000000000000..6d70146d0860aadaff5b1c3ce2ee8a83f7e7c74b
--- /dev/null
+++ b/TP2/Armoire5.py
@@ -0,0 +1,154 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Mon Jun 22 16:40:33 2020
+
+@author: chevrier6
+"""
+from bitManip import *
+from easymodbus.modbusClient import ModbusClient
+from easymodbus.modbusClient import convert_registers_to_float
+
+
+class AutomateException(Exception):
+    def __init__(self, message):
+        self.message = message
+
+
+class Armoire5():
+    # ici les adresse des mesure commence  a ZERO (pas UN comme en java)
+
+    def __init__(self):
+        self.nbCharge = 7  # de 0 a 6
+        self.ipAdresse = "100.75.155.115"
+        self.adresseMesure = 2
+        self.adresseTOR = 32000
+        self.adresseMesureSecteur1 = 7  # attention  vraie adresse ()
+        self.adresseMesureSecteur2 = 8  # attention  vraie adresse
+
+        self.debutAdrCharge = 9
+        self.debutAdrSource = 0
+
+    def okCharge(self, i):
+        return 0 <= i <= 6
+
+    def resetAll(self):
+        self.writeTOR(0)
+
+    def resetSource(self):
+        for i in range(self.nbCharge):
+            self.setSource1(i)
+
+    def resetCharge(self):
+        for i in range(self.nbCharge):
+            self.unsetCharge(i)
+
+    def setCharge(self, charge: int):
+        if not self.okCharge(charge):
+            raise AutomateException("numero charge pas compris entre 0 et 6")
+        val = self.readTOR()
+        val = setBit(val, charge + self.debutAdrCharge)
+        self.writeTOR(val)
+
+    def unsetCharge(self, charge):
+        if not self.okCharge(charge):
+            raise AutomateException("numero charge pas compris entre 0 et 6")
+        val = self.readTOR()
+        val = clearBit(val, charge + self.debutAdrCharge)
+        self.writeTOR(val)
+
+    def toggleCharge(self, charge):
+        if not self.okCharge(charge):
+            raise AutomateException("numero charge pas compris entre 0 et 6")
+        val = self.readTOR()
+        val = toggleBit(val, charge + self.debutAdrCharge)
+        self.writeTOR(val)
+
+    def setSource1(self, charge):
+        if not self.okCharge(charge):
+            raise AutomateException("numero charge pas compris entre 0 et 6")
+        val = self.readTOR()
+        val = clearBit(val, charge + self.debutAdrSource)
+        self.writeTOR(val)
+
+    def setSource2(self, charge):
+        if not self.okCharge(charge):
+            raise AutomateException("numero charge pas compris entre 0 et 6")
+        val = self.readTOR()
+        val = setBit(val, charge + self.debutAdrSource)
+        self.writeTOR(val)
+
+    def togglesource(self, charge):
+        if not self.okCharge(charge):
+            raise AutomateException("numero charge pas compris entre 0 et 6")
+        val = self.readTOR()
+        val = toggleBit(val, charge + self.debutAdrSource)
+        self.writeTOR(val)
+
+    ################################
+
+    def writeTOR(self, val):
+        modbusclient = ModbusClient(self.ipAdresse, 502)
+        modbusclient.connect()
+        modbusclient.write_single_register(self.adresseTOR, val)
+        modbusclient.close()
+        # some tempo to wait measure to stabilize
+        from time import sleep
+        sleep(2.)
+
+    def readTOR(self):
+        modbusclient = ModbusClient(self.ipAdresse, 502)
+        modbusclient.connect()
+        inputRegisters = modbusclient.read_inputregisters(self.adresseTOR, 1)
+        modbusclient.close()
+        return (int)(inputRegisters[0])
+
+    ###############################################
+    def readSecteur1(self):
+        addr = self.adresseMesure + (self.adresseMesureSecteur1) * 8
+        return self.lireValeurAdresse(addr + 2), self.lireValeurAdresse(addr), self.lireValeurAdresse(
+            addr + 4), self.lireValeurAdresse(addr + 6)
+
+    def readSecteur2(self):
+        addr = self.adresseMesure + (self.adresseMesureSecteur2) * 8
+        return self.lireValeurAdresse(addr + 2), self.lireValeurAdresse(addr), self.lireValeurAdresse(
+            addr + 4), self.lireValeurAdresse(addr + 6)
+
+    def readMesureCourant(self, source: int):
+        if not self.okCharge(source):
+            raise AutomateException("numero charge pas compris entre 0 et 6")
+        return self.lireValeur(source, 0)
+
+    def readMesureTension(self, source: int):
+        if not self.okCharge(source):
+            raise AutomateException("numero charge pas compris entre 0 et 6")
+        return self.lireValeur(source, 2)
+
+    def readMesurePactive(self, source: int):
+        if not self.okCharge(source):
+            raise AutomateException("numero charge pas compris entre 0 et 6")
+        return self.lireValeur(source, 4)
+
+    def readMesurePreactive(self, source: int):
+        if not self.okCharge(source):
+            raise AutomateException("numero charge pas compris entre 0 et 6")
+        return self.lireValeur(source, 6)
+
+    def readMesure(self, source):
+        return self.readMesureTension(source), self.readMesureCourant(source), self.readMesurePactive(
+            source), self.readMesurePreactive(source)
+
+    def lireValeur(self, source, offset):
+
+        addr = self.adresseMesure + (source) * 8 + offset
+        return self.lireValeurAdresse(addr)
+
+    def lireValeurAdresse(self, addr):
+
+        modbusclient = ModbusClient(self.ipAdresse, 502)
+        modbusclient.connect()
+        data = modbusclient.read_holdingregisters(addr, 2)
+        modbusclient.close()
+        res = convert_registers_to_float(data)
+
+        return res[0]
+
diff --git a/TP2/Armoire6.py b/TP2/Armoire6.py
new file mode 100644
index 0000000000000000000000000000000000000000..54e835fc424dc3659e58d4a5f63f1bd4b596b89a
--- /dev/null
+++ b/TP2/Armoire6.py
@@ -0,0 +1,157 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Mon Jun 22 16:40:33 2020
+
+@author: chevrier6
+"""
+from bitManip import *
+from easymodbus.modbusClient import ModbusClient
+from easymodbus.modbusClient import convert_registers_to_float
+
+class AutomateException(Exception):
+    def __init__(self, message):
+        self.message = message
+
+
+
+
+
+class Armoire6():
+    # ici les adresse des mesure commence  a ZERO (pas UN comme en java)
+
+
+    def __init__(self):
+        self.nbCharge=7 # de 0 a 6
+        self.ipAdresse="100.75.155.116"
+        self.adresseMesure=0
+        self.adresseTOR=32000
+        self.adresseMesureSecteur1=7 # attention  vraie adresse ()
+        self.adresseMesureSecteur2=8 # attention  vraie adresse
+
+        self.debutAdrCharge=0
+        self.debutAdrSource=7
+
+    def okCharge(self,i):
+        return 0 <= i <= 6
+    
+    def resetAll(self):
+        self.writeTOR(0)
+    
+    def resetSource(self):
+        for i in range(self.nbCharge):
+            self.setSource1(i)
+    
+    def resetCharge(self):
+        for i in range(self.nbCharge):
+            self.unsetCharge(i)
+            
+    def setCharge(self, charge : int ):
+        if not self.okCharge(charge):
+            raise AutomateException("numero charge pas compris entre 0 et 6")
+        val=self.readTOR()
+        val=setBit(val,charge+self.debutAdrCharge)
+        self.writeTOR(val)
+    
+
+    def unsetCharge(self,charge):
+        if not self.okCharge(charge):
+            raise AutomateException("numero charge pas compris entre 0 et 6")
+        val=self.readTOR()
+        val=clearBit(val,charge+self.debutAdrCharge)
+        self.writeTOR(val)
+
+    def toggleCharge(self, charge):
+        if not self.okCharge(charge):
+            raise AutomateException("numero charge pas compris entre 0 et 6")
+        val = self.readTOR()
+        val = toggleBit(val, charge+self.debutAdrCharge)
+        self.writeTOR(val)
+    
+    def setSource1(self,charge):
+        if not self.okCharge(charge):
+            raise AutomateException("numero charge pas compris entre 0 et 6")
+        val=self.readTOR()
+        val=clearBit(val,charge+self.debutAdrSource)
+        self.writeTOR(val)
+
+    def setSource2(self, charge):
+        if not self.okCharge(charge):
+            raise AutomateException("numero charge pas compris entre 0 et 6")
+        val = self.readTOR()
+        val = setBit(val, charge +self.debutAdrSource)
+        self.writeTOR(val)
+
+
+  
+    def togglesource(self,charge):
+        if not self.okCharge(charge):
+            raise AutomateException("numero charge pas compris entre 0 et 6")
+        val=self.readTOR()
+        val=toggleBit(val,charge+self.debutAdrSource)
+        self.writeTOR(val)
+    
+    ################################
+    
+    
+    def writeTOR(self,val):
+        modbusclient =ModbusClient(self.ipAdresse,502)
+        modbusclient.connect()
+        modbusclient.write_single_register(self.adresseTOR,val)
+        modbusclient.close()
+        # some tempo to wait measure to stabilize
+        from time import sleep
+        sleep(2.)
+    
+    
+    def readTOR(self):
+        modbusclient =ModbusClient(self.ipAdresse,502)
+        modbusclient.connect()
+        inputRegisters = modbusclient.read_inputregisters(self.adresseTOR, 1)
+        modbusclient.close()
+        return (int)(inputRegisters[0])
+        
+###############################################
+    def readSecteur1(self):
+        from time import sleep
+        addr = self.adresseMesure  + (self.adresseMesureSecteur1 ) * 8
+        return self.lireValeurAdresse(addr + 2), self.lireValeurAdresse(addr), self.lireValeurAdresse(addr + 4), self.lireValeurAdresse(addr + 6)
+    def readSecteur2(self):
+        addr = self.adresseMesure  + (self.adresseMesureSecteur2 ) * 8
+        return self.lireValeurAdresse(addr+2),self.lireValeurAdresse(addr),self.lireValeurAdresse(addr+4),self.lireValeurAdresse(addr+6)
+        
+    def readMesureCourant(self,source :int):
+        if not self.okCharge(source):
+            raise AutomateException("numero charge pas compris entre 0 et 6")
+        return self.lireValeur(source,0 )
+    def readMesureTension(self,source :int):
+        if not self.okCharge(source):
+            raise AutomateException("numero charge pas compris entre 0 et 6")
+        return self.lireValeur(source,2 )
+    def readMesurePactive(self,source :int):
+        if not self.okCharge(source):
+            raise AutomateException("numero charge pas compris entre 0 et 6")
+        return self.lireValeur(source,4 )
+    def readMesurePreactive(self,source :int):
+        if not self.okCharge(source):
+            raise AutomateException("numero charge pas compris entre 0 et 6")
+        return self.lireValeur(source,6 )
+
+    def readMesure(self,source):
+        return self.readMesureTension(source),self.readMesureCourant(source),self.readMesurePactive(source),self.readMesurePreactive(source)
+   
+    def lireValeur(self,source,offset):
+
+        addr=  self.adresseMesure  + (source ) *8+offset
+        return self.lireValeurAdresse(addr)
+    def lireValeurAdresse(self,addr):
+
+
+        modbusclient =ModbusClient(self.ipAdresse,502)
+        modbusclient.connect()
+        data=modbusclient.read_holdingregisters(addr,2)
+        modbusclient.close()
+        res =convert_registers_to_float(data)
+       
+        return res[0]
+        
+        
\ No newline at end of file
diff --git a/TP2/bitManip.py b/TP2/bitManip.py
new file mode 100644
index 0000000000000000000000000000000000000000..2f8ceb26ce056109e127d98f179d807daf0acc0f
--- /dev/null
+++ b/TP2/bitManip.py
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Mon Jun 22 16:43:58 2020
+
+@author: chevrier6
+"""
+
+######################
+def mask16(v):
+    "same as setBit(v,0)"
+    b=1
+    for i in range(v):
+        b*=2
+    return b
+
+# 4 next functions from https://wiki.python.org/moin/BitManipulation
+# testBit() returns a nonzero result, 2**offset, if the bit at 'offset' is one.
+def testBit(int_type, offset):
+    mask = 1 << offset
+    return(int_type & mask)
+
+  # setBit() returns an integer with the bit at 'offset' set to 1.
+
+def setBit(int_type, offset):
+    mask = 1 << offset
+    return(int_type | mask)
+
+ # clearBit() returns an integer with the bit at 'offset' cleared.
+
+def clearBit(int_type, offset):
+    mask = ~(1 << offset)
+    return(int_type & mask)
+
+ # toggleBit() returns an integer with the bit at 'offset' inverted, 0 -> 1 and 1 -> 0.
+
+def toggleBit(int_type, offset):
+    mask = 1 << offset
+    return(int_type ^ mask)
\ No newline at end of file
diff --git a/TP2/docArmoirePython.md b/TP2/docArmoirePython.md
new file mode 100644
index 0000000000000000000000000000000000000000..95dcaa37bce4bb21c22dbbf1a0cdd999900f58d4
--- /dev/null
+++ b/TP2/docArmoirePython.md
@@ -0,0 +1,43 @@
+# Une armoire c'est quoi ?
+
+- c'est un appareil électrique commandable à distance
+- il dispose de 7 charges différentes (numérotées de 0 à 6)  et de deux source d'alimentation 
+(source1 et source2)
+
+- chaque charge peut être en marche ou pas et soit sur source 1 soit sur source 2 indépendament des autres
+- on peut connaitre des infos sur chaque charges (U,I,P,PR) et sur chaque source (i.e. le cumul des charges en marche sur la source concernée)
+# Documentation code python de manipulation des armoires
+
+
+## Prerequis logiciel
+
+- utilisation de la librairie EasyModbus.py
+- utilisation d'un code bitManip.py
+
+## Code disponible
+
+### Note
+Actuellemnt seul le code pour l'armoire 6 est opérationnel
+
+### Utilisation
+
+- charger le fichier correspondant à l'armoire à utiliser (exemple Armoire6.py) et ses dépendances
+
+**Méthodes**
+
+* Constructeur *ArmoireX()* où X vaut 6
+
+* actions générales
+    - **resetAll**: remet tout à l'état d'origine
+    - **resetSource** / **resetCharge**: remet la partie source/charge à l'état d'origine
+ * actions sur les charges  
+    - **setCharge** / **unsetCharge** / **toggleCharge**(*n°charge*): met sur ON/OFF/état inverse la charge. *N°charge* doit être compris entre 0 et 6
+* Actions sur les sources
+    - **setSource1** / **setSource2** / **togglesource**(*n°charge*): met sur l'alimentaion 1/l'alimentation 2/inverse la source. *N°charge* doit être compris entre 0 et 6
+* Actions sur les sources
+   
+* lecture de valeurs (
+retourne une liste de valeurs  [U,I,PA,PR])
+    - **readSecteur1**: mesure pour la source 1
+    - **readSecteur2**: mesure pour la source 2
+    - **readMesure**(*n°charge*): mesure pour la charge paramètre (compris en 0 et 6)
\ No newline at end of file
diff --git a/TP2/test5.py b/TP2/test5.py
new file mode 100644
index 0000000000000000000000000000000000000000..70ef3be131ceb282098aa9ad4d4b6f2f02dec95d
--- /dev/null
+++ b/TP2/test5.py
@@ -0,0 +1,90 @@
+# -*- coding: utf-8 -*-
+"""
+Seule Test est à utiliser
+
+@author: chevrier6
+"""
+
+from Armoire5 import *
+#
+# a=Armoire6()
+# a.resetAll()
+# i=0
+# a.setCharge(i)
+# s=a.readMesure(i)
+# print(s)
+#
+# def chenillard():
+#     a=Armoire6()
+#     for i in range(a.nbCharge):
+#         a.setCharge(i)
+#         s=a.readMesure(i)
+#         print(s)
+
+def pprint(mesure):
+    output="U={:.2f} I={:.2f} PA={:.2f} PR={:.2f}"
+    return output.format(mesure[0],mesure[1],mesure[2],mesure[3])
+
+def test(charge):
+
+    a=Armoire5()
+    a.resetAll()
+    print("charge ",charge)
+    a.setCharge(charge)
+    s=a.readMesure(charge)
+    print(pprint(s), "\nS1" ,pprint(a.readSecteur1()),"\nS2", pprint(a.readSecteur2()),"\n")
+    a.setSource2(charge)
+    s=a.readMesure(charge)
+    print(pprint(s), "\nS1" ,pprint(a.readSecteur1()),"\nS2", pprint(a.readSecteur2()),"\n")
+    a.unsetCharge(charge)
+
+#
+# def chenillard2():
+#     a=Armoire6()
+#     a.resetAll()
+#     for i in range(a.nbCharge):
+#         print("charge ",i)
+#         a.setCharge(i)
+#         s=a.readMesure(i)
+#         print(s, "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
+#         a.setSource2(i)
+#         s=a.readMesure(i)
+#         print(s, "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
+#         a.unsetCharge(i)
+#
+#
+# def chenillard3():
+#     a=Armoire6()
+#     a.resetAll()
+#     for charge in range(a.nbCharge):
+#         print("charge ",charge)
+#         a.setCharge(charge)
+#         u,i,pa,pr=a.readMesure(charge)
+#         u1,i1,pa1,pr1=a.readSecteur1()
+#         u2,i2,pa2,pr2=a.readSecteur2()
+#         print((u,i,pa,pr), "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
+#         print(u-u1,i-i1,pa-pa1,pr-pr1)
+#         print(u-u2,i-i2,pa-pa2,pr-pr2)
+#         a.setSource2(charge)
+#         u,i,pa,pr=a.readMesure(charge)
+#         u1,i1,pa1,pr1=a.readSecteur1()
+#         u2,i2,pa2,pr2=a.readSecteur2()
+#         print((u,i,pa,pr), "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
+#         print(u-u1,i-i1,pa-pa1,pr-pr1)
+#         print(u-u2,i-i2,pa-pa2,pr-pr2)
+#         a.unsetCharge(charge)
+#
+# def chenillard2b():
+#     a=Armoire6()
+#     a.resetAll()
+#     for i in range(a.nbCharge):
+#         print("charge ",i)
+#         a.toggleCharge(i)
+#         s=a.readMesure(i)
+#         print(s, "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
+#         a.setSource2(i)
+#         s=a.readMesure(i)
+#         print(s, "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
+#         a.unsetCharge(i)
+
+#chenillard2b()
\ No newline at end of file
diff --git a/TP2/test6.py b/TP2/test6.py
new file mode 100644
index 0000000000000000000000000000000000000000..6473506ae4be3db666fd8252d440f3fb1547f7c0
--- /dev/null
+++ b/TP2/test6.py
@@ -0,0 +1,90 @@
+# -*- coding: utf-8 -*-
+"""
+
+
+@author: chevrier6
+"""
+
+from Armoire6 import *
+#
+# a=Armoire6()
+# a.resetAll()
+# i=0
+# a.setCharge(i)
+# s=a.readMesure(i)
+# print(s)
+#
+# def chenillard():
+#     a=Armoire6()
+#     for i in range(a.nbCharge):
+#         a.setCharge(i)
+#         s=a.readMesure(i)
+#         print(s)
+
+def pprint(mesure):
+    output="U={:.2f} I={:.2f} PA={:.2f} PR={:.2f}"
+    return output.format(mesure[0],mesure[1],mesure[2],mesure[3])
+
+def test(charge):
+
+    a=Armoire6()
+    a.resetAll()
+    print("charge ",charge)
+    a.setCharge(charge)
+    s=a.readMesure(charge)
+    print(pprint(s), "\nS1" ,pprint(a.readSecteur1()),"\nS2", pprint(a.readSecteur2()),"\n")
+    a.setSource2(charge)
+    s=a.readMesure(charge)
+    print(pprint(s), "\nS1" ,pprint(a.readSecteur1()),"\nS2", pprint(a.readSecteur2()),"\n")
+    a.unsetCharge(charge)
+
+#
+# def chenillard2():
+#     a=Armoire6()
+#     a.resetAll()
+#     for i in range(a.nbCharge):
+#         print("charge ",i)
+#         a.setCharge(i)
+#         s=a.readMesure(i)
+#         print(s, "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
+#         a.setSource2(i)
+#         s=a.readMesure(i)
+#         print(s, "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
+#         a.unsetCharge(i)
+#
+#
+# def chenillard3():
+#     a=Armoire6()
+#     a.resetAll()
+#     for charge in range(a.nbCharge):
+#         print("charge ",charge)
+#         a.setCharge(charge)
+#         u,i,pa,pr=a.readMesure(charge)
+#         u1,i1,pa1,pr1=a.readSecteur1()
+#         u2,i2,pa2,pr2=a.readSecteur2()
+#         print((u,i,pa,pr), "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
+#         print(u-u1,i-i1,pa-pa1,pr-pr1)
+#         print(u-u2,i-i2,pa-pa2,pr-pr2)
+#         a.setSource2(charge)
+#         u,i,pa,pr=a.readMesure(charge)
+#         u1,i1,pa1,pr1=a.readSecteur1()
+#         u2,i2,pa2,pr2=a.readSecteur2()
+#         print((u,i,pa,pr), "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
+#         print(u-u1,i-i1,pa-pa1,pr-pr1)
+#         print(u-u2,i-i2,pa-pa2,pr-pr2)
+#         a.unsetCharge(charge)
+#
+# def chenillard2b():
+#     a=Armoire6()
+#     a.resetAll()
+#     for i in range(a.nbCharge):
+#         print("charge ",i)
+#         a.toggleCharge(i)
+#         s=a.readMesure(i)
+#         print(s, "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
+#         a.setSource2(i)
+#         s=a.readMesure(i)
+#         print(s, "S1" ,a.readSecteur1(),"S2", a.readSecteur2())
+#         a.unsetCharge(i)
+
+#chenillard2b()
\ No newline at end of file
diff --git a/TP3/appli1.py b/TP3/appli1.py
new file mode 100644
index 0000000000000000000000000000000000000000..19436dbcfe51f0f6e15436fd5ace2f55b06388a0
--- /dev/null
+++ b/TP3/appli1.py
@@ -0,0 +1,44 @@
+
+
+# see https://openweathermap.org/api
+# what is possible : https://openweathermap.org/price#weather
+
+import requests
+
+
+# some simple manipulations
+
+# 1 get info on current weather
+# test code : print("Teste1",requests.get("https://api.openweathermap.org/data/2.5/weather?lat=35&lon=139&appid=a2cabf37326f4cf77d2948c17c62705a").text)
+
+
+## some parameters
+id = "6c7536caec8cea574d9b049fde683a35" # Api id Chevrier Thanks to use your own id ... :-)
+idSEG="a2cabf37326f4cf77d2948c17c62705a"
+lat = "48.650002" # latitude
+lon="6.18333" # longitude
+
+
+
+# websevice parameters
+wslon="lon="+lon
+wslat="lat="+lat
+wsappid="appid="+id
+
+# first request
+#--------------------------------
+requestTxt="https://api.openweathermap.org/data/2.5/weather?"+wslat+"&"+wslon+"&"+wsappid
+print("essai2", requestTxt)
+answer=requests.get(requestTxt)
+print(answer.text)
+
+
+# other example
+
+
+
+# exo 1
+requestSol=requestTxt+"&lang=fr"
+answer=requests.get(requestSol)
+print("sol",answer.text)
+
diff --git a/TP3/arguement.py b/TP3/arguement.py
new file mode 100644
index 0000000000000000000000000000000000000000..6d3d737afdb0f0de760125e5da794b937444b822
--- /dev/null
+++ b/TP3/arguement.py
@@ -0,0 +1,48 @@
+import json
+
+from flask import Flask, request, jsonify  # on importe le necessaire
+
+app = Flask(__name__) # notre appli
+
+@app.route('/service0')  # l'adresse sera service0 sur le serveur, le code en dessous sera la fonction appelée
+def requete():
+    args = request.args
+    print ("print info",args.values(),args.keys(),args.items()) # For debugging
+    rep=""
+    for k,v in args.items():
+        print (k,v)
+        rep+="("+k+","+v+")"
+    return rep
+# http://127.0.0.1:5000/exercise0  # exemple de texte à saisir dans un navigateur si host pas précisé
+# sinon voir l'adresse indiquée
+
+
+@app.route('/exemple3')
+def exemple3():
+    data=request.args
+    print( data['valeur'])
+# Modifiez pour renvoyer le nombre de minute
+    return "plouf"
+#http://127.0.0.1:5000//exemple3?valeur={"hour": 8, "min": 53, "second": 17, "text": "Coucou ! il est "}
+
+
+
+@app.route('/exemple4')  #
+def mini():
+    args = request.args
+    liste=args['liste']
+    val=json.loads(liste)
+    mini=min(val)
+    return jsonify(min=mini)
+#http://127.0.0.1:5000//exemple4?liste=[3,75,-9]
+
+@app.route('/exemple5')  #
+def somme():
+    args = request.args
+    a=int(args['a'])
+    b=int(args['b'])
+
+    return jsonify(somme=a+b)
+#http://127.0.0.1:5000//exemple5?a=12&b=2
+
+app.run(debug=True)
\ No newline at end of file
diff --git a/TP3/askex1.py b/TP3/askex1.py
new file mode 100644
index 0000000000000000000000000000000000000000..51e6f26d8a062ccbd0f68726164f6ce7dfb1131b
--- /dev/null
+++ b/TP3/askex1.py
@@ -0,0 +1,13 @@
+
+#exemple de requete
+import requests
+
+requetes =["http://127.0.0.1:5000/",
+"http://127.0.0.1:5000/bonjour",
+"http://127.0.0.1:5000/bonjour?nom=vincent"]
+
+
+for txt in requetes:
+    r = requests.get(txt)
+    print(r.text)
+
diff --git a/TP3/asksarg.py b/TP3/asksarg.py
new file mode 100644
index 0000000000000000000000000000000000000000..bdc3a66f4d03cb801d6777b88d9062f5c9d10094
--- /dev/null
+++ b/TP3/asksarg.py
@@ -0,0 +1,9 @@
+import requests
+
+
+test2="http://127.0.0.1:5000/service0?a=4&c=34"
+adresse=test2
+
+
+r = requests.get(adresse)
+print(r.text)
\ No newline at end of file
diff --git a/TP3/askservice1.py b/TP3/askservice1.py
new file mode 100644
index 0000000000000000000000000000000000000000..172e8053b7c8fd4a168421c844645fd9b1db615c
--- /dev/null
+++ b/TP3/askservice1.py
@@ -0,0 +1,10 @@
+import requests
+import time
+
+test2="http://127.0.0.1:5000/service1"
+adresse=test2
+
+for i in range(10):
+    time.sleep(1)
+    r = requests.get(adresse)
+    print(r.text)
\ No newline at end of file
diff --git a/TP3/askservice1j.py b/TP3/askservice1j.py
new file mode 100644
index 0000000000000000000000000000000000000000..5a39ec9a53490ab629f1a6da934a65ae4cd56f68
--- /dev/null
+++ b/TP3/askservice1j.py
@@ -0,0 +1,12 @@
+import requests
+import time
+
+test2="http://127.0.0.1:5000/service1j"
+adresse=test2
+
+for i in range(10):
+    time.sleep(1)
+    r = requests.get(adresse)
+    rep=  r.json()
+
+    print(r.text, rep['text'],rep['hour']+rep['min'],rep.get('inconnu'))
\ No newline at end of file
diff --git a/TP3/docu.md b/TP3/docu.md
new file mode 100644
index 0000000000000000000000000000000000000000..d80495546365b340b38b46ec0aaee72c55c5585d
--- /dev/null
+++ b/TP3/docu.md
@@ -0,0 +1,86 @@
+# Documentation for the examples
+*V Chevrier Dec 21*
+
+## What to know
+In python, use of **requests** package that enables call to web service (as html addresses do)
+and use of **flask** package for web services.
+
+## Examples Client side
+### File appli1.py
+Simple call to a distant web service : ask for weather in Nancy
+see https://openweathermap.org/current#geo for more information
+
+
+
+#### Questions
+
+- Explain why we need to write ***print(answer.text)***
+- what means the string output format ?
+#### Exercise:
+
+        1. Change response format to XML, the language as French
+        2. learn how to ask for weather forecast (with free version)
+        3. What happens if you type the following as address in your favorite web browser ?
+            https://api.openweathermap.org/data/2.5/weather?lat=35&lon=139&appid=a2cabf37326f4cf77d2948c17c62705a
+        4. Explain how to pass parameters to a web service
+
+#### API reference
+[https://openweathermap.org/api](https://openweathermap.org/price#weather)
+have a look on it to learn what is **possible** and how
+
+1. all requests need an id
+2. there is a limit on the number of requests each day
+
+## Examples: learn how to define services (and how to call them)
+
+### A) exemple1 (and askex1)
+basic service (just returns a string) and code for requests
+
+### B) argument.py / askarg.py
+A server to illustrate the use of arguments.
+
+Services :
+- service0 
+    Shows how to build a simple service that
+    - gets the parameters and their values
+    - returns them as a list of couple ou value
+    
+    The returned values are as text format.
+
+- exemple3 
+    How to get  the value of a parameter
+        
+        Note that the parameter are in Json format 
+        What is the type of the values we get ??
+        
+ - exemple 4 et exemple5 shows how to get typed values
+ 
+### C) service1.py/askservice1.py
+Simple service to show that returned value can change over time
+The returned values are as **text** format.
+
+
+### C') service1j.py/askservice1j.py
+Simple service to show that returned value can change over time.
+The returned values are as **json** format.
+
+In askservice1 client
+    - How is managed the json format?
+    - Can you see an advantage to use it?
+
+### service3.py
+##More interesting 
+### The shutdown problem
+When the server is running it uses a givent port on the machine and forbids another server to be run.
+
+According to your programmig environment, it can be very difficult to shutdown/kill the server.
+
+The file ***servershutdown.py*** shows how to integrate a shutdown service in the server.
+
+### Non local server
+
+serverNonLocal.py illustates how to have a non local server
+
+Shows how to build a server with several services
+
+See how the root return results as html
diff --git a/TP3/exemple1.py b/TP3/exemple1.py
new file mode 100644
index 0000000000000000000000000000000000000000..100136d7ab8eca2ce3861b433c3842ee904bbeb1
--- /dev/null
+++ b/TP3/exemple1.py
@@ -0,0 +1,23 @@
+
+from flask import Flask, request
+
+app = Flask(__name__)
+
+@app.route('/')
+def index():
+    return "Hello ! serveur de test"
+
+
+@app.route('/bonjour')
+def dire_bonjour():
+    args = request.args
+    nom = args.get('nom')
+    if nom==None:
+        nom='inconnu'
+    return 'bonjour '+nom
+
+#exemple de requete
+#http://127.0.0.1:5000/
+#http://127.0.0.1:5000/bonjour
+#http://127.0.0.1:5000/bonjour?nom=vincent
+app.run(debug=True)
\ No newline at end of file
diff --git a/TP3/serverNonLocal.py b/TP3/serverNonLocal.py
new file mode 100644
index 0000000000000000000000000000000000000000..c2af3ca796cf2ce0c2bee31d29695e66fcbfb41a
--- /dev/null
+++ b/TP3/serverNonLocal.py
@@ -0,0 +1,17 @@
+
+from flask import Flask, request  # on importe le necessaire
+
+app = Flask(__name__) # notre appli
+
+@app.route('/service0')  # l'adresse sera service0 sur le serveur, le code en dessous sera la fonction appelée
+def requete():
+    args = request.args
+    print ("print info",args.values(),args.keys(),args.items()) # For debugging
+    rep=""
+    for k,v in args.items():
+        print (k,v)
+        rep+="("+k+","+v+")"
+    return rep
+# http://127.0.0.1:5000/service0?a=4&c=34  # exemple de texte à saisir dans un navigateur
+#changer l'adresse avec celle fournie dans le shell
+app.run(debug=True,host='0.0.0.0')
\ No newline at end of file
diff --git a/TP3/servershutdown.py b/TP3/servershutdown.py
new file mode 100644
index 0000000000000000000000000000000000000000..d06651d057c0ce331b45ddf5d237fff339458043
--- /dev/null
+++ b/TP3/servershutdown.py
@@ -0,0 +1,30 @@
+
+from flask import Flask, request  # on importe le necessaire
+
+app = Flask(__name__) # notre appli
+
+# from http://web.archive.org/web/20190706125149/http://flask.pocoo.org/snippets/67
+def shutdown_server():
+    func = request.environ.get('werkzeug.server.shutdown')
+    if func is None:
+        raise RuntimeError('Not running with the Werkzeug Server')
+    func()
+
+
+@app.get('/shutdown')
+def shutdown():
+    shutdown_server()
+    return 'Server shutting down...'
+
+
+@app.route('/service0')  # l'adresse sera service0 sur le serveur, le code en dessous sera la fonction appelée
+def requete():
+    args = request.args
+    print ("print info",args.values(),args.keys(),args.items()) # For debugging
+    rep=""
+    for k,v in args.items():
+        print (k,v)
+        rep+="("+k+","+v+")"
+    return rep
+# http://127.0.0.1:5000/service0?a=4&c=34  # exemple de texte à saisir dans un navigateur
+app.run(debug=True)
\ No newline at end of file
diff --git a/TP3/service0Nonlovcal.py b/TP3/service0Nonlovcal.py
new file mode 100644
index 0000000000000000000000000000000000000000..37fc74c430b04f5dd8bc438ff2f847e5fba2966c
--- /dev/null
+++ b/TP3/service0Nonlovcal.py
@@ -0,0 +1,16 @@
+
+from flask import Flask, request  # on importe le necessaire
+
+app = Flask(__name__) # notre appli
+
+@app.route('/service0')  # l'adresse sera service0 sur le serveur, le code en dessous sera la fonction appelée
+def requete():
+    args = request.args
+    print ("print info",args.values(),args.keys(),args.items()) # For debugging
+    rep=""
+    for k,v in args.items():
+        print (k,v)
+        rep+="("+k+","+v+")"
+    return rep
+# http://127.0.0.1:5000/service0?a=4&c=34  # exemple de texte à saisir dans un navigateur
+app.run(debug=True)
\ No newline at end of file
diff --git a/TP3/service1.py b/TP3/service1.py
new file mode 100644
index 0000000000000000000000000000000000000000..a404035122ba5a2acd830cdf8877938a219db44e
--- /dev/null
+++ b/TP3/service1.py
@@ -0,0 +1,13 @@
+
+from flask import Flask
+from datetime import datetime
+
+app = Flask(__name__)  # notre appli
+
+@app.route('/service1') #  service (service1) et la fonction associé
+def dire_coucou():
+    myTime =datetime.today()
+    txt=str(myTime.hour)+"h "+str(myTime.minute)+"min "+str( myTime.second)+"s"
+    return 'Coucou ! il est '+ txt
+#http://127.0.0.1:5000/service1  # appel
+app.run(debug=True)
\ No newline at end of file
diff --git a/TP3/service1j.py b/TP3/service1j.py
new file mode 100644
index 0000000000000000000000000000000000000000..ad9bbe738b5b42f539aaa51ef24473974cafd0e9
--- /dev/null
+++ b/TP3/service1j.py
@@ -0,0 +1,13 @@
+
+from flask import Flask,jsonify
+
+from datetime import datetime
+
+app = Flask(__name__)
+
+@app.route('/service1j')
+def dire_coucou():
+    myTime =datetime.today()
+    return jsonify(text='Coucou ! il est ',hour=myTime.hour,min=myTime.minute,second=myTime.second)
+#http://127.0.0.1:5000/service1j
+app.run(debug=True)
\ No newline at end of file
diff --git a/annuaireFichier.md b/annuaireFichier.md
new file mode 100644
index 0000000000000000000000000000000000000000..c3dd36eb49fcbb98ff4d60df1192e73cea5939ec
--- /dev/null
+++ b/annuaireFichier.md
@@ -0,0 +1,22 @@
+# Annuaire des fichiers
+
+***REMARQUE IMPORTANTE***: la gestion des imports de module est à revoir pour les fichiers (la structure des répertoire de vos projets n'est pas forcément celle du git )
+
+## Code relatif au cours sur les processus (repertoire processus)
+- utilisation des processus : lancement et partageObj
+- exemple du cours (exclusion mutuelle et sa solution avec sémaphore): exclumutPb et exclumutPbSemaphore
+- exemple de syncrhonisation (pingpong et exJoinAlive)
+
+## Code relatif au TP2 (répertoire TP2)
+
+Vous trouverez:
+- une documentation
+
+et les fichiers suivants (besoin du module easymodbus)
+- Armoire5, Armoire6 code source pour accéder aux armoires 5 et 6
+- bitManip utilitaire
+- test5 et test6: code exemple d'utilisation des armoires
+
+##Code relatif au TP3 (répertoire TP3)
+
+Voir docu.md
\ No newline at end of file