Example of using Xbus library to communicate with an MTi-1 series device using a full-duplex UART connection.

Dependencies:   mbed-rtos mbed Xbus

Fork of MTi-1_example by Alex Young

Important Information

This example is deprecated and no longer maintained. There are new embedded examples available in the MT SDK folder of the MT Software Suite. For more information please visit: https://xsenstechnologies.force.com/knowledgebase/s/article/Introduction-to-the-MT-SDK-programming-examples-for-MTi-devices

Overview

The example program demonstrates connecting to an MTi-1 series device, restoring communications settings to default if necessary, and configuring the MTi to send data. For an MTi-1 the device is configured to send inertial sensor data, while MTi-2 and MTi-3 devices are configured to output orientation data using the onboard XKF3i filter.

Communication with the MTi-1 series device is implemented using a either a full-duplex UART, I2C or SPI bus. A reset line is used to reset the MTi during initialization. Data is output to a host PC terminal using a second UART.

For more information on the MTi-1 series communication protocol please refer to the datasheet: https://www.xsens.com/download/pdf/documentation/mti-1/mti-1-series_datasheet.pdf

Supported Platforms

The program has been tested on the following mbed platforms:

Using the Example

  1. To use the example program connect one of the supported mbed boards to the host PC and download the application from the mbed online compiler to the target device.
  2. With the mbed board unpowered (USB disconnected) wire the mbed board to the MTi-1 development board. The following connections are required:
    • In all cases:
      • 5V (or 3V3) main supply to VDD (P300-1)
      • MCU IO voltage (IORef) to VDDIO (P300-2)
      • GND to GND (P300-3)
      • MT_NRESET to nRST (P300-5)
    • For I2C communication:
      • MT_SCL to I2C_SCL (P300-9)
      • MT_SDA to I2C_SDA (P300-11)
      • MT_DRDY to DRDY (P300-15)
      • MT_ADD0 to ADD0 (P300-17)
      • MT_ADD1 to ADD1 (P300-19)
      • MT_ADD2 to ADD2 (P300-21)
    • For SPI communication:
      • MT_DRDY to DRDY (P300-15)
      • MT_SCLK to SPI_SCK (P300-17)
      • MT_MISO to SPI_MISO (P300-19)
      • MT_MOSI to SPI_MOSI (P300-21)
      • MT_nCS to SPI_nCS (P300-23)
    • For UART communication:
      • MT_RX to UART_TX (P300-9)
      • MT_TX to UART_RX (P300-11)

For more information on the MTi-1 development board please refer to the MTi-1 series user manual: https://www.xsens.com/download/pdf/documentation/mti-1/mti-1-series_dk_user_manual.pdf

Information

Check the defines at the top of main.cpp to determine which IO pins are used for the MT_xxx connections on each mbed platform.

Information

The active peripheral (I2C, SPI or UART) is selected on the MTi-1 development board through the PSEL0 and PSEL1 switches. Look on the bottom of the development board for the correct settings.

  1. Connect to the target using a serial terminal. The application is configured for:
    • Baudrate = 921600
    • Stop bits = 1
    • No parity bits
    • No flow control
  2. Reset the mbed board.
  3. You should be presented with a simple user interface as shown below:
MTi-1 series embedded example firmware.
Device ready for operation.
Found device with ID: 03880011.
Device is an MTi-3: Attitude Heading Reference System.
Output configuration set to:
        Packet counter: 65535 Hz
        Sample time fine: 65535 Hz
        Quaternion: 100 Hz
        Status word: 65535 Hz

Press 'm' to start measuring and 'c' to return to config mode.

Files at this revision

API Documentation at this revision

Comitter:
alexandery
Date:
Tue Jun 16 07:57:51 2015 +0000
Parent:
61:b9d3e7e5ba0c
Child:
63:138c196f0b88
Commit message:
Extract Xbus code into a library.

Changed in this revision

xbus.lib Show annotated file Show diff for this revision Revisions of this file
xbus/xbusdef.h Show diff for this revision Revisions of this file
xbus/xbusmessage.c Show diff for this revision Revisions of this file
xbus/xbusmessage.h Show diff for this revision Revisions of this file
xbus/xbusparser.c Show diff for this revision Revisions of this file
xbus/xbusparser.h Show diff for this revision Revisions of this file
xbus/xbusutility.c Show diff for this revision Revisions of this file
xbus/xbusutility.h Show diff for this revision Revisions of this file
xbus/xsdeviceid.c Show diff for this revision Revisions of this file
xbus/xsdeviceid.h Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xbus.lib	Tue Jun 16 07:57:51 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/Xsens/code/Xbus/#eb25b1785ee4
--- a/xbus/xbusdef.h	Fri Jun 12 13:23:26 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-/*!
- * \file
- * \copyright Copyright (C) Xsens Technologies B.V., 2015.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy
- * of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
-
-#ifndef __XBUSDEF_H
-#define __XBUSDEF_H
-
-/*! \brief Xbus message preamble byte. */
-#define XBUS_PREAMBLE (0xFA)
-/*! \brief Xbus message bus ID for master devices. */
-#define XBUS_MASTERDEVICE (0xFF)
-/*! \brief Xbus length byte for messages without payload. */
-#define XBUS_NO_PAYLOAD (0x00)
-/*! \brief Xbus length byte for message with an extended payload. */
-#define XBUS_EXTENDED_LENGTH (0xFF)
-
-#endif // __XBUSDEF_H
--- a/xbus/xbusmessage.c	Fri Jun 12 13:23:26 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,238 +0,0 @@
-/*!
- * \file
- * \copyright Copyright (C) Xsens Technologies B.V., 2015.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy
- * of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
-
-#include "xbusmessage.h"
-#include "xbusdef.h"
-#include "xbusutility.h"
-
-/*!
- * \brief Calculate the number of bytes needed for \a message payload.
- */
-static uint16_t messageLength(struct XbusMessage const* message)
-{
-	switch (message->mid)
-	{
-		case XMID_SetOutputConfig:
-			return message->length * 2 * sizeof(uint16_t);
-
-		default:
-			return message->length;
-	}
-}
-
-/*!
- * \brief Format a message with a pointer to an array of OutputConfiguration elements.
- */
-static void formatOutputConfig(uint8_t* raw, struct XbusMessage const* message)
-{
-	struct OutputConfiguration* conf = message->data;
-	for (int i = 0; i < message->length; ++i)
-	{
-		raw = XbusUtility_writeU16(raw, conf->dtype);
-		raw = XbusUtility_writeU16(raw, conf->freq);
-		++conf;
-	}
-}
-
-/*!
- * \brief Format the payload of a message from a native data type to
- * raw bytes.
- */
-static void formatPayload(uint8_t* raw, struct XbusMessage const* message)
-{
-	switch (message->mid)
-	{
-		case XMID_SetOutputConfig:
-			formatOutputConfig(raw, message);
-			break;
-
-		default:
-			for (int i = 0; i < message->length; ++i)
-			{
-				*raw++ = ((uint8_t*)message->data)[i];
-			}
-			break;
-	}
-}
-
-/*!
- * \brief Format a message into the raw Xbus format ready for transmission to
- * a motion tracker.
- */
-size_t XbusMessage_format(uint8_t* raw, struct XbusMessage const* message)
-{
-	uint8_t* dptr = raw;
-	*dptr++ = XBUS_PREAMBLE;
-
-	*dptr = XBUS_MASTERDEVICE;
-	uint8_t checksum = 0;
-	checksum -= *dptr++;
-
-	*dptr = message->mid;
-	checksum -= *dptr++;
-
-	uint16_t length = messageLength(message);
-
-	if (length < XBUS_EXTENDED_LENGTH)
-	{
-		*dptr = length;
-		checksum -= *dptr++;
-	}
-	else
-	{
-		*dptr = XBUS_EXTENDED_LENGTH;
-		checksum -= *dptr++;
-		*dptr = length >> 8;
-		checksum -= *dptr++;
-		*dptr = length & 0xFF;
-		checksum -= *dptr++;
-	}
-
-	formatPayload(dptr, message);
-	for (int i = 0; i < length; ++i)
-	{
-		checksum -= *dptr++;
-	}
-	*dptr++ = checksum;
-
-	return dptr - raw;
-}
-
-/*!
- * \brief Get a pointer to the data corresponding to \a id.
- * \param id The data identifier to find in the message.
- * \param data Pointer to the raw message payload.
- * \param dataLength The length of the payload in bytes.
- * \returns Pointer to data item, or NULL if the identifier is not present in
- * the message.
- */
-static uint8_t const* getPointerToData(enum XsDataIdentifier id, uint8_t const* data, uint16_t dataLength)
-{
-	uint8_t const* dptr = data;
-	while (dptr < data + dataLength)
-	{
-		uint16_t itemId;
-		uint8_t itemSize;
-		dptr = XbusUtility_readU16(&itemId, dptr);
-		dptr = XbusUtility_readU8(&itemSize, dptr);
-
-		if (id == itemId)
-			return dptr;
-
-		dptr += itemSize;
-	}
-	return NULL;
-}
-
-/*!
- * \brief Read a number of floats from a message payload.
- * \param out Pointer to where to output data.
- * \param raw Pointer to the start of the raw float data.
- * \param floats The number of floats to read.
- */
-static void readFloats(float* out, uint8_t const* raw, uint8_t floats)
-{
-	for (int i = 0; i < floats; ++i)
-	{
-		raw = XbusUtility_readU32((uint32_t*)&out[i], raw);
-	}
-}
-
-/*!
- * \brief Get a data item from an XMID_MtData2 Xbus message.
- * \param item Pointer to where to store the data.
- * \param id The data identifier to get.
- * \param message The message to read the data item from.
- * \returns true if the data item is found in the message, else false.
- */
-bool XbusMessage_getDataItem(void* item, enum XsDataIdentifier id, struct XbusMessage const* message)
-{
-	uint8_t const* raw = getPointerToData(id, message->data, message->length);
-	if (raw)
-	{
-		switch (id)
-		{
-			case XDI_PacketCounter:
-				raw = XbusUtility_readU16(item, raw);
-				break;
-
-			case XDI_SampleTimeFine:
-			case XDI_StatusWord:
-				raw = XbusUtility_readU32(item, raw);
-				break;
-
-			case XDI_Quaternion:
-			case XDI_DeltaQ:
-				readFloats(item, raw, 4);
-				break;
-
-			case XDI_DeltaV:
-			case XDI_Acceleration:
-			case XDI_RateOfTurn:
-			case XDI_MagneticField:
-				readFloats(item, raw, 3);
-				break;
-
-			default:
-				return false;
-		}
-		return true;
-	}
-	else
-	{
-		return false;
-	}
-}
-
-/*!
- * \brief Get a string description for the passed data identifier.
- */
-char const* XbusMessage_dataDescription(enum XsDataIdentifier id)
-{
-	switch (id)
-	{
-		case XDI_PacketCounter:
-			return "Packet counter";
-
-		case XDI_SampleTimeFine:
-			return "Sample time fine";
-
-		case XDI_Quaternion:
-			return "Quaternion";
-
-		case XDI_DeltaV:
-			return "Velocity increment";
-
-		case XDI_Acceleration:
-			return "Acceleration";
-
-		case XDI_RateOfTurn:
-			return "Rate of turn";
-
-		case XDI_DeltaQ:
-			return "Orientation increment";
-
-		case XDI_MagneticField:
-			return "Magnetic field";
-
-		case XDI_StatusWord:
-			return "Status word";
-
-		default:
-			return "Unknown data type";
-	}
-}
--- a/xbus/xbusmessage.h	Fri Jun 12 13:23:26 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-/*!
- * \file
- * \copyright Copyright (C) Xsens Technologies B.V., 2015.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy
- * of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
-
-#ifndef __XBUSMESSAGE_H
-#define __XBUSMESSAGE_H
-
-#include <stddef.h>
-#include <stdint.h>
-#include <stdbool.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*! \brief Xbus message IDs. */
-enum XsMessageId
-{
-	XMID_Wakeup             = 0x3E,
-	XMID_WakeupAck          = 0x3F,
-	XMID_ReqDid             = 0x00,
-	XMID_DeviceId           = 0x01,
-	XMID_GotoConfig         = 0x30,
-	XMID_GotoConfigAck      = 0x31,
-	XMID_GotoMeasurement    = 0x10,
-	XMID_GotoMeasurementAck = 0x11,
-	XMID_MtData2            = 0x36,
-	XMID_ReqOutputConfig    = 0xC0,
-	XMID_SetOutputConfig    = 0xC0,
-	XMID_OutputConfig       = 0xC1,
-	XMID_Reset              = 0x40,
-	XMID_ResetAck           = 0x41,
-	XMID_Error              = 0x42,
-};
-
-/*! \brief Xbus data message type IDs. */
-enum XsDataIdentifier
-{
-	XDI_PacketCounter  = 0x1020,
-	XDI_SampleTimeFine = 0x1060,
-	XDI_Quaternion     = 0x2010,
-	XDI_DeltaV         = 0x4010,
-	XDI_Acceleration   = 0x4020,
-	XDI_RateOfTurn     = 0x8020,
-	XDI_DeltaQ         = 0x8030,
-	XDI_MagneticField  = 0xC020,
-	XDI_StatusWord     = 0xE020,
-};
-
-/*!
- * \brief An Xbus message structure with optional payload.
- */
-struct XbusMessage
-{
-	/*! \brief The message ID of the message. */
-	enum XsMessageId mid;
-	/*!
-	 * \brief The length of the payload.
-	 *
-	 * \note The meaning of the length is message dependent. For example,
-	 * for XMID_OutputConfig messages it is the number of OutputConfiguration
-	 * elements in the configuration array.
-	 */
-	uint16_t length;
-	/*! \brief Pointer to the payload data. */
-	void* data;
-};
-
-/*!
- * \brief Output configuration structure.
- */
-struct OutputConfiguration
-{
-	/*! \brief Data type of the output. */
-	enum XsDataIdentifier dtype;
-	/*!
-	 * \brief The output frequency in Hz, or 65535 if the value should be
-	 * included in every data message.
-	 */
-	uint16_t freq;
-};
-
-size_t XbusMessage_format(uint8_t* raw, struct XbusMessage const* message);
-bool XbusMessage_getDataItem(void* item, enum XsDataIdentifier id, struct XbusMessage const* message);
-char const* XbusMessage_dataDescription(enum XsDataIdentifier id);
-
-#ifdef __cplusplus
-}
-#endif // extern "C"
-
-#endif // __XBUSMESSAGE_H
--- a/xbus/xbusparser.c	Fri Jun 12 13:23:26 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,297 +0,0 @@
-/*!
- * \file
- * \copyright Copyright (C) Xsens Technologies B.V., 2015.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy
- * of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
-
-#include "xbusparser.h"
-#include "xbusdef.h"
-#include "xbusutility.h"
-#include <stdlib.h>
-#include <string.h>
-
-/*! \brief XbusParser states. */
-enum XbusParserState
-{
-	XBPS_Preamble,          /*!< \brief Looking for preamble. */
-	XBPS_BusId,             /*!< \brief Waiting for bus ID. */
-	XBPS_MessageId,         /*!< \brief Waiting for message ID. */
-	XBPS_Length,            /*!< \brief Waiting for length. */
-	XBPS_ExtendedLengthMsb, /*!< \brief Waiting for extended length MSB*/
-	XBPS_ExtendedLengthLsb, /*!< \brief Waiting for extended length LSB*/
-	XBPS_Payload,           /*!< \brief Reading payload. */
-	XBPS_Checksum           /*!< \brief Waiting for checksum. */
-};
-
-/*!
- * \brief Xbus Parser state structure.
- */
-struct XbusParser
-{
-	/*! \brief Callbacks for memory management, and message handling. */
-	struct XbusParserCallback callbacks;
-	/*! \brief Storage for the current message being received. */
-	struct XbusMessage currentMessage;
-	/*! \brief The number of bytes of payload received for the current message. */
-	uint16_t payloadReceived;
-	/*! \brief The calculated checksum for the current message. */
-	uint8_t checksum;
-	/*! \brief The state of the parser. */
-	enum XbusParserState state;
-};
-
-/*!
- * \brief Get the amount of memory needed for the XbusParser structure.
- */
-size_t XbusParser_mem(void)
-{
-	return sizeof(struct XbusParser);
-}
-
-/*!
- * \brief Create a new XbusParser object.
- * \param callback Pointer to callback structure containing callback functions
- * for memory management and handling received messages.
- * \returns Pointer the new XbusParser structure.
- *
- * Uses malloc to allocate the memory required for the parser.
- */
-struct XbusParser* XbusParser_create(struct XbusParserCallback const* callback)
-{
-	void* mem = malloc(XbusParser_mem());
-	if (mem)
-	{
-		return XbusParser_init(mem, callback);
-	}
-	return NULL;
-}
-
-/*!
- * \brief Frees an XbusParser structure allocated by XbusParser_create().
- */
-void XbusParser_destroy(struct XbusParser* parser)
-{
-	free(parser);
-}
-
-/*!
- * \brief Initializes an XbusParser in the passed memory location.
- * \param parserMem Pointer to memory to use for storing parser state. Should
- * be at least as big as the value returned by XbusParser_mem().
- * \param callback Pointer to callback structure containing callback functions
- * for memory management and handling received messages.
- * \returns Initialized XbusParser structure.
- */
-struct XbusParser* XbusParser_init(void* parserMem, struct XbusParserCallback const* callback)
-{
-	struct XbusParser* parser = (struct XbusParser*)parserMem;
-	parser->state = XBPS_Preamble;
-	parser->callbacks.allocateBuffer = callback->allocateBuffer;
-	parser->callbacks.deallocateBuffer = callback->deallocateBuffer;
-	parser->callbacks.handleMessage = callback->handleMessage;
-	return parser;
-}
-
-/*!
- * \brief Parse an XMID_DeviceId message to extract the device ID value.
-
- * Replaces the raw Xbus message data with the device ID.
- */
-static void parseDeviceId(struct XbusParser* parser, uint8_t const* rawData)
-{
-	uint32_t* deviceId = parser->callbacks.allocateBuffer(sizeof(uint32_t));
-	if (deviceId)
-	{
-		XbusUtility_readU32(deviceId, rawData);
-		parser->currentMessage.data = deviceId;
-		parser->currentMessage.length = 1;
-	}
-	else
-	{
-		parser->currentMessage.data = NULL;
-	}
-}
-
-/*!
- * \brief Parse an XMID_OutputConfig message.
- *
- * Replaces the raw Xbus message data with an array of OutputConfiguration
- * structures.
- */
-static void parseOutputConfig(struct XbusParser* parser, uint8_t const* rawData)
-{
-	uint8_t fields = parser->currentMessage.length / 4;
-	struct OutputConfiguration* conf = parser->callbacks.allocateBuffer(fields * sizeof(struct OutputConfiguration));
-	if (conf)
-	{
-		parser->currentMessage.data = conf;
-		parser->currentMessage.length = fields;
-
-		for (int i = 0; i < fields; ++i)
-		{
-			rawData = XbusUtility_readU16((uint16_t*)&conf->dtype, rawData);
-			rawData = XbusUtility_readU16(&conf->freq, rawData);
-			++conf;
-		}
-	}
-	else
-	{
-		parser->currentMessage.data = NULL;
-	}
-}
-
-/*!
- * \brief Converts raw Xbus payload data to native structures if possible.
- *
- * Raw data payloads are converted to native data structures and the
- * message data pointer is changed to point to the native structure.
- * The raw data is automatically deallocated.
- */
-static void parseMessagePayload(struct XbusParser* parser)
-{
-	uint8_t const* const rawData = parser->currentMessage.data;
-	switch (parser->currentMessage.mid)
-	{
-		default:
-			// Leave parsing and memory management to user code
-			return;
-
-		case XMID_DeviceId:
-			parseDeviceId(parser, rawData);
-			break;
-
-		case XMID_OutputConfig:
-			parseOutputConfig(parser, rawData);
-			break;
-	}
-
-	if (rawData)
-		parser->callbacks.deallocateBuffer(rawData);
-}
-
-/*!
- * \brief Prepare for receiving a message payload.
- *
- * Requests a memory area to store the received data to using the
- * registered callbacks.
- */
-void prepareForPayload(struct XbusParser* parser)
-{
-	parser->payloadReceived = 0;
-	parser->currentMessage.data = parser->callbacks.allocateBuffer(parser->currentMessage.length);
-}
-
-/*!
- * \brief Parse a byte of data from a motion tracker.
- *
- * When a complete message is received the user will be notified by a call
- * to the handleMessage() callback function.
- */
-void XbusParser_parseByte(struct XbusParser* parser, const uint8_t byte)
-{
-	switch (parser->state)
-	{
-		case XBPS_Preamble:
-			if (byte == XBUS_PREAMBLE)
-			{
-				parser->checksum = 0;
-				parser->state = XBPS_BusId;
-			}
-			break;
-
-		case XBPS_BusId:
-			parser->checksum += byte;
-			parser->state = XBPS_MessageId;
-			break;
-
-		case XBPS_MessageId:
-			parser->checksum += byte;
-			parser->currentMessage.mid = (enum XsMessageId)byte;
-			parser->state = XBPS_Length;
-			break;
-
-		case XBPS_Length:
-			parser->checksum += byte;
-			if (byte == XBUS_NO_PAYLOAD)
-			{
-				parser->currentMessage.length = byte;
-				parser->currentMessage.data = NULL;
-				parser->state = XBPS_Checksum;
-			}
-			else if (byte < XBUS_EXTENDED_LENGTH)
-			{
-				parser->currentMessage.length = byte;
-				prepareForPayload(parser);
-				parser->state = XBPS_Payload;
-			}
-			else
-			{
-				parser->state = XBPS_ExtendedLengthMsb;
-			}
-			break;
-
-		case XBPS_ExtendedLengthMsb:
-			parser->checksum += byte;
-			parser->currentMessage.length = ((uint16_t)byte) << 8;
-			parser->state = XBPS_ExtendedLengthLsb;
-			break;
-
-		case XBPS_ExtendedLengthLsb:
-			parser->checksum += byte;
-			parser->currentMessage.length |= byte;
-			prepareForPayload(parser);
-			parser->state = XBPS_Payload;
-			break;
-
-		case XBPS_Payload:
-			parser->checksum += byte;
-			if (parser->currentMessage.data)
-			{
-				((uint8_t*)parser->currentMessage.data)[parser->payloadReceived] = byte;
-			}
-			if (++parser->payloadReceived == parser->currentMessage.length)
-			{
-				parser->state = XBPS_Checksum;
-			}
-			break;
-
-		case XBPS_Checksum:
-			parser->checksum += byte;
-			if ((parser->checksum == 0) &&
-					((parser->currentMessage.length == 0) ||
-					 parser->currentMessage.data))
-			{
-				parseMessagePayload(parser);
-				parser->callbacks.handleMessage(&parser->currentMessage);
-			}
-			else if (parser->currentMessage.data)
-			{
-				parser->callbacks.deallocateBuffer(parser->currentMessage.data);
-			}
-			parser->state = XBPS_Preamble;
-			break;
-	}
-}
-
-/*!
- * \brief Parse a buffer of data received from a motion tracker.
- */
-void XbusParser_parseBuffer(struct XbusParser* parser, uint8_t const* buf, size_t bufSize)
-{
-	for (size_t i = 0; i < bufSize; ++i)
-	{
-		XbusParser_parseByte(parser, buf[i]);
-	}
-}
-
--- a/xbus/xbusparser.h	Fri Jun 12 13:23:26 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-/*!
- * \file
- * \copyright Copyright (C) Xsens Technologies B.V., 2015.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy
- * of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
-
-#ifndef __XBUSPARSER_H
-#define __XBUSPARSER_H
-
-#include <stddef.h>
-#include <stdint.h>
-#include "xbusmessage.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct XbusParser;
-
-/*!
- * \brief Callback function structure for use with the XbusParser.
- */
-struct XbusParserCallback
-{
-	/*!
-	 * \brief Allocate a buffer for message reception.
-	 * \param bufSize The size of the buffer to allocate.
-	 * \returns Pointer to buffer to use for message reception, or NULL if
-	 * a buffer cannot be allocated.
-	 *
-	 * \note It is the resposibility of the user to deallocate the message
-	 * data buffers pointed to by XbusMessage structures passed to the
-	 * handleMessage() callback function.
-	 */
-	void* (*allocateBuffer)(size_t bufSize);
-
-	/*!
-	 * \brief Deallocate a buffer that was previously allocated by a call to
-	 * allocateBuffer.
-	 */
-	void (*deallocateBuffer)(void const* buffer);
-
-	/*!
-	 * \brief Handle a received message.
-	 *
-	 * \note If the passed XbusMessage structure has a non-null data pointer
-	 * then it is the responsibility of the user to free this once handling
-	 * of the message is complete.
-	 */
-	void (*handleMessage)(struct XbusMessage const* message);
-};
-
-size_t XbusParser_mem(void);
-struct XbusParser* XbusParser_create(struct XbusParserCallback const* callback);
-void XbusParser_destroy(struct XbusParser* parser);
-struct XbusParser* XbusParser_init(void* parserMem, struct XbusParserCallback const* callback);
-
-void XbusParser_parseByte(struct XbusParser* parser, uint8_t byte);
-void XbusParser_parseBuffer(struct XbusParser* parser, uint8_t const* buf, size_t bufSize);
-
-#ifdef __cplusplus
-}
-#endif // extern "C"
-
-#endif // __XBUSPARSER_H
--- a/xbus/xbusutility.c	Fri Jun 12 13:23:26 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,95 +0,0 @@
-/*!
- * \file
- * \copyright Copyright (C) Xsens Technologies B.V., 2015.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy
- * of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
-
-#include "xbusutility.h"
-
-/*!
- * \name Xbus message reading utility functions.
- * Xbus messages use big-endian representations for multibyte data.
- * These functions help in reading data from an Xbus message and converting
- * it to a native type.
- *
- * The functions are intended to scan over a message as follows:
- * \code
- * void readValues(XbusMessage const* message)
- * {
- *     uint16_t v1;
- *     uint8_t v2;
- *     uint32_t v3;
- *     uint8_t* dptr = message->data;
- *     dptr = XbusUtility_readU16(&v1, dptr);
- *     dptr = XbusUtility_readU8(&v2, dptr);
- *     dptr = XbusUtility_readU32(&v3, dptr);
- * }
- * \endcode
- * \{
- */
-/*!
- * \brief Read a uint8_t value from an Xbus message.
- */
-uint8_t const* XbusUtility_readU8(uint8_t* out, uint8_t const* in)
-{
-	*out = *in;
-	return ++in;
-}
-
-/*! \brief Read a uint16_t value from an Xbus message. */
-uint8_t const* XbusUtility_readU16(uint16_t* out, uint8_t const* in)
-{
-	*out = (in[0] << 8) | in[1];
-	return in + sizeof(uint16_t);
-}
-
-/*! \brief Read a uint32_t value from an Xbus message. */
-uint8_t const* XbusUtility_readU32(uint32_t* out, uint8_t const* in)
-{
-	*out = (in[0] << 24) | (in[1] << 16) | (in[2] << 8) | in[3];
-	return in + sizeof(uint32_t);
-}
-/*! \} */
-
-/*!
- * \name Xbus message writing utility functions.
- * These functions aid in writing native values to big-endian xbus message
- * payloads. See corresponding reading functions for further details.
- * \{
- */
-/*! \brief Write a uint8_t value to an Xbus message. */
-uint8_t* XbusUtility_writeU8(uint8_t* out, uint8_t in)
-{
-	*out++ = in;
-	return out;
-}
-
-/*! \brief Write a uint16_t value to an Xbus message. */
-uint8_t* XbusUtility_writeU16(uint8_t* out, uint16_t in)
-{
-	*out++ = (in >> 8) & 0xFF;
-	*out++ = in & 0xFF;
-	return out;
-}
-
-/*! \brief Write a uint32_t value to an Xbus message. */
-uint8_t* XbusUtility_writeU32(uint8_t* out, uint32_t in)
-{
-	*out++ = (in >> 24) & 0xFF;
-	*out++ = (in >> 16) & 0xFF;
-	*out++ = (in >> 8) & 0xFF;
-	*out++ = in & 0xFF;
-	return out;
-}
-/*! \}  */
--- a/xbus/xbusutility.h	Fri Jun 12 13:23:26 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/*!
- * \file
- * \copyright Copyright (C) Xsens Technologies B.V., 2015.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy
- * of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
-
-#ifndef __XBUSUTILITY_H
-#define __XBUSUTILITY_H
-
-#include <stdint.h>
-
-uint8_t const* XbusUtility_readU8(uint8_t* out, uint8_t const* in);
-uint8_t const* XbusUtility_readU16(uint16_t* out, uint8_t const* in);
-uint8_t const* XbusUtility_readU32(uint32_t* out, uint8_t const* in);
-
-uint8_t* XbusUtility_writeU8(uint8_t* out, uint8_t in);
-uint8_t* XbusUtility_writeU16(uint8_t* out, uint16_t in);
-uint8_t* XbusUtility_writeU32(uint8_t* out, uint32_t in);
-
-#endif // __XBUSUTILITY_H
--- a/xbus/xsdeviceid.c	Fri Jun 12 13:23:26 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-/*!
- * \file
- * \copyright Copyright (C) Xsens Technologies B.V., 2015.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy
- * of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
-
-#include "xsdeviceid.h"
-
-/*!
- * \brief Return true if device ID corresponds to a MTi-1 series device.
- */
-bool XsDeviceId_isMtMk4_X(uint32_t deviceId)
-{
-	uint8_t deviceSeries = (deviceId >> 20) & 0xF;
-	return ((deviceSeries == 0x8) || (deviceSeries == 0xC));
-}
-
-/*!
- * \brief Get a string describing the function of the MTi device.
- */
-char const* XsDeviceId_functionDescription(enum DeviceFunction function)
-{
-	switch (function)
-	{
-		case DF_IMU:
-			return "Inertial Measurement Unit";
-
-		case DF_VRU:
-			return "Vertical Reference Unit";
-
-		case DF_AHRS:
-			return "Attitude Heading Reference System";
-	}
-
-	return "Unknown device function";
-}
-
--- a/xbus/xsdeviceid.h	Fri Jun 12 13:23:26 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*!
- * \file
- * \copyright Copyright (C) Xsens Technologies B.V., 2015.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy
- * of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
-
-#ifndef __XSDEVICEID_H
-#define __XSDEVICEID_H
-
-#include <stdint.h>
-#include <stdbool.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-bool XsDeviceId_isMtMk4_X(uint32_t deviceId);
-
-enum DeviceFunction
-{
-	/*! \brief Inertial Measurement Unit. */
-	DF_IMU  = 1,
-	/*! \brief Vertical Reference Unit. */
-	DF_VRU  = 2,
-	/*! \brief Attitude Heading Reference System. */
-	DF_AHRS = 3
-};
-
-/*!
- * \brief Get the function of the MTi device.
- */
-static inline enum DeviceFunction XsDeviceId_getFunction(uint32_t deviceId)
-{
-	return (enum DeviceFunction)((deviceId >> 24) & 0xF);
-}
-
-char const* XsDeviceId_functionDescription(enum DeviceFunction function);
-
-#ifdef __cplusplus
-}
-#endif // extern "C"
-
-#endif // __XSDEVICEID_H