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)