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.
Fork of SX1272PingPong by
Revision 14:3c9348ac486c, committed 2017-01-25
- Comitter:
- jerem28
- Date:
- Wed Jan 25 12:16:30 2017 +0000
- Parent:
- 13:edb9b443c1dd
- Child:
- 15:9c3805baa6c1
- Commit message:
- SX1272 Receiver/Transmitter program based on SX1272PingPong and SX1276Receiver repository from Didier Donsez
Changed in this revision
--- a/SX1272Lib.lib Wed Feb 17 09:17:46 2016 +0000 +++ b/SX1272Lib.lib Wed Jan 25 12:16:30 2017 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/teams/Semtech/code/SX1272Lib/#cd1093b6676f +http://mbed.org/teams/Semtech/code/SX1272Lib/#69d5976b504d
--- a/main.cpp Wed Feb 17 09:17:46 2016 +0000
+++ b/main.cpp Wed Jan 25 12:16:30 2017 +0000
@@ -3,23 +3,41 @@
#include "sx1272-hal.h"
#include "debug.h"
+/* CONFIGURATION */
+
+#define NODE_ADDR 0x411A
+
/* Set this flag to '1' to display debug messages on the console */
#define DEBUG_MESSAGE 1
+#define RX_MODE 1
+
+#define TX_MODE !RX_MODE
+
+/* Set the mode RX_MODE or TX_MODE */
+#define MODE TX_MODE
+
+/* Set the delay (according the duty cycle for the ISM band of the frequency RF_FREQUENCY */
+
+#define DUTY_CYCLE 0.01
+//#define DELAY_NEXT_TX_IN_MILLISEC ((int)((timeOnAirInMilli / DUTY_CYCLE)-timeOnAirInMilli))
+
+#define DELAY_NEXT_TX_IN_MILLISEC 5000
+
/* 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 RF_FREQUENCY 868100000 // Hz
#define TX_OUTPUT_POWER 14 // 14 dBm
#if USE_MODEM_LORA == 1
- #define LORA_BANDWIDTH 2 // [0: 125 kHz,
+ #define LORA_BANDWIDTH 0 // [0: 125 kHz,
// 1: 250 kHz,
// 2: 500 kHz,
// 3: Reserved]
- #define LORA_SPREADING_FACTOR 7 // [SF7..SF12]
+ #define LORA_SPREADING_FACTOR 12 // [SF7..SF12]
#define LORA_CODINGRATE 1 // [1: 4/5,
// 2: 4/6,
// 3: 4/7,
@@ -46,8 +64,11 @@
#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
+#define RX_TIMEOUT_VALUE 1000000000 // in us
+#define BUFFER_SIZE 17 // Define the payload size here
+
+
+Serial pc(USBTX,USBRX);
#if( defined ( TARGET_KL25Z ) || defined ( TARGET_LPC11U6X ) )
DigitalOut led(LED2);
@@ -85,23 +106,37 @@
* Global variables declarations
*/
SX1272MB2xAS Radio( 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;
+int16_t RssiValue = 0;
+int8_t SnrValue = 0;
+int8_t TemperatureValue = 0;
+
+ModemType Modem;
+
+uint16_t SeqNum = 0;
+
+// Address of the Source Node
+uint16_t NodeSrcAddr = NODE_ADDR;
+
+void hexprintf(Serial* pc, const uint8_t* buffer, uint16_t size)
+{
+ for(uint16_t count = 0; count < size; count++)
+ {
+ pc->printf("%02x", buffer[count]);
+ }
+}
+const uint8_t Msg[] = "TEST**##abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrs#"; /* abc.. is for padding */
int main()
{
- uint8_t i;
- bool isMaster = true;
+
+ pc.format(8, Serial::None, 1);
+ pc.baud(115200);
- debug( "\n\n\r SX1272 Ping Pong Demo Application \n\n\r" );
-
+ debug( ">INFO RX/TX Modem \r\n\n" );
+
// Initialize Radio driver
RadioEvents.TxDone = OnTxDone;
RadioEvents.RxDone = OnRxDone;
@@ -156,146 +191,90 @@
#error "Please define a modem in the compiler options."
#endif
-
- debug_if( DEBUG_MESSAGE, "Starting Ping-Pong loop\r\n" );
-
- led = 0;
-
+ led = 0;
+#if MODE == RX_MODE
+ debug_if( DEBUG_MESSAGE, ">INFO Starting RX loop\r\n" );
+
+ // start RX
Radio.Rx( RX_TIMEOUT_VALUE );
+ State = LOWPOWER;
+#elif MODE == TX_MODE
+ debug_if( DEBUG_MESSAGE, ">INFO Starting TX loop\r\n" );
+ State = TX;
+
+#else
+#error "Please define a valid mode (RX_MODE, TX_MODE)."
+#endif
+
+// TODO ECHO_MODE : RX_MODE then TX_MODE
+
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 );
- }
+ led = !led; // Invert LED
+
+
+ // TODO ADD tmst | number | Internal timestamp of "RX finished" event (32b unsigned)
+
+ pc.printf(">INFO RX modem=%d size=%d rssi=%d temp=%d snr=%d freq=%d bw=%d sf=%d cr=%d buffer=",
+ Modem, BufferSize, RssiValue, TemperatureValue, SnrValue, RF_FREQUENCY, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODINGRATE );
+ hexprintf(&pc, Buffer, BufferSize);
+ pc.printf("\r\n");
+
+ pc.printf("RX;%d;%d;%d;%d;%d;%d;%d;%d;",
+ Modem, BufferSize, RssiValue, SnrValue, RF_FREQUENCY, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODINGRATE );
+ hexprintf(&pc, Buffer, BufferSize);
+ pc.printf("\r\n");
+// wait_ms( 10 );
+ 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;
- 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 );
- }
+ Radio.Rx( RX_TIMEOUT_VALUE );
State = LOWPOWER;
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 );
- }
+ // We have received a Packet with a CRC error
+ pc.printf(">INFO RX_ERROR size=%d\r\n", BufferSize);
+ pc.printf("RX_ERROR;%d\r\n", BufferSize);
+ Radio.Rx( RX_TIMEOUT_VALUE );
State = LOWPOWER;
break;
case TX_TIMEOUT:
- Radio.Rx( RX_TIMEOUT_VALUE );
+ pc.printf(">TX: TIMEOUT\r\n");
+ case TX:
+ int timeOnAirInMilli = Radio.TimeOnAir(Modem,BufferSize)/1000;
+ if(DELAY_NEXT_TX_IN_MILLISEC!=0) {
+ pc.printf(">INFO: wait %.4f sec before TX\r\n", DELAY_NEXT_TX_IN_MILLISEC/1000.0);
+ wait_ms( DELAY_NEXT_TX_IN_MILLISEC );
+ }
+ led = !led; // Invert LED
+ memcpy(( char* )Buffer, ( char* ) Msg, BufferSize);
+ ++SeqNum;
+
+ TemperatureValue = Radio.Read( REG_TEMP );
+
+ /* refresh counters in payload (big endian, for readability) */
+ Buffer[4] = (uint8_t)(SeqNum >> 8); /* MSB */
+ Buffer[5] = (uint8_t)(SeqNum & 0x00FF); /* LSB */
+ Buffer[6] = (uint8_t)(NodeSrcAddr >> 8); /* MSB */
+ Buffer[7] = (uint8_t)(NodeSrcAddr & 0x00FF); /* LSB */
+ Buffer[8] = (uint8_t)(TemperatureValue >> 8); /* MSB */
+ Buffer[9] = (uint8_t)(TemperatureValue & 0x00FF); /* LSB */
+
+ /* send packet */
+ pc.printf(">TX: temp=%d src=%4x seqnum=%u size=%d timeOnAir=%.4f\r\n", TemperatureValue, NodeSrcAddr, SeqNum, BufferSize, timeOnAirInMilli/1000.0);
+ wait_ms( 10 );
+ Radio.Send( Buffer, BufferSize );
State = LOWPOWER;
- break;
+ break;
case LOWPOWER:
break;
default:
@@ -344,4 +323,3 @@
State = RX_ERROR;
debug_if( DEBUG_MESSAGE, "> OnRxError\n\r" );
}
-
--- a/mbed.bld Wed Feb 17 09:17:46 2016 +0000 +++ b/mbed.bld Wed Jan 25 12:16:30 2017 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/mbed/builds/165afa46840b \ No newline at end of file +http://mbed.org/users/mbed_official/code/mbed/builds/ad3be0349dc5 \ No newline at end of file
