MIP_SDK  v3.0.0-425-g6df21bd
MicroStrain Communications Library for embedded systems
mip_parser.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "mip_packet.hpp"
4 
5 #include <mip/mip_parser.h>
6 
7 
8 namespace mip
9 {
13 
19 class Parser : public C::mip_parser
20 {
21 public:
23  Parser(C::mip_packet_callback callback, void* callbackObject, Timeout timeout) { C::mip_parser_init(this, callback, callbackObject, timeout); }
25  Parser(bool (*callback)(void*,const PacketView*,Timestamp), void* callbackObject, Timeout timeout) { C::mip_parser_init(this, (C::mip_packet_callback)callback, callbackObject, timeout); }
27  explicit Parser(Timeout timeout) { C::mip_parser_init(this, nullptr, nullptr, timeout); }
28 
29  void setCallback(C::mip_packet_callback callback, void* callbackObject) { C::mip_parser_set_callback(this, callback, callbackObject); }
30 
31  template<class Lambda>
32  void setCallback(Lambda lambda);
33 
34  template<class T, bool (T::*Callback)(const PacketView&, Timestamp)>
35  void setCallback(T& object);
36 
37  template<class T, bool (*Callback)(T&, const PacketView&, Timestamp)>
38  void setCallback(T& object);
39 
41  void reset() { C::mip_parser_reset(this); }
42 
44  size_t parse(const uint8_t* inputBuffer, size_t inputCount, Timestamp timestamp) { return C::mip_parser_parse(this, inputBuffer, inputCount, timestamp); }
45 
48  size_t parse(microstrain::Span<const uint8_t> data, Timestamp timestamp) { return parse(data.data(), data.size(), timestamp); }
49 
51  void flush() { C::mip_parser_flush(this); }
52 
55  microstrain::Span<uint8_t> getWritePtr() { uint8_t* ptr; size_t length = C::mip_parser_get_write_ptr(this, &ptr); return {ptr, length}; }
56 
58  Timeout timeout() const { return C::mip_parser_timeout(this); }
61 };
62 
63 
64 template<class FunctionOrLambda>
65 void Parser::setCallback(FunctionOrLambda function)
66 {
67  C::mip_packet_callback callback = [](void* obj, const C::mip_packet_view* packet, Timestamp timestamp)->bool
68  {
69  return *(static_cast<FunctionOrLambda*>(obj))( mip::PacketView(*packet), timestamp );
70  };
71 
72  C::mip_parser_set_callback(this, callback, &function);
73 }
74 
96 template<class T, bool (T::*Callback)(const PacketView&, Timestamp)>
97 void Parser::setCallback(T& object)
98 {
99  C::mip_packet_callback callback = +[](void* obj, const C::mip_packet_view* pkt, Timestamp timestamp)->bool
100  {
101  return (static_cast<T*>(obj)->*Callback)(PacketView(pkt), timestamp);
102  };
103 
104  C::mip_parser_set_callback(this, callback, &object);
105 }
106 
126 template<class T, bool (*Callback)(T&, const PacketView&, Timestamp)>
127 void Parser::setCallback(T& object)
128 {
129  C::mip_packet_callback callback = +[](void* obj, const C::mip_packet_view* pkt, Timestamp timestamp)->bool
130  {
131  return (*Callback)(*static_cast<T*>(obj), PacketView(pkt), timestamp);
132  };
133 
134  C::mip_parser_set_callback(this, callback, &object);
135 }
136 
139 } // namespace mip
microstrain::Span::data
constexpr pointer data() const noexcept
Definition: span.hpp:67
mip::C::mip_parser_parse
size_t mip_parser_parse(mip_parser *parser, const uint8_t *input_buffer, size_t input_length, mip_timestamp timestamp)
Parse packets from a buffer.
Definition: mip_parser.c:187
mip
A collection of C++ classes and functions covering the full mip api.
Definition: commands_3dm.c:11
mip_parser.h
mip::C::mip_parser_set_callback
void mip_parser_set_callback(mip_parser *parser, mip_packet_callback callback, void *callback_object)
mip_parser_set_callback
Definition: mip_parser.c:464
mip::C::mip_parser_timeout
mip_timeout mip_parser_timeout(const mip_parser *parser)
Returns the packet timeout of the parser.
Definition: mip_parser.c:440
mip::C::mip_parser_set_timeout
void mip_parser_set_timeout(mip_parser *parser, mip_timeout timeout)
Changes the timeout of the MIP parser.
Definition: mip_parser.c:452
microstrain::Span::size
constexpr size_t size() const noexcept
Definition: span.hpp:69
microstrain::Span
Implementation of std::span from C++20.
Definition: span.hpp:42
mip::C::mip_packet_view
Structure representing a MIP Packet.
Definition: mip_packet.h:50
mip::Parser::parse
size_t parse(const uint8_t *inputBuffer, size_t inputCount, Timestamp timestamp)
Parse packets from a buffer.
Definition: mip_parser.hpp:44
mip::Parser::flush
void flush()
Processes all previously buffered data.
Definition: mip_parser.hpp:51
mip::C::mip_packet_callback
bool(* mip_packet_callback)(void *user, const mip_packet_view *packet, mip_timestamp timestamp)
Callback function which receives parsed MIP packets.
Definition: mip_parser.h:48
mip::C::mip_parser_flush
void mip_parser_flush(mip_parser *parser)
Processes all previously buffered data.
Definition: mip_parser.c:394
mip::C::mip_parser
MIP Parser state.
Definition: mip_parser.h:58
mip::C::mip_parser_init
void mip_parser_init(mip_parser *parser, mip_packet_callback callback, void *callback_object, mip_timeout timeout)
Initializes the MIP parser.
Definition: mip_parser.c:32
mip::C::mip_parser_get_write_ptr
uint_least16_t mip_parser_get_write_ptr(mip_parser *parser, uint8_t **ptr_out)
Gets a pointer into which a small amount of data may be written for parsing.
Definition: mip_parser.c:427
mip::Parser::parse
size_t parse(microstrain::Span< const uint8_t > data, Timestamp timestamp)
Parse packets from a buffer (span version).
Definition: mip_parser.hpp:48
mip::C::mip_parser_reset
void mip_parser_reset(mip_parser *parser)
Resets the MIP parser.
Definition: mip_parser.c:51
mip::Parser::Parser
Parser(Timeout timeout)
Construct without a callback.
Definition: mip_parser.hpp:27
mip::Timestamp
microstrain::EmbeddedTimestamp Timestamp
Definition: mip_types.h:50
mip::Parser::Parser
Parser(C::mip_packet_callback callback, void *callbackObject, Timeout timeout)
Initializes the MIP parser.
Definition: mip_parser.hpp:23
mip::Timeout
microstrain::EmbeddedTimeout Timeout
Definition: mip_types.h:51
mip::Parser::reset
void reset()
Resets the MIP parser.
Definition: mip_parser.hpp:41
mip::Parser::timeout
Timeout timeout() const
Returns the packet timeout of the parser.
Definition: mip_parser.hpp:58
mip::Parser::Parser
Parser(bool(*callback)(void *, const PacketView *, Timestamp), void *callbackObject, Timeout timeout)
Initializes the MIP parser.
Definition: mip_parser.hpp:25
mip_packet.hpp
mip::PacketView
C++ class representing a view of a MIP packet.
Definition: mip_packet.hpp:35
mip::Parser
C++ class representing a MIP parser.
Definition: mip_parser.hpp:19
mip::Parser::getWritePtr
microstrain::Span< uint8_t > getWritePtr()
Gets a pointer into which a small amount of data may be written for parsing.
Definition: mip_parser.hpp:55
mip::Parser::setCallback
void setCallback(C::mip_packet_callback callback, void *callbackObject)
Definition: mip_parser.hpp:29
mip::Parser::setTimeout
void setTimeout(Timeout timeout)
Changes the timeout of the MIP parser.
Definition: mip_parser.hpp:60