{"id":963,"date":"2020-02-01T13:12:00","date_gmt":"2020-02-01T12:12:00","guid":{"rendered":"http:\/\/wollef.org\/?p=963"},"modified":"2020-02-01T13:12:00","modified_gmt":"2020-02-01T12:12:00","slug":"le-logiciel-raspberry-car-tache-de-surveillance-gps","status":"publish","type":"post","link":"https:\/\/wollef.org\/blog\/le-logiciel-raspberry-car-tache-de-surveillance-gps\/","title":{"rendered":"Le Logiciel Raspberry Car &#8211; T\u00e2che de surveillance GPS (1\/5)"},"content":{"rendered":"\n<p>En utilisant les\ntechniques de la partie pr\u00e9c\u00e9dente, le code de la tache de r\u00e9cup\u00e9ration des\ninfos GPS effectuant le travail suivant&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Initialiser la connexion<\/li><li>En boucle&nbsp;:<ul><li>lire tout ce qui vient de la carte GPS<\/li><\/ul><ul><li>Analyser toutes les donn\u00e9es pour juste donner\njuste la position (quand il y en a une)<\/li><\/ul><ul><li>Pose le verrou\nGPS&nbsp;: Bloquer la m\u00e9moire pour la derni\u00e8re position GPS<ul><li>Action s\u00e9curis\u00e9e&nbsp;: Mettre de c\u00f4t\u00e9 la derni\u00e8re\nposition trouv\u00e9e avec l\u2019heure<\/li><\/ul><\/li><\/ul><ul><li>D\u00e9bloquer le verrou\nGPS (cela a dur\u00e9 quelque millisecondes)<\/li><\/ul><ul><li>Attendre un peu pour avoir des nouvelles donn\u00e9es\nde la carte<\/li><\/ul><\/li><\/ul>\n\n\n\n<p>ressemble \u00e0&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def watch_gps( gpsPort):\n    # la demande d'utilisation des variables dans lesquelles la thread GPS stocke ce qu'elle a trouv\u00e9\n    global lastGpsPositionMeasured;\n    global lastGpsLongitude;\n    global lastGpsLattitude;\n    global lastGpsSpeed\n    global lastGpsElevation;\n    global lastGpsMeasureTime;\n    global lastGpsTime\n\n    # ?\n    GPIO.setmode(GPIO.BOARD)\n\n    # Enable Serial Communication\n    port = serial.Serial(gpsPort, 115200);\n    port.timeout=1;\n\n    print (\"GPS : Starting Up Serial Monitor\")\n\n    # on vide toutes les entrees et sorties du ports USB pour la carte GPS\n    port.flushInput()\n    port.flushOutput()\n\n    # la sequence d initialisation\n\n    port.write('AT\\r\\n'.encode('ascii'))\n    rcv = port.read(100)\n    print(C_GPS_READ+\"GPS : \",rcv, ENDC)\n    time.sleep(.1)\n\n    port.write('AT+CGNSPWR=1\\r\\n'.encode('ascii'))     # to power the GPS\n    rcv = port.read(100)\n    print(C_GPS_READ+\"GPS : \",rcv, ENDC)\n    time.sleep(.1)\n\n    port.write('AT+CGNSIPR=115200\\r\\n'.encode('ascii')) # Set the baud rate of GPS\n    rcv = port.read(100)\n    print(C_GPS_READ+\"GPS : \",rcv, ENDC)\n    time.sleep(.1)\n\n    port.write('AT+CGNSTST=1\\r\\n'.encode('ascii'))    # Send data received to UART\n    rcv = port.read(100)\n    print(C_GPS_READ+\"GPS : \",rcv, ENDC)\n    time.sleep(.1)\n\n    port.write('AT+CGNSINF\\r\\n'.encode('ascii'))       # Print the GPS information\n    rcv = port.read(200)\n    print(C_GPS_READ+\"GPS : \",rcv, ENDC)\n    time.sleep(.1)\n\n    ck=1\n    while ck==1:\n        # lecture de la prochaine ligne depuis la carte GPS\n        line = port.read_until(\"\\r\\n\".encode('ascii'));\n        lineStr = line.decode('ascii');\n\n        # en mode debug complet, on affiche chaque ligne renvoy\u00e9e par la carte\n        if FULL_DEBUG_GPS == True :\n            if (len(lineStr)>2):\n                lineStr2 = lineStr[0: len(lineStr)-2];\n                print(C_GPS_READ+\"GPS :\",lineStr2, ENDC);\n\n        # si la ligne est une ligne de position GPS (commencent par $GNRMC\n        if (lineStr.startswith(\"$GNRMC\")) :\n            # on extrait la ligne sans les deux caracteres de fin de ligne\n            lineStr = lineStr[0: len(lineStr)-2];\n\n            # en mode debug GPS seulement, on affiche ces lignes\n            if SMALL_DEBUG_GPS == True :\n                print(C_GPS_READ+\"GPS :\",lineStr, ENDC);\n\n            # on decoupe la ligne selon les morceaux s\u00e9par\u00e9s par des virgules\n            items = lineStr.split(\",\");\n\n            # on recupere les morceaux de la ligne qui correspondent au champs utiles\n            timeStr = items[1]; # l'heure connue par le GPS\n            lat = items[3];     # la latitude\n            lon = items[5];     # la longitude\n            speed = items[7];   # la vitesse\n            elevation=items[8]  # l'altitude\n            dateStr = items[9]; # la date connue par le GPS\n\n            # si les champs longitude et latitude ne sont pas vide, alors on va memoriser les\n            if ((len(lat)>0) and (len(lon)>0)) :\n                # on decode la latitude comme dans le programme d'exemple\n                s3=lat[2:len(lat)]\n                s3=Decimal(s3)\n                s3=s3\/60\n                s33=int(lat[0:2])\n                s3 = s3 + s33\n                s3 = int(s3*1000000)\/1000000\n\n                # on decode la longituide comme dans le programme d'exemple\n                s5=lon[3:len(lon)]\n                s5=Decimal(s5)\n                s5=s5\/60\n                s55=int(lon[0:3])\n                s5 = s5 + s55\n                s5 = int(s5*1000000)\/1000000\n\n                # on cr\u00e9e une chaine datetime au format ISO avec les morceaux optebnus de la carte,\n                # et on la fait analyser par le datetime python\n                theDatetime = datetime.strptime(dateStr+'-'+timeStr+'000Z+0000',\"%d%m%y-%H%M%S.%fZ%z\");\n                # on cree le timestamp (Unix) correspondant : le nombre de secondes depuis le 1\/1\/1970\n                theDateTimeTimestamp = datetime.timestamp(theDatetime);\n\n                # on decode la vitesse , et on la convertit de mph to kph\n                theSpeed = float(speed)*1.609;\n\n                #on decode l'altitude\n                theElevation = float(elevation);\n\n                # en mode debug standard, on fait un joli affichage des infos GPS\n                # la constante C_GPS permet d'afficher dans une couleur particuli\u00e8re pour le GPS (facile \u00e0 lire)\n                if DEBUG_GPS == True :\n                   print(C_GPS+\"--------------------------------------------\", ENDC)\n                   print(C_GPS+\"GPS :  TIME  :\", datetime.fromtimestamp(theDateTimeTimestamp), ENDC )\n                   print(C_GPS+\"GPS :  LAT.  :\", s3 , ENDC)\n                   print(C_GPS+\"GPS :  LONG. :\", s5 , ENDC)\n                   print(C_GPS+\"GPS :  ELEV  :\", theElevation , ENDC)\n                   print(C_GPS+\"GPS :  SPEED :\", theSpeed , ENDC)\n                   print(C_GPS+\"--------------------------------------------\", ENDC)\n\n                # on va placer les valeurs lues dans les variables globales\n                # mais pour eviter qu'une autre thread les lise pendant qu'on les modifie on demande le verrou\n                # et on le lib\u00e8re une fois les valeurs stoqu\u00e9es\n                threadGpsLock.acquire()\n                # on indique qu'on a eu une nouvelle mesure reussie\n                lastGpsPositionMeasured = True\n                # on memorise l'heure\n                lastGpsMeasureTime = int(datetime.timestamp(datetime.now()));\n                # on memorise le resultta du GPS\n                lastGpsLongitude = s5;\n                lastGpsLattitude = s3;\n                lastGpsSpeed = theSpeed;\n                lastGpsElevation = theElevation;\n                lastGpsTime = int(theDateTimeTimestamp)\n                # et on  lib\u00e8re le verrou une fois les valeurs stoqu\u00e9es\n                threadGpsLock.release()\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En utilisant les techniques de la partie pr\u00e9c\u00e9dente, le code de la tache de r\u00e9cup\u00e9ration des infos GPS effectuant le travail suivant&nbsp;: Initialiser la connexion En boucle&nbsp;: lire tout ce qui vient de la carte GPS Analyser toutes les donn\u00e9es pour juste donner juste la position (quand il y en a une) Pose le verrou <a class=\"read-more\" href=\"https:\/\/wollef.org\/blog\/le-logiciel-raspberry-car-tache-de-surveillance-gps\/\">Continue Reading<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[31,1],"tags":[53],"class_list":["post-963","post","type-post","status-publish","format-standard","hentry","category-raspberry-cars","category-non-classe","tag-2020-raspberry-cars"],"_links":{"self":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/posts\/963","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/comments?post=963"}],"version-history":[{"count":0,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/posts\/963\/revisions"}],"wp:attachment":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/media?parent=963"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/categories?post=963"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/tags?post=963"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}