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
Diff: main.cpp
- 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;