import serial
#=======opening ports============#
#this part asks user to enter port number and tries to open coresponding port
#if that can not be done, user must enter new port
ser = False
while(not ser):
    ser = input("please enter port number:\t")
    #ser=8 you can set port number if you don't want to type it in every time
    
    try:
        ser = serial.Serial(int(ser)-1)
        
    except:
        ser = False
        print("you entered invalid port number\nplease enter corract port number(usually 8)")
    
print("working on serial port \"" + ser.name + "\"")

#=======preparing data============#
#this part saves data.csv parameters in easy to use format
#"flags" contain flags which will be replaced with real data in message
#data is a 2D array which contains all data
flags=[]
data=[]
with open("data.csv","r") as f:
    #first line if data.csv is stored in "flags" variable
    flags = f.readline().split(";")
    flags[-1] = flags[-1][0:-1]   #to remove end of line character
    #all falgs get [] around them for ease of use later on
    for i in range(1,len(flags)):
        flags[i]="["+flags[i]+"]"

    #data gets pumped in "data" varible
    tmp=f.readline().strip()
    while(tmp):
        data.append(tmp.split(";"))
        data[-1][-1]=data[-1][-1][0:-2]
        tmp=f.readline().strip()

#stores message content (from message.txt)in variable called "m"
m = open("message.txt","r")
message = m.read()
m.close()

message=message.strip()     #to remove all whitespace before and after content

#=============send data===========#
def postData(num,msg):
    #read all data waiting on serial comm to avoud confusion later on
    #normally this shouldn't return anything
    while ser.inWaiting():
        ser.read()
    print("===========")
    #sends number and message to linkIt one
    ser.write(num.encode())
    ser.write('\r'.encode())
    ser.write(msg.encode())
    ser.write('\r'.encode())
    a=None

    while not ((a == "0") or (a == "1")):
        if ser.inWaiting():
            a = ser.readline().decode().strip()
            print(a)

    #if message is successfully, LinkIt ONE will respond with "1"
    #if reply isn't "1" or isn't obtained at all, error is reported
    if (a=="1"):
        print("message sent")
        return False
    else:
        #tells you at whitch number something went wrong so you can run run the programm from that number on after fixing the problem kno
        print("Something went wrong with number {0}".format(num))
        return(True)

#==========function=================
    #a fancy piece of code that allows this file to be used as library for other files
    #you might never use it
if __name__ == '__main__':
    #for each line in data.csv
    for i in range(len(data)):
        msg = message
        #replace flags with data
        for j in range(1, len(flags)):
            msg = msg.replace(flags[j],data[i][j],5)
        #keep on trying to send message until message is sent user breaks programm
        while postData(data[i][0],msg):
            #wait for user to hit ENTER before next atempt
            input("enter")





