Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: LoraTransport SX1272Lib XRange_mbed_src
Fork of XRangePingPong by
Revision 1:b7fc10b595f3, committed 2016-10-13
- Comitter:
- trusch
- Date:
- Thu Oct 13 09:41:23 2016 +0000
- Parent:
- 0:5ff027a21ffb
- Commit message:
- initial commit;
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LoraTransport.lib Thu Oct 13 09:41:23 2016 +0000 @@ -0,0 +1,1 @@ +https://developer.mbed.org/users/trusch/code/LoraTransport/#518c8dac75f3
--- a/SX1272Lib.lib Sun May 31 13:08:43 2015 +0000 +++ b/SX1272Lib.lib Thu Oct 13 09:41:23 2016 +0000 @@ -1,1 +1,1 @@ -https://developer.mbed.org/users/netblocks/code/SX1272Lib/#a5c9fd1a1ea6 +https://developer.mbed.org/users/netblocks/code/SX1272Lib/#0d1c09259f20
--- a/XRange_mbed_src.lib Sun May 31 13:08:43 2015 +0000 +++ b/XRange_mbed_src.lib Thu Oct 13 09:41:23 2016 +0000 @@ -1,1 +1,1 @@ -https://developer.mbed.org/users/netblocks/code/XRange_mbed_src/#f615a686ac25 +https://developer.mbed.org/users/netblocks/code/XRange_mbed_src/#ac6f3fd999f3
--- a/main.cpp Sun May 31 13:08:43 2015 +0000
+++ b/main.cpp Thu Oct 13 09:41:23 2016 +0000
@@ -1,314 +1,140 @@
#include "mbed.h"
-
-/*
- Maintainers: www.netblocks.eu
- SX1272 LoRa RF module : http://www.netblocks.eu/xrange-sx1272-lora-datasheet/
-*/
-
-#include "main.h"
-#include "sx1272-hal.h"
-#include "debug.h"
-
-/* Set this flag to '1' to display debug messages on the console */
-#define DEBUG_MESSAGE 0
-
-/* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */
-#define USE_MODEM_LORA 1
-#define USE_MODEM_FSK !USE_MODEM_LORA
-
-#define RF_FREQUENCY 868000000 // Hz
-#define TX_OUTPUT_POWER 20 // 14 dBm
-
-#if USE_MODEM_LORA == 1
+#include "LoraTransport.h"
- #define LORA_BANDWIDTH 2 // [0: 125 kHz,
- // 1: 250 kHz,
- // 2: 500 kHz,
- // 3: Reserved]
- #define LORA_SPREADING_FACTOR 7 // [SF7..SF12]
- #define LORA_CODINGRATE 1 // [1: 4/5,
- // 2: 4/6,
- // 3: 4/7,
- // 4: 4/8]
- #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx
- #define LORA_SYMBOL_TIMEOUT 5 // Symbols
- #define LORA_FIX_LENGTH_PAYLOAD_ON false
- #define LORA_FHSS_ENABLED false
- #define LORA_NB_SYMB_HOP 4
- #define LORA_IQ_INVERSION_ON false
- #define LORA_CRC_ENABLED true
-
-#elif USE_MODEM_FSK == 1
+Serial pc(PA_2, PA_3);
- #define FSK_FDEV 25000 // Hz
- #define FSK_DATARATE 19200 // bps
- #define FSK_BANDWIDTH 50000 // Hz
- #define FSK_AFC_BANDWIDTH 83333 // Hz
- #define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx
- #define FSK_FIX_LENGTH_PAYLOAD_ON false
- #define FSK_CRC_ENABLED true
-
-#else
- #error "Please define a modem in the compiler options."
-#endif
-
-#define RX_TIMEOUT_VALUE 3500000 // in us
-#define BUFFER_SIZE 32 // Define the payload size here
-
-DigitalOut led(PA_8);
-
+uint8_t responsePackage[MAX_PAYLOAD_SIZE + 4] = {0};
-/*
- * Global variables declarations
- */
-typedef RadioState States_t;
-volatile States_t State = LOWPOWER;
-
-XRange Radio( OnTxDone, OnTxTimeout, OnRxDone, OnRxTimeout, OnRxError, NULL, NULL );
-
-const uint8_t PingMsg[] = "PING";
-const uint8_t PongMsg[] = "PONG";
-
-uint16_t BufferSize = BUFFER_SIZE;
-uint8_t Buffer[BUFFER_SIZE];
-
-int16_t RssiValue = 0.0;
-int8_t SnrValue = 0.0;
-
-int main()
-{
- uint8_t i;
- bool isMaster = true;
-
- debug( "\n\n\r SX1276 Ping Pong Demo Application \n\n\r" );
-
- // verify the connection with the board
-
-
- Radio.SetChannel( RF_FREQUENCY );
+uint8_t buf[MAX_PAYLOAD_SIZE] = {0};
+uint8_t counter = 0;
+uint16_t addr = 0;
+uint8_t length = 0;
-#if USE_MODEM_LORA == 1
-
- debug_if( LORA_FHSS_ENABLED, "\n\n\r > LORA FHSS Mode < \n\n\r");
- debug_if( !LORA_FHSS_ENABLED, "\n\n\r > LORA Mode < \n\n\r");
+enum Command {
+ SETADDR = 0,
+ SENDTO = 1
+};
- Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
- LORA_SPREADING_FACTOR, LORA_CODINGRATE,
- LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
- LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
- LORA_IQ_INVERSION_ON, 2000000 );
-
- Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
- LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
- LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
- LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
- LORA_IQ_INVERSION_ON, true );
-
-#elif USE_MODEM_FSK == 1
+enum State {
+ NO_CMD = -1,
- debug("\n\n\r > FSK Mode < \n\n\r");
- Radio.SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0,
- FSK_DATARATE, 0,
- FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON,
- FSK_CRC_ENABLED, 0, 0, 0, 2000000 );
-
- Radio.SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE,
- 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH,
- 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, FSK_CRC_ENABLED,
- 0, 0, false, true );
-
-#else
-
-#error "Please define a modem in the compiler options."
+ GOT_CMD_SETADDR,
+ GOT_SETADDR_B1,
-#endif
-
- debug_if( DEBUG_MESSAGE, "Starting Ping-Pong loop\r\n" );
-
- led = 0;
-
- Radio.Rx( RX_TIMEOUT_VALUE );
-
- while( 1 )
- {
- switch( State )
- {
- case RX:
- if( isMaster == true )
- {
- if( BufferSize > 0 )
- {
- if( strncmp( ( const char* )Buffer, ( const char* )PongMsg, 4 ) == 0 )
- {
- led = !led;
- debug( "...Pong\r\n" );
- // Send the next PING frame
- strcpy( ( char* )Buffer, ( char* )PingMsg );
- // We fill the buffer with numbers for the payload
- for( i = 4; i < BufferSize; i++ )
- {
- Buffer[i] = i - 4;
- }
- wait_ms( 10 );
- Radio.Send( Buffer, BufferSize );
- }
- else if( strncmp( ( const char* )Buffer, ( const char* )PingMsg, 4 ) == 0 )
- { // A master already exists then become a slave
- debug( "...Ping\r\n" );
- led = !led;
- isMaster = false;
- // Send the next PONG frame
- strcpy( ( char* )Buffer, ( char* )PongMsg );
- // We fill the buffer with numbers for the payload
- for( i = 4; i < BufferSize; i++ )
- {
- Buffer[i] = i - 4;
- }
- wait_ms( 10 );
- Radio.Send( Buffer, BufferSize );
- }
- else // valid reception but neither a PING or a PONG message
- { // Set device as master ans start again
- isMaster = true;
- Radio.Rx( RX_TIMEOUT_VALUE );
- }
- }
- }
- else
- {
- if( BufferSize > 0 )
- {
- if( strncmp( ( const char* )Buffer, ( const char* )PingMsg, 4 ) == 0 )
- {
- led = !led;
- debug( "...Ping\r\n" );
- // Send the reply to the PING string
- strcpy( ( char* )Buffer, ( char* )PongMsg );
- // We fill the buffer with numbers for the payload
- for( i = 4; i < BufferSize; i++ )
- {
- Buffer[i] = i - 4;
- }
- wait_ms( 10 );
- Radio.Send( Buffer, BufferSize );
- }
- else // valid reception but not a PING as expected
- { // Set device as master and start again
- isMaster = true;
- Radio.Rx( RX_TIMEOUT_VALUE );
- }
- }
- }
- State = LOWPOWER;
+ GOT_CMD_SENDTO,
+ GOT_SENDTO_ADDR_B1,
+ GOT_SENDTO_ADDR_B2,
+ GOT_SENDTO_LEN,
+ GOT_SENDTO_MSG
+} state = NO_CMD;
+
+void setCmd(char byte) {
+ switch (byte) {
+ case SETADDR: {
+ state = GOT_CMD_SETADDR;
break;
- case TX:
- led = !led;
- if( isMaster == true )
- {
- debug( "Ping...\r\n" );
- }
- else
- {
- debug( "Pong...\r\n" );
- }
- Radio.Rx( RX_TIMEOUT_VALUE );
- State = LOWPOWER;
- break;
- case RX_TIMEOUT:
- if( isMaster == true )
- {
- // Send the next PING frame
- strcpy( ( char* )Buffer, ( char* )PingMsg );
- for( i = 4; i < BufferSize; i++ )
- {
- Buffer[i] = i - 4;
- }
- wait_ms( 10 );
- Radio.Send( Buffer, BufferSize );
- }
- else
- {
- Radio.Rx( RX_TIMEOUT_VALUE );
- }
- State = LOWPOWER;
+ }
+ case SENDTO: {
+ state = GOT_CMD_SENDTO;
break;
- case RX_ERROR:
- // We have received a Packet with a CRC error, send reply as if packet was correct
- if( isMaster == true )
- {
- // Send the next PING frame
- strcpy( ( char* )Buffer, ( char* )PingMsg );
- for( i = 4; i < BufferSize; i++ )
- {
- Buffer[i] = i - 4;
- }
- wait_ms( 10 );
- Radio.Send( Buffer, BufferSize );
- }
- else
- {
- // Send the next PONG frame
- strcpy( ( char* )Buffer, ( char* )PongMsg );
- for( i = 4; i < BufferSize; i++ )
- {
- Buffer[i] = i - 4;
- }
- wait_ms( 10 );
- Radio.Send( Buffer, BufferSize );
- }
- State = LOWPOWER;
- break;
- case TX_TIMEOUT:
- Radio.Rx( RX_TIMEOUT_VALUE );
- State = LOWPOWER;
- break;
- case LOWPOWER:
- break;
- default:
- State = LOWPOWER;
- break;
- }
+ }
+ }
+}
+
+void writeToSerial(const char* msg, const size_t length) {
+ for (size_t i = 0; i < length; i++) {
+ pc.putc(msg[i]);
}
}
-void OnTxDone( void )
-{
- Radio.Sleep( );
- State = TX;
- debug_if( DEBUG_MESSAGE, "> OnTxDone\n\r" );
-}
+void RXHandler() {
+ while (pc.readable()) {
+ char byte = pc.getc();
+ switch (state) {
+ case NO_CMD: {
+ setCmd(byte);
+ break;
+ }
+
+ case GOT_CMD_SETADDR: {
+ addr = byte << 8;
+ state = GOT_SETADDR_B1;
+ break;
+ }
+ case GOT_SETADDR_B1: {
+ addr += byte;
+ LoraTransport::setAddress(addr);
+ writeToSerial("\x80\x01", 2);
+ state = NO_CMD;
+ break;
+ }
-void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
-{
- Radio.Sleep( );
- BufferSize = size;
- memcpy( Buffer, payload, BufferSize );
- RssiValue = rssi;
- SnrValue = snr;
- State = RX;
- debug_if( DEBUG_MESSAGE, "> OnRxDone\n\r" );
+ case GOT_CMD_SENDTO: {
+ addr = byte << 8;
+ state = GOT_SENDTO_ADDR_B1;
+ break;
+ }
+ case GOT_SENDTO_ADDR_B1: {
+ addr += byte;
+ state = GOT_SENDTO_ADDR_B2;
+ break;
+ }
+ case GOT_SENDTO_ADDR_B2: {
+ length = byte;
+ state = GOT_SENDTO_LEN;
+ counter = 0;
+ break;
+ }
+ case GOT_SENDTO_LEN: {
+ buf[counter++] = byte;
+
+ if (counter == length) {
+ counter = 0;
+ state = GOT_SENDTO_MSG;
+ }
+ break;
+ }
+ }
+ }
}
-void OnTxTimeout( void )
-{
- Radio.Sleep( );
- State = TX_TIMEOUT;
- debug_if( DEBUG_MESSAGE, "> OnTxTimeout\n\r" );
-}
+int main() {
+ LoraTransport::init();
+ pc.attach(&RXHandler);
+
+ while (1) {
+ if (state == GOT_SENDTO_MSG) {
+ LoraTransport::send(addr, buf, length);
+ for (int i = 0; i < MAX_PAYLOAD_SIZE; i++) {
+ buf[i] = 0;
+ }
+
+ while (!LoraTransport::done()) {
+ wait_ms(10);
+ }
-void OnRxTimeout( void )
-{
- Radio.Sleep( );
- Buffer[ BufferSize ] = 0;
- State = RX_TIMEOUT;
- debug_if( DEBUG_MESSAGE, "> OnRxTimeout\n\r" );
- debug_if( DEBUG_MESSAGE, "> OnRxTimeout\n\r" );
-
+ if (LoraTransport::success()) {
+ writeToSerial("\x81\x01", 2);
+ } else {
+ writeToSerial("\x81\x00", 2);
+ }
+ state = NO_CMD;
+ } else {
+ LoraTransport::recv();
+
+ while (!LoraTransport::done()) {
+ wait_ms(10);
+ }
+
+ if (LoraTransport::success()) {
+ LoraTransport::Packet &pkg = LoraTransport::getPacket();
+ responsePackage[0] = 255;
+ responsePackage[1] = pkg.from_addr >> 8;
+ responsePackage[2] = pkg.from_addr & 0x0f;
+ responsePackage[3] = pkg.payload_size;
+ memcpy(responsePackage + 4, pkg.payload, pkg.payload_size);
+ writeToSerial((const char*) responsePackage, pkg.payload_size + 4);
+ }
+ }
+ }
}
-
-void OnRxError( void )
-{
- Radio.Sleep( );
- State = RX_ERROR;
- debug_if( DEBUG_MESSAGE, "> OnRxError\n\r" );
-}
--- a/main.h Sun May 31 13:08:43 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -/* - / _____) _ | | -( (____ _____ ____ _| |_ _____ ____| |__ - \____ \| ___ | (_ _) ___ |/ ___) _ \ - _____) ) ____| | | || |_| ____( (___| | | | -(______/|_____)_|_|_| \__)_____)\____)_| |_| - ( C )2014 Semtech - -Description: Contains the callbacks for the IRQs and any application related details - -License: Revised BSD License, see LICENSE.TXT file include in the project - - -Maintainers: www.netblocks.eu -SX1272 LoRa RF module : http://www.netblocks.eu/xrange-sx1272-lora-datasheet/ - - -*/ -#ifndef __MAIN_H__ -#define __MAIN_H__ - -/* - * Callback functions prototypes - */ -/*! - * @brief Function to be executed on Radio Tx Done event - */ -void OnTxDone( void ); - -/*! - * @brief Function to be executed on Radio Rx Done event - */ -void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ); - -/*! - * @brief Function executed on Radio Tx Timeout event - */ -void OnTxTimeout( void ); - -/*! - * @brief Function executed on Radio Rx Timeout event - */ -void OnRxTimeout( void ); - -/*! - * @brief Function executed on Radio Rx Error event - */ -void OnRxError( void ); - -/*! - * @brief Function executed on Radio Fhss Change Channel event - */ -void OnFhssChangeChannel( uint8_t channelIndex ); - -/*! - * @brief Function executed on CAD Done event - */ -void OnCadDone( void ); - -#endif // __MAIN_H__
