void __mip_interface_command_response_handler(void *user_ptr, u8 *packet, u16 packet_size, u8 callback_type) { u16 payload_size; global_ack_nack_field *ack_nack_field_ptr; mip_field_header *field_header_ptr; u8 *field_data_ptr; u16 field_offset = 0; mip_interface *device_interface = (mip_interface *)user_ptr; if(device_interface == NULL) return; //Flag that the response was received device_interface->command_response_received = 1; /// //Successful Packet /// if(callback_type == MIP_INTERFACE_CALLBACK_VALID_PACKET) { payload_size = mip_get_payload_size(packet); //Get the ACK/NACK Field if(mip_get_first_field(packet, &field_header_ptr, &field_data_ptr, &field_offset) == MIP_OK) { ack_nack_field_ptr = (global_ack_nack_field *)field_data_ptr; device_interface->command_id = ack_nack_field_ptr->command_echo_byte; device_interface->command_acknack_response = ack_nack_field_ptr->error_code; } //Get the remaining data & subtract the size of the first field if(mip_get_next_field(packet, &field_header_ptr, &field_data_ptr, &field_offset) == MIP_OK) { device_interface->command_response_data = field_header_ptr; device_interface->command_response_data_size = payload_size - (sizeof(mip_field_header) + sizeof(global_ack_nack_field)); } } /// // Error /// else { device_interface->command_id = 0; device_interface->command_acknack_response = 0; device_interface->command_response_data = 0; device_interface->command_response_data_size = 0; } }
u16 mip_interface_send_preformatted_command(mip_interface *device_interface, u8 *command, u16 command_size, u8 wait_for_response, u32 timeout_ms) { u8 acknack_response = MIP_ACK_NACK_ERROR_COMMAND_FAILED; u16 return_code; u32 bytes_written; u8 command_set; u8 command_descriptor; mip_header *header_ptr = (mip_header *)command; mip_field_header *field_header_ptr; u8 *field_data_ptr; u16 field_offset = 0; u8 *response_data; u16 response_data_size; //Null-check inputs if((device_interface == NULL) ||(command == NULL) || (command_size == 0)) return MIP_INTERFACE_ERROR; //Send the packet if(mip_sdk_port_write(device_interface->port_handle, command, command_size, &bytes_written, timeout_ms) != MIP_INTERFACE_OK) return MIP_INTERFACE_ERROR; //Return if we are not waiting for a response if(!wait_for_response) return MIP_INTERFACE_OK; //Set the command set and descriptor information command_set = header_ptr->descriptor_set; if(mip_get_first_field(command, &field_header_ptr, &field_data_ptr, &field_offset) != MIP_OK) { return MIP_INTERFACE_ERROR; } command_descriptor = field_header_ptr->descriptor; //Wait for the response from the device return_code = __mip_interface_wait_for_response(device_interface, command_set, command_descriptor, &acknack_response, &response_data, &response_data_size, timeout_ms); if((return_code != MIP_INTERFACE_OK) || (acknack_response != MIP_ACK_NACK_ERROR_NONE)) return MIP_INTERFACE_ERROR; return MIP_INTERFACE_OK; }