Polytech school project. RICM4 students, see http://air.imag.fr/index.php/Projets-2016-2017-Station_de_pompage_connect%C3%A9e for more information
Fork of SX1276PingPong by
Revision 16:1643ac8ba29f, committed 2017-04-01
- Comitter:
- chevamax
- Date:
- Sat Apr 01 12:14:27 2017 +0000
- Parent:
- 15:0439a7579868
- Commit message:
- Version finale
Changed in this revision
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