SysIo  1.9.0
Embedded Library and tools
xbee.h
1 
9 #ifndef _SYSIO_XBEE_H_
10 #define _SYSIO_XBEE_H_
11 
12 #include <sysio/defs.h>
13 #ifdef __cplusplus
14  extern "C" {
15 #endif
16 /* ========================================================================== */
17 #include <errno.h>
18 #include <stdio.h>
19 #include <sysio/serial.h>
20 
35 /* constants ================================================================ */
42 /*
43  * Basic communication parameters/values
44  */
45 #define XBEE_CMD_CHANNEL "CH"
46 #define XBEE_CMD_PAN_ID "ID"
47 #define XBEE_CMD_OPERATING_PAN_ID "OP"
48 #define XBEE_CMD_DEST_ADDR64_HI "DH"
49 #define XBEE_CMD_DEST_ADDR64_LO "DL"
50 #define XBEE_CMD_SRC_ADDR16 "MY"
51 #define XBEE_CMD_SER_HI "SH"
52 #define XBEE_CMD_SER_LO "SL"
53 #define XBEE_CMD_RAND_DLY_SLOTS "RN"
54 #define XBEE_CMD_MAC_MODE "MM"
55 #define XBEE_CMD_COORD_ENA "CE"
56 #define XBEE_CMD_SCAN "SC"
57 #define XBEE_CMD_SCAN_DURATION "SD"
58 #define XBEE_CMD_ASSOC_END "A1"
59 #define XBEE_CMD_ASSOC_COORD "A2"
60 #define XBEE_CMD_ASSOC_STATUS "AI"
61 #define XBEE_CMD_RSSI "DB"
62 
63 /*
64  * Transceiver Control
65  */
66 #define XBEE_CMD_PWR_LEVEL "PL"
67 #define XBEE_CMD_CCA_THRESH "CA"
68 
69 /*
70  * Sleep Parameters
71  */
72 #define XBEE_CMD_SLEEP_MODE "SM"
73 #define XBEE_CMD_SLEEP_TIMEOUT "ST"
74 #define XBEE_CMD_SLEEP_PERIOD "SP"
75 #define XBEE_CMD_SLEEP_PERIOD_DISASSOC "DP"
76 
77 /*
78  * Interface parameters
79  */
80 #define XBEE_CMD_DATA_RATE "BD"
81 #define XBEE_CMD_PACKETIZATION_TIMEOUT "RO"
82 #define XBEE_CMD_DIO7_CONFIG "D7"
83 #define XBEE_CMD_DIO6_CONFIG "D6"
84 #define XBEE_CMD_DIO5_CONFIG "D5"
85 #define XBEE_CMD_DIO4_CONFIG "D4"
86 #define XBEE_CMD_DIO3_CONFIG "D3"
87 #define XBEE_CMD_DIO2_CONFIG "D2"
88 #define XBEE_CMD_DIO1_CONFIG "D1"
89 #define XBEE_CMD_DIO0_CONFIG "D0"
90 #define XBEE_CMD_PWM0_CONFIG "PO"
91 #define XBEE_CMD_API_ENA "AP"
92 #define XBEE_CMD_PULLUP_ENA "PR"
93 
94 /*
95  * Version Info
96  */
97 #define XBEE_CMD_VERS_FIRMWARE "VR"
98 #define XBEE_CMD_VERS_HARDWARE "HV"
99 #define XBEE_CMD_VERS_FIRM_VERBOSE "VL"
100 
101 /*
102  * Received Signal Strength
103  */
104 #define XBEE_CMD_RSSI_PWM_TIMER "RP"
105 #define XBEE_CMD_RSS "DB"
106 
107 /*
108  * Error counters
109  */
110 #define XBEE_CMD_CCA_FAILS "EC"
111 #define XBEE_CMD_ACK_FAILS "EA"
112 
113 /*
114  * AT Command Params
115  */
116 #define XBEE_CMD_AT_MODE_TIMEOUT "CT"
117 #define XBEE_CMD_AT_GUARD_TIME "GT"
118 #define XBEE_CMD_AT_CMD_CHAR "CC"
119 #define XBEE_CMD_AT_EXIT "CN"
120 
121 /*
122  * XBEE specific routing
123  */
124 #define XBEE_CMD_NODE_FIND_DEST "DN"
125 #define XBEE_CMD_NODE_DISCOVER "ND"
126 #define XBEE_CMD_NODE_ID "NI"
127 #define XBEE_CMD_ACTIVE_SCAN "AS"
128 #define XBEE_CMD_FORCE_DISASSOC "DA"
129 #define XBEE_CMD_ENERGY_SCAN "ED"
130 #define XBEE_CMD_FORCE_POLL "FP"
131 
132 /*
133  * IO Line Passing / Sensor Interfacing
134  */
135 #define XBEE_CMD_SAMPLE_RATE "IR"
136 #define XBEE_CMD_SAMPLES_BEFORE_TX "IT"
137 
138 /*
139  * Misc
140  */
141 #define XBEE_CMD_WRITE_PARAMS "WR"
142 #define XBEE_CMD_RESET_SOFT "FR"
143 #define XBEE_CMD_APPLY_CHANGES "AC"
144 #define XBEE_CMD_RESTORE_DEFAULTS "RE"
145 #define XBEE_CMD_MAX_PAYLOAD "NP"
146 
152 /* structures =============================================================== */
158 typedef struct xXBeePkt xXBeePkt;
159 
165 typedef struct xXBee xXBee;
166 
167 
168 /* types ==================================================================== */
179 typedef int (*iXBeeRxCB) (struct xXBee *xbee, struct xXBeePkt *pkt, uint8_t len);
180 
184 typedef enum {
193  XBEE_CB_UNKNOWN = -1,
194  XBEE_CB_FIRST = XBEE_CB_AT_LOCAL,
195  XBEE_CB_LAST = XBEE_CB_NODE_IDENT
196 } eXBeeCbType;
197 
198 #ifndef __DOXYGEN__
199 // A modifier si eXBeeCbType modifié
200 #define XBEE_SIZEOF_CB 8
201 #endif
202 
208 typedef enum {
209  /* S1 & S2 Series */
210  XBEE_PKT_TYPE_ATCMD = 0x08,
211  XBEE_PKT_TYPE_QATCMD = 0x09, /* wait til an immed param or apply cmd */
212  XBEE_PKT_TYPE_REMOTE_ATCMD = 0x17,
213  XBEE_PKT_TYPE_ATCMD_RESP = 0x88,
214  XBEE_PKT_TYPE_MODEM_STATUS = 0x8a,
215  XBEE_PKT_TYPE_REMOTE_ATCMD_RESP = 0x97,
216 
217  /* S1 Series */
218  XBEE_PKT_TYPE_TX64 = 0x00,
219  XBEE_PKT_TYPE_TX16 = 0x01,
220  XBEE_PKT_TYPE_RX64 = 0x80,
221  XBEE_PKT_TYPE_RX16 = 0x81,
222  XBEE_PKT_TYPE_RX64_IO = 0x82,
223  XBEE_PKT_TYPE_RX16_IO = 0x83,
224  XBEE_PKT_TYPE_TX_STATUS = 0x89,
225 
226  /* S2 Series */
227  XBEE_PKT_TYPE_ZB_TX_REQ = 0x10,
228  XBEE_PKT_TYPE_ZB_CMD_FRAME = 0x11, /* Not yet impl */
229  XBEE_PKT_TYPE_ZB_TX_STATUS = 0x8b,
230  XBEE_PKT_TYPE_ZB_RX = 0x90,
231  XBEE_PKT_TYPE_ZB_RX_IO = 0x92,
232  XBEE_PKT_TYPE_ZB_RX_SENSOR = 0x94,
233  XBEE_PKT_TYPE_ZB_NODE_IDENT = 0x95,
234 } eXBeePktType;
235 
239 typedef enum {
240 
241  XBEE_PKT_STATUS_OK = 0,
242  XBEE_PKT_STATUS_ERROR = 1,
243  XBEE_PKT_STATUS_INVALID_COMMAND = 2,
244  XBEE_PKT_STATUS_INVALID_PARAMETER = 3,
245  XBEE_PKT_STATUS_TX_FAILURE = 4,
246  XBEE_PKT_STATUS_UNKNOWN = -1
248 
252 typedef enum {
253 
254  XBEE_PKT_MODEM_HARDWARE_RESET = 0,
255  XBEE_PKT_MODEM_WATCHDOG_TIMER_RESET = 1,
256  XBEE_PKT_MODEM_JOINED_NETWORK = 2,
257  XBEE_PKT_MODEM_DISASSOCIATED = 3,
258  XBEE_PKT_MODEM_COORDINATOR_STARTED = 4,
259  XBEE_PKT_MODEM_NETWORK_SECURITY_KEY_WAS_UPDATED = 7,
260  XBEE_PKT_MODEM_VOLTAGE_SUPPLY_LIMIT_EXCEEDED = 0x0D,
261  XBEE_PKT_MODEM_CONFIGURATION_CHANGED = 0x11,
262  XBEE_PKT_MODEM_STACK_ERROR = 0x80
264 
268 typedef enum {
269 
270  XBEE_RECV = 0x00,
271  XBEE_XMIT = 0x01
273 
277 typedef enum {
278 
279  XBEE_SERIES_S1 = 1,
280  XBEE_SERIES_S2 = 2,
281  XBEE_SERIES_S2B = 3,
282  XBEE_SERIES_UNKNOWN = -1
283 } eXBeeSeries;
284 
288 typedef enum {
289 
290  XBEE_DEVICE_COORDINATOR = 0,
291  XBEE_DEVICE_ROUTER = 1,
292  XBEE_DEVICE_END_DEVICE = 2,
293  XBEE_DEVICE_UNKNOWN = -1
295 
299 typedef enum {
300 
301  XBEE_EVENT_BUTTON = 1,
302  XBEE_EVENT_JOIN = 2,
303  XBEE_EVENT_POWER_ON = 3,
304  XBEE_EVENT_UNKNOWN = -1
306 
307 /* structures =============================================================== */
308 
309 
310 /* internal public functions ================================================ */
321 xXBee * xXBeeOpen (const char * pcDevice, xSerialIos * xIos, eXBeeSeries series);
322 
328 int iXBeeClose (xXBee *xbee);
329 
339 void vXBeeSetCB (xXBee *xbee, eXBeeCbType cb_type, iXBeeRxCB cb);
340 
350 void * pvXBeeGetUserContext(xXBee *xbee);
351 
362 void vXBeeSetUserContext(xXBee *xbee, void * pvContext);
363 
369 eXBeeSeries eXBeeGetSeries (const xXBee *xbee);
370 
379 int iXBeePoll (xXBee *xbee, int timeout);
380 
389 int iXBeeSendAt (xXBee *xbee,
390  const char cmd[],
391  const uint8_t *params,
392  uint8_t param_len);
393 
408 int iXBeeSendRemoteAt (xXBee *xbee,
409  const char cmd[],
410  const uint8_t params[],
411  uint8_t param_len,
412  const uint8_t addr64[8],
413  const uint8_t addr16[2],
414  uint8_t apply);
415 
416 
431 int iXBeeZbSend (xXBee *xbee,
432  const void *data,
433  uint8_t len,
434  const uint8_t addr64[8],
435  const uint8_t addr16[2],
436  uint8_t opt,
437  uint8_t radius);
438 
449 int iXBeeZbSendToCoordinator (xXBee *xbee, const void *data, uint8_t len);
450 
461 int iXBeeZbSendBroadcast (xXBee *xbee, const void *data, uint8_t len);
462 
475 int iXBeeSend64 (xXBee *xbee,
476  const void *data,
477  uint8_t len,
478  const uint8_t addr[8],
479  uint8_t opt);
480 
493 int iXBeeSend16 (xXBee *xbee,
494  const void *data,
495  uint8_t len,
496  const uint8_t addr[2],
497  uint8_t opt);
498 
499 
500 #ifdef __DOXYGEN__
501 
517 void *pvXBeeAllocPkt (xXBee *xbee, uint8_t direction, uint8_t len);
518 
526 void vXBeeFreePkt (xXBee *xbee, xXBeePkt *pkt);
527 
528 #else
529 // weak permet à l'utilisateur de redéfinir ces fonctions...
530 void *pvXBeeAllocPkt (xXBee *xbee, uint8_t direction, uint8_t len) __attribute__ ( (weak));
531 void vXBeeFreePkt (xXBee *xbee, xXBeePkt *pkt) __attribute__ ( (weak));
532 #endif
533 
539 uint8_t ucXBeePktType (xXBeePkt *pkt);
540 
547 uint16_t usXBeePktLength (xXBeePkt *pkt);
548 
555 uint8_t * pucXBeePktAddrSrc64 (xXBeePkt *pkt);
556 
563 uint8_t * pucXBeePktAddrSrc16 (xXBeePkt *pkt);
564 
571 uint8_t * iXBeePktDst16 (xXBeePkt *pkt);
572 
582 uint8_t * pucXBeePktData (xXBeePkt *pkt);
583 
590 int iXBeePktDataLen (xXBeePkt *pkt);
591 
598 int iXBeePktFrameId (xXBeePkt *pkt);
599 
606 int iXBeePktStatus (xXBeePkt *pkt);
607 
614 int iXBeePktDiscovery (xXBeePkt *pkt);
615 
622 int iXBeePktRetry (xXBeePkt *pkt);
623 
633 char * pcXBeePktCommand (xXBeePkt *pkt);
634 
641 uint8_t * pucXBeePktParam (xXBeePkt *pkt);
642 
654 int iXBeePktParamGetStr (char * pcDest, xXBeePkt *pkt, int iDestSize);
655 
663 int iXBeePktParamGetULong (uint32_t * ulDest, xXBeePkt *pkt, int iOffset);
664 
672 int iXBeePktParamGetULongLong (uint64_t * ullDest, xXBeePkt *pkt, int iOffset);
673 
681 int iXBeePktParamGetUShort (uint16_t * usDest, xXBeePkt *pkt, int iOffset);
682 
690 int iXBeePktParamGetUByte (uint8_t * ucDest, xXBeePkt *pkt, int iOffset);
691 
698 int iXBeePktParamLen (xXBeePkt *pkt);
699 
706 int iXBeePktOptions (xXBeePkt *pkt);
707 
714 int iXBeePktRadius (xXBeePkt *pkt);
715 
722 int iXBeePktApply (xXBeePkt *pkt);
723 
730 int iXBeePktRssi (xXBeePkt *pkt);
731 
740 uint8_t * pucXBeePktAddrRemote64 (xXBeePkt *pkt);
741 
750 uint8_t * pucXBeePktAddrRemote16 (xXBeePkt *pkt);
751 
760 char * pcXBeePktNiString (xXBeePkt * pkt);
761 
770 uint8_t * pucXBeePktAddrParent16 (xXBeePkt *pkt);
771 
781 
791 
800 int iXBeePktProfileId (xXBeePkt * pkt);
801 
810 int iXBeePktManufacturerId (xXBeePkt * pkt);
811 
812 
819 int iXBeePktIsBroadcast (xXBeePkt *pkt);
820 
821 
825 bool bXBeePktAddressIsEqual (const uint8_t *a1, const uint8_t *a2, uint8_t len);
826 
833 const uint8_t * pucXBeeAddr16Unknown (void);
834 
841 const uint8_t * pucXBeeAddr64Unknown (void);
842 
849 const uint8_t * pucXBeeAddr64Coordinator (void);
850 
857 const uint8_t * pucXBeeAddr64Broadcast (void);
858 
864 const char * sXBeeAssociationStatusToString (uint8_t status);
865 
871 const char * sXBeeTransmitStatusToString (uint8_t status);
872 
878 const char * sXBeeModemStatusToString (uint8_t status);
879 
880 /*==============================================================================
881  *
882  * TODO: Partie non finalisée par manque de temps
883  *
884  *============================================================================*/
885 #ifndef __DOXYGEN__
886 int iXBeePktDigital (xXBeePkt * pkt, int array[9], unsigned int index);
887 int iXBeePktAnalog (xXBeePkt * pkt, int array[6], unsigned int index);
888 int iXBeePktSamples (xXBeePkt * pkt);
889 
890 #endif /* __DOXYGEN__ not defined */
891 
896 /* ========================================================================== */
897 #ifdef __cplusplus
898  }
899 #endif
900 #endif /* _SYSIO_XBEE_H_ defined */
int iXBeePktOptions(xXBeePkt *pkt)
Champs option du paquet.
char * pcXBeePktNiString(xXBeePkt *pkt)
Identifiant texte du noeud (Série 2)
int iXBeePktParamGetStr(char *pcDest, xXBeePkt *pkt, int iDestSize)
Copie les paramètres de commande AT.
int iXBeePktManufacturerId(xXBeePkt *pkt)
Identification du fabricant du module (Série 2)
int iXBeePktApply(xXBeePkt *pkt)
Champs apply du paquet.
int iXBeeZbSendToCoordinator(xXBee *xbee, const void *data, uint8_t len)
Envoi d&#39;un paquet de données au coordinateur du réseau.
int iXBeePktDiscovery(xXBeePkt *pkt)
Status de découverte de paquet (Série 2)
int iXBeePktStatus(xXBeePkt *pkt)
Status de paquet.
const uint8_t * pucXBeeAddr64Broadcast(void)
Adresse 64-bits de broadcast (0x000000000000FFFF)
eXBeeDeviceType
Type de noeud.
Definition: xbee.h:288
int iXBeeClose(xXBee *xbee)
Fermeture d&#39;un module XBee.
uint8_t * pucXBeePktAddrParent16(xXBeePkt *pkt)
Adresse réseau 16-bits parent du paquet (Série 2)
int iXBeePktDataLen(xXBeePkt *pkt)
Nombre d&#39;octet de données (CRC exclu)
char * pcXBeePktCommand(xXBeePkt *pkt)
Nom de la commande AT.
bool bXBeePktAddressIsEqual(const uint8_t *a1, const uint8_t *a2, uint8_t len)
Vérifie l&#39;égalité de 2 adresses réseau de len octets.
int iXBeeSendAt(xXBee *xbee, const char cmd[], const uint8_t *params, uint8_t param_len)
Envoi une commande AT locale.
const char * sXBeeTransmitStatusToString(uint8_t status)
Message explicite associé à un status de transmission (message 0x8B)
eXBeeSourceEvent
Type de noeud.
Definition: xbee.h:299
void * pvXBeeAllocPkt(xXBee *xbee, uint8_t direction, uint8_t len)
Alloue la mémoire pour un paquet.
const uint8_t * pucXBeeAddr16Unknown(void)
Adresse 16-bits inconnue (0xFFFE)
int iXBeePktParamGetULong(uint32_t *ulDest, xXBeePkt *pkt, int iOffset)
Copie d&#39;un mot long des paramètres de commande AT.
uint8_t ucXBeePktType(xXBeePkt *pkt)
Lecture du type de paquet.
int iXBeePktRssi(xXBeePkt *pkt)
Champs rssi du paquet (Série 1)
int iXBeeSend16(xXBee *xbee, const void *data, uint8_t len, const uint8_t addr[2], uint8_t opt)
Envoi d&#39;un paquet de données à un module distant par son adresse 16-bit.
eXBeeSourceEvent eXBeePktSourceEvent(xXBeePkt *pkt)
Source de l&#39;événement (Série 2)
int(* iXBeeRxCB)(struct xXBee *xbee, struct xXBeePkt *pkt, uint8_t len)
Prototype d&#39;un gestionnaire de réception.
Definition: xbee.h:179
uint8_t * pucXBeePktAddrSrc64(xXBeePkt *pkt)
Adresse 64-bits source du paquet.
int iXBeeSendRemoteAt(xXBee *xbee, const char cmd[], const uint8_t params[], uint8_t param_len, const uint8_t addr64[8], const uint8_t addr16[2], uint8_t apply)
Envoi une commande AT à un module distant.
int iXBeePktParamGetUShort(uint16_t *usDest, xXBeePkt *pkt, int iOffset)
Copie d&#39;un mot des paramètres de commande AT.
int iXBeePktParamGetUByte(uint8_t *ucDest, xXBeePkt *pkt, int iOffset)
Copie d&#39;un octet des paramètres de commande AT.
int iXBeePoll(xXBee *xbee, int timeout)
Scrute le flux relié au module en attente de réception d&#39;octet.
uint8_t * pucXBeePktAddrRemote16(xXBeePkt *pkt)
Adresse réseau 16-bits distante du paquet (Série 2)
void vXBeeFreePkt(xXBee *xbee, xXBeePkt *pkt)
Libère un paquet alloué avec pvXBeeAllocPkt()
uint16_t usXBeePktLength(xXBeePkt *pkt)
Taille du paquet en octets.
const uint8_t * pucXBeeAddr64Unknown(void)
Adresse 64-bits inconnue (0xFFFFFFFFFFFFFFFF)
int iXBeePktIsBroadcast(xXBeePkt *pkt)
Indique si le paquet est un broadcast.
uint8_t * pucXBeePktAddrSrc16(xXBeePkt *pkt)
Adresse réseau 16-bits source du paquet.
int iXBeePktParamGetULongLong(uint64_t *ullDest, xXBeePkt *pkt, int iOffset)
Copie d&#39;un très long mot des paramètres de commande AT.
void vXBeeSetUserContext(xXBee *xbee, void *pvContext)
Modifie le contexte utilisateur.
int iXBeeZbSendBroadcast(xXBee *xbee, const void *data, uint8_t len)
Envoi d&#39;un paquet de données de diffusion sur le réseau.
eXBeeModemStatus
Status Modem.
Definition: xbee.h:252
int iXBeePktRadius(xXBeePkt *pkt)
Champs radius du paquet (Série 2)
int iXBeeSend64(xXBee *xbee, const void *data, uint8_t len, const uint8_t addr[8], uint8_t opt)
Envoi d&#39;un paquet de données à un module distant par son adresse 64-bit.
const uint8_t * pucXBeeAddr64Coordinator(void)
Adresse 64-bits du cordinateur Zigbee (0x0000000000000000)
int iXBeePktRetry(xXBeePkt *pkt)
Nombre de tentatives de paquet (Série 2)
int iXBeePktParamLen(xXBeePkt *pkt)
Longueur des paramètres de la commande AT.
eXBeeCmdStatus
Réponses à une commande AT.
Definition: xbee.h:239
int iXBeePktProfileId(xXBeePkt *pkt)
Identifiant du profile Digi (Série 2)
void vXBeeSetCB(xXBee *xbee, eXBeeCbType cb_type, iXBeeRxCB cb)
Modifie un gestionnaire de réception.
xXBee * xXBeeOpen(const char *pcDevice, xSerialIos *xIos, eXBeeSeries series)
Ouverture d&#39;un module XBee.
void * pvXBeeGetUserContext(xXBee *xbee)
Renvoie le pointeur contexte utilisateur.
eXBeeDirection
Direction d&#39;un échange XBee.
Definition: xbee.h:268
int iXBeePktFrameId(xXBeePkt *pkt)
Identifiant de paquet.
uint8_t * pucXBeePktData(xXBeePkt *pkt)
Pointeur sur les données du paquet.
eXBeeSeries
Serie du module XBee.
Definition: xbee.h:277
eXBeeDeviceType eXBeePktDeviceType(xXBeePkt *pkt)
Type de noeud (Série 2)
const char * sXBeeAssociationStatusToString(uint8_t status)
Message explicite associé à un status d&#39;asssociation (Commande AT AI)
struct xXBeePkt xXBeePkt
Paquet XBee générique.
Definition: xbee.h:158
eXBeeCbType
Type de gestionnaire de réception.
Definition: xbee.h:184
const char * sXBeeModemStatusToString(uint8_t status)
Message explicite associé à un status de modem (message 0x8A)
eXBeePktType
Types de paquets géré par le module.
Definition: xbee.h:208
uint8_t * pucXBeePktParam(xXBeePkt *pkt)
Paramètres de la commande AT.
eXBeeSeries eXBeeGetSeries(const xXBee *xbee)
Retourne la série du module fournie à l&#39;ouverture.
uint8_t * iXBeePktDst16(xXBeePkt *pkt)
Adresse réseau 16-bits destination du paquet (Série 2)
int iXBeeZbSend(xXBee *xbee, const void *data, uint8_t len, const uint8_t addr64[8], const uint8_t addr16[2], uint8_t opt, uint8_t radius)
Envoi d&#39;un paquet de données à un module distant.
uint8_t * pucXBeePktAddrRemote64(xXBeePkt *pkt)
Adresse 64-bits distante du paquet (Série 2)
struct xXBee xXBee
Contexte d&#39;un module XBee.
Definition: xbee.h:165