From 11a4bed9aa6007f3c8617e2eaeac155b30f02dae Mon Sep 17 00:00:00 2001 From: Simon Rose Date: Wed, 11 May 2022 14:47:45 +0200 Subject: [PATCH] compress_scalar for average works correctly now --- modules/database/src/std/rec/compressRecord.c | 12 +--- modules/database/test/std/rec/compressTest.c | 71 +++++-------------- modules/database/test/std/rec/compressTest.db | 2 +- 3 files changed, 22 insertions(+), 63 deletions(-) diff --git a/modules/database/src/std/rec/compressRecord.c b/modules/database/src/std/rec/compressRecord.c index 7a6e83b4f..b96bcc4aa 100644 --- a/modules/database/src/std/rec/compressRecord.c +++ b/modules/database/src/std/rec/compressRecord.c @@ -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; diff --git a/modules/database/test/std/rec/compressTest.c b/modules/database/test/std/rec/compressTest.c index 3943ee5d8..3a9a4a8d2 100644 --- a/modules/database/test/std/rec/compressTest.c +++ b/modules/database/test/std/rec/compressTest.c @@ -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(); diff --git a/modules/database/test/std/rec/compressTest.db b/modules/database/test/std/rec/compressTest.db index 91f7c16ce..2249171f9 100644 --- a/modules/database/test/std/rec/compressTest.db +++ b/modules/database/test/std/rec/compressTest.db @@ -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)")