diff --git a/devsupApp/src/dbrec.c b/devsupApp/src/dbrec.c index 7802fe5..a35b544 100644 --- a/devsupApp/src/dbrec.c +++ b/devsupApp/src/dbrec.c @@ -125,10 +125,11 @@ static PyObject* pyRecord_setSevr(pyRecord *self, PyObject *args, PyObject *kws) { dbCommon *prec = self->entry.precnode->precord; - static char* names[] = {"sevr", "stat", NULL}; + static char* names[] = {"sevr", "stat", "amsg", NULL}; short sevr = INVALID_ALARM, stat=COMM_ALARM; + const char *amsg = NULL; - if(!PyArg_ParseTupleAndKeywords(args, kws, "|hh", names, &sevr, &stat)) + if(!PyArg_ParseTupleAndKeywords(args, kws, "|hhz", names, &sevr, &stat, &amsg)) return NULL; if(sevrlastEpicsAlarmSev @@ -137,7 +138,13 @@ static PyObject* pyRecord_setSevr(pyRecord *self, PyObject *args, PyObject *kws) PyErr_Format(PyExc_ValueError, "%s: Can't set alarms %d %d", prec->name, sevr, stat); return NULL; } - +// @since 7.0.6 +#ifdef HAS_ALARM_MESSAGE + if(amsg) { + recGblSetSevrMsg(prec, stat, sevr, "%s", amsg); + Py_RETURN_NONE; + } +#endif recGblSetSevr(prec, stat, sevr); Py_RETURN_NONE; } @@ -317,8 +324,9 @@ static PyMethodDef pyRecord_methods[] = { "infos() -> {'name':'value'}\n" "Return a dictionary of all infos for this record."}, {"setSevr", (PyCFunction)pyRecord_setSevr, METH_VARARGS|METH_KEYWORDS, - "setSevr(sevr=INVALID_ALARM, stat=COMM_ALARM)\n" - "Set alarm new alarm severity/status. Record must be locked!"}, + "setSevr(sevr=INVALID_ALARM, stat=COMM_ALARM, amsg=None)\n" + "Set alarm new alarm severity/status. Record must be locked!\n" + "amsg requires EPICS Base >= 7.0.6."}, {"setTime", (PyCFunction)pyRecord_setTime, METH_VARARGS, "Set record timestamp if TSE==-2. Record must be locked!"}, {"scan", (PyCFunction)pyRecord_scan, METH_VARARGS|METH_KEYWORDS, diff --git a/devsupApp/src/devsup/test/test_db.py b/devsupApp/src/devsup/test/test_db.py index 2dc33e0..2c7ea52 100644 --- a/devsupApp/src/devsup/test/test_db.py +++ b/devsupApp/src/devsup/test/test_db.py @@ -163,3 +163,28 @@ def test_increment(self): with rec: self.assertEqual(rec.VAL, 1) self.assertEqual(rec.UDF, 0) + + +class TestAlarm(IOCHelper): + db = """ + record(longin, "rec:alarm:msg") {} + record(longin, "rec:alarm:plain") {} + """ + + def test_set_severity_message(self): + rec = getRecord("rec:alarm:msg") + + with rec: + rec.setSevr(_dbapi.MAJOR_ALARM, _dbapi.HIHI_ALARM, amsg="Meaningful alarm message") + self.assertEqual(rec.NSEV, _dbapi.MAJOR_ALARM) + self.assertEqual(rec.NSTA, _dbapi.HIHI_ALARM) + if _dbapi.epicsver[:4] >= (7, 0, 6, 0): + self.assertEqual(rec.NAMSG, "Meaningful alarm message") + + def test_set_severity_without_message(self): + rec = getRecord("rec:alarm:plain") + + with rec: + rec.setSevr(_dbapi.MAJOR_ALARM, _dbapi.COMM_ALARM) + self.assertEqual(rec.NSEV, _dbapi.MAJOR_ALARM) + self.assertEqual(rec.NSTA, _dbapi.COMM_ALARM)