DJI NAZA-M controller (remote controller side) see: https://developer.mbed.org/users/okini3939/notebook/drone/
Dependencies: NECnfc SpiOLED USBHost mbed
rf920.cpp@0:9f11e7a30865, 2016-05-19 (annotated)
- Committer:
- okini3939
- Date:
- Thu May 19 09:03:44 2016 +0000
- Revision:
- 0:9f11e7a30865
1st build;
Who changed what in which revision?
User | Revision | Line number | New 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 | } |