mip_field.c
Go to the documentation of this file.
1 
2 #include "mip_field.h"
3 
4 #include "mip_packet.h"
5 #include "mip_offsets.h"
7 
8 #include <assert.h>
9 
10 
28 void mip_field_init(mip_field* field, uint8_t descriptor_set, uint8_t field_descriptor, const uint8_t* payload, uint8_t payload_length)
29 {
30  assert( payload_length <= MIP_FIELD_PAYLOAD_LENGTH_MAX );
31  if( payload_length > MIP_FIELD_PAYLOAD_LENGTH_MAX )
32  payload_length = MIP_FIELD_PAYLOAD_LENGTH_MAX;
33 
34  field->_payload = payload;
35  field->_payload_length = payload_length;
36  field->_field_descriptor = field_descriptor;
37  field->_descriptor_set = descriptor_set;
38  field->_remaining_length = 0;
39 }
40 
44 uint8_t mip_field_descriptor_set(const mip_field* field)
45 {
46  return field->_descriptor_set;
47 }
48 
53 {
54  return field->_field_descriptor;
55 }
56 
60 uint8_t mip_field_payload_length(const mip_field* field)
61 {
63 
64  return field->_payload_length;
65 }
66 
70 const uint8_t* mip_field_payload(const mip_field* field)
71 {
72  return field->_payload;
73 }
74 
78 bool mip_field_is_valid(const mip_field* field)
79 {
81 }
82 
83 
84 
94 {
96 }
97 
116 mip_field mip_field_from_header_ptr(const uint8_t* header, uint8_t total_length, uint8_t descriptor_set)
117 {
118  mip_field field;
119 
120  // Default invalid values.
121  field._payload = NULL;
122  field._descriptor_set = descriptor_set;
123  field._payload_length = 0;
124  field._field_descriptor = 0x00; // This makes the field invalid.
125  field._remaining_length = 0;
126 
127  if( total_length >= MIP_FIELD_HEADER_LENGTH )
128  {
129  // Field length is external input so it must be sanitized.
130  uint8_t field_length = header[MIP_INDEX_FIELD_LEN];
131 
132  // Ensure field length does not exceed total_length.
133  if( field_length > total_length )
134  field_length = total_length;
135 
136  // Check for invalid field length.
137  if( field_length >= MIP_FIELD_HEADER_LENGTH )
138  {
140  field._payload_length = field_length - MIP_FIELD_HEADER_LENGTH;
142  field._remaining_length = total_length - field_length;
143  }
144  }
145 
146  return field;
147 }
148 
165 {
167 }
168 
180 {
181  // Payload length must be zero if payload is NULL.
182  assert(!(field->_payload == NULL) || (field->_payload_length == 0));
183 
184  const uint8_t* next_header = field->_payload + field->_payload_length;
185 
186  return mip_field_from_header_ptr(next_header, field->_remaining_length, field->_descriptor_set);
187 }
188 
199 {
200  *field = mip_field_next_after(field);
201 
202  return mip_field_is_valid(field);
203 }
204 
227 bool mip_field_next_in_packet(mip_field* field, const mip_packet* packet)
228 {
230  *field = mip_field_next_after(field);
231  else
232  *field = mip_field_first_from_packet(packet);
233 
234  return mip_field_is_valid(field);
235 }
mip_packet.h
mip_field::_remaining_length
uint8_t _remaining_length
Remaining space after this field.
Definition: mip_field.h:58
mip_field_next_in_packet
bool mip_field_next_in_packet(mip_field *field, const mip_packet *packet)
Iterates over all fields in a packet.
Definition: mip_field.c:227
mip_field::_payload_length
uint8_t _payload_length
The length of the payload, excluding the header.
Definition: mip_field.h:55
mip_field_next_after
mip_field mip_field_next_after(const mip_field *field)
Gets the next field after the specified field._.
Definition: mip_field.c:179
mip_field::_descriptor_set
uint8_t _descriptor_set
MIP descriptor set (from the packet)
Definition: mip_field.h:57
mip_field::_field_descriptor
uint8_t _field_descriptor
MIP field descriptor. Field not valid if set to 0x00.
Definition: mip_field.h:56
mip_field_payload_length
uint8_t mip_field_payload_length(const mip_field *field)
Returns the length of the payload.
Definition: mip_field.c:60
mip_field
A structure representing a MIP field.
Definition: mip_field.h:52
mip_field_field_descriptor
uint8_t mip_field_field_descriptor(const mip_field *field)
Returns the field descriptor.
Definition: mip_field.c:52
MIP_FIELD_PAYLOAD_LENGTH_MAX
@ MIP_FIELD_PAYLOAD_LENGTH_MAX
Definition: mip_offsets.h:35
mip_packet_payload_length
uint8_t mip_packet_payload_length(const mip_packet *packet)
Returns the length of the payload (MIP fields).
Definition: mip_packet.c:95
mip_field_next
bool mip_field_next(mip_field *field)
Updates the mip_field to refer to the next field in a packet.
Definition: mip_field.c:198
mip_field_descriptor_set
uint8_t mip_field_descriptor_set(const mip_field *field)
Returns the descriptor set of the packet containing this field._.
Definition: mip_field.c:44
mip_packet_payload
const uint8_t * mip_packet_payload(const mip_packet *packet)
Returns a pointer to the packet's payload (the first field).
Definition: mip_packet.c:129
mip_field.h
MIP_INDEX_FIELD_DESC
@ MIP_INDEX_FIELD_DESC
Definition: mip_offsets.h:18
MIP_INDEX_FIELD_LEN
@ MIP_INDEX_FIELD_LEN
Definition: mip_offsets.h:17
MIP_INVALID_DESCRIPTOR_SET
@ MIP_INVALID_DESCRIPTOR_SET
Definition: descriptors.h:21
mip_field_init
void mip_field_init(mip_field *field, uint8_t descriptor_set, uint8_t field_descriptor, const uint8_t *payload, uint8_t payload_length)
Constructs a mip_field given the parameters.
Definition: mip_field.c:28
MIP_FIELD_HEADER_LENGTH
@ MIP_FIELD_HEADER_LENGTH
Definition: mip_offsets.h:32
mip_field::_payload
const uint8_t * _payload
The field payload, excluding the header.
Definition: mip_field.h:54
MIP_INDEX_FIELD_PAYLOAD
@ MIP_INDEX_FIELD_PAYLOAD
Definition: mip_offsets.h:19
descriptors.h
mip_field_is_valid
bool mip_field_is_valid(const mip_field *field)
Returns true if the field has a valid field descriptor.
Definition: mip_field.c:78
mip_packet_descriptor_set
uint8_t mip_packet_descriptor_set(const mip_packet *packet)
Returns the MIP descriptor set for this packet.
Definition: mip_packet.c:87
mip_packet
Structure representing a MIP Packet.
Definition: mip_packet.h:41
mip_field_payload
const uint8_t * mip_field_payload(const mip_field *field)
Returns the payload pointer for the field data.
Definition: mip_field.c:70
MIP_INVALID_FIELD_DESCRIPTOR
@ MIP_INVALID_FIELD_DESCRIPTOR
Definition: descriptors.h:25
mip_field_from_header_ptr
mip_field 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:116
header
const std::string header
assert.h
mip_field_first_from_packet
mip_field mip_field_first_from_packet(const mip_packet *packet)
Extracts the first field from a MIP packet.
Definition: mip_field.c:164
mip_offsets.h
mip_field_init_empty
void mip_field_init_empty(mip_field *field)
Initialize a mip_field struct to an invalid/empty state.
Definition: mip_field.c:93


microstrain_inertial_driver
Author(s): Brian Bingham, Parker Hannifin Corp
autogenerated on Fri May 24 2024 06:48:21