TX

Dependencies:   mbed BufferedSerial SX1276GenericLib X_NUCLEO_IKS01A2

Revision:
4:a0cfe0efcc5e
Parent:
0:a73914f20498
--- 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");
 }