base station for dump truck
Fork of nRF24L01P_Hello_World by
Revision 2:d77298c11128, committed 2017-04-13
- Comitter:
- simplyellow
- Date:
- Thu Apr 13 17:31:57 2017 +0000
- Parent:
- 1:5be2682710c6
- Child:
- 3:bb1102948ba5
- Commit message:
- base station
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Wed Jan 19 23:53:19 2011 +0000
+++ b/main.cpp Thu Apr 13 17:31:57 2017 +0000
@@ -1,75 +1,101 @@
#include "mbed.h"
#include "nRF24L01P.h"
-Serial pc(USBTX, USBRX); // tx, rx
+#define TRANSFER_SIZE 8
+Serial pc(USBTX, USBRX); // tx, rx
nRF24L01P my_nrf24l01p(p5, p6, p7, p8, p9, p10); // mosi, miso, sck, csn, ce, irq
-
DigitalOut myled1(LED1);
DigitalOut myled2(LED2);
-int main() {
+char txData[TRANSFER_SIZE], rxData[TRANSFER_SIZE], acked[TRANSFER_SIZE],
+ nacked[TRANSFER_SIZE];
+bool ack = false;
+int txDataCnt = 0;
+int rxDataCnt = 0;
+int matched = 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.
-#define TRANSFER_SIZE 4
+void send() {
+ //SEND
+ // If we've received anything over the host serial link...
+ if (pc.readable()) {
+ // ...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;
+ pc.printf("Sent command\n\r");
+
+ //wait for valid confirmation
+ checkValid();
+ }
+ // Toggle LED1 (to help debug Host -> nRF24L01+ communication)
+ myled1 = !myled1;
+ }
+}
- char txData[TRANSFER_SIZE], rxData[TRANSFER_SIZE];
- int txDataCnt = 0;
- int rxDataCnt = 0;
+void checkValid() {
+ waitForAck(); //other code has SWITCH statement
+ if(ack) {//if valid, wait til next ack
+ pc.printf("valid, please wait to send again\n\r");
+ ack = false;
+ while(!ack) {
+ waitForAck();
+ }
+ pc.printf("ready to send again\r\n");
+ send();
+ } else {//if invalid
+ pc.printf("invalid, send another\n\r");
+ send();
+ }
+}
+void waitForAck() {
+ //RECEIVE ACK
+ if (my_nrf24l01p.readable()) {
+ // ...read the data into the receive buffer
+ rxDataCnt = my_nrf24l01p.read( NRF24L01P_PIPE_P0, rxData, sizeof(rxData ));
+ // match with ack array
+ for ( int i = 0; rxDataCnt > 0; rxDataCnt--, i++ ) {
+ if(rxData[i] == acked[i]) {
+ matched++;
+ }
+ }
+ if(matched == TRANSFER_SIZE) {
+ pc.printf("ACK\n\r");
+ ack = true;
+ } else {
+ pc.printf("NACK\n\r");
+ }
+ // Toggle LED2 (to help debug nRF24L01+ -> Host communication)
+ myled2 = !myled2;
+ }
+}
+
+int main() {
+ //initialize the arrays recognized as ACK and NACK
+ for(int i = 0; i < TRANSFER_SIZE; i++) {
+ acked[i] = '0';
+ nacked[i] = '1';
+ }
my_nrf24l01p.powerUp();
-
// Display the (default) setup of the nRF24L01+ chip
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( "Type keys to test transfers:\r\n (transfers are grouped into %d characters)\r\n", TRANSFER_SIZE );
-
my_nrf24l01p.setTransferSize( TRANSFER_SIZE );
-
my_nrf24l01p.setReceiveMode();
my_nrf24l01p.enable();
while (1) {
-
- // If we've received anything over the host serial link...
- if ( pc.readable() ) {
-
- // ...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;
- }
-
- // 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
- 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;
- }
+ if(!ack) {
+ waitForAck();
+ } else {
+ send();
+ }
}
}
