diff --git a/motorApp/NewportSrc/drvMM4000Asyn.c b/motorApp/NewportSrc/drvMM4000Asyn.c index b38f2a93..8733eaf7 100644 --- a/motorApp/NewportSrc/drvMM4000Asyn.c +++ b/motorApp/NewportSrc/drvMM4000Asyn.c @@ -2,9 +2,10 @@ FILENAME... drvMM4000Asyn.cc USAGE... Motor record asyn driver level support for Newport MM4000. -Version: $Revision: 1.11 $ -Modified By: $Author: rivers $ -Last Modified: $Date: 2009-09-01 16:19:17 $ +Version: $Revision$ +Modified By: $Author$ +Last Modified: $Date$ +HeadURL: $URL$ */ /* @@ -44,10 +45,13 @@ Last Modified: $Date: 2009-09-01 16:19:17 $ * force a status update with a call to callCallback(). * - bug fix; limit commands reversed. * - set motorAxisDirection. + * .05 11-19-09 rls - bug fix for sendOnly() passing null pointer + * (pController->pasynUser) if any communication error occurs + * at bootup. * */ - - + + #include #include "epicsThread.h" #include @@ -68,13 +72,14 @@ Last Modified: $Date: 2009-09-01 16:19:17 $ #include "ellLib.h" #include "asynDriver.h" #include "asynOctetSyncIO.h" +#include "errlog.h" #include "drvSup.h" #include "epicsExport.h" #define DEFINE_MOTOR_PROTOTYPES 1 #include "motor_interface.h" -motorAxisDrvSET_t motorMM4000 = +motorAxisDrvSET_t motorMM4000 = { 14, motorAxisReport, /**< Standard EPICS driver report function (optional) */ @@ -161,7 +166,7 @@ static asynStatus sendAndReceive(MM4000Controller *pController, char *outputStri #define MM4000_LOW_LIMIT 0x10 /* Minus Travel Limit. */ #define MM4000_HIGH_LIMIT 0x08 /* Plus Travel Limit. */ #define MM4000_DIRECTION 0x04 /* Motor direction: 0 - minus; 1 - plus. */ -#define MM4000_POWER_ON 0x02 /* Motor power 0 - ON; 1 - OFF. */ +#define MM4000_POWER_OFF 0x02 /* Motor power 0 - ON; 1 - OFF. */ #define MM4000_MOVING 0x01 /* In-motion indicator. */ @@ -203,7 +208,7 @@ static void motorAxisReport(int level) for(j=0; j 0.) - status = motorAxisMove(pAxis, pAxis->highLimit/pAxis->stepSize, 0, min_velocity, velocity, acceleration); + status = motorAxisMove(pAxis, pAxis->highLimit/pAxis->stepSize, 0, min_velocity, velocity, acceleration); else - status = motorAxisMove(pAxis, pAxis->lowLimit/pAxis->stepSize, 0, min_velocity, -velocity, acceleration); + status = motorAxisMove(pAxis, pAxis->lowLimit/pAxis->stepSize, 0, min_velocity, -velocity, acceleration); return status; } @@ -516,7 +521,7 @@ static int motorAxisStop(AXIS_HDL pAxis, double acceleration) char buff[100]; if (pAxis == NULL) return MOTOR_AXIS_ERROR; - + PRINT(pAxis->logParam, FLOW, "Set card %d, axis %d to stop with accel=%f\n", pAxis->card, pAxis->axis, acceleration); @@ -535,7 +540,7 @@ static int motorAxisforceCallback(AXIS_HDL pAxis) PRINT(pAxis->logParam, FLOW, "motorAxisforceCallback: request card %d, axis %d status update\n", pAxis->card, pAxis->axis); - + /* Force a status update. */ motorParam->forceCallback(pAxis->params); @@ -596,7 +601,7 @@ static void MM4000Poller(MM4000Controller *pController) comStatus = sendAndReceive(pController, "MS;", statusAllString, sizeof(statusAllString)); if (comStatus == 0) comStatus = sendAndReceive(pController, "TP;", positionAllString, sizeof(positionAllString)); - + for (i=0; inumAxes; i++) { pAxis = &pController->pAxis[i]; @@ -633,6 +638,7 @@ static void MM4000Poller(MM4000Controller *pController) motorParam->setInteger(params, motorAxisHighHardLimit, (axisStatus & MM4000_HIGH_LIMIT)); motorParam->setInteger(params, motorAxisLowHardLimit, (axisStatus & MM4000_LOW_LIMIT)); motorParam->setInteger(params, motorAxisDirection, (axisStatus & MM4000_DIRECTION)); + motorParam->setInteger(params, motorAxisPowerOn, !(axisStatus & MM4000_POWER_OFF)); /* * Parse motor position @@ -648,7 +654,7 @@ static void MM4000Poller(MM4000Controller *pController) pAxis->currentPosition = atof(p+3); motorParam->setDouble(params, motorAxisPosition, (pAxis->currentPosition/pAxis->stepSize)); motorParam->setDouble(params, motorAxisEncoderPosn, (pAxis->currentPosition/pAxis->stepSize)); - PRINT(pAxis->logParam, IODRIVER, "MM4000Poller: axis %d axisStatus=%x, position=%f\n", + PRINT(pAxis->logParam, IODRIVER, "MM4000Poller: axis %d axisStatus=%x, position=%f\n", pAxis->axis, pAxis->axisStatus, pAxis->currentPosition); /* We would like a way to query the actual velocity, but this is not possible. If we could we could @@ -712,7 +718,7 @@ int MM4000AsynSetup(int num_controllers) /* number of MM4000 controllers in sy return MOTOR_AXIS_ERROR; } numMM4000Controllers = num_controllers; - pMM4000Controller = (MM4000Controller *)calloc(numMM4000Controllers, sizeof(MM4000Controller)); + pMM4000Controller = (MM4000Controller *)calloc(numMM4000Controllers, sizeof(MM4000Controller)); return MOTOR_AXIS_OK; } @@ -792,7 +798,7 @@ int MM4000AsynConfig(int card, /* Controller number */ printf("MM4000AsynConfig: invalid model = %s\n", pController->firmwareVersion); return MOTOR_AXIS_ERROR; } - + sendAndReceive(pController, "TP;", inputBuff, sizeof(inputBuff)); /* The return string will tell us how many axes this controller has */ @@ -844,7 +850,7 @@ int MM4000AsynConfig(int card, /* Controller number */ sendAndReceive(pController, outputBuff, inputBuff, sizeof(inputBuff)); pAxis->highLimit = atof(&inputBuff[3]); } - + pController->pollEventId = epicsEventMustCreate(epicsEventEmpty); /* Create the poller thread for this controller */ @@ -863,27 +869,38 @@ static int sendOnly(MM4000Controller *pController, char *outputBuff) size_t nActual; asynStatus status; - status = pasynOctetSyncIO->write(pController->pasynUser, outputBuff, - nRequested, TIMEOUT, &nActual); - if (nActual != nRequested) status = asynError; - if (status != asynSuccess) { - asynPrint(pController->pasynUser, ASYN_TRACE_ERROR, - "drvMM4000Asyn:sendOnly: error sending command %d, sent=%d, status=%d\n", - outputBuff, nActual, status); + if (pController->pasynUser == NULL) + { + status = asynError; + errPrintf(-1, __FILE__, __LINE__, "*** Configuration error ***: pasynUser=NULL\n"); + epicsThreadSleep(5.0); + } + else + { + status = pasynOctetSyncIO->write(pController->pasynUser, outputBuff, + nRequested, TIMEOUT, &nActual); + if (nActual != nRequested) + status = asynError; + if (status != asynSuccess) + { + asynPrint(pController->pasynUser, ASYN_TRACE_ERROR, + "drvMM4000Asyn:sendOnly: error sending command %d, sent=%d, status=%d\n", + outputBuff, nActual, status); + } } return(status); } -static asynStatus sendAndReceive(MM4000Controller *pController, char *outputBuff, char *inputBuff, int inputSize) +static asynStatus sendAndReceive(MM4000Controller *pController, char *outputBuff, char *inputBuff, int inputSize) { int nWriteRequested=strlen(outputBuff); size_t nWrite, nRead; int eomReason; asynStatus status; - - status = pasynOctetSyncIO->writeRead(pController->pasynUser, - outputBuff, nWriteRequested, + + status = pasynOctetSyncIO->writeRead(pController->pasynUser, + outputBuff, nWriteRequested, inputBuff, inputSize, TIMEOUT, &nWrite, &nRead, &eomReason); if (nWrite != nWriteRequested) status = asynError;