From 8f0ceac2ad292ed66df4674fd8bb3ede98b95c41 Mon Sep 17 00:00:00 2001 From: Ferdi Franceschini Date: Fri, 31 May 2013 09:18:35 +1000 Subject: [PATCH] SICS-615 You can now update the start and step fields of scan parameters. NOTE: This also fixes the bug that was crashing SICS. The n was missing in an snprintf(). --- scan.c | 60 ++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/scan.c b/scan.c index 3ca95865..98675fa2 100644 --- a/scan.c +++ b/scan.c @@ -241,6 +241,31 @@ int AddScanVar(pScanData self, SicsInterp * pSics, SConnection * pCon, return 1; } +/*-------------------------------------------------------------------------*/ +int ReplaceScanVar(pScanData self, SicsInterp * pSics, SConnection * pCon, + int index, float fStart, float fStep) +{ + pVarEntry pVar = NULL; + void *pPtr = NULL; + + if (self->iActive) { + SCWrite(pCon, "ERROR: cannot change parameters while scan is running", + eError); + return 0; + } + + DynarGet(self->pScanVar, index, &pPtr); + pVar = (pVarEntry) pPtr; + if (pVar == NULL) { + return 0; + } + pVar->fStart = fStart; + pVar->fStep = fStep; + + /* put it away */ + DynarReplace(self->pScanVar, index, pVar, sizeof(VarEntry)); + return 1; +} /*-------------------------------------------------------------------------*/ int AddLogVar(pScanData self, SicsInterp * pSics, SConnection * pCon, char *name) @@ -1619,7 +1644,7 @@ int ScanWrapper(SConnection * pCon, SicsInterp * pSics, void *pData, char pBueffel[512], varname[512]; double fStep, fStart, fPreset; float *fData = NULL; - int lNP; + int lNP, foundMatch=0; int iChannel; int iRet, iMode, i, varnum; char *pPtr = NULL, pItem[20]; @@ -1860,17 +1885,6 @@ int ScanWrapper(SConnection * pCon, SicsInterp * pSics, void *pData, SCWrite(pCon, pBueffel, eError); return 0; } - /* check for duplicate scanvar */ - for (varnum = 0; varnum < self->iScanVar; varnum++) { - GetScanVarName(self, varnum, varname, 512); - if (strcmp(argv[2], varname) == 0) { - sprintf(pBueffel, sizeof(pBueffel)-1, - "ERROR: Scan variable %s has already been added.", - argv[2]); - SCWrite(pCon, pBueffel, eError); - return 0; - } - } /* get numbers */ iRet = Tcl_GetDouble(InterpGetTcl(pSics), argv[3], &fStart); if (iRet != TCL_OK) { @@ -1884,8 +1898,26 @@ int ScanWrapper(SConnection * pCon, SicsInterp * pSics, void *pData, SCWrite(pCon, pBueffel, eError); return 0; } - iRet = AddScanVar(self, pSics, pCon, argv[2], - (float) fStart, (float) fStep); + if (self->iScanVar == 0) { + iRet = AddScanVar(self, pSics, pCon, argv[2], (float) fStart, + (float) fStep); + } else { + foundMatch = 0; + for (varnum = 0; varnum < self->iScanVar; varnum++) { + GetScanVarName(self, varnum, varname, 512); + if (strcmp(argv[2], varname) == 0) { + foundMatch = 1; + break; + } + } + if (foundMatch) { + iRet = ReplaceScanVar(self, pSics, pCon, varnum, (float) fStart, + (float) fStep); + } else { + iRet = AddScanVar(self, pSics, pCon, argv[2], (float) fStart, + (float) fStep); + } + } if (iRet) { SCSendOK(pCon); }