{"id":929,"date":"2020-01-26T18:06:29","date_gmt":"2020-01-26T17:06:29","guid":{"rendered":"http:\/\/wollef.org\/?p=929"},"modified":"2020-01-26T18:06:29","modified_gmt":"2020-01-26T17:06:29","slug":"conception-logicielle-du-raspberry-car","status":"publish","type":"post","link":"https:\/\/wollef.org\/blog\/conception-logicielle-du-raspberry-car\/","title":{"rendered":"Conception logicielle du Raspberry Car &#8211; Les T\u00e2ches (1\/2)"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\"><a>Le besoin<\/a><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Le plus gros probl\u00e8me de cette phase du\nprojet, serra d\u2019\u00e9crire un logiciel pour le Raspberry Pi qui doit faire\nplusieurs choses en m\u00eame temps avec des logiques diff\u00e9rentes. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On va donc avoir besoin en Python&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>De faire tourner tous les programmes en m\u00eame\ntemps, <\/li><li>Et faire qu\u2019ils se synchronisent bien et qu\u2019ils\nne se d\u00e9range pas mutuellement.<\/li><\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">Descriptions des diff\u00e9rentes t\u00e2ches <\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Le programme qui lit la carte GPS&nbsp;:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Il lit en tout ce qui vient de la carte GPS<\/li><li>Il analyse toutes les donn\u00e9es pour juste donner\njuste la position (quand il y en a une)<\/li><li>Il met de c\u00f4t\u00e9 la derni\u00e8re position trouv\u00e9e avec\nl\u2019heure<\/li><li>Il attend un peu pour avoir des nouvelles\ndonn\u00e9es de la carte<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Le programme qui lit la carte OBD&nbsp;:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Il demande \u00e0 la carte les informations de la\nvoiture<\/li><li>Il met de c\u00f4t\u00e9 la r\u00e9ponse avec l\u2019heure<\/li><li>Et il attend<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Le programme qui stocke dans la base de donn\u00e9es&nbsp;:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Il r\u00e9cup\u00e8re les derni\u00e8res informations mise de\nc\u00f4t\u00e9 par le programme GPS et OBD<\/li><li>Il les enregistre dans la base SQL<\/li><li>Et il attend<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Le programme qui envoyer les donn\u00e9es \u00e0 Salesforce<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Il essaye de se connecter \u00e0 Salesforce<\/li><li>Si cela r\u00e9ussit&nbsp;:&nbsp;<ul><li>Il lit tout ce qui est dans la base SQL pour\n\u00eatre envoy\u00e9<\/li><\/ul><ul><li>Il envoie \u00e0 Salesforce <\/li><\/ul><ul><li>Il marque ou supprime les donn\u00e9es d\u00e9j\u00e0 envoyer<\/li><\/ul><\/li><li>Il attend les nouvelles donn\u00e9es (pause)\nproduites par autres programmes.<\/li><\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">D\u00e9lais et Interactions<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Il y a diff\u00e9rents d\u00e9lais actifs&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Pour ne pas toujours communiquer avec Salesforce\non peut&nbsp;d\u00e9cider de se connecter et envoyer les donn\u00e9es \u00e0 Salesforce toutes\nles 5-10 minutes, m\u00eame si on m\u00e9morise la position toutes les 5 secondes<\/li><li>La carte GPS envoie plusieurs fois la position\npar seconde, mais on n\u2019en garde un que toutes les 5 sec par exemples<\/li><li>Etc.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Il y a des t\u00e2ches qui ne doivent pas s\u2019emm\u00ealer&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>La lecture et l\u2019\u00e9criture dans la base de donn\u00e9es<\/li><li>La mise de c\u00f4t\u00e9 des valeurs lues et leur\nutilisation pour les stocker dans la base<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">On a besoin d\u2019un moyen de faire qu\u2019un programme puisse\nemp\u00eacher l\u2019autre de manipuler soit la base, soit les donn\u00e9es le temps qu\u2019il ait\nfini lui-m\u00eame son travail.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00e9\u00e9crivons le d\u00e9roulement des programmes en indiquant les\nattentes et les \u2018verrous\u2019 dont on a besoin.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Le programme qui lit la carte GPS&nbsp;:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Il lit en tout ce qui vient de la carte GPS<\/li><li>Il analyse toutes les donn\u00e9es pour juste donner\njuste la position (quand il y en a une)<\/li><li>Pose le verrou\n1&nbsp;: je bloque la m\u00e9moire pour la derni\u00e8re position GPS<ul><li>Action s\u00e9curis\u00e9e&nbsp;: Il met de c\u00f4t\u00e9 la derni\u00e8re\nposition trouv\u00e9e avec l\u2019heure<\/li><\/ul><\/li><li>D\u00e9bloque le verrou 1\n(cela a dur\u00e9 quelque millisecondes)<\/li><li>Il attend un peu pour avoir des nouvelles\ndonn\u00e9es de la carte<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Le programme qui lit la carte OBD&nbsp;:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Il demande \u00e0 la carte les informations de la voiture<\/li><li><strong>Pose le verrou 2&nbsp;: je bloque la m\u00e9moire pour la derni\u00e8re info OBD<\/strong><ul><li><em>Action s\u00e9curis\u00e9e&nbsp;: Il met de c\u00f4t\u00e9 la r\u00e9ponse avec l\u2019heure<\/em><\/li><\/ul><\/li><li><strong>D\u00e9bloque le verrou 2 (cela a dur\u00e9 quelque millisecondes)<\/strong><\/li><li>Et il attend 20 secondes<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Le programme qui stocke dans la base de donn\u00e9es&nbsp;:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Pose le verrou 1&nbsp;: je bloque la m\u00e9moire pour la derni\u00e8re position GPS<\/strong><\/li><li><strong>Pose le verrou 2&nbsp;: je bloque la m\u00e9moire pour la derni\u00e8re info OBD<\/strong><ul><li><em>Action s\u00e9curis\u00e9e : Il r\u00e9cup\u00e8re les derni\u00e8res informations mise de c\u00f4t\u00e9 par le programme GPS et OBD<\/em><\/li><\/ul><\/li><li><strong>D\u00e9bloque le verrou 1<\/strong> <em>(cela a dur\u00e9 quelque millisecondes)<\/em><\/li><li><strong>D\u00e9bloque le verrou 2<\/strong> <em>(cela a dur\u00e9 quelque millisecondes)<\/em><\/li><li><strong>Pose le verrou 3&nbsp;:<\/strong> je bloque l\u2019acc\u00e8s \u00e0 la base SQL<ul><li><em>Action s\u00e9curis\u00e9e&nbsp;: Il les enregistre dans la base SQL<\/em><\/li><\/ul><\/li><li><strong>D\u00e9bloque le verrou 3<\/strong> <em>(cela a dur\u00e9 presque 1 seconde, car on \u00e9crit sur le disque)<\/em><\/li><li>Et il attend 60 secondes<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Le programme qui envoyer les donn\u00e9es \u00e0 Salesforce<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Il essaye de se connecter \u00e0 Salesforce<\/li><li>Si cela r\u00e9ussit&nbsp;:&nbsp;<ul><li>Pose le verrou 3&nbsp;: bloque l\u2019acc\u00e8s \u00e0 la base SQ<ul><li>Action s\u00e9curis\u00e9e&nbsp;: Il lit tout ce qui est dans la base SQL pour \u00eatre envoy\u00e9<\/li><\/ul><\/li><\/ul><ul><li>D\u00e9bloque le verrou 3 <em>(cela a dur\u00e9 presque 1 seconde, car on \u00e9crit sur le disque)<\/em><\/li><\/ul><ul><li>Il envoie les informations \u00e0 Salesforce. <em>Cela peut durer plusieurs secondes&nbsp;: temps de r\u00e9action de Salesforce, la vitesse du r\u00e9seau, etc.<\/em><\/li><\/ul><ul><li><strong>Pose le verrou 3&nbsp;: bloque l\u2019acc\u00e8s \u00e0 la base SQ<\/strong><ul><li><em>Action s\u00e9curis\u00e9e&nbsp;: Il marque ou supprime les donn\u00e9es d\u00e9j\u00e0 envoyer<\/em><\/li><\/ul><\/li><\/ul><ul><li><strong>D\u00e9bloque le verrou 3 <\/strong>(cela a dur\u00e9 presque 1 seconde, car on \u00e9crit sur le disque)<\/li><\/ul><\/li><li>Il attend les nouvelles donn\u00e9es (pause) produites par autres programmes.<\/li><\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">Comment fait-on en python&nbsp; pour bloquer un programme&nbsp;?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">J\u2019ai cherch\u00e9 sur\nInternet comment faire pour avoir plusieurs parties du programme qui\ns\u2019ex\u00e9cutent en parall\u00e8le en python et ne s\u2019emm\u00ealent pas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La r\u00e9ponse est\nd\u2019utiliser des Threads et des verrous (lock).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cela est d\u00e9crit ici\n<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/openclassrooms.com\/fr\/courses\/235344-apprenez-a-programmer-en-python\/2235545-faites-de-la-programmation-parallele-avec-threading\">https:\/\/openclassrooms.com\/fr\/courses\/235344-apprenez-a-programmer-en-python\/2235545-faites-de-la-programmation-parallele-avec-threading<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dans le code Python, on va devoir cr\u00e9er les verrous&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>lock = RLock()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dans notre cas il y en aura 3&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>lockOBD = RLock()\nlockGPS = RLock()\nlockSQL = RLock()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le code que l\u2019on doit prot\u00e9ger, devra commencer par <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>            with verrou:\n\t\tins\u00e9rer le code \u00e0 s\u00e9curiser ici<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le code \u00e0 s\u00e9curiser va \u00eatre plac\u00e9 dans des objets Thread (\u00e9galement d\u00e9crit dans l\u2019article&nbsp;; un thread sert \u00e0 cr\u00e9er un flux de programme parall\u00e8le dans le logiciel) et encadr\u00e9 par l\u2019usage du verrou.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Par exemple pour la lecture OBD, la structure du programme sera&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class LectureOBD(Thread):\n\n    def __init__(self, mot):\n        Thread.__init__(self)\n\n    def run(self):\n       Ecrire le code qui demande les infod de la voiture\n       with lockOBD:\n          Ecrire le code qui met de c\u00f4t\u00e9 la r\u00e9ponse avec l\u2019heure\n       Ecrire le code qui attend 20 secondes<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le besoin Le plus gros probl\u00e8me de cette phase du projet, serra d\u2019\u00e9crire un logiciel pour le Raspberry Pi qui doit faire plusieurs choses en m\u00eame temps avec des logiques diff\u00e9rentes. On va donc avoir besoin en Python&nbsp;: De faire tourner tous les programmes en m\u00eame temps, Et faire qu\u2019ils se synchronisent bien et qu\u2019ils <a class=\"read-more\" href=\"https:\/\/wollef.org\/blog\/conception-logicielle-du-raspberry-car\/\">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-929","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\/929","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=929"}],"version-history":[{"count":0,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/posts\/929\/revisions"}],"wp:attachment":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/media?parent=929"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/categories?post=929"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/tags?post=929"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}