DJI NAZA-M controller (multi copter side) see: https://developer.mbed.org/users/okini3939/notebook/drone/
Dependencies: FutabaSBUS NECnfc mbed
rf920.cpp
- Committer:
- okini3939
- Date:
- 2016-05-19
- Revision:
- 1:32cd1cf5d5b1
- Parent:
- 0:4a37291f07ca
File content as of revision 1:32cd1cf5d5b1:
#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; }