MIP_SDK  v3.0.0-736-g212583cf
MicroStrain Communications Library for embedded systems
mip_field.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "mip_descriptors.hpp"
4 #include "mip_serialization.hpp"
5 
7 
8 #include <mip/mip_field.h>
9 
10 #include <cstring>
11 
12 
13 namespace mip
14 {
18 
25 {
26 public:
27  enum class Index : uint8_t
28  {
32  };
33 
34  static constexpr size_t HEADER_LENGTH = C::MIP_FIELD_HEADER_LENGTH;
35  static constexpr size_t LENGTH_MIN = C::MIP_FIELD_LENGTH_MIN;
36  static constexpr size_t LENGTH_MAX = C::MIP_FIELD_LENGTH_MAX;
39 
41  FieldView() { C::mip_field_view::_payload=nullptr; C::mip_field_view::_payload_length=0; C::mip_field_view::_field_descriptor=0x00; C::mip_field_view::_descriptor_set=0x00; C::mip_field_view::_remaining_length=0; }
43  FieldView(uint8_t descriptor_set, uint8_t field_descriptor, const uint8_t* payload, uint8_t payload_length) { C::mip_field_init(this, descriptor_set, field_descriptor, payload, payload_length); }
45  FieldView(const uint8_t* header, uint8_t total_length, uint8_t descriptor_set) { *this = C::mip_field_from_header_ptr(header, total_length, descriptor_set); }
47  FieldView(const C::mip_field_view& other) { std::memcpy(static_cast<C::mip_field_view*>(this), &other, sizeof(C::mip_field_view)); }
48 
51 
52  //
53  // C function wrappers
54  //
55 
57  uint8_t descriptorSet() const { return C::mip_field_descriptor_set(this); }
59  uint8_t fieldDescriptor() const { return C::mip_field_field_descriptor(this); }
62 
64  uint8_t totalLength() const { return C::mip_field_total_length(this); }
65 
67  uint8_t payloadLength() const { return C::mip_field_payload_length(this); }
68 
71 
75  uint8_t payload(size_t index) const { assert(index < payloadLength()); return payload()[index]; }
76 
77  uint8_t operator[](size_t index) const { return payload(index); }
78 
98  microstrain::ConstU8ArrayView bytes() const { return {payload() - HEADER_LENGTH, static_cast<size_t>(payloadLength() + HEADER_LENGTH)}; }
99 
101  bool isValid() const { return C::mip_field_is_valid(this); }
102 
104  FieldView nextAfter() const { return C::mip_field_next_after(this); }
106  bool next() { return C::mip_field_next(this); }
107 
108  //
109  // Additional functions which have no C equivalent
110  //
111 
123  template<class FieldType>
124  bool extract(FieldType& field, bool exact_size=true) const { return microstrain::extract<microstrain::serialization::Endian::big>(field, payload(), 0, exact_size); }
125 
126 
128  bool isData() const { return isDataDescriptorSet(descriptorSet()); }
129 
132 
135 
138 
141 };
142 
143 
146 } // namespace mip
mip::FieldView::Index::LENGTH
@ LENGTH
mip::isCommandDescriptorSet
bool isCommandDescriptorSet(uint8_t descriptorSet)
Definition: mip_descriptors.hpp:80
mip
A collection of C++ classes and functions covering the full mip api.
Definition: commands_3dm.c:11
mip::FieldView::isData
bool isData() const
Determines if the field holds data (and not a command, reply, or response).
Definition: mip_field.hpp:128
mip::C::MIP_FIELD_INDEX_DESC
@ MIP_FIELD_INDEX_DESC
Definition: mip_field.h:65
mip::FieldView::next
bool next()
Updates the mip_field to refer to the next field in a packet.
Definition: mip_field.hpp:106
mip::FieldView::payload
microstrain::ConstU8ArrayView payload() const
Get a const view of the payload data.
Definition: mip_field.hpp:70
mip_descriptors.hpp
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::C::mip_field_total_length
uint8_t mip_field_total_length(const mip_field_view *field)
Returns the total length of the field including the header.
Definition: mip_field.c:75
array_view.hpp
mip::FieldView::totalLength
uint8_t totalLength() const
Returns the total length of the field including the header.
Definition: mip_field.hpp:64
mip::FieldView::PAYLOAD_LENGTH_MIN
static constexpr size_t PAYLOAD_LENGTH_MIN
Definition: mip_field.hpp:37
mip::C::mip_field_from_header_ptr
mip_field_view mip_field_from_header_ptr(const uint8_t *header, uint8_t total_length, uint8_t descriptor_set)
Constructs a mip_field from a pointer to the heaader.
Definition: mip_field.c:129
mip::isCommandFieldDescriptor
bool isCommandFieldDescriptor(uint8_t fieldDescriptor)
Definition: mip_descriptors.hpp:85
mip::FieldView::bytes
microstrain::ConstU8ArrayView bytes() const
Gets a view of the entire field, including the header.
Definition: mip_field.hpp:98
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::FieldView::LENGTH_MAX
static constexpr size_t LENGTH_MAX
Definition: mip_field.hpp:36
mip::C::MIP_FIELD_INDEX_LENGTH
@ MIP_FIELD_INDEX_LENGTH
Definition: mip_field.h:64
mip::FieldView::PAYLOAD_LENGTH_MAX
static constexpr size_t PAYLOAD_LENGTH_MAX
Definition: mip_field.hpp:38
mip::isDataDescriptorSet
bool isDataDescriptorSet(uint8_t descriptorSet)
Definition: mip_descriptors.hpp:79
mip::C::mip_field_next_after
mip_field_view mip_field_next_after(const mip_field_view *field)
Gets the next field after the specified field.
Definition: mip_field.c:192
mip::C::mip_field_view
A structure representing a MIP field.
Definition: mip_field.h:53
mip::C::MIP_FIELD_INDEX_PAYLOAD
@ MIP_FIELD_INDEX_PAYLOAD
Definition: mip_field.h:66
mip::FieldView::isReply
bool isReply() const
Determines if the field holds an ack/nack reply code.
Definition: mip_field.hpp:137
mip::FieldView::FieldView
FieldView(CompositeDescriptor descriptor, microstrain::ConstU8ArrayView payload)
Construct from descriptor and payload bytes.
Definition: mip_field.hpp:50
mip::C::MIP_FIELD_PAYLOAD_LENGTH_MAX
@ MIP_FIELD_PAYLOAD_LENGTH_MAX
Definition: mip_field.h:75
mip::FieldView::payloadLength
uint8_t payloadLength() const
Returns the length of the payload.
Definition: mip_field.hpp:67
mip::isResponseFieldDescriptor
bool isResponseFieldDescriptor(uint8_t fieldDescriptor)
Definition: mip_descriptors.hpp:87
mip::FieldView::FieldView
FieldView(const uint8_t *header, uint8_t total_length, uint8_t descriptor_set)
Constructs a mip_field from a pointer to the heaader.
Definition: mip_field.hpp:45
mip::FieldView
C++ class representing a MIP field.
Definition: mip_field.hpp:24
mip::C::mip_field_next
bool mip_field_next(mip_field_view *field)
Updates the mip_field to refer to the next field in a packet.
Definition: mip_field.c:211
mip::FieldView::operator[]
uint8_t operator[](size_t index) const
Definition: mip_field.hpp:77
mip_field.h
mip::FieldView::fieldDescriptor
uint8_t fieldDescriptor() const
Returns the field descriptor.
Definition: mip_field.hpp:59
mip::C::MIP_FIELD_LENGTH_MAX
@ MIP_FIELD_LENGTH_MAX
Definition: mip_field.h:73
mip::isReplyFieldDescriptor
bool isReplyFieldDescriptor(uint8_t fieldDescriptor)
Definition: mip_descriptors.hpp:86
mip::FieldView::Index::PAYLOAD
@ PAYLOAD
mip::C::mip_field_payload_length
uint8_t mip_field_payload_length(const mip_field_view *field)
Returns the length of the payload.
Definition: mip_field.c:65
mip::FieldView::payload
uint8_t payload(size_t index) const
Index the payload at the given location.
Definition: mip_field.hpp:75
mip::FieldView::FieldView
FieldView(const C::mip_field_view &other)
Creates a Field class from the mip_field C struct.
Definition: mip_field.hpp:47
mip::FieldView::Index::DESC
@ DESC
mip::C::MIP_FIELD_HEADER_LENGTH
@ MIP_FIELD_HEADER_LENGTH
Definition: mip_field.h:71
mip::FieldView::FieldView
FieldView(uint8_t descriptor_set, uint8_t field_descriptor, const uint8_t *payload, uint8_t payload_length)
Constructs a field view given the parameters.
Definition: mip_field.hpp:43
mip::C::mip_field_is_valid
bool mip_field_is_valid(const mip_field_view *field)
Returns true if the field has a valid field descriptor.
Definition: mip_field.c:91
mip::FieldView::descriptor
CompositeDescriptor descriptor() const
Returns the descriptor set and field descriptor.
Definition: mip_field.hpp:61
mip::FieldView::isCommand
bool isCommand() const
Determines if the field holds a command.
Definition: mip_field.hpp:134
mip::FieldView::isValid
bool isValid() const
Returns true if the field has a valid field descriptor.
Definition: mip_field.hpp:101
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::C::MIP_FIELD_LENGTH_MIN
@ MIP_FIELD_LENGTH_MIN
Definition: mip_field.h:72
mip::C::mip_field_field_descriptor
uint8_t mip_field_field_descriptor(const mip_field_view *field)
Returns the field descriptor.
Definition: mip_field.c:57
mip::FieldView::isCommandSet
bool isCommandSet() const
Determines if the field is from a command descriptor set (a command, reply, or response field).
Definition: mip_field.hpp:131
mip::C::mip_field_init
void mip_field_init(mip_field_view *field, uint8_t descriptor_set, uint8_t field_descriptor, const uint8_t *payload, uint8_t payload_length)
Constructs a field view given the parameters.
Definition: mip_field.c:33
mip::CompositeDescriptor
Convenience struct holding both descriptor set and field descriptor.
Definition: mip_descriptors.hpp:21
mip::FieldView::isResponse
bool isResponse() const
Determines if the field holds command response data (not an ack/nack reply).
Definition: mip_field.hpp:140
mip_serialization.hpp
mip::FieldView::LENGTH_MIN
static constexpr size_t LENGTH_MIN
Definition: mip_field.hpp:35
mip::FieldView::FieldView
FieldView()
Construct an empty MIP field.
Definition: mip_field.hpp:41
mip::FieldView::Index
Index
Definition: mip_field.hpp:27
mip::FieldView::descriptorSet
uint8_t descriptorSet() const
Returns the descriptor set of the packet containing this field._.
Definition: mip_field.hpp:57
mip::FieldView::nextAfter
FieldView nextAfter() const
Gets the next field after the specified field.
Definition: mip_field.hpp:104
mip::C::mip_field_payload
const uint8_t * mip_field_payload(const mip_field_view *field)
Returns the payload pointer for the field data.
Definition: mip_field.c:83
mip::FieldView::HEADER_LENGTH
static constexpr size_t HEADER_LENGTH
Definition: mip_field.hpp:34
mip::C::MIP_FIELD_PAYLOAD_LENGTH_MIN
@ MIP_FIELD_PAYLOAD_LENGTH_MIN
Definition: mip_field.h:74