import spidev
import time
import datetime

from libsoc import gpio
from gpio_96boards import GPIO
from dweet import Dweet

GPIO_CS = GPIO.gpio_id('GPIO_CS')
BUTTON = GPIO.gpio_id('GPIO_A')
RELE = GPIO.gpio_id('GPIO_C')
LED = GPIO.gpio_id('GPIO_E')
DISTA_TRG = GPIO.gpio_id('GPIO_H')
DISTA_SIG = GPIO.gpio_id('GPIO_G')

AR = GPIO.gpio_id('GPIO_I')
LUZ = GPIO.gpio_id('GPIO_J')


pins = ((GPIO_CS, 'out'), (BUTTON, 'in'), (RELE, 'out'), (LED, 'out'), (DISTA_TRG, 'out'),(DISTA_SIG, 'in'),(AR, 'out'),(LUZ, 'out'),)


spi = spidev.SpiDev()
spi.open(0,0)
spi.max_speed_hz = 10000
spi.mode = 0b00
spi.bits_per_word = 8

global system_status
system_status = 1

dweet = Dweet()

def readDweet():

	resposta = dweet.latest_dweet(name="SmHo_CarMene")
	verifica_resposta = resposta['this']
	print verifica_resposta
	if verifica_resposta != "succeeded":
		print("dweet.io com problemas...aguarde!")
		time.sleep(2.0)
	else:	
		luz_onoff = resposta['with'][0]['content']['Luzes'] #0 ou 1
	        ar_onoff = resposta['with'][0]['content']['ArCondicionado'] #0 ou 1
		autotemp_onoff = resposta['with'][0]['content']['AutoTemperatura'] #0 ou 1
		autoluz_onoff = resposta['with'][0]['content']['AutoLuminosidade'] #0 ou 1
		sistema_onoff = system_status #0 ou 1
		luzref = resposta['with'][0]['content']['LuzDesejada'] # luminancia desejada
		tempref = resposta['with'][0]['content']['TemperaturaDesejada']	#temperatura desejada

		if ((autoluz_onoff == 1) and (luz_onoff == 0)):
			luz_auto(gpio)
		if ((autotemp_onoff == 1) and (ar_onoff == 0)):
			ar_auto(gpio)					
		if ar_onoff == 1:
			liga_ar(gpio)
		elif ar_onoff == 0:
			desliga_ar(gpio)
		if luz_onoff == 1:
			liga_luz(gpio)
		elif luz_onoff == 0:
			desliga_luz(gpio)	

def readSensores(gpio):

	temp = readTemp(gpio)
	lumi = readLumi(gpio)
	dist = readdistancia(gpio)
	

def writeDweet(gpio):

	gpio.digital_write(LED, luz_onoff)
	gpio.digital_write(RELE, ar_onoff)
	dweet.dweet_by_name(name="SmHo_CarMene", data={"Luzes": luz_onoff, "ArCondicionado": ar_onoff, "AutoTemperatura": autotemp_onoff,"AutoLuminosidade": autoluz_onoff, "Temperatura":temp, "Luminosidade": lumi, "LuzDesejada": luzref, "TemperaturaDesejada": tempref, "DistanciaMedida": dist, "SistemaDesligado": sistema_onoff})
	

def detectaButton(gpio):

	global system_status
	status = gpio.digital_read(BUTTON)
	if status == 1:
		if system_status == 0:
			system_status = 1
			print "Sistema Ligado! \n"
		else:
			system_status = 0
			gpio.digital_write(RELE, GPIO.LOW)
			gpio.digital_write(LED, GPIO.LOW)
			print "Sistema Desligado \n"

			sistema_onoff =  system_status

			resposta = dweet.latest_dweet(name="SmHo_CarMene")
			verifica_resposta = resposta['this']
			if verifica_resposta != "succeeded":
				print("dweet.io com problemas...aguarde!")
				time.sleep(2.0)
			else:
				dweet.dweet_by_name(name="SmHo_CarMene", data={"Luzes": luz_onoff, "ArCondicionado": ar_onoff, "AutoTemperatura": autotemp_onoff, "AutoLuminosidade": autoluz_onoff, "Temperatura":temp, "Luminosidade": lumi, "LuzDesejada": luzref, "TemperaturaDesejada": tempref, "DistanciaMedida": dist, "SistemaDesligado": sistema_onoff})



	return system_status

#def readfogo(gpio):
	
#	global incendio
#	#print "digital 2: %d" %digital[2] 
#	#if digital[2] == 1:
#	incendio = gpio.digital_read(FIRE)
#	print "alarme fogo: %d" %incendio
#	if ((incendio == 1) and (digital[2] == 1)):
#	  while incendio == 1:  
#	    gpio.digital_write(LED, GPIO.HIGH)
#	    time.sleep(1.0)
#	    gpio.digital_write(LED, GPIO.LOW)
#	    time.sleep(1.0)
#	    incendio = gpio.digital_read(FIRE)
#	
#	return incendio

	
def readTemp(gpio):

	global adc_temp	
	gpio.digital_write(GPIO_CS, GPIO.HIGH)
	time.sleep(0.0002)
	gpio.digital_write(GPIO_CS, GPIO.LOW)
	r = spi.xfer2([0x01, 0xA0, 0x00])
	gpio.digital_write(GPIO_CS, GPIO.HIGH)

	adcout = (r[1] << 8) & 0b1100000000
	adcout = adcout | (r[2] & 0xff)
	adc_temp = (adcout *5.0/1023-0.5)*100

	return adc_temp

def readLumi(gpio):

	global adcout	
	gpio.digital_write(GPIO_CS, GPIO.HIGH)
	time.sleep(0.0002)
	gpio.digital_write(GPIO_CS, GPIO.LOW)
	r = spi.xfer2([0x01, 0x80, 0x00])
	gpio.digital_write(GPIO_CS, GPIO.HIGH)

	adcout = (r[1] << 8) & 0b1100000000
	adcout = adcout | (r[2] & 0xff)

	return  adcout


def liga_ar_simula(gpio):
	gpio.digital_write(AR, GPIO.HIGH)
	x = gpio.digital_read(AR)
        print "AR: %d" %x

def desliga_ar_simula(gpio):
	gpio.digital_write(AR, GPIO.LOW)
	x = gpio.digital_read(AR)
        print "AR: %d" %x


def liga_luz_simula(gpio):
	gpio.digital_write(LUZ, GPIO.HIGH)

	x = gpio.digital_read(LUZ)
        print "LUZ: %d" %x

def desliga_luz_simula(gpio):
	gpio.digital_write(LUZ, GPIO.LOW)
	x = gpio.digital_read(LUZ)
        print "LUZ: %d" %x


def liga_ar(gpio):
	gpio.digital_write(RELE, GPIO.HIGH)

def desliga_ar(gpio):
	gpio.digital_write(RELE, GPIO.LOW)

def ar_auto(gpio):

   temp_value = readTemp(gpio)
   #print ("Temperatura: %2.1f" %temp_value)
   #print ("*******************")
   
   auto_ar_cloud = autotemp_onoff #toggle button autotemp em 1?
   #print "Controle Auto: %d" %auto_ar_cloud
   
   Tempref_value_cloud = tempref
   #print "Temperatura ref: %2.1f" %Tempref_value_cloud
   
   #time.sleep(0.3)
 
   if (temp_value > Tempref_value_cloud) and (auto_ar_cloud == 1) and (ar_onoff == 0):
	liga_ar_simula(gpio)

   elif (temp_value <= Tempref_value_cloud) and (auto_ar_cloud == 1) and (ar_onoff == 0):
	desliga_ar_simula(gpio)

   elif (auto_ar_cloud == 0):
	desliga_ar_simula(gpio)
	   
   #time.sleep(0.4)


def liga_luz(gpio):
	gpio.digital_write(LED, GPIO.HIGH)

def desliga_luz(gpio):
	gpio.digital_write(LED, GPIO.LOW)

def luz_auto(gpio):

   luz_value = readLumi(gpio)
   
   auto_luz_cloud = autoluz_onoff
   #print "Controle Auto Luz: %d" %auto_luz_cloud

   Luzref_value_cloud = luzref
   #print "Luminosidade ref: %2.1f" %Luzref_value_cloud
   
   #time.sleep(0.4)
 
   if ((luz_value <= Luzref_value_cloud) and (auto_luz_cloud == 1) and (luz_onoff == 0)):
	liga_luz_simula(gpio)
   elif (luz_value > Luzref_value_cloud) and (auto_luz_cloud == 1) and (luz_onoff == 0):
	desliga_luz_simula(gpio)
   elif (auto_luz_cloud == 0):
	desliga_luz_simula(gpio)

	   
   #time.sleep(0.4)

def readdistancia(gpio):
	global fim
	global inicio	
	global dist
	
	dist = 0.0 
	inicio = 0
	fim = 0
	duraecho = 0	
	vsom = 340.29

	deltaT = gpio.digital_read(DISTA_SIG)# echo 
	#print deltaT	
	#print ("**antes trigger****")

	gpio.digital_write(DISTA_TRG, GPIO.LOW)#trigger
	time.sleep(0.000020)
	#x = gpio.digital_read(DISTA_TRG)
	#print ("trigger em zero %d" %x)
	
	gpio.digital_write(DISTA_TRG, GPIO.HIGH)
	time.sleep(0.000030)
	#x = gpio.digital_read(DISTA_TRG)
	#print ("trigger em um %d" %x)

	gpio.digital_write(DISTA_TRG, GPIO.LOW)
	#x = gpio.digital_read(DISTA_TRG)
	#print ("trigger completo %d" %x)

	time.sleep(0.0003)#aguarda o fim do piezzo

	deltaT = gpio.digital_read(DISTA_SIG)# echo vai para 1?
	#print "dista_SIG echo start: %d" %deltaT	
	#print ("+++++resposta echo deveria ser 1+++++++++")

        if deltaT == 1:
	 inicio = time.time() * 100.0
	 #print inicio

	while deltaT == 1:
	 duraecho = duraecho + 1	
 	 deltaT = gpio.digital_read(DISTA_SIG)# leitura echo
 	 fim = time.time() * 100.0
	 #print fim
	 
	intervalo = fim - inicio
	#print intervalo

	dist = intervalo * vsom / 2.0
	#print dist

	time.sleep(1.3)
	#print "duraecho: %d" %duraecho
	
	return dist


if __name__=='__main__':
	

	with GPIO(pins) as gpio:

		while True:

			global luzref
			global tempref
			global temp
			global lumi
			global dist
			global luz_onoff
			global ar_onoff
			global autotemp_onoff
			global autoluz_onoff
			global sistema_onoff
			if detectaButton(gpio) == 1:
				
				resposta = dweet.latest_dweet(name="SmHo_CarMene")
				verifica_resposta = resposta['this']
				print verifica_resposta
				print ("*********************************************************")
				if verifica_resposta != "succeeded":
					print("dweet.io com problemas...aguarde!")
					time.sleep(2.0)
				else:	

					luz_onoff = resposta['with'][0]['content']['Luzes'] 
					ar_onoff = resposta['with'][0]['content']['ArCondicionado'] 
					autotemp_onoff = resposta['with'][0]['content']['AutoTemperatura'] 
					autoluz_onoff = resposta['with'][0]['content']['AutoLuminosidade'] 
					sistema_onoff = system_status 
					luzref = resposta['with'][0]['content']['LuzDesejada'] 
					tempref = resposta['with'][0]['content']['TemperaturaDesejada']	

					if ((autoluz_onoff == 1) and (luz_onoff == 0)):
						luz_auto(gpio)
					elif ((autoluz_onoff == 0) or (luz_onoff == 1)):
						desliga_luz_simula(gpio)

					if ((autotemp_onoff == 1) and (ar_onoff == 0)):
						ar_auto(gpio)					
					elif ((autotemp_onoff == 0) or (ar_onoff == 1)):
						desliga_ar_simula(gpio)

					if ar_onoff == 1:
						liga_ar(gpio)
					elif ar_onoff == 0:
						desliga_ar(gpio)

					if luz_onoff == 1:
						liga_luz(gpio)
					elif luz_onoff == 0:
						desliga_luz(gpio)

					temp = readTemp(gpio)
					lumi = readLumi(gpio)
					dist = readdistancia(gpio)				
		
					time.sleep(2.0)
					writeDweet(gpio)

					print "Temp: %2.1f\nlumi: %d\ntempref: %d\nluzref: %d\nled: %d\nrele: %d\nautotemp: %d\nautoluz: %d\nsysoff: %d\ndist: %d" %(temp, lumi, tempref, luzref, luz_onoff, ar_onoff, autotemp_onoff, autoluz_onoff, sistema_onoff, dist)

									


			time.sleep(8.0)



