http://www.rcgroups.com/forums/showthread.php?t=1995704
Use the following image to get GPS signal and supply:
NazaDecoderLib.h@2:de84f8a0a706, 2014-11-28 (annotated)
- Committer:
- garfield38
- Date:
- Fri Nov 28 17:50:46 2014 +0000
- Revision:
- 2:de84f8a0a706
- Parent:
- 1:4eadcb718c8b
Added comments
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
garfield38 | 0:b0ba4e08a18c | 1 | /* |
garfield38 | 2:de84f8a0a706 | 2 | DJI Naza (v1, v1 Lite, V2) data decoder library from Pawelsky (c) 20141109 |
garfield38 | 0:b0ba4e08a18c | 3 | Refer to naza_decoder_wiring.jpg diagram for proper connection |
garfield38 | 1:4eadcb718c8b | 4 | http://www.rcgroups.com/forums/showthread.php?t=1995704 |
garfield38 | 0:b0ba4e08a18c | 5 | |
garfield38 | 2:de84f8a0a706 | 6 | Ported to mbed by Garfield38 20141128 |
garfield38 | 2:de84f8a0a706 | 7 | |
garfield38 | 2:de84f8a0a706 | 8 | Not for commercial use |
garfield38 | 2:de84f8a0a706 | 9 | |
garfield38 | 0:b0ba4e08a18c | 10 | */ |
garfield38 | 0:b0ba4e08a18c | 11 | |
garfield38 | 0:b0ba4e08a18c | 12 | #ifndef __NAZA_DECODER_LIB_H__ |
garfield38 | 0:b0ba4e08a18c | 13 | #define __NAZA_DECODER_LIB_H__ |
garfield38 | 0:b0ba4e08a18c | 14 | |
garfield38 | 0:b0ba4e08a18c | 15 | #include "stdint.h" |
garfield38 | 0:b0ba4e08a18c | 16 | |
garfield38 | 0:b0ba4e08a18c | 17 | #define NAZA_MESSAGE_NONE 0x00 |
garfield38 | 0:b0ba4e08a18c | 18 | #define NAZA_MESSAGE_GPS 0x10 |
garfield38 | 0:b0ba4e08a18c | 19 | #define NAZA_MESSAGE_COMPASS 0x20 |
garfield38 | 0:b0ba4e08a18c | 20 | |
garfield38 | 1:4eadcb718c8b | 21 | /** Naza Decoder Class(es) |
garfield38 | 1:4eadcb718c8b | 22 | */ |
garfield38 | 0:b0ba4e08a18c | 23 | class NazaDecoderLib |
garfield38 | 0:b0ba4e08a18c | 24 | { |
garfield38 | 0:b0ba4e08a18c | 25 | public: |
garfield38 | 0:b0ba4e08a18c | 26 | typedef enum { NO_FIX = 0, FIX_2D = 2, FIX_3D = 3, FIX_DGPS = 4 } fixType_t; |
garfield38 | 0:b0ba4e08a18c | 27 | |
garfield38 | 1:4eadcb718c8b | 28 | /** Create a NazaDecoderLib object receiving serial data byte |
garfield38 | 1:4eadcb718c8b | 29 | */ |
garfield38 | 0:b0ba4e08a18c | 30 | NazaDecoderLib(); |
garfield38 | 0:b0ba4e08a18c | 31 | |
garfield38 | 1:4eadcb718c8b | 32 | uint8_t decode(uint8_t input); |
garfield38 | 1:4eadcb718c8b | 33 | void getDebug(RawSerial &s, char* buf); |
garfield38 | 1:4eadcb718c8b | 34 | /** Return the latitude GPS position |
garfield38 | 1:4eadcb718c8b | 35 | */ |
garfield38 | 0:b0ba4e08a18c | 36 | double getLat(); |
garfield38 | 1:4eadcb718c8b | 37 | /** Return the longitude GPS position |
garfield38 | 1:4eadcb718c8b | 38 | */ |
garfield38 | 0:b0ba4e08a18c | 39 | double getLon(); |
garfield38 | 1:4eadcb718c8b | 40 | /** Return the altitude GPS elevation |
garfield38 | 1:4eadcb718c8b | 41 | */ |
garfield38 | 0:b0ba4e08a18c | 42 | double getGpsAlt(); |
garfield38 | 1:4eadcb718c8b | 43 | /** Return the GPS speed |
garfield38 | 1:4eadcb718c8b | 44 | */ |
garfield38 | 0:b0ba4e08a18c | 45 | double getSpeed(); |
garfield38 | 1:4eadcb718c8b | 46 | /** Return the GPS fix mode NO_FIX = 0, 2D = 2, 3D = 3, DGPS = 4 |
garfield38 | 1:4eadcb718c8b | 47 | */ |
garfield38 | 0:b0ba4e08a18c | 48 | fixType_t getFixType(); |
garfield38 | 1:4eadcb718c8b | 49 | /** Return the GPS number of satellites |
garfield38 | 1:4eadcb718c8b | 50 | */ |
garfield38 | 0:b0ba4e08a18c | 51 | uint8_t getNumSat(); |
garfield38 | 1:4eadcb718c8b | 52 | /** heading (not tilt compensated in degrees) |
garfield38 | 1:4eadcb718c8b | 53 | */ |
garfield38 | 0:b0ba4e08a18c | 54 | double getHeadingNc(); |
garfield38 | 1:4eadcb718c8b | 55 | /** course over ground |
garfield38 | 1:4eadcb718c8b | 56 | */ |
garfield38 | 0:b0ba4e08a18c | 57 | double getCog(); |
garfield38 | 1:4eadcb718c8b | 58 | /** vertical speed indicator (from GPS) in m/s (a.k.a. climb speed) |
garfield38 | 1:4eadcb718c8b | 59 | */ |
garfield38 | 0:b0ba4e08a18c | 60 | double getGpsVsi(); |
garfield38 | 1:4eadcb718c8b | 61 | /** horizontal dilution of precision |
garfield38 | 1:4eadcb718c8b | 62 | */ |
garfield38 | 0:b0ba4e08a18c | 63 | double getHdop(); |
garfield38 | 1:4eadcb718c8b | 64 | /** vertical dilution of precision |
garfield38 | 1:4eadcb718c8b | 65 | */ |
garfield38 | 0:b0ba4e08a18c | 66 | double getVdop(); |
garfield38 | 1:4eadcb718c8b | 67 | /** Return the GPS Year time |
garfield38 | 1:4eadcb718c8b | 68 | */ |
garfield38 | 0:b0ba4e08a18c | 69 | uint8_t getYear(); |
garfield38 | 1:4eadcb718c8b | 70 | /** Return the GPS Month time |
garfield38 | 1:4eadcb718c8b | 71 | */ |
garfield38 | 0:b0ba4e08a18c | 72 | uint8_t getMonth(); |
garfield38 | 1:4eadcb718c8b | 73 | /** Return the GPS Day time |
garfield38 | 1:4eadcb718c8b | 74 | */ |
garfield38 | 0:b0ba4e08a18c | 75 | uint8_t getDay(); |
garfield38 | 1:4eadcb718c8b | 76 | /** Return the GPS Hour time |
garfield38 | 1:4eadcb718c8b | 77 | * Note that for time between 16:00 and 23:59 the hour returned from GPS module is actually 00:00 - 7:59. |
garfield38 | 1:4eadcb718c8b | 78 | */ |
garfield38 | 1:4eadcb718c8b | 79 | uint8_t getHour(); |
garfield38 | 1:4eadcb718c8b | 80 | /** Return the GPS Minute time |
garfield38 | 1:4eadcb718c8b | 81 | */ |
garfield38 | 0:b0ba4e08a18c | 82 | uint8_t getMinute(); |
garfield38 | 1:4eadcb718c8b | 83 | /** Return the GPS Second time |
garfield38 | 1:4eadcb718c8b | 84 | */ |
garfield38 | 0:b0ba4e08a18c | 85 | uint8_t getSecond(); |
garfield38 | 0:b0ba4e08a18c | 86 | |
garfield38 | 0:b0ba4e08a18c | 87 | private: |
garfield38 | 0:b0ba4e08a18c | 88 | int gpsPayload[58]; |
garfield38 | 0:b0ba4e08a18c | 89 | int seq; |
garfield38 | 1:4eadcb718c8b | 90 | int syncError; |
garfield38 | 0:b0ba4e08a18c | 91 | int cnt; |
garfield38 | 0:b0ba4e08a18c | 92 | int msgId; |
garfield38 | 0:b0ba4e08a18c | 93 | int msgLen; |
garfield38 | 0:b0ba4e08a18c | 94 | uint8_t cs1; // checksum #1 |
garfield38 | 0:b0ba4e08a18c | 95 | uint8_t cs2; // checksum #2 |
garfield38 | 0:b0ba4e08a18c | 96 | int16_t magXMin; |
garfield38 | 0:b0ba4e08a18c | 97 | int16_t magXMax; |
garfield38 | 0:b0ba4e08a18c | 98 | int16_t magYMin; |
garfield38 | 0:b0ba4e08a18c | 99 | int16_t magYMax; |
garfield38 | 0:b0ba4e08a18c | 100 | |
garfield38 | 0:b0ba4e08a18c | 101 | double lon; // longitude in degree decimal |
garfield38 | 0:b0ba4e08a18c | 102 | double lat; // latitude in degree decimal |
garfield38 | 0:b0ba4e08a18c | 103 | double gpsAlt; // altitude in m (from GPS) |
garfield38 | 0:b0ba4e08a18c | 104 | double spd; // speed in m/s |
garfield38 | 0:b0ba4e08a18c | 105 | fixType_t fix; // fix type |
garfield38 | 0:b0ba4e08a18c | 106 | uint8_t sat; // number of satellites |
garfield38 | 1:4eadcb718c8b | 107 | double headingNc;// heading (not tilt compensated in degrees) |
garfield38 | 0:b0ba4e08a18c | 108 | double cog; // course over ground |
garfield38 | 0:b0ba4e08a18c | 109 | double gpsVsi; // vertical speed indicator (from GPS) in m/s (a.k.a. climb speed) |
garfield38 | 0:b0ba4e08a18c | 110 | double hdop; // horizontal dilution of precision |
garfield38 | 0:b0ba4e08a18c | 111 | double vdop; // vertical dilution of precision |
garfield38 | 0:b0ba4e08a18c | 112 | uint8_t year; |
garfield38 | 0:b0ba4e08a18c | 113 | uint8_t month; |
garfield38 | 0:b0ba4e08a18c | 114 | uint8_t day; |
garfield38 | 0:b0ba4e08a18c | 115 | uint8_t hour; |
garfield38 | 0:b0ba4e08a18c | 116 | uint8_t minute; |
garfield38 | 0:b0ba4e08a18c | 117 | uint8_t second; |
garfield38 | 0:b0ba4e08a18c | 118 | |
garfield38 | 0:b0ba4e08a18c | 119 | int32_t decodeLong(uint8_t idx, uint8_t mask); |
garfield38 | 0:b0ba4e08a18c | 120 | int16_t decodeShort(uint8_t idx, uint8_t mask); |
garfield38 | 1:4eadcb718c8b | 121 | void updateCS(uint8_t input); |
garfield38 | 0:b0ba4e08a18c | 122 | |
garfield38 | 0:b0ba4e08a18c | 123 | }; |
garfield38 | 0:b0ba4e08a18c | 124 | |
garfield38 | 0:b0ba4e08a18c | 125 | extern NazaDecoderLib NazaDecoder; |
garfield38 | 0:b0ba4e08a18c | 126 | |
garfield38 | 0:b0ba4e08a18c | 127 | #endif // __NAZA_DECODER_LIB_H__ |