diff --git a/motorApp/MotorSrc/motorRecord.cc b/motorApp/MotorSrc/motorRecord.cc index d9800609..7f3d1323 100644 --- a/motorApp/MotorSrc/motorRecord.cc +++ b/motorApp/MotorSrc/motorRecord.cc @@ -241,6 +241,8 @@ static void set_dial_highlimit(motorRecord *, struct motor_dset *); static void set_dial_lowlimit(motorRecord *, struct motor_dset *); static void set_userlimits(motorRecord *); static void range_check(motorRecord *, double *, double, double); +static void jvel_range_check(motorRecord *); +static bool jvel_limit_check(motorRecord *); static void clear_buttons(motorRecord *); static void syncTargetPosition(motorRecord *); @@ -1465,9 +1467,7 @@ static long process(dbCommon *arg) else { if (pmr->mip & MIP_JOG) - pmr->lvio = (pmr->jogf && (pmr->rbv > pmr->hlm - pmr->jvel)) || - (pmr->jogr && (pmr->rbv < pmr->llm + pmr->jvel)) || - (pmr->dllm > pmr->dhlm); + pmr->lvio = jvel_limit_check(pmr); else if (pmr->mip & MIP_HOME) pmr->lvio = false; /* Disable soft-limit error check during home search. */ } @@ -2084,9 +2084,7 @@ static RTN_STATUS do_work(motorRecord * pmr, CALLBACK_VALUE proc_ind) /* check for limit violation */ if ((pmr->dhlm == pmr->dllm) && (pmr->dllm == 0.0)) ; - else if ((pmr->jogf && (pmr->val > pmr->hlm - pmr->jvel)) || - (pmr->jogr && (pmr->val < pmr->llm + pmr->jvel)) || - (pmr->dllm > pmr->dhlm)) + else if (jvel_limit_check(pmr)) { pmr->lvio = 1; MARK(M_LVIO); @@ -2124,10 +2122,10 @@ static RTN_STATUS do_work(motorRecord * pmr, CALLBACK_VALUE proc_ind) MARK(M_DMOV); pmr->pp = TRUE; if (pmr->jogf) - pmr->cdir = 1; + pmr->cdir = (pmr->jvel > 0.) ? 1 : 0; else { - pmr->cdir = 0; + pmr->cdir = (pmr->jvel > 0.) ? 0 : 1; jogv = -jogv; } @@ -3054,8 +3052,7 @@ static long special(DBADDR *paddr, int after) break; case motorRecordJVEL: - range_check(pmr, &pmr->jvel, pmr->vbas, pmr->vmax); - + jvel_range_check(pmr); if ((pmr->mip & MIP_JOGF) || (pmr->mip & MIP_JOGR)) { double jogv = (pmr->jvel * dir) / pmr->mres; @@ -3074,7 +3071,7 @@ static long special(DBADDR *paddr, int after) case motorRecordJAR: // Valid JAR; 0 < JAR < JVEL [egu / sec] / 0.1 [sec] if (pmr->jar <= 0.0) - pmr->jar = pmr->jvel / 0.1; + pmr->jar = fabs(pmr->jvel) / 0.1; break; case motorRecordHVEL: @@ -3142,7 +3139,7 @@ static long special(DBADDR *paddr, int after) db_post_events(pmr, &pmr->sbak, DBE_VAL_LOG); } - range_check(pmr, &pmr->jvel, pmr->vbas, pmr->vmax); + jvel_range_check(pmr); range_check(pmr, &pmr->hvel, pmr->vbas, pmr->vmax); } /* Do not process (i.e., clear) marked fields here. PP fields (e.g., MRES) must remain marked. */ @@ -4054,8 +4051,9 @@ static void check_speed_and_resolution(motorRecord * pmr) /* Sanity check on jog velocity and acceleration rate. */ if (pmr->jvel == 0.0) pmr->jvel = pmr->velo; - else - range_check(pmr, &pmr->jvel, pmr->vbas, pmr->vmax); + else { + jvel_range_check(pmr); + } if (pmr->jar == 0.0) pmr->jar = pmr->velo / pmr->accl; @@ -4378,6 +4376,32 @@ static void range_check(motorRecord *pmr, double *parm_ptr, double min, double m } } +/* +FUNCTION... void jvel_range_check(motorRecord *) +USAGE... Limit jvel parameter to valid range; +*/ +static void jvel_range_check(motorRecord *pmr) +{ + if (pmr->jvel >= 0) { + range_check(pmr, &pmr->jvel, pmr->vbas, pmr->vmax); + } else { + range_check(pmr, &pmr->jvel, -pmr->vmax, -pmr->vbas); + } +} + +/* +FUNCTION... void jvel_limit_check(motorRecord *) +USAGE... Return true if jogging for 1 second would result in soft limit violation; +*/ + +static bool jvel_limit_check(motorRecord *pmr) +{ + return (((pmr->jogf && pmr->jvel > 0.) && (pmr->rbv > pmr->hlm - pmr->jvel)) || + ((pmr->jogr && pmr->jvel < 0.) && (pmr->rbv > pmr->hlm + pmr->jvel)) || + ((pmr->jogr && pmr->jvel > 0.) && (pmr->rbv < pmr->llm + pmr->jvel)) || + ((pmr->jogf && pmr->jvel < 0.) && (pmr->rbv < pmr->llm - pmr->jvel)) || + (pmr->dllm > pmr->dhlm)); +} /* FUNCTION... void clear_buttons(motorRecord *)