]> jspc29.x-matter.uni-frankfurt.de Git - daqdata.git/commitdiff
*** empty log message ***
authorhades <hades>
Thu, 7 Sep 2000 15:22:00 +0000 (15:22 +0000)
committerhades <hades>
Thu, 7 Sep 2000 15:22:00 +0000 (15:22 +0000)
allParam/ca/caParam.c
allParam/ca/caParam.h
allParam/test/Makefile

index f0762560965e09b6b3c15d719031367a022c0110..4df3a8e213db88823f7dd1f042319d21f678e80e 100644 (file)
@@ -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)
index c35ed149808b10841760b438f572b530d9fa2876..340d72bccbf669960f8dce94c3d6779589ed50b3 100644 (file)
@@ -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) *
  ******************************************************************/
index e74021b3e74d775678e73b551479de40322d4b88..a19d897a905b6820af73447e512a2a4b4221c0b2 100644 (file)
@@ -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,%,$@)