#!/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
LED1G = 4
LED1B = 17
LED2B = 27
LED34G = 18
LED3R = 23
LED4R = 24

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

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)



def pasar_a_excel(direccion_trabajo, direccion_excel):
	import io
	from openpyxl import Workbook
	## 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()
	wb = Workbook()
	ws = wb.active
	ws.title = "Lecturas pasillo"
	#ws = openpyxl.workbook.Workbook.create_sheet("Lecturas pasillo")
	ws.cell(row=1, column=1, value="Columna")
	ws.cell(row=1, column=2, value="Altura")
	ws.cell(row=1, column=3, value="Contenido")
	r = 2
	for dato in items_procesado:
		ws.cell(row=r, column=1, value=dato[0]) #columna
		ws.cell(row=r, column=2, value=dato[1]) #altura
		ws.cell(row=r, column=3, 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
	## Librerias para construir el mensaje
	from email.mime.multipart import MIMEMultipart
	from email.mime.text import MIMEText
	## Librerias para adjuntar archivos
	from email.MIMEBase import MIMEBase
	from email import encoders

	## Transformamos el archivo_trabajo en un excel para el cliente
	direccion_trabajo = direccion_trabajo
	direccion_excel = direccion_excel
	pasar_a_excel(direccion_trabajo, direccion_excel)
	
	## Ahora vamos a construir el mensaje
	## Definimos remitente y receptor
	addr_to = str(gmail)
	addr_from = "operativa.airvant@gmail.com"
	## Definimos SMTP del email
	smtp_server = "stmp.gmail.com"
	smtp_user = "operativa.airvant@gmail.com"
	smtp_pass = "#airvant.onw"
	## Construimos el email
	mensaje = MIMEMultipart()
	mensaje['From'] = addr_from
	mensaje['To'] = str(gmail)
	mensaje['Subject'] = "Airvant | Empresa: {0} Pasillo: {1}" .format(empresa, pasillo)
	# El cuerpo del mensaje se estructura en HTML
	mensaje.attach(MIMEText('<h1>Trabajo de pasillo finalizado</h1><p>Descargue el archivo EXCEL adjunto.<p>Gracias por confiar en <b>Airvant</b>.', 'HTML'))
	# Adjuntamos el archivo de direccion_trabajo
	fp = open(direccion_excel, 'rb')
	adjunto = MIMEBase('multipart', 'encrypted')
	adjunto.set_payload(fp.read())
	fp.close()
	# Encriptamos archivo.
	encoders.encode_base64(adjunto)
	nombre_archivo = empresa + " " + pasillo + ".xlsx"
	adjunto.add_header('Content-Disposition', 'attachment', filename = nombre_archivo)
	mensaje.attach(adjunto)
	
	## 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(smtp_user, smtp_pass)
    	mailServer.sendmail(addr_from, addr_to, mensaje.as_string())
    	mailServer.quit()
		

def peticion_piloto():
	from bluetooth import *

	global LED1G
	global LED1B
	global LED2B
	global LED34G
	global LED3R
	global LED4R

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

	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 y se apagan las rojas
	gpio.output(LED1B, gpio.HIGH)
	gpio.output(LED3R, gpio.LOW)
	gpio.output(LED4R, gpio.LOW)
	###
	
	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(LED1B, gpio.LOW)
			return "t"
		
		if(data=="h"):
			gpio.output(LED1B, gpio.LOW)
			return "h"
		
		if(data=="e"):
			gpio.output(LED1B, gpio.LOW)
			return "e"
		
		if(data=="m"):
			gpio.output(LED1B, gpio.LOW)
			###
			## Parpadeamos el segundo led azul avisando de multicapa
			for aviso in range(5):
				gpio.output(LED2B, gpio.LOW)
				gpio.output(LED2B, gpio.HIGH)
				time.sleep(0.3)
				gpio.output(LED2B, gpio.LOW)
			###			
			data = client_socket.recv(1024)
			data = int(data)
			print("Piloto marca multicapa de tamaño {0}".format(data))
			## Dejaremos el led 2 en azul todo el tiempo hasta que terminemos la multicapa en interfaz.py
			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 *

	global LED1G
	global LED1B
	global LED2B
	global LED34G
	global LED3R
	global LED4R

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

	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(LED3R, gpio.LOW)
	gpio.output(LED4R, gpio.LOW)
	gpio.output(LED1B, gpio.HIGH)
	
	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=="h"):
			gpio.output(LED2B, gpio.HIGH)
			time.sleep(0.3)
			gpio.output(LED2B, gpio.LOW)
			return "h"
		if(data=="e"):
			gpio.output(LED2B, gpio.HIGH)
			time.sleep(0.3)
			gpio.output(LED2B, gpio.LOW)
			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...")	