45 assert(payload_size >= 0 && payload_size <= 1024);
47 if (payload_size < 256)
52 *(
frame_->begin() + 1) = payload_size;
60 *(
frame_->begin() + 1) = payload_size >> 8;
61 *(
frame_->begin() + 2) = payload_size & 0xFF;
76 assert(std::distance(frame.first, payload.first) > 0 &&
77 std::distance(payload.second, frame.second) > 0);
80 payload_.first =
frame_->begin() + std::distance(frame.first, payload.first);
81 payload_.second =
frame_->begin() + std::distance(frame.first, payload.second);
87 assert(payload_id >= 0 && payload_id < 256);
121 *(
frame_->end() - 3) = static_cast<uint8_t>(crc >> 8);
122 *(
frame_->end() - 2) = static_cast<uint8_t>(crc & 0xFF);
134 int16_t v =
static_cast<int16_t
>((
static_cast<uint16_t
>(*(
payload_.first + 1)) << 8) +
135 static_cast<uint16_t>(*(
payload_.first + 2)));
136 return static_cast<double>(v) / 10.0;
141 int16_t v =
static_cast<int16_t
>((
static_cast<uint16_t
>(*(
payload_.first + 3)) << 8) +
142 static_cast<uint16_t>(*(
payload_.first + 4)));
143 return static_cast<double>(v) / 10.0;
148 int32_t v =
static_cast<int32_t
>((
static_cast<uint32_t
>(*(
payload_.first + 5)) << 24) +
149 (static_cast<uint32_t>(*(
payload_.first + 6)) << 16) +
150 (
static_cast<uint32_t
>(*(
payload_.first + 7)) << 8) +
151 static_cast<uint32_t>(*(
payload_.first + 8)));
152 return static_cast<double>(v) / 100.0;
157 int32_t v =
static_cast<int32_t
>((
static_cast<uint32_t
>(*(
payload_.first + 9)) << 24) +
158 (static_cast<uint32_t>(*(
payload_.first + 10)) << 16) +
159 (
static_cast<uint32_t
>(*(
payload_.first + 11)) << 8) +
160 static_cast<uint32_t>(*(
payload_.first + 12)));
161 return static_cast<double>(v) / 100.0;
167 int16_t v =
static_cast<int16_t
>((
static_cast<uint16_t
>(*(
payload_.first + 21)) << 8) +
168 static_cast<uint16_t>(*(
payload_.first + 22)));
169 return static_cast<double>(v) / 1000.0;
174 int32_t v =
static_cast<int32_t
>((
static_cast<uint32_t
>(*(
payload_.first + 23)) << 24) +
175 (static_cast<uint32_t>(*(
payload_.first + 24)) << 16) +
176 (
static_cast<uint32_t
>(*(
payload_.first + 25)) << 8) +
177 static_cast<uint32_t>(*(
payload_.first + 26)));
178 return static_cast<double>(-1 * v);
183 int32_t v =
static_cast<int32_t
>((
static_cast<uint32_t
>(*(
payload_.first + 27)) << 24) +
184 (static_cast<uint32_t>(*(
payload_.first + 28)) << 16) +
185 (
static_cast<uint32_t
>(*(
payload_.first + 29)) << 8) +
186 static_cast<uint32_t>(*(
payload_.first + 30)));
187 return static_cast<double>(v);
192 int32_t v =
static_cast<int32_t
>((
static_cast<uint32_t
>(*(
payload_.first + 31)) << 24) +
193 (static_cast<uint32_t>(*(
payload_.first + 32)) << 16) +
194 (
static_cast<uint32_t
>(*(
payload_.first + 33)) << 8) +
195 static_cast<uint32_t>(*(
payload_.first + 34)));
196 return static_cast<double>(v);
201 int32_t v =
static_cast<int32_t
>((
static_cast<uint32_t
>(*(
payload_.first + 35)) << 24) +
202 (static_cast<uint32_t>(*(
payload_.first + 36)) << 16) +
203 (
static_cast<uint32_t
>(*(
payload_.first + 37)) << 8) +
204 static_cast<uint32_t>(*(
payload_.first + 38)));
205 return static_cast<double>(v);
210 int32_t v =
static_cast<int32_t
>((
static_cast<uint32_t
>(*(
payload_.first + 39)) << 24) +
211 (static_cast<uint32_t>(*(
payload_.first + 40)) << 16) +
212 (
static_cast<uint32_t
>(*(
payload_.first + 41)) << 8) +
213 static_cast<uint32_t>(*(
payload_.first + 42)));
214 return static_cast<double>(v);
219 return static_cast<int32_t
>(*(
payload_.first + 56));
225 return static_cast<double>(v);
231 return static_cast<double>(v);
237 return static_cast<double>(v);
243 return static_cast<double>(v);
253 *(
frame_->end() - 3) = static_cast<uint8_t>(crc >> 8);
254 *(
frame_->end() - 2) = static_cast<uint8_t>(crc & 0xFF);
265 int32_t v =
static_cast<int32_t
>(duty * 100000.0);
267 *(
payload_.first + 1) = static_cast<uint8_t>((static_cast<uint32_t>(v) >> 24) & 0xFF);
268 *(
payload_.first + 2) = static_cast<uint8_t>((static_cast<uint32_t>(v) >> 16) & 0xFF);
269 *(
payload_.first + 3) = static_cast<uint8_t>((static_cast<uint32_t>(v) >> 8) & 0xFF);
270 *(
payload_.first + 4) = static_cast<uint8_t>(static_cast<uint32_t>(v) & 0xFF);
274 *(
frame_->end() - 3) = static_cast<uint8_t>(crc >> 8);
275 *(
frame_->end() - 2) = static_cast<uint8_t>(crc & 0xFF);
283 int32_t v =
static_cast<int32_t
>(current * 1000.0);
285 *(
payload_.first + 1) = static_cast<uint8_t>((static_cast<uint32_t>(v) >> 24) & 0xFF);
286 *(
payload_.first + 2) = static_cast<uint8_t>((static_cast<uint32_t>(v) >> 16) & 0xFF);
287 *(
payload_.first + 3) = static_cast<uint8_t>((static_cast<uint32_t>(v) >> 8) & 0xFF);
288 *(
payload_.first + 4) = static_cast<uint8_t>(static_cast<uint32_t>(v) & 0xFF);
292 *(
frame_->end() - 3) = static_cast<uint8_t>(crc >> 8);
293 *(
frame_->end() - 2) = static_cast<uint8_t>(crc & 0xFF);
301 int32_t v =
static_cast<int32_t
>(current_brake * 1000.0);
303 *(
payload_.first + 1) = static_cast<uint8_t>((static_cast<uint32_t>(v) >> 24) & 0xFF);
304 *(
payload_.first + 2) = static_cast<uint8_t>((static_cast<uint32_t>(v) >> 16) & 0xFF);
305 *(
payload_.first + 3) = static_cast<uint8_t>((static_cast<uint32_t>(v) >> 8) & 0xFF);
306 *(
payload_.first + 4) = static_cast<uint8_t>(static_cast<uint32_t>(v) & 0xFF);
310 *(
frame_->end() - 3) = static_cast<uint8_t>(crc >> 8);
311 *(
frame_->end() - 2) = static_cast<uint8_t>(crc & 0xFF);
319 int32_t v =
static_cast<int32_t
>(rpm);
321 *(
payload_.first + 1) = static_cast<uint8_t>((static_cast<uint32_t>(v) >> 24) & 0xFF);
322 *(
payload_.first + 2) = static_cast<uint8_t>((static_cast<uint32_t>(v) >> 16) & 0xFF);
323 *(
payload_.first + 3) = static_cast<uint8_t>((static_cast<uint32_t>(v) >> 8) & 0xFF);
324 *(
payload_.first + 4) = static_cast<uint8_t>(static_cast<uint32_t>(v) & 0xFF);
328 *(
frame_->end() - 3) = static_cast<uint8_t>(crc >> 8);
329 *(
frame_->end() - 2) = static_cast<uint8_t>(crc & 0xFF);
339 int32_t v =
static_cast<int32_t
>(pos * 1000000.0);
341 *(
payload_.first + 1) = static_cast<uint8_t>((static_cast<uint32_t>(v) >> 24) & 0xFF);
342 *(
payload_.first + 2) = static_cast<uint8_t>((static_cast<uint32_t>(v) >> 16) & 0xFF);
343 *(
payload_.first + 3) = static_cast<uint8_t>((static_cast<uint32_t>(v) >> 8) & 0xFF);
344 *(
payload_.first + 4) = static_cast<uint8_t>(static_cast<uint32_t>(v) & 0xFF);
348 *(
frame_->end() - 3) = static_cast<uint8_t>(crc >> 8);
349 *(
frame_->end() - 2) = static_cast<uint8_t>(crc & 0xFF);
359 int16_t v =
static_cast<int16_t
>(servo_pos * 1000.0);
361 *(
payload_.first + 1) = static_cast<uint8_t>((static_cast<uint16_t>(v) >> 8) & 0xFF);
362 *(
payload_.first + 2) = static_cast<uint8_t>(static_cast<uint16_t>(v) & 0xFF);
366 *(
frame_->end() - 3) = static_cast<uint8_t>(crc >> 8);
367 *(
frame_->end() - 2) = static_cast<uint8_t>(crc & 0xFF);
static constexpr CRC::Parameters< crcpp_uint16, 16 > CRC_TYPE
VescPacketSetServoPos(double servo_pos)
VescPacketFWVersion(std::shared_ptr< VescFrame > raw)
std::vector< uint8_t > Buffer
std::pair< Buffer::const_iterator, Buffer::const_iterator > BufferRangeConst
VescFrame(int payload_size)
VescPacketSetCurrent(double current)
std::shared_ptr< Buffer > frame_
Stores frame data, shared_ptr for shallow copy.
virtual const Buffer & frame() const
double current_in() const
VescPacket(const std::string &name, int payload_size, int payload_id)
static const int VESC_MIN_FRAME_SIZE
Smallest VESC frame size, in bytes.
virtual const std::string & name() const
static const int VESC_MAX_FRAME_SIZE
Largest VESC frame size, in bytes.
#define REGISTER_PACKET_TYPE(id, klass)
static const int VESC_MAX_PAYLOAD_SIZE
Maximum VESC payload size, in bytes.
VescPacketSetPos(double pos)
double amp_hours_charged() const
VescPacketSetRPM(double rpm)
VescPacketSetDuty(double duty)
static CRCType Calculate(const void *data, crcpp_size size, const Parameters< CRCType, CRCWidth > ¶meters)
Computes a CRC.
double tachometer() const
double tachometer_abs() const
double watt_hours() const
double current_motor() const
double watt_hours_charged() const
VescPacketValues(std::shared_ptr< VescFrame > raw)
BufferRange payload_
View into frame's payload section.
VescPacketSetCurrentBrake(double current_brake)