Entonces deberias tu maquina lo podriamos llamar que tiene 2 estados.
Uno NORMAL, el cual permita usar cualquier boton sin ningun problema (lo que hicimos hasta ahora).
Y uno que le podemos llamar ORIGEN (el nuevo a agregar), que en este estado se va a mover hasta que llegue a los finales de carreras correspondientes.
Cuando se cumpla la condicion de que ambos fines de carrera se activaron entonces paras y pasa a modo NORMAL.
Y el codigo dentro de la interrupcion quedaria:
//Antes tenemos el set_timer
if(botonOrigen) estado = ORIGEN;
switch(estado)
{
case NORMAL:
// Revisamos si debemos avanzar o no
// Motor en X, primero revisamos que no estemos al final sea cual sea las 2 puntas
if(motorX_Fp && motor1_Xp) { indiceX++; }
else if(motorX_Fn && motor1_Xn) { indiceX--; } // motor1 eje positivo con giro horario
// Motor Y
if(motorY_Fp && motor1_Yp){ indiceY++; } // motor1 eje negativo con giro anti-horario
else if(motorY_Fn && motor2_Yp){ indiceY--; }
break;
case ORIGEN:
// Si NO llego, decremento en X
if(!motorX_Fn) indiceX--;
// Si NO llego, aumento en Y
if(!motorY_Fp) indiceY++;
// Si llego a AMBOS, dejo que nuevamente haga caso a los botones comunes
if(motorY_Fp && motorX_Fn) estado = NORMAL;
break;
}
// Luego tenemos la correccion de indices
// Y activar las salidas
Antes hay que definir estado y su enum.
enum mEstados {NORMAL, ORIGEN};
enum mEstados estado;
Yo puse la lectura del boton alli en la interrupcion, ya que normalmente los lees en la interrupcion, lo hice asi solo para que sea simple de ver, luego lo pondras como vos mas desees.
Entonces. Al detectar el boton, queda en estado de ORIGEN, esto hace que solo decremente/incremente indices hasta llegar a ambos fines de carrera, de llegado a ambos, vuelve darle control al codigo que habiamos realizado antes, el de los botones para que avance en +X -X +Y -Y.