Allow thread status to be queried and homerun for motors without absolute ebcoder
r1619 | dcl | 2007-03-09 12:34:37 +1100 (Fri, 09 Mar 2007) | 2 lines
This commit is contained in:
@@ -473,6 +473,76 @@ static int readAbsEnc(pDMC2280Driv self, float *pos) {
|
|||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** \brief Reads Thread variable
|
||||||
|
*
|
||||||
|
* \param *pos is the thread variable value on SUCCESS.
|
||||||
|
* \return
|
||||||
|
* SUCCESS
|
||||||
|
* FAILURE
|
||||||
|
*/
|
||||||
|
static int ReadThread(pDMC2280Driv self, int thread, float *pos) {
|
||||||
|
char reply[1024];
|
||||||
|
char cmd[CMDLEN];
|
||||||
|
|
||||||
|
snprintf(cmd, CMDLEN, "MG _XQ%d", thread);
|
||||||
|
if (FAILURE == DMC2280Send(self, cmd))
|
||||||
|
return 0;
|
||||||
|
if (FAILURE == DMC2280Receive(self, reply))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
*pos = (float) atoi(reply);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Reads HOMERUN variable
|
||||||
|
*
|
||||||
|
* \param *pos is the homerun variable value on SUCCESS.
|
||||||
|
* \return
|
||||||
|
* SUCCESS
|
||||||
|
* FAILURE
|
||||||
|
*/
|
||||||
|
static int readHomeRun(pDMC2280Driv self, float *pos) {
|
||||||
|
char reply[1024];
|
||||||
|
char cmd[CMDLEN];
|
||||||
|
|
||||||
|
snprintf(cmd, CMDLEN, "MG HOMERUN");
|
||||||
|
if (FAILURE == DMC2280Send(self, cmd))
|
||||||
|
return FAILURE;
|
||||||
|
if (FAILURE == DMC2280Receive(self, reply))
|
||||||
|
return FAILURE;
|
||||||
|
|
||||||
|
*pos = (float) atoi(reply);
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Runs the HOMERUN routine on the MC
|
||||||
|
*
|
||||||
|
* \return
|
||||||
|
* SUCCESS
|
||||||
|
* FAILURE
|
||||||
|
*/
|
||||||
|
static int RunHomeRoutine(pDMC2280Driv self, float newValue) {
|
||||||
|
float fValue;
|
||||||
|
char cmd[CMDLEN];
|
||||||
|
|
||||||
|
/* Read HOMERUN should get error if it does not have one */
|
||||||
|
if (FAILURE == readHomeRun(self, &fValue))
|
||||||
|
return FAILURE;
|
||||||
|
|
||||||
|
/* 0 => reset homerun */
|
||||||
|
if (newValue < 0.5) {
|
||||||
|
snprintf(cmd, CMDLEN, "HOMERUN=0");
|
||||||
|
if (FAILURE == DMC2280Send(self, cmd))
|
||||||
|
return FAILURE;
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
snprintf(cmd, CMDLEN, "XQ #HOME,1");
|
||||||
|
if (FAILURE == DMC2280Send(self, cmd))
|
||||||
|
return FAILURE;
|
||||||
|
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
/** \brief Reads motor position, implements the GetPosition
|
/** \brief Reads motor position, implements the GetPosition
|
||||||
* method in the MotorDriver interface.
|
* method in the MotorDriver interface.
|
||||||
*
|
*
|
||||||
@@ -1207,6 +1277,30 @@ static int DMC2280GetPar(void *pData, char *name,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
if (strcmp(name,"homerun") == 0) {
|
||||||
|
if (readHomeRun(self, fValue) == SUCCESS)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(strcmp(name,"thread0") == 0)
|
||||||
|
return ReadThread(self, 0, fValue);
|
||||||
|
if(strcmp(name,"thread1") == 0)
|
||||||
|
return ReadThread(self, 1, fValue);
|
||||||
|
if(strcmp(name,"thread2") == 0)
|
||||||
|
return ReadThread(self, 2, fValue);
|
||||||
|
if(strcmp(name,"thread3") == 0)
|
||||||
|
return ReadThread(self, 3, fValue);
|
||||||
|
if(strcmp(name,"thread4") == 0)
|
||||||
|
return ReadThread(self, 4, fValue);
|
||||||
|
if(strcmp(name,"thread5") == 0)
|
||||||
|
return ReadThread(self, 5, fValue);
|
||||||
|
if(strcmp(name,"thread6") == 0)
|
||||||
|
return ReadThread(self, 6, fValue);
|
||||||
|
if(strcmp(name,"thread7") == 0)
|
||||||
|
return ReadThread(self, 7, fValue);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1313,7 +1407,7 @@ static int DMC2280SetPar(void *pData, SConnection *pCon,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set interval between blocked motor checks,
|
/* Set movement threshold for blocked motor checks,
|
||||||
* managers only */
|
* managers only */
|
||||||
if(strcmp(name,"blockage_thresh") == 0) {
|
if(strcmp(name,"blockage_thresh") == 0) {
|
||||||
if(!SCMatchRights(pCon,usMugger))
|
if(!SCMatchRights(pCon,usMugger))
|
||||||
@@ -1324,7 +1418,7 @@ static int DMC2280SetPar(void *pData, SConnection *pCon,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set interval between blocked motor checks,
|
/* Set ratio for blocked motor checks,
|
||||||
* managers only */
|
* managers only */
|
||||||
if(strcmp(name,"blockage_ratio") == 0) {
|
if(strcmp(name,"blockage_ratio") == 0) {
|
||||||
if(!SCMatchRights(pCon,usMugger))
|
if(!SCMatchRights(pCon,usMugger))
|
||||||
@@ -1335,7 +1429,7 @@ static int DMC2280SetPar(void *pData, SConnection *pCon,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set interval between blocked motor checks,
|
/* Set blocked motor checks failure mode,
|
||||||
* managers only */
|
* managers only */
|
||||||
if(strcmp(name,"blockage_fail") == 0) {
|
if(strcmp(name,"blockage_fail") == 0) {
|
||||||
if(!SCMatchRights(pCon,usMugger))
|
if(!SCMatchRights(pCon,usMugger))
|
||||||
@@ -1346,6 +1440,21 @@ static int DMC2280SetPar(void *pData, SConnection *pCon,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Invoke Home Run routine in controller,
|
||||||
|
* managers only */
|
||||||
|
if(self->abs_endcoder == 0 && strcmp(name,"homerun") == 0) {
|
||||||
|
if(!SCMatchRights(pCon,usMugger))
|
||||||
|
return 1;
|
||||||
|
else {
|
||||||
|
if (DMC2280MotionControl != 1 && newValue > 0.5) {
|
||||||
|
snprintf(pError, ERRLEN,"ERROR: Motion Control must be on");
|
||||||
|
SCWrite(pCon, pError, eError);
|
||||||
|
}
|
||||||
|
RunHomeRoutine(self, newValue);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Set speed */
|
/* Set speed */
|
||||||
if(strcmp(name,SPEED) == 0) {
|
if(strcmp(name,SPEED) == 0) {
|
||||||
if ((0.0 - newValue) > FLT_EPSILON) {
|
if ((0.0 - newValue) > FLT_EPSILON) {
|
||||||
|
|||||||
Reference in New Issue
Block a user