registers.h
Go to the documentation of this file.
1 
36 #ifndef UM6_REGISTERS_H
37 #define UM6_REGISTERS_H
38 
39 #if __APPLE__
40 #include <machine/endian.h>
41 #else
42 #include <endian.h>
43 #endif
44 
45 #include <math.h>
46 #include <stdint.h>
47 #include <string.h>
48 
49 #include <stdexcept>
50 #include <string>
51 
52 #include "um6/firmware_registers.h"
53 
54 #define TO_RADIANS (M_PI / 180.0)
55 #define TO_DEGREES (180.0 / M_PI)
56 
57 // This excludes the command registers, which are always sent
58 // and received with no data.
59 #define NUM_REGISTERS (DATA_REG_START_ADDRESS + DATA_ARRAY_SIZE)
60 
61 
62 namespace um6
63 {
64 
65 inline void memcpy_network(void* dest, void* src, size_t count)
66 {
67 #if __BYTE_ORDER == __LITTLE_ENDIAN
68  uint8_t* d = reinterpret_cast<uint8_t*>(dest);
69  uint8_t* s = reinterpret_cast<uint8_t*>(src);
70  for (uint8_t i = 0; i < count; i++)
71  {
72  d[i] = s[count - (i+1)];
73  }
74 #else
75  // Copy bytes without reversing.
76 #warning Big-endian implementation is untested.
77  memcpy(dest, src, count);
78 #endif
79 }
80 
81 class Registers;
82 
93 class Accessor_
94 {
95 public:
96  Accessor_(Registers* registers, uint8_t register_index,
97  uint8_t register_width, uint8_t array_length)
98  : index(register_index), width(register_width),
99  length(array_length), registers_(registers)
100  {}
101 
102  void* raw() const;
103 
107  const uint8_t index;
108 
111  const uint8_t width;
112 
116  const uint16_t length;
117 
118 private:
120 };
121 
122 template<typename RegT>
123 class Accessor : public Accessor_
124 {
125 public:
126  Accessor(Registers* registers, uint8_t register_index, uint8_t array_length = 0, double scale_factor = 1.0)
127  : Accessor_(registers, register_index, sizeof(RegT), array_length), scale_(scale_factor)
128  {}
129 
130  RegT get(uint8_t field) const
131  {
132  RegT* raw_ptr = reinterpret_cast<RegT*>(raw());
133  RegT value;
134  memcpy_network(&value, raw_ptr + field, sizeof(value));
135  return value;
136  }
137 
138  double get_scaled(uint16_t field) const
139  {
140  return get(field) * scale_;
141  }
142 
143  void set(uint8_t field, RegT value) const
144  {
145  RegT* raw_ptr = reinterpret_cast<RegT*>(raw());
146  memcpy_network(raw_ptr + field, &value, sizeof(value));
147  }
148 
149  void set_scaled(uint16_t field, double value) const
150  {
151  set(field, value / scale_);
152  }
153 
154 private:
155  const double scale_;
156 };
157 
159 {
160 public:
162  gyro_raw(this, UM6_GYRO_RAW_XY, 3),
163  accel_raw(this, UM6_ACCEL_RAW_XY, 3),
164  mag_raw(this, UM6_MAG_RAW_XY, 3),
165  gyro(this, UM6_GYRO_PROC_XY, 3, 0.0610352 * TO_RADIANS),
166  accel(this, UM6_ACCEL_PROC_XY, 3, 0.00179639),
167  mag(this, UM6_MAG_PROC_XY, 3, 0.000305176),
168  euler(this, UM6_EULER_PHI_THETA, 3, 0.0109863 * TO_RADIANS),
169  quat(this, UM6_QUAT_AB, 4, 0.0000335693),
170  covariance(this, UM6_ERROR_COV_00, 16),
171  temperature(this, UM6_TEMPERATURE, 1),
173  misc_config(this, UM6_MISC_CONFIG, 1),
174  status(this, UM6_STATUS, 1),
175  mag_ref(this, UM6_MAG_REF_X, 3),
176  accel_ref(this, UM6_ACCEL_REF_X, 3),
177  gyro_bias(this, UM6_GYRO_BIAS_XY, 3),
178  accel_bias(this, UM6_ACCEL_BIAS_XY, 3),
179  mag_bias(this, UM6_MAG_BIAS_XY, 3),
184  {
185  memset(raw_, 0, sizeof(raw_));
186  }
187 
188  // Data
192 
193  // Configs
197 
198  // Commands
201 
202  void write_raw(uint8_t register_index, std::string data)
203  {
204  if ((register_index - 1) + (data.length()/4 - 1) >= NUM_REGISTERS)
205  {
206  throw std::range_error("Index and length write beyond boundaries of register array.");
207  }
208  memcpy(&raw_[register_index], data.c_str(), data.length());
209  }
210 
211 private:
212  uint32_t raw_[NUM_REGISTERS];
213 
214  friend class Accessor_;
215 };
216 } // namespace um6
217 
218 #endif // UM6_REGISTERS_H
um6::Accessor_
Definition: registers.h:93
um6::Registers::cmd_set_mag_ref
const Accessor< uint32_t > cmd_set_mag_ref
Definition: registers.h:200
um6::Accessor::get_scaled
double get_scaled(uint16_t field) const
Definition: registers.h:138
um6::Registers::accel_raw
const Accessor< int16_t > accel_raw
Definition: registers.h:189
UM6_SET_MAG_REF
#define UM6_SET_MAG_REF
Definition: firmware_registers.h:178
UM6_MISC_CONFIG
#define UM6_MISC_CONFIG
Definition: firmware_registers.h:38
um6::Accessor_::width
const uint8_t width
Definition: registers.h:111
um6::Registers::gyro_bias
const Accessor< int16_t > gyro_bias
Definition: registers.h:196
um6::memcpy_network
void memcpy_network(void *dest, void *src, size_t count)
Definition: registers.h:65
um6::Registers::status
const Accessor< uint32_t > status
Definition: registers.h:194
um6::Registers::mag_raw
const Accessor< int16_t > mag_raw
Definition: registers.h:189
UM6_MAG_RAW_XY
#define UM6_MAG_RAW_XY
Definition: firmware_registers.h:106
um6::Registers::cmd_reset_ekf
const Accessor< uint32_t > cmd_reset_ekf
Definition: registers.h:199
s
XmlRpcServer s
UM6_ERROR_COV_00
#define UM6_ERROR_COV_00
Definition: firmware_registers.h:118
um6::Accessor_::raw
void * raw() const
Definition: registers.cpp:39
TO_RADIANS
#define TO_RADIANS
Definition: registers.h:54
um6::Registers::temperature
const Accessor< float > temperature
Definition: registers.h:191
um6::Registers::euler
const Accessor< int16_t > euler
Definition: registers.h:190
UM6_GYRO_BIAS_XY
#define UM6_GYRO_BIAS_XY
Definition: firmware_registers.h:48
UM6_MAG_REF_X
#define UM6_MAG_REF_X
Definition: firmware_registers.h:39
um6::Accessor_::index
const uint8_t index
Definition: registers.h:107
um6::Registers::communication
const Accessor< uint32_t > communication
Definition: registers.h:194
UM6_ACCEL_BIAS_XY
#define UM6_ACCEL_BIAS_XY
Definition: firmware_registers.h:50
UM6_ACCEL_PROC_XY
#define UM6_ACCEL_PROC_XY
Definition: firmware_registers.h:110
um6::Registers::misc_config
const Accessor< uint32_t > misc_config
Definition: registers.h:194
um6::Registers::raw_
uint32_t raw_[NUM_REGISTERS]
Definition: registers.h:212
um6::Accessor
Definition: registers.h:123
um6::Registers::cmd_set_accel_ref
const Accessor< uint32_t > cmd_set_accel_ref
Definition: registers.h:200
UM6_SET_ACCEL_REF
#define UM6_SET_ACCEL_REF
Definition: firmware_registers.h:177
um6::Registers
Definition: registers.h:158
UM6_QUAT_AB
#define UM6_QUAT_AB
Definition: firmware_registers.h:116
um6::Registers::accel_bias
const Accessor< int16_t > accel_bias
Definition: registers.h:196
um6::Registers::cmd_zero_gyros
const Accessor< uint32_t > cmd_zero_gyros
Definition: registers.h:199
um6::Registers::gyro
const Accessor< int16_t > gyro
Definition: registers.h:190
NUM_REGISTERS
#define NUM_REGISTERS
Definition: registers.h:59
um6::Registers::write_raw
void write_raw(uint8_t register_index, std::string data)
Definition: registers.h:202
UM6_ACCEL_RAW_XY
#define UM6_ACCEL_RAW_XY
Definition: firmware_registers.h:104
um6
Definition: comms.h:46
um6::Registers::accel_ref
const Accessor< float > accel_ref
Definition: registers.h:195
um6::Accessor::set
void set(uint8_t field, RegT value) const
Definition: registers.h:143
um6::Accessor::get
RegT get(uint8_t field) const
Definition: registers.h:130
um6::Accessor_::registers_
Registers * registers_
Definition: registers.h:119
UM6_ZERO_GYROS
#define UM6_ZERO_GYROS
Definition: firmware_registers.h:174
d
d
um6::Registers::covariance
const Accessor< float > covariance
Definition: registers.h:191
um6::Registers::Registers
Registers()
Definition: registers.h:161
UM6_ACCEL_REF_X
#define UM6_ACCEL_REF_X
Definition: firmware_registers.h:42
UM6_STATUS
#define UM6_STATUS
Definition: firmware_registers.h:101
UM6_TEMPERATURE
#define UM6_TEMPERATURE
Definition: firmware_registers.h:134
UM6_MAG_PROC_XY
#define UM6_MAG_PROC_XY
Definition: firmware_registers.h:112
firmware_registers.h
Copied directly from the UM6_config.h file, available online here: http://sourceforge....
um6::Registers::quat
const Accessor< int16_t > quat
Definition: registers.h:190
um6::Registers::mag
const Accessor< int16_t > mag
Definition: registers.h:190
UM6_GYRO_RAW_XY
#define UM6_GYRO_RAW_XY
Definition: firmware_registers.h:102
um6::Accessor_::Accessor_
Accessor_(Registers *registers, uint8_t register_index, uint8_t register_width, uint8_t array_length)
Definition: registers.h:96
um6::Registers::mag_ref
const Accessor< float > mag_ref
Definition: registers.h:195
um6::Accessor::set_scaled
void set_scaled(uint16_t field, double value) const
Definition: registers.h:149
um6::Registers::accel
const Accessor< int16_t > accel
Definition: registers.h:190
um6::Registers::gyro_raw
const Accessor< int16_t > gyro_raw
Definition: registers.h:189
um6::Accessor_::length
const uint16_t length
Definition: registers.h:116
UM6_GYRO_PROC_XY
#define UM6_GYRO_PROC_XY
Definition: firmware_registers.h:108
UM6_MAG_BIAS_XY
#define UM6_MAG_BIAS_XY
Definition: firmware_registers.h:52
UM6_RESET_EKF
#define UM6_RESET_EKF
Definition: firmware_registers.h:175
um6::Accessor::Accessor
Accessor(Registers *registers, uint8_t register_index, uint8_t array_length=0, double scale_factor=1.0)
Definition: registers.h:126
um6::Registers::mag_bias
const Accessor< int16_t > mag_bias
Definition: registers.h:196
UM6_COMMUNICATION
#define UM6_COMMUNICATION
Definition: firmware_registers.h:37
um6::Accessor::scale_
const double scale_
Definition: registers.h:155
UM6_EULER_PHI_THETA
#define UM6_EULER_PHI_THETA
Definition: firmware_registers.h:114


um6
Author(s): Mike Purvis
autogenerated on Wed Apr 20 2022 02:39:13