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