DJI NAZA-M controller (multi copter side) see: https://developer.mbed.org/users/okini3939/notebook/drone/
Dependencies: FutabaSBUS NECnfc mbed
Diff: rf920.cpp
- Revision:
- 0:4a37291f07ca
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rf920.cpp Thu May 19 08:56:47 2016 +0000 @@ -0,0 +1,144 @@ +#include "mbed.h" +#include "drone.h" +#include "NECnfc.h" + +#define RF_CHANNEL 34 + +NECnfc rf(p13, p14, p15, p16, p17, 38400 * 2, NECnfc::TYPE_920MHz); // tx, rx, reset, wakeup, mode +//cts 12, rts 13 + +//static int host = NEC_DUMMYID; +const static int host = 0x4b800062; +static int seq = 1; + +RawSerial ext(p28, p27); // sub cpu +char recv_buf[NEC_MAXLENGTH + 1]; +volatile int recv_mode = 0; +int recv_len = 0, recv_count = 0; + +extern struct Status stat; +extern int rf_dual; + +void isrRecv () { + char buf[NEC_MAXLENGTH + 1]; + int i, len, dest, src; + uint8_t sum = 0; + + len = rf.readData(&dest, &src, buf, sizeof(buf)); + if (len <= 0) return; + + for (i = 0; i < len; i ++) { + sum += (uint8_t)buf[i]; + } + if (sum) return; // sum error + if (strncmp(buf, "Suge", 4) != NULL) return; + + len --; + buf[len] = 0; + if (host != src) { +// host = src; + printf("new host %08x\r\n", host); + } +// recvRf((struct AirData *)buf, rf.getRssi()); + recvRf((struct AirData *)buf, 0); +} + +int sendRf (struct GroundData *send_data) { + int i; + uint8_t sum = 0; + char *buf = (char*)send_data; + + memcpy(send_data->magic, "Suge", 4); + send_data->type = DATA_TYPE_GROUND; + send_data->seq = seq; + seq ++; + if (seq >= 0x10000) seq = 1; + + for (i = 0; i < sizeof(struct GroundData) - 1; i ++) { + sum += (uint8_t)buf[i]; + } + send_data->sum = ~sum + 1; // two's complement + + if (rf_dual == 3) { + // sub rf + ext.putc(0x0f); + ext.putc(0x5a); + ext.putc(sizeof(struct GroundData)); + ext.putc(~sizeof(struct GroundData)); + for (i = 0; i < sizeof(struct GroundData); i ++) { + ext.putc(buf[i]); + } + return 0; + } else { + // main rf + return rf.sendData(host, buf, sizeof(struct GroundData)); + } +} + +// sub cpu +void isrExt () { + char c; + c = ext.getc(); + + switch (recv_mode) { + case 0: + if (c == 0x0f) { + recv_mode ++; + } + break; + case 1: + if (c == 0x5a) { + recv_mode ++; + } else { + if (c == 0x0f) break; + recv_mode = 0; + } + break; + case 2: + recv_len = c; + recv_mode ++; + break; + case 3: + if (recv_len == (~c & 0xff) && recv_len <= sizeof(recv_buf)) { + recv_count = 0; + recv_mode ++; + } else { + recv_mode = 0; + } + break; + case 4: + recv_buf[recv_count] = c; + recv_count ++; + if (recv_count >= recv_len || recv_count >= sizeof(recv_buf)) { + recv_mode ++; + } + break; + } +} + +void pollRf () { + rf.poll(); + + if (recv_mode >= 5) { + // sub rf, distance + recv_mode = 0; + int *distance = (int*)&recv_buf; + stat.distance1 = distance[0]; + stat.distance2 = distance[1]; + + if (!(rf_dual & 2)) { + ext.printf("\x0f\x5a\x04\xfbSuge"); + } + } +} + +int initRf () { + ext.baud(115200); + ext.attach(isrExt); + + if (rf.setRfConfig(NECnfc::PWR_MAX, RF_CHANNEL, NECnfc::BAUD_50k)) return -1; + rf.attach(&isrRecv); + printf("RF %08x\r\n", rf.getId()); + + return 0; +}