32 #include "menuYesNo.h" 36 #define GEN_SIZE_OFFSET 37 #include "lsoRecord.h" 38 #undef GEN_SIZE_OFFSET 41 static void monitor(lsoRecord *);
42 static long writeValue(lsoRecord *);
44 static long init_record(
struct dbCommon *pcommon,
int pass)
46 struct lsoRecord *
prec = (
struct lsoRecord *)pcommon;
50 size_t sizv = prec->sizv;
64 recGblInitSimm(pcommon, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
66 pdset = (lsodset *) prec->dset;
68 recGblRecordError(
S_dev_noDSET, prec,
"lso: init_record");
73 if (pdset->common.number < 5 || !pdset->write_string) {
78 dbLoadLinkLS(&prec->dol, prec->val, prec->sizv, &prec->len);
80 if (pdset->common.init_record) {
81 long status = pdset->common.init_record(pcommon);
88 strcpy(prec->oval, prec->val);
89 prec->olen = prec->len;
96 static long process(
struct dbCommon *pcommon)
98 struct lsoRecord *prec = (
struct lsoRecord *)pcommon;
99 int pact = prec->pact;
100 lsodset *pdset = (lsodset *) prec->dset;
103 if (!pdset || !pdset->write_string) {
109 if (!pact && prec->omsl == menuOmslclosed_loop)
110 if (!dbGetLinkLS(&prec->dol, prec->val, prec->sizv, &prec->len))
117 status = writeValue(prec);
119 switch (prec->ivoa) {
120 case menuIvoaContinue_normally:
121 status = writeValue(prec);
124 case menuIvoaDon_t_drive_outputs:
127 case menuIvoaSet_output_to_IVOV:
129 size_t size = prec->sizv - 1;
131 strncpy(prec->val, prec->ivov, size);
133 prec->len = strlen(prec->val) + 1;
135 status = writeValue(prec);
140 recGblRecordError(S_db_badField, prec,
141 "lso:process Bad IVOA choice");
146 if (!pact && prec->pact)
150 recGblGetTimeStampSimm(prec, prec->simm,
NULL);
162 lsoRecord *prec = (lsoRecord *) paddr->precord;
163 int fieldIndex = dbGetFieldIndex(paddr);
165 if (fieldIndex == lsoRecordVAL) {
166 paddr->pfield = prec->val;
169 else if (fieldIndex == lsoRecordOVAL) {
170 paddr->pfield = prec->oval;
174 errlogPrintf(
"lsoRecord::cvt_dbaddr called for %s.%s\n",
175 prec->name, paddr->pfldDes->name);
179 paddr->no_elements = 1;
182 paddr->field_size = prec->sizv;
186 static long get_array_info(DBADDR *paddr,
long *no_elements,
long *offset)
188 lsoRecord *prec = (lsoRecord *) paddr->precord;
189 int fieldIndex = dbGetFieldIndex(paddr);
191 if (fieldIndex == lsoRecordVAL)
192 *no_elements = prec->len;
193 else if (fieldIndex == lsoRecordOVAL)
194 *no_elements = prec->olen;
204 lsoRecord *prec = (lsoRecord *) paddr->precord;
206 if (nNew >= prec->sizv)
207 nNew = prec->sizv - 1;
214 static long special(DBADDR *paddr,
int after)
216 lsoRecord *prec = (lsoRecord *) paddr->precord;
217 int special_type = paddr->special;
219 if (special_type ==
SPC_MOD && dbGetFieldIndex(paddr) == lsoRecordSIMM) {
221 recGblSaveSimm(prec->sscn, &prec->oldsimm, prec->simm);
223 recGblCheckSimm((dbCommon *)prec, &prec->sscn, prec->oldsimm, prec->simm);
234 prec->len = strlen(prec->val) + 1;
240 static void monitor(lsoRecord *prec)
244 if (prec->len != prec->olen ||
245 memcmp(prec->oval, prec->val, prec->len)) {
247 memcpy(prec->oval, prec->val, prec->len);
250 if (prec->len != prec->olen) {
251 prec->olen = prec->len;
255 if (prec->mpst == menuPost_Always)
257 if (prec->apst == menuPost_Always)
261 db_post_events(prec, prec->val, events);
264 static long writeValue(lsoRecord *prec)
266 lsodset *pdset = (lsodset *) prec->dset;
270 status = recGblGetSimm((dbCommon *)prec, &prec->sscn, &prec->oldsimm, &prec->simm, &prec->siml);
271 if (status)
return status;
274 switch (prec->simm) {
276 status = pdset->write_string(prec);
281 if (prec->pact || (prec->sdly < 0.)) {
282 status = dbPutLinkLS(&prec->siol, prec->val, prec->len);
285 epicsCallback *pvt = prec->simpvt;
287 pvt = calloc(1,
sizeof(epicsCallback));
290 if (pvt) callbackRequestProcessCallbackDelayed(pvt, prec->prio, prec, prec->sdly);
307 #define initialize NULL 311 #define get_value NULL 315 #define get_units NULL 316 #define get_precision NULL 317 #define get_enum_str NULL 318 #define get_enum_strs NULL 319 #define put_enum_str NULL 320 #define get_graphic_double NULL 321 #define get_control_double NULL 322 #define get_alarm_double NULL
unsigned short epicsUInt16
Miscellaneous macro definitions.
epicsExportAddress(rset, lsoRSET)
#define get_graphic_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,...)
#define get_control_double
Routines for code that can't continue or return after an error.