#!/usr/bin/python
# -*- coding: utf-8 -*-

######################################################################################################
 # SOFTWARE PARA DISPOSITIVO SOBRE DRON RADIOCONTROLADO.
 # DESARROLLO DE SOFTWARE E IMPLEMENTACIÓN DE HARDWARE:
 #  Juan de Dios Yáñez Ávila, CEO Onwards, Director I+D+i en Airvant.
 # EMAIL DE CONTACTO:
 #  juandediosyanez@onw4rds.com | juandediosyanez@gmail.com
 # ARCHIVO: interfaz.py
 # VERSIÓN: 1.0.
 # ENTORNO DE USO: Python 2.7.13.
 # FECHA: 2017/10/29
 # DERECHOS:
 ## Los derechos de uso/explotación de este software son al 50% por Airvant sociedad, y el 
 ## desarrollador del mismo. Software no destinado a venta. El código y archivos asociados están protegidos
 ## por las leyes de propiedad intelectual e industrial. El uso fraudulento y no permitido de los mismos
 ## está penado por la ley.
######################################################################################################

from Airvant import *
from Tkinter import *

import bluetooth, datetime, io, os, serial, time 
import RPi.GPIO as gpio

## Designamos las variables relacionadas con el hardware
 ## LUCES DE CONTROL
LED1G = 4
LED1B = 17
LED2B = 27
LED34G = 18
LED3R = 23
LED4R = 24

gpio.setmode(gpio.BCM)
gpio.setwarnings(False)

## Led de control configuración
gpio.setup(LED1G, gpio.OUT)
gpio.setup(LED1B, gpio.OUT)
gpio.setup(LED2B, gpio.OUT)
gpio.setup(LED34G, gpio.OUT)
gpio.setup(LED3R, gpio.OUT)
gpio.setup(LED4R, gpio.OUT)

ANALISIS_OPERATIVA = ()

## Puede que queramos borrar un pasillo entero por el motivo que sea, en ese caso llamaremos al técnico
## y será el encargado de acceder via VNC o Putty al archivo del pasillo que queremos borrar.
## El piloto solo puede borrar una última lectura, en el tiempo indicado por los led amarillos.
	##	def borrar(pasillo):
	##		import os
	##		pasillo = str(pasillo)
	##		name_doc = 'lecturas/'+pasillo+'.txt'
	##		fichero = open(name_doc, 'r')
	##		a = []
	##		for linea in fichero.readlines():
	##			a.append(linea)
	##		fichero.close()
	##		a.pop(len(a)-1)
	##		os.remove(name_doc)
	##		fichero2 = open(name_doc, 'w')
	##		for i in range(len(a)):
	##			for j in range(len(a[i])):
	##				fichero2.write(a[i][j])
	##		fichero2.close()
	##		print("Borrado")
##
	##	def borrar_():
	##			empresa_b = empresa.get()
	##			pasillo_b = entrada_pasillo.get()
	##			pasar = empresa_b+pasillo_b
	##			pasar = str(pasar)
	##			borrar(pasar)
##


##################################################################################################
# FUNCIONES ESPECÍFICAS DE LOS BOTONES DE LA INTERFAZ DE USUARIO                                 #
##################################################################################################

def iniciarTrabajo():
	global ANALISIS_OPERATIVA
	ANALISIS_OPERATIVA = ()
	empresa = dato_empresa.get()
	# Reajustamos el número de pasillo para que siempre sea lo que queremos.
	# No tendremos 1000 pasillos en un mismo almacén, por tanto con una designación 001 es suficiente.
	pasillo = int(dato_pasillo.get())
	pasillo = str("{:03d}".format(pasillo))
	alturamax = int(dato_alturamax.get())
	CODE = str(dato_CODE.get())
	longitud = int(dato_longitudcodigo.get())
	if(CODE==""):
		print("Seleccione un tipo de código correcto")
		return
	if(CODE == "Code128"):
		ANALISIS_OPERATIVA = iniciarTrabajo_Code128(empresa, pasillo, alturamax, longitud)
	if(CODE == "GS1128"):
		ANALISIS_OPERATIVA = iniciarTrabajo_GS1128(empresa, pasillo, alturamax)
	if(CODE == "GS1128noSSCC"):
		ANALISIS_OPERATIVA = iniciarTrabajo_GS1128_noSSCC(empresa, pasillo, alturamax)
	return

def iniciarTrabajo_apilamiento():
	global ANALISIS_OPERATIVA
	ANALISIS_OPERATIVA = ()
	empresa = dato_empresa.get()
	# Reajustamos el número de pasillo para que siempre sea lo que queremos.
	# No tendremos 1000 pasillos en un mismo almacén, por tanto con una designación 001 es suficiente.
	pasillo = int(dato_pasillo.get())
	pasillo = str("{:03d}".format(pasillo))
	alturamax = int(dato_alturamax.get())
	CODE = str(dato_CODE.get())
	longitud = int(dato_longitudcodigo.get())
	if(CODE==""):
		print("Seleccione un tipo de código correcto")
		return
	if(CODE == "Code128"):
		ANALISIS_OPERATIVA = iniciarTrabajo_Code128_apilamiento(empresa, pasillo, alturamax, longitud)
	if(CODE == "GS1128"):
		ANALISIS_OPERATIVA = iniciarTrabajo_GS1128_apilamiento(empresa, pasillo, alturamax)
	if(CODE == "GS1128noSSCC"):
		ANALISIS_OPERATIVA = iniciarTrabajo_GS1128_noSSCC_apilamiento(empresa, pasillo, alturamax)
	return
	
def envioTrabajo():
    ### AQUI TENEMOS QUE VER CUANDO ES UN TRABAJO DE CODE128 O DE GS1
	global ANALISIS_OPERATIVA
	piloto_empieza = ANALISIS_OPERATIVA[0]
	piloto_termina = ANALISIS_OPERATIVA[1]
	lecturas_correctas = ANALISIS_OPERATIVA[2]
	lecturas_incidencias = ANALISIS_OPERATIVA[3]
	### LUCES DE CONTROL
	global LED1G
	global LED1B
	global LED2B
	global LED34G
	global LED3R
	global LED4R
	###
	piloto = dato_piloto.get()
	empresa = dato_empresa.get()
	CODE = dato_CODE.get()
	# Reajustamos el número de pasillo para que siempre sea lo que queremos.
	# No tendremos 1000 pasillos en un mismo almacén, por tanto con una designación 001 es suficiente.
	pasillo = int(dato_pasillo.get())
	pasillo = str("{:03d}".format(pasillo))
	archivo = empresa + " " + pasillo + ".txt"
	email = dato_email.get()
	#direccion_trabajo = "trabajos/" + str(empresa) + "/" + str(archivo)
	direccion_trabajo = "trabajos/" + str(archivo)
	#direccion_excel = "trabajos/" + str(empresa) + "/" + str(empresa) + str(pasillo) + ".xlsx"
	direccion_excel = "trabajos/" + str(empresa) + str(pasillo) + ".xlsx"
	## Queremos enviar el trabajo que se encuentra en la dirección
	procesar_envioTrabajo(direccion_trabajo, direccion_excel, email, empresa, pasillo, CODE)
	## Mostramos al técnico como ha sido la operación
	print("Trabajo del piloto {0} finalizado.\n" .format(piloto))
	tiempo_de_trabajo = piloto_termina - piloto_empieza
	print(" Análisis del trabajo:\n Nº de lecturas correctas: {0}\n Nº de incidencias: {1}\n Tiempo de trabajo: {2}" .format(str(lecturas_correctas), str(lecturas_incidencias), str(tiempo_de_trabajo)))
	## Ponemos variable globales a cero, para no tener que cerrar el programa
	ANALISIS_OPERATIVA = ()
	# gpio.cleanup() # CUIDADO, ESTO BORRA TODO EL GPIO, NO APAGA LOS LEDS
	gpio.output(LED1G, gpio.LOW)
	gpio.output(LED1B, gpio.LOW)
	gpio.output(LED2B, gpio.LOW)
	gpio.output(LED34G, gpio.LOW)
	gpio.output(LED3R, gpio.LOW)
	gpio.output(LED4R, gpio.LOW)
	time.sleep(0.1)
	## Si no lo ponemos podemos seguir haciendo trabajos sin reiniciar el programa
	# ESTOS RESULTADOS TAMBIÉN SE PODRIAN ENVIAR A OTRO EMAIL PARA TENER UN REGISTRO DE COMO SE TRABAJA
	# ESTO QUIZAS SE PODRIA HACER MAS EFICIENTE MEDIANTE UNA LECTURA DEL ARCHIVO_TRABAJO.TXT

##################################################################################################
# OPERACIONES DE ARRANQUE DEL PROGRAMA                                                           #
# Encendemos todas las luces para indicar que el técnico esta configurando el trabajo y borramos #
# de la pantalla cualquier alerta o trabajo anterior.                                            #
##################################################################################################

gpio.output(LED1G, gpio.HIGH)
gpio.output(LED1B, gpio.HIGH)
gpio.output(LED2B, gpio.HIGH)
gpio.output(LED34G, gpio.HIGH)
gpio.output(LED3R, gpio.HIGH)
gpio.output(LED4R, gpio.HIGH)

print("\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n")

##################################################################################################
# CÓDIGO RELACIONADO CON EL DISEÑO DE LA INTERFAZ USUARIO DEL TÉCNICO                            #
# - El técnico tiene que introducir los datos del trabajo a realizar por el piloto.              #
# - El técnico autoriza al piloto para comenzar su trabajo.                                      #
# - El técnico se encarga del envío y procesado del trabajo. Además de verificar que el trabajo. #
##################################################################################################	

root = Tk()
root.title("Airvant Inventario")
# root.iconbitmap('onwards.ico') # DA ERROR PONER EL ICONO
# root.config(bg="lightblue")

menubar = Menu(root)
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="Salir", command=root.quit()) #root.quit
menubar.add_cascade(label="Archivo", menu=filemenu)
root.config(menu=menubar)
# ESTARÍA BIEN CREAR ALGO QUE PONGA EL DESARROLLADOR DE LA TECNOLOGÍA
img_airvant = PhotoImage(file="airvant_logo.png")

dato_piloto = StringVar()
dato_empresa = StringVar()
dato_pasillo = StringVar()
dato_alturamax = IntVar()
dato_CODE = StringVar()
dato_longitudcodigo = IntVar()
dato_email = StringVar()

Label(root, text = "Nombre del piloto: ").grid(row=0, column=0, columnspan=2)
Entry(root, textvariable = dato_piloto).grid(row=1, column=0, columnspan=2)

Label(root, text = "Nombre de empresa: ").grid(row=2, column=0, columnspan=2)
Entry(root, textvariable = dato_empresa).grid(row=3, column=0, columnspan=2)

Label(root, text = "ID Pasillo: ").grid(row=4, column=0)
Entry(root, textvariable = dato_pasillo, width = 8).grid(row=4, column=1)

Label(root, text = "Altura de pasillo: ").grid(row=5, column=0)
Entry(root, textvariable = dato_alturamax, width = 8).grid(row=5, column=1)

Label(root, text = "Tipo de código a leer: ").grid(row=6, column=0, columnspan=2)
Radiobutton(root, text="Code-128 de longitud", variable=dato_CODE, value="Code128").grid(row=7, column=0)
Entry(root, textvariable = dato_longitudcodigo, width = 8).grid(row=7, column=1)
Radiobutton(root, text="GS1-128", variable=dato_CODE, value="GS1128").grid(row=8, column=0)
Radiobutton(root, text="GS1-128 no SSCC", variable=dato_CODE, value="GS1128noSSCC").grid(row=8, column=1)

Label(root , text = "GMAIL de envío: ").grid(row=9, column=0)
Entry(root, textvariable = dato_email).grid(row=9, column=1)

## BOTONES
Button(root, text = "GO NORMAL", command = iniciarTrabajo).grid(row=10, column=0)
Button(root, text = "GO APILAMIENTO", command = iniciarTrabajo_apilamiento).grid(row=10, column=1)
Button(root, text = "ENVIAR TRABAJO", command = envioTrabajo).grid(row=11, column=0, columnspan=2)

## DESCRIPCIÓN
Label(root, text="Aplicacion para inventariado de almacen. Version 0.1.\nDesarrollada por Onwards. www.onw4rds.com\n", justify="center").grid(row=12, column=0, columnspan=4)
Label(root, image=img_airvant).grid(row=0, rowspan=12, column=2)

root.mainloop()