from machine import Pin, Timer
import time
import network
import BlynkLib

# ---------------------------------------------------------------------- #
#                           ENCO                                         #
# ---------------------------------------------------------------------- #

def enco_pulsador():
    global m_pulsador 

    if pulsador.value():
        m_pulsador = False 
    elif not m_pulsador:
        m_pulsador = True
        return True 


def enco_encoder():
    global m_encoder 

    val = [canal.value() for canal in encoder]
    if all(val):
        m_encoder = False 
    elif not m_encoder:
        m_encoder = True 
        return 2 * val[0] - 1


pulsador = Pin(5, Pin.IN, Pin.PULL_UP)
encoder = [Pin(4, Pin.IN), Pin(16, Pin.IN)]
m_pulsador = False
m_encoder = False

# ---------------------------------------------------------------------- #
#                           WIFI                                         #
# ---------------------------------------------------------------------- #

def wifi_update():

    aj_wifi = ajustes["Red Wi-Fi"]
    keep = aj_wifi["Keep"]
    nombre = aj_wifi["Nombre"]
    contra = aj_wifi["Contra"]

    if keep and not sta_if.active():
        print(f"Conectando a {nombre}")
        sta_if.active(True)
        sta_if.connect(nombre, contra)

    elif not keep and sta_if.active():
        sta_if.disconnect()
        sta_if.active(False)
        print(f"Desconectado de {nombre}")
 
    aj_wifi["Conn"] = sta_if.isconnected()
    aj_wifi["IPad"] = sta_if.ifconfig()[0]


sta_if = network.WLAN(network.STA_IF)

# ---------------------------------------------------------------------- #
#                           BLYN                                         #
# ---------------------------------------------------------------------- #

def blyn_write():
    blynk.virtual_write(0, "Hola")


def blyn_update():
    global blynk

    wifi_conn = ajustes["Red Wi-Fi"]["Conn"]
    if wifi_conn and not blynk:
        blynk = BlynkLib.Blynk(auth)
    elif not wifi_conn and blynk:
        blynk = None

    if blynk:
        try:
            blyn_write()
            blynk.run()
        except Exception as e:
            print(f"Blynk error: {e}")


blynk = None
auth = "dRuYnehewHCvLmmO5QL2wugxLNZE68gc"

# ---------------------------------------------------------------------- #
#                           MAIN                                         #
# ---------------------------------------------------------------------- #

def main_timer1():
    global v_pulsador 
    global v_encoder 

    if v_pulsador:
#       print(True)
        aj_wifi = ajustes["Red Wi-Fi"]
        aj_wifi["Keep"] = not aj_wifi["Keep"]
        v_pulsador = None 

    if v_encoder:
        print(v_encoder)
        v_encoder = None

    blyn_update()   
    wifi_update()
 


def main_timer2(timer):
    global v_pulsador 
    global v_encoder 

    v = enco_pulsador()
    if v:
        v_pulsador = v 
    
    v = enco_encoder()
    if v:
        v_encoder = v


ajustes = {
    "Red Wi-Fi": {
        "Conn": False,
        "Keep": False,
        "Nombre": "Wokwi-GUEST",
        "Contra": "",
        "IPad": ""
    }
}

T_CICLO = 500
v_pulsador = None
v_encoder = None 

timer = Timer(1)
timer.init(freq=500, callback=main_timer2)

deadline = time.ticks_ms()
while True:
#   tiempo_test = time.time_ns()
    main_timer1()
#   t = (time.time_ns() - tiempo_test) / 10**6
#   print(f"Tiempo: {int(t)} ms")

    deadline = time.ticks_add(deadline, T_CICLO)
    while time.ticks_diff(deadline, time.ticks_ms()) > 0:
        time.sleep_ms(1)