1765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang/*
2765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
3765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * Copyright (c) 2014 Intel Corporation.
4765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * BLE Beaconing based on http://dmitry.gr/index.php?r=05.Projects&proj=11.%20Bluetooth%20LE%20fakery
5765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang *
6765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * Permission is hereby granted, free of charge, to any person obtaining
7765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * a copy of this software and associated documentation files (the
8765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * "Software"), to deal in the Software without restriction, including
9765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * without limitation the rights to use, copy, modify, merge, publish,
10765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * distribute, sublicense, and/or sell copies of the Software, and to
11765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * permit persons to whom the Software is furnished to do so, subject to
12765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * the following conditions:
13765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang *
14765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * The above copyright notice and this permission notice shall be
15765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * included in all copies or substantial portions of the Software.
16765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang *
17765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang */
25765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#pragma once
26765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
27765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#include <string>
28765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#include <mraa/aio.hpp>
29765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#include <mraa/common.hpp>
30765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
31765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#include <mraa/gpio.hpp>
32765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
33765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#include <mraa/spi.hpp>
34765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#include <cstring>
35765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
36765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#if defined(SWIGJAVA) || defined(JAVACALLBACK)
37765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#include "Callback.h"
38765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#endif
39765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
40765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang/* Memory Map */
41765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define CONFIG              0x00
42765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define EN_AA               0x01
43765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define EN_RXADDR           0x02
44765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define SETUP_AW            0x03
45765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define SETUP_RETR          0x04
46765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RF_CH               0x05
47765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RF_SETUP            0x06
48765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define STATUS              0x07
49765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define OBSERVE_TX          0x08
50765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define CD                  0x09
51765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RX_ADDR_P0          0x0A
52765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RX_ADDR_P1          0x0B
53765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RX_ADDR_P2          0x0C
54765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RX_ADDR_P3          0x0D
55765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RX_ADDR_P4          0x0E
56765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RX_ADDR_P5          0x0F
57765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define TX_ADDR             0x10
58765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RX_PW_P0            0x11
59765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RX_PW_P1            0x12
60765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RX_PW_P2            0x13
61765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RX_PW_P3            0x14
62765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RX_PW_P4            0x15
63765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RX_PW_P5            0x16
64765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define FIFO_STATUS         0x17
65765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define DYNPD               0x1C
66765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define FEATURE             0x1D
67765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
68765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang/* Bit Mnemonics */
69765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define MASK_RX_DR          6
70765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define MASK_TX_DS          5
71765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define MASK_MAX_RT         4
72765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define EN_CRC              3
73765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define CRCO                2
74765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define PWR_UP              1
75765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define PRIM_RX             0
76765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define ENAA_P5             5
77765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define ENAA_P4             4
78765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define ENAA_P3             3
79765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define ENAA_P2             2
80765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define ENAA_P1             1
81765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define ENAA_P0             0
82765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define ERX_P5              5
83765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define ERX_P4              4
84765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define ERX_P3              3
85765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define ERX_P2              2
86765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define ERX_P1              1
87765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define ERX_P0              0
88765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define AW                  0
89765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define ARD                 4
90765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define ARC                 0
91765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define PLL_LOCK            4
92765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RF_DR               3
93765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RF_PWR              1
94765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define LNA_HCURR           0
95765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RX_DR               6
96765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define TX_DS               5
97765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define MAX_RT              4
98765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RX_P_NO             1
99765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define TX_FULL             0
100765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define PLOS_CNT            4
101765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define ARC_CNT             0
102765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define TX_REUSE            6
103765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define FIFO_FULL           5
104765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define TX_EMPTY            4
105765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RX_FULL             1
106765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RX_EMPTY            0
107765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
108765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang/* Instruction Mnemonics */
109765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define R_REGISTER            0x00
110765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define W_REGISTER            0x20
111765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define REGISTER_MASK         0x1F
112765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define R_RX_PAYLOAD          0x61
113765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define W_TX_PAYLOAD          0xA0
114765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define FLUSH_TX              0xE1
115765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define FLUSH_RX              0xE2
116765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define REUSE_TX_PL           0xE3
117765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define NOP                   0xFF
118765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
119765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RF_DR_LOW   5
120765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RF_DR_HIGH  3
121765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RF_PWR_LOW  1
122765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define RF_PWR_HIGH 2
123765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
124765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang/* Nrf24l settings */
125765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define ADDR_LEN        5
126765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define _CONFIG         ((1<<EN_CRC) | (0<<CRCO) )
127765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
128765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define MAX_BUFFER            32
129765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
130765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define HIGH                  1
131765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define LOW                    0
132765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
133765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang/* BLE beaconing */
134765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define BLE_MAC_0           0xEF
135765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define BLE_MAC_1           0xFF
136765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define BLE_MAC_2           0xC0
137765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define BLE_MAC_3           0xAA
138765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define BLE_MAC_4           0x18
139765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define BLE_MAC_5           0x00
140765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
141765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#define BLE_PAYLOAD_OFFSET  13
142765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
143765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangnamespace upm {
144765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
145765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#if defined(SWIGJAVA) || defined(JAVACALLBACK)
146765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangtypedef void (* funcPtrVoidVoid) (Callback *);
147765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#else
148765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangtypedef void (* funcPtrVoidVoid) ();
149765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#endif
150765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
151765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangtypedef enum {
152765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang    NRF_250KBPS = 0,
153765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang    NRF_1MBPS   = 1,
154765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang    NRF_2MBPS   = 2,
155765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} speed_rate_t;
156765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
157765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangtypedef enum {
158765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang    NRF_0DBM    = 0,
159765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang    NRF_6DBM    = 1,
160765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang    NRF_12DBM   = 2,
161765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang    NRF_18DBM   = 3,
162765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang} power_t;
163765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
164765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang/**
165765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * @brief NRF24L01 Transceiver library
166765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * @defgroup nrf24l01 libupm-nrf24l01
167765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * @ingroup seeed sparkfun spi wifi
168765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang */
169765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang/**
170765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * @library nrf24l01
171765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * @sensor nrf24l01
172765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * @comname NRF24L01 Transceiver
173765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * @type wifi
174765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * @man seeed sparkfun
175765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * @web http://www.seeedstudio.com/depot/nRF24L01Module-p-1394.html
176765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * @con spi
177765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang *
178765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * id
179765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * @brief API for the NRF24L01 Transceiver Module
180765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang *
181765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * This module defines the NRF24L01 interface for libnrf24l01
182765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang *
183765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * @image html nrf24l01.jpg
184765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * @snippet nrf24l01-receiver.cxx Interesting
185765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * @snippet nrf24l01-transmitter.cxx Interesting
186765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang * @snippet nrf24l01-broadcast.cxx Interesting
187765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang */
188765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangclass NRF24L01 {
189765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang    public:
190765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
191765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Instantiates an NRF24l01 object
192765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         *
193765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * @param cs Chip select pin
194765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
195765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        NRF24L01 (uint8_t cs, uint8_t ce);
196765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
197765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
198765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Returns the name of the component
199765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
200765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        std::string name()
201765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        {
202765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang            return m_name;
203765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        }
204765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
205765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
206765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Initializes needed GPIO pins and SPI
207765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         *
208765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * @param chipSelect Sets up the chip select pin
209765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * @param chipEnable Sets up the chip enable pin
210765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
211765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    init (uint8_t chipSelect, uint8_t chipEnable);
212765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
213765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
214765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Configures the NRF24L01 transceiver
215765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
216765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    configure ();
217765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
218765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
219765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Sends the buffer data
220765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         *
221765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * @param *value Pointer to the buffer
222765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
223765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    send (uint8_t * value);
224765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
225765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
226765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Sends the data located in an inner bufer; the user must fill the
227765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * m_txBuffer buffer
228765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
229765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    send ();
230765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
231765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
232765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Sets a receiving address of the device
233765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         *
234765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * @param addr 5-byte address
235765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
236765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    setSourceAddress (uint8_t * addr);
237765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
238765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
239765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Sets a recipient address. The nrfSend method sends the data buffer
240765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * to this address
241765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         *
242765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * @param addr 5-byte address
243765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
244765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    setDestinationAddress (uint8_t * addr);
245765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
246765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
247765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Sets a broadcasting address
248765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         *
249765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * @param addr 5-byte address
250765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
251765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    setBroadcastAddress (uint8_t * addr);
252765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
253765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
254765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Sets the payload size
255765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         *
256765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * @param load Size of the payload (MAX 32)
257765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
258765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    setPayload (uint8_t load);
259765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
260765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#if defined(SWIGJAVA) || defined(JAVACALLBACK)
261765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
262765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Sets the handler to be called when data has been
263765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * received
264765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * @param call_obj Object used for callback - Java
265765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
266765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void setDataReceivedHandler (Callback *call_obj);
267765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#else
268765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
269765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Sets the handler to be called when data has been
270765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * received
271765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * @param handler Handler used for callback
272765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
273765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void setDataReceivedHandler (funcPtrVoidVoid handler);
274765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#endif
275765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
276765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Checks if the data has arrived
277765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
278765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        bool    dataReady ();
279765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
280765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
281765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Checks if the transceiver is in the sending mode
282765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
283765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        bool    dataSending ();
284765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
285765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
286765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Sinks all the arrived data into a provided buffer
287765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         *
288765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * @param load Size of the payload (MAX 32)
289765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
290765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    getData (uint8_t * data);
291765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
292765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
293765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Checks the transceiver state
294765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
295765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        uint8_t getStatus ();
296765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
297765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
298765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Checks if the receive stack is empty
299765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
300765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        bool    rxFifoEmpty ();
301765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
302765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
303765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Powers the receiver up
304765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
305765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    rxPowerUp ();
306765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
307765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
308765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Flushes the receive stack
309765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
310765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    rxFlushBuffer ();
311765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
312765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
313765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Powers the transmitter up
314765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
315765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    txPowerUp ();
316765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
317765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
318765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Powers everything down
319765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
320765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    powerDown ();
321765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
322765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    setChannel (uint8_t channel);
323765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
324765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    setPower (power_t power);
325765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
326765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        uint8_t setSpeedRate (speed_rate_t rate);
327765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
328765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
329765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Flushes the transmit stack
330765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
331765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    txFlushBuffer ();
332765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
333765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
334765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Pulling the method listening for the arrived data,
335765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * dataRecievedHandler is triggered if data arrives
336765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
337765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    pollListener ();
338765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
339765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
340765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Sets the chip enable pin to HIGH
341765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
342765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        mraa::Result ceHigh ();
343765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
344765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
345765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Sets the chip enable pin to LOW
346765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
347765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        mraa::Result ceLow ();
348765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
349765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
350765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Sets the chip select pin to LOW
351765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
352765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        mraa::Result csOn ();
353765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
354765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
355765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Sets the chip select pin to HIGH
356765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
357765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        mraa::Result csOff ();
358765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
359765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
360765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Configures the NRF24L01 transceiver to behave as a BLE
361765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * (Bluetooth Low Energy) beaconing devcie.
362765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
363765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void setBeaconingMode ();
364765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
365765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
366765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Beacons the provided message to BLE scanners.
367765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         *
368765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * @param msg Beacons the provided message (max length is 16 bytes)
369765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
370765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void sendBeaconingMsg (uint8_t * msg);
371765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
372765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        uint8_t     m_rxBuffer[MAX_BUFFER]; /**< Receive buffer */
373765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        uint8_t     m_txBuffer[MAX_BUFFER]; /**< Transmit buffer */
374765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        uint8_t     m_bleBuffer [32];       /**< BLE buffer */
375765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
376765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang    private:
377765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#if defined(SWIGJAVA) || defined(JAVACALLBACK)
378765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**< Callback object to use for setting the handler from Java */
379765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        Callback *callback_obj;
380765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#endif
381765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        funcPtrVoidVoid dataReceivedHandler; /**< Data arrived handler */
382765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
383765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
384765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Writes bytes to an SPI device
385765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
386765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    writeBytes (uint8_t * dataout, uint8_t * datain, uint8_t len);
387765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
388765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Sets the register value on an SPI device [one byte]
389765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
390765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    setRegister (uint8_t reg, uint8_t value);
391765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
392765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Gets the register value from an SPI device [one byte]
393765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
394765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        uint8_t getRegister (uint8_t reg);
395765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
396765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Reads an array of bytes from the given starting position in NRF24L01 registers
397765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
398765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    readRegister (uint8_t reg, uint8_t * value, uint8_t len);
399765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
400765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Writes an array of bytes into NRF24L01 registers
401765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
402765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    writeRegister (uint8_t reg, uint8_t * value, uint8_t len);
403765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        /**
404765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         * Sends a command to NRF24L01
405765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang         */
406765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void    sendCommand (uint8_t cmd);
407765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
408765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void bleCrc (const uint8_t* data, uint8_t len, uint8_t* dst);
409765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
410765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void bleWhiten (uint8_t* data, uint8_t len, uint8_t whitenCoeff);
411765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
412765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        void blePacketEncode(uint8_t* packet, uint8_t len, uint8_t chan);
413765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
414765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        uint8_t swapbits (uint8_t a);
415765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
416765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        mraa::Spi               m_spi;
417765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        uint8_t                 m_ce;
418765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        uint8_t                 m_csn;
419765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        uint8_t                 m_channel;
420765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        uint8_t                 m_power;
421765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        uint8_t                 m_ptx;
422765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        uint8_t                 m_payload;
423765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        uint8_t                 m_localAddress[5];
424765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
425765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        mraa::Gpio              m_csnPinCtx;
426765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        mraa::Gpio              m_cePinCtx;
427765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
428765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang        std::string             m_name;
429765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang};
430765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang
431765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang}
432