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.
master.cpp@20:e0302dc43412, 2018-12-15 (annotated)
- Committer:
- hyunsungkim
- Date:
- Sat Dec 15 19:32:26 2018 +0000
- Branch:
- RF24_library_test_tx
- Revision:
- 20:e0302dc43412
- Parent:
- 19:6f01eb6f4163
before adjusting communication timing
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hyunsungkim | 19:6f01eb6f4163 | 1 | #include "mbed.h" |
hyunsungkim | 19:6f01eb6f4163 | 2 | #include "nRF24L01P.h" |
hyunsungkim | 19:6f01eb6f4163 | 3 | #include "beep.h" |
hyunsungkim | 19:6f01eb6f4163 | 4 | |
hyunsungkim | 19:6f01eb6f4163 | 5 | #define nrf_CE D2 |
hyunsungkim | 19:6f01eb6f4163 | 6 | #define nrf_CSN A3 |
hyunsungkim | 19:6f01eb6f4163 | 7 | #define spi_SCK D13 |
hyunsungkim | 19:6f01eb6f4163 | 8 | #define spi_MOSI D11 |
hyunsungkim | 19:6f01eb6f4163 | 9 | #define spi_MISO D12 |
hyunsungkim | 19:6f01eb6f4163 | 10 | #define spi_IRQ D4 |
hyunsungkim | 19:6f01eb6f4163 | 11 | |
hyunsungkim | 19:6f01eb6f4163 | 12 | #define TRANSFER_SIZE 15 |
hyunsungkim | 19:6f01eb6f4163 | 13 | #define MAX_BUFFER_SIZE 255 |
hyunsungkim | 19:6f01eb6f4163 | 14 | #define BUFFER_SIZE MAX_BUFFER_SIZE |
hyunsungkim | 19:6f01eb6f4163 | 15 | |
hyunsungkim | 19:6f01eb6f4163 | 16 | #define DATA_PROTOCOL_BEGIN '$' |
hyunsungkim | 19:6f01eb6f4163 | 17 | #define DATA_PROTOCOL_TOKEN ',' |
hyunsungkim | 19:6f01eb6f4163 | 18 | #define DATA_PROTOCOL_TOKEN_ "," |
hyunsungkim | 19:6f01eb6f4163 | 19 | #define DATA_PROTOCOL_END '*' |
hyunsungkim | 19:6f01eb6f4163 | 20 | #define DATA_PROTOCOL_END_ "*" |
hyunsungkim | 19:6f01eb6f4163 | 21 | |
hyunsungkim | 19:6f01eb6f4163 | 22 | #define NRF_TRANSMIT 1 |
hyunsungkim | 19:6f01eb6f4163 | 23 | #define NRF_RECEIVE 2 |
hyunsungkim | 19:6f01eb6f4163 | 24 | |
hyunsungkim | 19:6f01eb6f4163 | 25 | #define NRF_RETRIAL_MAX 5 |
hyunsungkim | 19:6f01eb6f4163 | 26 | |
hyunsungkim | 19:6f01eb6f4163 | 27 | nRF24L01P nrf(spi_MOSI, spi_MISO, spi_SCK, nrf_CSN, nrf_CE, spi_IRQ); // mosi, miso, sck, csn, ce, irq |
hyunsungkim | 19:6f01eb6f4163 | 28 | Serial pc(USBTX, USBRX); |
hyunsungkim | 19:6f01eb6f4163 | 29 | PwmOut buzzer(D5); |
hyunsungkim | 19:6f01eb6f4163 | 30 | |
hyunsungkim | 19:6f01eb6f4163 | 31 | uint64_t txAddr = 0xDEADBEEF0F; |
hyunsungkim | 19:6f01eb6f4163 | 32 | uint64_t rxAddr = 0xDEADBEEF00; |
hyunsungkim | 19:6f01eb6f4163 | 33 | |
hyunsungkim | 19:6f01eb6f4163 | 34 | typedef struct { |
hyunsungkim | 19:6f01eb6f4163 | 35 | int bot_id; |
hyunsungkim | 19:6f01eb6f4163 | 36 | int cmd_id; |
hyunsungkim | 19:6f01eb6f4163 | 37 | int lspeed; |
hyunsungkim | 19:6f01eb6f4163 | 38 | int rspeed; |
hyunsungkim | 19:6f01eb6f4163 | 39 | } payload_t; |
hyunsungkim | 19:6f01eb6f4163 | 40 | |
hyunsungkim | 19:6f01eb6f4163 | 41 | void beepStart(); |
hyunsungkim | 19:6f01eb6f4163 | 42 | void initNRF(int mode, int msg_len); |
hyunsungkim | 19:6f01eb6f4163 | 43 | void dumpRFInfo(); |
hyunsungkim | 19:6f01eb6f4163 | 44 | int readSerialUntil(char *buffer, unsigned int buf_len, char terminator); |
hyunsungkim | 19:6f01eb6f4163 | 45 | char* inspectData(char *buffer, int buf_len); |
hyunsungkim | 19:6f01eb6f4163 | 46 | payload_t* getPayload(char* raw_data); |
hyunsungkim | 19:6f01eb6f4163 | 47 | int transmitCmd(payload_t *p); |
hyunsungkim | 19:6f01eb6f4163 | 48 | |
hyunsungkim | 19:6f01eb6f4163 | 49 | int main() |
hyunsungkim | 19:6f01eb6f4163 | 50 | { |
hyunsungkim | 19:6f01eb6f4163 | 51 | char buffer[BUFFER_SIZE]; |
hyunsungkim | 19:6f01eb6f4163 | 52 | beepStart(); |
hyunsungkim | 19:6f01eb6f4163 | 53 | pc.baud(115200); |
hyunsungkim | 19:6f01eb6f4163 | 54 | printf("I'm Master\r\n"); |
hyunsungkim | 19:6f01eb6f4163 | 55 | initNRF(NRF_TRANSMIT, TRANSFER_SIZE); |
hyunsungkim | 20:e0302dc43412 | 56 | dumpRFInfo(); |
hyunsungkim | 19:6f01eb6f4163 | 57 | memset(buffer, NULL, BUFFER_SIZE); |
hyunsungkim | 19:6f01eb6f4163 | 58 | |
hyunsungkim | 19:6f01eb6f4163 | 59 | while(1) { |
hyunsungkim | 20:e0302dc43412 | 60 | int inByteNum = readSerialUntil(buffer, BUFFER_SIZE, DATA_PROTOCOL_END); |
hyunsungkim | 20:e0302dc43412 | 61 | if(inByteNum>0) { |
hyunsungkim | 19:6f01eb6f4163 | 62 | char *data = inspectData(buffer, BUFFER_SIZE); |
hyunsungkim | 19:6f01eb6f4163 | 63 | if(*data == DATA_PROTOCOL_BEGIN) { |
hyunsungkim | 19:6f01eb6f4163 | 64 | payload_t *payload = getPayload(data); |
hyunsungkim | 20:e0302dc43412 | 65 | printf("Payload - BotID:%d, CmdID:%d, LSpeed:%d, RSpeed:%d\r\n", payload->bot_id, payload->cmd_id, payload->lspeed, payload->rspeed); |
hyunsungkim | 19:6f01eb6f4163 | 66 | int n = transmitCmd(payload); |
hyunsungkim | 19:6f01eb6f4163 | 67 | free(data); |
hyunsungkim | 19:6f01eb6f4163 | 68 | free(payload); |
hyunsungkim | 19:6f01eb6f4163 | 69 | } |
hyunsungkim | 19:6f01eb6f4163 | 70 | } |
hyunsungkim | 19:6f01eb6f4163 | 71 | } |
hyunsungkim | 19:6f01eb6f4163 | 72 | } |
hyunsungkim | 19:6f01eb6f4163 | 73 | |
hyunsungkim | 19:6f01eb6f4163 | 74 | void constructString(char *txData, payload_t *p) |
hyunsungkim | 19:6f01eb6f4163 | 75 | { |
hyunsungkim | 19:6f01eb6f4163 | 76 | *(txData+0) = '$'; |
hyunsungkim | 19:6f01eb6f4163 | 77 | *(txData+1) = p->bot_id/10+'0'; |
hyunsungkim | 19:6f01eb6f4163 | 78 | *(txData+2) = p->bot_id%10+'0'; |
hyunsungkim | 19:6f01eb6f4163 | 79 | *(txData+3) = p->cmd_id/10000+'0'; |
hyunsungkim | 19:6f01eb6f4163 | 80 | *(txData+4) = p->cmd_id/1000%10+'0'; |
hyunsungkim | 19:6f01eb6f4163 | 81 | *(txData+5) = p->cmd_id/100%10+'0'; |
hyunsungkim | 19:6f01eb6f4163 | 82 | *(txData+6) = p->cmd_id/10%10+'0'; |
hyunsungkim | 19:6f01eb6f4163 | 83 | *(txData+7) = p->cmd_id%10+'0'; |
hyunsungkim | 19:6f01eb6f4163 | 84 | *(txData+8) = p->lspeed>0?'+':'-'; |
hyunsungkim | 19:6f01eb6f4163 | 85 | *(txData+9) = abs(p->lspeed)/10+'0'; |
hyunsungkim | 19:6f01eb6f4163 | 86 | *(txData+10) = abs(p->lspeed)%10+'0'; |
hyunsungkim | 19:6f01eb6f4163 | 87 | *(txData+11) = p->rspeed>0?'+':'-'; |
hyunsungkim | 19:6f01eb6f4163 | 88 | *(txData+12) = abs(p->rspeed)/10+'0'; |
hyunsungkim | 19:6f01eb6f4163 | 89 | *(txData+13) = abs(p->rspeed)%10+'0'; |
hyunsungkim | 19:6f01eb6f4163 | 90 | *(txData+14) = '\0'; |
hyunsungkim | 19:6f01eb6f4163 | 91 | } |
hyunsungkim | 19:6f01eb6f4163 | 92 | |
hyunsungkim | 19:6f01eb6f4163 | 93 | int transmitCmd(payload_t *p) |
hyunsungkim | 19:6f01eb6f4163 | 94 | { |
hyunsungkim | 19:6f01eb6f4163 | 95 | int trial = 0; |
hyunsungkim | 19:6f01eb6f4163 | 96 | int rxDataCnt=0; |
hyunsungkim | 19:6f01eb6f4163 | 97 | char rxData[MAX_BUFFER_SIZE]; |
hyunsungkim | 19:6f01eb6f4163 | 98 | char buf[TRANSFER_SIZE]; |
hyunsungkim | 20:e0302dc43412 | 99 | //char buf_[TRANSFER_SIZE]="$01,22,-51,11"; |
hyunsungkim | 19:6f01eb6f4163 | 100 | |
hyunsungkim | 19:6f01eb6f4163 | 101 | while(trial<NRF_RETRIAL_MAX) { |
hyunsungkim | 19:6f01eb6f4163 | 102 | initNRF(NRF_TRANSMIT, TRANSFER_SIZE); |
hyunsungkim | 19:6f01eb6f4163 | 103 | constructString(buf, p); |
hyunsungkim | 19:6f01eb6f4163 | 104 | |
hyunsungkim | 19:6f01eb6f4163 | 105 | nrf.write(NRF24L01P_PIPE_P0, buf, TRANSFER_SIZE); |
hyunsungkim | 20:e0302dc43412 | 106 | //nrf.write(NRF24L01P_PIPE_P0, _buf, TRANSFER_SIZE); |
hyunsungkim | 19:6f01eb6f4163 | 107 | initNRF(NRF_RECEIVE, TRANSFER_SIZE); |
hyunsungkim | 19:6f01eb6f4163 | 108 | wait(0.01); |
hyunsungkim | 19:6f01eb6f4163 | 109 | rxDataCnt = nrf.read( NRF24L01P_PIPE_P0, rxData, TRANSFER_SIZE); |
hyunsungkim | 19:6f01eb6f4163 | 110 | if(rxDataCnt>0) { |
hyunsungkim | 19:6f01eb6f4163 | 111 | return 1; |
hyunsungkim | 19:6f01eb6f4163 | 112 | } |
hyunsungkim | 19:6f01eb6f4163 | 113 | trial++; |
hyunsungkim | 19:6f01eb6f4163 | 114 | } |
hyunsungkim | 19:6f01eb6f4163 | 115 | printf("No Reply from Bot..\r\n"); |
hyunsungkim | 19:6f01eb6f4163 | 116 | return 0; |
hyunsungkim | 19:6f01eb6f4163 | 117 | } |
hyunsungkim | 19:6f01eb6f4163 | 118 | |
hyunsungkim | 19:6f01eb6f4163 | 119 | payload_t* getPayload(char *data) |
hyunsungkim | 19:6f01eb6f4163 | 120 | { |
hyunsungkim | 19:6f01eb6f4163 | 121 | int n = strlen(data); |
hyunsungkim | 19:6f01eb6f4163 | 122 | char _data[n+1]; |
hyunsungkim | 19:6f01eb6f4163 | 123 | strcpy(_data, data); |
hyunsungkim | 19:6f01eb6f4163 | 124 | payload_t *p = (payload_t*)malloc(sizeof(payload_t)); |
hyunsungkim | 19:6f01eb6f4163 | 125 | p->bot_id = atoi(strtok(data+1, DATA_PROTOCOL_TOKEN_)); |
hyunsungkim | 19:6f01eb6f4163 | 126 | p->cmd_id = atoi(strtok(NULL, DATA_PROTOCOL_TOKEN_)); |
hyunsungkim | 19:6f01eb6f4163 | 127 | p->lspeed = atoi(strtok(NULL, DATA_PROTOCOL_TOKEN_)); |
hyunsungkim | 19:6f01eb6f4163 | 128 | p->rspeed = atoi(strtok(NULL, DATA_PROTOCOL_END_)); |
hyunsungkim | 19:6f01eb6f4163 | 129 | return p; |
hyunsungkim | 19:6f01eb6f4163 | 130 | } |
hyunsungkim | 19:6f01eb6f4163 | 131 | |
hyunsungkim | 19:6f01eb6f4163 | 132 | char* inspectData(char *buffer, int buf_len) |
hyunsungkim | 19:6f01eb6f4163 | 133 | { |
hyunsungkim | 19:6f01eb6f4163 | 134 | int start, end; |
hyunsungkim | 19:6f01eb6f4163 | 135 | for(int i=0; buffer[i-1]!=DATA_PROTOCOL_BEGIN; i++) { |
hyunsungkim | 19:6f01eb6f4163 | 136 | start = i; |
hyunsungkim | 19:6f01eb6f4163 | 137 | if(i==buf_len) return 0; |
hyunsungkim | 19:6f01eb6f4163 | 138 | } |
hyunsungkim | 19:6f01eb6f4163 | 139 | for(int i=start+1; buffer[i-1]!=DATA_PROTOCOL_END; i++) { |
hyunsungkim | 19:6f01eb6f4163 | 140 | end = i; |
hyunsungkim | 19:6f01eb6f4163 | 141 | if(i==buf_len) return 0; |
hyunsungkim | 19:6f01eb6f4163 | 142 | } |
hyunsungkim | 19:6f01eb6f4163 | 143 | int data_len = end-start+1; |
hyunsungkim | 19:6f01eb6f4163 | 144 | char *str = (char*)malloc(sizeof(char)*(data_len+1)); |
hyunsungkim | 19:6f01eb6f4163 | 145 | memset(str, NULL, data_len+1); |
hyunsungkim | 19:6f01eb6f4163 | 146 | for(int i=0; i<data_len; i++) { |
hyunsungkim | 19:6f01eb6f4163 | 147 | *(str+i) = buffer[start+i]; |
hyunsungkim | 19:6f01eb6f4163 | 148 | |
hyunsungkim | 19:6f01eb6f4163 | 149 | if(buffer[start+i]==DATA_PROTOCOL_BEGIN || buffer[start+i]==DATA_PROTOCOL_TOKEN || buffer[start+i]==DATA_PROTOCOL_END |
hyunsungkim | 19:6f01eb6f4163 | 150 | || (buffer[start+i]>='0'&&buffer[start+i]<='9') || buffer[start+i]=='+' || buffer[start+i]=='-') { |
hyunsungkim | 19:6f01eb6f4163 | 151 | continue; |
hyunsungkim | 19:6f01eb6f4163 | 152 | } else { |
hyunsungkim | 19:6f01eb6f4163 | 153 | //pc.putc(buffer[start+i]); |
hyunsungkim | 19:6f01eb6f4163 | 154 | free(str); |
hyunsungkim | 19:6f01eb6f4163 | 155 | return 0; |
hyunsungkim | 19:6f01eb6f4163 | 156 | } |
hyunsungkim | 19:6f01eb6f4163 | 157 | } |
hyunsungkim | 19:6f01eb6f4163 | 158 | return str; |
hyunsungkim | 19:6f01eb6f4163 | 159 | } |
hyunsungkim | 19:6f01eb6f4163 | 160 | |
hyunsungkim | 19:6f01eb6f4163 | 161 | int readSerialUntil(char *buffer, unsigned int buf_len, char term) |
hyunsungkim | 19:6f01eb6f4163 | 162 | { |
hyunsungkim | 19:6f01eb6f4163 | 163 | int n=0; |
hyunsungkim | 19:6f01eb6f4163 | 164 | char *str = (char*)malloc(sizeof(char)*buf_len); |
hyunsungkim | 19:6f01eb6f4163 | 165 | memset(str, NULL, buf_len); |
hyunsungkim | 19:6f01eb6f4163 | 166 | Timer t; |
hyunsungkim | 19:6f01eb6f4163 | 167 | t.start(); |
hyunsungkim | 19:6f01eb6f4163 | 168 | int begin = t.read_ms(); |
hyunsungkim | 19:6f01eb6f4163 | 169 | while(t.read_ms()-begin < 100) { |
hyunsungkim | 19:6f01eb6f4163 | 170 | if(pc.readable()) { |
hyunsungkim | 19:6f01eb6f4163 | 171 | char inByte=pc.getc(); |
hyunsungkim | 19:6f01eb6f4163 | 172 | *(str+n)=inByte; |
hyunsungkim | 19:6f01eb6f4163 | 173 | n++; |
hyunsungkim | 19:6f01eb6f4163 | 174 | if(inByte == term) { |
hyunsungkim | 19:6f01eb6f4163 | 175 | strcpy(buffer, str); |
hyunsungkim | 19:6f01eb6f4163 | 176 | free(str); |
hyunsungkim | 19:6f01eb6f4163 | 177 | return n; |
hyunsungkim | 19:6f01eb6f4163 | 178 | } |
hyunsungkim | 19:6f01eb6f4163 | 179 | if(n>buf_len) { |
hyunsungkim | 19:6f01eb6f4163 | 180 | free(str); |
hyunsungkim | 19:6f01eb6f4163 | 181 | return -1; |
hyunsungkim | 19:6f01eb6f4163 | 182 | } |
hyunsungkim | 19:6f01eb6f4163 | 183 | } |
hyunsungkim | 19:6f01eb6f4163 | 184 | } |
hyunsungkim | 19:6f01eb6f4163 | 185 | free(str); |
hyunsungkim | 19:6f01eb6f4163 | 186 | return 0; |
hyunsungkim | 19:6f01eb6f4163 | 187 | } |
hyunsungkim | 19:6f01eb6f4163 | 188 | |
hyunsungkim | 19:6f01eb6f4163 | 189 | void dumpRFInfo() |
hyunsungkim | 19:6f01eb6f4163 | 190 | { |
hyunsungkim | 19:6f01eb6f4163 | 191 | printf( "nRF24L01+ Frequency : %d MHz\r\n", nrf.getRfFrequency() ); |
hyunsungkim | 19:6f01eb6f4163 | 192 | printf( "nRF24L01+ Output power : %d dBm\r\n", nrf.getRfOutputPower() ); |
hyunsungkim | 19:6f01eb6f4163 | 193 | printf( "nRF24L01+ Data Rate : %d kbps\r\n", nrf.getAirDataRate() ); |
hyunsungkim | 19:6f01eb6f4163 | 194 | printf( "nRF24L01+ TX Address : 0x%010llX\r\n", nrf.getTxAddress() ); |
hyunsungkim | 19:6f01eb6f4163 | 195 | printf( "nRF24L01+ RX Address : 0x%010llX\r\n", nrf.getRxAddress() ); |
hyunsungkim | 19:6f01eb6f4163 | 196 | } |
hyunsungkim | 19:6f01eb6f4163 | 197 | |
hyunsungkim | 19:6f01eb6f4163 | 198 | void initNRF(int mode, int msg_len) |
hyunsungkim | 19:6f01eb6f4163 | 199 | { |
hyunsungkim | 19:6f01eb6f4163 | 200 | #ifndef NRF_FIRST_INIT |
hyunsungkim | 19:6f01eb6f4163 | 201 | #define NRF_FIRST_INIT |
hyunsungkim | 19:6f01eb6f4163 | 202 | nrf.setTxAddress(txAddr); |
hyunsungkim | 19:6f01eb6f4163 | 203 | nrf.setRxAddress(rxAddr); |
hyunsungkim | 19:6f01eb6f4163 | 204 | nrf.powerUp(); |
hyunsungkim | 19:6f01eb6f4163 | 205 | #endif |
hyunsungkim | 19:6f01eb6f4163 | 206 | switch(mode) { |
hyunsungkim | 19:6f01eb6f4163 | 207 | case NRF_TRANSMIT: |
hyunsungkim | 19:6f01eb6f4163 | 208 | nrf.setTransferSize(msg_len); |
hyunsungkim | 19:6f01eb6f4163 | 209 | nrf.setTransmitMode(); |
hyunsungkim | 19:6f01eb6f4163 | 210 | nrf.enable(); |
hyunsungkim | 19:6f01eb6f4163 | 211 | break; |
hyunsungkim | 19:6f01eb6f4163 | 212 | case NRF_RECEIVE: |
hyunsungkim | 19:6f01eb6f4163 | 213 | nrf.setTransferSize(msg_len); |
hyunsungkim | 19:6f01eb6f4163 | 214 | nrf.setReceiveMode(); |
hyunsungkim | 19:6f01eb6f4163 | 215 | nrf.enable(); |
hyunsungkim | 19:6f01eb6f4163 | 216 | break; |
hyunsungkim | 19:6f01eb6f4163 | 217 | default: |
hyunsungkim | 19:6f01eb6f4163 | 218 | printf("Invalid NRF Mode\r\n"); |
hyunsungkim | 19:6f01eb6f4163 | 219 | } |
hyunsungkim | 19:6f01eb6f4163 | 220 | } |
hyunsungkim | 19:6f01eb6f4163 | 221 | /* |
hyunsungkim | 20:e0302dc43412 | 222 | |
hyunsungkim | 20:e0302dc43412 | 223 | $xxyyyyyabbcddn |
hyunsungkim | 19:6f01eb6f4163 | 224 | |
hyunsungkim | 19:6f01eb6f4163 | 225 | 14 chars |
hyunsungkim | 19:6f01eb6f4163 | 226 | |
hyunsungkim | 19:6f01eb6f4163 | 227 | xx: robot_id |
hyunsungkim | 19:6f01eb6f4163 | 228 | yyyyy: packet_id |
hyunsungkim | 19:6f01eb6f4163 | 229 | a: sign of lspeed |
hyunsungkim | 19:6f01eb6f4163 | 230 | bb: lspeed |
hyunsungkim | 19:6f01eb6f4163 | 231 | c: sign of rspeed |
hyunsungkim | 19:6f01eb6f4163 | 232 | dd: rspeed |
hyunsungkim | 19:6f01eb6f4163 | 233 | n: NULL 0 |
hyunsungkim | 19:6f01eb6f4163 | 234 | |
hyunsungkim | 19:6f01eb6f4163 | 235 | 0100001+30+30 |
hyunsungkim | 19:6f01eb6f4163 | 236 | */ |