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
Diff: IMU/IMU.h
- Revision:
- 10:085ab7328054
- Parent:
- 9:d5fcdcb3c89d
- Child:
- 11:3b241ecb75ed
--- a/IMU/IMU.h Fri Oct 20 11:41:22 2017 +0000 +++ b/IMU/IMU.h Mon Oct 23 12:50:53 2017 +0000 @@ -3,34 +3,80 @@ #define _PI ((float) 3.14159265359) -class IMU{ +// state machine states +#define SYNC0 0 // first sync byte state +#define SYNC1 1 // second sync byte state +#define SET 2 // aka descriptor set +#define LEN 3 // payload length +#define PAY 4 // getting the payload data +#define CRC0 5 // crc high byte +#define CRC1 6 // crc low byte + +// data set descriptors +#define IMU_DATA_SET 0x08 +#define GNSS_DATA_SET 0x81 + +// enumerations for the Euler angle packet we care about +#define EULER_CF_LENGTH 14 +#define EULER_CF_DESCRIPTOR 0x0C +#define ROLL_OFFSET 0 +#define PITCH_OFFSET 4 +#define YAW_OFFSET 8 + +// enumerations for the lat-lon-alt packet we care about +#define LLH_POSITION_LENGTH 44 +#define LLH_POSITION_DESCRIPTOR 0x03 +#define LATITUDE_OFFSET 0 +#define LONGITUDE_OFFSET 8 +#define HEIGHT_MSL_OFFSET 16 +#define VALID_FLAG_OFFSET 40 + +// enumerations for the lat-lon-alt packet we care about +#define GNSS_FIX_INFO_LENGTH 8 +#define GNSS_FIX_INFO_DESCRIPTOR 0x0B +#define FIX_TYPE_OFFSET 0 +#define NUM_SV_OFFSET 1 +#define VALID_FLAGS_OFFSET 4 + +class IMU { public: - IMU(); + IMU(PinName Tx, PinName Rx); void initialize(); void update(); void start(); void stop(); + + float getRoll(); + float getPitch(); + float getHeading(); + bool getIsValid2dFix(); + bool getIsValid3dFix(); + char getNumSV(); + double getLatitude(); + double getLongitude(); + double getAltitudeMSL(); + protected: Ticker interval; MODSERIAL _rs232; - unsigned char SYNC1; // First sync byte will always be 'u' (0x75) - unsigned char SYNC2; // Second sync byte will always be 'e' (0x65) - unsigned char descripter_set; // Descriptor set byte for AHRS (0x80) - int payload_length; // Payload length byte for CF Euler Angles (0x0E) - int field_length; // Field length byte for CF Euler Angles (0x0E) - unsigned char data_descriptor; // Data descriptor byte for CF Euler Angles (0x0C) - unsigned char data[30]; // Data sent CF euler angles rpy [radians] - int data_offset; // Binary offset - int roll_offset; // Binary offset - int pitch_offset; // Binary offset - int yaw_offset; // Binary offset - float euler[3]; + + char byte; + unsigned char state, len, descriptor, i, crc0, crc1, payload[30], checksum; - int i; // set packet_length based on field_length (convert from hex to int) - unsigned char current; - unsigned char last; - - float float_from_char(unsigned char * value); -}; + float euler[3]; + double latLonAlt[3]; + bool is2dFixValid; + bool is3dFixValid; + char numSV; + void processPacket(char type, char length, unsigned char * data); + void processEulerCfPacket(char length, unsigned char * data); + void processLatLonAltPacket(char length, unsigned char * data); + void processGnssFixInformation(char length, unsigned char * data); + + unsigned int calcChecksum(unsigned char * mip_packet, char checksum_range); + + float floatFromChar(unsigned char * value); + double doubleFromChar(unsigned char * value); +}; \ No newline at end of file