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

Dependencies:   NECnfc SpiOLED USBHost mbed

Revision:
0:9f11e7a30865
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rf920.cpp	Thu May 19 09:03:44 2016 +0000
@@ -0,0 +1,103 @@
+#include "mbed.h"
+#include "drone.h"
+#include "NECnfc.h"
+
+#define RF_CHANNEL 34
+#define RF_CHANNEL2 30
+
+NECnfc rf(p13, p14, p11, p12, NC, 38400, NECnfc::TYPE_920MHz); // tx, rx, reset, wakeup, mode
+//cts 12, rts 13
+NECnfc rf2(p9, p10, NC, 38400, NECnfc::TYPE_920MHz); // tx, rx, reset, wakeup, mode
+
+//static int air = NEC_DUMMYID;
+const static int air = 0x4b800063;
+static int seq = 1;
+
+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;
+    rf_dual &= ~2;
+
+    len --;
+    buf[len] = 0;
+    if (air != src) {
+//        air = src;
+        printf("new air %08x\r\n", air);
+    }
+//    recvRf((struct GroundData *)buf, rf.getRssi());
+    recvRf((struct GroundData *)buf, 0);
+}
+
+void isrRecv2 () {
+    char buf[NEC_MAXLENGTH + 1];
+    int i, len, dest, src;
+    uint8_t sum = 0;
+
+    len = rf2.readData(&dest, &src, buf, sizeof(buf));
+    if (len <= 0) return;
+
+    if (strncmp(buf, "Suge", 4) != NULL) return;
+    rf_dual |= 2;
+
+    for (i = 0; i < len; i ++) {
+        sum += (uint8_t)buf[i];
+    }
+    if (sum) return; // sum error
+
+    len --;
+    buf[len] = 0;
+//    recvRf((struct GroundData *)buf, rf2.getRssi());
+    recvRf((struct GroundData *)buf, 0);
+}
+
+int sendRf (struct AirData *send_data) {
+    int i;
+    uint8_t sum = 0;
+    char *buf = (char*)send_data;
+
+    memcpy(send_data->magic, "Suge", 4);
+    send_data->type = DATA_TYPE_AIR;
+    send_data->seq  = seq;
+    seq ++;
+    if (seq >= 0x10000) seq = 1;
+    send_data->flags = rf_dual;
+
+    for (i = 0; i < sizeof(struct AirData) - 1; i ++) {
+        sum += (uint8_t)buf[i];
+    }
+    send_data->sum = ~sum + 1; // two's complement
+
+    return rf.sendData(air, buf, sizeof(struct AirData));
+}
+
+void pollRf () {
+    rf.poll();
+    rf2.poll();
+}
+
+int initRf () {
+    if (rf.setRfConfig(NECnfc::PWR_MAX, RF_CHANNEL, NECnfc::BAUD_50k)) return -1;
+    rf.attach(&isrRecv);
+    printf("RF %08x\r\n", rf.getId());
+
+    if (rf2.setRfConfig(NECnfc::PWR_MAX, RF_CHANNEL2, NECnfc::BAUD_50k)) {;
+        printf("RF2 error\r\n");
+    } else {
+        rf2.attach(&isrRecv2);
+        printf("RF2 %08x\r\n", rf2.getId());
+        rf_dual |= 1;
+    }
+    return 0;
+}