19 #include <epicsStdlib.h>
22 #include "epicsTime.h"
36 #define CHN_NAME_LENGTH 32
38 #define CAGET_TIMEOUT 4.0
40 #define MIN_TIMEOUT_COUNT 50
45 char epics_gateway[256];
79 struct exception_handler_args args)
85 pName = ca_name ( args.chid );
91 "%s - with request chan=%s op=%ld data type=%s count=%ld",
92 args.ctx, pName, args.op, dbr_type_to_text ( args.type ), args.count );
109 info = calloc(1,
sizeof(
CA_INFO));
112 cm_get_experiment_database(&hDB, NULL);
118 if (status != DB_SUCCESS)
123 if (status != DB_SUCCESS)
128 setenv(
"EPICS_CA_AUTO_ADDR_LIST",
"NO", 1);
130 setenv(
"EPICS_CA_SERVER_PORT", str, 1);
139 for (i=0; i<channels; i++)
141 db_merge_data(hDB, hKey,
"Channel name",
146 for (i=0; i<channels; i++)
148 db_merge_data(hDB, hKey,
"Demand",
153 for (i=0; i<channels; i++)
155 db_merge_data(hDB, hKey,
"Measured",
160 for (i=0; i<channels; i++)
162 db_merge_data(hDB, hKey,
"Device type",
163 info->
device_type,
sizeof(INT) * channels, channels, TID_INT);
166 SEVCHK(ca_context_create(ca_enable_preemptive_callback),
"ca_context_create");
170 status = ca_task_initialize();
171 if (!(status & CA_M_SUCCESS)) {
172 cm_msg(MERROR,
"psi_epics_init",
"Unable to initialize");
180 for (i = 0; i < channels; i++) {
187 SEVCHK(status,
"ca_create_channel");
188 if (ca_pend_io(5.0) == ECA_TIMEOUT) {
189 cm_msg(MERROR,
"psi_epics_init",
"Cannot connect to EPICS channel %s", info->
demand[i].
name);
202 SEVCHK(status,
"ca_create_channel");
203 if (ca_pend_io(5.0) == ECA_TIMEOUT) {
204 cm_msg(MERROR,
"psi_epics_init",
"Cannot connect to EPICS channel %s", info->
measured[i].
name);
216 strlcat(info->
extra[i].
name,
":COM:2", CHN_NAME_LENGTH);
218 SEVCHK(status,
"ca_create_channel");
219 if (ca_pend_io(5.0) == ECA_TIMEOUT) {
220 cm_msg(MERROR,
"psi_epics_init",
"Cannot connect to EPICS channel %s", info->
extra[i].
name);
230 if (status != ECA_NORMAL)
231 cm_msg(MERROR,
"psi_epics_init",
"Error adding epics exception handler, status = %d", status);
233 cm_msg(MINFO,
"psi_epics_init",
"Successfully added epics exception handler.");
294 status = ca_put(DBR_STRING, info->
demand[channel].
chan_id, value == 1 ?
"OPEN" :
"CLOSE");
297 status = ca_put(DBR_FLOAT, info->
demand[channel].
chan_id, &value);
298 if (status != CA_M_SUCCESS)
299 cm_msg(MERROR,
"psi_epics_set",
"Cannot write to EPICS channel %s", info->
demand[channel].
name);
301 status = ca_put(DBR_SHORT, info->
extra[channel].
chan_id, &d);
304 status = ca_put(DBR_FLOAT, info->
demand[channel].
chan_id, &value);
306 if (status != CA_M_SUCCESS)
307 cm_msg(MERROR,
"psi_epics_set",
"Cannot write to EPICS channel %s", info->
demand[channel].
name);
323 SEVCHK(status,
"ca_get");
327 cm_msg(MINFO,
"psi_epics_get",
"Timeout on EPICS channel %s", info->
measured[channel].
name);
340 *pvalue = (float)ss_nan();
350 SEVCHK(status,
"ca_array_get");
354 cm_msg(MINFO,
"psi_epics_get",
"Timeout on EPICS channel %s", info->
measured[channel].
name);
380 status = ca_get(DBR_STRING, info->
demand[channel].
chan_id, str);
381 SEVCHK(status,
"ca_get");
385 cm_msg(MINFO,
"psi_epics_get",
"Timeout on EPICS channel %s", info->
measured[channel].
name);
389 *pvalue = (str[0] ==
'O') ? 1 : 0;
391 status = ca_get(DBR_FLOAT, info->
demand[channel].
chan_id, pvalue);
392 SEVCHK(status,
"ca_get");
396 cm_msg(MINFO,
"psi_epics_get",
"Timeout on EPICS channel %s", info->
measured[channel].
name);
413 float value, *pvalue;
417 va_start(argptr, cmd);
420 if (cmd == CMD_INIT) {
423 hKey = va_arg(argptr, HNDLE);
424 pinfo = va_arg(argptr,
void *);
425 channel = va_arg(argptr, INT);
426 flags = va_arg(argptr, DWORD);
431 info = va_arg(argptr,
void *);
443 SEVCHK(ca_attach_context(
ca_context),
"ca_attach_context");
447 channel = va_arg(argptr, INT);
448 value = (float) va_arg(argptr,
double);
453 channel = va_arg(argptr, INT);
454 pvalue = va_arg(argptr,
float *);
459 channel = va_arg(argptr, INT);
460 pvalue = va_arg(argptr,
float *);
465 channel = va_arg(argptr, INT);
466 name = va_arg(argptr,
char *);
470 case CMD_GET_THRESHOLD:
471 channel = va_arg(argptr, INT);
472 pvalue = va_arg(argptr,
float *);
char name[CHN_NAME_LENGTH]
INT lem_epics(INT cmd,...)
INT psi_epics_get(CA_INFO *info, INT channel, float *pvalue)
struct ca_client_context * ca_context
INT psi_epics_exit(CA_INFO *info)
INT psi_epics_init(HNDLE hKey, void **pinfo, INT channels)
void ca_exception_handler(struct exception_handler_args args)
INT psi_epics_get_demand(CA_INFO *info, INT channel, float *pvalue)
#define MIN_TIMEOUT_COUNT
INT psi_epics_set(CA_INFO *info, INT channel, float value)