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

Files at this revision

API Documentation at this revision

Comitter:
chevamax
Date:
Sat Apr 01 12:14:27 2017 +0000
Parent:
15:0439a7579868
Commit message:
Version finale

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
ordre.cpp Show annotated file Show diff for this revision Revisions of this file
ordre.h Show annotated file Show diff for this revision Revisions of this file
trame.cpp Show annotated file Show diff for this revision Revisions of this file
trame.h Show annotated file Show diff for this revision Revisions of this file
diff -r 0439a7579868 -r 1643ac8ba29f main.cpp
--- 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;
diff -r 0439a7579868 -r 1643ac8ba29f ordre.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ordre.cpp	Sat Apr 01 12:14:27 2017 +0000
@@ -0,0 +1,77 @@
+#include "mbed.h"
+#include "ordre.h"
+#include "debug.h"
+
+Ordre::Ordre(char id, char idR, char niveau){
+    //TODO   
+}
+
+char getiemebit1(char c, int i)
+{
+     return ((c>>(7-i)) & 1);
+}
+
+Ordre::Ordre(char* trameRecu){
+    idEmetteur = trameRecu[1];
+    idRecepteur = trameRecu[0];
+    niveauCuve = trameRecu[2]>>3;
+    ordreAFaire = (trameRecu[2]&0x4)>>2;
+    
+    /*debug("idEmetteur = ");
+    for(int i=0; i < 8; i++){
+        if(getiemebit1(trameRecu[1], i)){
+            debug("1");
+        }
+        else{
+            debug("0");
+        }
+    }
+    debug("\r\n idRecepteur = ");
+    for(int i=0; i < 8; i++){
+        if(getiemebit1(trameRecu[0], i)){
+            debug("1");
+        }
+        else{
+            debug("0");
+        }
+    }
+    debug("\r\n niveauCuve = ");
+    for(int i=0; i < 8; i++){
+        if(getiemebit1(niveauCuve, i)){
+            debug("1");
+        }
+        else{
+            debug("0");
+        }
+    }
+    debug("\r\n dernierOctet = ");
+    for(int i=0; i < 8; i++){
+        if(getiemebit1(trameRecu[2], i)){
+            debug("1");
+        }
+        else{
+            debug("0");
+        }
+    }
+    debug("\r\n");*/
+}
+char* Ordre::creerTrame(){
+    //TODO
+    return NULL;
+}
+void Ordre::mettreAJourNiveauCuve(){
+    //TODO
+}
+
+char Ordre::getIdEmetteur(){
+    return idEmetteur;
+}
+char Ordre::getIdRecepteur(){
+    return idRecepteur;
+}
+char Ordre::getNiveauCuve(){
+    return niveauCuve;
+}
+char Ordre::getOrdreAFaire(){
+    return ordreAFaire;
+}
\ No newline at end of file
diff -r 0439a7579868 -r 1643ac8ba29f ordre.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ordre.h	Sat Apr 01 12:14:27 2017 +0000
@@ -0,0 +1,27 @@
+#ifndef __ORDRE_H
+#define __ORDRE_H
+
+#include "mbed.h"
+
+#define TAILLE_TRAME_ORDRE 3 //octets
+
+class Ordre {
+  private:
+    char idEmetteur; // 1 octet
+    char idRecepteur; //1 octet
+    char niveauCuve;  //5 bits
+    char ordreAFaire; // 1 bit
+    char trame[TAILLE_TRAME_ORDRE];
+  
+  public:
+    Ordre(char id, char idR, char niveau);
+    Ordre(char* trameRecu);
+    char* creerTrame();
+    void mettreAJourNiveauCuve();
+    char getIdEmetteur();
+    char getIdRecepteur();
+    char getNiveauCuve();
+    char getOrdreAFaire();
+};
+
+#endif // __ORDRE_H
\ No newline at end of file
diff -r 0439a7579868 -r 1643ac8ba29f trame.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trame.cpp	Sat Apr 01 12:14:27 2017 +0000
@@ -0,0 +1,179 @@
+#include "mbed.h"
+#include "trame.h"
+#include "debug.h"
+
+TrameData::TrameData(char idE, char idS, int nbNiveau, char etatP, char niveau, char batterie){
+    idEmetteur = idE;
+    idStation = idS;
+    if(nbNiveau >= 63){
+        nombreNiveau = 0x1F;
+    }else{
+        nombreNiveau = (char) nbNiveau;
+    }
+    mettreAJourEtatPompe(etatP);
+    mettreAJourNiveauCuve(niveau);
+    mettreAJourNiveauBatterie(batterie);
+    trame[4]=0;
+    
+}
+char getiemebit(char c, int i)
+{
+     return ((c>>(7-i)) & 1);
+}
+
+
+TrameData::TrameData(char* Buff){
+    idStation = Buff[0];
+    idEmetteur = Buff[1];
+    etatPompe = Buff[2]>>7;
+    nombreNiveau = (Buff[2] & 0x7C) >> 2;
+    niveauCuve = ((Buff[2] & 0x3)<<3) | ((Buff[3] & 0xE0)>>5);
+    niveauBatterie = (Buff[3] & 0xF);
+    trame[4]=0;
+    
+    /*
+    
+    
+    
+    //Etat Pompe
+    for(int i=0; i < 8; i++){
+        if(getiemebit(etatPompe, i)){
+            debug("1");
+        }
+        else{
+            debug("0");
+        }
+    }
+    debug("\r\n");
+    //nombreNiveau
+    for(int i=0; i < 8; i++){
+        if(getiemebit(nombreNiveau, i)){
+            debug("1");
+        }
+        else{
+            debug("0");
+        }
+    }
+    debug("\r\n niveauCuve \r\n");
+    //niveauCuve
+    for(int i=0; i < 8; i++){
+        if(getiemebit(niveauCuve, i)){
+            debug("1");
+        }
+        else{
+            debug("0");
+        }
+    }
+    
+    debug("\r\n");
+    //niveauBatterie
+    for(int i=0; i < 8; i++){
+        if(getiemebit(niveauBatterie, i)){
+            debug("1");
+        }
+        else{
+            debug("0");
+        }
+    }*/
+}
+
+char TrameData::getIdEmetteur(){
+    return idEmetteur;
+}
+char TrameData::getIdStation(){
+    return idStation;
+}
+
+char* TrameData::creerTrame(){
+    trame[0] = idStation;
+    trame[1] = idEmetteur;
+    trame[2] = (etatPompe<<7)|(nombreNiveau<<2)|(niveauCuve>>3);
+    trame[3] = (niveauCuve<<5)|(niveauBatterie);
+    trame[4] = 0;
+    
+    /*char courant;
+    for(int j=0; j<4;j++){
+        courant = trame[j];
+        for(int i=0; i < 8; i++){
+            if(getiemebit(courant, i)){
+                debug("1");
+            }
+            else{
+                debug("0");
+            }
+        }
+        debug(" ");
+    }
+    debug("\r\n");
+    
+    
+    //Etat Pompe
+    for(int i=0; i < 8; i++){
+        if(getiemebit(etatPompe, i)){
+            debug("1");
+        }
+        else{
+            debug("0");
+        }
+    }
+    debug("\r\n");
+    //nombreNiveau
+    for(int i=0; i < 8; i++){
+        if(getiemebit(nombreNiveau, i)){
+            debug("1");
+        }
+        else{
+            debug("0");
+        }
+    }
+    debug("\r\n");
+    //niveauCuve
+    for(int i=0; i < 8; i++){
+        if(getiemebit(niveauCuve, i)){
+            debug("1");
+        }
+        else{
+            debug("0");
+        }
+    }
+    
+    debug("\r\n");
+    //niveauBatterie
+    for(int i=0; i < 8; i++){
+        if(getiemebit(niveauBatterie, i)){
+            debug("1");
+        }
+        else{
+            debug("0");
+        }
+    }
+    
+    //debug("%c ; %c ; %c\r\n",trame[0],trame[1],trame[2]);
+    char courant;
+    debug("%d\r\n", sizeof(char));
+    for(int j=0; j<3;j++){
+        courant = trame[j];
+        for(int i=0; i < 8; i++){
+            if(getiemebit(courant, i)){
+                debug("1");
+            }
+            else{
+                debug("0");
+            }
+        }
+        debug(" ");
+    }
+    debug("\r\n");
+   */
+    
+    return trame;
+}
+void TrameData::mettreAJourEtatPompe(char etatP){
+    etatPompe = etatP;
+}
+void TrameData::mettreAJourNiveauCuve(char niveau){
+    niveauCuve = niveau;
+}
+void TrameData::mettreAJourNiveauBatterie(char niveau){
+    niveauBatterie = niveau;
+}
diff -r 0439a7579868 -r 1643ac8ba29f trame.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trame.h	Sat Apr 01 12:14:27 2017 +0000
@@ -0,0 +1,40 @@
+#ifndef __TRAME_H
+#define __TRAME_H
+
+#include "mbed.h"
+#define TAILLE_TRAME_DATA 5 //octets 3+1 for null char
+
+/**
+* Represente une trame de donnée
+**/
+class TrameData {
+  private:
+    char idEmetteur; // 1 octet
+    char idStation; //1 octet
+    char etatPompe; //1 bit  
+    char nombreNiveau; //5 bits
+    char niveauCuve;  //5 bits
+    char niveauBatterie; //4bits
+    char trame[TAILLE_TRAME_DATA];
+  
+  public:
+    //Creer un objet trame a partir de parametres
+    TrameData(char idE, char idS, int nbNiveau, char etatP, char niveau, char batterie);
+    
+    //Creer un objet trame a partir d'un tableau de caracteres (ici le buffer)
+    TrameData(char* Buff);
+    
+    //Retourne un tableau de char représentant la trame en binaire
+    char* creerTrame();
+    
+    //Mise a jour des differents champs
+    void mettreAJourEtatPompe(char etatP);
+    void mettreAJourNiveauCuve(char niveau);
+    void mettreAJourNiveauBatterie(char niveau);
+    
+    //Getter
+    char getIdEmetteur();
+    char getIdStation();
+};
+
+#endif // __TRAME_H
\ No newline at end of file