diff --git a/countdriv.c b/countdriv.c index 2bf0d535..43c8b8be 100644 --- a/countdriv.c +++ b/countdriv.c @@ -62,6 +62,7 @@ pRes->fPreset = 1000.; pRes->fTime = 0.; pRes->iNoOfMonitors = 0; + pRes->iControlMonitor = 0; pRes->iPause = 0; pRes->Start = NULL; pRes->GetStatus = NULL; diff --git a/countdriv.h b/countdriv.h index 4f7603aa..e87b27a6 100644 --- a/countdriv.h +++ b/countdriv.h @@ -42,6 +42,7 @@ float fLastCurrent; float fTime; int iNoOfMonitors; + int iControlMonitor; long lCounts[MAXCOUNT]; int iPause; int iErrorCode; diff --git a/counter.c b/counter.c index 8483ebcc..5f715dad 100644 --- a/counter.c +++ b/counter.c @@ -609,6 +609,17 @@ assert(self); return self->pDriv->iNoOfMonitors; } + int GetControlMonitor(pCounter self) { + return self->pDriv->iControlMonitor; + } + int SetControlMonitor(pCounter self, int channel) { + int maxchan = self->pDriv->iNoOfMonitors - 1; + if (channel < 0 || channel > maxchan) { + return 0; + } + self->pDriv->iControlMonitor = channel; + return 1; + } #ifdef NONINTF extern float nintf(float f); #endif @@ -660,7 +671,7 @@ { self->pCountInt->TransferData(self,pCon); } - return self->pDriv->lCounts[0]; + return self->pDriv->lCounts[self->pDriv->iControlMonitor]; } /*------------------------------------------------------------------------*/ long GetMonitor(pCounter self, int iNum, SConnection *pCon) @@ -671,7 +682,7 @@ { self->pCountInt->TransferData(self,pCon); } - if( (iNum < 0) || (iNum > self->pDriv->iNoOfMonitors) ) + if( (iNum < 0) || (iNum >= self->pDriv->iNoOfMonitors) ) { return -1L; } @@ -780,7 +791,9 @@ {"send",0,{0,0}}, {"setpar",3,{FUPATEXT,FUPAINT,FUPAFLOAT}}, {"getpar",2,{FUPATEXT,FUPAOPT}}, - {"getnmon",0,{0,0}} + {"getnmon",0,{0,0}}, + {"getchannel",0,{0}}, + {"setchannel",1,{FUPAINT}} }; char *pMode[] = { "timer", @@ -796,7 +809,7 @@ /* parse function args */ argtolower(argc,argv); argx = &argv[1]; - iRet = EvaluateFuPa((pFuncTemplate)&ActionTemplate,23,argc-1,argx,&PaRes); + iRet = EvaluateFuPa((pFuncTemplate)&ActionTemplate,25,argc-1,argx,&PaRes); if(iRet < 0) { sprintf(pBueffel,"%s",PaRes.pError); @@ -1140,6 +1153,19 @@ SCWrite(pCon,pBueffel,eValue); return 1; break; + case 23: /* getchannel */ + snprintf(pBueffel,131,"%s.getchannel = %d", argv[0], GetControlMonitor(self)); + SCWrite(pCon,pBueffel,eValue); + return 1; + break; + case 24: /* setchannel */ + if (SetControlMonitor(self, PaRes.Arg[0].iVal)) { + return 1; + } else { + SCWrite(pCon,"ERROR: Invalid channel id",eError); + return 0; + } + break; default: assert(0); /* internal error */ } diff --git a/counter.h b/counter.h index 9c84f64c..ba1382bb 100644 --- a/counter.h +++ b/counter.h @@ -42,6 +42,8 @@ long GetCounts(pCounter self, SConnection *pCon); long GetMonitor(pCounter self, int iNum, SConnection *pCon); int GetNMonitor(pCounter self); + int GetControlMonitor(pCounter self); + int SetControlMonitor(pCounter self, int channel); void SetMonitorValue(pCounter self, int index, long value); float GetCountTime(pCounter self, SConnection *pCon); diff --git a/multicounter.c b/multicounter.c index 8ab9a351..88463805 100644 --- a/multicounter.c +++ b/multicounter.c @@ -67,19 +67,26 @@ static int MMCCHalt(void *pData){ /*-------------------------------------------------------------------------*/ static int MMCCStart(void *pData, SConnection *pCon) { - int i, status; + int i, status, controlMonitor; + int oneYear=32000000; pCounter pCount = NULL; pMultiCounter self = NULL; + char buffer[128]; pCount = (pCounter)pData; if(pCount != NULL){ self = (pMultiCounter)pCount->pDriv->pData; } assert(self); - + controlMonitor = GetControlMonitor((pCounter)pCount); for(i = 0; i < self->nSlaves; i++){ + if (i == controlMonitor) { self->slaves[i]->SetCountParameters(self->slaveData[i], pCount->pDriv->fPreset, pCount->pDriv->eMode); + } else { + self->slaves[i]->SetCountParameters(self->slaveData[i], + oneYear, eTimer); + } status = self->slaves[i]->StartCount(self->slaveData[i],pCon); if(status != OKOK){ MMCCHalt(pData); @@ -93,7 +100,8 @@ static int MMCCStart(void *pData, SConnection *pCon) } /*-------------------------------------------------------------------------*/ static int MMCCStatus(void *pData, SConnection *pCon){ - int status,i; + int status,i, controlMonitor; + pCounter pCountController = NULL; pCounter pCount = NULL; pMultiCounter self = NULL; pDummy pDum = NULL; @@ -109,7 +117,9 @@ static int MMCCStatus(void *pData, SConnection *pCon){ return HWFault; } - status = self->slaves[0]->CheckCountStatus(self->slaveData[0],pCon); + controlMonitor = GetControlMonitor((pCounter)pCount); + pCountController = (pCounter)self->slaveData[controlMonitor]; + status = self->slaves[controlMonitor]->CheckCountStatus(pCountController,pCon); if(status == HWIdle || status == HWFault){ /* stop counting on slaves when finished or when an error @@ -200,7 +210,8 @@ static void loadCountData(pCounter pCount, const char *data){ pPtr = (char *)data; pPtr = getNextMMCCNumber(pPtr,pNumber); - pCount->pDriv->fTime = atof(pNumber); + // SICS-195 get time from controlling monitor + // pCount->pDriv->fTime = atof(pNumber); while(pPtr != NULL && i < MAXCOUNT){ pPtr = getNextMMCCNumber(pPtr,pNumber); pCount->pDriv->lCounts[i] = atoi(pNumber); @@ -212,14 +223,18 @@ static int MMCCTransfer(void *pData, SConnection *pCon){ int i, retVal = OKOK, status; char pBueffel[132]; pCounter pCount = NULL; + pCounter pCountController = NULL; pMultiCounter self = NULL; int tclStatus; + int controlMonitor; pCount = (pCounter)pData; if(pCount != NULL){ self = (pMultiCounter)pCount->pDriv->pData; } assert(self); + controlMonitor = GetControlMonitor(pCount); + pCountController = (pCounter)self->slaveData[controlMonitor]; for(i = 0; i < self->nSlaves; i++){ status = self->slaves[i]->TransferData(self->slaveData[i], pCon); @@ -230,6 +245,7 @@ static int MMCCTransfer(void *pData, SConnection *pCon){ SCWrite(pCon,pBueffel,eWarning); } } + pCount->pDriv->fTime = pCountController->pDriv->fTime; if(self->transferScript != NULL){ MacroPush(pCon); tclStatus = Tcl_Eval(InterpGetTcl(pServ->pSics), self->transferScript); @@ -364,7 +380,31 @@ int MakeMultiCounter(SConnection *pCon, SicsInterp *pSics, memset(pDriv,0,sizeof(CounterDriver)); pDriv->pData = self; pDriv->KillPrivate = KillMultiDriver; - pDriv->iNoOfMonitors = MAXCOUNT; + + /* + now loop through the remaining arguments, thereby entering them into + the slave list. + */ + for(i = 2, self->nSlaves = 0; i < argc; i++){ + pCom = FindCommand(pSics,argv[i]); + if(!pCom){ + sprintf(pBueffel,"ERROR: object %s not found in MakeMultiCounter", + argv[i]); + SCWrite(pCon,pBueffel,eError); + continue; + } + pCount = GetCountableInterface(pCom->pData); + if(!pCount){ + sprintf(pBueffel,"ERROR: object %s is NOT countable", + argv[i]); + SCWrite(pCon,pBueffel,eError); + continue; + } + self->slaves[self->nSlaves] = pCount; + self->slaveData[self->nSlaves] = pCom->pData; + self->nSlaves++; + } + pDriv->iNoOfMonitors = self->nSlaves; pNew = CreateCounter(argv[1],pDriv); if(pNew == NULL){ SCWrite(pCon,"ERROR: out of memory in MakeMultiCounter",eError); @@ -388,30 +428,6 @@ int MakeMultiCounter(SConnection *pCon, SicsInterp *pSics, pNew->pCountInt->TransferData = MMCCTransfer; pNew->pCountInt->SetCountParameters = MMCCParameter; - /* - now loop through the remaining arguments, thereby entering them into - the slave list. - */ - for(i = 2; i < argc; i++){ - pCom = FindCommand(pSics,argv[i]); - if(!pCom){ - sprintf(pBueffel,"ERROR: object %s not found in MakeMultiCounter", - argv[i]); - SCWrite(pCon,pBueffel,eError); - continue; - } - pCount = GetCountableInterface(pCom->pData); - if(!pCount){ - sprintf(pBueffel,"ERROR: object %s is NOT countable", - argv[i]); - SCWrite(pCon,pBueffel,eError); - continue; - } - self->slaves[self->nSlaves] = pCount; - self->slaveData[self->nSlaves] = pCom->pData; - self->nSlaves++; - } - /* now install our action command and we are done */ diff --git a/scan.c b/scan.c index e7608356..208cc8fc 100644 --- a/scan.c +++ b/scan.c @@ -2262,6 +2262,7 @@ static int DumpScan(pScanData self, SConnection *pCon) return 0; } self->iChannel = iChannel; + SetControlMonitor((pCounter)self->pCounterData, iChannel); SCSendOK(pCon); return 1; }