ping pong with modifiable parameters

Dependencies:   mbed SX126xLib

Revision:
9:58c61a425d06
Parent:
8:2952eeb51ceb
--- a/main.cpp	Mon Sep 09 21:24:04 2019 +0000
+++ b/main.cpp	Tue Nov 12 20:18:22 2019 +0000
@@ -25,14 +25,18 @@
 long unsigned RF_FREQUENCY = 500000000; // Hz
 RadioLoRaSpreadingFactors_t spreading_factor = LORA_SF7;
 RadioLoRaBandwidths_t bandwidth = LORA_BW_500;
+RadioLoRaCodingRates_t coding_rate = LORA_CR_4_5;
 int TX_OUTPUT_POWER  = 10; //The range of the output power is [-18..+13] dBm
 bool isMaster =  true;
 
 Serial s( USBTX, USBRX ); // serial object for AT commands
 char serial_buffer[buffer_size];    // buffer to save incoming data
-int serial_buffer_index = 0;          // index array for buffer
+char serial_buffer2[buffer_size];   // second buffer to save incoming data
+int serial_buffer_where=0;          // index array for buffer
+int serial_buffer2_where=0;         // index array for second buffer
 bool serial_end_line = false;       // searching for end line
 
+
 uint8_t BufferSize = BUFFER_SIZE;
 uint8_t Buffer[BUFFER_SIZE];
 
@@ -53,7 +57,7 @@
 void OnTxTimeout( void );
 void OnRxTimeout( void );
 void OnRxError( IrqErrorCode_t );
-void parser();
+void parser(char*);
 void LoRa_init();
 
 
@@ -86,41 +90,64 @@
 
 void serialRx()
 {
-    int j;
-    while(s.readable()) {
-        char character=s.getc();                                           
-        if(( (int)character==10 || (int)character==13) && serial_end_line) {
-            serial_end_line=true; 
+    
+    while(s.readable()) {                                                  // read all data from serial
+        char character=s.getc();                                           // get a char form serial
+        if(((int)character==10 || (int)character==13) && serial_end_line) { // search for end line /r or /n
+            serial_end_line=true;                                           // end was find in the previous charascter, skip
             continue;
         } else {
-            serial_end_line=false; 
+            serial_end_line=false;                                          // clear serial_end_line flag
         }
-        if(serial_buffer_index != buffer_fill) {
-            serial_buffer[serial_buffer_index++] = character;
-            if(serial_buffer_index == buffer_size) {
-                serial_buffer[buffer_size-1] = '\0';
-                serial_buffer_index=buffer_fill;
+        if(serial_buffer_where!=buffer_fill && !(serial_buffer2_where != 0 && serial_buffer2_where!=buffer_fill)) {
+            serial_buffer[serial_buffer_where++]=character;
+            if(serial_buffer_where==buffer_size) {                          // check if incoming data are smaller than buffer size
+                serial_buffer[buffer_size-1]='\0';                          // posibility to lost data, if the incoming data are too big
+                serial_buffer_where=buffer_fill;                            // set index array to indicate buffer fill
                 continue;
             }
-            if(character == 13 || character == 10) {
-                serial_buffer[serial_buffer_index-1] = '\0';
-                serial_buffer_index = buffer_fill;
-                serial_end_line = true;
+            if(character==13 || character==10) {                            // if end of line (\r \n) is indicated, prepare the buffer to serialGetBuffer
+                serial_buffer[serial_buffer_where-1]='\0';                  // set end of buffer with 0
+                serial_buffer_where=buffer_fill;                            // set index array to indicate buffer fill
+                serial_end_line=true;                                       // end of line was find, set serial_end_line flag
+            }
+        } else if(serial_buffer2_where!=buffer_fill) {                      // same for second buffer
+            serial_buffer2[serial_buffer2_where++]=character;
+            if(serial_buffer2_where==buffer_size) {
+                serial_buffer2[buffer_size-1]='\0';
+                serial_buffer2_where=buffer_fill;
+                continue;
+            }
+            if(character==13 || character==10) {
+                serial_buffer2[serial_buffer2_where-1]='\0';
+                serial_buffer2_where=buffer_fill;
+                serial_end_line=true;
             }
         } 
     }
-    if(serial_buffer_index==buffer_fill && serial_end_line != true) {
-        printf("Input too long to be parsed\n\r");
-        serial_buffer_index = 0;
+}
+
+int serialGetBuffer(char * & data)
+{
+    if(serial_buffer_where==buffer_fill && serial_buffer2_where==buffer_fill) {
+        data=serial_buffer;
+        //memcpy(data, serial_buffer, strlen(serial_buffer)+1);
+        serial_buffer_where=0;
+        return 2;
+    } else if(serial_buffer2_where==buffer_fill) {
+        data=serial_buffer2;
+        //memcpy(data, serial_buffer2, strlen(serial_buffer2)+1);
+        serial_buffer2_where=0;
+        return 1;
+    } else if(serial_buffer_where==buffer_fill) {
+        data=serial_buffer;
+        //memcpy(data, serial_buffer, strlen(serial_buffer)+1);
+        serial_buffer_where=0;
+        return 1;
+    } else {
+        data = NULL;
+        return 0;
     }
-    else if(serial_end_line == true) {
-        serial_buffer_index = 0;
-        if(sscanf (serial_buffer,"%d",&j)) {  // sscanf for searching integer
-            printf("From PC:%d.\n\r" ,j);  // write to serial incoming integer
-        }
-        parser();
-    }
-    
 }
 
 /*!
@@ -136,7 +163,7 @@
     modulationParams.PacketType                  = PACKET_TYPE_LORA;
     modulationParams.Params.LoRa.SpreadingFactor = spreading_factor;
     modulationParams.Params.LoRa.Bandwidth       = bandwidth;
-    modulationParams.Params.LoRa.CodingRate      = LORA_CR_4_5;
+    modulationParams.Params.LoRa.CodingRate      = coding_rate;
 
     PacketParams.PacketType                 = PACKET_TYPE_LORA;
     PacketParams.Params.LoRa.PreambleLength = 0x08;
@@ -193,6 +220,10 @@
     while( 1 )
     {
         Radio.ProcessIrqs( );
+        char *data;
+        serialGetBuffer(data);
+        if(data)
+            parser(data);
         switch( AppState )
         {
             case APP_RX:
@@ -347,11 +378,11 @@
 }
 
 
-void parser() {
-    printf("%s\n\r", serial_buffer);
+void parser(char* serial_in) {
+    printf("%s\n\r", serial_in);
     char command[10];
     long val;
-    if(sscanf(serial_buffer, "%10s %lu", command, &val) != 2){
+    if(sscanf(serial_in, "%10s %lu", command, &val) != 2){
         printf("Invalid Input\n\r");
         return;
     }
@@ -399,6 +430,25 @@
                 printf("enter spreading factor between 5 and 12\n\r");
                 return;
         }
+    }
+    else if(strcmp(command, "CR") == 0) {
+        switch(val) {
+            case 45:
+                coding_rate = LORA_CR_4_5;
+            break;
+            case 46:
+                coding_rate = LORA_CR_4_6;
+            break;
+            case 47:
+                coding_rate = LORA_CR_4_7;
+            break;
+            case 48:
+                coding_rate = LORA_CR_4_8;
+            break;
+            default:
+                printf("enter valid coding rate\n\r");
+                return;
+        }
         printf("Spreading factor changed to %lu\n\r", val);
         LoRa_init();
     }
@@ -439,6 +489,13 @@
                 printf("15, 10, 7\n\r");
                 return;
         }
+        
+        
+        // TODO separate master slave
+        // TODO make a separate lorawan compatible
+        // TODO view current settings
+        // TODO stop display
+        // ncurses
         printf("LoRa bandwidth changed to %lu\n\r", val);
         LoRa_init();
     }