Xsens / Mbed 2 deprecated MTi-1_fwu_example

Dependencies:   mbed-rtos mbed

Committer:
tjerkhofmeijer
Date:
Tue Nov 24 13:35:07 2015 +0100
Revision:
0:6fca643f1aff
Child:
5:63985ca16eb9
Initial publication of embedded firmware updater example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tjerkhofmeijer 0:6fca643f1aff 1 /*!
tjerkhofmeijer 0:6fca643f1aff 2 * \file
tjerkhofmeijer 0:6fca643f1aff 3 * \copyright Copyright (C) Xsens Technologies B.V., 2015.
tjerkhofmeijer 0:6fca643f1aff 4 *
tjerkhofmeijer 0:6fca643f1aff 5 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
tjerkhofmeijer 0:6fca643f1aff 6 * use this file except in compliance with the License. You may obtain a copy
tjerkhofmeijer 0:6fca643f1aff 7 * of the License at
tjerkhofmeijer 0:6fca643f1aff 8 *
tjerkhofmeijer 0:6fca643f1aff 9 * http://www.apache.org/licenses/LICENSE-2.0
tjerkhofmeijer 0:6fca643f1aff 10 *
tjerkhofmeijer 0:6fca643f1aff 11 * Unless required by applicable law or agreed to in writing, software
tjerkhofmeijer 0:6fca643f1aff 12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
tjerkhofmeijer 0:6fca643f1aff 13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
tjerkhofmeijer 0:6fca643f1aff 14 * License for the specific language governing permissions and limitations
tjerkhofmeijer 0:6fca643f1aff 15 * under the License.
tjerkhofmeijer 0:6fca643f1aff 16 */
tjerkhofmeijer 0:6fca643f1aff 17 #include "mtinterface_mtssp.h"
tjerkhofmeijer 0:6fca643f1aff 18 #include "mbed.h"
tjerkhofmeijer 0:6fca643f1aff 19 #include "rtos.h"
tjerkhofmeijer 0:6fca643f1aff 20 #include "board.h"
tjerkhofmeijer 0:6fca643f1aff 21 #include "xbusmessage.h"
tjerkhofmeijer 0:6fca643f1aff 22 #include "xbusparser.h"
tjerkhofmeijer 0:6fca643f1aff 23 #include "assert.h"
tjerkhofmeijer 0:6fca643f1aff 24 #include "xbusdef.h"
tjerkhofmeijer 0:6fca643f1aff 25
tjerkhofmeijer 0:6fca643f1aff 26
tjerkhofmeijer 0:6fca643f1aff 27 /*! \class MtInterfaceMtssp
tjerkhofmeijer 0:6fca643f1aff 28 \brief Implementation of MtInterface for the MTSSP protocol
tjerkhofmeijer 0:6fca643f1aff 29
tjerkhofmeijer 0:6fca643f1aff 30 MTSSP is the protocol used for communicating with an Xsens motion tracker over I2C or SPI.
tjerkhofmeijer 0:6fca643f1aff 31 */
tjerkhofmeijer 0:6fca643f1aff 32
tjerkhofmeijer 0:6fca643f1aff 33
tjerkhofmeijer 0:6fca643f1aff 34 /*! \brief Constructor
tjerkhofmeijer 0:6fca643f1aff 35 \param driver Pointer to an MtsspDriver
tjerkhofmeijer 0:6fca643f1aff 36 */
tjerkhofmeijer 0:6fca643f1aff 37 MtInterfaceMtssp::MtInterfaceMtssp(MtsspDriver *driver)
tjerkhofmeijer 0:6fca643f1aff 38 : m_driver(driver)
tjerkhofmeijer 0:6fca643f1aff 39 {
tjerkhofmeijer 0:6fca643f1aff 40 m_dataReady = new DigitalIn(MT_DRDY);
tjerkhofmeijer 0:6fca643f1aff 41 }
tjerkhofmeijer 0:6fca643f1aff 42
tjerkhofmeijer 0:6fca643f1aff 43
tjerkhofmeijer 0:6fca643f1aff 44 /*! \brief Destructor
tjerkhofmeijer 0:6fca643f1aff 45 */
tjerkhofmeijer 0:6fca643f1aff 46 MtInterfaceMtssp::~MtInterfaceMtssp()
tjerkhofmeijer 0:6fca643f1aff 47 {
tjerkhofmeijer 0:6fca643f1aff 48 delete m_dataReady;
tjerkhofmeijer 0:6fca643f1aff 49 }
tjerkhofmeijer 0:6fca643f1aff 50
tjerkhofmeijer 0:6fca643f1aff 51
tjerkhofmeijer 0:6fca643f1aff 52 /*! \brief Must be polled in the main application loop
tjerkhofmeijer 0:6fca643f1aff 53 */
tjerkhofmeijer 0:6fca643f1aff 54 void MtInterfaceMtssp::process()
tjerkhofmeijer 0:6fca643f1aff 55 {
tjerkhofmeijer 0:6fca643f1aff 56 if (*m_dataReady)
tjerkhofmeijer 0:6fca643f1aff 57 {
tjerkhofmeijer 0:6fca643f1aff 58 handleDataReady();
tjerkhofmeijer 0:6fca643f1aff 59 }
tjerkhofmeijer 0:6fca643f1aff 60 }
tjerkhofmeijer 0:6fca643f1aff 61
tjerkhofmeijer 0:6fca643f1aff 62
tjerkhofmeijer 0:6fca643f1aff 63 /*! \brief Sends an xbus message to the motion tracker
tjerkhofmeijer 0:6fca643f1aff 64 \param xbusMessage Pointer to xbus message which should be send
tjerkhofmeijer 0:6fca643f1aff 65 */
tjerkhofmeijer 0:6fca643f1aff 66 void MtInterfaceMtssp::sendXbusMessage(XbusMessage const* xbusMessage)
tjerkhofmeijer 0:6fca643f1aff 67 {
tjerkhofmeijer 0:6fca643f1aff 68 uint8_t* buf = (uint8_t*)allocateMessageData(xbusMessage->m_length + 4);
tjerkhofmeijer 0:6fca643f1aff 69 size_t rawLength = XbusMessage_createRawMessage(buf, xbusMessage, m_driver->busFormat());
tjerkhofmeijer 0:6fca643f1aff 70 m_driver->writeRaw(buf, rawLength);
tjerkhofmeijer 0:6fca643f1aff 71 deallocateMessageData(buf);
tjerkhofmeijer 0:6fca643f1aff 72 }
tjerkhofmeijer 0:6fca643f1aff 73
tjerkhofmeijer 0:6fca643f1aff 74
tjerkhofmeijer 0:6fca643f1aff 75 /*! \brief Returns the low level bus format used
tjerkhofmeijer 0:6fca643f1aff 76 */
tjerkhofmeijer 0:6fca643f1aff 77 XbusBusFormat MtInterfaceMtssp::busFormat()
tjerkhofmeijer 0:6fca643f1aff 78 {
tjerkhofmeijer 0:6fca643f1aff 79 return m_driver->busFormat();
tjerkhofmeijer 0:6fca643f1aff 80 }
tjerkhofmeijer 0:6fca643f1aff 81
tjerkhofmeijer 0:6fca643f1aff 82
tjerkhofmeijer 0:6fca643f1aff 83 /*! \brief Should be called if the data ready line from the motion tracker signals that there is data pending
tjerkhofmeijer 0:6fca643f1aff 84 */
tjerkhofmeijer 0:6fca643f1aff 85 void MtInterfaceMtssp::handleDataReady()
tjerkhofmeijer 0:6fca643f1aff 86 {
tjerkhofmeijer 0:6fca643f1aff 87 uint16_t notificationMessageSize = 0;
tjerkhofmeijer 0:6fca643f1aff 88 uint16_t measurementMessageSize = 0;
tjerkhofmeijer 0:6fca643f1aff 89 readPipeStatus(&notificationMessageSize, &measurementMessageSize);
tjerkhofmeijer 0:6fca643f1aff 90
tjerkhofmeijer 0:6fca643f1aff 91 uint16_t size;
tjerkhofmeijer 0:6fca643f1aff 92 uint8_t pipe;
tjerkhofmeijer 0:6fca643f1aff 93 if (notificationMessageSize)
tjerkhofmeijer 0:6fca643f1aff 94 {
tjerkhofmeijer 0:6fca643f1aff 95 size = notificationMessageSize;
tjerkhofmeijer 0:6fca643f1aff 96 pipe = XBUS_NOTIFICATION_PIPE;
tjerkhofmeijer 0:6fca643f1aff 97 }
tjerkhofmeijer 0:6fca643f1aff 98 else if (measurementMessageSize)
tjerkhofmeijer 0:6fca643f1aff 99 {
tjerkhofmeijer 0:6fca643f1aff 100 size = measurementMessageSize;
tjerkhofmeijer 0:6fca643f1aff 101 pipe = XBUS_MEASUREMENT_PIPE;
tjerkhofmeijer 0:6fca643f1aff 102 }
tjerkhofmeijer 0:6fca643f1aff 103 else
tjerkhofmeijer 0:6fca643f1aff 104 {
tjerkhofmeijer 0:6fca643f1aff 105 return;
tjerkhofmeijer 0:6fca643f1aff 106 }
tjerkhofmeijer 0:6fca643f1aff 107
tjerkhofmeijer 0:6fca643f1aff 108 uint8_t* buffer = (uint8_t*)allocateMessageData(size + 3);
tjerkhofmeijer 0:6fca643f1aff 109 buffer[0] = XBUS_PREAMBLE;
tjerkhofmeijer 0:6fca643f1aff 110 buffer[1] = XBUS_MASTERDEVICE;
tjerkhofmeijer 0:6fca643f1aff 111 readFromPipe(&buffer[2], size, pipe);
tjerkhofmeijer 0:6fca643f1aff 112 XbusParser_parseBuffer(m_xbusParser, buffer, 2 + size);
tjerkhofmeijer 0:6fca643f1aff 113 deallocateMessageData(buffer);
tjerkhofmeijer 0:6fca643f1aff 114 }
tjerkhofmeijer 0:6fca643f1aff 115
tjerkhofmeijer 0:6fca643f1aff 116
tjerkhofmeijer 0:6fca643f1aff 117 /*! \brief Read MTSSP protocol info
tjerkhofmeijer 0:6fca643f1aff 118 \param[out] version Pointer to receive the version byte
tjerkhofmeijer 0:6fca643f1aff 119 \param[out] dataReadyConfig Pointer to receive the data ready configuration byte
tjerkhofmeijer 0:6fca643f1aff 120 \sa configureProtocol
tjerkhofmeijer 0:6fca643f1aff 121 */
tjerkhofmeijer 0:6fca643f1aff 122 void MtInterfaceMtssp::readProtocolInfo(uint8_t* version, uint8_t* dataReadyConfig)
tjerkhofmeijer 0:6fca643f1aff 123 {
tjerkhofmeijer 0:6fca643f1aff 124 uint8_t rxdata[2];
tjerkhofmeijer 0:6fca643f1aff 125 m_driver->read(XBUS_PROTOCOL_INFO, rxdata, sizeof(rxdata));
tjerkhofmeijer 0:6fca643f1aff 126 *version = rxdata[0];
tjerkhofmeijer 0:6fca643f1aff 127 *dataReadyConfig = rxdata[1];
tjerkhofmeijer 0:6fca643f1aff 128 }
tjerkhofmeijer 0:6fca643f1aff 129
tjerkhofmeijer 0:6fca643f1aff 130
tjerkhofmeijer 0:6fca643f1aff 131 /*! \brief Write MTSSP protocol settings
tjerkhofmeijer 0:6fca643f1aff 132 \param dataReadyConfig The data ready configuration which must be set
tjerkhofmeijer 0:6fca643f1aff 133
tjerkhofmeijer 0:6fca643f1aff 134 Bit 7:4 Reserved \n
tjerkhofmeijer 0:6fca643f1aff 135 Bit 3 Measurement pipe DRDY event enable: 0 = disabled, 1 = enabled \n
tjerkhofmeijer 0:6fca643f1aff 136 Bit 2 Notification pipe DRDY event enable: 0 = disabled, 1 = enabled \n
tjerkhofmeijer 0:6fca643f1aff 137 Bit 1 Output type of DRDY pin: = 0 Push/pull, 1 = open drain \n
tjerkhofmeijer 0:6fca643f1aff 138 Bit 0 Polarity of DRDY signal: 0 = Idle low, 1 = Idle high \n
tjerkhofmeijer 0:6fca643f1aff 139 \sa readProtocolInfo
tjerkhofmeijer 0:6fca643f1aff 140 */
tjerkhofmeijer 0:6fca643f1aff 141 void MtInterfaceMtssp::configureProtocol(uint8_t dataReadyConfig)
tjerkhofmeijer 0:6fca643f1aff 142 {
tjerkhofmeijer 0:6fca643f1aff 143 m_driver->write(XBUS_CONFIGURE_PROTOCOL, &dataReadyConfig, sizeof(dataReadyConfig));
tjerkhofmeijer 0:6fca643f1aff 144 }
tjerkhofmeijer 0:6fca643f1aff 145
tjerkhofmeijer 0:6fca643f1aff 146
tjerkhofmeijer 0:6fca643f1aff 147 /*! \brief Read the pipe status
tjerkhofmeijer 0:6fca643f1aff 148 \param[out] notificationMessageSize Pointer for returning the number of pending notification bytes
tjerkhofmeijer 0:6fca643f1aff 149 \param[out] measurementMessageSize Pointer for returning the number of pending measurement bytes
tjerkhofmeijer 0:6fca643f1aff 150 */
tjerkhofmeijer 0:6fca643f1aff 151 void MtInterfaceMtssp::readPipeStatus(uint16_t *notificationMessageSize, uint16_t* measurementMessageSize)
tjerkhofmeijer 0:6fca643f1aff 152 {
tjerkhofmeijer 0:6fca643f1aff 153 uint8_t status[4];
tjerkhofmeijer 0:6fca643f1aff 154 m_driver->read(XBUS_PIPE_STATUS, status, sizeof(status));
tjerkhofmeijer 0:6fca643f1aff 155 *notificationMessageSize = status[0] | (status[1] << 8);
tjerkhofmeijer 0:6fca643f1aff 156 *measurementMessageSize = status[2] | (status[3] << 8);
tjerkhofmeijer 0:6fca643f1aff 157 }
tjerkhofmeijer 0:6fca643f1aff 158
tjerkhofmeijer 0:6fca643f1aff 159
tjerkhofmeijer 0:6fca643f1aff 160 /*! \brief Read from notification or measurement data pipe
tjerkhofmeijer 0:6fca643f1aff 161 \param buffer Result buffer
tjerkhofmeijer 0:6fca643f1aff 162 \param size Number of bytes to read
tjerkhofmeijer 0:6fca643f1aff 163 \param pipe Pipe from which to read, XBUS_NOTIFICATION_PIPE or XBUS_MEASUREMENT_PIPE
tjerkhofmeijer 0:6fca643f1aff 164 */
tjerkhofmeijer 0:6fca643f1aff 165 void MtInterfaceMtssp::readFromPipe(uint8_t* buffer, uint16_t size, uint8_t pipe)
tjerkhofmeijer 0:6fca643f1aff 166 {
tjerkhofmeijer 0:6fca643f1aff 167 m_driver->read(pipe, buffer, size);
tjerkhofmeijer 0:6fca643f1aff 168 }