diff --git a/motorApp/MotorSimSrc/drvMotorSim.c b/motorApp/MotorSimSrc/drvMotorSim.c index cf16aa79..114b4b31 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.6 $ +Version: $Revision: 1.7 $ Modified By: $Author: peterd $ -Last Modified: $Date: 2006-08-10 08:12:47 $ +Last Modified: $Date: 2007-02-03 12:07:17 $ */ /* @@ -105,28 +105,28 @@ static motorSim_t drv={ NULL, NULL, motorSimLogMsg, NULL, { 0, 0 } }; static void motorAxisReportAxis( AXIS_HDL pAxis, int level ) { - printf( "Found driver for motorSim card %d, axis %d", pAxis->card, pAxis->axis ); + printf( "Found driver for motorSim card %d, axis %d\n", pAxis->card, pAxis->axis ); if (level > 0) { double lowSoftLimit=0.0; double hiSoftLimit=0.0; - printf( "Current position = %f, velocity = %f at current time: %f", + printf( "Current position = %f, velocity = %f at current time: %f\n", pAxis->nextpoint.axis[0].p, pAxis->nextpoint.axis[0].v, pAxis->nextpoint.T ); - printf( "Destination posn = %f, velocity = %f at desination time: %f", + printf( "Destination posn = %f, velocity = %f at desination time: %f\n", pAxis->endpoint.axis[0].p, pAxis->endpoint.axis[0].v, pAxis->endpoint.T ); - printf( "Hard limits: %f, %f", pAxis->lowHardLimit, pAxis->hiHardLimit ); + printf( "Hard limits: %f, %f\n", pAxis->lowHardLimit, pAxis->hiHardLimit ); motorParam->getDouble( pAxis->params, motorAxisHighLimit, &hiSoftLimit ); motorParam->getDouble( pAxis->params, motorAxisLowLimit, &lowSoftLimit ); - printf( "Soft limits: %f, %f", lowSoftLimit, hiSoftLimit ); + printf( "Soft limits: %f, %f\n", lowSoftLimit, hiSoftLimit ); - if (pAxis->homing) printf( "Currently homing axis" ); + if (pAxis->homing) printf( "Currently homing axis\n" ); motorParam->dump( pAxis->params ); } @@ -543,6 +543,7 @@ static int motorSimCreateAxis( motorSim_t * pDrv, int card, int axis, double low { AXIS_HDL pAxis; AXIS_HDL * ppLast = &(pDrv->pFirst); + start=0; for ( pAxis = pDrv->pFirst; pAxis != NULL && @@ -569,6 +570,7 @@ static int motorSimCreateAxis( motorSim_t * pDrv, int card, int axis, double low pAxis->endpoint.T = 0; pAxis->endpoint.axis[0].p = start; pAxis->endpoint.axis[0].v = 0; + pAxis->nextpoint.axis[0].p = start; if ((pAxis->route = routeNew( &(pAxis->endpoint), &pars )) != NULL && (pAxis->params = motorParam->create( 0, MOTOR_AXIS_NUM_PARAMS )) != NULL && diff --git a/motorApp/MotorSrc/devMotorAsyn.c b/motorApp/MotorSrc/devMotorAsyn.c index b6de510b..bb014253 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.15 $ + * Version: $Revision: 1.16 $ * Modified by: $Author: peterd $ - * Last Modified: $Date: 2007-02-02 13:50:46 $ + * Last Modified: $Date: 2007-02-03 12:07:17 $ * * Original Author: Peter Denison * Current Author: Peter Denison @@ -30,6 +30,7 @@ #include #include #include +#include #include /* !! for callocMustSucceed() */ #include @@ -94,6 +95,7 @@ typedef struct asynMotorStatus *pasynMotorStatus; void *asynMotorStatusPvt; void *registrarPvt; + epicsEventId initEvent; } motorAsynPvt; @@ -106,6 +108,34 @@ static long init( int after ) return 0; } +static void init_controller(struct motorRecord *pmr ) +{ + /* This routine is copied out of the old motordevCom and initialises the controller + based on the record values. I think most of it should be transferred to init_record + which is one reason why I have separated it into another routine */ + motorAsynPvt *pPvt = (motorAsynPvt *)pmr->dpvt; + double position = pPvt->status.position; + + if ((fabs(pmr->dval) > pmr->rdbd && pmr->mres != 0) && + ((position * pmr->mres) < pmr->rdbd)) + { + double setPos = pmr->dval / pmr->mres; + epicsEventId initEvent = epicsEventCreate( epicsEventEmpty ); + + pPvt->initEvent = initEvent; + + start_trans(pmr); + build_trans(LOAD_POS, &setPos, pmr); + end_trans(pmr); + + if ( initEvent ) + { + epicsEventMustWait(initEvent); + epicsEventDestroy(initEvent); + } + } +} + static long init_record(struct motorRecord * pmr ) { asynUser *pasynUser; @@ -221,6 +251,8 @@ static long init_record(struct motorRecord * pmr ) pasynManager->freeAsynUser(pasynUser); pPvt->needUpdate = 1; + init_controller(pmr); + return(0); bad: pmr->pact=1; @@ -470,6 +502,8 @@ static void asynCallback(asynUser *pasynUser) "devMotorAsyn::asynCallback: %s error in freeAsynUser, %s\n", pmr->name, pasynUser->errorMessage); } + + if ( pPvt->initEvent ) epicsEventSignal( pPvt->initEvent ); } /**