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

######################################################################################################
 # SOFTWARE PARA DISPOSITIVO SOBRE DRON RADIOCONTROLADO DE AIRVANT SOCIEDAD.
 # 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: Airvant.py
 # VERSIÓN: 0.2.
 # ENTORNO DE USO: Python 2.7.9.
 # FECHA: 2017/__/__
 # DERECHOS:
 ## Los derechos de uso/explotación de este software son al 50% por Airvant sociedad, y el 
 ## desarrollador del mismo. 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.
######################################################################################################

import time
import RPi.GPIO as gpio
## Designamos las variables relacionadas con el hardware
##
"""
	## BOTÓN DE EMERGENCIA
	BOTON = 4 # Botón de emergencia de finalizar trabajo (marron claro - 4 - in)
	## RGB LED COLORES
	RGB_ROJO = 17 # RGB Led rojo (rojo - 17 - out)
	RGB_VERDE = 27 # RGB Led verde (rojo - 27 - out)
	RGB_AZUL = 22 # RGB Led azul (rojo - 22 - out)
	## RGB LED DIODOS
"""
 ## LUCES DE CONTROL
LEDCONTROL1G = 4
LEDCONTROL1B = 17
LEDCONTROL2B = 27
 ## LUCES DE CONTROL LECTURA
LEDLECTURAG = 18
LEDLECTURAR1 = 23
LEDLECTURAR2 = 24
 ## PANEL 7 SEGMENTOS
PANELC = 26 # Panel C (verde - 26 - out)
PANELD = 19 # Panel D (amarillo - 19 - out)
PANELE = 13 # Panel E (naranja - 13 - out)
PANELB = 21 # Panel B (blanco - 21 - out)
PANELA = 20 # Panel A (gris - 20 - out)
PANELF = 16 # Panel F (violeta - 16 - out)
PANELG = 12 # Panel G (azul - 12 - out)
## 
gpio.setmode(gpio.BCM)
gpio.setwarnings(False)
"""
	# Boton
	gpio.setup(BOTON, gpio.IN)
	# LED RGB color
	gpio.setup(RGB_ROJO, gpio.OUT)
	gpio.setup(RGB_VERDE, gpio.OUT)
	gpio.setup(RGB_AZUL, gpio.OUT)
	# LED RGB diodos alta intensidad
	### AQUÍ TENEMOS QUE INDICAR 7 DIODOS DEL PANEL DE INDICACIÓN (YA NO TENEMOS MÁS PINES)
	### DE MOMENTO NOS VAMOS A CONFORMAR CON 1 LED RGB NORMAL, PARA VER COMO FUNCIONA
"""
## Panel 7 segmentos
gpio.setup(PANELC, gpio.OUT)
gpio.setup(PANELD, gpio.OUT)
gpio.setup(PANELE, gpio.OUT)
gpio.setup(PANELB, gpio.OUT)
gpio.setup(PANELA, gpio.OUT)
gpio.setup(PANELF, gpio.OUT)
gpio.setup(PANELG, gpio.OUT)
## Led de control configuración
gpio.setup(LEDCONTROL1G, gpio.OUT)
gpio.setup(LEDCONTROL1B, gpio.OUT)
gpio.setup(LEDCONTROL2B, gpio.OUT)
gpio.setup(LEDLECTURAG, gpio.OUT)
gpio.setup(LEDLECTURAR1, gpio.OUT)
gpio.setup(LEDLECTURAR2, gpio.OUT)



def pasar_a_excel(direccion_trabajo, direccion_excel):
	import io
	import openpyxl
	## Creamos una lista con la informacion de archivo_trabajo
	archivo_trabajo = open(direccion_trabajo, "r") # el archivo tiene que existir
	items = archivo_trabajo.readlines() # lista creada, que tendremos que procesar
	archivo_trabajo.close()
	## Ahora procesaremos la información de items en una lista con listas
	items_procesado = list([])
	for lectura in items:
		aux_lista = lectura.split("|")
		aux_lectura = list([aux_lista[0], aux_lista[1], aux_lista[2]]) # columna, altura, lectura
		items_procesado.append(aux_lectura)
	## Tenemos que crear en memoria el contenido de nuestro archivo excel. Funciona distinto a *.txt
	wb = openpyxl.workbook.Workbook()
	ws = openpyxl.workbook.Workbook.create_sheet("Lecturas pasillo")
	ws.cell(row=0, column=0, value="Columna")
	ws.cell(row=0, column=1, value="Altura")
	ws.cell(row=0, column=1, value="Contenido")
	r = 1
	for dato in items_procesado:
		ws.cell(row=r, column=0, value=dato[0]) #columna
		ws.cell(row=r, column=1, value=dato[1]) #altura
		ws.cell(row=r, column=2, value=dato[2]) #lectura
		r = r + 1
	wb.save(direccion_excel)


def test_n568xug(L):
	import random
	## Realizamos una lectura entre 1 y 500.
	lectura = random(1,500)
	if(lectura < 30):
		print("INCIDENCIA-01")
		sensor.close()
		return "INCIDENCIA-01"
	if(lectura > 470):
		print("INCIDENCIA-02")
		sensor.close()
		return "INCIDENCIA-02"
	if(lectura>210 and lectura < 290):
		sensor.close()
		return ""
	sensor.close()
	return lectura


def n568xug(L):
	import serial
	
	if 'sensor' in locals():
		sensor.close()
	if 'sensor' in globals():
		sensor.close()
	sensor = serial.Serial('/dev/ttyACM0', timeout = 30) # esperará 30 segundos para realizar la lectura
	sensor.flushInput()
	sensor.write("\x16T\r") # enviamos una señal al sensor diciendole que le vamos a pedir una lectura
	# a = sensor.read(N)
	# Si el codigo es mas largo, inWaiting() se carga de información y se envia, por eso hay
	# que borrar la última lectura.
	# En cambio si el código es más corto, el sensor envía lo que tenga pero el operario no ve
	# la lectura como finalizada. Se envía lo que haya leído.
	# enespera = sensor.inWaiting()
	lectura = sensor.read(L) # pedimos la lectura de una longitud dada
	enespera = sensor.inWaiting()
	if(len(lectura) < L and lectura != ""):
		#print("INCIDENCIA-01")
		sensor.close()
		return "INCIDENCIA-01"
	if(enespera != 0):
		#print("INCIDENCIA-02")
		sensor.close()
		return "INCIDENCIA-02"
	sensor.close()
	return lectura


def envio_trabajo(direccion_trabajo, direccion_excel, gmail, empresa, pasillo):
	import smtplib, socket, commands, os
	#from email.mime.text import MIMEText
	from email.mime.multipart import MIMEMultipart
	from email.mime.image import MIMEImage
	direccion_trabajo = direccion_trabajo
	direccion_excel = direccion_excel
	## Lo primero que vamos hacer es transformar el contenido del archivo que hay en dirección a EXCEL
	pasar_a_excel(direccion_trabajo, direccion_excel)
	## Ahora procederiamos al envío por email del trabajo, a la dirección indicada
    ## Creamos el email
	mensaje = MIMEMultipart(" Trabajo realizado por Airvant. Volamos rápido para mejorar su calidad.")
	## \t
	 # Número de items contabilizados: {0}
	 # Número de incidencias {1}
	 # Tiempo dedicado a pasillo {2}""" .format(num_item, num_incidencias, tiempo_trabajo))
	## 
	mensaje['From'] = "operativa.airvant@gmail.com"
	mensaje['To'] = str(gmail)
	mensaje['Subject'] = "Airvant | Empresa: {0} Pasillo: {1}" .format(empresa, pasillo)
	file = open(direccion_excel, "rb")
	attach_excel = MIMEImage(file.read())
	nombre_archivo = empresa + pasillo + ".xlsx"
	attach_excel.add_header('Content-Disposition', 'attachment; filename = {0}'.format(nombre_archivo))
	mensaje.attach(attach_excel)
	## Script para el envío del correo electrónico a la dirección indicada
	mailServer = smtplib.SMTP('smtp.gmail.com', 587)
    	mailServer.ehlo()
    	mailServer.starttls()
    	mailServer.ehlo()
    	mailServer.login("operativa.airvant@gmail.com", "#airvant.onw")
    	mailServer.sendmail("operativa.airvant@gmail.com", email, mensaje.as_string())
    	## def sendmail(from_addr, to_addrs, msg, mail_options=[], rcpt_options=[])
    	mailServer.quit()

	"""	
		#import ftplib
		#import os
		
		# Datos FTP
		ftp_servidor = 'home662228864.1and1-data.host' #'home672471072.1and1-data.host'
		ftp_usuario  = 'u87707226' #'u88544423'
		ftp_clave    = 'airvant.1' #'juan2442'
		ftp_raiz     = '/inventarios/lecturas' #'/airvant2/lecturas' # Carpeta del servidor donde queremos subir el fichero
		
		# Datos del fichero a subir
		archivo_enviar = direccion # Ruta al fichero que vamos a subir
		fichero_destino = str(empresa)+str(pasillo)+'.txt' # Nombre que tendra el fichero en el servidor
		
		# Conectamos con el servidor
		try:
			s = ftplib.FTP(ftp_servidor, ftp_usuario, ftp_clave)
			try:
				f = open(fichero_origen, 'rb')
				s.cwd(ftp_raiz)
				s.storbinary('STOR ' + fichero_destino, f)
				f.close()
				s.quit()
				print ("Enviado correctamente")
			except:
				print("No se ha podido encontrar el fichero " + fichero_origen)
		except:
			print("No se ha podido conectar al servidor " + ftp_servidor)
	"""
def panel_apagado():
	gpio.output(PANELA, False)
	gpio.output(PANELB, False)
	gpio.output(PANELC, False)
	gpio.output(PANELD, False)
	gpio.output(PANELE, False)
	gpio.output(PANELF, False)
	gpio.output(PANELG, False)

def panel_tecnico():
	gpio.output(PANELA, True)
	gpio.output(PANELB, True)
	gpio.output(PANELC, True)
	gpio.output(PANELD, False)
	gpio.output(PANELE, True)
	gpio.output(PANELF, True)
	gpio.output(PANELG, True)

def panel_trabajando():
	panel_apagado()
	time.sleep(0.5)
	for vez in range(5):
		gpio.output(PANELD, True)
		time.sleep(0.2)
		gpio.output(PANELD, False)
		gpio.output(PANELG, True)
		gpio.output(PANELE, True)
		gpio.output(PANELC, True)
		time.sleep(0.2)
		gpio.output(PANELG, False)
		gpio.output(PANELE, False)
		gpio.output(PANELC, False)
		gpio.output(PANELA, True)
		gpio.output(PANELB, True)
		gpio.output(PANELF, True)
		time.sleep(0.2)
	gpio.output(PANELA, True)
	gpio.output(PANELB, True)
	gpio.output(PANELC, False)
	gpio.output(PANELD, False)
	gpio.output(PANELE, False)
	gpio.output(PANELF, True)
	gpio.output(PANELG, False)


def aviso_existetrabajo():
	### Parpadeamos el led de control en verde y azul durante 2 segundos
	gpio.output(LEDCONTROL1G, False)
	gpio.output(LEDCONTROL1B, False)
	gpio.output(LEDCONTROL2B, False)
	for i in range(10):
		gpio.output(LEDCONTROL1G, True)
		time.sleep(0.3)
		gpio.output(LEDCONTROL1G, False)
		gpio.output(LEDCONTROL1B, True)
		time.sleep(0.3)
		gpio.output(LEDCONTROL1B, False)
	return

#def aviso_pilototrabaja():
#	### primer led en verde
#	gpio.output(LEDCONTROL1G, False)
#	gpio.output(LEDCONTROL1B, False)
#	gpio.output(LEDCONTROL2B, False)
#	gpio.output(LEDCONTROL1G, True)
#	return

def aviso_lecturacorrecta():
	## led 3 y 4 en verde
	gpio.output(LEDLECTURAG, False)
	gpio.output(LEDLECTURAG, True)
	time.sleep(0.4)
	gpio.output(LEDLECTURAG, False)
	time.sleep(0.1)
	return

def aviso_lecturaincidencianormal():
	## led 3 en rojo
	gpio.output(LEDLECTURAR1, False)
	gpio.output(LEDLECTURAR1, True)
	time.sleep(0.4)
	gpio.output(LEDLECTURAR1, False)
	time.sleep(0.1)
	return

def aviso_lecturaincidenciadesconocida():
	## led 3 y 4 en rojo
	gpio.output(LEDLECTURAR1, False)
	gpio.output(LEDLECTURAR2, False)
	gpio.output(LEDLECTURAR1, True)
	gpio.output(LEDLECTURAR2, True)
	time.sleep(0.9)
	gpio.output(LEDLECTURAR1, False)
	gpio.output(LEDLECTURAR2, False)
	time.sleep(0.1)
	return

def aviso_conexion():
	## led 1 en azul
	gpio.output(LEDCONTROL1G, False)
	gpio.output(LEDCONTROL1B, False)
	gpio.output(LEDCONTROL2B, False)
	gpio.output(LEDLECTURAR1, False)
	gpio.output(LEDLECTURAR2, False)
	gpio.output(LEDCONTROL1B, True)
	gpio.output(LEDCONTROL2B, True)
	return

def aviso_hueco():
	## lectura correcta y cerramos azules y verde de trabajo
	aviso_lecturacorrecta()
	return

def aviso_errordesconocido():
	## led 3 y 4 rojo
	aviso_lecturaincidenciadesconocida()
	return

def aviso_multicapa():
	## led 2 azul
	gpio.output(LEDCONTROL1B, False)
	return

def aviso_multicapafin():
	gpio.output(LEDCONTROL2B, False)
	gpio.output(LEDCONTROL1G, True)

def aviso_terminado():
	gpio.output(LEDCONTROL1G, False)
	gpio.output(LEDCONTROL1B, False)
	gpio.output(LEDCONTROL2B, False)
	gpio.output(LEDLECTURAG, False)
	gpio.output(LEDLECTURAR1, False)
	gpio.output(LEDLECTURAR2, False)
	#panel_apagado()
	#panel_tecnico()
	


def peticion_piloto():
	from bluetooth import *

	## Informamos al técnico de que el piloto esta dando instrucciones
	print("Esperando conexión del piloto...")

	## Encendemos luces rojas hasta que se establezca conexión
	gpio.output(LEDCONTROL1G, False)
	gpio.output(LEDCONTROL1B, False)
	gpio.output(LEDCONTROL2B, False)
	gpio.output(LEDLECTURAR1, True)
	gpio.output(LEDLECTURAR2, True)

	server_socket = BluetoothSocket( RFCOMM )
	port = 1 # suponemos que solo hay un dispositivo bluetooth conectado por drone
	server_socket.bind(("",port))
	server_socket.listen(1)
	client_socket,address = server_socket.accept()

	## Cuando se establece conexión se enciende el led 1 en azul
	gpio.output(LEDLECTURAR1, False)
	gpio.output(LEDLECTURAR2, False)
	gpio.output(LEDCONTROL1B, True)
	
	print("Esperando instrucciones del piloto...")
	while True:
		data = client_socket.recv(1024)

		## Cuando recivimos una instrucción por el piloto, led 2 en azul FIJO en interfaz.py
		
		## Indicamos al técnico sobre la respuesta del piloto
		print("Piloto marca {0} \n".format(data))
		###
		 # DEFINIMOS LAS DISTINTAS POSIBILIDADES Y DAMOS UN RETURN QUE
		 # IMPLICARAN UNA SERIE DE ACCIONES. ENCENDEMOS LUCES ANTES EN CADA CASO
		 # PARA QUE EL PILOTO SEPA CUANDO OPERAR
		###
		if(data=="t"):
			gpio.output(LEDCONTROL1B, False)
			#aviso_terminado()
			return "t"
		if(data=="h"):
			gpio.output(LEDCONTROL1B, False)
			aviso_hueco()
			return "h"
		if(data=="e"):
			gpio.output(LEDCONTROL1B, False)
			aviso_errordesconocido()
			return "e"
		if(data=="m"):
			gpio.output(LEDCONTROL1B, False)
			aviso_multicapa()
			data = client_socket.recv(1024)
			data = int(data)
			print("Piloto marca multicapa de tamaño {0}".format(data))
			### IGUAL TENEMOS QUE CREAR UNA FUNCION NUEVA DE LECTURA SOLO PARA MULTICAPA
			return data #envía un numero, eso indica que es una multicapa de tamaño numero
		print("Instrucción desconocida...")



def peticion_piloto_multicapa():
	from bluetooth import *

	## Informamos al técnico de que el piloto esta dando instrucciones
	print("Esperando conexión del piloto en multicapa...")

	## Encendemos luces rojas hasta que se establezca conexión
	gpio.output(LEDCONTROL1G, False)
	gpio.output(LEDCONTROL1B, False)
	gpio.output(LEDCONTROL2B, False)
	gpio.output(LEDLECTURAR1, True)
	gpio.output(LEDLECTURAR2, True)

	server_socket = BluetoothSocket( RFCOMM )
	port = 1 # suponemos que solo hay un dispositivo bluetooth conectado por drone
	server_socket.bind(("",port))
	server_socket.listen(1)
	client_socket,address = server_socket.accept()

	## Cuando se establece conexión se enciende el led 1 en azul
	gpio.output(LEDLECTURAR1, False)
	gpio.output(LEDLECTURAR2, False)
	gpio.output(LEDCONTROL1B, True)
	
	print("Esperando instrucciones del piloto...")
	while True:
		data = client_socket.recv(1024)

		## Cuando recivimos una instrucción por el piloto, led 2 en azul FIJO en interfaz.py
		
		## Indicamos al técnico sobre la respuesta del piloto
		print("Piloto marca {0} \n".format(data))
		###
		 # DEFINIMOS LAS DISTINTAS POSIBILIDADES Y DAMOS UN RETURN QUE
		 # IMPLICARAN UNA SERIE DE ACCIONES. ENCENDEMOS LUCES ANTES EN CADA CASO
		 # PARA QUE EL PILOTO SEPA CUANDO OPERAR
		###
		## UNA VEZ LEÍDA LA MULTICAPA Y SALIDO DE ELLA --> vuelve led verde, podemos esperar otros 30 segundos
		## y marcar el fin del trabajo
		#if(data=="t"):
		#	gpio.output(LEDCONTROL1B, False)
		#	#aviso_terminado()
		#	return "t"
		if(data=="h"):
			gpio.output(LEDCONTROL1B, False)
			aviso_hueco()
			return "h"
		if(data=="e"):
			gpio.output(LEDCONTROL1B, False)
			aviso_errordesconocido()
			return "e"
		## NO PUEDE EXISTIR UNA MULTICAPA DENTRO DE OTRA
		#	if(data=="m"):
		#		gpio.output(LEDCONTROL1B, False)
		#		aviso_multicapa()
		#		data = client_socket.recv(1024)
		#		data = int(data)
		#		print("Piloto marca multicapa de tamaño {0}".format(data))
		#		### IGUAL TENEMOS QUE CREAR UNA FUNCION NUEVA DE LECTURA SOLO PARA MULTICAPA
		#		return data #envía un numero, eso indica que es una multicapa de tamaño numero
		print("Instrucción desconocida en multicapa...")








	