50 static_assert(
sizeof(CmdQueue) ==
sizeof(
C::mip_cmd_queue),
"CmdQueue must not have additional data members.");
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); }
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) {}
169 template<
bool (*Function)(DeviceInterface&,
bool)>
215 template<
void (*Callback)(
void*, const Packet&, Timestamp)>
218 template<
class Object,
void (Object::*Callback)(const Packet&, Timestamp)>
222 template<
void (*Callback)(
void*, const Field&, Timestamp)>
225 template<
class Object,
void (Object::*Callback)(const Field& field, Timestamp)>
229 template<
class DataField,
void (*Callback)(
void*, const DataField&, Timestamp)>
232 template<
class DataField,
class Object,
void (Object::*Callback)(const DataField&, Timestamp)>
236 template<
class DataField>
246 template<
class Cmd,
class... Args>
276 template<
bool (*Function)(DeviceInterface&,
bool)>
318 template<
void (*Callback)(
void*, const Packet&, Timestamp)>
323 Callback(context,
Packet(*packet), timestamp);
360 template<
class Object,
void (Object::*Callback)(const Packet&, Timestamp)>
363 auto callback = [](
void* pointer,
const Packet& packet,
Timestamp timestamp)
365 Object* obj =
static_cast<Object*
>(pointer);
366 (obj->*Callback)(
Packet(packet), timestamp);
403 template<
void (*Callback)(
void*, const Field&, Timestamp)>
408 Callback(context,
Field(*field), timestamp);
445 template<
class Object,
void (Object::*Callback)(const Field&, Timestamp)>
450 Object* obj =
static_cast<Object*
>(pointer);
451 (obj->*Callback)(
Field(*field), timestamp);
493 template<
class DataField,
void (*Callback)(
void*, const DataField&, Timestamp)>
496 assert(descriptorSet != 0x00);
497 if(descriptorSet == 0x00)
500 assert(descriptorSet != 0xFF);
501 if(descriptorSet == 0xFF)
509 assert(ok); (void)ok;
511 Callback(context, data, timestamp);
553 template<
class DataField,
class Object,
void (Object::*Callback)(const DataField&, Timestamp)>
556 assert(descriptorSet != 0x00);
557 if(descriptorSet == 0x00)
560 assert(descriptorSet != 0xFF);
561 if(descriptorSet == 0xFF)
569 assert(ok); (void)ok;
571 Object* obj =
static_cast<Object*
>(pointer);
572 (obj->*Callback)(data, timestamp);
579 template<
class DataField>
584 Field(*field).
extract( *
static_cast<DataField*
>(pointer) );
594 uint8_t buffer[PACKET_LENGTH_MAX];
603 template<
class Cmd,
class... Args>
606 Cmd cmd{std::forward<Args>(args)...};
607 return runCommand(device, cmd, additionalTime);
613 uint8_t buffer[PACKET_LENGTH_MAX];
632 uint8_t buffer[PACKET_LENGTH_MAX];
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.