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

Dependencies:   NECnfc SpiOLED USBHost mbed

Committer:
okini3939
Date:
Thu May 19 09:03:44 2016 +0000
Revision:
0:9f11e7a30865
1st build;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:9f11e7a30865 1 #include "mbed.h"
okini3939 0:9f11e7a30865 2 #include "drone.h"
okini3939 0:9f11e7a30865 3 #include "NECnfc.h"
okini3939 0:9f11e7a30865 4
okini3939 0:9f11e7a30865 5 #define RF_CHANNEL 34
okini3939 0:9f11e7a30865 6 #define RF_CHANNEL2 30
okini3939 0:9f11e7a30865 7
okini3939 0:9f11e7a30865 8 NECnfc rf(p13, p14, p11, p12, NC, 38400, NECnfc::TYPE_920MHz); // tx, rx, reset, wakeup, mode
okini3939 0:9f11e7a30865 9 //cts 12, rts 13
okini3939 0:9f11e7a30865 10 NECnfc rf2(p9, p10, NC, 38400, NECnfc::TYPE_920MHz); // tx, rx, reset, wakeup, mode
okini3939 0:9f11e7a30865 11
okini3939 0:9f11e7a30865 12 //static int air = NEC_DUMMYID;
okini3939 0:9f11e7a30865 13 const static int air = 0x4b800063;
okini3939 0:9f11e7a30865 14 static int seq = 1;
okini3939 0:9f11e7a30865 15
okini3939 0:9f11e7a30865 16 extern int rf_dual;
okini3939 0:9f11e7a30865 17
okini3939 0:9f11e7a30865 18 void isrRecv () {
okini3939 0:9f11e7a30865 19 char buf[NEC_MAXLENGTH + 1];
okini3939 0:9f11e7a30865 20 int i, len, dest, src;
okini3939 0:9f11e7a30865 21 uint8_t sum = 0;
okini3939 0:9f11e7a30865 22
okini3939 0:9f11e7a30865 23 len = rf.readData(&dest, &src, buf, sizeof(buf));
okini3939 0:9f11e7a30865 24 if (len <= 0) return;
okini3939 0:9f11e7a30865 25
okini3939 0:9f11e7a30865 26 for (i = 0; i < len; i ++) {
okini3939 0:9f11e7a30865 27 sum += (uint8_t)buf[i];
okini3939 0:9f11e7a30865 28 }
okini3939 0:9f11e7a30865 29 if (sum) return; // sum error
okini3939 0:9f11e7a30865 30 if (strncmp(buf, "Suge", 4) != NULL) return;
okini3939 0:9f11e7a30865 31 rf_dual &= ~2;
okini3939 0:9f11e7a30865 32
okini3939 0:9f11e7a30865 33 len --;
okini3939 0:9f11e7a30865 34 buf[len] = 0;
okini3939 0:9f11e7a30865 35 if (air != src) {
okini3939 0:9f11e7a30865 36 // air = src;
okini3939 0:9f11e7a30865 37 printf("new air %08x\r\n", air);
okini3939 0:9f11e7a30865 38 }
okini3939 0:9f11e7a30865 39 // recvRf((struct GroundData *)buf, rf.getRssi());
okini3939 0:9f11e7a30865 40 recvRf((struct GroundData *)buf, 0);
okini3939 0:9f11e7a30865 41 }
okini3939 0:9f11e7a30865 42
okini3939 0:9f11e7a30865 43 void isrRecv2 () {
okini3939 0:9f11e7a30865 44 char buf[NEC_MAXLENGTH + 1];
okini3939 0:9f11e7a30865 45 int i, len, dest, src;
okini3939 0:9f11e7a30865 46 uint8_t sum = 0;
okini3939 0:9f11e7a30865 47
okini3939 0:9f11e7a30865 48 len = rf2.readData(&dest, &src, buf, sizeof(buf));
okini3939 0:9f11e7a30865 49 if (len <= 0) return;
okini3939 0:9f11e7a30865 50
okini3939 0:9f11e7a30865 51 if (strncmp(buf, "Suge", 4) != NULL) return;
okini3939 0:9f11e7a30865 52 rf_dual |= 2;
okini3939 0:9f11e7a30865 53
okini3939 0:9f11e7a30865 54 for (i = 0; i < len; i ++) {
okini3939 0:9f11e7a30865 55 sum += (uint8_t)buf[i];
okini3939 0:9f11e7a30865 56 }
okini3939 0:9f11e7a30865 57 if (sum) return; // sum error
okini3939 0:9f11e7a30865 58
okini3939 0:9f11e7a30865 59 len --;
okini3939 0:9f11e7a30865 60 buf[len] = 0;
okini3939 0:9f11e7a30865 61 // recvRf((struct GroundData *)buf, rf2.getRssi());
okini3939 0:9f11e7a30865 62 recvRf((struct GroundData *)buf, 0);
okini3939 0:9f11e7a30865 63 }
okini3939 0:9f11e7a30865 64
okini3939 0:9f11e7a30865 65 int sendRf (struct AirData *send_data) {
okini3939 0:9f11e7a30865 66 int i;
okini3939 0:9f11e7a30865 67 uint8_t sum = 0;
okini3939 0:9f11e7a30865 68 char *buf = (char*)send_data;
okini3939 0:9f11e7a30865 69
okini3939 0:9f11e7a30865 70 memcpy(send_data->magic, "Suge", 4);
okini3939 0:9f11e7a30865 71 send_data->type = DATA_TYPE_AIR;
okini3939 0:9f11e7a30865 72 send_data->seq = seq;
okini3939 0:9f11e7a30865 73 seq ++;
okini3939 0:9f11e7a30865 74 if (seq >= 0x10000) seq = 1;
okini3939 0:9f11e7a30865 75 send_data->flags = rf_dual;
okini3939 0:9f11e7a30865 76
okini3939 0:9f11e7a30865 77 for (i = 0; i < sizeof(struct AirData) - 1; i ++) {
okini3939 0:9f11e7a30865 78 sum += (uint8_t)buf[i];
okini3939 0:9f11e7a30865 79 }
okini3939 0:9f11e7a30865 80 send_data->sum = ~sum + 1; // two's complement
okini3939 0:9f11e7a30865 81
okini3939 0:9f11e7a30865 82 return rf.sendData(air, buf, sizeof(struct AirData));
okini3939 0:9f11e7a30865 83 }
okini3939 0:9f11e7a30865 84
okini3939 0:9f11e7a30865 85 void pollRf () {
okini3939 0:9f11e7a30865 86 rf.poll();
okini3939 0:9f11e7a30865 87 rf2.poll();
okini3939 0:9f11e7a30865 88 }
okini3939 0:9f11e7a30865 89
okini3939 0:9f11e7a30865 90 int initRf () {
okini3939 0:9f11e7a30865 91 if (rf.setRfConfig(NECnfc::PWR_MAX, RF_CHANNEL, NECnfc::BAUD_50k)) return -1;
okini3939 0:9f11e7a30865 92 rf.attach(&isrRecv);
okini3939 0:9f11e7a30865 93 printf("RF %08x\r\n", rf.getId());
okini3939 0:9f11e7a30865 94
okini3939 0:9f11e7a30865 95 if (rf2.setRfConfig(NECnfc::PWR_MAX, RF_CHANNEL2, NECnfc::BAUD_50k)) {;
okini3939 0:9f11e7a30865 96 printf("RF2 error\r\n");
okini3939 0:9f11e7a30865 97 } else {
okini3939 0:9f11e7a30865 98 rf2.attach(&isrRecv2);
okini3939 0:9f11e7a30865 99 printf("RF2 %08x\r\n", rf2.getId());
okini3939 0:9f11e7a30865 100 rf_dual |= 1;
okini3939 0:9f11e7a30865 101 }
okini3939 0:9f11e7a30865 102 return 0;
okini3939 0:9f11e7a30865 103 }