현성 김 / Mbed 2 deprecated 181202_Castone_design_master

Dependencies:   mbed nRF24L01P

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?

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