Corrigé situation B sans LED : Améliorer la robustesse du dispositif

MéthodeCode feu Maître

1
from microbit import *
2
from time import ticks_ms
3
import radio
4
5
radio.config(group=2)
6
radio.on()
7
8
DUREE = 10  # 10 secondes
9
attente = DUREE
10
lastTransm = ticks_ms()  # derniere transmission de l'esclave
11
feuRouge = True
12
13
def afficheRouge():
14
    for x in range(3,5):
15
        for y in range(2):
16
            display.set_pixel(x,y,9)
17
    for x in range(3,5):
18
        for y in range(3,5):
19
            display.set_pixel(x,y,0)
20
def afficheOrange():
21
    for x in range(3,5):
22
        for y in range(2):
23
            display.set_pixel(x,y,0)
24
    for x in range(3,5):
25
        for y in range(3,5):
26
            display.set_pixel(x,y,4)
27
def afficheAttente(attente):
28
    display.set_pixel(2,3,0)
29
    for x in range(2):
30
        for y in range(5):
31
            display.set_pixel(x,y, 0 if 5*x+y >= attente else 9)
32
33
while True:
34
    # Arrivee du vehicule prioritaire au feu maitre
35
    if button_a.was_pressed():
36
        feuRouge = False
37
        attente = DUREE
38
        radio.send("ROUGE")
39
40
    # Traitement des messages en provenance de l'esclave
41
    incoming = radio.receive()
42
    # Arrivee du vehicule priopritaire au feu esclave
43
    if incoming == "PRIO" :
44
        feuRouge = True
45
        attente = DUREE
46
        radio.send("VERT")
47
    # L'esclave est en vie :)
48
    if incoming == "ALIVE" :
49
        lastTransm = ticks_ms()
50
51
    # Mise en securite si l'esclave plante
52
    if ticks_ms() - lastTransm > 2000:
53
        display.clear()
54
        # Plus de deux secondes sans nouvelles de l'esclave
55
        feuRouge = True
56
        display.show(Image.SAD)
57
    else:
58
        # Affichage Rouge / Orange
59
        if feuRouge :
60
            afficheRouge()
61
        else :
62
            afficheOrange()
63
64
        # Gestion de l'attente
65
        sleep(1000)
66
        attente -= 1
67
        afficheAttente(attente)
68
        radio.send(str(attente))
69
70
    # Alternance du feu
71
    if attente == 0 :
72
        attente=DUREE
73
        feuRouge = not feuRouge
74
75
    # Le maitre envoie l'etat du feu a l'esclave toutes les secondes
76
    if feuRouge :
77
        radio.send("VERT")
78
    else:
79
        radio.send("ROUGE")

MéthodeCode feu Esclave

1
from microbit import *
2
from time import ticks_ms
3
import radio
4
5
radio.config(group=2)
6
radio.on()
7
8
lastTransm = ticks_ms()  # derniere transmission du maitre
9
lastAlive = ticks_ms()  # derniere transmission ALIVE de l'esclave
10
feuRouge = True
11
attente=0
12
13
def afficheRouge():
14
    for x in range(3,5):
15
        for y in range(2):
16
            display.set_pixel(x,y,9)
17
    for x in range(3,5):
18
        for y in range(3,5):
19
            display.set_pixel(x,y,0)
20
def afficheOrange():
21
    for x in range(3,5):
22
        for y in range(2):
23
            display.set_pixel(x,y,0)
24
    for x in range(3,5):
25
        for y in range(3,5):
26
            display.set_pixel(x,y,4)
27
def afficheAttente(attente):
28
    display.set_pixel(2,3,0)
29
    for x in range(2):
30
        for y in range(5):
31
            display.set_pixel(x,y, 0 if 5*x+y >= attente else 9)
32
33
while True:
34
    # Traitement des messages du maitre
35
    incoming = radio.receive()
36
    if incoming:
37
        if incoming == "VERT" :
38
            feuRouge = False
39
            lastTransm = ticks_ms()  # message recu
40
        elif incoming == "ROUGE" :
41
            feuRouge = True
42
            lastTransm = ticks_ms()  # message recu
43
        elif len(incoming) ==1:
44
            afficheAttente(int(incoming))
45
46
    # Robustesse du dispositif :
47
    # L'esclave envoie un message au maitre toutes les secondes
48
    if ticks_ms() - lastAlive > 1000:
49
        radio.send("ALIVE")
50
        lastAlive = ticks_ms()
51
52
    # Mise en securite si le maitre plante
53
    if ticks_ms() - lastTransm > 2000 :
54
        # Plus de deux secondes sans nouvelles du maitre
55
        feuRouge = True
56
        display.show(Image.SAD)
57
    else:
58
        # Affichage Rouge / Orange
59
        if feuRouge :
60
            afficheRouge()
61
        else :
62
            afficheOrange()
63
64
    # Arrivee vehicule prioritaire
65
    if button_a.was_pressed():
66
        radio.send("PRIO")
67