MIP SDK  0.0.1
MicroStrain Communications Library for embedded systems
mip_device.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "mip.hpp"
4 #include "mip_interface.h"
5 
7 
8 
9 namespace mip
10 {
11 
15 
17 
19 {
20  enum : uint8_t {
23  };
24 };
25 
26 
30 struct CmdQueue : public C::mip_cmd_queue
31 {
33  ~CmdQueue() { assert(_first_pending_cmd==nullptr); }
34 
35  CmdQueue(const CmdQueue&) = delete;
36  CmdQueue& operator=(const CmdQueue&) = delete;
37 
40 
41  void clear() { C::mip_cmd_queue_clear(this); }
42 
43  void update(Timestamp now) { C::mip_cmd_queue_update(this, now); }
44 
47 
48  void processPacket(const C::mip_packet& packet, Timestamp timestamp) { C::mip_cmd_queue_process_packet(this, &packet, timestamp); }
49 };
50 static_assert(sizeof(CmdQueue) == sizeof(C::mip_cmd_queue), "CmdQueue must not have additional data members.");
51 
52 
57 {
60  PendingCmd() { std::memset(static_cast<C::mip_pending_cmd*>(this), 0, sizeof(C::mip_pending_cmd)); }
61 
68  PendingCmd(uint8_t descriptorSet, uint8_t fieldDescriptor, Timeout additionalTime=0) { C::mip_pending_cmd_init_with_timeout(this, descriptorSet, fieldDescriptor, additionalTime); }
69 
79  PendingCmd(uint8_t descriptorSet, uint8_t fieldDescriptor, uint8_t responseDescriptor, uint8_t* responseBuffer, uint8_t responseBufferSize, Timeout additionalTime) { C::mip_pending_cmd_init_full(this, descriptorSet, fieldDescriptor, responseDescriptor, responseBuffer, responseBufferSize, additionalTime); }
80 
86  template<class Cmd>
87  PendingCmd(const Cmd& cmd, Timeout additionalTime=0) : PendingCmd(cmd.descriptorSet, cmd.fieldDescriptor, additionalTime) {}
88 
96  template<class Cmd>
97  PendingCmd(const Cmd& cmd, uint8_t* responseBuffer, uint8_t responseBufferSize, Timeout additionalTime=0) : PendingCmd(Cmd::DESCRIPTOR_SET, Cmd::FIELD_DESCRIPTOR, Cmd::Response::FIELD_DESCRIPTOR, responseBuffer, responseBufferSize, additionalTime) {}
98 
101  PendingCmd(const PendingCmd&) = delete;
102  PendingCmd& operator=(const PendingCmd&) = delete;
103 
106  ~PendingCmd() { CmdResult tmp = status(); assert(tmp.isFinished() || tmp==CmdResult::STATUS_NONE); (void)tmp; }
107 
110  CmdResult status() const { return C::mip_pending_cmd_status(this); }
111 
113  const uint8_t* response() const { return C::mip_pending_cmd_response(this); }
114 
116  uint8_t responseLength() const { return C::mip_pending_cmd_response_length(this); }
117 };
118 
119 
120 
121 template<class Cmd> CmdResult runCommand(C::mip_interface& device, const Cmd& cmd, Timeout additionalTime=0);
122 template<class Cmd> CmdResult runCommand(C::mip_interface& device, const Cmd& cmd, typename Cmd::Response& response, Timeout additionalTime=0);
123 template<class Cmd, class... Args> CmdResult runCommand(C::mip_interface& device, const Args&&... args, Timeout additionalTime);
124 template<class Cmd> bool startCommand(C::mip_interface& device, C::mip_pending_cmd& pending, const Cmd& cmd, Timeout additionalTime);
125 
126 
136 {
137 public:
138  virtual bool sendToDevice(const uint8_t* data, size_t length) = 0; // Must be implemented by a derived class.
139  virtual bool recvFromDevice(uint8_t* buffer, size_t max_length, size_t* length_out, Timestamp* timestamp) = 0; // Must be implemented by a derived class.
140 };
141 
142 
147 {
148 public:
149  //
150  // Constructors
151  //
152 
155  DeviceInterface(Connection* connection, uint8_t* parseBuffer, size_t parseBufferSize, Timeout parseTimeout, Timeout baseReplyTimeout) : mConnection(connection) { C::mip_interface_init(this, parseBuffer, parseBufferSize, parseTimeout, baseReplyTimeout); }
156 
159 
160  ~DeviceInterface() = default;
161 
162  //
163  // Accessors
164  //
165 
168 
169  template<bool (*Function)(DeviceInterface&,bool)>
170  void setUpdateFunction();
171 
172  void setMaxPacketsPerPoll(unsigned int maxPackets) { C::mip_interface_set_max_packets_per_update(this, maxPackets); }
173  unsigned int maxPacketsPerPoll() const { return C::mip_interface_max_packets_per_update(this); }
174 
177 
178  Parser& parser() { return *static_cast<Parser*>(C::mip_interface_parser(this)); }
179  CmdQueue& cmdQueue() { return *static_cast<CmdQueue*>(C::mip_interface_cmd_queue(this)); }
180 
181  const Parser& parser() const { return const_cast<DeviceInterface*>(this)->parser(); }
182  const CmdQueue& cmdQueue() const { return const_cast<DeviceInterface*>(this)->cmdQueue(); }
183 
184  const Connection* connection() const { return mConnection; }
185  void setConnection(Connection* connection) { mConnection = connection; }
186 
187  //
188  // Communications
189  //
190 
191  RemainingCount receiveBytes(const uint8_t* data, size_t length, Timestamp timestamp) { return C::mip_interface_receive_bytes(this, data, length, timestamp); }
192 
193  void receivePacket(const C::mip_packet& packet, Timestamp timestamp) { C::mip_interface_receive_packet(this, &packet, timestamp); }
194 
195  bool sendToDevice(const uint8_t* data, size_t length) { return mConnection->sendToDevice(data, length); }
196  bool sendToDevice(const C::mip_packet& packet) { return sendToDevice(C::mip_packet_pointer(&packet), C::mip_packet_total_length(&packet)); }
197 
198  bool update(bool blocking=false) { return C::mip_interface_update(this, blocking); }
199  bool recvFromDevice(uint8_t* buffer, size_t max_length, size_t* length_out, Timestamp* timestamp) { return mConnection->recvFromDevice(buffer, max_length, length_out, timestamp); }
200 
202 
204 
205  bool defaultUpdate(bool blocking=false) { return C::mip_interface_default_update(this, blocking); }
206 
207  //
208  // Data Callbacks
209  //
210 
211  void registerPacketCallback(C::mip_dispatch_handler& handler, uint8_t descriptorSet, bool afterFields, C::mip_dispatch_packet_callback callback, void* userData) { C::mip_interface_register_packet_callback(this, &handler, descriptorSet, afterFields, callback, userData); }
212  void registerFieldCallback(C::mip_dispatch_handler& handler, uint8_t descriptorSet, uint8_t fieldDescriptor, C::mip_dispatch_field_callback callback, void* userData) { C::mip_interface_register_field_callback(this, &handler, descriptorSet, fieldDescriptor, callback, userData); }
213 
214 
215  template<void (*Callback)(void*, const Packet&, Timestamp)>
216  void registerPacketCallback(C::mip_dispatch_handler& handler, uint8_t descriptorSet, bool afterFields, void* userData=nullptr);
217 
218  template<class Object, void (Object::*Callback)(const Packet&, Timestamp)>
219  void registerPacketCallback(C::mip_dispatch_handler& handler, uint8_t descriptorSet, bool afterFields, Object* object);
220 
221 
222  template<void (*Callback)(void*, const Field&, Timestamp)>
223  void registerFieldCallback(C::mip_dispatch_handler& handler, uint8_t descriptorSet, uint8_t fieldDescriptor, void* userData=nullptr);
224 
225  template<class Object, void (Object::*Callback)(const Field& field, Timestamp)>
226  void registerFieldCallback(C::mip_dispatch_handler& handler, uint8_t descriptorSet, uint8_t fieldDescriptor, Object* object);
227 
228 
229  template<class DataField, void (*Callback)(void*, const DataField&, Timestamp)>
230  void registerDataCallback(C::mip_dispatch_handler& handler, void* userData=nullptr, uint8_t descriptorSet=DataField::DESCRIPTOR_SET);
231 
232  template<class DataField, class Object, void (Object::*Callback)(const DataField&, Timestamp)>
233  void registerDataCallback(C::mip_dispatch_handler& handler, Object* object, uint8_t descriptorSet=DataField::DESCRIPTOR_SET);
234 
235 
236  template<class DataField>
237  void registerExtractor(C::mip_dispatch_handler& handler, DataField* field, uint8_t descriptorSet=DataField::DESCRIPTOR_SET);
238 
239  //
240  // Run function templates
241  //
242 
243  template<class Cmd>
244  CmdResult runCommand(const Cmd& cmd, Timeout additionalTime=0) { return mip::runCommand(*this, cmd, additionalTime); }
245 
246  template<class Cmd, class... Args>
247  CmdResult runCommand(Args&&... args, Timeout additionalTime=0) { return mip::runCommand(*this, std::forward<Args>(args)..., additionalTime); }
248 
249  template<class Cmd>
250  CmdResult runCommand(const Cmd& cmd, typename Cmd::Response& response, Timeout additionalTime=0) { return mip::runCommand(*this, cmd, response, additionalTime); }
251 
252 
253  template<class Cmd>
254  bool startCommand(PendingCmd& pending, const Cmd& cmd, Timeout additionalTime=0) { return mip::startCommand(*this, pending, cmd, additionalTime); }
255 
256 // template<class Cmd>
257 // bool startCommand(PendingCmd& pending, const Cmd& cmd, uint8_t* responseBuffer, uint8_t responseBufferSize, Timeout additionalTime=0) { return mip::startCommand(pending, cmd, responseBuffer, responseBufferSize, additionalTime); }
258 
259 private:
260  Connection* mConnection;
261 };
262 
263 
276 template<bool (*Function)(DeviceInterface&,bool)>
278 {
280  [](C::mip_interface* device, bool blocking)->bool
281  {
282  return Function(*static_cast<DeviceInterface*>(device), blocking);
283  }
284  );
285 }
286 
287 
318 template<void (*Callback)(void*, const Packet&, Timestamp)>
319 void DeviceInterface::registerPacketCallback(C::mip_dispatch_handler& handler, uint8_t descriptorSet, bool afterFields, void* userData)
320 {
321  auto callback = [](void* context, const C::mip_packet* packet, Timestamp timestamp)
322  {
323  Callback(context, Packet(*packet), timestamp);
324  };
325 
326  registerPacketCallback(handler, descriptorSet, afterFields, callback, userData);
327 }
328 
329 
360 template<class Object, void (Object::*Callback)(const Packet&, Timestamp)>
361 void DeviceInterface::registerPacketCallback(C::mip_dispatch_handler& handler, uint8_t descriptorSet, bool afterFields, Object* object)
362 {
363  auto callback = [](void* pointer, const Packet& packet, Timestamp timestamp)
364  {
365  Object* obj = static_cast<Object*>(pointer);
366  (obj->*Callback)(Packet(packet), timestamp);
367  };
368 
369  registerPacketCallback(handler, descriptorSet, afterFields, callback, object);
370 }
371 
372 
403 template<void (*Callback)(void*, const Field&, Timestamp)>
404 void DeviceInterface::registerFieldCallback(C::mip_dispatch_handler& handler, uint8_t descriptorSet, uint8_t fieldDescriptor, void* userData)
405 {
406  auto callback = [](void* context, const C::mip_field* field, Timestamp timestamp)
407  {
408  Callback(context, Field(*field), timestamp);
409  };
410 
411  registerFieldCallback(handler, descriptorSet, fieldDescriptor, callback, userData);
412 }
413 
414 
445 template<class Object, void (Object::*Callback)(const Field&, Timestamp)>
446 void DeviceInterface::registerFieldCallback(C::mip_dispatch_handler& handler, uint8_t descriptorSet, uint8_t fieldDescriptor, Object* object)
447 {
448  auto callback = [](void* pointer, const C::mip_field* field, Timestamp timestamp)
449  {
450  Object* obj = static_cast<Object*>(pointer);
451  (obj->*Callback)(Field(*field), timestamp);
452  };
453 
454  registerFieldCallback(handler, descriptorSet, fieldDescriptor, callback, object);
455 }
456 
457 
493 template<class DataField, void (*Callback)(void*, const DataField&, Timestamp)>
494 void DeviceInterface::registerDataCallback(C::mip_dispatch_handler& handler, void* userData, uint8_t descriptorSet)
495 {
496  assert(descriptorSet != 0x00);
497  if(descriptorSet == 0x00)
498  return;
499 
500  assert(descriptorSet != 0xFF); // Descriptor set must be specified for shared data.
501  if(descriptorSet == 0xFF)
502  return;
503 
504  auto callback = [](void* context, const C::mip_field* field, Timestamp timestamp)
505  {
506  DataField data;
507 
508  bool ok = Field(*field).extract(data);
509  assert(ok); (void)ok;
510 
511  Callback(context, data, timestamp);
512  };
513 
514  registerFieldCallback(handler, descriptorSet, DataField::FIELD_DESCRIPTOR, callback, userData);
515 }
516 
553 template<class DataField, class Object, void (Object::*Callback)(const DataField&, Timestamp)>
554 void DeviceInterface::registerDataCallback(C::mip_dispatch_handler& handler, Object* object, uint8_t descriptorSet)
555 {
556  assert(descriptorSet != 0x00);
557  if(descriptorSet == 0x00)
558  return;
559 
560  assert(descriptorSet != 0xFF); // Descriptor set must be specified for shared data.
561  if(descriptorSet == 0xFF)
562  return;
563 
564  auto callback = [](void* pointer, const C::mip_field* field, Timestamp timestamp)
565  {
566  DataField data;
567 
568  bool ok = Field(*field).extract(data);
569  assert(ok); (void)ok;
570 
571  Object* obj = static_cast<Object*>(pointer);
572  (obj->*Callback)(data, timestamp);
573  };
574 
575  registerFieldCallback(handler, descriptorSet, DataField::FIELD_DESCRIPTOR, callback, object);
576 }
577 
578 
579 template<class DataField>
580 void DeviceInterface::registerExtractor(C::mip_dispatch_handler& handler, DataField* field, uint8_t descriptorSet)
581 {
582  auto callback = [](void* pointer, const C::mip_field* field, Timestamp timestamp)
583  {
584  Field(*field).extract( *static_cast<DataField*>(pointer) );
585  };
586 
587  registerFieldCallback(handler, descriptorSet, DataField::FIELD_DESCRIPTOR, callback, field);
588 }
589 
590 
591 template<class Cmd>
592 CmdResult runCommand(C::mip_interface& device, const Cmd& cmd, Timeout additionalTime)
593 {
594  uint8_t buffer[PACKET_LENGTH_MAX];
595  Packet packet = Packet::createFromField(buffer, sizeof(buffer), cmd);
596 
597  C::mip_pending_cmd pending;
598  C::mip_pending_cmd_init_with_timeout(&pending, Cmd::DESCRIPTOR_SET, Cmd::FIELD_DESCRIPTOR, additionalTime);
599 
600  return C::mip_interface_run_command_packet(&device, &packet, &pending);
601 }
602 
603 template<class Cmd, class... Args>
604 CmdResult runCommand(C::mip_interface& device, const Args&&... args, Timeout additionalTime)
605 {
606  Cmd cmd{std::forward<Args>(args)...};
607  return runCommand(device, cmd, additionalTime);
608 }
609 
610 template<class Cmd>
611 CmdResult runCommand(C::mip_interface& device, const Cmd& cmd, typename Cmd::Response& response, Timeout additionalTime)
612 {
613  uint8_t buffer[PACKET_LENGTH_MAX];
614  Packet packet = Packet::createFromField(buffer, sizeof(buffer), cmd);
615 
616  C::mip_pending_cmd pending;
617  C::mip_pending_cmd_init_full(&pending, Cmd::DESCRIPTOR_SET, Cmd::FIELD_DESCRIPTOR, Cmd::Response::FIELD_DESCRIPTOR, buffer, FIELD_PAYLOAD_LENGTH_MAX, additionalTime);
618 
619  CmdResult result = C::mip_interface_run_command_packet(&device, &packet, &pending);
620  if( result != C::MIP_ACK_OK )
621  return result;
622 
623  size_t responseLength = C::mip_pending_cmd_response_length(&pending);
624 
625  return extract(response, buffer, responseLength, 0) ? CmdResult::ACK_OK : CmdResult::STATUS_ERROR;
626 }
627 
628 
629 template<class Cmd>
630 bool startCommand(C::mip_interface& device, C::mip_pending_cmd& pending, const Cmd& cmd, Timeout additionalTime)
631 {
632  uint8_t buffer[PACKET_LENGTH_MAX];
633  Packet packet = Packet::createFromField(buffer, sizeof(buffer), cmd);
634 
635  C::mip_pending_cmd_init_with_timeout(&pending, Cmd::DESCRIPTOR_SET, Cmd::FIELD_DESCRIPTOR, additionalTime);
636 
637  return C::mip_interface_start_command_packet(&device, &packet, &pending);
638 }
639 
640 //template<class Cmd>
641 //bool startCommand(C::mip_interface& device, C::mip_pending_cmd& pending, const Cmd& cmd, uint8_t* responseBuffer, uint8_t responseBufferSize, Timeout additionalTime)
642 //{
643 // uint8_t buffer[PACKET_LENGTH_MAX];
644 // Packet packet = Packet::createFromField(buffer, sizeof(buffer), cmd);
645 //
646 // C::mip_pending_cmd_init_full(&pending, Cmd::descriptorSet, Cmd::fieldDescriptor, Cmd::Response::fieldDescriptor, responseBuffer, responseBufferSize, additionalTime);
647 //
648 // return C::mip_interface_start_command_packet(&device, &packet, &pending);
649 //}
650 
651 
654 
655 } // namespace mip
Represents a type of connection to a MIP device.
Definition: mip_device.hpp:136
virtual bool recvFromDevice(uint8_t *buffer, size_t max_length, size_t *length_out, Timestamp *timestamp)=0
virtual bool sendToDevice(const uint8_t *data, size_t length)=0
Represents a connected MIP device.
Definition: mip_device.hpp:147
const CmdQueue & cmdQueue() const
Definition: mip_device.hpp:182
void setUpdateFunction(C::mip_update_callback function)
Definition: mip_device.hpp:167
bool defaultUpdate(bool blocking=false)
Definition: mip_device.hpp:205
DeviceInterface & operator=(const DeviceInterface &)=delete
const Connection * connection() const
Definition: mip_device.hpp:184
CmdResult runCommand(Args &&... args, Timeout additionalTime=0)
Definition: mip_device.hpp:247
bool startCommand(PendingCmd &pending, const Cmd &cmd, Timeout additionalTime=0)
Definition: mip_device.hpp:254
bool sendToDevice(const uint8_t *data, size_t length)
Definition: mip_device.hpp:195
~DeviceInterface()=default
DeviceInterface(Connection *connection, uint8_t *parseBuffer, size_t parseBufferSize, Timeout parseTimeout, Timeout baseReplyTimeout)
Definition: mip_device.hpp:155
Timeout baseReplyTimeout() const
Definition: mip_device.hpp:175
void registerFieldCallback(C::mip_dispatch_handler &handler, uint8_t descriptorSet, uint8_t fieldDescriptor, C::mip_dispatch_field_callback callback, void *userData)
Definition: mip_device.hpp:212
unsigned int maxPacketsPerPoll() const
Definition: mip_device.hpp:173
RemainingCount receiveBytes(const uint8_t *data, size_t length, Timestamp timestamp)
Definition: mip_device.hpp:191
DeviceInterface(const DeviceInterface &)=delete
void receivePacket(const C::mip_packet &packet, Timestamp timestamp)
Definition: mip_device.hpp:193
void registerPacketCallback(C::mip_dispatch_handler &handler, uint8_t descriptorSet, bool afterFields, C::mip_dispatch_packet_callback callback, void *userData)
Definition: mip_device.hpp:211
bool sendToDevice(const C::mip_packet &packet)
Definition: mip_device.hpp:196
CmdResult waitForReply(const C::mip_pending_cmd &cmd)
Definition: mip_device.hpp:203
void processUnparsedPackets()
Definition: mip_device.hpp:201
void setBaseReplyTimeout(Timeout timeout)
Definition: mip_device.hpp:176
const Parser & parser() const
Definition: mip_device.hpp:181
bool update(bool blocking=false)
Definition: mip_device.hpp:198
bool recvFromDevice(uint8_t *buffer, size_t max_length, size_t *length_out, Timestamp *timestamp)
Definition: mip_device.hpp:199
void setMaxPacketsPerPoll(unsigned int maxPackets)
Definition: mip_device.hpp:172
CmdResult runCommand(const Cmd &cmd, typename Cmd::Response &response, Timeout additionalTime=0)
Definition: mip_device.hpp:250
Parser & parser()
Definition: mip_device.hpp:178
void setConnection(Connection *connection)
Definition: mip_device.hpp:185
CmdResult runCommand(const Cmd &cmd, Timeout additionalTime=0)
Definition: mip_device.hpp:244
CmdQueue & cmdQueue()
Definition: mip_device.hpp:179
C++ class representing a MIP field.
Definition: mip.hpp:47
bool extract(Field &field) const
Definition: mip.hpp:68
C++ class representing a MIP Packet.
Definition: mip.hpp:111
static Packet createFromField(uint8_t *buffer, size_t bufferSize, const Field &field, uint8_t fieldDescriptor=Field::FIELD_DESCRIPTOR)
Definition: mip.hpp:180
C++ class representing a MIP parser.
Definition: mip.hpp:224
const uint8_t * mip_packet_pointer(const mip_packet *packet)
packet_length mip_packet_total_length(const mip_packet *packet)
struct mip::C::mip_cmd_queue mip_cmd_queue
Holds a list of pending commands.
timeout_type mip_cmd_queue_base_reply_timeout(const mip_cmd_queue *queue)
void mip_cmd_queue_dequeue(mip_cmd_queue *queue, mip_pending_cmd *cmd)
void mip_cmd_queue_init(mip_cmd_queue *queue, timeout_type base_reply_timeout)
void mip_cmd_queue_update(mip_cmd_queue *queue, timestamp_type timestamp)
void mip_cmd_queue_process_packet(mip_cmd_queue *queue, const mip_packet *packet, timestamp_type timestamp)
void mip_cmd_queue_clear(mip_cmd_queue *queue)
void mip_cmd_queue_enqueue(mip_cmd_queue *queue, mip_pending_cmd *cmd)
void mip_cmd_queue_set_base_reply_timeout(mip_cmd_queue *queue, timeout_type timeout)
void(* mip_dispatch_packet_callback)(void *context, const mip_packet *packet, timestamp_type timestamp)
Signature for packet-level callbacks.
Definition: mip_dispatch.h:38
void(* mip_dispatch_field_callback)(void *context, const mip_field *field, timestamp_type timestamp)
Signature for field-level callbacks.
Definition: mip_dispatch.h:47
@ MIP_DISPATCH_ANY_DATA_SET
Definition: mip_dispatch.h:63
@ MIP_DISPATCH_ANY_DESCRIPTOR
Definition: mip_dispatch.h:67
const uint8_t * mip_pending_cmd_response(const mip_pending_cmd *cmd)
enum mip_cmd_result mip_pending_cmd_status(const mip_pending_cmd *cmd)
uint8_t mip_pending_cmd_response_length(const mip_pending_cmd *cmd)
void mip_pending_cmd_init_with_timeout(mip_pending_cmd *cmd, uint8_t descriptor_set, uint8_t field_descriptor, timeout_type additional_time)
void mip_pending_cmd_init_full(mip_pending_cmd *cmd, uint8_t descriptor_set, uint8_t field_descriptor, uint8_t response_descriptor, uint8_t *response_buffer, uint8_t response_size, timeout_type additional_time)
struct mip::C::mip_pending_cmd mip_pending_cmd
Represents a command awaiting a reply from the device.
@ DESCRIPTOR_SET
Definition: commands_3dm.hpp:32
@ MIP_ACK_OK
Command completed successfully.
Definition: mip_result.h:32
void setUpdateFunction()
Sets the update function to a function taking a MipDevice reference.
Definition: mip_device.hpp:277
bool startCommand(C::mip_interface &device, C::mip_pending_cmd &pending, const Cmd &cmd, Timeout additionalTime)
Definition: mip_device.hpp:630
void registerExtractor(C::mip_dispatch_handler &handler, DataField *field, uint8_t descriptorSet=DataField::DESCRIPTOR_SET)
Definition: mip_device.hpp:580
CmdResult runCommand(C::mip_interface &device, const Cmd &cmd, Timeout additionalTime=0)
Definition: mip_device.hpp:592
void registerDataCallback(C::mip_dispatch_handler &handler, void *userData=nullptr, uint8_t descriptorSet=DataField::DESCRIPTOR_SET)
Registers a data callback (free function version).
Definition: mip_device.hpp:494
struct mip::C::mip_dispatch_handler mip_dispatch_handler
Handler information for MIP Packet or Field callbacks.
bool(* mip_update_callback)(struct mip_interface *device, bool blocking)
Callback function typedef for custom update behavior.
Definition: mip_interface.h:46
void mip_interface_set_update_function(mip_interface *device, mip_update_callback function)
void mip_interface_set_max_packets_per_update(mip_interface *device, unsigned int max_packets)
void mip_interface_register_packet_callback(mip_interface *device, mip_dispatch_handler *handler, uint8_t descriptor_set, bool after_fields, mip_dispatch_packet_callback callback, void *user_data)
bool mip_interface_update(mip_interface *device, bool blocking)
bool mip_interface_default_update(mip_interface *device, bool blocking)
bool mip_interface_start_command_packet(mip_interface *device, const mip_packet *packet, mip_pending_cmd *cmd)
enum mip_cmd_result mip_interface_run_command_packet(mip_interface *device, const mip_packet *packet, mip_pending_cmd *cmd)
void mip_interface_register_field_callback(mip_interface *device, mip_dispatch_handler *handler, uint8_t descriptor_set, uint8_t field_descriptor, mip_dispatch_field_callback callback, void *user_data)
unsigned int mip_interface_max_packets_per_update(const mip_interface *device)
mip_cmd_queue * mip_interface_cmd_queue(mip_interface *device)
struct mip::C::mip_interface mip_interface
State of the interface for communicating with a MIP device.
mip_parser * mip_interface_parser(mip_interface *device)
enum mip_cmd_result mip_interface_wait_for_reply(mip_interface *device, const mip_pending_cmd *cmd)
void mip_interface_receive_packet(mip_interface *device, const mip_packet *packet, timestamp_type timestamp)
void mip_interface_init(mip_interface *device, uint8_t *parse_buffer, size_t parse_buffer_size, timeout_type parse_timeout, timeout_type base_reply_timeout)
remaining_count mip_interface_receive_bytes(mip_interface *device, const uint8_t *data, size_t length, timestamp_type timestamp)
void mip_interface_process_unparsed_packets(mip_interface *device)
A collection of C++ classes and functions covering the full mip api.
Definition: commands_3dm.c:11
void extract(Serializer &serializer, Bitfield< Derived > &bitfield)
Definition: descriptors.h:98
C::timestamp_type Timestamp
Definition: mip_types.h:43
C::timeout_type Timeout
Definition: mip_types.h:44
C::remaining_count RemainingCount
Definition: mip_types.h:42
Holds a list of pending commands.
Definition: mip_cmdqueue.h:93
mip_pending_cmd * _first_pending_cmd
Definition: mip_cmdqueue.h:94
Handler information for MIP Packet or Field callbacks.
Definition: mip_dispatch.h:88
Holds the state of the MIP dispatch system.
Definition: mip_dispatch.h:122
A structure representing a MIP field.
Definition: mip_field.h:53
State of the interface for communicating with a MIP device.
Definition: mip_interface.h:52
Structure representing a MIP Packet.
Definition: mip_packet.h:44
Represents a command awaiting a reply from the device.
Definition: mip_cmdqueue.h:42
C++ wrapper around a command queue.
Definition: mip_device.hpp:31
Timeout baseReplyTimeout() const
Definition: mip_device.hpp:46
~CmdQueue()
Definition: mip_device.hpp:33
CmdQueue & operator=(const CmdQueue &)=delete
CmdQueue(const CmdQueue &)=delete
void clear()
Definition: mip_device.hpp:41
void update(Timestamp now)
Definition: mip_device.hpp:43
void setBaseReplyTimeout(Timeout timeout)
Definition: mip_device.hpp:45
void dequeue(C::mip_pending_cmd &cmd)
Definition: mip_device.hpp:39
void enqueue(C::mip_pending_cmd &cmd)
Definition: mip_device.hpp:38
void processPacket(const C::mip_packet &packet, Timestamp timestamp)
Definition: mip_device.hpp:48
CmdQueue(Timeout baseReplyTimeout=1000)
Definition: mip_device.hpp:32
Represents the status of a MIP command.
Definition: mip_result.h:67
static constexpr C::mip_cmd_result STATUS_ERROR
Command could not be executed (error sending/receiving)
Definition: mip_result.h:68
static constexpr C::mip_cmd_result ACK_OK
Command completed successfully.
Definition: mip_result.h:75
bool isFinished() const
Definition: mip_result.h:109
static constexpr C::mip_cmd_result STATUS_NONE
Command has been initialized but not queued yet.
Definition: mip_result.h:73
Definition: mip_device.hpp:19
@ ANY_DESCRIPTOR
Definition: mip_device.hpp:22
@ ANY_DATA_SET
Definition: mip_device.hpp:21
C++ class representing the state of a MIP command.
Definition: mip_device.hpp:57
CmdResult status() const
Gets the status of the pending command.
Definition: mip_device.hpp:110
const uint8_t * response() const
Definition: mip_device.hpp:113
PendingCmd(const Cmd &cmd, uint8_t *responseBuffer, uint8_t responseBufferSize, Timeout additionalTime=0)
Create a pending command given the actual command struct and a response buffer.
Definition: mip_device.hpp:97
PendingCmd()
Create a null pending command in the CmdResult::NONE state.
Definition: mip_device.hpp:60
PendingCmd & operator=(const PendingCmd &)=delete
PendingCmd(const Cmd &cmd, Timeout additionalTime=0)
Create a pending command given the actual command struct.
Definition: mip_device.hpp:87
uint8_t responseLength() const
Definition: mip_device.hpp:116
PendingCmd(uint8_t descriptorSet, uint8_t fieldDescriptor, uint8_t responseDescriptor, uint8_t *responseBuffer, uint8_t responseBufferSize, Timeout additionalTime)
Create a pending command with expected response.
Definition: mip_device.hpp:79
PendingCmd(uint8_t descriptorSet, uint8_t fieldDescriptor, Timeout additionalTime=0)
Create a pending command for the given descriptor pair.
Definition: mip_device.hpp:68
~PendingCmd()
Sanity check that the PendingCmd is not deallocated while still in the queue.
Definition: mip_device.hpp:106
PendingCmd(const PendingCmd &)=delete
Disable copying and moving. Once queued, a pending command must remain in the same memory location.