ECE 4180 - Final Project Team / Mbed 2 deprecated WalkieTalkie

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

Committer:
jacksacane
Date:
Sat Apr 21 16:54:34 2018 +0000
Revision:
22:e835b3490280
Parent:
21:95009b231c1f
Child:
23:3504e0899359
Child:
25:02cdaf98e4ab
Changes global mode variable when button is pressed.

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) {
jacksacane 22:e835b3490280 122 mode = RECEIVE;
Nurchu 12:efcfe4c0d9f2 123 if (my_nrf24l01p.readable(0)) {
Nurchu 20:e068469ffb89 124 rxbuff.push(spkrarray, 30);
drechtmann3 18:e2a8ea6f55d3 125 spkr.write(spkrarray[1]);
Nurchu 12:efcfe4c0d9f2 126 }
Nurchu 12:efcfe4c0d9f2 127 }
Nurchu 20:e068469ffb89 128 }
drechtmann3 11:a9f4237eaaa1 129
Nurchu 12:efcfe4c0d9f2 130 void transmit()
Nurchu 12:efcfe4c0d9f2 131 {
Nurchu 12:efcfe4c0d9f2 132 // while (mymycrophone.getData()) {
drechtmann3 10:a8fcfc869fa5 133 // txData[txDataCnt++] = mymicrophone.getData();
drechtmann3 10:a8fcfc869fa5 134 // }
Nurchu 12:efcfe4c0d9f2 135 // txData[txDataCnt++] = ;
Nurchu 20:e068469ffb89 136 spkr.turnOff();
Nurchu 12:efcfe4c0d9f2 137 while (Button == 1) {
jacksacane 22:e835b3490280 138 mode = TRANSMIT;
Nurchu 20:e068469ffb89 139 my_nrf24l01p.write(0, (char *)micvalue, 30);
drechtmann3 10:a8fcfc869fa5 140 }
Nurchu 12:efcfe4c0d9f2 141 }
Nurchu 12:efcfe4c0d9f2 142
drechtmann3 13:fbcc71fca474 143 void pollmic()
drechtmann3 13:fbcc71fca474 144 {
drechtmann3 13:fbcc71fca474 145 micvalue[micvalcount] = mymicrophone.getData();
drechtmann3 13:fbcc71fca474 146 micvalcount = micvalcount + 1;
Nurchu 20:e068469ffb89 147 if (micvalcount > 30);
Nurchu 20:e068469ffb89 148 {
Nurchu 20:e068469ffb89 149 micvalcount = 0;
drechtmann3 13:fbcc71fca474 150 }
Nurchu 20:e068469ffb89 151
Nurchu 20:e068469ffb89 152 }
drechtmann3 13:fbcc71fca474 153
jacksacane 21:95009b231c1f 154 void lcdThread()
jacksacane 21:95009b231c1f 155 {
jacksacane 21:95009b231c1f 156 while (1) {
jacksacane 21:95009b231c1f 157 uLCD.locate(64, 20);
jacksacane 21:95009b231c1f 158 uLCD.printf("Frequency: %d MHz", rfFreq);
jacksacane 21:95009b231c1f 159 uLCD.locate(64, 40);
jacksacane 21:95009b231c1f 160 uLCD.printf("Data Rate: %d kbps", dataRate);
jacksacane 21:95009b231c1f 161 uLCD.locate(64, 60);
jacksacane 21:95009b231c1f 162 uLCD.printf("TX Address: 0x%010llX", txAddr);
jacksacane 21:95009b231c1f 163 uLCD.locate(64, 80);
jacksacane 21:95009b231c1f 164 uLCD.printf("RX Address: 0x%010llX", rxAddr);
jacksacane 21:95009b231c1f 165 uLCD.locate(64, 100);
jacksacane 21:95009b231c1f 166 switch (mode) {
jacksacane 21:95009b231c1f 167 case RECEIVE:
jacksacane 21:95009b231c1f 168 uLCD.printf("Mode: Receiving");
jacksacane 21:95009b231c1f 169 break;
jacksacane 21:95009b231c1f 170 case TRANSMIT:
jacksacane 21:95009b231c1f 171 uLCD.printf("Mode: Transmitting");
jacksacane 21:95009b231c1f 172 break;
jacksacane 21:95009b231c1f 173 }
jacksacane 21:95009b231c1f 174 // Maybe add some graphics too idk
jacksacane 21:95009b231c1f 175 }
jacksacane 21:95009b231c1f 176 }
jacksacane 21:95009b231c1f 177
Nurchu 12:efcfe4c0d9f2 178 int main()
Nurchu 12:efcfe4c0d9f2 179 {
jacksacane 21:95009b231c1f 180 // Initialize the radio trasceiver
jacksacane 21:95009b231c1f 181 my_nrf24l01p.powerUp();
jacksacane 21:95009b231c1f 182
jacksacane 21:95009b231c1f 183 rfFreq = my_nrf24l01p.getRfFrequency();
jacksacane 21:95009b231c1f 184 dataRate = my_nrf24l01p.getAirDataRate();
jacksacane 21:95009b231c1f 185 rxAddr = my_nrf24l01p.getRxAddress();
jacksacane 21:95009b231c1f 186 txAddr = my_nrf24l01p.getTxAddress();
jacksacane 21:95009b231c1f 187
jacksacane 21:95009b231c1f 188 my_nrf24l01p.setTransferSize(TRANSFER_SIZE);
jacksacane 21:95009b231c1f 189
jacksacane 21:95009b231c1f 190 my_nrf24l01p.setReceiveMode();
jacksacane 21:95009b231c1f 191 my_nrf24l01p.enable();
jacksacane 21:95009b231c1f 192
jacksacane 22:e835b3490280 193 mode = RECEIVE;
jacksacane 22:e835b3490280 194
jacksacane 21:95009b231c1f 195 // Initialize the uLCD
jacksacane 21:95009b231c1f 196 uLCD.baudrate(3000000);
jacksacane 21:95009b231c1f 197 uLCD.background_color(BLACK);
jacksacane 21:95009b231c1f 198
jacksacane 21:95009b231c1f 199 // Register interrupts
drechtmann3 11:a9f4237eaaa1 200 Button.mode(PullUp);//added 6:23pm 4/18/18
drechtmann3 13:fbcc71fca474 201 t.attach(&pollmic, 0.0001);
drechtmann3 13:fbcc71fca474 202 t.attach(&receive, 0.0001);
jacksacane 21:95009b231c1f 203
jacksacane 21:95009b231c1f 204 // Spawn threads
jacksacane 21:95009b231c1f 205 lcd.start(lcdThread);
jacksacane 21:95009b231c1f 206
jacksacane 21:95009b231c1f 207 // Main thread
drechtmann3 1:fc0a2c17e086 208 while (1) {
Nurchu 12:efcfe4c0d9f2 209
Nurchu 12:efcfe4c0d9f2 210 }
Nurchu 12:efcfe4c0d9f2 211 }