Library to easily communicate with XBee modules.

Dependencies:   DigiLogger

Dependents:   WaterLogger XbeeGateway XBee_Cooker ProjetReceiver ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers FH_RxPacket802.cpp Source File

FH_RxPacket802.cpp

00001 /**
00002  * Copyright (c) 2015 Digi International Inc.,
00003  * All rights not expressly granted are reserved.
00004  *
00005  * This Source Code Form is subject to the terms of the Mozilla Public
00006  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
00007  * You can obtain one at http://mozilla.org/MPL/2.0/.
00008  *
00009  * Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343
00010  * =======================================================================
00011  */
00012 
00013 #include "FH_RxPacket802.h"
00014 
00015 using namespace XBeeLib;
00016 
00017 /** Class constructor */
00018 FH_RxPacket64b802::FH_RxPacket64b802() : FrameHandler(ApiFrame::RxPacket64Bit),
00019     receive_cb(NULL)
00020 {
00021 }
00022 
00023 /** Class destructor */
00024 FH_RxPacket64b802::~FH_RxPacket64b802()
00025 {
00026 }
00027 
00028 void FH_RxPacket64b802::register_receive_cb(receive_802_cb_t function)
00029 {
00030     receive_cb = function;
00031 }
00032 
00033 void FH_RxPacket64b802::unregister_receive_cb(void)
00034 {
00035     receive_cb = NULL;
00036 }
00037 
00038 /* 802.15.4 RX packet offsets */
00039 #define RX_802_RSSI_OFFSET          8
00040 #define RX_802_OPTIONS_OFFSET       9
00041 #define RX_802_DATA_OFFSET          10
00042 #define RX_802_OVERHEAD             (8+1+1)
00043 
00044 #define BROADCAST_PACKET            0x02
00045 
00046 void FH_RxPacket64b802::process_frame_data(const ApiFrame *const frame)
00047 {
00048     /* The caller checks that the type matches, so no need to check it here again */
00049 
00050     if (receive_cb == NULL) {
00051         return;
00052     }
00053 
00054     /* We got a rx packet, decode it... */
00055     const uint8_t *datap = frame->get_data();
00056     const uint64_t sender64 = addr64_from_uint8_t(datap);
00057     const uint8_t rx_options = datap[RX_802_OPTIONS_OFFSET];
00058     const RemoteXBee802 sender = RemoteXBee802(sender64);
00059 
00060     receive_cb(sender, rx_options & BROADCAST_PACKET, &datap[RX_802_DATA_OFFSET], frame->get_data_len() - RX_802_OVERHEAD);
00061 }
00062 
00063 
00064 /** Class constructor */
00065 FH_RxPacket16b802::FH_RxPacket16b802() : FrameHandler(ApiFrame::RxPacket16Bit),
00066     receive_cb(NULL)
00067 {
00068 }
00069 
00070 /** Class destructor */
00071 FH_RxPacket16b802::~FH_RxPacket16b802()
00072 {
00073 }
00074 
00075 void FH_RxPacket16b802::register_receive_cb(receive_802_cb_t function)
00076 {
00077     receive_cb = function;
00078 }
00079 
00080 void FH_RxPacket16b802::unregister_receive_cb(void)
00081 {
00082     receive_cb = NULL;
00083 }
00084 
00085 /* 802.15.4 RX packet offsets */
00086 #define RX_802_ADDR16_MSB_OFFSET    0
00087 #define RX_802_ADDR16_LSB_OFFSET    1
00088 #define RX_802_RSSI_OFFSET2         2
00089 #define RX_802_OPTIONS_OFFSET2      3
00090 #define RX_802_DATA_OFFSET2         4
00091 #define RX_802_OVERHEAD2            (2+1+1)
00092 
00093 void FH_RxPacket16b802::process_frame_data(const ApiFrame *const frame)
00094 {
00095     /* The caller checks that the type matches, so no need to check it here again */
00096 
00097     if (receive_cb == NULL) {
00098         return;
00099     }
00100 
00101     /* We got a rx packet, decode it... */
00102     const uint8_t *datap = frame->get_data();
00103     const uint16_t sender16 = ADDR16(datap[RX_802_ADDR16_MSB_OFFSET], datap[RX_802_ADDR16_LSB_OFFSET]);
00104     const uint8_t rx_options = datap[RX_802_OPTIONS_OFFSET2];
00105     const RemoteXBee802 sender = RemoteXBee802(sender16);
00106 
00107     receive_cb(sender, rx_options & BROADCAST_PACKET, &datap[RX_802_DATA_OFFSET2], frame->get_data_len() - RX_802_OVERHEAD2);
00108 }