﻿# Programme écrit par Pascal HASSENFORDER V1.1 du 12/10/2020
# Cette librairie faciliter la programmation et permet d'afficher un tableau de bord de voiture moderne

import pygame,sys
from pygame.locals import *
import time
from serial import *
import itertools
import winreg

pygame.init()
pygame.font.init()
mainclock= pygame.time.Clock()
Tableau=pygame.display.set_mode((800,533,),0,32)     	# Taille fenêtre du jeu
pygame.display.set_caption('Tableau de bord')          	# titre de la fenêtre
Texty = pygame.font.Font('C:\windows\Fonts\ARLRDBD.TTF', 50)    #police et taille du texte


clock = pygame.time.Clock()
message=''

repeat=time.time()

def DetecteFinProg():
    for event in pygame.event.get():			# Traiter les évènements du clavier
        if event.type==QUIT:		# Traite l'évènement fermer la fenêtre avec la souris
                pygame.quit()
                port_serie.close()
                sys.exit()
        if event.type== KEYDOWN:	# Traiter les évènements du clavier
            if event.key==K_ESCAPE:
                pygame.quit()
                port_serie.close()
                sys.exit()

def rot_center(image, angle):

    orig_rect = image.get_rect()
    rot_image = pygame.transform.rotate(image, angle)
    rot_rect = orig_rect.copy()
    rot_rect.center = rot_image.get_rect().center
    rot_image = rot_image.subsurface(rot_rect).copy()
    return rot_image


def place_image(img,coord,rot):
    if rot==0:
        Tableau.blit(img,coord)
    elif rot>0:
        Tableau.blit(rot_center(img,-rot),coord)

def place_texte(vitesse,cood,couleur):
    img_vitesse = Texty.render(str(vitesse), 0, couleur)
    larg= img_vitesse.get_width()
    Tableau.blit(img_vitesse,(cood[0]-larg//2,cood[1]))				# placer l'image

def affiche_tableau(FPS):
    pygame.display.update()
    clock.tick(FPS)


def ReceptionDonnees():
    vitesse=0
    compteTour=0
    ceinture=0
    message=port_serie.readline().decode('UTF-8')

    if len(message)>0:
        message=message[0:-2]
        try:
            vitesse=int(float(message[message.find('V')+1:message.find('T')]))
            compteTour=int(float(message[message.find('T')+1:message.find('C')]))
            ceinture=int(float(message[message.find('C')+1:]))
        except:
            pass

    return (vitesse,compteTour,ceinture)

def temps_present():
    return time.time()

def temps_allume():
    return int(time.time()*2)%2


def enumerate_serial_ports():
    path = 'HARDWARE\\DEVICEMAP\\SERIALCOMM'
    key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path)
    ports = []
    for i in itertools.count():
        try:
            val = winreg.EnumValue(key, i)
            ports.append(str(val[1][3:])+" : "+str(val[0])+'\n')
        except EnvironmentError:
            break
    ports.sort()
    message=''
    for ligne in ports:
        message=message+ligne
    return(message+'\nIndiquer le numéro du port série à utiliser :')



# Ouverture du port série RS-232 du PC branché au système

def ouvre_port(COM):
    """Retoune l'adresse du port série ouvert à 115200 bauds
       Saisir rien puis ok pour quitter le programme"""
    # Vitesse de baud : 115200
    # Timeout en lecture : 1 sec
    # Timeout en écriture : 1 sec
    if COM=="":
        sys.exit()

    try :
        port_serie=Serial(port="com"+COM, baudrate=115200, timeout=0.1, writeTimeout=1)
        if port_serie.isOpen():
                #print(port_serie.readline().decode('UTF-8'))
                return False,port_serie
    except :
        print(COM,'n\'est pas un port série valide')
        return True,False




###################################################
# Vérification de la connexion avec le port série #
###################################################
ports=enumerate_serial_ports()
boucle = True

while boucle:
    boucle, port_serie=ouvre_port(input(ports))

