"""MicroMovimiento: logica independiente de la placa, testeable en PC."""
SECUENCIA = ((1,0,0,0),(1,1,0,0),(0,1,0,0),(0,1,1,0),
             (0,0,1,0),(0,0,1,1),(0,0,0,1),(1,0,0,1))
ZONA = 5000
MAX_PASOS_S = 350  # Medios pasos/s, no RPM: reductora no verificada.
MIN_PASOS_S = 40

def objetivo(lectura, centro):
    delta = lectura - centro
    if abs(delta) <= ZONA:
        return 0.0
    extremo = (65535-centro) if delta > 0 else centro
    proporcion = min(1.0, max(0.0, (abs(delta)-ZONA)/(extremo-ZONA)))
    velocidad = MIN_PASOS_S + proporcion*(MAX_PASOS_S-MIN_PASOS_S)
    return velocidad if delta > 0 else -velocidad

def rampa(actual, destino, dt):
    # Cambio de sentido: desacelerar a cero antes de invertir.
    if actual*destino < 0:
        destino = 0.0
    paso = 200.0*min(max(dt,0.0),0.05)
    if actual < destino:
        return min(actual+paso,destino)
    return max(actual-paso,destino)
