/*--------------------------------------------------------------------- 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; }