DJI NAZA-M controller (multi copter side) see: https://developer.mbed.org/users/okini3939/notebook/drone/

Dependencies:   FutabaSBUS NECnfc mbed

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;
+}