3 Copyright (C) 2003-2006 Elwood C. Downey
5 Updated by Jasem Mutlaq (2003-2010)
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either
10 version 2.1 of the License, or (at your option) any later version.
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public
18 License along with this library; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31 #include <sys/types.h>
39 #include "indidriver.h"
47 IDDelete (
const char *dev,
const char *name,
const char *fmt, ...)
50 printf (
"<delProperty\n device='%s'\n", dev);
52 printf (
" name='%s'\n", name);
53 printf (
" timestamp='%s'\n",
timestamp());
57 printf (
" message='");
70 IDSnoopDevice (
const char *snooped_device_name,
const char *snooped_property_name)
73 if (snooped_property_name && snooped_property_name[0])
74 printf (
"<getProperties device='%s' name='%s'/>\n",
75 snooped_device_name, snooped_property_name);
77 printf (
"<getProperties device='%s'/>\n", snooped_device_name);
90 case B_NEVER: how =
"Never";
break;
91 case B_ALSO: how =
"Also";
break;
92 case B_ONLY: how =
"Only";
break;
97 printf (
"<enableBLOB device='%s'>%s</enableBLOB>\n",
107 return (addCallback (readfiledes, (
CBF*)fp, p));
113 rmCallback (callbackid);
119 return (addTimer (millisecs, (
TCF*)fp, p));
131 return (addWorkProc ((
WPF*)fp, p));
137 rmWorkProc (workprocid);
142 IEDeferLoop (
int maxms,
int *flagp)
144 return (deferLoop (maxms, flagp));
148 IEDeferLoop0 (
int maxms,
int *flagp)
150 return (deferLoop0 (maxms, flagp));
159 char sn[MAXINDINAME];
165 if (sp) strncpy(sn, sp->name, MAXINDINAME);
170 for (i = 0; i < n ; i++)
177 IDSetSwitch(svp,
"Error: %s is not a member of %s property.", names[i], svp->
name);
188 for (i=0; i < svp->
nsp; i++)
199 IDSetSwitch(svp,
"Error: invalid state switch for property %s. %s.", svp->
name, t_count == 0 ?
"No switch is on" :
"Too many switches are on");
215 for (i = 0; i < n; i++)
221 IDSetNumber(nvp,
"Error: %s is not a member of %s property.", names[i], nvp->
name);
225 if (values[i] < np->
min || values[i] > np->max)
228 IDSetNumber(nvp,
"Error: Invalid range. Valid range is from %g to %g", np->
min, np->max);
235 for (i=0; i < n; i++)
238 np->
value = values[i];
252 for (i = 0; i < n; i++)
258 IDSetText(tvp,
"Error: %s is not a member of %s property.", names[i], tvp->
name);
264 for (i=0; i < n; i++)
282 for (i = 0; i < n; i++)
288 IDSetBLOB(bvp,
"Error: %s is not a member of %s property.", names[i], bvp->
name);
294 for (i=0; i < n; i++)
297 IUSaveBLOB(bp, sizes[i], blobsizes[i], blobs[i], formats[i]);
309 strncpy(bp->
format, format, MAXINDIFORMAT);
315 strncpy(sp->name, name, MAXINDINAME);
316 strncpy(sp->
label, label, MAXINDILABEL);
324 strncpy(lp->name, name, MAXINDINAME);
325 strncpy(lp->
label, label, MAXINDILABEL);
332 void IUFillNumber(
INumber *np,
const char *name,
const char * label,
const char *format,
double min,
double max,
double step,
double value)
335 strncpy(np->name, name, MAXINDINAME);
336 strncpy(np->
label, label, MAXINDILABEL);
337 strncpy(np->
format, format, MAXINDIFORMAT);
348 void IUFillText(
IText *tp,
const char *name,
const char * label,
const char *initialText)
351 strncpy(tp->
name, name, MAXINDINAME);
352 strncpy(tp->
label, label, MAXINDILABEL);
364 memset(bp, 0,
sizeof(
IBLOB));
365 strncpy(bp->
name, name, MAXINDINAME);
366 strncpy(bp->
label, label, MAXINDILABEL);
367 strncpy(bp->
format, label, MAXINDIBLOBFMT);
377 void IUFillSwitchVector(
ISwitchVectorProperty *svp,
ISwitch *sp,
int nsp,
const char * dev,
const char *name,
const char *label,
const char *group,
IPerm p,
ISRule r,
double timeout,
IPState s)
379 strncpy(svp->
device, dev, MAXINDIDEVICE);
380 strncpy(svp->
name, name, MAXINDINAME);
381 strncpy(svp->
label, label, MAXINDILABEL);
382 strncpy(svp->
group, group, MAXINDIGROUP);
394 strncpy(lvp->
device, dev, MAXINDIDEVICE);
395 strncpy(lvp->
name, name, MAXINDINAME);
396 strncpy(lvp->
label, label, MAXINDILABEL);
397 strncpy(lvp->
group, group, MAXINDIGROUP);
408 strncpy(nvp->
device, dev, MAXINDIDEVICE);
409 strncpy(nvp->
name, name, MAXINDINAME);
410 strncpy(nvp->
label, label, MAXINDILABEL);
411 strncpy(nvp->
group, group, MAXINDIGROUP);
424 strncpy(tvp->
device, dev, MAXINDIDEVICE);
425 strncpy(tvp->
name, name, MAXINDINAME);
426 strncpy(tvp->
label, label, MAXINDILABEL);
427 strncpy(tvp->
group, group, MAXINDIGROUP);
441 strncpy(bvp->
device, dev, MAXINDIDEVICE);
442 strncpy(bvp->
name, name, MAXINDINAME);
443 strncpy(bvp->
label, label, MAXINDILABEL);
444 strncpy(bvp->
group, group, MAXINDIGROUP);
471 if (strcmp (
tagXMLEle(root)+3,
"NumberVector") ||
472 crackDN (root, &dev, &name, NULL) < 0)
474 if (strcmp (dev, nvp->
device) || strcmp (name, nvp->
name))
479 for (i = 0; i < nvp->
nnp; i++) {
481 if (!strcmp (
tagXMLEle(ep)+3,
"Number") &&
509 if (strcmp (
tagXMLEle(root)+3,
"TextVector") ||
510 crackDN (root, &dev, &name, NULL) < 0)
512 if (strcmp (dev, tvp->
device) || strcmp (name, tvp->
name))
517 for (i = 0; i < tvp->
ntp; i++) {
546 if (strcmp (
tagXMLEle(root)+3,
"LightVector") ||
547 crackDN (root, &dev, &name, NULL) < 0)
549 if (strcmp (dev, lvp->
device) || strcmp (name, lvp->
name))
556 if (!strcmp (
tagXMLEle(ep)+3,
"Light")) {
558 for (i = 0; i < lvp->
nlp; i++) {
559 if (!strcmp (lvp->
lp[i].name, name)) {
586 if (strcmp (
tagXMLEle(root)+3,
"SwitchVector") ||
587 crackDN (root, &dev, &name, NULL) < 0)
589 if (strcmp (dev, svp->
device) || strcmp (name, svp->
name))
595 if (!strcmp (
tagXMLEle(ep)+3,
"Switch")) {
597 for (i = 0; i < svp->
nsp; i++) {
598 if (!strcmp (svp->
sp[i].name, name)) {
626 if (strcmp (
tagXMLEle(root),
"setBLOBVector") ||
627 crackDN (root, &dev, &name, NULL) < 0)
629 if (strcmp (dev, bvp->
device) || strcmp (name, bvp->
name))
637 for (i = 0; i < bvp->
nbp; i++) {
639 if (!strcmp (bp->
name, name)) {
662 clientMsgCB (
int fd,
void *arg)
664 char buf[1024], msg[1024], *bp;
669 nr = read (fd, buf,
sizeof(buf));
671 fprintf (stderr,
"%s: %s\n", me, strerror(errno));
675 fprintf (stderr,
"%s: EOF\n", me);
680 for (bp = buf; nr-- > 0; bp++) {
683 if (dispatch (root, msg) < 0)
684 fprintf (stderr,
"%s dispatch error: %s\n", me, msg);
687 fprintf (stderr,
"%s XML error: %s\n", me, msg);
698 dispatch (XMLEle *root,
char msg[])
709 if (!strcmp (rtag,
"newNumberVector")) {
710 static double *doubles;
716 if (crackDN (root, &dev, &name, msg) < 0)
721 doubles = (
double *) malloc (1);
722 names = (
char **) malloc (1);
727 if (strcmp (
tagXMLEle(ep),
"oneNumber") == 0) {
732 int newsz = (maxn=n+1)*
sizeof(
double);
733 doubles = (
double *) realloc(doubles,newsz);
734 newsz = maxn*
sizeof(
char *);
735 names = (
char **) realloc (names, newsz);
738 IDMessage (dev,
"%s: Bad format %s", name,
747 for (i=0; i < nroCheck; i++)
749 if (!strcmp(roCheck[i].propName, name))
751 if (roCheck[i].perm ==
IP_RO)
760 IDMessage(dev,
"%s: newNumberVector with no valid members",name);
764 if (!strcmp (rtag,
"newSwitchVector")) {
772 if (crackDN (root, &dev, &name, msg) < 0)
777 states = (
ISState *) malloc (1);
778 names = (
char **) malloc (1);
783 if (strcmp (
tagXMLEle(ep),
"oneSwitch") == 0) {
787 int newsz = (maxn=n+1)*
sizeof(
ISState);
788 states = (
ISState *) realloc(states, newsz);
789 newsz = maxn*
sizeof(
char *);
790 names = (
char **) realloc (names, newsz);
801 IDMessage (dev,
"%s: must be On or Off: %s", name,
808 for (i=0; i < nroCheck; i++)
810 if (!strcmp(roCheck[i].propName, name))
812 if (roCheck[i].perm ==
IP_RO)
821 IDMessage(dev,
"%s: newSwitchVector with no valid members",name);
825 if (!strcmp (rtag,
"newTextVector")) {
832 if (crackDN (root, &dev, &name, msg) < 0)
837 texts = (
char **) malloc (1);
838 names = (
char **) malloc (1);
843 if (strcmp (
tagXMLEle(ep),
"oneText") == 0) {
847 int newsz = (maxn=n+1)*
sizeof(
char *);
848 texts = (
char **) realloc (texts, newsz);
849 names = (
char **) realloc (names, newsz);
859 for (i=0; i < nroCheck; i++)
861 if (!strcmp(roCheck[i].propName, name))
863 if (roCheck[i].perm ==
IP_RO)
872 IDMessage (dev,
"%s: set with no valid members", name);
876 if (!strcmp (rtag,
"newBLOBVector")) {
879 static char **formats;
880 static int *blobsizes;
887 if (crackDN (root, &dev, &name, msg) < 0)
892 blobs = (
char **) malloc (1);
893 names = (
char **) malloc (1);
894 formats = (
char **) malloc (1);
895 blobsizes = (
int *) malloc (1);
896 sizes = (
int *) malloc (1);
901 if (strcmp (
tagXMLEle(ep),
"oneBLOB") == 0) {
905 if (na && fa && sa) {
907 int newsz = (maxn=n+1)*
sizeof(
char *);
908 blobs = (
char **) realloc (blobs, newsz);
909 names = (
char **) realloc (names, newsz);
910 formats = (
char **) realloc(formats,newsz);
911 newsz = maxn*
sizeof(int);
912 sizes = (
int *) realloc(sizes,newsz);
913 blobsizes = (
int *) realloc(blobsizes,newsz);
927 ISNewBLOB (dev, name, sizes, blobsizes, blobs, formats,names,n);
928 for (i = 0; i < n; i++)
931 IDMessage (dev,
"%s: newBLOBVector with no valid members",name);
935 if (!strcmp (rtag,
"getProperties")) {
942 fprintf (stderr,
"%s: getProperties missing version\n", me);
947 fprintf (stderr,
"%s: client version %g > %g\n", me, v, INDIV);
961 if ( !strcmp (rtag,
"setNumberVector") ||
962 !strcmp (rtag,
"setTextVector") ||
963 !strcmp (rtag,
"setLightVector") ||
964 !strcmp (rtag,
"setSwitchVector") ||
965 !strcmp (rtag,
"setBLOBVector") ||
966 !strcmp (rtag,
"defNumberVector") ||
967 !strcmp (rtag,
"defTextVector") ||
968 !strcmp (rtag,
"defLightVector") ||
969 !strcmp (rtag,
"defSwitchVector") ||
970 !strcmp (rtag,
"defBLOBVector") ||
971 !strcmp (rtag,
"message") ||
972 !strcmp (rtag,
"delProperty")) {
977 sprintf (msg,
"Unknown command: %s", rtag);
983 char configFileName[MAXRBUF], configDefaultFileName[MAXRBUF];
985 XMLEle *root = NULL, *fproot = NULL;
991 strncpy(configFileName, filename, MAXRBUF);
994 if (getenv(
"INDICONFIG"))
995 strncpy(configFileName, getenv(
"INDICONFIG"), MAXRBUF);
997 snprintf(configFileName, MAXRBUF,
"%s/.indi/%s_config.xml", getenv(
"HOME"), dev);
1001 fp = fopen(configFileName,
"r");
1004 snprintf(errmsg, MAXRBUF,
"Unable to read config file. Error loading file %s: %s\n", filename, strerror(errno));
1012 snprintf(errmsg, MAXRBUF,
"Unable to parse config XML: %s", errmsg);
1020 if (
crackDN (root, &rdev, &rname, errmsg) < 0)
1024 if (strcmp(dev, rdev))
1027 dispatch(root, errmsg);
1044 char configFileName[MAXRBUF], configDefaultFileName[MAXRBUF];
1047 strncpy(configFileName, source_config, MAXRBUF);
1050 if (getenv(
"INDICONFIG"))
1051 strncpy(configFileName, getenv(
"INDICONFIG"), MAXRBUF);
1053 snprintf(configFileName, MAXRBUF,
"%s/.indi/%s_config.xml", getenv(
"HOME"), dev);
1058 strncpy(configDefaultFileName, dest_config, MAXRBUF);
1059 else if (getenv(
"INDICONFIG"))
1060 snprintf(configDefaultFileName, MAXRBUF,
"%s.default", getenv(
"INDICONFIG"));
1062 snprintf(configDefaultFileName, MAXRBUF,
"%s/.indi/%s_config.xml.default", getenv(
"HOME"), dev);
1065 if (access(configDefaultFileName, F_OK))
1067 FILE *fpin = fopen(configFileName,
"r");
1070 FILE *fpout = fopen(configDefaultFileName,
"w");
1074 while((ch = getc(fpin)) != EOF)
1094 printf (
"<message\n");
1096 printf (
" device='%s'\n", dev);
1097 printf (
" timestamp='%s'\n",
timestamp());
1101 printf (
" message='");
1112 char configFileName[MAXRBUF];
1113 char configDir[MAXRBUF];
1117 snprintf(configDir, MAXRBUF,
"%s/.indi/", getenv(
"HOME"));
1120 strncpy(configFileName, filename, MAXRBUF);
1123 if (getenv(
"INDICONFIG"))
1124 strncpy(configFileName, getenv(
"INDICONFIG"), MAXRBUF);
1126 snprintf(configFileName, MAXRBUF,
"%s%s_config.xml", configDir, dev);
1130 if(stat(configDir,&st) != 0)
1132 if (mkdir(configDir, S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH) < 0)
1134 snprintf(errmsg, MAXRBUF,
"Unable to create config directory. Error %s: %s\n", configDir, strerror(errno));
1139 fp = fopen(configFileName,
"w");
1142 snprintf(errmsg, MAXRBUF,
"Unable to open config file. Error loading file %s: %s\n", configFileName, strerror(errno));
1156 fprintf(fp,
"<INDIDriver>\n");
1159 fprintf(fp,
"</INDIDriver>\n");
1166 fprintf (fp,
"<newNumberVector device='%s' name='%s'>\n", nvp->
device, nvp->
name);
1168 for (i = 0; i < nvp->
nnp; i++)
1171 fprintf (fp,
" <oneNumber name='%s'>\n", np->name);
1172 fprintf (fp,
" %.20g\n", np->
value);
1173 fprintf (fp,
" </oneNumber>\n");
1176 fprintf (fp,
"</newNumberVector>\n");
1183 fprintf (fp,
"<newTextVector device='%s' name='%s'>\n", tvp->
device, tvp->
name);
1185 for (i = 0; i < tvp->
ntp; i++)
1188 fprintf (fp,
" <oneText name='%s'>\n", tp->
name);
1189 fprintf (fp,
" %s\n", tp->
text ? tp->
text :
"");
1190 fprintf (fp,
" </oneText>\n");
1193 fprintf (fp,
"</newTextVector>\n");
1201 fprintf (fp,
"<newSwitchVector device='%s' name='%s'>\n", svp->
device, svp->
name);
1203 for (i = 0; i < svp->
nsp; i++)
1206 fprintf (fp,
" <oneSwitch name='%s'>\n", sp->name);
1208 fprintf (fp,
" </oneSwitch>\n");
1211 fprintf (fp,
"</newSwitchVector>\n");
1219 fprintf (fp,
"<newBLOBVector device='%s' name='%s'>\n", bvp->
device, bvp->
name);
1221 for (i = 0; i < bvp->
nbp; i++)
1224 unsigned char *encblob;
1227 fprintf (fp,
" <oneBLOB\n");
1228 fprintf (fp,
" name='%s'\n", bp->
name);
1229 fprintf (fp,
" size='%d'\n", bp->
size);
1230 fprintf (fp,
" format='%s'>\n", bp->
format);
1232 encblob = malloc (4*bp->
bloblen/3+4);
1234 for (j = 0; j < l; j += 72)
1235 fprintf (fp,
"%.72s\n", encblob+j);
1238 fprintf (fp,
" </oneBLOB>\n");
1241 fprintf (fp,
"</newBLOBVector>\n");
1253 printf (
"<defTextVector\n");
1254 printf (
" device='%s'\n", tvp->
device);
1255 printf (
" name='%s'\n", tvp->
name);
1256 printf (
" label='%s'\n", tvp->
label);
1257 printf (
" group='%s'\n", tvp->
group);
1259 printf (
" perm='%s'\n",
permStr(tvp->
p));
1260 printf (
" timeout='%g'\n", tvp->
timeout);
1261 printf (
" timestamp='%s'\n",
timestamp());
1265 printf (
" message='");
1272 for (i = 0; i < tvp->
ntp; i++) {
1274 printf (
" <defText\n");
1275 printf (
" name='%s'\n", tp->
name);
1276 printf (
" label='%s'>\n", tp->
label);
1277 printf (
" %s\n", tp->
text ? tp->
text :
"");
1278 printf (
" </defText>\n");
1281 printf (
"</defTextVector>\n");
1283 if (!isPropDefined(tvp->
name))
1286 roCheck = roCheck ? (ROSC *) realloc ( roCheck,
sizeof(ROSC) * (nroCheck+1))
1287 : (ROSC *) malloc (
sizeof(ROSC));
1288 SC = &roCheck[nroCheck++];
1290 strcpy(SC->propName, tvp->
name);
1305 printf (
"<defNumberVector\n");
1306 printf (
" device='%s'\n", n->
device);
1307 printf (
" name='%s'\n", n->
name);
1308 printf (
" label='%s'\n", n->
label);
1309 printf (
" group='%s'\n", n->
group);
1311 printf (
" perm='%s'\n",
permStr(n->
p));
1312 printf (
" timeout='%g'\n", n->
timeout);
1313 printf (
" timestamp='%s'\n",
timestamp());
1319 printf (
" message='");
1327 for (i = 0; i < n->
nnp; i++) {
1331 printf (
" <defNumber\n");
1332 printf (
" name='%s'\n", np->name);
1333 printf (
" label='%s'\n", np->
label);
1334 printf (
" format='%s'\n", np->
format);
1335 printf (
" min='%.20g'\n", np->
min);
1336 printf (
" max='%.20g'\n", np->max);
1337 printf (
" step='%.20g'>\n", np->
step);
1338 printf (
" %.20g\n", np->
value);
1340 printf (
" </defNumber>\n");
1343 printf (
"</defNumberVector>\n");
1345 if (!isPropDefined(n->
name))
1348 roCheck = roCheck ? (ROSC *) realloc ( roCheck,
sizeof(ROSC) * (nroCheck+1))
1349 : (ROSC *) malloc (
sizeof(ROSC));
1350 SC = &roCheck[nroCheck++];
1352 strcpy(SC->propName, n->
name);
1369 printf (
"<defSwitchVector\n");
1370 printf (
" device='%s'\n", s->
device);
1371 printf (
" name='%s'\n", s->
name);
1372 printf (
" label='%s'\n", s->
label);
1373 printf (
" group='%s'\n", s->
group);
1375 printf (
" perm='%s'\n",
permStr(s->
p));
1376 printf (
" rule='%s'\n",
ruleStr (s->
r));
1377 printf (
" timeout='%g'\n", s->
timeout);
1378 printf (
" timestamp='%s'\n",
timestamp());
1382 printf (
" message='");
1389 for (i = 0; i < s->
nsp; i++) {
1391 printf (
" <defSwitch\n");
1392 printf (
" name='%s'\n", sp->name);
1393 printf (
" label='%s'>\n", sp->
label);
1395 printf (
" </defSwitch>\n");
1398 printf (
"</defSwitchVector>\n");
1400 if (!isPropDefined(s->
name))
1403 roCheck = roCheck ? (ROSC *) realloc ( roCheck,
sizeof(ROSC) * (nroCheck+1))
1404 : (ROSC *) malloc (
sizeof(ROSC));
1405 SC = &roCheck[nroCheck++];
1407 strcpy(SC->propName, s->
name);
1421 printf (
"<defLightVector\n");
1422 printf (
" device='%s'\n", lvp->
device);
1423 printf (
" name='%s'\n", lvp->
name);
1424 printf (
" label='%s'\n", lvp->
label);
1425 printf (
" group='%s'\n", lvp->
group);
1427 printf (
" timestamp='%s'\n",
timestamp());
1431 printf (
" message='");
1438 for (i = 0; i < lvp->
nlp; i++) {
1440 printf (
" <defLight\n");
1441 printf (
" name='%s'\n", lp->name);
1442 printf (
" label='%s'>\n", lp->
label);
1444 printf (
" </defLight>\n");
1447 printf (
"</defLightVector>\n");
1459 printf (
"<defBLOBVector\n");
1460 printf (
" device='%s'\n", b->
device);
1461 printf (
" name='%s'\n", b->
name);
1462 printf (
" label='%s'\n", b->
label);
1463 printf (
" group='%s'\n", b->
group);
1465 printf (
" perm='%s'\n",
permStr(b->
p));
1466 printf (
" timeout='%g'\n", b->
timeout);
1467 printf (
" timestamp='%s'\n",
timestamp());
1471 printf (
" message='");
1478 for (i = 0; i < b->
nbp; i++) {
1480 printf (
" <defBLOB\n");
1481 printf (
" name='%s'\n", bp->
name);
1482 printf (
" label='%s'\n", bp->
label);
1486 printf (
"</defBLOBVector>\n");
1488 if (!isPropDefined(b->
name))
1491 roCheck = roCheck ? (ROSC *) realloc ( roCheck,
sizeof(ROSC) * (nroCheck+1))
1492 : (ROSC *) malloc (
sizeof(ROSC));
1493 SC = &roCheck[nroCheck++];
1495 strcpy(SC->propName, b->
name);
1509 printf (
"<setTextVector\n");
1510 printf (
" device='%s'\n", tvp->
device);
1511 printf (
" name='%s'\n", tvp->
name);
1513 printf (
" timeout='%g'\n", tvp->
timeout);
1514 printf (
" timestamp='%s'\n",
timestamp());
1518 printf (
" message='");
1525 for (i = 0; i < tvp->
ntp; i++) {
1527 printf (
" <oneText name='%s'>\n", tp->
name);
1528 printf (
" %s\n", tp->
text ? tp->
text :
"");
1529 printf (
" </oneText>\n");
1532 printf (
"</setTextVector>\n");
1543 printf (
"<setNumberVector\n");
1544 printf (
" device='%s'\n", nvp->
device);
1545 printf (
" name='%s'\n", nvp->
name);
1547 printf (
" timeout='%g'\n", nvp->
timeout);
1548 printf (
" timestamp='%s'\n",
timestamp());
1552 printf (
" message='");
1559 for (i = 0; i < nvp->
nnp; i++) {
1561 printf (
" <oneNumber name='%s'>\n", np->name);
1562 printf (
" %.20g\n", np->
value);
1563 printf (
" </oneNumber>\n");
1566 printf (
"</setNumberVector>\n");
1577 printf (
"<setSwitchVector\n");
1578 printf (
" device='%s'\n", svp->
device);
1579 printf (
" name='%s'\n", svp->
name);
1581 printf (
" timeout='%g'\n", svp->
timeout);
1582 printf (
" timestamp='%s'\n",
timestamp());
1586 printf (
" message='");
1593 for (i = 0; i < svp->
nsp; i++) {
1595 printf (
" <oneSwitch name='%s'>\n", sp->name);
1597 printf (
" </oneSwitch>\n");
1600 printf (
"</setSwitchVector>\n");
1611 printf (
"<setLightVector\n");
1612 printf (
" device='%s'\n", lvp->
device);
1613 printf (
" name='%s'\n", lvp->
name);
1615 printf (
" timestamp='%s'\n",
timestamp());
1619 printf (
" message='");
1626 for (i = 0; i < lvp->
nlp; i++) {
1628 printf (
" <oneLight name='%s'>\n", lp->name);
1630 printf (
" </oneLight>\n");
1633 printf (
"</setLightVector>\n");
1644 printf (
"<setBLOBVector\n");
1645 printf (
" device='%s'\n", bvp->
device);
1646 printf (
" name='%s'\n", bvp->
name);
1648 printf (
" timeout='%g'\n", bvp->
timeout);
1649 printf (
" timestamp='%s'\n",
timestamp());
1653 printf (
" message='");
1660 for (i = 0; i < bvp->
nbp; i++) {
1662 unsigned char *encblob;
1665 printf (
" <oneBLOB\n");
1666 printf (
" name='%s'\n", bp->
name);
1667 printf (
" size='%d'\n", bp->
size);
1668 printf (
" format='%s'>\n", bp->
format);
1670 encblob = malloc (4*bp->
bloblen/3+4);
1672 for (j = 0; j < l; j += 72)
1673 printf (
"%.72s\n", encblob+j);
1676 printf (
" </oneBLOB>\n");
1679 printf (
"</setBLOBVector>\n");
1689 printf (
"<setNumberVector\n");
1690 printf (
" device='%s'\n", nvp->
device);
1691 printf (
" name='%s'\n", nvp->
name);
1693 printf (
" timeout='%g'\n", nvp->
timeout);
1694 printf (
" timestamp='%s'\n",
timestamp());
1697 for (i = 0; i < nvp->
nnp; i++) {
1699 printf (
" <oneNumber name='%s'\n", np->name);
1700 printf (
" min='%g'\n", np->
min);
1701 printf (
" max='%g'\n", np->max);
1702 printf (
" step='%g'\n", np->
step);
1704 printf (
" %g\n", np->
value);
1705 printf (
" </oneNumber>\n");
1708 printf (
"</setNumberVector>\n");
1713 int isPropDefined(
const char *property_name)
1717 for (i=0; i < nroCheck; i++)
1718 if (!strcmp(property_name, roCheck[i].propName))