# -*- coding: UTF-8 -*-
#!/usr/local/bin/python
import os, sys
import spidev
import time
from libsoc import gpio
from dweet import Dweet
from gpio_96boards import GPIO
#
global status_chave
global status_chave_app
global adc_tilt

adc_tilt = [0,0,0]

nomeDweet = "Smart_Home_SH2Y_1"
#
TEMP = GPIO.gpio_id('GPIO_CS')
LUM = GPIO.gpio_id('GPIO_CS')
RELE = GPIO.gpio_id('GPIO_A')
TILT = GPIO.gpio_id('GPIO_C')
CHAVE = GPIO.gpio_id('GPIO_E')
#
pins = ((TEMP, 'out'),(LUM, 'out'),(RELE, 'out'),(TILT, 'in'),(CHAVE, 'in'))
#
dweet = Dweet()
#
spi = spidev.SpiDev()
spi.open(0,0)
spi.max_speed_hz = 10000
spi.mode = 0b00
spi.bits_per_word = 8
#
##########################################################################################
############# LEITURA DA CHAVE COMUTADORA (LIGA/DESLIGA) #################################
##########################################################################################
def detectaButton(gpio):	
	status_chave = gpio.digital_read(CHAVE)
	print("\n")
	if (status_chave == 1 and status_chave_app == 1) or (status_chave == 0 and status_chave_app == 1) or (status_chave == 1 and status_chave_app == 0):
		print "1. Sistema de Segurança Física: ARMADO e PROTEGENDO" #status_chave = 1
	else:
		print "1. Sistema de Segurança Física: DESARMADO e SEM PROTEÇÃO" #status_chave = 0
	return status_chave
##########################################################################################
########## LEITURA DA TEMPERATURA DO AMBIENTE ############################################
##########################################################################################
def readtemp(gpio):
    gpio.digital_write(TEMP, GPIO.HIGH)
    time.sleep(0.0002)
    gpio.digital_write(TEMP, GPIO.LOW)
    r = spi.xfer2([0x01, 0xA0, 0x00])
    gpio.digital_write(TEMP, GPIO.HIGH)
    adcout = (r[1] << 8) & 0b1100000000
    adcout = adcout | (r[2] & 0xff)
    adc_temp = (adcout *5.0/1023-0.5)*100
    print("2. Temperatura: %2.1f°C" %adc_temp)
    return adc_temp
##########################################################################################
########## LEITURA DO SENSOR DE LUMINOSIDADE #############################################
##########################################################################################
def readlum(gpio):
    gpio.digital_write(LUM, GPIO.HIGH)
    time.sleep(0.0002)
    gpio.digital_write(LUM, GPIO.LOW)
    r = spi.xfer2([0x01, 0x80, 0x00])
    gpio.digital_write(LUM, GPIO.HIGH)
    adcout = (r[1] << 8) & 0b1100000000
    adc_lum = adcout | (r[2] & 0xff)
    print("3. Luminosidade: %d lumens" %adc_lum)
    return adc_lum
##########################################################################################
########## LEITURA DO SENSOR DE ABERTURA DE PORTA/JANELA #################################
##########################################################################################
def detecta_Tilt(gpio):
    status = gpio.digital_read(TILT)
    tilt_detected = 0
    sleep_count = 0
    while sleep_count < 1000:
    	if gpio.digital_read(TILT) != status:
    	    tilt_detected += 1
    	    status = gpio.digital_read(TILT)
    	sleep_count += 1
    	time.sleep(0.002)
    if tilt_detected > 2:
    	if (status_chave == 1 and status_chave_app == 1) or (status_chave == 0 and status_chave_app == 1) or (status_chave == 1 and status_chave_app == 0):
        	print("4. Sensor de Porta/Janela: ALERTA - Abertura indevida detectada!")
        	adc_tilt[0] = tilt_detected
        	print("5. Sistema de Aviso Sonoro: ATIVADO")
        	gpio.digital_write(RELE, GPIO.HIGH) #Aciona sistema de alarme sonoro
        	adc_tilt[1] = 1
        	adc_tilt[2] = adc_tilt[2] + 1
        	print("6. Número de Alertas: %d" %adc_tilt[2])
        	return adc_tilt
        	tilt_detected = 0
        else:
        	print("4. Sensor de Porta/Janela: Abertura identificada!")
        	adc_tilt[0] = tilt_detected
        	print("5. Sistema de Aviso Sonoro: DESATIVADO")
        	gpio.digital_write(RELE, GPIO.LOW) #Desaciona sistema de alarme sonoro
        	adc_tilt[1] = 2
        	adc_tilt[2] = adc_tilt[2] + 0
        	print("6. Número de Alertas: %d" %adc_tilt[2])
        	return adc_tilt
        	tilt_detected = 0
    else:
        print("4. Sensor de Porta/Janela: OK")
        adc_tilt[0] = tilt_detected
        print("5. Sistema de Aviso Sonoro: DESATIVADO")
        gpio.digital_write(RELE, GPIO.LOW) #Desaciona sistema de alarme sonoro
        adc_tilt[1] = 3
        adc_tilt[2] = adc_tilt[2] + 0
        print("6. Número de Alertas: %d" %adc_tilt[2])
        return adc_tilt
##########################################################################################
############### PROGRAMA PRINCIPAL #######################################################
##########################################################################################
with GPIO(pins) as gpio:
#
	global status_chave
	global status_chave_app
	#
	print("\n")
	print("####################################################################################")
	print("# Iniciando sistema de Monitoramento e Segurança Física de Ambiente, composto por: #")
	print("# 1. Interruptor para Ligar/Desligar o Sistema de Segurança Física                 #")
	print("# 2. Temperatura;                                                                  #")
	print("# 3. Luminosidade;                                                                 #")
	print("# 4. Sensor de Abertura de Porta/Janela;                                           #")
	print("# 5. Relé para acionamento do sistema de aviso sonoro - Alarme                     #")
	print("####################################################################################")
	print("\n")
	#
	while True:
		time.sleep(2)
		resposta = dweet.latest_dweet(name=nomeDweet)
		status_chave_app = resposta['with'][0]['content']['Sistema_Seg_APP']
		status_chave = detectaButton(gpio)
		adc_temp = readtemp(gpio)
		adc_lum = readlum(gpio)
		time.sleep(1)
		adc_tilt = detecta_Tilt(gpio)
		time.sleep(5)
		dweet.dweet_by_name(name="%s" %nomeDweet, data={"Sistema_Seguranca": status_chave, "Temperatura": adc_temp,"Luminosidade": adc_lum, "Sensor_PJ": adc_tilt[0], "Sistema_Aviso_Sonoro": adc_tilt[1], "Sistema_Seg_APP": status_chave_app, "Numero_Alertas":adc_tilt[2]})
    	#
		time.sleep(5)
		resposta = dweet.latest_dweet(name="%s" %nomeDweet)
		status_chave_app = resposta['with'][0]['content']['Sistema_Seg_APP']
    	#
		############### TESTA RETORNO DO DWEET #################################################
		#print("\nRetorno DWEET:")
		#print("Resposta Completa: %s" %resposta)
		#print("1. Sistema_Seguranca: %s" %resposta['with'][0]['content']['Sistema_Seguranca'])
		#print("2. Temperatura: %2.1f°C" %resposta['with'][0]['content']['Temperatura'])
		#print("3. Luminosidade: %d lumens" %resposta['with'][0]['content']['Luminosidade'])
		#print("4. Sensor_PJ: %s" %resposta['with'][0]['content']['Sensor_PJ'])
		#print("5. Sistema_Aviso_Sonoro: %s" %resposta['with'][0]['content']['Sistema_Aviso_Sonoro'])
		#print("6. status_chave_app: %s" %resposta['with'][0]['content']['Sistema_Seg_APP'])
		##########################################################################################