# -*- coding: cp1252 -*-
import time
import serial
import os
import datetime


print('.................................\n')
print('.............. MARS .............\n')
print('.................................\n')

################## CONSTANT ################################################

TIME_OUT = 5;
arduino_available = 2;
max_ard1=8;

############################################################################


################### SERIAL CONFIGURATION ###################################

#ser -> USB0 -> Connect2-Pi 868MHz
#ser_Ard1 -> ACM0 -> Arduino with sensors
#ser_Ard2 -> USB1 -> Arduino with servomotors

ser = serial.Serial(
    port='/dev/ttyUSB0', 
    baudrate= 19200,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    timeout = 0.5
)

ser_Ard1 = serial.Serial(
    port='/dev/ttyACM0'
)

if (arduino_available > 1) :
        ser_Ard2 = serial.Serial(
            port='/dev/ttyUSB1', #COM1 for Windows or /dev/ttyUSB0 for Linux/RasPi
            baudrate=4800
        )

############################################################################


################## TOOL BOX ################################################
def getData(canal,bool_print):
        time.sleep(0.05) #Wait the complete reception of the data          
        txt=canal.read(canal.inWaiting())
        if (bool_print):
                print("Message : '"+txt+"'")
        return txt

def isInt(data):
        try :
                data_int=int(data)
                return True
        except ValueError :
                return False

def state_data_Arrived():
        print("----> We have an order ! ")
        data=getData(ser,True)

        #Check if the data is valid 
        if(not isInt(data)):
                #Can't happen, in theory...
                print("----> Data is not an integer ")
                print("----> Flush ")
                flush =ser.read(ser.inWaiting())
        else :
                data_int=int(data)

                ###############################################################
                #                                                             #
                # data = abc d e f                                            #
                # abc : x = c+10*b+100*a ; 0 < x < 360 ; servomotor position  #
                # d : 0 = action (sensor or tool) , 1 = fetch data            #
                # e : n° of the Arduino                                       #
                # f : n° of the sensor                                        #
                #                                                             #
                ###############################################################

                capteur_n0=data_int % 10
                data_int = data_int /10
                
                arduino_n0=data_int % 10
                data_int = data_int /10

                is_action=data_int%10

                angle = data_int / 10


                if (is_action):
                        state_Processing(arduino_n0,capteur_n0,angle)
                else :
                        state_Fetch(arduino_n0,capteur_n0)
                
def state_Processing(arduino_n0,capteur_n0,angle):
        ##Here we process the order
        if (arduino_n0==1):
                serArd=ser_Ard1;
        else:
                serArd=ser_Ard2;

        # 0001 -> outil n°1
        # 1232 -> outil n°2 (supposé être un moteur), angle de 123°
        serArd.write(str(capteur_n0)+str(angle)+'#')
        print("----> Arduino "+str(arduino_n0)+" : Order sent : "+str(capteur_n0)+str(angle)+'#')
        waiting=1
        time_end=time.time() + TIME_OUT
        while waiting==1:
                if serArd.inWaiting()!=0 or time.time()>time_end:
                        waiting=0
                        if serArd.inWaiting()!=0:
                                state_Result_Received(arduino_n0,capteur_n0,serArd)
                        else:
                                print("Timeout")
                                
        #MAY BE DELETED
        #flush = getData(ser,False)
        print("----------- END -----------")
        print("");

def state_Fetch(arduino_n0,capteur_n0):
        #Get last data for the capteur n°0 of the arduino n°0
        #in the database

        #global dataCur
        #ser.write(dataCur[capteur_n0-1])

        nameF="data/fich"+str(capteur_n0)+".txt"
        if (os.path.exists(nameF)):
                fich=open(nameF,"r")
                lines=fich.readlines()
                fich.close()
                last_line=lines[len(lines)-1]
                date_data=last_line.split("$")
                data=date_data[len(date_data)-1]
                ser.write(data)

def state_Result_Received(arduino_n0,capteur_n0,serArd):
        ### We have a message
        print("----> Arduino "+str(arduino_n0)+" : Order executed")
        data=getData(serArd,True)

        if (arduino_n0==2):
                print("Here, we should have 'Done")
                if (data=="Done"):
                        print("Le moteur a bien travaille !")
        elif (arduino_n0==1):
                # Here, we save the data !
                fich=open("data/fich"+str(capteur_n0)+".txt","a")
                fich.write(datetime.datetime.now().strftime("%d/%m/%y %H:%M:%S")+"$"+data)
                fich.close()

                                                                
############################################################################


while 1 :
        if ser.inWaiting()!=0 :
                state_data_Arrived()
