ECE 4180 - Final Project Team / Mbed 2 deprecated WalkieTalkie

Dependencies:   mbed 4DGL-uLCD-SE mbed-rtos nRF24L01P

main.cpp

Committer:
drechtmann3
Date:
2018-04-21
Revision:
26:57731422b129
Parent:
25:02cdaf98e4ab
Parent:
23:3504e0899359
Child:
27:08d34e60b6d0

File content as of revision 26:57731422b129:

#include "mbed.h"
#include "rtos.h"

#include "Microphone.h"
#include "Speaker.h"
#include "HUD.h"
#include "nRF24L01P.h"
#include "uLCD_4DGL.h"

#include "CircularBuf.h"
#include "CircularBuf.cpp" // Hack to get templates to work

#define TRANSFER_SIZE   4 //added 5:54pm 4/18/18


Serial pc(USBTX, USBRX); // tx, rx
DigitalOut myled1(LED1);
DigitalOut myled2(LED2);
DigitalOut myled3(LED3);

Speaker spkr(p18);
Microphone mymicrophone(p16);

nRF24L01P my_nrf24l01p(p5, p6, p7, p8, p9, p10);    // mosi, miso, sck, csn, ce, irq
uLCD_4DGL uLCD(p27,p28,p30);                        // serial tx, serial rx, reset pin;
CircularBuf<uint8_t> txbuff(30);
CircularBuf<uint8_t> rxbuff(30);
Ticker t; //10:41 am 4/20

InterruptIn Button(p18); //changed DitialIn to InterruptIn at 5:54 4/18/18
Thread lcd;

char txData[TRANSFER_SIZE], rxData[TRANSFER_SIZE]; //making these usable by other voids.
int txDataCnt = 0;//and this.
int rxDataCnt = 0;//and this. //David Rechtmann 6.24 pm 4/18/18
uint8_t micvalue[30];
int micvalcount = 0;

int rfFreq;
int dataRate;
unsigned long long rxAddr, txAddr;

enum operatingMode {
    RECEIVE = 0,
    TRANSMIT
};

operatingMode mode;


void startup()
{

// 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]; //making these usable by other voids.
    // int txDataCnt = 0;//and this.
    // int rxDataCnt = 0;//and this. //David Rechtmann 6:24 pm 4/18/18

    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();
}


void pctransmit()
{
    // 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)
        myled3 = !myled3;
    }

    // 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)
        myled3 = !myled3;
    }
}

void receive()   //most of this function added by david at 6:02pm 4/18/18
{
    uint8_t spkrarray[30];
    uint8_t spkrtemp;
    while (Button.read() == 0) {
        mode = RECEIVE;
        if (my_nrf24l01p.readable(0)) {
   pc.printf("receiving....");
        my_nrf24l01p.read(0, (char*)spkrarray, 30);
        rxbuff.push(spkrarray, 30);
          //  rxbuff.push(spkrarray, 30);
            rxbuff.pop(&spkrtemp, 1);
            spkr.write(spkrtemp);
            myled2 = !myled2;
        }
    }
}

void transmit()
{
    //  while   (mymycrophone.getData()) {
    //     txData[txDataCnt++] = mymicrophone.getData();
    //    }
    // txData[txDataCnt++] = ;
    spkr.turnOff();
    
    uint8_t txsendary[30];
    txbuff.pop(txsendary, 30);
    while (Button.read()) {
   //     my_nrf24l01p.write(0, (char *)micvalue, 30);
   pc.printf("transmitting....");
   my_nrf24l01p.write( NRF24L01P_PIPE_P0, (char*) txsendary, 30);
   myled1 = !myled1;
        mode = TRANSMIT;
    }
}

void pollmic()
{
    uint8_t txentry = mymicrophone.getData();
    txbuff.push(&txentry, 1);
     pc.printf("polling....");
  //  micvalcount = micvalcount + 1;
  //  if (micvalcount > 30);
  //  {
  //      micvalcount = 0;
  //  }

}

void lcdThread()
{
    while (1) {
        uLCD.locate(64, 20);
        uLCD.printf("Frequency: %d MHz", rfFreq);
        uLCD.locate(64, 40);
        uLCD.printf("Data Rate: %d kbps", dataRate);
        uLCD.locate(64, 60);
        uLCD.printf("TX Address: 0x%010llX", txAddr);
        uLCD.locate(64, 80);
        uLCD.printf("RX Address: 0x%010llX", rxAddr);
        uLCD.locate(64, 100);
        switch (mode) {
            case RECEIVE:
                uLCD.printf("Mode: Receiving");
                break;
            case TRANSMIT:
                uLCD.printf("Mode: Transmitting");
                break;
        }
        // Maybe add some graphics too idk
        Thread::yield();
    }
}

int main()
{
    startup();
     pc.printf("starting up....");
    Button.mode(PullDown);//added 6:23pm 4/18/18
    Button.rise(&transmit);
    Button.fall(&receive);
    t.attach(&pollmic, 0.1);
    
    rfFreq = my_nrf24l01p.getRfFrequency();
    dataRate = my_nrf24l01p.getAirDataRate();
    rxAddr = my_nrf24l01p.getRxAddress();
    txAddr = my_nrf24l01p.getTxAddress();
    
    my_nrf24l01p.setTransferSize(TRANSFER_SIZE);

    my_nrf24l01p.setReceiveMode();
    my_nrf24l01p.enable();
    
    mode = RECEIVE;
    
    // Initialize the uLCD
    uLCD.baudrate(3000000);
    uLCD.background_color(BLACK);
    
    // Register interrupts
    Button.mode(PullUp);//added 6:23pm 4/18/18
    t.attach(&pollmic, 0.0001);
    t.attach(&receive, 0.0001);
    
    // Spawn threads
    lcd.start(lcdThread);
    
    // Main thread
    while (1) {
        Thread::yield();
    }
}