Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
--- 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;
--- /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
--- /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
--- /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; +}
--- /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