ECE 4180 - Final Project Team / Mbed 2 deprecated WalkieTalkie

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

Committer:
jacksacane
Date:
Sat Apr 21 16:47:02 2018 +0000
Revision:
21:95009b231c1f
Parent:
20:e068469ffb89
Child:
22:e835b3490280
Adds LCD thread to display status information

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nurchu 0:c35b54fb9c3c 1 #include "mbed.h"
Nurchu 7:0ac1f1ca8aa6 2 #include "rtos.h"
Nurchu 20:e068469ffb89 3
Nurchu 2:dc046ff72566 4 #include "Microphone.h"
Nurchu 20:e068469ffb89 5 #include "Speaker.h"
drechtmann3 18:e2a8ea6f55d3 6 #include "HUD.h"
Nurchu 20:e068469ffb89 7 #include "nRF24L01P.h"
jacksacane 21:95009b231c1f 8 #include "uLCD_4DGL.h"
Nurchu 20:e068469ffb89 9
Nurchu 20:e068469ffb89 10 #include "CircularBuf.h"
Nurchu 20:e068469ffb89 11 #include "CircularBuf.cpp" // Hack to get templates to work
Nurchu 20:e068469ffb89 12
Nurchu 20:e068469ffb89 13 #define TRANSFER_SIZE 4 //added 5:54pm 4/18/18
Nurchu 20:e068469ffb89 14
Nurchu 20:e068469ffb89 15
drechtmann3 1:fc0a2c17e086 16 Serial pc(USBTX, USBRX); // tx, rx
drechtmann3 1:fc0a2c17e086 17 DigitalOut myled1(LED1);
drechtmann3 1:fc0a2c17e086 18 DigitalOut myled2(LED2);
drechtmann3 1:fc0a2c17e086 19 DigitalOut myled3(LED3);
Nurchu 20:e068469ffb89 20
Nurchu 20:e068469ffb89 21 Speaker spkr(p18);
Nurchu 20:e068469ffb89 22 Microphone mymicrophone(p16);
Nurchu 20:e068469ffb89 23
Nurchu 20:e068469ffb89 24 nRF24L01P my_nrf24l01p(p5, p6, p7, p8, p9, p10); // mosi, miso, sck, csn, ce, irq
jacksacane 21:95009b231c1f 25 uLCD_4DGL uLCD(p27,p28,p30); // serial tx, serial rx, reset pin;
Nurchu 20:e068469ffb89 26 CircularBuf<uint8_t> txbuff(30);
Nurchu 20:e068469ffb89 27 CircularBuf<uint8_t> rxbuff(30);
Nurchu 20:e068469ffb89 28
drechtmann3 13:fbcc71fca474 29 Ticker t; //10:41 am 4/20
drechtmann3 11:a9f4237eaaa1 30 InterruptIn Button(p20); //changed DitialIn to InterruptIn at 5:54 4/18/18
jacksacane 21:95009b231c1f 31 Thread lcd;
drechtmann3 11:a9f4237eaaa1 32
Nurchu 12:efcfe4c0d9f2 33 char txData[TRANSFER_SIZE], rxData[TRANSFER_SIZE]; //making these usable by other voids.
Nurchu 12:efcfe4c0d9f2 34 int txDataCnt = 0;//and this.
Nurchu 12:efcfe4c0d9f2 35 int rxDataCnt = 0;//and this. //David Rechtmann 6.24 pm 4/18/18
Nurchu 20:e068469ffb89 36 uint8_t micvalue[30];
Nurchu 20:e068469ffb89 37 int micvalcount = 0;
Nurchu 20:e068469ffb89 38
jacksacane 21:95009b231c1f 39 int rfFreq;
jacksacane 21:95009b231c1f 40 int dataRate;
jacksacane 21:95009b231c1f 41 unsigned long long rxAddr, txAddr;
jacksacane 21:95009b231c1f 42
jacksacane 21:95009b231c1f 43 enum operatingMode {
jacksacane 21:95009b231c1f 44 RECEIVE = 0,
jacksacane 21:95009b231c1f 45 TRANSMIT
jacksacane 21:95009b231c1f 46 };
jacksacane 21:95009b231c1f 47
jacksacane 21:95009b231c1f 48 operatingMode mode;
jacksacane 21:95009b231c1f 49
jacksacane 21:95009b231c1f 50
Nurchu 12:efcfe4c0d9f2 51 void startup()
Nurchu 12:efcfe4c0d9f2 52 {
drechtmann3 1:fc0a2c17e086 53
drechtmann3 1:fc0a2c17e086 54 // The nRF24L01+ supports transfers from 1 to 32 bytes, but Sparkfun's
drechtmann3 1:fc0a2c17e086 55 // "Nordic Serial Interface Board" (http://www.sparkfun.com/products/9019)
drechtmann3 1:fc0a2c17e086 56 // only handles 4 byte transfers in the ATMega code.
drechtmann3 1:fc0a2c17e086 57
Nurchu 12:efcfe4c0d9f2 58 // char txData[TRANSFER_SIZE], rxData[TRANSFER_SIZE]; //making these usable by other voids.
Nurchu 12:efcfe4c0d9f2 59 // int txDataCnt = 0;//and this.
Nurchu 12:efcfe4c0d9f2 60 // int rxDataCnt = 0;//and this. //David Rechtmann 6:24 pm 4/18/18
drechtmann3 1:fc0a2c17e086 61
drechtmann3 1:fc0a2c17e086 62 my_nrf24l01p.powerUp();
drechtmann3 1:fc0a2c17e086 63
drechtmann3 1:fc0a2c17e086 64 // Display the (default) setup of the nRF24L01+ chip
drechtmann3 1:fc0a2c17e086 65 pc.printf( "nRF24L01+ Frequency : %d MHz\r\n", my_nrf24l01p.getRfFrequency() );
drechtmann3 1:fc0a2c17e086 66 pc.printf( "nRF24L01+ Output power : %d dBm\r\n", my_nrf24l01p.getRfOutputPower() );
drechtmann3 1:fc0a2c17e086 67 pc.printf( "nRF24L01+ Data Rate : %d kbps\r\n", my_nrf24l01p.getAirDataRate() );
drechtmann3 1:fc0a2c17e086 68 pc.printf( "nRF24L01+ TX Address : 0x%010llX\r\n", my_nrf24l01p.getTxAddress() );
drechtmann3 1:fc0a2c17e086 69 pc.printf( "nRF24L01+ RX Address : 0x%010llX\r\n", my_nrf24l01p.getRxAddress() );
drechtmann3 1:fc0a2c17e086 70
drechtmann3 1:fc0a2c17e086 71 pc.printf( "Type keys to test transfers:\r\n (transfers are grouped into %d characters)\r\n", TRANSFER_SIZE );
drechtmann3 1:fc0a2c17e086 72
drechtmann3 1:fc0a2c17e086 73 my_nrf24l01p.setTransferSize( TRANSFER_SIZE );
drechtmann3 1:fc0a2c17e086 74
drechtmann3 1:fc0a2c17e086 75 my_nrf24l01p.setReceiveMode();
drechtmann3 1:fc0a2c17e086 76 my_nrf24l01p.enable();
drechtmann3 10:a8fcfc869fa5 77 }
drechtmann3 1:fc0a2c17e086 78
Nurchu 12:efcfe4c0d9f2 79
Nurchu 12:efcfe4c0d9f2 80 void pctransmit()
Nurchu 12:efcfe4c0d9f2 81 {
Nurchu 12:efcfe4c0d9f2 82 // If we've received anything over the host serial link...
Nurchu 12:efcfe4c0d9f2 83 if ( pc.readable() ) {
drechtmann3 1:fc0a2c17e086 84
Nurchu 12:efcfe4c0d9f2 85 // ...add it to the transmit buffer
Nurchu 12:efcfe4c0d9f2 86 txData[txDataCnt++] = pc.getc();
Nurchu 12:efcfe4c0d9f2 87
Nurchu 12:efcfe4c0d9f2 88 // If the transmit buffer is full
Nurchu 12:efcfe4c0d9f2 89 if ( txDataCnt >= sizeof( txData ) ) {
Nurchu 12:efcfe4c0d9f2 90
Nurchu 12:efcfe4c0d9f2 91 // Send the transmitbuffer via the nRF24L01+
Nurchu 12:efcfe4c0d9f2 92 my_nrf24l01p.write( NRF24L01P_PIPE_P0, txData, txDataCnt );
drechtmann3 1:fc0a2c17e086 93
Nurchu 12:efcfe4c0d9f2 94 txDataCnt = 0;
Nurchu 12:efcfe4c0d9f2 95 }
drechtmann3 1:fc0a2c17e086 96
Nurchu 12:efcfe4c0d9f2 97 // Toggle LED1 (to help debug Host -> nRF24L01+ communication)
Nurchu 12:efcfe4c0d9f2 98 myled3 = !myled3;
Nurchu 12:efcfe4c0d9f2 99 }
drechtmann3 1:fc0a2c17e086 100
Nurchu 12:efcfe4c0d9f2 101 // If we've received anything in the nRF24L01+...
Nurchu 12:efcfe4c0d9f2 102 if ( my_nrf24l01p.readable() ) {
drechtmann3 1:fc0a2c17e086 103
Nurchu 12:efcfe4c0d9f2 104 // ...read the data into the receive buffer
Nurchu 12:efcfe4c0d9f2 105 rxDataCnt = my_nrf24l01p.read( NRF24L01P_PIPE_P0, rxData, sizeof( rxData ) );
Nurchu 12:efcfe4c0d9f2 106
Nurchu 12:efcfe4c0d9f2 107 // Display the receive buffer contents via the host serial link
Nurchu 12:efcfe4c0d9f2 108 for ( int i = 0; rxDataCnt > 0; rxDataCnt--, i++ ) {
Nurchu 12:efcfe4c0d9f2 109
Nurchu 12:efcfe4c0d9f2 110 pc.putc( rxData[i] );
drechtmann3 1:fc0a2c17e086 111 }
drechtmann3 1:fc0a2c17e086 112
Nurchu 12:efcfe4c0d9f2 113 // Toggle LED2 (to help debug nRF24L01+ -> Host communication)
Nurchu 12:efcfe4c0d9f2 114 myled3 = !myled3;
Nurchu 12:efcfe4c0d9f2 115 }
Nurchu 12:efcfe4c0d9f2 116 }
drechtmann3 1:fc0a2c17e086 117
Nurchu 12:efcfe4c0d9f2 118 void receive() //most of this function added by david at 6:02pm 4/18/18
Nurchu 12:efcfe4c0d9f2 119 {
Nurchu 20:e068469ffb89 120 uint8_t spkrarray[29];
Nurchu 12:efcfe4c0d9f2 121 while (Button == 0) {
Nurchu 12:efcfe4c0d9f2 122 if (my_nrf24l01p.readable(0)) {
Nurchu 20:e068469ffb89 123 rxbuff.push(spkrarray, 30);
drechtmann3 18:e2a8ea6f55d3 124 spkr.write(spkrarray[1]);
Nurchu 12:efcfe4c0d9f2 125 }
Nurchu 12:efcfe4c0d9f2 126 }
Nurchu 20:e068469ffb89 127 }
drechtmann3 11:a9f4237eaaa1 128
Nurchu 12:efcfe4c0d9f2 129 void transmit()
Nurchu 12:efcfe4c0d9f2 130 {
Nurchu 12:efcfe4c0d9f2 131 // while (mymycrophone.getData()) {
drechtmann3 10:a8fcfc869fa5 132 // txData[txDataCnt++] = mymicrophone.getData();
drechtmann3 10:a8fcfc869fa5 133 // }
Nurchu 12:efcfe4c0d9f2 134 // txData[txDataCnt++] = ;
Nurchu 20:e068469ffb89 135 spkr.turnOff();
Nurchu 12:efcfe4c0d9f2 136 while (Button == 1) {
Nurchu 20:e068469ffb89 137 my_nrf24l01p.write(0, (char *)micvalue, 30);
drechtmann3 10:a8fcfc869fa5 138 }
Nurchu 12:efcfe4c0d9f2 139 }
Nurchu 12:efcfe4c0d9f2 140
drechtmann3 13:fbcc71fca474 141 void pollmic()
drechtmann3 13:fbcc71fca474 142 {
drechtmann3 13:fbcc71fca474 143 micvalue[micvalcount] = mymicrophone.getData();
drechtmann3 13:fbcc71fca474 144 micvalcount = micvalcount + 1;
Nurchu 20:e068469ffb89 145 if (micvalcount > 30);
Nurchu 20:e068469ffb89 146 {
Nurchu 20:e068469ffb89 147 micvalcount = 0;
drechtmann3 13:fbcc71fca474 148 }
Nurchu 20:e068469ffb89 149
Nurchu 20:e068469ffb89 150 }
drechtmann3 13:fbcc71fca474 151
jacksacane 21:95009b231c1f 152 void lcdThread()
jacksacane 21:95009b231c1f 153 {
jacksacane 21:95009b231c1f 154 while (1) {
jacksacane 21:95009b231c1f 155 uLCD.locate(64, 20);
jacksacane 21:95009b231c1f 156 uLCD.printf("Frequency: %d MHz", rfFreq);
jacksacane 21:95009b231c1f 157 uLCD.locate(64, 40);
jacksacane 21:95009b231c1f 158 uLCD.printf("Data Rate: %d kbps", dataRate);
jacksacane 21:95009b231c1f 159 uLCD.locate(64, 60);
jacksacane 21:95009b231c1f 160 uLCD.printf("TX Address: 0x%010llX", txAddr);
jacksacane 21:95009b231c1f 161 uLCD.locate(64, 80);
jacksacane 21:95009b231c1f 162 uLCD.printf("RX Address: 0x%010llX", rxAddr);
jacksacane 21:95009b231c1f 163 uLCD.locate(64, 100);
jacksacane 21:95009b231c1f 164 switch (mode) {
jacksacane 21:95009b231c1f 165 case RECEIVE:
jacksacane 21:95009b231c1f 166 uLCD.printf("Mode: Receiving");
jacksacane 21:95009b231c1f 167 break;
jacksacane 21:95009b231c1f 168 case TRANSMIT:
jacksacane 21:95009b231c1f 169 uLCD.printf("Mode: Transmitting");
jacksacane 21:95009b231c1f 170 break;
jacksacane 21:95009b231c1f 171 }
jacksacane 21:95009b231c1f 172 // Maybe add some graphics too idk
jacksacane 21:95009b231c1f 173 }
jacksacane 21:95009b231c1f 174 }
jacksacane 21:95009b231c1f 175
Nurchu 12:efcfe4c0d9f2 176 int main()
Nurchu 12:efcfe4c0d9f2 177 {
jacksacane 21:95009b231c1f 178 // Initialize the radio trasceiver
jacksacane 21:95009b231c1f 179 my_nrf24l01p.powerUp();
jacksacane 21:95009b231c1f 180
jacksacane 21:95009b231c1f 181 rfFreq = my_nrf24l01p.getRfFrequency();
jacksacane 21:95009b231c1f 182 dataRate = my_nrf24l01p.getAirDataRate();
jacksacane 21:95009b231c1f 183 rxAddr = my_nrf24l01p.getRxAddress();
jacksacane 21:95009b231c1f 184 txAddr = my_nrf24l01p.getTxAddress();
jacksacane 21:95009b231c1f 185
jacksacane 21:95009b231c1f 186 my_nrf24l01p.setTransferSize(TRANSFER_SIZE);
jacksacane 21:95009b231c1f 187
jacksacane 21:95009b231c1f 188 my_nrf24l01p.setReceiveMode();
jacksacane 21:95009b231c1f 189 my_nrf24l01p.enable();
jacksacane 21:95009b231c1f 190
jacksacane 21:95009b231c1f 191 // Initialize the uLCD
jacksacane 21:95009b231c1f 192 uLCD.baudrate(3000000);
jacksacane 21:95009b231c1f 193 uLCD.background_color(BLACK);
jacksacane 21:95009b231c1f 194
jacksacane 21:95009b231c1f 195 // Register interrupts
drechtmann3 11:a9f4237eaaa1 196 Button.mode(PullUp);//added 6:23pm 4/18/18
drechtmann3 13:fbcc71fca474 197 t.attach(&pollmic, 0.0001);
drechtmann3 13:fbcc71fca474 198 t.attach(&receive, 0.0001);
jacksacane 21:95009b231c1f 199
jacksacane 21:95009b231c1f 200 // Spawn threads
jacksacane 21:95009b231c1f 201 lcd.start(lcdThread);
jacksacane 21:95009b231c1f 202
jacksacane 21:95009b231c1f 203 // Main thread
drechtmann3 1:fc0a2c17e086 204 while (1) {
Nurchu 12:efcfe4c0d9f2 205
Nurchu 12:efcfe4c0d9f2 206 }
Nurchu 12:efcfe4c0d9f2 207 }