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

Dependencies:   FutabaSBUS NECnfc mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers rf920.cpp Source File

rf920.cpp

00001 #include "mbed.h"
00002 #include "drone.h"
00003 #include "NECnfc.h"
00004 
00005 #define RF_CHANNEL 34
00006 
00007 NECnfc rf(p13, p14, p15, p16, p17, 38400 * 2, NECnfc::TYPE_920MHz); // tx, rx, reset, wakeup, mode
00008 //cts 12, rts 13
00009 
00010 //static int host = NEC_DUMMYID;
00011 const static int host = 0x4b800062;
00012 static int seq = 1;
00013 
00014 RawSerial ext(p28, p27); // sub cpu
00015 char recv_buf[NEC_MAXLENGTH + 1];
00016 volatile int recv_mode = 0;
00017 int recv_len = 0, recv_count = 0;
00018 
00019 extern struct Status stat;
00020 extern int rf_dual;
00021 
00022 void isrRecv () {
00023     char buf[NEC_MAXLENGTH + 1];
00024     int i, len, dest, src;
00025     uint8_t sum = 0;
00026 
00027     len = rf.readData(&dest, &src, buf, sizeof(buf));
00028     if (len <= 0) return;
00029 
00030     for (i = 0; i < len; i ++) {
00031         sum += (uint8_t)buf[i];
00032     }
00033     if (sum) return; // sum error
00034     if (strncmp(buf, "Suge", 4) != NULL) return;
00035 
00036     len --;
00037     buf[len] = 0;
00038     if (host != src) {
00039 //        host = src;
00040         printf("new host %08x\r\n", host);
00041     }
00042 //    recvRf((struct AirData *)buf, rf.getRssi());
00043     recvRf((struct AirData *)buf, 0);
00044 }
00045 
00046 int sendRf (struct GroundData *send_data) {
00047     int i;
00048     uint8_t sum = 0;
00049     char *buf = (char*)send_data;
00050 
00051     memcpy(send_data->magic, "Suge", 4);
00052     send_data->type = DATA_TYPE_GROUND;
00053     send_data->seq  = seq;
00054     seq ++;
00055     if (seq >= 0x10000) seq = 1;
00056 
00057     for (i = 0; i < sizeof(struct GroundData) - 1; i ++) {
00058         sum += (uint8_t)buf[i];
00059     }
00060     send_data->sum = ~sum + 1; // two's complement
00061 
00062     if (rf_dual == 3) {
00063         // sub rf
00064         ext.putc(0x0f);
00065         ext.putc(0x5a);
00066         ext.putc(sizeof(struct GroundData));
00067         ext.putc(~sizeof(struct GroundData));
00068         for (i = 0; i < sizeof(struct GroundData); i ++) {
00069             ext.putc(buf[i]);
00070         }
00071         return 0;
00072     } else {
00073         // main rf
00074         return rf.sendData(host, buf, sizeof(struct GroundData));
00075     }
00076 }
00077 
00078 // sub cpu
00079 void isrExt () {
00080     char c;
00081     c = ext.getc();
00082 
00083     switch (recv_mode) {
00084     case 0:
00085         if (c == 0x0f) {
00086             recv_mode ++;
00087         }
00088         break;
00089     case 1:
00090         if (c == 0x5a) {
00091             recv_mode ++;
00092         } else {
00093             if (c == 0x0f) break;
00094             recv_mode = 0;
00095         }
00096         break;
00097     case 2:
00098         recv_len = c;
00099         recv_mode ++;
00100         break;
00101     case 3:
00102         if (recv_len == (~c & 0xff) && recv_len <= sizeof(recv_buf)) {
00103             recv_count = 0;
00104             recv_mode ++;
00105         } else {
00106             recv_mode = 0;
00107         }
00108         break;
00109     case 4:
00110         recv_buf[recv_count] = c;
00111         recv_count ++;
00112         if (recv_count >= recv_len || recv_count >= sizeof(recv_buf)) {
00113             recv_mode ++;
00114         }
00115         break;
00116     }
00117 }
00118 
00119 void pollRf () {
00120     rf.poll();
00121 
00122     if (recv_mode >= 5) {
00123         // sub rf, distance
00124         recv_mode = 0;
00125         int *distance = (int*)&recv_buf;
00126         stat.distance1 = distance[0];
00127         stat.distance2 = distance[1];
00128 
00129         if (!(rf_dual & 2)) {
00130             ext.printf("\x0f\x5a\x04\xfbSuge");
00131         }
00132     }
00133 }
00134 
00135 int initRf () {
00136     ext.baud(115200);
00137     ext.attach(isrExt);
00138 
00139     if (rf.setRfConfig(NECnfc::PWR_MAX, RF_CHANNEL, NECnfc::BAUD_50k)) return -1;
00140     rf.attach(&isrRecv);
00141     printf("RF %08x\r\n", rf.getId());
00142 
00143     return 0;
00144 }