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 se conecte a una red WIFI existente o funcione 
##     como un AP creando su propia red WIFI, misma que puede trabajar con valores por defecto o 
##     proporcionados por el usuario. El programa puede tambien cargarse en un ESP32. 
##################################################################################################


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;

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")

# 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)

        if comando(request,'/led_2_on'):
            print('LED ON -> GPIO2')
            led_state = "ON"
            led.on()
        if comando(request,'/led_2_off'):
            print('LED OFF -> GPIO2')
            led_state = "OFF"
            led.off()
        if comando(request,'/led_2_blink'):
            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')
