RobOmega - PSL RoboCup / Mbed OS nRF24L01P_L432KC_CarteBlanche

Dependencies:   nRF24L01P_Hello_World nRF24L01P

Files at this revision

API Documentation at this revision

Comitter:
voltxd
Date:
Fri Apr 16 16:01:03 2021 +0000
Parent:
4:5caf9e1dc16c
Commit message:
ok;

Changed in this revision

circularBuffer.cpp Show annotated file Show diff for this revision Revisions of this file
circularBuffer.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
mbed-os.lib Show annotated file Show diff for this revision Revisions of this file
protocol.cpp Show annotated file Show diff for this revision Revisions of this file
protocol.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/circularBuffer.cpp	Fri Apr 16 16:01:03 2021 +0000
@@ -0,0 +1,94 @@
+#include "circularBuffer.h"
+
+//-----------------------------TX-----------------------------//
+int cbTxHead;
+int cbTxTail;
+char cbTxBuffer[BUFFER_SIZE];
+
+void cbTxSendMessage(char* message, int length)
+{
+    int i;
+    if (cbTxRemainingSize() > length)
+        for (i = 0; i < length; i++)
+            cbTxAddOne(message[i]);
+}
+
+void cbTxAddOne(char value)
+{
+    if (cbTxRemainingSize() > 0)
+    {
+        cbTxBuffer[cbTxHead++] = value;
+        if (cbTxHead >= BUFFER_SIZE)
+            cbTxHead = 0;
+    }
+}
+
+char cbTxGetOne()
+{
+    char value = cbTxBuffer[cbTxTail++];
+    if (cbTxTail >= BUFFER_SIZE)
+        cbTxTail = 0;
+    return value;
+}
+
+int cbTxRemainingSize()
+{
+    int size;
+    if (cbTxTail > cbTxHead)
+        size = cbTxTail - cbTxHead;
+    else
+        size = BUFFER_SIZE - (cbTxHead - cbTxTail);
+    return size;
+}
+
+int cbTxGetDataSize()
+{
+    return BUFFER_SIZE - cbTxRemainingSize();
+}
+
+
+//-----------------------------RX-----------------------------//
+int cbRxHead;
+int cbRxTail;
+char cbRxBuffer[BUFFER_SIZE];
+
+void cbRxAddOne(char value)
+{
+    if (cbRxRemainingSize() > 0)
+    {
+        cbRxBuffer[cbRxHead++] = value;
+        if (cbRxHead >= BUFFER_SIZE)
+            cbRxHead = 0;
+    }
+}
+
+char cbRxGetOne()
+{
+    char value = cbRxBuffer[cbRxTail++];
+    if (cbRxTail >= BUFFER_SIZE)
+        cbRxTail = 0;
+    return value;    
+}
+
+unsigned char cbRxIsDataAvailable()
+{
+    if (cbRxTail != cbRxHead)
+        return 1;
+    else
+        return 0;
+}
+
+int cbRxRemainingSize()
+{
+    int size;
+    if (cbRxTail > cbRxHead)
+        size = cbRxTail - cbRxHead;
+    else
+        size = BUFFER_SIZE - (cbRxHead - cbRxTail);
+    return size;
+}
+
+int cbRxGetDataSize()
+{
+    return BUFFER_SIZE - cbRxRemainingSize();
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/circularBuffer.h	Fri Apr 16 16:01:03 2021 +0000
@@ -0,0 +1,20 @@
+#ifndef CIRCULAR_BUFFER_H
+#define CIRCULAR_BUFFER_H
+
+#define BUFFER_SIZE 128
+
+//TX
+void cbTxSendMessage(char* message, int length);
+void cbTxAddOne(char value);
+char cbTxGetOne();
+int cbTxRemainingSize();
+int cbTxGetDataSize();
+
+//RX
+void cbRxAddOne(char value);
+char cbRxGetOne();
+unsigned char cbRxIsDataAvailable();
+int cbRxRemainingSize();
+int cbRxGetDataSize();
+
+#endif
\ No newline at end of file
--- a/main.cpp	Fri Jan 08 08:51:10 2021 +0000
+++ b/main.cpp	Fri Apr 16 16:01:03 2021 +0000
@@ -1,100 +1,73 @@
 #include "main.h"
 #include "mbed.h"
 #include "nRF24L01P.h"
-#include "protocol.h"
+#include "circularBuffer.h"
 
-//Protocole de communication possible :
-//SOF, Function, Payload Length, Payload, Checksum
-//1By,      2By,            2By,     nBy,      1By
-
-Serial pc(USBTX, USBRX); // tx, rx
+UnbufferedSerial pc(USBTX, USBRX, 115200); // tx, rx, baudrate
 
 nRF24L01P my_nrf24l01p(SPI3_MOSI, SPI3_MISO, SPI3_SCLK, CSN, CE, IRQ);    // mosi, miso, sck, csn, ce, irq
 
 DigitalOut myled1(D4);
 DigitalOut myled2(D5);
 
+char sendFlag = 0;
+
 int main() 
 {
-    // The nRF24L01+ supports transfers from 1 to 32 bytes, but Sparkfun's
-    //  "Nordic Serial Interface Board" (http://www.sparkfun.com/products/9019)
-    //  only handles 4 byte transfers in the ATMega code.
-
-    char txData[TRANSFER_SIZE], rxData[TRANSFER_SIZE];
-    int txDataCnt = 0;
-    int rxDataCnt = 0;
+// The nRF24L01+ supports transfers from 1 to 32 bytes, but Sparkfun's
+//  "Nordic Serial Interface Board" (http://www.sparkfun.com/products/9019)
+//  only handles 4 byte transfers in the ATMega code.
+    char txData[TRANSFERT_SIZE];
     
+    //Interruption sur réception Port Série
+    pc.attach(&usbRxInterrupt, SerialBase::RxIrq);
+    
+        
     my_nrf24l01p.powerUp();
-
-    // Display the (default) setup of the nRF24L01+ chip
-    pc.printf("Default setup : \r\n");
-    pc.printf( "nRF24L01+ Frequency    : %d MHz\r\n", my_nrf24l01p.getRfFrequency() );
-    pc.printf( "nRF24L01+ Output power : %d dBm\r\n", my_nrf24l01p.getRfOutputPower() );
-    pc.printf( "nRF24L01+ Data Rate    : %d kbps\r\n", my_nrf24l01p.getAirDataRate() );
-    pc.printf( "nRF24L01+ TX Address   : 0x%010llX\r\n", my_nrf24l01p.getTxAddress() );
-    pc.printf( "nRF24L01+ RX Address   : 0x%010llX\r\n", my_nrf24l01p.getRxAddress() );
-    pc.printf("\r\n\r\n");
     
+    //Configuration nRF24101P
     my_nrf24l01p.setRfFrequency(NRF24L01P_MIN_RF_FREQUENCY);
     my_nrf24l01p.setAirDataRate(NRF24L01P_DATARATE_2_MBPS);
-    my_nrf24l01p.setTxAddress(0xFFE);
-    my_nrf24l01p.setRxAddress(0xFFA);
-
-    // Display the (custom) setup of the nRF24L01+ chip
-    pc.printf("Custom setup : \r\n");
-    pc.printf( "nRF24L01+ Frequency    : %d MHz\r\n",  my_nrf24l01p.getRfFrequency() );
-    pc.printf( "nRF24L01+ Output power : %d dBm\r\n",  my_nrf24l01p.getRfOutputPower() );
-    pc.printf( "nRF24L01+ Data Rate    : %d kbps\r\n", my_nrf24l01p.getAirDataRate() );
-    pc.printf( "nRF24L01+ TX Address   : 0x%010llX\r\n", my_nrf24l01p.getTxAddress() );
-    pc.printf( "nRF24L01+ RX Address   : 0x%010llX\r\n", my_nrf24l01p.getRxAddress() );
-    pc.printf("\r\n\r\n");
-
-
-    my_nrf24l01p.setTransferSize( TRANSFER_SIZE );
-
-    my_nrf24l01p.setReceiveMode();
+    my_nrf24l01p.setRfOutputPower(-6);
+    my_nrf24l01p.setTxAddress(0xFFA);
+    my_nrf24l01p.setRxAddress(0xFFE);
+    my_nrf24l01p.setTransferSize(TRANSFERT_SIZE);
+    my_nrf24l01p.setTransmitMode();
+    
     my_nrf24l01p.enable();
-
-    pc.printf( "Type keys to test transfers:\r\n  (transfers are grouped into %d characters)\r\n", TRANSFER_SIZE );
-
-    //Infinite loop
+    
+    
+    //Infinite Loop
     while (1) 
     {
-        // If we've received anything over the host serial link...
-        if (pc.readable()) 
+        // Si une trame est prête (4 octets)
+        if (sendFlag) 
         {
-            // ...add it to the transmit buffer
-            txData[txDataCnt++] = pc.getc();
-            // If the transmit buffer is full
-            if ( txDataCnt >= sizeof( txData ) ) 
-            {
-        
-                // Send the transmitbuffer via the nRF24L01+
-                my_nrf24l01p.write( NRF24L01P_PIPE_P0, txData, txDataCnt );
-        
-                txDataCnt = 0;
-            }
-        
+            sendFlag = 0;
+            int i;
+            
+            //On récupère la trame du buffer
+            for (i = 0; i < TRANSFERT_SIZE; i++)
+                txData[i] = cbTxGetOne();
+
+            // Send the transmitbuffer via the nRF24L01+
+            my_nrf24l01p.write(NRF24L01P_PIPE_P0, txData, TRANSFERT_SIZE);
+
             // Toggle LED1 (to help debug Host -> nRF24L01+ communication)
             myled1 = !myled1;
         }
-        
-        // If we've received anything in the nRF24L01+...
-        if ( my_nrf24l01p.readable() ) 
-        {
-    
-            // ...read the data into the receive buffer
-            int rxDataCnt = my_nrf24l01p.read( NRF24L01P_PIPE_P0, rxData, sizeof( rxData ) );
-    
-            // Display the receive buffer contents via the host serial link
-            for ( int i = 0; rxDataCnt > 0; rxDataCnt--, i++ ) 
-            {
-    
-                pc.putc( rxData[i] );
-            }
-    
-            // Toggle LED2 (to help debug nRF24L01+ -> Host communication)
-            myled2 = !myled2;
-        }
+    }
+}
+
+void usbRxInterrupt()
+{
+    //On a reçu un octet, on le récupère et on le met dans le buffer
+    char c;
+    if(pc.read(&c, 1)) 
+    {
+        cbTxAddOne(c);
+        //S'il y a 4 octets dans le buffer, on peut les envoyer (passage du flag à 1)
+        if (cbTxGetDataSize() >= 4)
+            sendFlag = 1;
     }
 }
\ No newline at end of file
--- a/main.h	Fri Jan 08 08:51:10 2021 +0000
+++ b/main.h	Fri Apr 16 16:01:03 2021 +0000
@@ -9,8 +9,9 @@
 #define CE D8
 #define IRQ A0
 
-//Taille de la trame envoyé
-#define TRANSFER_SIZE 4
+//Taille des trames envoyé en RF
+#define TRANSFERT_SIZE 4
 
+void usbRxInterrupt();
 
 #endif
\ No newline at end of file
--- a/mbed-os.lib	Fri Jan 08 08:51:10 2021 +0000
+++ b/mbed-os.lib	Fri Apr 16 16:01:03 2021 +0000
@@ -1,1 +1,1 @@
-https://github.com/ARMmbed/mbed-os/#cf4f12a123c05fcae83fc56d76442015cb8a39e9
+https://github.com/ARMmbed/mbed-os/#bfde5aa1e74802771eaeacfa74789f71677325cb
--- a/protocol.cpp	Fri Jan 08 08:51:10 2021 +0000
+++ b/protocol.cpp	Fri Apr 16 16:01:03 2021 +0000
@@ -1,22 +1,23 @@
 #include "protocol.h"
-#include "bufferCirculaire.h"
+#include "circularBuffer.h"
 
 //------------------------------------------------Encodage/Decodage des trames------------------------------------------------//
 //!!! La taille de "msg[]" doit être [msgPayloadLength + 6]
-int encodeMessage(int msgFunction, int msgPayloadLength, char* msgPayload, char* msg)
+void encodeAndSendMessage(int msgFunction, int msgPayloadLength, char* msgPayload)
 {
-    int msgLength = 0;
-    msg[msgLength++] = 0xFE;                                                                //Start of Frame
-    msg[msgLength++] = (char)(msgFunction >> 8);                                            //Message Function MSB
-    msg[msgLength++] = (char)(msgFunction);                                                 //Message Function LSB
-    msg[msgLength++] = (char)(msgPayloadLength >> 8);                                       //Message Payload Length MSB
-    msg[msgLength++] = (char)(msgPayloadLength);                                            //Message Payload Length LSB
+    int msgIndex = 0;
+    char msg[msgPayloadLength + 6];
+    msg[msgIndex++] = 0xFE;                                                                //Start of Frame
+    msg[msgIndex++] = (char)(msgFunction >> 8);                                            //Message Function MSB
+    msg[msgIndex++] = (char)(msgFunction);                                                 //Message Function LSB
+    msg[msgIndex++] = (char)(msgPayloadLength >> 8);                                       //Message Payload Length MSB
+    msg[msgIndex++] = (char)(msgPayloadLength);                                            //Message Payload Length LSB
     int j;
     for (j = 0 ; j < msgPayloadLength; j++)
-        msg[msgLength++] = msgPayload[j];                                                   //MessagePayload
-    msg[msgLength++] = calculateChecksum(msgFunction, msgPayloadLength, msgPayload);        //Checksum
+        msg[msgIndex++] = msgPayload[j];                                                   //MessagePayload
+    msg[msgIndex++] = calculateChecksum(msgFunction, msgPayloadLength, msgPayload);        //Checksum
     
-    return msgLength;
+    cbTxSendMessage(msg, msgPayloadLength + 6);
 }
 
 char calculateChecksum(int msgFunction, int msgPayloadLength, char* msgPayload)
--- a/protocol.h	Fri Jan 08 08:51:10 2021 +0000
+++ b/protocol.h	Fri Apr 16 16:01:03 2021 +0000
@@ -17,7 +17,7 @@
 //#define
 
 //Prototypes des fonctions
-int encodeMessage(int msgFunction, int msgPayloadLength, char* msgPayload, char* msg);
+void encodeAndSendMessage(int msgFunction, int msgPayloadLength, char* msgPayload);
 char calculateChecksum(int msgFunction, int msgPayloadLength, char* msgPayload);
 void decodeMessage(char receivedByte);