45 static FILE *fp = NULL;
85 {0x0004,
"Pass Bew.OK" },
86 {0x0000,
"Pass Bew.NOK" }
90 {0x0008,
"RPS Bew.OK" },
91 {0x0000,
"RPS Bew.NOK" }
123 {0x0000,
"Soll and Ist NOT ON and NOT OFF" },
124 {0x0001,
"Soll ON - Ist NOT ON and NOT OFF" },
125 {0x0002,
"Soll OFF - Ist NOT ON and NOT OFF" },
126 {0x0003,
"Soll ON and OFF - Ist NOT ON and NOT OFF" },
127 {0x0004,
"Soll NOT ON and NOT OFF - Ist ON" },
129 {0x0006,
"Soll OFF - Ist ON" },
130 {0x0007,
"Soll ON and OFF, Ist ON" },
131 {0x0008,
"Soll NOT ON and NOT OFF - Ist OFF" },
132 {0x0009,
"Soll On - Ist OFF" },
134 {0x000b,
"Soll ON and OFF - Ist OFF" },
135 {0x000c,
"Soll NOT ON and NOT OFF - Ist ON and OFF" },
136 {0x000d,
"Soll ON - Ist ON and OFF" },
137 {0x000e,
"Soll OFF - Ist ON and OFF" },
138 {0x000f,
"Soll ON and OFF - Ist ON and OFF" }
143 {0x0000,
"In Remote Mode" },
145 {0x0010,
"In Local Mode" }
150 {0x0020,
"SG Status OK" },
152 {0x0000,
"SG Status NOK" }
157 {0x0040,
"PSC Status OK" },
159 {0x0000,
"PSC Status NOK" }
164 {0x0080,
"Config OK" },
166 {0x0000,
"Config Error" }
172 {0x0400,
"IST == SOLA" },
174 {0x0000,
"IST <> SOLA" }
179 {0x0800,
"IST >= Low Limit" },
181 {0x0000,
"IST < Low Limit" }
186 {0x1000,
"IST <= High Limit"},
188 {0x0000,
"IST > High Limit" }
193 {0x2000,
"SOL==SOLA" },
195 {0x0000,
"SOL<>SOLA" }
200 {0x8000,
"PSC Link OK" },
202 {0x0000,
"PSC Link Error" }
236 {
":IST:2",
"Istwert", NULL, 0,
FALSE},
237 {
":SOL:2",
"Sollwert", NULL, 0,
TRUE }
243 {0x0001,
"in CW limit switch" },
244 {0x0002,
"in CCW limit switch" },
245 {0x0003,
"not connected/command error" },
246 {0x0004,
"stopped" },
247 {0x0005,
"in CW limit switch and stopped" },
248 {0x0006,
"in CCW limit switch and stopped" }
252 {0x0100,
"moving CW" } ,
253 {0x0200,
"moving CCW" }
264 {0x0000,
"MOVE_TO_CW" },
265 {0x0001,
"MOVE_TO_CCW" },
267 {0x0003,
"MOVE_TO_SOL" },
268 {0x0004,
"SOL=POSA" },
269 {0x0005,
"RESET_CW" },
270 {0x0006,
"RESET_CCW" }
281 {
":IST1:2",
"Position ADC rohwert", NULL, 0,
FALSE},
282 {
":SOL:2",
"Sollwert", NULL, 0,
TRUE },
283 {
":POSA:2",
"Position ADC gefiltert", NULL, 0,
FALSE}
298 {
"HVN:ISTI:2",
"Neg. HV Current Measured [uA]", NULL, 0,
FALSE},
299 {
"HVN:ISTV:2",
"Neg. HV Voltage Measured [kV]", NULL, 0,
FALSE},
300 {
"HVN:SOLI:2",
"Neg. HV Current Demand [uA]", NULL, 0,
TRUE},
301 {
"HVN:SOLV:2",
"Neg. HV Voltage Demand [kV]", NULL, 0,
TRUE},
303 {
"HVP:ISTI:2",
"Pos. HV Current Measured [uA]", NULL, 0,
FALSE},
304 {
"HVP:ISTV:2",
"Pos. HV Voltage Measured [kV]", NULL, 0,
FALSE},
305 {
"HVP:SOLI:2",
"Pos. HV Current Demand [uA]", NULL, 0,
TRUE},
306 {
"HVP:SOLV:2",
"Pos. HV Voltage Demand [kV]", NULL, 0,
TRUE},
307 {
"HV:COM:2",
"HV IDLE=0/ON=1/OFF=2/SET=3", NULL, 0,
TRUE},
308 {
"HV:XRAY:2",
"Xray ", NULL, 0,
FALSE},
309 {
"HV:VAC:2",
"Vacuum", NULL, 0,
FALSE},
310 {
"HV:TIME:2",
"TimeStamp of SoftIOC", NULL, 0,
FALSE}
331 {
"",
"Terminator", NULL, 0},
334 #define N_GFA_TYPES (sizeof(gfatype)/sizeof(GFA_type)) -1
366 strcpy(&
smsg[0],
"Server not found or unavailable");
370 strcpy(&
smsg[0],
"Previously connected to server");
374 strcpy(&
smsg[0],
"Connected to server");
378 strcpy(&
smsg[0],
"Channel deleted by user");
382 strcpy(&
smsg[0],
"**UNKNOWN STATE**");
402 if (info->
pending == 0) cm_msg(MLOG,
"",
"*** Blocking Tolerance InRange checking");
408 cm_msg(MLOG,
"",
"*** Tolerance InRange checking not blocked anymore");
410 cm_msg(MERROR,
"epics_ca_set_pending",
"PROGRAMMING ERROR releasing pending "
411 "AND info->pending == 0");
426 if (fp) fprintf(fp,
"%u : ++epics_ca_exception_handler()\n", ss_time());
429 cm_msg(MLOG,
"",
"++epics_ca_exception_handler()");
432 sprintf(buf,
"%s - chan=%s op=%d data_type = %s count=%d",
433 eargs.ctx, ca_name(eargs.chid), eargs.op, dbr_type_to_text(eargs.type),
436 sprintf(buf,
"%s - op=%d", eargs.ctx, eargs.op);
438 cm_msg(MLOG,
"",
"Status: %d EXCEPTION: %s",eargs.stat,buf);
439 ca_signal(eargs.stat, buf);
442 cm_msg(MLOG,
"",
"--epics_ca_exception_handler()");
445 if (fp) fprintf(fp,
"%u : --epics_ca_exception_handler()\n", ss_time());
456 if (fp) fprintf(fp,
"%u : ++epics_ca_connection_handler()\n", ss_time());
459 cm_msg(MLOG,
"",
"++epics_ca_connection_handler()");
466 pinfo = (
CA_INFO *) ca_puser(cargs.chid);
472 if (*(pinfo->
pchid+i) == cargs.chid) {
474 if (cargs.op == CA_OP_CONN_UP) {
476 cm_msg(MLOG,
"",
"Channel %d(%s) RECONNECTED",i,ca_name(cargs.chid));
478 if (fp) fprintf(fp,
"%u : Channel %d(%s) RECONNECTED\n", ss_time(),
479 i,ca_name(cargs.chid));
481 if (!*(pinfo->
found+i)) {
483 cm_msg(MLOG,
"",
"epics_ca_connection_handler: found flag of channel %d"
484 "(%s)was not set yet",i,ca_name(cargs.chid));
488 cm_msg(MLOG,
"",
"Channel %d(%s) CONNECTED",i,ca_name(cargs.chid));
491 if (fp) fprintf(fp,
"%u : Channel %d(%s) CONNECTED\n", ss_time(),
492 i,ca_name(cargs.chid));
499 cm_msg(MLOG,
"",
"Channel %d(%s) CONNECTED",i,ca_name(cargs.chid));
502 status = ca_create_subscription(DBR_FLOAT,1,*(pinfo->
pchid+i),DBE_LOG|
504 if (!(status & ECA_NORMAL)) {
505 cm_msg(MERROR,
"epics_ca_connection_handler",
"Channel %d(%s): "
506 "ca_create_subscription() returned status 0x%X = \"%s\"",i,
511 cm_msg(MLOG,
"",
"Channel %d(%s): CA event handler (float) will be "
521 cm_msg(MLOG,
"",
"Channel %d(%s): S flag: CA event handler will NOT be "
525 cm_msg(MLOG,
"",
"Channel %d(%s): COM Channel : CA event handler will NO"
535 cm_msg(MLOG,
"",
"Channel %d(%s) is DOWN",i,ca_name(cargs.chid));
546 cm_msg(MERROR,
"epics_ca_connection_handler",
"Channel %s NOT found in list!",
547 ca_name(cargs.chid));
549 cm_msg(MERROR,
"epics_ca_connection_handler",
"NULL pointer returned by ca_puser()");
552 cm_msg(MERROR,
"epics_ca_connection_handler",
"channel id nil returned as argument");
556 cm_msg(MLOG,
"",
"--epics_ca_connection_handler()");
559 if (fp) fprintf(fp,
"%u : --epics_ca_connection_handler()\n", ss_time());
573 if (fp) fprintf(fp,
"%u : ++epics_ca_event_handler()\n", ss_time());
576 cm_msg(MLOG,
"",
"++epics_ca_event_handler()");
586 if (*(pinfo->
pchid+i) == args.chid) {
587 if (args.type == DBR_FLOAT) {
592 cm_msg(MLOG,
"",
"epics_ca_event_handler: Subscribed flag not yet set for"
596 if (*(pinfo->
down+i)) {
598 cm_msg(MLOG,
"",
"epics_ca_event_handler: channel %d(%s) Marked DOWN. Now "
605 tval = *((
float *)args.dbr);
607 cm_msg(MLOG,
"",
"callback for channel %d(%s): value %f", i,
611 if (fp) fprintf(fp,
"%u : callback for channel %d(%s): value %f\n",
614 if ((args.status != ECA_NORMAL) && (*(pinfo->
status+i)!=args.status)) {
615 cm_msg(MLOG,
"",
"epics_ca_event_handler: WARNING Status %d = \"%s\" for "
616 "channel %d(%s)", args.status, ca_message(args.status),
619 *(pinfo->
status+
i) = args.status;
622 if (*(pinfo->
array+i) != tval) {
633 if (strcmp(gfatype[j].type,pinfo->
settings.dtype+DTYPE_LENGTH*i)==0){
637 cm_msg(MLOG,
"",
"Found type %s", gfatype[j].type);
640 for (k=0; k < gfatype[j].
nc; k++) {
642 if (!(tc+k))
continue;
644 if (strcmp(tpos,(tc+k)->spec ) == 0) {
648 cm_msg(MLOG,
"",
"Found spec %s", (tc+k)->spec);
651 for (l = 0; l < (tc+k)->ns; l++) {
656 if (!(cm+l))
continue;
658 cm_msg(MLOG,
"",
"Checking Mask 0x%4.4X",(cm+l)->mask);
660 ttval = (int)tval & (cm+l)->mask;
661 tarr = (int) *(pinfo->
array+i) & (cm+l)->mask;
662 if (*(pinfo->
array+i) == -2.f) tarr = 0;
663 if (( ttval != tarr)||(*(pinfo->
array+
i) == -2.f)) {
665 tpost = tposa = NULL;
668 for (m = 0; m < (cm+l)->nm; m++) {
669 if (!(sm+m))
continue;
672 if ((sm+m)->value == ttval) {
673 if (tpost) cm_msg(MLOG,
"",
"New value: %s overwritten"
674 " by %s", tpost, (sm+m)->
msg);
677 if ((sm+m)->value == tarr) {
678 if (tposa) cm_msg(MLOG,
"",
"Prev value: %s overwritten"
679 " by %s", tposa, (sm+m)->
msg);
685 if (*(pinfo->
array+i) == -2.f) tposa = NULL;
687 cm_msg(MLOG,
"",
"%s: \"%s\" changed to \"%s\"",
693 cm_msg(MLOG,
"",
"%s: Current status is \"%s\"",
699 cm_msg(MLOG,
"",
"%s: Current RAW command is \"%s\"",
706 cm_msg(MLOG,
"",
"%s: \"%s\" is currently set",
730 if (*(pinfo->
demand+i) != tval) {
731 cm_msg(MLOG,
"",
"Channel %d(%s) UP again. Demand may not have been"
732 " set and R(eset) flag set -> Setting demand %f again",i,
746 cm_msg(MERROR,
"epics_ca_event_handler",
"Channel %d(%s): NULL pointer to "
747 "data returned as dbr argument!", i,
752 cm_msg(MLOG,
"",
"epics_ca_event_handler: channel %d(%s): Unsupported data "
754 dbr_type_to_text(args.type));
763 if (!found && (args.status != ECA_NORMAL)) {
764 cm_msg(MERROR,
"epics_ca_event_handler",
"WARNING Status %d = \"%s\"", args.status,
765 ca_message(args.status));
768 cm_msg(MLOG,
"",
"--epics_ca_event_handler()");
771 if (fp) fprintf(fp,
"%u : --epics_ca_event_handler()\n", ss_time());
781 enum channel_state castate;
782 char tpath[MAX_ODB_PATH];
787 sprintf(tpath,
"EPICS_ca_%d.log",ss_time());
788 fp = fopen(tpath,
"w");
789 if (fp) fprintf(fp,
"%u : ++epics_ca_init(%d)\n",ss_time(),channels);
793 cm_msg(MLOG,
"",
"++epics_ca_init(init %d channels)",channels);
795 cm_msg(MLOG,
"",
"ss_time()'ed Info written to %s",tpath);
802 cm_get_experiment_database(&hDB, NULL);
805 info = calloc(1,
sizeof(
CA_INFO));
809 if (!getenv(
"EPICS_CA_AUTO_ADDR_LIST") || !getenv(
"EPICS_CA_ADDR_LIST") ||
810 !getenv(
"EPICS_CA_SERVER_PORT")) {
811 if (!getenv(
"EPICS_CA_AUTO_ADDR_LIST"))
812 cm_msg(MERROR,
"epics_ca_init",
813 "Please define environment variable 'EPICS_CA_AUTO_ADDR_LIST'");
814 if (!getenv(
"EPICS_CA_ADDR_LIST"))
815 cm_msg(MERROR,
"epics_ca_init",
816 "Please define environment variable 'EPICS_CA_ADDR_LIST'");
817 if (!getenv(
"EPICS_CA_SERVER_PORT"))
818 cm_msg(MERROR,
"epics_ca_init",
819 "Please define environment variable 'EPICS_CA_SERVER_PORT'");
822 cm_msg(MLOG,
"",
"EPICS_CA_AUTO_ADDR_LIST is %s",getenv(
"EPICS_CA_AUTO_ADDR_LIST"));
823 cm_msg(MLOG,
"",
"EPICS_CA_ADDR_LIST is %s", getenv(
"EPICS_CA_ADDR_LIST"));
824 cm_msg(MLOG,
"",
"EPICS_CA_SERVER_PORT is %s", getenv(
"EPICS_CA_SERVER_PORT"));
835 status = ca_context_create(ca_disable_preemptive_callback);
836 if (!(status & ECA_NORMAL)) {
837 cm_msg(MERROR,
"epics_ca_init",
"Unable to initialize! ca_context_create() "
838 "returned status 0X%x = \"%s\"",status,ca_message(status));
843 if (!(status & ECA_NORMAL))
844 cm_msg(MERROR,
"epics_ca_init",
"Unable to install global exception handler! "
845 "ca_add_exception_handler() returned status 0X%x = \"%s\"",
846 status,ca_message(status));
851 info->
settings.dtype = calloc(channels, DTYPE_LENGTH);
852 info->
settings.dsec = calloc(channels, DSEC_LENGTH);
861 info->
array = calloc(channels,
sizeof(
float));
862 info->
array_m = calloc(channels,
sizeof(
float));
863 info->
demand = calloc(channels,
sizeof(
float));
867 info->
status = calloc(channels,
sizeof(
int));
868 info->
pchid = calloc(channels,
sizeof(chid));
869 info->
found = calloc(channels,
sizeof(BOOL));
870 info->
iscmd = calloc(channels,
sizeof(BOOL));
871 info->
subscribed = calloc(channels,
sizeof(BOOL));
872 info->
down = calloc(channels,
sizeof(BOOL));
873 info->
firstread = calloc(channels,
sizeof(BOOL));
874 info->
nerr = calloc(channels,
sizeof(INT));
875 info->
nmsg = calloc(channels,
sizeof(INT));
876 info->
tolchan = calloc(channels,
sizeof(INT));
877 info->
gchan = calloc(channels,
sizeof(INT));
878 info->
intol = calloc(channels,
sizeof(BOOL));
910 *(info->
status+
i) = ECA_NORMAL;
914 status = db_find_key(hDB, hKey,
"DD/Loadfile", &subkey);
918 NAME_LENGTH, 1, TID_STRING);
920 if (status == DB_NO_KEY) {
921 cm_msg(MLOG,
"",
"Created \"DD/Loadfile\" in ODB -> set name of loadfile and restart"
922 " to load initial setup from local loadfile");
923 cm_msg(MLOG,
"",
"Or just restart and do manual setup in ODB");
928 db_merge_data(hDB, hKey,
"DD/Sum_NOT_Connected",
930 status = db_find_key(hDB, hKey,
"DD/Sum_NOT_Connected", &info->
hkeySNC);
931 if (status == DB_SUCCESS) {
935 sizeof(
int), 1, TID_INT);
942 db_merge_data(hDB, hKey,
"DD/Sum_NOT_in_Tolerance",
944 status = db_find_key(hDB, hKey,
"DD/Sum_NOT_in_Tolerance", &info->
hkeySNT);
945 if (status == DB_SUCCESS) {
949 sizeof(
int),1,TID_INT);
956 db_merge_data(hDB, hKey,
"DD/AlarmWhenNOTConnected",
960 db_merge_data(hDB, hKey,
"DD/AlarmWhenNOTinTolerance",
967 if (db_find_key(hDB, hKey,
"DD/EPICS Channel name", &subkey) == DB_NO_KEY) {
976 pnames = calloc(channels, NAME_LENGTH);
977 info->
threshold = calloc(channels,
sizeof(
float));
979 while (!feof(stream)) {
982 if (fgets(tline,
sizeof(tline), stream) != NULL) {
984 if ((p = strchr(tline,
'#'))) *p =
'\0';
986 if (strlen(tline) > 0) {
988 for (j=strlen(tline)-1; j >= 0; j--) {
989 if (!isspace(tline[j])) {
990 if (tline[j] !=
',') {tline[j+1] =
','; tline[j+2] =
'\0';}
995 if ((strlen(tline) > 0)&&(p = strchr(tline,
','))) {
997 cm_msg(MLOG,
"",
"Channel %d: Processing Line %d: %s", i, n, tline);
1001 for (k=strlen(po)-1; k >= 0; k--)
1002 if (isspace(*(po+k))) *(po+k)=
'\0';
else break;
1003 while (isspace(*po)) po++;
1012 if (strlen(po) >= NAME_LENGTH) *(po+NAME_LENGTH-1) =
'\0';
1013 strcpy(pnames+NAME_LENGTH*i,po);
1017 if (p = strchr(pn,
',')) {
1018 po = pn; pn = p+1; *p =
'\0';
1021 if (p = strchr(pn,
',')) {
1022 po = pn; pn = p+1; *p =
'\0';
1023 if (strchr(po,
'n')||strchr(po,
'N'))
1026 if (p = strchr(pn,
',')) {
1027 po = pn; pn = p+1; *p =
'\0';
1028 for (k=strlen(po)-1; k >= 0; k--)
1029 if (isspace(*(po+k))) *(po+k)=
'\0';
else break;
1031 if (strlen(po) > 0) {
1035 for (k=0, k1=0; k < strlen(po); k++) {
1037 if (!isspace(*(po+k))) {
1051 if ((p = strchr(pn,
','))) {
1052 po = pn; pn = p+1; *p =
'\0';
1053 for (k=strlen(po)-1; k >= 0; k--)
1054 if (isspace(*(po+k))) *(po+k)=
'\0';
else break;
1055 while (isspace(*po)) po++;
1056 if (strlen(po) >= NAME_LENGTH) *(po+NAME_LENGTH-1) =
'\0';
1057 if (strlen(po) > 0) {
1058 strcpy(pnames+NAME_LENGTH*i,po);
1061 if ((p = strchr(pn,
','))) {
1062 po = pn; pn = p+1; *p =
'\0';
1063 for (k=strlen(po)-1; k >= 0; k--)
1064 if (isspace(*(po+k))) *(po+k)=
'\0';
else break;
1065 if (strlen(po) > 0) {
1067 if (sscanf(po,
"%f",&tval) == 1)
1071 if ((p = strchr(pn,
','))) {
1072 po = pn; pn = p+1; *p =
'\0';
1073 for (k=strlen(po)-1; k >= 0; k--)
1074 if (isspace(*(po+k))) *(po+k)=
'\0';
else break;
1075 if (strlen(po) > 0) {
1077 if (sscanf(po,
"%f",&tval) == 1)
1081 if ((p = strchr(pn,
','))) {
1082 po = pn; pn = p+1; *p =
'\0';
1083 for (k=strlen(po)-1; k >= 0; k--)
1084 if (isspace(*(po+k))) *(po+k)=
'\0';
else break;
1085 if (strlen(po) > 0) {
1087 if ((sscanf(po,
"%f",&tval) == 1) && info->
threshold)
1091 for (k=strlen(pn)-1; k >= 0; k--)
1092 if (isspace(*(pn+k))) *(pn+k)=
'\0';
else break;
1093 if (strlen(pn) > 0) {
1095 if (sscanf(pn,
"%f",&tval) == 1)
1111 cm_msg(MLOG,
"",
"Line %d not handled! %s", n, tline);
1119 cm_msg(MLOG,
"",
"Less channels (%d) loaded from %s than expected (%d) "
1120 "-> recompile with %d or add more channel lines", i,
1123 sprintf(pnames+NAME_LENGTH*i,
"NONE_%d",i);
1126 }
else if (i > channels) {
1127 cm_msg(MLOG,
"",
"More channels (%d) read from %s than expected (%d) "
1128 "-> recompile with %d or remove channel lines", i,
1131 cm_msg(MLOG,
"",
"Expected number of channels (%d) read ", channels);
1133 if (i > 0) loaded =
TRUE;
1136 cm_msg(MLOG,
"",
"ERROR %d returned when trying to open %s for read access!",
1145 db_merge_data(hDB, hKey,
"DD/Used", info->
settings.
used,
1146 sizeof(BOOL)* channels, channels, TID_BOOL);
1148 sizeof(BOOL)* channels, channels, TID_BOOL);
1152 db_merge_data(hDB, hKey,
"DD/DESC:TYP", info->
settings.dtype,
1153 DTYPE_LENGTH * channels, channels, TID_STRING);
1154 db_merge_data(hDB, hKey,
"DD/DESC:SEC", info->
settings.dsec,
1155 DSEC_LENGTH * channels, channels, TID_STRING);
1159 sizeof(
float)* channels, channels, TID_FLOAT);
1161 sizeof(
float)* channels, channels, TID_FLOAT);
1165 sizeof(
float)* channels, channels, TID_FLOAT);
1178 tchidt = calloc(channels,
sizeof(chid));
1179 tchids = calloc(channels,
sizeof(chid));
1181 if (tchidt && tchids) {
1188 tpos = strchr(tname,
':');
1196 if (tpos) *tpos =
'\0';
1197 strcat(tname,
":DESC:TYP");
1198 status = ca_create_channel(tname,NULL,NULL,0,tchidt+i);
1199 if (!(status & ECA_NORMAL))
1200 cm_msg(MERROR,
"epics_ca_init",
"ERROR status 0X%x = \"%s\" returned by "
1201 "ca_create_channel(%s)", status, ca_message(status), tname);
1210 tpos = strchr(tname,
':');
1211 if (tpos) *tpos =
'\0';
1212 strcat(tname,
":DESC:SEC");
1213 status = ca_create_channel(tname,NULL,NULL,0,tchids+i);
1214 if (!(status & ECA_NORMAL))
1215 cm_msg(MERROR,
"epics_ca_init",
"ERROR status 0X%x = \"%s\" returned by "
1216 "ca_create_channel(%s)", status, ca_message(status), tname);
1221 status = ca_pend_io(5.0);
1222 if (status == ECA_TIMEOUT) status = ca_pend_io(5.0);
1223 if (status == ECA_TIMEOUT) status = ca_pend_io(5.0);
1225 cm_msg(MLOG,
"",
"ca_pend_io(5.0) status 0X%x = \"%s\"",status,ca_message(status));
1230 strcpy(info->
settings.dtype+DTYPE_LENGTH*i,
"**TYPE_NOT_RETURNED**");
1231 if (ca_state(*(tchidt+i)) == cs_conn) {
1232 status = ca_get(DBR_STRING,*(tchidt+i),info->
settings.dtype+DTYPE_LENGTH*i);
1233 if (status != ECA_NORMAL)
1234 cm_msg(MLOG,
"",
"ca_get(dtype of channel %d): status 0X%x = \"%s\"",i,
1235 status,ca_message(status));
1237 strcpy(info->
settings.dtype+DTYPE_LENGTH*i,
"**TYPE_NOT_FOUND**");
1240 strcpy(info->
settings.dtype+DTYPE_LENGTH*i,
"**CHAN_NOT_USED**");
1246 strcpy(info->
settings.dsec+DSEC_LENGTH*i,
"**SEC_NOT_RETURNED**");
1247 if (ca_state(*(tchids+i)) == cs_conn) {
1248 status = ca_get(DBR_STRING,*(tchids+i),info->
settings.dsec+DSEC_LENGTH*i);
1249 if (status != ECA_NORMAL)
1250 cm_msg(MLOG,
"",
"ca_get(dsec of channel %d): status 0X%x = \"%s\"",i,
1251 status,ca_message(status));
1253 strcpy(info->
settings.dsec+DSEC_LENGTH*i,
"**SEC_NOT_FOUND**");
1256 strcpy(info->
settings.dsec+DSEC_LENGTH*i,
"**CHAN_NOT_USED**");
1259 status = ca_pend_io(1.0);
1260 if (status == ECA_TIMEOUT) status = ca_pend_io(1.0);
1262 cm_msg(MLOG,
"",
"ca_pend_io(1.0) status 0X%x = \"%s\"",status,ca_message(status));
1267 cm_msg(MLOG,
"",
"ss_sleep(2000)");
1271 status = ca_pend_event(1.0);
1273 cm_msg(MLOG,
"",
"ca_pend_event(1.0)");
1280 if (ca_state(*(tchidt+i)) != cs_conn) {
1284 strcpy(info->
settings.dtype+DTYPE_LENGTH*i,
"BX");
1291 strcpy(info->
settings.dtype+DTYPE_LENGTH*i,
"HVPS");
1293 strcpy(info->
settings.dtype+DTYPE_LENGTH*i,
"**TYPE_NOT_FOUND**");
1296 status = ca_clear_channel(*(tchidt+i));
1297 if (!(status & ECA_NORMAL))
1298 cm_msg(MERROR,
"epics_ca_init",
":DESC:TYP of Channel %d(%s): "
1299 "ca_clear_channel() returned status 0X%x = \"%s\"",i,
1301 status, ca_message(status));
1307 if (ca_state(*(tchids+i)) != cs_conn) {
1311 strcpy(info->
settings.dsec+DSEC_LENGTH*i,
"PIM31");
1313 strcpy(info->
settings.dsec+DSEC_LENGTH*i,
"**SEC_NOT_FOUND**");
1316 status = ca_clear_channel(*(tchids+i));
1317 if (!(status & ECA_NORMAL))
1318 cm_msg(MERROR,
"epics_ca_init",
":DESC:SEC of Channel %d(%s): "
1319 "ca_clear_channel() returned status 0X%x = \"%s\"",i,
1321 status, ca_message(status));
1324 status = ca_pend_io(1.0);
1325 if (status == ECA_TIMEOUT) status = ca_pend_io(1.0);
1327 cm_msg(MLOG,
"",
"ca_pend_io(1.0) status 0X%x = \"%s\"",status,ca_message(status));
1332 if (tchidt) free(tchidt);
1333 if (tchids) free(tchids);
1336 status = db_find_key(hDB, hKey,
"DD/DESC:TYP", &tkey);
1337 if (status == DB_SUCCESS)
1338 db_set_data(hDB, tkey, info->
settings.dtype, DTYPE_LENGTH * channels,
1339 channels, TID_STRING);
1341 status = db_find_key(hDB, hKey,
"DD/DESC:SEC", &tkey);
1342 if (status == DB_SUCCESS)
1343 db_set_data(hDB, tkey, info->
settings.dsec, DSEC_LENGTH * channels,
1344 channels, TID_STRING);
1360 if (!(status & ECA_NORMAL))
1361 cm_msg(MERROR,
"epics_ca_init",
"ERROR status 0X%x = \"%s\" returned by "
1362 "ca_create_channel(%s)", status, ca_message(status),
1368 status = ca_pend_io(5.0);
1369 if (status == ECA_TIMEOUT) status = ca_pend_io(5.0);
1370 if (status == ECA_TIMEOUT) status = ca_pend_io(5.0);
1371 if (status == ECA_TIMEOUT) status = ca_pend_io(5.0);
1372 if (status == ECA_TIMEOUT) status = ca_pend_io(5.0);
1374 cm_msg(MLOG,
"",
"ca_pend_io(5.0) status 0X%x = \"%s\"", status, ca_message(status));
1377 cm_msg(MLOG,
"",
"ss_sleep(5000)");
1382 cm_msg(MLOG,
"",
"ca_pend_event(4.0)");
1386 if ((status == ECA_TIMEOUT) || (status == ECA_NORMAL)){
1390 if ((castate=ca_state(*(info->
pchid+i))) != cs_conn) {
1391 cm_msg(MERROR,
"epics_ca_init",
"Not connected to EPICS Channel %d(%s). "
1392 "Channel state is %d = \"%s\"",i,
1396 if (!*(info->
found+i)) {
1397 cm_msg(MLOG,
"epics_ca_init",
"Connected to EPICS Channel %d(%s)", i,
1406 cm_msg(MLOG,
"epics_ca_init",
"Returned status %d = \"%s\" of ca_pend_io(A) is not "
1407 "handled", status, ca_message(status));
1412 status = db_find_key(hDB, hKey,
"DD/Minval", &subkey);
1413 if (status != DB_NO_KEY) status = db_find_key(hDB, hKey,
"DD/Maxval", &subkey);
1415 if (status == DB_NO_KEY) {
1416 struct dbr_ctrl_float *pctrl;
1418 cm_msg(MLOG,
"",
"Query LOW and HIGH of channels");
1419 pctrl = calloc(channels,
sizeof(
struct dbr_ctrl_float));
1422 for (nchans = 0, i = 0; i <
channels; i++) {
1424 if ((castate=ca_state(*(info->
pchid+i))) == cs_conn) {
1428 status = ca_get(DBR_CTRL_FLOAT,*(info->
pchid+i),pctrl+i);
1429 if (status != ECA_NORMAL)
1430 cm_msg(MLOG,
"",
"ca_get(DBR_CTRL_FLOAT of channel %d): "
1431 "status 0X%x = \"%s\"",i,status,ca_message(status));
1434 cm_msg(MLOG,
"",
"Channel %d M flag not set", i);
1437 cm_msg(MLOG,
"",
"Channel %d S flag set", i);
1440 cm_msg(MLOG,
"",
"Channel %d U flag set", i);
1443 cm_msg(MLOG,
"",
"Channel %d not connected", i);
1446 cm_msg(MLOG,
"",
"Channel %d not used", i);
1451 cm_msg(MLOG,
"",
"Queried LOW and HIGH of %d channels",nchans);
1453 status = ca_pend_io(5.0);
1454 if (status == ECA_TIMEOUT) status = ca_pend_io(5.0);
1455 if (status == ECA_TIMEOUT) status = ca_pend_io(5.0);
1457 cm_msg(MLOG,
"",
"ca_pend_io(5.0) status 0X%x =\"%s\"",status,ca_message(status));
1460 cm_msg(MLOG,
"",
"ss_sleep(1000)");
1465 cm_msg(MLOG,
"",
"ca_pend_event(1.0)");
1469 if ((castate=ca_state(*(info->
pchid+i))) == cs_conn) {
1474 cm_msg(MLOG,
"",
"Channel %d(%s): LOW is %f",
1478 cm_msg(MLOG,
"",
"Channel %d(%s): HIGH is %f",
1490 cm_msg(MERROR,
"epics_ca_init",
"Memory not allocated for struct dbr_ctrl_float");
1496 sizeof(
float)* channels, channels, TID_FLOAT);
1498 sizeof(
float)* channels, channels, TID_FLOAT);
1506 if (*(info->
settings.
used+i) && ((castate=ca_state(info->
pchid[i])) == cs_conn)) {
1512 status = ca_create_subscription(DBR_FLOAT, 1, *(info->
pchid+i), DBE_VALUE,
1514 if (!(status & ECA_NORMAL)) {
1515 cm_msg(MERROR,
"epics_ca_init",
"Channel %d(%s): ca_create_subscription() retur"
1517 status, ca_message(status));
1520 cm_msg(MLOG,
"",
"Channel %d(%s): CA event handler (float) will be installed",
1527 cm_msg(MLOG,
"",
"Channel %d(%s): S flag: CA event handler will NOT be "
1531 cm_msg(MLOG,
"",
"Channel %d(%s): COM Channel : CA event handler will NOT "
1545 status = ca_pend_io(5.0);
1546 if (status == ECA_TIMEOUT) status = ca_pend_io(5.0);
1548 cm_msg(MLOG,
"",
"ca_pend_io(5.0) status 0X%x = \"%s\"", status, ca_message(status));
1551 cm_msg(MLOG,
"",
"ss_sleep(2000)");
1555 status = ca_pend_event(5.0);
1557 cm_msg(MLOG,
"",
"ca_pend_event(5.0)");
1559 if ((status == ECA_TIMEOUT) || (status == ECA_NORMAL)) {
1562 if (ca_state(info->
pchid[i]) != cs_conn)
1563 cm_msg(MERROR,
"epics_ca_init",
"Not connected to %s",
1565 }
else if (*(info->
found+i)){
1567 cm_msg(MLOG,
"",
"Channel %d(%s): Not connected (state %d = \"%s\") -> no CA "
1568 "callback installed and channel disabled", i,
1575 }
else if (status != ECA_NORMAL) {
1577 cm_msg(MLOG,
"epics_ca_init",
"Returned status %d \"%s\" of ca_pend_io(B) is not "
1578 "handled", status, ca_message(status));
1589 sprintf(
smsg,
"Channel %d(%s): %s Type: %s Section: %s Chn_Flags: %s", i,
1592 info->
settings.dtype+DTYPE_LENGTH *i,
1596 sprintf(
smsg,
"Channel %d(%s): R Type: %s Section: %s Chn_Flags: %s", i,
1598 info->
settings.dtype+DTYPE_LENGTH *i,
1602 sprintf(
smsg,
"Channel %d(%s): %s Chn_Flags: %s", i,
1604 *(info->readonly+i)?
"R":
"W",
1623 strcat(
smsg,
" ** Other flag(s) overruled by U and/or S **");
1638 cm_msg(MLOG,
"",
smsg);
1642 cm_msg(MLOG,
"",
smsg);
1646 #ifndef OMIT_ODBUPDATE
1648 if ((status = db_get_path(hDB, hKey, tpath,
sizeof(tpath))) == DB_SUCCESS) {
1650 for (i = strlen(
"/Equipment/"); i < strlen(tpath); i++) {
1651 if (tpath[i] ==
'/') {
1653 strncpy(info->
name, &tpath[strlen(
"/Equipment/")], NAME_LENGTH);
1654 info->
name[NAME_LENGTH - 1] =
'\0';
1655 sprintf(tpath,
"/Equipment/%s/Variables/Demand",info->
name);
1656 status = db_find_key(hDB, 0, tpath, &info->
hkeyDemand);
1657 if (status != DB_SUCCESS) info->
hkeyDemand = 0;
1661 cm_msg(MINFO,
"",
"epics_ca_init: Equipment name is %s", info->
name);
1663 cm_msg(MERROR,
"epics_ca_init",
"ERROR %d getting key path", status);
1669 #ifndef OMIT_ODBUPDATE
1671 if (pnames != NULL) {
1672 sprintf(tpath,
"/Equipment/%s/Settings/Names",info->
name);
1673 db_merge_data(hDB, 0, tpath, pnames, NAME_LENGTH*channels, channels, TID_STRING);
1679 #ifndef OMIT_ODBUPDATE
1695 cm_msg(MLOG,
"",
"List of used GFA types");
1703 if (strcmp(info->
settings.dtype+DTYPE_LENGTH*n,gfatype[i].
type) == 0) {
1709 if (!found)
continue;
1711 cm_msg(MLOG,
"",
"TYPE: \"%s\" \"%s\" %d channels", gfatype[i].type, gfatype[i].desc,
1715 for (j = 0; j < gfatype[
i].
nc; j++) {
1719 if (!(tc+j))
continue;
1721 cm_msg(MLOG,
"",
"**Channel \"%s\" \"%s\" %d masks",(tc+j)->spec,(tc+j)->desc,
1724 cm_msg(MLOG,
"",
"**Channel \"%s\" \"%s\"",(tc+j)->spec,(tc+j)->desc);
1727 for (k = 0; k < (tc+j)->ns; k++) {
1731 if (!(cm+k))
continue;
1732 cm_msg(MLOG,
"",
"****Mask 0x%4.4X",(cm+k)->mask);
1734 for (l = 0; l < (cm+k)->nm; l++) {
1735 if (!(sm+l))
continue;
1736 cm_msg(MLOG,
"",
"******Value 0x%4.4X : \"%s\"",(sm+l)->
value, (sm+l)->
msg);
1750 if (strcmp(info->
settings.dtype+DTYPE_LENGTH*i,gfatype[n].
type) == 0) {
1762 for (found =
FALSE, m=0; m < gfatype[n].
nc; m++) {
1763 if ((gfatype[n].tc+m) && (strcmp((gfatype[n].tc+m)->spec,tpos)==0)) {
1765 *(info->
iscmd+
i) = (gfatype[n].tc+m)->iscmd;
1769 if (!found && (strcmp(info->
settings.dtype+DTYPE_LENGTH*i,
"HVPS")==0)) {
1770 for (found =
FALSE, m=0; m < gfatype[n].
nc; m++) {
1771 if ((gfatype[n].tc+m) &&
1773 (gfatype[n].
tc+m)->spec)) {
1775 *(info->
iscmd+
i) = (gfatype[n].tc+m)->iscmd;
1781 cm_msg(MLOG,
"",
"Channel %d(%s): Not found in list of handled channels for "
1782 "GFA type \"%s\"", i,
1784 info->
settings.dtype+DTYPE_LENGTH*i);
1791 if (strncmp(info->
settings.dtype+DTYPE_LENGTH*i,
"**",2) == 0)
continue;
1793 cm_msg(MLOG,
"",
"Channel %d(%s): GFA Type \"%s\" not found in list"
1794 " of handled GFA types!", i,
1796 info->
settings.dtype+DTYPE_LENGTH*i);
1827 cm_msg(MLOG,
"",
"--epics_ca_init()");
1830 if (fp) fprintf(fp,
"%u : --epics_ca_init()\n", ss_time());
1841 if (fp) fprintf(fp,
"%u : ++epics_ca_exit()\n", ss_time());
1844 cm_msg(MLOG,
"",
"++epics_ca_exit()");
1852 if (*(info->
pchid+i)) {
1853 status = ca_clear_channel(*(info->
pchid+i));
1854 if (!(status & ECA_NORMAL))
1855 cm_msg(MERROR,
"epics_ca_init",
"Channel %d(%s): ca_clear_channel() returned "
1856 "status 0X%x = \"%s\"",i,
1858 status, ca_message(status));
1861 status = ca_pend_io(1.0);
1863 cm_msg(MLOG,
"",
"ca_pend_io(1.0) status 0X%x = \"%s\"", status, ca_message(status));
1865 status = ca_pend_event(1.0);
1867 cm_msg(MLOG,
"",
"ca_pend_event(1.0)");
1872 ca_context_destroy();
1907 if (info->
down) { free(info->
down); info->
down = NULL; }
1909 if (info->
nerr) { free(info->
nerr); info->
nerr = NULL; }
1910 if (info->
nmsg) { free(info->
nmsg); info->
nmsg = NULL; }
1920 cm_msg(MLOG,
"",
"--epics_ca_exit()");
1925 fprintf(fp,
"%u : --epics_ca_exit()\n",ss_time());
1938 if (fp) fprintf(fp,
"%u : ++epics_ca_set(channel=%d(%s), value=%f, flush=%d, force_upd"
1939 "=%d)\n", ss_time(), channel,
1941 value, flush, forced_update);
1944 cm_msg(MLOG,
"",
" ++epics_ca_set(channel=%d, value=%f, flush=%d,force_upd=%d)",
1945 channel,value,flush,forced_update);
1948 if (channel < info->num_channels) {
1957 cm_msg(MLOG,
"",
"Channel %d (%s): New demand value (%f) lower than "
1958 "min value (%f)! - Setting min value", channel,
1964 cm_msg(MLOG,
"",
"Channel %d (%s): New demand value (%f) larger than "
1965 "max value (%f)! - Setting max value", channel,
1977 if ((value != *(info->
demand+channel))||forced_update) {
1980 enum channel_state castate;
1981 if ((castate=ca_state(*(info->
pchid+channel)))== cs_conn) {
1982 if (ca_write_access(*(info->
pchid+channel))) {
1996 if (strcmp(gfatype[j].type,info->
settings.dtype+DTYPE_LENGTH*channel)
2001 cm_msg(MLOG,
"",
"Found type %s", gfatype[j].type);
2004 for (k=0; k < gfatype[j].
nc; k++) {
2006 if (!(tc+k))
continue;
2008 if (strcmp(tpos,(tc+k)->spec ) == 0) {
2012 cm_msg(MLOG,
"",
"Found spec %s NS=%d",(tc+k)->spec,(tc+k)->ns);
2015 for (l = 0; l < (tc+k)->ns; l++) {
2020 if (!(cm+l))
continue;
2022 cm_msg(MLOG,
"",
"Checking Mask 0x%4.4X",(cm+l)->mask);
2024 ttval = (int)value & (cm+l)->mask;
2025 tdem = (int) *(info->
demand+channel) & (cm+l)->mask;
2026 if (*(info->
demand+channel) == -2.f) tdem = 0;
2029 tpost = tposa = NULL;
2032 for (m = 0; m < (cm+l)->nm; m++) {
2033 if (!(sm+m))
continue;
2036 if ((sm+m)->value == ttval) {
2037 if (tpost) cm_msg(MLOG,
"",
"New value: %s overwritten"
2038 " by %s", tpost, (sm+m)->
msg);
2039 tpost = (sm+m)->
msg;
2041 if ((sm+m)->value == tdem) {
2042 if (tposa) cm_msg(MLOG,
"",
"Prev value: %s overwritten"
2043 " by %s", tposa, (sm+m)->
msg);
2044 tposa = (sm+m)->
msg;
2049 if (*(info->
demand+channel) == -2.f) tposa = NULL;
2051 cm_msg(MLOG,
"",
"%s: \"%s\" changed to \"%s\"",
2058 cm_msg(MLOG,
"",
"%s: Command is \"%s\"",
2062 cm_msg(MLOG,
"",
"%s: \"%s\" is currently set",
2069 if (*(info->
demand+channel) != -2.f)
2070 cm_msg(MLOG,
"",
"Channel %d(%s) %f set to %f",channel,
2072 *(info->
demand+channel),value);
2074 cm_msg(MLOG,
"",
"Channel %d(%s) set to %f", channel,
2080 if ((tc+k)->ns <= 0) {
2081 if (*(info->
demand+channel) != -2.f)
2082 cm_msg(MLOG,
"",
"Channel %d(%s) %f set to %f",channel,
2084 *(info->
demand+channel),value);
2086 cm_msg(MLOG,
"",
"Channel %d(%s) set to %f", channel,
2093 if (gfatype[j].nc <= 0) {
2094 if (*(info->
demand+channel) != -2.f)
2095 cm_msg(MLOG,
"",
"Channel %d(%s) %f set to %f",channel,
2097 *(info->
demand+channel),value);
2099 cm_msg(MLOG,
"",
"Channel %d(%s) set to %f", channel,
2109 if (*(info->
demand+channel) != -2.f)
2110 cm_msg(MLOG,
"",
"Channel %d(%s) %f set to %f",channel,
2112 *(info->
demand+channel),value);
2114 cm_msg(MLOG,
"",
"Channel %d(%s) set to %f", channel,
2123 ca_put(DBR_FLOAT, info->
pchid[channel], &value);
2126 if (!info->handling_disabled) {
2130 info->handling_disabled =
TRUE;
2137 cm_msg(MLOG,
"",
"Looking for device specific handling of Device type %s",ds);
2139 if ((strcmp(ds,
"BEND")==0) || (strcmp(ds,
"QUAD")==0) ||
2140 (strcmp(ds,
"SEPT")==0) || (strcmp(ds,
"STER")==0) ||
2141 (strcmp(ds,
"PS" )==0) ||
2142 (strcmp(ds,
"TS" )==0) || (strcmp(ds,
"KICKER")==0)) {
2147 cm_msg(MLOG,
"",
"Device type %s found",ds);
2151 if ((tpos = strstr(chname,
":SOL:2")) != NULL) {
2154 strcpy(tpos,
":COM:2");
2156 cm_msg(MLOG,
"",
"Looking for channel %s",chname);
2159 if (i==channel)
continue;
2168 if (strchr(chflgs,
'P')) {
2171 if (strchr(chflgs,
'Z')) {
2177 if (strchr(chflgs,
'N')) {
2183 if (tval != *(info->
demand+i)) {
2188 #ifndef OMIT_ODBUPDATE
2190 cm_get_experiment_database(&hDB, NULL);
2193 mstatus = db_set_data_index(hDB, info->
hkeyDemand, &tval,
2194 sizeof(
float), i, TID_FLOAT);
2195 if (mstatus != DB_SUCCESS) ;
2206 }
else if (strcmp(ds,
"FENTE")==0) {
2211 cm_msg(MLOG,
"",
"Device type %s found",ds);
2215 if ((tpos = strstr(chname,
":SOL:2")) != NULL) {
2218 strcpy(tpos,
":COM:2");
2220 cm_msg(MLOG,
"",
"Looking for channel %s",chname);
2223 if (i==channel)
continue;
2232 if (strchr(chflgs,
'V')) {
2235 if (tval != *(info->
demand+i)) {
2242 cm_get_experiment_database(&hDB, NULL);
2245 mstatus = db_set_data_index(hDB, info->
hkeyDemand, &tval,
2246 sizeof(
float), i, TID_FLOAT);
2247 if (mstatus != DB_SUCCESS) ;
2255 }
else if (strcmp(ds,
"BX")==0) {
2257 }
else if (strcmp(ds,
"HVPS")==0) {
2260 cm_msg(MLOG,
"",
"epics_ca_set: GFA type %s is currently not handled",
2264 info->handling_disabled =
FALSE;
2268 status = ca_pend_io(0.01);
2270 cm_msg(MLOG,
"",
"ca_pend_io(0.01) status 0X%x = \"%s\"", status,
2271 ca_message(status));
2275 cm_msg(MLOG,
"",
"SET: channel %d(%s) NO WRITE ACCESS!",
2279 cm_msg(MLOG,
"",
"SET: channel %d(%s) is (currently?) not connected! "
2280 "Channel state is %d = \"%s\"", channel,
2284 }
else if (!*(info->
found+channel)){
2285 cm_msg(MLOG,
"",
"SET: channel %d(%s) is (currently?) not enabled!",
2288 cm_msg(MLOG,
"",
"SET: channel %d(%s) is not used!",
2291 cm_msg(MLOG,
"",
"SET: channel %d(%s) is set read ONLY!",
2293 }
else if (!*(info->
iscmd+channel)){
2294 cm_msg(MLOG,
"",
"SET: channel %d(%s) is not a channel to be set!",
2299 cm_msg(MLOG,
"",
"Demand and readout (%f) did not change -> not updating channel"
2300 " %d(%s)", value, channel,
2309 cm_msg(MLOG,
"",
" --epics_ca_set()");
2312 if (fp) fprintf(fp,
"%u : --epics_ca_set(channel=%d, value=%f)\n", ss_time(),
2324 cm_msg(MLOG,
"",
" ++epics_ca_set_all(%d channels)",channels);
2329 status = ca_pend_io(0.01);
2331 cm_msg(MLOG,
"",
"ca_pend_io(0.01) status 0X%x = \"%s\"", status, ca_message(status));
2335 cm_msg(MLOG,
"",
" --epics_ca_set_all()");
2348 cm_msg(MLOG,
"",
" ++epics_ca_set_label(channel %d, label %s)", channel, label);
2351 status = ca_create_channel(str, NULL, NULL, 0, &chan_id);
2352 if (status == ECA_NORMAL) {
2353 status = ca_pend_io(2.0);
2355 cm_msg(MLOG,
"",
"ca_pend_io(2.0) status 0X%x = \"%s\"", status, ca_message(status));
2357 if (status == ECA_NORMAL) {
2358 if (ca_state(chan_id) == cs_conn) {
2359 status = ca_put(ca_field_type(chan_id), chan_id, label);
2360 status = ca_pend_io(0.01);
2362 status = cm_msg(MLOG,
"",
"ca_pend_io(0.01) status 0X%x = \"%s\"", status,
2363 ca_message(status));
2366 cm_msg(MLOG,
"",
"epics_ca_set_label: Channel %s is not connected", str);
2369 cm_msg(MERROR,
"epics_ca_set_label",
"%s not found", str);
2371 ca_clear_channel(chan_id);
2373 cm_msg(MERROR,
"epics_ca_set_label",
"ca_create_channel(%s) Returned status "
2374 "0X%x = \"%s\"",str,status,ca_message(status));
2377 cm_msg(MLOG,
"",
" --epics_ca_set_label()");
2387 if (fp) fprintf(fp,
"%u : ++epics_ca_get(channel=%d(%s))\n", ss_time(),channel,
2391 cm_msg(MLOG,
"",
" ++epics_ca_get(channel %d)",channel);
2399 cm_msg(MLOG,
"",
"ca_pend_event(0.01)");
2401 ca_pend_event(0.01);
2404 cm_msg(MLOG,
"",
"ss_sleep(50)");
2408 cm_msg(MLOG,
"",
"ca_pend_event(0.1)");
2412 status = ca_pend_io(0.001);
2414 cm_msg(MLOG,
"",
"ca_pend_io(0.001) status 0X%x =\"%s\"",status,ca_message(status));
2417 ca_pend_event(0.001);
2421 if (*(info->
found+channel)) {
2422 if (ca_state(*(info->
pchid+channel)) == cs_conn) {
2423 if (ca_read_access(*(info->
pchid+channel))) {
2431 if (newdemand != *(info->
demand+channel)) {
2437 if (*(info->
iscmd+channel)) {
2438 if (*(info->
demand+channel) != -2.f)
2439 cm_msg(MLOG,
"",
"Channel %d(%s): demand (%f) changed to %f", channel,
2441 *(info->
demand+channel),newdemand);
2443 cm_msg(MLOG,
"",
"Channel %d(%s): current demand is %f", channel,
2448 if ((*(info->
iscmd+channel)) && ((*(info->
gchan+channel) > 0) ||
2457 oldflag = info->handling_disabled;
2475 info->handling_disabled = oldflag;
2478 #ifndef OMIT_ODBUPDATE
2480 size =
sizeof(float);
2481 cm_get_experiment_database(&hDB, NULL);
2484 mstatus = db_set_data_index(hDB,info->
hkeyDemand, &newdemand,
2485 size, channel, TID_FLOAT);
2486 if (mstatus != DB_SUCCESS) ;
2499 if (*(info->
nmsg+channel) == 0) {
2500 cm_msg(MLOG,
"",
"Channel %d(%s): NO read access!", channel,
2508 if (*(info->
nmsg+channel) == 0) {
2509 cm_msg(MLOG,
"",
"Channel %d(%s): NOT connected!", channel,
2517 if (*(info->
nmsg+channel) == 0) {
2519 cm_msg(MLOG,
"",
"Channel %d(%s): NOT found!", channel,
2530 if ((ss_time() > info->
lastSNC) && ((ss_time() - info->
lastSNC) > 10)) {
2533 cm_msg(MLOG,
"",
"C-flag: Checking if channels with C-flag are connected");
2540 cm_msg(MLOG,
"",
"C-flag: Channel %d (%s) is currently not connected",i,
2548 cm_msg(MLOG,
"",
"Number of Channels (with C-flag) NOT connected changed from "
2554 cm_get_experiment_database(&hDB, NULL);
2556 sizeof(
int), 1, TID_INT);
2565 }
else if (ss_time() < info->
lastSNC) {
2566 cm_msg(MLOG,
"",
"Sum of channels NOT connected: System time was reset");
2572 if ((ss_time() > info->
lastSNT) && ((ss_time() - info->
lastSNT) > 10)) {
2576 cm_msg(MLOG,
"",
"T-flag: Checking if channels with T-flag are in tolerance");
2585 if (*(info->
tolchan+i) == -1.f) {
2595 ds = info->
settings.dtype+DTYPE_LENGTH*
i;
2597 cm_msg(MLOG,
"",
"Looking for device specific handling of Device type %s",ds);
2599 if ((strcmp(ds,
"BEND")==0) || (strcmp(ds,
"QUAD")==0) ||
2600 (strcmp(ds,
"SEPT")==0) || (strcmp(ds,
"STER")==0) ||
2601 (strcmp(ds,
"PS" )==0) ||
2602 (strcmp(ds,
"TS" )==0) || (strcmp(ds,
"KICKER")==0)) {
2605 cm_msg(MLOG,
"",
"T-flag: Device type %s found",ds);
2608 if ((tpos = strstr(tename,
":SOL:2")) != NULL) {
2609 strcpy(tpos,
":IST:2");
2610 }
else if ((tpos = strstr(tename,
":IST:2")) != NULL) {
2611 strcpy(tpos,
":SOL:2");
2613 cm_msg(MLOG,
"",
"T-flag: Channel %d (%s) not handled for type %s", i,
2615 findrefchan =
FALSE;
2617 }
else if (strcmp(ds,
"FENTE")==0) {
2619 if ((tpos = strstr(tename,
":SOL:2")) != NULL) {
2620 strcpy(tpos,
":IST1:2");
2621 }
else if ((tpos = strstr(tename,
":IST1:2")) != NULL) {
2622 strcpy(tpos,
":SOL:2");
2623 }
else if ((tpos = strstr(tename,
":POSA:2")) != NULL) {
2624 strcpy(tpos,
":SOL:2");
2626 cm_msg(MLOG,
"",
"T-flag: Channel %d (%s) not handled for type %s", i,
2628 findrefchan =
FALSE;
2630 }
else if (strcmp(ds,
"BX")==0) {
2632 findrefchan =
FALSE;
2633 }
else if (strcmp(ds,
"HVPS")==0) {
2635 if ((tpos = strstr(tename,
":SOLV:2")) != NULL) {
2636 strcpy(tpos,
":ISTV:2");
2637 }
else if ((tpos = strstr(tename,
":ISTV:2")) != NULL) {
2638 strcpy(tpos,
":SOLV:2");
2640 cm_msg(MLOG,
"",
"T-flag: Channel %d (%s) not handled for type %s", i,
2642 findrefchan =
FALSE;
2645 cm_msg(MLOG,
"",
"T-flag: Channel %d (%s) type %s is not handled", i,
2647 findrefchan =
FALSE;
2652 cm_msg(MLOG,
"",
"T-flag: Searching for channel %s",tename);
2671 float tvali,tvalr,diff;
2677 if (*(info->
iscmd+i)) {
2679 tvalr = *(info->
array+j);
2685 tvali = *(info->
array+
i);
2686 tvalr = *(info->
demand+j);
2693 diff = tvali - tvalr;
2694 if (diff < 0.f) diff = -diff;
2698 cm_msg(MLOG,
"",
"Channel %d (%s)=%f and Channel %d (%s)=%f : "
2699 "difference %f is out of tolerance %f",
2710 cm_msg(MLOG,
"",
"Channel %d (%s)=%f and Channel %d (%s)=%f : "
2711 "difference %f is in tolerance %f",
2721 *(handled+
i) =
TRUE;
2722 *(handled+j) =
TRUE;
2729 cm_msg(MLOG,
"",
"Channel %d (%s): not used",i,
2732 cm_msg(MLOG,
"",
"Channel %d (%s): T flag not set",i,
2734 if (handled && *(handled+i))
2735 cm_msg(MLOG,
"",
"Channel %d (%s): already handled",i,
2738 cm_msg(MLOG,
"",
"Channel %d (%s): invalid tolerance %f", i,
2753 cm_msg(MLOG,
"",
"Pending operation -> In Range checking blocked");
2755 cm_msg(MLOG,
"",
"%d Pending operations -> In Range checking blocked",
2760 cm_msg(MLOG,
"",
"Number of Channels (T) NOT in Tolerance Range changed "
2763 cm_msg(MLOG,
"",
"All Channels (T) in Tolerance Range");
2769 cm_get_experiment_database(&hDB, NULL);
2771 sizeof(
int),1,TID_INT);
2779 if (handled) { free(handled); handled = NULL;}
2781 }
else if (ss_time() < info->
lastSNT) {
2782 cm_msg(MLOG,
"",
"Sum of channels NOT in Tolerance: System time was reset");
2790 cm_msg(MLOG,
"",
" --epics_ca_get(value = %f)",*pvalue);
2792 cm_msg(MLOG,
"",
" --epics_ca_get(NULL pointer to return data)");
2797 fprintf(fp,
"%u : --epics_ca_get(channel=%d(%s), value=%f)\n", ss_time(), channel,
2800 fprintf(fp,
"%u : --epics_ca_get(channel=%d, NULL pointer to return data)\n",
2801 ss_time(), channel);
2814 if (fp) fprintf(fp,
"%u : ++epics_ca_get_demand(channel=%d(%s))\n", ss_time(), channel,
2818 cm_msg(MLOG,
"",
" ++epics_ca_get_demand(channel %d)",channel);
2822 if (channel < info->num_channels) {
2826 if (*(info->
gchan+channel) == -1.f) {
2838 cm_msg(MLOG,
"",
"G-flag: search Looking for device specific handling of Device "
2841 if ((strcmp(ds,
"BEND")==0) || (strcmp(ds,
"QUAD")==0) ||
2842 (strcmp(ds,
"SEPT")==0) || (strcmp(ds,
"STER")==0) ||
2843 (strcmp(ds,
"PS" )==0) || (strcmp(ds,
"TS" )==0) ||
2844 (strcmp(ds,
"KICKER")==0) ) {
2847 cm_msg(MLOG,
"",
"G-flag: Device type %s found",ds);
2850 if ((tpos = strstr(tename,
":COM:2")) != NULL) {
2851 strcpy(tpos,
":STA:1");
2852 }
else if ((tpos = strstr(tename,
":STA:1")) != NULL) {
2853 strcpy(tpos,
":COM:2");
2854 }
else if ((tpos = strstr(tename,
":SOL:2")) != NULL) {
2855 findrefchan =
FALSE;
2856 }
else if ((tpos = strstr(tename,
":IST:2")) != NULL) {
2857 findrefchan =
FALSE;
2859 cm_msg(MLOG,
"",
"G-flag: search Channel %d (%s) not handled for type %s",
2861 findrefchan =
FALSE;
2864 }
else if (strcmp(ds,
"FENTE")==0) {
2866 if ((tpos = strstr(tename,
":COM:2")) != NULL) {
2867 strcpy(tpos,
":STA:1");
2868 }
else if ((tpos = strstr(tename,
":STA:1")) != NULL) {
2869 strcpy(tpos,
":COM:2");
2870 }
else if ((tpos = strstr(tename,
":SOL:2")) != NULL) {
2871 strcpy(tpos,
":IST1:2");
2872 }
else if ((tpos = strstr(tename,
":IST1:2")) != NULL) {
2873 strcpy(tpos,
":SOL:2");
2874 }
else if ((tpos = strstr(tename,
":POSA:2")) != NULL) {
2875 strcpy(tpos,
":SOL:2");
2877 cm_msg(MLOG,
"",
"G-flag: search Channel %d (%s) not handled for type %s",
2879 findrefchan =
FALSE;
2882 }
else if (strcmp(ds,
"BX")==0) {
2883 if ((tpos = strstr(tename,
":COM:2")) != NULL) {
2884 strcpy(tpos,
":STA:1");
2885 }
else if ((tpos = strstr(tename,
":STA:1")) != NULL) {
2886 strcpy(tpos,
":COM:2");
2888 cm_msg(MLOG,
"",
"G-flag: search Channel %d (%s) not handled for type %s",
2890 findrefchan =
FALSE;
2893 }
else if (strcmp(ds,
"HVPS")==0) {
2895 findrefchan =
FALSE;
2897 if (strncmp(ds,
"**",2) != 0)
2898 cm_msg(MLOG,
"",
"G-flag: search Channel %d (%s) type %s is not handled",
2900 findrefchan =
FALSE;
2905 cm_msg(MLOG,
"",
"G-flag: search Searching for channel %s",tename);
2915 *(info->
gchan+j) = channel;
2922 if (*(info->
gchan+channel) < 0) {
2923 cm_msg(MLOG,
"",
"G-flag: search Channel corresponding to %d (%s) NOT found!",
2933 if (*(info->
iscmd+channel)) {
2934 if (*(info->
gchan+channel) > 0) {
2942 cm_msg(MLOG,
"",
"G-flag: command/setpoint channel: Looking for device "
2943 "specific handling of Device type %s",ds);
2945 if ((strcmp(ds,
"BEND")==0) || (strcmp(ds,
"QUAD")==0) ||
2946 (strcmp(ds,
"SEPT")==0) || (strcmp(ds,
"STER")==0) ||
2947 (strcmp(ds,
"PS" )==0) ||
2948 (strcmp(ds,
"TS" )==0) || (strcmp(ds,
"KICKER")==0)) {
2953 tval = (int) *(info->
array+gchan);
2955 if ((tval & 0x0005) == 0x0005) {
2956 if (*(info->
array_m+channel) != 0.f) {
2957 if (*(info->
array_m+channel) != -2.f)
2958 cm_msg(MLOG,
"",
"%d(%s): Command changed to \"ON\"", channel,
2961 cm_msg(MLOG,
"",
"%d(%s): Current Command is \"ON\"", channel,
2966 if (*(info->
array_m+channel) != 1.f) {
2967 if (*(info->
array_m+channel) != -2.f)
2968 cm_msg(MLOG,
"",
"%d(%s): Command changed to \"OFF\"", channel,
2971 cm_msg(MLOG,
"",
"%d(%s): Current Command is \"OFF\"", channel,
2979 }
else if (strcmp(ds,
"FENTE")==0) {
2982 cur = (int) *(info->
array +gchan);
2983 prev = (int) *(info->
array_m+gchan);
2987 if (((cur & 0x0100) != 0x0100) && ((cur & 0x0200) != 0x0200)) {
2989 if ((cur & 0x0004) && ((cur & 0x0003) != 0x0003)) {
2991 if ((*(info->
array_m+channel) != (float) 0x0002) &&
2993 if (*(info->
array_m+channel) != -2.f)
2994 cm_msg(MLOG,
"",
"%d(%s): Command changed to \"STOP\"", channel,
2997 cm_msg(MLOG,
"",
"%d(%s): Current Command is \"STOP\"", channel,
3014 }
else if (strcmp(ds,
"BX") == 0) {
3018 tval = (int) *(info->
array+gchan);
3020 if ((tval & 0x0001) == 0x0001) {
3021 if (*(info->
array_m+channel) != 0.f) {
3022 if (*(info->
array_m+channel) != -2.f)
3023 cm_msg(MLOG,
"",
"%d(%s): Command changed to \"OPEN\"", channel,
3026 cm_msg(MLOG,
"",
"%d(%s): Current Command is \"OPEN\"", channel,
3031 if (*(info->
array_m+channel) != 1.f) {
3032 if (*(info->
array_m+channel) != -2.f)
3033 cm_msg(MLOG,
"",
"%d(%s): Command changed to \"CLOSE\"", channel,
3036 cm_msg(MLOG,
"",
"%d(%s): Current Command is \"CLOSE\"", channel,
3044 cm_msg(MLOG,
"",
"G-flag: command/setpoint Channel %d (%s) type %s is not han"
3057 if (*(info->
gchan+channel) < -1.f)
3059 if (pvalue) *pvalue = 0.f;
3065 cm_msg(MLOG,
"",
" --epics_ca_get_demand(value = %f)",*pvalue);
3067 cm_msg(MLOG,
"",
" --epics_ca_get_demand(NULL pointer to return)");
3072 fprintf(fp,
"%u : --epics_ca_get_demand(channel=%d(%s), value=%f)\n", ss_time(),
3075 fprintf(fp,
"%u : --epics_ca_get_demand(channel=%d,NULL pointer to return demand)\n"
3076 ,ss_time(), channel);
3087 cm_msg(MLOG,
"",
" ++epics_ca_get_all(%d channels)", channels);
3093 cm_msg(MLOG,
"",
" --epics_ca_get_all()");
3101 cm_msg(MLOG,
"",
" ++epics_ca_get_default_name(channel %d, name %s)", channel, name);
3103 if ((name != NULL) && (channel >= 0) && (channel< info->num_channels)) {
3107 cm_msg(MLOG,
"",
" --epics_ca_get_default_name(channel %d, name %s)", channel, name);
3117 cm_msg(MLOG,
"",
" ++epics_ca_get_default_threshold(channel %d)", channel);
3119 if (pvalue != NULL) {
3121 if (info->
threshold && (channel >= 0) && (channel < info->num_channels))
3126 cm_msg(MLOG,
"",
" --epics_ca_get_default_threshold(channel %d, threshold %f)",
3139 float value, *pvalue;
3143 va_start(argptr, cmd);
3144 status = FE_SUCCESS;
3147 cm_msg(MLOG,
"",
"++epics_ca(CMD=%d)",cmd);
3149 if (cmd == CMD_INIT) {
3152 hKey = va_arg(argptr, HNDLE);
3153 pinfo = va_arg(argptr,
void *);
3154 channel = va_arg(argptr, INT);
3155 flags = va_arg(argptr,
DWORD);
3159 if (info) info->
flags = flags;
3162 info = va_arg(argptr,
void *);
3168 cm_msg(MLOG,
"",
"ss_sleep(100)");
3170 status = FE_ERR_DISABLED;
3181 channel = va_arg(argptr, INT);
3182 value = (float) va_arg(argptr,
double);
3187 channel = va_arg(argptr, INT);
3188 value = (float) va_arg(argptr,
double);
3193 channel = va_arg(argptr, INT);
3194 label = va_arg(argptr,
char *);
3196 status = FE_SUCCESS;
3200 channel = va_arg(argptr, INT);
3201 pvalue = va_arg(argptr,
float *);
3205 case CMD_GET_DEMAND:
3206 channel = va_arg(argptr, INT);
3207 pvalue = va_arg(argptr,
float *);
3212 channel = va_arg(argptr, INT);
3213 pvalue = va_arg(argptr,
float *);
3217 case CMD_GET_DEFAULT_NAME:
3218 channel = va_arg(argptr, INT);
3219 label = va_arg(argptr,
char *);
3223 case CMD_GET_DEFAULT_THRESHOLD:
3224 channel = va_arg(argptr, INT);
3225 pvalue = va_arg(argptr,
float *);
3231 cm_msg(MLOG,
"",
"**epics_ca(CMD=%d) is not handled",cmd);
3241 cm_msg(MLOG,
"",
"--epics_ca()");