From: hades Date: Thu, 7 Sep 2000 15:22:00 +0000 (+0000) Subject: *** empty log message *** X-Git-Url: https://jspc29.x-matter.uni-frankfurt.de/git/?a=commitdiff_plain;h=03a0fd16a8b3a4ed99dc3e7fbdb221f56ef082a2;p=daqdata.git *** empty log message *** --- diff --git a/allParam/ca/caParam.c b/allParam/ca/caParam.c index f076256..4df3a8e 100644 --- a/allParam/ca/caParam.c +++ b/allParam/ca/caParam.c @@ -8,9 +8,8 @@ #include "param.h" -static chid Param_openChannel(const Param *, const char *, int *); -static int Param_closeChannel(const Param *, chid, char *); -static char *Param_returnPVName(const char *, const char *, int); +static void Param_copyToAllocMem(struct event_handler_args args); +static void *Param_returnPVName(const char *, const char *, char *); static void Param_strerror(Param *, const char *); int conParam(Param *my) @@ -30,79 +29,35 @@ int Param_getInt(const Param *my, const char *name, const char *idx, int *row, u int Param_getString(const Param *my, const char *name, const char *idx, int *row, char *val) { - int retVal = 0; - int found; - chid chan; - char *pPVName; - int i; - - if(ca_task_initialize() != ECA_NORMAL) { - Param_strerror((Param *) my, "Cannot establish ca connection.\n"); - return -1; - } - - pPVName = Param_returnPVName(name, idx, -1); - chan = Param_openChannel(my, pPVName, &found); - switch (found) { - case(-1): - Param_strerror((Param *) my, "Cannot establish ca connection.\n"); - break; - case(0): - *row = 0; - break; - case(1): - *row = 1; - if(ca_bget(chan, val) != ECA_NORMAL) { - Param_strerror((Param *) my, "Did not receive correct data via ca.\n"); - return -1; - } - retVal = Param_closeChannel(my, chan, pPVName); - break; - } - - if(ca_task_exit() != ECA_NORMAL) { - Param_strerror((Param *) my, "Cannot close ca connection.\n"); - return -1; - } - - return retVal; + return Param_getStringArray(my, name, idx, 1, row, &val); } int Param_getIntArray(const Param *my, const char *name, const char *idx, int maxrows, int *rows, unsigned long int *val) { int retVal = 0; - int found; - chid chan; - char *pPVName; int i; + char *endptr; + char *value[PARAM_MAX_NVALS]; - if(ca_task_initialize() != ECA_NORMAL) { - Param_strerror((Param *) my, "Cannot establish ca connection.\n"); - return -1; + for (i = 0 ; i < PARAM_MAX_NVALS ; i++) { + value[i] = malloc(PARAM_MAX_VALUE_LEN * sizeof(char)); } - pPVName = Param_returnPVName(name, idx, -1); - chan = Param_openChannel(my, pPVName, &found); - switch (found) { - case(-1): - Param_strerror((Param *) my, "Cannot establish ca connection.\n"); - break; - case(0): - *rows = 0; - break; - case(1): - *rows = maxrows; - if(ca_array_get(DBR_LONG, maxrows, chan, val) != ECA_NORMAL) { - Param_strerror((Param *) my, "Did not receive correct data via ca.\n"); + if((retVal = Param_getStringArray(my, name, idx, maxrows, rows, value)) == 0) { + for (i = 0 ; i < *rows ; i++) { + val[i] = strtoul(value[i], &endptr, 0); + if(*endptr != '\0') { + Param_strerror((Param *) my, "Value seems not to be integer.\n"); retVal = -1; } - retVal|= Param_closeChannel(my, chan, pPVName); - break; + } + } + if (retVal != 0) { + *rows = 0; } - if(ca_task_exit() != ECA_NORMAL) { - Param_strerror((Param *) my, "Cannot close ca connection.\n"); - return -1; + for (i = 0 ; i < PARAM_MAX_NVALS ; i++) { + free(value[i]); } return retVal; } @@ -110,45 +65,67 @@ int Param_getIntArray(const Param *my, const char *name, const char *idx, int ma int Param_getStringArray(const Param *my, const char *name, const char *idx, int maxrows, int *rows, char **val) { int retVal = 0; - int found; + int i; + int status; + int found = 1; chid chan; char *pPVName; - int i; - if(ca_task_initialize() != ECA_NORMAL) { - Param_strerror((Param *) my, "Cannot establish ca connection.\n"); - return -1; + *rows = 0; + if((status = ca_task_initialize()) != ECA_NORMAL) { + Param_strerror((Param *) my, ca_message(status)); + retVal = -1; } - *rows = 0; - for (i = 0 ; i < maxrows ; i++) { - pPVName = Param_returnPVName(name, idx, i); - chan = Param_openChannel(my, pPVName, &found); - switch (found) { - case(-1): - Param_strerror((Param *) my, "Cannot establish ca connection.\n"); - return -1; - break; - case(0): - i = maxrows; - break; - case(1): - if(ca_bget(chan, val) != ECA_NORMAL) { - Param_strerror((Param *) my, "Did not receive correct data via ca.\n"); - retVal = -1; - } else { - *rows++; - } - retVal|= Param_closeChannel(my, chan, pPVName); - break; + pPVName = malloc((strlen("HAD:PARAM:") + strlen(name) + 1 + strlen(idx) + 1) * sizeof(char)); + Param_returnPVName(name, idx, pPVName); + + if((status = ca_search(pPVName, &chan)) == ECA_GETFAIL) { + Param_strerror((Param *) my, ca_message(status)); + found = 0; + } else if (status != ECA_NORMAL) { + Param_strerror((Param *) my, ca_message(status)); + retVal = -1; + found = -1; + } else { + found = 1; + } + + if((status = ca_pend_io(TIMEOUT)) != ECA_NORMAL) { + Param_strerror((Param *) my, ca_message(status)); + found = 0; + retVal = 0; + } + if(found == 1) { + ParamResult resultS, *result = &resultS; + result->val = val; + result->rows = rows; + result->maxrows = maxrows; + result->my = my; + result->retVal = &retVal; + + status = ca_array_get_callback(ca_field_type(chan), ca_element_count(chan), chan, Param_copyToAllocMem, result); + Param_strerror((Param *) my, ca_message(status)); + + if((status = ca_pend_event(TIMEOUT)) == ECA_TIMEOUT) { + Param_strerror((Param *) my, ca_message(status)); + } else if (status != ECA_NORMAL) { + Param_strerror((Param *) my, ca_message(status)); + retVal = -1; } } - if(ca_task_exit() != ECA_NORMAL) { - Param_strerror((Param *) my, "Cannot close ca connection.\n"); - return -1; + if((status = ca_clear_channel(chan)) != ECA_NORMAL) { + Param_strerror((Param *) my, ca_message(status)); + retVal = -1; } - + + free(pPVName); + + if((status = ca_task_exit()) != ECA_NORMAL) { + Param_strerror((Param *) my, ca_message(status)); + } + return retVal; } @@ -157,53 +134,39 @@ const char *Param_getErrStr(const Param *my) return my->strerror; } -static chid Param_openChannel(const Param *my, const char *pPVName, int *found) +static void Param_copyToAllocMem(struct event_handler_args args) { - int status; - chid chan; - if((status = ca_search(pPVName, &chan)) == ECA_NORMAL) { - *found = 1; - } else if (status == ECA_GETFAIL) { - *found = 0; + int i; + ParamResult *result = args.usr; + dbr_string_t *buffer = (dbr_string_t *) args.dbr; + (int *) result->rows; + (int) result->maxrows; + (char **) result->val; + (const Param*) result->my; + (int *) result->retVal; + + *(result->rows) = (args.count > result->maxrows) ? + result->maxrows : + args.count; + if(args.type == DBR_STRING && args.status == ECA_NORMAL) { + for(i = 0 ; i < *(result->rows) ; i++) { + strcpy((result->val)[i], buffer[i]); + } } else { - *found = -1; - } - - if(ca_pend_io(TIMEOUT) != ECA_NORMAL) { - Param_strerror((Param *) my, "Cannot switch to asynchronous mode.\n"); - } - return chan; -} - -static int Param_closeChannel(const Param *my, chid chan, char *pPVName) -{ - if(ca_pend_io(TIMEOUT) != ECA_NORMAL) { - Param_strerror((Param *) my, "Cannot switch to asynchronous mode.\n"); - } - free(pPVName); - if(ca_clear_channel(chan) != ECA_NORMAL) { - return -1; + Param_strerror((Param *) result->my, ca_message(args.status)); + *(result->rows) = 0; + *(result->retVal) = -1; } - return 0; } -static char *Param_returnPVName(const char *name, const char *idx, int num) +static void *Param_returnPVName(const char *name, const char *idx, char *pPVName) { int i; - char *pPVName; - - if (num == -1) { - pPVName = malloc((strlen("HAD:PARAM:") + strlen(name) + 1 + strlen(idx) + 1) * sizeof(char)); - sprintf(pPVName ,"HAD:PARAM:%s:%s", name, idx); - } else { - pPVName = malloc((strlen("HAD:PARAM:") + strlen(name) + 1 + strlen(idx) + 1 + 4 + 1) * sizeof(char)); - sprintf(pPVName ,"HAD:PARAM:%s:%s:%d", name, idx, num); - } + sprintf(pPVName ,"HAD:PARAM:%s:%s", name, idx); for (i = 0 ; i < strlen(pPVName) ; i++) { pPVName[i] = toupper(pPVName[i]); } - return pPVName; } static void Param_strerror(Param *my, const char *strerror) diff --git a/allParam/ca/caParam.h b/allParam/ca/caParam.h index c35ed14..340d72b 100644 --- a/allParam/ca/caParam.h +++ b/allParam/ca/caParam.h @@ -8,12 +8,21 @@ #define PARAM_MAX_NVALS 1024 #define PARAM_MAX_NAME_LEN 128 -#define TIMEOUT 1.0 +#define TIMEOUT 0.5 +#define ECA_NORETVAL 106 typedef struct ParamS { char *strerror; } Param; +typedef struct ParamResultS { + char **val; + int *rows; + int maxrows; + const Param *my; + int *retVal; +} ParamResult; + /****************************************************************** * Section containing the API for param (common to all param.h's) * ******************************************************************/ diff --git a/allParam/test/Makefile b/allParam/test/Makefile index e74021b..a19d897 100644 --- a/allParam/test/Makefile +++ b/allParam/test/Makefile @@ -36,11 +36,11 @@ LIBS = ca file ora psql tcl suite : $(addsuffix _suite,$(LIBS)) test : $(addsuffix _suite_new,$(LIBS)) - time ./ca_suite > test_protocol.txt - time ./file_suite >> test_protocol.txt - time ./ora_suite >> test_protocol.txt - time ./psql_suite >> test_protocol.txt - time ./tcl_suite >> test_protocol.txt + time ./ca_suite > test_protocol.txt 2>&1 + time ./file_suite >> test_protocol.txt 2>&1 + time ./ora_suite >> test_protocol.txt 2>&1 + time ./psql_suite >> test_protocol.txt 2>&1 + time ./tcl_suite >> test_protocol.txt 2>&1 $(addsuffix _suite_new,$(LIBS)) : $(RM) $(patsubst %_new,%,$@)