11 #define MIP_REPLY_DESC_GLOBAL_ACK_NACK 0xF1 13 #define MIP_INDEX_REPLY_DESCRIPTOR 0 14 #define MIP_INDEX_REPLY_ACK_CODE 1 66 mip_pending_cmd_init_full(cmd, descriptor_set, field_descriptor, response_descriptor, response_buffer, response_buffer_size, 0);
302 uint8_t response_length = 0;
326 field = response_field;
373 if( descriptor_set >= 0x80 && descriptor_set < 0xF0 )
390 #ifdef MIP_ENABLE_DIAGNOSTICS 399 #endif // MIP_ENABLE_DIAGNOSTICS 487 #ifdef MIP_ENABLE_DIAGNOSTICS 494 uint16_t mip_cmd_queue_diagnostic_cmds_queued(
const mip_cmd_queue* queue)
496 return queue->_diag_cmds_queued;
502 uint16_t mip_cmd_queue_diagnostic_cmds_failed(
const mip_cmd_queue* queue)
504 return (uint16_t)queue->_diag_cmds_nacked + queue->_diag_cmds_failed + queue->_diag_cmds_timedout;
512 uint16_t mip_cmd_queue_diagnostic_cmds_successful(
const mip_cmd_queue* queue)
514 return queue->_diag_cmds_acked;
522 uint16_t mip_cmd_queue_diagnostic_cmd_acks(
const mip_cmd_queue* queue)
524 return queue->_diag_cmds_acked;
530 uint16_t mip_cmd_queue_diagnostic_cmd_nacks(
const mip_cmd_queue* queue)
532 return queue->_diag_cmds_nacked;
539 uint16_t mip_cmd_queue_diagnostic_cmd_timeouts(
const mip_cmd_queue* queue)
541 return queue->_diag_cmds_timedout;
547 uint16_t mip_cmd_queue_diagnostic_cmd_errors(
const mip_cmd_queue* queue)
549 return queue->_diag_cmds_failed;
552 #endif // MIP_ENABLE_DIAGNOSTICS timeout_type _base_timeout
uint8_t _descriptor_set
Command descriptor set.
timeout_type _extra_timeout
<
Holds a list of pending commands.
void mip_cmd_queue_update(mip_cmd_queue *queue, timestamp_type now)
Call periodically to make sure commands time out if no packets are received.
enum mip_cmd_result mip_pending_cmd_status(const mip_pending_cmd *cmd)
Returns the status of the pending command.
bool mip_field_is_valid(const mip_field *field)
Returns true if the field has a valid field descriptor.
int mip_pending_cmd_remaining_time(const mip_pending_cmd *cmd, timestamp_type now)
Determines how much time is remaining before the command times out.
void mip_cmd_queue_clear(mip_cmd_queue *queue)
Clears the command queue.
bool mip_cmd_result_is_ack(enum mip_cmd_result result)
Determines if the result is an ack (successful response from the device)
mip_field mip_field_next_after(const mip_field *field)
Gets the next field after the specified field._.
void mip_cmd_queue_init(mip_cmd_queue *queue, timeout_type base_reply_timeout)
Initializes a command queue.
Waiting for command reply (timeout timer has started).
bool mip_pending_cmd_check_timeout(const mip_pending_cmd *cmd, timestamp_type now)
Checks if the command should time out.
timeout_type mip_cmd_queue_base_reply_timeout(const mip_cmd_queue *queue)
Gets the base reply timeout for all commands.
mip_pending_cmd * _first_pending_cmd
uint8_t _response_length
If status == MIP_STATUS_COMPLETED, the length of the reply data.
#define MIP_INDEX_REPLY_DESCRIPTOR
timestamp_type timeout_type
uint8_t _response_buffer_size
If status < MIP_STATUS_COMPLETED, the size of the reply data buffer.
enum mip_cmd_result _status
The current status of the command. Writing this to any MipAck value may cause deallocation.
uint8_t mip_pending_cmd_response_length(const mip_pending_cmd *cmd)
Returns the length of the response data.
void mip_cmd_queue_set_base_reply_timeout(mip_cmd_queue *queue, timeout_type timeout)
Sets the base reply timeout for all commands.
mip_cmd_result
Represents the status of a MIP command.
const uint8_t * mip_pending_cmd_response(const mip_pending_cmd *cmd)
Returns the response payload pointer.
uint8_t _response_descriptor
Response field descriptor, or 0x00 if no response field expected.
Structure representing a MIP Packet.
void mip_pending_cmd_init_with_timeout(mip_pending_cmd *cmd, uint8_t descriptor_set, uint8_t field_descriptor, timeout_type additional_time)
Initialize a pending mip commmand with extra timeout time.
Represents a command awaiting a reply from the device.
uint8_t mip_field_field_descriptor(const mip_field *field)
Returns the field descriptor.
uint8_t mip_field_payload_length(const mip_field *field)
Returns the length of the payload.
uint8_t * _response_buffer
Buffer for response data if response_descriptor != 0x00.
static enum mip_cmd_result process_fields_for_pending_cmd(mip_pending_cmd *pending, const mip_packet *packet, timeout_type base_timeout, timestamp_type timestamp)
Iterate over a packet, checking for replies to the pending command.
struct mip_pending_cmd * _next
Next command in the queue.
void mip_cmd_queue_process_packet(mip_cmd_queue *queue, const mip_packet *packet, timestamp_type timestamp)
Process an incoming packet and check for replies to pending commands.
A structure representing a MIP field.
bool mip_cmd_result_is_reply(enum mip_cmd_result result)
Determines if the result is a reply from the device (i.e.
#define MIP_DIAG_INC(counter, amount)
#define MIP_INDEX_REPLY_ACK_CODE
void mip_pending_cmd_init_with_response(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)
Initialize a pending mip commmand with expected response data.
Reply was not received before timeout expired.
timestamp_type _timeout_time
If MIP_STATUS_WAITING: timestamp_type after which the command will be timed out.
bool mip_field_next_in_packet(mip_field *field, const mip_packet *packet)
Iterates over all fields in a packet.
void mip_cmd_queue_enqueue(mip_cmd_queue *queue, mip_pending_cmd *cmd)
Queue a command to wait for replies.
#define MIP_DIAG_ZERO(counter)
Command has been queued but the I/O update hasn't run yet.
Command has been initialized but not queued yet.
const uint8_t * mip_field_payload(const mip_field *field)
Returns the payload pointer for the field data.
uint8_t _field_descriptor
Command field descriptor.
uint64_t timestamp_type
Type used for packet timestamps and timeouts.
Command was canceled in software.
bool mip_cmd_result_is_finished(enum mip_cmd_result status)
Determines if the command has completed, timed out, been cancelled, or otherwise is no longer waiting...
uint8_t mip_packet_descriptor_set(const mip_packet *packet)
Returns the MIP descriptor set for this packet.
Command completed successfully.
void mip_cmd_queue_dequeue(mip_cmd_queue *queue, mip_pending_cmd *cmd)
Removes a pending command from the queue.
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, timeout_type additional_time)
Initialize a pending mip commmand with all parameters.
timestamp_type _reply_time
If MIP_STATUS_COMPLETED: timestamp_type from the packet containing the ack/nack.
#define MIP_REPLY_DESC_GLOBAL_ACK_NACK
void mip_pending_cmd_init(mip_pending_cmd *cmd, uint8_t descriptor_set, uint8_t field_descriptor)
Initialize a pending command with no reponse data or additional time.