Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
mtinterface/mtinterface_mtssp.cpp@0:6fca643f1aff, 2015-11-24 (annotated)
- 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?
| User | Revision | Line number | New 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(¬ificationMessageSize, &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 | } |

