/* 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 . */ #ifndef XBEE_H #define XBEE_H #if !defined(__GNUC__) && !defined(_WIN32) #error "This library is only currently compatible with Linux and Win32" #endif #ifdef __cplusplus extern "C" { #endif #ifndef __LIBXBEE_API_H typedef void* xbee_hnd; #endif #include #ifdef __GNUC__ /* ---- */ #include typedef pthread_mutex_t xbee_mutex_t; typedef pthread_cond_t xbee_cond_t; typedef pthread_t xbee_thread_t; typedef sem_t xbee_sem_t; typedef FILE* xbee_file_t; #elif (defined(WIN32) || defined(_WIN32)) /* -------------- */ #include #define CALLTYPE __stdcall #define CALLTYPEVA __cdecl typedef HANDLE xbee_mutex_t; typedef CONDITION_VARIABLE xbee_cond_t; typedef HANDLE xbee_thread_t; typedef HANDLE xbee_sem_t; typedef HANDLE xbee_file_t; #else #error "Unknown operating system or compiler" #endif /* ------------- */ #ifndef CALLTYPE #define CALLTYPE #endif #ifndef CALLTYPEVA #define CALLTYPEVA #endif enum xbee_types { xbee_unknown, xbee_localAT, /* frame ID */ xbee_remoteAT, xbee_modemStatus, xbee_txStatus, /* XBee Series 1 stuff */ xbee_16bitRemoteAT, /* frame ID */ xbee_64bitRemoteAT, /* frame ID */ xbee_16bitData, /* frame ID for ACKs */ xbee_64bitData, /* frame ID for ACKs */ xbee_16bitIO, xbee_64bitIO, /* XBee Series 2 stuff */ xbee2_data, xbee2_txStatus }; typedef enum xbee_types xbee_types; typedef struct xbee_sample xbee_sample; struct xbee_sample { /* X A5 A4 A3 A2 A1 A0 D8 D7 D6 D5 D4 D3 D2 D1 D0 */ unsigned short IOmask; /* IO */ /* X X X X X X X D8 D7 D6 D5 D4 D3 D2 D1 D0 */ unsigned short IOdigital; /* IO */ /* X X X X X D D D D D D D D D D D */ unsigned short IOanalog[6]; /* IO */ }; typedef struct xbee_pkt xbee_pkt; struct xbee_pkt { unsigned int sAddr64 : 1; /* yes / no */ unsigned int dataPkt : 1; /* if no - AT packet */ unsigned int txStatusPkt : 1; unsigned int modemStatusPkt : 1; unsigned int remoteATPkt : 1; unsigned int IOPkt : 1; unsigned int isBroadcastADR : 1; unsigned int isBroadcastPAN : 1; unsigned char frameID; /* AT Status */ unsigned char atCmd[2]; /* AT */ unsigned char status; /* AT Data Status */ /* status / options */ unsigned char samples; unsigned char RSSI; /* Data */ unsigned char Addr16[2]; /* AT Data */ unsigned char Addr64[8]; /* AT Data */ unsigned char data[128]; /* AT Data */ unsigned int datalen; xbee_types type; xbee_pkt *next; xbee_sample IOdata[1]; /* this array can be extended by using a this trick: p = calloc(sizeof(xbee_pkt) + (sizeof(xbee_sample) * (samples - 1))) */ }; typedef struct xbee_con xbee_con; struct xbee_con { unsigned int tAddr64 : 1; unsigned int atQueue : 1; /* queues AT commands until AC is sent */ unsigned int txDisableACK : 1; unsigned int txBroadcastPAN: 1; /* broadcasts to PAN */ unsigned int destroySelf : 1; /* if set, the callback thread will destroy the connection after all of the packets have been processed */ unsigned int waitforACK : 1; /* waits for the ACK or NAK after transmission */ unsigned int noFreeAfterCB : 1; /* prevents libxbee from free'ing the packet after the callback has completed */ unsigned int __spare__ : 1; xbee_types type; unsigned char frameID; unsigned char tAddr[8]; /* 64-bit 0-7 16-bit 0-1 */ void *customData; /* can be used to store data related to this connection */ void (CALLTYPE *callback)(xbee_con*,xbee_pkt*); /* call back function */ void *callbackList; xbee_mutex_t callbackmutex; xbee_mutex_t callbackListmutex; xbee_mutex_t Txmutex; xbee_sem_t waitforACKsem; volatile unsigned char ACKstatus; /* 255 = waiting, 0 = success, 1 = no ack, 2 = cca fail, 3 = purged */ xbee_con *next; }; int CALLTYPE xbee_setup(char *path, int baudrate); int CALLTYPE xbee_setuplog(char *path, int baudrate, int logfd); int CALLTYPE xbee_setupAPI(char *path, int baudrate, char cmdSeq, int cmdTime); int CALLTYPE xbee_setuplogAPI(char *path, int baudrate, int logfd, char cmdSeq, int cmdTime); xbee_hnd CALLTYPE _xbee_setup(char *path, int baudrate); xbee_hnd CALLTYPE _xbee_setuplog(char *path, int baudrate, int logfd); xbee_hnd CALLTYPE _xbee_setupAPI(char *path, int baudrate, char cmdSeq, int cmdTime); xbee_hnd CALLTYPE _xbee_setuplogAPI(char *path, int baudrate, int logfd, char cmdSeq, int cmdTime); int CALLTYPE xbee_end(void); int CALLTYPE _xbee_end(xbee_hnd xbee); void CALLTYPE xbee_logitf(char *format, ...); void CALLTYPE _xbee_logitf(xbee_hnd xbee, char *format, ...); void CALLTYPE xbee_logit(char *str); void CALLTYPE _xbee_logit(xbee_hnd xbee, char *str); xbee_con * CALLTYPEVA xbee_newcon(unsigned char frameID, xbee_types type, ...); xbee_con * CALLTYPEVA _xbee_newcon(xbee_hnd xbee, unsigned char frameID, xbee_types type, ...); xbee_con * CALLTYPE _xbee_vnewcon(xbee_hnd xbee, unsigned char frameID, xbee_types type, va_list ap); void CALLTYPE xbee_purgecon(xbee_con *con); void CALLTYPE _xbee_purgecon(xbee_hnd xbee, xbee_con *con); void CALLTYPE xbee_endcon2(xbee_con **con, int alreadyUnlinked); void CALLTYPE _xbee_endcon2(xbee_hnd xbee, xbee_con **con, int alreadyUnlinked); #define xbee_endcon(x) xbee_endcon2(&(x),0) #define _xbee_endcon(xbee,x) _xbee_endcon2((xbee),&(x),0) int CALLTYPE xbee_nsenddata(xbee_con *con, char *data, int length); int CALLTYPE _xbee_nsenddata(xbee_hnd xbee, xbee_con *con, char *data, int length); int CALLTYPEVA xbee_senddata(xbee_con *con, char *format, ...); int CALLTYPEVA _xbee_senddata(xbee_hnd xbee, xbee_con *con, char *format, ...); int CALLTYPE xbee_vsenddata(xbee_con *con, char *format, va_list ap); int CALLTYPE _xbee_vsenddata(xbee_hnd xbee, xbee_con *con, char *format, va_list ap); #if defined(WIN32) /* oh and just 'cos windows has rubbish memory management rules... this too */ void CALLTYPE xbee_free(void *ptr); #endif /* ------------- */ xbee_pkt * CALLTYPE xbee_getpacket(xbee_con *con); xbee_pkt * CALLTYPE _xbee_getpacket(xbee_hnd xbee, xbee_con *con); xbee_pkt * CALLTYPE xbee_getpacketwait(xbee_con *con); xbee_pkt * CALLTYPE _xbee_getpacketwait(xbee_hnd xbee, xbee_con *con); int CALLTYPE xbee_hasdigital(xbee_pkt *pkt, int sample, int input); int CALLTYPE xbee_getdigital(xbee_pkt *pkt, int sample, int input); int CALLTYPE xbee_hasanalog(xbee_pkt *pkt, int sample, int input); double CALLTYPE xbee_getanalog(xbee_pkt *pkt, int sample, int input, double Vref); const char * CALLTYPE xbee_svn_version(void); const char * CALLTYPE xbee_build_info(void); void CALLTYPE xbee_listen_stop(xbee_hnd xbee); #ifdef __cplusplus } /* cplusplus */ #endif #endif