All pastes #186270 Raw Edit

Mine

public text v1 · immutable
#186270 ·published 2006-09-29 19:00 UTC
rendered paste body
#define PROBE_DEBOUNCE_VAL 20

static void process_inputs(void)
{
    int joint_num;
    double abs_ferror, tmp;
    axis_hal_t *axis_data;
    emcmot_joint_t *joint;
    int must_abort;
    static int probe_counter=0;
    static int previous_probe_value=0;

    /* read probe input */
    if(!probe_counter) {
	// We must debounce the probe, but get a change asap so we can't use 
	// hal debouncers as they delay the signal. So we just ignore changes
	// after the first for a fixed amount of time
	// maybe this should be in hal...
	if(*(emcmot_hal_data->probe_input) != previous_probe_value) {
	    previous_probe_value = emcmotStatus->probeVal = *(emcmot_hal_data->probe_input);
	    probe_counter = PROBE_DEBOUNCE_VAL;
	}
    }
    else probe_counter--;
    /* check if the probe has been tripped */
    if (emcmotStatus->probing){
	if (emcmotStatus->probeTripped ) {
	    tpClear(&emcmotDebug->queue);
	    emcmotStatus->probing=0;
	    /* check if the probe hasn't tripped, but the move finished */
	} else if (GET_MOTION_INPOS_FLAG() && 
		( tpQueueDepth(&emcmotDebug->queue) == 0 ) ) {
	    emcmotStatus->probing=0;
	    /* check if the probe trips */
	} else {
	    /* if the probe tripped (val == 1 ) */
	    if (emcmotStatus->probeVal) {
		emcmotStatus->probeTripped = 1; //we have tripped the probe
		emcmotStatus->probedPos = emcmotStatus->carte_pos_fb; //remember the current position
		if (GET_MOTION_COORD_FLAG()) {
		    tpAbort(&emcmotDebug->queue); //if we are in coordinated move, abort
		    SET_MOTION_ERROR_FLAG(0);     //and clear any error flag which might have been set by the abort
		} else { //free mode, abort any joint
		    for (joint_num = 0; joint_num < EMCMOT_MAX_AXIS; joint_num++) {
			/* point to joint struct */
			joint = &joints[joint_num];
			/* tell joint planner to stop */
			joint->free_tp_enable = 0;
			/* stop homing if in progress */
			if ( joint->home_state != HOME_IDLE ) {
			    joint->home_state = HOME_ABORT;
			}
		    }
		}
	    }
	}
    }
    else {
	// Not probing; take care of probe health...
	/* After having bent twice my probe by doing wrong moves
	 * I decided that a probe contact when moving and not probing is
	 * an emergency stop. But we must take into account that, after having tripped
	 * the probe is still in contact. and must disengage. So we reset the probeTripped
	 * flag (just used for debouncing the probe) as soon as the probe is disengaged
	 * Then, if we move and the probe trips, we stop asap.
	 */
	if (emcmotStatus->probeTripped) {
	    // we just did a probe before, and it was not already disengaged
	    if(! emcmotStatus->probeVal) {
		// and we have just disengaged so probe is not in contact anymore
		// so reset probe flag
		emcmotStatus->probeTripped = 0;
	    }
	    // else wait for probe to disengage
	}
	else {
	    if(emcmotStatus->probeVal && !emcmotStatus->overrideLimits) {
		// probe is in contact
		must_abort=0;
		// if we are moving... this means that we try to bend the probe :-(
		// seing if we move is not trivial...
		if (((GET_MOTION_COORD_FLAG()) || (GET_MOTION_TELEOP_FLAG()))
		    && !emcmotDebug->queue.done) {
		    // coordinated move or teleop, and physically moving
		    must_abort=1;
		} else { //free mode, check if any joint is moving
		    for (joint_num = 0; joint_num < EMCMOT_MAX_AXIS; joint_num++) {
			// point to joint struct
			joint = &joints[joint_num];
			if(joint->free_tp_active){
			    must_abort = 1;
			}
		    }
		}
		if(must_abort){
		    if(emcmotDebug->enabling){
			// and estop
			reportError("Error: Probe tripped during non-probing move.");
			emcmotDebug->enabling = 0;
		    }
		}
	    }
	}
    }
    /* read spindle angle (for threading, etc) */
    ...