Prints signals from UM6 orientation sensor (CH Robotics) and GPS receiver, using MODSerial and MODgps. GPS causes UM6 signals to freeze on a fixed value, which timer and gps continue to print out.

Dependencies:   MODGPS MODSERIAL mbed

Committer:
njewin
Date:
Mon Jul 08 18:22:43 2013 +0000
Revision:
0:b9c0180d446f
prints um6 and gps signals to pc

Who changed what in which revision?

UserRevisionLine numberNew contents of line
njewin 0:b9c0180d446f 1 /* ------------------------------------------------------------------------------
njewin 0:b9c0180d446f 2 File: UM6_config.h
njewin 0:b9c0180d446f 3 Author: CH Robotics, edited by LHiggs, & Nathan Ewin
njewin 0:b9c0180d446f 4 Version: 1.0
njewin 0:b9c0180d446f 5
njewin 0:b9c0180d446f 6 Description: Preprocessor definitions and function declarations for UM6 configuration
njewin 0:b9c0180d446f 7
njewin 0:b9c0180d446f 8 // added configuration for GPS signals from LS20031 sensor connected to UM6
njewin 0:b9c0180d446f 9 // GPS ground speed and heading angle setup outputs data
njewin 0:b9c0180d446f 10 // GPS latitude and longitude not setup correctly
njewin 0:b9c0180d446f 11 ------------------------------------------------------------------------------ */
njewin 0:b9c0180d446f 12 #ifndef __UM6_CONFIG_H
njewin 0:b9c0180d446f 13 #define __UM6_CONFIG_H
njewin 0:b9c0180d446f 14
njewin 0:b9c0180d446f 15 #include "UM6_usart.h"
njewin 0:b9c0180d446f 16
njewin 0:b9c0180d446f 17
njewin 0:b9c0180d446f 18
njewin 0:b9c0180d446f 19 MODSERIAL um6_uart(p13, p14); // UM6 SERIAL OVER UART PINS 26 & 25
njewin 0:b9c0180d446f 20
njewin 0:b9c0180d446f 21
njewin 0:b9c0180d446f 22
njewin 0:b9c0180d446f 23
njewin 0:b9c0180d446f 24
njewin 0:b9c0180d446f 25
njewin 0:b9c0180d446f 26
njewin 0:b9c0180d446f 27
njewin 0:b9c0180d446f 28 // CONFIG_ARRAY_SIZE and DATA_ARRAY_SIZE specify the number of 32 bit configuration and data registers used by the firmware
njewin 0:b9c0180d446f 29 // (Note: The term "register" is used loosely here. These "registers" are not actually registers in the same sense of a
njewin 0:b9c0180d446f 30 // microcontroller register. They are simply index locations into arrays stored in global memory. Data and configuration
njewin 0:b9c0180d446f 31 // parameters are stored in arrays because it allows a common communication protocol to be used to access all data and
njewin 0:b9c0180d446f 32 // configuration. The software communicating with the sensor needs only specify the register address, and the communication
njewin 0:b9c0180d446f 33 // software running on the sensor knows exactly where to find it - it needn't know what the data is. The software communicatin
njewin 0:b9c0180d446f 34 // with the sensor, on the other hand, needs to know what it is asking for (naturally...)
njewin 0:b9c0180d446f 35 // This setup makes it easy to make more data immediately available when needed - simply increase the array size, add code in
njewin 0:b9c0180d446f 36 // the firmware that writes data to the new array location, and then make updates to the firmware definition on the PC side.
njewin 0:b9c0180d446f 37 #define CONFIG_ARRAY_SIZE 44
njewin 0:b9c0180d446f 38 #define DATA_ARRAY_SIZE 13
njewin 0:b9c0180d446f 39 #define COMMAND_COUNT 9
njewin 0:b9c0180d446f 40
njewin 0:b9c0180d446f 41 // original data array size 32
njewin 0:b9c0180d446f 42 //
njewin 0:b9c0180d446f 43 #define CONFIG_REG_START_ADDRESS 0
njewin 0:b9c0180d446f 44 #define DATA_REG_START_ADDRESS 85
njewin 0:b9c0180d446f 45 #define COMMAND_START_ADDRESS 170
njewin 0:b9c0180d446f 46
njewin 0:b9c0180d446f 47 // hex 0x55 = dec 85
njewin 0:b9c0180d446f 48 // hex 0xAA = dec 170
njewin 0:b9c0180d446f 49 // These preprocessor definitions make it easier to access specific configuration parameters in code
njewin 0:b9c0180d446f 50 // They specify array locations associated with each register name. Note that in the comments below, many of the values are
njewin 0:b9c0180d446f 51 // said to be 32-bit IEEE floating point. Obviously this isn't directly the case, since the arrays are actually 32-bit unsigned
njewin 0:b9c0180d446f 52 // integer arrays. Bit for bit, the data does correspond to the correct floating point value. Since you can't cast ints as floats,
njewin 0:b9c0180d446f 53 // special conversion has to happen to copy the float data to and from the array.
njewin 0:b9c0180d446f 54 // Starting with configuration register locations...
njewin 0:b9c0180d446f 55
njewin 0:b9c0180d446f 56
njewin 0:b9c0180d446f 57 // Now for data register locations.
njewin 0:b9c0180d446f 58 // In the communication protocol, data registers are labeled with number ranging from 128 to 255.
njewin 0:b9c0180d446f 59 // The value of 128 will be subtracted from these numbers
njewin 0:b9c0180d446f 60 // to produce the actual array index labeled below
njewin 0:b9c0180d446f 61 #define UM6_STATUS DATA_REG_START_ADDRESS // Status register defines error codes with individual bits
njewin 0:b9c0180d446f 62 #define UM6_GYRO_RAW_XY (DATA_REG_START_ADDRESS + 1) // Raw gyro data is stored in 16-bit signed integers
njewin 0:b9c0180d446f 63 #define UM6_GYRO_RAW_Z (DATA_REG_START_ADDRESS + 2)
njewin 0:b9c0180d446f 64 #define UM6_ACCEL_RAW_XY (DATA_REG_START_ADDRESS + 3) // Raw accel data is stored in 16-bit signed integers
njewin 0:b9c0180d446f 65 #define UM6_ACCEL_RAW_Z (DATA_REG_START_ADDRESS + 4)
njewin 0:b9c0180d446f 66 //#define UM6_MAG_RAW_XY (DATA_REG_START_ADDRESS + 5) // Raw mag data is stored in 16-bit signed integers
njewin 0:b9c0180d446f 67 //#define UM6_MAG_RAW_Z (DATA_REG_START_ADDRESS + 6)
njewin 0:b9c0180d446f 68 #define UM6_GYRO_PROC_XY (DATA_REG_START_ADDRESS + 7) // Processed gyro data has scale factors applied and alignment correction performed. Data is 16-bit signed integer.
njewin 0:b9c0180d446f 69 #define UM6_GYRO_PROC_Z (DATA_REG_START_ADDRESS + 8)
njewin 0:b9c0180d446f 70 #define UM6_ACCEL_PROC_XY (DATA_REG_START_ADDRESS + 9) // Processed accel data has scale factors applied and alignment correction performed. Data is 16-bit signed integer.
njewin 0:b9c0180d446f 71 #define UM6_ACCEL_PROC_Z (DATA_REG_START_ADDRESS + 10)
njewin 0:b9c0180d446f 72 //#define UM6_MAG_PROC_XY (DATA_REG_START_ADDRESS + 11) // Processed mag data has scale factors applied and alignment correction performed. Data is 16-bit signed integer.
njewin 0:b9c0180d446f 73 //#define UM6_MAG_PROC_Z (DATA_REG_START_ADDRESS + 12)
njewin 0:b9c0180d446f 74 #define UM6_EULER_PHI_THETA (DATA_REG_START_ADDRESS + 13) // Euler angles are 32-bit IEEE floating point
njewin 0:b9c0180d446f 75 #define UM6_EULER_PSI (DATA_REG_START_ADDRESS + 14)
njewin 0:b9c0180d446f 76 #define UM6_QUAT_AB (DATA_REG_START_ADDRESS + 15) // Quaternions are 16-bit signed integers.
njewin 0:b9c0180d446f 77 #define UM6_QUAT_CD (DATA_REG_START_ADDRESS + 16)
njewin 0:b9c0180d446f 78 /*
njewin 0:b9c0180d446f 79 #define UM6_ERROR_COV_00 (DATA_REG_START_ADDRESS + 17) // Error covariance is a 4x4 matrix of 32-bit IEEE floating point values
njewin 0:b9c0180d446f 80 #define UM6_ERROR_COV_01 (DATA_REG_START_ADDRESS + 18)
njewin 0:b9c0180d446f 81 #define UM6_ERROR_COV_02 (DATA_REG_START_ADDRESS + 19)
njewin 0:b9c0180d446f 82 #define UM6_ERROR_COV_03 (DATA_REG_START_ADDRESS + 20)
njewin 0:b9c0180d446f 83 #define UM6_ERROR_COV_10 (DATA_REG_START_ADDRESS + 21)
njewin 0:b9c0180d446f 84 #define UM6_ERROR_COV_11 (DATA_REG_START_ADDRESS + 22)
njewin 0:b9c0180d446f 85 #define UM6_ERROR_COV_12 (DATA_REG_START_ADDRESS + 23)
njewin 0:b9c0180d446f 86 #define UM6_ERROR_COV_13 (DATA_REG_START_ADDRESS + 24)
njewin 0:b9c0180d446f 87 #define UM6_ERROR_COV_20 (DATA_REG_START_ADDRESS + 25)
njewin 0:b9c0180d446f 88 #define UM6_ERROR_COV_21 (DATA_REG_START_ADDRESS + 26)
njewin 0:b9c0180d446f 89 #define UM6_ERROR_COV_22 (DATA_REG_START_ADDRESS + 27)
njewin 0:b9c0180d446f 90 #define UM6_ERROR_COV_23 (DATA_REG_START_ADDRESS + 28)
njewin 0:b9c0180d446f 91 #define UM6_ERROR_COV_30 (DATA_REG_START_ADDRESS + 29)
njewin 0:b9c0180d446f 92 #define UM6_ERROR_COV_31 (DATA_REG_START_ADDRESS + 30)
njewin 0:b9c0180d446f 93 #define UM6_ERROR_COV_32 (DATA_REG_START_ADDRESS + 31)
njewin 0:b9c0180d446f 94 #define UM6_ERROR_COV_33 (DATA_REG_START_ADDRESS + 32)
njewin 0:b9c0180d446f 95 */
njewin 0:b9c0180d446f 96 // connected gps module directing to mbed using MODGPS
njewin 0:b9c0180d446f 97 //#define UM6_GPS_LONGITUDE (DATA_REG_START_ADDRESS + 34)
njewin 0:b9c0180d446f 98 //#define UM6_GPS_LATITUDE (DATA_REG_START_ADDRESS + 35)
njewin 0:b9c0180d446f 99 //#define UM6_GPS_ALTITUDE (DATA_REG_START_ADDRESS + 36)
njewin 0:b9c0180d446f 100 //#define UM6_GPS_COURSE_SPEED (DATA_REG_START_ADDRESS + 40)
njewin 0:b9c0180d446f 101
njewin 0:b9c0180d446f 102
njewin 0:b9c0180d446f 103
njewin 0:b9c0180d446f 104
njewin 0:b9c0180d446f 105
njewin 0:b9c0180d446f 106
njewin 0:b9c0180d446f 107
njewin 0:b9c0180d446f 108 /*******************************************************************************
njewin 0:b9c0180d446f 109 * Function Name : ComputeChecksum
njewin 0:b9c0180d446f 110 * Input : USARTPacket* new_packet
njewin 0:b9c0180d446f 111 * Output : None
njewin 0:b9c0180d446f 112 * Return : uint16_t
njewin 0:b9c0180d446f 113 * Description : Returns the two byte sum of all the individual bytes in the
njewin 0:b9c0180d446f 114 given packet.
njewin 0:b9c0180d446f 115 *******************************************************************************/
njewin 0:b9c0180d446f 116 uint16_t ComputeChecksum( USARTPacket* new_packet ) {
njewin 0:b9c0180d446f 117 int32_t index;
njewin 0:b9c0180d446f 118 uint16_t checksum = 0x73 + 0x6E + 0x70 + new_packet->PT + new_packet->address;
njewin 0:b9c0180d446f 119
njewin 0:b9c0180d446f 120 for ( index = 0; index < new_packet->data_length; index++ ) {
njewin 0:b9c0180d446f 121 checksum += new_packet->packet_data[index];
njewin 0:b9c0180d446f 122 }
njewin 0:b9c0180d446f 123 return checksum;
njewin 0:b9c0180d446f 124 }
njewin 0:b9c0180d446f 125
njewin 0:b9c0180d446f 126
njewin 0:b9c0180d446f 127
njewin 0:b9c0180d446f 128
njewin 0:b9c0180d446f 129
njewin 0:b9c0180d446f 130 static USARTPacket new_packet;
njewin 0:b9c0180d446f 131
njewin 0:b9c0180d446f 132 // Flag for storing the current USART state
njewin 0:b9c0180d446f 133 uint8_t gUSART_State = USART_STATE_WAIT;
njewin 0:b9c0180d446f 134
njewin 0:b9c0180d446f 135
njewin 0:b9c0180d446f 136 struct UM6{
njewin 0:b9c0180d446f 137 float Gyro_Proc_X;
njewin 0:b9c0180d446f 138 float Gyro_Proc_Y;
njewin 0:b9c0180d446f 139 float Gyro_Proc_Z;
njewin 0:b9c0180d446f 140 float Accel_Proc_X;
njewin 0:b9c0180d446f 141 float Accel_Proc_Y;
njewin 0:b9c0180d446f 142 float Accel_Proc_Z;
njewin 0:b9c0180d446f 143 //float Mag_Proc_X;
njewin 0:b9c0180d446f 144 //float Mag_Proc_Y;
njewin 0:b9c0180d446f 145 //float Mag_Proc_Z;
njewin 0:b9c0180d446f 146 float Roll;
njewin 0:b9c0180d446f 147 float Pitch;
njewin 0:b9c0180d446f 148 float Yaw;
njewin 0:b9c0180d446f 149 //float GPS_long;
njewin 0:b9c0180d446f 150 //float GPS_lat;
njewin 0:b9c0180d446f 151 //float GPS_alt;
njewin 0:b9c0180d446f 152 //float GPS_course;
njewin 0:b9c0180d446f 153 //float GPS_speed;
njewin 0:b9c0180d446f 154
njewin 0:b9c0180d446f 155 };
njewin 0:b9c0180d446f 156 UM6 data;
njewin 0:b9c0180d446f 157
njewin 0:b9c0180d446f 158
njewin 0:b9c0180d446f 159
njewin 0:b9c0180d446f 160
njewin 0:b9c0180d446f 161 void Process_um6_packet() {
njewin 0:b9c0180d446f 162
njewin 0:b9c0180d446f 163 int16_t MY_DATA_GYRO_PROC_X;
njewin 0:b9c0180d446f 164 int16_t MY_DATA_GYRO_PROC_Y;
njewin 0:b9c0180d446f 165 int16_t MY_DATA_GYRO_PROC_Z;
njewin 0:b9c0180d446f 166 int16_t MY_DATA_ACCEL_PROC_X;
njewin 0:b9c0180d446f 167 int16_t MY_DATA_ACCEL_PROC_Y;
njewin 0:b9c0180d446f 168 int16_t MY_DATA_ACCEL_PROC_Z;
njewin 0:b9c0180d446f 169 //int16_t MY_DATA_MAG_PROC_X;
njewin 0:b9c0180d446f 170 //int16_t MY_DATA_MAG_PROC_Y;
njewin 0:b9c0180d446f 171 //int16_t MY_DATA_MAG_PROC_Z;
njewin 0:b9c0180d446f 172 int16_t MY_DATA_EULER_PHI;
njewin 0:b9c0180d446f 173 int16_t MY_DATA_EULER_THETA;
njewin 0:b9c0180d446f 174 int16_t MY_DATA_EULER_PSI;
njewin 0:b9c0180d446f 175 /*
njewin 0:b9c0180d446f 176 int32_t MY_DATA_GPS_LONG;
njewin 0:b9c0180d446f 177 int32_t MY_DATA_GPS_LONG0;
njewin 0:b9c0180d446f 178 int32_t MY_DATA_GPS_LONG1;
njewin 0:b9c0180d446f 179 int32_t MY_DATA_GPS_LONG2;
njewin 0:b9c0180d446f 180 int32_t MY_DATA_GPS_LAT;
njewin 0:b9c0180d446f 181 int32_t MY_DATA_GPS_LAT0;
njewin 0:b9c0180d446f 182 int32_t MY_DATA_GPS_LAT1;
njewin 0:b9c0180d446f 183 int32_t MY_DATA_GPS_LAT2;
njewin 0:b9c0180d446f 184 int32_t MY_DATA_GPS_ALT;
njewin 0:b9c0180d446f 185 int32_t MY_DATA_GPS_ALT0;
njewin 0:b9c0180d446f 186 int32_t MY_DATA_GPS_ALT1;
njewin 0:b9c0180d446f 187 int32_t MY_DATA_GPS_ALT2;
njewin 0:b9c0180d446f 188 int16_t MY_DATA_GPS_COURSE;
njewin 0:b9c0180d446f 189 int16_t MY_DATA_GPS_SPEED;
njewin 0:b9c0180d446f 190 */
njewin 0:b9c0180d446f 191
njewin 0:b9c0180d446f 192
njewin 0:b9c0180d446f 193 static uint8_t data_counter = 0;
njewin 0:b9c0180d446f 194
njewin 0:b9c0180d446f 195
njewin 0:b9c0180d446f 196
njewin 0:b9c0180d446f 197 // The next action should depend on the USART state.
njewin 0:b9c0180d446f 198 switch ( gUSART_State ) {
njewin 0:b9c0180d446f 199 // USART in the WAIT state. In this state, the USART is waiting to see the sequence of bytes
njewin 0:b9c0180d446f 200 // that signals a new incoming packet.
njewin 0:b9c0180d446f 201 case USART_STATE_WAIT:
njewin 0:b9c0180d446f 202 if ( data_counter == 0 ) { // Waiting on 's' character
njewin 0:b9c0180d446f 203 if ( um6_uart.getc() == 's' ) {
njewin 0:b9c0180d446f 204
njewin 0:b9c0180d446f 205 data_counter++;
njewin 0:b9c0180d446f 206 } else {
njewin 0:b9c0180d446f 207 data_counter = 0;
njewin 0:b9c0180d446f 208 }
njewin 0:b9c0180d446f 209 } else if ( data_counter == 1 ) { // Waiting on 'n' character
njewin 0:b9c0180d446f 210 if ( um6_uart.getc() == 'n' ) {
njewin 0:b9c0180d446f 211 data_counter++;
njewin 0:b9c0180d446f 212
njewin 0:b9c0180d446f 213 } else {
njewin 0:b9c0180d446f 214 data_counter = 0;
njewin 0:b9c0180d446f 215 }
njewin 0:b9c0180d446f 216 } else if ( data_counter == 2 ) { // Waiting on 'p' character
njewin 0:b9c0180d446f 217 if ( um6_uart.getc() == 'p' ) {
njewin 0:b9c0180d446f 218 // The full 'snp' sequence was received. Reset data_counter (it will be used again
njewin 0:b9c0180d446f 219 // later) and transition to the next state.
njewin 0:b9c0180d446f 220 data_counter = 0;
njewin 0:b9c0180d446f 221 gUSART_State = USART_STATE_TYPE;
njewin 0:b9c0180d446f 222
njewin 0:b9c0180d446f 223 } else {
njewin 0:b9c0180d446f 224 data_counter = 0;
njewin 0:b9c0180d446f 225 }
njewin 0:b9c0180d446f 226 }
njewin 0:b9c0180d446f 227 break;
njewin 0:b9c0180d446f 228
njewin 0:b9c0180d446f 229 // USART in the TYPE state. In this state, the USART has just received the sequence of bytes that
njewin 0:b9c0180d446f 230 // indicates a new packet is about to arrive. Now, the USART expects to see the packet type.
njewin 0:b9c0180d446f 231 case USART_STATE_TYPE:
njewin 0:b9c0180d446f 232
njewin 0:b9c0180d446f 233 new_packet.PT = um6_uart.getc();
njewin 0:b9c0180d446f 234
njewin 0:b9c0180d446f 235 gUSART_State = USART_STATE_ADDRESS;
njewin 0:b9c0180d446f 236
njewin 0:b9c0180d446f 237 break;
njewin 0:b9c0180d446f 238
njewin 0:b9c0180d446f 239 // USART in the ADDRESS state. In this state, the USART expects to receive a single byte indicating
njewin 0:b9c0180d446f 240 // the address that the packet applies to
njewin 0:b9c0180d446f 241 case USART_STATE_ADDRESS:
njewin 0:b9c0180d446f 242 new_packet.address = um6_uart.getc();
njewin 0:b9c0180d446f 243
njewin 0:b9c0180d446f 244 // For convenience, identify the type of packet this is and copy to the packet structure
njewin 0:b9c0180d446f 245 // (this will be used by the packet handler later)
njewin 0:b9c0180d446f 246 if ( (new_packet.address >= CONFIG_REG_START_ADDRESS) && (new_packet.address < DATA_REG_START_ADDRESS) ) {
njewin 0:b9c0180d446f 247 new_packet.address_type = ADDRESS_TYPE_CONFIG;
njewin 0:b9c0180d446f 248 } else if ( (new_packet.address >= DATA_REG_START_ADDRESS) && (new_packet.address < COMMAND_START_ADDRESS) ) {
njewin 0:b9c0180d446f 249 new_packet.address_type = ADDRESS_TYPE_DATA;
njewin 0:b9c0180d446f 250 } else {
njewin 0:b9c0180d446f 251 new_packet.address_type = ADDRESS_TYPE_COMMAND;
njewin 0:b9c0180d446f 252 }
njewin 0:b9c0180d446f 253
njewin 0:b9c0180d446f 254 // Identify the type of communication this is (whether reading or writing to a data or configuration register, or sending a command)
njewin 0:b9c0180d446f 255 // If this is a read operation, jump directly to the USART_STATE_CHECKSUM state - there is no more data in the packet
njewin 0:b9c0180d446f 256 if ( (new_packet.PT & PACKET_HAS_DATA) == 0 ) {
njewin 0:b9c0180d446f 257 gUSART_State = USART_STATE_CHECKSUM;
njewin 0:b9c0180d446f 258 }
njewin 0:b9c0180d446f 259
njewin 0:b9c0180d446f 260 // If this is a write operation, go to the USART_STATE_DATA state to read in the relevant data
njewin 0:b9c0180d446f 261 else {
njewin 0:b9c0180d446f 262 gUSART_State = USART_STATE_DATA;
njewin 0:b9c0180d446f 263 // Determine the expected number of bytes in this data packet based on the packet type. A write operation
njewin 0:b9c0180d446f 264 // consists of 4 bytes unless it is a batch operation, in which case the number of bytes equals 4*batch_size,
njewin 0:b9c0180d446f 265 // where the batch size is also given in the packet type byte.
njewin 0:b9c0180d446f 266 if ( new_packet.PT & PACKET_IS_BATCH ) {
njewin 0:b9c0180d446f 267 new_packet.data_length = 4*((new_packet.PT >> 2) & PACKET_BATCH_LENGTH_MASK);
njewin 0:b9c0180d446f 268
njewin 0:b9c0180d446f 269 } else {
njewin 0:b9c0180d446f 270 new_packet.data_length = 4;
njewin 0:b9c0180d446f 271 }
njewin 0:b9c0180d446f 272 }
njewin 0:b9c0180d446f 273 break;
njewin 0:b9c0180d446f 274
njewin 0:b9c0180d446f 275 // USART in the DATA state. In this state, the USART expects to receive new_packet.length bytes of
njewin 0:b9c0180d446f 276 // data.
njewin 0:b9c0180d446f 277 case USART_STATE_DATA:
njewin 0:b9c0180d446f 278 new_packet.packet_data[data_counter] = um6_uart.getc();
njewin 0:b9c0180d446f 279 data_counter++;
njewin 0:b9c0180d446f 280
njewin 0:b9c0180d446f 281 // If the expected number of bytes has been received, transition to the CHECKSUM state.
njewin 0:b9c0180d446f 282 if ( data_counter == new_packet.data_length ) {
njewin 0:b9c0180d446f 283 // Reset data_counter, since it will be used in the CHECKSUM state.
njewin 0:b9c0180d446f 284 data_counter = 0;
njewin 0:b9c0180d446f 285 gUSART_State = USART_STATE_CHECKSUM;
njewin 0:b9c0180d446f 286 }
njewin 0:b9c0180d446f 287 break;
njewin 0:b9c0180d446f 288
njewin 0:b9c0180d446f 289
njewin 0:b9c0180d446f 290
njewin 0:b9c0180d446f 291 // USART in CHECKSUM state. In this state, the entire packet has been received, with the exception
njewin 0:b9c0180d446f 292 // of the 16-bit checksum.
njewin 0:b9c0180d446f 293 case USART_STATE_CHECKSUM:
njewin 0:b9c0180d446f 294 // Get the highest-order byte
njewin 0:b9c0180d446f 295 if ( data_counter == 0 ) {
njewin 0:b9c0180d446f 296 new_packet.checksum = ((uint16_t)um6_uart.getc() << 8);
njewin 0:b9c0180d446f 297 data_counter++;
njewin 0:b9c0180d446f 298 } else { // ( data_counter == 1 )
njewin 0:b9c0180d446f 299 // Get lower-order byte
njewin 0:b9c0180d446f 300 new_packet.checksum = new_packet.checksum | ((uint16_t)um6_uart.getc() & 0x0FF);
njewin 0:b9c0180d446f 301
njewin 0:b9c0180d446f 302 // Both checksum bytes have been received. Make sure that the checksum is valid.
njewin 0:b9c0180d446f 303 uint16_t checksum = ComputeChecksum( &new_packet );
njewin 0:b9c0180d446f 304
njewin 0:b9c0180d446f 305
njewin 0:b9c0180d446f 306
njewin 0:b9c0180d446f 307 // If checksum does not match, exit function
njewin 0:b9c0180d446f 308 if ( checksum != new_packet.checksum ) {
njewin 0:b9c0180d446f 309 return;
njewin 0:b9c0180d446f 310 } // end if(checksum check)
njewin 0:b9c0180d446f 311
njewin 0:b9c0180d446f 312
njewin 0:b9c0180d446f 313
njewin 0:b9c0180d446f 314 else
njewin 0:b9c0180d446f 315
njewin 0:b9c0180d446f 316 {
njewin 0:b9c0180d446f 317
njewin 0:b9c0180d446f 318 // Packet was received correctly.
njewin 0:b9c0180d446f 319
njewin 0:b9c0180d446f 320 //-----------------------------------------------------------------------------------------------
njewin 0:b9c0180d446f 321 //-----------------------------------------------------------------------------------------------
njewin 0:b9c0180d446f 322 //
njewin 0:b9c0180d446f 323 // CHECKSUM WAS GOOD SO GET ARE DATA!!!!!!!!!!!!
njewin 0:b9c0180d446f 324
njewin 0:b9c0180d446f 325
njewin 0:b9c0180d446f 326 // IF DATA ADDRESS
njewin 0:b9c0180d446f 327 if (new_packet.address_type == ADDRESS_TYPE_DATA) {
njewin 0:b9c0180d446f 328
njewin 0:b9c0180d446f 329 //------------------------------------------------------------
njewin 0:b9c0180d446f 330 // UM6_GYRO_PROC_XY (0x5C)
njewin 0:b9c0180d446f 331 // To convert the register data from 16-bit 2's complement integers to actual angular rates in degrees
njewin 0:b9c0180d446f 332 // per second, the data should be multiplied by the scale factor 0.0610352 as shown below
njewin 0:b9c0180d446f 333 // angular_rate = register_data*0.0610352
njewin 0:b9c0180d446f 334
njewin 0:b9c0180d446f 335 if (new_packet.address == UM6_GYRO_PROC_XY) {
njewin 0:b9c0180d446f 336
njewin 0:b9c0180d446f 337 // GYRO_PROC_X
njewin 0:b9c0180d446f 338 MY_DATA_GYRO_PROC_X = (int16_t)new_packet.packet_data[0]<<8; //bitshift it
njewin 0:b9c0180d446f 339 MY_DATA_GYRO_PROC_X |= new_packet.packet_data[1];
njewin 0:b9c0180d446f 340 data.Gyro_Proc_X = MY_DATA_GYRO_PROC_X*0.0610352;
njewin 0:b9c0180d446f 341
njewin 0:b9c0180d446f 342 MY_DATA_GYRO_PROC_Y = (int16_t)new_packet.packet_data[2]<<8; //bitshift it
njewin 0:b9c0180d446f 343 MY_DATA_GYRO_PROC_Y |= new_packet.packet_data[3];
njewin 0:b9c0180d446f 344 data.Gyro_Proc_Y = MY_DATA_GYRO_PROC_Y*0.0610352;
njewin 0:b9c0180d446f 345
njewin 0:b9c0180d446f 346
njewin 0:b9c0180d446f 347 //------------------------------------------------------------
njewin 0:b9c0180d446f 348
njewin 0:b9c0180d446f 349
njewin 0:b9c0180d446f 350 //------------------------------------------------------------
njewin 0:b9c0180d446f 351 // UM6_GYRO_PROC_Z (0x5D)
njewin 0:b9c0180d446f 352 // To convert the register data from a 16-bit 2's complement integer to the actual angular rate in
njewin 0:b9c0180d446f 353 // degrees per second, the data should be multiplied by the scale factor 0.0610352 as shown below.
njewin 0:b9c0180d446f 354
njewin 0:b9c0180d446f 355
njewin 0:b9c0180d446f 356 // GYRO_PROC_Z
njewin 0:b9c0180d446f 357 MY_DATA_GYRO_PROC_Z = (int16_t)new_packet.packet_data[4]<<8; //bitshift it
njewin 0:b9c0180d446f 358 MY_DATA_GYRO_PROC_Z |= new_packet.packet_data[5];;
njewin 0:b9c0180d446f 359 data.Gyro_Proc_Z = MY_DATA_GYRO_PROC_Z*0.0610352;
njewin 0:b9c0180d446f 360
njewin 0:b9c0180d446f 361
njewin 0:b9c0180d446f 362 } // end if(MY_DATA_GYRO_PROC)
njewin 0:b9c0180d446f 363 //------------------------------------------------------------
njewin 0:b9c0180d446f 364
njewin 0:b9c0180d446f 365
njewin 0:b9c0180d446f 366 //------------------------------------------------------------
njewin 0:b9c0180d446f 367 // UM6_ACCEL_PROC_XY (0x5E)
njewin 0:b9c0180d446f 368 // To convert the register data from 16-bit 2's complement integers to actual acceleration in gravities,
njewin 0:b9c0180d446f 369 // the data should be multiplied by the scale factor 0.000183105 as shown below.
njewin 0:b9c0180d446f 370 // acceleration = register_data* 0.000183105
njewin 0:b9c0180d446f 371 if (new_packet.address == UM6_ACCEL_PROC_XY) {
njewin 0:b9c0180d446f 372
njewin 0:b9c0180d446f 373 // ACCEL_PROC_X
njewin 0:b9c0180d446f 374 MY_DATA_ACCEL_PROC_X = (int16_t)new_packet.packet_data[0]<<8; //bitshift it
njewin 0:b9c0180d446f 375 MY_DATA_ACCEL_PROC_X |= new_packet.packet_data[1];
njewin 0:b9c0180d446f 376 data.Accel_Proc_X = MY_DATA_ACCEL_PROC_X*0.000183105;
njewin 0:b9c0180d446f 377
njewin 0:b9c0180d446f 378
njewin 0:b9c0180d446f 379 // ACCEL_PROC_Y
njewin 0:b9c0180d446f 380 MY_DATA_ACCEL_PROC_Y = (int16_t)new_packet.packet_data[2]<<8; //bitshift it
njewin 0:b9c0180d446f 381 MY_DATA_ACCEL_PROC_Y |= new_packet.packet_data[3];
njewin 0:b9c0180d446f 382 data.Accel_Proc_Y = MY_DATA_ACCEL_PROC_Y*0.000183105;
njewin 0:b9c0180d446f 383
njewin 0:b9c0180d446f 384 //------------------------------------------------------------
njewin 0:b9c0180d446f 385
njewin 0:b9c0180d446f 386
njewin 0:b9c0180d446f 387 //------------------------------------------------------------
njewin 0:b9c0180d446f 388 // UM6_ACCEL_PROC_Z (0x5F)
njewin 0:b9c0180d446f 389 // To convert the register data from a 16-bit 2's complement integer to the actual acceleration in
njewin 0:b9c0180d446f 390 // gravities, the data should be multiplied by the scale factor 0.000183105 as shown below.
njewin 0:b9c0180d446f 391
njewin 0:b9c0180d446f 392 // ACCEL_PROC_Z
njewin 0:b9c0180d446f 393 MY_DATA_ACCEL_PROC_Z = (int16_t)new_packet.packet_data[4]<<8; //bitshift it
njewin 0:b9c0180d446f 394 MY_DATA_ACCEL_PROC_Z |= new_packet.packet_data[5];
njewin 0:b9c0180d446f 395 data.Accel_Proc_Z = MY_DATA_ACCEL_PROC_Z*0.000183105;
njewin 0:b9c0180d446f 396
njewin 0:b9c0180d446f 397 } // end if(MY_DATA_ACCEL_PROC)
njewin 0:b9c0180d446f 398
njewin 0:b9c0180d446f 399 //------------------------------------------------------------
njewin 0:b9c0180d446f 400
njewin 0:b9c0180d446f 401
njewin 0:b9c0180d446f 402 //------------------------------------------------------------
njewin 0:b9c0180d446f 403 // UM6_MAG_PROC_XY (0x60)
njewin 0:b9c0180d446f 404 // To convert the register data from 16-bit 2's complement integers to a unit-norm (assuming proper
njewin 0:b9c0180d446f 405 // calibration) magnetic-field vector, the data should be multiplied by the scale factor 0.000305176 as
njewin 0:b9c0180d446f 406 // shown below.
njewin 0:b9c0180d446f 407 // magnetic field = register_data* 0.000305176
njewin 0:b9c0180d446f 408 /*
njewin 0:b9c0180d446f 409 if (new_packet.address == UM6_MAG_PROC_XY) {
njewin 0:b9c0180d446f 410
njewin 0:b9c0180d446f 411 // MAG_PROC_X
njewin 0:b9c0180d446f 412 MY_DATA_MAG_PROC_X = (int16_t)new_packet.packet_data[0]<<8; //bitshift it
njewin 0:b9c0180d446f 413 MY_DATA_MAG_PROC_X |= new_packet.packet_data[1];
njewin 0:b9c0180d446f 414 data.Mag_Proc_X = MY_DATA_MAG_PROC_X*0.000305176;
njewin 0:b9c0180d446f 415
njewin 0:b9c0180d446f 416
njewin 0:b9c0180d446f 417 // MAG_PROC_Y
njewin 0:b9c0180d446f 418 MY_DATA_MAG_PROC_Y = (int16_t)new_packet.packet_data[2]<<8; //bitshift it
njewin 0:b9c0180d446f 419 MY_DATA_MAG_PROC_Y |= new_packet.packet_data[3];
njewin 0:b9c0180d446f 420 data.Mag_Proc_Y = MY_DATA_MAG_PROC_Y*0.000305176;
njewin 0:b9c0180d446f 421
njewin 0:b9c0180d446f 422 //------------------------------------------------------------
njewin 0:b9c0180d446f 423
njewin 0:b9c0180d446f 424
njewin 0:b9c0180d446f 425 //------------------------------------------------------------
njewin 0:b9c0180d446f 426 // UM6_MAG_PROC_Z (0x61)
njewin 0:b9c0180d446f 427 // To convert the register data from 16-bit 2's complement integers to a unit-norm (assuming proper
njewin 0:b9c0180d446f 428 // calibration) magnetic-field vector, the data should be multiplied by the scale factor 0.000305176 as
njewin 0:b9c0180d446f 429 // shown below.
njewin 0:b9c0180d446f 430 // magnetic field = register_data*0.000305176
njewin 0:b9c0180d446f 431
njewin 0:b9c0180d446f 432 // MAG_PROC_Z
njewin 0:b9c0180d446f 433 MY_DATA_MAG_PROC_Z = (int16_t)new_packet.packet_data[4]<<8; //bitshift it
njewin 0:b9c0180d446f 434 MY_DATA_MAG_PROC_Z |= new_packet.packet_data[5];
njewin 0:b9c0180d446f 435 data.Mag_Proc_Z = MY_DATA_MAG_PROC_Z*0.000305176;
njewin 0:b9c0180d446f 436
njewin 0:b9c0180d446f 437 } // end if(UM6_MAG_PROC)
njewin 0:b9c0180d446f 438 */
njewin 0:b9c0180d446f 439 //------------------------------------------------------------
njewin 0:b9c0180d446f 440
njewin 0:b9c0180d446f 441
njewin 0:b9c0180d446f 442
njewin 0:b9c0180d446f 443 //------------------------------------------------------------
njewin 0:b9c0180d446f 444 // UM6_EULER_PHI_THETA (0x62)
njewin 0:b9c0180d446f 445 // Stores the most recently computed roll (phi) and pitch (theta) angle estimates. The angle
njewin 0:b9c0180d446f 446 // estimates are stored as 16-bit 2's complement integers. To obtain the actual angle estimate in
njewin 0:b9c0180d446f 447 // degrees, the register data should be multiplied by the scale factor 0.0109863 as shown below
njewin 0:b9c0180d446f 448 // angle estimate = register_data* 0.0109863
njewin 0:b9c0180d446f 449 if (new_packet.address == UM6_EULER_PHI_THETA) {
njewin 0:b9c0180d446f 450 // EULER_PHI (ROLL)
njewin 0:b9c0180d446f 451 MY_DATA_EULER_PHI = (int16_t)new_packet.packet_data[0]<<8; //bitshift it
njewin 0:b9c0180d446f 452 MY_DATA_EULER_PHI |= new_packet.packet_data[1];
njewin 0:b9c0180d446f 453 data.Roll = MY_DATA_EULER_PHI*0.0109863;
njewin 0:b9c0180d446f 454
njewin 0:b9c0180d446f 455
njewin 0:b9c0180d446f 456
njewin 0:b9c0180d446f 457
njewin 0:b9c0180d446f 458
njewin 0:b9c0180d446f 459 // EULER_THETA (PITCH)
njewin 0:b9c0180d446f 460 MY_DATA_EULER_THETA = (int16_t)new_packet.packet_data[2]<<8; //bitshift it
njewin 0:b9c0180d446f 461 MY_DATA_EULER_THETA |= new_packet.packet_data[3];
njewin 0:b9c0180d446f 462 data.Pitch = MY_DATA_EULER_THETA*0.0109863;
njewin 0:b9c0180d446f 463
njewin 0:b9c0180d446f 464 //------------------------------------------------------------
njewin 0:b9c0180d446f 465
njewin 0:b9c0180d446f 466 //------------------------------------------------------------
njewin 0:b9c0180d446f 467 // UM6_EULER_PSI (0x63) (YAW)
njewin 0:b9c0180d446f 468 // Stores the most recently computed yaw (psi) angle estimate. The angle estimate is stored as a 16-
njewin 0:b9c0180d446f 469 // bit 2's complement integer. To obtain the actual angle estimate in degrees, the register data
njewin 0:b9c0180d446f 470 // should be multiplied by the scale factor 0.0109863 as shown below
njewin 0:b9c0180d446f 471
njewin 0:b9c0180d446f 472 MY_DATA_EULER_PSI = (int16_t)new_packet.packet_data[4]<<8; //bitshift it
njewin 0:b9c0180d446f 473 MY_DATA_EULER_PSI |= new_packet.packet_data[5];
njewin 0:b9c0180d446f 474 data.Yaw = MY_DATA_EULER_PSI*0.0109863;
njewin 0:b9c0180d446f 475
njewin 0:b9c0180d446f 476
njewin 0:b9c0180d446f 477 }
njewin 0:b9c0180d446f 478 /*
njewin 0:b9c0180d446f 479 //-------------------------------------------------------------------
njewin 0:b9c0180d446f 480 // GPS Ground/Speed
njewin 0:b9c0180d446f 481 if (new_packet.address == UM6_GPS_COURSE_SPEED) {
njewin 0:b9c0180d446f 482 // Ground course
njewin 0:b9c0180d446f 483 MY_DATA_GPS_COURSE = (int16_t)new_packet.packet_data[0]<<8; //bitshift it
njewin 0:b9c0180d446f 484 MY_DATA_GPS_COURSE |= new_packet.packet_data[1];
njewin 0:b9c0180d446f 485 data.GPS_course = MY_DATA_GPS_COURSE*0.01; // scaled by 0.01 to get ground course in degrees
njewin 0:b9c0180d446f 486
njewin 0:b9c0180d446f 487 // Speed
njewin 0:b9c0180d446f 488 MY_DATA_GPS_SPEED = (int16_t)new_packet.packet_data[2]<<8; //bitshift it
njewin 0:b9c0180d446f 489 MY_DATA_GPS_SPEED |= new_packet.packet_data[3];
njewin 0:b9c0180d446f 490 data.GPS_speed = MY_DATA_GPS_SPEED*0.01; // scaled by 0.01 to get speed in m/s
njewin 0:b9c0180d446f 491
njewin 0:b9c0180d446f 492
njewin 0:b9c0180d446f 493 //------------------------------------------------------------
njewin 0:b9c0180d446f 494 }
njewin 0:b9c0180d446f 495 //-------------------------------------------------------------------
njewin 0:b9c0180d446f 496 // GPS long
njewin 0:b9c0180d446f 497 if (new_packet.address == UM6_GPS_LONGITUDE) {
njewin 0:b9c0180d446f 498 // Longitude
njewin 0:b9c0180d446f 499 MY_DATA_GPS_LONG0 = (int32_t)new_packet.packet_data[0]<<24;
njewin 0:b9c0180d446f 500 MY_DATA_GPS_LONG1 = (int32_t)new_packet.packet_data[1]<<16;
njewin 0:b9c0180d446f 501 MY_DATA_GPS_LONG2 = (int32_t)new_packet.packet_data[2]<<8;
njewin 0:b9c0180d446f 502 MY_DATA_GPS_LONG = MY_DATA_GPS_LONG0|MY_DATA_GPS_LONG1|MY_DATA_GPS_LONG2|new_packet.packet_data[3];
njewin 0:b9c0180d446f 503 memcpy(&data.GPS_long,&MY_DATA_GPS_LONG,sizeof(int));
njewin 0:b9c0180d446f 504 }
njewin 0:b9c0180d446f 505 //------------------------------------------------------------
njewin 0:b9c0180d446f 506 //-------------------------------------------------------------------
njewin 0:b9c0180d446f 507 // GPS lat
njewin 0:b9c0180d446f 508 if (new_packet.address == UM6_GPS_LATITUDE) {
njewin 0:b9c0180d446f 509 // Latitude
njewin 0:b9c0180d446f 510 //MY_DATA_GPS_LAT0 = (int32_t)new_packet.packet_data[0]<<24;
njewin 0:b9c0180d446f 511 //MY_DATA_GPS_LAT1 = (int32_t)new_packet.packet_data[1]<<16;
njewin 0:b9c0180d446f 512 //MY_DATA_GPS_LAT2 = (int32_t)new_packet.packet_data[2]<<8;
njewin 0:b9c0180d446f 513 //MY_DATA_GPS_LAT = MY_DATA_GPS_LAT0|MY_DATA_GPS_LAT1|MY_DATA_GPS_LAT2|new_packet.packet_data[3];
njewin 0:b9c0180d446f 514 //memcpy(&data.GPS_lat,&MY_DATA_GPS_LAT,sizeof(int));
njewin 0:b9c0180d446f 515 // data.GPS_lat_raw = new_packet.packet_data[0];
njewin 0:b9c0180d446f 516 }
njewin 0:b9c0180d446f 517 //------------------------------------------------------------
njewin 0:b9c0180d446f 518 //-------------------------------------------------------------------
njewin 0:b9c0180d446f 519 // GPS altitude
njewin 0:b9c0180d446f 520 if (new_packet.address == UM6_GPS_ALTITUDE) {
njewin 0:b9c0180d446f 521 // Longitude
njewin 0:b9c0180d446f 522 MY_DATA_GPS_ALT0 = (int32_t)new_packet.packet_data[0]<<24;
njewin 0:b9c0180d446f 523 MY_DATA_GPS_ALT1 = (int32_t)new_packet.packet_data[1]<<16;
njewin 0:b9c0180d446f 524 MY_DATA_GPS_ALT2 = (int32_t)new_packet.packet_data[2]<<8;
njewin 0:b9c0180d446f 525 MY_DATA_GPS_ALT = MY_DATA_GPS_ALT0|MY_DATA_GPS_ALT1|MY_DATA_GPS_ALT2|new_packet.packet_data[3];
njewin 0:b9c0180d446f 526 memcpy(&data.GPS_alt,&MY_DATA_GPS_ALT,sizeof(int));
njewin 0:b9c0180d446f 527 // data.GPS_alt_raw = MY_DATA_GPS_ALT0;
njewin 0:b9c0180d446f 528
njewin 0:b9c0180d446f 529 }
njewin 0:b9c0180d446f 530 */ //------------------------------------------------------------
njewin 0:b9c0180d446f 531 } // end if(ADDRESS_TYPE_DATA)
njewin 0:b9c0180d446f 532
njewin 0:b9c0180d446f 533
njewin 0:b9c0180d446f 534 // A full packet has been received.
njewin 0:b9c0180d446f 535 // Put the USART back into the WAIT state and reset
njewin 0:b9c0180d446f 536 // the data_counter variable so that it can be used to receive the next packet.
njewin 0:b9c0180d446f 537 data_counter = 0;
njewin 0:b9c0180d446f 538 gUSART_State = USART_STATE_WAIT;
njewin 0:b9c0180d446f 539
njewin 0:b9c0180d446f 540
njewin 0:b9c0180d446f 541 } // end else(GET_DATA)
njewin 0:b9c0180d446f 542
njewin 0:b9c0180d446f 543 }
njewin 0:b9c0180d446f 544 break;
njewin 0:b9c0180d446f 545
njewin 0:b9c0180d446f 546 } // end switch ( gUSART_State )
njewin 0:b9c0180d446f 547
njewin 0:b9c0180d446f 548 return;
njewin 0:b9c0180d446f 549
njewin 0:b9c0180d446f 550 } // end get_gyro_x()
njewin 0:b9c0180d446f 551
njewin 0:b9c0180d446f 552 #endif
njewin 0:b9c0180d446f 553