Le Logiciel Raspberry Car – Tâche de stockage dans la DB locale (3/5)
En utilisant les techniques de la partie précédente, le code de la tache de stockage dans la DB locale effectuant le travail suivant :
- Initialiser la connexion DB (si on la réutilise entre les appels)
- On boucle
- Poser le verrou GPS : je bloque la mémoire pour la dernière position GPS
- Poser le verrou OBD : je bloque la mémoire pour la
dernière info OBD
- Action sécurisée : récupérer les dernières informations mise de côté par le programme GPS et OBD
- Débloquer le verrou GPS (cela a duré quelque millisecondes)
- Débloquer le verrou OBD (cela a duré quelque millisecondes)
- S’il y a une ou
plusieurs mesures à enregistrer
- Initialiser la connexion DB (si on ne la réutilise pas entre les appels)
- Poser le verrou
DB : je bloque l’accès à la base SQL
- Action sécurisée : Il les enregistre dans la base SQL
- Débloquer le verrou DB (cela a duré presque 1 seconde, car on écrit sur le disque)
- Fermer la connexion DB (si on ne la réutilise pas entre les appels)
- Attendre 60 secondes
Ressemble à
def store_pos_in_db(delay):
# la declaration de partage des variables memoriséé par le thread GPS
global lastGpsPositionMeasured;
global lastGpsLongitude;
global lastGpsLattitude;
global lastGpsSpeed
global lastGpsElevation;
global lastGpsMeasureTime;
global lastGpsTime;
# la declaration de partage des variables memoriséé par le thread OBD
global lastObdMeasured;
global lastObdMeasureTime;
global lastObdSpeed
global lastObdFuelLevel
global lastObdRpm
# initialisation des variables GPS
lastGpsPositionMeasured = False;
lastGpsLongitude = 0;
lastGpsLattitude =0;
lastGpsSpeed =0;
lastGpsElevation =0;
lastGpsMeasureTime =0;
lastGpsTime = 0
# initialisation OBD
lastObdMeasured = False;
lastObdMeasureTime = 0;
lastObdSpeed = 0;
lastObdFuelLevel= 0;
lastObdRpm= 0;
# deux mode possibles :
# - un ou on garde la connexion DB active entre chaque attente
# - un ou on la referme a chaque fois
if MODE_SHARED_DB_CONNECTION == True:
permanentDBConnectionB = sqlite3.connect(CAR_DB, isolation_level=None);
# on boucle en permanence
while True:
# on essaye d'ecrire vers la DB
print("DB: Try to store position");
# on bloque le verrou sur les variables partagées
threadGpsLock.acquire()
threadObdLock.acquire()
# on memorise l'heure courante (que l'on va memoriser : la dernière mesure est faite depuis quelques secondes
statustime=int(datetime.timestamp(datetime.now()))
# un affichage pour le debug
print (C_DB+ "--------------------------------------------", ENDC)
print (C_DB+ "DB: db.time :", datetime.utcfromtimestamp(statustime).strftime('%Y-%m-%d %H:%M:%S') , ENDC)
print (C_DB+ "--------------------------------------------", ENDC)
print (C_DB+ "DB: g.status :", lastGpsPositionMeasured, ENDC)
print (C_DB+ "DB: g.time :", datetime.utcfromtimestamp(lastGpsMeasureTime).strftime('%Y-%m-%d %H:%M:%S'), ENDC)
print (C_DB+ "DB: g.lat. :", lastGpsLattitude, ENDC)
print (C_DB+ "DB: g.long :", lastGpsLongitude, ENDC)
print (C_DB+ "DB: g.speed :", lastGpsSpeed, ENDC)
print (C_DB+ "DB: g.elev :", lastGpsElevation, ENDC)
print (C_DB+ "DB: g.gtime :", datetime.utcfromtimestamp(lastGpsTime).strftime('%Y-%m-%d %H:%M:%S'), ENDC)
print (C_DB+ "--------------------------------------------", ENDC)
print (C_DB+ "DB: o.status :", lastObdMeasured, ENDC)
print (C_DB+ "DB: o.time :", datetime.utcfromtimestamp(lastObdMeasureTime).strftime('%Y-%m-%d %H:%M:%S'), ENDC)
print (C_DB+ "DB: o.speed :", lastObdSpeed, ENDC)
print (C_DB+ "DB: o.rpm :", lastObdRpm, ENDC)
print (C_DB+ "DB: o.fuel :", lastObdFuelLevel, ENDC)
print (C_DB+ "--------------------------------------------", ENDC)
# si un des threads a une nouvelle donnée
if lastGpsPositionMeasured == True or lastObdMeasured == True :
# on bloque l'accès à la DB, pour que le threqd SF ne trqvqille pqs en meme temps
threadDbLock.acquire()
# si on est dans le mode DB en permanence active, on utilise la connection, sinon on l'ouvre
if MODE_SHARED_DB_CONNECTION == True:
conn = permanentDBConnectionB
else :
print(C_SF+"DB : Connect to DB", ENDC);
conn = sqlite3.connect(CAR_DB, isolation_level=None);
print("DB : Store position");
# on cree le texte de la requete pour inserer dans la base
sql = ''' INSERT INTO car_status(statusdate, gps_longitude , gps_latitude, sent, gps_speed, gps_elevation, obd_speed, obd_fuellevel, obd_rpm, gps_measure_time, obd_measure_time, gps_time)
VALUES(?,?,?,?,?,?,?,?,?,?,?,?) '''
# on ouvre le curseur vers la DB, et on lui demande d'executer la requete avec ces paramètres
cur = conn.cursor()
cur.execute(sql, (statustime, lastGpsLongitude, lastGpsLattitude, 0, lastGpsSpeed, lastGpsElevation, lastObdSpeed,lastObdFuelLevel,lastObdRpm,lastGpsMeasureTime,lastObdMeasureTime,lastGpsTime))
# si on est dans le mode où on ouvre et ferme la connection à chaqiue fois, on la referme
if MODE_SHARED_DB_CONNECTION == False:
conn.close()
print("DB : Connection closed");
# on libere le verrou d'accès à la DB (le thread SF peut maintenant lire
threadDbLock.release()
# on libere les verrous d'accès aux variables pour que les thread OBD et GPS puissent y écrire
threadGpsLock.release()
threadObdLock.release()
time.sleep(delay)