#
#   _===_ _           _                  ______ _     _             _ _ _
#  |  ___| |         | |                 | ___ (_)   | |           (_) | |
#  | |__ | | ___  ___| |_ _ __ ___ ______| |_/ /_  __| | ___  _   _ _| | | ___ _   _ _ __
#  |  __|| |/ _ \/ __| __| '__/ _ \______| ___ \ |/ _` |/ _ \| | | | | | |/ _ \ | | | '__|
#  | |___| |  __/ (__| |_| | | (_) |     | |_/ / | (_| | (_) | |_| | | | |  __/ |_| | |
#  \____/|_|\___|\___|\__|_|  \___/      \____/|_|\__,_|\___/ \__,_|_|_|_|\___|\__,_|_|
#
#  Communication avec le RF-Power-Meter-V5.0 USB
#  Électro-Bidouilleur, Octobre 2023. https://www.youtube.com/Électro-Bidouilleur
#  Licence de droits: Attribution 4.0 International (CC BY 4.0)  
#  Lisez https://creativecommons.org/licenses/by/4.0/deed.fr  
#
#***************************************************************************

import serial # Pyserial
from tkinter import *      # Permet la création de fenêtres et de widgets

rx_string = ''
sample_size = 500   # Le nombre d'écahtillons pour le calcul de la moyenne de puissance
cal_offset = 0.0    # Un offset d'étalonnage que ce script peut appliquer si nécessaire
ser = serial.Serial()
ser.port = "/dev/ttyACM1"
ser.bytesize = serial.EIGHTBITS #number of bits per bytes
ser.parity = serial.PARITY_NONE #set parity check: no parity
ser.stopbits = serial.STOPBITS_ONE #number of stop bits
ser.timeout = 1            #non-block read
ser.xonxoff = False     #disable software flow control
ser.rtscts = False     #disable hardware (RTS/CTS) flow control
ser.dsrdtr = False       #disable hardware (DSR/DTR) flow control
    
# Création de la fenêtre principale
Fenetre_Princ = Tk()
Fenetre_Princ.title("RF-Power_Meter-V5.0 on port " + ser.port)
Fenetre_Princ.configure(background='black')
Fenetre_Princ.geometry('{}x{}'.format(420, 100))
Mesure_Val = StringVar()
Mesure_Val.set("-------")
Label(Fenetre_Princ, textvariable=Mesure_Val, font=("Fixedsys", 48,"bold"),fg="cyan", bg="black").place(x=10, y=20)  # Etiquette du Titre

# Ouverture du port série-USB
try: 
    ser.open()
except Exception:
    print("Erreur dans l'ouverture du port USB: " + ser.port)
    exit()

# Boucle infinie de lecture
while (True):
    n=1
    db_read_sum = 0
    while (n < sample_size):
            rx_char = ser.read(1).decode('ascii')
            if not(rx_char == 'u'):
                if (not(rx_char == 'a') and not(rx_char == 'A')):
                    rx_string += rx_char
            else:
                db_read = float(rx_string[0:6])
                db_read_sum += db_read
                rx_string = ''
                n += 1
    db_read_avg = round((db_read_sum / sample_size / 1000) + cal_offset, 2)
    print(db_read_avg)
    str_db_read_avg = str(db_read_avg)
    if (db_read_avg > -10):
        str_db_read_avg = '- ' + str(db_read_avg)[1:]
    Mesure_Val.set(str_db_read_avg.ljust(6, '0') + ' dBm')
    Fenetre_Princ.update()
    db_read_avg = 0

