From ede6b73b0ed6fb4e2d796786083631aa972d1b3b Mon Sep 17 00:00:00 2001 From: Peter Denison Date: Thu, 10 Aug 2006 08:12:47 +0000 Subject: [PATCH] Fix 'not ready' error by removing needUpdate=1 on MotorStatus use MotorStatus interface for all status calls add start position to motor simulator --- motorApp/MotorSimSrc/drvMotorSim.c | 13 +++--- motorApp/MotorSimSrc/drvMotorSim.h | 2 +- motorApp/MotorSimSrc/motorSimRegister.cc | 6 ++- motorApp/MotorSrc/devMotorAsyn.c | 57 +++++++----------------- motorApp/MotorSrc/drvMotorAsyn.c | 13 +++--- 5 files changed, 36 insertions(+), 55 deletions(-) diff --git a/motorApp/MotorSimSrc/drvMotorSim.c b/motorApp/MotorSimSrc/drvMotorSim.c index 4eea1774..cf16aa79 100644 --- a/motorApp/MotorSimSrc/drvMotorSim.c +++ b/motorApp/MotorSimSrc/drvMotorSim.c @@ -2,9 +2,9 @@ FILENAME... drvMotorSim.c USAGE... Simulated Motor Support. -Version: $Revision: 1.5 $ +Version: $Revision: 1.6 $ Modified By: $Author: peterd $ -Last Modified: $Date: 2006-07-01 20:08:55 $ +Last Modified: $Date: 2006-08-10 08:12:47 $ */ /* @@ -539,7 +539,7 @@ static void motorSimTask( motorSim_t * pDrv ) } } -static int motorSimCreateAxis( motorSim_t * pDrv, int card, int axis, double lowLimit, double hiLimit, double home ) +static int motorSimCreateAxis( motorSim_t * pDrv, int card, int axis, double lowLimit, double hiLimit, double home, double start ) { AXIS_HDL pAxis; AXIS_HDL * ppLast = &(pDrv->pFirst); @@ -567,7 +567,7 @@ static int motorSimCreateAxis( motorSim_t * pDrv, int card, int axis, double low pars.axis[0].Vmax = 1.0; pAxis->endpoint.T = 0; - pAxis->endpoint.axis[0].p = 0; + pAxis->endpoint.axis[0].p = start; pAxis->endpoint.axis[0].v = 0; if ((pAxis->route = routeNew( &(pAxis->endpoint), &pars )) != NULL && @@ -581,6 +581,7 @@ static int motorSimCreateAxis( motorSim_t * pDrv, int card, int axis, double low pAxis->home = home; pAxis->print = motorSimLogMsg; pAxis->logParam = NULL; + motorParam->setDouble(pAxis->params, motorAxisPosition, start); *ppLast = pAxis; pAxis->print( pAxis->logParam, TRACE_FLOW, "Created motor for card %d, signal %d OK", card, axis ); } @@ -615,7 +616,7 @@ static int motorSimCreateAxis( motorSim_t * pDrv, int card, int axis, double low } -void motorSimCreate( int card, int axis, int lowLimit, int hiLimit, int home, int nCards, int nAxes ) +void motorSimCreate( int card, int axis, int lowLimit, int hiLimit, int home, int nCards, int nAxes, int startPosn ) { int i; int j; @@ -645,7 +646,7 @@ void motorSimCreate( int card, int axis, int lowLimit, int hiLimit, int home, in { for (j = axis; j < axis+nAxes; j++ ) { - motorSimCreateAxis( &drv, i, j, (double) lowLimit, (double) hiLimit, (double) home ); + motorSimCreateAxis( &drv, i, j, (double) lowLimit, (double) hiLimit, (double) home, (double) startPosn ); } } } diff --git a/motorApp/MotorSimSrc/drvMotorSim.h b/motorApp/MotorSimSrc/drvMotorSim.h index b0489418..e1b26ed6 100644 --- a/motorApp/MotorSimSrc/drvMotorSim.h +++ b/motorApp/MotorSimSrc/drvMotorSim.h @@ -5,7 +5,7 @@ extern "C" { #endif -void motorSimCreate( int card, int axis, int hiLimit, int lowLimit, int home, int nCards, int nAxes ); +void motorSimCreate( int card, int axis, int hiLimit, int lowLimit, int home, int nCards, int nAxes, int startPosn ); #ifdef __cplusplus } diff --git a/motorApp/MotorSimSrc/motorSimRegister.cc b/motorApp/MotorSimSrc/motorSimRegister.cc index aa98aec5..b3c22383 100644 --- a/motorApp/MotorSimSrc/motorSimRegister.cc +++ b/motorApp/MotorSimSrc/motorSimRegister.cc @@ -11,6 +11,7 @@ static const iocshArg motorSimCreateArg3 = { "Low limit", iocshArgInt}; static const iocshArg motorSimCreateArg4 = { "Home position", iocshArgInt}; static const iocshArg motorSimCreateArg5 = { "Num cards", iocshArgInt}; static const iocshArg motorSimCreateArg6 = { "Num signals", iocshArgInt}; +static const iocshArg motorSimCreateArg7 = { "Start posn", iocshArgInt}; static const iocshArg *const motorSimCreateArgs[] = { &motorSimCreateArg0, @@ -20,12 +21,13 @@ static const iocshArg *const motorSimCreateArgs[] = { &motorSimCreateArg4, &motorSimCreateArg5, &motorSimCreateArg6, + &motorSimCreateArg7, }; -static const iocshFuncDef motorSimCreateDef ={"motorSimCreate",7,motorSimCreateArgs}; +static const iocshFuncDef motorSimCreateDef ={"motorSimCreate",8,motorSimCreateArgs}; static void motorSimCreateCallFunc(const iocshArgBuf *args) { - motorSimCreate(args[0].ival, args[1].ival, args[2].ival, args[3].ival, args[4].ival, args[5].ival, args[6].ival); + motorSimCreate(args[0].ival, args[1].ival, args[2].ival, args[3].ival, args[4].ival, args[5].ival, args[6].ival, args[7].ival); } void motorSimRegister(void) diff --git a/motorApp/MotorSrc/devMotorAsyn.c b/motorApp/MotorSrc/devMotorAsyn.c index dc6df9a7..5f501610 100644 --- a/motorApp/MotorSrc/devMotorAsyn.c +++ b/motorApp/MotorSrc/devMotorAsyn.c @@ -11,9 +11,9 @@ * Notwithstanding the above, explicit permission is granted for APS to * redistribute this software. * - * Version: $Revision: 1.12 $ + * Version: $Revision: 1.13 $ * Modified by: $Author: peterd $ - * Last Modified: $Date: 2006-07-20 17:10:37 $ + * Last Modified: $Date: 2006-08-10 08:12:47 $ * * Original Author: Peter Denison * Current Author: Peter Denison @@ -80,12 +80,7 @@ typedef struct { struct motorRecord * pmr; int moveRequestPending; - epicsUInt32 status; /**< bit mask of errors and other binary information. The - bit positions are in motor.h */ - epicsInt32 position; /**< Current motor position in motor steps (if not - servoing) or demand position (if servoing) */ - epicsInt32 encoder_position; /**< Current motor position in encoder units - (only available if a servo system). */ + struct MotorStatus status; motor_cmnd move_cmd; double param; int needUpdate; @@ -221,14 +216,8 @@ static long init_record(struct motorRecord * pmr ) resolution); */ pasynUser->reason = motorStatus; - pPvt->pasynInt32->read(pPvt->asynInt32Pvt, pasynUser, - &pPvt->status); - pasynUser->reason = motorPosition; - pPvt->pasynInt32->read(pPvt->asynInt32Pvt, pasynUser, - &pPvt->position); - pasynUser->reason = motorEncoderPosition; - pPvt->pasynInt32->read(pPvt->asynInt32Pvt, pasynUser, - &pPvt->encoder_position); + pPvt->pasynMotorStatus->read(pPvt->asynMotorStatusPvt, pasynUser, + &pPvt->status); pasynManager->freeAsynUser(pasynUser); pPvt->needUpdate = 1; @@ -246,10 +235,10 @@ CALLBACK_VALUE update_values(struct motorRecord * pmr) rc = NOTHING_DONE; if ( pPvt->needUpdate ) { - pmr->rmp = pPvt->position; - pmr->rep = pPvt->encoder_position; - /* pmr->rvel = ptrans->vel; */ - pmr->msta = pPvt->status; + pmr->rmp = (epicsInt32)round(pPvt->status.position); + pmr->rep = (epicsInt32)round(pPvt->status.encoder_posn); + /* pmr->rvel = (epicsInt32)round(pPvt->status.velocity); */ + pmr->msta = pPvt->status.status; rc = CALLBACK_DATA; pPvt->needUpdate = 0; } @@ -393,9 +382,6 @@ static RTN_STATUS build_trans( motor_cmnd command, case GET_INFO: pmsg->command = motorStatus; pmsg->interface = float64ArrayType; - /* Check this - needUpdate can cause the callback mechanism to get - stuck. Must ensure that the record will be processed after this */ - pPvt->needUpdate = 1; break; case SET_RESOLUTION: pmsg->command = motorResolution; @@ -446,14 +432,8 @@ static void asynCallback(asynUser *pasynUser) switch (pmsg->command) { case motorStatus: /* Read the current status of the device */ - pPvt->pasynInt32->read(pPvt->asynInt32Pvt, pasynUser, - &pPvt->status); - pasynUser->reason = motorPosition; - pPvt->pasynInt32->read(pPvt->asynInt32Pvt, pasynUser, - &pPvt->position); - pasynUser->reason = motorEncoderPosition; - pPvt->pasynInt32->read(pPvt->asynInt32Pvt, pasynUser, - &pPvt->encoder_position); + pPvt->pasynMotorStatus->read(pPvt->asynMotorStatusPvt, pasynUser, + &pPvt->status); break; case motorMoveAbs: @@ -502,25 +482,20 @@ static void statusCallback(void *drvPvt, asynUser *pasynUser, motorRecord *pmr = pPvt->pmr; asynPrint(pasynUser, ASYN_TRACEIO_DEVICE, - "%s devMotorAsyn::statusCallback new value=0x%x\n", - pmr->name, value); + "%s devMotorAsyn::statusCallback new value=[p:%f,s:%x] %c%c\n", + pmr->name, value->position, value->status, + pPvt->needUpdate?'N':' ', pPvt->moveRequestPending?'P':' '); if (dbScanLockOK) { dbScanLock((dbCommon *)pmr); - pPvt->status = value->status; - pPvt->position = (epicsInt32)floor(value->position+0.5); - pPvt->encoder_position = (epicsInt32)floor(value->encoder_posn+0.5); - /* pPvt->velocity = (epicsInt32)floor(value->velocity+0.5);*/ + pPvt->status = *value; if (!pPvt->needUpdate && !pPvt->moveRequestPending) { pPvt->needUpdate = 1; pmr->rset->process((dbCommon*)pmr); } dbScanUnlock((dbCommon*)pmr); } else { - pPvt->status = value->status; - pPvt->position = (epicsInt32)floor(value->position+0.5); - pPvt->encoder_position = (epicsInt32)floor(value->encoder_posn+0.5); - /* pPvt->veolcity = (epicsInt32)floor(value->velocity+0.5);*/ + pPvt->status = *value; pPvt->needUpdate = 1; } } diff --git a/motorApp/MotorSrc/drvMotorAsyn.c b/motorApp/MotorSrc/drvMotorAsyn.c index b6895049..b7ae95f1 100644 --- a/motorApp/MotorSrc/drvMotorAsyn.c +++ b/motorApp/MotorSrc/drvMotorAsyn.c @@ -19,9 +19,9 @@ * of this distribution. * ************************************************************************ * - * Version: $Revision: 1.11 $ + * Version: $Revision: 1.12 $ * Modified by: $Author: peterd $ - * Last Modified: $Date: 2006-07-07 20:50:19 $ + * Last Modified: $Date: 2006-08-10 08:12:47 $ * * Original Author: Peter Denison * Current Author: Peter Denison @@ -400,7 +400,8 @@ static asynStatus readInt32(void *drvPvt, asynUser *pasynUser, break; } asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, - "drvMotorAsyn::readInt32, value=%d\n", *value); + "drvMotorAsyn::readInt32, reason=%d, value=%d\n", + command, *value); return(asynSuccess); } @@ -450,7 +451,8 @@ static asynStatus readFloat64(void *drvPvt, asynUser *pasynUser, break; } asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, - "drvMotorAsyn::readFloat64, value=%f\n", *value); + "drvMotorAsyn::readFloat64, reason=%d, value=%f\n", + command, *value); return(status); } @@ -510,7 +512,8 @@ static asynStatus writeInt32(void *drvPvt, asynUser *pasynUser, break; } asynPrint(pasynUser, ASYN_TRACEIO_DRIVER, - "drvMotorAsyn::writeInt32, value=%d\n", value); + "drvMotorAsyn::writeInt32, reason=%d, value=%d\n", + command, value); return(status); }