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

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