import socket
import gc
import machine
import time

# Correspondencia pin grabado en el  ESP con GPIO
pinGPIO = {0:16, 1:5, 2:4, 3:0, 4:2, 5:14, 6:12, 7:13, 8:15}

# Se crean los objetos pines en la lista D
# Se usa D por correspondencia con el nombre del pin grabado en la placa
D = []
for p in pinGPIO:
    D.append(machine.Pin(pinGPIO[p],machine.Pin.OUT))

def configuraAP(ssid,key,dirRed,ipIni):
    import network
    ap = network.WLAN(network.AP_IF)
    ap.config(essid=ssid, password=key)
    ap.ifconfig((dirRed+'.'+ipIni, '255.255.255.0', dirRed+'.'+ipIni, dirRed+'.254'))
    ap.active(True)
    print("SSID WIFI:  "+ssid)
    print(ap.ifconfig())
    return ap


def conectar_wifi(ssid,key):
    import network
    sta_if = network.WLAN(network.STA_IF)
    if not sta_if.isconnected():
        print('Conectando a la red...')
        sta_if.active(True)
        sta_if.connect(ssid, key) #Modificar por datos de WiFi
        while not sta_if.isconnected():
            print ("+")
        print ("OK")
    red = sta_if.ifconfig()
    print('Configuracion de la red:', red[0:3])

def comando(req,peticion):
    return req.find(peticion)==6;

def CasaAzulON():
    D[1].on()

def CasaAzulOFF():
    D[1].off()

def CasaRojaON():
    D[2].on()

def CasaRojaOFF():
    D[2].off()

def CasaVerdeON():
    D[3].on()

def CasaVerdeOFF():
    D[3].off()

def AutoDoradoINT():
    for i in range(0,5):
        AutoDoradoON();
        time.sleep(0.3)
        AutoDoradoOFF()
        time.sleep(0.3)

def AutoNegroINT():
    for i in range(0,5):
        AutoNegroON();
        time.sleep(0.3)  
        AutoNegroOFF()
        time.sleep(0.3)

def AutoRojoINT():
    for i in range(0,5):
        AutoRojoON();
        time.sleep(0.3)  
        AutoRojoOFF()
        time.sleep(0.3)

def LucesCalleON():
    D[7].on()

def LucesCalleOFF():
    D[7].off()

def AutoDoradoON():
    D[4].on()

def AutoNegroON():
    D[5].on()

def AutoRojoON():
    D[6].on()

def AutoDoradoOFF():
    D[4].off()

def AutoNegroOFF():
    D[5].off()

def AutoRojoOFF():
    D[6].off()

def TodoON():
    CasaAzulON()
    CasaRojaON()
    CasaVerdeON()
    LucesCalleON()
    AutoDoradoON()
    AutoNegroON()
    AutoRojoON()

def TodoOFF():
    CasaAzulOFF()
    CasaRojaOFF()
    CasaVerdeOFF()
    LucesCalleOFF()
    AutoDoradoOFF()
    AutoNegroOFF()
    AutoRojoOFF()

resp = input('Teclee [ap] p/Crear AP, [cw] p/Conectar a red: ')
if resp == "ap":
    vSSID = input("Dar el SSID: ")
    vPASS = input("Dar un password: ")
    vDRED = input("Dar una dir. de red: ")
    vINIC = input("Dar un valor para IP de inicio: ")
    configuraAP(vSSID,vPASS,vDRED,vINIC)
elif resp=="cw":
    vSSID = input("Dar el SSID: ")
    vPASS = input("Dar un password: ")
    conectar_wifi(vSSID,vPASS)
else:
    print ("Se crea por defecto una red  WIFI en modo AP en el dispositivo")
    configuraAP("SHARK_NETWORK","12341234","192.168.100","10")

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(5)

while True:
    try:
        if gc.mem_free() < 102000:
            gc.collect()
        conn, addr = s.accept()
        conn.settimeout(3.0)
        print('Received HTTP GET connection request from %s' % str(addr))
        request = conn.recv(1024)
        conn.settimeout(None)
        request = str(request)
        print('GET Rquest Content = %s' % request)

        if comando(request,'/ACCION=CasaAzulON'):
            CasaAzulON()

        if comando(request,'/ACCION=CasaAzulOFF'):
            CasaAzulOFF()

        if comando(request,'/ACCION=CasaRojaON'):
            CasaRojaON()

        if comando(request,'/ACCION=CasaRojaOFF'):
            CasaRojaOFF()

        if comando(request,'/ACCION=CasaVerdeON'):
            CasaVerdeON()

        if comando(request,'/ACCION=CasaVerdeOFF'):
            CasaVerdeOFF()

        if comando(request,'/ACCION=AutoDoradoINT'):
            AutoDoradoINT()

        if comando(request,'/ACCION=AutoNegroINT'):
            AutoNegroINT()

        if comando(request,'/ACCION=AutoRojoINT'):
            AutoRojoINT()

        if comando(request,'/ACCION=AutoDoradoON'):
            AutoDoradoON()

        if comando(request,'/ACCION=AutoNegroON'):
            AutoNegroON()

        if comando(request,'/ACCION=AutoRojoON'):
            AutoRojoON()

        if comando(request,'/ACCION=AutoDoradoOFF'):
            AutoDoradoOFF()

        if comando(request,'/ACCION=AutoNegroOFF'):
            AutoNegroOFF()

        if comando(request,'/ACCION=AutoRojoOFF'):
            AutoRojoOFF()

        if comando(request,'/ACCION=LucesCalleON'):
            LucesCalleON()

        if comando(request,'/ACCION=LucesCalleOFF'):
            LucesCalleOFF()

        if comando(request,'/ACCION=TodoON'):
            TodoON()

        if comando(request,'/ACCION=TodoOFF'):
            TodoOFF()

        response = "OK "
        conn.send('HTTP/1.1 200 OK\n')
        conn.send('Content-Type: text/html\n')
        conn.send('Connection: close\n\n')
        conn.sendall(response)
        conn.close()
    except OSError as e:
        conn.close()
        print('Connection closed')

