compress_scalar for average works correctly now

This commit is contained in:
Simon Rose
2022-05-11 14:47:45 +02:00
committed by Michael Davidsaver
parent bf4a4c6b78
commit 11a4bed9aa
3 changed files with 22 additions and 63 deletions

View File

@@ -294,19 +294,13 @@ static int compress_scalar(struct compressRecord *prec,double *psource)
/* for scalars, Median not implemented => use average */
case (compressALG_N_to_1_Average):
case (compressALG_N_to_1_Median):
if (inx == 0)
*pdest = value;
else {
*pdest += value;
if (inx + 1 >= prec->n)
*pdest = *pdest / (inx + 1);
}
*pdest = (inx * (*pdest) + value) / (inx + 1);
break;
}
inx++;
if (inx >= prec->n || prec->pbuf == menuYesNoYES) {
if ((inx >= prec->n) || (prec->pbuf == menuYesNoYES)) {
put_value(prec,pdest,1);
prec->inx = 0;
prec->inx = (inx >= prec->n) ? 0 : inx;
return 0;
} else {
prec->inx = inx;

View File

@@ -361,7 +361,7 @@ writeToWaveform(DBADDR *addr, long count, ...) {
va_end(args);
dbScanLock(addr->precord);
testOk1(dbPut(addr, DBF_DOUBLE, values, count)==0);
testOk1(dbPut(addr, DBR_DOUBLE, values, count)==0);
dbScanUnlock(addr->precord);
}
@@ -443,7 +443,7 @@ testNto1AveragePartial(void) {
testdbPrepare();
testdbReadDatabase("recTestIoc.dbd", NULL, NULL);
recTestIoc_registerRecordDeviceDriver(pdbbase);
testdbReadDatabase("compressTest.db", NULL, "INP=wf,ALG=N to 1 Average,BALG=FIFO Buffer,NSAM=1,N=4,PARTIAL=YES");
testdbReadDatabase("compressTest.db", NULL, "INP=wf,ALG=N to 1 Average,BALG=FIFO Buffer,NSAM=1,N=4,PBUF=YES");
eltc(0);
testIocInitOk();
@@ -553,8 +553,11 @@ testNto1LowValue(void) {
void
testAIPartialAverage(void) {
double buf = 0.0;
double buf = 0.;
double data[4] = {1., 2., 3., 4.};
double expected[4] = {1., 1.5, 2., 2.5};
long nReq = 1;
int i;
DBADDR aiaddr, caddr;
testDiag("Test 'N to 1 Low Value'");
@@ -571,57 +574,19 @@ testAIPartialAverage(void) {
fetchRecordOrDie("ai", aiaddr);
fetchRecordOrDie("comp", caddr);
buf = 1.;
dbScanLock(aiaddr.precord);
dbPut(&aiaddr, DBF_FLOAT, &buf, nReq);
dbScanUnlock(aiaddr.precord);
for (i = 0; i < 4; i++) {
dbScanLock(aiaddr.precord);
testOk1(dbPut(&aiaddr, DBR_DOUBLE, &data[i], 1) == 0);
dbScanUnlock(aiaddr.precord);
dbScanLock(caddr.precord);
dbProcess(caddr.precord);
if (dbGet(&caddr, DBR_DOUBLE, &buf, NULL, &nReq, NULL))
testAbort("dbGet failed on compress record");
dbScanUnlock(caddr.precord);
dbScanLock(caddr.precord);
dbProcess(caddr.precord);
if (dbGet(&caddr, DBR_DOUBLE, &buf, NULL, &nReq, NULL))
testAbort("dbGet failed on compress record");
dbScanUnlock(caddr.precord);
testDEq(buf, 1., 0.01);
buf = 2.;
dbScanLock(aiaddr.precord);
dbPut(&aiaddr, DBF_FLOAT, &buf, nReq);
dbScanUnlock(aiaddr.precord);
dbScanLock(caddr.precord);
dbProcess(caddr.precord);
if (dbGet(&caddr, DBR_DOUBLE, &buf, NULL, &nReq, NULL))
testAbort("dbGet failed on compress record");
testDEq(buf, 1.5, 0.01);
dbScanUnlock(caddr.precord);
buf = 3.;
dbScanLock(aiaddr.precord);
dbPut(&aiaddr, DBF_FLOAT, &buf, nReq);
dbScanUnlock(aiaddr.precord);
dbScanLock(caddr.precord);
dbProcess(caddr.precord);
if (dbGet(&caddr, DBR_DOUBLE, &buf, NULL, &nReq, NULL))
testAbort("dbGet failed on compress record");
testDEq(buf, 2., 0.01);
dbScanUnlock(caddr.precord);
buf = 4.;
dbScanLock(aiaddr.precord);
dbPut(&aiaddr, DBF_FLOAT, &buf, nReq);
dbScanUnlock(aiaddr.precord);
dbScanLock(caddr.precord);
dbProcess(caddr.precord);
if (dbGet(&caddr, DBR_DOUBLE, &buf, NULL, &nReq, NULL))
testAbort("dbGet failed on compress record");
testDEq(buf, 2.5, 0.01);
dbScanUnlock(caddr.precord);
testDEq(buf, expected[i], 0.01);
}
testIocShutdownOk();
testdbCleanup();
@@ -629,7 +594,7 @@ testAIPartialAverage(void) {
MAIN(compressTest)
{
testPlan(138);
testPlan(142);
testFIFOCirc();
testLIFOCirc();
testNto1Average();

View File

@@ -6,7 +6,7 @@ record(waveform, "wf") {
record(compress, "comp") {
field(INP, "$(INP) NPP")
field(ALG, "$(ALG)")
field(PBUF,"$(PARTIAL=NO)")
field(PBUF,"$(PBUF=NO)")
field(BALG,"$(BALG)")
field(NSAM,"$(NSAM)")
field(N, "$(N=1)")