En utilisant les techniques de la partie précédente, le code de la tache de récupération des infos OBD effectuant le travail suivant :

  • Initialiser la connexion
  • En boucle :
    • Demander à la carte les informations de la voiture
    • Poser le verrou OBD : je bloque la mémoire pour la dernière info OBD
      • Action sécurisée : Il met de côté la réponse avec l’heure
    • Débloquer le verrou OBD (cela a duré quelque millisecondes)
    • Attendre

ressemble à :

def watch_odb(obdPort, delay):
    # la demande d'utilisation des variables dans lesquelles la thread gps stoque ce qu'elle qa trouvé
    global lastObdMeasured;
    global lastObdMeasureTime;
    global lastObdSpeed
    global lastObdFuelLevel
    global lastObdRpm
    
    # l'ouvertur de la connection obd sur le port
    connection = obd.OBD(obdPort)
    
    # tant que l'on n'est pas interrompu
    while True:
        try:
            # on lit les trois valeurs qui nous interesse (vitesse, les tours par minute, le niveau de carburant
            response_speed = connection.query(obd.commands.SPEED) 
            response_rpm = connection.query(obd.commands.RPM ) 
            response_fuellevel = connection.query(obd.commands.FUEL_LEVEL ) 
     
            # si on est en mode debug, on affiche le detail
            if DEBUG_OBD == True:
                print(C_OBD+ "--------------------------------------------", ENDC)
                print(C_OBD+ "ODB : SPEED :", response_speed.value, ENDC) 
                print(C_OBD+ "ODB : RPM   :", response_rpm.value, ENDC) 
                print(C_OBD+ "ODB : FUEL  :", response_fuellevel.value, ENDC) 
                print(C_OBD+ "--------------------------------------------", ENDC)

            # on essaye de decoder les trois reponses
            try :
                speedValue = response_speed.value.magnitude;
            except:
                speedValue = -1
                
            try :
                rpmValue = response_rpm.value.magnitude;
            except:
                rpmValue = -1
                
            try :
                fuelLevelValue = response_fuellevel.value.magnitude;
            except:
                fuelLevelValue = -1
            
            # on va placer les valeurs lues dans les variables globales
            # mais pour eviter qu'une autre thread les lise pendant qu'on les modifie on demande le verrou
            threadObdLock.acquire()
            # on indique qu'on a eu une nouvelle mesure reussie
            lastObdMeasured = True
            # on memorise l'heure
            lastObdMeasureTime = int(datetime.timestamp(datetime.now()))
            # on memorise le resultta du OBD
            lastObdSpeed = speedValue;
            lastObdRpm = rpmValue;
            lastObdFuelLevel = fuelLevelValue;
            # et on  libère le verrou une fois les valeurs stoquées           
            threadObdLock.release()
        except Exception as e:
            print(C_ERROR+"OBD : Error: unable to getOBD Data", ENDC)
            print(C_ERROR+str(e), ENDC)

        time.sleep(delay)