Le Logiciel Raspberry Car – Tâche de surveillance OBD (2/5)
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)