#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)
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;
}
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;
}
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)