#Adapté à Python 3 et écrit par Richard Fortier 

import RPi.GPIO as GPIO  
import time  

BIT0 = 3   #pour selection digit 4 le plus a droite
BIT1 = 5   #pour selection digit 3
BIT2 = 24  #pour selection digit 2
BIT3 = 26  #pour selection digit 1

segCode = [0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f]  #nombre de 0~9
segCodeP = [0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef] #nombre avec le point
pins = [11,12,13,15,16,18,22,7,3,5,24,26]  
bits = [BIT0, BIT1, BIT2, BIT3]  

def print_msg():  
	print ('le programme est démarré...')  
	print ('Peser sur Ctrl+C pour terminer le programme...')  

def digitalWriteByte(val):  
	GPIO.output(11, val & (0x01 << 0)) #Segment a du digit
	GPIO.output(12, val & (0x01 << 1)) #Segment b du digit 
	GPIO.output(13, val & (0x01 << 2)) #Segment c du digit 
	GPIO.output(15, val & (0x01 << 3)) #Segment d du digit 
	GPIO.output(16, val & (0x01 << 4)) #Segment e du digit 
	GPIO.output(18, val & (0x01 << 5)) #Segment f du digit 
	GPIO.output(22, val & (0x01 << 6)) #Segment g du digit 
	GPIO.output(7,  val & (0x01 << 7)) #dp ou le point du digit 


def display_3(num):  #Affiche un nombre 0 à 9999
        b0 = int(num % 10)
        b1 = int(num % 100 / 10)
        b2 = int(num % 1000 / 100)
        b3 = int(num / 1000)
        GPIO.output(BIT0, GPIO.LOW)
        digitalWriteByte(segCode[b0])
        time.sleep(0.0007)
        GPIO.output(BIT0, GPIO.HIGH)
        GPIO.output(BIT1, GPIO.LOW)
        digitalWriteByte(segCode[b1])
        time.sleep(0.0007)
        GPIO.output(BIT1, GPIO.HIGH)
        GPIO.output(BIT2, GPIO.LOW)
        digitalWriteByte(segCode[b2])
        time.sleep(0.0007)
        GPIO.output(BIT2, GPIO.HIGH)
        GPIO.output(BIT3, GPIO.LOW)
        digitalWriteByte(segCodeP[b3])
        time.sleep(0.0007)
        GPIO.output(BIT3, GPIO.HIGH)

def checkdist():                   #Fonction de mesure de la distance
	GPIO.output(32, GPIO.HIGH) #Place la pin 32 à 1
	time.sleep(0.000015) #attend 15 micro seconde
	GPIO.output(32, GPIO.LOW)  #Place la pin 32 à 0
	while not GPIO.input(36):  #Aussi longtemps que l'input 36=0
		pass               #Si non passe
	t1 = time.time()           # Si Input 36=0 mesure le temps t1
	while GPIO.input(36):      #Aussi longtemps que l'input 36=1
		pass               #Si non passe
	t2 = time.time()           # Si Input 36=1 mesure le temps t2
	return (t2-t1)*340/2  # Retourne la distance mesuré        
        
def setup():  #initialisation GPIO de la raspberry pi
	GPIO.setmode(GPIO.BOARD)   
	for pin in pins: #Dans la liste pins va chercher les 12 pin utilisées 
		GPIO.setup(pin, GPIO.OUT)    # Place les pins utilisées en output  
		GPIO.output(pin, GPIO.HIGH)  # Place les pins utilisées à 1 pour éteindre le display

	GPIO.setup(32,GPIO.OUT,initial=GPIO.LOW) #Définie Pin 32 en sortie = 0
	GPIO.setup(36,GPIO.IN)        #Définie la pin 36 en entrée
	time.sleep(1)                 #Attend 1 secondes
        
def loop():
        while True:
                dist= checkdist()
                #print ('Distance: %0.2f m' %dist) #Affiche la distance mesurée avec 2 chiffres
                dist= int(dist *1000)                                         #après le point.
		
                if dist < 10000:
                        for i in range(500):
                                display_3(dist)
                        time.sleep(0.1)        
                        
                else:
                        dist=0
                 
                
def destroy():   #Arrêt du programme <ctrl><c>  
	for pin in pins:    
		GPIO.output(pin, GPIO.LOW) #Place les pins utilisées à 0 (0V)   
	GPIO.cleanup()             # relache la ressource GPIO

if __name__ == '__main__': #Programme commence ici   
	setup()   
	try:  
		loop()    
	except KeyboardInterrupt:    
		destroy()    
