예제 #1
0
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;
}