Exemplo n.º 1
0
    def Remove(self):

        # Popup de confirmation
        confirmation = Popup(
            self,
            2,
            texte="Souhaitez-vous confirmer la suppression du robot " +
            self.robotSelected.get() + " ?",
            valider="Oui",
            fermer="Non")
        if confirmation == False:
            return
        retour = self.root.dB.DeleteRobot(self.robotSelected.get())

        # Vérification que la suppression a bien été effectuée
        if retour == False:
            Popup(self, 1, texte="Impossible de supprimer le dernier robot.")
            return

        Popup(self,
              1,
              texte="Le robot " + self.robotSelected.get() +
              " a bien été supprimé.")

        # Remise à zéro des menus déroulants
        RefreshOptionMenu(self)
        self.robotSelected.set(self.robotList[0])
        self.root.mainMenuWindow.robotSelected.set(self.robotList[0])
        self.root.maintenanceWindow.robotSelected.set(self.robotList[0])
Exemplo n.º 2
0
    def Close(self):

        retour = Popup(self,
                       2,
                       texte="Toute calibration non validée sera perdue.",
                       fermer="Annuler",
                       valider="Quitter")
        if retour == True:
            self.root.maintenanceWindow.Open()
Exemplo n.º 3
0
 def Open(self):
     if self.root.activeFrame == self.root.mainMenuWindow.masterFrame:
         retour = Popup(
             self,
             2,
             texte="ATTENTION: Ce menu est réservé aux personnel habilité.",
             valider="Continuer",
             fermer="Retour")
         if retour == False:
             return
     SwitchWindow(self.masterFrame, self.root)
     RefreshOptionMenu(self)
Exemplo n.º 4
0
    def Close(self):

        # Popup de confirmation pour arrêter le programme et éteindre la Raspberry
        arret = Popup(self,
                      2,
                      texte="Etes-vous sûr de vouloir arrêter le système ?",
                      valider="Oui",
                      fermer="Non")
        if arret == True:
            command = "/usr/bin/sudo /sbin/shutdown -h now"
            process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
            process.communicate()[0]
            self.root.destroy()
 def Open(self):
     self.robotSelected = self.root.mainMenuWindow.robotSelected
     if self.root.activeFrame == self.root.mainMenuWindow.masterFrame:
         retour = Popup(self,
                        2,
                        texte="Démarrer le diagnostic du robot " +
                        str(self.robotSelected.get()) + " ?",
                        valider="Oui",
                        fermer="Non")
         if retour == False:
             return
     SwitchWindow(self.masterFrame, self.root)
     self.Refresh()
     self.AutoDiag()
Exemplo n.º 6
0
 def AutomaticCalibration(self):
     # Lancement de la calibration automatique après popup de vérification
     validation = Popup(
         self,
         2,
         texte=
         "ATTENTION: Le processus de calibration ne peut pas être interrompu.",
         valider="Continuer",
         fermer="Annuler")
     if validation == False:
         return
     validation = AutoCalib(self)
     if validation == True:
         self.Refresh()
         Popup(
             self,
             1,
             texte=
             "La calibration automatique a été effectuée, vous pouvez rebrancher les capteurs."
         )
     else:
         Popup(self,
               1,
               texte="Il y a eu une erreur lors de la calibration.")
Exemplo n.º 7
0
    def ValidateCalibration(self):

        # Remise à zéro des listes de données pour éviter les duplicatas
        self.sensorDict = {}
        self.actuatorDict = {}

        # On récupère la liste des valeurs des capteurs depuis les champs de texte
        for sensor in self.sensorEntryVarList:
            category = sensor[0].get()
            subCategory = sensor[1].get()
            try:
                self.sensorDict[category]
            except:
                self.sensorDict[category] = {}
            self.sensorDict[category][subCategory] = {}
            for dataTuple in sensor[2:]:
                if dataTuple[1].get() == None or dataTuple[1].get() == '':
                    self.sensorDict[category][subCategory][
                        dataTuple[0].get()] = float(0)
                elif dataTuple[1].get() == 'None':
                    self.sensorDict[category][subCategory][
                        dataTuple[0].get()] = None
                else:
                    try:
                        self.sensorDict[category][subCategory][
                            dataTuple[0].get()] = float(dataTuple[1].get())
                    except:
                        self.sensorDict[category][subCategory][
                            dataTuple[0].get()] = dataTuple[1].get()

        # On récupère la liste des valeurs des actionneurs depuis les champs de texte
        for actuator in self.actuatorEntryVarList:
            category = actuator[0].get()
            subCategory = actuator[1].get()
            try:
                self.actuatorDict[category]
            except:
                self.actuatorDict[category] = {}
            self.actuatorDict[category][subCategory] = {}
            for dataTuple in actuator[2:]:
                if dataTuple[1].get() == None or dataTuple[1].get() == '':
                    self.actuatorDict[category][subCategory][
                        dataTuple[0].get()] = float(0)
                elif dataTuple[1].get() == 'None':
                    self.actuatorDict[category][subCategory][
                        dataTuple[0].get()] = None
                else:
                    try:
                        self.actuatorDict[category][subCategory][
                            dataTuple[0].get()] = float(dataTuple[1].get())
                    except:
                        self.actuatorDict[category][subCategory][
                            dataTuple[0].get()] = dataTuple[1].get()

        # On ouvre une popup de validation et on récupère le choix de l'utilisateur
        confirmation = Popup(self,
                             2,
                             texte="Souhaitez-vous confirmer la calibration ?",
                             valider="Oui",
                             fermer="Non")

        # On modifie les valeurs de la robot dans la base de donnée via la fonction de robot_dB et on ouvre un popup de confirmation
        if confirmation == True:
            self.root.dB.ModifyRobot(self.robotSelected.get(),
                                     self.nameRobot.get(),
                                     int(self.gearsRobot.get()),
                                     self.typeRobot.get(),
                                     float(self.margin.get()), self.sensorDict,
                                     self.actuatorDict)
            Popup(self,
                  1,
                  texte="La calibration du robot " + self.nameRobot.get() +
                  " a été enregistré dans la base de données.")

        # On réinitialise les listes de capteurs et d'actionneurs
        self.sensorDict = {}
        self.actuatorDict = {}

        # On ferme la page de calibration
        self.root.maintenanceWindow.Open()
Exemplo n.º 8
0
def AutoCalib(self):

    # On demande de vérifier le branchement des capteurs
    self.centerFrame.place_forget()
    self.centerSubFrameBis.pack(side= 'top', pady= 100)

    self.diagConsole.delete(0, last= 'end')
            
    self.diagConsole.insert('end', "[AutoCalib] : Initialisation de la calibration automatique pour le robot: " + self.robotAttributes['Name'] + '...')
    self.root.update()

    Popup(self, 1, texte= "Assurez vous que tous les capteurs sont branchés avant de continuer.", fermer= 'Continuer')
    self.root.update()

    # On éteint les relais
    self.root.interface.GPIOReset()

    # Récupération de la déviation des capteurs branchés
    self.diagConsole.insert('end', "[AutoCalib] : Récupération de la déviation nominale des capteurs...")
    self.root.update()

    for category in self.robotAttributes['Sensors']:
        for subCategory in self.robotAttributes['Sensors'][category]:
            tempList = []
            for i in range(1000):
                tempList.append(self.root.interface.sensorClass[category][subCategory].Poll())
            avgVal = mean(tempList)
            variance = 0
            for i in tempList:
                variance += (i - avgVal)**2
            variance = variance / len(tempList)
            if round(variance**(0.5), 2) < 0.01:
                self.robotAttributes['Sensors'][category][subCategory]['Deviation'] = 0.02
            else:
                self.robotAttributes['Sensors'][category][subCategory]['Deviation'] = round(variance**(0.5), 2)

    self.diagConsole.insert('end', "[AutoCalib] : Déviation nominale des capteurs enregistrée.")
    self.diagConsole.itemconfig('end', fg= 'green')
    self.root.update()
    if self.robotAttributes['Type'] != 'Electrique':
        # Calibration du système de pression
        self.diagConsole.insert('end', "[AutoCalib] : Initialisation de la calibration du système de pression...")
        self.root.update()

        pressureSensor = self.root.interface.sensorClass['Pression']['Robot']
        pressureActuator = self.root.interface.actuatorClass['Electro_pompe']['Robot']
        evDict = self.robotAttributes['Actuators']['Electrovanne']
        evClassList = []
        for subCategory in evDict:
        	evClassList.append(self.root.interface.actuatorClass['Electrovanne'][subCategory])

        # Vidage de la pression
        self.diagConsole.insert('end', "[AutoCalib] : Diminution de la pression...")
        self.root.update()

        for i in range(5):
            for ev in evClassList:
                ev.Set(state= 1)
                sleep(0.5)
                ev.Set(state= 0)
                sleep(0.25)

        # Sauvegarde de la pression minimale
        self.robotAttributes['Sensors']['Pression']['Robot']['Min'] = pressureSensor.Poll(100)
        minPressure = self.robotAttributes['Sensors']['Pression']['Robot']['Min']

        self.diagConsole.insert('end', "[AutoCalib] : Pression minimale atteinte à " + str(minPressure) + "V .")
        self.diagConsole.itemconfig('end', fg= 'green')
        self.root.update()

        # Détermination de la pression maximale et minimale
        self.diagConsole.insert('end', "[AutoCalib] : Détermination de la pression maximale...")
        self.root.update()

        timer = 5
        counter = 0
        # Sélection d'un actionneur hydraulique
        for actuator in evDict:
            if '+' in actuator:
                print(actuator)
                positionSensor = self.root.interface.sensorClass['Position'][actuator.rstrip(' +-') + ' 1']
                actuatorUp = self.root.interface.actuatorClass['Electrovanne'][actuator]
                try:
                    actuatorDown = self.root.interface.actuatorClass['Electrovanne'][actuator.rstrip(' +') + ' -']
                except:
                    actuatorDown = self.root.interface.actuatorClass['Electrovanne'][actuator]
                objective = 4
                # Récupération de son min et max
                pressureActuator.Set(state = 1)
                sleep(3)
                pressureActuator.Set(state = 0)
                val1 = positionSensor.Poll(5)
                actuatorDown.Set(state= 1)
                sleep(0.5)
                val2 = positionSensor.Poll(5)
                actuatorDown.Set(state= 0)
                sleep(0.5)
                val3 = positionSensor.Poll(5)
                actuatorUp.Set(state= 1)
                sleep(0.5)
                val4 = positionSensor.Poll(5)
                actuatorUp.Set(state= 0)
                sleep(0.5)
                val5 = positionSensor.Poll(5)
                minSensor = min(val1, val2, val3, val4, val5)
                maxSensor = min(val1, val2, val3, val4, val5)
                # Vidage de la pression
                scaling = self.robotAttributes['Sensors']['Pression']['Robot']['MarginScaling']
                margin = self.robotAttributes['Margin']
                while pressureSensor.Poll(100) > minPressure + margin*scaling:
                    for ev in evClassList:
                        ev.Set(state= 1)
                        sleep(0.5)
                        ev.Set(state= 0)
                        sleep(0.25)
                # Augmentation de la pression max jusqu'à ce que l'actionneur effectue le nombre de va et vient ciblé
                counter = 0
                scalingSensor = self.robotAttributes['Sensors']['Position'][actuator.rstrip(' +-') + ' 1']['MarginScaling']
                while counter < objective:
                    counter = 0
                    pressureActuator.Set(state = 1)
                    sleep(timer)
                    pressureActuator.Set(state = 0)
                    sleep(0.5)
                    self.robotAttributes['Sensors']['Pression']['Robot']['Max'] = pressureSensor.Poll(5)
                    print('new max pressure =', self.robotAttributes['Sensors']['Pression']['Robot']['Max'], 'timer =', timer)
                    while counter < objective:
                        val1 = positionSensor.Poll(5)
                        actuatorDown.Set(state= 1)
                        sleep(0.5)
                        val2 = positionSensor.Poll(5)
                        actuatorDown.Set(state= 0)
                        sleep(0.5)
                        val3 = positionSensor.Poll(5)
                        actuatorUp.Set(state= 1)
                        sleep(0.5)
                        val4 = positionSensor.Poll(5)
                        actuatorUp.Set(state= 0)
                        sleep(0.5)
                        val5 = positionSensor.Poll(5)
                        minTest = min(val1, val2, val3, val4, val5)
                        maxTest = min(val1, val2, val3, val4, val5)
                        if abs(minTest-minSensor) > margin*scalingSensor and abs(maxTest-maxSensor) > margin*scalingSensor:
                            break
                        counter += 1
                    print('counter = ', counter)
                    if counter != objective:
                        timer += 1
                # Vidage de la pression
                while pressureSensor.Poll(100) > minPressure + margin*scaling:
                    for ev in evClassList:
                        ev.Set(state= 1)
                        sleep(0.5)
                        ev.Set(state= 0)
                        sleep(0.25)

        self.diagConsole.insert('end', "[AutoCalib] : Pression maximale atteinte à " + str(self.robotAttributes['Sensors']['Pression']['Robot']['Max']) + "V .")
        self.diagConsole.itemconfig('end', fg= 'green')
        self.root.update()

        # Récupération du temps que met la pompe pour atteindre la pression max
        self.diagConsole.insert('end', "[AutoCalib] : Détermination du temps de monté en pression...")
        self.root.update()

        self.robotAttributes['Actuators']['Electro_pompe']['Robot']['Time'] = self.root.interface.actuatorClass['Electro_pompe']['Robot'].GetTime(self.robotAttributes)

        self.diagConsole.insert('end', "[AutoCalib] : La pompe met " + str(self.robotAttributes['Actuators']['Electro_pompe']['Robot']['Time']) + "sec à monter en pression.")
        self.diagConsole.itemconfig('end', fg= 'green')
        self.root.update()

    # Détermination des min et max capteur position et de leur type
    self.diagConsole.insert('end', "[AutoCalib] : Détermination du min/max des actionneurs et de leur type...")
    self.root.update()
    for subCategory in self.robotAttributes['Sensors']['Position']:
        if self.robotAttributes['Type'] != 'Electrique':
            pressureActuator.Set(state= 1)
            while self.robotAttributes['Sensors']['Pression']['Robot']['Max'] > pressureSensor.Poll(50):
                sleep(0.1)
            pressureActuator.Set(state= 0)
        self.robotAttributes['Sensors']['Position'][subCategory]['ActuatorType'] = self.root.interface.sensorClass['Position'][subCategory].GetActuatorType(self.robotAttributes)
        if self.robotAttributes['Type'] != 'Electrique':
            pressureActuator.Set(state= 1)
            while self.robotAttributes['Sensors']['Pression']['Robot']['Max'] > pressureSensor.Poll(50):
                sleep(0.1)
            pressureActuator.Set(state= 0)
        self.robotAttributes['Sensors']['Position'][subCategory]['Min'], self.robotAttributes['Sensors']['Position'][subCategory]['Max'] = self.root.interface.sensorClass['Position'][subCategory].GetMinMax(self.robotAttributes)

        self.diagConsole.insert('end', "[AutoCalib] : Actionneur de " + str(subCategory) + " (Min: " + str(self.robotAttributes['Sensors']['Position'][subCategory]['Min']) + "V; Max: " + str(self.robotAttributes['Sensors']['Position'][subCategory]['Max']) + "V; Type: " + str(self.robotAttributes['Sensors']['Position'][subCategory]['ActuatorType']) + ").")
        self.diagConsole.itemconfig('end', fg= 'green')
        self.root.update()

    self.robotAttributes['Sensors']['Vitesse']['Boîte de vitesses']['Min'], self.robotAttributes['Sensors']['Vitesse']['Boîte de vitesses']['Max'] = self.root.interface.sensorClass['Vitesse']['Boîte de vitesses'].GetMinMax(self.robotAttributes)

    self.diagConsole.insert('end', "[AutoCalib] : Capteur de vitesse (Repos: " + str(self.robotAttributes['Sensors']['Vitesse']['Boîte de vitesses']['Min']) + "V; Nominal: " + str(self.robotAttributes['Sensors']['Vitesse']['Boîte de vitesses']['Max']) + "Hz).")
    self.diagConsole.itemconfig('end', fg= 'green')
    self.root.update()

    # Récupération de la déviation des capteurs branchés
    self.diagConsole.insert('end', "[AutoCalib] : Récupération de la déviation dégradée des capteurs...")
    self.root.update()

    print('début du calcul dev')
    Popup(self, 1, texte= "Veuillez débrancher tous les capteurs et appuyer sur 'Continuer'", fermer= 'Continuer')
    self.root.update()
    for category in self.robotAttributes['Sensors']:
        for subCategory in self.robotAttributes['Sensors'][category]:
            tempList = []
            for i in range(1000):
                tempList.append(self.root.interface.sensorClass[category][subCategory].Poll())
            avgVal = mean(tempList)
            variance = 0
            for i in tempList:
                variance += (i - avgVal)**2
            variance = variance / len(tempList)
            self.robotAttributes['Sensors'][category][subCategory]['DeviationErr'] = round(variance**(0.5), 2)
    print('fin du calcul dev')

    print(self.robotAttributes)

    self.diagConsole.insert('end', "[AutoCalib] : Déviation dégradée des capteurs enregistrée.")
    self.diagConsole.itemconfig('end', fg= 'green')
    self.root.update()

    # Vidage de la pression
    self.diagConsole.insert('end', "[AutoCalib] : Diminution de la pression...")
    self.root.update()

    for i in range(5):
        for ev in evClassList:
            ev.Set(state= 1)
            sleep(0.5)
            ev.Set(state= 0)
            sleep(0.25)

    self.diagConsole.insert('end', "[AutoCalib] : Fin de la calibration automatique.")
    self.root.update()

    self.centerFrame.place(relx = 0.20, rely= 0.20)
    self.centerSubFrameBis.pack_forget()

    return True
    def Stop(self, pressureSensorTest=False):

        # Affichage du nombre d'erreur avec un code couleur approrié
        self.diagConsole.insert(
            'end', "[AutoDiag] : Le diagnostic a trouvé " +
            str(self.errCount) + " erreur(s).")
        if self.errCount == 0:
            self.diagConsole.itemconfig('end', fg='green')
            self.root.update()
        else:
            self.diagConsole.itemconfig('end', fg='red')
            self.root.update()

        self.diagConsole.insert(
            'end', "[AutoDiag] : Abaissement de la pression au minimum...")
        self.root.update()
        LowerPressure(self, pressureSensorTest)
        self.diagConsole.insert(
            'end', "[AutoDiag] : Création du résumé du diagnostic...")
        self.root.update()

        for category in self.sensorErrDict:
            for subCategory in self.sensorErrDict[category]:
                errors = self.sensorErrDict[category][subCategory]
                if errors != []:
                    for error in errors:
                        self.diagConsole.insert(
                            'end', "[Conclusion] (" + category + ' ' +
                            subCategory + ") : " + error)
                        self.diagConsole.itemconfig('end', fg='blue')
                        self.root.update()
                        print('[Conclusion] (' + category + ' ' + subCategory +
                              ') : ' + error)
        for category in self.actuatorErrDict:
            for subCategory in self.actuatorErrDict[category]:
                errors = self.actuatorErrDict[category][subCategory]
                if errors != []:
                    for error in errors:
                        self.diagConsole.insert(
                            'end', "[Conclusion] (" + category + ' ' +
                            subCategory + ") : " + error)
                        self.diagConsole.itemconfig('end', fg='blue')
                        self.root.update()
                        print('[Conclusion] (' + category + ' ' + subCategory +
                              ') : ' + error)

        self.diagConsole.insert('end',
                                "[AutoDiag] : Fin du diagnostic automatique.")
        self.root.update()

        sleep(0.5)

        genRapport = Popup(self,
                           2,
                           texte="Voulez-vous générer un rapport ?",
                           valider="Oui",
                           fermer="Non")
        if genRapport == True:

            self.diagConsole.insert('end',
                                    "[Rapport] : Génération du rapport...")
            self.root.update()

            pdf = PDF()
            pdf.add_page()
            pdf.setup()
            pdf.add_robot(self.robotSelected.get())
            for category in self.sensorErrDict:
                for subCategory in self.sensorErrDict[category]:
                    errList = self.sensorErrDict[category][subCategory]
                    if len(errList) != 0:
                        for error in errList:
                            if 'Robot' in subCategory:
                                pdf.add_error('Pression', error)
                            elif 'Sélection' in subCategory:
                                pdf.add_error('Sélection', error)
                            elif 'Embrayage' in subCategory:
                                pdf.add_error('Embrayage', error)
                            elif 'Engagement' in subCategory:
                                pdf.add_error('Engagement', error)
                            else:
                                pdf.add_error('Autre', error)

            for category in self.actuatorErrDict:
                for subCategory in self.actuatorErrDict[category]:
                    errList = self.actuatorErrDict[category][subCategory]
                    if len(errList) != 0:
                        for error in errList:
                            if 'Robot' in subCategory:
                                pdf.add_error('Pression', error)
                            elif 'Sélection' in subCategory:
                                pdf.add_error('Sélection', error)
                            elif 'Embrayage' in subCategory:
                                pdf.add_error('Embrayage', error)
                            elif 'Engagement' in subCategory:
                                pdf.add_error('Engagement', error)
                            else:
                                pdf.add_error('Autre', error)

            if pdf.errPre == 0:
                if self.testPre:
                    pdf.add_error('Pression',
                                  'Système hydraulique opérationnel')
                else:
                    pdf.add_error('Pression', 'Système hydraulique non testé')
            if pdf.errSel == 0:
                if self.testSel:
                    pdf.add_error('Sélection',
                                  'Système de sélection opérationnel')
                else:
                    pdf.add_error('Sélection',
                                  'Système de sélection non testé')
            if pdf.errEmb == 0:
                if self.testEmb:
                    pdf.add_error('Embrayage',
                                  "Système d'embrayage opérationnel")
                else:
                    pdf.add_error('Embrayage', "Système d'embrayage non testé")
            if pdf.errEng == 0:
                if self.testEng:
                    pdf.add_error('Engagement',
                                  "Système d'engagement opérationnel")
                else:
                    pdf.add_error('Engagement',
                                  "Système d'engagement non testé")
            if pdf.errAut == 0:
                if self.testVit:
                    pdf.add_error('Autre', 'Capteur de vitesse opérationnel')
                else:
                    pdf.add_error('Autre', 'Capteur de vitesse non testé')

            self.diagConsole.insert('end',
                                    "[Rapport] : Le rapport à été généré.")
            self.root.update()
            self.diagConsole.insert(
                'end', "[Rapport] : Envoi du mail contenant le rapport...")
            self.root.update()

            pdf.set_receiver_email(
                self.root.configDict['PDF_Generator']['ReceiverEmail'])

            validation = pdf.done()

            if validation:
                self.diagConsole.insert(
                    'end', "[Rapport] : Le rapport à été envoyé.")
                self.root.update()
            else:
                self.diagConsole.insert(
                    'end', "[Rapport] : Le rapport n'a pas pu être envoyé.")
                self.root.update()

        self.buttonRelancer.config(state='normal')
        self.buttonRetour.config(state='normal')
        return
Exemplo n.º 10
0
    def Valid(self):

        # On rafraichit la page pour éviter les bugs
        self.RefreshEntryNumber()

        # On vide les listes de données pour éviter les duplicatas
        self.sensorDict = {}
        self.actuatorDict = {}

        # On récupère le nombre de rapports et on vérifie qu'il vaut au moins 2
        if self.numberOfGear.get() == '':
            self.numberOfGear.set(0)
        if int(self.numberOfGear.get()) < 2:
            Popup(self, 1, texte="La robot doit avoir au moins deux rapports.")
            return

        # On ajoute les capteurs sélectionnés à notre liste de données capteurs et on vérifie qu'il n'y a pas de doublon
        for i in range(len(self.sensorOMVarList)):
            category = self.sensorOMVarList[i].get()
            subCategory = self.sensorSubOMVarList[i].get()
            try:
                self.sensorDict[category]
            except:
                self.sensorDict[category] = {}
            if subCategory in self.sensorDict[category]:
                Popup(self,
                      1,
                      texte=
                      "La robot ne peut pas avoir deux fois le même capteur.")
                return
            self.sensorDict[category][subCategory] = (
                self.root.interface.sensorClass[category]
                [subCategory].GetdBValues())

        # On ajoute les actionneurs sélectionnés à notre liste de données actionneurs et on vérifie qu'il n'y a pas de doublon
        for i in range(len(self.actuatorOMVarList)):
            category = self.actuatorOMVarList[i].get()
            subCategory = self.actuatorSubOMVarList[i].get()
            try:
                self.actuatorDict[category]
            except:
                self.actuatorDict[category] = {}
            if subCategory in self.actuatorDict[category]:
                Popup(
                    self,
                    1,
                    texte=
                    "La robot ne peut pas avoir deux fois le même actionneur.")
                return
            for category in self.actuatorDict:
                if subCategory in self.actuatorDict[category]:
                    Popup(
                        self,
                        1,
                        texte=
                        "La robot ne peut pas avoir deux actionneurs à la même position."
                    )
                    return
            self.actuatorDict[category][subCategory] = (
                self.root.interface.actuatorClass[category]
                [subCategory].GetdBValues())

        # On envoi le tout à la base de données et on vérifie qu'il n'y a pas eu d'erreur
        retour = self.root.dB.AddRobot(self.nameRobot.get(),
                                       int(self.numberOfGear.get()),
                                       self.typeRobot.get(),
                                       self.root.interface.margin,
                                       self.sensorDict, self.actuatorDict)
        if retour == False:
            Popup(self,
                  1,
                  texte="La robot existe déjà ou le nom est invalide.")
            return
        Popup(self, 1, texte="La robot a bien été ajouté.")

        # On remet à zéro la fenêtre
        self.Reset()