You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
0 B
219 lines
0 B
14 years ago
|
/*
|
||
|
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 <http://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
#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 <stdarg.h>
|
||
|
|
||
|
#ifdef __GNUC__ /* ---- */
|
||
|
#include <semaphore.h>
|
||
|
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 <Windows.h>
|
||
|
#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
|