17#include "pvxsWrapper.h"
19#include "acq400_asyn_common.h"
23template<
class CONTAINER>
24const CONTAINER* PVX_getter<CONTAINER>::parse(CONTAINER* values,
char* txt)
27 if (G_verbose > 1 ) fprintf(stderr,
"parse: \"%s\"\n", txt);
29 if (sscanf(txt,
"{%u}", &nelems) != 1){
30 fprintf(stderr,
"scan fail\n");
33 char* start = strchr(txt,
'[');
35 char* end = strchr(txt,
']');
39 split2(++start, *values,
',');
41 fprintf(stderr,
"parse: values.size %u nelems %u\n",
42 (
unsigned)(values->size()), nelems);
44 assert(values->size() == nelems);
49template<
class CONTAINER>
50const CONTAINER* PVX_getter<CONTAINER>::pvx_get(
52 bool wait_first_change)
54 static char myline[MAXSIZE];
57 snprintf(cmd, 128,
"unbuffer pvxmonitor -r value %s", pv_name);
59 FILE *pp = popen(cmd,
"r");
60 while (fgets(myline, MAXSIZE, pp) != 0){
61 if (lno++ == 0 && wait_first_change){
62 fprintf(stderr,
"skip initial value and wait_first change\n");
66 if (G_verbose > 2 ) fprintf(stderr,
"[%2d] %s\n", lno, myline);
67 char* cursor = strstr(myline, needle);
69 return parse(values, cursor+strlen(needle));
76template<
class CONTAINER>
77const char* PVX_getter<CONTAINER>::make_pv_name(
78 const char* hostname,
const char* pv_suffix)
80 char* pvname =
new char[strlen(hostname)+strlen(pv_suffix)];
81 strcpy(pvname, hostname);
82 return strcat(pvname, pv_suffix);
87PVX_getter<VIS>::PVX_getter(
89 const char* pv_suffix,
91 pv_name(make_pv_name(hostname, pv_suffix)),
92 needle(
"value int32_t[] = ")
98PVX_getter<VDS>::PVX_getter(
100 const char* pv_suffix,
102 pv_name(make_pv_name(hostname, pv_suffix)),
103 needle(
"value double[] = ")
108template<
class CONTAINER>
109PVX_getter<CONTAINER>::PVX_getter(
110 const char* hostname,
111 const char* pv_suffix,
113 pv_name(make_pv_name(hostname, pv_suffix)),
120template<
class CONTAINER>
121PVX_getter<CONTAINER>::~PVX_getter()
Declarations for key XRM structures for internal and wire (external) use.