Simulator: support endstop simulation
Provide a simulated, simplified representation of the action of mechanical endstop switches which turn on and off at slightly different amounts of pressure. When any axis moves past -10, simulate endstop "on" condition. When the axis moves to 0, simulate the endstop "off" condition. This support allows the simulation of G28 (home) commands.
This commit is contained in:
parent
887a4eedd9
commit
59610750dd
|
|
@ -329,6 +329,8 @@ bool _READ(pin_t pin) {
|
||||||
return state[pin];
|
return state[pin];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void sim_endstop(int axis);
|
||||||
|
|
||||||
void _WRITE(pin_t pin, bool s) {
|
void _WRITE(pin_t pin, bool s) {
|
||||||
bool old_state = state[pin];
|
bool old_state = state[pin];
|
||||||
uint64_t nseconds = sim_runtime_ns();
|
uint64_t nseconds = sim_runtime_ns();
|
||||||
|
|
@ -397,10 +399,65 @@ void _WRITE(pin_t pin, bool s) {
|
||||||
pos[axis] += dir;
|
pos[axis] += dir;
|
||||||
record_pin(TRACE_POS + axis, pos[axis], nseconds);
|
record_pin(TRACE_POS + axis, pos[axis], nseconds);
|
||||||
print_pos();
|
print_pos();
|
||||||
|
|
||||||
|
for (int a = X_AXIS; a < E_AXIS; a++)
|
||||||
|
sim_endstop(a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Simulate min endstops. "on" at -10, "off" at 0.
|
||||||
|
*/
|
||||||
|
static void sim_endstop( int axis ) {
|
||||||
|
bool on ;
|
||||||
|
|
||||||
|
if (axis == AXIS_NONE) return;
|
||||||
|
else if (pos[axis] <= -10) on = true;
|
||||||
|
else if (pos[axis] >= 0) on = false;
|
||||||
|
else return ;
|
||||||
|
|
||||||
|
const char * strstate = on ? "ON" : "OFF";
|
||||||
|
int minpin;
|
||||||
|
switch (axis) {
|
||||||
|
case X_AXIS:
|
||||||
|
#ifdef X_INVERT_MIN
|
||||||
|
on = ! on;
|
||||||
|
#endif
|
||||||
|
minpin = X_MIN_PIN;
|
||||||
|
break;
|
||||||
|
case Y_AXIS:
|
||||||
|
#ifdef Y_INVERT_MIN
|
||||||
|
on = ! on;
|
||||||
|
#endif
|
||||||
|
minpin = Y_MIN_PIN;
|
||||||
|
break;
|
||||||
|
case Z_AXIS:
|
||||||
|
#ifdef Z_INVERT_MIN
|
||||||
|
on = ! on;
|
||||||
|
#endif
|
||||||
|
minpin = Z_MIN_PIN;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// No change
|
||||||
|
if (state[minpin] == on) return;
|
||||||
|
|
||||||
|
// Change the endstop state and report it
|
||||||
|
state[minpin] = on;
|
||||||
|
record_pin(TRACE_PINS + minpin, on, sim_runtime_ns());
|
||||||
|
bred();
|
||||||
|
if (on)
|
||||||
|
sim_tick('A' + minpin);
|
||||||
|
else
|
||||||
|
sim_tick('a' + minpin);
|
||||||
|
fbreset();
|
||||||
|
|
||||||
|
sim_info("%c-Endstop: %s", "XYZE???"[axis], strstate);
|
||||||
|
}
|
||||||
|
|
||||||
void _SET_OUTPUT(pin_t pin) {
|
void _SET_OUTPUT(pin_t pin) {
|
||||||
sim_assert(pin < PIN_NB, "Pin number out of range");
|
sim_assert(pin < PIN_NB, "Pin number out of range");
|
||||||
direction[pin] = out;
|
direction[pin] = out;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue