#ifdef shell
gcc -o ${0//.c/} $0 -lxbee -g
exit
}
#endif
/*
libxbee - a C library to aid the use of Digi's Series 1 XBee modules
running in API mode (AP=2).
Copyright (C) 2009 Attie Grande (attie@attie.co.uk)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
/* this sample will control digital output pins of a chosen node */
#include
#include
#include
#include
int mode;
char bitmask;
char outputs;
void sighandler(int sig) {
if (sig == SIGINT) {
xbee_end();
exit(0);
}
}
void doneCB(xbee_con *con, xbee_pkt *pkt) {
/* this packet should be confirmation... */
xbee_end();
exit(0);
}
void doCB(xbee_con *con, xbee_pkt *pkt) {
int i,m;
outputs = pkt->IOdata[0].IOdigital;
printf("\n 7 6 5 4 3 2 1 0\n");
printf("Current output state: ");
for (i = 0; i < 8; i++) {
if (xbee_hasdigital(pkt,0,7-i)) {
if (xbee_getdigital(pkt,0,7-i)) {
printf(" 1");
} else {
printf(" 0");
}
} else {
printf(" x");
}
}
printf("\n");
switch (mode) {
case 0: outputs |= bitmask; break;
case 1: outputs &= ~bitmask; break;
case 2: default:
xbee_end();
exit(0);
}
m = outputs;
printf("New output state: ");
for (i = 0; i < 8; i++) {
if (xbee_hasdigital(pkt,0,7-i)) {
if (m & 0x80) {
printf(" 1");
} else {
printf(" 0");
}
} else {
printf(" x");
}
m <<= 1;
}
printf("\n\n");
con->callback = doneCB;
xbee_senddata(con,"IO%c",outputs);
}
void usage(char *argv0) {
printf("Usage: %s \n",argv0);
printf("Usage: %s [port[0-7]]...\n",argv0);
exit(1);
}
int main(int argc, char *argv[]) {
xbee_con *con;
if (argc < 2) usage(argv[0]);
if (!strcasecmp(argv[1],"on")) {
mode = 0;
} else if (!strcasecmp(argv[1],"off")) {
mode = 1;
} else if (!strcasecmp(argv[1],"query")) {
mode = 2;
} else usage(argv[0]);
if (mode != 2) {
int i;
char *c;
bitmask = 0;
c = argv[2];
while (*c != '\0') {
*c -= '0';
if ((*c >= 0) && (*c <= 7)) {
bitmask |= 0x01 << *c;
} else {
usage(argv[0]);
}
c++;
}
}
/* setup libxbee */
if (xbee_setupAPI("/dev/ttyUSB0",57600,'+',250) == -1) {
return 1;
}
/* handle ^C */
signal(SIGINT, sighandler);
/* get a connection to the remote XBee */
con = xbee_newcon('I',xbee_64bitRemoteAT, 0x0013A200, 0x403CB26B);
con->waitforACK = 1;
con->callback = doCB;
xbee_senddata(con,"IS");
/* timeout after 1 second... */
sleep(1);
xbee_end();
return 0;
}