diff --git a/site_ansto/motor_dmc2280.c b/site_ansto/motor_dmc2280.c index aaa0957d..f6bf9a1e 100644 --- a/site_ansto/motor_dmc2280.c +++ b/site_ansto/motor_dmc2280.c @@ -197,7 +197,7 @@ int DMC2280MotionControl = 1; /* defaults to enabled */ #define AIR_POLL_TIMER 1000 #define MOTOR_POLL_FAST 200 #define MOTOR_POLL_SLOW 5000 -#define ON_SETTLE_TIMER 1000 +#define ON_SETTLE_TIMER 200 #define MAX_CREEP_STEPS 100 #define MAX_RESTARTS 0 @@ -1113,8 +1113,10 @@ static int checkMotion(void *pData) { /* calculate observed and expected steps per count ratios */ if (self->currCounts == self->lastCounts) /* prevent divide by zero */ ratio_obs = (self->currSteps - self->lastSteps); - else - ratio_obs = (self->currSteps - self->lastSteps) / (self->currCounts - self->lastCounts); + else { + ratio_obs = (float) (self->currSteps - self->lastSteps); + ratio_obs /= (float) (self->currCounts - self->lastCounts); + } ratio_exp = (float) self->stepsPerX / (float) self->cntsPerX; ratio_cmp = ratio_obs / ratio_exp; /* wrong signs, less than half, or more than double is trouble */ @@ -1603,15 +1605,14 @@ static void DMCState_Idle(pDMC2280Driv self, pEvtEvent event) { case eStateEvent: if (self->state_timer) NetWatchRemoveTimer(self->state_timer); - if ((self->variables & VAR_RUN) && self->runError) { + if (self->variables & VAR_RUN) { char cmd[CMDLEN]; snprintf(cmd, CMDLEN, "RUN%c=0", self->axisLabel); - DMC_SendCmd(self, cmd, state_msg_callback); + DMC2280Send(self, cmd); } - else - NetWatchRegisterTimer(&self->state_timer, - MOTOR_POLL_SLOW, - state_tmr_callback, self); + NetWatchRegisterTimer(&self->state_timer, + MOTOR_POLL_SLOW, + state_tmr_callback, self); self->subState = 0; return; case eTimerEvent: @@ -1621,12 +1622,6 @@ static void DMCState_Idle(pDMC2280Driv self, pEvtEvent event) { case eMessageEvent: do { pAsyncTxn pCmd = event->event.msg.cmd; - if (self->subState == 0) { /* RUNx reset */ - NetWatchRegisterTimer(&self->state_timer, - MOTOR_POLL_SLOW, - state_tmr_callback, self); - return; - } if (self->subState == 1) { /* Status Response */ int iRet; float fDelta; @@ -1683,7 +1678,6 @@ static void DMCState_Idle(pDMC2280Driv self, pEvtEvent event) { self->driver_status = HWFault; change_state(self, DMCState_MotorHalt); return; - break; } unhandled_event(self, event); self->errorCode = STATEERROR; @@ -1752,7 +1746,7 @@ static void DMCState_MotorStart(pDMC2280Driv self, pEvtEvent event) { do { pAsyncTxn pCmd = event->event.msg.cmd; if (self->subState == 1) { - if (self->has_airpads == 0) { /* SH */ + if (self->has_airpads == 0) { /* cmdOn */ change_state(self, DMCState_MotorOn); return; } @@ -2111,15 +2105,6 @@ static void DMCState_Moving(pDMC2280Driv self, pEvtEvent event) { state_tmr_callback, self); return; } - if (self->motOffDelay) - NetWatchRegisterTimer(&self->state_timer, - self->motOffDelay, - state_tmr_callback, self); - else - NetWatchRegisterTimer(&self->state_timer, - MOTOR_POLL_FAST, - state_tmr_callback, self); - self->driver_status = HWIdle; change_state(self, DMCState_OffTimer); return; } @@ -2196,6 +2181,15 @@ static void DMCState_MotorHalt(pDMC2280Driv self, pEvtEvent event) { static void DMCState_OffTimer(pDMC2280Driv self, pEvtEvent event) { switch (event->event_type) { case eStateEvent: + self->driver_status = HWIdle; + if (self->motOffDelay) + NetWatchRegisterTimer(&self->state_timer, + self->motOffDelay, + state_tmr_callback, self); + else + NetWatchRegisterTimer(&self->state_timer, + MOTOR_POLL_FAST, + state_tmr_callback, self); return; case eTimerEvent: change_state(self, DMCState_MotorStop);