MIP_SDK  v3.0.0-736-g212583cf
MicroStrain Communications Library for embedded systems
mip_interface.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "mip_cmdqueue.hpp"
4 #include "mip_parser.hpp"
5 
6 #include <mip/mip_descriptors.h>
7 #include <mip/mip_interface.h>
8 
9 #include <assert.h>
10 #include <string>
11 
12 namespace microstrain
13 {
14  class Connection;
15 } // namespace microstrain
16 
17 namespace mip
18 {
22 
23  class Interface;
24 
25  void connect_interface(Interface& dev, microstrain::Connection& conn);
26  bool recv_from_connection(microstrain::Connection* conn, microstrain::U8ArrayView buffer, Timeout timeout, bool from_cmd, size_t* length_out, Timestamp* timestamp_out);
27 
29 
30  struct Dispatcher : public C::mip_dispatcher
31  {
32  enum : uint8_t {
35  };
36 
37  void addHandler(DispatchHandler& handler) { C::mip_dispatcher_add_handler(this, &handler); }
39 
41  };
42 
43  template<class Cmd> CmdResult runCommand(C::mip_interface& device, const Cmd& cmd, Timeout additionalTime=0);
44  template<class Cmd> CmdResult runCommand(C::mip_interface& device, const Cmd& cmd, typename Cmd::Response& response, Timeout additionalTime=0);
45  template<class Cmd, class... Args> CmdResult runCommand(C::mip_interface& device, const Args&&... args, Timeout additionalTime);
46  template<class Cmd> bool startCommand(C::mip_interface& device, C::mip_pending_cmd& pending, const Cmd& cmd, Timeout additionalTime);
47 
48 
52  class Interface : public C::mip_interface
53  {
54  public:
55  //
56  // Constructors
57  //
58 
65  {
66  C::mip_interface_init(this, parseTimeout, baseReplyTimeout, nullptr, nullptr, &C::mip_interface_default_update, nullptr);
67  }
68 
76  Interface(parseTimeout, baseReplyTimeout)
77  {
78  if (connection)
79  connect_interface(*this, *connection);
80  }
81 
82  Interface(const Interface&) = delete;
83  Interface& operator=(const Interface&) = delete;
84 
85  ~Interface() = default;
86 
87  //
88  // Connection-related callback functions
89  //
90 
91  // C function callbacks
92 
96 
100 
101  // Free/nonmember function callbacks
102 
103  template<bool (*Send)(Interface&, const uint8_t*, size_t)>
104  void setSendFunctionFree();
105  template<bool (*Send)(Interface&, microstrain::ConstU8ArrayView)>
106  void setSendFunctionFree();
107 
108  template<bool (*Recv)(Interface&, uint8_t*, size_t, Timeout, bool, size_t*, Timestamp*)>
109  void setRecvFunctionFree();
110  template<bool (*Recv)(Interface&, microstrain::U8ArrayView, Timeout, bool, size_t*, Timestamp*)>
111  void setRecvFunctionFree();
112 
113  template<bool (*Update)(Interface&, Timeout, bool)>
114  void setUpdateFunctionFree();
115 
116  // Class member function callbacks - user pointer must be valid!
117 
118  template<class UserClass, bool (UserClass::*Send)(const uint8_t*, size_t)>
120  template<class UserClass, bool (UserClass::*Send)(microstrain::ConstU8ArrayView)>
122  template<class UserClass, bool (*Send)(UserClass*, microstrain::ConstU8ArrayView)>
124 
125  template<class UserClass, bool (UserClass::*Recv)(uint8_t*, size_t, Timeout, bool, size_t*, Timestamp*)>
127  template<class UserClass, bool (UserClass::*Recv)(microstrain::U8ArrayView, Timeout, bool, size_t*, Timestamp*)>
129  template<class UserClass, bool (*Recv)(UserClass*, microstrain::U8ArrayView, Timeout, bool, size_t*, Timestamp*)>
131 
132  template<class UserClass, bool (UserClass::*Update)(Timeout, bool)>
134  template<class UserClass, bool (*Update)(UserClass*, Timeout, bool)>
136 
137  // All-in-one function
138  template<
139  class T,
140  bool (T::*Send)(microstrain::ConstU8ArrayView),
141  bool (T::*Recv)(microstrain::U8ArrayView, Timeout, bool, size_t*, Timestamp*),
142  bool (T::*Update)(Timeout, bool) = nullptr
143  >
144  void setCallbacksUserPointer(T* object);
145 
146  // Derived class member function callbacks
147 
148  template<class Derived, bool (Derived::*Send)(microstrain::ConstU8ArrayView)>
149  void setSendFunctionDerived();
150 
151  template<class Derived, bool (Derived::*Recv)(microstrain::U8ArrayView, Timeout, bool, size_t*, Timestamp*)>
152  void setRecvFunctionDerived();
153 
154  template<class Derived, bool (Derived::*Update)(Timeout, bool)>
156 
157  // All-in-one function
158  template<
159  class Derived,
160  bool (Derived::*Send)(microstrain::ConstU8ArrayView),
161  bool (Derived::*Recv)(microstrain::U8ArrayView, Timeout, bool, size_t*, Timestamp*),
162  bool (Derived::*Update)(Timeout, bool) = nullptr
163  >
164  void setCallbacksDerived();
165 
166  //
167  // General accessors
168  //
169 
175  void setUserPointer(void* ptr) { C::mip_interface_set_user_pointer(this, ptr); }
176  void* userPointer() { return C::mip_interface_user_pointer(this); }
177 
180 
181  Parser& parser() { return *static_cast<Parser*>(C::mip_interface_parser(this)); }
182  CmdQueue& cmdQueue() { return *static_cast<CmdQueue*>(C::mip_interface_cmd_queue(this)); }
183 
184  const Parser& parser() const { return const_cast<Interface*>(this)->parser(); }
185  const CmdQueue& cmdQueue() const { return const_cast<Interface*>(this)->cmdQueue(); }
186 
187  //
188  // Communications
189  //
190 
191  bool sendToDevice(const uint8_t* data, size_t length) { return C::mip_interface_send_to_device(this, data, length); }
194 
195  bool recvFromDevice(microstrain::U8ArrayView buffer, Timeout wait_time, bool from_cmd, size_t* length_out, Timestamp* timestamp_out) { return C::mip_interface_recv_from_device(this, buffer.data(), buffer.size(), wait_time, from_cmd, length_out, timestamp_out); }
196 
197  bool update(Timeout wait_time, bool from_cmd = false) { return C::mip_interface_update(this, wait_time, from_cmd); }
198 
199  bool defaultUpdate(Timeout wait_time, bool from_cmd = false) { return C::mip_interface_default_update(this, wait_time, from_cmd); }
200  bool defaultUpdateExtBuffer(Timeout wait_time, bool from_cmd, microstrain::U8ArrayView buffer) { return C::mip_interface_default_update_ext_buffer(this, wait_time, from_cmd, buffer.data(), buffer.size()); }
201 
202  void inputBytes(const uint8_t* data, size_t length, Timestamp timestamp) { C::mip_interface_input_bytes_from_device(this, data, length, timestamp); }
203  void inputBytes(microstrain::ConstU8ArrayView data, Timestamp timestamp) { C::mip_interface_input_bytes_from_device(this, data.data(), data.size(), timestamp); }
204 
205  void inputPacket(const C::mip_packet_view& packet, Timestamp timestamp) { C::mip_interface_input_packet_from_device(this, &packet, timestamp); }
206 
207  void updateTime(Timestamp timestamp) { C::mip_interface_update_time(this, timestamp); }
208 
210 
212 
213  //
214  // Data Callbacks
215  //
216 
217  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); }
218  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); }
219 
220  template<void (*Callback)(void*, const PacketView&, Timestamp)>
221  void registerPacketCallback(C::mip_dispatch_handler& handler, uint8_t descriptorSet, bool afterFields, void* userData=nullptr);
222 
223  template<class Object, void (Object::*Callback)(const PacketView&, Timestamp)>
224  void registerPacketCallback(C::mip_dispatch_handler& handler, uint8_t descriptorSet, bool afterFields, Object* object);
225 
226  template<void (*Callback)(void*, const FieldView&, Timestamp)>
227  void registerFieldCallback(C::mip_dispatch_handler& handler, uint8_t descriptorSet, uint8_t fieldDescriptor, void* userData=nullptr);
228 
229  template<class Object, void (Object::*Callback)(const FieldView& field, Timestamp)>
230  void registerFieldCallback(C::mip_dispatch_handler& handler, uint8_t descriptorSet, uint8_t fieldDescriptor, Object* object);
231 
232  template<class DataField, void (*Callback)(void*, const DataField&, Timestamp)>
233  void registerDataCallback(C::mip_dispatch_handler& handler, void* userData=nullptr, uint8_t descriptorSet=DataField::DESCRIPTOR_SET);
234 
235  template<class DataField, void (*Callback)(void*, const DataField&, uint8_t, Timestamp)>
236  void registerDataCallback(C::mip_dispatch_handler& handler, void* userData=nullptr, uint8_t descriptorSet=DataField::DESCRIPTOR_SET);
237 
238  template<class DataField, class Object, void (Object::*Callback)(const DataField&, Timestamp)>
239  void registerDataCallback(C::mip_dispatch_handler& handler, Object* object, uint8_t descriptorSet=DataField::DESCRIPTOR_SET);
240 
241  template<class DataField, class Object, void (Object::*Callback)(const DataField&, uint8_t, Timestamp)>
242  void registerDataCallback(C::mip_dispatch_handler& handler, Object* object, uint8_t descriptorSet=DataField::DESCRIPTOR_SET);
243 
244  template<class DataField>
245  void registerExtractor(C::mip_dispatch_handler& handler, DataField* field, uint8_t descriptorSet=DataField::DESCRIPTOR_SET);
246 
247  //
248  // Run function templates
249  //
250 
251  template<class Cmd>
252  CmdResult runCommand(const Cmd& cmd, Timeout additionalTime=0) { return mip::runCommand(*this, cmd, additionalTime); }
253 
254  template<class Cmd, class... Args>
255  CmdResult runCommand(Args&&... args, Timeout additionalTime=0) { return mip::runCommand(*this, std::forward<Args>(args)..., additionalTime); }
256 
257  template<class Cmd>
258  CmdResult runCommand(const Cmd& cmd, typename Cmd::Response& response, Timeout additionalTime=0) { return mip::runCommand(*this, cmd, response, additionalTime); }
259 
260  template<class Cmd>
261  bool startCommand(PendingCmd& pending, const Cmd& cmd, Timeout additionalTime=0) { return mip::startCommand(*this, pending, cmd, additionalTime); }
262 
263  // template<class Cmd>
264  // bool startCommand(PendingCmd& pending, const Cmd& cmd, uint8_t* responseBuffer, uint8_t responseBufferSize, Timeout additionalTime=0) { return startCommand(pending, cmd, responseBuffer, responseBufferSize, additionalTime); }
265  };
266 
267 
270  //
271  // Connection callback assignment functions
272  //
275 
277  //
278  // Free / non-member functions
279  //
281 
287  template<bool (*Send)(Interface&, const uint8_t*, size_t)>
289  {
290  setSendFunction([](C::mip_interface* device, const uint8_t* data, size_t length)->bool
291  {
292  return (*Send)(*static_cast<Interface*>(device), data, length);
293  });
294  }
295 
301  template<bool (*Send)(Interface&, microstrain::ConstU8ArrayView)>
303  {
304  setSendFunction([](C::mip_interface* device, const uint8_t* data, size_t length)->bool
305  {
306  return (*Send)(*static_cast<Interface*>(device), {data, length});
307  });
308  }
309 
315  template<bool (*Recv)(Interface&, uint8_t*, size_t, Timeout, bool, size_t*, Timestamp*)>
317  {
318  setRecvFunction([](C::mip_interface* device, uint8_t* buffer, size_t max_length, C::mip_timeout wait_time, bool from_cmd, size_t* length_out, C::mip_timestamp* timestamp_out)->bool
319  {
320  return (*Recv)(*static_cast<Interface*>(device), buffer, max_length, wait_time, from_cmd, length_out, timestamp_out);
321  });
322  }
323 
329  template<bool (*Recv)(Interface&, microstrain::U8ArrayView, Timeout, bool, size_t*, Timestamp*)>
331  {
332  setRecvFunction([](C::mip_interface* device, uint8_t* buffer, size_t max_length, C::mip_timeout wait_time, bool from_cmd, size_t* length_out, C::mip_timestamp* timestamp_out)->bool
333  {
334  return (*Recv)(*static_cast<Interface*>(device), {buffer, max_length}, wait_time, from_cmd, length_out, timestamp_out);
335  });
336  }
337 
343  template<bool (*Update)(Interface&, Timeout, bool)>
345  {
346  setUpdateFunction([](C::mip_interface* device, C::mip_timeout wait_time, bool from_cmd)->bool
347  {
348  return (*Update)(*static_cast<Interface*>(device), wait_time, from_cmd);
349  });
350  }
351 
352 
354  //
355  // Class member functions on user data pointer (cast user pointer)
356  //
358 
381  template<class UserClass, bool (UserClass::*Send)(const uint8_t*, size_t)>
383  {
384  setSendFunction([](C::mip_interface* device, const uint8_t* data, size_t length)
385  {
386  auto* object = static_cast<UserClass*>(C::mip_interface_user_pointer(device));
387  return (object->*Send)(data, length);
388  });
389  }
390 
413  template<class UserClass, bool (UserClass::*Send)(microstrain::ConstU8ArrayView)>
415  {
416  setSendFunction([](C::mip_interface* device, const uint8_t* data, size_t length)
417  {
418  auto* object = static_cast<UserClass*>(C::mip_interface_user_pointer(device));
419  return (object->*Send)({data, length});
420  });
421  }
422 
445  template<class UserClass, bool (*Send)(UserClass*, microstrain::ConstU8ArrayView)>
447  {
448  setSendFunction([](C::mip_interface* device, const uint8_t* data, size_t length)
449  {
450  auto* object = static_cast<UserClass*>(C::mip_interface_user_pointer(device));
451  return (*Send)(object, {data, length});
452  });
453  }
454 
455 
465  template<class UserClass, bool (UserClass::*Recv)(uint8_t*, size_t, Timeout, bool, size_t*, Timestamp*)>
467  {
468  setRecvFunction([](C::mip_interface* device, uint8_t* buffer, size_t max_length, Timeout wait_time, bool from_cmd, size_t* length_out, Timestamp* timestamp_out)
469  {
470  auto* object = static_cast<UserClass*>(C::mip_interface_user_pointer(device));
471  return (object->*Recv)(buffer, max_length, wait_time, from_cmd, length_out, timestamp_out);
472  });
473  }
474 
484  template<class UserClass, bool (UserClass::*Recv)(microstrain::U8ArrayView, Timeout, bool, size_t*, Timestamp*)>
486  {
487  setRecvFunction([](C::mip_interface* device, uint8_t* buffer, size_t max_length, Timeout wait_time, bool from_cmd, size_t* length_out, Timestamp* timestamp_out)
488  {
489  auto* object = static_cast<UserClass*>(C::mip_interface_user_pointer(device));
490  return (object->*Recv)({buffer, max_length}, wait_time, from_cmd, length_out, timestamp_out);
491  });
492  }
493 
503  template<class UserClass, bool (*Recv)(UserClass*, microstrain::U8ArrayView, Timeout, bool, size_t*, Timestamp*)>
505  {
506  setRecvFunction([](C::mip_interface* device, uint8_t* buffer, size_t max_length, Timeout wait_time, bool from_cmd, size_t* length_out, Timestamp* timestamp_out)
507  {
508  auto* object = static_cast<UserClass*>(C::mip_interface_user_pointer(device));
509  return (*Recv)(object, {buffer, max_length}, wait_time, from_cmd, length_out, timestamp_out);
510  });
511  }
512 
522  template<class UserClass, bool (UserClass::*Update)(Timeout, bool)>
524  {
525  setUpdateFunction([](C::mip_interface* device, C::mip_timeout wait_time, bool from_cmd)->bool
526  {
527  auto* object = static_cast<UserClass*>(C::mip_interface_user_pointer(device));
528  return (object->*Update)(wait_time, from_cmd);
529  });
530  }
531 
541  template<class UserClass, bool (*Update)(UserClass*, Timeout, bool)>
543  {
544  setUpdateFunction([](C::mip_interface* device, C::mip_timeout wait_time, bool from_cmd)->bool
545  {
546  auto* object = static_cast<UserClass*>(C::mip_interface_user_pointer(device));
547  return (*Update)(object, wait_time, from_cmd);
548  });
549  }
550 
588  template<
589  class UserClass,
590  bool (UserClass::*Send)(microstrain::ConstU8ArrayView),
591  bool (UserClass::*Recv)(microstrain::U8ArrayView, Timeout, bool, size_t*, Timestamp*),
592  bool (UserClass::*Update)(Timeout, bool)
593  >
594  void Interface::setCallbacksUserPointer(UserClass* object)
595  {
596  setUserPointer(object);
597 
598  setSendFunctionUserPointer<UserClass, Send>();
599  setRecvFunctionUserPointer<UserClass, Recv>();
600 
601  // Use default update function if an update function is not provided.
602  if(Update == nullptr && Recv != nullptr)
603  setUpdateFunction(&C::mip_interface_default_update);
604  else
605  setUpdateFunctionUserPointer<UserClass, Update>();
606  }
607 
608 
610  //
611  // Derived member functions (cast this to derived type)
612  //
614 
635  template<class Derived, bool (Derived::*Send)(microstrain::ConstU8ArrayView)>
637  {
638  static_assert(std::is_base_of<C::mip_interface, Derived>::value, "Derived must inherit C::mip_interface.");
639 
640  setSendFunction([](C::mip_interface* device, const uint8_t* data, size_t length)
641  {
642  return (static_cast<Derived*>(device)->*Send)({data, length});
643  });
644  }
645 
655  template<class Derived, bool (Derived::*Recv)(microstrain::U8ArrayView, Timeout, bool, size_t*, Timestamp*)>
657  {
658  static_assert(std::is_base_of<C::mip_interface, Derived>::value, "Derived must inherit C::mip_interface.");
659 
660  setRecvFunction([](C::mip_interface* device, uint8_t* buffer, size_t max_length, Timeout wait_time, bool from_cmd, size_t* length_out, Timestamp* timestamp_out)
661  {
662  return (static_cast<Derived*>(device)->*Recv)({buffer, max_length}, wait_time, from_cmd, length_out, timestamp_out);
663  });
664  }
665 
675  template<class Derived, bool (Derived::*Update)(Timeout, bool)>
677  {
678  static_assert(std::is_base_of<C::mip_interface, Derived>::value, "Derived must inherit C::mip_interface.");
679 
680  setUpdateFunction([](C::mip_interface* device, C::mip_timeout wait_time, bool from_cmd)->bool
681  {
682  return (static_cast<Derived*>(device)->*Update)(wait_time, from_cmd);
683  });
684  }
685 
719  template<
720  class Derived,
721  bool (Derived::*Send)(microstrain::ConstU8ArrayView),
722  bool (Derived::*Recv)(microstrain::U8ArrayView, Timeout, bool, size_t*, Timestamp*),
723  bool (Derived::*Update)(Timeout, bool)
724  >
726  {
727  static_assert(std::is_base_of<C::mip_interface, Derived>::value, "Derived must inherit C::mip_interface.");
728 
729  setSendFunctionDerived<Derived, Send>();
730  setRecvFunctionDerived<Derived, Recv>();
731 
732  // Use default update function if an update function is not provided.
733  if(Update == nullptr && Recv != nullptr)
734  setUpdateFunction(&C::mip_interface_default_update);
735  else
736  setRecvFunctionDerived<Derived, Update>();
737  }
738 
739 
742  //
743  // Data callback assignment functions
744  //
747 
748 
782  template<void (*Callback)(void*, const PacketView&, Timestamp)>
783  void Interface::registerPacketCallback(C::mip_dispatch_handler& handler, uint8_t descriptorSet, bool afterFields, void* userData)
784  {
785  C::mip_dispatch_packet_callback callback = [](void* context, const C::mip_packet_view* packet, Timestamp timestamp)
786  {
787  PacketView packetView(*packet);
788  Callback(context, packetView, timestamp);
789  };
790 
791  registerPacketCallback(handler, descriptorSet, afterFields, callback, userData);
792  }
793 
827  template<class Object, void (Object::*Callback)(const PacketView&, Timestamp)>
828  void Interface::registerPacketCallback(C::mip_dispatch_handler& handler, uint8_t descriptorSet, bool afterFields, Object* object)
829  {
830  C::mip_dispatch_packet_callback callback = [](void* pointer, const C::mip_packet_view* packet, Timestamp timestamp)->void
831  {
832  PacketView packetView(*packet);
833  Object* obj = static_cast<Object*>(pointer);
834  (obj->*Callback)(packetView, timestamp);
835  };
836 
837  registerPacketCallback(handler, descriptorSet, afterFields, callback, object);
838  }
839 
873  template<void (*Callback)(void*, const FieldView&, Timestamp)>
874  void Interface::registerFieldCallback(C::mip_dispatch_handler& handler, uint8_t descriptorSet, uint8_t fieldDescriptor, void* userData)
875  {
876  C::mip_dispatch_field_callback callback = [](void* context, const C::mip_field_view* field, Timestamp timestamp)
877  {
878  FieldView fieldView(*field);
879  Callback(context, fieldView, timestamp);
880  };
881 
882  registerFieldCallback(handler, descriptorSet, fieldDescriptor, callback, userData);
883  }
884 
918  template<class Object, void (Object::*Callback)(const FieldView&, Timestamp)>
919  void Interface::registerFieldCallback(C::mip_dispatch_handler& handler, uint8_t descriptorSet, uint8_t fieldDescriptor, Object* object)
920  {
921  C::mip_dispatch_field_callback callback = [](void* pointer, const C::mip_field_view* field, Timestamp timestamp)
922  {
923  FieldView fieldView(*field);
924  Object* obj = static_cast<Object*>(pointer);
925  (obj->*Callback)(fieldView, timestamp);
926  };
927 
928  registerFieldCallback(handler, descriptorSet, fieldDescriptor, callback, object);
929  }
930 
966  template<class DataField, void (*Callback)(void*, const DataField&, Timestamp)>
967  void Interface::registerDataCallback(C::mip_dispatch_handler& handler, void* userData, uint8_t descriptorSet)
968  {
969  assert(descriptorSet != 0x00);
970  if (descriptorSet == 0x00)
971  return;
972 
973  assert(descriptorSet != 0xFF); // Descriptor set must be specified for shared data.
974  if (descriptorSet == 0xFF)
975  return;
976 
977  C::mip_dispatch_field_callback callback = [](void* context, const C::mip_field_view* field, Timestamp timestamp)
978  {
979  DataField data;
980 
981  bool ok = FieldView(*field).extract(data);
982  assert(ok); (void)ok;
983 
984  Callback(context, data, timestamp);
985  };
986 
987  registerFieldCallback(handler, descriptorSet, DataField::FIELD_DESCRIPTOR, callback, userData);
988  }
989 
1025  template<class DataField, void (*Callback)(void*, const DataField&, uint8_t, Timestamp)>
1026  void Interface::registerDataCallback(C::mip_dispatch_handler& handler, void* userData, uint8_t descriptorSet)
1027  {
1028  assert(descriptorSet != 0x00);
1029  if (descriptorSet == 0x00)
1030  return;
1031 
1032  assert(descriptorSet != 0xFF); // Descriptor set must be specified for shared data.
1033  if (descriptorSet == 0xFF)
1034  return;
1035 
1036  C::mip_dispatch_field_callback callback = [](void* context, const C::mip_field_view* field, Timestamp timestamp)
1037  {
1038  DataField data;
1039 
1040  bool ok = FieldView(*field).extract(data);
1041  assert(ok); (void)ok;
1042 
1043  Callback(context, data, mip_field_descriptor_set(field), timestamp);
1044  };
1045 
1046  registerFieldCallback(handler, descriptorSet, DataField::FIELD_DESCRIPTOR, callback, userData);
1047  }
1048 
1085  template<class DataField, class Object, void (Object::*Callback)(const DataField&, Timestamp)>
1086  void Interface::registerDataCallback(C::mip_dispatch_handler& handler, Object* object, uint8_t descriptorSet)
1087  {
1088  assert(descriptorSet != 0x00);
1089  if (descriptorSet == 0x00)
1090  return;
1091 
1092  assert(descriptorSet != 0xFF); // Descriptor set must be specified for shared data.
1093  if (descriptorSet == 0xFF)
1094  return;
1095 
1096  C::mip_dispatch_field_callback callback = [](void* pointer, const C::mip_field_view* field, Timestamp timestamp)
1097  {
1098  DataField data;
1099 
1100  bool ok = FieldView(*field).extract(data);
1101  assert(ok); (void)ok;
1102 
1103  Object* obj = static_cast<Object*>(pointer);
1104  (obj->*Callback)(data, timestamp);
1105  };
1106 
1107  registerFieldCallback(handler, descriptorSet, DataField::FIELD_DESCRIPTOR, callback, object);
1108  }
1109 
1146  template<class DataField, class Object, void (Object::*Callback)(const DataField&, uint8_t, Timestamp)>
1147  void Interface::registerDataCallback(C::mip_dispatch_handler& handler, Object* object, uint8_t descriptorSet)
1148  {
1149  assert(descriptorSet != 0x00);
1150  if (descriptorSet == 0x00)
1151  return;
1152 
1153  assert(descriptorSet != 0xFF); // Descriptor set must be specified for shared data.
1154  if (descriptorSet == 0xFF)
1155  return;
1156 
1157  C::mip_dispatch_field_callback callback = [](void* pointer, const C::mip_field_view* field, Timestamp timestamp)
1158  {
1159  DataField data;
1160 
1161  bool ok = FieldView(*field).extract(data);
1162  assert(ok); (void)ok;
1163 
1164  Object* obj = static_cast<Object*>(pointer);
1165  (obj->*Callback)(data, mip_field_descriptor_set(field), timestamp);
1166  };
1167 
1168  registerFieldCallback(handler, descriptorSet, DataField::FIELD_DESCRIPTOR, callback, object);
1169  }
1170 
1171  template<class DataField>
1172  void Interface::registerExtractor(C::mip_dispatch_handler& handler, DataField* field, uint8_t descriptorSet)
1173  {
1174  C::mip_dispatch_field_callback callback = [](void* pointer, const C::mip_field_view* field, Timestamp /*timestamp*/)
1175  {
1176  FieldView(*field).extract(*static_cast<DataField*>(pointer));
1177  };
1178 
1179  registerFieldCallback(handler, descriptorSet, DataField::FIELD_DESCRIPTOR, callback, field);
1180  }
1181 
1182 
1185  //
1186  // Run command functions
1187  //
1190 
1191 
1192  template<class Cmd>
1193  CmdResult runCommand(C::mip_interface& device, const Cmd& cmd, Timeout additionalTime)
1194  {
1195  PacketBuf packet(cmd);
1196 
1197  C::mip_pending_cmd pending;
1198  C::mip_pending_cmd_init_with_timeout(&pending, Cmd::DESCRIPTOR_SET, Cmd::FIELD_DESCRIPTOR, additionalTime);
1199 
1200  return C::mip_interface_run_command_packet(&device, &packet, &pending);
1201  }
1202 
1203  template<class Cmd, class... Args>
1204  CmdResult runCommand(C::mip_interface& device, const Args&&... args, Timeout additionalTime)
1205  {
1206  Cmd cmd{std::forward<Args>(args)...};
1207  return runCommand(device, cmd, additionalTime);
1208  }
1209 
1210  template<class Cmd>
1211  CmdResult runCommand(C::mip_interface& device, const Cmd& cmd, typename Cmd::Response& response, Timeout additionalTime)
1212  {
1213  PacketBuf packet(cmd);
1214 
1215  C::mip_pending_cmd pending;
1216  C::mip_pending_cmd_init_full(&pending, Cmd::DESCRIPTOR_SET, Cmd::FIELD_DESCRIPTOR, Cmd::Response::FIELD_DESCRIPTOR, packet.buffer_w(), FieldView::PAYLOAD_LENGTH_MAX, additionalTime);
1217 
1218  CmdResult result = C::mip_interface_run_command_packet(&device, &packet, &pending);
1219  if (result != C::MIP_ACK_OK)
1220  return result;
1221 
1222  size_t responseLength = C::mip_pending_cmd_response_length(&pending);
1223 
1224  return extract(response, packet.buffer_w(), responseLength, 0) ? CmdResult::ACK_OK : CmdResult::STATUS_ERROR;
1225  }
1226 
1227  template<class Cmd>
1228  bool startCommand(C::mip_interface& device, C::mip_pending_cmd& pending, const Cmd& cmd, Timeout additionalTime)
1229  {
1230  PacketBuf packet(cmd);
1231 
1232  C::mip_pending_cmd_init_with_timeout(&pending, Cmd::DESCRIPTOR_SET, Cmd::FIELD_DESCRIPTOR, additionalTime);
1233 
1234  return C::mip_interface_start_command_packet(&device, &packet, &pending);
1235  }
1236 
1237  //template<class Cmd>
1238  //bool startCommand(C::mip_interface& device, C::mip_pending_cmd& pending, const Cmd& cmd, uint8_t* responseBuffer, uint8_t responseBufferSize, Timeout additionalTime)
1239  //{
1240  // PacketBuf packet(cmd);
1241  //
1242  // C::mip_pending_cmd_init_full(&pending, Cmd::descriptorSet, Cmd::fieldDescriptor, Cmd::Response::fieldDescriptor, responseBuffer, responseBufferSize, additionalTime);
1243  //
1244  // return C::mip_interface_start_command_packet(&device, &packet, &pending);
1245  //}
1246 
1249 } // namespace mip
mip::Interface::setRecvFunctionUserPointer
void setRecvFunctionUserPointer()
Sets the receive callback function (class member function version w/ ptr & length).
Definition: mip_interface.hpp:466
mip::Interface::registerDataCallback
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_interface.hpp:967
mip::C::MIP_DISPATCH_ANY_DATA_SET
@ MIP_DISPATCH_ANY_DATA_SET
Definition: mip_dispatch.h:70
mip::C::mip_dispatch_field_callback
void(* mip_dispatch_field_callback)(void *context, const mip_field_view *field, mip_timestamp timestamp)
Signature for field-level callbacks.
Definition: mip_dispatch.h:54
mip
A collection of C++ classes and functions covering the full mip api.
Definition: commands_3dm.c:11
mip::Interface::setRecvFunction
void setRecvFunction(C::mip_recv_callback callback)
Definition: mip_interface.hpp:98
mip::C::mip_interface_user_pointer
void * mip_interface_user_pointer(const mip_interface *device)
Retrieves the pointer set by mip_interface_set_user_pointer().
Definition: mip_interface.c:281
mip::Interface::startCommand
bool startCommand(PendingCmd &pending, const Cmd &cmd, Timeout additionalTime=0)
Definition: mip_interface.hpp:261
mip::C::mip_dispatcher_remove_handler
void mip_dispatcher_remove_handler(mip_dispatcher *self, mip_dispatch_handler *handler)
Removes a handler from the dispatch system.
Definition: mip_dispatch.c:210
mip::C::MIP_DISPATCH_ANY_DESCRIPTOR
@ MIP_DISPATCH_ANY_DESCRIPTOR
Definition: mip_dispatch.h:74
mip::C::mip_interface_default_update
bool mip_interface_default_update(mip_interface *device, mip_timeout wait_time, bool from_cmd)
Polls the port for new data or command replies.
Definition: mip_interface.c:404
mip::Interface::setSendFunctionDerived
void setSendFunctionDerived()
Sets the send callback function (derived member function version).
Definition: mip_interface.hpp:636
mip::C::mip_interface_set_update_function
void mip_interface_set_update_function(mip_interface *device, mip_update_callback callback)
Sets the update function.
Definition: mip_interface.c:245
mip::Interface::Interface
Interface(microstrain::Connection *connection, Timeout parseTimeout, Timeout baseReplyTimeout)
Initialize the mip_interface components.
Definition: mip_interface.hpp:75
mip::Interface::defaultUpdateExtBuffer
bool defaultUpdateExtBuffer(Timeout wait_time, bool from_cmd, microstrain::U8ArrayView buffer)
Definition: mip_interface.hpp:200
mip::Interface::inputBytes
void inputBytes(const uint8_t *data, size_t length, Timestamp timestamp)
Definition: mip_interface.hpp:202
mip::C::mip_interface_update
bool mip_interface_update(mip_interface *device, mip_timeout wait_time, bool from_cmd)
Call to process data from the device.
Definition: mip_interface.c:372
mip::C::mip_field_descriptor_set
uint8_t mip_field_descriptor_set(const mip_field_view *field)
Returns the descriptor set of the packet containing this field._.
Definition: mip_field.c:49
mip_parser.hpp
mip::Interface::setSendFunction
void setSendFunction(C::mip_send_callback callback)
Definition: mip_interface.hpp:97
mip::C::mip_interface_send_function
mip_send_callback mip_interface_send_function(const mip_interface *device)
Gets the send function pointer.
Definition: mip_interface.c:197
mip::Interface::setUpdateFunction
void setUpdateFunction(C::mip_update_callback function)
Definition: mip_interface.hpp:99
mip::C::mip_interface_recv_from_device
bool mip_interface_recv_from_device(mip_interface *device, uint8_t *buffer, size_t max_length, mip_timeout wait_time, bool from_cmd, size_t *length_out, mip_timestamp *timestamp_out)
Checks for data at the port and reads it into buffer.
Definition: mip_interface.c:342
mip::C::mip_interface_input_bytes_from_device
void mip_interface_input_bytes_from_device(mip_interface *device, const uint8_t *data, size_t length, mip_timestamp timestamp)
Passes data from the device into the parser.
Definition: mip_interface.c:495
mip::C::mip_interface_start_command_packet
bool mip_interface_start_command_packet(mip_interface *device, const mip_packet_view *packet, mip_pending_cmd *cmd)
Queues the command and sends the packet. Does not wait for completion.
Definition: mip_interface.c:693
mip::Interface::waitForReply
CmdResult waitForReply(C::mip_pending_cmd &cmd)
Definition: mip_interface.hpp:211
mip::FieldView::extract
bool extract(FieldType &field, bool exact_size=true) const
Deserializes the field data to specific field struct.
Definition: mip_field.hpp:124
mip::Interface::runCommand
CmdResult runCommand(const Cmd &cmd, typename Cmd::Response &response, Timeout additionalTime=0)
Definition: mip_interface.hpp:258
mip::Interface::runCommand
CmdResult runCommand(const Cmd &cmd, Timeout additionalTime=0)
Definition: mip_interface.hpp:252
mip::C::mip_packet_total_length
uint_least16_t mip_packet_total_length(const mip_packet_view *packet)
Returns the total length of the packet, in bytes.
Definition: mip_packet.c:113
mip::Interface::registerExtractor
void registerExtractor(C::mip_dispatch_handler &handler, DataField *field, uint8_t descriptorSet=DataField::DESCRIPTOR_SET)
Definition: mip_interface.hpp:1172
mip::Interface::updateTime
void updateTime(Timestamp timestamp)
Definition: mip_interface.hpp:207
mip::C::mip_interface_update_time
void mip_interface_update_time(mip_interface *device, mip_timestamp timestamp)
Call this to ensure that pending commands time out properly.
Definition: mip_interface.c:528
mip::C::mip_cmd_queue_base_reply_timeout
mip_timeout mip_cmd_queue_base_reply_timeout(const mip_cmd_queue *queue)
Gets the base reply timeout for all commands.
Definition: mip_cmdqueue.c:493
mip::C::mip_interface
struct mip::C::mip_interface mip_interface
State of the interface for communicating with a MIP device.
mip::Interface::operator=
Interface & operator=(const Interface &)=delete
mip::CmdResult::STATUS_ERROR
static constexpr C::mip_cmd_result STATUS_ERROR
Command could not be executed (error sending/receiving)
Definition: mip_result.hpp:27
mip::Interface::cmdQueue
const CmdQueue & cmdQueue() const
Definition: mip_interface.hpp:185
mip::Dispatcher::removeAllHandlers
void removeAllHandlers()
Definition: mip_interface.hpp:40
mip::C::mip_interface_update_function
mip_update_callback mip_interface_update_function(const mip_interface *device)
Gets the update function pointer.
Definition: mip_interface.c:257
mip::Dispatcher::addHandler
void addHandler(DispatchHandler &handler)
Definition: mip_interface.hpp:37
mip::Interface::recvFunction
C::mip_recv_callback recvFunction() const
Definition: mip_interface.hpp:94
mip::C::mip_packet_view
Structure representing a MIP Packet.
Definition: mip_packet.h:63
mip::C::mip_dispatcher
Holds the state of the MIP dispatch system.
Definition: mip_dispatch.h:130
mip::Interface::setRecvFunctionFree
void setRecvFunctionFree()
Sets the receive callback function (free function version).
Definition: mip_interface.hpp:316
mip_cmdqueue.hpp
mip::C::mip_interface_input_bytes_andor_time
void mip_interface_input_bytes_andor_time(mip_interface *device, const uint8_t *received_data, size_t data_length, mip_timestamp now)
This function takes care of processing received data and updating the current time.
Definition: mip_interface.c:473
mip::FieldView::PAYLOAD_LENGTH_MAX
static constexpr size_t PAYLOAD_LENGTH_MAX
Definition: mip_field.hpp:38
microstrain::ConstU8ArrayView
ConstArrayView< uint8_t > ConstU8ArrayView
Definition: array_view.hpp:151
mip::C::mip_timeout
microstrain::C::microstrain_embedded_timestamp mip_timeout
Definition: mip_types.h:16
mip::Interface::update
bool update(Timeout wait_time, bool from_cmd=false)
Definition: mip_interface.hpp:197
mip::C::mip_dispatch_handler
struct mip::C::mip_dispatch_handler mip_dispatch_handler
Handler information for MIP Packet or Field callbacks.
mip::Interface::sendFunction
C::mip_send_callback sendFunction() const
Definition: mip_interface.hpp:93
mip::C::mip_dispatch_packet_callback
void(* mip_dispatch_packet_callback)(void *context, const mip_packet_view *packet, mip_timestamp timestamp)
Signature for packet-level callbacks.
Definition: mip_dispatch.h:45
mip::C::mip_dispatcher_add_handler
void mip_dispatcher_add_handler(mip_dispatcher *self, mip_dispatch_handler *handler)
Registers a handler in the dispatch system.
Definition: mip_dispatch.c:189
mip::C::mip_pending_cmd
struct mip::C::mip_pending_cmd mip_pending_cmd
Represents a command awaiting a reply from the device.
mip::SizedPacketBuf
A mip packet with a self-contained buffer (useful with std::vector).
Definition: mip_packet.hpp:330
mip::PendingCmd
C++ class representing the state of a MIP command.
Definition: mip_cmdqueue.hpp:46
mip::Interface::setUpdateFunctionFree
void setUpdateFunctionFree()
Sets the update callback function (free function version).
Definition: mip_interface.hpp:344
mip::Interface::defaultUpdate
bool defaultUpdate(Timeout wait_time, bool from_cmd=false)
Definition: mip_interface.hpp:199
mip::C::mip_interface_default_update_ext_buffer
bool mip_interface_default_update_ext_buffer(mip_interface *device, mip_timeout wait_time, bool from_cmd, uint8_t *buffer, size_t buffer_size)
Polls the port for new data or command replies using a supplied buffer.
Definition: mip_interface.c:446
mip::Interface::setUserPointer
void setUserPointer(void *ptr)
Sets an optional user data pointer which can be retrieved later.
Definition: mip_interface.hpp:175
mip::Interface::~Interface
~Interface()=default
mip::C::mip_field_view
A structure representing a MIP field.
Definition: mip_field.h:53
mip::CmdResult
Represents the status of a MIP command.
Definition: mip_result.hpp:24
mip::Interface::setUpdateFunctionUserPointer
void setUpdateFunctionUserPointer()
Sets the update callback function (class member function version).
Definition: mip_interface.hpp:523
mip::Interface::sendToDevice
bool sendToDevice(microstrain::ConstU8ArrayView data)
Definition: mip_interface.hpp:192
mip::C::mip_interface_init
void mip_interface_init(mip_interface *device, mip_timeout parse_timeout, mip_timeout base_reply_timeout, mip_send_callback send, mip_recv_callback recv, mip_update_callback update, void *user_pointer)
Initialize the mip_interface components.
Definition: mip_interface.c:150
mip::Interface::inputBytes
void inputBytes(microstrain::ConstU8ArrayView data, Timestamp timestamp)
Definition: mip_interface.hpp:203
mip::C::mip_pending_cmd_response_length
uint8_t mip_pending_cmd_response_length(const mip_pending_cmd *cmd)
Returns the length of the response data.
Definition: mip_cmdqueue.c:142
mip::Interface::setRecvFunctionDerived
void setRecvFunctionDerived()
Sets the receive callback function (derived member function version).
Definition: mip_interface.hpp:656
mip::Interface::registerPacketCallback
void registerPacketCallback(C::mip_dispatch_handler &handler, uint8_t descriptorSet, bool afterFields, C::mip_dispatch_packet_callback callback, void *userData)
Definition: mip_interface.hpp:217
mip::C::mip_interface_run_command_packet
enum mip_cmd_result mip_interface_run_command_packet(mip_interface *device, const mip_packet_view *packet, mip_pending_cmd *cmd)
Similar to mip_interface_start_command_packet but waits for the command to complete.
Definition: mip_interface.c:672
mip::Interface::registerFieldCallback
void registerFieldCallback(C::mip_dispatch_handler &handler, uint8_t descriptorSet, uint8_t fieldDescriptor, C::mip_dispatch_field_callback callback, void *userData)
Definition: mip_interface.hpp:218
mip::Interface::parser
const Parser & parser() const
Definition: mip_interface.hpp:184
mip::runCommand
CmdResult runCommand(C::mip_interface &device, const Cmd &cmd, Timeout additionalTime=0)
Definition: mip_interface.hpp:1193
mip::FieldView
C++ class representing a MIP field.
Definition: mip_field.hpp:24
mip::Dispatcher
Definition: mip_interface.hpp:30
mip::PacketView::buffer_w
microstrain::U8ArrayView buffer_w()
Gets the entire storage buffer for the packet.
Definition: mip_packet.hpp:91
mip::C::mip_recv_callback
bool(* mip_recv_callback)(struct mip_interface *device, uint8_t *buffer, size_t max_length, mip_timeout wait_time, bool from_cmd, size_t *length_out, mip_timestamp *timestamp_out)
Called from mip_interface_recv_from_device() to receive data from the device port.
Definition: mip_interface.h:37
mip::C::mip_interface
State of the interface for communicating with a MIP device.
Definition: mip_interface.h:44
mip::C::mip_pending_cmd_init_full
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_buffer_size, mip_timeout additional_time)
Initialize a pending mip commmand with all parameters.
Definition: mip_cmdqueue.c:90
mip::Interface::setSendFunctionFree
void setSendFunctionFree()
Sets the send callback function (free function version).
Definition: mip_interface.hpp:288
mip::C::mip_interface_send_to_device
bool mip_interface_send_to_device(mip_interface *device, const uint8_t *data, size_t length)
Sends data to the port (i.e. from this library to the physical device).
Definition: mip_interface.c:323
mip::Interface::parser
Parser & parser()
Definition: mip_interface.hpp:181
mip::C::mip_cmd_queue_set_base_reply_timeout
void mip_cmd_queue_set_base_reply_timeout(mip_cmd_queue *queue, mip_timeout timeout)
Sets the base reply timeout for all commands.
Definition: mip_cmdqueue.c:483
mip::C::mip_interface_set_send_function
void mip_interface_set_send_function(mip_interface *device, mip_send_callback callback)
Sets the send callback function.
Definition: mip_interface.c:185
mip::commands_3dm::DESCRIPTOR_SET
@ DESCRIPTOR_SET
Definition: commands_3dm.hpp:31
mip::Timestamp
microstrain::EmbeddedTimestamp Timestamp
Definition: mip_types.h:50
mip::C::mip_interface_parser
mip_parser * mip_interface_parser(mip_interface *device)
Returns the MIP parser for the device.
Definition: mip_interface.c:289
mip::C::mip_pending_cmd
Represents a command awaiting a reply from the device.
Definition: mip_cmdqueue.h:37
mip_interface.h
mip::Interface::updateFunction
C::mip_update_callback updateFunction() const
Definition: mip_interface.hpp:95
mip::Interface::runCommand
CmdResult runCommand(Args &&... args, Timeout additionalTime=0)
Definition: mip_interface.hpp:255
mip::recv_from_connection
bool recv_from_connection(Connection *conn, U8ArrayView buffer, Timeout timeout, bool, size_t *length_out, Timestamp *timestamp_out)
Adapts microstrain::Connection::recvFromDevice to a signature compatible with mip interface receive c...
Definition: mip_interface.cpp:60
mip::Interface::baseReplyTimeout
Timeout baseReplyTimeout() const
Definition: mip_interface.hpp:178
mip::C::mip_interface_cmd_queue
mip_cmd_queue * mip_interface_cmd_queue(mip_interface *device)
Returns the commmand queue for the device.
Definition: mip_interface.c:297
mip::C::mip_interface_input_packet_from_device
void mip_interface_input_packet_from_device(mip_interface *device, const mip_packet_view *packet, mip_timestamp timestamp)
Processes a pre-parsed packet for command replies and data.
Definition: mip_interface.c:510
mip::Interface::cmdQueue
CmdQueue & cmdQueue()
Definition: mip_interface.hpp:182
microstrain::ArrayView::data
constexpr pointer data() const noexcept
Definition: array_view.hpp:69
mip::Interface::sendToDevice
bool sendToDevice(const C::mip_packet_view &packet)
Definition: mip_interface.hpp:193
mip::C::mip_interface_set_recv_function
void mip_interface_set_recv_function(mip_interface *device, mip_recv_callback callback)
Sets the receive callback function.
Definition: mip_interface.c:212
mip::CmdResult::ACK_OK
static constexpr C::mip_cmd_result ACK_OK
Command completed successfully.
Definition: mip_result.hpp:34
mip::Timeout
microstrain::EmbeddedTimeout Timeout
Definition: mip_types.h:51
mip_descriptors.h
mip::C::MIP_ACK_OK
@ MIP_ACK_OK
Command completed successfully.
Definition: mip_result.h:40
microstrain::ArrayView
Represents a view over a contiguous array of objects, similar to std::span, and is implemented as a p...
Definition: array_view.hpp:44
mip::Interface::setBaseReplyTimeout
void setBaseReplyTimeout(Timeout timeout)
Definition: mip_interface.hpp:179
mip::C::mip_interface_wait_for_reply
enum mip_cmd_result mip_interface_wait_for_reply(mip_interface *device, mip_pending_cmd *cmd)
Blocks until the pending command completes or times out.
Definition: mip_interface.c:564
mip::C::mip_interface_recv_function
mip_recv_callback mip_interface_recv_function(const mip_interface *device)
Gets the receive function pointer.
Definition: mip_interface.c:224
mip::Interface::inputPacket
void inputPacket(const C::mip_packet_view &packet, Timestamp timestamp)
Definition: mip_interface.hpp:205
mip::Interface::setSendFunctionUserPointer
void setSendFunctionUserPointer()
Sets the send callback function (class member function version w/ ptr & length).
Definition: mip_interface.hpp:382
mip::Interface::userPointer
void * userPointer()
Definition: mip_interface.hpp:176
mip::C::mip_dispatch_handler
Handler information for MIP Packet or Field callbacks.
Definition: mip_dispatch.h:94
microstrain::Connection
Represents a type of connection.
Definition: connection.hpp:21
mip::C::mip_timestamp
microstrain::C::microstrain_embedded_timestamp mip_timestamp
Definition: mip_types.h:15
mip::C::mip_send_callback
bool(* mip_send_callback)(struct mip_interface *device, const uint8_t *data, size_t length)
Called from mip_interface_send_to_device() to send data to the device port. The application should fo...
Definition: mip_interface.h:36
mip::C::mip_update_callback
bool(* mip_update_callback)(struct mip_interface *device, mip_timeout wait_time, bool from_cmd)
Callback function typedef for custom update behavior.
Definition: mip_interface.h:38
mip::C::mip_pending_cmd_init_with_timeout
void mip_pending_cmd_init_with_timeout(mip_pending_cmd *cmd, uint8_t descriptor_set, uint8_t field_descriptor, mip_timeout additional_time)
Initialize a pending mip commmand with extra timeout time.
Definition: mip_cmdqueue.c:48
mip::Interface::inputBytesAndOrTime
void inputBytesAndOrTime(microstrain::ConstU8ArrayView data, Timestamp timestamp)
Definition: mip_interface.hpp:209
mip::Interface::recvFromDevice
bool recvFromDevice(microstrain::U8ArrayView buffer, Timeout wait_time, bool from_cmd, size_t *length_out, Timestamp *timestamp_out)
Definition: mip_interface.hpp:195
mip::Dispatcher::ANY_DESCRIPTOR
@ ANY_DESCRIPTOR
Definition: mip_interface.hpp:34
mip::startCommand
bool startCommand(C::mip_interface &device, C::mip_pending_cmd &pending, const Cmd &cmd, Timeout additionalTime)
Definition: mip_interface.hpp:1228
mip::Interface::setCallbacksDerived
void setCallbacksDerived()
Sets the callback functions to a derived class object.
Definition: mip_interface.hpp:725
mip::C::mip_packet_data
const uint8_t * mip_packet_data(const mip_packet_view *packet)
Returns a pointer to the data buffer containing the packet.
Definition: mip_packet.c:137
mip::Interface
Represents a connected MIP device.
Definition: mip_interface.hpp:52
mip::PacketView
C++ class representing a view of a MIP packet.
Definition: mip_packet.hpp:34
mip::Dispatcher::removeHandler
void removeHandler(DispatchHandler &handler)
Definition: mip_interface.hpp:38
mip::Interface::setUpdateFunctionDerived
void setUpdateFunctionDerived()
Sets the update callback function (derived member function version).
Definition: mip_interface.hpp:676
mip::Interface::setCallbacksUserPointer
void setCallbacksUserPointer(T *object)
microstrain::ArrayView::size
constexpr size_t size() const noexcept
Definition: array_view.hpp:71
mip::Interface::sendToDevice
bool sendToDevice(const uint8_t *data, size_t length)
Definition: mip_interface.hpp:191
mip::Parser
C++ class representing a MIP parser.
Definition: mip_parser.hpp:19
mip::Dispatcher::ANY_DATA_SET
@ ANY_DATA_SET
Definition: mip_interface.hpp:33
mip::Interface::Interface
Interface(Timeout parseTimeout, Timeout baseReplyTimeout)
Initialize the mip_interface components.
Definition: mip_interface.hpp:64
mip::C::mip_interface_register_field_callback
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)
Registers a callback for packets of the specified descriptor set.
Definition: mip_interface.c:743
microstrain
Definition: embedded_time.h:8
mip::C::mip_dispatcher_remove_all_handlers
void mip_dispatcher_remove_all_handlers(mip_dispatcher *self)
Removes all handlers from the dispatcher.
Definition: mip_dispatch.c:239
mip::connect_interface
void connect_interface(mip::Interface &device, Connection &conn)
Sets up the mip interface callbacks to point at this object.
Definition: mip_interface.cpp:47
mip::C::mip_interface_register_packet_callback
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)
Registers a callback for packets of the specified descriptor set.
Definition: mip_interface.c:720
mip::extract
size_t extract(Serializer &serializer, Vector< T, N > &v)
Definition: common.hpp:133
mip::C::mip_interface_set_user_pointer
void mip_interface_set_user_pointer(mip_interface *device, void *pointer)
Sets an optional user data pointer which can be retrieved later.
Definition: mip_interface.c:269
mip::CmdQueue
C++ wrapper around a command queue.
Definition: mip_cmdqueue.hpp:20
microstrain::U8ArrayView
ArrayView< uint8_t > U8ArrayView
Definition: array_view.hpp:150