#### Event triggered when IR sensors update (10 Hz)
onevent prox 
    # Braitenberg obstacle avoidance
    if speed >0 then
        call math.dot(temp_braitenberg, prox.horizontal[0:4],
            weights_braitenberg, 4)
        call math.dot(temp_braitenberg_turn, prox.horizontal[0:4],
            weights_braitenberg_turn, 4)
        call math.muldiv(temp_braitenberg_left, speed,
            temp_braitenberg + temp_braitenberg_turn, 125)
        call math.muldiv(temp_braitenberg_right, speed,
            temp_braitenberg - temp_braitenberg_turn, 125)
        motor.left.target = speed - temp_braitenberg_left
        motor.right.target = speed - temp_braitenberg_right
    elseif speed < 0 then
        temp_braitenberg = -300 / speed
        motor.left.target = speed + prox.horizontal[6] / temp_braitenberg
        motor.right.target = speed + prox.horizontal[5] / temp_braitenberg
    end
    # Saturation of left and right speed
    call math.min(motor.left.target, motor.left.target, vmax)
    call math.max(motor.left.target, motor.left.target, vmin)
    call math.min(motor.right.target, motor.right.target, vmax)
    call math.max(motor.right.target, motor.right.target, vmin)

    # Table border detection
    if prox.ground.reflected[0] < 130 or prox.ground.reflected[1] < 130 then 
        motor.left.target = 0
        motor.right.target = 0
        call leds.bottom.left(32, 0, 0)
        call leds.bottom.right(32, 0, 0)
    else
        call leds.bottom.left(0, 0, 0)
        call leds.bottom.right(0, 0, 0)
    end