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@18:2342aa54dc9b, 2018-12-01 (annotated)
- Committer:
- hyunsungkim
- Date:
- Sat Dec 01 18:19:22 2018 +0000
- Branch:
- RF24_library_test_tx
- Revision:
- 18:2342aa54dc9b
- Parent:
- 17:6ae73e8943ce
??, ??, ??? ??? ??? ?? ? ???? ?? ???? ???? ?? ??; Payload? parsing?? ?? ??. ??? ??
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 | 18:2342aa54dc9b | 18 | #define DATA_PROTOCOL_TOKEN_ "," |
| hyunsungkim | 16:7a78838b3b8a | 19 | #define DATA_PROTOCOL_END '*' |
| hyunsungkim | 18:2342aa54dc9b | 20 | #define DATA_PROTOCOL_END_ "*" |
| hyunsungkim | 8:78294b936c70 | 21 | |
| hyunsungkim | 8:78294b936c70 | 22 | nRF24L01P nrf(spi_MOSI, spi_MISO, spi_SCK, nrf_CSN, nrf_CE, spi_IRQ); // mosi, miso, sck, csn, ce, irq |
| hyunsungkim | 8:78294b936c70 | 23 | |
| hyunsungkim | 0:2dade6db4d3a | 24 | Serial pc(USBTX, USBRX); |
| hyunsungkim | 0:2dade6db4d3a | 25 | PwmOut buzzer(D5); |
| hyunsungkim | 0:2dade6db4d3a | 26 | |
| hyunsungkim | 18:2342aa54dc9b | 27 | typedef struct { |
| hyunsungkim | 18:2342aa54dc9b | 28 | int bot_id; |
| hyunsungkim | 18:2342aa54dc9b | 29 | int cmd_id; |
| hyunsungkim | 18:2342aa54dc9b | 30 | int lspeed; |
| hyunsungkim | 18:2342aa54dc9b | 31 | int rspeed; |
| hyunsungkim | 18:2342aa54dc9b | 32 | } payload_t; |
| hyunsungkim | 18:2342aa54dc9b | 33 | |
| hyunsungkim | 8:78294b936c70 | 34 | void beepStart(); |
| hyunsungkim | 8:78294b936c70 | 35 | void endBeep(); |
| hyunsungkim | 15:217b3e5a2275 | 36 | void initNRF(); |
| hyunsungkim | 11:1b56bb8ccd04 | 37 | void dumpRFInfo(); |
| hyunsungkim | 18:2342aa54dc9b | 38 | |
| hyunsungkim | 16:7a78838b3b8a | 39 | int readSerialUntil(char *buffer, unsigned int buf_len, char terminator); |
| hyunsungkim | 16:7a78838b3b8a | 40 | char* inspectData(char *buffer, int buf_len); |
| hyunsungkim | 18:2342aa54dc9b | 41 | payload_t* getPayload(char* raw_data); |
| hyunsungkim | 6:42ecdff5956a | 42 | |
| hyunsungkim | 16:7a78838b3b8a | 43 | int main() |
| hyunsungkim | 16:7a78838b3b8a | 44 | { |
| hyunsungkim | 16:7a78838b3b8a | 45 | char buffer[BUFFER_SIZE]; |
| hyunsungkim | 8:78294b936c70 | 46 | beepStart(); |
| hyunsungkim | 0:2dade6db4d3a | 47 | pc.baud(115200); |
| hyunsungkim | 15:217b3e5a2275 | 48 | printf("I'm Master\r\n"); |
| hyunsungkim | 15:217b3e5a2275 | 49 | initNRF(); |
| hyunsungkim | 11:1b56bb8ccd04 | 50 | dumpRFInfo(); |
| hyunsungkim | 17:6ae73e8943ce | 51 | |
| hyunsungkim | 16:7a78838b3b8a | 52 | memset(buffer, NULL, BUFFER_SIZE); |
| hyunsungkim | 16:7a78838b3b8a | 53 | |
| hyunsungkim | 10:02d3ca034103 | 54 | while(1) { |
| hyunsungkim | 16:7a78838b3b8a | 55 | int result = readSerialUntil(buffer, BUFFER_SIZE, DATA_PROTOCOL_END); |
| hyunsungkim | 16:7a78838b3b8a | 56 | if(result>0) { |
| hyunsungkim | 16:7a78838b3b8a | 57 | char *data = inspectData(buffer, BUFFER_SIZE); |
| hyunsungkim | 17:6ae73e8943ce | 58 | if(*data == DATA_PROTOCOL_BEGIN) { |
| hyunsungkim | 18:2342aa54dc9b | 59 | printf("%s\r\n", data); |
| hyunsungkim | 18:2342aa54dc9b | 60 | payload_t *payload = getPayload(data); |
| hyunsungkim | 18:2342aa54dc9b | 61 | printf("BotID:%d, CmdID:%d, LSpeed:%d, RSpeed:%d\r\n", payload->bot_id, payload->cmd_id, payload->lspeed, payload->rspeed); |
| hyunsungkim | 17:6ae73e8943ce | 62 | free(data); |
| hyunsungkim | 18:2342aa54dc9b | 63 | free(payload); |
| hyunsungkim | 17:6ae73e8943ce | 64 | } |
| hyunsungkim | 16:7a78838b3b8a | 65 | } |
| hyunsungkim | 16:7a78838b3b8a | 66 | /* |
| hyunsungkim | 15:217b3e5a2275 | 67 | while(pc.readable()) { |
| hyunsungkim | 15:217b3e5a2275 | 68 | char inByte = pc.getc(); |
| hyunsungkim | 15:217b3e5a2275 | 69 | if(inByteCnt > TRANSFER_SIZE+2) { |
| hyunsungkim | 15:217b3e5a2275 | 70 | printf("Data size overflow!\r\n"); |
| hyunsungkim | 15:217b3e5a2275 | 71 | inByteCnt = 0; |
| hyunsungkim | 15:217b3e5a2275 | 72 | break; |
| hyunsungkim | 15:217b3e5a2275 | 73 | } else if(inByte == '\0') { |
| hyunsungkim | 16:7a78838b3b8a | 74 | buffer[inByteCnt] = '\0'; |
| hyunsungkim | 16:7a78838b3b8a | 75 | printf("Command: %s\r\n", buffer); |
| hyunsungkim | 16:7a78838b3b8a | 76 | nrf.write(NRF24L01P_PIPE_P0, buffer, TRANSFER_SIZE); |
| hyunsungkim | 15:217b3e5a2275 | 77 | inByteCnt=0; |
| hyunsungkim | 15:217b3e5a2275 | 78 | } else { |
| hyunsungkim | 16:7a78838b3b8a | 79 | buffer[inByteCnt++] = inByte; |
| hyunsungkim | 16:7a78838b3b8a | 80 | } |
| hyunsungkim | 16:7a78838b3b8a | 81 | }*/ |
| hyunsungkim | 16:7a78838b3b8a | 82 | } |
| hyunsungkim | 16:7a78838b3b8a | 83 | } |
| hyunsungkim | 16:7a78838b3b8a | 84 | |
| hyunsungkim | 18:2342aa54dc9b | 85 | payload_t* getPayload(char *data) |
| hyunsungkim | 18:2342aa54dc9b | 86 | { |
| hyunsungkim | 18:2342aa54dc9b | 87 | int n = strlen(data); |
| hyunsungkim | 18:2342aa54dc9b | 88 | char _data[n+1]; |
| hyunsungkim | 18:2342aa54dc9b | 89 | strcpy(_data, data); |
| hyunsungkim | 18:2342aa54dc9b | 90 | payload_t *p = (payload_t*)malloc(sizeof(payload_t)); |
| hyunsungkim | 18:2342aa54dc9b | 91 | p->bot_id = atoi(strtok(data+1, DATA_PROTOCOL_TOKEN_)); |
| hyunsungkim | 18:2342aa54dc9b | 92 | p->cmd_id = atoi(strtok(NULL, DATA_PROTOCOL_TOKEN_)); |
| hyunsungkim | 18:2342aa54dc9b | 93 | p->lspeed = atoi(strtok(NULL, DATA_PROTOCOL_TOKEN_)); |
| hyunsungkim | 18:2342aa54dc9b | 94 | p->rspeed = atoi(strtok(NULL, DATA_PROTOCOL_END_)); |
| hyunsungkim | 18:2342aa54dc9b | 95 | return p; |
| hyunsungkim | 18:2342aa54dc9b | 96 | } |
| hyunsungkim | 18:2342aa54dc9b | 97 | |
| hyunsungkim | 16:7a78838b3b8a | 98 | char* inspectData(char *buffer, int buf_len) |
| hyunsungkim | 16:7a78838b3b8a | 99 | { |
| hyunsungkim | 16:7a78838b3b8a | 100 | int start, end; |
| hyunsungkim | 16:7a78838b3b8a | 101 | for(int i=0; buffer[i-1]!=DATA_PROTOCOL_BEGIN; i++) { |
| hyunsungkim | 16:7a78838b3b8a | 102 | start = i; |
| hyunsungkim | 16:7a78838b3b8a | 103 | if(i==buf_len) return 0; |
| hyunsungkim | 16:7a78838b3b8a | 104 | } |
| hyunsungkim | 16:7a78838b3b8a | 105 | for(int i=start+1; buffer[i-1]!=DATA_PROTOCOL_END; i++) { |
| hyunsungkim | 16:7a78838b3b8a | 106 | end = i; |
| hyunsungkim | 16:7a78838b3b8a | 107 | if(i==buf_len) return 0; |
| hyunsungkim | 16:7a78838b3b8a | 108 | } |
| hyunsungkim | 16:7a78838b3b8a | 109 | int data_len = end-start+1; |
| hyunsungkim | 16:7a78838b3b8a | 110 | char *str = (char*)malloc(sizeof(char)*(data_len+1)); |
| hyunsungkim | 16:7a78838b3b8a | 111 | memset(str, NULL, data_len+1); |
| hyunsungkim | 17:6ae73e8943ce | 112 | for(int i=0; i<data_len; i++) { |
| hyunsungkim | 16:7a78838b3b8a | 113 | *(str+i) = buffer[start+i]; |
| hyunsungkim | 18:2342aa54dc9b | 114 | |
| hyunsungkim | 18:2342aa54dc9b | 115 | if(buffer[start+i]==DATA_PROTOCOL_BEGIN || buffer[start+i]==DATA_PROTOCOL_TOKEN || buffer[start+i]==DATA_PROTOCOL_END |
| hyunsungkim | 18:2342aa54dc9b | 116 | || (buffer[start+i]>='0'&&buffer[start+i]<='9') || buffer[start+i]=='+' || buffer[start+i]=='-') { |
| hyunsungkim | 18:2342aa54dc9b | 117 | continue; |
| hyunsungkim | 18:2342aa54dc9b | 118 | } else { |
| hyunsungkim | 18:2342aa54dc9b | 119 | //pc.putc(buffer[start+i]); |
| hyunsungkim | 18:2342aa54dc9b | 120 | free(str); |
| hyunsungkim | 18:2342aa54dc9b | 121 | return 0; |
| hyunsungkim | 18:2342aa54dc9b | 122 | } |
| hyunsungkim | 16:7a78838b3b8a | 123 | } |
| hyunsungkim | 16:7a78838b3b8a | 124 | return str; |
| hyunsungkim | 16:7a78838b3b8a | 125 | } |
| hyunsungkim | 16:7a78838b3b8a | 126 | |
| hyunsungkim | 16:7a78838b3b8a | 127 | int readSerialUntil(char *buffer, unsigned int buf_len, char term) |
| hyunsungkim | 16:7a78838b3b8a | 128 | { |
| hyunsungkim | 16:7a78838b3b8a | 129 | int n=0; |
| hyunsungkim | 16:7a78838b3b8a | 130 | char *str = (char*)malloc(sizeof(char)*buf_len); |
| hyunsungkim | 16:7a78838b3b8a | 131 | memset(str, NULL, buf_len); |
| hyunsungkim | 16:7a78838b3b8a | 132 | Timer t; |
| hyunsungkim | 16:7a78838b3b8a | 133 | t.start(); |
| hyunsungkim | 16:7a78838b3b8a | 134 | int begin = t.read_ms(); |
| hyunsungkim | 16:7a78838b3b8a | 135 | while(t.read_ms()-begin < 100) { |
| hyunsungkim | 16:7a78838b3b8a | 136 | if(pc.readable()) { |
| hyunsungkim | 16:7a78838b3b8a | 137 | char inByte=pc.getc(); |
| hyunsungkim | 16:7a78838b3b8a | 138 | *(str+n)=inByte; |
| hyunsungkim | 16:7a78838b3b8a | 139 | n++; |
| hyunsungkim | 16:7a78838b3b8a | 140 | if(inByte == term) { |
| hyunsungkim | 16:7a78838b3b8a | 141 | strcpy(buffer, str); |
| hyunsungkim | 16:7a78838b3b8a | 142 | free(str); |
| hyunsungkim | 16:7a78838b3b8a | 143 | return n; |
| hyunsungkim | 16:7a78838b3b8a | 144 | } |
| hyunsungkim | 16:7a78838b3b8a | 145 | if(n>buf_len) { |
| hyunsungkim | 16:7a78838b3b8a | 146 | free(str); |
| hyunsungkim | 16:7a78838b3b8a | 147 | return -1; |
| hyunsungkim | 10:02d3ca034103 | 148 | } |
| hyunsungkim | 10:02d3ca034103 | 149 | } |
| hyunsungkim | 10:02d3ca034103 | 150 | } |
| hyunsungkim | 16:7a78838b3b8a | 151 | free(str); |
| hyunsungkim | 16:7a78838b3b8a | 152 | return 0; |
| hyunsungkim | 10:02d3ca034103 | 153 | } |
| hyunsungkim | 10:02d3ca034103 | 154 | |
| hyunsungkim | 10:02d3ca034103 | 155 | void dumpRFInfo() |
| hyunsungkim | 10:02d3ca034103 | 156 | { |
| hyunsungkim | 10:02d3ca034103 | 157 | printf( "nRF24L01+ Frequency : %d MHz\r\n", nrf.getRfFrequency() ); |
| hyunsungkim | 10:02d3ca034103 | 158 | printf( "nRF24L01+ Output power : %d dBm\r\n", nrf.getRfOutputPower() ); |
| hyunsungkim | 10:02d3ca034103 | 159 | printf( "nRF24L01+ Data Rate : %d kbps\r\n", nrf.getAirDataRate() ); |
| hyunsungkim | 10:02d3ca034103 | 160 | printf( "nRF24L01+ TX Address : 0x%010llX\r\n", nrf.getTxAddress() ); |
| hyunsungkim | 10:02d3ca034103 | 161 | printf( "nRF24L01+ RX Address : 0x%010llX\r\n", nrf.getRxAddress() ); |
| hyunsungkim | 10:02d3ca034103 | 162 | } |
| hyunsungkim | 10:02d3ca034103 | 163 | |
| hyunsungkim | 15:217b3e5a2275 | 164 | void initNRF() |
| hyunsungkim | 10:02d3ca034103 | 165 | { |
| hyunsungkim | 15:217b3e5a2275 | 166 | nrf.setTxAddress(0xDEADBEEF0F); |
| hyunsungkim | 15:217b3e5a2275 | 167 | nrf.powerUp(); |
| hyunsungkim | 15:217b3e5a2275 | 168 | nrf.setTransferSize( TRANSFER_SIZE ); |
| hyunsungkim | 15:217b3e5a2275 | 169 | nrf.setTransmitMode(); |
| hyunsungkim | 15:217b3e5a2275 | 170 | nrf.enable(); |
| hyunsungkim | 15:217b3e5a2275 | 171 | |
| hyunsungkim | 8:78294b936c70 | 172 | } |
| hyunsungkim | 8:78294b936c70 | 173 | |
| hyunsungkim | 10:02d3ca034103 | 174 | void getPayload(int id, unsigned int count, int lspeed, int rspeed, char* txData) |
| hyunsungkim | 10:02d3ca034103 | 175 | { |
| hyunsungkim | 14:a4402559cd6e | 176 | *(txData+0) = '$'; |
| hyunsungkim | 14:a4402559cd6e | 177 | *(txData+1) = id/10+'0'; |
| hyunsungkim | 14:a4402559cd6e | 178 | *(txData+2) = id%10+'0'; |
| hyunsungkim | 14:a4402559cd6e | 179 | *(txData+3) = count/10000+'0'; |
| hyunsungkim | 14:a4402559cd6e | 180 | *(txData+4) = count/1000%10+'0'; |
| hyunsungkim | 14:a4402559cd6e | 181 | *(txData+5) = count/100%10+'0'; |
| hyunsungkim | 14:a4402559cd6e | 182 | *(txData+6) = count/10%10+'0'; |
| hyunsungkim | 14:a4402559cd6e | 183 | *(txData+7) = count%10+'0'; |
| hyunsungkim | 14:a4402559cd6e | 184 | *(txData+8) = lspeed>0?'+':'-'; |
| hyunsungkim | 14:a4402559cd6e | 185 | *(txData+9) = abs(lspeed)/10+'0'; |
| hyunsungkim | 14:a4402559cd6e | 186 | *(txData+10) = abs(lspeed)%10+'0'; |
| hyunsungkim | 14:a4402559cd6e | 187 | *(txData+11) = rspeed>0?'+':'-'; |
| hyunsungkim | 14:a4402559cd6e | 188 | *(txData+12) = abs(rspeed)/10+'0'; |
| hyunsungkim | 14:a4402559cd6e | 189 | *(txData+13) = abs(rspeed)%10+'0'; |
| hyunsungkim | 14:a4402559cd6e | 190 | *(txData+14) = '\0'; |
| hyunsungkim | 13:f0f9a5586e45 | 191 | } |
| hyunsungkim | 13:f0f9a5586e45 | 192 | |
| hyunsungkim | 13:f0f9a5586e45 | 193 | /* |
| hyunsungkim | 13:f0f9a5586e45 | 194 | xxyyyyyabbcddn |
| hyunsungkim | 13:f0f9a5586e45 | 195 | |
| hyunsungkim | 14:a4402559cd6e | 196 | 14 chars |
| hyunsungkim | 14:a4402559cd6e | 197 | |
| hyunsungkim | 13:f0f9a5586e45 | 198 | xx: robot_id |
| hyunsungkim | 13:f0f9a5586e45 | 199 | yyyyy: packet_id |
| hyunsungkim | 13:f0f9a5586e45 | 200 | a: sign of lspeed |
| hyunsungkim | 13:f0f9a5586e45 | 201 | bb: lspeed |
| hyunsungkim | 13:f0f9a5586e45 | 202 | c: sign of rspeed |
| hyunsungkim | 13:f0f9a5586e45 | 203 | dd: rspeed |
| hyunsungkim | 14:a4402559cd6e | 204 | n: NULL 0 |
| hyunsungkim | 13:f0f9a5586e45 | 205 | |
| hyunsungkim | 14:a4402559cd6e | 206 | 0100001+30+30 |
| hyunsungkim | 13:f0f9a5586e45 | 207 | */ |