Cleaned up ANSTO code to merge with sinqdev.sics
This is our new RELEASE-4_0 branch which was taken from ansto/93d9a7c Conflicts: .gitignore SICSmain.c asynnet.c confvirtualmot.c counter.c devexec.c drive.c event.h exebuf.c exeman.c histmem.c interface.h motor.c motorlist.c motorsec.c multicounter.c napi.c napi.h napi4.c network.c nwatch.c nxscript.c nxxml.c nxxml.h ofac.c reflist.c scan.c sicshipadaba.c sicsobj.c site_ansto/docs/Copyright.txt site_ansto/instrument/lyrebird/config/tasmad/sicscommon/nxsupport.tcl site_ansto/instrument/lyrebird/config/tasmad/taspub_sics/tasscript.tcl statusfile.c tasdrive.c tasub.c tasub.h tasublib.c tasublib.h
This commit is contained in:
64
oscillate.c
64
oscillate.c
@ -4,6 +4,10 @@
|
||||
copyright: see file COPYRIGHT
|
||||
|
||||
Mark Koennecke, November 2004
|
||||
|
||||
Fixed to work with second generation motors too
|
||||
|
||||
Mark Koennecke, September 2013
|
||||
------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
@ -13,25 +17,19 @@
|
||||
#include "task.h"
|
||||
#include "commandlog.h"
|
||||
#include "oscillate.h"
|
||||
#include "status.h"
|
||||
|
||||
#define ABS(x) (x < 0 ? -(x) : (x))
|
||||
|
||||
/*================== real work =========================================*/
|
||||
static void StopOscillation(pOscillator self)
|
||||
{
|
||||
int savedStatus;
|
||||
|
||||
assert(self != NULL);
|
||||
if (self->taskID > 0) {
|
||||
self->pMot->pDriver->Halt(self->pMot->pDriver);
|
||||
self->pMot->pDrivInt->Halt(self->pMot);
|
||||
self->stopFlag = 1;
|
||||
self->taskID = -1;
|
||||
}
|
||||
savedStatus = GetStatus(); /* fool status check in ObParSet (avoid "Cannot change parameter while running" message */
|
||||
SetStatus(eEager);
|
||||
MotorSetPar(self->pMot, self->pCon, "accesscode", usUser);
|
||||
SetStatus(savedStatus);
|
||||
if (self->debug > 0) {
|
||||
WriteToCommandLog("oscillator>> ", "Stopping");
|
||||
}
|
||||
@ -74,31 +72,23 @@ static int OscillationTask(void *data)
|
||||
|
||||
assert(self);
|
||||
if (self->stopFlag == 1) {
|
||||
finishDriving(self->pMot, self->pCon);
|
||||
return 0;
|
||||
}
|
||||
|
||||
status = self->pMot->pDriver->GetStatus(self->pMot->pDriver);
|
||||
status = self->pMot->pDrivInt->CheckStatus(self->pMot,pServ->dummyCon);
|
||||
switch (status) {
|
||||
case HWFault:
|
||||
case HWPosFault:
|
||||
self->pMot->pDriver->GetError(self->pMot->pDriver, &code, error, 255);
|
||||
WriteToCommandLog("oscillator>> ", error);
|
||||
pos = getCurrentTarget(self);
|
||||
errStatus =
|
||||
self->pMot->pDriver->TryAndFixIt(self->pMot->pDriver, code, pos);
|
||||
self->errorCount++;
|
||||
if (errStatus == MOTFAIL) {
|
||||
/*
|
||||
try driving the other way on a serious error
|
||||
*/
|
||||
pos = getNextPos(self);
|
||||
status = MotorRun(self->pMot, self->pCon, pos);
|
||||
if (self->debug > 0) {
|
||||
snprintf(message, 131, "Started oscillation to %f, ret code = %d",
|
||||
pos, status);
|
||||
WriteToCommandLog("oscillator>>", message);
|
||||
}
|
||||
WriteToCommandLog("oscillator>> ",
|
||||
"ERROR occurred in oscillation, try running motor manually to find out more");
|
||||
WriteToCommandLog("oscillator>> ",
|
||||
"Trying to run other direction");
|
||||
pos = getNextPos(self);
|
||||
status = MotorRun(self->pMot, self->pCon, pos);
|
||||
if (self->debug > 0) {
|
||||
snprintf(message, 131, "Started oscillation to %f, ret code = %d",
|
||||
pos, status);
|
||||
WriteToCommandLog("oscillator>>", message);
|
||||
}
|
||||
break;
|
||||
case HWWarn:
|
||||
@ -111,16 +101,10 @@ static int OscillationTask(void *data)
|
||||
case HWBusy:
|
||||
break;
|
||||
case HWIdle:
|
||||
if (self->cycles > 0 && self->currcycle == self->cycles) {
|
||||
StopOscillation(self);
|
||||
return 1;
|
||||
}
|
||||
pos = getNextPos(self);
|
||||
status = MotorRun(self->pMot, self->pCon, pos);
|
||||
if (status == OKOK) {
|
||||
self->pMot->pDrivInt->iErrorCount = 0;
|
||||
if (self->cycles > 0)
|
||||
(self->currcycle)++;
|
||||
}
|
||||
if (self->debug > 0) {
|
||||
snprintf(message, 131, "Started oscillation to %f, ret code = %d",
|
||||
@ -135,7 +119,7 @@ static int OscillationTask(void *data)
|
||||
static int StartOscillation(pOscillator self, SConnection * pCon)
|
||||
{
|
||||
float fval;
|
||||
int status, savedStatus;
|
||||
int status;
|
||||
char error[80], pBueffel[255];
|
||||
|
||||
assert(self);
|
||||
@ -151,10 +135,7 @@ static int StartOscillation(pOscillator self, SConnection * pCon)
|
||||
self->lowerLimit += .5;
|
||||
MotorGetPar(self->pMot, "softupperlim", &self->upperLimit);
|
||||
self->upperLimit -= .5;
|
||||
savedStatus = GetStatus(); /* fool status check in ObParSet (avoid "Cannot change parameter while running" message */
|
||||
SetStatus(eEager);
|
||||
MotorSetPar(self->pMot, self->pCon, "accesscode", (float) usInternal);
|
||||
SetStatus(savedStatus);
|
||||
self->nextTargetFlag = 0;
|
||||
self->errorCount = 0;
|
||||
self->stopFlag = 0;
|
||||
@ -182,7 +163,8 @@ static int StartOscillation(pOscillator self, SConnection * pCon)
|
||||
/*
|
||||
start task
|
||||
*/
|
||||
self->taskID = TaskRegister(pServ->pTasker,
|
||||
snprintf(pBueffel,sizeof(pBueffel),"Oscillate-%s", self->pMot->name);
|
||||
self->taskID = TaskRegisterN(pServ->pTasker,pBueffel,
|
||||
OscillationTask, NULL, NULL, self, 10);
|
||||
if (self->taskID < 0) {
|
||||
SCWrite(pCon, "ERROR: failed to start oscillation task", eError);
|
||||
@ -237,8 +219,6 @@ int MakeOscillator(SConnection * pCon, SicsInterp * pSics, void *pData,
|
||||
memset(pNew, 0, sizeof(Oscillator));
|
||||
pNew->pDes = CreateDescriptor("Oscillator");
|
||||
pNew->pMot = pMot;
|
||||
pNew->cycles = 0;
|
||||
pNew->currcycle = 0;
|
||||
pNew->pCon = SCCreateDummyConnection(pSics);
|
||||
if (!pNew->pDes || !pNew->pCon) {
|
||||
SCWrite(pCon, "ERROR: out of memory creating oscillator", eError);
|
||||
@ -277,12 +257,6 @@ int OscillatorWrapper(SConnection * pCon, SicsInterp * pSics, void *pData,
|
||||
}
|
||||
|
||||
strtolower(argv[1]);
|
||||
if (argc == 3) {
|
||||
self->cycles = 2 * atoi(argv[2]);
|
||||
} else {
|
||||
self->cycles = 0;
|
||||
}
|
||||
self->currcycle = 0;
|
||||
if (strcmp(argv[1], "start") == 0) {
|
||||
return StartOscillation(self, pCon);
|
||||
} else if (strcmp(argv[1], "stop") == 0) {
|
||||
|
Reference in New Issue
Block a user