import socket
import gc
import machine
import time

##################################################################################################
##     El programa implementa un servidor WEB para recibir peticiones GET remotas que permitan
##     encendder, apagar o hacer parpadear un led conectado en el pin 2 de un ESP8266.
##     El programa permite que la placa ESP8266 funcione como un AP creando su propia
##     red WIFI, misma que puede trabajar con valores por defecto o proporcionados por
##     el usuario.
##################################################################################################
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():
    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('CERROAZULNET', '19861986') #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])

resp = input('Desea dar valores para crear una red wifi ? S=SI ')
if resp == "S":
    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)
else:
    configuraAP("SHARK_NETWORK","12341234","192.168.100","10")

# For more details and step by step guide visit: Microcontrollerslab.com
led_state = "OFF"

led = machine.Pin(2,machine.Pin.OUT)

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)
        led_on = request.find('/?led_2_on')
        led_off = request.find('/?led_2_off')
        led_blink = request.find('/?led_2_blink')

        if led_on == 6:
            print('LED ON -> GPIO2')
            led_state = "ON"
            led.on()
        if led_off == 6:
            print('LED OFF -> GPIO2')
            led_state = "OFF"
            led.off()
        if led_blink == 6:
            print('LED BLINK -> GPIO2')
            led_state = "BLINK"
            for v in range(1,6):
                led.on()
                time.sleep(0.5)
                led.off()
                time.sleep(0.5)

        response = "OK "+led_state;
        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')
