Program Listing for File utils.hpp

Return to documentation for file (/tmp/ws/src/ublox_dgnss/ublox_dgnss_node/include/ublox_dgnss_node/ubx/utils.hpp)

// Copyright 2021 Australian Robotics Supplies & Technology
//
// 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 UBLOX_DGNSS_NODE__UBX__UTILS_HPP_
#define UBLOX_DGNSS_NODE__UBX__UTILS_HPP_
#include <string>
#include <sstream>
#include <vector>
#include "ublox_dgnss_node/ubx/ubx_types.hpp"

namespace ubx
{
// inline u1_t* u2_to_u1_array(u2_t u2) {
//   u1_t *u1_array = new u1_t[2];
//   u1_array[0] = u2 & 0xff;
//   u1_array[1] = u2 >> 8;
//   return u1_array;
// }

// inline i1_t* i2_to_i1_array(i2_t i2) {
//   i1_t *i1_array = new i1_t[2];
//   i1_array[0] = i2 & 0xff;
//   i1_array[1] = i2 >> 8;
//   return i1_array;
// }

// inline x1_t* x2_to_x1_array(x2_t x2) {
//   x1_t *x1_array = new x1_t[2];
//   x1_array[0] = x2 & 0xff;
//   x1_array[1] = x2 >> 8;
//   return x1_array;
// }

// inline u1_t* u4_to_u1_array(u4_t u4) {
//   u1_t *u1_array = new u1_t[4];
//   u1_array[0] = u4 & 0xff;
//   u1_array[1] = u4 >> 8;
//   u1_array[2] = u4 >> 16;
//   u1_array[3] = u4 >> 24;
//   return u1_array;
// }

// inline i1_t* i4_to_i1_array(i4_t i4) {
//   i1_t *i1_array = new i1_t[4];
//   i1_array[0] = i4 & 0xff;
//   i1_array[1] = i4 >> 8;
//   i1_array[2] = i4 >> 16;
//   i1_array[3] = i4 >> 24;
//   return i1_array;
// }

// inline x1_t* x4_to_x1_array(x4_t x4) {
//   x1_t *x1_array = new x1_t[4];
//   x1_array[0] = x4 & 0xff;
//   x1_array[1] = x4 >> 8;
//   x1_array[2] = x4 >> 16;
//   x1_array[3] = x4 >> 24;
//   return x1_array;
// }

inline void buf_append_u2(std::vector<u1_t> * buf, u2_t u2)
{
  buf->push_back(u2 & 0xff);
  buf->push_back(u2 >> 8);
}

inline void buf_append_i2(std::vector<u1_t> * buf, i2_t i2)
{
  buf->push_back(i2 & 0xff);
  buf->push_back(i2 >> 8);
}

inline void buf_append_x2(std::vector<u1_t> * buf, x2_t x2)
{
  buf->push_back(x2 & 0xff);
  buf->push_back(x2 >> 8);
}

inline void buf_append_u4(std::vector<u1_t> * buf, u4_t u4)
{
  buf->push_back(u4 & 0xff);
  buf->push_back(u4 >> 8);
  buf->push_back(u4 >> 16);
  buf->push_back(u4 >> 24);
}

inline void buf_append_i4(std::vector<u1_t> * buf, i4_t i4)
{
  buf->push_back(i4 & 0xff);
  buf->push_back(i4 >> 8);
  buf->push_back(i4 >> 16);
  buf->push_back(i4 >> 24);
}

inline void buf_append_x4(std::vector<u1_t> * buf, x4_t x4)
{
  buf->push_back(x4 & 0xff);
  buf->push_back(x4 >> 8);
  buf->push_back(x4 >> 16);
  buf->push_back(x4 >> 24);
}

// todo check this
inline void buf_append_r4(std::vector<u1_t> * buf, r4_t r4)
{
  r4_bin_t r4_bin = {r4};
  buf->push_back(r4_bin.bytes[0]);
  buf->push_back(r4_bin.bytes[1]);
  buf->push_back(r4_bin.bytes[2]);
  buf->push_back(r4_bin.bytes[3]);
}

inline void buf_append_r4_bin(std::vector<u1_t> * buf, r4_bin_t r4_bin)
{
  buf->push_back(r4_bin.bytes[0]);
  buf->push_back(r4_bin.bytes[1]);
  buf->push_back(r4_bin.bytes[2]);
  buf->push_back(r4_bin.bytes[3]);
}

// todo check this
inline void buf_append_r8(std::vector<u1_t> * buf, r8_t r8)
{
  r8_bin_t r8_bin = {r8};
  buf->push_back(r8_bin.bytes[0]);
  buf->push_back(r8_bin.bytes[1]);
  buf->push_back(r8_bin.bytes[2]);
  buf->push_back(r8_bin.bytes[3]);
  buf->push_back(r8_bin.bytes[4]);
  buf->push_back(r8_bin.bytes[5]);
  buf->push_back(r8_bin.bytes[6]);
  buf->push_back(r8_bin.bytes[7]);
}

inline void buf_append_r8_bin(std::vector<u1_t> * buf, r8_bin_t r8_bin)
{
  buf->push_back(r8_bin.bytes[0]);
  buf->push_back(r8_bin.bytes[1]);
  buf->push_back(r8_bin.bytes[2]);
  buf->push_back(r8_bin.bytes[3]);
  buf->push_back(r8_bin.bytes[4]);
  buf->push_back(r8_bin.bytes[5]);
  buf->push_back(r8_bin.bytes[6]);
  buf->push_back(r8_bin.bytes[7]);
}

// inline u2_t buf_offset_u2(std::vector<u1_t> *buf, uint16_t offset) {
//   auto value = (u2_t)buf->data()+offset;
//   return swap_endian(value);
// }

// inline i2_t buf_offset_i2(std::vector<u1_t> *buf, uint16_t offset) {
//   auto value = (i2_t)buf->data()+offset;
//   return swap_endian(value);
// }

// inline u4_t buf_offset_u4(std::vector<u1_t> *buf, uint16_t offset) {
//   auto value = (u2_t)buf->data()+offset;
//   return swap_endian(value);
// }

// inline i4_t buf_offset_i4(std::vector<u1_t> *buf, uint16_t offset) {
//   auto ptr = buf->data()+offset;
//   i4_t value = (ptr[0] << 0 | ptr[0] << 8 | ptr[0] << 16 | ptr[0] << 24);
//   return value;
// }

template<typename T>
inline T swap_endian(T & value)
{
  union U {
    T value;
    std::array<ubx::u1_t, sizeof(T)> bytes;
  } src, dst;

  src.value = value;
  std::reverse_copy(src.bytes.begin(), src.bytes.end(), dst.bytes.begin());
  return dst.value;
}

template<typename T>
inline T buf_offset(std::vector<u1_t> * buf, u2_t offset)
{
  T value;
  memcpy(&value, buf->data() + offset, sizeof(T));
  return value;
}

template<typename T>
std::string to_hex(T & value)
{
  std::ostringstream oss;
  size_t width = sizeof(value) / 4;
  oss << std::setfill('0') << std::setw(width) << std::right << std::hex << +value;
  return oss.str();
}
}  // namespace ubx
#endif  // UBLOX_DGNSS_NODE__UBX__UTILS_HPP_