static void handle_jogwheels(void) { int joint_num; emcmot_joint_t *joint; axis_hal_t *axis_data; int new_jog_counts, delta; double distance, pos; for (joint_num = 0; joint_num < EMCMOT_MAX_JOINTS; joint_num++) { /* point to joint data */ axis_data = &(emcmot_hal_data->axis[joint_num]); joint = &joints[joint_num]; if (!GET_JOINT_ACTIVE_FLAG(joint)) { /* if joint is not active, skip it */ continue; } /* get counts from jogwheel */ new_jog_counts = *(axis_data->jog_counts); delta = new_jog_counts - joint->old_jog_counts; /* save value for next time */ joint->old_jog_counts = new_jog_counts; /* did the wheel move? */ if ( delta == 0 ) { /* no, nothing to do, except clear the JOGWHEEL souce flag */ if (joint->free_tp_source == FREE_TP_SOURCE_JOGWHEEL) joint->free_tp_source = FREE_TP_SOURCE_NONE; continue; } /* must be in free mode and enabled */ if (GET_MOTION_COORD_FLAG()) { continue; } if (!GET_MOTION_ENABLE_FLAG()) { continue; } if ( first_pass ) { continue; } /* the jogwheel input for this axis must be enabled */ if ( *(axis_data->jog_enable) == 0 ) { continue; } /* calculate distance to jog */ distance = delta * *(axis_data->jog_scale); /* check for joint already on soft limit */ if (distance > 0.0 && GET_JOINT_PSL_FLAG(joint)) { continue; } if (distance < 0.0 && GET_JOINT_NSL_FLAG(joint)) { continue; } /* check for joint already on hard limit */ if (distance > 0.0 && GET_JOINT_PHL_FLAG(joint)) { continue; } if (distance < 0.0 && GET_JOINT_NHL_FLAG(joint)) { continue; } /* calc target position for jog */ pos = joint->free_pos_cmd + distance; /* don't jog past limits */ refresh_jog_limits(joint); if (pos > joint->max_jog_limit) { continue; } if (pos < joint->min_jog_limit) { continue; } /* see if it's safe for us to take control of the free planner... */ if (joint->free_tp_source == FREE_TP_SOURCE_HOME) { continue; } if (joint->free_tp_active && joint->free_tp_source != FREE_TP_SOURCE_JOGWHEEL) { continue; } /* set target position and use full velocity */ joint->free_pos_cmd = pos; joint->free_vel_lim = joint->vel_limit; /* and let it go */ joint->free_tp_enable = 1; joint->free_tp_source = FREE_TP_SOURCE_JOGWHEEL; SET_JOINT_ERROR_FLAG(joint, 0); /* clear axis homed flag(s) if we don't have forward kins. Otherwise, a transition into coordinated mode will incorrectly assume the homed position. Do all if they've all been moved since homing, otherwise just do this one */ clearHomes(joint_num); } }