motor verbose/debug, position_names, hard<->soft and refactor

Make debug mode and verbose mode separate modes

Implement position names in the "posit" code as alternate to numbers

Refactor to use hard/soft conversion functions
This commit is contained in:
Douglas Clowes
2014-05-30 17:32:47 +10:00
parent c7a2d05832
commit 1a1f00c49a

View File

@ -229,6 +229,7 @@ struct __MoDriv {
struct timeval time_settle_done; /**< time when settling will be over */
bool doSettle; /**< flag to request settle after move, autoreset */
int debug;
int verbose;
int stepCount; /**< number of step operations for this move cycle */
float creep_offset; /**< last little bit to creep in units */
float creep_precision; /**< how far away we can stop creeping */
@ -249,7 +250,9 @@ struct __MoDriv {
pNWTimer state_timer; /**< motor state timer */
SConnection *trace;
int posit_count;
int posit_name_count;
double* positions;
char** position_names;
int variables;
#if defined(STATE_TRACE) && (STATE_TRACE > 0)
int state_trace_idx;
@ -397,39 +400,81 @@ static bool parseNumber(const char *str, double *pNumber) {
static bool getHardFromSoft(pDMC2280Driv self, SConnection *pCon, double fSoft, double *pHard) {
float fLower, fUpper, fZero, fSign, fLim;
double fHard;
bool result = true;
MotorGetPar(self->pMot, "softlowerlim", &fLower);
MotorGetPar(self->pMot, "softupperlim", &fUpper);
MotorGetPar(self->pMot, "softzero", &fZero);
MotorGetPar(self->pMot, "sign", &fSign);
fHard = fSoft;
fHard += fZero;
if (fSign != 0.0)
fHard *= fSign;
if (fSoft > fUpper) {
if (pCon)
SCPrintf(pCon, eWarning, "%g violates upper software limit %g on %s",
fSoft, fUpper, self->name);
return false;
result = false;
}
if (fSoft < fLower) {
if (pCon)
SCPrintf(pCon, eWarning, "%g violates lower software limit %g on %s",
fSoft, fLower, self->name);
return false;
result = false;
}
fHard = fSoft;
fHard += fZero;
fHard *= fSign;
if (fHard > self->fUpper) {
if (pCon)
SCPrintf(pCon, eWarning, "%g violates upper hardware limit %g (%g) on %s",
fSoft, self->fUpper * fSign + fZero, self->fUpper, self->name);
return false;
result = false;
} else if (fHard < self->fLower) {
if (pCon)
SCPrintf(pCon, eWarning, "%g violates lower hardware limit %g (%g) on %s",
fSoft, self->fLower * fSign + fZero, self->fLower, self->name);
return false;
result = false;
}
*pHard = fHard;
return true;
return result;
}
static bool getSoftFromHard(pDMC2280Driv self, SConnection *pCon, double fHard, double *pSoft) {
float fLower, fUpper, fZero, fSign, fLim;
double fSoft;
bool result = true;
MotorGetPar(self->pMot, "softlowerlim", &fLower);
MotorGetPar(self->pMot, "softupperlim", &fUpper);
MotorGetPar(self->pMot, "softzero", &fZero);
MotorGetPar(self->pMot, "sign", &fSign);
fSoft = fHard;
if (fSign != 0.0)
fSoft /= fSign;
fSoft -= fZero;
if (fHard > self->fUpper) {
if (pCon)
SCPrintf(pCon, eWarning, "%g violates upper hardware limit %g (%g) on %s",
fSoft, self->fUpper * fSign + fZero, self->fUpper, self->name);
result = false;
} else if (fHard < self->fLower) {
if (pCon)
SCPrintf(pCon, eWarning, "%g violates lower hardware limit %g (%g) on %s",
fSoft, self->fLower * fSign + fZero, self->fLower, self->name);
result = false;
}
if (fSoft > fUpper) {
if (pCon)
SCPrintf(pCon, eWarning, "%g violates upper software limit %g on %s",
fSoft, fUpper, self->name);
result = false;
}
if (fSoft < fLower) {
if (pCon)
SCPrintf(pCon, eWarning, "%g violates lower software limit %g on %s",
fSoft, fLower, self->name);
result = false;
}
*pSoft = fSoft;
return result;
}
static void TrackingRelease(pDMC2280Driv self) {
@ -558,7 +603,7 @@ static long long unit2count(pDMC2280Driv self, double target) {
result = (int) (absolute - 0.5);
else
result = (int) absolute;
if (self->debug) {
if (self->verbose) {
char line[CMDLEN];
snprintf(line, CMDLEN, "unit2count Rounding %f to %lld", absolute, result);
SICSLogWrite(line, eLog);
@ -607,7 +652,19 @@ static double unit2posit(pDMC2280Driv self, double target) {
return fPos;
}
static double posit2unit(pDMC2280Driv self, double target) {
static double arg2posit(pDMC2280Driv self, const char* arg) {
double fPosit = 0.0;
int i;
if (self->posit_name_count > 0 && self->position_names)
for (i = 0; i < self->posit_name_count; ++i)
if (strcasecmp(arg, self->position_names[i]) == 0)
return (double) i + 1;
if (parseNumber(arg, &fPosit))
return fPosit;
return 0.0;
}
static double posit2hard(pDMC2280Driv self, double target) {
double result;
int i = ((int) target) - 1;
if (i < 0) {
@ -623,13 +680,13 @@ static double posit2unit(pDMC2280Driv self, double target) {
static double posit2soft(pDMC2280Driv self, double target) {
double fSoft, fHard;
fHard = posit2unit(self, target);
fHard = posit2hard(self, target);
getSoftFromHard(self, NULL, fHard, &fSoft);
return fSoft;
}
static long long posit2count(pDMC2280Driv self, double target) {
return unit2count(self, posit2unit(self, target));
return unit2count(self, posit2hard(self, target));
}
static double count2posit(pDMC2280Driv self, long long counts) {
@ -726,7 +783,7 @@ static int motAbsol(pDMC2280Driv self, double target) {
result = (int) (absolute - 0.5);
else
result = (int) absolute;
if (self->debug) {
if (self->verbose) {
char line[CMDLEN];
snprintf(line, CMDLEN, "motAbsol Rounding %f to %d", absolute, result);
SICSLogWrite(line, eLog);
@ -786,7 +843,7 @@ static int motCreep(pDMC2280Driv self, double target) {
* In all repetitive things, there just has to be a limit
*/
if (abs(self->creep_val) > MAX_CREEP_STEPS) {
if (self->debug) {
if (self->verbose) {
char line[CMDLEN];
snprintf(line, CMDLEN, "Motor=%s creep stopped, stepcount = %d",
self->name, self->stepCount);
@ -805,7 +862,7 @@ static int motCreep(pDMC2280Driv self, double target) {
/*
* We may still move, calculate if we will and how far
*/
if (self->debug) {
if (self->verbose) {
char line[CMDLEN];
snprintf(line, CMDLEN, "CREEP: cur=%d, target=%d, offset=%d, new=%d",
self->currSteps, target_steps, offset, self->currSteps + offset);
@ -850,7 +907,7 @@ static int motCreep(pDMC2280Driv self, double target) {
if (self->creep_val > 0) /* moving down, restore to negative */
offset = - offset;
if (self->debug) {
if (self->verbose) {
char line[CMDLEN];
snprintf(line, CMDLEN, "CREEP: Motor=%s, preseek=%d, creep_val=%d, cur_steps=%d",
self->name, self->preseek, self->creep_val, self->currSteps);
@ -974,7 +1031,7 @@ static int SendCallback(pAsyncTxn pCmd) {
pDMC2280Driv self = (pDMC2280Driv) pCmd->cntx;
if (pCmd->txn_status == ATX_TIMEOUT) {
if (self->debug) {
if (self->verbose) {
SICSLogWrite(pCmd->out_buf, eLog);
SICSLogWrite("<TIMEOUT>", eLog);
}
@ -986,7 +1043,7 @@ static int SendCallback(pAsyncTxn pCmd) {
case ':': /* prompt */
case ' ': /* leading blank */
case '-': /* leading minus sign */
if (self->debug) {
if (self->verbose) {
SICSLogWrite(cmnd, eLog);
SICSLogWrite(resp, eLog);
}
@ -1002,7 +1059,7 @@ static int SendCallback(pAsyncTxn pCmd) {
default:
if ((cmnd[0] == 'M' && cmnd[1] == 'G') || (cmnd[0] == 'L' && cmnd[1] == 'V')) {
/* MG and LV commands can produce this result */
if (self->debug) {
if (self->verbose) {
SICSLogWrite(cmnd, eLog);
SICSLogWrite(resp, eLog);
}
@ -1059,7 +1116,7 @@ static int DMC_SendReceive(pDMC2280Driv self, char *cmd, char* reply) {
status = AsyncUnitTransact(self->asyncUnit, cmd, strlen(cmd), reply, &cmd_len);
if (status != 1) {
if (self->debug)
if (self->verbose)
SICSLogWrite(cmd, eLog);
if (status == -1)
self->errorCode = MOTCMDTMO;
@ -1070,14 +1127,14 @@ static int DMC_SendReceive(pDMC2280Driv self, char *cmd, char* reply) {
switch (reply[0]) {
case ':': /* prompt */
if (self->debug) {
if (self->verbose) {
SICSLogWrite(cmd, eLog);
SICSLogWrite(reply, eLog);
}
return SUCCESS;
case ' ': /* leading blank */
case '-': /* leading minus sign */
if (self->debug) {
if (self->verbose) {
SICSLogWrite(cmd, eLog);
SICSLogWrite(reply, eLog);
}
@ -1093,7 +1150,7 @@ static int DMC_SendReceive(pDMC2280Driv self, char *cmd, char* reply) {
default:
if ((cmd[0] == 'M' && cmd[1] == 'G') || (cmd[0] == 'L' && cmd[1] == 'V')) {
/* MG and LV commands can produce this result */
if (self->debug) {
if (self->verbose) {
SICSLogWrite(cmd, eLog);
SICSLogWrite(reply, eLog);
}
@ -1426,7 +1483,7 @@ static int checkMotion(pDMC2280Driv self) {
double cmp = ratio_cmp;
if (fabs(cmp) > -1.0 && fabs(cmp) < 1.0)
cmp = 1.0 / cmp;
if (self->debug || bNotYet == false) {
if (self->verbose || bNotYet == false) {
snprintf(msg, sizeof(msg), "Motor %s fail: obs=%f, exp=%f, cmp=%f",
self->name, ratio_obs, ratio_exp, cmp);
SICSLogWrite(msg, eError);
@ -1443,7 +1500,7 @@ static int checkMotion(pDMC2280Driv self) {
set_lastMotion(self, self->currSteps, self->currCounts);
}
} else {
if (self->debug) {
if (self->verbose) {
char msg[132];
double cmp = ratio_cmp;
if (fabs(cmp) > 0 && fabs(cmp) < 1)
@ -1690,7 +1747,7 @@ static int rspStatus(pDMC2280Driv self, const char* text) {
else
iIOByte = iTIone;
if ((trace_switches || self->debug) && self->currFlags != iFlags) {
if ((trace_switches || self->verbose) && self->currFlags != iFlags) {
char line[CMDLEN];
char *sw;
if ((self->currFlags & (8 + 4)) != (iFlags & (8 + 4))) {
@ -2005,7 +2062,7 @@ static void state_trace_ins(pDMC2280Driv self, const char *fmt, ...) {
self->state_trace_done[self->state_trace_idx] = 0;
if (true)
#else
if (self->debug || self->trace)
if (self->verbose || self->trace)
#endif
{
char format[CMDLEN];
@ -2017,7 +2074,7 @@ static void state_trace_ins(pDMC2280Driv self, const char *fmt, ...) {
va_start(ap, fmt);
vsnprintf(lp, CMDLEN, format, ap);
va_end(ap);
if (self->debug)
if (self->verbose)
SICSLogWrite(lp, eLog);
if (self->trace)
SCWrite(self->trace, lp, eLog);
@ -2032,7 +2089,7 @@ static void report_event(pDMC2280Driv self, pEvtEvent event) {
#if defined(STATE_TRACE) && (STATE_TRACE > 0)
if (true)
#else
if (self->debug || self->trace)
if (self->verbose || self->trace)
#endif
{
char text[CMDLEN];
@ -2051,7 +2108,7 @@ static void handle_event(pDMC2280Driv self, pEvtEvent event) {
#if defined(STATE_TRACE) && (STATE_TRACE > 0)
if (true)
#else
if (self->debug || self->trace)
if (self->verbose || self->trace)
#endif
{
report_event(self, event);
@ -2063,7 +2120,7 @@ static void change_state(pDMC2280Driv self, StateFunc func) {
#if defined(STATE_TRACE) && (STATE_TRACE > 0)
if (true)
#else
if (self->debug || self->trace)
if (self->verbose || self->trace)
#endif
{
state_trace_ins(self, "NewState=%s",
@ -2219,7 +2276,7 @@ static int state_snd_callback(pAsyncTxn pCmd) {
#if defined(STATE_TRACE) && (STATE_TRACE > 0)
if (true)
#else
if (self->debug || self->trace)
if (self->verbose || self->trace)
#endif
{
char text[CMDLEN];
@ -2420,7 +2477,7 @@ static void DMCState_Idle(pDMC2280Driv self, pEvtEvent event) {
} else {
(void) report_motion(self, eReportIdle);
}
if (trace_switches || self->debug)
if (trace_switches || self->verbose)
DMC_SetTimer(self, self->motorPollFast);
else
DMC_SetTimer(self, self->motorPollSlow);
@ -2711,7 +2768,7 @@ static void DMCState_MotorOn(pDMC2280Driv self, pEvtEvent event) {
}
}
}
if (self->debug) {
if (self->verbose) {
char line[CMDLEN];
snprintf(line, CMDLEN, "Motor=%s, Pos=%f, Preseek=%f, Target=%f\n",
self->name,
@ -2979,7 +3036,7 @@ static void DMCState_BacklashCont(pDMC2280Driv self, pEvtEvent event) {
if (self->preseek && self->stepCount > 10) {
/* limit the maximum number of tries */
if (self->debug) {
if (self->verbose) {
char line[CMDLEN];
snprintf(line, CMDLEN, "Motor=%s preseek stopped, stepcount = %d",
self->name, self->stepCount);
@ -3395,13 +3452,13 @@ static void DMCState_StepMove(pDMC2280Driv self, pEvtEvent event) {
DMC_SetTimer(self, self->settle);
return;
}
if (true /*self->debug*/ || true /*self->doStats*/) {
if (true /*self->verbose*/ || true /*self->doStats*/) {
double units = self->currPosition - self->origPosition;
long int steps = self->currSteps - self->origSteps;
long int counts = self->currCounts - self->origCounts;
double time = DoubleTime() - self->origTime;
char line[CMDLEN];
if (true /*self->debug*/) {
if (true /*self->verbose*/) {
snprintf(line, CMDLEN, "Motor=%s stopped: p=%.6f(%.6f-%.6f), u=%.6f,"
" s=%ld, c=%ld, s/X=%.6f,"
" r=(%.6f-%.6f), t=%.3fS",
@ -3594,7 +3651,7 @@ static void DMCState_Moving(pDMC2280Driv self, pEvtEvent event) {
if (self->preseek && self->stepCount > 10) {
/* limit the maximum number of tries */
if (self->debug) {
if (self->verbose) {
char line[CMDLEN];
snprintf(line, CMDLEN, "Motor=%s preseek stopped, stepcount = %d",
self->name, self->stepCount);
@ -3605,7 +3662,7 @@ static void DMCState_Moving(pDMC2280Driv self, pEvtEvent event) {
}
else if (self->preseek) {
absolute = motCreep(self, target);
if (self->debug) {
if (self->verbose) {
char line[CMDLEN];
snprintf(line, CMDLEN, "Motor=%s unchanged direction: "
"preseek=%d, fPreseek=%f, steps=%d, creep_val=%d",
@ -3621,7 +3678,7 @@ static void DMCState_Moving(pDMC2280Driv self, pEvtEvent event) {
/* change of direction, reset motion check */
set_lastMotion(self, self->currSteps, self->currCounts);
absolute = motCreep(self, target);
if (self->debug) {
if (self->verbose) {
char line[CMDLEN];
snprintf(line, CMDLEN, "Motor=%s changed direction: "
"preseek=%d, fPreseek=%f, steps=%d, creep_val=%d",
@ -3637,7 +3694,7 @@ static void DMCState_Moving(pDMC2280Driv self, pEvtEvent event) {
else
absolute = motCreep(self, target);
if (self->debug && self->preseek) {
if (self->verbose && self->preseek) {
char line[CMDLEN];
snprintf(line, CMDLEN, "Motor=%s, Pos=%f, Preseek=%f, Target=%f\n",
self->name,
@ -3651,7 +3708,7 @@ static void DMCState_Moving(pDMC2280Driv self, pEvtEvent event) {
*/
if (self->preseek) {
if (absolute == self->currSteps) {
if (self->debug) {
if (self->verbose) {
char line[CMDLEN];
snprintf(line, CMDLEN, "Motor=%s motion stopped, absolute = %d",
self->name, absolute);
@ -3686,7 +3743,7 @@ static void DMCState_Moving(pDMC2280Driv self, pEvtEvent event) {
}
/* We get here when the motor stops normally
*/
if (true /*self->debug*/) {
if (true /*self->verbose*/) {
double units = self->currPosition - self->origPosition;
long int steps = self->currSteps - self->origSteps;
long int counts = self->currCounts - self->origCounts;
@ -4326,6 +4383,10 @@ static int DMC2280GetPar(void *pData, char *name,
*fValue = self->debug;
return 1;
}
if(strcasecmp(name,"verbose") == 0) {
*fValue = self->verbose;
return 1;
}
if(strcasecmp(name,SETTLE) == 0) {
*fValue = self->settle;
return 1;
@ -4524,6 +4585,16 @@ static int DMC2280SetPar(void *pData, SConnection *pCon,
}
}
/* Verbose, managers only */
if(strcasecmp(name,"verbose") == 0) {
if(!SCMatchRights(pCon,usMugger))
return 1;
else {
self->verbose = newValue;
return 1;
}
}
/* Setttle, managers only */
if(strcasecmp(name,SETTLE) == 0) {
if(!SCMatchRights(pCon,usMugger))
@ -4896,6 +4967,16 @@ static void DMC2280StrList(pDMC2280Driv self, char *name, SConnection *pCon){
DMC2280Error(self, &iCode, error, CMDLEN);
SCPrintf(pCon, eValue, "%s.error = %d:%s", self->name, iCode, error);
}
if (self->posit_name_count > 0 && self->position_names) {
int i, k = 0;
char line[1320];
k += snprintf(line, sizeof(line) - k, "%s.position_names =", self->name);
for (i = 0; i < self->posit_name_count; ++i) {
k += snprintf(&line[k], sizeof(line) - k, " %s",
self->position_names[i]);
}
SCWrite(pCon, line, eValue);
}
return;
}
/** \brief List the motor parameters to the client.
@ -4919,6 +5000,7 @@ static void DMC2280List(void *pData, char *name, SConnection *pCon){
SCPrintf(pCon, eValue, "%s.motorPollSlow = %d\n", name, self->motorPollSlow);
SCPrintf(pCon, eValue, "%s.airPollTimer = %d\n", name, self->airPollTimer);
SCPrintf(pCon, eValue, "%s.Debug = %d\n", name, self->debug);
SCPrintf(pCon, eValue, "%s.Verbose = %d\n", name, self->verbose);
SCPrintf(pCon, eValue, "%s.Settle = %d\n", name, self->settle);
SCPrintf(pCon, eValue, "%s.Blockage_Check_Interval = %f\n", name, self->blockage_ckInterval);
SCPrintf(pCon, eValue, "%s.Blockage_Thresh = %f\n", name, self->blockage_thresh);
@ -5122,11 +5204,11 @@ MotorDriver *CreateDMC2280(SConnection *pCon, char *motor, char *params) {
/* PARAMETERS: Fetch parameter values */
/* Debug: this motor driver logs exchanges */
if ((pPtr=getParam(pCon, interp, params,"debug",_OPTIONAL)) == NULL)
pNew->debug=0;
/* Verbose: this motor driver logs exchanges */
if ((pPtr=getParam(pCon, interp, params,"verbose",_OPTIONAL)) == NULL)
pNew->verbose=0;
else {
sscanf(pPtr,"%d",&(pNew->debug));
sscanf(pPtr,"%d",&(pNew->verbose));
}
pNew->ao_id[0] = '\0';
@ -5653,8 +5735,9 @@ int DMC2280Action(SConnection *pCon, SicsInterp *pSics, void *pData,
}
else if (strcasecmp("driver", argv[1]) == 0 && strcasecmp("run", argv[2]) == 0) {
if (argc > 2) {
float fLower, fUpper, fZero, fSign, fFixed, fLim;
float fFixed;
double fSoft;
double fHard;
char *endPtr;
errno = 0;
fSoft = strtod(argv[3], &endPtr);
@ -5673,36 +5756,15 @@ int DMC2280Action(SConnection *pCon, SicsInterp *pSics, void *pData,
SCPrintf(pCon, eWarning, "Motor %s bad run parameter %s", self->name, argv[3]);
return 1;
}
MotorGetPar(self->pMot, "softlowerlim", &fLower);
MotorGetPar(self->pMot, "softupperlim", &fUpper);
MotorGetPar(self->pMot, "softzero", &fZero);
MotorGetPar(self->pMot, "sign", &fSign);
MotorGetPar(self->pMot, "fixed", &fFixed);
if (fFixed >= 0) {
SCPrintf(pCon, eWarning, "Motor %s is Fixed", self->name);
} else if (fSoft > fUpper) {
SCPrintf(pCon, eWarning, "%g violates upper software limit %g on %s",
fSoft, fUpper, self->name);
} else if (fSoft < fLower) {
SCPrintf(pCon, eWarning, "%g violates lower software limit %g on %s",
fSoft, fLower, self->name);
} else {
double fHard = fSoft;
fHard += fZero;
fHard *= fSign;
if (fHard > self->fUpper) {
SCPrintf(pCon, eWarning, "%g violates upper hardware limit %g (%g) on %s",
fSoft, self->fUpper * fSign + fZero, self->fUpper, self->name);
} else if (fHard < self->fLower) {
SCPrintf(pCon, eWarning, "%g violates lower hardware limit %g (%g) on %s",
fSoft, self->fLower * fSign + fZero, self->fLower, self->name);
} else {
self->fTarget = fHard;
SCPrintf(pCon, eLog, "Running %s to soft=%g, hard=%g", self->name, fSoft, fHard);
self->doOscillate = false;
self->doReportMotion = true;
state_cmd_execute(self, CMD_RUN);
}
} else if (getHardFromSoft(self, pCon, fSoft, &fHard)) {
self->fTarget = fHard;
SCPrintf(pCon, eLog, "Running %s to soft=%g, hard=%g", self->name, fSoft, fHard);
self->doOscillate = false;
self->doReportMotion = true;
state_cmd_execute(self, CMD_RUN);
}
}
else {
@ -5955,6 +6017,22 @@ int DMC2280Action(SConnection *pCon, SicsInterp *pSics, void *pData,
}
return 1;
}
else if(strcasecmp("hard2soft", argv[1]) == 0) {
double fHard, fSoft;
if (parseNumber(argv[2], &fHard)) {
getSoftFromHard(self, pCon, fHard, &fSoft);
SCPrintf(pCon, eValue, "%s.hard2soft = %g", self->name, fSoft);
}
return 1;
}
else if(strcasecmp("soft2hard", argv[1]) == 0) {
double fHard, fSoft;
if (parseNumber(argv[2], &fSoft)) {
getHardFromSoft(self, pCon, fSoft, &fHard);
SCPrintf(pCon, eValue, "%s.soft2hard = %g", self->name, fHard);
}
return 1;
}
else if(self->abs_encoder && strcasecmp("unit2count", argv[1]) == 0) {
char line[132];
if (argc > 2) {
@ -5995,7 +6073,7 @@ int DMC2280Action(SConnection *pCon, SicsInterp *pSics, void *pData,
if (argc == 2) {
int i, k = 0;
char line[1320];
k += snprintf(line, sizeof(line) - k, "%s.positions ", self->name);
k += snprintf(line, sizeof(line) - k, "%s.positions =", self->name);
for (i = 0; i < self->posit_count; ++i) {
k += snprintf(&line[k], sizeof(line) - k, " %f",
self->positions[i]);
@ -6003,15 +6081,15 @@ int DMC2280Action(SConnection *pCon, SicsInterp *pSics, void *pData,
SCWrite(pCon, line, eValue);
return 1;
}
if (self->posit_count > 0) {
self->posit_count = 0;
}
if (self->positions) {
free(self->positions);
self->positions = NULL;
self->posit_count = 0;
}
if (argc > 3 && strcasecmp("erase", argv[2]) == 0) {
if (self->posit_count > 0) {
self->posit_count = 0;
}
if (argc > 2 && strcasecmp("erase", argv[2]) == 0) {
char line[132];
snprintf(line, 132, "%s.posit_count = %d", self->name, self->posit_count);
SCWrite(pCon, line, eValue);
@ -6025,6 +6103,45 @@ int DMC2280Action(SConnection *pCon, SicsInterp *pSics, void *pData,
}
return 1;
}
else if(strcasecmp("position_names", argv[1]) == 0) {
if (argc == 2) {
int i, k = 0;
char line[1320];
k += snprintf(line, sizeof(line) - k, "%s.position_names =", self->name);
for (i = 0; i < self->posit_name_count; ++i) {
k += snprintf(&line[k], sizeof(line) - k, " %s",
self->position_names[i]);
}
SCWrite(pCon, line, eValue);
return 1;
}
if (self->position_names) {
int i;
for (i = 0; i < self->posit_name_count; ++i) {
free(self->position_names[i]);
self->position_names[i] = NULL;
}
free(self->position_names);
self->position_names = NULL;
self->posit_name_count = 0;
}
if (self->posit_name_count > 0) {
self->posit_name_count = 0;
}
if (argc > 2 && strcasecmp("erase", argv[2]) == 0) {
char line[132];
snprintf(line, 132, "%s.posit_name_count = %d", self->name, self->posit_name_count);
SCWrite(pCon, line, eValue);
return 1;
}
self->posit_name_count = argc - 2;
self->position_names = malloc(self->posit_name_count * sizeof(*self->position_names));
int i;
for (i = 0; i < self->posit_name_count; ++i) {
self->position_names[i] = strdup(argv[i + 2]);
}
return 1;
}
if (self->abs_encoder && strcasecmp("absEncHome", argv[1]) == 0) {
if (argc > 2) {
/* Debug Managers only */
@ -6061,7 +6178,7 @@ int DMC2280Action(SConnection *pCon, SicsInterp *pSics, void *pData,
char line[132];
if (argc > 2) {
double target;
target = strtod(argv[2], NULL);
target = arg2posit(self, argv[2]);
snprintf(line, 132, "%s.posit2count = %lld",
self->name,
posit2count(self, target));
@ -6099,11 +6216,25 @@ int DMC2280Action(SConnection *pCon, SicsInterp *pSics, void *pData,
SCWrite(pCon, line, eValue);
return 1;
}
else if(strcasecmp("posit2hard", argv[1]) == 0) {
char line[132];
if (argc > 2) {
double target;
target = arg2posit(self, argv[2]);
snprintf(line, 132, "%s.posit2hard = %f",
self->name,
posit2hard(self, target));
}
else
strcpy(line, "missing value");
SCWrite(pCon, line, eValue);
return 1;
}
else if(strcasecmp("posit2soft", argv[1]) == 0) {
char line[132];
if (argc > 2) {
double target;
target = strtod(argv[2], NULL);
target = arg2posit(self, argv[2]);
snprintf(line, 132, "%s.posit2soft = %f",
self->name,
posit2soft(self, target));
@ -6113,14 +6244,14 @@ int DMC2280Action(SConnection *pCon, SicsInterp *pSics, void *pData,
SCWrite(pCon, line, eValue);
return 1;
}
else if(strcasecmp("posit2unit", argv[1]) == 0) {
else if(strcasecmp("posit2unit", argv[1]) == 0) { /* Legacy */
char line[132];
if (argc > 2) {
double target;
target = strtod(argv[2], NULL);
target = arg2posit(self, argv[2]);
snprintf(line, 132, "%s.posit2unit = %f",
self->name,
posit2unit(self, target));
posit2hard(self, target));
}
else
strcpy(line, "missing value");