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_SYSTEM_EVENTS,
42  REG_LEFT_PWM,
43  REG_RIGHT_PWM,
44  REG_PWM_BOTH_WHLS,
45  REG_TINT_BOTH_WHLS,
46  REG_09,
47  REG_DRIVE_TYPE,
48  REG_WHEEL_NULL_ERR,
49  REG_WHEEL_DIR,
50  REG_DEADMAN,
51  REG_LEFT_CURRENT,
52  REG_RIGHT_CURRENT,
53  REG_WHEEL_TYPE,
54  REG_PID_ERROR_CAP,
55  REG_OPTION_SWITCH,
56  REG_PWM_OVERRIDE,
57  REG_PID_CONTROL,
58  REG_PARAM_V_RDY,
59  REG_PARAM_P_RDY,
60  REG_PARAM_I_RDY,
61  REG_PARAM_D_RDY,
62  REG_PARAM_C_RDY,
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_MAINV_TPOINT,
75  REG_12V_MAIN_CURRENT,
76  REG_AUXV_TPOINT,
77  REG_BATT_VOL_LOW,
78  REG_VBUF_SIZ,
79  REG_BOTH_SPEED_SET,
80  REG_MOVING_BUF_SIZE,
81  REG_LIMIT_REACHED,
82  REG_BOTH_ERROR,
83  REG_BOTH_ODOM,
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_DEADZONE,
93  REG_FIRMWARE_DATE,
94  REG_STEST_REQUEST,
95  REG_STEST_RESULTS,
96  DEBUG_50,
97  DEBUG_51,
98  DEBUG_52,
99  DEBUG_53,
100  DEBUG_54,
101  DEBUG_55,
102  DEBUG_56,
103  DEBUG_57,
104  DEBUG_58};
105 
107  if (verifyType(type)) {
108  this->type = type;
109  }
110 }
111 
113  return static_cast<MotorMessage::MessageTypes>(this->type);
114 }
115 
117  if (verifyRegister(reg)) {
118  this->register_addr = reg;
119  }
120 }
121 
123  return static_cast<MotorMessage::Registers>(this->register_addr);
124 }
125 
126 void MotorMessage::setData(int32_t data) {
127  // Spilt 32 bit data (system byte order) into 4 8bit elements in big endian
128  // (network byte order)
129  this->data[3] = (data >> 0) & 0xFF;
130  this->data[2] = (data >> 8) & 0xFF;
131  this->data[1] = (data >> 16) & 0xFF;
132  this->data[0] = (data >> 24) & 0xFF;
133 }
134 
135 int32_t MotorMessage::getData() const {
136  // Take big endian (network byte order) elements and return 32 bit int
137  return (this->data[0] << 24) | (this->data[1] << 16) |
138  (this->data[2] << 8) | (this->data[3] << 0);
139 }
140 
142  RawMotorMessage out;
143  out[0] = delimeter;
144  out[1] = (protocol_version << 4) | type;
145  out[2] = register_addr;
146  std::copy(data.begin(), data.end(), out.begin() + 3);
147  out[7] = generateChecksum(out);
148  return out;
149 }
150 
152  if (serialized[0] == delimeter) {
153  if ((serialized[1] & 0xF0) == (protocol_version << 4)) {
154  if (generateChecksum(serialized) == serialized[7]) {
155  if (verifyType(serialized[1] & 0x0F)) {
156  if (verifyRegister(serialized[2])) {
157  this->type = serialized[1] & 0x0F;
158  this->register_addr = serialized[2];
159  std::copy(serialized.begin() + 3,
160  serialized.begin() + 7, data.begin());
161  return MotorMessage::ERR_NONE;
162  } else
164  } else
166  } else
168  } else
170  } else
172 
173  // ERROR codes returned are defined in MotorMessage class
174  // First char not delimiter
175  // wrong protocol version
176  // bad checksum
177  // bad type
178  // bad register
179 }
180 
181 int MotorMessage::verifyType(uint8_t t) {
182  // Return 1 good
183  // Return 0 for bad
184  for (size_t i = 0; i < sizeof(valid_types) / sizeof(valid_types[0]); ++i) {
185  if (t == valid_types[i]) return 1;
186  }
187  return 0;
188 }
189 
191  // Return 1 good
192  // Return 0 for bad
193  for (size_t i = 0; i < sizeof(valid_registers) / sizeof(valid_registers[0]);
194  ++i) {
195  if (r == valid_registers[i]) return 1;
196  }
197  return 0;
198 }
199 
201  int sum = std::accumulate(data.begin() + 1, data.end() - 1, 0);
202 
203  if (sum > 0xFF) {
204  int tmp;
205  tmp = sum >> 8;
206  tmp = tmp << 8;
207  return 0xFF - (sum - tmp);
208  } else {
209  return 0xFF - sum;
210  }
211 }
MotorMessage::generateChecksum
static uint8_t generateChecksum(const std::vector< uint8_t > &data)
MotorMessage::deserialize
MotorMessage::ErrorCodes deserialize(const RawMotorMessage &serialized)
Definition: motor_message.cc:151
MotorMessage::ERR_BAD_CHECKSUM
@ ERR_BAD_CHECKSUM
Definition: motor_message.h:260
MotorMessage::delimeter
const static uint8_t delimeter
Definition: motor_message.h:267
MotorMessage::getType
MotorMessage::MessageTypes getType() const
Definition: motor_message.cc:112
MotorMessage::valid_registers
const static uint8_t valid_registers[]
Definition: motor_message.h:282
MotorMessage::ERR_UNKNOWN_REGISTER
@ ERR_UNKNOWN_REGISTER
Definition: motor_message.h:262
upgrade_firmware.r
r
Definition: upgrade_firmware.py:55
MotorMessage::valid_types
const static uint8_t valid_types[]
Definition: motor_message.h:281
MotorMessage::setData
void setData(int32_t data)
Definition: motor_message.cc:126
MotorMessage::register_addr
uint8_t register_addr
Definition: motor_message.h:273
console.h
MotorMessage::MessageTypes
MessageTypes
Definition: motor_message.h:74
MotorMessage::Registers
Registers
Definition: motor_message.h:82
MotorMessage::serialize
RawMotorMessage serialize() const
Definition: motor_message.cc:141
MotorMessage::getData
int32_t getData() const
Definition: motor_message.cc:135
MotorMessage::type
uint8_t type
Definition: motor_message.h:271
MotorMessage::verifyRegister
static int verifyRegister(uint8_t r)
Definition: motor_message.cc:190
MotorMessage::verifyType
static int verifyType(uint8_t t)
Definition: motor_message.cc:181
MotorMessage::protocol_version
const static uint8_t protocol_version
Definition: motor_message.h:278
motor_message.h
MotorMessage::getRegister
MotorMessage::Registers getRegister() const
Definition: motor_message.cc:122
MotorMessage::ERR_NONE
@ ERR_NONE
Definition: motor_message.h:257
MotorMessage::data
boost::array< uint8_t, 4 > data
Definition: motor_message.h:276
MotorMessage::ERR_WRONG_PROTOCOL
@ ERR_WRONG_PROTOCOL
Definition: motor_message.h:259
MotorMessage::ERR_BAD_TYPE
@ ERR_BAD_TYPE
Definition: motor_message.h:261
RawMotorMessage
boost::array< uint8_t, 8 > RawMotorMessage
Definition: motor_message.h:38
MotorMessage::setRegister
void setRegister(MotorMessage::Registers reg)
Definition: motor_message.cc:116
MotorMessage::ERR_DELIMITER
@ ERR_DELIMITER
Definition: motor_message.h:258
MotorMessage::ErrorCodes
ErrorCodes
Definition: motor_message.h:256
MotorMessage::setType
void setType(MotorMessage::MessageTypes type)
Definition: motor_message.cc:106


ubiquity_motor
Author(s):
autogenerated on Thu Nov 16 2023 03:30:55