121 lines
3.7 KiB
C
121 lines
3.7 KiB
C
/*---------------------------------------------------------------------
|
|
AMOR component handling module. For the new (2005) calculation of the
|
|
positions using the beam height as zero.
|
|
|
|
copyright: see file COPYRIGHT
|
|
|
|
Mark Koennecke, October 2005
|
|
-----------------------------------------------------------------------*/
|
|
#include "amorcomp.h"
|
|
#define ABS(x) (x < 0 ? -(x) : (x))
|
|
|
|
double calcCompPosition(pamorComp comp)
|
|
{
|
|
return ABS(comp->scaleOffset - comp->markOffset - comp->readPosition);
|
|
}
|
|
|
|
/*-------------------------------------------------------------------*/
|
|
int handleCompCommand(pamorComp comp, SConnection * pCon,
|
|
int argc, char *argv[])
|
|
{
|
|
char pBueffel[512];
|
|
|
|
if (argc < 3) {
|
|
SCWrite(pCon, "ERROR: not enough arguments", eError);
|
|
return 0;
|
|
}
|
|
strtolower(argv[2]);
|
|
if (strcmp(argv[2], "list") == 0) {
|
|
snprintf(pBueffel, 511,
|
|
"%s %s active = %d\n%s %s offset = %f\n%s %s scaleoffset = %f\n%s %s read = %f\n%s %s calc = %f\n",
|
|
argv[0], argv[1], comp->activeFlag,
|
|
argv[0], argv[1], comp->markOffset,
|
|
argv[0], argv[1], comp->scaleOffset,
|
|
argv[0], argv[1], comp->readPosition,
|
|
argv[0], argv[1], calcCompPosition(comp));
|
|
SCWrite(pCon, pBueffel, eValue);
|
|
return 1;
|
|
} else if (strcmp(argv[2], "active") == 0) {
|
|
if (argc > 3) {
|
|
if (!SCMatchRights(pCon, usUser)) {
|
|
return 0;
|
|
}
|
|
SCparChange(pCon);
|
|
comp->activeFlag = atoi(argv[3]);
|
|
SCSendOK(pCon);
|
|
return 1;
|
|
} else {
|
|
snprintf(pBueffel, 511, " %s %s active = %d",
|
|
argv[0], argv[1], comp->activeFlag);
|
|
SCWrite(pCon, pBueffel, eValue);
|
|
return 1;
|
|
}
|
|
} else if (strcmp(argv[2], "offset") == 0) {
|
|
if (argc > 3) {
|
|
if (!SCMatchRights(pCon, usUser)) {
|
|
return 0;
|
|
}
|
|
SCparChange(pCon);
|
|
comp->markOffset = atof(argv[3]);
|
|
SCSendOK(pCon);
|
|
return 1;
|
|
} else {
|
|
snprintf(pBueffel, 511, " %s %s offset = %f",
|
|
argv[0], argv[1], comp->markOffset);
|
|
SCWrite(pCon, pBueffel, eValue);
|
|
return 1;
|
|
}
|
|
} else if (strcmp(argv[2], "scaleoffset") == 0) {
|
|
if (argc > 3) {
|
|
if (!SCMatchRights(pCon, usUser)) {
|
|
return 0;
|
|
}
|
|
comp->scaleOffset = atof(argv[3]);
|
|
SCparChange(pCon);
|
|
SCSendOK(pCon);
|
|
return 1;
|
|
} else {
|
|
snprintf(pBueffel, 511, " %s %s scaleoffset = %f",
|
|
argv[0], argv[1], comp->scaleOffset);
|
|
SCWrite(pCon, pBueffel, eValue);
|
|
return 1;
|
|
}
|
|
} else if (strcmp(argv[2], "read") == 0) {
|
|
if (argc > 3) {
|
|
if (!SCMatchRights(pCon, usUser)) {
|
|
return 0;
|
|
}
|
|
comp->readPosition = atof(argv[3]);
|
|
SCparChange(pCon);
|
|
SCSendOK(pCon);
|
|
return 1;
|
|
} else {
|
|
snprintf(pBueffel, 511, " %s %s read = %f",
|
|
argv[0], argv[1], comp->readPosition);
|
|
SCWrite(pCon, pBueffel, eValue);
|
|
return 1;
|
|
}
|
|
} else if (strcmp(argv[2], "calc") == 0) {
|
|
snprintf(pBueffel, 511, " %s %s calc = %f",
|
|
argv[0], argv[1], calcCompPosition(comp));
|
|
SCWrite(pCon, pBueffel, eValue);
|
|
return 1;
|
|
} else {
|
|
snprintf(pBueffel, 511, "ERROR: subcommand %s to %s %s not understood",
|
|
argv[2], argv[0], argv[1]);
|
|
SCWrite(pCon, pBueffel, eError);
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
int saveAmorComp(FILE * fd, char *name, char *compname, pamorComp comp)
|
|
{
|
|
fprintf(fd, "%s %s active %d\n", name, compname, comp->activeFlag);
|
|
fprintf(fd, "%s %s offset %f\n", name, compname, comp->markOffset);
|
|
fprintf(fd, "%s %s scaleoffset %f\n", name, compname, comp->scaleOffset);
|
|
fprintf(fd, "%s %s read %f\n", name, compname, comp->readPosition);
|
|
return 1;
|
|
}
|