Allow use any breaktable (no need to be in menuConvert)

This commit is contained in:
Anders Sandstrom
2021-01-26 16:08:36 +01:00
parent 87c8084ae0
commit 96d66df11b
3 changed files with 24 additions and 27 deletions

View File

@@ -177,7 +177,7 @@ Example: Rate = 100Hz
#### BREAKTABLE (default: no break table)
Note: The break table must be added in EPICS and to "menuConvert"
Note: The break table must be added in EPICS
Example: Apply BREAKTABLE=typeTelemess33020_21877 to raw value
```
@@ -187,7 +187,6 @@ Example: Apply BREAKTABLE=typeTelemess33020_21877 to raw value
Example: Load custom breaktable in EPICS
```
dbLoadRecords ./bptBreakTable.dbd
updateMenuConvert
```
Example: breaktable (in a bptBreakTable.dbd)

View File

@@ -119,10 +119,8 @@ ecmcFFT::ecmcFFT(int fftIndex, // index of this object (if several is cr
cycleCounter_ = 0;
ignoreCycles_ = 0;
dataSourceLinked_ = 0;
breakTableIndex_ = -1;
breakTable_ = 0;
breakTable_ = NULL;
lastBreakPoint_ = 0;
breakInit_ = 1;
// Asyn
asynEnableId_ = -1; // Enable/disable acq./calcs
@@ -457,13 +455,13 @@ void ecmcFFT::addDataToBuffer(double data) {
if(rawDataBuffer_ && (elementsInBuffer_ < cfgNfft_) ) {
if(breakTableIndex_>=0 && cfgBreakTableStr_ && interruptAccept) {
double breakData = data;
if (cvtRawToEngBpt(&breakData, breakTableIndex_, breakInit_, &breakTable_, &lastBreakPoint_)!=0) {
if( cfgBreakTableStr_ && interruptAccept ) {
double breakData = data;
// Supply a breaktable (init=0, LINR must be > 1 but only used if init > 0)
if (cvtRawToEngBpt(&breakData, 2, 0, &breakTable_, &lastBreakPoint_)!=0) {
//TODO: What does status here mean..
//throw std::runtime_error("Breaktable conversion failed.\n");
}
breakInit_ = 0; // Breack pointer should now be assigned
//printf("Index %d: Before %lf, after %lf\n",objectId_,data,breakData);
data = breakData * cfgScale_;
} else {
@@ -1102,23 +1100,25 @@ int ecmcFFT::leastSquare(int n, const double y[], double* k, double* m){
}
bool ecmcFFT::verifyBreakTable() {
breakTableIndex_ = -1;
dbMenu *menuConvert;
ELLLIST missing;
int i;
brkTable *pbrkTable;
bool found = false;
menuConvert = dbFindMenu(pdbbase,"menuConvert");
ellInit(&missing);
for(i=0; i<menuConvert->nChoice; i++)
{
// printf("menuConvertItem[%d] %s (looking for %s))\n",i,menuConvert->papChoiceValue[i], cfgBreakTableStr_);
if (strcmp(menuConvert->papChoiceValue[i],cfgBreakTableStr_)==0)
{
breakTableIndex_ = i;
printf("breakTable %s found as menuItem %d\n",cfgBreakTableStr_, breakTableIndex_);
break;
}
for(pbrkTable = (brkTable *)ellFirst(&pdbbase->bptList);
pbrkTable;
pbrkTable = (brkTable *)ellNext(&pbrkTable->node)){
if (strcmp(cfgBreakTableStr_,pbrkTable->name)==0)
{
found = true;
breakTable_ = pbrkTable;
break;
}
}
return breakTableIndex_>=0;
if(!found) {
breakTable_ = NULL;
throw std::out_of_range("Breaktable not found...");
}
return found;
}

View File

@@ -92,10 +92,8 @@ class ecmcFFT : public asynPortDriver {
int triggOnce_;
int cycleCounter_;
int ignoreCycles_;
int breakTableIndex_;
void *breakTable_;
short lastBreakPoint_;
short breakInit_;
double scale_; // Config: Data set size
FFT_STATUS status_; // Status/state (NO_STAT, IDLE, ACQ, CALC)