Polytech school project. RICM4 students, see http://air.imag.fr/index.php/Projets-2016-2017-Station_de_pompage_connect%C3%A9e for more information

Dependencies:   SX1276Lib mbed

Fork of SX1276PingPong by Semtech

Revision:
16:1643ac8ba29f
Parent:
15:0439a7579868
--- a/main.cpp	Fri Mar 03 08:07:37 2017 +0000
+++ b/main.cpp	Sat Apr 01 12:14:27 2017 +0000
@@ -2,11 +2,17 @@
 #include "main.h"
 #include "sx1276-hal.h"
 #include "debug.h"
+#include "ordre.h"
+#include "trame.h"
 
-/* Set this flag to '1' to display debug messages on the console */
-#define DEBUG_MESSAGE   1
+/* Set this flag to '1' to display debug messages on the console 
+    Must be 0 in order to work with the projet
+*/
+#define DEBUG_MESSAGE   0
 
+#define ID_DEVICE 0x24
 #define ID_STATION 0x55
+#define TEMPS_ATTENTE_COM 20
 
 /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */
 #define USE_MODEM_LORA  1
@@ -88,21 +94,25 @@
  */
 SX1276MB1xAS 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;
 
+//Connection serie avec le PC
+Serial pc(USBTX, USBRX);
+
+char portCom[3];
+bool ordreRecuPortCom = false;
+
+
 int main() 
 {
     uint8_t i;
     bool isMaster = false;
     
-    debug( "\n\n\r     SX1276 Server Demo Application \n\n\r" );
+    debug_if( DEBUG_MESSAGE,  "\n\n\r     SX1276 Server Demo Application \n\n\r" );
 
     // Initialize Radio driver
     RadioEvents.TxDone = OnTxDone;
@@ -115,7 +125,7 @@
     // verify the connection with the board
     while( Radio.Read( REG_VERSION ) == 0x00  )
     {
-        debug( "Radio could not be detected!\n\r", NULL );
+        debug_if( DEBUG_MESSAGE,  "Radio could not be detected!\n\r", NULL );
         wait( 1 );
     }
             
@@ -126,8 +136,8 @@
 
 #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");
+    debug_if( DEBUG_MESSAGE & LORA_FHSS_ENABLED, "\n\n\r             > LORA FHSS Mode < \n\n\r");
+    debug_if( DEBUG_MESSAGE & !LORA_FHSS_ENABLED, "\n\n\r             > LORA Mode < \n\n\r");
 
     Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
                          LORA_SPREADING_FACTOR, LORA_CODINGRATE,
@@ -143,7 +153,7 @@
                          
 #elif USE_MODEM_FSK == 1
 
-    debug("\n\n\r              > FSK Mode < \n\n\r");
+    debug_if( DEBUG_MESSAGE, "\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,
@@ -164,11 +174,14 @@
         
     led = 0;
     
-    char PingMsg[] = {0x24, 0x7F, 0xEF};
-    char PongMsg[] = {0x24, 0x55, 0xFF};
+    //ACK Message Par defaut
+    char  AckMsg[] = {0x24, 0x55, 0x00};
     
     Radio.Rx( RX_TIMEOUT_VALUE );
     
+    //Varialbe de controle
+    bool ackOrData = true; //true = ack, false = Data
+    
     while( 1 )
     {
         switch( State )
@@ -176,23 +189,32 @@
         case RX:
             if( BufferSize > 0 )
             {
-                if( strncmp( ( const char* )Buffer, ( const char* )PingMsg, 3 ) == 0 )
+                TrameData trameRecue((char*)Buffer);
+                if( trameRecue.getIdStation() == (char) ID_STATION )
                 {
+                    
                     led = !led;
-                    debug( "...DATA\r\n" );
-                    // Send the reply to the PING string
-                    strcpy( ( char* )Buffer, ( char* )PongMsg );
+                    debug_if( DEBUG_MESSAGE,  "...DATA\r\n" );
+                    
+                    //Envoit sur le port COM
+                    pc.printf(trameRecue.creerTrame());
+                    
+                    // Send the ACK
+                    AckMsg[0] = trameRecue.getIdEmetteur();
+                    
+                    strcpy( ( char* )Buffer, ( char* )AckMsg );
                     // We fill the buffer with numbers for the payload 
                     for( i = 3; i < BufferSize; i++ )
                     {
                         Buffer[i] = i - 4;
                     }
-                    wait_ms( 1000 );  
+                    wait( 5.0);
+                    ackOrData = true;
                     Radio.Send( Buffer, BufferSize );
+                    
                 }
-                else // valid reception but not a PING as expected
-                {    // Set device as master and start again
-                    isMaster = true;
+                else // valid reception but not expected
+                {    
                     Radio.Rx( RX_TIMEOUT_VALUE );
                 }    
             }
@@ -200,8 +222,20 @@
             break;
         case TX:    
             led = !led; 
-            debug( "ORDRE...\r\n" );
-            Radio.Rx( RX_TIMEOUT_VALUE );
+            if(ackOrData){
+                debug_if( DEBUG_MESSAGE,  "ACK...\r\n" );
+                //Après Envoie du ACK, on ecoute la réponse du PC (pour l'ordre)
+                led = 1;
+                pc.scanf("%s",portCom);
+                led = 0;
+                //Mise a jour des variables de controle
+                ordreRecuPortCom = true;
+                ackOrData = false;
+            }
+            else{
+                debug_if( DEBUG_MESSAGE,  "ORDRE...\r\n" );
+                Radio.Rx( RX_TIMEOUT_VALUE );
+            }
             State = LOWPOWER;
             break;
         case RX_TIMEOUT:
@@ -210,14 +244,7 @@
             break;
         case RX_ERROR:
             // We have received a Packet with a CRC error, send reply as if packet was correct
-            // Send the next PONG frame
-            strcpy( ( char* )Buffer, ( char* )PongMsg );
-            for( i = 3; i < BufferSize; i++ )
-            {
-                Buffer[i] = i - 4;
-            }
-            wait_ms( 10 );
-            Radio.Send( Buffer, BufferSize );
+            //Do nothing
             State = LOWPOWER;
             break;
         case TX_TIMEOUT:
@@ -225,6 +252,26 @@
             State = LOWPOWER;
             break;
         case LOWPOWER:
+            if(ordreRecuPortCom){
+                Ordre o((char *)portCom);
+                debug_if( DEBUG_MESSAGE,  "Ordre recu sur le port COM\r\n" );
+                led=!led;
+                if(o.getOrdreAFaire() == 1){
+                    //Envoie de l'ordre.
+                    strcpy( ( char* )Buffer, ( char* )portCom );
+                    for( i = 3; i < BufferSize; i++ )
+                    {
+                        Buffer[i] = i - 4;
+                    }
+                    wait_ms( 10 );
+                    ordreRecuPortCom = false;
+                    Radio.Send( Buffer, BufferSize );
+                }else{
+                    debug_if( DEBUG_MESSAGE,  "Pas d'activation de la pompe\r\n" );
+                    Radio.Rx( RX_TIMEOUT_VALUE );
+                }
+                ordreRecuPortCom = false;
+            
             break;
         default:
             State = LOWPOWER;