base station for dump truck

Dependencies:   mbed nRF24L01P

Fork of nRF24L01P_Hello_World by Owen Edwards

Committer:
simplyellow
Date:
Tue Apr 25 21:00:20 2017 +0000
Revision:
4:3c37c857665c
Parent:
3:bb1102948ba5
cleaned up a little;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Owen 0:a51a6e7da590 1 #include "mbed.h"
Owen 0:a51a6e7da590 2 #include "nRF24L01P.h"
simplyellow 3:bb1102948ba5 3 #include <iostream>
simplyellow 3:bb1102948ba5 4 #include <string>
Owen 0:a51a6e7da590 5
simplyellow 2:d77298c11128 6 #define TRANSFER_SIZE 8
Owen 0:a51a6e7da590 7
simplyellow 2:d77298c11128 8 Serial pc(USBTX, USBRX); // tx, rx
Owen 0:a51a6e7da590 9 nRF24L01P my_nrf24l01p(p5, p6, p7, p8, p9, p10); // mosi, miso, sck, csn, ce, irq
Owen 0:a51a6e7da590 10 DigitalOut myled1(LED1);
Owen 0:a51a6e7da590 11 DigitalOut myled2(LED2);
Owen 0:a51a6e7da590 12
simplyellow 2:d77298c11128 13 char txData[TRANSFER_SIZE], rxData[TRANSFER_SIZE], acked[TRANSFER_SIZE],
simplyellow 2:d77298c11128 14 nacked[TRANSFER_SIZE];
simplyellow 2:d77298c11128 15 bool ack = false;
simplyellow 2:d77298c11128 16 int txDataCnt = 0;
simplyellow 2:d77298c11128 17 int rxDataCnt = 0;
simplyellow 3:bb1102948ba5 18
simplyellow 3:bb1102948ba5 19 void waitForAck() {
simplyellow 3:bb1102948ba5 20 //RECEIVE ACK
simplyellow 3:bb1102948ba5 21 if (my_nrf24l01p.readable()) {
simplyellow 3:bb1102948ba5 22 // ...read the data into the receive buffer
simplyellow 3:bb1102948ba5 23 rxDataCnt = my_nrf24l01p.read( NRF24L01P_PIPE_P0, rxData, sizeof(rxData));
simplyellow 3:bb1102948ba5 24 // match with ack array
simplyellow 3:bb1102948ba5 25 if(strcmp(rxData, acked)==-1) {
simplyellow 3:bb1102948ba5 26 pc.printf("ACK\n\r");
simplyellow 3:bb1102948ba5 27 ack = true;
simplyellow 3:bb1102948ba5 28 } else {
simplyellow 3:bb1102948ba5 29 pc.printf("NACK\n\r");
simplyellow 3:bb1102948ba5 30 ack = false;
simplyellow 3:bb1102948ba5 31 }
simplyellow 3:bb1102948ba5 32 rxDataCnt = 0;
simplyellow 3:bb1102948ba5 33 // Toggle LED2 (to help debug nRF24L01+ -> Host communication)
simplyellow 3:bb1102948ba5 34 myled2 = !myled2;
simplyellow 3:bb1102948ba5 35 }
simplyellow 3:bb1102948ba5 36 }
simplyellow 3:bb1102948ba5 37
simplyellow 3:bb1102948ba5 38 void checkValid() {
simplyellow 3:bb1102948ba5 39 waitForAck(); //other code has SWITCH statement
simplyellow 3:bb1102948ba5 40 if(ack) {//if valid, wait til next ack
simplyellow 3:bb1102948ba5 41 pc.printf("valid, please wait to send again\n\r");
simplyellow 3:bb1102948ba5 42 ack = false;
simplyellow 3:bb1102948ba5 43 while(!ack) {
simplyellow 3:bb1102948ba5 44 waitForAck();
simplyellow 3:bb1102948ba5 45 }
simplyellow 3:bb1102948ba5 46 pc.printf("ready to send again\r\n");
simplyellow 3:bb1102948ba5 47 } else {//if invalid
simplyellow 3:bb1102948ba5 48 pc.printf("invalid command, send another\n\r");
simplyellow 3:bb1102948ba5 49 }
simplyellow 3:bb1102948ba5 50 }
Owen 0:a51a6e7da590 51
simplyellow 2:d77298c11128 52 void send() {
simplyellow 2:d77298c11128 53 //SEND
simplyellow 2:d77298c11128 54 // If we've received anything over the host serial link...
simplyellow 2:d77298c11128 55 if (pc.readable()) {
simplyellow 2:d77298c11128 56 // ...add it to the transmit buffer
simplyellow 2:d77298c11128 57 txData[txDataCnt++] = pc.getc();
simplyellow 2:d77298c11128 58 // If the transmit buffer is full
simplyellow 2:d77298c11128 59 if (txDataCnt >= sizeof(txData)) {
simplyellow 2:d77298c11128 60 // Send the transmitbuffer via the nRF24L01+
simplyellow 2:d77298c11128 61 my_nrf24l01p.write(NRF24L01P_PIPE_P0, txData, txDataCnt);
simplyellow 2:d77298c11128 62 txDataCnt = 0;
simplyellow 2:d77298c11128 63 pc.printf("Sent command\n\r");
simplyellow 2:d77298c11128 64
simplyellow 2:d77298c11128 65 //wait for valid confirmation
simplyellow 2:d77298c11128 66 checkValid();
simplyellow 2:d77298c11128 67 }
simplyellow 2:d77298c11128 68 // Toggle LED1 (to help debug Host -> nRF24L01+ communication)
simplyellow 2:d77298c11128 69 myled1 = !myled1;
simplyellow 2:d77298c11128 70 }
simplyellow 2:d77298c11128 71 }
Owen 0:a51a6e7da590 72
simplyellow 2:d77298c11128 73 int main() {
simplyellow 2:d77298c11128 74 //initialize the arrays recognized as ACK and NACK
simplyellow 2:d77298c11128 75 for(int i = 0; i < TRANSFER_SIZE; i++) {
simplyellow 2:d77298c11128 76 acked[i] = '0';
simplyellow 2:d77298c11128 77 nacked[i] = '1';
simplyellow 2:d77298c11128 78 }
Owen 0:a51a6e7da590 79 my_nrf24l01p.powerUp();
Owen 0:a51a6e7da590 80 // Display the (default) setup of the nRF24L01+ chip
simplyellow 3:bb1102948ba5 81 printf("\n\r--------\r\n");
simplyellow 3:bb1102948ba5 82 printf("BASE STATION\r\n");
simplyellow 3:bb1102948ba5 83 printf("Begin communications...\r\n");
simplyellow 3:bb1102948ba5 84 printf("--------\r\n");
Owen 0:a51a6e7da590 85 my_nrf24l01p.setTransferSize( TRANSFER_SIZE );
Owen 0:a51a6e7da590 86 my_nrf24l01p.setReceiveMode();
Owen 0:a51a6e7da590 87 my_nrf24l01p.enable();
Owen 0:a51a6e7da590 88
Owen 0:a51a6e7da590 89 while (1) {
simplyellow 2:d77298c11128 90 if(!ack) {
simplyellow 2:d77298c11128 91 waitForAck();
simplyellow 2:d77298c11128 92 } else {
simplyellow 2:d77298c11128 93 send();
simplyellow 2:d77298c11128 94 }
Owen 0:a51a6e7da590 95 }
Owen 0:a51a6e7da590 96 }