mirror of https://github.com/arendst/Tasmota.git
135 lines
3.2 KiB
C++
135 lines
3.2 KiB
C++
/*
|
|
*
|
|
* Filename : rpi-hub.cpp
|
|
*
|
|
* This program makes the RPi as a hub listening to all six pipes from the remote sensor nodes ( usually Arduino )
|
|
* and will return the packet back to the sensor on pipe0 so that the sender can calculate the round trip delays
|
|
* when the payload matches.
|
|
*
|
|
* I encounter that at times, it also receive from pipe7 ( or pipe0 ) with content of FFFFFFFFF that I will not sent
|
|
* back to the sender
|
|
*
|
|
* Refer to RF24/examples/rpi_hub_arduino/ for the corresponding Arduino sketches to work with this code.
|
|
*
|
|
*
|
|
* CE is not used and CSN is GPIO25 (not pinout)
|
|
*
|
|
* Refer to RPi docs for GPIO numbers
|
|
*
|
|
* Author : Stanley Seow
|
|
* e-mail : stanleyseow@gmail.com
|
|
* date : 6th Mar 2013
|
|
*
|
|
* 03/17/2013 : Charles-Henri Hallard (http://hallard.me)
|
|
* Modified to use with Arduipi board http://hallard.me/arduipi
|
|
* Changed to use modified bcm2835 and RF24 library
|
|
*
|
|
*
|
|
*/
|
|
|
|
#include <cstdlib>
|
|
#include <iostream>
|
|
#include <RF24/RF24.h>
|
|
|
|
using namespace std;
|
|
|
|
// Radio pipe addresses for the 2 nodes to communicate.
|
|
// First pipe is for writing, 2nd, 3rd, 4th, 5th & 6th is for reading...
|
|
const uint64_t pipes[6] =
|
|
{ 0xF0F0F0F0D2LL, 0xF0F0F0F0E1LL,
|
|
0xF0F0F0F0E2LL, 0xF0F0F0F0E3LL,
|
|
0xF0F0F0F0F1, 0xF0F0F0F0F2
|
|
};
|
|
|
|
// CE Pin, CSN Pin, SPI Speed
|
|
|
|
// Setup for GPIO 22 CE and GPIO 25 CSN with SPI Speed @ 1Mhz
|
|
//RF24 radio(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_18, BCM2835_SPI_SPEED_1MHZ);
|
|
|
|
// Setup for GPIO 22 CE and CE0 CSN with SPI Speed @ 4Mhz
|
|
//RF24 radio(RPI_V2_GPIO_P1_15, BCM2835_SPI_CS0, BCM2835_SPI_SPEED_4MHZ);
|
|
|
|
// Setup for GPIO 22 CE and CE1 CSN with SPI Speed @ 8Mhz
|
|
RF24 radio(RPI_V2_GPIO_P1_15, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ);
|
|
|
|
|
|
int main(int argc, char** argv)
|
|
{
|
|
uint8_t len;
|
|
|
|
// Refer to RF24.h or nRF24L01 DS for settings
|
|
radio.begin();
|
|
radio.enableDynamicPayloads();
|
|
radio.setAutoAck(1);
|
|
radio.setRetries(15,15);
|
|
radio.setDataRate(RF24_1MBPS);
|
|
radio.setPALevel(RF24_PA_MAX);
|
|
radio.setChannel(76);
|
|
radio.setCRCLength(RF24_CRC_16);
|
|
|
|
// Open 6 pipes for readings ( 5 plus pipe0, also can be used for reading )
|
|
radio.openWritingPipe(pipes[0]);
|
|
radio.openReadingPipe(1,pipes[1]);
|
|
radio.openReadingPipe(2,pipes[2]);
|
|
radio.openReadingPipe(3,pipes[3]);
|
|
radio.openReadingPipe(4,pipes[4]);
|
|
radio.openReadingPipe(5,pipes[5]);
|
|
|
|
//
|
|
// Start listening
|
|
//
|
|
radio.startListening();
|
|
|
|
//
|
|
// Dump the configuration of the rf unit for debugging
|
|
//
|
|
radio.printDetails();
|
|
|
|
printf("Output below : \n");
|
|
delay(1);
|
|
|
|
while(1)
|
|
{
|
|
char receivePayload[32];
|
|
uint8_t pipe = 1;
|
|
|
|
// Start listening
|
|
radio.startListening();
|
|
|
|
while ( radio.available(&pipe) )
|
|
{
|
|
len = radio.getDynamicPayloadSize();
|
|
radio.read( receivePayload, len );
|
|
|
|
// Display it on screen
|
|
printf("Recv: size=%i payload=%s pipe=%i",len,receivePayload,pipe);
|
|
|
|
// Send back payload to sender
|
|
radio.stopListening();
|
|
|
|
// if pipe is 7, do not send it back
|
|
if ( pipe != 7 )
|
|
{
|
|
radio.write(receivePayload,len);
|
|
receivePayload[len]=0;
|
|
printf("\t Send: size=%i payload=%s pipe:%i\n",len,receivePayload,pipe);
|
|
}
|
|
else
|
|
{
|
|
printf("\n");
|
|
}
|
|
|
|
pipe++;
|
|
|
|
// reset pipe to 0
|
|
if ( pipe > 6 )
|
|
pipe = 0;
|
|
}
|
|
|
|
delayMicroseconds(20);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|