#######################  Bluetooth Module #####################
# Bluetooth object to communicate over BT
# updated 16/1/2022 John Fisher
# provides uart connection to three robot configuration parameters
# examples:
#BT  = Bluetooth(1)       # uses HW 1,2 as serial port at 9600
#BT  = Bluetooth(99)      # uses HW 1,2 as serial port at 2400

from machine import UART,Pin
import time, utime 
import params as p        # use p.basespeed p.efactor p.dfactor
# Tuned parameters
#p.basespeed = 30  # range 0 up to 100
#p.efactor   = 20  # range 0-100
#p.dfactor   = 10  # 0-100

led  = Pin(25, Pin.OUT)   # inbuilt LED flahes wren writing params.py

class Bluetooth:
# Handles commands over serial port UART 0
    vartochange ="s"      # which parameter we're dealing with
    step = 1              # size of increase/decrease
    
    # constructor
    def __init__(self,spd):         #spd 1 = 9600,  spd 99 = 2400
        if(spd==99):
            self.uart = UART(0, 2400)   # init for TV remote 
        else:
            self.uart = UART(0, 9600)   # init with for Bluetooth 0 = TX/RX pins 1,2
        self.step=1

    ############
    #  bprint  #
    ############
    # prints to bluetooth and to USB
    def bprint(self,text):     # print without newline
        print(text,end="")
        self.uart.write(text)

    def bprintcr(self,text):   # print with newline at the end
        print(text)
        self.uart.write(text)
        self.uart.write("\r\n")
 
    def Ready(self):              # returns true if character received
        return (self.uart.any())  # if serial data ready
    
    def Read(self):               # returns next xharacter
        bytesObj = self.uart.read(1)  # get character  (or None)
        Command=''
        if (bytesObj != None):
            try:
                Command = bytesObj.decode('utf-8')
            except:
                Command = 'Z'
        return(Command)
    
    def showparams(self):    # print all 3 parameters on 1 line
        self.bprint ("s:")
        self.bprint(str(p.basespeed))
        self.bprint (" e:")
        self.bprint(str(p.efactor))
        self.bprint (" d:")
        self.bprintcr(str(p.dfactor))
            

    #################
    #  write_params  #
    #################
    # writes all three parameter to the file params.py
    def writeparams(self):
        led.on()
        pfile = open("params.py","w")
        pfile.write("basespeed="+str(p.basespeed))
        pfile.write("\r\nefactor="+str(p.efactor))
        pfile.write("\r\ndfactor="+str(p.dfactor))
        pfile.close()
        self.bprintcr("params.py written\r\n")
        led.off()
    #################
    #     Cmd()     #
    #################

    def Cmd(self):          # process next char
        cmd = self.Read()
        if (cmd == '\r'):
            cmd = "w"       # TVR OK = write
        #print('\'',cmd,'\'')
        
        if (cmd == "C"): #Ch+
            cmd = "s"
        elif (cmd == "c"): #Ch-
            cmd = "e"
        elif (cmd == "V"): #Vol+
            cmd = "d"
        elif (cmd == "B"):    #TVR Blue = write
            cmd = "w"
        elif (cmd == "G"):    #TVR Green = ReRead
            cmd = "r"
        
        
        if (cmd == "1"):
            self.step=1
        if (cmd == "5"):
            self.step=5
        if (cmd == "q"):
            self.showparams()

        elif (cmd == "s"):
            self.bprint ("s:")
            self.bprintcr(str(p.basespeed))
            self.vartochange =cmd
            
        elif (cmd == "e"):
            self.bprint ("e:")
            self.bprintcr(str(p.efactor))
            self.vartochange =cmd

        elif (cmd == "d"):
            self.bprint ("d:")
            self.bprintcr(str(p.dfactor))
            self.vartochange =cmd

        elif (cmd == "r"):
            self.bprintcr ("Re-reading settings")
            myname = "params.py"
            try:
                pfile = open(myname,"r")
                print(myname +" opened OK")
                Lines = pfile.readlines()
                for line in Lines:
                    line = "p."+line
                    exec(line)
                pfile.close()
                self.showparams()                
                
            except:
                self.bprint("read fail:")

        elif (cmd == "w"):
            self.bprintcr ("Saving settings")
            self.writeparams()
            self.showparams()

        elif (cmd == "+"):
            if (self.vartochange=='s'):
                p.basespeed=p.basespeed+self.step
                self.bprint ("s:")
                self.bprintcr (str(p.basespeed))
            elif (self.vartochange=='e'):
                p.efactor=p.efactor+self.step
                self.bprint ("e:")
                self.bprintcr (str(p.efactor))
            elif (self.vartochange=='d'):
                p.dfactor=p.dfactor+self.step
                self.bprint ("d:")
                self.bprintcr (str(p.dfactor))

        elif (cmd == "-"):
            if (self.vartochange=='s'):
                p.basespeed=p.basespeed-self.step
                if(p.basespeed <0):
                    p.basespeed=0
                self.bprint ("s:")
                self.bprintcr (str(p.basespeed))
            elif (self.vartochange=='e'):
                p.efactor=p.efactor-self.step
                if(p.efactor <0):
                    p.efactor=0
                self.bprint ("e:")
                self.bprintcr (str(p.efactor))
            elif (self.vartochange=='d'):
                p.dfactor=p.dfactor-self.step
                if(p.dfactor <0):
                    p.dfactor=0
                self.bprint ("d:")
                self.bprintcr (str(p.dfactor))

        elif (cmd == "0"):
            if (self.vartochange=='s'):
                p.basespeed=0
                self.bprint ("s:")
                self.bprintcr (str(p.basespeed))
            elif (self.vartochange=='e'):
                p.efactor=0
                self.bprint ("e:")
                self.bprintcr (str(p.efactor))
            elif (self.vartochange=='d'):
                p.dfactor=0
                self.bprint ("d:")
                self.bprintcr (str(p.dfactor))
        elif (cmd == "1"):
            self.step = 1
        elif (cmd == "5"):
            self.step = 5 
            
        elif (cmd == "?") or (cmd == "M"):
            self.bprintcr ("Commands are:")
            self.bprintcr ("q - show parameters")
            self.bprintcr ("s - speed")
            self.bprintcr ("e - proportion")
            self.bprintcr ("d - derivative")
            self.bprintcr ("w - Save values")

#End of file Bluetooth.py