28 #include "menuYesNo.h" 32 #define GEN_SIZE_OFFSET 33 #include "lsiRecord.h" 34 #undef GEN_SIZE_OFFSET 37 static void monitor(lsiRecord *);
38 static long readValue(lsiRecord *);
40 static long init_record(
struct dbCommon *pcommon,
int pass)
42 struct lsiRecord *
prec = (
struct lsiRecord *)pcommon;
46 size_t sizv = prec->sizv;
60 recGblInitSimm(pcommon, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
62 pdset = (lsidset *) prec->dset;
64 recGblRecordError(
S_dev_noDSET, prec,
"lsi: init_record");
69 if (pdset->common.number < 5 || !pdset->read_string) {
74 if (pdset->common.init_record) {
75 long status = pdset->common.init_record(pcommon);
82 strcpy(prec->oval, prec->val);
83 prec->olen = prec->len;
90 static long process(
struct dbCommon *pcommon)
92 struct lsiRecord *prec = (
struct lsiRecord *)pcommon;
93 int pact = prec->pact;
94 lsidset *pdset = (lsidset *) prec->dset;
97 if (!pdset || !pdset->read_string) {
103 status = readValue(prec);
104 if (!pact && prec->pact)
108 recGblGetTimeStampSimm(prec, prec->simm, &prec->siol);
120 lsiRecord *prec = (lsiRecord *) paddr->precord;
121 int fieldIndex = dbGetFieldIndex(paddr);
123 if (fieldIndex == lsiRecordVAL) {
124 paddr->pfield = prec->val;
127 else if (fieldIndex == lsiRecordOVAL) {
128 paddr->pfield = prec->oval;
132 errlogPrintf(
"lsiRecord::cvt_dbaddr called for %s.%s\n",
133 prec->name, paddr->pfldDes->name);
137 paddr->no_elements = 1;
140 paddr->field_size = prec->sizv;
144 static long get_array_info(DBADDR *paddr,
long *no_elements,
long *offset)
146 lsiRecord *prec = (lsiRecord *) paddr->precord;
147 int fieldIndex = dbGetFieldIndex(paddr);
149 if (fieldIndex == lsiRecordVAL)
150 *no_elements = prec->len;
151 else if (fieldIndex == lsiRecordOVAL)
152 *no_elements = prec->olen;
162 lsiRecord *prec = (lsiRecord *) paddr->precord;
164 if (nNew >= prec->sizv)
165 nNew = prec->sizv - 1;
172 static long special(DBADDR *paddr,
int after)
174 lsiRecord *prec = (lsiRecord *) paddr->precord;
175 int special_type = paddr->special;
177 if (special_type ==
SPC_MOD && dbGetFieldIndex(paddr) == lsiRecordSIMM) {
179 recGblSaveSimm(prec->sscn, &prec->oldsimm, prec->simm);
181 recGblCheckSimm((dbCommon *)prec, &prec->sscn, prec->oldsimm, prec->simm);
192 prec->len = strlen(prec->val) + 1;
198 static void monitor(lsiRecord *prec)
202 if (prec->len != prec->olen ||
203 memcmp(prec->oval, prec->val, prec->len)) {
205 memcpy(prec->oval, prec->val, prec->len);
208 if (prec->len != prec->olen) {
209 prec->olen = prec->len;
213 if (prec->mpst == menuPost_Always)
215 if (prec->apst == menuPost_Always)
219 db_post_events(prec, prec->val, events);
222 static long readValue(lsiRecord *prec)
224 lsidset *pdset = (lsidset *) prec->dset;
228 status = recGblGetSimm((dbCommon *)prec, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
229 if (status)
return status;
232 switch (prec->simm) {
234 status = pdset->read_string(prec);
239 if (prec->pact || (prec->sdly < 0.)) {
240 status = dbGetLinkLS(&prec->siol, prec->val, prec->sizv, &prec->len);
241 if (status == 0) prec->udf =
FALSE;
244 epicsCallback *pvt = prec->simpvt;
246 pvt = calloc(1,
sizeof(epicsCallback));
249 if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
266 #define initialize NULL 270 #define get_value NULL 274 #define get_units NULL 275 #define get_precision NULL 276 #define get_enum_str NULL 277 #define get_enum_strs NULL 278 #define put_enum_str NULL 279 #define get_graphic_double NULL 280 #define get_control_double NULL 281 #define get_alarm_double NULL
unsigned short epicsUInt16
epicsExportAddress(rset, lsiRSET)
Miscellaneous macro definitions.
#define get_graphic_double
#define get_control_double
LIBCOM_API void * callocMustSucceed(size_t count, size_t size, const char *msg)
A calloc() that never returns NULL.
int errlogPrintf(const char *pFormat,...)
Routines for code that can't continue or return after an error.