summaryrefslogtreecommitdiff
path: root/peripheral/libupm/src/nrf24l01/nrf24l01.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'peripheral/libupm/src/nrf24l01/nrf24l01.hpp')
-rw-r--r--peripheral/libupm/src/nrf24l01/nrf24l01.hpp431
1 files changed, 431 insertions, 0 deletions
diff --git a/peripheral/libupm/src/nrf24l01/nrf24l01.hpp b/peripheral/libupm/src/nrf24l01/nrf24l01.hpp
new file mode 100644
index 0000000..9a38662
--- /dev/null
+++ b/peripheral/libupm/src/nrf24l01/nrf24l01.hpp
@@ -0,0 +1,431 @@
+/*
+ * Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
+ * Copyright (c) 2014 Intel Corporation.
+ * BLE Beaconing based on http://dmitry.gr/index.php?r=05.Projects&proj=11.%20Bluetooth%20LE%20fakery
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+#pragma once
+
+#include <string>
+#include <mraa/aio.hpp>
+#include <mraa/common.hpp>
+
+#include <mraa/gpio.hpp>
+
+#include <mraa/spi.hpp>
+#include <cstring>
+
+#if defined(SWIGJAVA) || defined(JAVACALLBACK)
+#include "Callback.hpp"
+#endif
+
+/* Memory Map */
+#define CONFIG 0x00
+#define EN_AA 0x01
+#define EN_RXADDR 0x02
+#define SETUP_AW 0x03
+#define SETUP_RETR 0x04
+#define RF_CH 0x05
+#define RF_SETUP 0x06
+#define STATUS 0x07
+#define OBSERVE_TX 0x08
+#define CD 0x09
+#define RX_ADDR_P0 0x0A
+#define RX_ADDR_P1 0x0B
+#define RX_ADDR_P2 0x0C
+#define RX_ADDR_P3 0x0D
+#define RX_ADDR_P4 0x0E
+#define RX_ADDR_P5 0x0F
+#define TX_ADDR 0x10
+#define RX_PW_P0 0x11
+#define RX_PW_P1 0x12
+#define RX_PW_P2 0x13
+#define RX_PW_P3 0x14
+#define RX_PW_P4 0x15
+#define RX_PW_P5 0x16
+#define FIFO_STATUS 0x17
+#define DYNPD 0x1C
+#define FEATURE 0x1D
+
+/* Bit Mnemonics */
+#define MASK_RX_DR 6
+#define MASK_TX_DS 5
+#define MASK_MAX_RT 4
+#define EN_CRC 3
+#define CRCO 2
+#define PWR_UP 1
+#define PRIM_RX 0
+#define ENAA_P5 5
+#define ENAA_P4 4
+#define ENAA_P3 3
+#define ENAA_P2 2
+#define ENAA_P1 1
+#define ENAA_P0 0
+#define ERX_P5 5
+#define ERX_P4 4
+#define ERX_P3 3
+#define ERX_P2 2
+#define ERX_P1 1
+#define ERX_P0 0
+#define AW 0
+#define ARD 4
+#define ARC 0
+#define PLL_LOCK 4
+#define RF_DR 3
+#define RF_PWR 1
+#define LNA_HCURR 0
+#define RX_DR 6
+#define TX_DS 5
+#define MAX_RT 4
+#define RX_P_NO 1
+#define TX_FULL 0
+#define PLOS_CNT 4
+#define ARC_CNT 0
+#define TX_REUSE 6
+#define FIFO_FULL 5
+#define TX_EMPTY 4
+#define RX_FULL 1
+#define RX_EMPTY 0
+
+/* Instruction Mnemonics */
+#define R_REGISTER 0x00
+#define W_REGISTER 0x20
+#define REGISTER_MASK 0x1F
+#define R_RX_PAYLOAD 0x61
+#define W_TX_PAYLOAD 0xA0
+#define FLUSH_TX 0xE1
+#define FLUSH_RX 0xE2
+#define REUSE_TX_PL 0xE3
+#define NOP 0xFF
+
+#define RF_DR_LOW 5
+#define RF_DR_HIGH 3
+#define RF_PWR_LOW 1
+#define RF_PWR_HIGH 2
+
+/* Nrf24l settings */
+#define ADDR_LEN 5
+#define _CONFIG ((1<<EN_CRC) | (0<<CRCO) )
+
+#define MAX_BUFFER 32
+
+#define HIGH 1
+#define LOW 0
+
+/* BLE beaconing */
+#define BLE_MAC_0 0xEF
+#define BLE_MAC_1 0xFF
+#define BLE_MAC_2 0xC0
+#define BLE_MAC_3 0xAA
+#define BLE_MAC_4 0x18
+#define BLE_MAC_5 0x00
+
+#define BLE_PAYLOAD_OFFSET 13
+
+namespace upm {
+
+#if defined(SWIGJAVA) || defined(JAVACALLBACK)
+typedef void (* funcPtrVoidVoid) (Callback *);
+#else
+typedef void (* funcPtrVoidVoid) ();
+#endif
+
+typedef enum {
+ NRF_250KBPS = 0,
+ NRF_1MBPS = 1,
+ NRF_2MBPS = 2,
+} speed_rate_t;
+
+typedef enum {
+ NRF_0DBM = 0,
+ NRF_6DBM = 1,
+ NRF_12DBM = 2,
+ NRF_18DBM = 3,
+} power_t;
+
+/**
+ * @brief NRF24L01 Transceiver library
+ * @defgroup nrf24l01 libupm-nrf24l01
+ * @ingroup seeed sparkfun spi wifi
+ */
+/**
+ * @library nrf24l01
+ * @sensor nrf24l01
+ * @comname NRF24L01 Transceiver
+ * @type wifi
+ * @man seeed sparkfun
+ * @web http://www.seeedstudio.com/depot/nRF24L01Module-p-1394.html
+ * @con spi
+ *
+ * id
+ * @brief API for the NRF24L01 Transceiver Module
+ *
+ * This module defines the NRF24L01 interface for libnrf24l01
+ *
+ * @image html nrf24l01.jpg
+ * @snippet nrf24l01-receiver.cxx Interesting
+ * @snippet nrf24l01-transmitter.cxx Interesting
+ * @snippet nrf24l01-broadcast.cxx Interesting
+ */
+class NRF24L01 {
+ public:
+ /**
+ * Instantiates an NRF24l01 object
+ *
+ * @param cs Chip select pin
+ */
+ NRF24L01 (uint8_t cs, uint8_t ce);
+
+ /**
+ * Returns the name of the component
+ */
+ std::string name()
+ {
+ return m_name;
+ }
+
+ /**
+ * Initializes needed GPIO pins and SPI
+ *
+ * @param chipSelect Sets up the chip select pin
+ * @param chipEnable Sets up the chip enable pin
+ */
+ void init (uint8_t chipSelect, uint8_t chipEnable);
+
+ /**
+ * Configures the NRF24L01 transceiver
+ */
+ void configure ();
+
+ /**
+ * Sends the buffer data
+ *
+ * @param *value Pointer to the buffer
+ */
+ void send (uint8_t * value);
+
+ /**
+ * Sends the data located in an inner bufer; the user must fill the
+ * m_txBuffer buffer
+ */
+ void send ();
+
+ /**
+ * Sets a receiving address of the device
+ *
+ * @param addr 5-byte address
+ */
+ void setSourceAddress (uint8_t * addr);
+
+ /**
+ * Sets a recipient address. The nrfSend method sends the data buffer
+ * to this address
+ *
+ * @param addr 5-byte address
+ */
+ void setDestinationAddress (uint8_t * addr);
+
+ /**
+ * Sets a broadcasting address
+ *
+ * @param addr 5-byte address
+ */
+ void setBroadcastAddress (uint8_t * addr);
+
+ /**
+ * Sets the payload size
+ *
+ * @param load Size of the payload (MAX 32)
+ */
+ void setPayload (uint8_t load);
+
+#if defined(SWIGJAVA) || defined(JAVACALLBACK)
+ /**
+ * Sets the handler to be called when data has been
+ * received
+ * @param call_obj Object used for callback - Java
+ */
+ void setDataReceivedHandler (Callback *call_obj);
+#else
+ /**
+ * Sets the handler to be called when data has been
+ * received
+ * @param handler Handler used for callback
+ */
+ void setDataReceivedHandler (funcPtrVoidVoid handler);
+#endif
+ /**
+ * Checks if the data has arrived
+ */
+ bool dataReady ();
+
+ /**
+ * Checks if the transceiver is in the sending mode
+ */
+ bool dataSending ();
+
+ /**
+ * Sinks all the arrived data into a provided buffer
+ *
+ * @param load Size of the payload (MAX 32)
+ */
+ void getData (uint8_t * data);
+
+ /**
+ * Checks the transceiver state
+ */
+ uint8_t getStatus ();
+
+ /**
+ * Checks if the receive stack is empty
+ */
+ bool rxFifoEmpty ();
+
+ /**
+ * Powers the receiver up
+ */
+ void rxPowerUp ();
+
+ /**
+ * Flushes the receive stack
+ */
+ void rxFlushBuffer ();
+
+ /**
+ * Powers the transmitter up
+ */
+ void txPowerUp ();
+
+ /**
+ * Powers everything down
+ */
+ void powerDown ();
+
+ void setChannel (uint8_t channel);
+
+ void setPower (power_t power);
+
+ uint8_t setSpeedRate (speed_rate_t rate);
+
+ /**
+ * Flushes the transmit stack
+ */
+ void txFlushBuffer ();
+
+ /**
+ * Pulling the method listening for the arrived data,
+ * dataRecievedHandler is triggered if data arrives
+ */
+ void pollListener ();
+
+ /**
+ * Sets the chip enable pin to HIGH
+ */
+ mraa::Result ceHigh ();
+
+ /**
+ * Sets the chip enable pin to LOW
+ */
+ mraa::Result ceLow ();
+
+ /**
+ * Sets the chip select pin to LOW
+ */
+ mraa::Result csOn ();
+
+ /**
+ * Sets the chip select pin to HIGH
+ */
+ mraa::Result csOff ();
+
+ /**
+ * Configures the NRF24L01 transceiver to behave as a BLE
+ * (Bluetooth Low Energy) beaconing devcie.
+ */
+ void setBeaconingMode ();
+
+ /**
+ * Beacons the provided message to BLE scanners.
+ *
+ * @param msg Beacons the provided message (max length is 16 bytes)
+ */
+ void sendBeaconingMsg (uint8_t * msg);
+
+ uint8_t m_rxBuffer[MAX_BUFFER]; /**< Receive buffer */
+ uint8_t m_txBuffer[MAX_BUFFER]; /**< Transmit buffer */
+ uint8_t m_bleBuffer [32]; /**< BLE buffer */
+
+ private:
+#if defined(SWIGJAVA) || defined(JAVACALLBACK)
+ /**< Callback object to use for setting the handler from Java */
+ Callback *callback_obj;
+#endif
+ funcPtrVoidVoid dataReceivedHandler; /**< Data arrived handler */
+
+ /**
+ * Writes bytes to an SPI device
+ */
+ void writeBytes (uint8_t * dataout, uint8_t * datain, uint8_t len);
+ /**
+ * Sets the register value on an SPI device [one byte]
+ */
+ void setRegister (uint8_t reg, uint8_t value);
+ /**
+ * Gets the register value from an SPI device [one byte]
+ */
+ uint8_t getRegister (uint8_t reg);
+ /**
+ * Reads an array of bytes from the given starting position in NRF24L01 registers
+ */
+ void readRegister (uint8_t reg, uint8_t * value, uint8_t len);
+ /**
+ * Writes an array of bytes into NRF24L01 registers
+ */
+ void writeRegister (uint8_t reg, uint8_t * value, uint8_t len);
+ /**
+ * Sends a command to NRF24L01
+ */
+ void sendCommand (uint8_t cmd);
+
+ void bleCrc (const uint8_t* data, uint8_t len, uint8_t* dst);
+
+ void bleWhiten (uint8_t* data, uint8_t len, uint8_t whitenCoeff);
+
+ void blePacketEncode(uint8_t* packet, uint8_t len, uint8_t chan);
+
+ uint8_t swapbits (uint8_t a);
+
+ mraa::Spi m_spi;
+ uint8_t m_ce;
+ uint8_t m_csn;
+ uint8_t m_channel;
+ uint8_t m_power;
+ uint8_t m_ptx;
+ uint8_t m_payload;
+ uint8_t m_localAddress[5];
+
+ mraa::Gpio m_csnPinCtx;
+ mraa::Gpio m_cePinCtx;
+
+ std::string m_name;
+};
+
+}