motor_message.cc
Go to the documentation of this file.
1 
32 // #include <ubiquity_motor/motor_message_registers.h>
33 #include <ros/console.h>
34 #include <numeric>
35 
36 uint8_t const MotorMessage::valid_types[] = {TYPE_READ, TYPE_WRITE,
37  TYPE_RESPONSE, TYPE_ERROR};
38 
39 uint8_t const MotorMessage::valid_registers[] = {REG_STOP_START,
40  REG_BRAKE_STOP,
41  REG_CRUISE_STOP,
42  REG_LEFT_PWM,
43  REG_RIGHT_PWM,
44  REG_LEFT_SPEED_SET,
45  REG_RIGHT_SPEED_SET,
46  REG_LEFT_RAMP,
47  REG_RIGHT_RAMP,
48  REG_LEFT_ODOM,
49  REG_RIGHT_ODOM,
50  REG_DEADMAN,
51  REG_LEFT_CURRENT,
52  REG_RIGHT_CURRENT,
53  REG_ERROR_COUNT,
54  REG_5V_MAIN_ERROR,
55  REG_5V_AUX_ERROR,
56  REG_12V_MAIN_ERROR,
57  REG_12V_AUX_ERROR,
58  REG_5V_MAIN_OL,
59  REG_5V_AUX_OL,
60  REG_12V_MAIN_OL,
61  REG_12V_AUX_OL,
62  REG_UNUSED_19,
63  REG_PARAM_V,
64  REG_PARAM_P,
65  REG_PARAM_I,
66  REG_PARAM_D,
67  REG_PARAM_C,
68  REG_LED_1,
69  REG_LED_2,
70  REG_HARDWARE_VERSION,
71  REG_FIRMWARE_VERSION,
72  REG_BATTERY_VOLTAGE,
73  REG_5V_MAIN_CURRENT,
74  REG_12V_MAIN_CURRENT,
75  REG_5V_AUX_CURRENT,
76  REG_12V_AUX_CURRENT,
77  REG_LEFT_SPEED_MEASURED,
78  REG_RIGHT_SPEED_MEASURED,
79  REG_BOTH_SPEED_SET,
80  REG_MOVING_BUF_SIZE,
81  REG_BOTH_ODOM,
82  REG_LIMIT_REACHED,
83  REG_BOTH_ERROR,
84  REG_ROBOT_ID,
85  REG_MOT_PWR_ACTIVE,
86  REG_ESTOP_ENABLE,
87  REG_PID_MAX_ERROR,
88  REG_MAX_SPEED_FWD,
89  REG_MAX_SPEED_REV,
90  REG_MAX_PWM,
91  REG_HW_OPTIONS,
92  REG_FIRMWARE_DATE,
93  DEBUG_50,
94  DEBUG_51,
95  DEBUG_52,
96  DEBUG_53,
97  DEBUG_54,
98  DEBUG_55,
99  DEBUG_56,
100  DEBUG_57,
101  DEBUG_58};
102 
104  if (verifyType(type)) {
105  this->type = type;
106  }
107 }
108 
110  return static_cast<MotorMessage::MessageTypes>(this->type);
111 }
112 
114  if (verifyRegister(reg)) {
115  this->register_addr = reg;
116  }
117 }
118 
120  return static_cast<MotorMessage::Registers>(this->register_addr);
121 }
122 
124  // Spilt 32 bit data (system byte order) into 4 8bit elements in big endian
125  // (network byte order)
126  this->data[3] = (data >> 0) & 0xFF;
127  this->data[2] = (data >> 8) & 0xFF;
128  this->data[1] = (data >> 16) & 0xFF;
129  this->data[0] = (data >> 24) & 0xFF;
130 }
131 
132 int32_t MotorMessage::getData() const {
133  // Take big endian (network byte order) elements and return 32 bit int
134  return (this->data[0] << 24) | (this->data[1] << 16) |
135  (this->data[2] << 8) | (this->data[3] << 0);
136 }
137 
139  RawMotorMessage out;
140  out[0] = delimeter;
141  out[1] = (protocol_version << 4) | type;
142  out[2] = register_addr;
143  std::copy(data.begin(), data.end(), out.begin() + 3);
144  out[7] = generateChecksum(out);
145  return out;
146 }
147 
149  if (serialized[0] == delimeter) {
150  if ((serialized[1] & 0xF0) == (protocol_version << 4)) {
151  if (generateChecksum(serialized) == serialized[7]) {
152  if (verifyType(serialized[1] & 0x0F)) {
153  if (verifyRegister(serialized[2])) {
154  this->type = serialized[1] & 0x0F;
155  this->register_addr = serialized[2];
156  std::copy(serialized.begin() + 3,
157  serialized.begin() + 7, data.begin());
158  return MotorMessage::ERR_NONE;
159  } else
161  } else
163  } else
165  } else
167  } else
169 
170  // ERROR codes returned are defined in MotorMessage class
171  // First char not delimiter
172  // wrong protocol version
173  // bad checksum
174  // bad type
175  // bad register
176 }
177 
178 int MotorMessage::verifyType(uint8_t t) {
179  // Return 1 good
180  // Return 0 for bad
181  for (size_t i = 0; i < sizeof(valid_types) / sizeof(valid_types[0]); ++i) {
182  if (t == valid_types[i]) return 1;
183  }
184  return 0;
185 }
186 
188  // Return 1 good
189  // Return 0 for bad
190  for (size_t i = 0; i < sizeof(valid_registers) / sizeof(valid_registers[0]);
191  ++i) {
192  if (r == valid_registers[i]) return 1;
193  }
194  return 0;
195 }
196 
198  int sum = std::accumulate(data.begin() + 1, data.end() - 1, 0);
199 
200  if (sum > 0xFF) {
201  int tmp;
202  tmp = sum >> 8;
203  tmp = tmp << 8;
204  return 0xFF - (sum - tmp);
205  } else {
206  return 0xFF - sum;
207  }
208 }
static const uint8_t delimeter
void setData(int32_t data)
static uint8_t generateChecksum(const std::vector< uint8_t > &data)
boost::array< uint8_t, 8 > RawMotorMessage
Definition: motor_message.h:38
static const uint8_t protocol_version
static const uint8_t valid_types[]
MotorMessage::MessageTypes getType() const
static int verifyType(uint8_t t)
uint8_t register_addr
MotorMessage::ErrorCodes deserialize(const RawMotorMessage &serialized)
boost::array< uint8_t, 4 > data
int32_t getData() const
void setRegister(MotorMessage::Registers reg)
RawMotorMessage serialize() const
void setType(MotorMessage::MessageTypes type)
static const uint8_t valid_registers[]
static int verifyRegister(uint8_t r)
MotorMessage::Registers getRegister() const


ubiquity_motor
Author(s):
autogenerated on Mon Feb 28 2022 23:57:06