현성 김 / Mbed 2 deprecated 181202_Castone_design_master

Dependencies:   mbed nRF24L01P

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?

UserRevisionLine numberNew 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 */