Basic implementation of Xbus message parsing and generation for embedded processors. The code has no dependencies and should also work for other MCU architectures than ARM provided a C99 compiler is available.
Dependents: MTi-1_example_LPC1768 MTi-1_rikbeun MTi-1_example MTi-1_example ... more
xbusutility.c
00001 /*! 00002 * \file 00003 * \copyright Copyright (C) Xsens Technologies B.V., 2015. 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 00006 * use this file except in compliance with the License. You may obtain a copy 00007 * of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 00013 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 00014 * License for the specific language governing permissions and limitations 00015 * under the License. 00016 */ 00017 00018 #include "xbusutility.h " 00019 00020 /*! 00021 * \name Xbus message reading utility functions. 00022 * Xbus messages use big-endian representations for multibyte data. 00023 * These functions help in reading data from an Xbus message and converting 00024 * it to a native type. 00025 * 00026 * The functions are intended to scan over a message as follows: 00027 * \code 00028 * void readValues(XbusMessage const* message) 00029 * { 00030 * uint16_t v1; 00031 * uint8_t v2; 00032 * uint32_t v3; 00033 * uint8_t* dptr = message->data; 00034 * dptr = XbusUtility_readU16(&v1, dptr); 00035 * dptr = XbusUtility_readU8(&v2, dptr); 00036 * dptr = XbusUtility_readU32(&v3, dptr); 00037 * } 00038 * \endcode 00039 * \{ 00040 */ 00041 /*! 00042 * \brief Read a uint8_t value from an Xbus message. 00043 */ 00044 uint8_t const* XbusUtility_readU8(uint8_t* out, uint8_t const* in) 00045 { 00046 *out = *in; 00047 return ++in; 00048 } 00049 00050 /*! \brief Read a uint16_t value from an Xbus message. */ 00051 uint8_t const* XbusUtility_readU16(uint16_t* out, uint8_t const* in) 00052 { 00053 *out = (in[0] << 8) | in[1]; 00054 return in + sizeof(uint16_t); 00055 } 00056 00057 /*! \brief Read a uint32_t value from an Xbus message. */ 00058 uint8_t const* XbusUtility_readU32(uint32_t* out, uint8_t const* in) 00059 { 00060 *out = (in[0] << 24) | (in[1] << 16) | (in[2] << 8) | in[3]; 00061 return in + sizeof(uint32_t); 00062 } 00063 /*! \} */ 00064 00065 /*! 00066 * \name Xbus message writing utility functions. 00067 * These functions aid in writing native values to big-endian xbus message 00068 * payloads. See corresponding reading functions for further details. 00069 * \{ 00070 */ 00071 /*! \brief Write a uint8_t value to an Xbus message. */ 00072 uint8_t* XbusUtility_writeU8(uint8_t* out, uint8_t in) 00073 { 00074 *out++ = in; 00075 return out; 00076 } 00077 00078 /*! \brief Write a uint16_t value to an Xbus message. */ 00079 uint8_t* XbusUtility_writeU16(uint8_t* out, uint16_t in) 00080 { 00081 *out++ = (in >> 8) & 0xFF; 00082 *out++ = in & 0xFF; 00083 return out; 00084 } 00085 00086 /*! \brief Write a uint32_t value to an Xbus message. */ 00087 uint8_t* XbusUtility_writeU32(uint8_t* out, uint32_t in) 00088 { 00089 *out++ = (in >> 24) & 0xFF; 00090 *out++ = (in >> 16) & 0xFF; 00091 *out++ = (in >> 8) & 0xFF; 00092 *out++ = in & 0xFF; 00093 return out; 00094 } 00095 /*! \} */
Generated on Thu Jul 14 2022 08:57:02 by 1.7.2