most functionality to splashdwon, find neutral and start mission. short timeouts still in code for testing, will adjust to go directly to sit_idle after splashdown
Dependencies: mbed MODSERIAL FATFileSystem
IMU/IMU.h@92:52a91656458a, 2019-05-13 (annotated)
- Committer:
- joel_ssc
- Date:
- Mon May 13 19:25:26 2019 +0000
- Revision:
- 92:52a91656458a
- Parent:
- 66:0f20870117b7
version for first flight test, timeouts not yet set correctly
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tnhnrl | 66:0f20870117b7 | 1 | #include "mbed.h" |
tnhnrl | 66:0f20870117b7 | 2 | #include "MODSERIAL.h" |
tnhnrl | 66:0f20870117b7 | 3 | |
tnhnrl | 66:0f20870117b7 | 4 | // for Microstrain's MIPS protocol, try this link, or search on microstrain.com |
tnhnrl | 66:0f20870117b7 | 5 | // http://www.microstrain.com/sites/default/files/3dm-gx5-45_dcp_manual_8500-0064_0.pdf |
tnhnrl | 66:0f20870117b7 | 6 | |
tnhnrl | 66:0f20870117b7 | 7 | #define _PI ((float) 3.14159265359) |
tnhnrl | 66:0f20870117b7 | 8 | |
tnhnrl | 66:0f20870117b7 | 9 | // state machine states |
tnhnrl | 66:0f20870117b7 | 10 | #define SYNC0 0 // first sync byte state |
tnhnrl | 66:0f20870117b7 | 11 | #define SYNC1 1 // second sync byte state |
tnhnrl | 66:0f20870117b7 | 12 | #define SET 2 // aka descriptor set |
tnhnrl | 66:0f20870117b7 | 13 | #define LEN 3 // payload length |
tnhnrl | 66:0f20870117b7 | 14 | #define PAY 4 // getting the payload data |
tnhnrl | 66:0f20870117b7 | 15 | #define CRC0 5 // crc high byte |
tnhnrl | 66:0f20870117b7 | 16 | #define CRC1 6 // crc low byte |
tnhnrl | 66:0f20870117b7 | 17 | |
tnhnrl | 66:0f20870117b7 | 18 | // data set descriptors |
tnhnrl | 66:0f20870117b7 | 19 | #define IMU_DATA_SET 0x80 |
tnhnrl | 66:0f20870117b7 | 20 | #define GNSS_DATA_SET 0x81 |
tnhnrl | 66:0f20870117b7 | 21 | |
tnhnrl | 66:0f20870117b7 | 22 | // enumerations for the Euler angle packet we care about |
tnhnrl | 66:0f20870117b7 | 23 | #define EULER_CF_LENGTH 14 |
tnhnrl | 66:0f20870117b7 | 24 | #define EULER_CF_DESCRIPTOR 0x0C |
tnhnrl | 66:0f20870117b7 | 25 | #define ROLL_OFFSET 0 |
tnhnrl | 66:0f20870117b7 | 26 | #define PITCH_OFFSET 4 |
tnhnrl | 66:0f20870117b7 | 27 | #define YAW_OFFSET 8 |
tnhnrl | 66:0f20870117b7 | 28 | |
tnhnrl | 66:0f20870117b7 | 29 | // enumerations for the lat-lon-alt packet we care about |
tnhnrl | 66:0f20870117b7 | 30 | #define LLH_POSITION_LENGTH 44 |
tnhnrl | 66:0f20870117b7 | 31 | #define LLH_POSITION_DESCRIPTOR 0x03 |
tnhnrl | 66:0f20870117b7 | 32 | #define LATITUDE_OFFSET 0 |
tnhnrl | 66:0f20870117b7 | 33 | #define LONGITUDE_OFFSET 8 |
tnhnrl | 66:0f20870117b7 | 34 | #define HEIGHT_MSL_OFFSET 16 |
tnhnrl | 66:0f20870117b7 | 35 | #define VALID_FLAG_OFFSET 40 |
tnhnrl | 66:0f20870117b7 | 36 | |
tnhnrl | 66:0f20870117b7 | 37 | // enumerations for the lat-lon-alt packet we care about |
tnhnrl | 66:0f20870117b7 | 38 | #define GNSS_FIX_INFO_LENGTH 8 |
tnhnrl | 66:0f20870117b7 | 39 | #define GNSS_FIX_INFO_DESCRIPTOR 0x0B |
tnhnrl | 66:0f20870117b7 | 40 | #define FIX_TYPE_OFFSET 0 |
tnhnrl | 66:0f20870117b7 | 41 | #define NUM_SV_OFFSET 1 |
tnhnrl | 66:0f20870117b7 | 42 | #define VALID_FLAGS_OFFSET 4 |
tnhnrl | 66:0f20870117b7 | 43 | |
tnhnrl | 66:0f20870117b7 | 44 | class IMU { |
tnhnrl | 66:0f20870117b7 | 45 | public: |
tnhnrl | 66:0f20870117b7 | 46 | IMU(PinName Tx, PinName Rx); |
tnhnrl | 66:0f20870117b7 | 47 | void initialize(); |
tnhnrl | 66:0f20870117b7 | 48 | void update(); |
tnhnrl | 66:0f20870117b7 | 49 | void start(); |
tnhnrl | 66:0f20870117b7 | 50 | void stop(); |
tnhnrl | 66:0f20870117b7 | 51 | |
tnhnrl | 66:0f20870117b7 | 52 | void runIMU(); |
tnhnrl | 66:0f20870117b7 | 53 | |
tnhnrl | 66:0f20870117b7 | 54 | float getRoll(); |
tnhnrl | 66:0f20870117b7 | 55 | float getPitch(); |
tnhnrl | 66:0f20870117b7 | 56 | float getHeading(); |
tnhnrl | 66:0f20870117b7 | 57 | |
tnhnrl | 66:0f20870117b7 | 58 | bool getIsValid2dFix(); |
tnhnrl | 66:0f20870117b7 | 59 | bool getIsValid3dFix(); |
tnhnrl | 66:0f20870117b7 | 60 | char getNumSV(); |
tnhnrl | 66:0f20870117b7 | 61 | double getLatitude(); |
tnhnrl | 66:0f20870117b7 | 62 | double getLongitude(); |
tnhnrl | 66:0f20870117b7 | 63 | double getAltitudeMSL(); |
tnhnrl | 66:0f20870117b7 | 64 | |
tnhnrl | 66:0f20870117b7 | 65 | protected: |
tnhnrl | 66:0f20870117b7 | 66 | Ticker interval; |
tnhnrl | 66:0f20870117b7 | 67 | MODSERIAL _rs232; |
tnhnrl | 66:0f20870117b7 | 68 | |
tnhnrl | 66:0f20870117b7 | 69 | char byte; |
tnhnrl | 66:0f20870117b7 | 70 | |
tnhnrl | 66:0f20870117b7 | 71 | unsigned char state, len, descriptor, i, packet[256]; |
tnhnrl | 66:0f20870117b7 | 72 | unsigned int checksum, crc0, crc1; |
tnhnrl | 66:0f20870117b7 | 73 | |
tnhnrl | 66:0f20870117b7 | 74 | /* unsigned char state, len, descriptor, i, crc0, crc1, payload[30]; |
tnhnrl | 66:0f20870117b7 | 75 | unsigned int checksum;*/ |
tnhnrl | 66:0f20870117b7 | 76 | |
tnhnrl | 66:0f20870117b7 | 77 | float euler[3]; |
tnhnrl | 66:0f20870117b7 | 78 | double latLonAlt[3]; |
tnhnrl | 66:0f20870117b7 | 79 | bool is2dFixValid; |
tnhnrl | 66:0f20870117b7 | 80 | bool is3dFixValid; |
tnhnrl | 66:0f20870117b7 | 81 | char numSV; |
tnhnrl | 66:0f20870117b7 | 82 | |
tnhnrl | 66:0f20870117b7 | 83 | void processPayload(char type, char length, unsigned char * payload); |
tnhnrl | 66:0f20870117b7 | 84 | void processEulerCfPacket(char length, unsigned char * payload); |
tnhnrl | 66:0f20870117b7 | 85 | void processLatLonAltPacket(char length, unsigned char * payload); |
tnhnrl | 66:0f20870117b7 | 86 | void processGnssFixInformation(char length, unsigned char * payload); |
tnhnrl | 66:0f20870117b7 | 87 | |
tnhnrl | 66:0f20870117b7 | 88 | unsigned int calcChecksum(unsigned char * mip_packet, char checksum_range); |
tnhnrl | 66:0f20870117b7 | 89 | |
tnhnrl | 66:0f20870117b7 | 90 | float floatFromChar(unsigned char * value); |
tnhnrl | 66:0f20870117b7 | 91 | double doubleFromChar(unsigned char * value); |
tnhnrl | 66:0f20870117b7 | 92 | }; |