ECE 4180 - Final Project Team / Mbed 2 deprecated WalkieTalkie

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

main.cpp

Committer:
jacksacane
Date:
2018-04-21
Revision:
22:e835b3490280
Parent:
21:95009b231c1f
Child:
23:3504e0899359
Child:
25:02cdaf98e4ab

File content as of revision 22:e835b3490280:

#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(p20); //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[29];
    while (Button == 0) {
        mode = RECEIVE;
        if (my_nrf24l01p.readable(0)) {
            rxbuff.push(spkrarray, 30);
            spkr.write(spkrarray[1]);
        }
    }
}

void transmit()
{
    //  while   (mymycrophone.getData()) {
    //     txData[txDataCnt++] = mymicrophone.getData();
    //    }
    // txData[txDataCnt++] = ;
    spkr.turnOff();
    while (Button == 1) {
        mode = TRANSMIT;
        my_nrf24l01p.write(0, (char *)micvalue, 30);
    }
}

void pollmic()
{
    micvalue[micvalcount] = mymicrophone.getData();
    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
    }
}

int main()
{
    // Initialize the radio trasceiver
    my_nrf24l01p.powerUp();
    
    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) {

    }
}