SICS-195
countdriv.h CounterDriver: iControlMonitor id (default=0) countdriv.c CreateCounterDriver: set the default control monitor to channel zero counter.h counter.c Commands to get and set the control monitor GetCounts return the counts from the current control monitor, ie iControlMonitor TODO loadCountData, get time from controlling monitor. scan.c Set control monitor on counter when setting scan channel multicounter.c MMCStart, set slave monitors with a timer preset of about a year to make sure that they don't stop before the controlling monitor. r2642 | ffr | 2008-07-10 15:21:21 +1000 (Thu, 10 Jul 2008) | 20 lines
This commit is contained in:
committed by
Douglas Clowes
parent
0f96e4f82f
commit
cff9290272
@@ -62,6 +62,7 @@
|
|||||||
pRes->fPreset = 1000.;
|
pRes->fPreset = 1000.;
|
||||||
pRes->fTime = 0.;
|
pRes->fTime = 0.;
|
||||||
pRes->iNoOfMonitors = 0;
|
pRes->iNoOfMonitors = 0;
|
||||||
|
pRes->iControlMonitor = 0;
|
||||||
pRes->iPause = 0;
|
pRes->iPause = 0;
|
||||||
pRes->Start = NULL;
|
pRes->Start = NULL;
|
||||||
pRes->GetStatus = NULL;
|
pRes->GetStatus = NULL;
|
||||||
|
|||||||
@@ -42,6 +42,7 @@
|
|||||||
float fLastCurrent;
|
float fLastCurrent;
|
||||||
float fTime;
|
float fTime;
|
||||||
int iNoOfMonitors;
|
int iNoOfMonitors;
|
||||||
|
int iControlMonitor;
|
||||||
long lCounts[MAXCOUNT];
|
long lCounts[MAXCOUNT];
|
||||||
int iPause;
|
int iPause;
|
||||||
int iErrorCode;
|
int iErrorCode;
|
||||||
|
|||||||
34
counter.c
34
counter.c
@@ -609,6 +609,17 @@
|
|||||||
assert(self);
|
assert(self);
|
||||||
return self->pDriv->iNoOfMonitors;
|
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
|
#ifdef NONINTF
|
||||||
extern float nintf(float f);
|
extern float nintf(float f);
|
||||||
#endif
|
#endif
|
||||||
@@ -660,7 +671,7 @@
|
|||||||
{
|
{
|
||||||
self->pCountInt->TransferData(self,pCon);
|
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)
|
long GetMonitor(pCounter self, int iNum, SConnection *pCon)
|
||||||
@@ -671,7 +682,7 @@
|
|||||||
{
|
{
|
||||||
self->pCountInt->TransferData(self,pCon);
|
self->pCountInt->TransferData(self,pCon);
|
||||||
}
|
}
|
||||||
if( (iNum < 0) || (iNum > self->pDriv->iNoOfMonitors) )
|
if( (iNum < 0) || (iNum >= self->pDriv->iNoOfMonitors) )
|
||||||
{
|
{
|
||||||
return -1L;
|
return -1L;
|
||||||
}
|
}
|
||||||
@@ -780,7 +791,9 @@
|
|||||||
{"send",0,{0,0}},
|
{"send",0,{0,0}},
|
||||||
{"setpar",3,{FUPATEXT,FUPAINT,FUPAFLOAT}},
|
{"setpar",3,{FUPATEXT,FUPAINT,FUPAFLOAT}},
|
||||||
{"getpar",2,{FUPATEXT,FUPAOPT}},
|
{"getpar",2,{FUPATEXT,FUPAOPT}},
|
||||||
{"getnmon",0,{0,0}}
|
{"getnmon",0,{0,0}},
|
||||||
|
{"getchannel",0,{0}},
|
||||||
|
{"setchannel",1,{FUPAINT}}
|
||||||
};
|
};
|
||||||
char *pMode[] = {
|
char *pMode[] = {
|
||||||
"timer",
|
"timer",
|
||||||
@@ -796,7 +809,7 @@
|
|||||||
/* parse function args */
|
/* parse function args */
|
||||||
argtolower(argc,argv);
|
argtolower(argc,argv);
|
||||||
argx = &argv[1];
|
argx = &argv[1];
|
||||||
iRet = EvaluateFuPa((pFuncTemplate)&ActionTemplate,23,argc-1,argx,&PaRes);
|
iRet = EvaluateFuPa((pFuncTemplate)&ActionTemplate,25,argc-1,argx,&PaRes);
|
||||||
if(iRet < 0)
|
if(iRet < 0)
|
||||||
{
|
{
|
||||||
sprintf(pBueffel,"%s",PaRes.pError);
|
sprintf(pBueffel,"%s",PaRes.pError);
|
||||||
@@ -1140,6 +1153,19 @@
|
|||||||
SCWrite(pCon,pBueffel,eValue);
|
SCWrite(pCon,pBueffel,eValue);
|
||||||
return 1;
|
return 1;
|
||||||
break;
|
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:
|
default:
|
||||||
assert(0); /* internal error */
|
assert(0); /* internal error */
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,6 +42,8 @@
|
|||||||
long GetCounts(pCounter self, SConnection *pCon);
|
long GetCounts(pCounter self, SConnection *pCon);
|
||||||
long GetMonitor(pCounter self, int iNum, SConnection *pCon);
|
long GetMonitor(pCounter self, int iNum, SConnection *pCon);
|
||||||
int GetNMonitor(pCounter self);
|
int GetNMonitor(pCounter self);
|
||||||
|
int GetControlMonitor(pCounter self);
|
||||||
|
int SetControlMonitor(pCounter self, int channel);
|
||||||
void SetMonitorValue(pCounter self, int index, long value);
|
void SetMonitorValue(pCounter self, int index, long value);
|
||||||
float GetCountTime(pCounter self, SConnection *pCon);
|
float GetCountTime(pCounter self, SConnection *pCon);
|
||||||
|
|
||||||
|
|||||||
@@ -67,19 +67,26 @@ static int MMCCHalt(void *pData){
|
|||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
static int MMCCStart(void *pData, SConnection *pCon)
|
static int MMCCStart(void *pData, SConnection *pCon)
|
||||||
{
|
{
|
||||||
int i, status;
|
int i, status, controlMonitor;
|
||||||
|
int oneYear=32000000;
|
||||||
pCounter pCount = NULL;
|
pCounter pCount = NULL;
|
||||||
pMultiCounter self = NULL;
|
pMultiCounter self = NULL;
|
||||||
|
char buffer[128];
|
||||||
|
|
||||||
pCount = (pCounter)pData;
|
pCount = (pCounter)pData;
|
||||||
if(pCount != NULL){
|
if(pCount != NULL){
|
||||||
self = (pMultiCounter)pCount->pDriv->pData;
|
self = (pMultiCounter)pCount->pDriv->pData;
|
||||||
}
|
}
|
||||||
assert(self);
|
assert(self);
|
||||||
|
controlMonitor = GetControlMonitor((pCounter)pCount);
|
||||||
for(i = 0; i < self->nSlaves; i++){
|
for(i = 0; i < self->nSlaves; i++){
|
||||||
|
if (i == controlMonitor) {
|
||||||
self->slaves[i]->SetCountParameters(self->slaveData[i],
|
self->slaves[i]->SetCountParameters(self->slaveData[i],
|
||||||
pCount->pDriv->fPreset, pCount->pDriv->eMode);
|
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);
|
status = self->slaves[i]->StartCount(self->slaveData[i],pCon);
|
||||||
if(status != OKOK){
|
if(status != OKOK){
|
||||||
MMCCHalt(pData);
|
MMCCHalt(pData);
|
||||||
@@ -93,7 +100,8 @@ static int MMCCStart(void *pData, SConnection *pCon)
|
|||||||
}
|
}
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
static int MMCCStatus(void *pData, SConnection *pCon){
|
static int MMCCStatus(void *pData, SConnection *pCon){
|
||||||
int status,i;
|
int status,i, controlMonitor;
|
||||||
|
pCounter pCountController = NULL;
|
||||||
pCounter pCount = NULL;
|
pCounter pCount = NULL;
|
||||||
pMultiCounter self = NULL;
|
pMultiCounter self = NULL;
|
||||||
pDummy pDum = NULL;
|
pDummy pDum = NULL;
|
||||||
@@ -109,7 +117,9 @@ static int MMCCStatus(void *pData, SConnection *pCon){
|
|||||||
return HWFault;
|
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){
|
if(status == HWIdle || status == HWFault){
|
||||||
/*
|
/*
|
||||||
stop counting on slaves when finished or when an error
|
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 = (char *)data;
|
||||||
pPtr = getNextMMCCNumber(pPtr,pNumber);
|
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){
|
while(pPtr != NULL && i < MAXCOUNT){
|
||||||
pPtr = getNextMMCCNumber(pPtr,pNumber);
|
pPtr = getNextMMCCNumber(pPtr,pNumber);
|
||||||
pCount->pDriv->lCounts[i] = atoi(pNumber);
|
pCount->pDriv->lCounts[i] = atoi(pNumber);
|
||||||
@@ -212,14 +223,18 @@ static int MMCCTransfer(void *pData, SConnection *pCon){
|
|||||||
int i, retVal = OKOK, status;
|
int i, retVal = OKOK, status;
|
||||||
char pBueffel[132];
|
char pBueffel[132];
|
||||||
pCounter pCount = NULL;
|
pCounter pCount = NULL;
|
||||||
|
pCounter pCountController = NULL;
|
||||||
pMultiCounter self = NULL;
|
pMultiCounter self = NULL;
|
||||||
int tclStatus;
|
int tclStatus;
|
||||||
|
int controlMonitor;
|
||||||
|
|
||||||
pCount = (pCounter)pData;
|
pCount = (pCounter)pData;
|
||||||
if(pCount != NULL){
|
if(pCount != NULL){
|
||||||
self = (pMultiCounter)pCount->pDriv->pData;
|
self = (pMultiCounter)pCount->pDriv->pData;
|
||||||
}
|
}
|
||||||
assert(self);
|
assert(self);
|
||||||
|
controlMonitor = GetControlMonitor(pCount);
|
||||||
|
pCountController = (pCounter)self->slaveData[controlMonitor];
|
||||||
|
|
||||||
for(i = 0; i < self->nSlaves; i++){
|
for(i = 0; i < self->nSlaves; i++){
|
||||||
status = self->slaves[i]->TransferData(self->slaveData[i], pCon);
|
status = self->slaves[i]->TransferData(self->slaveData[i], pCon);
|
||||||
@@ -230,6 +245,7 @@ static int MMCCTransfer(void *pData, SConnection *pCon){
|
|||||||
SCWrite(pCon,pBueffel,eWarning);
|
SCWrite(pCon,pBueffel,eWarning);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pCount->pDriv->fTime = pCountController->pDriv->fTime;
|
||||||
if(self->transferScript != NULL){
|
if(self->transferScript != NULL){
|
||||||
MacroPush(pCon);
|
MacroPush(pCon);
|
||||||
tclStatus = Tcl_Eval(InterpGetTcl(pServ->pSics), self->transferScript);
|
tclStatus = Tcl_Eval(InterpGetTcl(pServ->pSics), self->transferScript);
|
||||||
@@ -364,7 +380,31 @@ int MakeMultiCounter(SConnection *pCon, SicsInterp *pSics,
|
|||||||
memset(pDriv,0,sizeof(CounterDriver));
|
memset(pDriv,0,sizeof(CounterDriver));
|
||||||
pDriv->pData = self;
|
pDriv->pData = self;
|
||||||
pDriv->KillPrivate = KillMultiDriver;
|
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);
|
pNew = CreateCounter(argv[1],pDriv);
|
||||||
if(pNew == NULL){
|
if(pNew == NULL){
|
||||||
SCWrite(pCon,"ERROR: out of memory in MakeMultiCounter",eError);
|
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->TransferData = MMCCTransfer;
|
||||||
pNew->pCountInt->SetCountParameters = MMCCParameter;
|
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
|
now install our action command and we are done
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user