Files
epics-base/modules/database/test/std/rec/mbbiTest.c
T
Edmund Blomley c9817fa591 Add AFTC flag for bi record and fix mbbi AFTC bug (#817)
* Add AFTC feature to bi record with tests.

* Fix broken AFTC handling for mbbi record, also fix bug in COSV and LALM handling.

* Add release notes and update record docs.
2026-04-01 11:53:39 -05:00

202 lines
8.1 KiB
C

/*************************************************************************\
* Copyright (c) 2026 Edmund Blomley
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#include "dbUnitTest.h"
#include "testMain.h"
#include "errlog.h"
#include "dbAccess.h"
#include "menuAlarmSevr.h"
#include "menuScan.h"
void recTestIoc_registerRecordDeviceDriver(struct dbBase *);
static void test_soft_input(void){
/* set soft channel */
testdbPutFieldOk("test_mbbi_rec.DTYP", DBF_STRING, "Soft Channel");
testdbPutFieldOk("test_mbbi_rec.INP", DBF_STRING, "test_mbbi_link_rec.VAL");
testdbPutFieldOk("test_mbbi_link_rec.FLNK", DBF_STRING, "test_mbbi_rec");
/* set VAL to on linked record */
testdbPutFieldOk("test_mbbi_link_rec.VAL", DBF_SHORT, 1);
/* verify that this record VAL is updated but RVAL is not */
testdbGetFieldEqual("test_mbbi_rec.VAL", DBF_SHORT, 1);
testdbGetFieldEqual("test_mbbi_rec.RVAL", DBF_SHORT, 0);
// number of tests = 6
}
static void test_operator_display(void){
/* set operator display parameters */
testdbPutFieldOk("test_mbbi_rec.ZRST", DBF_STRING, "ZRST_TEST");
testdbPutFieldOk("test_mbbi_rec.ONST", DBF_STRING, "ONST_TEST");
testdbPutFieldOk("test_mbbi_rec.TWST", DBF_STRING, "TWST_TEST");
testdbPutFieldOk("test_mbbi_rec.THST", DBF_STRING, "THST_TEST");
testdbPutFieldOk("test_mbbi_rec.FRST", DBF_STRING, "FRST_TEST");
testdbPutFieldOk("test_mbbi_rec.FVST", DBF_STRING, "FVST_TEST");
testdbPutFieldOk("test_mbbi_rec.SXST", DBF_STRING, "SXST_TEST");
testdbPutFieldOk("test_mbbi_rec.SVST", DBF_STRING, "SVST_TEST");
testdbPutFieldOk("test_mbbi_rec.EIST", DBF_STRING, "EIST_TEST");
testdbPutFieldOk("test_mbbi_rec.NIST", DBF_STRING, "NIST_TEST");
testdbPutFieldOk("test_mbbi_rec.TEST", DBF_STRING, "TEST_TEST");
testdbPutFieldOk("test_mbbi_rec.ELST", DBF_STRING, "ELST_TEST");
testdbPutFieldOk("test_mbbi_rec.TVST", DBF_STRING, "TVST_TEST");
testdbPutFieldOk("test_mbbi_rec.TTST", DBF_STRING, "TTST_TEST");
testdbPutFieldOk("test_mbbi_rec.FTST", DBF_STRING, "FTST_TEST");
testdbPutFieldOk("test_mbbi_rec.FFST", DBF_STRING, "FFST_TEST");
testdbPutFieldOk("test_mbbi_rec.DESC", DBF_STRING, "DESC_TEST");
/* verify operator display parameters */
testdbGetFieldEqual("test_mbbi_rec.ZRST", DBF_STRING, "ZRST_TEST");
testdbGetFieldEqual("test_mbbi_rec.ONST", DBF_STRING, "ONST_TEST");
testdbGetFieldEqual("test_mbbi_rec.TWST", DBF_STRING, "TWST_TEST");
testdbGetFieldEqual("test_mbbi_rec.THST", DBF_STRING, "THST_TEST");
testdbGetFieldEqual("test_mbbi_rec.FRST", DBF_STRING, "FRST_TEST");
testdbGetFieldEqual("test_mbbi_rec.FVST", DBF_STRING, "FVST_TEST");
testdbGetFieldEqual("test_mbbi_rec.SXST", DBF_STRING, "SXST_TEST");
testdbGetFieldEqual("test_mbbi_rec.SVST", DBF_STRING, "SVST_TEST");
testdbGetFieldEqual("test_mbbi_rec.EIST", DBF_STRING, "EIST_TEST");
testdbGetFieldEqual("test_mbbi_rec.NIST", DBF_STRING, "NIST_TEST");
testdbGetFieldEqual("test_mbbi_rec.TEST", DBF_STRING, "TEST_TEST");
testdbGetFieldEqual("test_mbbi_rec.ELST", DBF_STRING, "ELST_TEST");
testdbGetFieldEqual("test_mbbi_rec.TVST", DBF_STRING, "TVST_TEST");
testdbGetFieldEqual("test_mbbi_rec.TTST", DBF_STRING, "TTST_TEST");
testdbGetFieldEqual("test_mbbi_rec.FTST", DBF_STRING, "FTST_TEST");
testdbGetFieldEqual("test_mbbi_rec.FFST", DBF_STRING, "FFST_TEST");
testdbGetFieldEqual("test_mbbi_rec.NAME", DBF_STRING, "test_mbbi_rec");
testdbGetFieldEqual("test_mbbi_rec.DESC", DBF_STRING, "DESC_TEST");
/* verify conversion */
testdbPutFieldOk("test_mbbi_link_rec.VAL", DBF_SHORT, 1);
testdbGetFieldEqual("test_mbbi_rec.VAL", DBF_STRING, "ONST_TEST");
testdbPutFieldOk("test_mbbi_link_rec.VAL", DBF_SHORT, 0);
testdbGetFieldEqual("test_mbbi_rec.VAL", DBF_STRING, "ZRST_TEST");
// number of tests = 39
}
static void test_alarm(void){
/* set soft channel */
testdbPutFieldOk("test_mbbi_rec.DTYP", DBF_STRING, "Soft Channel");
testdbPutFieldOk("test_mbbi_rec.INP", DBF_STRING, "test_mbbi_link_rec.VAL");
testdbPutFieldOk("test_mbbi_link_rec.FLNK", DBF_STRING, "test_mbbi_rec");
testdbPutFieldOk("test_mbbi_rec.ZRST", DBF_STRING, "ZRST_TEST");
testdbPutFieldOk("test_mbbi_rec.ONST", DBF_STRING, "ONST_TEST");
testdbPutFieldOk("test_mbbi_rec.ZRVL", DBF_STRING, "0");
testdbPutFieldOk("test_mbbi_rec.ONVL", DBF_STRING, "1");
/* set start VAL to 0*/
testdbPutFieldOk("test_mbbi_link_rec.VAL", DBF_SHORT, 0);
/* set alarm parameters */
testdbPutFieldOk("test_mbbi_rec.ZRSV", DBF_SHORT, menuAlarmSevrNO_ALARM);
testdbPutFieldOk("test_mbbi_rec.ONSV", DBF_SHORT, menuAlarmSevrMINOR);
testdbPutFieldOk("test_mbbi_rec.COSV", DBF_SHORT, menuAlarmSevrINVALID);
/* verify alarm status is NO_ALARM*/
testdbGetFieldEqual("test_mbbi_rec.SEVR", DBF_SHORT, menuAlarmSevrNO_ALARM);
/* set ZRSV to MAJOR and verify that SEVR is now MAJOR */
testdbPutFieldOk("test_mbbi_rec.ZRSV", DBF_SHORT, menuAlarmSevrMAJOR);
testdbGetFieldEqual("test_mbbi_rec.SEVR", DBF_SHORT, menuAlarmSevrMAJOR);
/* set VAL to 1 on linked record and verify that COSV now sets the SEVR to INVALID */
testdbPutFieldOk("test_mbbi_link_rec.VAL", DBF_SHORT, 1);
testdbGetFieldEqual("test_mbbi_rec.SEVR", DBF_SHORT, menuAlarmSevrINVALID);
/* verify LAML */
testdbGetFieldEqual("test_mbbi_rec.LALM", DBF_SHORT, 1);
// number of tests = 17
}
static void test_aftc(void){
const double aftc = 3.0;
testMonitor* test_mon = NULL;
epicsTimeStamp startTime;
epicsTimeStamp endTime;
double diffTime = 0;
/* set soft channel */
testdbPutFieldOk("test_mbbi_rec2.DTYP", DBF_STRING, "Soft Channel");
testdbPutFieldOk("test_mbbi_rec2.INP", DBF_STRING, "test_mbbi_link_rec2.VAL");
testdbPutFieldOk("test_mbbi_link_rec2.FLNK", DBF_STRING, "test_mbbi_rec2");
/* set alarm parameters */
testdbPutFieldOk("test_mbbi_rec2.ZRSV", DBF_SHORT, menuAlarmSevrMINOR);
testdbPutFieldOk("test_mbbi_rec2.ONSV", DBF_SHORT, menuAlarmSevrMAJOR);
/* set start VAL to FALSE (NO_ALARM) */
testdbPutFieldOk("test_mbbi_link_rec2.VAL", DBF_SHORT, FALSE);
/* test AFTC using a monitor and time stamps */
testdbPutFieldOk("test_mbbi_rec2.AFTC", DBF_DOUBLE, aftc);
testdbPutFieldOk("test_mbbi_rec2.SCAN", DBF_SHORT, menuScan_1_second);
/* set VAL to TRUE (MAJOR alarm) */
testdbPutFieldOk("test_mbbi_link_rec2.VAL", DBF_SHORT, TRUE);
/* Create test monitor for alarm SEVR */
test_mon = testMonitorCreate("test_mbbi_rec2.VAL", DBE_ALARM, 0);
/* Get start time */
epicsTimeGetCurrent(&startTime);
/* wait for monitor to trigger on the new alarm status */
testMonitorWait(test_mon);
epicsTimeGetCurrent(&endTime);
/* Verify that alarm status is now MAJOR */
testdbGetFieldEqual("test_mbbi_rec2.SEVR", DBF_SHORT, menuAlarmSevrMAJOR);
/* set VAL back to FALSE (NO_ALARM) */
testdbPutFieldOk("test_mbbi_link_rec2.VAL", DBF_SHORT, FALSE);
/* Create test monitor for alarm SEVR */
test_mon = testMonitorCreate("test_mbbi_rec2.VAL", DBE_ALARM, 0);
/* Get start time */
epicsTimeGetCurrent(&startTime);
/* wait for monitor to trigger on the new alarm status */
testMonitorWait(test_mon);
epicsTimeGetCurrent(&endTime);
/* Verify that alarm status is now NO_ALARM */
testdbGetFieldEqual("test_mbbi_rec2.SEVR", DBF_SHORT, menuAlarmSevrMINOR);
/* Verify that time is at least equal to configured aftc */
diffTime = epicsTimeDiffInSeconds(&endTime, &startTime);
testOk(diffTime >= aftc, "AFTC time %lf", diffTime);
// number of tests = 13
}
MAIN(mbbiTest) {
testPlan(6+39+17+13);
testdbPrepare();
testdbReadDatabase("recTestIoc.dbd", NULL, NULL);
recTestIoc_registerRecordDeviceDriver(pdbbase);
testdbReadDatabase("mbbiTest.db", NULL, NULL);
eltc(0);
testIocInitOk();
eltc(1);
test_soft_input();
test_operator_display();
test_alarm();
test_aftc();
testIocShutdownOk();
testdbCleanup();
return testDone();
}