Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@17:6ae73e8943ce, 2018-12-01 (annotated)
- Committer:
- hyunsungkim
- Date:
- Sat Dec 01 17:40:15 2018 +0000
- Branch:
- RF24_library_test_tx
- Revision:
- 17:6ae73e8943ce
- Parent:
- 16:7a78838b3b8a
- Child:
- 18:2342aa54dc9b
??? ????? ???? ?? ??
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| hyunsungkim | 0:2dade6db4d3a | 1 | #include "mbed.h" |
| hyunsungkim | 8:78294b936c70 | 2 | #include "nRF24L01P.h" |
| hyunsungkim | 3:690740ab3394 | 3 | #include "beep.h" |
| hyunsungkim | 3:690740ab3394 | 4 | |
| hyunsungkim | 3:690740ab3394 | 5 | #define nrf_CE D2 |
| hyunsungkim | 3:690740ab3394 | 6 | #define nrf_CSN A3 |
| hyunsungkim | 3:690740ab3394 | 7 | #define spi_SCK D13 |
| hyunsungkim | 3:690740ab3394 | 8 | #define spi_MOSI D11 |
| hyunsungkim | 3:690740ab3394 | 9 | #define spi_MISO D12 |
| hyunsungkim | 8:78294b936c70 | 10 | #define spi_IRQ D4 |
| hyunsungkim | 8:78294b936c70 | 11 | |
| hyunsungkim | 14:a4402559cd6e | 12 | #define TRANSFER_SIZE 15 |
| hyunsungkim | 16:7a78838b3b8a | 13 | #define MAX_BUFFER_SIZE 255 |
| hyunsungkim | 16:7a78838b3b8a | 14 | #define BUFFER_SIZE MAX_BUFFER_SIZE |
| hyunsungkim | 16:7a78838b3b8a | 15 | |
| hyunsungkim | 16:7a78838b3b8a | 16 | #define DATA_PROTOCOL_BEGIN '$' |
| hyunsungkim | 16:7a78838b3b8a | 17 | #define DATA_PROTOCOL_TOKEN ',' |
| hyunsungkim | 16:7a78838b3b8a | 18 | #define DATA_PROTOCOL_END '*' |
| hyunsungkim | 8:78294b936c70 | 19 | |
| hyunsungkim | 8:78294b936c70 | 20 | nRF24L01P nrf(spi_MOSI, spi_MISO, spi_SCK, nrf_CSN, nrf_CE, spi_IRQ); // mosi, miso, sck, csn, ce, irq |
| hyunsungkim | 8:78294b936c70 | 21 | |
| hyunsungkim | 0:2dade6db4d3a | 22 | Serial pc(USBTX, USBRX); |
| hyunsungkim | 0:2dade6db4d3a | 23 | PwmOut buzzer(D5); |
| hyunsungkim | 0:2dade6db4d3a | 24 | |
| hyunsungkim | 8:78294b936c70 | 25 | void beepStart(); |
| hyunsungkim | 8:78294b936c70 | 26 | void endBeep(); |
| hyunsungkim | 15:217b3e5a2275 | 27 | void initNRF(); |
| hyunsungkim | 11:1b56bb8ccd04 | 28 | void dumpRFInfo(); |
| hyunsungkim | 10:02d3ca034103 | 29 | void getPayload(int id, unsigned int count, int lspeed, int rspeed, char* txData); |
| hyunsungkim | 16:7a78838b3b8a | 30 | int readSerialUntil(char *buffer, unsigned int buf_len, char terminator); |
| hyunsungkim | 16:7a78838b3b8a | 31 | char* inspectData(char *buffer, int buf_len); |
| hyunsungkim | 6:42ecdff5956a | 32 | |
| hyunsungkim | 16:7a78838b3b8a | 33 | int main() |
| hyunsungkim | 16:7a78838b3b8a | 34 | { |
| hyunsungkim | 12:cf6cbf1d1ebf | 35 | int inByteCnt = 0; |
| hyunsungkim | 16:7a78838b3b8a | 36 | char buffer[BUFFER_SIZE]; |
| hyunsungkim | 8:78294b936c70 | 37 | beepStart(); |
| hyunsungkim | 0:2dade6db4d3a | 38 | pc.baud(115200); |
| hyunsungkim | 15:217b3e5a2275 | 39 | printf("I'm Master\r\n"); |
| hyunsungkim | 15:217b3e5a2275 | 40 | initNRF(); |
| hyunsungkim | 11:1b56bb8ccd04 | 41 | dumpRFInfo(); |
| hyunsungkim | 17:6ae73e8943ce | 42 | |
| hyunsungkim | 16:7a78838b3b8a | 43 | memset(buffer, NULL, BUFFER_SIZE); |
| hyunsungkim | 16:7a78838b3b8a | 44 | |
| hyunsungkim | 10:02d3ca034103 | 45 | while(1) { |
| hyunsungkim | 16:7a78838b3b8a | 46 | int result = readSerialUntil(buffer, BUFFER_SIZE, DATA_PROTOCOL_END); |
| hyunsungkim | 16:7a78838b3b8a | 47 | if(result>0) { |
| hyunsungkim | 16:7a78838b3b8a | 48 | char *data = inspectData(buffer, BUFFER_SIZE); |
| hyunsungkim | 17:6ae73e8943ce | 49 | if(*data == DATA_PROTOCOL_BEGIN) { |
| hyunsungkim | 17:6ae73e8943ce | 50 | printf("Data: %s\r\n", data); |
| hyunsungkim | 17:6ae73e8943ce | 51 | free(data); |
| hyunsungkim | 17:6ae73e8943ce | 52 | } |
| hyunsungkim | 16:7a78838b3b8a | 53 | } |
| hyunsungkim | 16:7a78838b3b8a | 54 | /* |
| hyunsungkim | 15:217b3e5a2275 | 55 | while(pc.readable()) { |
| hyunsungkim | 15:217b3e5a2275 | 56 | char inByte = pc.getc(); |
| hyunsungkim | 15:217b3e5a2275 | 57 | if(inByteCnt > TRANSFER_SIZE+2) { |
| hyunsungkim | 15:217b3e5a2275 | 58 | printf("Data size overflow!\r\n"); |
| hyunsungkim | 15:217b3e5a2275 | 59 | inByteCnt = 0; |
| hyunsungkim | 15:217b3e5a2275 | 60 | break; |
| hyunsungkim | 15:217b3e5a2275 | 61 | } else if(inByte == '\0') { |
| hyunsungkim | 16:7a78838b3b8a | 62 | buffer[inByteCnt] = '\0'; |
| hyunsungkim | 16:7a78838b3b8a | 63 | printf("Command: %s\r\n", buffer); |
| hyunsungkim | 16:7a78838b3b8a | 64 | nrf.write(NRF24L01P_PIPE_P0, buffer, TRANSFER_SIZE); |
| hyunsungkim | 15:217b3e5a2275 | 65 | inByteCnt=0; |
| hyunsungkim | 15:217b3e5a2275 | 66 | } else { |
| hyunsungkim | 16:7a78838b3b8a | 67 | buffer[inByteCnt++] = inByte; |
| hyunsungkim | 16:7a78838b3b8a | 68 | } |
| hyunsungkim | 16:7a78838b3b8a | 69 | }*/ |
| hyunsungkim | 16:7a78838b3b8a | 70 | } |
| hyunsungkim | 16:7a78838b3b8a | 71 | } |
| hyunsungkim | 16:7a78838b3b8a | 72 | |
| hyunsungkim | 16:7a78838b3b8a | 73 | char* inspectData(char *buffer, int buf_len) |
| hyunsungkim | 16:7a78838b3b8a | 74 | { |
| hyunsungkim | 16:7a78838b3b8a | 75 | int start, end; |
| hyunsungkim | 16:7a78838b3b8a | 76 | for(int i=0; buffer[i-1]!=DATA_PROTOCOL_BEGIN; i++) { |
| hyunsungkim | 16:7a78838b3b8a | 77 | start = i; |
| hyunsungkim | 16:7a78838b3b8a | 78 | if(i==buf_len) return 0; |
| hyunsungkim | 16:7a78838b3b8a | 79 | } |
| hyunsungkim | 16:7a78838b3b8a | 80 | for(int i=start+1; buffer[i-1]!=DATA_PROTOCOL_END; i++) { |
| hyunsungkim | 16:7a78838b3b8a | 81 | end = i; |
| hyunsungkim | 16:7a78838b3b8a | 82 | if(i==buf_len) return 0; |
| hyunsungkim | 16:7a78838b3b8a | 83 | } |
| hyunsungkim | 16:7a78838b3b8a | 84 | int data_len = end-start+1; |
| hyunsungkim | 17:6ae73e8943ce | 85 | |
| hyunsungkim | 16:7a78838b3b8a | 86 | char *str = (char*)malloc(sizeof(char)*(data_len+1)); |
| hyunsungkim | 16:7a78838b3b8a | 87 | memset(str, NULL, data_len+1); |
| hyunsungkim | 17:6ae73e8943ce | 88 | for(int i=0; i<data_len; i++) { |
| hyunsungkim | 16:7a78838b3b8a | 89 | *(str+i) = buffer[start+i]; |
| hyunsungkim | 16:7a78838b3b8a | 90 | } |
| hyunsungkim | 16:7a78838b3b8a | 91 | return str; |
| hyunsungkim | 16:7a78838b3b8a | 92 | } |
| hyunsungkim | 16:7a78838b3b8a | 93 | |
| hyunsungkim | 16:7a78838b3b8a | 94 | int readSerialUntil(char *buffer, unsigned int buf_len, char term) |
| hyunsungkim | 16:7a78838b3b8a | 95 | { |
| hyunsungkim | 16:7a78838b3b8a | 96 | int n=0; |
| hyunsungkim | 16:7a78838b3b8a | 97 | char *str = (char*)malloc(sizeof(char)*buf_len); |
| hyunsungkim | 16:7a78838b3b8a | 98 | memset(str, NULL, buf_len); |
| hyunsungkim | 16:7a78838b3b8a | 99 | Timer t; |
| hyunsungkim | 16:7a78838b3b8a | 100 | t.start(); |
| hyunsungkim | 16:7a78838b3b8a | 101 | int begin = t.read_ms(); |
| hyunsungkim | 16:7a78838b3b8a | 102 | while(t.read_ms()-begin < 100) { |
| hyunsungkim | 16:7a78838b3b8a | 103 | if(pc.readable()) { |
| hyunsungkim | 16:7a78838b3b8a | 104 | char inByte=pc.getc(); |
| hyunsungkim | 16:7a78838b3b8a | 105 | *(str+n)=inByte; |
| hyunsungkim | 16:7a78838b3b8a | 106 | n++; |
| hyunsungkim | 16:7a78838b3b8a | 107 | if(inByte == term) { |
| hyunsungkim | 16:7a78838b3b8a | 108 | strcpy(buffer, str); |
| hyunsungkim | 16:7a78838b3b8a | 109 | free(str); |
| hyunsungkim | 16:7a78838b3b8a | 110 | return n; |
| hyunsungkim | 16:7a78838b3b8a | 111 | } |
| hyunsungkim | 16:7a78838b3b8a | 112 | if(n>buf_len) { |
| hyunsungkim | 16:7a78838b3b8a | 113 | free(str); |
| hyunsungkim | 16:7a78838b3b8a | 114 | return -1; |
| hyunsungkim | 10:02d3ca034103 | 115 | } |
| hyunsungkim | 10:02d3ca034103 | 116 | } |
| hyunsungkim | 10:02d3ca034103 | 117 | } |
| hyunsungkim | 16:7a78838b3b8a | 118 | free(str); |
| hyunsungkim | 16:7a78838b3b8a | 119 | return 0; |
| hyunsungkim | 10:02d3ca034103 | 120 | } |
| hyunsungkim | 10:02d3ca034103 | 121 | |
| hyunsungkim | 10:02d3ca034103 | 122 | void dumpRFInfo() |
| hyunsungkim | 10:02d3ca034103 | 123 | { |
| hyunsungkim | 10:02d3ca034103 | 124 | printf( "nRF24L01+ Frequency : %d MHz\r\n", nrf.getRfFrequency() ); |
| hyunsungkim | 10:02d3ca034103 | 125 | printf( "nRF24L01+ Output power : %d dBm\r\n", nrf.getRfOutputPower() ); |
| hyunsungkim | 10:02d3ca034103 | 126 | printf( "nRF24L01+ Data Rate : %d kbps\r\n", nrf.getAirDataRate() ); |
| hyunsungkim | 10:02d3ca034103 | 127 | printf( "nRF24L01+ TX Address : 0x%010llX\r\n", nrf.getTxAddress() ); |
| hyunsungkim | 10:02d3ca034103 | 128 | printf( "nRF24L01+ RX Address : 0x%010llX\r\n", nrf.getRxAddress() ); |
| hyunsungkim | 10:02d3ca034103 | 129 | } |
| hyunsungkim | 10:02d3ca034103 | 130 | |
| hyunsungkim | 15:217b3e5a2275 | 131 | void initNRF() |
| hyunsungkim | 10:02d3ca034103 | 132 | { |
| hyunsungkim | 15:217b3e5a2275 | 133 | nrf.setTxAddress(0xDEADBEEF0F); |
| hyunsungkim | 15:217b3e5a2275 | 134 | nrf.powerUp(); |
| hyunsungkim | 15:217b3e5a2275 | 135 | nrf.setTransferSize( TRANSFER_SIZE ); |
| hyunsungkim | 15:217b3e5a2275 | 136 | nrf.setTransmitMode(); |
| hyunsungkim | 15:217b3e5a2275 | 137 | nrf.enable(); |
| hyunsungkim | 15:217b3e5a2275 | 138 | |
| hyunsungkim | 8:78294b936c70 | 139 | } |
| hyunsungkim | 8:78294b936c70 | 140 | |
| hyunsungkim | 10:02d3ca034103 | 141 | void getPayload(int id, unsigned int count, int lspeed, int rspeed, char* txData) |
| hyunsungkim | 10:02d3ca034103 | 142 | { |
| hyunsungkim | 14:a4402559cd6e | 143 | *(txData+0) = '$'; |
| hyunsungkim | 14:a4402559cd6e | 144 | *(txData+1) = id/10+'0'; |
| hyunsungkim | 14:a4402559cd6e | 145 | *(txData+2) = id%10+'0'; |
| hyunsungkim | 14:a4402559cd6e | 146 | *(txData+3) = count/10000+'0'; |
| hyunsungkim | 14:a4402559cd6e | 147 | *(txData+4) = count/1000%10+'0'; |
| hyunsungkim | 14:a4402559cd6e | 148 | *(txData+5) = count/100%10+'0'; |
| hyunsungkim | 14:a4402559cd6e | 149 | *(txData+6) = count/10%10+'0'; |
| hyunsungkim | 14:a4402559cd6e | 150 | *(txData+7) = count%10+'0'; |
| hyunsungkim | 14:a4402559cd6e | 151 | *(txData+8) = lspeed>0?'+':'-'; |
| hyunsungkim | 14:a4402559cd6e | 152 | *(txData+9) = abs(lspeed)/10+'0'; |
| hyunsungkim | 14:a4402559cd6e | 153 | *(txData+10) = abs(lspeed)%10+'0'; |
| hyunsungkim | 14:a4402559cd6e | 154 | *(txData+11) = rspeed>0?'+':'-'; |
| hyunsungkim | 14:a4402559cd6e | 155 | *(txData+12) = abs(rspeed)/10+'0'; |
| hyunsungkim | 14:a4402559cd6e | 156 | *(txData+13) = abs(rspeed)%10+'0'; |
| hyunsungkim | 14:a4402559cd6e | 157 | *(txData+14) = '\0'; |
| hyunsungkim | 13:f0f9a5586e45 | 158 | } |
| hyunsungkim | 13:f0f9a5586e45 | 159 | |
| hyunsungkim | 13:f0f9a5586e45 | 160 | /* |
| hyunsungkim | 13:f0f9a5586e45 | 161 | xxyyyyyabbcddn |
| hyunsungkim | 13:f0f9a5586e45 | 162 | |
| hyunsungkim | 14:a4402559cd6e | 163 | 14 chars |
| hyunsungkim | 14:a4402559cd6e | 164 | |
| hyunsungkim | 13:f0f9a5586e45 | 165 | xx: robot_id |
| hyunsungkim | 13:f0f9a5586e45 | 166 | yyyyy: packet_id |
| hyunsungkim | 13:f0f9a5586e45 | 167 | a: sign of lspeed |
| hyunsungkim | 13:f0f9a5586e45 | 168 | bb: lspeed |
| hyunsungkim | 13:f0f9a5586e45 | 169 | c: sign of rspeed |
| hyunsungkim | 13:f0f9a5586e45 | 170 | dd: rspeed |
| hyunsungkim | 14:a4402559cd6e | 171 | n: NULL 0 |
| hyunsungkim | 13:f0f9a5586e45 | 172 | |
| hyunsungkim | 14:a4402559cd6e | 173 | 0100001+30+30 |
| hyunsungkim | 13:f0f9a5586e45 | 174 | */ |