TX

Dependencies:   mbed BufferedSerial SX1276GenericLib X_NUCLEO_IKS01A2

Files at this revision

API Documentation at this revision

Comitter:
TMRL123
Date:
Wed Jun 05 00:27:24 2019 +0000
Parent:
0:a73914f20498
Commit message:
Last to actualy work

Changed in this revision

BufferedSerial.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r a73914f20498 -r a0cfe0efcc5e BufferedSerial.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BufferedSerial.lib	Wed Jun 05 00:27:24 2019 +0000
@@ -0,0 +1,1 @@
+https://mbed.org/users/sam_grove/code/BufferedSerial/#a0d37088b405
diff -r a73914f20498 -r a0cfe0efcc5e main.cpp
--- a/main.cpp	Thu Apr 18 13:56:50 2019 +0000
+++ b/main.cpp	Wed Jun 05 00:27:24 2019 +0000
@@ -7,6 +7,9 @@
 #include "PinMap.h" 
 #include "sx1276-mbed-hal.h" 
 
+/* Serial communication include */
+#include "BufferedSerial.h"
+
 /* LoRa definitions */
 
 /* Set this flag to '1' to display debug messages on the console */
@@ -35,10 +38,11 @@
 #endif 
 
 
-#define RX_TIMEOUT_VALUE    3500    // in ms
+#define RX_TIMEOUT_VALUE    0       // In ms
+#define TX_TIMEOUT_VALUE    1000000 // In ms
 
 //#define BUFFER_SIZE       32        // Define the payload size here
-#define BUFFER_SIZE         512       // Define the payload size here
+#define BUFFER_SIZE         64        // Define the payload size here
 
 /* Sensors instances */
 
@@ -52,44 +56,66 @@
 static LSM6DSLSensor *acc_gyro = mems_expansion_board->acc_gyro;
 static LSM303AGRAccSensor *accelerometer = mems_expansion_board->accelerometer;
 
-char buffer1[32], buffer2[32]; // buffers to help theprinting of doubles
-
-uint32_t dados[16]; //data vector
+typedef struct {
+            float p; // Pressure
+            float temperatureHTS221; // Temperature from HTS221
+            float humidity; // Humidity
+            float temperatureLPS22HB; // Temperature from LPS22HB
+            int32_t w[3]; // Angular velocity
+            int32_t a[3]; // Acceleration of the accelerometer LSM303AGR
+            int32_t ag[3]; // Acceleration of the accelerometer and gyroscope LSM6DSL 
+            int32_t m [3]; // Heading 
+}Data; // Data struct
+        
+Data data;
 
 /* LoRa modem instances and configurations */
 
 static RadioEvents_t RadioEvents; // Calback functions struct
 
-SX1276Generic *Radio; //Defenition of a Radio object
+SX1276Generic *Radio; // Defenition of a Radio object
 
-/*Configuration function*/
+/* Configuration function */
 void SystemClock_Config(void);
 
- bool transmited = true;
+bool transmited = true;// Flag to indicate the and of transmission
 
 /* Callback functions prototypes */
+
+// Brief Function to be executed on Radio Tx Done event
 void OnTxDone(void *radio, void *userThisPtr, void *userData);
 
+// Brief Function to be executed on Radio Rx Done event
 void OnRxDone(void *radio, void *userThisPtr, void *userData, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr );
 
+// Brief Function executed on Radio Tx Timeout event
 void OnTxTimeout(void *radio, void *userThisPtr, void *userData);
 
+// Brief Function executed on Radio Rx Timeout event
 void OnRxTimeout(void *radio, void *userThisPtr, void *userData);
 
+// Brief Function executed on Radio Rx Error event
 void OnRxError(void *radio, void *userThisPtr, void *userData);
 
+// Brief Function executed on Radio Fhss Change Channel event
 void OnFhssChangeChannel(void *radio, void *userThisPtr, void *userData, uint8_t channelIndex);
 
-void OnCadDone(void *radio, void *userThisPtr, void *userData);
-
 /* Serial communication to debug program */
-
-Serial pc(USBTX,USBRX);
+BufferedSerial *ser;
 
 int main() {
-    /* General Header*/
+    SystemClock_Config(); /* Synchronize clock for TX and RX boards*/
     
-    pc.printf("Telemetry Tx inicial version program\r\n\r\n");
+    /* Serial configuration */
+    if (DEBUG_MESSAGE) {
+        ser = new BufferedSerial(USBTX, USBRX);
+        ser->baud(115200);
+        ser->format(8);
+    }
+        
+    /* General Header*/
+    if (DEBUG_MESSAGE)
+        ser->printf("Telemetry Rx inicial version program\r\n\r\n");
     
     uint8_t id; //Sensor id parameter for debug purpose
     
@@ -100,132 +126,117 @@
     accelerometer->enable();
     acc_gyro->enable_x();
     acc_gyro->enable_g();
-      
-    pc.printf("\r\n--- Starting the sensors ---\r\n");
     
-    hum_temp->read_id(&id);
-    pc.printf("HTS221  humidity & temperature    = 0x%X\r\n", id);
-    press_temp->read_id(&id);
-    pc.printf("LPS22HB  pressure & temperature   = 0x%X\r\n", id);
-    magnetometer->read_id(&id);
-    pc.printf("LSM303AGR magnetometer            = 0x%X\r\n", id);
-    accelerometer->read_id(&id);
-    pc.printf("LSM303AGR accelerometer           = 0x%X\r\n", id);
-    acc_gyro->read_id(&id);
-    pc.printf("LSM6DSL accelerometer & gyroscope = 0x%X\r\n", id);
-    
-    pc.printf("\r\n");
-    
-        /* Radio setup */
-     pc.printf("\r\n--- Starting the modem LoRa ---\r\n");
+    if (DEBUG_MESSAGE) {  
+        ser->printf("\r\n--- Starting the sensors ---\r\n");
+        
+        hum_temp->read_id(&id);
+        ser->printf("HTS221  humidity & temperature    = 0x%X\r\n", id);
+        press_temp->read_id(&id);
+        ser->printf("LPS22HB  pressure & temperature   = 0x%X\r\n", id);
+        magnetometer->read_id(&id);
+        ser->printf("LSM303AGR magnetometer            = 0x%X\r\n", id);
+        accelerometer->read_id(&id);
+        ser->printf("LSM303AGR accelerometer           = 0x%X\r\n", id);
+        acc_gyro->read_id(&id);
+        ser->printf("LSM6DSL accelerometer & gyroscope = 0x%X\r\n", id);
+        
+        ser->printf("\r\n");
+    }
+    /* Radio setup */
+    if (DEBUG_MESSAGE)
+        ser->printf("\r\n--- Starting the modem LoRa ---\r\n");
     
     Radio = new SX1276Generic(NULL, MURATA_SX1276,
             LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
             LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5,
             LORA_ANT_RX, LORA_ANT_TX, LORA_ANT_BOOST, LORA_TCXO);
-    pc.printf("SX1276 Simple transmission aplication\r\n" );
-    pc.printf("Frequency: %.1f\r\n", (double)RF_FREQUENCY/1000000.0);
-    pc.printf("TXPower: %d dBm\r\n",  TX_OUTPUT_POWER);
-    pc.printf("Bandwidth: %d Hz\r\n", LORA_BANDWIDTH);
-    pc.printf("Spreading factor: SF%d\r\n", LORA_SPREADING_FACTOR);
-    
+    if (DEBUG_MESSAGE) {
+        ser->printf("SX1276 Simple transmission aplication\r\n" );
+        ser->printf("Frequency: %.1f\r\n", (double)RF_FREQUENCY/1000000.0);
+        ser->printf("TXPower: %d dBm\r\n",  TX_OUTPUT_POWER);
+        ser->printf("Bandwidth: %d Hz\r\n", LORA_BANDWIDTH);
+        ser->printf("Spreading factor: SF%d\r\n", LORA_SPREADING_FACTOR);
+    }
     // Initialize Radio driver
     RadioEvents.TxDone = OnTxDone;
     RadioEvents.RxDone = OnRxDone;
     RadioEvents.RxError = OnRxError;
     RadioEvents.TxTimeout = OnTxTimeout;
-    RadioEvents.RxTimeout = OnRxTimeout;    
+    RadioEvents.RxTimeout = OnRxTimeout; 
+    
     while (Radio->Init( &RadioEvents ) == false) {
-        pc.printf("Radio could not be detected!\r\n");
+        if (DEBUG_MESSAGE)
+            ser->printf("Radio could not be detected!\r\n");
         wait( 1 );
     }
     
+    // Display the board type
     switch(Radio->DetectBoardType()) {
         case SX1276MB1LAS:
             if (DEBUG_MESSAGE)
-                pc.printf(" > Board Type: SX1276MB1LAS <\r\n");
+                ser->printf(" > Board Type: SX1276MB1LAS <\r\n");
             break;
         case SX1276MB1MAS:
             if (DEBUG_MESSAGE)
-                pc.printf(" > Board Type: SX1276MB1LAS <\r\n");
+                ser->printf(" > Board Type: SX1276MB1LAS <\r\n");
         case MURATA_SX1276:
             if (DEBUG_MESSAGE)
-                pc.printf(" > Board Type: MURATA_SX1276_STM32L0 <\r\n");
+                ser->printf(" > Board Type: MURATA_SX1276_STM32L0 <\r\n");
             break;
         case RFM95_SX1276:
             if (DEBUG_MESSAGE)
-                pc.printf(" > HopeRF RFM95xx <\r\n");
+                ser->printf(" > HopeRF RFM95xx <\r\n");
             break;
         default:
-            pc.printf(" > Board Type: unknown <\r\n");
+            if (DEBUG_MESSAGE)
+                ser->printf(" > Board Type: unknown <\r\n");
     }
     
-    Radio->SetChannel(RF_FREQUENCY );
+    Radio->SetChannel(RF_FREQUENCY ); // Sets the frequency of the communication
     
-    if (LORA_FHSS_ENABLED)
-        pc.printf("             > LORA FHSS Mode <\r\n");
-    if (!LORA_FHSS_ENABLED)
-        pc.printf("             > LORA Mode <\r\n");
-        
-    pc.printf("\r\n");
-        
+    // Debug message of the state of fhss
+    if (LORA_FHSS_ENABLED) {
+        if (DEBUG_MESSAGE)
+            ser->printf("             > LORA FHSS Mode <\r\n");
+    }    
+    if (!LORA_FHSS_ENABLED) {
+        if (DEBUG_MESSAGE)
+            ser->printf("             > LORA Mode <\r\n");
+    }
+    
+    // Sets the configuration of the transmission    
     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, 2000 );
     
+    // Sets the configuration of the reception
     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 );
       
-    Radio->Tx(1000000);
+    Radio->Tx(TX_TIMEOUT_VALUE); // Puts the device in transmission mode for a long period
     
     while(1) {   
-        float p; //pressure
-        float temperatureHTS221; //temperature from HTS221
-        float humidity; //humidity
-        float temperatureLPS22HB; //temperature from LPS22HB
-        int32_t w[3]; //angular velocity
-        int32_t a[3]; //acceleration of the accelerometer LSM303AGR
-        int32_t ag[3]; //acceleration of the accelerometer and gyroscope LSM6DSL 
-        int32_t m [3]; //heading 
-        
-        press_temp->get_pressure(&p); //get the pressure
-        press_temp->get_temperature(&temperatureLPS22HB); //get temperature from LPS22HB
-        accelerometer->get_x_axes(a);//get the acceleration
-        acc_gyro->get_x_axes(ag);//get the acceleration
-        acc_gyro->get_g_axes(w);//get the angular velocity
-        magnetometer->get_m_axes(m); //get the magnetometer heading
-        hum_temp->get_temperature(&temperatureHTS221); //get temperature from HTS221
-        hum_temp->get_humidity(&humidity); //get humidity
-        
+    
+        press_temp->get_pressure(&data.p); // Get the pressure
+        press_temp->get_temperature(&data.temperatureLPS22HB); // Get temperature from LPS22HB
+        accelerometer->get_x_axes(data.a);// Get the acceleration
+        acc_gyro->get_x_axes(data.ag);// Get the acceleration
+        acc_gyro->get_g_axes(data.w);// Get the angular velocity
+        magnetometer->get_m_axes(data.m); // Get the magnetometer heading
+        hum_temp->get_temperature(&data.temperatureHTS221); // Get temperature from HTS221
+        hum_temp->get_humidity(&data.humidity); // Get humidity
         
-        //sensors data
-        
-        dados[0] = a[0];
-        dados[1] = a[1];
-        dados[2] = a[2];
-        dados[3] = ag[0];
-        dados[4] = ag[1];
-        dados[5] = ag[2];
-        dados[6] = w[0];
-        dados[7] = w[1];
-        dados[8] = w[2];
-        dados[9] = m[0];
-        dados[10] = m[1];
-        dados[11] = m[2];
-        dados[12] = humidity;
-        dados[13] = temperatureHTS221;
-        dados[14] = temperatureLPS22HB;
-        dados[15] = p;
-        
+        // Only sends a new packet when the device already have transmited the previous one 
         if (transmited==true) {
             transmited = false;
             wait_ms(10);
-            Radio->Send( dados, sizeof(dados) );
+            Radio->Send( &data, sizeof(data) );
         }
     }
 }
@@ -275,49 +286,16 @@
 }
 
 /* Helper function for printing floats & doubles */
-static char *print_double(char* str, double v, int decimalDigits=2)
-{
-  int i = 1;
-  int intPart, fractPart;
-  int len;
-  char *ptr;
 
-  /* prepare decimal digits multiplicator */
-  for (;decimalDigits!=0; i*=10, decimalDigits--);
-
-  /* calculate integer & fractinal parts */
-  intPart = (int)v;
-  fractPart = (int)((v-(double)(int)v)*i);
-
-  /* fill in integer part */
-  sprintf(str, "%i.", intPart);
-
-  /* prepare fill in of fractional part */
-  len = strlen(str);
-  ptr = &str[len];
-
-  /* fill in leading fractional zeros */
-  for (i/=10;i>1; i/=10, ptr++) {
-    if (fractPart >= i) {
-      break;
-    }
-    *ptr = '0';
-  }
-
-  /* fill in (rest of) fractional part */
-  sprintf(ptr, "%i", fractPart);
-
-  return str;
-}
 
 void OnTxDone(void *radio, void *userThisPtr, void *userData)
 {   
     Radio->Sleep( );
     transmited = true;
     if (DEBUG_MESSAGE) {
-        pc.printf("> OnTxDone\r\n");
-        pc.printf("I transmited %6ld, %6ld, %6ld, %6ld, %6ld, %6ld, %6ld, %6ld, %6ld\r\n", dados[0], dados[1], dados[2], dados[3], dados[4], dados[5], dados[6], dados[7], dados[8]);
-        pc.printf("and %6ld, %6ld, %6ld, %s, %7s, %7s %s\r\n", dados[9], dados[10], dados[11], print_double(buffer2, dados[12]), print_double(buffer1, dados[13]), print_double(buffer1, dados[14]), print_double(buffer2, dados[15]));
+        ser->printf("> OnTxDone\r\n");
+        ser->printf("I transmited %d mg, %d mg, %d mg, %d mg, %d mg, %d mg, %d mdps, %d mdps, %d mdps\r\n", data.a[0], data.a[1], data.a[2], data.ag[0], data.ag[1], data.ag[2], data.w[0], data.w[1], data.w[2]);
+        ser->printf("and %d mG, %d mG, %d mG, %g %%, %g C, %g C, %g mBar\r\n", data.m[0], data.m[1], data.m[2], data.humidity, data.temperatureHTS221, data.temperatureLPS22HB, data.p);
     }    
 }
 
@@ -325,26 +303,26 @@
 {
     Radio->Sleep( );
     if (DEBUG_MESSAGE)
-        pc.printf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d\r\n", rssi, snr);
+        ser->printf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d\r\n", rssi, snr);
 }
 
 void OnTxTimeout(void *radio, void *userThisPtr, void *userData)
 {
     Radio->Sleep( );
     if(DEBUG_MESSAGE)
-        pc.printf("> OnTxTimeout\r\n");
+        ser->printf("> OnTxTimeout\r\n");
 }
 
 void OnRxTimeout(void *radio, void *userThisPtr, void *userData)
 {
     Radio->Sleep( );
     if (DEBUG_MESSAGE)
-        pc.printf("> OnRxTimeout\r\n");
+        ser->printf("> OnRxTimeout\r\n");
 }
 
 void OnRxError(void *radio, void *userThisPtr, void *userData)
 {
     Radio->Sleep( );
     if (DEBUG_MESSAGE)
-        pc.printf("> OnRxError\r\n");
+        ser->printf("> OnRxError\r\n");
 }